diff --git a/.gitignore b/.gitignore index 0b49eb9..ec50a6b 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,5 @@ node_modules .sass-cache local_config.py vilya.log +.vagrant/ +code.local.env diff --git a/.travis.yml b/.travis.yml index bd3c68d..b43574e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,15 +1,32 @@ language: python python: - - 2.7 + - 2.7 + +services: + - redis-server + - memcache + - mysql before_script: - - mysql -e 'create database valentine;' - - mysql -D valentine < vilya/databases/schema.sql + - memcached -p 11311 -d + - memcached -p 7901 -d + - memcached -p 7902 -d + - memcached -p 7903 -d + - mysql -e 'drop database if exists valentine;' + - mysql -e 'create database valentine;' + - mysql -D valentine < vilya/databases/schema.sql install: - - pip install -e "git+https://github.com/qingfeng/misaka.git@2fbe52692e8f304eea9d8925fd2a857916ff0ea5#egg=misaka-1.0.3" - - pip install -r vilya/tests/requirements.txt + - pip install -r requirements.txt script: - - py.test vilya/tests + - > + py.test tests --ignore=tests/test_git.py + --ignore=tests/test_git_commit_one_file.py + --ignore=tests/test_gyt.py --ignore=tests/test_project_git_calls.py + --ignore=tests/pulls/test_model.py --ignore=tests/pulls/test_ticket.py + --ignore=tests/issues/test_project_issue.py + --ignore=tests/issues/test_issue.py + --ignore=tests/test_stat.py --ignore=tests/test_test.py + --ignore=tests/pulls/test_pullrequest.py diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..9b745c9 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,8 @@ + * hongqn - pullrequest & code review + * qingfeng - 其他 转换框架到quixote + * mengwei - 前期构建 + * fengji - 前期构建 + * libohan - Hooks & API + * zhangchi - Notifications + * xingben - 各种提醒,UI的精简,向github致敬 + * lijunpeng - trello卡片墙 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..45dbbb2 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,24 @@ +FROM ubuntu:14.04 +MAINTAINER Dongweiming "ciici123@gmail.com" + +ENV DEBIAN_FRONTEND noninteractive +ENV CODE_ENV "unset" + +RUN echo "deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse" > /etc/apt/sources.list +RUN echo "deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse" >> /etc/apt/sources.list +RUN echo "deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse" >> /etc/apt/sources.list +RUN echo "deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse" >> /etc/apt/sources.list +RUN echo "deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse" >> /etc/apt/sources.list +RUN echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse" >> /etc/apt/sources.list +RUN echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse" >> /etc/apt/sources.list +RUN echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse" >> /etc/apt/sources.list +RUN echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse" >> /etc/apt/sources.list +RUN echo "deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse" >> /etc/apt/sources.list +RUN apt-get update + +RUN apt-get install curl python -yq +RUN curl -O https://raw.githubusercontent.com/douban/code/master/scripts/install_code.sh +RUN /bin/bash install_code.sh +RUN rm -rf install_code.sh +EXPOSE 8000 +WORKDIR /code diff --git a/Gruntfile.js b/Gruntfile.js new file mode 100644 index 0000000..548b380 --- /dev/null +++ b/Gruntfile.js @@ -0,0 +1,380 @@ +module.exports = function(grunt) { + grunt.initConfig({ + meta: { + src: 'hub/static/', + dest: 'dist/', + appOzConfig: { + baseUrl: '<%= meta.src %>js/', + distUrl: '<%= meta.dest %>js/', + disableAutoSuffix: true, + ignore: [ 'jquery', 'jquery-tmpl', 'mustache', 'bootbox', 'bootstrap', + 'spin', 'jquery-timeago', 'jquery-forms', 'jquery-atwho', + 'jquery-caret', 'jquery-zclip', 'jquery-lazyload', 'jquery-unobstrusive', + 'jquery-tooltipster'] + } + }, + ozma: { + common: { + src: 'hub/static/js/mod/common.js', + config: { + baseUrl: '<%= meta.src %>js/', + distUrl: '<%= meta.dest %>js/', + loader: 'lib/oz.js', + disableAutoSuffix: true + } + }, + raven: { + src: 'hub/static/js/mod/raven.js', + config: { + baseUrl: '<%= meta.src %>js/', + distUrl: '<%= meta.dest %>js/', + loader: 'lib/oz.js', + disableAutoSuffix: true + } + }, + badge: { + src: 'hub/static/js/app/badge/main.js', + config: '<%= meta.appOzConfig %>' + }, + create: { + src: 'hub/static/js/app/create/main.js', + config: '<%= meta.appOzConfig %>' + }, + explore: { + src: 'hub/static/js/app/explore/main.js', + config: '<%= meta.appOzConfig %>', + }, + public_timeline: { + src: 'hub/static/js/app/explore/public_timeline.js', + config: '<%= meta.appOzConfig %>', + }, + notify_timeline: { + src: 'hub/static/js/app/explore/notify_timeline.js', + config: '<%= meta.appOzConfig %>', + }, + gist: { + src: 'hub/static/js/app/gist/gist.js', + config: '<%= meta.appOzConfig %>' + }, + gist_edit: { + src: 'hub/static/js/app/gist/edit.js', + config: '<%= meta.appOzConfig %>' + }, + gist_main: { + src: 'hub/static/js/app/gist/main.js', + config: '<%= meta.appOzConfig %>' + }, + graph: { + src: 'hub/static/js/app/graph/main.js', + config: '<%= meta.appOzConfig %>' + }, + home: { + src: 'hub/static/js/app/home/main.js', + config: '<%= meta.appOzConfig %>' + }, + settings: { + src: 'hub/static/js/app/home/settings.js', + config: '<%= meta.appOzConfig %>' + }, + userfeed_timeline: { + src: 'hub/static/js/app/home/userfeed_timeline.js', + config: '<%= meta.appOzConfig %>' + }, + hook: { + src: 'hub/static/js/app/hook/main.js', + config: '<%= meta.appOzConfig %>' + }, + people: { + src: 'hub/static/js/app/people/main.js', + config: '<%= meta.appOzConfig %>' + }, + praise: { + src: 'hub/static/js/app/praise/main.js', + config: '<%= meta.appOzConfig %>' + }, + pull: { + src: 'hub/static/js/app/pull/main.js', + config: '<%= meta.appOzConfig %>' + }, + pull_new: { + src: 'hub/static/js/app/pull/new.js', + config: '<%= meta.appOzConfig %>' + }, + pulls: { + src: 'hub/static/js/app/pull/pulls.js', + config: '<%= meta.appOzConfig %>' + }, + src: { + src: 'hub/static/js/app/src/src.js', + config: '<%= meta.appOzConfig %>' + }, + commit: { + src: 'hub/static/js/app/src/commit.js', + config: '<%= meta.appOzConfig %>' + }, + compare: { + src: 'hub/static/js/app/src/compare.js', + config: '<%= meta.appOzConfig %>' + }, + src_edit: { + src: 'hub/static/js/app/src/editor.js', + config: '<%= meta.appOzConfig %>' + }, + search: { + src: 'hub/static/js/app/search/search.js', + config: '<%= meta.appOzConfig %>' + }, + m: { + src: 'hub/static/js/app/m/main.js', + config: '<%= meta.appOzConfig %>' + }, + team: { + src: 'hub/static/js/app/team/main.js', + config: '<%= meta.appOzConfig %>' + }, + team_group: { + src: 'hub/static/js/app/team/group.js', + config: '<%= meta.appOzConfig %>' + }, + team_settings: { + src: 'hub/static/js/app/team/settings.js', + config: '<%= meta.appOzConfig %>' + }, + team_add_project: { + src: 'hub/static/js/app/team/add_project.js', + config: '<%= meta.appOzConfig %>' + }, + teamfeed_timeline: { + src: 'hub/static/js/app/team/teamfeed_timeline.js', + config: '<%= meta.appOzConfig %>' + }, + issue: { + src: 'hub/static/js/app/issue/main.js', + config: '<%= meta.appOzConfig %>' + }, + issue_new: { + src: 'hub/static/js/app/issue/new.js', + config: '<%= meta.appOzConfig %>' + }, + issues: { + src: 'hub/static/js/app/issue/issues.js', + config: '<%= meta.appOzConfig %>' + }, + team_issue: { + src: 'hub/static/js/app/issue/team-issue.js', + config: '<%= meta.appOzConfig %>' + }, + notification: { + src: 'hub/static/js/app/settings/notification.js', + config: '<%= meta.appOzConfig %>' + }, + codereview: { + src: 'hub/static/js/app/settings/codereview.js', + config: '<%= meta.appOzConfig %>' + }, + watch: { + src: 'hub/static/js/app/watching/main.js', + config: '<%= meta.appOzConfig %>' + }, + chat: { + src: 'hub/static/js/app/chat/main.js', + config: '<%= meta.appOzConfig %>' + }, + center: { + src: 'hub/static/js/app/center/main.js', + config: '<%= meta.appOzConfig %>' + }, + stat: { + src: 'hub/static/js/app/stat/main.js', + config: '<%= meta.appOzConfig %>' + } + }, + copy: { + }, + lint: { + files: [ 'hub/static/js/app/**/*.js', 'hub/static/js/mod/**/*.js' ] + }, + uglify: { + //options: { + //compress: true, + //mangle: true + //}, + dynamic_mappings: { + files: [ + { + expand: true, + cwd: '<%= meta.dest %>js/', + src: ['**/?*.js'], + dest: '<%= meta.dest %>js/', + }, + ], + } + }, + clean: [ 'dist/*' ], + watch: { + js: { + files: [ 'hub/static/js/**/*.js' ], + tasks: [ 'ozma' ] + }, + scss: { + files: ['hub/static/css/**/*.scss'], + tasks: ['compass:dev'] + } + }, + compass: { + dev: { + options: { + sassDir: '<%= meta.src %>css', + cssDir: '<%= meta.dest %>css', + noLineComments: false, + force: true, + importPath: '<%= meta.src %>', + outputStyle: 'expanded' + } + }, + prod: { + options: { + sassDir: '<%= meta.src %>css', + cssDir: '<%= meta.dest %>css', + noLineComments: true, + force: true, + importPath: '<%= meta.src %>', + outputStyle: 'compressed', + environment: 'production' + } + }, + dynamic_mappings: { + files: [ + { + expand: true, + cwd: '<%= meta.src %>css/', + src: ['**/?.scss'], + dest: '<%= meta.dest %>css/', + ext: '.css' + } + ] + } + }, + deploy: { + 'static': { + before_deploy: 'build', + submodule_dir: 'dist/', + submodule_commit_comment: 'deploy static files' + } + }, + }); + + grunt.registerTask('default', 'dev'); + grunt.registerTask('build', ['clean', 'ozma', 'uglify', 'compass:prod']); + grunt.registerTask('dev', ['clean', 'ozma', 'compass:dev']); + + grunt.loadNpmTasks('grunt-contrib-watch'); + grunt.loadNpmTasks('grunt-contrib-clean'); + grunt.loadNpmTasks('grunt-contrib-copy'); + grunt.loadNpmTasks('grunt-contrib-compass'); + grunt.loadNpmTasks('grunt-contrib-uglify'); + grunt.loadNpmTasks('grunt-ozjs'); + + grunt.registerMultiTask('deploy', 'Deploy submodule files', function() { + var data = this.data, + beforeCmd = data.before_deploy || '', + afterCmd = data.after_deploy || ',', + submoduleDirPath = data.submodule_dir, + submoduleDir, + comment = data.submodule_commit_comment || 'update'; + + if (submoduleDir = grunt.file.findup(submoduleDirPath)) { + try { + this.requires(beforeCmd); + var taskDone = this.async(); + var oldBase = process.cwd(); + grunt.log.ok('Grunt command: ' + beforeCmd + ' ok!'); + grunt.file.setBase(submoduleDir); + grunt.util.async.series([ + // git add -A + function(done) { + grunt.log.writeln('git add -A'); + grunt.util.spawn({ + cmd: 'git', + args: [ 'add', '-A' ] + }, function(error, result, code) { + if (code === 0) { + done(null); + } else { + done(error); + } + }); + }, + // git commit -m + function(done) { + grunt.log.writeln('git commit -m'); + grunt.util.spawn({ + cmd: 'git', + args: [ 'commit', '-m', comment ] + }, function(error, result, code) { + if (code === 0) { + done(null); + } else { + done(result.stdout); + } + }); + }, + // git push + function(done) { + grunt.log.writeln('git push'); + grunt.util.spawn({ + cmd: 'git', + args: [ 'push' ] + }, function(error, result, code) { + if (code === 0) { + done(null); + } else { + done(error); + } + }); + }, + // git rev-parse HEAD + function(done) { + grunt.util.spawn({ + cmd: 'git', + args: [ 'rev-parse', 'HEAD' ] + }, function(error, result, code) { + if (code === 0) { + grunt.log.ok('Static files deployed @version: ' + result.stdout); + done(null); + } else { + done(error); + } + }); + }, + // return to BASE and add submodule dir + function(done) { + grunt.file.setBase(oldBase); + grunt.log.writeln('git add ' + submoduleDirPath); + grunt.util.spawn({ + cmd: 'git', + args: [ 'add', submoduleDirPath ] + }, function(error, result, code) { + if (code === 0) { + grunt.log.ok('Git add submodule: ' + submoduleDirPath); + done(null); + } else { + done(error); + } + }); + } + ], function(error, result) { + if (error) { + grunt.fail.fatal(error); + grunt.file.setBase(oldBase); + } + taskDone(); + }); + } catch(ex) { + grunt.task.run([ beforeCmd, this.name + ':' + this.target ]); + } + } else { + grunt.log.error('Submodule directory: ' + submoduleDirPath + ' is not exsit.'); + } + }); +}; diff --git a/LICENSE b/LICENSE index 7c79be9..fc052a9 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2013-2014, Douban Inc. +Copyright (c) 2013-2016, Douban Inc. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/README.md b/README.md index 25b3adc..a663d28 100644 --- a/README.md +++ b/README.md @@ -8,13 +8,38 @@ Douban CODE Dependency ---------- -- libmemcached +- libmc - Python 2.7+ - pip >= 1.4.1 +Docker Installation +------------------- + +1. Intall [Docker Engine](https://docs.docker.com/engine/installation/) + and [Docker Compose](https://docs.docker.com/compose/install/). +2. Note the Docker host IP address, if you are using a Docker Machine VM, + you can use the `docker-machine ip MACHINE_NAME` to get the IP address. +3. `cp code.local.env.sample code.local.env` + then change the value of `DOUBAN_CODE_DOMAIN` to `http://IP:8200`. +4. `docker-compose build` +5. `docker-compose up -d` +6. `mysql -udouban_code -pmy-code-passwd -h IP -D valentine < vilya/databases/schema.sql` +7. open http://IP:8200 + +Vagrant Installation(Recommended) +-------------------- + +``` +$cd code +$vagrant up +$vagrant ssh +# In ubuntu. we use `supervisor` to monitor and control CODE and other services. +#You just go web http://localhost:8200 +``` + Quick Installation ------------------ -Currently supports the following systems: +Currently supports following systems: * gentoo * ubuntu/debian @@ -22,59 +47,35 @@ Currently supports the following systems: * opensuse * archlinux -You only to excute: - -``` -bash <(curl -s https://raw.github.com/douban/code/master/scripts/install_code.sh) -``` - -Notes: The install script in `code/scripts` subdirectory, for example ubuntu/debian, -You can see `code/scripts/ubuntu.sh` - -Prepare -------- -- mysql # default port +You only need to execute: ``` -# import vilya/databases/schema.sql to database `valentine` -$ mysql -uroot -e 'create database valentine;' -$ mysql -uroot -D valentine < vilya/databases/schema.sql +$bash <(curl -s https://raw.githubusercontent.com/douban/code/master/scripts/install_code.sh) ``` -- memcached # default port +Then install & run `supervisor` to monitor and control all services of code. -- customize code config ``` -# after clone code repo you can change the default config by: -$ cd {CODE_REPO} -$ cp vilya/local_config.py.tmpl vilya/local_config.py -# overwrite configs defined in vilya/config.py. -$ vim vilya/local_config.py +pip install supervisor +sudo wget -O /etc/init.d/supervisor https://raw.githubusercontent.com/Supervisor/initscripts/master/ubuntu +sudo chmod +x /etc/init.d/supervisor +sudo cp scripts/supervisord.conf /etc/supervisord.conf +sudo cp scripts/code.conf /etc/supervisor/conf.d/code.conf +sudo /etc/init.d/supervisor start +# go web http://localhost:8200 ``` -Getting started ---------------- -``` -git clone https://github.com/douban/code.git -cd code -mysql -uroot -e 'create database valentine;' -mysql -uroot -D valentine < vilya/databases/schema.sql -virtualenv venv -. venv/bin/activate -pip install cython # should install first -pip install -U setuptools # python-libmemcached require updated setuptools -pip install -r requirements.txt -gunicorn -w 2 -b 127.0.0.1:8000 app:app # web & git http daemon -``` +Notes: The installation script is in `scripts` subdirectory, for example for ubuntu/debian, +you can find `scripts/ubuntu.sh` FAQ ---- 1. single http daemon - - `gunicorn -b 127.0.0.1:8001 smart_httpd:app` # git http daemon + - `gunicorn -b 127.0.0.1:8001 app:app` # git http daemon 2. vilya.config.DOMAIN - - if you run 'gunicorn -b IP:PORT app:app', the DOMAIN should be 'http://IP:PORT/' + - if you run 'gunicorn -b IP:PORT app:app', the DOMAIN should be 'http://IP:PORT' License diff --git a/Vagrantfile b/Vagrantfile new file mode 100644 index 0000000..cc18be8 --- /dev/null +++ b/Vagrantfile @@ -0,0 +1,10 @@ +# -*- mode: ruby -*- + +Vagrant.configure(2) do |config| + config.vm.box = "dongweiming/code" + + config.vm.network :forwarded_port, guest: 8200, host: 8200 + for i in 29000..30000 + config.vm.network :forwarded_port, guest: i, host: i + end +end diff --git a/app.py b/app.py index 61132dc..81e9eb6 100644 --- a/app.py +++ b/app.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- import re - +from gevent import monkey; monkey.patch_all() from web import app as web -from smart_httpd import app as git_http +from app_sina import app as git_http ROUTE_MAP = [(re.compile(r'/[^/]*\.git.*'), git_http), diff --git a/app_sina.py b/app_sina.py new file mode 100644 index 0000000..7f3d1b5 --- /dev/null +++ b/app_sina.py @@ -0,0 +1,174 @@ +# coding:utf8 +import os +import select +import subprocess +from wsgiauth.basic import BasicAuth + +from sina import Sina +from sina.config import DEFAULT_CONFIG + +from vilya.config import DEVELOP_MODE +from vilya.libs.permdir import get_repo_root +from vilya.models.project import CodeDoubanProject +from vilya.models.gist import Gist +from vilya.models.user import User + +DOUBAN_REALM = "douban wsgi basic auth" +DEFAULT_CONFIG['project_root'] = get_repo_root() +app = Sina(DEFAULT_CONFIG) + + +# @app.get_repo_path +def get_repo_path_handler(environ, path): + return '' + + +# @app.before_request +def before_request_handler(environ): + return + + +@app.has_permission +def has_permission_handler(environ, path, perm): + + if DEVELOP_MODE: + return True + + username = environ.get('REMOTE_USER') + + # if len(path) < 4: + # return + name = path[:-4] + + # gist + if name.startswith('gist/'): + gist_id = name.rpartition("/")[-1] + gist = Gist.get(gist_id) + if not gist: + return + + if perm == 'read': + return True + + if not username: + return + + return gist.owner_id == username + + # project + project = CodeDoubanProject.get_by_name(name) + if not project: + return + + if perm == 'read': + return True + + if not username: + return + if not project.can_push: + # merge only + return + return project.has_push_perm(username) + + +def authfunc(env, username, passwd): + if DEVELOP_MODE or (env['REMOTE_ADDR'] == '127.0.0.1' + and env['HTTP_HOST'] == 'localhost:8080'): + return True + + if not passwd: + return + + if username == 'code' and passwd == 'code': + return True + + user = User.get_by_name(username) + if user and user.validate_password(passwd): + return True + + is_push = 'service=git-receive-pack' in env['QUERY_STRING'] \ + or '/git-receive-pack' in env['PATH_INFO'] + if is_push: + pass + # FIXME: push permission + return True + + +def is_git_push_url(url, query=None): + if 'service=git-receive-pack' in query: + return True + if '/git-receive-pack' in url: + return True + return False + + +def get_proj(path): + ''' + >>> get_proj('/a.git/info/refs') + 'a' + >>> get_proj('/testuser/a.git/info/refs') + 'testuser/a' + ''' + path_split = path.split("/") + git_name = path_split[1] + if not git_name.endswith('.git'): + git_name = "/".join(path_split[1:3]) + assert "." in git_name, "Need a string looking like project.git, got '%s'" % git_name # noqa + proj_name, _ = os.path.splitext(git_name) + return proj_name + + +class HTTPAuth(object): + def __init__(self, application, realm, authfunc, scheme, **kw): + self.application = application + self.authenticate = scheme(realm, authfunc, **kw) + self.scheme = scheme.authtype + + def __call__(self, environ, start_response): + if not is_git_push_url(environ['PATH_INFO'], environ['QUERY_STRING']): + # passthrough basic auth + return self.application(environ, start_response) + + if environ.get('REMOTE_USER') is None: + result = self.authenticate(environ) + if not isinstance(result, str): + # Request credentials if authentication fails + return result(environ, start_response) + environ['REMOTE_USER'] = result + # git hook env + environ['env'] = {'CODE_REMOTE_USER': result} + environ['AUTH_TYPE'] = self.scheme + return self.application(environ, start_response) + + +class GitDispatcher(object): + + def __init__(self, git_app, web_app): + self.instances = { + 'git_app': git_app, + 'web_app': web_app, + } + + def get_application(self, user_agent): + if user_agent and 'git' not in user_agent: + return self.instances['web_app'] + return self.instances['git_app'] + + def __call__(self, environ, start_response): + user_agent = environ.get('HTTP_USER_AGENT') + app = self.get_application(user_agent) + return app(environ, start_response) + + +class RedirectWeb(object): + + def __call__(self, environ, start_response): + path_info = environ.get('PATH_INFO') + proj_name = get_proj(path_info) + start_response('301 Redirect', [('Location', '/%s/' % proj_name), ]) + return [] + + +redirect_app = RedirectWeb() +app = HTTPAuth(app, DOUBAN_REALM, authfunc, BasicAuth) +app = GitDispatcher(git_app=app, web_app=redirect_app) diff --git a/celeryconfig.py b/celeryconfig.py new file mode 100644 index 0000000..57e8ad7 --- /dev/null +++ b/celeryconfig.py @@ -0,0 +1,25 @@ +# coding=utf-8 +from kombu import Queue + +from vilya.config import REDIS_URI + +BROKER_URL = REDIS_URI +CELERY_RESULT_BACKEND = REDIS_URI +CELERY_TIMEZONE = 'UTC' + +CELERY_IMPORTS = ('tasks', ) + +CELERY_DEFAULT_QUEUE = 'default' +CELERY_QUEUES = ( + Queue('default', routing_key='task.#'), + Queue('feed_tasks', routing_key='feed.#'), +) +CELERY_DEFAULT_EXCHANGE = 'tasks' +CELERY_DEFAULT_EXCHANGE_TYPE = 'topic' +CELERY_DEFAULT_ROUTING_KEY = 'task.default' +CELERY_ROUTES = { + 'feeds.tasks.import_feed': { + 'queue': 'feed_tasks', + 'routing_key': 'feed.import', + }, +} diff --git a/code.env b/code.env new file mode 100644 index 0000000..b3d982e --- /dev/null +++ b/code.env @@ -0,0 +1,14 @@ +# MySQL +MYSQL_ROOT_PASSWORD=my-secret-passwd +MYSQL_DATABASE=valentine +MYSQL_USER=douban_code +MYSQL_PASSWORD=my-code-passwd +MYSQL_ALLOW_EMPTY_PASSWORD=no + +# douban code +DOUBAN_CODE_MEMCACHED_HOSTS=memcached:11311 +DOUBAN_CODE_DOUBANDB_SERVERS=memcached:11311 +DOUBAN_CODE_DOUBANDB_PROXIES= +DOUBAN_CODE_MYSQL_STORE={"farms": {"code_farm": {"master": "mysql:3306:valentine:douban_code:my-code-passwd", "tables": ["*"]}}} +DOUBAN_CODE_REDIS_URI=redis://redis:6379/0 +DOUBAN_CODE_DOMAIN=http://192.168.99.100:8200 diff --git a/code.local.env.sample b/code.local.env.sample new file mode 100644 index 0000000..3c40062 --- /dev/null +++ b/code.local.env.sample @@ -0,0 +1 @@ +DOUBAN_CODE_DOMAIN=http://192.168.99.100:8200 diff --git a/code_config.yaml b/code_config.yaml new file mode 100644 index 0000000..62e5111 --- /dev/null +++ b/code_config.yaml @@ -0,0 +1,12 @@ +docs: + pages: + builder: raw + dir: blog/output + name: Blog + sort: 1 + docs: + builder: pickle + dir: docs + name: Docs + sort: 2 +onimaru: /public/code \ No newline at end of file diff --git a/default_code_config.yaml b/default_code_config.yaml new file mode 100644 index 0000000..d3d5a6c --- /dev/null +++ b/default_code_config.yaml @@ -0,0 +1,23 @@ + +## Code-Douban config file +## ----------------------- +## +## YAML format + +## Docs functionality in Code allow your project to host +## some content like a documentation or a blog. +## By default, we have a sphinx builder running on +## the rst files found in the docs/ directory, if any. + +docs: + rstdocs: + dir: docs + builder: pickle + name: Docs + +# CSS customization +style: + projhead: "" # Inline styling for project head block + +# Onimaru url +onimaru: '' \ No newline at end of file diff --git a/dispatches/__init__.py b/dispatches/__init__.py new file mode 100644 index 0000000..c61fd8d --- /dev/null +++ b/dispatches/__init__.py @@ -0,0 +1,144 @@ +#!/usr/bin/env python +# encoding: utf-8 +import os +import glob +import importlib +import logging + +from vilya.libs.mq import async + + +# TODO: dispatcher 的结构需要再调整一次 +# 1、现在把notifications分离出来了,事实上这也只是actions这个动作的一部分 +# 而notifications里面现在的各种数据format跟逻辑应该塞到 models/actions 里,作为这个action的data +# 2、dispatch操作(send),现在views、models里均会出现不太合理 + + +__all__ = ['dispatch', ] + +DISPATCH_MQ_NAME = "dispatches_mq" + + +def sync_call(module_path, func_names, data): + logging.info('dispatch functions %s for module %s' % + (func_names, module_path)) + module = importlib.import_module(module_path) + + if isinstance(module, type) and issubclass(module, BaseDispatcher): + dispatcher = module(data) + else: + dispatcher = BaseDispatcher(data, module=module) + dispatcher._call_funcs_sync(func_names) + + +class BaseDispatcher(object): + def __init__(self, data, module=None): + self._data = data + self._module = module if module else self + + @property + def exports(self): + exports = getattr(self._module, '__exports__', None) + r = exports if exports is not None else dir(self._module) + return set(r) + + def __enter__(self): + if self._module is not self: + _module_enter = getattr(self._module, '__enter__', None) + if callable(_module_enter): + self._data = _module_enter(self._data) + return self + + def __exit__(self, type_, value, traceback): + if self._module is not self: + _module_exit = getattr(self._module, '__exit__', None) + if callable(_module_exit): + _module_exit(self._data) + + def __call__(self): + self.dispatch() + + def _call_funcs_sync(self, fnames): + if not fnames: + return + if self._module is self: + for fn in fnames: + func = getattr(self._module, fn, None) + if callable(func): + func() + else: + for fn in fnames: + func = getattr(self._module, fn, None) + if callable(func): + func(self._data) + + def _call_funcs_async(self, fnames): + fnames = list(fnames) if fnames else [] + if not fnames: + return + module = getattr(self._module, '__module__', None) + name = getattr(self._module, '__name__', None) + if module: + module_path = '.'.join((module, name)) + else: + module_path = name + if module_path: + async(sync_call)(module_path, fnames, self._data) + + def _call_dispatcher(self, fname): + if not fname: + return + dispatcherClass = getattr(self._module, fname, None) + if isinstance(dispatcherClass, type) \ + and issubclass(dispatcherClass, BaseDispatcher) \ + and dispatcherClass.__module__ == self._module.__name__: + dispatcher = dispatcherClass(self._data) + dispatcher.dispatch() + + def _call_dispatchers(self, dispatchers): + if not dispatchers: + return + for dispatcher in dispatchers: + self._call_dispatcher(dispatcher) + + def dispatch(self): + with self as s: + fnames = self.exports + self._call_funcs_async( + [fn for fn in fnames if fn.startswith('async_')]) + self._call_funcs_sync( + [fn for fn in fnames if fn.startswith('sync_')]) + self._call_dispatchers( + [fn for fn in fnames if fn.endswith('Dispatcher')]) + + +def get_subpkg(): + dir_ = os.path.dirname(__file__) + + def is_package(d): + d = os.path.join(dir_, d) + return os.path.isdir(d) and glob.glob(os.path.join(d, '__init__.py*')) + subpkgs = filter(is_package, os.listdir(dir_)) + return ['.'.join((__name__, subpkg)) for subpkg in subpkgs] + + +DISPATCH_BASE_MODULES = get_subpkg() + + +def dispatch(name, data): + module = None + checked_path = [] + for base in DISPATCH_BASE_MODULES: + path = '.'.join((base, name)) + try: + module = importlib.import_module(path) + except ImportError as e: + checked_path.append(path) + if module: + dispatcher = BaseDispatcher(data, module) + dispatcher.dispatch() + else: + return + raise ImportError( + 'Dispatcher Not Found: checked path %s', + repr(checked_path)) diff --git a/vilya/models/git/__init__.py b/dispatches/actions/__init__.py similarity index 100% rename from vilya/models/git/__init__.py rename to dispatches/actions/__init__.py diff --git a/dispatches/actions/comment_actions.py b/dispatches/actions/comment_actions.py new file mode 100644 index 0000000..e2e5876 --- /dev/null +++ b/dispatches/actions/comment_actions.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python +# encoding: utf-8 + +from vilya.config import DOMAIN +from vilya.models.project import CodeDoubanProject +from vilya.models.ticket import Ticket + +COMMENT_TEMPLATE = "{content} \n commented on [{sha}]" \ + "({domain}/{proj}/commit/{sha}#{anchor})" + + +def __enter__(data): + type_ = data.get('type') + comment = data.get('comment') + commit_author = data.get('commit_author') + + comment_dict = dict(ref=comment.ref, + author=comment.author, + content=comment.content, + project_id=comment.project_id, + comment_uid=comment.uid) + + rdata = { + 'type': type_, + 'comment': comment_dict, + 'commit_author': commit_author, + } + + return rdata + + +def async_comment_to_pr(data): + ''' commit comment rewrite to pr ''' + type_ = data.get('type') + if type_ not in ('commit_comment', 'commit_linecomment'): + return + + comment = data.get('comment') + ref = comment.get('ref') + author = comment.get('author') + content = comment.get('content') + proj_id = comment.get('project_id') + comment_uid = comment.get('comment_uid') + proj = CodeDoubanProject.get(proj_id) + prs = proj.open_family_pulls + anchor = comment_uid + + for pr in prs: + if ref in pr.get_commits_shas(): + content = COMMENT_TEMPLATE.format(content=content, + domain=DOMAIN, + proj=proj.name, + sha=ref, + anchor=anchor) + ticket = Ticket.get_by_projectid_and_ticketnumber( + pr.to_proj.id, pr.ticket_id) + ticket.add_comment(content, author) diff --git a/dispatches/actions/pr_actions.py b/dispatches/actions/pr_actions.py new file mode 100644 index 0000000..34fa1c9 --- /dev/null +++ b/dispatches/actions/pr_actions.py @@ -0,0 +1,163 @@ +# encoding: utf-8 + +from urlparse import urlparse +import json +import urllib +import urllib2 + +import requests + +from vilya.config import DOMAIN +from vilya.models.pull import PullRequest +from vilya.models.ticket import Ticket +from vilya.libs.push_notification import send_alert + + +def __enter__(data): + author = data.get('author') + type_ = data.get('type') + ticket = data.get('ticket') + pullreq = data.get('pullreq') + hooks = data.get('hooks') + hook_urls = [hook.url for hook in hooks] if hooks else [] + + from_proj = pullreq.from_proj + to_proj = pullreq.to_proj + + from_proj_dict = { + 'url': from_proj.url, + 'name': from_proj.name, + 'description': from_proj.summary, + 'from_ref': pullreq.from_ref, + 'owner': {'name': from_proj.owner_name} + } + + to_ref_dict = { + 'url': to_proj.url, + 'name': to_proj.name, + 'description': to_proj.summary, + 'from_ref': pullreq.to_ref, + 'owner': {'name': to_proj.owner_name} + } + + author_dict = {'name': author.name, 'url': author.url} + + rdata = { + 'type': type_, + 'id': ticket.ticket_id, + 'author': author_dict, + 'from_proj': from_proj_dict, + 'to_ref': to_ref_dict, + 'url': ticket.url, + 'title': ticket.title, + } + + # FIXME: content 没定义,而且照目前的代码看,type_ in ('pr_merge', None), see views/uis/pull.py + if type_ == 'pr_opened': + rdata.update({ + 'title': data.get('title'), + 'body': data.get('body'), + 'ticket_id': data.get('ticket').id, + }) + elif type_ == 'pr_merge': + rdata.update({ + 'commit_message': data.get('commit_message'), + }) + elif type_ == 'pr_closed': + rdata.update({ + 'content': '', + }) + # now... data is (hook_urls, rdata) + return hook_urls, rdata + + +def async_pr_hooks(args): + hooks, data = args + json_data = json.dumps(data) + for hook in hooks: + url = urlparse(hook) + + if url.hostname and url.hostname.endswith('.slack.com'): + slack_data = gen_slack_incoming_webhooks_data(data) + s = requests.Session() + try: + s.post(hook, data=json.dumps(slack_data), timeout=30) + except Exception as e: + print "%s => %s" % (hook, e) + elif data.get('type') == 'pr_opened' and url.hostname and \ + url.hostname.startswith('telchar'): + telchar_data = gen_telchar_data(data) + try: + requests.post(hook, data=telchar_data, timeout=30) + except Exception as e: + print "%s => %s" % (hook, e) + else: + try: + u = urllib2.urlopen(hook, urllib.urlencode({'data': json_data})) + u.read() + u.close() + except urllib2.URLError as e: + print "%s => %s" % (hook, e) + + +def async_push_notif(args): + hooks, data = args + msg = data.get('title') + to_proj = data.get('to_ref') + if to_proj.get('name') == 'iCode': + send_alert(msg) + + +def gen_telchar_data(data): + ticket_id = data.get('ticket_id') + ticket = Ticket.get(ticket_id) + pullreq = PullRequest.get_by_proj_and_ticket( + ticket.project.id, ticket.ticket_id) + fork_from = pullreq.from_proj.fork_from + fork_from = pullreq.from_proj.get(fork_from).url if fork_from else None + return { + 'ticket_id': ticket.ticket_id, + 'fork_from': fork_from, + 'url': pullreq.from_proj.url, + 'to_sha': pullreq.to_sha, + 'from_sha': pullreq.from_sha + } + + +def gen_slack_incoming_webhooks_data(data): + type_ = data.get('type') + action_text_mapping = { + 'pr_opened': 'opened', + 'pr_merge': 'merged', + 'pr_closed': 'closed', + } + if type_ not in action_text_mapping: + return {} + + text = data.get('text', '') + author_dict = data.get('author', {}) + author_url = author_dict.get('url', '') + author_name = author_dict.get('name', '') + + pr_url = data.get('url', '') + pr_id = data.get('id', '') + pr_title = data.get('title', '') + + to_ref_dict = data.get('to_ref', {}) + to_proj_url = to_ref_dict.get('url', '') + to_proj_name = to_ref_dict.get('name', '') + + author_link = '<{0}{1}|{2}>'.format(DOMAIN, author_url, author_name) + pr_link = '<{0}{1}|#{2} {3}>'.format(DOMAIN, pr_url, pr_id, pr_title) + to_proj_link = '<{0}{1}|{2}>'.format(DOMAIN, to_proj_url, to_proj_name) + + action_text = action_text_mapping.get(type_) + text = 'Pull Request {0} on {1} is {2} by {3}'.format( + pr_link, to_proj_link, action_text, author_link) + + data = { + 'text': text, + 'username': 'Code', + } + + return data diff --git a/dispatches/actions/push_actions.py b/dispatches/actions/push_actions.py new file mode 100644 index 0000000..1da88e1 --- /dev/null +++ b/dispatches/actions/push_actions.py @@ -0,0 +1,97 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import urllib +import urllib2 +import json +from dateutil import parser +from vilya.libs.signals import push_signal +from vilya.models.project import CodeDoubanProject +from vilya.models.user import get_author_by_email +from vilya.models.lru_counter import (ProjectOwnLRUCounter, + ProjectWatchLRUCounter) +from vilya.views.uis.pull import TicketUI + + +def __enter__(data): + return data + + +def async_push_notif(args): + data = args + repo = data.get('repository', {}) + repo_name = repo.get('name', '') + repo_url = repo.get('url', '') + ref = data.get('ref', '') + pushername = data.get('user_name') + branch = ref.split('/')[-1] + commits = data.get('commits', []) + commits_data = [] + proj = CodeDoubanProject.get_by_name(repo_name) + for c in commits: + author = c.get('author', {}) + email = author.get('email') + username = get_author_by_email(email) + if not username: + continue + commit_id = c.get('id') + message = c.get('message') + timestamp = c.get('timestamp') + url = '%s/commit/%s' % (repo_url, commit_id) + ProjectOwnLRUCounter(username).use(proj.id) + ProjectWatchLRUCounter(username).use(proj.id) + commits_data.append(dict(repo_name=repo_name, + repo_url=repo_url, + ref=ref, + branch=branch, + author=author, + username=username, + email=email, + commit_id=commit_id, + message=message, + timestamp=parser.parse(timestamp[:-5]), + url=url)) + + before = data.get('before') + after = data.get('after') + push_signal.send('push', + repo_name=repo_name, + repo_url=repo_url, + ref=ref, + branch=branch, + commits=commits_data, + before=before, + after=after, + username=pushername) + + +def async_push_commits(args): + data = args + repo = data.get('repository', {}) + repo_name = repo.get('name', '') + proj = CodeDoubanProject.get_by_name(repo_name) + + # 追加commit到pr + # FIXME: more project eg: fork network + opened_pr = proj.open_parent_pulls + parent_proj = proj.get_forked_from() + for pr in opened_pr: + # FIXME: split this or use async + TicketUI(parent_proj.name, pr.ticket_id)._add_additional_commits() + + +def async_push_hooks(args): + data = args + repo = data.get('repository', {}) + repo_name = repo.get('name', '') + proj = CodeDoubanProject.get_by_name(repo_name) + data = json.dumps(data) + # FIXME: use services + if proj: + for h in proj.hooks: + try: + u = urllib2.urlopen(h.url, urllib.urlencode({'payload': data})) + u.read() + u.close() + except urllib2.URLError, x: + print "%s => %s" % (h.url, x) diff --git a/dispatches/notifications/__init__.py b/dispatches/notifications/__init__.py new file mode 100644 index 0000000..c0fce4a --- /dev/null +++ b/dispatches/notifications/__init__.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import time +from vilya.config import DOMAIN +from datetime import datetime +from dispatches import BaseDispatcher + +__all__ = ('dispatch', ) + + +class NotificationDispatcher(BaseDispatcher): + def __init__(self, data): + self._uid = self._gen_uid() + self._data = data + + def _gen_uid(self): + t = time.time() + t1 = int(t) + t2 = int((t-t1)*10E6) + return "%x%x" % (t1, t2) + + @property + def uid(self): + return self._uid + + @property + def msgs(self): + return [] + + @property + def hook_url(self): + return self.domain("/hub/beacon/%s.gif/" % self.uid) + + def now(self): + return datetime.now() + + def domain(self, url): + return DOMAIN + url + + def dispatch(self): + for msg in self.msgs: + if msg: + msg.send() + + @staticmethod + def save_as_attr(func): + func_name = func.func_name + if func_name == 'data': + func_name = '_attr_data' + else: + func_name = '_' + func_name + + def _(self): + if hasattr(self, func_name): + return getattr(self, func_name) + else: + r = func(self) + setattr(self, func_name, r) + return r + return _ diff --git a/dispatches/notifications/codereview.py b/dispatches/notifications/codereview.py new file mode 100644 index 0000000..e826e18 --- /dev/null +++ b/dispatches/notifications/codereview.py @@ -0,0 +1,154 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from dispatches.notifications import NotificationDispatcher +from vilya.libs.text import get_mentions_from_text +from vilya.models.actions.pull_comment import PullComment +from vilya.models.pull import PullRequest +from vilya.models.ticket import TicketComment +from vilya.models.notification import Notification +from vilya.models.mute import Mute +from vilya.libs.irc import IrcMsg +from vilya.libs.mailer import Mail, MailContext + + +EMAIL_TITLE = '[%s] %s (#%s)' # [project name] pull request title (#ticket id) +EMAIL_IN_REPLY_TO = '<%s-pull-%s@code>' +EMAIL_REPLY_BOT = 'code-email-reply+code@dappsmail.douban.com' + + +class Dispatcher(NotificationDispatcher): + def __init__(self, data): + NotificationDispatcher.__init__(self, data) + self._sender = data.get('sender') + self._comment = data.get('comment') + self._content = self._comment.content if self._comment else data.get('content', '') + self._ticket = data.get('ticket') + self._pullreq = PullRequest.get_by_ticket(self._ticket) + self._target = self._pullreq.to_proj + self._is_ticketcomment = isinstance(self._comment, TicketComment) + + @property + def msgs(self): + return [self.ircmsg, self.mail, self.noti] + + @property + def uid(self): + if self._comment: + return self._comment.uid + else: + return self._uid + + @property + @NotificationDispatcher.save_as_attr + def noti_receivers(self): + participants = self._ticket.participants + mentions = get_mentions_from_text(self._content) + extra = [self._ticket.author, self._pullreq.to_proj.owner_id] + receivers = set(participants + mentions + extra) + receivers.discard(self._sender) + return Mute.filter('ticket', self._target.name, + self._pullreq.ticket_id, receivers) + + @property + @NotificationDispatcher.save_as_attr + def noti_data(self): + pullreq = self._pullreq + ticket = self._ticket + uid = self.uid + sender = self._sender + content = self._content + url = self.domain("/%s/pull/%s/#%s" % (pullreq.to_proj, + ticket.ticket_id, + uid)) + # TODO: 我认为数据应该都放在action里,这里只负责dispatch,而涉及到复杂逻辑计算的都应该合到相应的model里, + # 但是这部分还在重构,会有交集,不便修改 + action = PullComment(sender, self.now(), pullreq, ticket, + content, url) + return action.to_dict() + + @property + def noti(self): + return Notification(self.uid, self.noti_receivers, self.noti_data) + + @property + def irc_receivers(self): + return IrcMsg.irc_receiver_filter(self.noti_receivers, self._target) + + @property + def ircmsg(self): + data = self.noti_data + url = data.get('url') + proj = data.get('proj') + sender = self._sender + message = "%s commented on %s %s" % (sender, proj, url) + return IrcMsg(self.irc_receivers, message) + + @property + def mail_receivers(self): + toaddr = Mail.addrs_by_usernames([self._ticket.author]) + ccaddr = Mail.addrs_by_usernames(self.noti_receivers) + toaddr.add(EMAIL_REPLY_BOT) + return toaddr, ccaddr + + @property + def mail_subject(self): + proj = self._pullreq.to_proj + ticket = self._ticket + ticket_id = ticket.ticket_id + ticket_title = ticket.title + return EMAIL_TITLE % (proj.name, ticket_title, ticket_id) + + @property + def reply_mail_subject(self): + return "RE:" + self.mail_subject + + @property + def in_reply_to(self): + proj = self._pullreq.to_proj + ticket = self._ticket + ticket_id = ticket.ticket_id + return EMAIL_IN_REPLY_TO % (proj.name, ticket_id) + + @property + def mail(self): + comment = self._comment + uid = self.uid + + ticket = self._ticket + ticket_id = ticket.ticket_id + ticket_title = ticket.title + + author = self._sender + content = self._content + + pullreq = self._pullreq + proj = pullreq.to_proj + proj_url = self.domain(proj.url) + proj_name = proj.name + + if self._is_ticketcomment: + pr_url = '/%s/pull/%s/' % (proj_name, ticket_id) + url = self.domain('%s#%s' % (pr_url, uid)) + else: + path = comment.path + url = self.domain(str('/%s/pull/%s/files#%s' % (proj_name, + ticket_id, + uid))) + # FIXME: move to pullreq.xx + diff = pullreq.get_diff(ref=comment.from_sha, paths=[path]) + # FIXME: new smart_slice + #diff_content = diff.patches[0].smart_slice(comment.position) if diff and diff.patches else [] + diff_content = '' + + subject = self.reply_mail_subject + in_reply_to = self.in_reply_to + hook_url = self.hook_url + fromaddr = Mail.customize_sender(author, proj_name) + toaddr, ccaddr = self.mail_receivers + return Mail(subject, + to=toaddr, + cc=ccaddr, + from_=fromaddr, + in_reply_to=in_reply_to, + context=MailContext('codereview', data=locals())) diff --git a/dispatches/notifications/comment.py b/dispatches/notifications/comment.py new file mode 100644 index 0000000..0561b8e --- /dev/null +++ b/dispatches/notifications/comment.py @@ -0,0 +1,131 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from vilya.config import DOMAIN +from vilya.libs.irc import IrcMsg +from vilya.libs.text import get_mentions_from_text +from vilya.libs.mailer import Mail, MailContext +from dispatches.notifications import NotificationDispatcher +from vilya.models.actions.commit_comment import CommitComment +from vilya.models.feed import FeedMsg +from vilya.models.project import CodeDoubanProject +from vilya.models.notification import Notification + +EMAIL_TITLE = '[%s] %s' # [project name] commit sha +EMAIL_IN_REPLY_TO = '<%s-commit-%s@code>' +EMAIL_REPLY_BOT = 'code-email-reply+code@dappsmail.douban.com' + + +class Dispatcher(NotificationDispatcher): + def __init__(self, data): + NotificationDispatcher.__init__(self, data) + self._comment = data.get('comment') + # TODO: get commit author by sha # ...现在应该是 None + self._commit_author = data.get('commit_author') + self._is_line_comment = data.get('is_line_comment') # no use + self._proj = CodeDoubanProject.get(self._comment.project_id) + + @property + def msgs(self): + return [self.noti, self.ircmsg, self.feedmsg, self.mail] + + @property + def uid(self): + return self._comment.uid + + @property + def full_url(self): + proj = self._proj + comment = self._comment + url = '%s/%s/commit/%s#%s' % (DOMAIN, proj.name, comment.ref, self.uid) + return url + + @property + def noti_receivers(self): + comment = self._comment + comments = comment.gets_by_proj_and_ref( + self._proj.id, + comment.ref) + co_authors = {c.author for c in comments} + mentions = set(get_mentions_from_text(comment.content)) + extra_receivers = set([r for r in (self._proj.owner_id, self._commit_author) if r]) + rs = (co_authors | mentions | extra_receivers) + rs.discard(comment.author) + return rs + + @property + def noti_data(self): + comment = self._comment + proj = self._proj + url = '/%s/commit/%s#%s' % (proj.name, comment.ref, self.uid) + action = CommitComment(comment.author, comment.created, proj.name, + comment.ref, comment.content, url) + return action.to_dict() + + @property + def noti(self): + return Notification(self.uid, self.noti_receivers, self.noti_data) + + @property + def irc_receivers(self): + return IrcMsg.irc_receiver_filter(self.noti_receivers, self._proj) + + @property + def ircmsg(self): + comment = self._comment + url = self.full_url + msg = "%s commented on commit '%s' ( %s )" % ( + comment.author, + comment.ref[:8], + url) + return IrcMsg(self.irc_receivers, msg) + + @property + def feedmsg(self): + sender = self._comment.author + return FeedMsg(sender, [], project=self._proj, data=self.noti_data) + + @property + def mail_receivers(self): + toaddr = Mail.addrs_by_usernames([self._proj.owner_id]) + ccaddr = Mail.addrs_by_usernames(self.noti_receivers) + toaddr.add(EMAIL_REPLY_BOT) + return toaddr, ccaddr + + @property + def mail_subject(self): + proj = self._proj + comment = self._comment + title = comment.ref + return EMAIL_TITLE % (proj.name, title) + + @property + def reply_mail_subject(self): + return "RE:" + self.mail_subject + + @property + def in_reply_to(self): + proj = self._proj + comment = self._comment + title = comment.ref + return EMAIL_IN_REPLY_TO % (proj.name, title) + + @property + def mail(self): + proj = self._proj + comment = self._comment + in_reply_to = self.in_reply_to + subject = self.reply_mail_subject + url = self.full_url + hook_url = self.hook_url + content = self._comment.content + author = comment.author + proj_name = proj.name + fromaddr = Mail.customize_sender(author, proj_name) + toaddr, ccaddr = self.mail_receivers + return Mail(subject, + to=toaddr, + cc=ccaddr, + from_=fromaddr, + in_reply_to=in_reply_to, + context=MailContext('codereview', data=locals())) diff --git a/dispatches/notifications/issue.py b/dispatches/notifications/issue.py new file mode 100644 index 0000000..ff5a5c8 --- /dev/null +++ b/dispatches/notifications/issue.py @@ -0,0 +1,100 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from dispatches.notifications import NotificationDispatcher +from vilya.libs.mailer import Mail, MailContext +from vilya.libs.irc import IrcMsg +from vilya.libs.text import get_mentions_from_text +from vilya.models.actions.issue import Issue as IssueAciton +from vilya.models.notification import Notification + +EMAIL_TITLE = '[%s] %s (#%s)' # [project name] issue title (#issue id) +IN_REPLY_TO = '<%s-issue-%s@code>' + + +class Dispatcher(NotificationDispatcher): + def __init__(self, data): + NotificationDispatcher.__init__(self, data) + self._sender = data.get('sender') + self._content = data.get('content') + self._issue = data.get('issue') + self._issue_id = self._issue.issue_id + self._target = self._issue.target + + @property + def msgs(self): + return [self.noti, self.ircmsg, self.mail] + + @property + @NotificationDispatcher.save_as_attr + def noti_receivers(self): + issue = self._issue + target = self._target + mentions = get_mentions_from_text(self._content) + participants = [p.user_id for p in issue.participants if p] + if issue.target_type == 'project': + extra_receivers = [issue.creator_id, target.owner_id] + else: + extra_receivers = self._target.user_ids + extra_receivers.append(issue.creator_id) + rs = set(mentions + participants + extra_receivers) + rs.discard(self._sender) + return rs + + @property + @NotificationDispatcher.save_as_attr + def noti_data(self): + content = self._content + issue = self._issue + target = self._target + sender = self._sender + state = 'closed' if issue.closer_id else 'open' + action = IssueAciton(sender, self.now(), target, issue, state, content) + return action.to_dict() + + @property + def noti(self): + return Notification(self._uid, self.noti_receivers, self.noti_data) + + @property + def irc_receivers(self): + return IrcMsg.irc_receiver_filter(self.noti_receivers, self._target) + + @property + def ircmsg(self): + sender = self._sender + issue = self._issue + target = self._target + url = self.domain(issue.url) + action = 'closed' if issue.closer_id else "opened" + msg = "Issue '%s' ( %s ) of %s is %s by %s" % ( + issue.title, url, target.name, action, sender) + return IrcMsg(self.irc_receivers, msg) + + @property + def mail(self): + sender = self._sender + content = self._content + issue = self._issue + target = self._target + url = self.domain(issue.url) + toaddrs = Mail.addrs_by_usernames(self.noti_receivers, target) + fromaddr = Mail.customize_sender(sender, target.name) + hook_url = self.hook_url + in_reply_to = IN_REPLY_TO % (target.name, self._issue_id) + if issue.is_closed: + status_line = "Issue closed by %s" % sender + subject = EMAIL_TITLE % (target.name, issue.title, issue.number) + message_id = None + else: + status_line = "%s create a new issue [%s (#%s)](%s)" % ( + sender, issue.title, issue.number, url) + subject = "RE:" + EMAIL_TITLE % (target.name, issue.title, issue.number) + message_id = in_reply_to + if toaddrs: + return Mail(subject, + to=toaddrs, + from_=fromaddr, + in_reply_to=in_reply_to, + message_id=message_id, + context=MailContext('_', data=locals())) diff --git a/dispatches/notifications/issue_comment.py b/dispatches/notifications/issue_comment.py new file mode 100644 index 0000000..c7a8fe0 --- /dev/null +++ b/dispatches/notifications/issue_comment.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from dispatches.notifications.issue import Dispatcher as IssueDispatcher +from vilya.libs.mailer import Mail, MailContext +from vilya.libs.irc import IrcMsg +from vilya.models.actions.issue_comment import IssueComment + +EMAIL_TITLE = "RE: [%s] %s (#%s)" +IN_REPLY_TO = '<%s-issue-%s@code>' + + +class Dispatcher(IssueDispatcher): + def __init__(self, data): + IssueDispatcher.__init__(self, data) + self._comment = data.get('comment') + self._comment_id = self._comment.id + self._url = "%s#comment-%s" % (self._issue.url, self._comment.number) + + @property + def msgs(self): + return [self.noti, self.mail, self.ircmsg] + + @property + def noti_data(self): + action = IssueComment(self._sender, self.now(), self._target, + self._issue, self._content) + return action.to_dict() + + @property + def ircmsg(self): + sender = self._sender + issue = self._issue + url = self.domain(self._url) + msg = "%s commented on '%s' ( %s )" % (sender, issue.title, url) + return IrcMsg(self.irc_receivers, msg) + + @property + def mail(self): + sender = self._sender + content = self._content + issue = self._issue + comment = self._comment + target = self._target + + subject = EMAIL_TITLE % (target, issue.title, issue.number) + hook_url = self.hook_url + url = self.domain(self._url) + + toaddr = Mail.addrs_by_usernames([sender]) + ccaddr = Mail.addrs_by_usernames(self.noti_receivers, target) + + in_reply_to = IN_REPLY_TO % (target.name, self._issue_id) + fromaddr = Mail.customize_sender(sender, target.name) + status_line = "{} commented on issue [{} (#{})]({})".format( + sender, issue.title, issue.number, url) + + return Mail( + subject, + to=toaddr, + cc=ccaddr, + from_=fromaddr, + in_reply_to=in_reply_to, + context=MailContext('_', data=locals())) diff --git a/dispatches/notifications/new_commits.py b/dispatches/notifications/new_commits.py new file mode 100644 index 0000000..fda372d --- /dev/null +++ b/dispatches/notifications/new_commits.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from dispatches.notifications import NotificationDispatcher +from vilya.libs.mailer import Mail, MailContext +from vilya.models.mute import Mute +#from vilya.models.actions.pull_commit import PullCommit # feed will need + +EMAIL_TITLE = "[%s] %s (#%s)" +IN_REPLY_TO = '<%s-pull-%s@code>' +COMMIT_LIMIT = 3 + + +class Dispatcher(NotificationDispatcher): + def __init__(self, data): + NotificationDispatcher.__init__(self, data) + self._deltacommits = data.get('deltacommits') + self._pullreq = data.get('pullreq') + self._ticket = data.get('ticket') + self._sender = self._pullreq.from_proj.owner_name + self._target = self._pullreq.to_proj + + @property + def msgs(self): + return [self.mail] + + @property + def mail_receivers(self): + ticket = self._ticket + ticket_id = ticket.ticket_id + target = self._target + to_receivers = Mute.filter('ticket', target.name, + ticket_id, [ticket.author, ]) + cc_recievers = Mute.filter('ticket', target.name, + ticket_id, ticket.participants) + toaddr = Mail.addrs_by_usernames(to_receivers, target) + ccaddr = Mail.addrs_by_usernames(cc_recievers, target) + return toaddr, ccaddr + + @property + def mail(self): + ticket = self._ticket + pullreq = self._pullreq + target = self._target + deltacommits = self._deltacommits + sender = self._sender + if len(deltacommits) > COMMIT_LIMIT: + more = self.domain("/%s/compare/%s...%s" % ( + pullreq.to_proj.name, + deltacommits[-COMMIT_LIMIT-1].sha, + deltacommits[0].sha,)) + more_count = len(deltacommits) - COMMIT_LIMIT + delta_commits = [(c.author.name, c.shortlog, self.domain(c.url), c.shortsha) + for c in reversed(deltacommits[-COMMIT_LIMIT:])] + hook_url = self.hook_url + ticket_url = self.domain(ticket.url) + in_reply_to = IN_REPLY_TO % (target.name, ticket.ticket_id) + subject = EMAIL_TITLE % (target.name, ticket.title, ticket.ticket_id) + fromaddr = Mail.customize_sender(sender, target.name) + toaddr, ccaddr = self.mail_receivers + return Mail(subject, + to=toaddr, + cc=ccaddr, + from_=fromaddr, + in_reply_to=in_reply_to, + context=MailContext('new_commits', data=locals())) diff --git a/dispatches/notifications/pullreq.py b/dispatches/notifications/pullreq.py new file mode 100644 index 0000000..1d2d45b --- /dev/null +++ b/dispatches/notifications/pullreq.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from dispatches.notifications.codereview import Dispatcher as CodeReviewDispatcher +from vilya.libs.mailer import Mail, MailContext +from vilya.libs.irc import IrcMsg +from vilya.models.actions.pull import Pull as PullAction + + +class Dispatcher(CodeReviewDispatcher): + def __init__(self, data): + CodeReviewDispatcher.__init__(self, data) + self._status = data.get('status') + self._newversion = data.get('new_version') + self._extra_receivers = data.get('extra_receivers') + + @property + def msgs(self): + return [self.noti, self.ircmsg, self.mail] + + @property + @CodeReviewDispatcher.save_as_attr + def noti_data(self): + pullreq = self._pullreq + ticket = self._ticket + state = self._status + new_version = self._newversion + pullreq_url = "/%s/pull/%s/" % (pullreq.to_proj, + ticket.ticket_id) + # TODO: 这种逻辑塞到 model.pull 里更好点? + if new_version: + owner = pullreq.merge_by or self._sender + else: + owner = ticket.owner.name + commiter = ticket.author + action = PullAction(commiter, self.now(), pullreq, ticket, + owner, state, pullreq_url) + return action.to_dict() + + @property + def ircmsg(self): + data = self.noti_data + title = data.get('title') + url = self.domain(data.get('url')) + to_proj = data.get('to_proj') + sender = self._sender + status = self._status + sta = 'posted' if status == 'unmerge' else status + message = "Pull request '%s' ( %s ) of %s is %s by %s" % ( + title, url, to_proj, sta, sender) + return IrcMsg(self.irc_receivers, message) + + @property + def extra_receivers(self): + if self._extra_receivers: + return Mail.addrs_by_usernames(self._extra_receivers) + else: + return set() + + @property + def mail(self): + comment = self._comment + pullreq = self._pullreq + to_proj = pullreq.to_proj + ticket = self._ticket + ticket_id = ticket.ticket_id + status = self._status + sender = self._sender + diffurl = self.domain('/%s/pull/%s' % (to_proj.name, ticket_id)) + url = "%s/" % diffurl + hook_url = self.hook_url + + if status == 'unmerge': + _, toaddr = self.mail_receivers + ccaddr = self.extra_receivers + subject = self.mail_subject + content = self._content + message_id = self.in_reply_to + else: + toaddr, ccaddr = self.mail_receivers + subject = self.reply_mail_subject + content = """Pull request [{ticket_title} (#{ticket_id})]({url}) is {status} by {sender} """.format( + ticket_title=ticket.title, + ticket_id=ticket_id, + url=url, + status=status, + sender=sender) + message_id = None + + in_reply_to = self.in_reply_to + fromaddr = Mail.customize_sender(self._sender, to_proj.name) + return Mail(subject, + to=toaddr, + cc=ccaddr, + from_=fromaddr, + in_reply_to=in_reply_to, + message_id=message_id, + context=MailContext('pullrequest', data=locals())) diff --git a/dispatches/notifications/qaci.py b/dispatches/notifications/qaci.py new file mode 100644 index 0000000..f663fde --- /dev/null +++ b/dispatches/notifications/qaci.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from dispatches.notifications import NotificationDispatcher +from vilya.libs.irc import IrcMsg +from vilya.libs.mailer import Mail, MailContext +from vilya.models.mute import Mute + +IRC_TEMPLATE = "[{state}]Pull request '{title}' #{ticket_id} {ticket_url} \ + build #{qaci_id} {qaci_url} {qaci_sha} of {project_name}." +EMAIL_TITLE_TEMPLATE = "[{state}] {project_name}#{qaci_id} ({qaci_sha})" + + +class Dispatcher(NotificationDispatcher): + + def __init__(self, data): + NotificationDispatcher.__init__(self, data) + self._sha = data.get('sha') + self._project = data.get('project') + self._state = data.get('state') + self._pull = data.get('pull') + self._qaci_url = data.get('url') + self._ticket = self._pull.ticket + self._target = self._pull.to_proj + url = self._qaci_url + if url.endswith('/'): + url = url[:-1] + self.build_number = url.rpartition('/')[-1] + + @property + def msgs(self): + return [self.ircmsg] + + @property + @NotificationDispatcher.save_as_attr + def noti_receivers(self): + participants = self._ticket.participants + extra = [self._ticket.author, self._pull.to_proj.owner_id] + receivers = set(participants + extra) + return Mute.filter('ticket', + self._target.name, + self._pull.ticket_id, + receivers) + + @property + def irc_receivers(self): + return IrcMsg.irc_receiver_filter(self.noti_receivers, self._target) + + @property + def mail_receivers(self): + toaddr = Mail.addrs_by_usernames([self._ticket.author]) + #ccaddr = Mail.addrs_by_usernames(self.noti_receivers) + ccaddr = [] + return toaddr, ccaddr + + @property + def ircmsg(self): + sha = self._sha + state = self._state + pull = self._pull + ticket_id = self._ticket.ticket_id + title = self._ticket.title + number = self.build_number + url = self._qaci_url + project = pull.to_proj + qaci_url = "( %s ) " % url if state == 'failure' else '' + msg = IRC_TEMPLATE.format(state=state, + title=title, + ticket_id=ticket_id, + ticket_url="( %s )" % pull.full_url, + qaci_id=number, + qaci_url=qaci_url, + qaci_sha=sha[:8], + project_name=project.name) + return IrcMsg(self.irc_receivers, msg) + + @property + def mail(self): + sha = self._sha + state = self._state + pull = self._pull + url = self._qaci_url + project = pull.to_proj + number = self.build_number + commit = project.repo.get_commit(sha) + ticket_url = pull.full_url + subject = EMAIL_TITLE_TEMPLATE.format(state=state, + project_name=project.name, + qaci_id=number, + qaci_sha=sha[:8]) + toaddr, ccaddr = self.mail_receivers + in_reply_to = None + message_id = None + return Mail(subject, + to=toaddr, + cc=ccaddr, + in_reply_to=in_reply_to, + message_id=message_id, + context=MailContext('qaci', data=locals())) diff --git a/dispatches/notifications/recommend.py b/dispatches/notifications/recommend.py new file mode 100644 index 0000000..90b2da4 --- /dev/null +++ b/dispatches/notifications/recommend.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python +# encoding: utf-8 + +from vilya.config import DOMAIN +from dispatches.notifications import NotificationDispatcher +from vilya.libs.text import get_mentions_from_text +from vilya.models.actions.recommend import Recommend as RecommendAction +from vilya.models.notification import Notification +from vilya.models.feed import FeedMsg + + +class Dispatcher(NotificationDispatcher): + def __init__(self, data): + NotificationDispatcher.__init__(self, data) + self._recommend = data.get('recommend') + + @property + def msgs(self): + return [self.noti, self.feedmsg] + + @property + def noti_receivers(self): + receivers = set() + receivers.add(self._recommend.to_user) + mentions = set(get_mentions_from_text(self._recommend.content)) + return receivers | mentions + + @property + def noti_data(self): + recommend = self._recommend + url = ('%s/people/%s/praises' % (DOMAIN, recommend.to_user)) + action = RecommendAction(recommend.from_user, recommend.created, + recommend, url) + return action.to_dict() + + @property + def noti(self): + return Notification(self._uid, self.noti_receivers, self.noti_data) + + @property + def feedmsg(self): + sender = self._recommend.from_user + return FeedMsg(sender, [self._recommend.to_user], + data=self.noti_data) diff --git a/dispatches/notifications/team_add_member.py b/dispatches/notifications/team_add_member.py new file mode 100644 index 0000000..7cd2a48 --- /dev/null +++ b/dispatches/notifications/team_add_member.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python +# encoding: utf-8 + +from vilya.config import DOMAIN +from dispatches.notifications import NotificationDispatcher +from vilya.libs.irc import IrcMsg +from vilya.models.actions.team_add_member import TeamAddMember +from vilya.models.notification import Notification + + +class Dispatcher(NotificationDispatcher): + + def __init__(self, data): + NotificationDispatcher.__init__(self, data) + self._sender = data.get('sender') + self._identity = data.get('identity', '') + self._team_uid = data.get('team_uid', '') + self._team_name = data.get('team_name', '') + self._receiver = data.get('receiver') + + @property + def msgs(self): + return [self.noti, self.ircmsg] + + @property + def noti_data(self): + url = '/hub/team/%s/' % self._team_uid, + action = TeamAddMember(self._sender, self.now(), self._receiver, + self._team_name, self._identity, url) + return action.to_dict() + + @property + def receivers(self): + return {self._receiver} + + @property + def noti(self): + return Notification( + self._uid, + self.receivers, + self.noti_data) + + @property + def ircmsg(self): + url = DOMAIN + '/hub/team/%s' % (self._team_uid) + msg = "%s add you as %s of team %s ( %s )" % (self._sender, + self._identity, + self._team_name, + url) + return IrcMsg(self.receivers, msg) diff --git a/dispatches/notifications/weekly.py b/dispatches/notifications/weekly.py new file mode 100644 index 0000000..92937d2 --- /dev/null +++ b/dispatches/notifications/weekly.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python +# encoding: utf-8 + +from vilya.libs.mailer import Mail, MailContext +from vilya.libs.date import ( + get_current_monday, get_last_monday, + get_current_sunday, get_last_sunday) +from dispatches.notifications import NotificationDispatcher +from vilya.models.team import Team + + +class Dispatcher(NotificationDispatcher): + + def __init__(self, data): + NotificationDispatcher.__init__(self, data) + self._team_id = data.get('team_id') + self._last_week = data.get('last_week') + self._team = Team.get(self._team_id) + + @property + def msgs(self): + return [self.mail] + + @property + def mail_receivers(self): + toaddrs = Mail.addrs_by_usernames(self._team.user_ids) + ccaddrs = ["xutao@douban.com"] + return toaddrs, ccaddrs + + @property + def mail(self): + if self._last_week: + timestamp = get_last_monday(timestamp=True) + monday = get_last_monday() + sunday = get_last_sunday() + else: + timestamp = get_current_monday(timestamp=True) + monday = get_current_monday() + sunday = get_current_sunday() + changes = [] + projects = self._team.projects + for project in projects: + commits = project.repo.get_commits("HEAD", since=int(timestamp), + no_merges=True) + changes.append(dict(project=project, commits=commits)) + lines = [] + toaddrs, ccaddrs = self.mail_receivers + mail = Mail("Code Team Weekly", + to=toaddrs, + cc=ccaddrs, + context=MailContext('weekly', data={"lines": lines, + "changes": changes, + "team": self._team, + "sunday": sunday, + "monday": monday}), + big=True) + return mail diff --git a/dist/css/app/badge.css b/dist/css/app/badge.css new file mode 100644 index 0000000..d3e333a --- /dev/null +++ b/dist/css/app/badge.css @@ -0,0 +1,5724 @@ +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* line 1, ../../../hub/static/css/mod/user-card.scss */ +.user-card { + position: absolute; + padding: 3px 5px 5px; + min-height: 68px; + width: 210px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +/* line 2, ../../../hub/static/css/mod/user-card.scss */ +.user-card .desc { + margin-left: 3px; +} + +/* line 3, ../../../hub/static/css/mod/user-card.scss */ +.user-card .avatar-wrap { + width: 46px; + height: 36px; + float: left; + margin-right: 6px; + border-right: 1px solid #BEBEBE; +} + +/* line 4, ../../../hub/static/css/mod/user-card.scss */ +.user-card .badge-item { + float: left; + width: 30px; + height: 30px; + border: none; + padding: 2px; + background-color: white; + line-height: 0; + margin-right: 0.7em; +} + +/* line 5, ../../../hub/static/css/mod/user-card.scss */ +.user-card .title { + padding: 0 0 0.25em 0; +} + +/* line 6, ../../../hub/static/css/mod/user-card.scss */ +.user-card .desc .avatar { + float: left; + width: 30px; + height: 30px; + padding: 2px; + background-color: white; + line-height: 0; + margin-right: 0.7em; +} + +/* line 1, ../../../hub/static/css/mod/team-card.scss */ +.team-card { + position: absolute; + padding: 6px 10px; + min-height: 68px; + width: 236px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + overflow: hidden; +} +/* line 10, ../../../hub/static/css/mod/team-card.scss */ +.team-card .pic { + float: right; + max-height: 50px; + margin: 6px 0 0 10px; +} +/* line 15, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content { + word-wrap: break-word; +} +/* line 17, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .title { + margin: 6px 0; + font-size: 15px; + overflow: hidden; + white-space: nowrap; +} +/* line 23, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .info { + position: relative; + margin-top: 10px; + font-size: 13px; +} +/* line 27, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .info .desc { + white-space: nowrap; + overflow: hidden; +} + +/* line 35, ../../../hub/static/css/mod/team-card.scss */ +.member { + border-top: solid 1px #eaeaea; + padding-top: 8px; + height: 26px; +} +/* line 39, ../../../hub/static/css/mod/team-card.scss */ +.member .more-members { + float: right; + width: 24px; + height: 24px; + line-height: 26px; + text-align: center; + border: 1px solid #eaeaea; + background: #eaeaea; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 53, ../../../hub/static/css/mod/team-card.scss */ +.member .members li { + float: left; +} +/* line 55, ../../../hub/static/css/mod/team-card.scss */ +.member .members li a { + display: block; + width: 26px; + height: 26px; + overflow: hidden; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 65, ../../../hub/static/css/mod/team-card.scss */ +.member .members li a img { + width: 26px; + height: 26px; +} + +/* line 73, ../../../hub/static/css/mod/team-card.scss */ +.cf { + zoom: 1; +} +/* line 75, ../../../hub/static/css/mod/team-card.scss */ +.cf:before { + content: ""; + display: table; +} +/* line 79, ../../../hub/static/css/mod/team-card.scss */ +.cf .cf:after { + clear: both; + content: ""; + display: table; +} + +/* Timeline */ +@media (max-width: 767px) { + /* line 6, ../../../hub/static/css/mod/timeline.scss */ + .timeline { + padding: 10px; + } +} +/* line 9, ../../../hub/static/css/mod/timeline.scss */ +.timeline { + margin-top: 0px; + word-wrap: break-word; + word-break: normal; +} +/* line 14, ../../../hub/static/css/mod/timeline.scss */ +.timeline li { + position: relative; + list-style: none; + clear: both; + background: white; + padding: 10px 20px 10px 32px; + margin: 0 0 0px; + border-bottom: 1px solid #eaeaea; +} +/* line 23, ../../../hub/static/css/mod/timeline.scss */ +.timeline li .title { + margin-bottom: 0.5em; +} +/* line 25, ../../../hub/static/css/mod/timeline.scss */ +.timeline li .title i { + position: absolute; + left: 5px; + padding: 2px 5px 0; + color: #999; + font-size: 10px; +} +/* line 35, ../../../hub/static/css/mod/timeline.scss */ +.timeline .time { + float: right; + color: #ccc; + font-size: 12px; +} +/* line 41, ../../../hub/static/css/mod/timeline.scss */ +.timeline code { + white-space: normal; +} + +/* line 46, ../../../hub/static/css/mod/timeline.scss */ +.timeline .padding { + height: 2em; + font-weight: bold; +} + +/* line 50, ../../../hub/static/css/mod/timeline.scss */ +.timeline .more_items { + margin-left: 10px; + font-weight: bold; +} + +/* line 54, ../../../hub/static/css/mod/timeline.scss */ +.timeline .time { + color: #bbb; +} + +/* line 57, ../../../hub/static/css/mod/timeline.scss */ +.timeline .desc { + padding: 0 0 1em 0; + color: #666; + word-wrap: break-word; +} + +/* line 62, ../../../hub/static/css/mod/timeline.scss */ +.timeline .desc .right_side { + float: right; + margin-right: 30px; +} + +/* line 67, ../../../hub/static/css/mod/timeline.scss */ +.timeline .pagination { + display: none; + background: #63b6ae; +} + +/* line 71, ../../../hub/static/css/mod/timeline.scss */ +.pagination { + display: block; + margin: 7px 0; + overflow: hidden; + border: 1px solid #EAEAEA; + border-bottom-color: #CACACA; + border-top: none; + border-bottom: none; + border-radius: 3px; + background-image: -webkit-linear-gradient(top, white, #EFEFEF); +} + +/* line 82, ../../../hub/static/css/mod/timeline.scss */ +.timeline .pagination a { + color: white; +} + +/* line 85, ../../../hub/static/css/mod/timeline.scss */ +.pagination a { + padding: 8px; + width: 100%; + text-align: center; + line-height: 1.4; +} + +/* line 91, ../../../hub/static/css/mod/timeline.scss */ +.pagination a:last-child, .pagination span:last-child { + border-right: none; + border-bottom-right-radius: 3px; +} + +/* line 95, ../../../hub/static/css/mod/timeline.scss */ +.pagination a:first-child, .pagination span:first-child { + border-left: none; + border-bottom-left-radius: 3px; +} + +/* line 99, ../../../hub/static/css/mod/timeline.scss */ +.pagination a, .pagination span { + float: left; + margin: 0; + color: #777; + font-size: 13px; + text-decoration: none; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #DADADA; +} + +/* line 108, ../../../hub/static/css/mod/timeline.scss */ +.timeline .loader img { + display: block; + width: 16px; + height: 16px; + margin: 0 auto; + position: relative; +} + +/* line 4, ../../../hub/static/css/app/badge.scss */ +div.section { + float: left; + width: 225px; + height: 155px; + display: inline; + padding: 60px 0; +} + +/* line 11, ../../../hub/static/css/app/badge.scss */ +div.section_center { + text-align: center; +} + +/* line 14, ../../../hub/static/css/app/badge.scss */ +div.badge_name { + margin: 20px; +} + +/* line 17, ../../../hub/static/css/app/badge.scss */ +div.badge_summary { + margin: 0 30px; + color: #999; + text-align: center; +} + +/* line 22, ../../../hub/static/css/app/badge.scss */ +div.badge_all_link { + margin: 30px 30px; +} + +/* line 25, ../../../hub/static/css/app/badge.scss */ +div.cl { + clear: both; +} + +/* line 29, ../../../hub/static/css/app/badge.scss */ +div.members .list { + display: table; +} +/* line 32, ../../../hub/static/css/app/badge.scss */ +div.members .user { + width: 80px; + display: inline-table; +} +/* line 35, ../../../hub/static/css/app/badge.scss */ +div.members .user img { + display: block; + margin: auto; +} +/* line 39, ../../../hub/static/css/app/badge.scss */ +div.members .user a { + display: block; + text-align: center; +} diff --git a/dist/css/app/blame.css b/dist/css/app/blame.css new file mode 100644 index 0000000..fb5cee7 --- /dev/null +++ b/dist/css/app/blame.css @@ -0,0 +1,7787 @@ +@charset "UTF-8"; +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* line 1, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav { + margin-top: 6px; +} + +/* line 3, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label { + position: relative; + display: inline-block; + margin-left: 3px; + padding: 3px 7px; + border: 1px solid #ccc; + border-radius: 3px; + color: #333; + background-color: #fafafa; + vertical-align: middle; +} + +/* line 15, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::before, .metanav .counts-label::after { + content: ""; + position: absolute; + top: 50%; + right: 100%; + display: block; + margin-right: 0px; + margin-top: -6px; + width: 0; + height: 0; + border: 6px solid transparent; + border-right-color: #ccc; +} + +/* line 29, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::after { + margin-right: -1px; + border-right-color: #fafafa; +} + +/* line 2, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.metabox { + display: inline-block; + height: 8px; + background: #ccc; + text-indent: -9999px; + font-size: 12px; +} + +/* line 9, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats { + font: 13px Helvetica, arial, freesans, clean, sans-serif; + line-height: 1.4; + margin: 0; + padding: 0; + border: 0; + position: relative; + float: right; + width: 135px; + opacity: 0.5; + padding-bottom: 10px; +} + +/* line 21, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats:hover { + opacity: 1; +} + +/* line 24, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats:hover .list-tip { + display: block; +} + +/* line 27, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats a { + color: #4183c4; + text-decoration: none; +} + +/* line 31, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats-graph { + height: 10px; + overflow: hidden; +} + +/* line 35, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats-graph span { + display: inline-block; + height: 6px; + background: #ccc; + text-indent: -9999px; + float: left; +} + +/* line 42, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip, ul.list-tip { + border-radius: 3px; + box-shadow: 0 0 5px #ccc; + border: 1px solid #ddd; + background: #fff; + position: absolute; + padding-left: 0px; + top: 20px; + left: -20px; + width: 175px; + z-index: 100; + display: none; + margin-top: 0px; +} + +/* line 56, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip:before, ul.list-tip:before { + content: "▲"; + font-size: 14px; + margin: 0 auto; + width: 14px; + display: block; + margin-top: -13px; + color: #fff; + text-shadow: -1px -1px 2px #ccc; +} + +/* line 66, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li, ul.list-tip li { + margin: 0; + line-height: 100%; + list-style: none; + border-bottom: 1px solid #eee; + font-weight: bold; +} + +/* line 73, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li a, ol.list-tip li .other, ul.list-tip li a, ul.list-tip li .other { + color: #333; + padding: 8px 10px; + display: block; +} + +/* line 78, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li span.color-block, ul.list-tip li span.color-block { + display: inline-block; + width: 8px; + height: 10px; + margin-right: 5px; +} + +/* line 84, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li span.percent, ul.list-tip li span.percent { + float: right; + color: #999; +} + +/* fix project title for newer version of bootstrap*/ +/* line 6, ../../../hub/static/css/mod/project-info.scss */ +.pagehead .pull-left { + margin: 0; + font-size: 30px; + line-height: 36px; +} + +/* Hotfix for FlatUI */ +/* line 13, ../../../hub/static/css/mod/project-info.scss */ +.pagehead h2.pull-left { + margin: 0; +} + +/* line 17, ../../../hub/static/css/mod/project-info.scss */ +#project-info { + border: 1px solid #c5d5dd; + border-radius: 3px; + width: 100%; +} + +/* line 22, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div { + padding: 10px; +} + +/* line 25, ../../../hub/static/css/mod/project-info.scss */ +#project-info p { + margin: 0px; +} + +/* line 28, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div.team-label { + border-top: 1px solid #ccc; +} + +/* line 32, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div.git-url { + border-top: 1px solid #ccc; +} + +/* line 36, ../../../hub/static/css/mod/project-info.scss */ +#project-info input.git-url { + width: 480px; + margin: 0px; + cursor: auto; +} + +/* line 43, ../../../hub/static/css/mod/project-info.scss */ +#project-info .ssh div.ssh-url { + display: inline; +} +/* line 46, ../../../hub/static/css/mod/project-info.scss */ +#project-info .ssh div.http-url { + display: none; +} + +/* line 52, ../../../hub/static/css/mod/project-info.scss */ +#project-info .http div.ssh-url { + display: none; +} +/* line 55, ../../../hub/static/css/mod/project-info.scss */ +#project-info .http div.http-url { + display: inline; +} + +/* line 60, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar { + margin-top: 12px; + border-bottom: 1px solid #DDD; +} + +/* line 61, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar #back-old-browser { + padding-top: 8px; + float: right; +} + +/* line 62, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab { + padding-left: 20px; +} + +/* line 63, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li { + display: inline-block; + vertical-align: top; + cursor: pointer; +} + +/* line 64, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li a { + color: #666; + text-decoration: none; + padding: 8px 12px; + display: inline-block; + border-left: 1px solid transparent; + border-top: 1px solid transparent; + border-right: 1px solid transparent; + margin-bottom: -1px; +} + +/* line 65, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li a.active { + color: #333; + font-weight: bold; + border-left: 1px solid #DDD; + border-top: 1px solid #DDD; + border-right: 1px solid #DDD; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + background-color: white; +} + +/* line 67, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar .scope { + float: left; + margin-right: 10px; +} + +/* line 71, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar .scope i { + font-style: normal; +} + +/* line 75, ../../../hub/static/css/mod/project-info.scss */ +#breadcrumb { + margin: 10px 0; + font-size: 18px; + font-weight: bold; + color: #999; +} + +/* line 76, ../../../hub/static/css/mod/project-info.scss */ +#breadcrumb .final-path { + color: #000; +} + +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* line 3, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files { + position: relative; +} + +/* line 6, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file { + margin-top: 0; +} + +/* line 9, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file, .file-box { + border: 1px solid #CCC; + margin-bottom: 13px; + position: relative; + background-color: #DDD; +} + +/* line 15, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta, +.file-box .meta { + overflow: hidden; + padding: 5px 10px; + font-size: 12px; + height: 33px; + text-align: left; + color: #555; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #D8D8D8; + background: #FAFAFA; + background: -moz-linear-gradient(#FAFAFA, #EAEAEA); + background: -webkit-linear-gradient(#FAFAFA, #EAEAEA); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; +} + +/* line 30, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .info, +.file-box .meta .info { + float: left; + height: 33px; + max-width: 555px; + line-height: 33px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +/* line 41, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .info span, +.file-box .meta .info span { + padding-left: 9px; + margin-left: 5px; + border-left: 1px solid #C1C1C1; + box-shadow: inset 1px 0 0 white; +} + +/* line 50, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .info span.icon, +#files .file .meta .info span.diffstat, +.file-box .meta .info span.icon { + line-height: 0; + float: left; + margin: 5px 5px 0 0; + padding: 3px; + background: #F7F7F7; + border: 1px solid #CCC; + border-right-color: #E5E5E5; + border-bottom-color: #E5E5E5; + border-radius: 3px; +} + +/* line 63, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .info span.diffstat { + height: 16px; + padding: 3px 6px; +} + +/* line 67, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .info span:first-child, +#files .file .meta .info .icon + span, +.file-box .meta .info span:first-child, +.file-box .meta .info .icon + span { + border-left: 0 none; + box-shadow: inset 0 0 0 transparent; + margin-left: 0; + padding-left: 0; +} + +/* line 76, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .info span.diffstat .diffstat-bar { + color: #D8D8D8; +} + +/* line 79, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .actions, .file-box .meta .actions { + float: right; + height: 33px; + line-height: 33px; + margin-top: 1px; +} + +/* line 85, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .actions .show-inline-notes { + display: block; + position: relative; + display: block; + float: left; + margin-right: 10px; +} + +/* line 92, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .actions .show-inline-notes label { + font-weight: bold; + margin: 5px 0; +} + +/* line 96, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .actions .show-inline-notes input { + margin: 0; +} + +/* line 99, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .actions .button-group, +.file-box .meta .actions .button-group { + float: right; + margin-top: 2px; +} + +/* line 104, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .actions code, +.file-box .meta .actions code { + background: inherit; + border: none; + font-size: 11px; + color: inherit; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + padding: 0; +} + +/* line 114, ../../../hub/static/css/mod/file-blame-blob.scss */ +.file { + margin: 15px 0; +} + +/* line 118, ../../../hub/static/css/mod/file-blame-blob.scss */ +.file .data { + overflow: auto; +} + +/* line 120, ../../../hub/static/css/mod/file-blame-blob.scss */ +.change #files .file, .file-box, .change .file { + margin-bottom: 0; +} + +/* line 122, ../../../hub/static/css/mod/file-blame-blob.scss */ +.blame .line-data { + font-size: 12px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; +} + +/* highlight style */ +/* line 2, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .hll { + background-color: #ffffcc; +} + +/* line 3, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight { + background: #ffffff; +} + +/* line 4, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .c { + color: #808080; +} + +/* Comment */ +/* line 5, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .err { + color: #F00000; + background-color: #F0A0A0; +} + +/* Error */ +/* line 6, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .k { + color: #008000; + font-weight: bold; +} + +/* Keyword */ +/* line 7, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .o { + color: #303030; +} + +/* Operator */ +/* line 8, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .cm { + color: #808080; +} + +/* Comment.Multiline */ +/* line 9, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .cp { + color: #507090; +} + +/* Comment.Preproc */ +/* line 10, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .c1 { + color: #808080; +} + +/* Comment.Single */ +/* line 11, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .cs { + color: #cc0000; + font-weight: bold; +} + +/* Comment.Special */ +/* line 12, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gd { + color: #A00000; +} + +/* Generic.Deleted */ +/* line 13, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ge { + font-style: italic; +} + +/* Generic.Emph */ +/* line 14, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gr { + color: #FF0000; +} + +/* Generic.Error */ +/* line 15, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gh { + color: #000080; + font-weight: bold; +} + +/* Generic.Heading */ +/* line 16, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gi { + color: #00A000; +} + +/* Generic.Inserted */ +/* line 17, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .go { + color: #808080; +} + +/* Generic.Output */ +/* line 18, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gp { + color: #c65d09; + font-weight: bold; +} + +/* Generic.Prompt */ +/* line 19, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gs { + font-weight: bold; +} + +/* Generic.Strong */ +/* line 20, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gu { + color: #800080; + font-weight: bold; +} + +/* Generic.Subheading */ +/* line 21, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gt { + color: #0040D0; +} + +/* Generic.Traceback */ +/* line 22, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kc { + color: #008000; + font-weight: bold; +} + +/* Keyword.Constant */ +/* line 23, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kd { + color: #008000; + font-weight: bold; +} + +/* Keyword.Declaration */ +/* line 24, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kn { + color: #008000; + font-weight: bold; +} + +/* Keyword.Namespace */ +/* line 25, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kp { + color: #003080; + font-weight: bold; +} + +/* Keyword.Pseudo */ +/* line 26, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kr { + color: #008000; + font-weight: bold; +} + +/* Keyword.Reserved */ +/* line 27, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kt { + color: #303090; + font-weight: bold; +} + +/* Keyword.Type */ +/* line 28, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .m { + color: #6000E0; + font-weight: bold; +} + +/* Literal.Number */ +/* line 29, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .s { + background-color: #fff0f0; +} + +/* Literal.String */ +/* line 30, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .na { + color: #0000C0; +} + +/* Name.Attribute */ +/* line 31, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nb { + color: #007020; +} + +/* Name.Builtin */ +/* line 32, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nc { + color: #B00060; + font-weight: bold; +} + +/* Name.Class */ +/* line 33, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .no { + color: #003060; + font-weight: bold; +} + +/* Name.Constant */ +/* line 34, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nd { + color: #505050; + font-weight: bold; +} + +/* Name.Decorator */ +/* line 35, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ni { + color: #800000; + font-weight: bold; +} + +/* Name.Entity */ +/* line 36, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ne { + color: #F00000; + font-weight: bold; +} + +/* Name.Exception */ +/* line 37, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nf { + color: #0060B0; + font-weight: bold; +} + +/* Name.Function */ +/* line 38, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nl { + color: #907000; + font-weight: bold; +} + +/* Name.Label */ +/* line 39, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nn { + color: #0e84b5; + font-weight: bold; +} + +/* Name.Namespace */ +/* line 40, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nt { + color: #007000; +} + +/* Name.Tag */ +/* line 41, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nv { + color: #906030; +} + +/* Name.Variable */ +/* line 42, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ow { + color: #000000; + font-weight: bold; +} + +/* Operator.Word */ +/* line 43, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .w { + color: #bbbbbb; +} + +/* Text.Whitespace */ +/* line 44, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mf { + color: #6000E0; + font-weight: bold; +} + +/* Literal.Number.Float */ +/* line 45, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mh { + color: #005080; + font-weight: bold; +} + +/* Literal.Number.Hex */ +/* line 46, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mi { + color: #0000D0; + font-weight: bold; +} + +/* Literal.Number.Integer */ +/* line 47, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mo { + color: #4000E0; + font-weight: bold; +} + +/* Literal.Number.Oct */ +/* line 48, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sb { + background-color: #fff0f0; +} + +/* Literal.String.Backtick */ +/* line 49, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sc { + color: #0040D0; +} + +/* Literal.String.Char */ +/* line 50, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sd { + color: #D04020; +} + +/* Literal.String.Doc */ +/* line 51, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .s2 { + background-color: #fff0f0; +} + +/* Literal.String.Double */ +/* line 52, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .se { + color: #606060; + font-weight: bold; + background-color: #fff0f0; +} + +/* Literal.String.Escape */ +/* line 53, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sh { + background-color: #fff0f0; +} + +/* Literal.String.Heredoc */ +/* line 54, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .si { + background-color: #e0e0e0; +} + +/* Literal.String.Interpol */ +/* line 55, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sx { + color: #D02000; + background-color: #fff0f0; +} + +/* Literal.String.Other */ +/* line 56, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sr { + color: #000000; + background-color: #fff0ff; +} + +/* Literal.String.Regex */ +/* line 57, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .s1 { + background-color: #fff0f0; +} + +/* Literal.String.Single */ +/* line 58, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ss { + color: #A06000; +} + +/* Literal.String.Symbol */ +/* line 59, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .bp { + color: #007020; +} + +/* Name.Builtin.Pseudo */ +/* line 60, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .vc { + color: #306090; +} + +/* Name.Variable.Class */ +/* line 61, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .vg { + color: #d07000; + font-weight: bold; +} + +/* Name.Variable.Global */ +/* line 62, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .vi { + color: #3030B0; +} + +/* Name.Variable.Instance */ +/* line 63, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .il { + color: #0000D0; + font-weight: bold; +} + +/* Literal.Number.Integer.Long */ +/* For other page that still depends on commits.scss */ +/* preview comment form style */ +/* line 2, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav { + margin: 10px 0; + border-bottom: 1px solid #DDD; + height: 35px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs { + display: inline-block; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs > li { + display: inline-block; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab { + display: inline-block; + margin-bottom: -1px; + padding: 8px 12px 9px; + border: 1px solid transparent; + border-bottom: 0; + font-size: 14px; + color: #666; + text-decoration: none; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab.selected { + border-color: #DDD; + border-radius: 3px 3px 0 0; + background-color: white; + color: #333; + font-weight: bold; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab:hover { + text-decoration: none; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav { + position: relative; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav ul.tabnav-tabs { + padding-left: 10px; +} + +/* line 10, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 0 10px 10px; +} + +/* line 11, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form #preview_bucket .content-body { + padding: 10px; + min-height: 132px; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form.tab-content { + overflow: initial; + position: relative; +} + +/* line 2, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 10px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-actions { + padding: 0; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + position: relative; + border: 3px solid #EEE; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + padding: 0; + background: #EEE; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content .write-content { + padding: 0 10px 10px; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; + margin: 0; +} + +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary, button.primary.classy:disabled, button.primary.classy.disabled, button.primary.classy:disabled:hover, button.primary.classy.disabled:disabled:hover, button.classy:disabled:hover.primary, button.classy.disabled:disabled:hover.primary { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4); + border-color: #74BB5A; + border-bottom-color: #509338; + background: #8ADD6D; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#8add6d', endColorstr='#60b044')"; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); + background-image: -webkit-linear-gradient(top, #8ADD6D, #60B044); +} + +/* line 2, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary.disabled { + opacity: 0.5; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy, +button.classy:disabled, +button.classy.disabled, +a.button.classy:disabled, +a.button.classy.disabled, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover:disabled, +a.button.classy.disabled:hover, +a.button.classy, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy:disabled:hover, +a.button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover { + display: inline-block; + padding: 8px 15px; + line-height: normal; + position: relative; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 12px; + font-weight: bold; + color: #666; + text-shadow: 0 1px rgba(255, 255, 255, 0.9); + background: whiteSmoke; + background: -moz-linear-gradient(whiteSmoke, #E5E5E5); + background: -webkit-linear-gradient(whiteSmoke, #E5E5E5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; + border-radius: 3px; + border: 1px solid #DDD; + border-bottom-color: #BBB; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* ================================== *\ + * Zen Form + * ================================== */ +/* line 6, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + position: fixed; + z-index: 99999; + top: 0; + left: 0; + right: 0; + bottom: 0; + padding: 24px 30px 24px 24px; +} + +/* line 16, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-input-wrap { + max-width: 640px; + position: relative; + margin: 0 auto; +} + +/** + * Buttons style + */ +/* line 25, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button, +.zen-forms-theme-switch { + position: absolute; + width: 18px; + height: 18px; + text-align: center; + top: 10px; + right: 10px; + font-size: 24px; + color: #516066; + cursor: pointer; + line-height: 1; +} + +/* line 39, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-theme-switch { + top: 28px; + font-size: 34px; +} + +/* line 44, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button:hover, +.zen-forms-theme-switch:hover { + color: #667981; +} + +/** + * Inputs basic style + */ +/* line 52, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + padding: 8px 0; + width: 100%; + background: none; + border: none; + margin-bottom: 24px; + cursor: pointer; +} + +/* line 62, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus, +.zen-forms textarea:focus { + cursor: text; +} + +/* line 67, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms textarea { + resize: none; +} + +/* line 71, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + cursor: pointer; + display: none; + padding: 8px 3; + position: absolute; + top: 0; + width: 100%; +} + +/* line 80, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms .empty + label { + display: block; +} + +/* line 84, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus + label, +.zen-forms textarea:focus + label { + display: none; +} + +/* line 89, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms :focus { + outline-color: transparent; + outline-style: none; +} + +/** + * Dark theme + */ +/* line 97, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + background: #151a1c; +} + +/* line 101, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + color: #516066; +} + +/* line 105, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + color: #667981; +} + +/** + * Light theme + */ +/* line 113, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme { + background: #fefefe; +} + +/* line 117, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme label { + color: #959697; +} + +/* line 121, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme input, +.zen-forms.light-theme textarea { + color: #707071; +} + +/* line 4, ../../../hub/static/css/mod/zen-forms.scss */ +.write-content .enable-fullscreen { + position: absolute; + top: 5px; + right: 16px; + color: #333333; + opacity: .5; + line-height: 1em; +} + +/* line 5, ../../../hub/static/css/mod/zen-forms.scss */ +.mini-icon-fullscreen::before { + content: ""; +} + +/* line 6, ../../../hub/static/css/mod/zen-forms.scss */ +.fullscreen-overlay textarea, .zen-forms textarea { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + height: 100%; + padding: 20px; + border: 0; + font-size: 21px; + line-height: 1.6em; + resize: none; + -moz-transition: color 0.15s ease-in 0; + -webkit-transition: color 0.15s ease-in 0; + transition: color 0.15s ease-in 0; + box-shadow: none; +} + +/* line 7, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms.light-theme textarea { + background: #fff; + color: #999999; +} + +/* line 8, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms .zen-forms-input-wrap { + width: 100%; + height: 100%; +} + +/* line 9, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms label[for^=zen-forms-input] { + display: none; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-zen.scss */ +.previewable-comment-form .zen-enabled textarea { + padding: 10px 18px 10px 10px; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled { + position: relative; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled .go-zen { + position: absolute; + right: 15px; + top: 5px; +} + +/* line 1, ../../../hub/static/css/mod/loader.scss */ +.loader { + display: none; + position: absolute; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + background-color: #eee; +} + +/* line 2, ../../../hub/static/css/mod/loader.scss */ +.loader .spinner { + display: block; + width: 32px; + height: 32px; + margin: 0 auto; + top: 121px; + position: relative; + background: url(/static/img/spinner.gif) no-repeat; +} + +/* line 1, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view { + position: absolute; + top: 0; + left: 0; + display: none; + margin-top: 18px; + background: white; + border: 1px solid #DDD; + border-radius: 3px; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + min-width: 120px; + z-index: 10; +} + +/* line 15, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur { + background: #3366FF; + color: white; +} + +/* line 19, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur small { + color: white; +} + +/* line 22, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view strong { + color: #3366FF; +} + +/* line 25, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur strong { + color: white; + font: bold; +} + +/* line 29, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul { + /* width: 100px; */ + list-style: none; + padding: 0; + margin: auto; +} + +/* line 35, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul li { + display: block; + padding: 5px 10px; + border-bottom: 1px solid #DDD; + cursor: pointer; + /* border-top: 1px solid #C8C8C8; */ +} + +/* line 42, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view small { + font-size: smaller; + color: #777; + font-weight: normal; +} + +/* line 9, ../../../hub/static/css/mod/comment-form.scss */ +.side-avatar { + margin-left: 0; +} + +/* fix li header for newer version of bootstrap */ +/* line 12, ../../../hub/static/css/mod/comment-form.scss */ +.comment-form-head li { + line-height: 18px; +} + +/* line 16, ../../../hub/static/css/mod/comment-form.scss */ +#new_comment .form-content { + width: 880px; + margin-left: 60px; +} + +/* line 18, ../../../hub/static/css/mod/comment-form.scss */ +.discussion-bubble-avatar { + position: relative; + float: left; + border-radius: 3px; +} + +/* line 19, ../../../hub/static/css/mod/comment-form.scss */ +.discussion-bubble-inner { + min-height: 60px; + border: 1px solid #CACACA; + background-color: white; +} + +/* line 1, ../../../hub/static/css/mod/diff-stat.scss */ +#toc li { + border-bottom: 1px solid #DDD; + list-style-type: none; + padding: 5px; +} + +/* line 7, ../../../hub/static/css/mod/diff-stat.scss */ +#toc { + margin: 15px 0; +} + +/* line 11, ../../../hub/static/css/mod/diff-stat.scss */ +#toc .diffstat { + float: right; +} + +/* line 14, ../../../hub/static/css/mod/diff-stat.scss */ +#toc .mini-icon-modified { + color: #677A85; +} + +/* line 18, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat { + white-space: nowrap; + text-align: right; + font-family: Helvetica,arial,freesans,clean,sans-serif; + color: #666; + font-weight: bold; + font-size: 11px; +} + +/* line 26, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat a { + text-decoration: none; + color: #666; +} + +/* line 30, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar { + position: relative; + left: -3px; + display: inline-block; + height: 12px; + text-decoration: none; + text-align: left; + color: #EEE; + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + line-height: 1; + -webkit-font-smoothing: antialiased; + font-size: 16px; + letter-spacing: -7px; +} + +/* line 48, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar.diff-added, +span.diffstat .diffstat-bar i.plus { + color: #61C423; + font-style: normal; +} + +/* line 53, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar.diff-added, +span.diffstat .diffstat-bar i.minus { + color: #C52323; + font-style: normal; +} + +/* line 59, ../../../hub/static/css/mod/diff-stat.scss */ +p.explain { + font-size: 12px; + color: #666; + margin: 1em 0; +} + +/* line 65, ../../../hub/static/css/mod/diff-stat.scss */ +p.explain .minibutton { + float: right; + top: -4px; +} + +/* line 3, ../../../hub/static/css/mod/diffs-pane.scss */ +.diff-cutoff { + margin-bottom: -2px; + height: 35px; + line-height: 37px; + font-size: 12px; + font-weight: bold; + color: #000; + text-align: center; + background: url("/static/img/compare_too_big.gif") 0 0 no-repeat; +} + +/* line 5, ../../../hub/static/css/mod/diffs-pane.scss */ +.fullscreen-mode { + overflow: hidden; +} + +/* line 6, ../../../hub/static/css/mod/diffs-pane.scss */ +#fullscreen-stage { + display: none; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + overflow-y: auto; + background: #fff; + z-index: 9999; +} + +/* line 7, ../../../hub/static/css/mod/diffs-pane.scss */ +#files #fullscreen-stage .file { + margin: 0; +} + +/* line 5, ../../../hub/static/css/mod/commits.scss */ +div.container div.raw { + overflow: visible; +} + +/* line 9, ../../../hub/static/css/mod/commits.scss */ +#commits-graph { + position: absolute; + left: -200px; + width: 200px; +} + +/* line 15, ../../../hub/static/css/mod/commits.scss */ +.commits-body { + position: relative; +} + +/* line 19, ../../../hub/static/css/mod/commits.scss */ +h3.commit-group-heading { + margin: 15px 0 0 0; + padding: 5px 8px; + font-size: 13px; + color: #3a505b; + text-shadow: 0 1px white; + background: #e6f1f6; + border: 1px solid #c5d5dd; + border-top-right-radius: 4px; + border-top-left-radius: 4px; +} + +/* line 31, ../../../hub/static/css/mod/commits.scss */ +h3.history { + margin-top: 15px; +} + +/* line 35, ../../../hub/static/css/mod/commits.scss */ +.commit-group { + list-style-type: none; + margin: 15px 0; + background: #f7fbfc; + border: 1px solid #c5d5dd; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +/* line 46, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item { + position: relative; + padding: 8px 8px 8px 52px; + border-top: 1px solid #e2eaee; +} + +/* line 52, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:first-child { + border-top: none; +} + +/* line 56, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:last-child { + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +/* line 61, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:nth-child(2n) { + background: #fff; +} + +/* line 65, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus { + background: #fcfce2; +} + +/* line 69, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gravatar { + float: left; + margin-left: -44px; + border-radius: 4px; +} + +/* line 75, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .commit-title { + margin: 1px 0 1px 0; + font-size: 14px; + font-weight: bold; + color: #333; +} + +/* line 82, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .commit-title a { + color: #333; +} + +/* line 86, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .commit-desc pre { + margin-top: 5px; + margin-bottom: 10px; + font-size: 12px; + color: #596063; + border-left: 1px solid #e5e5e5; + padding-left: 8px; +} + +/* line 95, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship { + font-size: 12px; + color: #888; +} + +/* line 100, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship a { + color: #444; +} + +/* line 104, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship .author-name { + color: #444; +} + +/* line 108, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship .committer { + display: block; + font-size: 11px; +} + +/* line 113, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship .committer .mini-icon { + position: relative; + top: 2px; +} + +/* line 118, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .commit-links { + position: absolute; + top: 7px; + right: 8px; + width: 243px; + text-align: right; +} + +/* line 126, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .mini-icon-clippy { + visibility: hidden; + float: left; + margin-right: 7px; + margin-top: 5px; +} + +/* line 133, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:hover .mini-icon-clippy { + visibility: visible; +} + +/* line 137, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton { + float: right; + height: 18px; + padding: 0 7px; + line-height: 22px; + font-size: 11px; + color: #4e575b; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); + background: #eff6f9; + background: -moz-linear-gradient(#eff6f9, #ddecf3); + background: -webkit-linear-gradient(#eff6f9, #ddecf3); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#eff6f9',endColorstr='#ddecf3')"; + border: 1px solid #cedee5; + border-radius: 3px; + min-width: 70px; + text-align: center; +} + +/* line 155, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton .comment-popover { + color: #91A6B1; + border-right: 1px solid #ddd; + padding-right: 4px; +} + +/* line 161, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton { + color: #5a5b4e; +} + +/* line 165, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:nth-child(2n+1) .gobutton { + border-color: #d5dcdf; + background: #f2f5f6; + background: -moz-linear-gradient(#f2f5f6, #e3eaed); + background: -webkit-linear-gradient(#f2f5f6, #e3eaed); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f2f5f6',endColorstr='#e3eaed')"; +} + +/* line 173, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton { + border-color: #e7e86d; + background: #f9fac9; + background: -moz-linear-gradient(#f9fac9, #f3f494); + background: -webkit-linear-gradient(#f9fac9, #f3f494); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f9fac9',endColorstr='#f3f494')"; +} + +/* line 181, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton:hover { + text-decoration: none; + border-color: #cedee5; + background: #fbfdfe; + background: -moz-linear-gradient(#fbfdfe, #eaf4f8); + background: -webkit-linear-gradient(#fbfdfe, #eaf4f8); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbfdfe',endColorstr='#eaf4f8')"; +} + +/* line 190, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton > .sha, .commit-group-item.navigation-focus .gobutton:hover > .sha { + display: inline-block; + height: 22px; + margin-right: -3px; +} + +/* line 196, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton > .sha .mini-icon, .commit-group-item.navigation-focus .gobutton:hover > .sha .mini-icon { + position: relative; + top: 2px; + border-radius: 30px; + border: 1px solid #CFDEE5; + background-color: rgba(255, 255, 255, 0.5); + color: #91a6b1; + margin-left: 5px; + width: 16px; +} + +/* line 207, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton > .sha .mini-icon { + border: 1px solid #E7E86D; + color: #c3c45c; +} + +/* line 212, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton.with-comments { + padding-left: 5px; +} + +/* line 216, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton.with-comments .sha, .commit-group-item.navigation-focus .gobutton.with-comments:hover .sha { + padding-left: 8px; + border-left: 1px solid #cfdee5; +} + +/* line 221, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton.with-comments .sha { + border-left-color: #e1e29e; +} + +/* line 225, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton .comment-count, .commit-group-item.navigation-focus .gobutton:hover .comment-count { + float: left; + height: 22px; + padding-right: 9px; + line-height: 24px; + font-weight: bold; + border-right: 1px solid #f6fafc; +} + +/* line 234, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton .comment-count .mini-icon, .commit-group-item.navigation-focus .gobutton:hover .comment-count .mini-icon { + position: relative; + top: 2px; + color: #91A6B1; +} + +/* line 240, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton .comment-count .mini-icon { + color: #C3C45C; +} + +/* line 244, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .browse-button, .commit-group-item .compare-button { + clear: left; + margin-top: 1px; + font-size: 11px; + font-weight: bold; + text-align: right; + color: #999; +} + +/* line 253, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .browse-button .mini-icon { + position: relative; + top: 2px; +} + +/* line 258, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .browse-button:hover { + color: #4183C4; + background-position: 100% -95px; +} + +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 400; + src: local("Source Code Pro"), local("SourceCodePro-Regular"), url("/static/css/fonts/SourceCodePro-Regular.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 500; + src: local("Source Code Pro Medium"), local("SourceCodePro-Medium"), url("/static/css/fonts/SourceCodePro-Medium.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 600; + src: local("Source Code Pro Semibold"), local("SourceCodePro-Semibold"), url("/static/css/fonts/SourceCodePro-Semibold.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 700; + src: local("Source Code Pro Bold"), local("SourceCodePro-Bold"), url("/static/css/fonts/SourceCodePro-Bold.woff") format("woff"); +} +/* line 3, ../../../hub/static/css/mod/diff-base.scss */ +.code pre, xmp, plaintext, listing { + display: block; + font-size: 13px; + font-family: 'Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; + white-space: pre; + margin: 0; + padding: 0; +} + +/* line 12, ../../../hub/static/css/mod/diff-base.scss */ +.code pre { + line-height: 18px; +} + +/* line 16, ../../../hub/static/css/mod/diff-base.scss */ +.font-consolas pre { + font-family: Consolas,'Source Code Pro',Courier,Monaco,Menlo,monospace; +} + +/* line 20, ../../../hub/static/css/mod/diff-base.scss */ +.font-monaco pre { + font-family: Monaco,'Source Code Pro',Courier,Consolas,Menlo,monospace; +} + +/* line 24, ../../../hub/static/css/mod/diff-base.scss */ +.font-courier pre { + font-family: Courier,'Source Code Pro',Monaco,Consolas,Menlo,monospace; +} + +/* line 28, ../../../hub/static/css/mod/diff-base.scss */ +.font-dejavu pre { + font-family: 'DejaVu Sans Mono','Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; +} + +/* line 32, ../../../hub/static/css/mod/diff-base.scss */ +.font-ubuntu pre { + font-family: 'Ubuntu Mono','Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; +} + +/* line 37, ../../../hub/static/css/mod/diff-base.scss */ +pre, code, tt { + font-size: 12px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + border: 0; +} + +/* line 43, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .normal { + background-color: #FFF; +} + +/* line 47, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .deletion { + color: black; + background-color: #FDD; +} +/* line 50, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .deletion .x, .highlight .deletion .c { + color: black; + background-color: #ffaaaa; +} + +/* line 56, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .insertion { + color: black; + background-color: #DFD; +} +/* line 59, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .insertion .i, .highlight .insertion .c { + color: black; + background-color: #aaffaa; +} + +/* line 65, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped { + color: #cacaca; + background-color: #f9f9f9; +} +/* line 69, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a { + color: #cacaca; + vertical-align: middle; +} +/* line 73, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a:hover { + text-decoration: none; +} +/* line 77, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a[data-type="after"], .highlight .skipped a[data-type="before"] { + font-size: 20px; +} + +/* line 266, ../../../hub/static/css/mod/commits.scss */ +#files.commentable tr td pre:hover { + background-color: #FFC; +} + +/* line 268, ../../../hub/static/css/mod/commits.scss */ +.full-commit { + margin: 10px 0; + padding: 8px 8px 0; + background: #E6F1F6; + border: 1px solid #C5D5DD; + border-radius: 4px; +} + +/* line 276, ../../../hub/static/css/mod/commits.scss */ +.full-commit .commit-meta { + margin-left: -8px; + width: 100%; + padding: 8px; + background: white; + border-top: 1px solid #D8E6EC; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +/* line 286, ../../../hub/static/css/mod/commits.scss */ +.full-commit .commit-desc { + display: block; + margin: -4px 0 10px 0; +} + +/* line 291, ../../../hub/static/css/mod/commits.scss */ +.full-commit .commit-desc pre { + max-width: 100%; + font-size: 14px; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); +} + +/* line 297, ../../../hub/static/css/mod/commits.scss */ +.full-commit .browse-button { + float: right; + margin: -3px -3px 0 0; + height: 26px; + padding: 0 10px; + line-height: 26px; + font-size: 13px; + font-weight: bold; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); + background: #EFF6F9; + background: -moz-linear-gradient(#EFF6F9, #DDECF3); + background: -webkit-linear-gradient(#EFF6F9, #DDECF3); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#eff6f9',endColorstr='#ddecf3')"; + border: 1px solid #CEDEE5; + border-radius: 3px; +} + +/* line 314, ../../../hub/static/css/mod/commits.scss */ +.full-commit p.commit-title { + margin: 0 0 8px 0; + font-size: 18px; + font-weight: bold; + color: #213F4D; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); +} + +/* line 322, ../../../hub/static/css/mod/commits.scss */ +.clearfix { + display: block; +} + +/* line 326, ../../../hub/static/css/mod/commits.scss */ +.full-commit .sha-block { + float: right; + margin-left: 15px; + color: #888; + font-size: 12px; +} + +/* line 333, ../../../hub/static/css/mod/commits.scss */ +.full-commit .authorship { + margin-top: -2px; + margin-left: -4px; + margin-bottom: -4px; + font-size: 14px; + color: #999; +} + +/* line 341, ../../../hub/static/css/mod/commits.scss */ +.full-commit .authorship .gravatar { + margin-top: -2px; + margin-right: 3px; + vertical-align: middle; + border-radius: 3px; +} + +/* line 347, ../../../hub/static/css/mod/commits.scss */ +#files { + position: relative; +} + +/* line 351, ../../../hub/static/css/mod/commits.scss */ +#files .file, .file-box { + border: 1px solid #CCC; + margin-bottom: 13px; + position: relative; + background-color: #DDD; +} + +/* line 358, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta, .file-box .meta { + overflow: hidden; + padding: 5px 10px; + font-size: 12px; + height: 33px; + text-align: left; + color: #555; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #D8D8D8; + background: #FAFAFA; + background: -moz-linear-gradient(#FAFAFA, #EAEAEA); + background: -webkit-linear-gradient(#FAFAFA, #EAEAEA); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; +} + +/* line 373, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .info, .file-box .meta .info { + float: left; + height: 33px; + line-height: 33px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; +} + +/* line 380, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .actions, .file-box .meta .actions { + float: right; + height: 33px; + line-height: 33px; + margin-top: 1px; +} + +/* line 387, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .actions li:first-child, .file-box .meta .actions li:first-child { + background: transparent; + margin-left: 0; + padding-left: 0; +} + +/* line 393, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .actions li, .file-box .meta .actions li { + list-style-type: none; + float: left; + margin: 0 0 0 7px; +} + +/* line 399, ../../../hub/static/css/mod/commits.scss */ +.button-group li { + margin: 0 !important; +} + +/* line 403, ../../../hub/static/css/mod/commits.scss */ +.pagination-older-newer a { + padding: .1em .3em; + margin: .2em; + text-decoration: none; + color: #369; + float: none; +} + +/* line 411, ../../../hub/static/css/mod/commits.scss */ +.pagination-older-newer a:hover, .pagination a:active { + background-color: transparent; + color: #36f; +} + +/* line 416, ../../../hub/static/css/mod/commits.scss */ +.pagination-older-newer span.disabled { + padding: .1em .3em; + margin: .2em; + color: #bbb; + float: none; +} + +/* line 423, ../../../hub/static/css/mod/commits.scss */ +.commit .sha-block, .commit .sha { + padding-right: 3px; + font-size: 11px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; +} + +/* line 429, ../../../hub/static/css/mod/commits.scss */ +#files .file .data .line_numbers, .file-box .data .line_numbers { + background-color: #ECECEC; + color: #AAA; + padding: 0 6px; + border-right: 1px solid #DDD; + text-align: right; + cursor: pointer; +} + +/* line 437, ../../../hub/static/css/mod/commits.scss */ +#files .file .data .line_numbers a { + color: #AAA; +} + +/* line 441, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-added:before { + content: "\f06b"; +} + +/* line 442, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-removed:before { + content: "\f06c"; +} + +/* line 443, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-modified:before { + content: "\f06d"; +} + +/* line 444, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-moved:before, .mini-icon-renamed:before { + content: "\f06e"; +} + +/* line 445, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-commit-comment:before { + content: "\f02b"; +} + +/* line 447, ../../../hub/static/css/mod/commits.scss */ +.mega-icon-beer:before { + content: "\f269"; +} + +/* line 448, ../../../hub/static/css/mod/commits.scss */ +.mega-icon-commit-comment:before { + content: "\f22b"; +} + +/* line 450, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .info span.icon, +#files .file .meta .info span.diffstat, +.file-box .meta .info span.icon { + line-height: 0; + float: left; + margin: 5px 5px 0 0; + padding: 3px; + background: #F7F7F7; + border: 1px solid #CCC; + border-right-color: #E5E5E5; + border-bottom-color: #E5E5E5; + border-radius: 3px; +} + +/* line 463, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .info span.diffstat { + height: 16px; + padding: 3px 6px; +} + +/* line 467, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .info span:first-child, +#files .file .meta .info .icon + span, +.file-box .meta .info span:first-child, +.file-box .meta .info .icon + span { + border-left: 0 none; + box-shadow: inset 0 0 0 transparent; + margin-left: 0; + padding-left: 0; +} + +/* line 477, ../../../hub/static/css/mod/commits.scss */ +.commit-meta.comment-row .mini-icon { + color: #939AA0; + margin: 0 2px 0 1px; + top: 2px; + text-decoration: none; +} + +/* line 478, ../../../hub/static/css/mod/commits.scss */ +#files .file .data.empty, .file-box .data.empty { + padding: 10px 15px; + color: #777; +} + +/* line 482, ../../../hub/static/css/mod/commits.scss */ +.timeout { + width: 873px; + height: 528px; + border: 1px solid #C5D5DD; + background: url("/static/img/timeout.jpg") #E6F1F6 no-repeat; + background-position: 90% 50%; + padding: 0 32px 0 33px; + border-radius: 3px; +} + +/* line 491, ../../../hub/static/css/mod/commits.scss */ +.timeout h3 { + color: white; + font-size: 18px; + font-weight: bold; + text-shadow: darkGray 1px 1px 0; + padding: 15px 0 15px 0; +} + +/* line 498, ../../../hub/static/css/mod/commits.scss */ +.timeout h3 strong { + font-size: 30px; + display: block; +} + +/* line 502, ../../../hub/static/css/mod/commits.scss */ +.timeout p { + color: white; +} + +/* line 506, ../../../hub/static/css/mod/commits.scss */ +.side-avatar { + position: absolute; + float: left; + margin-left: -60px; +} + +/* line 512, ../../../hub/static/css/mod/commits.scss */ +div.generated, div.binary { + text-align: center; + background-color: #ddd; + padding: 30px; +} + +/* line 518, ../../../hub/static/css/mod/commits.scss */ +.commit-history-header { + margin-bottom: 55px; +} +/* line 521, ../../../hub/static/css/mod/commits.scss */ +.commit-history-header #search-commits { + margin: 15px 5px; +} + +/* line 9, ../../../hub/static/css/app/blame.scss */ +.blame table tr.section-first td { + border-top: 1px solid #CCC; +} + +/* line 12, ../../../hub/static/css/app/blame.scss */ +.blame table tr td { + padding: .2em .5em; +} + +/* line 15, ../../../hub/static/css/app/blame.scss */ +.blame .line-number { + background-color: #ECECEC; + color: #AAA; + padding: 0 .5em; + text-align: right; + border-left: 1px solid #DDD; + border-right: 1px solid #DDD; + vertical-align: middle; +} + +/* line 24, ../../../hub/static/css/app/blame.scss */ +.blame .line-data { + background-color: ghostWhite; + white-space: pre; + width: 100%; + vertical-align: middle; +} diff --git a/dist/css/app/center-activity.css b/dist/css/app/center-activity.css new file mode 100644 index 0000000..fc88965 --- /dev/null +++ b/dist/css/app/center-activity.css @@ -0,0 +1,5639 @@ +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* line 2, ../../../hub/static/css/mod/flat-hack.scss */ +a.btn i { + padding-right: 5px; +} + +/* line 1, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body { + padding: 30px; +} + +/* line 4, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body > :first-child { + margin-top: 0 !important; +} + +/* line 7, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body h1, +.markdown-body h2, +.markdown-body h3, +.markdown-body h4, +.markdown-body h5, +.markdown-body h6 { + margin: 20px 0 10px; + padding: 0; + font-weight: bold; + -webkit-font-smoothing: antialiased; + cursor: text; + position: relative; +} + +/* line 20, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body h2 { + font-size: 24px; + border-bottom: 1px solid #CCC; + color: black; +} + +/* line 25, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body, +.markdown-body p { + font-size: 14px; + line-height: 1.6; +} + +/* line 30, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body p, +.markdown-body blockquote, +.markdown-body ul, +.markdown-body ol, +.markdown-body dl, +.markdown-body table, +.markdown-body pre { + margin: 15px 0; +} + +/* line 39, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul, +.markdown-body ol { + padding-left: 30px; +} + +/* line 43, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul li { + line-height: 1.6; +} + +/* line 46, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul { + list-style: disc; +} + +/* line 49, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ol { + list-style: decimal; +} + +/* line 52, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table { + width: 100%; +} + +/* line 55, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table caption + thead tr:first-child th, +.markdown-body table caption + thead tr:first-child td, +.markdown-body table colgroup + thead tr:first-child th, +.markdown-body table colgroup + thead tr:first-child td, +.markdown-body table thead:first-child tr:first-child th, +.markdown-body table thead:first-child tr:first-child td { + border-top: 0; +} + +/* line 63, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table thead th { + vertical-align: bottom; +} + +/* line 66, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th { + font-weight: bold; +} + +/* line 69, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th, +.markdown-body table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #ddd; +} + +/* line 77, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th, +.markdown-body table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #ddd; +} + +/* line 85, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table tbody > tr:nth-child(odd) > td, +.markdown-body table tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} + +/* line 89, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body .progress-percentage { + color: #888; +} + +/* line 93, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page { + padding: 0px; +} + +/* line 96, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page h1, +.markdown-page h2, +.markdown-page h3, +.markdown-page h4, +.markdown-page h5, +.markdown-page h6 { + position: static; +} + +/* line 104, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page pre { + font-family: Consolas, 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 14px; +} + +/* line 108, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page .label { + background-color: transparent; +} + +/* line 111, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page dd { + margin-left: 1.5em; +} + +/* line 114, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body code { + white-space: pre-wrap; +} + +/* line 5, ../../../hub/static/css/app/center-activity.scss */ +.pull-form input[type="text"] { + font-size: 14px; + padding: 5px 5px; + margin: 0 0 5px 0; + width: 98%; + color: #444; +} + +/* line 12, ../../../hub/static/css/app/center-activity.scss */ +.pull-form textarea { + height: 200px; +} + +/* line 15, ../../../hub/static/css/app/center-activity.scss */ +.pull-form-main .form-actions { + padding: 0; + margin-top: 10px; + text-align: right; + padding-bottom: 5px; + background-color: inherit; + border-top: none; +} + +/* line 24, ../../../hub/static/css/app/center-activity.scss */ +.previewable-comment-form .zen-enabled textarea { + padding: 10px 18px 10px 10px; +} + +/* line 27, ../../../hub/static/css/app/center-activity.scss */ +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* Write/Preview Control style for new PR component */ +/* line 41, ../../../hub/static/css/app/center-activity.scss */ +ul.edit-preview-tabs { + margin: 0 0 5px 0; + line-height: 13px; +} + +/* line 45, ../../../hub/static/css/app/center-activity.scss */ +ul.edit-preview-tabs li { + list-style-type: none; + margin: 0; + display: inline-block; +} + +/* line 50, ../../../hub/static/css/app/center-activity.scss */ +ul.edit-preview-tabs a { + display: inline-block; + padding: 2px 8px; + font-size: 11px; + font-weight: bold; + text-decoration: none; + color: #666; + border: 1px solid transparent; + border-radius: 10px; +} + +/* line 61, ../../../hub/static/css/app/center-activity.scss */ +.previewable-comment-form li.active .write-tab, +.previewable-comment-form li.active .preview-tab { + color: #333; + background: white; + border-color: #BBB; + border-right-color: #DDD; + border-bottom-color: #DDD; +} + +/* Description Component background & help text, from hub.css*/ +/* line 71, ../../../hub/static/css/app/center-activity.scss */ +.comment-form { + position: relative; + margin: -10px 0 10px 0; + padding: 5px; +} + +/* line 77, ../../../hub/static/css/app/center-activity.scss */ +.comment-form p.help { + margin: 3px 0 0 0; + float: right; + font-size: 11px; + color: #666; +} diff --git a/dist/css/app/center.css b/dist/css/app/center.css new file mode 100644 index 0000000..eb2f46b --- /dev/null +++ b/dist/css/app/center.css @@ -0,0 +1,5931 @@ +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* line 2, ../../../hub/static/css/mod/flat-hack.scss */ +a.btn i { + padding-right: 5px; +} + +/* line 1, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body { + padding: 30px; +} + +/* line 4, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body > :first-child { + margin-top: 0 !important; +} + +/* line 7, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body h1, +.markdown-body h2, +.markdown-body h3, +.markdown-body h4, +.markdown-body h5, +.markdown-body h6 { + margin: 20px 0 10px; + padding: 0; + font-weight: bold; + -webkit-font-smoothing: antialiased; + cursor: text; + position: relative; +} + +/* line 20, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body h2 { + font-size: 24px; + border-bottom: 1px solid #CCC; + color: black; +} + +/* line 25, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body, +.markdown-body p { + font-size: 14px; + line-height: 1.6; +} + +/* line 30, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body p, +.markdown-body blockquote, +.markdown-body ul, +.markdown-body ol, +.markdown-body dl, +.markdown-body table, +.markdown-body pre { + margin: 15px 0; +} + +/* line 39, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul, +.markdown-body ol { + padding-left: 30px; +} + +/* line 43, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul li { + line-height: 1.6; +} + +/* line 46, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul { + list-style: disc; +} + +/* line 49, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ol { + list-style: decimal; +} + +/* line 52, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table { + width: 100%; +} + +/* line 55, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table caption + thead tr:first-child th, +.markdown-body table caption + thead tr:first-child td, +.markdown-body table colgroup + thead tr:first-child th, +.markdown-body table colgroup + thead tr:first-child td, +.markdown-body table thead:first-child tr:first-child th, +.markdown-body table thead:first-child tr:first-child td { + border-top: 0; +} + +/* line 63, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table thead th { + vertical-align: bottom; +} + +/* line 66, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th { + font-weight: bold; +} + +/* line 69, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th, +.markdown-body table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #ddd; +} + +/* line 77, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th, +.markdown-body table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #ddd; +} + +/* line 85, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table tbody > tr:nth-child(odd) > td, +.markdown-body table tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} + +/* line 89, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body .progress-percentage { + color: #888; +} + +/* line 93, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page { + padding: 0px; +} + +/* line 96, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page h1, +.markdown-page h2, +.markdown-page h3, +.markdown-page h4, +.markdown-page h5, +.markdown-page h6 { + position: static; +} + +/* line 104, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page pre { + font-family: Consolas, 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 14px; +} + +/* line 108, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page .label { + background-color: transparent; +} + +/* line 111, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page dd { + margin-left: 1.5em; +} + +/* line 114, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body code { + white-space: pre-wrap; +} + +/* line 1, ../../../hub/static/css/mod/user-card.scss */ +.user-card { + position: absolute; + padding: 3px 5px 5px; + min-height: 68px; + width: 210px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +/* line 2, ../../../hub/static/css/mod/user-card.scss */ +.user-card .desc { + margin-left: 3px; +} + +/* line 3, ../../../hub/static/css/mod/user-card.scss */ +.user-card .avatar-wrap { + width: 46px; + height: 36px; + float: left; + margin-right: 6px; + border-right: 1px solid #BEBEBE; +} + +/* line 4, ../../../hub/static/css/mod/user-card.scss */ +.user-card .badge-item { + float: left; + width: 30px; + height: 30px; + border: none; + padding: 2px; + background-color: white; + line-height: 0; + margin-right: 0.7em; +} + +/* line 5, ../../../hub/static/css/mod/user-card.scss */ +.user-card .title { + padding: 0 0 0.25em 0; +} + +/* line 6, ../../../hub/static/css/mod/user-card.scss */ +.user-card .desc .avatar { + float: left; + width: 30px; + height: 30px; + padding: 2px; + background-color: white; + line-height: 0; + margin-right: 0.7em; +} + +/* line 1, ../../../hub/static/css/mod/team-card.scss */ +.team-card { + position: absolute; + padding: 6px 10px; + min-height: 68px; + width: 236px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + overflow: hidden; +} +/* line 10, ../../../hub/static/css/mod/team-card.scss */ +.team-card .pic { + float: right; + max-height: 50px; + margin: 6px 0 0 10px; +} +/* line 15, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content { + word-wrap: break-word; +} +/* line 17, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .title { + margin: 6px 0; + font-size: 15px; + overflow: hidden; + white-space: nowrap; +} +/* line 23, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .info { + position: relative; + margin-top: 10px; + font-size: 13px; +} +/* line 27, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .info .desc { + white-space: nowrap; + overflow: hidden; +} + +/* line 35, ../../../hub/static/css/mod/team-card.scss */ +.member { + border-top: solid 1px #eaeaea; + padding-top: 8px; + height: 26px; +} +/* line 39, ../../../hub/static/css/mod/team-card.scss */ +.member .more-members { + float: right; + width: 24px; + height: 24px; + line-height: 26px; + text-align: center; + border: 1px solid #eaeaea; + background: #eaeaea; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 53, ../../../hub/static/css/mod/team-card.scss */ +.member .members li { + float: left; +} +/* line 55, ../../../hub/static/css/mod/team-card.scss */ +.member .members li a { + display: block; + width: 26px; + height: 26px; + overflow: hidden; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 65, ../../../hub/static/css/mod/team-card.scss */ +.member .members li a img { + width: 26px; + height: 26px; +} + +/* line 73, ../../../hub/static/css/mod/team-card.scss */ +.cf { + zoom: 1; +} +/* line 75, ../../../hub/static/css/mod/team-card.scss */ +.cf:before { + content: ""; + display: table; +} +/* line 79, ../../../hub/static/css/mod/team-card.scss */ +.cf .cf:after { + clear: both; + content: ""; + display: table; +} + +/* Timeline */ +@media (max-width: 767px) { + /* line 6, ../../../hub/static/css/mod/timeline.scss */ + .timeline { + padding: 10px; + } +} +/* line 9, ../../../hub/static/css/mod/timeline.scss */ +.timeline { + margin-top: 0px; + word-wrap: break-word; + word-break: normal; +} +/* line 14, ../../../hub/static/css/mod/timeline.scss */ +.timeline li { + position: relative; + list-style: none; + clear: both; + background: white; + padding: 10px 20px 10px 32px; + margin: 0 0 0px; + border-bottom: 1px solid #eaeaea; +} +/* line 23, ../../../hub/static/css/mod/timeline.scss */ +.timeline li .title { + margin-bottom: 0.5em; +} +/* line 25, ../../../hub/static/css/mod/timeline.scss */ +.timeline li .title i { + position: absolute; + left: 5px; + padding: 2px 5px 0; + color: #999; + font-size: 10px; +} +/* line 35, ../../../hub/static/css/mod/timeline.scss */ +.timeline .time { + float: right; + color: #ccc; + font-size: 12px; +} +/* line 41, ../../../hub/static/css/mod/timeline.scss */ +.timeline code { + white-space: normal; +} + +/* line 46, ../../../hub/static/css/mod/timeline.scss */ +.timeline .padding { + height: 2em; + font-weight: bold; +} + +/* line 50, ../../../hub/static/css/mod/timeline.scss */ +.timeline .more_items { + margin-left: 10px; + font-weight: bold; +} + +/* line 54, ../../../hub/static/css/mod/timeline.scss */ +.timeline .time { + color: #bbb; +} + +/* line 57, ../../../hub/static/css/mod/timeline.scss */ +.timeline .desc { + padding: 0 0 1em 0; + color: #666; + word-wrap: break-word; +} + +/* line 62, ../../../hub/static/css/mod/timeline.scss */ +.timeline .desc .right_side { + float: right; + margin-right: 30px; +} + +/* line 67, ../../../hub/static/css/mod/timeline.scss */ +.timeline .pagination { + display: none; + background: #63b6ae; +} + +/* line 71, ../../../hub/static/css/mod/timeline.scss */ +.pagination { + display: block; + margin: 7px 0; + overflow: hidden; + border: 1px solid #EAEAEA; + border-bottom-color: #CACACA; + border-top: none; + border-bottom: none; + border-radius: 3px; + background-image: -webkit-linear-gradient(top, white, #EFEFEF); +} + +/* line 82, ../../../hub/static/css/mod/timeline.scss */ +.timeline .pagination a { + color: white; +} + +/* line 85, ../../../hub/static/css/mod/timeline.scss */ +.pagination a { + padding: 8px; + width: 100%; + text-align: center; + line-height: 1.4; +} + +/* line 91, ../../../hub/static/css/mod/timeline.scss */ +.pagination a:last-child, .pagination span:last-child { + border-right: none; + border-bottom-right-radius: 3px; +} + +/* line 95, ../../../hub/static/css/mod/timeline.scss */ +.pagination a:first-child, .pagination span:first-child { + border-left: none; + border-bottom-left-radius: 3px; +} + +/* line 99, ../../../hub/static/css/mod/timeline.scss */ +.pagination a, .pagination span { + float: left; + margin: 0; + color: #777; + font-size: 13px; + text-decoration: none; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #DADADA; +} + +/* line 108, ../../../hub/static/css/mod/timeline.scss */ +.timeline .loader img { + display: block; + width: 16px; + height: 16px; + margin: 0 auto; + position: relative; +} + +/* line 6, ../../../hub/static/css/app/center.scss */ +.pull-form input[type="text"] { + font-size: 14px; + padding: 5px 5px; + margin: 0 0 5px 0; + width: 98%; + color: #444; +} + +/* line 13, ../../../hub/static/css/app/center.scss */ +.pull-form textarea { + height: 200px; +} + +/* line 16, ../../../hub/static/css/app/center.scss */ +.pull-form-main .form-actions { + padding: 0; + margin-top: 10px; + text-align: right; + padding-bottom: 5px; + background-color: inherit; + border-top: none; +} + +/* line 25, ../../../hub/static/css/app/center.scss */ +.previewable-comment-form .zen-enabled textarea { + padding: 10px 18px 10px 10px; +} + +/* line 28, ../../../hub/static/css/app/center.scss */ +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* Write/Preview Control style for new PR component */ +/* line 42, ../../../hub/static/css/app/center.scss */ +ul.edit-preview-tabs { + margin: 0 0 5px 0; + line-height: 13px; +} + +/* line 46, ../../../hub/static/css/app/center.scss */ +ul.edit-preview-tabs li { + list-style-type: none; + margin: 0; + display: inline-block; +} + +/* line 51, ../../../hub/static/css/app/center.scss */ +ul.edit-preview-tabs a { + display: inline-block; + padding: 2px 8px; + font-size: 11px; + font-weight: bold; + text-decoration: none; + color: #666; + border: 1px solid transparent; + border-radius: 10px; +} + +/* line 62, ../../../hub/static/css/app/center.scss */ +.previewable-comment-form li.active .write-tab, +.previewable-comment-form li.active .preview-tab { + color: #333; + background: white; + border-color: #BBB; + border-right-color: #DDD; + border-bottom-color: #DDD; +} + +/* Description Component background & help text, from hub.css*/ +/* line 72, ../../../hub/static/css/app/center.scss */ +.comment-form { + position: relative; + margin: -10px 0 10px 0; + padding: 5px; +} + +/* line 78, ../../../hub/static/css/app/center.scss */ +.comment-form p.help { + margin: 3px 0 0 0; + float: right; + font-size: 11px; + color: #666; +} diff --git a/dist/css/app/chat.css b/dist/css/app/chat.css new file mode 100644 index 0000000..9b59e24 --- /dev/null +++ b/dist/css/app/chat.css @@ -0,0 +1,6249 @@ +@charset "UTF-8"; +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(to bottom, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* preview comment form style */ +/* line 2, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav { + margin: 10px 0; + border-bottom: 1px solid #DDD; + height: 35px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs { + display: inline-block; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs > li { + display: inline-block; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab { + display: inline-block; + margin-bottom: -1px; + padding: 8px 12px 9px; + border: 1px solid transparent; + border-bottom: 0; + font-size: 14px; + color: #666; + text-decoration: none; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab.selected { + border-color: #DDD; + border-radius: 3px 3px 0 0; + background-color: white; + color: #333; + font-weight: bold; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab:hover { + text-decoration: none; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav { + position: relative; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav ul.tabnav-tabs { + padding-left: 10px; +} + +/* line 10, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 0 10px 10px; +} + +/* line 11, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form #preview_bucket .content-body { + padding: 10px; + min-height: 132px; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form.tab-content { + overflow: initial; + position: relative; +} + +/* line 2, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 10px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-actions { + padding: 0; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + position: relative; + border: 3px solid #EEE; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + padding: 0; + background: #EEE; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content .write-content { + padding: 0 10px 10px; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; + margin: 0; +} + +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary, button.primary.classy:disabled, button.primary.classy.disabled, button.primary.classy:disabled:hover, button.primary.classy.disabled:disabled:hover, button.classy:disabled:hover.primary, button.classy.disabled:disabled:hover.primary { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4); + border-color: #74BB5A; + border-bottom-color: #509338; + background: #8ADD6D; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#8add6d', endColorstr='#60b044')"; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); + background-image: -webkit-linear-gradient(top, #8ADD6D, #60B044); +} + +/* line 2, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary.disabled { + opacity: 0.5; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy, +button.classy:disabled, +button.classy.disabled, +a.button.classy:disabled, +a.button.classy.disabled, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover:disabled, +a.button.classy.disabled:hover, +a.button.classy, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy:disabled:hover, +a.button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover { + display: inline-block; + padding: 8px 15px; + line-height: normal; + position: relative; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 12px; + font-weight: bold; + color: #666; + text-shadow: 0 1px rgba(255, 255, 255, 0.9); + background: whiteSmoke; + background: -moz-linear-gradient(whiteSmoke, #E5E5E5); + background: -webkit-linear-gradient(whiteSmoke, #E5E5E5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; + border-radius: 3px; + border: 1px solid #DDD; + border-bottom-color: #BBB; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* ================================== *\ + * Zen Form + * ================================== */ +/* line 6, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + position: fixed; + z-index: 99999; + top: 0; + left: 0; + right: 0; + bottom: 0; + padding: 24px 30px 24px 24px; +} + +/* line 16, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-input-wrap { + max-width: 640px; + position: relative; + margin: 0 auto; +} + +/** + * Buttons style + */ +/* line 25, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button, +.zen-forms-theme-switch { + position: absolute; + width: 18px; + height: 18px; + text-align: center; + top: 10px; + right: 10px; + font-size: 24px; + color: #516066; + cursor: pointer; + line-height: 1; +} + +/* line 39, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-theme-switch { + top: 28px; + font-size: 34px; +} + +/* line 44, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button:hover, +.zen-forms-theme-switch:hover { + color: #667981; +} + +/** + * Inputs basic style + */ +/* line 52, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + padding: 8px 0; + width: 100%; + background: none; + border: none; + margin-bottom: 24px; + cursor: pointer; +} + +/* line 62, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus, +.zen-forms textarea:focus { + cursor: text; +} + +/* line 67, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms textarea { + resize: none; +} + +/* line 71, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + cursor: pointer; + display: none; + padding: 8px 3; + position: absolute; + top: 0; + width: 100%; +} + +/* line 80, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms .empty + label { + display: block; +} + +/* line 84, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus + label, +.zen-forms textarea:focus + label { + display: none; +} + +/* line 89, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms :focus { + outline-color: transparent; + outline-style: none; +} + +/** + * Dark theme + */ +/* line 97, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + background: #151a1c; +} + +/* line 101, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + color: #516066; +} + +/* line 105, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + color: #667981; +} + +/** + * Light theme + */ +/* line 113, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme { + background: #fefefe; +} + +/* line 117, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme label { + color: #959697; +} + +/* line 121, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme input, +.zen-forms.light-theme textarea { + color: #707071; +} + +/* line 4, ../../../hub/static/css/mod/zen-forms.scss */ +.write-content .enable-fullscreen { + position: absolute; + top: 5px; + right: 16px; + color: #333333; + opacity: .5; + line-height: 1em; +} + +/* line 5, ../../../hub/static/css/mod/zen-forms.scss */ +.mini-icon-fullscreen::before { + content: ""; +} + +/* line 6, ../../../hub/static/css/mod/zen-forms.scss */ +.fullscreen-overlay textarea, .zen-forms textarea { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + height: 100%; + padding: 20px; + border: 0; + font-size: 21px; + line-height: 1.6em; + resize: none; + -moz-transition: color 0.15s ease-in 0; + -webkit-transition: color 0.15s ease-in 0; + transition: color 0.15s ease-in 0; + box-shadow: none; +} + +/* line 7, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms.light-theme textarea { + background: #fff; + color: #999999; +} + +/* line 8, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms .zen-forms-input-wrap { + width: 100%; + height: 100%; +} + +/* line 9, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms label[for^=zen-forms-input] { + display: none; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-zen.scss */ +.previewable-comment-form .zen-enabled textarea { + padding: 10px 18px 10px 10px; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled { + position: relative; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled .go-zen { + position: absolute; + right: 15px; + top: 5px; +} + +/* line 1, ../../../hub/static/css/mod/loader.scss */ +.loader { + display: none; + position: absolute; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + background-color: #eee; +} + +/* line 2, ../../../hub/static/css/mod/loader.scss */ +.loader .spinner { + display: block; + width: 32px; + height: 32px; + margin: 0 auto; + top: 121px; + position: relative; + background: url(/static/img/spinner.gif) no-repeat; +} + +/* line 1, ../../../hub/static/css/mod/upload-widget.scss */ +.upload-widget { + position: relative; + top: -50px; + width: 360px; +} +/* line 7, ../../../hub/static/css/mod/upload-widget.scss */ +.upload-widget input { + position: absolute; + width: 120px; + opacity: 0.0001; + cursor: pointer; + margin: 0; +} +/* line 15, ../../../hub/static/css/mod/upload-widget.scss */ +.upload-widget form { + width: 120px; + float: left; +} + +/* line 1, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view { + position: absolute; + top: 0; + left: 0; + display: none; + margin-top: 18px; + background: white; + border: 1px solid #DDD; + border-radius: 3px; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + min-width: 120px; + z-index: 10; +} + +/* line 15, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur { + background: #3366FF; + color: white; +} + +/* line 19, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur small { + color: white; +} + +/* line 22, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view strong { + color: #3366FF; +} + +/* line 25, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur strong { + color: white; + font: bold; +} + +/* line 29, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul { + /* width: 100px; */ + list-style: none; + padding: 0; + margin: auto; +} + +/* line 35, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul li { + display: block; + padding: 5px 10px; + border-bottom: 1px solid #DDD; + cursor: pointer; + /* border-top: 1px solid #C8C8C8; */ +} + +/* line 42, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view small { + font-size: smaller; + color: #777; + font-weight: normal; +} + +/* line 11, ../../../hub/static/css/mod/flatui-comment-form.scss */ +.side-avatar { + float: left; + padding: 0px 5px 5px; + vertical-align: top; + margin-left: 0; +} + +/* line 18, ../../../hub/static/css/mod/flatui-comment-form.scss */ +.comment-form-head li { + line-height: 18px; +} + +/* line 22, ../../../hub/static/css/mod/flatui-comment-form.scss */ +#form-file-upload { + position: relative; + top: -50px; + width: 360px; +} + +/* line 28, ../../../hub/static/css/mod/flatui-comment-form.scss */ +#form-file-upload #file { + position: absolute; + width: 240px; + margin-left: -80px; + opacity: 0.0001; + cursor: pointer; +} + +/* line 36, ../../../hub/static/css/mod/flatui-comment-form.scss */ +.form-content { + padding: 10px; + display: none; + opacity: 1.0; +} + +/* line 43, ../../../hub/static/css/mod/flatui-comment-form.scss */ +form#add-comment-form .form-content { + display: block; + background: white; + border: 0px solid; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} +/* line 49, ../../../hub/static/css/mod/flatui-comment-form.scss */ +form#add-comment-form .form-content textarea#new_comment_content { + width: 100%; + background: white; +} +/* line 54, ../../../hub/static/css/mod/flatui-comment-form.scss */ +form#add-comment-form .form-content .tabnav { + border-bottom: none; + padding: 10px; +} +/* line 59, ../../../hub/static/css/mod/flatui-comment-form.scss */ +form#add-comment-form .form-content .write-content { + position: relative; + padding: 10px 10px 10px; +} + +/* Zen Mode button hacks for FlatUI */ +/* line 67, ../../../hub/static/css/mod/flatui-comment-form.scss */ +.write-content .enable-fullscreen { + top: 15px; +} + +/* line 71, ../../../hub/static/css/mod/flatui-comment-form.scss */ +.tab-content { + overflow: visible; +} + +/* Issue for Responsive Mobile Hacks */ +@media (max-width: 767px) { + /* line 79, ../../../hub/static/css/mod/flatui-comment-form.scss */ + .side-avatar { + padding: 0px; + } + + /* line 85, ../../../hub/static/css/mod/flatui-comment-form.scss */ + form#add-comment-form .form-content .tabnav { + max-width: 100%; + } +} +/* hacks for markdown paragraph content for flatui */ +/* line 4, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.markdown-body p, .markdown-body blockquote, .markdown-body ul, .markdown-body ol, .markdown-body dl, .markdown-body table, .markdown-body pre { + margin: 15px 0px 0px 0px; +} + +/* line 8, ../../../hub/static/css/mod/flatui-comment-content.scss */ +#summary.mod .header { + position: relative; +} + +/* line 12, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.mini-icon-edit:before { + content: ""; +} + +/* line 13, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.mini-icon-delete-note::before, .mini-icon-remove-close::before { + content: ""; +} + +/* line 15, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.content .form-content input.title-field { + font-size: 20px; + font-weight: bold; + margin-bottom: 5px; + width: 99%; +} + +/* line 22, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.content .form-content textarea { + min-height: 100px; + max-width: 100%; + width: 99%; + margin: 0; +} + +/* line 29, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.form-actions { + background-color: transparent; + border: none; + text-align: right; + margin: 0px; + padding: 10px 0px 0px; +} + +/* line 37, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.change-header-right { + float: right; +} +/* line 39, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.change-header-right a.change-header-date { + color: lightgray; +} + +/* line 44, ../../../hub/static/css/mod/flatui-comment-content.scss */ +ul.comment-header-actions { + margin-left: 10px; + display: inline; +} +/* line 47, ../../../hub/static/css/mod/flatui-comment-content.scss */ +ul.comment-header-actions li { + display: inline; +} + +/* line 52, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.comment-body { + padding: 0px; +} + +/* line 56, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.markdown-body { + padding: 0px; +} + +/* line 4, ../../../hub/static/css/app/chat.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 8, ../../../hub/static/css/app/chat.scss */ +.rooms-right { + float: right; + width: 94px; +} + +/* line 13, ../../../hub/static/css/app/chat.scss */ +.pagehead h2 { + margin: 0; + font-size: 30px; + line-height: 36px; + float: left; +} + +/* line 20, ../../../hub/static/css/app/chat.scss */ +.clearfix { + display: block; +} + +/* line 24, ../../../hub/static/css/app/chat.scss */ +.all_rooms li { + position: relative; + list-style: none; + clear: both; + background: white; + margin: 0; + padding: 0; + border-bottom: 1px solid #eaeaea; +} + +/* line 34, ../../../hub/static/css/app/chat.scss */ +.nav-tabs.nav-stacked > li > a { + padding: 14px 5px; +} + +/* line 38, ../../../hub/static/css/app/chat.scss */ +.del-room { + position: absolute; + right: 0; + z-index: 10; + margin: 0; + top: 13px; + color: rgba(99, 182, 174, 0); +} + +/* line 47, ../../../hub/static/css/app/chat.scss */ +.all_rooms { + height: 686px; + overflow: auto; +} + +/* line 52, ../../../hub/static/css/app/chat.scss */ +.message { + height: 623px; + overflow: auto; + background: white; +} + +/* line 58, ../../../hub/static/css/app/chat.scss */ +#message_input { + height: 63px; + width: 100%; + margin: 0; + padding: 0; +} + +/* line 65, ../../../hub/static/css/app/chat.scss */ +#send_message_button { + height: 63px; + margin: 0; + padding: 0; +} + +/* line 71, ../../../hub/static/css/app/chat.scss */ +.dia_box { + margin-top: 20px; + line-height: 17px; + margin-left: 40px; + margin-bottom: 20px; +} + +/* line 78, ../../../hub/static/css/app/chat.scss */ +.dia_info { + margin-left: 18px; + text-align: left; +} + +/* line 83, ../../../hub/static/css/app/chat.scss */ +.info_date { + color: #808080; + vertical-align: -1px; + white-space: pre; + zoom: 1; +} + +/* line 90, ../../../hub/static/css/app/chat.scss */ +.dia_bg { + min-width: 144px; + max-width: 413px; + margin: 0 8px; + padding: 5px 9px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; + position: relative; + background: #f3f3f3; + border: solid 1px #eaeaea; + box-shadow: inset -1px 1px 1px rgba(255, 255, 255, 0.75); +} + +/* line 102, ../../../hub/static/css/app/chat.scss */ +.dia_txt { + min-width: 144px; + max-width: 413px; + margin: 0 8px; + padding: 5px 9px; + border-radius: 5px; + position: relative; +} + +/* line 111, ../../../hub/static/css/app/chat.scss */ +.side-avatar { + float: left; + padding: 0px 5px 5px; + vertical-align: top; + margin-left: 0; + margin-top: 17px; +} + +/* line 119, ../../../hub/static/css/app/chat.scss */ +.side-avatar img { + width: 32px; + height: 32px; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} diff --git a/dist/css/app/commit.css b/dist/css/app/commit.css new file mode 100644 index 0000000..fc0151f --- /dev/null +++ b/dist/css/app/commit.css @@ -0,0 +1,9548 @@ +@charset "UTF-8"; +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* line 1, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav { + margin-top: 6px; +} + +/* line 3, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label { + position: relative; + display: inline-block; + margin-left: 3px; + padding: 3px 7px; + border: 1px solid #ccc; + border-radius: 3px; + color: #333; + background-color: #fafafa; + vertical-align: middle; +} + +/* line 15, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::before, .metanav .counts-label::after { + content: ""; + position: absolute; + top: 50%; + right: 100%; + display: block; + margin-right: 0px; + margin-top: -6px; + width: 0; + height: 0; + border: 6px solid transparent; + border-right-color: #ccc; +} + +/* line 29, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::after { + margin-right: -1px; + border-right-color: #fafafa; +} + +/* line 2, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.metabox { + display: inline-block; + height: 8px; + background: #ccc; + text-indent: -9999px; + font-size: 12px; +} + +/* line 9, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats { + font: 13px Helvetica, arial, freesans, clean, sans-serif; + line-height: 1.4; + margin: 0; + padding: 0; + border: 0; + position: relative; + float: right; + width: 135px; + opacity: 0.5; + padding-bottom: 10px; +} + +/* line 21, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats:hover { + opacity: 1; +} + +/* line 24, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats:hover .list-tip { + display: block; +} + +/* line 27, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats a { + color: #4183c4; + text-decoration: none; +} + +/* line 31, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats-graph { + height: 10px; + overflow: hidden; +} + +/* line 35, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats-graph span { + display: inline-block; + height: 6px; + background: #ccc; + text-indent: -9999px; + float: left; +} + +/* line 42, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip, ul.list-tip { + border-radius: 3px; + box-shadow: 0 0 5px #ccc; + border: 1px solid #ddd; + background: #fff; + position: absolute; + padding-left: 0px; + top: 20px; + left: -20px; + width: 175px; + z-index: 100; + display: none; + margin-top: 0px; +} + +/* line 56, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip:before, ul.list-tip:before { + content: "▲"; + font-size: 14px; + margin: 0 auto; + width: 14px; + display: block; + margin-top: -13px; + color: #fff; + text-shadow: -1px -1px 2px #ccc; +} + +/* line 66, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li, ul.list-tip li { + margin: 0; + line-height: 100%; + list-style: none; + border-bottom: 1px solid #eee; + font-weight: bold; +} + +/* line 73, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li a, ol.list-tip li .other, ul.list-tip li a, ul.list-tip li .other { + color: #333; + padding: 8px 10px; + display: block; +} + +/* line 78, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li span.color-block, ul.list-tip li span.color-block { + display: inline-block; + width: 8px; + height: 10px; + margin-right: 5px; +} + +/* line 84, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li span.percent, ul.list-tip li span.percent { + float: right; + color: #999; +} + +/* fix project title for newer version of bootstrap*/ +/* line 6, ../../../hub/static/css/mod/project-info.scss */ +.pagehead .pull-left { + margin: 0; + font-size: 30px; + line-height: 36px; +} + +/* Hotfix for FlatUI */ +/* line 13, ../../../hub/static/css/mod/project-info.scss */ +.pagehead h2.pull-left { + margin: 0; +} + +/* line 17, ../../../hub/static/css/mod/project-info.scss */ +#project-info { + border: 1px solid #c5d5dd; + border-radius: 3px; + width: 100%; +} + +/* line 22, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div { + padding: 10px; +} + +/* line 25, ../../../hub/static/css/mod/project-info.scss */ +#project-info p { + margin: 0px; +} + +/* line 28, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div.team-label { + border-top: 1px solid #ccc; +} + +/* line 32, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div.git-url { + border-top: 1px solid #ccc; +} + +/* line 36, ../../../hub/static/css/mod/project-info.scss */ +#project-info input.git-url { + width: 480px; + margin: 0px; + cursor: auto; +} + +/* line 43, ../../../hub/static/css/mod/project-info.scss */ +#project-info .ssh div.ssh-url { + display: inline; +} +/* line 46, ../../../hub/static/css/mod/project-info.scss */ +#project-info .ssh div.http-url { + display: none; +} + +/* line 52, ../../../hub/static/css/mod/project-info.scss */ +#project-info .http div.ssh-url { + display: none; +} +/* line 55, ../../../hub/static/css/mod/project-info.scss */ +#project-info .http div.http-url { + display: inline; +} + +/* line 60, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar { + margin-top: 12px; + border-bottom: 1px solid #DDD; +} + +/* line 61, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar #back-old-browser { + padding-top: 8px; + float: right; +} + +/* line 62, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab { + padding-left: 20px; +} + +/* line 63, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li { + display: inline-block; + vertical-align: top; + cursor: pointer; +} + +/* line 64, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li a { + color: #666; + text-decoration: none; + padding: 8px 12px; + display: inline-block; + border-left: 1px solid transparent; + border-top: 1px solid transparent; + border-right: 1px solid transparent; + margin-bottom: -1px; +} + +/* line 65, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li a.active { + color: #333; + font-weight: bold; + border-left: 1px solid #DDD; + border-top: 1px solid #DDD; + border-right: 1px solid #DDD; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + background-color: white; +} + +/* line 67, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar .scope { + float: left; + margin-right: 10px; +} + +/* line 71, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar .scope i { + font-style: normal; +} + +/* line 75, ../../../hub/static/css/mod/project-info.scss */ +#breadcrumb { + margin: 10px 0; + font-size: 18px; + font-weight: bold; + color: #999; +} + +/* line 76, ../../../hub/static/css/mod/project-info.scss */ +#breadcrumb .final-path { + color: #000; +} + +/* highlight style */ +/* line 2, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .hll { + background-color: #ffffcc; +} + +/* line 3, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight { + background: #ffffff; +} + +/* line 4, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .c { + color: #808080; +} + +/* Comment */ +/* line 5, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .err { + color: #F00000; + background-color: #F0A0A0; +} + +/* Error */ +/* line 6, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .k { + color: #008000; + font-weight: bold; +} + +/* Keyword */ +/* line 7, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .o { + color: #303030; +} + +/* Operator */ +/* line 8, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .cm { + color: #808080; +} + +/* Comment.Multiline */ +/* line 9, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .cp { + color: #507090; +} + +/* Comment.Preproc */ +/* line 10, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .c1 { + color: #808080; +} + +/* Comment.Single */ +/* line 11, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .cs { + color: #cc0000; + font-weight: bold; +} + +/* Comment.Special */ +/* line 12, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gd { + color: #A00000; +} + +/* Generic.Deleted */ +/* line 13, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ge { + font-style: italic; +} + +/* Generic.Emph */ +/* line 14, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gr { + color: #FF0000; +} + +/* Generic.Error */ +/* line 15, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gh { + color: #000080; + font-weight: bold; +} + +/* Generic.Heading */ +/* line 16, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gi { + color: #00A000; +} + +/* Generic.Inserted */ +/* line 17, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .go { + color: #808080; +} + +/* Generic.Output */ +/* line 18, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gp { + color: #c65d09; + font-weight: bold; +} + +/* Generic.Prompt */ +/* line 19, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gs { + font-weight: bold; +} + +/* Generic.Strong */ +/* line 20, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gu { + color: #800080; + font-weight: bold; +} + +/* Generic.Subheading */ +/* line 21, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gt { + color: #0040D0; +} + +/* Generic.Traceback */ +/* line 22, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kc { + color: #008000; + font-weight: bold; +} + +/* Keyword.Constant */ +/* line 23, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kd { + color: #008000; + font-weight: bold; +} + +/* Keyword.Declaration */ +/* line 24, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kn { + color: #008000; + font-weight: bold; +} + +/* Keyword.Namespace */ +/* line 25, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kp { + color: #003080; + font-weight: bold; +} + +/* Keyword.Pseudo */ +/* line 26, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kr { + color: #008000; + font-weight: bold; +} + +/* Keyword.Reserved */ +/* line 27, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kt { + color: #303090; + font-weight: bold; +} + +/* Keyword.Type */ +/* line 28, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .m { + color: #6000E0; + font-weight: bold; +} + +/* Literal.Number */ +/* line 29, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .s { + background-color: #fff0f0; +} + +/* Literal.String */ +/* line 30, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .na { + color: #0000C0; +} + +/* Name.Attribute */ +/* line 31, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nb { + color: #007020; +} + +/* Name.Builtin */ +/* line 32, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nc { + color: #B00060; + font-weight: bold; +} + +/* Name.Class */ +/* line 33, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .no { + color: #003060; + font-weight: bold; +} + +/* Name.Constant */ +/* line 34, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nd { + color: #505050; + font-weight: bold; +} + +/* Name.Decorator */ +/* line 35, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ni { + color: #800000; + font-weight: bold; +} + +/* Name.Entity */ +/* line 36, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ne { + color: #F00000; + font-weight: bold; +} + +/* Name.Exception */ +/* line 37, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nf { + color: #0060B0; + font-weight: bold; +} + +/* Name.Function */ +/* line 38, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nl { + color: #907000; + font-weight: bold; +} + +/* Name.Label */ +/* line 39, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nn { + color: #0e84b5; + font-weight: bold; +} + +/* Name.Namespace */ +/* line 40, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nt { + color: #007000; +} + +/* Name.Tag */ +/* line 41, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nv { + color: #906030; +} + +/* Name.Variable */ +/* line 42, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ow { + color: #000000; + font-weight: bold; +} + +/* Operator.Word */ +/* line 43, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .w { + color: #bbbbbb; +} + +/* Text.Whitespace */ +/* line 44, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mf { + color: #6000E0; + font-weight: bold; +} + +/* Literal.Number.Float */ +/* line 45, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mh { + color: #005080; + font-weight: bold; +} + +/* Literal.Number.Hex */ +/* line 46, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mi { + color: #0000D0; + font-weight: bold; +} + +/* Literal.Number.Integer */ +/* line 47, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mo { + color: #4000E0; + font-weight: bold; +} + +/* Literal.Number.Oct */ +/* line 48, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sb { + background-color: #fff0f0; +} + +/* Literal.String.Backtick */ +/* line 49, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sc { + color: #0040D0; +} + +/* Literal.String.Char */ +/* line 50, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sd { + color: #D04020; +} + +/* Literal.String.Doc */ +/* line 51, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .s2 { + background-color: #fff0f0; +} + +/* Literal.String.Double */ +/* line 52, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .se { + color: #606060; + font-weight: bold; + background-color: #fff0f0; +} + +/* Literal.String.Escape */ +/* line 53, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sh { + background-color: #fff0f0; +} + +/* Literal.String.Heredoc */ +/* line 54, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .si { + background-color: #e0e0e0; +} + +/* Literal.String.Interpol */ +/* line 55, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sx { + color: #D02000; + background-color: #fff0f0; +} + +/* Literal.String.Other */ +/* line 56, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sr { + color: #000000; + background-color: #fff0ff; +} + +/* Literal.String.Regex */ +/* line 57, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .s1 { + background-color: #fff0f0; +} + +/* Literal.String.Single */ +/* line 58, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ss { + color: #A06000; +} + +/* Literal.String.Symbol */ +/* line 59, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .bp { + color: #007020; +} + +/* Name.Builtin.Pseudo */ +/* line 60, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .vc { + color: #306090; +} + +/* Name.Variable.Class */ +/* line 61, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .vg { + color: #d07000; + font-weight: bold; +} + +/* Name.Variable.Global */ +/* line 62, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .vi { + color: #3030B0; +} + +/* Name.Variable.Instance */ +/* line 63, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .il { + color: #0000D0; + font-weight: bold; +} + +/* Literal.Number.Integer.Long */ +/* For other page that still depends on commits.scss */ +/* preview comment form style */ +/* line 2, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav { + margin: 10px 0; + border-bottom: 1px solid #DDD; + height: 35px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs { + display: inline-block; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs > li { + display: inline-block; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab { + display: inline-block; + margin-bottom: -1px; + padding: 8px 12px 9px; + border: 1px solid transparent; + border-bottom: 0; + font-size: 14px; + color: #666; + text-decoration: none; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab.selected { + border-color: #DDD; + border-radius: 3px 3px 0 0; + background-color: white; + color: #333; + font-weight: bold; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab:hover { + text-decoration: none; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav { + position: relative; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav ul.tabnav-tabs { + padding-left: 10px; +} + +/* line 10, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 0 10px 10px; +} + +/* line 11, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form #preview_bucket .content-body { + padding: 10px; + min-height: 132px; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form.tab-content { + overflow: initial; + position: relative; +} + +/* line 2, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 10px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-actions { + padding: 0; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + position: relative; + border: 3px solid #EEE; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + padding: 0; + background: #EEE; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content .write-content { + padding: 0 10px 10px; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; + margin: 0; +} + +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary, button.primary.classy:disabled, button.primary.classy.disabled, button.primary.classy:disabled:hover, button.primary.classy.disabled:disabled:hover, button.classy:disabled:hover.primary, button.classy.disabled:disabled:hover.primary { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4); + border-color: #74BB5A; + border-bottom-color: #509338; + background: #8ADD6D; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#8add6d', endColorstr='#60b044')"; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); + background-image: -webkit-linear-gradient(top, #8ADD6D, #60B044); +} + +/* line 2, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary.disabled { + opacity: 0.5; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy, +button.classy:disabled, +button.classy.disabled, +a.button.classy:disabled, +a.button.classy.disabled, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover:disabled, +a.button.classy.disabled:hover, +a.button.classy, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy:disabled:hover, +a.button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover { + display: inline-block; + padding: 8px 15px; + line-height: normal; + position: relative; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 12px; + font-weight: bold; + color: #666; + text-shadow: 0 1px rgba(255, 255, 255, 0.9); + background: whiteSmoke; + background: -moz-linear-gradient(whiteSmoke, #E5E5E5); + background: -webkit-linear-gradient(whiteSmoke, #E5E5E5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; + border-radius: 3px; + border: 1px solid #DDD; + border-bottom-color: #BBB; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* ================================== *\ + * Zen Form + * ================================== */ +/* line 6, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + position: fixed; + z-index: 99999; + top: 0; + left: 0; + right: 0; + bottom: 0; + padding: 24px 30px 24px 24px; +} + +/* line 16, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-input-wrap { + max-width: 640px; + position: relative; + margin: 0 auto; +} + +/** + * Buttons style + */ +/* line 25, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button, +.zen-forms-theme-switch { + position: absolute; + width: 18px; + height: 18px; + text-align: center; + top: 10px; + right: 10px; + font-size: 24px; + color: #516066; + cursor: pointer; + line-height: 1; +} + +/* line 39, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-theme-switch { + top: 28px; + font-size: 34px; +} + +/* line 44, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button:hover, +.zen-forms-theme-switch:hover { + color: #667981; +} + +/** + * Inputs basic style + */ +/* line 52, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + padding: 8px 0; + width: 100%; + background: none; + border: none; + margin-bottom: 24px; + cursor: pointer; +} + +/* line 62, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus, +.zen-forms textarea:focus { + cursor: text; +} + +/* line 67, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms textarea { + resize: none; +} + +/* line 71, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + cursor: pointer; + display: none; + padding: 8px 3; + position: absolute; + top: 0; + width: 100%; +} + +/* line 80, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms .empty + label { + display: block; +} + +/* line 84, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus + label, +.zen-forms textarea:focus + label { + display: none; +} + +/* line 89, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms :focus { + outline-color: transparent; + outline-style: none; +} + +/** + * Dark theme + */ +/* line 97, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + background: #151a1c; +} + +/* line 101, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + color: #516066; +} + +/* line 105, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + color: #667981; +} + +/** + * Light theme + */ +/* line 113, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme { + background: #fefefe; +} + +/* line 117, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme label { + color: #959697; +} + +/* line 121, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme input, +.zen-forms.light-theme textarea { + color: #707071; +} + +/* line 4, ../../../hub/static/css/mod/zen-forms.scss */ +.write-content .enable-fullscreen { + position: absolute; + top: 5px; + right: 16px; + color: #333333; + opacity: .5; + line-height: 1em; +} + +/* line 5, ../../../hub/static/css/mod/zen-forms.scss */ +.mini-icon-fullscreen::before { + content: ""; +} + +/* line 6, ../../../hub/static/css/mod/zen-forms.scss */ +.fullscreen-overlay textarea, .zen-forms textarea { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + height: 100%; + padding: 20px; + border: 0; + font-size: 21px; + line-height: 1.6em; + resize: none; + -moz-transition: color 0.15s ease-in 0; + -webkit-transition: color 0.15s ease-in 0; + transition: color 0.15s ease-in 0; + box-shadow: none; +} + +/* line 7, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms.light-theme textarea { + background: #fff; + color: #999999; +} + +/* line 8, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms .zen-forms-input-wrap { + width: 100%; + height: 100%; +} + +/* line 9, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms label[for^=zen-forms-input] { + display: none; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-zen.scss */ +.previewable-comment-form .zen-enabled textarea { + padding: 10px 18px 10px 10px; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled { + position: relative; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled .go-zen { + position: absolute; + right: 15px; + top: 5px; +} + +/* line 1, ../../../hub/static/css/mod/loader.scss */ +.loader { + display: none; + position: absolute; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + background-color: #eee; +} + +/* line 2, ../../../hub/static/css/mod/loader.scss */ +.loader .spinner { + display: block; + width: 32px; + height: 32px; + margin: 0 auto; + top: 121px; + position: relative; + background: url(/static/img/spinner.gif) no-repeat; +} + +/* line 1, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view { + position: absolute; + top: 0; + left: 0; + display: none; + margin-top: 18px; + background: white; + border: 1px solid #DDD; + border-radius: 3px; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + min-width: 120px; + z-index: 10; +} + +/* line 15, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur { + background: #3366FF; + color: white; +} + +/* line 19, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur small { + color: white; +} + +/* line 22, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view strong { + color: #3366FF; +} + +/* line 25, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur strong { + color: white; + font: bold; +} + +/* line 29, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul { + /* width: 100px; */ + list-style: none; + padding: 0; + margin: auto; +} + +/* line 35, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul li { + display: block; + padding: 5px 10px; + border-bottom: 1px solid #DDD; + cursor: pointer; + /* border-top: 1px solid #C8C8C8; */ +} + +/* line 42, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view small { + font-size: smaller; + color: #777; + font-weight: normal; +} + +/* line 9, ../../../hub/static/css/mod/comment-form.scss */ +.side-avatar { + margin-left: 0; +} + +/* fix li header for newer version of bootstrap */ +/* line 12, ../../../hub/static/css/mod/comment-form.scss */ +.comment-form-head li { + line-height: 18px; +} + +/* line 16, ../../../hub/static/css/mod/comment-form.scss */ +#new_comment .form-content { + width: 880px; + margin-left: 60px; +} + +/* line 18, ../../../hub/static/css/mod/comment-form.scss */ +.discussion-bubble-avatar { + position: relative; + float: left; + border-radius: 3px; +} + +/* line 19, ../../../hub/static/css/mod/comment-form.scss */ +.discussion-bubble-inner { + min-height: 60px; + border: 1px solid #CACACA; + background-color: white; +} + +/* line 1, ../../../hub/static/css/mod/diff-stat.scss */ +#toc li { + border-bottom: 1px solid #DDD; + list-style-type: none; + padding: 5px; +} + +/* line 7, ../../../hub/static/css/mod/diff-stat.scss */ +#toc { + margin: 15px 0; +} + +/* line 11, ../../../hub/static/css/mod/diff-stat.scss */ +#toc .diffstat { + float: right; +} + +/* line 14, ../../../hub/static/css/mod/diff-stat.scss */ +#toc .mini-icon-modified { + color: #677A85; +} + +/* line 18, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat { + white-space: nowrap; + text-align: right; + font-family: Helvetica,arial,freesans,clean,sans-serif; + color: #666; + font-weight: bold; + font-size: 11px; +} + +/* line 26, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat a { + text-decoration: none; + color: #666; +} + +/* line 30, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar { + position: relative; + left: -3px; + display: inline-block; + height: 12px; + text-decoration: none; + text-align: left; + color: #EEE; + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + line-height: 1; + -webkit-font-smoothing: antialiased; + font-size: 16px; + letter-spacing: -7px; +} + +/* line 48, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar.diff-added, +span.diffstat .diffstat-bar i.plus { + color: #61C423; + font-style: normal; +} + +/* line 53, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar.diff-added, +span.diffstat .diffstat-bar i.minus { + color: #C52323; + font-style: normal; +} + +/* line 59, ../../../hub/static/css/mod/diff-stat.scss */ +p.explain { + font-size: 12px; + color: #666; + margin: 1em 0; +} + +/* line 65, ../../../hub/static/css/mod/diff-stat.scss */ +p.explain .minibutton { + float: right; + top: -4px; +} + +/* line 3, ../../../hub/static/css/mod/diffs-pane.scss */ +.diff-cutoff { + margin-bottom: -2px; + height: 35px; + line-height: 37px; + font-size: 12px; + font-weight: bold; + color: #000; + text-align: center; + background: url("/static/img/compare_too_big.gif") 0 0 no-repeat; +} + +/* line 5, ../../../hub/static/css/mod/diffs-pane.scss */ +.fullscreen-mode { + overflow: hidden; +} + +/* line 6, ../../../hub/static/css/mod/diffs-pane.scss */ +#fullscreen-stage { + display: none; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + overflow-y: auto; + background: #fff; + z-index: 9999; +} + +/* line 7, ../../../hub/static/css/mod/diffs-pane.scss */ +#files #fullscreen-stage .file { + margin: 0; +} + +/* line 5, ../../../hub/static/css/mod/commits.scss */ +div.container div.raw { + overflow: visible; +} + +/* line 9, ../../../hub/static/css/mod/commits.scss */ +#commits-graph { + position: absolute; + left: -200px; + width: 200px; +} + +/* line 15, ../../../hub/static/css/mod/commits.scss */ +.commits-body { + position: relative; +} + +/* line 19, ../../../hub/static/css/mod/commits.scss */ +h3.commit-group-heading { + margin: 15px 0 0 0; + padding: 5px 8px; + font-size: 13px; + color: #3a505b; + text-shadow: 0 1px white; + background: #e6f1f6; + border: 1px solid #c5d5dd; + border-top-right-radius: 4px; + border-top-left-radius: 4px; +} + +/* line 31, ../../../hub/static/css/mod/commits.scss */ +h3.history { + margin-top: 15px; +} + +/* line 35, ../../../hub/static/css/mod/commits.scss */ +.commit-group { + list-style-type: none; + margin: 15px 0; + background: #f7fbfc; + border: 1px solid #c5d5dd; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +/* line 46, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item { + position: relative; + padding: 8px 8px 8px 52px; + border-top: 1px solid #e2eaee; +} + +/* line 52, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:first-child { + border-top: none; +} + +/* line 56, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:last-child { + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +/* line 61, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:nth-child(2n) { + background: #fff; +} + +/* line 65, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus { + background: #fcfce2; +} + +/* line 69, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gravatar { + float: left; + margin-left: -44px; + border-radius: 4px; +} + +/* line 75, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .commit-title { + margin: 1px 0 1px 0; + font-size: 14px; + font-weight: bold; + color: #333; +} + +/* line 82, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .commit-title a { + color: #333; +} + +/* line 86, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .commit-desc pre { + margin-top: 5px; + margin-bottom: 10px; + font-size: 12px; + color: #596063; + border-left: 1px solid #e5e5e5; + padding-left: 8px; +} + +/* line 95, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship { + font-size: 12px; + color: #888; +} + +/* line 100, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship a { + color: #444; +} + +/* line 104, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship .author-name { + color: #444; +} + +/* line 108, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship .committer { + display: block; + font-size: 11px; +} + +/* line 113, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship .committer .mini-icon { + position: relative; + top: 2px; +} + +/* line 118, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .commit-links { + position: absolute; + top: 7px; + right: 8px; + width: 243px; + text-align: right; +} + +/* line 126, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .mini-icon-clippy { + visibility: hidden; + float: left; + margin-right: 7px; + margin-top: 5px; +} + +/* line 133, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:hover .mini-icon-clippy { + visibility: visible; +} + +/* line 137, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton { + float: right; + height: 18px; + padding: 0 7px; + line-height: 22px; + font-size: 11px; + color: #4e575b; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); + background: #eff6f9; + background: -moz-linear-gradient(#eff6f9, #ddecf3); + background: -webkit-linear-gradient(#eff6f9, #ddecf3); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#eff6f9',endColorstr='#ddecf3')"; + border: 1px solid #cedee5; + border-radius: 3px; + min-width: 70px; + text-align: center; +} + +/* line 155, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton .comment-popover { + color: #91A6B1; + border-right: 1px solid #ddd; + padding-right: 4px; +} + +/* line 161, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton { + color: #5a5b4e; +} + +/* line 165, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:nth-child(2n+1) .gobutton { + border-color: #d5dcdf; + background: #f2f5f6; + background: -moz-linear-gradient(#f2f5f6, #e3eaed); + background: -webkit-linear-gradient(#f2f5f6, #e3eaed); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f2f5f6',endColorstr='#e3eaed')"; +} + +/* line 173, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton { + border-color: #e7e86d; + background: #f9fac9; + background: -moz-linear-gradient(#f9fac9, #f3f494); + background: -webkit-linear-gradient(#f9fac9, #f3f494); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f9fac9',endColorstr='#f3f494')"; +} + +/* line 181, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton:hover { + text-decoration: none; + border-color: #cedee5; + background: #fbfdfe; + background: -moz-linear-gradient(#fbfdfe, #eaf4f8); + background: -webkit-linear-gradient(#fbfdfe, #eaf4f8); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbfdfe',endColorstr='#eaf4f8')"; +} + +/* line 190, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton > .sha, .commit-group-item.navigation-focus .gobutton:hover > .sha { + display: inline-block; + height: 22px; + margin-right: -3px; +} + +/* line 196, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton > .sha .mini-icon, .commit-group-item.navigation-focus .gobutton:hover > .sha .mini-icon { + position: relative; + top: 2px; + border-radius: 30px; + border: 1px solid #CFDEE5; + background-color: rgba(255, 255, 255, 0.5); + color: #91a6b1; + margin-left: 5px; + width: 16px; +} + +/* line 207, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton > .sha .mini-icon { + border: 1px solid #E7E86D; + color: #c3c45c; +} + +/* line 212, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton.with-comments { + padding-left: 5px; +} + +/* line 216, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton.with-comments .sha, .commit-group-item.navigation-focus .gobutton.with-comments:hover .sha { + padding-left: 8px; + border-left: 1px solid #cfdee5; +} + +/* line 221, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton.with-comments .sha { + border-left-color: #e1e29e; +} + +/* line 225, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton .comment-count, .commit-group-item.navigation-focus .gobutton:hover .comment-count { + float: left; + height: 22px; + padding-right: 9px; + line-height: 24px; + font-weight: bold; + border-right: 1px solid #f6fafc; +} + +/* line 234, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton .comment-count .mini-icon, .commit-group-item.navigation-focus .gobutton:hover .comment-count .mini-icon { + position: relative; + top: 2px; + color: #91A6B1; +} + +/* line 240, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton .comment-count .mini-icon { + color: #C3C45C; +} + +/* line 244, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .browse-button, .commit-group-item .compare-button { + clear: left; + margin-top: 1px; + font-size: 11px; + font-weight: bold; + text-align: right; + color: #999; +} + +/* line 253, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .browse-button .mini-icon { + position: relative; + top: 2px; +} + +/* line 258, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .browse-button:hover { + color: #4183C4; + background-position: 100% -95px; +} + +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 400; + src: local("Source Code Pro"), local("SourceCodePro-Regular"), url("/static/css/fonts/SourceCodePro-Regular.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 500; + src: local("Source Code Pro Medium"), local("SourceCodePro-Medium"), url("/static/css/fonts/SourceCodePro-Medium.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 600; + src: local("Source Code Pro Semibold"), local("SourceCodePro-Semibold"), url("/static/css/fonts/SourceCodePro-Semibold.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 700; + src: local("Source Code Pro Bold"), local("SourceCodePro-Bold"), url("/static/css/fonts/SourceCodePro-Bold.woff") format("woff"); +} +/* line 3, ../../../hub/static/css/mod/diff-base.scss */ +.code pre, xmp, plaintext, listing { + display: block; + font-size: 13px; + font-family: 'Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; + white-space: pre; + margin: 0; + padding: 0; +} + +/* line 12, ../../../hub/static/css/mod/diff-base.scss */ +.code pre { + line-height: 18px; +} + +/* line 16, ../../../hub/static/css/mod/diff-base.scss */ +.font-consolas pre { + font-family: Consolas,'Source Code Pro',Courier,Monaco,Menlo,monospace; +} + +/* line 20, ../../../hub/static/css/mod/diff-base.scss */ +.font-monaco pre { + font-family: Monaco,'Source Code Pro',Courier,Consolas,Menlo,monospace; +} + +/* line 24, ../../../hub/static/css/mod/diff-base.scss */ +.font-courier pre { + font-family: Courier,'Source Code Pro',Monaco,Consolas,Menlo,monospace; +} + +/* line 28, ../../../hub/static/css/mod/diff-base.scss */ +.font-dejavu pre { + font-family: 'DejaVu Sans Mono','Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; +} + +/* line 32, ../../../hub/static/css/mod/diff-base.scss */ +.font-ubuntu pre { + font-family: 'Ubuntu Mono','Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; +} + +/* line 37, ../../../hub/static/css/mod/diff-base.scss */ +pre, code, tt { + font-size: 12px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + border: 0; +} + +/* line 43, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .normal { + background-color: #FFF; +} + +/* line 47, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .deletion { + color: black; + background-color: #FDD; +} +/* line 50, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .deletion .x, .highlight .deletion .c { + color: black; + background-color: #ffaaaa; +} + +/* line 56, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .insertion { + color: black; + background-color: #DFD; +} +/* line 59, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .insertion .i, .highlight .insertion .c { + color: black; + background-color: #aaffaa; +} + +/* line 65, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped { + color: #cacaca; + background-color: #f9f9f9; +} +/* line 69, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a { + color: #cacaca; + vertical-align: middle; +} +/* line 73, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a:hover { + text-decoration: none; +} +/* line 77, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a[data-type="after"], .highlight .skipped a[data-type="before"] { + font-size: 20px; +} + +/* line 266, ../../../hub/static/css/mod/commits.scss */ +#files.commentable tr td pre:hover { + background-color: #FFC; +} + +/* line 268, ../../../hub/static/css/mod/commits.scss */ +.full-commit { + margin: 10px 0; + padding: 8px 8px 0; + background: #E6F1F6; + border: 1px solid #C5D5DD; + border-radius: 4px; +} + +/* line 276, ../../../hub/static/css/mod/commits.scss */ +.full-commit .commit-meta { + margin-left: -8px; + width: 100%; + padding: 8px; + background: white; + border-top: 1px solid #D8E6EC; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +/* line 286, ../../../hub/static/css/mod/commits.scss */ +.full-commit .commit-desc { + display: block; + margin: -4px 0 10px 0; +} + +/* line 291, ../../../hub/static/css/mod/commits.scss */ +.full-commit .commit-desc pre { + max-width: 100%; + font-size: 14px; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); +} + +/* line 297, ../../../hub/static/css/mod/commits.scss */ +.full-commit .browse-button { + float: right; + margin: -3px -3px 0 0; + height: 26px; + padding: 0 10px; + line-height: 26px; + font-size: 13px; + font-weight: bold; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); + background: #EFF6F9; + background: -moz-linear-gradient(#EFF6F9, #DDECF3); + background: -webkit-linear-gradient(#EFF6F9, #DDECF3); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#eff6f9',endColorstr='#ddecf3')"; + border: 1px solid #CEDEE5; + border-radius: 3px; +} + +/* line 314, ../../../hub/static/css/mod/commits.scss */ +.full-commit p.commit-title { + margin: 0 0 8px 0; + font-size: 18px; + font-weight: bold; + color: #213F4D; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); +} + +/* line 322, ../../../hub/static/css/mod/commits.scss */ +.clearfix { + display: block; +} + +/* line 326, ../../../hub/static/css/mod/commits.scss */ +.full-commit .sha-block { + float: right; + margin-left: 15px; + color: #888; + font-size: 12px; +} + +/* line 333, ../../../hub/static/css/mod/commits.scss */ +.full-commit .authorship { + margin-top: -2px; + margin-left: -4px; + margin-bottom: -4px; + font-size: 14px; + color: #999; +} + +/* line 341, ../../../hub/static/css/mod/commits.scss */ +.full-commit .authorship .gravatar { + margin-top: -2px; + margin-right: 3px; + vertical-align: middle; + border-radius: 3px; +} + +/* line 347, ../../../hub/static/css/mod/commits.scss */ +#files { + position: relative; +} + +/* line 351, ../../../hub/static/css/mod/commits.scss */ +#files .file, .file-box { + border: 1px solid #CCC; + margin-bottom: 13px; + position: relative; + background-color: #DDD; +} + +/* line 358, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta, .file-box .meta { + overflow: hidden; + padding: 5px 10px; + font-size: 12px; + height: 33px; + text-align: left; + color: #555; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #D8D8D8; + background: #FAFAFA; + background: -moz-linear-gradient(#FAFAFA, #EAEAEA); + background: -webkit-linear-gradient(#FAFAFA, #EAEAEA); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; +} + +/* line 373, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .info, .file-box .meta .info { + float: left; + height: 33px; + line-height: 33px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; +} + +/* line 380, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .actions, .file-box .meta .actions { + float: right; + height: 33px; + line-height: 33px; + margin-top: 1px; +} + +/* line 387, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .actions li:first-child, .file-box .meta .actions li:first-child { + background: transparent; + margin-left: 0; + padding-left: 0; +} + +/* line 393, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .actions li, .file-box .meta .actions li { + list-style-type: none; + float: left; + margin: 0 0 0 7px; +} + +/* line 399, ../../../hub/static/css/mod/commits.scss */ +.button-group li { + margin: 0 !important; +} + +/* line 403, ../../../hub/static/css/mod/commits.scss */ +.pagination-older-newer a { + padding: .1em .3em; + margin: .2em; + text-decoration: none; + color: #369; + float: none; +} + +/* line 411, ../../../hub/static/css/mod/commits.scss */ +.pagination-older-newer a:hover, .pagination a:active { + background-color: transparent; + color: #36f; +} + +/* line 416, ../../../hub/static/css/mod/commits.scss */ +.pagination-older-newer span.disabled { + padding: .1em .3em; + margin: .2em; + color: #bbb; + float: none; +} + +/* line 423, ../../../hub/static/css/mod/commits.scss */ +.commit .sha-block, .commit .sha { + padding-right: 3px; + font-size: 11px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; +} + +/* line 429, ../../../hub/static/css/mod/commits.scss */ +#files .file .data .line_numbers, .file-box .data .line_numbers { + background-color: #ECECEC; + color: #AAA; + padding: 0 6px; + border-right: 1px solid #DDD; + text-align: right; + cursor: pointer; +} + +/* line 437, ../../../hub/static/css/mod/commits.scss */ +#files .file .data .line_numbers a { + color: #AAA; +} + +/* line 441, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-added:before { + content: "\f06b"; +} + +/* line 442, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-removed:before { + content: "\f06c"; +} + +/* line 443, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-modified:before { + content: "\f06d"; +} + +/* line 444, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-moved:before, .mini-icon-renamed:before { + content: "\f06e"; +} + +/* line 445, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-commit-comment:before { + content: "\f02b"; +} + +/* line 447, ../../../hub/static/css/mod/commits.scss */ +.mega-icon-beer:before { + content: "\f269"; +} + +/* line 448, ../../../hub/static/css/mod/commits.scss */ +.mega-icon-commit-comment:before { + content: "\f22b"; +} + +/* line 450, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .info span.icon, +#files .file .meta .info span.diffstat, +.file-box .meta .info span.icon { + line-height: 0; + float: left; + margin: 5px 5px 0 0; + padding: 3px; + background: #F7F7F7; + border: 1px solid #CCC; + border-right-color: #E5E5E5; + border-bottom-color: #E5E5E5; + border-radius: 3px; +} + +/* line 463, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .info span.diffstat { + height: 16px; + padding: 3px 6px; +} + +/* line 467, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .info span:first-child, +#files .file .meta .info .icon + span, +.file-box .meta .info span:first-child, +.file-box .meta .info .icon + span { + border-left: 0 none; + box-shadow: inset 0 0 0 transparent; + margin-left: 0; + padding-left: 0; +} + +/* line 477, ../../../hub/static/css/mod/commits.scss */ +.commit-meta.comment-row .mini-icon { + color: #939AA0; + margin: 0 2px 0 1px; + top: 2px; + text-decoration: none; +} + +/* line 478, ../../../hub/static/css/mod/commits.scss */ +#files .file .data.empty, .file-box .data.empty { + padding: 10px 15px; + color: #777; +} + +/* line 482, ../../../hub/static/css/mod/commits.scss */ +.timeout { + width: 873px; + height: 528px; + border: 1px solid #C5D5DD; + background: url("/static/img/timeout.jpg") #E6F1F6 no-repeat; + background-position: 90% 50%; + padding: 0 32px 0 33px; + border-radius: 3px; +} + +/* line 491, ../../../hub/static/css/mod/commits.scss */ +.timeout h3 { + color: white; + font-size: 18px; + font-weight: bold; + text-shadow: darkGray 1px 1px 0; + padding: 15px 0 15px 0; +} + +/* line 498, ../../../hub/static/css/mod/commits.scss */ +.timeout h3 strong { + font-size: 30px; + display: block; +} + +/* line 502, ../../../hub/static/css/mod/commits.scss */ +.timeout p { + color: white; +} + +/* line 506, ../../../hub/static/css/mod/commits.scss */ +.side-avatar { + position: absolute; + float: left; + margin-left: -60px; +} + +/* line 512, ../../../hub/static/css/mod/commits.scss */ +div.generated, div.binary { + text-align: center; + background-color: #ddd; + padding: 30px; +} + +/* line 518, ../../../hub/static/css/mod/commits.scss */ +.commit-history-header { + margin-bottom: 55px; +} +/* line 521, ../../../hub/static/css/mod/commits.scss */ +.commit-history-header #search-commits { + margin: 15px 5px; +} + +/* button list */ +/* line 3, ../../../hub/static/css/mod/file-blob.scss */ +.button-group { + display: inline-block; + overflow: hidden; + border: 1px solid #d4d4d4; + border-radius: 3px; + border-bottom-color: #bcbcbc; + background: #f5f5f5; + background: -moz-linear-gradient(#f5f5f5, #e5e5e5); + background: -webkit-linear-gradient(#f5f5f5, #e5e5e5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; +} + +/* line 4, ../../../hub/static/css/mod/file-blob.scss */ +.button-group li { + margin: 0 !important; + float: left; +} + +/* line 5, ../../../hub/static/css/mod/file-blob.scss */ +.button-group li:first-child .grouped-button { + border-left: none; + border-bottom-left-radius: 2px; + border-top-left-radius: 2px; +} + +/* line 6, ../../../hub/static/css/mod/file-blob.scss */ +.button-group li:last-child .grouped-button { + border-right: none; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 2px; +} + +/* line 7, ../../../hub/static/css/mod/file-blob.scss */ +.button-group .grouped-button { + float: left; + background: none; + border-bottom: none; + border-top: none; + border-left: 1px solid rgba(0, 0, 0, 0.1); + border-right: 1px solid rgba(255, 255, 255, 0.5); + border-radius: 0; + cursor: pointer; +} + +/* line 8, ../../../hub/static/css/mod/file-blob.scss */ +.button-group .minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line-no */ +/* line 12, ../../../hub/static/css/mod/file-blob.scss */ +#blob .file { + min-height: 78px; + position: relative; + overflow: auto; +} + +/* line 13, ../../../hub/static/css/mod/file-blob.scss */ +#blob .file .rawfile { + text-align: center; + background-color: #ddd; + padding: 30px; + position: relative; +} + +/* line 14, ../../../hub/static/css/mod/file-blob.scss */ +.file table { + width: 100%; + border-collapse: collapse; + border-spacing: 0; +} + +/* line 15, ../../../hub/static/css/mod/file-blob.scss */ +.file table td, .file table th { + vertical-align: top; + padding: 0; +} + +/* line 16, ../../../hub/static/css/mod/file-blob.scss */ +.file .data { + overflow: auto; +} + +/* line 18, ../../../hub/static/css/mod/file-blob.scss */ +.code { + width: 100%; +} + +/* line 19, ../../../hub/static/css/mod/file-blob.scss */ +.code .highlight pre { + margin: 0; + padding: 8px; + border: none; + background-color: #FFF; + white-space: pre; +} + +/* line 20, ../../../hub/static/css/mod/file-blob.scss */ +.code .highlight pre a { + display: block; +} + +/* line 23, ../../../hub/static/css/mod/file-blob.scss */ +.linenos .linenodiv pre { + background-color: #ECECEC; + padding: 8px; + border: none; + border-right: 1px solid #DDD; + text-align: right; + white-space: pre; +} + +/* line 24, ../../../hub/static/css/mod/file-blob.scss */ +.linenos .linenodiv pre a { + color: #AAA; + text-decoration: none; + white-space: nowrap; + line-height: 18px; +} + +/* line 25, ../../../hub/static/css/mod/file-blob.scss */ +.code .highlight pre, .linenos .linenodiv pre { + margin: 0; + line-height: 18px; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +/* line 32, ../../../hub/static/css/mod/file-blob.scss */ +.linenos { + padding: 0; +} + +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 400; + src: local("Source Code Pro"), local("SourceCodePro-Regular"), url("/static/css/fonts/SourceCodePro-Regular.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 500; + src: local("Source Code Pro Medium"), local("SourceCodePro-Medium"), url("/static/css/fonts/SourceCodePro-Medium.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 600; + src: local("Source Code Pro Semibold"), local("SourceCodePro-Semibold"), url("/static/css/fonts/SourceCodePro-Semibold.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 700; + src: local("Source Code Pro Bold"), local("SourceCodePro-Bold"), url("/static/css/fonts/SourceCodePro-Bold.woff") format("woff"); +} +/* line 3, ../../../hub/static/css/mod/diff-base.scss */ +.code pre, xmp, plaintext, listing { + display: block; + font-size: 13px; + font-family: 'Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; + white-space: pre; + margin: 0; + padding: 0; +} + +/* line 12, ../../../hub/static/css/mod/diff-base.scss */ +.code pre { + line-height: 18px; +} + +/* line 16, ../../../hub/static/css/mod/diff-base.scss */ +.font-consolas pre { + font-family: Consolas,'Source Code Pro',Courier,Monaco,Menlo,monospace; +} + +/* line 20, ../../../hub/static/css/mod/diff-base.scss */ +.font-monaco pre { + font-family: Monaco,'Source Code Pro',Courier,Consolas,Menlo,monospace; +} + +/* line 24, ../../../hub/static/css/mod/diff-base.scss */ +.font-courier pre { + font-family: Courier,'Source Code Pro',Monaco,Consolas,Menlo,monospace; +} + +/* line 28, ../../../hub/static/css/mod/diff-base.scss */ +.font-dejavu pre { + font-family: 'DejaVu Sans Mono','Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; +} + +/* line 32, ../../../hub/static/css/mod/diff-base.scss */ +.font-ubuntu pre { + font-family: 'Ubuntu Mono','Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; +} + +/* line 37, ../../../hub/static/css/mod/diff-base.scss */ +pre, code, tt { + font-size: 12px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + border: 0; +} + +/* line 43, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .normal { + background-color: #FFF; +} + +/* line 47, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .deletion { + color: black; + background-color: #FDD; +} +/* line 50, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .deletion .x, .highlight .deletion .c { + color: black; + background-color: #ffaaaa; +} + +/* line 56, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .insertion { + color: black; + background-color: #DFD; +} +/* line 59, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .insertion .i, .highlight .insertion .c { + color: black; + background-color: #aaffaa; +} + +/* line 65, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped { + color: #cacaca; + background-color: #f9f9f9; +} +/* line 69, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a { + color: #cacaca; + vertical-align: middle; +} +/* line 73, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a:hover { + text-decoration: none; +} +/* line 77, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a[data-type="after"], .highlight .skipped a[data-type="before"] { + font-size: 20px; +} + +/* line 1, ../../../hub/static/css/mod/colorcube.scss */ +.colorcube { + position: absolute; + width: 30px; + height: 30px; + border: 1px solid #DDD; +} + +/* line 2, ../../../hub/static/css/mod/colorcube.scss */ +.colorcube::before { + content: ""; + display: block; + height: 0; + width: 0; + border: 5px solid #DDD; + border-width: 5px; + border-color: #DDD transparent transparent transparent; + left: 10px; + top: 30px; + float: left; + position: absolute; +} + +/* line 5, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .line_numbers, .file-box .data .line_numbers { + background-color: #ECECEC; + color: #AAA; + padding: 0 2px 0 16px; + border-right: 1px solid #DDD; + text-align: right; + cursor: pointer; +} +/* line 12, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .line_numbers.deletion, .file-box .data .line_numbers.deletion { + color: #AAA; + background-color: #f7c8c8; +} +/* line 16, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .line_numbers.insertion, .file-box .data .line_numbers.insertion { + color: #AAA; + background-color: #ceffce; +} + +/* line 21, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .line_numbers a { + color: #AAA; +} + +/* line 24, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .code { + width: 100%; +} + +/* line 28, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .side { + overflow-x: none; + display: none; +} + +/* line 33, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .side .file-col { + width: 50%; + float: left; + overflow-x: auto; +} + +/* line 40, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .diff-table { + border-collapse: collapse; +} + +/* line 44, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files.commentable tr td pre:hover { + background-color: #FFC; +} + +/* line 46, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .diff-table pre { + border-radius: 0px; +} + +/* line 48, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data table, .file-box .data table { + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + font-size: 12px; + line-height: 1.4; +} + +/* line 54, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .file-diff-line span.color { + cursor: default; +} + +/* Comment Bubble */ +/* line 58, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file-diff-line .add-bubble { + position: absolute; + left: 0; + width: 25px; + height: 16px; + margin-top: 0; + cursor: pointer; + opacity: 0; + color: #4183C4; +} + +/* line 69, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file-diff-line:hover .add-bubble { + opacity: 1; +} + +/* Comment Bubble icons */ +/* line 72, ../../../hub/static/css/mod/file-diff-blob.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 83, ../../../hub/static/css/mod/file-diff-blob.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 91, ../../../hub/static/css/mod/file-diff-blob.scss */ +.mini-icon-add-comment::before { + content: "\f06f"; +} + +/* line 93, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container:first-child:after { + margin: -18px 0 0; +} + +/* line 97, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container:after { + background: none repeat scroll 0 0 #fff; + content: ""; + display: block; + height: 2px; + margin: -16px 0 0; + position: absolute; + left: 0px; + width: 938px; +} + +/* line 109, ../../../hub/static/css/mod/file-diff-blob.scss */ +.data .line-numbers-skipped { + position: absolute; + width: 79px; + background-color: #f5f5f5; + border-right: 1px solid #ccc; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; +} + +/* line 119, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .skipped-top, .skipped-container .skipped-bottom { + height: 18px; + background-color: #f5f5f5; +} + +/* line 124, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-top::before { + background: #fff; + border-bottom: 1px solid #ccc; + border-top: 1px solid #ccc; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + content: ""; + display: block; + height: 4px; + position: relative; + top: -1px; + margin-left: -1px; +} + +/* line 140, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .ellipsis:hover { + background-color: #e6e6e6; + border-color: #999; +} + +/* line 145, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .ellipsis { + background: #f5f5f5; + border: 1px solid #ccc; + -moz-border-radius: 3px; + border-radius: 3px; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + box-shadow: 0 0 0 2px #fff; + cursor: pointer; + display: block; + float: left; + font-family: Arial, sans-serif; + font-size: 20px; + text-align: center; + color: #707070; + height: 16px; + line-height: 6px; + margin: 0 0 0 5px; + padding: 0; + position: absolute; + width: 30px; + z-index: 10; +} + +/* line 170, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-top .ellipsis { + margin-top: -10px; +} + +/* line 174, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .ellipsis::before, .skipped-container .ellipsis::after { + border: 1px solid #ccc; + -moz-border-radius: 4px; + border-radius: 4px; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + content: ""; + height: 9px; + left: -4px; + width: 36px; + position: absolute; +} + +/* line 188, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .ellipsis::before { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + content: "\2026"; + padding: 2px 0 0; + top: -4px; +} + +/* line 197, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .ellipsis::after { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; + bottom: -4px; + height: 10px; +} + +/* line 206, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .toggle_whitespace:hover { + background-color: #e6e6e6; + border-color: #999; +} + +/* line 211, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .toggle_whitespace { + background: #f5f5f5; + border: 1px solid #ccc; + -moz-border-radius: 3px; + border-radius: 3px; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + box-shadow: 0 0 0 2px #fff; + cursor: pointer; + display: block; + float: left; + font-family: Arial, sans-serif; + font-size: 16px; + text-align: center; + color: #707070; + height: 16px; + line-height: 6px; + margin: 0 0 0 44px; + padding: 0; + position: absolute; + width: 30px; + z-index: 10; +} + +/* line 236, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-top .toggle_whitespace { + margin-top: -10px; +} + +/* line 240, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .toggle_whitespace::before, .skipped-container .toggle_whitespace::after { + border: 1px solid #ccc; + -moz-border-radius: 4px; + border-radius: 4px; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + content: ""; + height: 9px; + left: -4px; + width: 36px; + position: absolute; +} + +/* line 254, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .toggle_whitespace::before { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + content: "\2423"; + padding: 2px 0 0; + top: -4px; +} + +/* line 263, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .toggle_whitespace::after { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; + bottom: -4px; + height: 10px; +} + +/* preview comment form style */ +/* line 2, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav { + margin: 10px 0; + border-bottom: 1px solid #DDD; + height: 35px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs { + display: inline-block; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs > li { + display: inline-block; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab { + display: inline-block; + margin-bottom: -1px; + padding: 8px 12px 9px; + border: 1px solid transparent; + border-bottom: 0; + font-size: 14px; + color: #666; + text-decoration: none; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab.selected { + border-color: #DDD; + border-radius: 3px 3px 0 0; + background-color: white; + color: #333; + font-weight: bold; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab:hover { + text-decoration: none; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav { + position: relative; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav ul.tabnav-tabs { + padding-left: 10px; +} + +/* line 10, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 0 10px 10px; +} + +/* line 11, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form #preview_bucket .content-body { + padding: 10px; + min-height: 132px; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form.tab-content { + overflow: initial; + position: relative; +} + +/* line 2, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 10px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-actions { + padding: 0; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + position: relative; + border: 3px solid #EEE; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + padding: 0; + background: #EEE; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content .write-content { + padding: 0 10px 10px; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; + margin: 0; +} + +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary, button.primary.classy:disabled, button.primary.classy.disabled, button.primary.classy:disabled:hover, button.primary.classy.disabled:disabled:hover, button.classy:disabled:hover.primary, button.classy.disabled:disabled:hover.primary { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4); + border-color: #74BB5A; + border-bottom-color: #509338; + background: #8ADD6D; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#8add6d', endColorstr='#60b044')"; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); + background-image: -webkit-linear-gradient(top, #8ADD6D, #60B044); +} + +/* line 2, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary.disabled { + opacity: 0.5; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy, +button.classy:disabled, +button.classy.disabled, +a.button.classy:disabled, +a.button.classy.disabled, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover:disabled, +a.button.classy.disabled:hover, +a.button.classy, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy:disabled:hover, +a.button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover { + display: inline-block; + padding: 8px 15px; + line-height: normal; + position: relative; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 12px; + font-weight: bold; + color: #666; + text-shadow: 0 1px rgba(255, 255, 255, 0.9); + background: whiteSmoke; + background: -moz-linear-gradient(whiteSmoke, #E5E5E5); + background: -webkit-linear-gradient(whiteSmoke, #E5E5E5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; + border-radius: 3px; + border: 1px solid #DDD; + border-bottom-color: #BBB; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* ================================== *\ + * Zen Form + * ================================== */ +/* line 6, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + position: fixed; + z-index: 99999; + top: 0; + left: 0; + right: 0; + bottom: 0; + padding: 24px 30px 24px 24px; +} + +/* line 16, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-input-wrap { + max-width: 640px; + position: relative; + margin: 0 auto; +} + +/** + * Buttons style + */ +/* line 25, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button, +.zen-forms-theme-switch { + position: absolute; + width: 18px; + height: 18px; + text-align: center; + top: 10px; + right: 10px; + font-size: 24px; + color: #516066; + cursor: pointer; + line-height: 1; +} + +/* line 39, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-theme-switch { + top: 28px; + font-size: 34px; +} + +/* line 44, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button:hover, +.zen-forms-theme-switch:hover { + color: #667981; +} + +/** + * Inputs basic style + */ +/* line 52, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + padding: 8px 0; + width: 100%; + background: none; + border: none; + margin-bottom: 24px; + cursor: pointer; +} + +/* line 62, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus, +.zen-forms textarea:focus { + cursor: text; +} + +/* line 67, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms textarea { + resize: none; +} + +/* line 71, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + cursor: pointer; + display: none; + padding: 8px 3; + position: absolute; + top: 0; + width: 100%; +} + +/* line 80, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms .empty + label { + display: block; +} + +/* line 84, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus + label, +.zen-forms textarea:focus + label { + display: none; +} + +/* line 89, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms :focus { + outline-color: transparent; + outline-style: none; +} + +/** + * Dark theme + */ +/* line 97, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + background: #151a1c; +} + +/* line 101, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + color: #516066; +} + +/* line 105, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + color: #667981; +} + +/** + * Light theme + */ +/* line 113, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme { + background: #fefefe; +} + +/* line 117, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme label { + color: #959697; +} + +/* line 121, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme input, +.zen-forms.light-theme textarea { + color: #707071; +} + +/* line 4, ../../../hub/static/css/mod/zen-forms.scss */ +.write-content .enable-fullscreen { + position: absolute; + top: 5px; + right: 16px; + color: #333333; + opacity: .5; + line-height: 1em; +} + +/* line 5, ../../../hub/static/css/mod/zen-forms.scss */ +.mini-icon-fullscreen::before { + content: ""; +} + +/* line 6, ../../../hub/static/css/mod/zen-forms.scss */ +.fullscreen-overlay textarea, .zen-forms textarea { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + height: 100%; + padding: 20px; + border: 0; + font-size: 21px; + line-height: 1.6em; + resize: none; + -moz-transition: color 0.15s ease-in 0; + -webkit-transition: color 0.15s ease-in 0; + transition: color 0.15s ease-in 0; + box-shadow: none; +} + +/* line 7, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms.light-theme textarea { + background: #fff; + color: #999999; +} + +/* line 8, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms .zen-forms-input-wrap { + width: 100%; + height: 100%; +} + +/* line 9, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms label[for^=zen-forms-input] { + display: none; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-zen.scss */ +.previewable-comment-form .zen-enabled textarea { + padding: 10px 18px 10px 10px; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled { + position: relative; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled .go-zen { + position: absolute; + right: 15px; + top: 5px; +} + +/* line 1, ../../../hub/static/css/mod/loader.scss */ +.loader { + display: none; + position: absolute; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + background-color: #eee; +} + +/* line 2, ../../../hub/static/css/mod/loader.scss */ +.loader .spinner { + display: block; + width: 32px; + height: 32px; + margin: 0 auto; + top: 121px; + position: relative; + background: url(/static/img/spinner.gif) no-repeat; +} + +/* line 1, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view { + position: absolute; + top: 0; + left: 0; + display: none; + margin-top: 18px; + background: white; + border: 1px solid #DDD; + border-radius: 3px; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + min-width: 120px; + z-index: 10; +} + +/* line 15, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur { + background: #3366FF; + color: white; +} + +/* line 19, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur small { + color: white; +} + +/* line 22, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view strong { + color: #3366FF; +} + +/* line 25, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur strong { + color: white; + font: bold; +} + +/* line 29, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul { + /* width: 100px; */ + list-style: none; + padding: 0; + margin: auto; +} + +/* line 35, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul li { + display: block; + padding: 5px 10px; + border-bottom: 1px solid #DDD; + cursor: pointer; + /* border-top: 1px solid #C8C8C8; */ +} + +/* line 42, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view small { + font-size: smaller; + color: #777; + font-weight: normal; +} + +/* line 9, ../../../hub/static/css/mod/comment-form.scss */ +.side-avatar { + margin-left: 0; +} + +/* fix li header for newer version of bootstrap */ +/* line 12, ../../../hub/static/css/mod/comment-form.scss */ +.comment-form-head li { + line-height: 18px; +} + +/* line 16, ../../../hub/static/css/mod/comment-form.scss */ +#new_comment .form-content { + width: 880px; + margin-left: 60px; +} + +/* line 18, ../../../hub/static/css/mod/comment-form.scss */ +.discussion-bubble-avatar { + position: relative; + float: left; + border-radius: 3px; +} + +/* line 19, ../../../hub/static/css/mod/comment-form.scss */ +.discussion-bubble-inner { + min-height: 60px; + border: 1px solid #CACACA; + background-color: white; +} + +/* line 1, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body { + padding: 30px; +} + +/* line 4, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body > :first-child { + margin-top: 0 !important; +} + +/* line 7, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body h1, +.markdown-body h2, +.markdown-body h3, +.markdown-body h4, +.markdown-body h5, +.markdown-body h6 { + margin: 20px 0 10px; + padding: 0; + font-weight: bold; + -webkit-font-smoothing: antialiased; + cursor: text; + position: relative; +} + +/* line 20, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body h2 { + font-size: 24px; + border-bottom: 1px solid #CCC; + color: black; +} + +/* line 25, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body, +.markdown-body p { + font-size: 14px; + line-height: 1.6; +} + +/* line 30, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body p, +.markdown-body blockquote, +.markdown-body ul, +.markdown-body ol, +.markdown-body dl, +.markdown-body table, +.markdown-body pre { + margin: 15px 0; +} + +/* line 39, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul, +.markdown-body ol { + padding-left: 30px; +} + +/* line 43, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul li { + line-height: 1.6; +} + +/* line 46, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul { + list-style: disc; +} + +/* line 49, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ol { + list-style: decimal; +} + +/* line 52, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table { + width: 100%; +} + +/* line 55, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table caption + thead tr:first-child th, +.markdown-body table caption + thead tr:first-child td, +.markdown-body table colgroup + thead tr:first-child th, +.markdown-body table colgroup + thead tr:first-child td, +.markdown-body table thead:first-child tr:first-child th, +.markdown-body table thead:first-child tr:first-child td { + border-top: 0; +} + +/* line 63, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table thead th { + vertical-align: bottom; +} + +/* line 66, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th { + font-weight: bold; +} + +/* line 69, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th, +.markdown-body table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #ddd; +} + +/* line 77, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th, +.markdown-body table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #ddd; +} + +/* line 85, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table tbody > tr:nth-child(odd) > td, +.markdown-body table tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} + +/* line 89, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body .progress-percentage { + color: #888; +} + +/* line 93, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page { + padding: 0px; +} + +/* line 96, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page h1, +.markdown-page h2, +.markdown-page h3, +.markdown-page h4, +.markdown-page h5, +.markdown-page h6 { + position: static; +} + +/* line 104, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page pre { + font-family: Consolas, 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 14px; +} + +/* line 108, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page .label { + background-color: transparent; +} + +/* line 111, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page dd { + margin-left: 1.5em; +} + +/* line 114, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body code { + white-space: pre-wrap; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary, button.primary.classy:disabled, button.primary.classy.disabled, button.primary.classy:disabled:hover, button.primary.classy.disabled:disabled:hover, button.classy:disabled:hover.primary, button.classy.disabled:disabled:hover.primary { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4); + border-color: #74BB5A; + border-bottom-color: #509338; + background: #8ADD6D; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#8add6d', endColorstr='#60b044')"; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); + background-image: -webkit-linear-gradient(top, #8ADD6D, #60B044); +} + +/* line 2, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary.disabled { + opacity: 0.5; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy, +button.classy:disabled, +button.classy.disabled, +a.button.classy:disabled, +a.button.classy.disabled, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover:disabled, +a.button.classy.disabled:hover, +a.button.classy, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy:disabled:hover, +a.button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover { + display: inline-block; + padding: 8px 15px; + line-height: normal; + position: relative; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 12px; + font-weight: bold; + color: #666; + text-shadow: 0 1px rgba(255, 255, 255, 0.9); + background: whiteSmoke; + background: -moz-linear-gradient(whiteSmoke, #E5E5E5); + background: -webkit-linear-gradient(whiteSmoke, #E5E5E5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; + border-radius: 3px; + border: 1px solid #DDD; + border-bottom-color: #BBB; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form.tab-content { + overflow: initial; + position: relative; +} + +/* line 2, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 10px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-actions { + padding: 0; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + position: relative; + border: 3px solid #EEE; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + padding: 0; + background: #EEE; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content .write-content { + padding: 0 10px 10px; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; + margin: 0; +} + +/* line 5, ../../../hub/static/css/mod/inline-comment-form.scss */ +.show-inline-comment-form { + margin: 10px; +} + +/* line 6, ../../../hub/static/css/mod/inline-comment-form.scss */ +tr.inline-comments.show-inline-comment-form .show-inline-comment-form { + display: none; +} + +/* line 7, ../../../hub/static/css/mod/inline-comment-form.scss */ +.inline-comments .comment-count { + overflow: hidden; + padding: 0 !important; + border: solid #DDD; + border-width: 1px 0; + vertical-align: top; + text-align: center !important; +} + +/* line 8, ../../../hub/static/css/mod/inline-comment-form.scss */ +.inline-comments .counter { + display: inline-block; + padding: 2px 8px 6px; + font-family: 11px/1.2 bold Helvetica,arial,freesans,clean,sans-serif !important; + color: #333 !important; + border: 1px solid #C0CCD0; + border-top: 0; + border-radius: 0 0 3px 3px; + cursor: default !important; +} + +/* line 9, ../../../hub/static/css/mod/inline-comment-form.scss */ +#files .file.show-inline-notes tr.inline-comments { + display: table-row; +} + +/* line 10, ../../../hub/static/css/mod/inline-comment-form.scss */ +.inline-comments .line-comments { + overflow: auto; + padding: 0; + border-top: 1px solid #CCC; + border-bottom: 1px solid #DDD; + background: #fff; + font-family: Helvetica, arial, freesans, clean, sans-serif !important; +} + +/* line 11, ../../../hub/static/css/mod/inline-comment-form.scss */ +.inline-comment-form { + max-width: 870px; +} + +/* line 12, ../../../hub/static/css/mod/inline-comment-form.scss */ +.inline-comment-form form { + margin: 0; +} + +/* line 14, ../../../hub/static/css/mod/inline-comment-form.scss */ +.inline-comments .form-actions { + padding: 0 10px 10px; + margin: 0; +} + +/* line 15, ../../../hub/static/css/mod/inline-comment-form.scss */ +.form-content .form-actions { + background-color: transparent; +} + +/* line 16, ../../../hub/static/css/mod/inline-comment-form.scss */ +.form-actions { + text-align: right; + padding-bottom: 5px; + background: #fff; + border: none; +} + +/* line 17, ../../../hub/static/css/mod/inline-comment-form.scss */ +.form-actions .optional { + display: block; + padding-top: 8px; + float: left; + margin-right: 15px; + padding-top: 3px; +} + +/* preview comment form style */ +/* line 2, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav { + margin: 10px 0; + border-bottom: 1px solid #DDD; + height: 35px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs { + display: inline-block; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs > li { + display: inline-block; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab { + display: inline-block; + margin-bottom: -1px; + padding: 8px 12px 9px; + border: 1px solid transparent; + border-bottom: 0; + font-size: 14px; + color: #666; + text-decoration: none; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab.selected { + border-color: #DDD; + border-radius: 3px 3px 0 0; + background-color: white; + color: #333; + font-weight: bold; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab:hover { + text-decoration: none; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav { + position: relative; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav ul.tabnav-tabs { + padding-left: 10px; +} + +/* line 10, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 0 10px 10px; +} + +/* line 11, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form #preview_bucket .content-body { + padding: 10px; + min-height: 132px; +} + +/* line 5, ../../../hub/static/css/mod/inline-comment.scss */ +.inline-comments .comment-holder { + max-width: 850px; + margin: 10px; +} + +/* line 6, ../../../hub/static/css/mod/inline-comment.scss */ +.inline-comments .comment { + margin: 5px 0 !important; + border: 1px solid #CACACA; +} + +/* line 7, ../../../hub/static/css/mod/inline-comment.scss */ +.comment-header { + height: 33px; + padding: 0 10px 0 6px; + border-bottom: 1px solid #CCC; + background: #F8F8F8; + font-size: 12px; + background-image: -webkit-linear-gradient(top, #F4FAF6, #D8E5DD); +} + +/* line 8, ../../../hub/static/css/mod/inline-comment.scss */ +.comment-header .comment-header-gravatar { + display: inline-block; + margin-right: 3px; + vertical-align: middle; + border-radius: 3px; +} + +/* line 9, ../../../hub/static/css/mod/inline-comment.scss */ +.comment-header .comment-header-author { + display: inline-block; + max-width: 600px; + height: 33px; + line-height: 33px; + font-weight: bold; + color: #222; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.7); + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/inline-comment.scss */ +.comment-header .comment-header-right { + float: right; +} + +/* line 11, ../../../hub/static/css/mod/inline-comment.scss */ +.comment-header .comment-header-date { + display: inline-block; + margin: 0; + height: 33px; + font-size: 11px; + ine-height: 33px; + font-style: normal; + color: #777; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.7); + line-height: 33px; +} + +/* line 12, ../../../hub/static/css/mod/inline-comment.scss */ +.mini-icon-delete-note::before, .mini-icon-remove-close::before { + content: ""; +} + +/* line 13, ../../../hub/static/css/mod/inline-comment.scss */ +.mini-icon-edit:before { + content: ""; +} + +/* line 14, ../../../hub/static/css/mod/inline-comment.scss */ +.comment-header .comment-header-actions { + display: inline-block; + vertical-align: middle; + font-size: 13px; + margin-left: 7px; +} + +/* line 15, ../../../hub/static/css/mod/inline-comment.scss */ +.comment-header .mini-icon { + color: #939AA0; + margin: 0 2px 0 1px; + position: relative; + top: 2px; +} + +/* line 16, ../../../hub/static/css/mod/inline-comment.scss */ +.comment-header .comment-header-actions li .mini-icon { + -moz-transition: all 0.15s ease-in 0; + -webkit-transition: all 0.15s ease-in 0; + text-decoration: none; +} + +/* line 17, ../../../hub/static/css/mod/inline-comment.scss */ +.comment-header .comment-header-date { + color: #939AA0; + text-decoration: none; +} + +/* line 18, ../../../hub/static/css/mod/inline-comment.scss */ +.comment-content { + padding: 0; + color: #333; + font-size: 12px; + background: #FBFBFB; +} + +/* line 19, ../../../hub/static/css/mod/inline-comment.scss */ +.comment-content .comment-body { + padding: 10px; + font-size: 13px; + overflow: auto; + width: 100%; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +/* line 20, ../../../hub/static/css/mod/inline-comment.scss */ +.comment-header .comment-header-actions li { + list-style-type: none; + float: left; + margin: 0 0 0 8px; +} + +/* line 1, ../../../hub/static/css/mod/user-card.scss */ +.user-card { + position: absolute; + padding: 3px 5px 5px; + min-height: 68px; + width: 210px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +/* line 2, ../../../hub/static/css/mod/user-card.scss */ +.user-card .desc { + margin-left: 3px; +} + +/* line 3, ../../../hub/static/css/mod/user-card.scss */ +.user-card .avatar-wrap { + width: 46px; + height: 36px; + float: left; + margin-right: 6px; + border-right: 1px solid #BEBEBE; +} + +/* line 4, ../../../hub/static/css/mod/user-card.scss */ +.user-card .badge-item { + float: left; + width: 30px; + height: 30px; + border: none; + padding: 2px; + background-color: white; + line-height: 0; + margin-right: 0.7em; +} + +/* line 5, ../../../hub/static/css/mod/user-card.scss */ +.user-card .title { + padding: 0 0 0.25em 0; +} + +/* line 6, ../../../hub/static/css/mod/user-card.scss */ +.user-card .desc .avatar { + float: left; + width: 30px; + height: 30px; + padding: 2px; + background-color: white; + line-height: 0; + margin-right: 0.7em; +} + +/* line 1, ../../../hub/static/css/mod/team-card.scss */ +.team-card { + position: absolute; + padding: 6px 10px; + min-height: 68px; + width: 236px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + overflow: hidden; +} +/* line 10, ../../../hub/static/css/mod/team-card.scss */ +.team-card .pic { + float: right; + max-height: 50px; + margin: 6px 0 0 10px; +} +/* line 15, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content { + word-wrap: break-word; +} +/* line 17, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .title { + margin: 6px 0; + font-size: 15px; + overflow: hidden; + white-space: nowrap; +} +/* line 23, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .info { + position: relative; + margin-top: 10px; + font-size: 13px; +} +/* line 27, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .info .desc { + white-space: nowrap; + overflow: hidden; +} + +/* line 35, ../../../hub/static/css/mod/team-card.scss */ +.member { + border-top: solid 1px #eaeaea; + padding-top: 8px; + height: 26px; +} +/* line 39, ../../../hub/static/css/mod/team-card.scss */ +.member .more-members { + float: right; + width: 24px; + height: 24px; + line-height: 26px; + text-align: center; + border: 1px solid #eaeaea; + background: #eaeaea; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 53, ../../../hub/static/css/mod/team-card.scss */ +.member .members li { + float: left; +} +/* line 55, ../../../hub/static/css/mod/team-card.scss */ +.member .members li a { + display: block; + width: 26px; + height: 26px; + overflow: hidden; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 65, ../../../hub/static/css/mod/team-card.scss */ +.member .members li a img { + width: 26px; + height: 26px; +} + +/* line 73, ../../../hub/static/css/mod/team-card.scss */ +.cf { + zoom: 1; +} +/* line 75, ../../../hub/static/css/mod/team-card.scss */ +.cf:before { + content: ""; + display: table; +} +/* line 79, ../../../hub/static/css/mod/team-card.scss */ +.cf .cf:after { + clear: both; + content: ""; + display: table; +} + +/* line 1, ../../../hub/static/css/mod/quick-emoji.scss */ +.quick-emoji { + margin-right: 10px; +} +/* line 4, ../../../hub/static/css/mod/quick-emoji.scss */ +.quick-emoji .description { + text-align: center; + color: #999; +} +/* line 9, ../../../hub/static/css/mod/quick-emoji.scss */ +.quick-emoji .emojis { + overflow-x: hidden; + overflow-y: scroll; + word-wrap: break-word; + word-break: break-all; + width: 290px; + height: 260px; +} +/* line 17, ../../../hub/static/css/mod/quick-emoji.scss */ +.quick-emoji .emojis a { + display: block; + float: left; + width: 25px; + height: 25px; + padding: 2px; + border: 1px solid white; +} +/* line 24, ../../../hub/static/css/mod/quick-emoji.scss */ +.quick-emoji .emojis a:hover { + background: #eef; + border: 1px solid #aad; +} + +/* line 2, ../../../hub/static/css/mod/comment.scss */ +.full-comment .comment-row { + padding: 0; + background: #FBFBFB; + margin-bottom: 20px; + border-radius: 3px; + border: 3px solid #eee; +} + +/* line 9, ../../../hub/static/css/mod/comment.scss */ +.full-comment .comment-row:before { + position: relative; + content: ""; + display: block; + height: 0; + width: 0; + border: 10px solid #EEE; + border-width: 10px 10px 10px 0; + border-color: transparent #EEE transparent transparent; + left: -12px; + top: 15px; + float: left; +} + +/* line 22, ../../../hub/static/css/mod/comment.scss */ +.full-comment .side-avatar { + position: relative; + float: left; + border-radius: 3px; + margin-left: -70px; +} + +/* line 28, ../../../hub/static/css/mod/comment.scss */ +.full-comment { + width: 63em; + max-width: 100%; + margin-left: auto; +} + +/* line 33, ../../../hub/static/css/mod/comment.scss */ +.full-comment .comment-header { + height: 23px; + color: #333; + margin: 0; + font-size: 12px; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.7); + white-space: nowrap; + text-overflow: ellipsis; + padding: 3px 10px 0 6px; + border-bottom: 1px solid #CCC; + background: -webkit-linear-gradient(#f8fbfc, #dde8eb); + background-image: linear-gradient(#f8f8f8, #e1e1e1); +} + +/* line 46, ../../../hub/static/css/mod/comment.scss */ +#new_comment .form-content { + width: auto; + position: relative; + border: 3px solid #EEE; +} + +/* line 51, ../../../hub/static/css/mod/comment.scss */ +.form-content:before { + content: ""; + display: block; + height: 0; + width: 0; + border: 10px solid #EEE; + border-width: 10px 10px 10px 0; + border-color: transparent #EEE transparent transparent; + left: -12px; + top: 15px; + float: left; + position: absolute; +} + +/* line 15, ../../../hub/static/css/app/commit.scss */ +.quick-emoji .emojis { + height: 120px; +} + +/* line 19, ../../../hub/static/css/app/commit.scss */ +#files .comment p { + padding: 5px; + margin: 0; +} diff --git a/dist/css/app/commits.css b/dist/css/app/commits.css new file mode 100644 index 0000000..b9f71e4 --- /dev/null +++ b/dist/css/app/commits.css @@ -0,0 +1,7683 @@ +@charset "UTF-8"; +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* TODO Refactor the following mods into components */ +/* For other page that still depends on commits.scss */ +/* preview comment form style */ +/* line 2, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav { + margin: 10px 0; + border-bottom: 1px solid #DDD; + height: 35px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs { + display: inline-block; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs > li { + display: inline-block; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab { + display: inline-block; + margin-bottom: -1px; + padding: 8px 12px 9px; + border: 1px solid transparent; + border-bottom: 0; + font-size: 14px; + color: #666; + text-decoration: none; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab.selected { + border-color: #DDD; + border-radius: 3px 3px 0 0; + background-color: white; + color: #333; + font-weight: bold; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab:hover { + text-decoration: none; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav { + position: relative; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav ul.tabnav-tabs { + padding-left: 10px; +} + +/* line 10, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 0 10px 10px; +} + +/* line 11, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form #preview_bucket .content-body { + padding: 10px; + min-height: 132px; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form.tab-content { + overflow: initial; + position: relative; +} + +/* line 2, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 10px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-actions { + padding: 0; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + position: relative; + border: 3px solid #EEE; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + padding: 0; + background: #EEE; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content .write-content { + padding: 0 10px 10px; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; + margin: 0; +} + +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary, button.primary.classy:disabled, button.primary.classy.disabled, button.primary.classy:disabled:hover, button.primary.classy.disabled:disabled:hover, button.classy:disabled:hover.primary, button.classy.disabled:disabled:hover.primary { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4); + border-color: #74BB5A; + border-bottom-color: #509338; + background: #8ADD6D; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#8add6d', endColorstr='#60b044')"; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); + background-image: -webkit-linear-gradient(top, #8ADD6D, #60B044); +} + +/* line 2, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary.disabled { + opacity: 0.5; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy, +button.classy:disabled, +button.classy.disabled, +a.button.classy:disabled, +a.button.classy.disabled, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover:disabled, +a.button.classy.disabled:hover, +a.button.classy, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy:disabled:hover, +a.button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover { + display: inline-block; + padding: 8px 15px; + line-height: normal; + position: relative; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 12px; + font-weight: bold; + color: #666; + text-shadow: 0 1px rgba(255, 255, 255, 0.9); + background: whiteSmoke; + background: -moz-linear-gradient(whiteSmoke, #E5E5E5); + background: -webkit-linear-gradient(whiteSmoke, #E5E5E5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; + border-radius: 3px; + border: 1px solid #DDD; + border-bottom-color: #BBB; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* ================================== *\ + * Zen Form + * ================================== */ +/* line 6, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + position: fixed; + z-index: 99999; + top: 0; + left: 0; + right: 0; + bottom: 0; + padding: 24px 30px 24px 24px; +} + +/* line 16, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-input-wrap { + max-width: 640px; + position: relative; + margin: 0 auto; +} + +/** + * Buttons style + */ +/* line 25, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button, +.zen-forms-theme-switch { + position: absolute; + width: 18px; + height: 18px; + text-align: center; + top: 10px; + right: 10px; + font-size: 24px; + color: #516066; + cursor: pointer; + line-height: 1; +} + +/* line 39, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-theme-switch { + top: 28px; + font-size: 34px; +} + +/* line 44, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button:hover, +.zen-forms-theme-switch:hover { + color: #667981; +} + +/** + * Inputs basic style + */ +/* line 52, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + padding: 8px 0; + width: 100%; + background: none; + border: none; + margin-bottom: 24px; + cursor: pointer; +} + +/* line 62, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus, +.zen-forms textarea:focus { + cursor: text; +} + +/* line 67, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms textarea { + resize: none; +} + +/* line 71, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + cursor: pointer; + display: none; + padding: 8px 3; + position: absolute; + top: 0; + width: 100%; +} + +/* line 80, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms .empty + label { + display: block; +} + +/* line 84, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus + label, +.zen-forms textarea:focus + label { + display: none; +} + +/* line 89, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms :focus { + outline-color: transparent; + outline-style: none; +} + +/** + * Dark theme + */ +/* line 97, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + background: #151a1c; +} + +/* line 101, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + color: #516066; +} + +/* line 105, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + color: #667981; +} + +/** + * Light theme + */ +/* line 113, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme { + background: #fefefe; +} + +/* line 117, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme label { + color: #959697; +} + +/* line 121, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme input, +.zen-forms.light-theme textarea { + color: #707071; +} + +/* line 4, ../../../hub/static/css/mod/zen-forms.scss */ +.write-content .enable-fullscreen { + position: absolute; + top: 5px; + right: 16px; + color: #333333; + opacity: .5; + line-height: 1em; +} + +/* line 5, ../../../hub/static/css/mod/zen-forms.scss */ +.mini-icon-fullscreen::before { + content: ""; +} + +/* line 6, ../../../hub/static/css/mod/zen-forms.scss */ +.fullscreen-overlay textarea, .zen-forms textarea { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + height: 100%; + padding: 20px; + border: 0; + font-size: 21px; + line-height: 1.6em; + resize: none; + -moz-transition: color 0.15s ease-in 0; + -webkit-transition: color 0.15s ease-in 0; + transition: color 0.15s ease-in 0; + box-shadow: none; +} + +/* line 7, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms.light-theme textarea { + background: #fff; + color: #999999; +} + +/* line 8, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms .zen-forms-input-wrap { + width: 100%; + height: 100%; +} + +/* line 9, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms label[for^=zen-forms-input] { + display: none; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-zen.scss */ +.previewable-comment-form .zen-enabled textarea { + padding: 10px 18px 10px 10px; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled { + position: relative; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled .go-zen { + position: absolute; + right: 15px; + top: 5px; +} + +/* line 1, ../../../hub/static/css/mod/loader.scss */ +.loader { + display: none; + position: absolute; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + background-color: #eee; +} + +/* line 2, ../../../hub/static/css/mod/loader.scss */ +.loader .spinner { + display: block; + width: 32px; + height: 32px; + margin: 0 auto; + top: 121px; + position: relative; + background: url(/static/img/spinner.gif) no-repeat; +} + +/* line 1, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view { + position: absolute; + top: 0; + left: 0; + display: none; + margin-top: 18px; + background: white; + border: 1px solid #DDD; + border-radius: 3px; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + min-width: 120px; + z-index: 10; +} + +/* line 15, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur { + background: #3366FF; + color: white; +} + +/* line 19, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur small { + color: white; +} + +/* line 22, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view strong { + color: #3366FF; +} + +/* line 25, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur strong { + color: white; + font: bold; +} + +/* line 29, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul { + /* width: 100px; */ + list-style: none; + padding: 0; + margin: auto; +} + +/* line 35, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul li { + display: block; + padding: 5px 10px; + border-bottom: 1px solid #DDD; + cursor: pointer; + /* border-top: 1px solid #C8C8C8; */ +} + +/* line 42, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view small { + font-size: smaller; + color: #777; + font-weight: normal; +} + +/* line 9, ../../../hub/static/css/mod/comment-form.scss */ +.side-avatar { + margin-left: 0; +} + +/* fix li header for newer version of bootstrap */ +/* line 12, ../../../hub/static/css/mod/comment-form.scss */ +.comment-form-head li { + line-height: 18px; +} + +/* line 16, ../../../hub/static/css/mod/comment-form.scss */ +#new_comment .form-content { + width: 880px; + margin-left: 60px; +} + +/* line 18, ../../../hub/static/css/mod/comment-form.scss */ +.discussion-bubble-avatar { + position: relative; + float: left; + border-radius: 3px; +} + +/* line 19, ../../../hub/static/css/mod/comment-form.scss */ +.discussion-bubble-inner { + min-height: 60px; + border: 1px solid #CACACA; + background-color: white; +} + +/* line 1, ../../../hub/static/css/mod/diff-stat.scss */ +#toc li { + border-bottom: 1px solid #DDD; + list-style-type: none; + padding: 5px; +} + +/* line 7, ../../../hub/static/css/mod/diff-stat.scss */ +#toc { + margin: 15px 0; +} + +/* line 11, ../../../hub/static/css/mod/diff-stat.scss */ +#toc .diffstat { + float: right; +} + +/* line 14, ../../../hub/static/css/mod/diff-stat.scss */ +#toc .mini-icon-modified { + color: #677A85; +} + +/* line 18, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat { + white-space: nowrap; + text-align: right; + font-family: Helvetica,arial,freesans,clean,sans-serif; + color: #666; + font-weight: bold; + font-size: 11px; +} + +/* line 26, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat a { + text-decoration: none; + color: #666; +} + +/* line 30, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar { + position: relative; + left: -3px; + display: inline-block; + height: 12px; + text-decoration: none; + text-align: left; + color: #EEE; + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + line-height: 1; + -webkit-font-smoothing: antialiased; + font-size: 16px; + letter-spacing: -7px; +} + +/* line 48, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar.diff-added, +span.diffstat .diffstat-bar i.plus { + color: #61C423; + font-style: normal; +} + +/* line 53, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar.diff-added, +span.diffstat .diffstat-bar i.minus { + color: #C52323; + font-style: normal; +} + +/* line 59, ../../../hub/static/css/mod/diff-stat.scss */ +p.explain { + font-size: 12px; + color: #666; + margin: 1em 0; +} + +/* line 65, ../../../hub/static/css/mod/diff-stat.scss */ +p.explain .minibutton { + float: right; + top: -4px; +} + +/* line 3, ../../../hub/static/css/mod/diffs-pane.scss */ +.diff-cutoff { + margin-bottom: -2px; + height: 35px; + line-height: 37px; + font-size: 12px; + font-weight: bold; + color: #000; + text-align: center; + background: url("/static/img/compare_too_big.gif") 0 0 no-repeat; +} + +/* line 5, ../../../hub/static/css/mod/diffs-pane.scss */ +.fullscreen-mode { + overflow: hidden; +} + +/* line 6, ../../../hub/static/css/mod/diffs-pane.scss */ +#fullscreen-stage { + display: none; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + overflow-y: auto; + background: #fff; + z-index: 9999; +} + +/* line 7, ../../../hub/static/css/mod/diffs-pane.scss */ +#files #fullscreen-stage .file { + margin: 0; +} + +/* line 5, ../../../hub/static/css/mod/commits.scss */ +div.container div.raw { + overflow: visible; +} + +/* line 9, ../../../hub/static/css/mod/commits.scss */ +#commits-graph { + position: absolute; + left: -200px; + width: 200px; +} + +/* line 15, ../../../hub/static/css/mod/commits.scss */ +.commits-body { + position: relative; +} + +/* line 19, ../../../hub/static/css/mod/commits.scss */ +h3.commit-group-heading { + margin: 15px 0 0 0; + padding: 5px 8px; + font-size: 13px; + color: #3a505b; + text-shadow: 0 1px white; + background: #e6f1f6; + border: 1px solid #c5d5dd; + border-top-right-radius: 4px; + border-top-left-radius: 4px; +} + +/* line 31, ../../../hub/static/css/mod/commits.scss */ +h3.history { + margin-top: 15px; +} + +/* line 35, ../../../hub/static/css/mod/commits.scss */ +.commit-group { + list-style-type: none; + margin: 15px 0; + background: #f7fbfc; + border: 1px solid #c5d5dd; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +/* line 46, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item { + position: relative; + padding: 8px 8px 8px 52px; + border-top: 1px solid #e2eaee; +} + +/* line 52, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:first-child { + border-top: none; +} + +/* line 56, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:last-child { + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +/* line 61, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:nth-child(2n) { + background: #fff; +} + +/* line 65, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus { + background: #fcfce2; +} + +/* line 69, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gravatar { + float: left; + margin-left: -44px; + border-radius: 4px; +} + +/* line 75, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .commit-title { + margin: 1px 0 1px 0; + font-size: 14px; + font-weight: bold; + color: #333; +} + +/* line 82, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .commit-title a { + color: #333; +} + +/* line 86, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .commit-desc pre { + margin-top: 5px; + margin-bottom: 10px; + font-size: 12px; + color: #596063; + border-left: 1px solid #e5e5e5; + padding-left: 8px; +} + +/* line 95, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship { + font-size: 12px; + color: #888; +} + +/* line 100, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship a { + color: #444; +} + +/* line 104, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship .author-name { + color: #444; +} + +/* line 108, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship .committer { + display: block; + font-size: 11px; +} + +/* line 113, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship .committer .mini-icon { + position: relative; + top: 2px; +} + +/* line 118, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .commit-links { + position: absolute; + top: 7px; + right: 8px; + width: 243px; + text-align: right; +} + +/* line 126, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .mini-icon-clippy { + visibility: hidden; + float: left; + margin-right: 7px; + margin-top: 5px; +} + +/* line 133, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:hover .mini-icon-clippy { + visibility: visible; +} + +/* line 137, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton { + float: right; + height: 18px; + padding: 0 7px; + line-height: 22px; + font-size: 11px; + color: #4e575b; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); + background: #eff6f9; + background: -moz-linear-gradient(#eff6f9, #ddecf3); + background: -webkit-linear-gradient(#eff6f9, #ddecf3); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#eff6f9',endColorstr='#ddecf3')"; + border: 1px solid #cedee5; + border-radius: 3px; + min-width: 70px; + text-align: center; +} + +/* line 155, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton .comment-popover { + color: #91A6B1; + border-right: 1px solid #ddd; + padding-right: 4px; +} + +/* line 161, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton { + color: #5a5b4e; +} + +/* line 165, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:nth-child(2n+1) .gobutton { + border-color: #d5dcdf; + background: #f2f5f6; + background: -moz-linear-gradient(#f2f5f6, #e3eaed); + background: -webkit-linear-gradient(#f2f5f6, #e3eaed); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f2f5f6',endColorstr='#e3eaed')"; +} + +/* line 173, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton { + border-color: #e7e86d; + background: #f9fac9; + background: -moz-linear-gradient(#f9fac9, #f3f494); + background: -webkit-linear-gradient(#f9fac9, #f3f494); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f9fac9',endColorstr='#f3f494')"; +} + +/* line 181, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton:hover { + text-decoration: none; + border-color: #cedee5; + background: #fbfdfe; + background: -moz-linear-gradient(#fbfdfe, #eaf4f8); + background: -webkit-linear-gradient(#fbfdfe, #eaf4f8); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbfdfe',endColorstr='#eaf4f8')"; +} + +/* line 190, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton > .sha, .commit-group-item.navigation-focus .gobutton:hover > .sha { + display: inline-block; + height: 22px; + margin-right: -3px; +} + +/* line 196, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton > .sha .mini-icon, .commit-group-item.navigation-focus .gobutton:hover > .sha .mini-icon { + position: relative; + top: 2px; + border-radius: 30px; + border: 1px solid #CFDEE5; + background-color: rgba(255, 255, 255, 0.5); + color: #91a6b1; + margin-left: 5px; + width: 16px; +} + +/* line 207, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton > .sha .mini-icon { + border: 1px solid #E7E86D; + color: #c3c45c; +} + +/* line 212, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton.with-comments { + padding-left: 5px; +} + +/* line 216, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton.with-comments .sha, .commit-group-item.navigation-focus .gobutton.with-comments:hover .sha { + padding-left: 8px; + border-left: 1px solid #cfdee5; +} + +/* line 221, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton.with-comments .sha { + border-left-color: #e1e29e; +} + +/* line 225, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton .comment-count, .commit-group-item.navigation-focus .gobutton:hover .comment-count { + float: left; + height: 22px; + padding-right: 9px; + line-height: 24px; + font-weight: bold; + border-right: 1px solid #f6fafc; +} + +/* line 234, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton .comment-count .mini-icon, .commit-group-item.navigation-focus .gobutton:hover .comment-count .mini-icon { + position: relative; + top: 2px; + color: #91A6B1; +} + +/* line 240, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton .comment-count .mini-icon { + color: #C3C45C; +} + +/* line 244, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .browse-button, .commit-group-item .compare-button { + clear: left; + margin-top: 1px; + font-size: 11px; + font-weight: bold; + text-align: right; + color: #999; +} + +/* line 253, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .browse-button .mini-icon { + position: relative; + top: 2px; +} + +/* line 258, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .browse-button:hover { + color: #4183C4; + background-position: 100% -95px; +} + +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 400; + src: local("Source Code Pro"), local("SourceCodePro-Regular"), url("/static/css/fonts/SourceCodePro-Regular.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 500; + src: local("Source Code Pro Medium"), local("SourceCodePro-Medium"), url("/static/css/fonts/SourceCodePro-Medium.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 600; + src: local("Source Code Pro Semibold"), local("SourceCodePro-Semibold"), url("/static/css/fonts/SourceCodePro-Semibold.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 700; + src: local("Source Code Pro Bold"), local("SourceCodePro-Bold"), url("/static/css/fonts/SourceCodePro-Bold.woff") format("woff"); +} +/* line 3, ../../../hub/static/css/mod/diff-base.scss */ +.code pre, xmp, plaintext, listing { + display: block; + font-size: 13px; + font-family: 'Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; + white-space: pre; + margin: 0; + padding: 0; +} + +/* line 12, ../../../hub/static/css/mod/diff-base.scss */ +.code pre { + line-height: 18px; +} + +/* line 16, ../../../hub/static/css/mod/diff-base.scss */ +.font-consolas pre { + font-family: Consolas,'Source Code Pro',Courier,Monaco,Menlo,monospace; +} + +/* line 20, ../../../hub/static/css/mod/diff-base.scss */ +.font-monaco pre { + font-family: Monaco,'Source Code Pro',Courier,Consolas,Menlo,monospace; +} + +/* line 24, ../../../hub/static/css/mod/diff-base.scss */ +.font-courier pre { + font-family: Courier,'Source Code Pro',Monaco,Consolas,Menlo,monospace; +} + +/* line 28, ../../../hub/static/css/mod/diff-base.scss */ +.font-dejavu pre { + font-family: 'DejaVu Sans Mono','Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; +} + +/* line 32, ../../../hub/static/css/mod/diff-base.scss */ +.font-ubuntu pre { + font-family: 'Ubuntu Mono','Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; +} + +/* line 37, ../../../hub/static/css/mod/diff-base.scss */ +pre, code, tt { + font-size: 12px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + border: 0; +} + +/* line 43, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .normal { + background-color: #FFF; +} + +/* line 47, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .deletion { + color: black; + background-color: #FDD; +} +/* line 50, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .deletion .x, .highlight .deletion .c { + color: black; + background-color: #ffaaaa; +} + +/* line 56, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .insertion { + color: black; + background-color: #DFD; +} +/* line 59, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .insertion .i, .highlight .insertion .c { + color: black; + background-color: #aaffaa; +} + +/* line 65, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped { + color: #cacaca; + background-color: #f9f9f9; +} +/* line 69, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a { + color: #cacaca; + vertical-align: middle; +} +/* line 73, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a:hover { + text-decoration: none; +} +/* line 77, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a[data-type="after"], .highlight .skipped a[data-type="before"] { + font-size: 20px; +} + +/* line 266, ../../../hub/static/css/mod/commits.scss */ +#files.commentable tr td pre:hover { + background-color: #FFC; +} + +/* line 268, ../../../hub/static/css/mod/commits.scss */ +.full-commit { + margin: 10px 0; + padding: 8px 8px 0; + background: #E6F1F6; + border: 1px solid #C5D5DD; + border-radius: 4px; +} + +/* line 276, ../../../hub/static/css/mod/commits.scss */ +.full-commit .commit-meta { + margin-left: -8px; + width: 100%; + padding: 8px; + background: white; + border-top: 1px solid #D8E6EC; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +/* line 286, ../../../hub/static/css/mod/commits.scss */ +.full-commit .commit-desc { + display: block; + margin: -4px 0 10px 0; +} + +/* line 291, ../../../hub/static/css/mod/commits.scss */ +.full-commit .commit-desc pre { + max-width: 100%; + font-size: 14px; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); +} + +/* line 297, ../../../hub/static/css/mod/commits.scss */ +.full-commit .browse-button { + float: right; + margin: -3px -3px 0 0; + height: 26px; + padding: 0 10px; + line-height: 26px; + font-size: 13px; + font-weight: bold; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); + background: #EFF6F9; + background: -moz-linear-gradient(#EFF6F9, #DDECF3); + background: -webkit-linear-gradient(#EFF6F9, #DDECF3); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#eff6f9',endColorstr='#ddecf3')"; + border: 1px solid #CEDEE5; + border-radius: 3px; +} + +/* line 314, ../../../hub/static/css/mod/commits.scss */ +.full-commit p.commit-title { + margin: 0 0 8px 0; + font-size: 18px; + font-weight: bold; + color: #213F4D; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); +} + +/* line 322, ../../../hub/static/css/mod/commits.scss */ +.clearfix { + display: block; +} + +/* line 326, ../../../hub/static/css/mod/commits.scss */ +.full-commit .sha-block { + float: right; + margin-left: 15px; + color: #888; + font-size: 12px; +} + +/* line 333, ../../../hub/static/css/mod/commits.scss */ +.full-commit .authorship { + margin-top: -2px; + margin-left: -4px; + margin-bottom: -4px; + font-size: 14px; + color: #999; +} + +/* line 341, ../../../hub/static/css/mod/commits.scss */ +.full-commit .authorship .gravatar { + margin-top: -2px; + margin-right: 3px; + vertical-align: middle; + border-radius: 3px; +} + +/* line 347, ../../../hub/static/css/mod/commits.scss */ +#files { + position: relative; +} + +/* line 351, ../../../hub/static/css/mod/commits.scss */ +#files .file, .file-box { + border: 1px solid #CCC; + margin-bottom: 13px; + position: relative; + background-color: #DDD; +} + +/* line 358, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta, .file-box .meta { + overflow: hidden; + padding: 5px 10px; + font-size: 12px; + height: 33px; + text-align: left; + color: #555; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #D8D8D8; + background: #FAFAFA; + background: -moz-linear-gradient(#FAFAFA, #EAEAEA); + background: -webkit-linear-gradient(#FAFAFA, #EAEAEA); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; +} + +/* line 373, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .info, .file-box .meta .info { + float: left; + height: 33px; + line-height: 33px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; +} + +/* line 380, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .actions, .file-box .meta .actions { + float: right; + height: 33px; + line-height: 33px; + margin-top: 1px; +} + +/* line 387, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .actions li:first-child, .file-box .meta .actions li:first-child { + background: transparent; + margin-left: 0; + padding-left: 0; +} + +/* line 393, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .actions li, .file-box .meta .actions li { + list-style-type: none; + float: left; + margin: 0 0 0 7px; +} + +/* line 399, ../../../hub/static/css/mod/commits.scss */ +.button-group li { + margin: 0 !important; +} + +/* line 403, ../../../hub/static/css/mod/commits.scss */ +.pagination-older-newer a { + padding: .1em .3em; + margin: .2em; + text-decoration: none; + color: #369; + float: none; +} + +/* line 411, ../../../hub/static/css/mod/commits.scss */ +.pagination-older-newer a:hover, .pagination a:active { + background-color: transparent; + color: #36f; +} + +/* line 416, ../../../hub/static/css/mod/commits.scss */ +.pagination-older-newer span.disabled { + padding: .1em .3em; + margin: .2em; + color: #bbb; + float: none; +} + +/* line 423, ../../../hub/static/css/mod/commits.scss */ +.commit .sha-block, .commit .sha { + padding-right: 3px; + font-size: 11px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; +} + +/* line 429, ../../../hub/static/css/mod/commits.scss */ +#files .file .data .line_numbers, .file-box .data .line_numbers { + background-color: #ECECEC; + color: #AAA; + padding: 0 6px; + border-right: 1px solid #DDD; + text-align: right; + cursor: pointer; +} + +/* line 437, ../../../hub/static/css/mod/commits.scss */ +#files .file .data .line_numbers a { + color: #AAA; +} + +/* line 441, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-added:before { + content: "\f06b"; +} + +/* line 442, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-removed:before { + content: "\f06c"; +} + +/* line 443, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-modified:before { + content: "\f06d"; +} + +/* line 444, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-moved:before, .mini-icon-renamed:before { + content: "\f06e"; +} + +/* line 445, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-commit-comment:before { + content: "\f02b"; +} + +/* line 447, ../../../hub/static/css/mod/commits.scss */ +.mega-icon-beer:before { + content: "\f269"; +} + +/* line 448, ../../../hub/static/css/mod/commits.scss */ +.mega-icon-commit-comment:before { + content: "\f22b"; +} + +/* line 450, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .info span.icon, +#files .file .meta .info span.diffstat, +.file-box .meta .info span.icon { + line-height: 0; + float: left; + margin: 5px 5px 0 0; + padding: 3px; + background: #F7F7F7; + border: 1px solid #CCC; + border-right-color: #E5E5E5; + border-bottom-color: #E5E5E5; + border-radius: 3px; +} + +/* line 463, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .info span.diffstat { + height: 16px; + padding: 3px 6px; +} + +/* line 467, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .info span:first-child, +#files .file .meta .info .icon + span, +.file-box .meta .info span:first-child, +.file-box .meta .info .icon + span { + border-left: 0 none; + box-shadow: inset 0 0 0 transparent; + margin-left: 0; + padding-left: 0; +} + +/* line 477, ../../../hub/static/css/mod/commits.scss */ +.commit-meta.comment-row .mini-icon { + color: #939AA0; + margin: 0 2px 0 1px; + top: 2px; + text-decoration: none; +} + +/* line 478, ../../../hub/static/css/mod/commits.scss */ +#files .file .data.empty, .file-box .data.empty { + padding: 10px 15px; + color: #777; +} + +/* line 482, ../../../hub/static/css/mod/commits.scss */ +.timeout { + width: 873px; + height: 528px; + border: 1px solid #C5D5DD; + background: url("/static/img/timeout.jpg") #E6F1F6 no-repeat; + background-position: 90% 50%; + padding: 0 32px 0 33px; + border-radius: 3px; +} + +/* line 491, ../../../hub/static/css/mod/commits.scss */ +.timeout h3 { + color: white; + font-size: 18px; + font-weight: bold; + text-shadow: darkGray 1px 1px 0; + padding: 15px 0 15px 0; +} + +/* line 498, ../../../hub/static/css/mod/commits.scss */ +.timeout h3 strong { + font-size: 30px; + display: block; +} + +/* line 502, ../../../hub/static/css/mod/commits.scss */ +.timeout p { + color: white; +} + +/* line 506, ../../../hub/static/css/mod/commits.scss */ +.side-avatar { + position: absolute; + float: left; + margin-left: -60px; +} + +/* line 512, ../../../hub/static/css/mod/commits.scss */ +div.generated, div.binary { + text-align: center; + background-color: #ddd; + padding: 30px; +} + +/* line 518, ../../../hub/static/css/mod/commits.scss */ +.commit-history-header { + margin-bottom: 55px; +} +/* line 521, ../../../hub/static/css/mod/commits.scss */ +.commit-history-header #search-commits { + margin: 15px 5px; +} + +/* line 1, ../../../hub/static/css/mod/pull-new.scss */ +.pull-heading .btn-change { + float: right; + margin: 9px 10px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/pull-new.scss */ +.editor-expander { + cursor: pointer; +} + +/* line 10, ../../../hub/static/css/mod/pull-new.scss */ +.pull-head { + padding: 10px; + border: 1px solid whiteSmoke; + border-top: none; + border-bottom: 2px solid #EEE; + border-radius: 5px; +} + +/* line 18, ../../../hub/static/css/mod/pull-new.scss */ +.pull-description { + font-size: 14px; + margin: 0; + color: #333; + font-weight: 300; +} + +/* line 24, ../../../hub/static/css/mod/pull-new.scss */ +.pull-description a { + font-weight: bold; + color: black; +} + +/* line 28, ../../../hub/static/css/mod/pull-new.scss */ +.pull-description .commit-ref { + margin: 0 3px; +} + +/* line 32, ../../../hub/static/css/mod/pull-new.scss */ +.commit-ref { + padding: 2px 5px; + line-height: 19px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + font-size: 12px; + font-weight: normal; + color: white; + text-shadow: -1px -1px 0 black; + text-decoration: none; + background: #787878; + background: -moz-linear-gradient(#787878, #282828); + background: -webkit-linear-gradient(#787878, #282828); + border-radius: 3px; +} + +/* line 46, ../../../hub/static/css/mod/pull-new.scss */ +.commit-ref .project { + font-weight: normal; + color: #CCC; +} + +/* line 51, ../../../hub/static/css/mod/pull-new.scss */ +.range-editor { + margin: 15px 0 20px; + background: url("http://t.douban.com/img/files/file-1363274223.gif") 50% 80px no-repeat; +} + +/* line 55, ../../../hub/static/css/mod/pull-new.scss */ +.range-editor .chooser-box { + float: left; + width: 420px; +} + +/* line 59, ../../../hub/static/css/mod/pull-new.scss */ +.range-editor .chooser-box.head { + float: right; +} + +/* line 62, ../../../hub/static/css/mod/pull-new.scss */ +.range-editor table.reposha { + margin: 15px 0 0 0; + width: 100%; +} + +/* line 66, ../../../hub/static/css/mod/pull-new.scss */ +.range-editor .commit-preview .message, +.range-editor .commit-preview p.error { + margin: 10px 0 0 0; + background: #F7F8F9; + border: 1px solid #DDD; + border-bottom: none; + border-radius: 3px; +} + +/* line 74, ../../../hub/static/css/mod/pull-new.scss */ +.range-editor .form-actions { + margin: 10px 0 0; + text-align: right; + padding-bottom: 5px; + padding: 0; + background-color: inherit; + border-top: none; +} + +/* line 83, ../../../hub/static/css/mod/pull-new.scss */ +.chooser-box { + padding: 0 10px 10px; + background: white; + background: -moz-linear-gradient(white, #F1F1F1); + background: -webkit-linear-gradient(white, #F1F1F1); + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 91, ../../../hub/static/css/mod/pull-new.scss */ +.chooser-box h3 { + margin: 0 0 0 -10px; + width: 100%; + padding: 13px 10px 10px; + font-size: 16px; + line-height: 1.2; + color: #222; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.5); + background: #FBFBFB; + background: -moz-linear-gradient(#FBFBFB, #F2F2F2); + background: -webkit-linear-gradient(#FBFBFB, #F2F2F2); + border-top-left-radius: 5px; + border-bottom: 1px solid white; +} + +/* line 105, ../../../hub/static/css/mod/pull-new.scss */ +.chooser-box .fakerule { + margin: 0 0 0 -10px; + width: 100%; + height: 1px; + padding: 0 10px; + font-size: 1px; + line-height: 1px; + background: #DDD; +} + +/* line 115, ../../../hub/static/css/mod/pull-new.scss */ +.reposha td.repo { + width: 1%; + white-space: nowrap; +} + +/* line 119, ../../../hub/static/css/mod/pull-new.scss */ +.reposha .repo .at { + padding-right: 5px; + color: #666; +} + +/* line 123, ../../../hub/static/css/mod/pull-new.scss */ +.reposha .sha { + text-align: left; +} + +/* line 126, ../../../hub/static/css/mod/pull-new.scss */ +.reposha input[type="text"] { + width: 98%; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 12px; + line-height: 20px; + color: #444; +} + +/* following commit-preview styles are also used in commits.html */ +/* line 136, ../../../hub/static/css/mod/pull-new.scss */ +.commit-preview { + margin: 10px 0 0 0; + font-size: 11px; +} + +/* line 140, ../../../hub/static/css/mod/pull-new.scss */ +.commit-preview p.name { + margin: 0; + height: 20px; + line-height: 20px; + font-size: 12px; + color: #5B6375; +} + +/* line 147, ../../../hub/static/css/mod/pull-new.scss */ +.commit-preview p.name .avatar { + float: left; + margin-right: 5px; + width: 16px; + height: 16px; + padding: 1px; + background: white; + border: 1px solid #CEDADF; +} + +/* line 156, ../../../hub/static/css/mod/pull-new.scss */ +.commit-preview p.name a { + font-weight: bold; + color: black; +} + +/* line 160, ../../../hub/static/css/mod/pull-new.scss */ +.commit-preview p.name .date { + color: #5B6375; +} + +/* line 163, ../../../hub/static/css/mod/pull-new.scss */ +.commit-preview .message, +.commit-preview p.error { + clear: both; + padding: 5px; + background: #EAF2F5; + border: 1px solid #BEDCE7; +} + +/* line 170, ../../../hub/static/css/mod/pull-new.scss */ +.commit-preview .message pre { + font-size: 11px; + color: #333; + white-space: pre-wrap; + word-wrap: break-word; + border: none; +} + +/* line 177, ../../../hub/static/css/mod/pull-new.scss */ +.commit-preview .message p.commit-id { + margin: 5px 0 0 0; + padding: 0; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + font-size: 11px; +} + +/* line 184, ../../../hub/static/css/mod/pull-new.scss */ +.new-pull-request .pull-tabs { + clear: both; +} + +/* line 188, ../../../hub/static/css/mod/pull-new.scss */ +.mini-icon-commit::before { + content: "\f01f"; +} + +/* line 191, ../../../hub/static/css/mod/pull-new.scss */ +.mini-icon-discussion::before { + content: "\f04f"; +} + +/* line 194, ../../../hub/static/css/mod/pull-new.scss */ +.mini-icon-diff::before { + content: "\f04d"; +} + +/* line 198, ../../../hub/static/css/mod/pull-new.scss */ +.pull-form { + margin: 0; +} + +/* line 201, ../../../hub/static/css/mod/pull-new.scss */ +.pull-form input[type="text"] { + font-size: 14px; + padding: 5px 5px; + margin: 0 0 5px 0; + width: 98%; + color: #444; +} + +/* line 208, ../../../hub/static/css/mod/pull-new.scss */ +.pull-form textarea { + height: 200px; +} + +/* line 211, ../../../hub/static/css/mod/pull-new.scss */ +.pull-form .preview-content { + background: white; +} + +/* line 215, ../../../hub/static/css/mod/pull-new.scss */ +.pull-form-main .form-actions { + padding: 0; + margin-top: 10px; + text-align: right; + padding-bottom: 5px; + background-color: inherit; + border-top: none; +} + +/* line 224, ../../../hub/static/css/mod/pull-new.scss */ +.pull-dest-repo a { + font-size: 12px; + font-weight: bold; + padding: 5px 0; +} + +/* line 229, ../../../hub/static/css/mod/pull-new.scss */ +.pull-dest-repo p { + font-size: 11px; + color: #999; + margin: 5px 0 15px 0; +} + +/* line 2, ../../../hub/static/css/mod/compare.scss */ +.compare-range { + margin-top: -15px; + float: right; +} + +/* line 7, ../../../hub/static/css/mod/compare.scss */ +.compare-range .switch { + display: inline-block; + width: 16px; + height: 16px; + text-indent: -9999px; + background: url("/static/img/switch_icon.png") 0 0 no-repeat; +} + +/* line 15, ../../../hub/static/css/mod/compare.scss */ +.commit-ref { + padding: 2px 5px; + line-height: 19px; + font-family: Monaco,"Courier New","DejaVu Sans Mono","Bitstream Vera Sans Mono",monospace; + font-size: 12px; + font-weight: normal; + color: white; + text-shadow: -1px -1px 0 black; + text-decoration: none; + background: #787878; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#787878',endColorstr='#282828')"; + border-radius: 3px; +} + +/* line 29, ../../../hub/static/css/mod/compare.scss */ +#compare p.subtext { + margin: -15px 0 10px 0; + color: #666; +} + +/* line 34, ../../../hub/static/css/mod/compare.scss */ +.rule, hr { + clear: both; + margin: 15px 0; + height: 0; + overflow: hidden; + border: none; + background: transparent; + border-bottom: 1px solid #DDD; +} + +/* line 43, ../../../hub/static/css/mod/compare.scss */ +.commits-condensed { + margin-top: 15px; + border: 1px solid #DDD; + border-width: 1px 1px 0 1px; +} + +/* line 49, ../../../hub/static/css/mod/compare.scss */ +table { + border-collapse: collapse; + border-spacing: 0; + font-size: 100%; + font: inherit; +} + +/* line 56, ../../../hub/static/css/mod/compare.scss */ +.avatar-bubble::before { + content: ""; + display: block; + height: 0; + width: 0; + border: 10px solid #EEE; + border-width: 10px 10px 10px 0; + border-color: transparent #EEE transparent transparent; + position: absolute; + left: 51px; + top: 15px; +} + +/* line 69, ../../../hub/static/css/mod/compare.scss */ +.bubble { + padding: 3px; + background: #EEE; + border-radius: 3px; +} + +/* line 75, ../../../hub/static/css/mod/compare.scss */ +.new-comments .bubble .comment { + margin: 0; +} + +/* line 78, ../../../hub/static/css/mod/compare.scss */ +.new-comments .comment { + margin: 10px 0; + border: 1px solid #CACACA; +} + +/* line 83, ../../../hub/static/css/mod/compare.scss */ +.new-comments .comment .cmeta { + height: 33px; + padding: 0 10px 0 6px; + border-bottom: 1px solid #CCC; + background: #F8F8F8; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f8f8f8',endColorstr='#e1e1e1')"; +} + +/* line 91, ../../../hub/static/css/mod/compare.scss */ +.new-comments .comment > .body { + position: relative; + padding: 0; + color: #333; + font-size: 12px; + background: #FBFBFB; +} + +/* line 99, ../../../hub/static/css/mod/compare.scss */ +.avatar-bubble { + margin: 20px 0; + padding-left: 60px; + position: relative; +} + +/* line 105, ../../../hub/static/css/mod/compare.scss */ +.avatar-bubble > .avatar { + position: relative; + float: left; + margin-left: -60px; +} + +/* line 111, ../../../hub/static/css/mod/compare.scss */ +.comment .content-body { + padding: 10px; + font-size: 13px; +} + +/* line 116, ../../../hub/static/css/mod/compare.scss */ +.markdown-body { + font-size: 14px; + line-height: 1.6; +} + +/* line 121, ../../../hub/static/css/mod/compare.scss */ +.markdown-body p, .markdown-body blockquote, .markdown-body ul, .markdown-body ol, .markdown-body dl, .markdown-body li, .markdown-body table, .markdown-body pre { + margin: 15px 0; +} + +/* line 125, ../../../hub/static/css/mod/compare.scss */ +.new-comments .comment .cmeta p.author { + margin: 0; + float: left; + max-width: 600px; + font-size: 12px; + height: 33px; + line-height: 33px; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.7); + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +/* line 138, ../../../hub/static/css/mod/compare.scss */ +.new-comments .comment .cmeta p.info { + float: right; + margin: 0; + font-size: 11px; + height: 33px; + line-height: 33px; +} + +/* line 145, ../../../hub/static/css/mod/compare.scss */ +a.commit-ref:hover { + text-shadow: -1px -1px 0 #04284B; + background: #74A4D4; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#74a4d4',endColorstr='#2a5177')"; + text-decoration: none; +} + +/* line 152, ../../../hub/static/css/mod/compare.scss */ +#compare h2 { + font-size: 20px; +} + +/* line 156, ../../../hub/static/css/mod/compare.scss */ +.commit-preview { + margin: 10px 0 0 0; + font-size: 11px; +} + +/* line 161, ../../../hub/static/css/mod/compare.scss */ +form-actions { + text-align: right; + padding-bottom: 5px; +} + +/* line 166, ../../../hub/static/css/mod/compare.scss */ +.commit-preview > p { + margin: 16px 0; + font-size: 14px; + text-align: center; +} + +/* compare-popup related styles copied from hub.css */ +/* line 173, ../../../hub/static/css/mod/compare.scss */ +.mini-icon-remove-close::before { + content: ""; +} + +/* line 174, ../../../hub/static/css/mod/compare.scss */ +#compare-popup { + position: absolute; + top: 159px; + left: 407px; + z-index: 100; +} + +/* line 180, ../../../hub/static/css/mod/compare.scss */ +#compare-popup .popup { + position: relative; + border-radius: 5px; + box-shadow: 0 0 18px rgba(0, 0, 0, 0.4); +} + +/* line 181, ../../../hub/static/css/mod/compare.scss */ +#compare-popup .content { + width: 425px; + color: #333; + font-size: 12px; + padding: 10px; + border-radius: 4px; + background: white; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='white',endColorstr='#f4f9fb')"; +} + +/* line 182, ../../../hub/static/css/mod/compare.scss */ +#compare-popup .form-actions { + margin: 10px 0 0; + background-color: #fff; + text-align: right; +} + +/* line 183, ../../../hub/static/css/mod/compare.scss */ +#compare-popup .close { + position: absolute; + top: 4px; + right: 5px; + padding: 2px; +} + +/* line 184, ../../../hub/static/css/mod/compare.scss */ +#compare-popup .close .mini-icon-remove-close { + line-height: 16px; + height: 16px; + color: #CCC; +} + +/* line 185, ../../../hub/static/css/mod/compare.scss */ +#compare-popup input[type="text"] { + width: 96%; + padding: 5px 5px; + font-size: 12px; +} + +/* Like these */ +/* line 1, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav { + margin-top: 6px; +} + +/* line 3, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label { + position: relative; + display: inline-block; + margin-left: 3px; + padding: 3px 7px; + border: 1px solid #ccc; + border-radius: 3px; + color: #333; + background-color: #fafafa; + vertical-align: middle; +} + +/* line 15, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::before, .metanav .counts-label::after { + content: ""; + position: absolute; + top: 50%; + right: 100%; + display: block; + margin-right: 0px; + margin-top: -6px; + width: 0; + height: 0; + border: 6px solid transparent; + border-right-color: #ccc; +} + +/* line 29, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::after { + margin-right: -1px; + border-right-color: #fafafa; +} + +/* line 2, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.metabox { + display: inline-block; + height: 8px; + background: #ccc; + text-indent: -9999px; + font-size: 12px; +} + +/* line 9, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats { + font: 13px Helvetica, arial, freesans, clean, sans-serif; + line-height: 1.4; + margin: 0; + padding: 0; + border: 0; + position: relative; + float: right; + width: 135px; + opacity: 0.5; + padding-bottom: 10px; +} + +/* line 21, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats:hover { + opacity: 1; +} + +/* line 24, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats:hover .list-tip { + display: block; +} + +/* line 27, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats a { + color: #4183c4; + text-decoration: none; +} + +/* line 31, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats-graph { + height: 10px; + overflow: hidden; +} + +/* line 35, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats-graph span { + display: inline-block; + height: 6px; + background: #ccc; + text-indent: -9999px; + float: left; +} + +/* line 42, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip, ul.list-tip { + border-radius: 3px; + box-shadow: 0 0 5px #ccc; + border: 1px solid #ddd; + background: #fff; + position: absolute; + padding-left: 0px; + top: 20px; + left: -20px; + width: 175px; + z-index: 100; + display: none; + margin-top: 0px; +} + +/* line 56, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip:before, ul.list-tip:before { + content: "▲"; + font-size: 14px; + margin: 0 auto; + width: 14px; + display: block; + margin-top: -13px; + color: #fff; + text-shadow: -1px -1px 2px #ccc; +} + +/* line 66, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li, ul.list-tip li { + margin: 0; + line-height: 100%; + list-style: none; + border-bottom: 1px solid #eee; + font-weight: bold; +} + +/* line 73, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li a, ol.list-tip li .other, ul.list-tip li a, ul.list-tip li .other { + color: #333; + padding: 8px 10px; + display: block; +} + +/* line 78, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li span.color-block, ul.list-tip li span.color-block { + display: inline-block; + width: 8px; + height: 10px; + margin-right: 5px; +} + +/* line 84, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li span.percent, ul.list-tip li span.percent { + float: right; + color: #999; +} + +/* fix project title for newer version of bootstrap*/ +/* line 6, ../../../hub/static/css/mod/project-info.scss */ +.pagehead .pull-left { + margin: 0; + font-size: 30px; + line-height: 36px; +} + +/* Hotfix for FlatUI */ +/* line 13, ../../../hub/static/css/mod/project-info.scss */ +.pagehead h2.pull-left { + margin: 0; +} + +/* line 17, ../../../hub/static/css/mod/project-info.scss */ +#project-info { + border: 1px solid #c5d5dd; + border-radius: 3px; + width: 100%; +} + +/* line 22, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div { + padding: 10px; +} + +/* line 25, ../../../hub/static/css/mod/project-info.scss */ +#project-info p { + margin: 0px; +} + +/* line 28, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div.team-label { + border-top: 1px solid #ccc; +} + +/* line 32, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div.git-url { + border-top: 1px solid #ccc; +} + +/* line 36, ../../../hub/static/css/mod/project-info.scss */ +#project-info input.git-url { + width: 480px; + margin: 0px; + cursor: auto; +} + +/* line 43, ../../../hub/static/css/mod/project-info.scss */ +#project-info .ssh div.ssh-url { + display: inline; +} +/* line 46, ../../../hub/static/css/mod/project-info.scss */ +#project-info .ssh div.http-url { + display: none; +} + +/* line 52, ../../../hub/static/css/mod/project-info.scss */ +#project-info .http div.ssh-url { + display: none; +} +/* line 55, ../../../hub/static/css/mod/project-info.scss */ +#project-info .http div.http-url { + display: inline; +} + +/* line 60, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar { + margin-top: 12px; + border-bottom: 1px solid #DDD; +} + +/* line 61, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar #back-old-browser { + padding-top: 8px; + float: right; +} + +/* line 62, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab { + padding-left: 20px; +} + +/* line 63, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li { + display: inline-block; + vertical-align: top; + cursor: pointer; +} + +/* line 64, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li a { + color: #666; + text-decoration: none; + padding: 8px 12px; + display: inline-block; + border-left: 1px solid transparent; + border-top: 1px solid transparent; + border-right: 1px solid transparent; + margin-bottom: -1px; +} + +/* line 65, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li a.active { + color: #333; + font-weight: bold; + border-left: 1px solid #DDD; + border-top: 1px solid #DDD; + border-right: 1px solid #DDD; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + background-color: white; +} + +/* line 67, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar .scope { + float: left; + margin-right: 10px; +} + +/* line 71, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar .scope i { + font-style: normal; +} + +/* line 75, ../../../hub/static/css/mod/project-info.scss */ +#breadcrumb { + margin: 10px 0; + font-size: 18px; + font-weight: bold; + color: #999; +} + +/* line 76, ../../../hub/static/css/mod/project-info.scss */ +#breadcrumb .final-path { + color: #000; +} diff --git a/dist/css/app/compare.css b/dist/css/app/compare.css new file mode 100644 index 0000000..cfbc57a --- /dev/null +++ b/dist/css/app/compare.css @@ -0,0 +1,8935 @@ +@charset "UTF-8"; +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* TODO Refactor the following mods into components */ +/* highlight style */ +/* line 2, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .hll { + background-color: #ffffcc; +} + +/* line 3, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight { + background: #ffffff; +} + +/* line 4, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .c { + color: #808080; +} + +/* Comment */ +/* line 5, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .err { + color: #F00000; + background-color: #F0A0A0; +} + +/* Error */ +/* line 6, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .k { + color: #008000; + font-weight: bold; +} + +/* Keyword */ +/* line 7, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .o { + color: #303030; +} + +/* Operator */ +/* line 8, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .cm { + color: #808080; +} + +/* Comment.Multiline */ +/* line 9, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .cp { + color: #507090; +} + +/* Comment.Preproc */ +/* line 10, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .c1 { + color: #808080; +} + +/* Comment.Single */ +/* line 11, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .cs { + color: #cc0000; + font-weight: bold; +} + +/* Comment.Special */ +/* line 12, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gd { + color: #A00000; +} + +/* Generic.Deleted */ +/* line 13, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ge { + font-style: italic; +} + +/* Generic.Emph */ +/* line 14, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gr { + color: #FF0000; +} + +/* Generic.Error */ +/* line 15, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gh { + color: #000080; + font-weight: bold; +} + +/* Generic.Heading */ +/* line 16, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gi { + color: #00A000; +} + +/* Generic.Inserted */ +/* line 17, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .go { + color: #808080; +} + +/* Generic.Output */ +/* line 18, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gp { + color: #c65d09; + font-weight: bold; +} + +/* Generic.Prompt */ +/* line 19, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gs { + font-weight: bold; +} + +/* Generic.Strong */ +/* line 20, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gu { + color: #800080; + font-weight: bold; +} + +/* Generic.Subheading */ +/* line 21, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gt { + color: #0040D0; +} + +/* Generic.Traceback */ +/* line 22, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kc { + color: #008000; + font-weight: bold; +} + +/* Keyword.Constant */ +/* line 23, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kd { + color: #008000; + font-weight: bold; +} + +/* Keyword.Declaration */ +/* line 24, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kn { + color: #008000; + font-weight: bold; +} + +/* Keyword.Namespace */ +/* line 25, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kp { + color: #003080; + font-weight: bold; +} + +/* Keyword.Pseudo */ +/* line 26, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kr { + color: #008000; + font-weight: bold; +} + +/* Keyword.Reserved */ +/* line 27, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kt { + color: #303090; + font-weight: bold; +} + +/* Keyword.Type */ +/* line 28, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .m { + color: #6000E0; + font-weight: bold; +} + +/* Literal.Number */ +/* line 29, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .s { + background-color: #fff0f0; +} + +/* Literal.String */ +/* line 30, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .na { + color: #0000C0; +} + +/* Name.Attribute */ +/* line 31, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nb { + color: #007020; +} + +/* Name.Builtin */ +/* line 32, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nc { + color: #B00060; + font-weight: bold; +} + +/* Name.Class */ +/* line 33, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .no { + color: #003060; + font-weight: bold; +} + +/* Name.Constant */ +/* line 34, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nd { + color: #505050; + font-weight: bold; +} + +/* Name.Decorator */ +/* line 35, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ni { + color: #800000; + font-weight: bold; +} + +/* Name.Entity */ +/* line 36, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ne { + color: #F00000; + font-weight: bold; +} + +/* Name.Exception */ +/* line 37, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nf { + color: #0060B0; + font-weight: bold; +} + +/* Name.Function */ +/* line 38, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nl { + color: #907000; + font-weight: bold; +} + +/* Name.Label */ +/* line 39, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nn { + color: #0e84b5; + font-weight: bold; +} + +/* Name.Namespace */ +/* line 40, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nt { + color: #007000; +} + +/* Name.Tag */ +/* line 41, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nv { + color: #906030; +} + +/* Name.Variable */ +/* line 42, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ow { + color: #000000; + font-weight: bold; +} + +/* Operator.Word */ +/* line 43, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .w { + color: #bbbbbb; +} + +/* Text.Whitespace */ +/* line 44, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mf { + color: #6000E0; + font-weight: bold; +} + +/* Literal.Number.Float */ +/* line 45, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mh { + color: #005080; + font-weight: bold; +} + +/* Literal.Number.Hex */ +/* line 46, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mi { + color: #0000D0; + font-weight: bold; +} + +/* Literal.Number.Integer */ +/* line 47, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mo { + color: #4000E0; + font-weight: bold; +} + +/* Literal.Number.Oct */ +/* line 48, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sb { + background-color: #fff0f0; +} + +/* Literal.String.Backtick */ +/* line 49, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sc { + color: #0040D0; +} + +/* Literal.String.Char */ +/* line 50, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sd { + color: #D04020; +} + +/* Literal.String.Doc */ +/* line 51, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .s2 { + background-color: #fff0f0; +} + +/* Literal.String.Double */ +/* line 52, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .se { + color: #606060; + font-weight: bold; + background-color: #fff0f0; +} + +/* Literal.String.Escape */ +/* line 53, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sh { + background-color: #fff0f0; +} + +/* Literal.String.Heredoc */ +/* line 54, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .si { + background-color: #e0e0e0; +} + +/* Literal.String.Interpol */ +/* line 55, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sx { + color: #D02000; + background-color: #fff0f0; +} + +/* Literal.String.Other */ +/* line 56, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sr { + color: #000000; + background-color: #fff0ff; +} + +/* Literal.String.Regex */ +/* line 57, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .s1 { + background-color: #fff0f0; +} + +/* Literal.String.Single */ +/* line 58, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ss { + color: #A06000; +} + +/* Literal.String.Symbol */ +/* line 59, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .bp { + color: #007020; +} + +/* Name.Builtin.Pseudo */ +/* line 60, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .vc { + color: #306090; +} + +/* Name.Variable.Class */ +/* line 61, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .vg { + color: #d07000; + font-weight: bold; +} + +/* Name.Variable.Global */ +/* line 62, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .vi { + color: #3030B0; +} + +/* Name.Variable.Instance */ +/* line 63, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .il { + color: #0000D0; + font-weight: bold; +} + +/* Literal.Number.Integer.Long */ +/* For other page that still depends on commits.scss */ +/* preview comment form style */ +/* line 2, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav { + margin: 10px 0; + border-bottom: 1px solid #DDD; + height: 35px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs { + display: inline-block; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs > li { + display: inline-block; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab { + display: inline-block; + margin-bottom: -1px; + padding: 8px 12px 9px; + border: 1px solid transparent; + border-bottom: 0; + font-size: 14px; + color: #666; + text-decoration: none; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab.selected { + border-color: #DDD; + border-radius: 3px 3px 0 0; + background-color: white; + color: #333; + font-weight: bold; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab:hover { + text-decoration: none; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav { + position: relative; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav ul.tabnav-tabs { + padding-left: 10px; +} + +/* line 10, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 0 10px 10px; +} + +/* line 11, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form #preview_bucket .content-body { + padding: 10px; + min-height: 132px; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form.tab-content { + overflow: initial; + position: relative; +} + +/* line 2, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 10px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-actions { + padding: 0; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + position: relative; + border: 3px solid #EEE; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + padding: 0; + background: #EEE; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content .write-content { + padding: 0 10px 10px; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; + margin: 0; +} + +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary, button.primary.classy:disabled, button.primary.classy.disabled, button.primary.classy:disabled:hover, button.primary.classy.disabled:disabled:hover, button.classy:disabled:hover.primary, button.classy.disabled:disabled:hover.primary { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4); + border-color: #74BB5A; + border-bottom-color: #509338; + background: #8ADD6D; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#8add6d', endColorstr='#60b044')"; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); + background-image: -webkit-linear-gradient(top, #8ADD6D, #60B044); +} + +/* line 2, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary.disabled { + opacity: 0.5; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy, +button.classy:disabled, +button.classy.disabled, +a.button.classy:disabled, +a.button.classy.disabled, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover:disabled, +a.button.classy.disabled:hover, +a.button.classy, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy:disabled:hover, +a.button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover { + display: inline-block; + padding: 8px 15px; + line-height: normal; + position: relative; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 12px; + font-weight: bold; + color: #666; + text-shadow: 0 1px rgba(255, 255, 255, 0.9); + background: whiteSmoke; + background: -moz-linear-gradient(whiteSmoke, #E5E5E5); + background: -webkit-linear-gradient(whiteSmoke, #E5E5E5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; + border-radius: 3px; + border: 1px solid #DDD; + border-bottom-color: #BBB; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* ================================== *\ + * Zen Form + * ================================== */ +/* line 6, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + position: fixed; + z-index: 99999; + top: 0; + left: 0; + right: 0; + bottom: 0; + padding: 24px 30px 24px 24px; +} + +/* line 16, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-input-wrap { + max-width: 640px; + position: relative; + margin: 0 auto; +} + +/** + * Buttons style + */ +/* line 25, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button, +.zen-forms-theme-switch { + position: absolute; + width: 18px; + height: 18px; + text-align: center; + top: 10px; + right: 10px; + font-size: 24px; + color: #516066; + cursor: pointer; + line-height: 1; +} + +/* line 39, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-theme-switch { + top: 28px; + font-size: 34px; +} + +/* line 44, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button:hover, +.zen-forms-theme-switch:hover { + color: #667981; +} + +/** + * Inputs basic style + */ +/* line 52, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + padding: 8px 0; + width: 100%; + background: none; + border: none; + margin-bottom: 24px; + cursor: pointer; +} + +/* line 62, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus, +.zen-forms textarea:focus { + cursor: text; +} + +/* line 67, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms textarea { + resize: none; +} + +/* line 71, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + cursor: pointer; + display: none; + padding: 8px 3; + position: absolute; + top: 0; + width: 100%; +} + +/* line 80, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms .empty + label { + display: block; +} + +/* line 84, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus + label, +.zen-forms textarea:focus + label { + display: none; +} + +/* line 89, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms :focus { + outline-color: transparent; + outline-style: none; +} + +/** + * Dark theme + */ +/* line 97, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + background: #151a1c; +} + +/* line 101, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + color: #516066; +} + +/* line 105, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + color: #667981; +} + +/** + * Light theme + */ +/* line 113, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme { + background: #fefefe; +} + +/* line 117, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme label { + color: #959697; +} + +/* line 121, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme input, +.zen-forms.light-theme textarea { + color: #707071; +} + +/* line 4, ../../../hub/static/css/mod/zen-forms.scss */ +.write-content .enable-fullscreen { + position: absolute; + top: 5px; + right: 16px; + color: #333333; + opacity: .5; + line-height: 1em; +} + +/* line 5, ../../../hub/static/css/mod/zen-forms.scss */ +.mini-icon-fullscreen::before { + content: ""; +} + +/* line 6, ../../../hub/static/css/mod/zen-forms.scss */ +.fullscreen-overlay textarea, .zen-forms textarea { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + height: 100%; + padding: 20px; + border: 0; + font-size: 21px; + line-height: 1.6em; + resize: none; + -moz-transition: color 0.15s ease-in 0; + -webkit-transition: color 0.15s ease-in 0; + transition: color 0.15s ease-in 0; + box-shadow: none; +} + +/* line 7, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms.light-theme textarea { + background: #fff; + color: #999999; +} + +/* line 8, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms .zen-forms-input-wrap { + width: 100%; + height: 100%; +} + +/* line 9, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms label[for^=zen-forms-input] { + display: none; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-zen.scss */ +.previewable-comment-form .zen-enabled textarea { + padding: 10px 18px 10px 10px; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled { + position: relative; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled .go-zen { + position: absolute; + right: 15px; + top: 5px; +} + +/* line 1, ../../../hub/static/css/mod/loader.scss */ +.loader { + display: none; + position: absolute; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + background-color: #eee; +} + +/* line 2, ../../../hub/static/css/mod/loader.scss */ +.loader .spinner { + display: block; + width: 32px; + height: 32px; + margin: 0 auto; + top: 121px; + position: relative; + background: url(/static/img/spinner.gif) no-repeat; +} + +/* line 1, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view { + position: absolute; + top: 0; + left: 0; + display: none; + margin-top: 18px; + background: white; + border: 1px solid #DDD; + border-radius: 3px; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + min-width: 120px; + z-index: 10; +} + +/* line 15, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur { + background: #3366FF; + color: white; +} + +/* line 19, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur small { + color: white; +} + +/* line 22, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view strong { + color: #3366FF; +} + +/* line 25, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur strong { + color: white; + font: bold; +} + +/* line 29, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul { + /* width: 100px; */ + list-style: none; + padding: 0; + margin: auto; +} + +/* line 35, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul li { + display: block; + padding: 5px 10px; + border-bottom: 1px solid #DDD; + cursor: pointer; + /* border-top: 1px solid #C8C8C8; */ +} + +/* line 42, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view small { + font-size: smaller; + color: #777; + font-weight: normal; +} + +/* line 9, ../../../hub/static/css/mod/comment-form.scss */ +.side-avatar { + margin-left: 0; +} + +/* fix li header for newer version of bootstrap */ +/* line 12, ../../../hub/static/css/mod/comment-form.scss */ +.comment-form-head li { + line-height: 18px; +} + +/* line 16, ../../../hub/static/css/mod/comment-form.scss */ +#new_comment .form-content { + width: 880px; + margin-left: 60px; +} + +/* line 18, ../../../hub/static/css/mod/comment-form.scss */ +.discussion-bubble-avatar { + position: relative; + float: left; + border-radius: 3px; +} + +/* line 19, ../../../hub/static/css/mod/comment-form.scss */ +.discussion-bubble-inner { + min-height: 60px; + border: 1px solid #CACACA; + background-color: white; +} + +/* line 1, ../../../hub/static/css/mod/diff-stat.scss */ +#toc li { + border-bottom: 1px solid #DDD; + list-style-type: none; + padding: 5px; +} + +/* line 7, ../../../hub/static/css/mod/diff-stat.scss */ +#toc { + margin: 15px 0; +} + +/* line 11, ../../../hub/static/css/mod/diff-stat.scss */ +#toc .diffstat { + float: right; +} + +/* line 14, ../../../hub/static/css/mod/diff-stat.scss */ +#toc .mini-icon-modified { + color: #677A85; +} + +/* line 18, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat { + white-space: nowrap; + text-align: right; + font-family: Helvetica,arial,freesans,clean,sans-serif; + color: #666; + font-weight: bold; + font-size: 11px; +} + +/* line 26, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat a { + text-decoration: none; + color: #666; +} + +/* line 30, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar { + position: relative; + left: -3px; + display: inline-block; + height: 12px; + text-decoration: none; + text-align: left; + color: #EEE; + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + line-height: 1; + -webkit-font-smoothing: antialiased; + font-size: 16px; + letter-spacing: -7px; +} + +/* line 48, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar.diff-added, +span.diffstat .diffstat-bar i.plus { + color: #61C423; + font-style: normal; +} + +/* line 53, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar.diff-added, +span.diffstat .diffstat-bar i.minus { + color: #C52323; + font-style: normal; +} + +/* line 59, ../../../hub/static/css/mod/diff-stat.scss */ +p.explain { + font-size: 12px; + color: #666; + margin: 1em 0; +} + +/* line 65, ../../../hub/static/css/mod/diff-stat.scss */ +p.explain .minibutton { + float: right; + top: -4px; +} + +/* line 3, ../../../hub/static/css/mod/diffs-pane.scss */ +.diff-cutoff { + margin-bottom: -2px; + height: 35px; + line-height: 37px; + font-size: 12px; + font-weight: bold; + color: #000; + text-align: center; + background: url("/static/img/compare_too_big.gif") 0 0 no-repeat; +} + +/* line 5, ../../../hub/static/css/mod/diffs-pane.scss */ +.fullscreen-mode { + overflow: hidden; +} + +/* line 6, ../../../hub/static/css/mod/diffs-pane.scss */ +#fullscreen-stage { + display: none; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + overflow-y: auto; + background: #fff; + z-index: 9999; +} + +/* line 7, ../../../hub/static/css/mod/diffs-pane.scss */ +#files #fullscreen-stage .file { + margin: 0; +} + +/* line 5, ../../../hub/static/css/mod/commits.scss */ +div.container div.raw { + overflow: visible; +} + +/* line 9, ../../../hub/static/css/mod/commits.scss */ +#commits-graph { + position: absolute; + left: -200px; + width: 200px; +} + +/* line 15, ../../../hub/static/css/mod/commits.scss */ +.commits-body { + position: relative; +} + +/* line 19, ../../../hub/static/css/mod/commits.scss */ +h3.commit-group-heading { + margin: 15px 0 0 0; + padding: 5px 8px; + font-size: 13px; + color: #3a505b; + text-shadow: 0 1px white; + background: #e6f1f6; + border: 1px solid #c5d5dd; + border-top-right-radius: 4px; + border-top-left-radius: 4px; +} + +/* line 31, ../../../hub/static/css/mod/commits.scss */ +h3.history { + margin-top: 15px; +} + +/* line 35, ../../../hub/static/css/mod/commits.scss */ +.commit-group { + list-style-type: none; + margin: 15px 0; + background: #f7fbfc; + border: 1px solid #c5d5dd; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +/* line 46, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item { + position: relative; + padding: 8px 8px 8px 52px; + border-top: 1px solid #e2eaee; +} + +/* line 52, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:first-child { + border-top: none; +} + +/* line 56, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:last-child { + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +/* line 61, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:nth-child(2n) { + background: #fff; +} + +/* line 65, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus { + background: #fcfce2; +} + +/* line 69, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gravatar { + float: left; + margin-left: -44px; + border-radius: 4px; +} + +/* line 75, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .commit-title { + margin: 1px 0 1px 0; + font-size: 14px; + font-weight: bold; + color: #333; +} + +/* line 82, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .commit-title a { + color: #333; +} + +/* line 86, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .commit-desc pre { + margin-top: 5px; + margin-bottom: 10px; + font-size: 12px; + color: #596063; + border-left: 1px solid #e5e5e5; + padding-left: 8px; +} + +/* line 95, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship { + font-size: 12px; + color: #888; +} + +/* line 100, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship a { + color: #444; +} + +/* line 104, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship .author-name { + color: #444; +} + +/* line 108, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship .committer { + display: block; + font-size: 11px; +} + +/* line 113, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship .committer .mini-icon { + position: relative; + top: 2px; +} + +/* line 118, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .commit-links { + position: absolute; + top: 7px; + right: 8px; + width: 243px; + text-align: right; +} + +/* line 126, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .mini-icon-clippy { + visibility: hidden; + float: left; + margin-right: 7px; + margin-top: 5px; +} + +/* line 133, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:hover .mini-icon-clippy { + visibility: visible; +} + +/* line 137, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton { + float: right; + height: 18px; + padding: 0 7px; + line-height: 22px; + font-size: 11px; + color: #4e575b; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); + background: #eff6f9; + background: -moz-linear-gradient(#eff6f9, #ddecf3); + background: -webkit-linear-gradient(#eff6f9, #ddecf3); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#eff6f9',endColorstr='#ddecf3')"; + border: 1px solid #cedee5; + border-radius: 3px; + min-width: 70px; + text-align: center; +} + +/* line 155, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton .comment-popover { + color: #91A6B1; + border-right: 1px solid #ddd; + padding-right: 4px; +} + +/* line 161, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton { + color: #5a5b4e; +} + +/* line 165, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:nth-child(2n+1) .gobutton { + border-color: #d5dcdf; + background: #f2f5f6; + background: -moz-linear-gradient(#f2f5f6, #e3eaed); + background: -webkit-linear-gradient(#f2f5f6, #e3eaed); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f2f5f6',endColorstr='#e3eaed')"; +} + +/* line 173, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton { + border-color: #e7e86d; + background: #f9fac9; + background: -moz-linear-gradient(#f9fac9, #f3f494); + background: -webkit-linear-gradient(#f9fac9, #f3f494); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f9fac9',endColorstr='#f3f494')"; +} + +/* line 181, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton:hover { + text-decoration: none; + border-color: #cedee5; + background: #fbfdfe; + background: -moz-linear-gradient(#fbfdfe, #eaf4f8); + background: -webkit-linear-gradient(#fbfdfe, #eaf4f8); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbfdfe',endColorstr='#eaf4f8')"; +} + +/* line 190, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton > .sha, .commit-group-item.navigation-focus .gobutton:hover > .sha { + display: inline-block; + height: 22px; + margin-right: -3px; +} + +/* line 196, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton > .sha .mini-icon, .commit-group-item.navigation-focus .gobutton:hover > .sha .mini-icon { + position: relative; + top: 2px; + border-radius: 30px; + border: 1px solid #CFDEE5; + background-color: rgba(255, 255, 255, 0.5); + color: #91a6b1; + margin-left: 5px; + width: 16px; +} + +/* line 207, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton > .sha .mini-icon { + border: 1px solid #E7E86D; + color: #c3c45c; +} + +/* line 212, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton.with-comments { + padding-left: 5px; +} + +/* line 216, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton.with-comments .sha, .commit-group-item.navigation-focus .gobutton.with-comments:hover .sha { + padding-left: 8px; + border-left: 1px solid #cfdee5; +} + +/* line 221, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton.with-comments .sha { + border-left-color: #e1e29e; +} + +/* line 225, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton .comment-count, .commit-group-item.navigation-focus .gobutton:hover .comment-count { + float: left; + height: 22px; + padding-right: 9px; + line-height: 24px; + font-weight: bold; + border-right: 1px solid #f6fafc; +} + +/* line 234, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton .comment-count .mini-icon, .commit-group-item.navigation-focus .gobutton:hover .comment-count .mini-icon { + position: relative; + top: 2px; + color: #91A6B1; +} + +/* line 240, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton .comment-count .mini-icon { + color: #C3C45C; +} + +/* line 244, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .browse-button, .commit-group-item .compare-button { + clear: left; + margin-top: 1px; + font-size: 11px; + font-weight: bold; + text-align: right; + color: #999; +} + +/* line 253, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .browse-button .mini-icon { + position: relative; + top: 2px; +} + +/* line 258, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .browse-button:hover { + color: #4183C4; + background-position: 100% -95px; +} + +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 400; + src: local("Source Code Pro"), local("SourceCodePro-Regular"), url("/static/css/fonts/SourceCodePro-Regular.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 500; + src: local("Source Code Pro Medium"), local("SourceCodePro-Medium"), url("/static/css/fonts/SourceCodePro-Medium.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 600; + src: local("Source Code Pro Semibold"), local("SourceCodePro-Semibold"), url("/static/css/fonts/SourceCodePro-Semibold.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 700; + src: local("Source Code Pro Bold"), local("SourceCodePro-Bold"), url("/static/css/fonts/SourceCodePro-Bold.woff") format("woff"); +} +/* line 3, ../../../hub/static/css/mod/diff-base.scss */ +.code pre, xmp, plaintext, listing { + display: block; + font-size: 13px; + font-family: 'Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; + white-space: pre; + margin: 0; + padding: 0; +} + +/* line 12, ../../../hub/static/css/mod/diff-base.scss */ +.code pre { + line-height: 18px; +} + +/* line 16, ../../../hub/static/css/mod/diff-base.scss */ +.font-consolas pre { + font-family: Consolas,'Source Code Pro',Courier,Monaco,Menlo,monospace; +} + +/* line 20, ../../../hub/static/css/mod/diff-base.scss */ +.font-monaco pre { + font-family: Monaco,'Source Code Pro',Courier,Consolas,Menlo,monospace; +} + +/* line 24, ../../../hub/static/css/mod/diff-base.scss */ +.font-courier pre { + font-family: Courier,'Source Code Pro',Monaco,Consolas,Menlo,monospace; +} + +/* line 28, ../../../hub/static/css/mod/diff-base.scss */ +.font-dejavu pre { + font-family: 'DejaVu Sans Mono','Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; +} + +/* line 32, ../../../hub/static/css/mod/diff-base.scss */ +.font-ubuntu pre { + font-family: 'Ubuntu Mono','Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; +} + +/* line 37, ../../../hub/static/css/mod/diff-base.scss */ +pre, code, tt { + font-size: 12px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + border: 0; +} + +/* line 43, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .normal { + background-color: #FFF; +} + +/* line 47, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .deletion { + color: black; + background-color: #FDD; +} +/* line 50, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .deletion .x, .highlight .deletion .c { + color: black; + background-color: #ffaaaa; +} + +/* line 56, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .insertion { + color: black; + background-color: #DFD; +} +/* line 59, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .insertion .i, .highlight .insertion .c { + color: black; + background-color: #aaffaa; +} + +/* line 65, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped { + color: #cacaca; + background-color: #f9f9f9; +} +/* line 69, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a { + color: #cacaca; + vertical-align: middle; +} +/* line 73, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a:hover { + text-decoration: none; +} +/* line 77, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a[data-type="after"], .highlight .skipped a[data-type="before"] { + font-size: 20px; +} + +/* line 266, ../../../hub/static/css/mod/commits.scss */ +#files.commentable tr td pre:hover { + background-color: #FFC; +} + +/* line 268, ../../../hub/static/css/mod/commits.scss */ +.full-commit { + margin: 10px 0; + padding: 8px 8px 0; + background: #E6F1F6; + border: 1px solid #C5D5DD; + border-radius: 4px; +} + +/* line 276, ../../../hub/static/css/mod/commits.scss */ +.full-commit .commit-meta { + margin-left: -8px; + width: 100%; + padding: 8px; + background: white; + border-top: 1px solid #D8E6EC; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +/* line 286, ../../../hub/static/css/mod/commits.scss */ +.full-commit .commit-desc { + display: block; + margin: -4px 0 10px 0; +} + +/* line 291, ../../../hub/static/css/mod/commits.scss */ +.full-commit .commit-desc pre { + max-width: 100%; + font-size: 14px; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); +} + +/* line 297, ../../../hub/static/css/mod/commits.scss */ +.full-commit .browse-button { + float: right; + margin: -3px -3px 0 0; + height: 26px; + padding: 0 10px; + line-height: 26px; + font-size: 13px; + font-weight: bold; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); + background: #EFF6F9; + background: -moz-linear-gradient(#EFF6F9, #DDECF3); + background: -webkit-linear-gradient(#EFF6F9, #DDECF3); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#eff6f9',endColorstr='#ddecf3')"; + border: 1px solid #CEDEE5; + border-radius: 3px; +} + +/* line 314, ../../../hub/static/css/mod/commits.scss */ +.full-commit p.commit-title { + margin: 0 0 8px 0; + font-size: 18px; + font-weight: bold; + color: #213F4D; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); +} + +/* line 322, ../../../hub/static/css/mod/commits.scss */ +.clearfix { + display: block; +} + +/* line 326, ../../../hub/static/css/mod/commits.scss */ +.full-commit .sha-block { + float: right; + margin-left: 15px; + color: #888; + font-size: 12px; +} + +/* line 333, ../../../hub/static/css/mod/commits.scss */ +.full-commit .authorship { + margin-top: -2px; + margin-left: -4px; + margin-bottom: -4px; + font-size: 14px; + color: #999; +} + +/* line 341, ../../../hub/static/css/mod/commits.scss */ +.full-commit .authorship .gravatar { + margin-top: -2px; + margin-right: 3px; + vertical-align: middle; + border-radius: 3px; +} + +/* line 347, ../../../hub/static/css/mod/commits.scss */ +#files { + position: relative; +} + +/* line 351, ../../../hub/static/css/mod/commits.scss */ +#files .file, .file-box { + border: 1px solid #CCC; + margin-bottom: 13px; + position: relative; + background-color: #DDD; +} + +/* line 358, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta, .file-box .meta { + overflow: hidden; + padding: 5px 10px; + font-size: 12px; + height: 33px; + text-align: left; + color: #555; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #D8D8D8; + background: #FAFAFA; + background: -moz-linear-gradient(#FAFAFA, #EAEAEA); + background: -webkit-linear-gradient(#FAFAFA, #EAEAEA); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; +} + +/* line 373, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .info, .file-box .meta .info { + float: left; + height: 33px; + line-height: 33px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; +} + +/* line 380, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .actions, .file-box .meta .actions { + float: right; + height: 33px; + line-height: 33px; + margin-top: 1px; +} + +/* line 387, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .actions li:first-child, .file-box .meta .actions li:first-child { + background: transparent; + margin-left: 0; + padding-left: 0; +} + +/* line 393, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .actions li, .file-box .meta .actions li { + list-style-type: none; + float: left; + margin: 0 0 0 7px; +} + +/* line 399, ../../../hub/static/css/mod/commits.scss */ +.button-group li { + margin: 0 !important; +} + +/* line 403, ../../../hub/static/css/mod/commits.scss */ +.pagination-older-newer a { + padding: .1em .3em; + margin: .2em; + text-decoration: none; + color: #369; + float: none; +} + +/* line 411, ../../../hub/static/css/mod/commits.scss */ +.pagination-older-newer a:hover, .pagination a:active { + background-color: transparent; + color: #36f; +} + +/* line 416, ../../../hub/static/css/mod/commits.scss */ +.pagination-older-newer span.disabled { + padding: .1em .3em; + margin: .2em; + color: #bbb; + float: none; +} + +/* line 423, ../../../hub/static/css/mod/commits.scss */ +.commit .sha-block, .commit .sha { + padding-right: 3px; + font-size: 11px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; +} + +/* line 429, ../../../hub/static/css/mod/commits.scss */ +#files .file .data .line_numbers, .file-box .data .line_numbers { + background-color: #ECECEC; + color: #AAA; + padding: 0 6px; + border-right: 1px solid #DDD; + text-align: right; + cursor: pointer; +} + +/* line 437, ../../../hub/static/css/mod/commits.scss */ +#files .file .data .line_numbers a { + color: #AAA; +} + +/* line 441, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-added:before { + content: "\f06b"; +} + +/* line 442, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-removed:before { + content: "\f06c"; +} + +/* line 443, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-modified:before { + content: "\f06d"; +} + +/* line 444, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-moved:before, .mini-icon-renamed:before { + content: "\f06e"; +} + +/* line 445, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-commit-comment:before { + content: "\f02b"; +} + +/* line 447, ../../../hub/static/css/mod/commits.scss */ +.mega-icon-beer:before { + content: "\f269"; +} + +/* line 448, ../../../hub/static/css/mod/commits.scss */ +.mega-icon-commit-comment:before { + content: "\f22b"; +} + +/* line 450, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .info span.icon, +#files .file .meta .info span.diffstat, +.file-box .meta .info span.icon { + line-height: 0; + float: left; + margin: 5px 5px 0 0; + padding: 3px; + background: #F7F7F7; + border: 1px solid #CCC; + border-right-color: #E5E5E5; + border-bottom-color: #E5E5E5; + border-radius: 3px; +} + +/* line 463, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .info span.diffstat { + height: 16px; + padding: 3px 6px; +} + +/* line 467, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .info span:first-child, +#files .file .meta .info .icon + span, +.file-box .meta .info span:first-child, +.file-box .meta .info .icon + span { + border-left: 0 none; + box-shadow: inset 0 0 0 transparent; + margin-left: 0; + padding-left: 0; +} + +/* line 477, ../../../hub/static/css/mod/commits.scss */ +.commit-meta.comment-row .mini-icon { + color: #939AA0; + margin: 0 2px 0 1px; + top: 2px; + text-decoration: none; +} + +/* line 478, ../../../hub/static/css/mod/commits.scss */ +#files .file .data.empty, .file-box .data.empty { + padding: 10px 15px; + color: #777; +} + +/* line 482, ../../../hub/static/css/mod/commits.scss */ +.timeout { + width: 873px; + height: 528px; + border: 1px solid #C5D5DD; + background: url("/static/img/timeout.jpg") #E6F1F6 no-repeat; + background-position: 90% 50%; + padding: 0 32px 0 33px; + border-radius: 3px; +} + +/* line 491, ../../../hub/static/css/mod/commits.scss */ +.timeout h3 { + color: white; + font-size: 18px; + font-weight: bold; + text-shadow: darkGray 1px 1px 0; + padding: 15px 0 15px 0; +} + +/* line 498, ../../../hub/static/css/mod/commits.scss */ +.timeout h3 strong { + font-size: 30px; + display: block; +} + +/* line 502, ../../../hub/static/css/mod/commits.scss */ +.timeout p { + color: white; +} + +/* line 506, ../../../hub/static/css/mod/commits.scss */ +.side-avatar { + position: absolute; + float: left; + margin-left: -60px; +} + +/* line 512, ../../../hub/static/css/mod/commits.scss */ +div.generated, div.binary { + text-align: center; + background-color: #ddd; + padding: 30px; +} + +/* line 518, ../../../hub/static/css/mod/commits.scss */ +.commit-history-header { + margin-bottom: 55px; +} +/* line 521, ../../../hub/static/css/mod/commits.scss */ +.commit-history-header #search-commits { + margin: 15px 5px; +} + +/* tabs */ +/* line 3, ../../../hub/static/css/mod/pull-tabs.scss */ +ul.smalltabs { + margin: 15px 0 15px 0; + height: 24px; + line-height: 24px; + font-size: 12px; + color: #555; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.5); + background: #E8E8E8; + background: -moz-linear-gradient(#E8E8E8, #D2D2D2); + background: -webkit-linear-gradient(#E8E8E8, #D2D2D2); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#e8e8e8',endColorstr='#d2d2d2')"; + border: 1px solid #D1D1D1; + border-bottom-color: #BBB; + border-radius: 3px; +} + +/* line 18, ../../../hub/static/css/mod/pull-tabs.scss */ +ul.smalltabs li { + list-style-type: none; + display: inline; + line-height: 24px; +} + +/* line 23, ../../../hub/static/css/mod/pull-tabs.scss */ +ul.smalltabs li:first-child a.selected { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} + +/* line 27, ../../../hub/static/css/mod/pull-tabs.scss */ +ul.smalltabs li:first-child a { + border-left: none; +} + +/* line 30, ../../../hub/static/css/mod/pull-tabs.scss */ +ul.smalltabs li.active a { + color: #333; + background: white; + background: -moz-linear-gradient(white, #F2F2F2); + background: -webkit-linear-gradient(white, #F2F2F2); +} + +/* line 36, ../../../hub/static/css/mod/pull-tabs.scss */ +ul.smalltabs a { + float: left; + height: 24px; + padding: 0 7px; + color: #666; + font-weight: bold; + text-decoration: none; + border-right: 1px solid #ABABAB; + border-left: 1px solid #F6F6F6; +} + +/* line 46, ../../../hub/static/css/mod/pull-tabs.scss */ +ul.smalltabs .mini-icon { + vertical-align: middle; + color: #888; +} + +/* line 50, ../../../hub/static/css/mod/pull-tabs.scss */ +ul.smalltabs .counter { + display: inline-block; + position: relative; + top: -1px; + margin-left: 2px; + line-height: 12px; + padding: 1px 3px 0 3px; + font-size: 9px; + background: #ECECEC; + border: 1px solid #AFAFAF; + border-right-color: #ECECEC; + border-bottom-color: #ECECEC; + border-radius: 2px; +} + +/* Like these */ +/* line 2, ../../../hub/static/css/mod/compare.scss */ +.compare-range { + margin-top: -15px; + float: right; +} + +/* line 7, ../../../hub/static/css/mod/compare.scss */ +.compare-range .switch { + display: inline-block; + width: 16px; + height: 16px; + text-indent: -9999px; + background: url("/static/img/switch_icon.png") 0 0 no-repeat; +} + +/* line 15, ../../../hub/static/css/mod/compare.scss */ +.commit-ref { + padding: 2px 5px; + line-height: 19px; + font-family: Monaco,"Courier New","DejaVu Sans Mono","Bitstream Vera Sans Mono",monospace; + font-size: 12px; + font-weight: normal; + color: white; + text-shadow: -1px -1px 0 black; + text-decoration: none; + background: #787878; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#787878',endColorstr='#282828')"; + border-radius: 3px; +} + +/* line 29, ../../../hub/static/css/mod/compare.scss */ +#compare p.subtext { + margin: -15px 0 10px 0; + color: #666; +} + +/* line 34, ../../../hub/static/css/mod/compare.scss */ +.rule, hr { + clear: both; + margin: 15px 0; + height: 0; + overflow: hidden; + border: none; + background: transparent; + border-bottom: 1px solid #DDD; +} + +/* line 43, ../../../hub/static/css/mod/compare.scss */ +.commits-condensed { + margin-top: 15px; + border: 1px solid #DDD; + border-width: 1px 1px 0 1px; +} + +/* line 49, ../../../hub/static/css/mod/compare.scss */ +table { + border-collapse: collapse; + border-spacing: 0; + font-size: 100%; + font: inherit; +} + +/* line 56, ../../../hub/static/css/mod/compare.scss */ +.avatar-bubble::before { + content: ""; + display: block; + height: 0; + width: 0; + border: 10px solid #EEE; + border-width: 10px 10px 10px 0; + border-color: transparent #EEE transparent transparent; + position: absolute; + left: 51px; + top: 15px; +} + +/* line 69, ../../../hub/static/css/mod/compare.scss */ +.bubble { + padding: 3px; + background: #EEE; + border-radius: 3px; +} + +/* line 75, ../../../hub/static/css/mod/compare.scss */ +.new-comments .bubble .comment { + margin: 0; +} + +/* line 78, ../../../hub/static/css/mod/compare.scss */ +.new-comments .comment { + margin: 10px 0; + border: 1px solid #CACACA; +} + +/* line 83, ../../../hub/static/css/mod/compare.scss */ +.new-comments .comment .cmeta { + height: 33px; + padding: 0 10px 0 6px; + border-bottom: 1px solid #CCC; + background: #F8F8F8; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f8f8f8',endColorstr='#e1e1e1')"; +} + +/* line 91, ../../../hub/static/css/mod/compare.scss */ +.new-comments .comment > .body { + position: relative; + padding: 0; + color: #333; + font-size: 12px; + background: #FBFBFB; +} + +/* line 99, ../../../hub/static/css/mod/compare.scss */ +.avatar-bubble { + margin: 20px 0; + padding-left: 60px; + position: relative; +} + +/* line 105, ../../../hub/static/css/mod/compare.scss */ +.avatar-bubble > .avatar { + position: relative; + float: left; + margin-left: -60px; +} + +/* line 111, ../../../hub/static/css/mod/compare.scss */ +.comment .content-body { + padding: 10px; + font-size: 13px; +} + +/* line 116, ../../../hub/static/css/mod/compare.scss */ +.markdown-body { + font-size: 14px; + line-height: 1.6; +} + +/* line 121, ../../../hub/static/css/mod/compare.scss */ +.markdown-body p, .markdown-body blockquote, .markdown-body ul, .markdown-body ol, .markdown-body dl, .markdown-body li, .markdown-body table, .markdown-body pre { + margin: 15px 0; +} + +/* line 125, ../../../hub/static/css/mod/compare.scss */ +.new-comments .comment .cmeta p.author { + margin: 0; + float: left; + max-width: 600px; + font-size: 12px; + height: 33px; + line-height: 33px; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.7); + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +/* line 138, ../../../hub/static/css/mod/compare.scss */ +.new-comments .comment .cmeta p.info { + float: right; + margin: 0; + font-size: 11px; + height: 33px; + line-height: 33px; +} + +/* line 145, ../../../hub/static/css/mod/compare.scss */ +a.commit-ref:hover { + text-shadow: -1px -1px 0 #04284B; + background: #74A4D4; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#74a4d4',endColorstr='#2a5177')"; + text-decoration: none; +} + +/* line 152, ../../../hub/static/css/mod/compare.scss */ +#compare h2 { + font-size: 20px; +} + +/* line 156, ../../../hub/static/css/mod/compare.scss */ +.commit-preview { + margin: 10px 0 0 0; + font-size: 11px; +} + +/* line 161, ../../../hub/static/css/mod/compare.scss */ +form-actions { + text-align: right; + padding-bottom: 5px; +} + +/* line 166, ../../../hub/static/css/mod/compare.scss */ +.commit-preview > p { + margin: 16px 0; + font-size: 14px; + text-align: center; +} + +/* compare-popup related styles copied from hub.css */ +/* line 173, ../../../hub/static/css/mod/compare.scss */ +.mini-icon-remove-close::before { + content: ""; +} + +/* line 174, ../../../hub/static/css/mod/compare.scss */ +#compare-popup { + position: absolute; + top: 159px; + left: 407px; + z-index: 100; +} + +/* line 180, ../../../hub/static/css/mod/compare.scss */ +#compare-popup .popup { + position: relative; + border-radius: 5px; + box-shadow: 0 0 18px rgba(0, 0, 0, 0.4); +} + +/* line 181, ../../../hub/static/css/mod/compare.scss */ +#compare-popup .content { + width: 425px; + color: #333; + font-size: 12px; + padding: 10px; + border-radius: 4px; + background: white; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='white',endColorstr='#f4f9fb')"; +} + +/* line 182, ../../../hub/static/css/mod/compare.scss */ +#compare-popup .form-actions { + margin: 10px 0 0; + background-color: #fff; + text-align: right; +} + +/* line 183, ../../../hub/static/css/mod/compare.scss */ +#compare-popup .close { + position: absolute; + top: 4px; + right: 5px; + padding: 2px; +} + +/* line 184, ../../../hub/static/css/mod/compare.scss */ +#compare-popup .close .mini-icon-remove-close { + line-height: 16px; + height: 16px; + color: #CCC; +} + +/* line 185, ../../../hub/static/css/mod/compare.scss */ +#compare-popup input[type="text"] { + width: 96%; + padding: 5px 5px; + font-size: 12px; +} + +/* line 1, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav { + margin-top: 6px; +} + +/* line 3, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label { + position: relative; + display: inline-block; + margin-left: 3px; + padding: 3px 7px; + border: 1px solid #ccc; + border-radius: 3px; + color: #333; + background-color: #fafafa; + vertical-align: middle; +} + +/* line 15, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::before, .metanav .counts-label::after { + content: ""; + position: absolute; + top: 50%; + right: 100%; + display: block; + margin-right: 0px; + margin-top: -6px; + width: 0; + height: 0; + border: 6px solid transparent; + border-right-color: #ccc; +} + +/* line 29, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::after { + margin-right: -1px; + border-right-color: #fafafa; +} + +/* line 2, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.metabox { + display: inline-block; + height: 8px; + background: #ccc; + text-indent: -9999px; + font-size: 12px; +} + +/* line 9, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats { + font: 13px Helvetica, arial, freesans, clean, sans-serif; + line-height: 1.4; + margin: 0; + padding: 0; + border: 0; + position: relative; + float: right; + width: 135px; + opacity: 0.5; + padding-bottom: 10px; +} + +/* line 21, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats:hover { + opacity: 1; +} + +/* line 24, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats:hover .list-tip { + display: block; +} + +/* line 27, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats a { + color: #4183c4; + text-decoration: none; +} + +/* line 31, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats-graph { + height: 10px; + overflow: hidden; +} + +/* line 35, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats-graph span { + display: inline-block; + height: 6px; + background: #ccc; + text-indent: -9999px; + float: left; +} + +/* line 42, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip, ul.list-tip { + border-radius: 3px; + box-shadow: 0 0 5px #ccc; + border: 1px solid #ddd; + background: #fff; + position: absolute; + padding-left: 0px; + top: 20px; + left: -20px; + width: 175px; + z-index: 100; + display: none; + margin-top: 0px; +} + +/* line 56, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip:before, ul.list-tip:before { + content: "▲"; + font-size: 14px; + margin: 0 auto; + width: 14px; + display: block; + margin-top: -13px; + color: #fff; + text-shadow: -1px -1px 2px #ccc; +} + +/* line 66, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li, ul.list-tip li { + margin: 0; + line-height: 100%; + list-style: none; + border-bottom: 1px solid #eee; + font-weight: bold; +} + +/* line 73, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li a, ol.list-tip li .other, ul.list-tip li a, ul.list-tip li .other { + color: #333; + padding: 8px 10px; + display: block; +} + +/* line 78, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li span.color-block, ul.list-tip li span.color-block { + display: inline-block; + width: 8px; + height: 10px; + margin-right: 5px; +} + +/* line 84, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li span.percent, ul.list-tip li span.percent { + float: right; + color: #999; +} + +/* fix project title for newer version of bootstrap*/ +/* line 6, ../../../hub/static/css/mod/project-info.scss */ +.pagehead .pull-left { + margin: 0; + font-size: 30px; + line-height: 36px; +} + +/* Hotfix for FlatUI */ +/* line 13, ../../../hub/static/css/mod/project-info.scss */ +.pagehead h2.pull-left { + margin: 0; +} + +/* line 17, ../../../hub/static/css/mod/project-info.scss */ +#project-info { + border: 1px solid #c5d5dd; + border-radius: 3px; + width: 100%; +} + +/* line 22, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div { + padding: 10px; +} + +/* line 25, ../../../hub/static/css/mod/project-info.scss */ +#project-info p { + margin: 0px; +} + +/* line 28, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div.team-label { + border-top: 1px solid #ccc; +} + +/* line 32, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div.git-url { + border-top: 1px solid #ccc; +} + +/* line 36, ../../../hub/static/css/mod/project-info.scss */ +#project-info input.git-url { + width: 480px; + margin: 0px; + cursor: auto; +} + +/* line 43, ../../../hub/static/css/mod/project-info.scss */ +#project-info .ssh div.ssh-url { + display: inline; +} +/* line 46, ../../../hub/static/css/mod/project-info.scss */ +#project-info .ssh div.http-url { + display: none; +} + +/* line 52, ../../../hub/static/css/mod/project-info.scss */ +#project-info .http div.ssh-url { + display: none; +} +/* line 55, ../../../hub/static/css/mod/project-info.scss */ +#project-info .http div.http-url { + display: inline; +} + +/* line 60, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar { + margin-top: 12px; + border-bottom: 1px solid #DDD; +} + +/* line 61, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar #back-old-browser { + padding-top: 8px; + float: right; +} + +/* line 62, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab { + padding-left: 20px; +} + +/* line 63, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li { + display: inline-block; + vertical-align: top; + cursor: pointer; +} + +/* line 64, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li a { + color: #666; + text-decoration: none; + padding: 8px 12px; + display: inline-block; + border-left: 1px solid transparent; + border-top: 1px solid transparent; + border-right: 1px solid transparent; + margin-bottom: -1px; +} + +/* line 65, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li a.active { + color: #333; + font-weight: bold; + border-left: 1px solid #DDD; + border-top: 1px solid #DDD; + border-right: 1px solid #DDD; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + background-color: white; +} + +/* line 67, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar .scope { + float: left; + margin-right: 10px; +} + +/* line 71, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar .scope i { + font-style: normal; +} + +/* line 75, ../../../hub/static/css/mod/project-info.scss */ +#breadcrumb { + margin: 10px 0; + font-size: 18px; + font-weight: bold; + color: #999; +} + +/* line 76, ../../../hub/static/css/mod/project-info.scss */ +#breadcrumb .final-path { + color: #000; +} + +/* line 1, ../../../hub/static/css/mod/commits-condensed.scss */ +table.commits { + width: 100%; + margin-top: 10px; +} + +/* line 6, ../../../hub/static/css/mod/commits-condensed.scss */ +.boxed-group { + position: relative; + background: #EFEFEF; + padding: 3px; + border-radius: 3px; + margin: 0 0 15px 0; +} + +/* line 13, ../../../hub/static/css/mod/commits-condensed.scss */ +.boxed-group > h3 { + background: #FAFAFA; + background: -moz-linear-gradient(#FAFAFA, #E0E0E0); + background: -webkit-linear-gradient(#FAFAFA, #E0E0E0); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#e0e0e0')"; + margin: 0; + border-top-left-radius: 1px; + border-top-right-radius: 1px; + border: 1px solid #D8D8D8; + border-bottom: 1px solid #CCC; + padding: 10px 10px 11px 10px; + font-size: 14px; + text-shadow: 0 1px 0 white; +} + +/* line 27, ../../../hub/static/css/mod/commits-condensed.scss */ +.boxed-group .boxed-group-inner { + padding: 1px 10px; + background: white; + border: 1px solid #D8D8D8; + border-top: none; + border-bottom-left-radius: 1px; + border-bottom-right-radius: 1px; + color: #666; + font-size: 13px; +} + +/* line 37, ../../../hub/static/css/mod/commits-condensed.scss */ +.boxed-group.condensed > h3 { + padding: 6px 6px 7px; + font-size: 12px; +} + +/* line 41, ../../../hub/static/css/mod/commits-condensed.scss */ +.boxed-group.condensed > h3 i { + position: relative; + padding: 0 6px 0 2px; +} + +/* line 45, ../../../hub/static/css/mod/commits-condensed.scss */ +.boxed-group.condensed .boxed-group-inner { + font-size: 12px; + padding: 0; +} + +/* line 50, ../../../hub/static/css/mod/commits-condensed.scss */ +.boxed-group-list > li { + display: block; + margin-left: -10px; + width: 100%; + padding: 5px 10px; + line-height: 23px; + border-bottom: 1px solid #E5E5E5; +} + +/* line 59, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed { + margin-top: 0; + border: none; + background-color: white; +} + +/* line 64, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td { + padding: 4px; + vertical-align: top; + border-top: 1px solid #E2EAEE; +} + +/* line 69, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td.gravatar { + width: 29px; + padding: 5px; +} + +/* line 74, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed tr:first-child td { + border-top: 0; +} + +/* line 77, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed tr:nth-child(2n) td { + background: #F7FBFC; +} + +/* line 80, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed span.gravatar { + display: block; + width: 16px; + height: 16px; + line-height: 1px; + padding: 1px; + border: 1px solid #DDD; + background: white; +} + +/* line 89, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed span.gravatar a { + display: inline-block; +} + +/* line 92, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td.author { + padding-left: 0; + color: #666; + width: 100px; + font-weight: bold; +} + +/* line 98, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td.author span.commit-author { + display: inline-block; + width: 100px; + text-overflow: ellipsis; + overflow: hidden; + line-height: 22px; +} + +/* line 105, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td.author a { + color: #333; +} + +/* line 108, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td.message { + padding-left: 0; +} + +/* line 111, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed code { + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + background: inherit; +} + +/* line 115, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td.message code { + line-height: 22px; +} + +/* line 118, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td.message a { + color: #333; +} + +/* line 121, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed .commit-desc pre { + margin-top: 5px; + margin-bottom: 4px; + border-left: 1px solid #E5E5E5; + padding-left: 8px; + font-size: 11px; + font-weight: normal; + color: #596063; +} + +/* line 130, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td.commit-meta { + width: 1%; + text-align: right; + white-space: nowrap; + padding-right: 10px; +} + +/* line 136, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td.commit-meta code { + line-height: 22px; +} + +/* following style for new-pull 'xxx add commits' commits-condense style */ +/* line 142, ../../../hub/static/css/mod/commits-condensed.scss */ +table.commits { + width: 100%; + margin: 0; + font-size: 12px; +} + +/* line 147, ../../../hub/static/css/mod/commits-condensed.scss */ +table.commits .commit { + width: 59px; + padding-right: 10px; +} + +/* line 151, ../../../hub/static/css/mod/commits-condensed.scss */ +table.commits code { + border: none; +} + +/* line 154, ../../../hub/static/css/mod/commits-condensed.scss */ +table.commits td.message { + /* width: 70%;*/ +} + +/* line 157, ../../../hub/static/css/mod/commits-condensed.scss */ +table.commits td.date { + text-align: right; +} + +/* line 161, ../../../hub/static/css/mod/commits-condensed.scss */ +table.commits-condensed code { + white-space: normal; +} + +/* line 164, ../../../hub/static/css/mod/commits-condensed.scss */ +table.commits-condensed pre { + white-space: pre-wrap; +} + +/* button list */ +/* line 3, ../../../hub/static/css/mod/file-blob.scss */ +.button-group { + display: inline-block; + overflow: hidden; + border: 1px solid #d4d4d4; + border-radius: 3px; + border-bottom-color: #bcbcbc; + background: #f5f5f5; + background: -moz-linear-gradient(#f5f5f5, #e5e5e5); + background: -webkit-linear-gradient(#f5f5f5, #e5e5e5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; +} + +/* line 4, ../../../hub/static/css/mod/file-blob.scss */ +.button-group li { + margin: 0 !important; + float: left; +} + +/* line 5, ../../../hub/static/css/mod/file-blob.scss */ +.button-group li:first-child .grouped-button { + border-left: none; + border-bottom-left-radius: 2px; + border-top-left-radius: 2px; +} + +/* line 6, ../../../hub/static/css/mod/file-blob.scss */ +.button-group li:last-child .grouped-button { + border-right: none; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 2px; +} + +/* line 7, ../../../hub/static/css/mod/file-blob.scss */ +.button-group .grouped-button { + float: left; + background: none; + border-bottom: none; + border-top: none; + border-left: 1px solid rgba(0, 0, 0, 0.1); + border-right: 1px solid rgba(255, 255, 255, 0.5); + border-radius: 0; + cursor: pointer; +} + +/* line 8, ../../../hub/static/css/mod/file-blob.scss */ +.button-group .minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line-no */ +/* line 12, ../../../hub/static/css/mod/file-blob.scss */ +#blob .file { + min-height: 78px; + position: relative; + overflow: auto; +} + +/* line 13, ../../../hub/static/css/mod/file-blob.scss */ +#blob .file .rawfile { + text-align: center; + background-color: #ddd; + padding: 30px; + position: relative; +} + +/* line 14, ../../../hub/static/css/mod/file-blob.scss */ +.file table { + width: 100%; + border-collapse: collapse; + border-spacing: 0; +} + +/* line 15, ../../../hub/static/css/mod/file-blob.scss */ +.file table td, .file table th { + vertical-align: top; + padding: 0; +} + +/* line 16, ../../../hub/static/css/mod/file-blob.scss */ +.file .data { + overflow: auto; +} + +/* line 18, ../../../hub/static/css/mod/file-blob.scss */ +.code { + width: 100%; +} + +/* line 19, ../../../hub/static/css/mod/file-blob.scss */ +.code .highlight pre { + margin: 0; + padding: 8px; + border: none; + background-color: #FFF; + white-space: pre; +} + +/* line 20, ../../../hub/static/css/mod/file-blob.scss */ +.code .highlight pre a { + display: block; +} + +/* line 23, ../../../hub/static/css/mod/file-blob.scss */ +.linenos .linenodiv pre { + background-color: #ECECEC; + padding: 8px; + border: none; + border-right: 1px solid #DDD; + text-align: right; + white-space: pre; +} + +/* line 24, ../../../hub/static/css/mod/file-blob.scss */ +.linenos .linenodiv pre a { + color: #AAA; + text-decoration: none; + white-space: nowrap; + line-height: 18px; +} + +/* line 25, ../../../hub/static/css/mod/file-blob.scss */ +.code .highlight pre, .linenos .linenodiv pre { + margin: 0; + line-height: 18px; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +/* line 32, ../../../hub/static/css/mod/file-blob.scss */ +.linenos { + padding: 0; +} + +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 400; + src: local("Source Code Pro"), local("SourceCodePro-Regular"), url("/static/css/fonts/SourceCodePro-Regular.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 500; + src: local("Source Code Pro Medium"), local("SourceCodePro-Medium"), url("/static/css/fonts/SourceCodePro-Medium.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 600; + src: local("Source Code Pro Semibold"), local("SourceCodePro-Semibold"), url("/static/css/fonts/SourceCodePro-Semibold.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 700; + src: local("Source Code Pro Bold"), local("SourceCodePro-Bold"), url("/static/css/fonts/SourceCodePro-Bold.woff") format("woff"); +} +/* line 3, ../../../hub/static/css/mod/diff-base.scss */ +.code pre, xmp, plaintext, listing { + display: block; + font-size: 13px; + font-family: 'Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; + white-space: pre; + margin: 0; + padding: 0; +} + +/* line 12, ../../../hub/static/css/mod/diff-base.scss */ +.code pre { + line-height: 18px; +} + +/* line 16, ../../../hub/static/css/mod/diff-base.scss */ +.font-consolas pre { + font-family: Consolas,'Source Code Pro',Courier,Monaco,Menlo,monospace; +} + +/* line 20, ../../../hub/static/css/mod/diff-base.scss */ +.font-monaco pre { + font-family: Monaco,'Source Code Pro',Courier,Consolas,Menlo,monospace; +} + +/* line 24, ../../../hub/static/css/mod/diff-base.scss */ +.font-courier pre { + font-family: Courier,'Source Code Pro',Monaco,Consolas,Menlo,monospace; +} + +/* line 28, ../../../hub/static/css/mod/diff-base.scss */ +.font-dejavu pre { + font-family: 'DejaVu Sans Mono','Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; +} + +/* line 32, ../../../hub/static/css/mod/diff-base.scss */ +.font-ubuntu pre { + font-family: 'Ubuntu Mono','Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; +} + +/* line 37, ../../../hub/static/css/mod/diff-base.scss */ +pre, code, tt { + font-size: 12px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + border: 0; +} + +/* line 43, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .normal { + background-color: #FFF; +} + +/* line 47, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .deletion { + color: black; + background-color: #FDD; +} +/* line 50, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .deletion .x, .highlight .deletion .c { + color: black; + background-color: #ffaaaa; +} + +/* line 56, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .insertion { + color: black; + background-color: #DFD; +} +/* line 59, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .insertion .i, .highlight .insertion .c { + color: black; + background-color: #aaffaa; +} + +/* line 65, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped { + color: #cacaca; + background-color: #f9f9f9; +} +/* line 69, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a { + color: #cacaca; + vertical-align: middle; +} +/* line 73, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a:hover { + text-decoration: none; +} +/* line 77, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a[data-type="after"], .highlight .skipped a[data-type="before"] { + font-size: 20px; +} + +/* line 1, ../../../hub/static/css/mod/colorcube.scss */ +.colorcube { + position: absolute; + width: 30px; + height: 30px; + border: 1px solid #DDD; +} + +/* line 2, ../../../hub/static/css/mod/colorcube.scss */ +.colorcube::before { + content: ""; + display: block; + height: 0; + width: 0; + border: 5px solid #DDD; + border-width: 5px; + border-color: #DDD transparent transparent transparent; + left: 10px; + top: 30px; + float: left; + position: absolute; +} + +/* line 5, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .line_numbers, .file-box .data .line_numbers { + background-color: #ECECEC; + color: #AAA; + padding: 0 2px 0 16px; + border-right: 1px solid #DDD; + text-align: right; + cursor: pointer; +} +/* line 12, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .line_numbers.deletion, .file-box .data .line_numbers.deletion { + color: #AAA; + background-color: #f7c8c8; +} +/* line 16, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .line_numbers.insertion, .file-box .data .line_numbers.insertion { + color: #AAA; + background-color: #ceffce; +} + +/* line 21, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .line_numbers a { + color: #AAA; +} + +/* line 24, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .code { + width: 100%; +} + +/* line 28, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .side { + overflow-x: none; + display: none; +} + +/* line 33, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .side .file-col { + width: 50%; + float: left; + overflow-x: auto; +} + +/* line 40, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .diff-table { + border-collapse: collapse; +} + +/* line 44, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files.commentable tr td pre:hover { + background-color: #FFC; +} + +/* line 46, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .diff-table pre { + border-radius: 0px; +} + +/* line 48, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data table, .file-box .data table { + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + font-size: 12px; + line-height: 1.4; +} + +/* line 54, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .file-diff-line span.color { + cursor: default; +} + +/* Comment Bubble */ +/* line 58, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file-diff-line .add-bubble { + position: absolute; + left: 0; + width: 25px; + height: 16px; + margin-top: 0; + cursor: pointer; + opacity: 0; + color: #4183C4; +} + +/* line 69, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file-diff-line:hover .add-bubble { + opacity: 1; +} + +/* Comment Bubble icons */ +/* line 72, ../../../hub/static/css/mod/file-diff-blob.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 83, ../../../hub/static/css/mod/file-diff-blob.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 91, ../../../hub/static/css/mod/file-diff-blob.scss */ +.mini-icon-add-comment::before { + content: "\f06f"; +} + +/* line 93, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container:first-child:after { + margin: -18px 0 0; +} + +/* line 97, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container:after { + background: none repeat scroll 0 0 #fff; + content: ""; + display: block; + height: 2px; + margin: -16px 0 0; + position: absolute; + left: 0px; + width: 938px; +} + +/* line 109, ../../../hub/static/css/mod/file-diff-blob.scss */ +.data .line-numbers-skipped { + position: absolute; + width: 79px; + background-color: #f5f5f5; + border-right: 1px solid #ccc; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; +} + +/* line 119, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .skipped-top, .skipped-container .skipped-bottom { + height: 18px; + background-color: #f5f5f5; +} + +/* line 124, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-top::before { + background: #fff; + border-bottom: 1px solid #ccc; + border-top: 1px solid #ccc; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + content: ""; + display: block; + height: 4px; + position: relative; + top: -1px; + margin-left: -1px; +} + +/* line 140, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .ellipsis:hover { + background-color: #e6e6e6; + border-color: #999; +} + +/* line 145, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .ellipsis { + background: #f5f5f5; + border: 1px solid #ccc; + -moz-border-radius: 3px; + border-radius: 3px; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + box-shadow: 0 0 0 2px #fff; + cursor: pointer; + display: block; + float: left; + font-family: Arial, sans-serif; + font-size: 20px; + text-align: center; + color: #707070; + height: 16px; + line-height: 6px; + margin: 0 0 0 5px; + padding: 0; + position: absolute; + width: 30px; + z-index: 10; +} + +/* line 170, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-top .ellipsis { + margin-top: -10px; +} + +/* line 174, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .ellipsis::before, .skipped-container .ellipsis::after { + border: 1px solid #ccc; + -moz-border-radius: 4px; + border-radius: 4px; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + content: ""; + height: 9px; + left: -4px; + width: 36px; + position: absolute; +} + +/* line 188, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .ellipsis::before { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + content: "\2026"; + padding: 2px 0 0; + top: -4px; +} + +/* line 197, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .ellipsis::after { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; + bottom: -4px; + height: 10px; +} + +/* line 206, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .toggle_whitespace:hover { + background-color: #e6e6e6; + border-color: #999; +} + +/* line 211, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .toggle_whitespace { + background: #f5f5f5; + border: 1px solid #ccc; + -moz-border-radius: 3px; + border-radius: 3px; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + box-shadow: 0 0 0 2px #fff; + cursor: pointer; + display: block; + float: left; + font-family: Arial, sans-serif; + font-size: 16px; + text-align: center; + color: #707070; + height: 16px; + line-height: 6px; + margin: 0 0 0 44px; + padding: 0; + position: absolute; + width: 30px; + z-index: 10; +} + +/* line 236, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-top .toggle_whitespace { + margin-top: -10px; +} + +/* line 240, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .toggle_whitespace::before, .skipped-container .toggle_whitespace::after { + border: 1px solid #ccc; + -moz-border-radius: 4px; + border-radius: 4px; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + content: ""; + height: 9px; + left: -4px; + width: 36px; + position: absolute; +} + +/* line 254, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .toggle_whitespace::before { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + content: "\2423"; + padding: 2px 0 0; + top: -4px; +} + +/* line 263, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .toggle_whitespace::after { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; + bottom: -4px; + height: 10px; +} + +/* TODO FIXME 'View File' in file-blob requires styles +in this file, but it hides the show-inline-notes check button +therefore the below Hotfix is useless when you enables this */ +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* line 3, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files { + position: relative; +} + +/* line 6, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file { + margin-top: 0; +} + +/* line 9, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file, .file-box { + border: 1px solid #CCC; + margin-bottom: 13px; + position: relative; + background-color: #DDD; +} + +/* line 15, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta, +.file-box .meta { + overflow: hidden; + padding: 5px 10px; + font-size: 12px; + height: 33px; + text-align: left; + color: #555; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #D8D8D8; + background: #FAFAFA; + background: -moz-linear-gradient(#FAFAFA, #EAEAEA); + background: -webkit-linear-gradient(#FAFAFA, #EAEAEA); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; +} + +/* line 30, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .info, +.file-box .meta .info { + float: left; + height: 33px; + max-width: 555px; + line-height: 33px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +/* line 41, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .info span, +.file-box .meta .info span { + padding-left: 9px; + margin-left: 5px; + border-left: 1px solid #C1C1C1; + box-shadow: inset 1px 0 0 white; +} + +/* line 50, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .info span.icon, +#files .file .meta .info span.diffstat, +.file-box .meta .info span.icon { + line-height: 0; + float: left; + margin: 5px 5px 0 0; + padding: 3px; + background: #F7F7F7; + border: 1px solid #CCC; + border-right-color: #E5E5E5; + border-bottom-color: #E5E5E5; + border-radius: 3px; +} + +/* line 63, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .info span.diffstat { + height: 16px; + padding: 3px 6px; +} + +/* line 67, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .info span:first-child, +#files .file .meta .info .icon + span, +.file-box .meta .info span:first-child, +.file-box .meta .info .icon + span { + border-left: 0 none; + box-shadow: inset 0 0 0 transparent; + margin-left: 0; + padding-left: 0; +} + +/* line 76, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .info span.diffstat .diffstat-bar { + color: #D8D8D8; +} + +/* line 79, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .actions, .file-box .meta .actions { + float: right; + height: 33px; + line-height: 33px; + margin-top: 1px; +} + +/* line 85, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .actions .show-inline-notes { + display: block; + position: relative; + display: block; + float: left; + margin-right: 10px; +} + +/* line 92, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .actions .show-inline-notes label { + font-weight: bold; + margin: 5px 0; +} + +/* line 96, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .actions .show-inline-notes input { + margin: 0; +} + +/* line 99, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .actions .button-group, +.file-box .meta .actions .button-group { + float: right; + margin-top: 2px; +} + +/* line 104, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .actions code, +.file-box .meta .actions code { + background: inherit; + border: none; + font-size: 11px; + color: inherit; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + padding: 0; +} + +/* line 114, ../../../hub/static/css/mod/file-blame-blob.scss */ +.file { + margin: 15px 0; +} + +/* line 118, ../../../hub/static/css/mod/file-blame-blob.scss */ +.file .data { + overflow: auto; +} + +/* line 120, ../../../hub/static/css/mod/file-blame-blob.scss */ +.change #files .file, .file-box, .change .file { + margin-bottom: 0; +} + +/* line 122, ../../../hub/static/css/mod/file-blame-blob.scss */ +.blame .line-data { + font-size: 12px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; +} + +/* Hotfix for show-inline-notes option button */ +/* line 20, ../../../hub/static/css/app/compare.scss */ +span .show-inline-notes label { + display: inline; +} diff --git a/dist/css/app/dashboard.css b/dist/css/app/dashboard.css new file mode 100644 index 0000000..b7148da --- /dev/null +++ b/dist/css/app/dashboard.css @@ -0,0 +1,8541 @@ +@charset "UTF-8"; +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* TODO Refactor the following mods into components */ +/* line 1, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body { + padding: 30px; +} + +/* line 4, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body > :first-child { + margin-top: 0 !important; +} + +/* line 7, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body h1, +.markdown-body h2, +.markdown-body h3, +.markdown-body h4, +.markdown-body h5, +.markdown-body h6 { + margin: 20px 0 10px; + padding: 0; + font-weight: bold; + -webkit-font-smoothing: antialiased; + cursor: text; + position: relative; +} + +/* line 20, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body h2 { + font-size: 24px; + border-bottom: 1px solid #CCC; + color: black; +} + +/* line 25, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body, +.markdown-body p { + font-size: 14px; + line-height: 1.6; +} + +/* line 30, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body p, +.markdown-body blockquote, +.markdown-body ul, +.markdown-body ol, +.markdown-body dl, +.markdown-body table, +.markdown-body pre { + margin: 15px 0; +} + +/* line 39, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul, +.markdown-body ol { + padding-left: 30px; +} + +/* line 43, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul li { + line-height: 1.6; +} + +/* line 46, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul { + list-style: disc; +} + +/* line 49, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ol { + list-style: decimal; +} + +/* line 52, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table { + width: 100%; +} + +/* line 55, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table caption + thead tr:first-child th, +.markdown-body table caption + thead tr:first-child td, +.markdown-body table colgroup + thead tr:first-child th, +.markdown-body table colgroup + thead tr:first-child td, +.markdown-body table thead:first-child tr:first-child th, +.markdown-body table thead:first-child tr:first-child td { + border-top: 0; +} + +/* line 63, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table thead th { + vertical-align: bottom; +} + +/* line 66, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th { + font-weight: bold; +} + +/* line 69, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th, +.markdown-body table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #ddd; +} + +/* line 77, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th, +.markdown-body table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #ddd; +} + +/* line 85, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table tbody > tr:nth-child(odd) > td, +.markdown-body table tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} + +/* line 89, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body .progress-percentage { + color: #888; +} + +/* line 93, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page { + padding: 0px; +} + +/* line 96, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page h1, +.markdown-page h2, +.markdown-page h3, +.markdown-page h4, +.markdown-page h5, +.markdown-page h6 { + position: static; +} + +/* line 104, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page pre { + font-family: Consolas, 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 14px; +} + +/* line 108, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page .label { + background-color: transparent; +} + +/* line 111, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page dd { + margin-left: 1.5em; +} + +/* line 114, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body code { + white-space: pre-wrap; +} + +/* For other page that still depends on commits.scss */ +/* preview comment form style */ +/* line 2, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav { + margin: 10px 0; + border-bottom: 1px solid #DDD; + height: 35px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs { + display: inline-block; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs > li { + display: inline-block; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab { + display: inline-block; + margin-bottom: -1px; + padding: 8px 12px 9px; + border: 1px solid transparent; + border-bottom: 0; + font-size: 14px; + color: #666; + text-decoration: none; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab.selected { + border-color: #DDD; + border-radius: 3px 3px 0 0; + background-color: white; + color: #333; + font-weight: bold; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab:hover { + text-decoration: none; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav { + position: relative; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav ul.tabnav-tabs { + padding-left: 10px; +} + +/* line 10, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 0 10px 10px; +} + +/* line 11, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form #preview_bucket .content-body { + padding: 10px; + min-height: 132px; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form.tab-content { + overflow: initial; + position: relative; +} + +/* line 2, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 10px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-actions { + padding: 0; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + position: relative; + border: 3px solid #EEE; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + padding: 0; + background: #EEE; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content .write-content { + padding: 0 10px 10px; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; + margin: 0; +} + +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary, button.primary.classy:disabled, button.primary.classy.disabled, button.primary.classy:disabled:hover, button.primary.classy.disabled:disabled:hover, button.classy:disabled:hover.primary, button.classy.disabled:disabled:hover.primary { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4); + border-color: #74BB5A; + border-bottom-color: #509338; + background: #8ADD6D; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#8add6d', endColorstr='#60b044')"; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); + background-image: -webkit-linear-gradient(top, #8ADD6D, #60B044); +} + +/* line 2, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary.disabled { + opacity: 0.5; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy, +button.classy:disabled, +button.classy.disabled, +a.button.classy:disabled, +a.button.classy.disabled, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover:disabled, +a.button.classy.disabled:hover, +a.button.classy, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy:disabled:hover, +a.button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover { + display: inline-block; + padding: 8px 15px; + line-height: normal; + position: relative; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 12px; + font-weight: bold; + color: #666; + text-shadow: 0 1px rgba(255, 255, 255, 0.9); + background: whiteSmoke; + background: -moz-linear-gradient(whiteSmoke, #E5E5E5); + background: -webkit-linear-gradient(whiteSmoke, #E5E5E5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; + border-radius: 3px; + border: 1px solid #DDD; + border-bottom-color: #BBB; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* ================================== *\ + * Zen Form + * ================================== */ +/* line 6, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + position: fixed; + z-index: 99999; + top: 0; + left: 0; + right: 0; + bottom: 0; + padding: 24px 30px 24px 24px; +} + +/* line 16, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-input-wrap { + max-width: 640px; + position: relative; + margin: 0 auto; +} + +/** + * Buttons style + */ +/* line 25, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button, +.zen-forms-theme-switch { + position: absolute; + width: 18px; + height: 18px; + text-align: center; + top: 10px; + right: 10px; + font-size: 24px; + color: #516066; + cursor: pointer; + line-height: 1; +} + +/* line 39, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-theme-switch { + top: 28px; + font-size: 34px; +} + +/* line 44, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button:hover, +.zen-forms-theme-switch:hover { + color: #667981; +} + +/** + * Inputs basic style + */ +/* line 52, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + padding: 8px 0; + width: 100%; + background: none; + border: none; + margin-bottom: 24px; + cursor: pointer; +} + +/* line 62, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus, +.zen-forms textarea:focus { + cursor: text; +} + +/* line 67, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms textarea { + resize: none; +} + +/* line 71, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + cursor: pointer; + display: none; + padding: 8px 3; + position: absolute; + top: 0; + width: 100%; +} + +/* line 80, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms .empty + label { + display: block; +} + +/* line 84, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus + label, +.zen-forms textarea:focus + label { + display: none; +} + +/* line 89, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms :focus { + outline-color: transparent; + outline-style: none; +} + +/** + * Dark theme + */ +/* line 97, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + background: #151a1c; +} + +/* line 101, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + color: #516066; +} + +/* line 105, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + color: #667981; +} + +/** + * Light theme + */ +/* line 113, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme { + background: #fefefe; +} + +/* line 117, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme label { + color: #959697; +} + +/* line 121, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme input, +.zen-forms.light-theme textarea { + color: #707071; +} + +/* line 4, ../../../hub/static/css/mod/zen-forms.scss */ +.write-content .enable-fullscreen { + position: absolute; + top: 5px; + right: 16px; + color: #333333; + opacity: .5; + line-height: 1em; +} + +/* line 5, ../../../hub/static/css/mod/zen-forms.scss */ +.mini-icon-fullscreen::before { + content: ""; +} + +/* line 6, ../../../hub/static/css/mod/zen-forms.scss */ +.fullscreen-overlay textarea, .zen-forms textarea { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + height: 100%; + padding: 20px; + border: 0; + font-size: 21px; + line-height: 1.6em; + resize: none; + -moz-transition: color 0.15s ease-in 0; + -webkit-transition: color 0.15s ease-in 0; + transition: color 0.15s ease-in 0; + box-shadow: none; +} + +/* line 7, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms.light-theme textarea { + background: #fff; + color: #999999; +} + +/* line 8, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms .zen-forms-input-wrap { + width: 100%; + height: 100%; +} + +/* line 9, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms label[for^=zen-forms-input] { + display: none; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-zen.scss */ +.previewable-comment-form .zen-enabled textarea { + padding: 10px 18px 10px 10px; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled { + position: relative; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled .go-zen { + position: absolute; + right: 15px; + top: 5px; +} + +/* line 1, ../../../hub/static/css/mod/loader.scss */ +.loader { + display: none; + position: absolute; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + background-color: #eee; +} + +/* line 2, ../../../hub/static/css/mod/loader.scss */ +.loader .spinner { + display: block; + width: 32px; + height: 32px; + margin: 0 auto; + top: 121px; + position: relative; + background: url(/static/img/spinner.gif) no-repeat; +} + +/* line 1, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view { + position: absolute; + top: 0; + left: 0; + display: none; + margin-top: 18px; + background: white; + border: 1px solid #DDD; + border-radius: 3px; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + min-width: 120px; + z-index: 10; +} + +/* line 15, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur { + background: #3366FF; + color: white; +} + +/* line 19, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur small { + color: white; +} + +/* line 22, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view strong { + color: #3366FF; +} + +/* line 25, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur strong { + color: white; + font: bold; +} + +/* line 29, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul { + /* width: 100px; */ + list-style: none; + padding: 0; + margin: auto; +} + +/* line 35, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul li { + display: block; + padding: 5px 10px; + border-bottom: 1px solid #DDD; + cursor: pointer; + /* border-top: 1px solid #C8C8C8; */ +} + +/* line 42, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view small { + font-size: smaller; + color: #777; + font-weight: normal; +} + +/* line 9, ../../../hub/static/css/mod/comment-form.scss */ +.side-avatar { + margin-left: 0; +} + +/* fix li header for newer version of bootstrap */ +/* line 12, ../../../hub/static/css/mod/comment-form.scss */ +.comment-form-head li { + line-height: 18px; +} + +/* line 16, ../../../hub/static/css/mod/comment-form.scss */ +#new_comment .form-content { + width: 880px; + margin-left: 60px; +} + +/* line 18, ../../../hub/static/css/mod/comment-form.scss */ +.discussion-bubble-avatar { + position: relative; + float: left; + border-radius: 3px; +} + +/* line 19, ../../../hub/static/css/mod/comment-form.scss */ +.discussion-bubble-inner { + min-height: 60px; + border: 1px solid #CACACA; + background-color: white; +} + +/* line 1, ../../../hub/static/css/mod/diff-stat.scss */ +#toc li { + border-bottom: 1px solid #DDD; + list-style-type: none; + padding: 5px; +} + +/* line 7, ../../../hub/static/css/mod/diff-stat.scss */ +#toc { + margin: 15px 0; +} + +/* line 11, ../../../hub/static/css/mod/diff-stat.scss */ +#toc .diffstat { + float: right; +} + +/* line 14, ../../../hub/static/css/mod/diff-stat.scss */ +#toc .mini-icon-modified { + color: #677A85; +} + +/* line 18, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat { + white-space: nowrap; + text-align: right; + font-family: Helvetica,arial,freesans,clean,sans-serif; + color: #666; + font-weight: bold; + font-size: 11px; +} + +/* line 26, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat a { + text-decoration: none; + color: #666; +} + +/* line 30, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar { + position: relative; + left: -3px; + display: inline-block; + height: 12px; + text-decoration: none; + text-align: left; + color: #EEE; + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + line-height: 1; + -webkit-font-smoothing: antialiased; + font-size: 16px; + letter-spacing: -7px; +} + +/* line 48, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar.diff-added, +span.diffstat .diffstat-bar i.plus { + color: #61C423; + font-style: normal; +} + +/* line 53, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar.diff-added, +span.diffstat .diffstat-bar i.minus { + color: #C52323; + font-style: normal; +} + +/* line 59, ../../../hub/static/css/mod/diff-stat.scss */ +p.explain { + font-size: 12px; + color: #666; + margin: 1em 0; +} + +/* line 65, ../../../hub/static/css/mod/diff-stat.scss */ +p.explain .minibutton { + float: right; + top: -4px; +} + +/* line 3, ../../../hub/static/css/mod/diffs-pane.scss */ +.diff-cutoff { + margin-bottom: -2px; + height: 35px; + line-height: 37px; + font-size: 12px; + font-weight: bold; + color: #000; + text-align: center; + background: url("/static/img/compare_too_big.gif") 0 0 no-repeat; +} + +/* line 5, ../../../hub/static/css/mod/diffs-pane.scss */ +.fullscreen-mode { + overflow: hidden; +} + +/* line 6, ../../../hub/static/css/mod/diffs-pane.scss */ +#fullscreen-stage { + display: none; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + overflow-y: auto; + background: #fff; + z-index: 9999; +} + +/* line 7, ../../../hub/static/css/mod/diffs-pane.scss */ +#files #fullscreen-stage .file { + margin: 0; +} + +/* line 5, ../../../hub/static/css/mod/commits.scss */ +div.container div.raw { + overflow: visible; +} + +/* line 9, ../../../hub/static/css/mod/commits.scss */ +#commits-graph { + position: absolute; + left: -200px; + width: 200px; +} + +/* line 15, ../../../hub/static/css/mod/commits.scss */ +.commits-body { + position: relative; +} + +/* line 19, ../../../hub/static/css/mod/commits.scss */ +h3.commit-group-heading { + margin: 15px 0 0 0; + padding: 5px 8px; + font-size: 13px; + color: #3a505b; + text-shadow: 0 1px white; + background: #e6f1f6; + border: 1px solid #c5d5dd; + border-top-right-radius: 4px; + border-top-left-radius: 4px; +} + +/* line 31, ../../../hub/static/css/mod/commits.scss */ +h3.history { + margin-top: 15px; +} + +/* line 35, ../../../hub/static/css/mod/commits.scss */ +.commit-group { + list-style-type: none; + margin: 15px 0; + background: #f7fbfc; + border: 1px solid #c5d5dd; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +/* line 46, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item { + position: relative; + padding: 8px 8px 8px 52px; + border-top: 1px solid #e2eaee; +} + +/* line 52, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:first-child { + border-top: none; +} + +/* line 56, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:last-child { + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +/* line 61, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:nth-child(2n) { + background: #fff; +} + +/* line 65, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus { + background: #fcfce2; +} + +/* line 69, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gravatar { + float: left; + margin-left: -44px; + border-radius: 4px; +} + +/* line 75, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .commit-title { + margin: 1px 0 1px 0; + font-size: 14px; + font-weight: bold; + color: #333; +} + +/* line 82, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .commit-title a { + color: #333; +} + +/* line 86, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .commit-desc pre { + margin-top: 5px; + margin-bottom: 10px; + font-size: 12px; + color: #596063; + border-left: 1px solid #e5e5e5; + padding-left: 8px; +} + +/* line 95, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship { + font-size: 12px; + color: #888; +} + +/* line 100, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship a { + color: #444; +} + +/* line 104, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship .author-name { + color: #444; +} + +/* line 108, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship .committer { + display: block; + font-size: 11px; +} + +/* line 113, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship .committer .mini-icon { + position: relative; + top: 2px; +} + +/* line 118, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .commit-links { + position: absolute; + top: 7px; + right: 8px; + width: 243px; + text-align: right; +} + +/* line 126, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .mini-icon-clippy { + visibility: hidden; + float: left; + margin-right: 7px; + margin-top: 5px; +} + +/* line 133, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:hover .mini-icon-clippy { + visibility: visible; +} + +/* line 137, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton { + float: right; + height: 18px; + padding: 0 7px; + line-height: 22px; + font-size: 11px; + color: #4e575b; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); + background: #eff6f9; + background: -moz-linear-gradient(#eff6f9, #ddecf3); + background: -webkit-linear-gradient(#eff6f9, #ddecf3); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#eff6f9',endColorstr='#ddecf3')"; + border: 1px solid #cedee5; + border-radius: 3px; + min-width: 70px; + text-align: center; +} + +/* line 155, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton .comment-popover { + color: #91A6B1; + border-right: 1px solid #ddd; + padding-right: 4px; +} + +/* line 161, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton { + color: #5a5b4e; +} + +/* line 165, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:nth-child(2n+1) .gobutton { + border-color: #d5dcdf; + background: #f2f5f6; + background: -moz-linear-gradient(#f2f5f6, #e3eaed); + background: -webkit-linear-gradient(#f2f5f6, #e3eaed); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f2f5f6',endColorstr='#e3eaed')"; +} + +/* line 173, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton { + border-color: #e7e86d; + background: #f9fac9; + background: -moz-linear-gradient(#f9fac9, #f3f494); + background: -webkit-linear-gradient(#f9fac9, #f3f494); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f9fac9',endColorstr='#f3f494')"; +} + +/* line 181, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton:hover { + text-decoration: none; + border-color: #cedee5; + background: #fbfdfe; + background: -moz-linear-gradient(#fbfdfe, #eaf4f8); + background: -webkit-linear-gradient(#fbfdfe, #eaf4f8); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbfdfe',endColorstr='#eaf4f8')"; +} + +/* line 190, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton > .sha, .commit-group-item.navigation-focus .gobutton:hover > .sha { + display: inline-block; + height: 22px; + margin-right: -3px; +} + +/* line 196, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton > .sha .mini-icon, .commit-group-item.navigation-focus .gobutton:hover > .sha .mini-icon { + position: relative; + top: 2px; + border-radius: 30px; + border: 1px solid #CFDEE5; + background-color: rgba(255, 255, 255, 0.5); + color: #91a6b1; + margin-left: 5px; + width: 16px; +} + +/* line 207, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton > .sha .mini-icon { + border: 1px solid #E7E86D; + color: #c3c45c; +} + +/* line 212, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton.with-comments { + padding-left: 5px; +} + +/* line 216, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton.with-comments .sha, .commit-group-item.navigation-focus .gobutton.with-comments:hover .sha { + padding-left: 8px; + border-left: 1px solid #cfdee5; +} + +/* line 221, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton.with-comments .sha { + border-left-color: #e1e29e; +} + +/* line 225, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton .comment-count, .commit-group-item.navigation-focus .gobutton:hover .comment-count { + float: left; + height: 22px; + padding-right: 9px; + line-height: 24px; + font-weight: bold; + border-right: 1px solid #f6fafc; +} + +/* line 234, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton .comment-count .mini-icon, .commit-group-item.navigation-focus .gobutton:hover .comment-count .mini-icon { + position: relative; + top: 2px; + color: #91A6B1; +} + +/* line 240, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton .comment-count .mini-icon { + color: #C3C45C; +} + +/* line 244, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .browse-button, .commit-group-item .compare-button { + clear: left; + margin-top: 1px; + font-size: 11px; + font-weight: bold; + text-align: right; + color: #999; +} + +/* line 253, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .browse-button .mini-icon { + position: relative; + top: 2px; +} + +/* line 258, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .browse-button:hover { + color: #4183C4; + background-position: 100% -95px; +} + +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 400; + src: local("Source Code Pro"), local("SourceCodePro-Regular"), url("/static/css/fonts/SourceCodePro-Regular.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 500; + src: local("Source Code Pro Medium"), local("SourceCodePro-Medium"), url("/static/css/fonts/SourceCodePro-Medium.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 600; + src: local("Source Code Pro Semibold"), local("SourceCodePro-Semibold"), url("/static/css/fonts/SourceCodePro-Semibold.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 700; + src: local("Source Code Pro Bold"), local("SourceCodePro-Bold"), url("/static/css/fonts/SourceCodePro-Bold.woff") format("woff"); +} +/* line 3, ../../../hub/static/css/mod/diff-base.scss */ +.code pre, xmp, plaintext, listing { + display: block; + font-size: 13px; + font-family: 'Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; + white-space: pre; + margin: 0; + padding: 0; +} + +/* line 12, ../../../hub/static/css/mod/diff-base.scss */ +.code pre { + line-height: 18px; +} + +/* line 16, ../../../hub/static/css/mod/diff-base.scss */ +.font-consolas pre { + font-family: Consolas,'Source Code Pro',Courier,Monaco,Menlo,monospace; +} + +/* line 20, ../../../hub/static/css/mod/diff-base.scss */ +.font-monaco pre { + font-family: Monaco,'Source Code Pro',Courier,Consolas,Menlo,monospace; +} + +/* line 24, ../../../hub/static/css/mod/diff-base.scss */ +.font-courier pre { + font-family: Courier,'Source Code Pro',Monaco,Consolas,Menlo,monospace; +} + +/* line 28, ../../../hub/static/css/mod/diff-base.scss */ +.font-dejavu pre { + font-family: 'DejaVu Sans Mono','Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; +} + +/* line 32, ../../../hub/static/css/mod/diff-base.scss */ +.font-ubuntu pre { + font-family: 'Ubuntu Mono','Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; +} + +/* line 37, ../../../hub/static/css/mod/diff-base.scss */ +pre, code, tt { + font-size: 12px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + border: 0; +} + +/* line 43, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .normal { + background-color: #FFF; +} + +/* line 47, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .deletion { + color: black; + background-color: #FDD; +} +/* line 50, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .deletion .x, .highlight .deletion .c { + color: black; + background-color: #ffaaaa; +} + +/* line 56, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .insertion { + color: black; + background-color: #DFD; +} +/* line 59, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .insertion .i, .highlight .insertion .c { + color: black; + background-color: #aaffaa; +} + +/* line 65, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped { + color: #cacaca; + background-color: #f9f9f9; +} +/* line 69, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a { + color: #cacaca; + vertical-align: middle; +} +/* line 73, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a:hover { + text-decoration: none; +} +/* line 77, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a[data-type="after"], .highlight .skipped a[data-type="before"] { + font-size: 20px; +} + +/* line 266, ../../../hub/static/css/mod/commits.scss */ +#files.commentable tr td pre:hover { + background-color: #FFC; +} + +/* line 268, ../../../hub/static/css/mod/commits.scss */ +.full-commit { + margin: 10px 0; + padding: 8px 8px 0; + background: #E6F1F6; + border: 1px solid #C5D5DD; + border-radius: 4px; +} + +/* line 276, ../../../hub/static/css/mod/commits.scss */ +.full-commit .commit-meta { + margin-left: -8px; + width: 100%; + padding: 8px; + background: white; + border-top: 1px solid #D8E6EC; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +/* line 286, ../../../hub/static/css/mod/commits.scss */ +.full-commit .commit-desc { + display: block; + margin: -4px 0 10px 0; +} + +/* line 291, ../../../hub/static/css/mod/commits.scss */ +.full-commit .commit-desc pre { + max-width: 100%; + font-size: 14px; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); +} + +/* line 297, ../../../hub/static/css/mod/commits.scss */ +.full-commit .browse-button { + float: right; + margin: -3px -3px 0 0; + height: 26px; + padding: 0 10px; + line-height: 26px; + font-size: 13px; + font-weight: bold; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); + background: #EFF6F9; + background: -moz-linear-gradient(#EFF6F9, #DDECF3); + background: -webkit-linear-gradient(#EFF6F9, #DDECF3); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#eff6f9',endColorstr='#ddecf3')"; + border: 1px solid #CEDEE5; + border-radius: 3px; +} + +/* line 314, ../../../hub/static/css/mod/commits.scss */ +.full-commit p.commit-title { + margin: 0 0 8px 0; + font-size: 18px; + font-weight: bold; + color: #213F4D; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); +} + +/* line 322, ../../../hub/static/css/mod/commits.scss */ +.clearfix { + display: block; +} + +/* line 326, ../../../hub/static/css/mod/commits.scss */ +.full-commit .sha-block { + float: right; + margin-left: 15px; + color: #888; + font-size: 12px; +} + +/* line 333, ../../../hub/static/css/mod/commits.scss */ +.full-commit .authorship { + margin-top: -2px; + margin-left: -4px; + margin-bottom: -4px; + font-size: 14px; + color: #999; +} + +/* line 341, ../../../hub/static/css/mod/commits.scss */ +.full-commit .authorship .gravatar { + margin-top: -2px; + margin-right: 3px; + vertical-align: middle; + border-radius: 3px; +} + +/* line 347, ../../../hub/static/css/mod/commits.scss */ +#files { + position: relative; +} + +/* line 351, ../../../hub/static/css/mod/commits.scss */ +#files .file, .file-box { + border: 1px solid #CCC; + margin-bottom: 13px; + position: relative; + background-color: #DDD; +} + +/* line 358, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta, .file-box .meta { + overflow: hidden; + padding: 5px 10px; + font-size: 12px; + height: 33px; + text-align: left; + color: #555; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #D8D8D8; + background: #FAFAFA; + background: -moz-linear-gradient(#FAFAFA, #EAEAEA); + background: -webkit-linear-gradient(#FAFAFA, #EAEAEA); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; +} + +/* line 373, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .info, .file-box .meta .info { + float: left; + height: 33px; + line-height: 33px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; +} + +/* line 380, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .actions, .file-box .meta .actions { + float: right; + height: 33px; + line-height: 33px; + margin-top: 1px; +} + +/* line 387, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .actions li:first-child, .file-box .meta .actions li:first-child { + background: transparent; + margin-left: 0; + padding-left: 0; +} + +/* line 393, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .actions li, .file-box .meta .actions li { + list-style-type: none; + float: left; + margin: 0 0 0 7px; +} + +/* line 399, ../../../hub/static/css/mod/commits.scss */ +.button-group li { + margin: 0 !important; +} + +/* line 403, ../../../hub/static/css/mod/commits.scss */ +.pagination-older-newer a { + padding: .1em .3em; + margin: .2em; + text-decoration: none; + color: #369; + float: none; +} + +/* line 411, ../../../hub/static/css/mod/commits.scss */ +.pagination-older-newer a:hover, .pagination a:active { + background-color: transparent; + color: #36f; +} + +/* line 416, ../../../hub/static/css/mod/commits.scss */ +.pagination-older-newer span.disabled { + padding: .1em .3em; + margin: .2em; + color: #bbb; + float: none; +} + +/* line 423, ../../../hub/static/css/mod/commits.scss */ +.commit .sha-block, .commit .sha { + padding-right: 3px; + font-size: 11px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; +} + +/* line 429, ../../../hub/static/css/mod/commits.scss */ +#files .file .data .line_numbers, .file-box .data .line_numbers { + background-color: #ECECEC; + color: #AAA; + padding: 0 6px; + border-right: 1px solid #DDD; + text-align: right; + cursor: pointer; +} + +/* line 437, ../../../hub/static/css/mod/commits.scss */ +#files .file .data .line_numbers a { + color: #AAA; +} + +/* line 441, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-added:before { + content: "\f06b"; +} + +/* line 442, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-removed:before { + content: "\f06c"; +} + +/* line 443, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-modified:before { + content: "\f06d"; +} + +/* line 444, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-moved:before, .mini-icon-renamed:before { + content: "\f06e"; +} + +/* line 445, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-commit-comment:before { + content: "\f02b"; +} + +/* line 447, ../../../hub/static/css/mod/commits.scss */ +.mega-icon-beer:before { + content: "\f269"; +} + +/* line 448, ../../../hub/static/css/mod/commits.scss */ +.mega-icon-commit-comment:before { + content: "\f22b"; +} + +/* line 450, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .info span.icon, +#files .file .meta .info span.diffstat, +.file-box .meta .info span.icon { + line-height: 0; + float: left; + margin: 5px 5px 0 0; + padding: 3px; + background: #F7F7F7; + border: 1px solid #CCC; + border-right-color: #E5E5E5; + border-bottom-color: #E5E5E5; + border-radius: 3px; +} + +/* line 463, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .info span.diffstat { + height: 16px; + padding: 3px 6px; +} + +/* line 467, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .info span:first-child, +#files .file .meta .info .icon + span, +.file-box .meta .info span:first-child, +.file-box .meta .info .icon + span { + border-left: 0 none; + box-shadow: inset 0 0 0 transparent; + margin-left: 0; + padding-left: 0; +} + +/* line 477, ../../../hub/static/css/mod/commits.scss */ +.commit-meta.comment-row .mini-icon { + color: #939AA0; + margin: 0 2px 0 1px; + top: 2px; + text-decoration: none; +} + +/* line 478, ../../../hub/static/css/mod/commits.scss */ +#files .file .data.empty, .file-box .data.empty { + padding: 10px 15px; + color: #777; +} + +/* line 482, ../../../hub/static/css/mod/commits.scss */ +.timeout { + width: 873px; + height: 528px; + border: 1px solid #C5D5DD; + background: url("/static/img/timeout.jpg") #E6F1F6 no-repeat; + background-position: 90% 50%; + padding: 0 32px 0 33px; + border-radius: 3px; +} + +/* line 491, ../../../hub/static/css/mod/commits.scss */ +.timeout h3 { + color: white; + font-size: 18px; + font-weight: bold; + text-shadow: darkGray 1px 1px 0; + padding: 15px 0 15px 0; +} + +/* line 498, ../../../hub/static/css/mod/commits.scss */ +.timeout h3 strong { + font-size: 30px; + display: block; +} + +/* line 502, ../../../hub/static/css/mod/commits.scss */ +.timeout p { + color: white; +} + +/* line 506, ../../../hub/static/css/mod/commits.scss */ +.side-avatar { + position: absolute; + float: left; + margin-left: -60px; +} + +/* line 512, ../../../hub/static/css/mod/commits.scss */ +div.generated, div.binary { + text-align: center; + background-color: #ddd; + padding: 30px; +} + +/* line 518, ../../../hub/static/css/mod/commits.scss */ +.commit-history-header { + margin-bottom: 55px; +} +/* line 521, ../../../hub/static/css/mod/commits.scss */ +.commit-history-header #search-commits { + margin: 15px 5px; +} + +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.svg") format("svg"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 8, ../../../hub/static/css/mod/source.scss */ +.last-bar { + margin-top: 5px; +} + +/* line 11, ../../../hub/static/css/mod/source.scss */ +p.last-commit { + margin: 10px 0 -5px 0; + font-size: 11px; + color: #888; +} +/* line 16, ../../../hub/static/css/mod/source.scss */ +p.last-commit .mini-icon { + color: #BBB; + position: relative; + top: 1px; +} + +/* line 22, ../../../hub/static/css/mod/source.scss */ +.pr-latest-branch { + color: #888; + margin-top: 10px; + line-height: 27px; + border-bottom: 1px solid #DDD; + padding-bottom: 10px; +} + +/* line 29, ../../../hub/static/css/mod/source.scss */ +.pr-latest-branch #pullrequest-btn { + margin-right: 5px; +} + +/* line 32, ../../../hub/static/css/mod/source.scss */ +.mini-icon, .mega-icon { + line-height: 1; + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + line-height: 1; + -webkit-font-smoothing: antialiased; + text-decoration: none; +} + +/* line 43, ../../../hub/static/css/mod/source.scss */ +.commit-tease { + margin: 10px 0; + padding: 8px 8px 0; + background: #EEE; + border: 1px solid #C5D5DD; + border-radius: 4px; +} + +/* line 50, ../../../hub/static/css/mod/source.scss */ +.commit-tease p.commit-title { + margin: 0 0 6px 0; +} + +/* line 53, ../../../hub/static/css/mod/source.scss */ +.commit .commit-title, .commit .commit-title a { + color: #4E575B; +} + +/* line 56, ../../../hub/static/css/mod/source.scss */ +.commit-tease .commit-meta { + margin-left: -8px; + width: 100%; + padding: 8px; + background: white; + border-top: 1px solid #D8E6EC; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +/* line 65, ../../../hub/static/css/mod/source.scss */ +.commit-tease .sha-block { + float: right; + color: #888; +} + +/* line 69, ../../../hub/static/css/mod/source.scss */ +.commit .sha-block, .commit .sha { + font-size: 11px; + font-family: Monaco,"Courier New","DejaVu Sans Mono","Bitstream Vera Sans Mono",monospace; +} + +/* line 73, ../../../hub/static/css/mod/source.scss */ +.commit-tease .authorship { + font-size: 12px; + color: #999; + margin-left: -4px; + margin-bottom: -4px; + margin-top: -2px; +} +/* line 79, ../../../hub/static/css/mod/source.scss */ +.commit-tease .authorship .gravatar { + margin-top: -2px; + margin-right: 3px; + vertical-align: middle; + border-radius: 3px; +} +/* line 85, ../../../hub/static/css/mod/source.scss */ +.commit-tease .authorship a, .commit-tease .authorship span { + color: #444; + text-decoration: none; + font-weight: bold; +} +/* line 89, ../../../hub/static/css/mod/source.scss */ +.commit-tease .authorship a:hover, .commit-tease .authorship span:hover { + text-decoration: underline; +} + +/* line 95, ../../../hub/static/css/mod/source.scss */ +.commit-tease .mini-icon-clippy { + margin-right: 5px; + float: right; +} + +/* line 99, ../../../hub/static/css/mod/source.scss */ +.mini-icon-clippy { + display: inline-block; + height: 16px; + width: 16px; + background-color: transparent; + background-position: 0 0; + background-repeat: no-repeat; + vertical-align: text-bottom; + background-image: url("/static/img/clippy.png"); +} + +/* line 109, ../../../hub/static/css/mod/source.scss */ +.mini-icon-u-list:before { + content: "\f061"; +} + +/* line 110, ../../../hub/static/css/mod/source.scss */ +.mini-icon-text-file:before { + content: "\f211"; +} + +/* line 111, ../../../hub/static/css/mod/source.scss */ +.mini-icon-code-file:before { + content: "\f210"; +} + +/* line 112, ../../../hub/static/css/mod/source.scss */ +.mini-icon-directory:before { + content: "\f016"; +} + +/* line 113, ../../../hub/static/css/mod/source.scss */ +.mini-icon-submodule:before { + content: "\f017"; +} + +/* line 115, ../../../hub/static/css/mod/source.scss */ +ul.browsefiles li { + padding: 3px 0 2px 0; + border-top: 1px solid #eee; +} + +/* line 116, ../../../hub/static/css/mod/source.scss */ +ul.browsefiles a.mode-040000 { + color: #333; +} + +/* line 117, ../../../hub/static/css/mod/source.scss */ +ul.browsefiles li a { + display: block; +} + +/* line 118, ../../../hub/static/css/mod/source.scss */ +ul.browsefiles li:hover { + background: #eee; +} + +/* line 119, ../../../hub/static/css/mod/source.scss */ +ul.browsefiles li a.warn-bad { + color: red; +} + +/* line 1, ../../../hub/static/css/mod/source-edit.scss */ +.raw { + overflow: visible; +} + +/* line 2, ../../../hub/static/css/mod/source-edit.scss */ +div.helpop { + float: right; + width: 137px; + height: 140px; + margin-top: -140px; + margin-right: 20px; + overflow: hidden; + position: relative; +} + +/* line 9, ../../../hub/static/css/mod/source-edit.scss */ +div.helpop .popic { + display: block; + position: absolute; + bottom: -115px; + -webkit-transition: all 300ms ease-out; + -moz-transition: all 300ms ease-out; + -o-transition: all 300ms ease-out; + -ms-transition: all 300ms ease-out; +} + +/* line 19, ../../../hub/static/css/mod/source-edit.scss */ +div.helpop:hover .popic { + bottom: -10px; + -webkit-transition: all 300ms ease-out; + -moz-transition: all 300ms ease-out; + -o-transition: all 300ms ease-out; + -ms-transition: all 300ms ease-out; +} + +/* Like these */ +/* highlight style */ +/* line 2, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .hll { + background-color: #ffffcc; +} + +/* line 3, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight { + background: #ffffff; +} + +/* line 4, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .c { + color: #808080; +} + +/* Comment */ +/* line 5, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .err { + color: #F00000; + background-color: #F0A0A0; +} + +/* Error */ +/* line 6, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .k { + color: #008000; + font-weight: bold; +} + +/* Keyword */ +/* line 7, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .o { + color: #303030; +} + +/* Operator */ +/* line 8, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .cm { + color: #808080; +} + +/* Comment.Multiline */ +/* line 9, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .cp { + color: #507090; +} + +/* Comment.Preproc */ +/* line 10, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .c1 { + color: #808080; +} + +/* Comment.Single */ +/* line 11, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .cs { + color: #cc0000; + font-weight: bold; +} + +/* Comment.Special */ +/* line 12, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gd { + color: #A00000; +} + +/* Generic.Deleted */ +/* line 13, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ge { + font-style: italic; +} + +/* Generic.Emph */ +/* line 14, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gr { + color: #FF0000; +} + +/* Generic.Error */ +/* line 15, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gh { + color: #000080; + font-weight: bold; +} + +/* Generic.Heading */ +/* line 16, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gi { + color: #00A000; +} + +/* Generic.Inserted */ +/* line 17, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .go { + color: #808080; +} + +/* Generic.Output */ +/* line 18, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gp { + color: #c65d09; + font-weight: bold; +} + +/* Generic.Prompt */ +/* line 19, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gs { + font-weight: bold; +} + +/* Generic.Strong */ +/* line 20, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gu { + color: #800080; + font-weight: bold; +} + +/* Generic.Subheading */ +/* line 21, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gt { + color: #0040D0; +} + +/* Generic.Traceback */ +/* line 22, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kc { + color: #008000; + font-weight: bold; +} + +/* Keyword.Constant */ +/* line 23, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kd { + color: #008000; + font-weight: bold; +} + +/* Keyword.Declaration */ +/* line 24, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kn { + color: #008000; + font-weight: bold; +} + +/* Keyword.Namespace */ +/* line 25, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kp { + color: #003080; + font-weight: bold; +} + +/* Keyword.Pseudo */ +/* line 26, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kr { + color: #008000; + font-weight: bold; +} + +/* Keyword.Reserved */ +/* line 27, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kt { + color: #303090; + font-weight: bold; +} + +/* Keyword.Type */ +/* line 28, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .m { + color: #6000E0; + font-weight: bold; +} + +/* Literal.Number */ +/* line 29, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .s { + background-color: #fff0f0; +} + +/* Literal.String */ +/* line 30, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .na { + color: #0000C0; +} + +/* Name.Attribute */ +/* line 31, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nb { + color: #007020; +} + +/* Name.Builtin */ +/* line 32, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nc { + color: #B00060; + font-weight: bold; +} + +/* Name.Class */ +/* line 33, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .no { + color: #003060; + font-weight: bold; +} + +/* Name.Constant */ +/* line 34, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nd { + color: #505050; + font-weight: bold; +} + +/* Name.Decorator */ +/* line 35, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ni { + color: #800000; + font-weight: bold; +} + +/* Name.Entity */ +/* line 36, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ne { + color: #F00000; + font-weight: bold; +} + +/* Name.Exception */ +/* line 37, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nf { + color: #0060B0; + font-weight: bold; +} + +/* Name.Function */ +/* line 38, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nl { + color: #907000; + font-weight: bold; +} + +/* Name.Label */ +/* line 39, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nn { + color: #0e84b5; + font-weight: bold; +} + +/* Name.Namespace */ +/* line 40, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nt { + color: #007000; +} + +/* Name.Tag */ +/* line 41, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nv { + color: #906030; +} + +/* Name.Variable */ +/* line 42, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ow { + color: #000000; + font-weight: bold; +} + +/* Operator.Word */ +/* line 43, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .w { + color: #bbbbbb; +} + +/* Text.Whitespace */ +/* line 44, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mf { + color: #6000E0; + font-weight: bold; +} + +/* Literal.Number.Float */ +/* line 45, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mh { + color: #005080; + font-weight: bold; +} + +/* Literal.Number.Hex */ +/* line 46, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mi { + color: #0000D0; + font-weight: bold; +} + +/* Literal.Number.Integer */ +/* line 47, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mo { + color: #4000E0; + font-weight: bold; +} + +/* Literal.Number.Oct */ +/* line 48, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sb { + background-color: #fff0f0; +} + +/* Literal.String.Backtick */ +/* line 49, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sc { + color: #0040D0; +} + +/* Literal.String.Char */ +/* line 50, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sd { + color: #D04020; +} + +/* Literal.String.Doc */ +/* line 51, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .s2 { + background-color: #fff0f0; +} + +/* Literal.String.Double */ +/* line 52, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .se { + color: #606060; + font-weight: bold; + background-color: #fff0f0; +} + +/* Literal.String.Escape */ +/* line 53, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sh { + background-color: #fff0f0; +} + +/* Literal.String.Heredoc */ +/* line 54, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .si { + background-color: #e0e0e0; +} + +/* Literal.String.Interpol */ +/* line 55, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sx { + color: #D02000; + background-color: #fff0f0; +} + +/* Literal.String.Other */ +/* line 56, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sr { + color: #000000; + background-color: #fff0ff; +} + +/* Literal.String.Regex */ +/* line 57, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .s1 { + background-color: #fff0f0; +} + +/* Literal.String.Single */ +/* line 58, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ss { + color: #A06000; +} + +/* Literal.String.Symbol */ +/* line 59, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .bp { + color: #007020; +} + +/* Name.Builtin.Pseudo */ +/* line 60, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .vc { + color: #306090; +} + +/* Name.Variable.Class */ +/* line 61, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .vg { + color: #d07000; + font-weight: bold; +} + +/* Name.Variable.Global */ +/* line 62, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .vi { + color: #3030B0; +} + +/* Name.Variable.Instance */ +/* line 63, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .il { + color: #0000D0; + font-weight: bold; +} + +/* Literal.Number.Integer.Long */ +/* Highlight style from pygments */ +/* line 2, ../../../hub/static/css/mod/code-highlight.scss */ +.code .hll { + background-color: #ffffcc; +} + +/* line 3, ../../../hub/static/css/mod/code-highlight.scss */ +.code { + background: #ffffff; +} + +/* line 4, ../../../hub/static/css/mod/code-highlight.scss */ +.code .c { + color: #808080; +} + +/* Comment */ +/* line 5, ../../../hub/static/css/mod/code-highlight.scss */ +.code .err { + color: #F00000; + background-color: #F0A0A0; +} + +/* Error */ +/* line 6, ../../../hub/static/css/mod/code-highlight.scss */ +.code .k { + color: #008000; + font-weight: bold; +} + +/* Keyword */ +/* line 7, ../../../hub/static/css/mod/code-highlight.scss */ +.code .o { + color: #303030; +} + +/* Operator */ +/* line 8, ../../../hub/static/css/mod/code-highlight.scss */ +.code .cm { + color: #808080; +} + +/* Comment.Multiline */ +/* line 9, ../../../hub/static/css/mod/code-highlight.scss */ +.code .cp { + color: #507090; +} + +/* Comment.Preproc */ +/* line 10, ../../../hub/static/css/mod/code-highlight.scss */ +.code .c1 { + color: #808080; +} + +/* Comment.Single */ +/* line 11, ../../../hub/static/css/mod/code-highlight.scss */ +.code .cs { + color: #cc0000; + font-weight: bold; +} + +/* Comment.Special */ +/* line 12, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gd { + color: #A00000; +} + +/* Generic.Deleted */ +/* line 13, ../../../hub/static/css/mod/code-highlight.scss */ +.code .ge { + font-style: italic; +} + +/* Generic.Emph */ +/* line 14, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gr { + color: #FF0000; +} + +/* Generic.Error */ +/* line 15, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gh { + color: #000080; + font-weight: bold; +} + +/* Generic.Heading */ +/* line 16, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gi { + color: #00A000; +} + +/* Generic.Inserted */ +/* line 17, ../../../hub/static/css/mod/code-highlight.scss */ +.code .go { + color: #808080; +} + +/* Generic.Output */ +/* line 18, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gp { + color: #c65d09; + font-weight: bold; +} + +/* Generic.Prompt */ +/* line 19, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gs { + font-weight: bold; +} + +/* Generic.Strong */ +/* line 20, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gu { + color: #800080; + font-weight: bold; +} + +/* Generic.Subheading */ +/* line 21, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gt { + color: #0040D0; +} + +/* Generic.Traceback */ +/* line 22, ../../../hub/static/css/mod/code-highlight.scss */ +.code .kc { + color: #008000; + font-weight: bold; +} + +/* Keyword.Constant */ +/* line 23, ../../../hub/static/css/mod/code-highlight.scss */ +.code .kd { + color: #008000; + font-weight: bold; +} + +/* Keyword.Declaration */ +/* line 24, ../../../hub/static/css/mod/code-highlight.scss */ +.code .kn { + color: #008000; + font-weight: bold; +} + +/* Keyword.Namespace */ +/* line 25, ../../../hub/static/css/mod/code-highlight.scss */ +.code .kp { + color: #003080; + font-weight: bold; +} + +/* Keyword.Pseudo */ +/* line 26, ../../../hub/static/css/mod/code-highlight.scss */ +.code .kr { + color: #008000; + font-weight: bold; +} + +/* Keyword.Reserved */ +/* line 27, ../../../hub/static/css/mod/code-highlight.scss */ +.code .kt { + color: #303090; + font-weight: bold; +} + +/* Keyword.Type */ +/* line 28, ../../../hub/static/css/mod/code-highlight.scss */ +.code .m { + color: #6000E0; + font-weight: bold; +} + +/* Literal.Number */ +/* line 29, ../../../hub/static/css/mod/code-highlight.scss */ +.code .s { + background-color: #fff0f0; +} + +/* Literal.String */ +/* line 30, ../../../hub/static/css/mod/code-highlight.scss */ +.code .na { + color: #0000C0; +} + +/* Name.Attribute */ +/* line 31, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nb { + color: #007020; +} + +/* Name.Builtin */ +/* line 32, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nc { + color: #B00060; + font-weight: bold; +} + +/* Name.Class */ +/* line 33, ../../../hub/static/css/mod/code-highlight.scss */ +.code .no { + color: #003060; + font-weight: bold; +} + +/* Name.Constant */ +/* line 34, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nd { + color: #505050; + font-weight: bold; +} + +/* Name.Decorator */ +/* line 35, ../../../hub/static/css/mod/code-highlight.scss */ +.code .ni { + color: #800000; + font-weight: bold; +} + +/* Name.Entity */ +/* line 36, ../../../hub/static/css/mod/code-highlight.scss */ +.code .ne { + color: #F00000; + font-weight: bold; +} + +/* Name.Exception */ +/* line 37, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nf { + color: #0060B0; + font-weight: bold; +} + +/* Name.Function */ +/* line 38, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nl { + color: #907000; + font-weight: bold; +} + +/* Name.Label */ +/* line 39, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nn { + color: #0e84b5; + font-weight: bold; +} + +/* Name.Namespace */ +/* line 40, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nt { + color: #007000; +} + +/* Name.Tag */ +/* line 41, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nv { + color: #906030; +} + +/* Name.Variable */ +/* line 42, ../../../hub/static/css/mod/code-highlight.scss */ +.code .ow { + color: #000000; + font-weight: bold; +} + +/* Operator.Word */ +/* line 43, ../../../hub/static/css/mod/code-highlight.scss */ +.code .w { + color: #bbbbbb; +} + +/* Text.Whitespace */ +/* line 44, ../../../hub/static/css/mod/code-highlight.scss */ +.code .mf { + color: #6000E0; + font-weight: bold; +} + +/* Literal.Number.Float */ +/* line 45, ../../../hub/static/css/mod/code-highlight.scss */ +.code .mh { + color: #005080; + font-weight: bold; +} + +/* Literal.Number.Hex */ +/* line 46, ../../../hub/static/css/mod/code-highlight.scss */ +.code .mi { + color: #0000D0; + font-weight: bold; +} + +/* Literal.Number.Integer */ +/* line 47, ../../../hub/static/css/mod/code-highlight.scss */ +.code .mo { + color: #4000E0; + font-weight: bold; +} + +/* Literal.Number.Oct */ +/* line 48, ../../../hub/static/css/mod/code-highlight.scss */ +.code .sb { + background-color: #fff0f0; +} + +/* Literal.String.Backtick */ +/* line 49, ../../../hub/static/css/mod/code-highlight.scss */ +.code .sc { + color: #0040D0; +} + +/* Literal.String.Char */ +/* line 50, ../../../hub/static/css/mod/code-highlight.scss */ +.code .sd { + color: #D04020; +} + +/* Literal.String.Doc */ +/* line 51, ../../../hub/static/css/mod/code-highlight.scss */ +.code .s2 { + background-color: #fff0f0; +} + +/* Literal.String.Double */ +/* line 52, ../../../hub/static/css/mod/code-highlight.scss */ +.code .se { + color: #606060; + font-weight: bold; + background-color: #fff0f0; +} + +/* Literal.String.Escape */ +/* line 53, ../../../hub/static/css/mod/code-highlight.scss */ +.code .sh { + background-color: #fff0f0; +} + +/* Literal.String.Heredoc */ +/* line 54, ../../../hub/static/css/mod/code-highlight.scss */ +.code .si { + background-color: #e0e0e0; +} + +/* Literal.String.Interpol */ +/* line 55, ../../../hub/static/css/mod/code-highlight.scss */ +.code .sx { + color: #D02000; + background-color: #fff0f0; +} + +/* Literal.String.Other */ +/* line 56, ../../../hub/static/css/mod/code-highlight.scss */ +.code .sr { + color: #000000; + background-color: #fff0ff; +} + +/* Literal.String.Regex */ +/* line 57, ../../../hub/static/css/mod/code-highlight.scss */ +.code .s1 { + background-color: #fff0f0; +} + +/* Literal.String.Single */ +/* line 58, ../../../hub/static/css/mod/code-highlight.scss */ +.code .ss { + color: #A06000; +} + +/* Literal.String.Symbol */ +/* line 59, ../../../hub/static/css/mod/code-highlight.scss */ +.code .bp { + color: #007020; +} + +/* Name.Builtin.Pseudo */ +/* line 60, ../../../hub/static/css/mod/code-highlight.scss */ +.code .vc { + color: #306090; +} + +/* Name.Variable.Class */ +/* line 61, ../../../hub/static/css/mod/code-highlight.scss */ +.code .vg { + color: #d07000; + font-weight: bold; +} + +/* Name.Variable.Global */ +/* line 62, ../../../hub/static/css/mod/code-highlight.scss */ +.code .vi { + color: #3030B0; +} + +/* Name.Variable.Instance */ +/* line 63, ../../../hub/static/css/mod/code-highlight.scss */ +.code .il { + color: #0000D0; + font-weight: bold; +} + +/* Literal.Number.Integer.Long */ +/* line 1, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav { + margin-top: 6px; +} + +/* line 3, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label { + position: relative; + display: inline-block; + margin-left: 3px; + padding: 3px 7px; + border: 1px solid #ccc; + border-radius: 3px; + color: #333; + background-color: #fafafa; + vertical-align: middle; +} + +/* line 15, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::before, .metanav .counts-label::after { + content: ""; + position: absolute; + top: 50%; + right: 100%; + display: block; + margin-right: 0px; + margin-top: -6px; + width: 0; + height: 0; + border: 6px solid transparent; + border-right-color: #ccc; +} + +/* line 29, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::after { + margin-right: -1px; + border-right-color: #fafafa; +} + +/* line 2, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.metabox { + display: inline-block; + height: 8px; + background: #ccc; + text-indent: -9999px; + font-size: 12px; +} + +/* line 9, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats { + font: 13px Helvetica, arial, freesans, clean, sans-serif; + line-height: 1.4; + margin: 0; + padding: 0; + border: 0; + position: relative; + float: right; + width: 135px; + opacity: 0.5; + padding-bottom: 10px; +} + +/* line 21, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats:hover { + opacity: 1; +} + +/* line 24, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats:hover .list-tip { + display: block; +} + +/* line 27, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats a { + color: #4183c4; + text-decoration: none; +} + +/* line 31, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats-graph { + height: 10px; + overflow: hidden; +} + +/* line 35, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats-graph span { + display: inline-block; + height: 6px; + background: #ccc; + text-indent: -9999px; + float: left; +} + +/* line 42, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip, ul.list-tip { + border-radius: 3px; + box-shadow: 0 0 5px #ccc; + border: 1px solid #ddd; + background: #fff; + position: absolute; + padding-left: 0px; + top: 20px; + left: -20px; + width: 175px; + z-index: 100; + display: none; + margin-top: 0px; +} + +/* line 56, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip:before, ul.list-tip:before { + content: "▲"; + font-size: 14px; + margin: 0 auto; + width: 14px; + display: block; + margin-top: -13px; + color: #fff; + text-shadow: -1px -1px 2px #ccc; +} + +/* line 66, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li, ul.list-tip li { + margin: 0; + line-height: 100%; + list-style: none; + border-bottom: 1px solid #eee; + font-weight: bold; +} + +/* line 73, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li a, ol.list-tip li .other, ul.list-tip li a, ul.list-tip li .other { + color: #333; + padding: 8px 10px; + display: block; +} + +/* line 78, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li span.color-block, ul.list-tip li span.color-block { + display: inline-block; + width: 8px; + height: 10px; + margin-right: 5px; +} + +/* line 84, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li span.percent, ul.list-tip li span.percent { + float: right; + color: #999; +} + +/* fix project title for newer version of bootstrap*/ +/* line 6, ../../../hub/static/css/mod/project-info.scss */ +.pagehead .pull-left { + margin: 0; + font-size: 30px; + line-height: 36px; +} + +/* Hotfix for FlatUI */ +/* line 13, ../../../hub/static/css/mod/project-info.scss */ +.pagehead h2.pull-left { + margin: 0; +} + +/* line 17, ../../../hub/static/css/mod/project-info.scss */ +#project-info { + border: 1px solid #c5d5dd; + border-radius: 3px; + width: 100%; +} + +/* line 22, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div { + padding: 10px; +} + +/* line 25, ../../../hub/static/css/mod/project-info.scss */ +#project-info p { + margin: 0px; +} + +/* line 28, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div.team-label { + border-top: 1px solid #ccc; +} + +/* line 32, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div.git-url { + border-top: 1px solid #ccc; +} + +/* line 36, ../../../hub/static/css/mod/project-info.scss */ +#project-info input.git-url { + width: 480px; + margin: 0px; + cursor: auto; +} + +/* line 43, ../../../hub/static/css/mod/project-info.scss */ +#project-info .ssh div.ssh-url { + display: inline; +} +/* line 46, ../../../hub/static/css/mod/project-info.scss */ +#project-info .ssh div.http-url { + display: none; +} + +/* line 52, ../../../hub/static/css/mod/project-info.scss */ +#project-info .http div.ssh-url { + display: none; +} +/* line 55, ../../../hub/static/css/mod/project-info.scss */ +#project-info .http div.http-url { + display: inline; +} + +/* line 60, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar { + margin-top: 12px; + border-bottom: 1px solid #DDD; +} + +/* line 61, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar #back-old-browser { + padding-top: 8px; + float: right; +} + +/* line 62, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab { + padding-left: 20px; +} + +/* line 63, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li { + display: inline-block; + vertical-align: top; + cursor: pointer; +} + +/* line 64, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li a { + color: #666; + text-decoration: none; + padding: 8px 12px; + display: inline-block; + border-left: 1px solid transparent; + border-top: 1px solid transparent; + border-right: 1px solid transparent; + margin-bottom: -1px; +} + +/* line 65, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li a.active { + color: #333; + font-weight: bold; + border-left: 1px solid #DDD; + border-top: 1px solid #DDD; + border-right: 1px solid #DDD; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + background-color: white; +} + +/* line 67, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar .scope { + float: left; + margin-right: 10px; +} + +/* line 71, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar .scope i { + font-style: normal; +} + +/* line 75, ../../../hub/static/css/mod/project-info.scss */ +#breadcrumb { + margin: 10px 0; + font-size: 18px; + font-weight: bold; + color: #999; +} + +/* line 76, ../../../hub/static/css/mod/project-info.scss */ +#breadcrumb .final-path { + color: #000; +} + +/* line 1, ../../../hub/static/css/mod/file-browser.scss */ +#tree, #blob { + margin: 0 0 27px; +} + +/* line 3, ../../../hub/static/css/mod/file-browser.scss */ +.tree-browser { + width: 100%; + margin: 0; + border-radius: 3px; + border: 1px solid #CACACA; +} + +/* line 4, ../../../hub/static/css/mod/file-browser.scss */ +.tree-browser th { + text-align: left; + font-weight: bold; + padding: 6px 3px; + color: #555; + text-shadow: 0 1px 0 #fff; + border-bottom: 1px solid #d8d8d8; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; +} + +/* line 5, ../../../hub/static/css/mod/file-browser.scss */ +.tree-browser td { + background: #f8f8f8; + border-bottom: 1px solid #eee; + padding: 7px 3px; + color: #484848; + vertical-align: middle; +} + +/* line 6, ../../../hub/static/css/mod/file-browser.scss */ +.tree-browser tbody tr:last-child td { + border-bottom: 0; +} + +/* line 7, ../../../hub/static/css/mod/file-browser.scss */ +.tree-browser .message { + min-width: 270px; + max-width: 484px; +} + +/* line 8, ../../../hub/static/css/mod/file-browser.scss */ +.tree-browser td a.message { + color: #484848; +} + +/* line 10, ../../../hub/static/css/mod/file-browser.scss */ +.tree-browser i, .file i, .commit-group-item i { + filter: alpha(opacity=70); + opacity: .7; +} + +/* line 11, ../../../hub/static/css/mod/file-browser.scss */ +.file .error { + text-align: center; + margin: 30px; + color: #666; +} + +/* button list */ +/* line 3, ../../../hub/static/css/mod/file-blob.scss */ +.button-group { + display: inline-block; + overflow: hidden; + border: 1px solid #d4d4d4; + border-radius: 3px; + border-bottom-color: #bcbcbc; + background: #f5f5f5; + background: -moz-linear-gradient(#f5f5f5, #e5e5e5); + background: -webkit-linear-gradient(#f5f5f5, #e5e5e5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; +} + +/* line 4, ../../../hub/static/css/mod/file-blob.scss */ +.button-group li { + margin: 0 !important; + float: left; +} + +/* line 5, ../../../hub/static/css/mod/file-blob.scss */ +.button-group li:first-child .grouped-button { + border-left: none; + border-bottom-left-radius: 2px; + border-top-left-radius: 2px; +} + +/* line 6, ../../../hub/static/css/mod/file-blob.scss */ +.button-group li:last-child .grouped-button { + border-right: none; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 2px; +} + +/* line 7, ../../../hub/static/css/mod/file-blob.scss */ +.button-group .grouped-button { + float: left; + background: none; + border-bottom: none; + border-top: none; + border-left: 1px solid rgba(0, 0, 0, 0.1); + border-right: 1px solid rgba(255, 255, 255, 0.5); + border-radius: 0; + cursor: pointer; +} + +/* line 8, ../../../hub/static/css/mod/file-blob.scss */ +.button-group .minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line-no */ +/* line 12, ../../../hub/static/css/mod/file-blob.scss */ +#blob .file { + min-height: 78px; + position: relative; + overflow: auto; +} + +/* line 13, ../../../hub/static/css/mod/file-blob.scss */ +#blob .file .rawfile { + text-align: center; + background-color: #ddd; + padding: 30px; + position: relative; +} + +/* line 14, ../../../hub/static/css/mod/file-blob.scss */ +.file table { + width: 100%; + border-collapse: collapse; + border-spacing: 0; +} + +/* line 15, ../../../hub/static/css/mod/file-blob.scss */ +.file table td, .file table th { + vertical-align: top; + padding: 0; +} + +/* line 16, ../../../hub/static/css/mod/file-blob.scss */ +.file .data { + overflow: auto; +} + +/* line 18, ../../../hub/static/css/mod/file-blob.scss */ +.code { + width: 100%; +} + +/* line 19, ../../../hub/static/css/mod/file-blob.scss */ +.code .highlight pre { + margin: 0; + padding: 8px; + border: none; + background-color: #FFF; + white-space: pre; +} + +/* line 20, ../../../hub/static/css/mod/file-blob.scss */ +.code .highlight pre a { + display: block; +} + +/* line 23, ../../../hub/static/css/mod/file-blob.scss */ +.linenos .linenodiv pre { + background-color: #ECECEC; + padding: 8px; + border: none; + border-right: 1px solid #DDD; + text-align: right; + white-space: pre; +} + +/* line 24, ../../../hub/static/css/mod/file-blob.scss */ +.linenos .linenodiv pre a { + color: #AAA; + text-decoration: none; + white-space: nowrap; + line-height: 18px; +} + +/* line 25, ../../../hub/static/css/mod/file-blob.scss */ +.code .highlight pre, .linenos .linenodiv pre { + margin: 0; + line-height: 18px; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +/* line 32, ../../../hub/static/css/mod/file-blob.scss */ +.linenos { + padding: 0; +} diff --git a/dist/css/app/docs.css b/dist/css/app/docs.css new file mode 100644 index 0000000..a2000f0 --- /dev/null +++ b/dist/css/app/docs.css @@ -0,0 +1,5872 @@ +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* line 1, ../../../hub/static/css/mod/docs-nav.scss */ +.docsnav { + clear: both; + font-size: 120%; + margin: 15px 0 25px; + color: #34833E; + padding: 4px 0 6px 0; +} + +/* line 2, ../../../hub/static/css/mod/docs-nav.scss */ +.docsnav a { + color: #34833E; + text-indent: 5px; +} + +/* line 3, ../../../hub/static/css/mod/docs-nav.scss */ +.docsnav table { + width: 100%; +} + +/* line 4, ../../../hub/static/css/mod/docs-nav.scss */ +.docsnav table td { + vertical-align: top; +} + +/* line 5, ../../../hub/static/css/mod/docs-nav.scss */ +.docsnav .bigger::before { + font-size: 160%; + vertical-align: bottom; + line-height: 16px; +} + +/* line 6, ../../../hub/static/css/mod/docs-nav.scss */ +.docsnav .biggest::before { + font-size: 200%; + vertical-align: bottom; + line-height: 10px; +} + +/* line 7, ../../../hub/static/css/mod/docs-nav.scss */ +.docsnav .search::before { + font-size: 130%; + vertical-align: bottom; + line-height: 13px; +} + +/* line 9, ../../../hub/static/css/mod/docs-nav.scss */ +.docsnav tr.first td { + width: 33%; + padding: 0 6px 0px 6px; +} + +/* line 10, ../../../hub/static/css/mod/docs-nav.scss */ +.docsnav tr.second td { + padding-top: 9px; +} + +/* line 12, ../../../hub/static/css/mod/docs-nav.scss */ +.docsnav { + border-bottom: 1px solid #CCC; +} + +/* line 1, ../../../hub/static/css/mod/docs-page.scss */ +.pages_doc { + border-radius: 5px; + border: 2px solid #394249; + float: right; + padding: 5px; + margin: 5px 0 3px 15px; + font-weight: bold; + color: #fbfbf9; + font-size: 110%; + height: 35px; + width: 280px; + background: #739890 url("/static/img/smokinggal.jpg") no-repeat scroll 25px -175px; +} + +/* line 8, ../../../hub/static/css/mod/docs-page.scss */ +.pages_doc a { + font-weight: bold; + color: #435159; + text-shadow: -1px +0px 7px #f9f0e2; +} + +/* line 1, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav { + margin-top: 6px; +} + +/* line 3, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label { + position: relative; + display: inline-block; + margin-left: 3px; + padding: 3px 7px; + border: 1px solid #ccc; + border-radius: 3px; + color: #333; + background-color: #fafafa; + vertical-align: middle; +} + +/* line 15, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::before, .metanav .counts-label::after { + content: ""; + position: absolute; + top: 50%; + right: 100%; + display: block; + margin-right: 0px; + margin-top: -6px; + width: 0; + height: 0; + border: 6px solid transparent; + border-right-color: #ccc; +} + +/* line 29, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::after { + margin-right: -1px; + border-right-color: #fafafa; +} + +/* line 1, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body { + padding: 30px; +} + +/* line 4, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body > :first-child { + margin-top: 0 !important; +} + +/* line 7, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body h1, +.markdown-body h2, +.markdown-body h3, +.markdown-body h4, +.markdown-body h5, +.markdown-body h6 { + margin: 20px 0 10px; + padding: 0; + font-weight: bold; + -webkit-font-smoothing: antialiased; + cursor: text; + position: relative; +} + +/* line 20, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body h2 { + font-size: 24px; + border-bottom: 1px solid #CCC; + color: black; +} + +/* line 25, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body, +.markdown-body p { + font-size: 14px; + line-height: 1.6; +} + +/* line 30, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body p, +.markdown-body blockquote, +.markdown-body ul, +.markdown-body ol, +.markdown-body dl, +.markdown-body table, +.markdown-body pre { + margin: 15px 0; +} + +/* line 39, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul, +.markdown-body ol { + padding-left: 30px; +} + +/* line 43, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul li { + line-height: 1.6; +} + +/* line 46, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul { + list-style: disc; +} + +/* line 49, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ol { + list-style: decimal; +} + +/* line 52, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table { + width: 100%; +} + +/* line 55, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table caption + thead tr:first-child th, +.markdown-body table caption + thead tr:first-child td, +.markdown-body table colgroup + thead tr:first-child th, +.markdown-body table colgroup + thead tr:first-child td, +.markdown-body table thead:first-child tr:first-child th, +.markdown-body table thead:first-child tr:first-child td { + border-top: 0; +} + +/* line 63, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table thead th { + vertical-align: bottom; +} + +/* line 66, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th { + font-weight: bold; +} + +/* line 69, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th, +.markdown-body table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #ddd; +} + +/* line 77, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th, +.markdown-body table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #ddd; +} + +/* line 85, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table tbody > tr:nth-child(odd) > td, +.markdown-body table tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} + +/* line 89, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body .progress-percentage { + color: #888; +} + +/* line 93, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page { + padding: 0px; +} + +/* line 96, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page h1, +.markdown-page h2, +.markdown-page h3, +.markdown-page h4, +.markdown-page h5, +.markdown-page h6 { + position: static; +} + +/* line 104, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page pre { + font-family: Consolas, 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 14px; +} + +/* line 108, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page .label { + background-color: transparent; +} + +/* line 111, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page dd { + margin-left: 1.5em; +} + +/* line 114, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body code { + white-space: pre-wrap; +} + +/* line 8, ../../../hub/static/css/app/docs.scss */ +.button-group { + display: inline-block; + overflow: hidden; + border: 1px solid #d4d4d4; + border-radius: 3px; + border-bottom-color: #bcbcbc; + background: #f5f5f5; + background: -moz-linear-gradient(#f5f5f5, #e5e5e5); + background: -webkit-linear-gradient(#f5f5f5, #e5e5e5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; +} + +/* line 9, ../../../hub/static/css/app/docs.scss */ +.button-group li { + margin: 0 !important; + float: left; +} + +/* line 10, ../../../hub/static/css/app/docs.scss */ +.button-group li:first-child .grouped-button { + border-left: none; + border-bottom-left-radius: 2px; + border-top-left-radius: 2px; +} + +/* line 11, ../../../hub/static/css/app/docs.scss */ +.button-group li:last-child .grouped-button { + border-right: none; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 2px; +} + +/* line 12, ../../../hub/static/css/app/docs.scss */ +.button-group .grouped-button { + float: left; + background: none; + border-bottom: none; + border-top: none; + border-left: 1px solid rgba(0, 0, 0, 0.1); + border-right: 1px solid rgba(255, 255, 255, 0.5); + border-radius: 0; + cursor: pointer; +} + +/* line 14, ../../../hub/static/css/app/docs.scss */ +.inner-toc-wrapper { + background-color: white; + clear: both; + float: right; + margin: 4px 0 2px 8px; + padding: 0 0 8px 8px; +} + +/* line 15, ../../../hub/static/css/app/docs.scss */ +.inner-toc { + border-left: 8px solid #D9F3DC; + padding-left: .6em; + font-size: 18px; + line-height: 30px; +} + +/* line 16, ../../../hub/static/css/app/docs.scss */ +.inner-toc a { + color: #34833E; +} + +/* line 17, ../../../hub/static/css/app/docs.scss */ +.inner-toc ul li { + line-height: 1.5em; +} + +/* line 19, ../../../hub/static/css/app/docs.scss */ +.actions { + float: right; + margin-bottom: 5px; +} + +/* line 21, ../../../hub/static/css/app/docs.scss */ +.search { + float: right; +} + +/* Patching for sphinx */ +/* line 25, ../../../hub/static/css/app/docs.scss */ +a.headerlink { + visibility: hidden; + color: #D9F3DC; +} + +/* line 27, ../../../hub/static/css/app/docs.scss */ +h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, +h4:hover > a.headerlink, h5:hover > a.headerlink, h6:hover > a.headerlink, +dt:hover > a.headerlink { + visibility: visible; +} + +/* line 30, ../../../hub/static/css/app/docs.scss */ +p.admonition-title { + font-weight: bold; +} + +/* line 32, ../../../hub/static/css/app/docs.scss */ +.admonition, div.warning, div.sidebar { + padding: 2px 5px 2px 18px; + background-color: #ccc; + border-radius: 8px; +} + +/* line 33, ../../../hub/static/css/app/docs.scss */ +.admonition { + background-color: #D9F3DC; +} + +/* line 34, ../../../hub/static/css/app/docs.scss */ +.admonition p.admonition-title { + color: #34833E; +} + +/* line 35, ../../../hub/static/css/app/docs.scss */ +.warning { + background-color: #FCD2D1; +} + +/* line 36, ../../../hub/static/css/app/docs.scss */ +.warning p.admonition-title { + color: #f4433E; +} + +/* line 37, ../../../hub/static/css/app/docs.scss */ +.genindex a { + display: block; +} + +/* line 38, ../../../hub/static/css/app/docs.scss */ +.genindex a.sublink { + margin-left: 3em; +} diff --git a/dist/css/app/favorites.css b/dist/css/app/favorites.css new file mode 100644 index 0000000..836c136 --- /dev/null +++ b/dist/css/app/favorites.css @@ -0,0 +1,5376 @@ +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} diff --git a/dist/css/app/future.css b/dist/css/app/future.css new file mode 100644 index 0000000..836c136 --- /dev/null +++ b/dist/css/app/future.css @@ -0,0 +1,5376 @@ +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} diff --git a/dist/css/app/gist-revisions.css b/dist/css/app/gist-revisions.css new file mode 100644 index 0000000..9af02c8 --- /dev/null +++ b/dist/css/app/gist-revisions.css @@ -0,0 +1,8248 @@ +@charset "UTF-8"; +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* TODO Refactor the following mods into components */ +/* For other page that still depends on commits.scss */ +/* preview comment form style */ +/* line 2, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav { + margin: 10px 0; + border-bottom: 1px solid #DDD; + height: 35px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs { + display: inline-block; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs > li { + display: inline-block; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab { + display: inline-block; + margin-bottom: -1px; + padding: 8px 12px 9px; + border: 1px solid transparent; + border-bottom: 0; + font-size: 14px; + color: #666; + text-decoration: none; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab.selected { + border-color: #DDD; + border-radius: 3px 3px 0 0; + background-color: white; + color: #333; + font-weight: bold; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab:hover { + text-decoration: none; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav { + position: relative; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav ul.tabnav-tabs { + padding-left: 10px; +} + +/* line 10, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 0 10px 10px; +} + +/* line 11, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form #preview_bucket .content-body { + padding: 10px; + min-height: 132px; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form.tab-content { + overflow: initial; + position: relative; +} + +/* line 2, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 10px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-actions { + padding: 0; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + position: relative; + border: 3px solid #EEE; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + padding: 0; + background: #EEE; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content .write-content { + padding: 0 10px 10px; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; + margin: 0; +} + +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary, button.primary.classy:disabled, button.primary.classy.disabled, button.primary.classy:disabled:hover, button.primary.classy.disabled:disabled:hover, button.classy:disabled:hover.primary, button.classy.disabled:disabled:hover.primary { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4); + border-color: #74BB5A; + border-bottom-color: #509338; + background: #8ADD6D; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#8add6d', endColorstr='#60b044')"; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); + background-image: -webkit-linear-gradient(top, #8ADD6D, #60B044); +} + +/* line 2, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary.disabled { + opacity: 0.5; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy, +button.classy:disabled, +button.classy.disabled, +a.button.classy:disabled, +a.button.classy.disabled, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover:disabled, +a.button.classy.disabled:hover, +a.button.classy, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy:disabled:hover, +a.button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover { + display: inline-block; + padding: 8px 15px; + line-height: normal; + position: relative; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 12px; + font-weight: bold; + color: #666; + text-shadow: 0 1px rgba(255, 255, 255, 0.9); + background: whiteSmoke; + background: -moz-linear-gradient(whiteSmoke, #E5E5E5); + background: -webkit-linear-gradient(whiteSmoke, #E5E5E5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; + border-radius: 3px; + border: 1px solid #DDD; + border-bottom-color: #BBB; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* ================================== *\ + * Zen Form + * ================================== */ +/* line 6, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + position: fixed; + z-index: 99999; + top: 0; + left: 0; + right: 0; + bottom: 0; + padding: 24px 30px 24px 24px; +} + +/* line 16, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-input-wrap { + max-width: 640px; + position: relative; + margin: 0 auto; +} + +/** + * Buttons style + */ +/* line 25, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button, +.zen-forms-theme-switch { + position: absolute; + width: 18px; + height: 18px; + text-align: center; + top: 10px; + right: 10px; + font-size: 24px; + color: #516066; + cursor: pointer; + line-height: 1; +} + +/* line 39, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-theme-switch { + top: 28px; + font-size: 34px; +} + +/* line 44, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button:hover, +.zen-forms-theme-switch:hover { + color: #667981; +} + +/** + * Inputs basic style + */ +/* line 52, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + padding: 8px 0; + width: 100%; + background: none; + border: none; + margin-bottom: 24px; + cursor: pointer; +} + +/* line 62, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus, +.zen-forms textarea:focus { + cursor: text; +} + +/* line 67, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms textarea { + resize: none; +} + +/* line 71, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + cursor: pointer; + display: none; + padding: 8px 3; + position: absolute; + top: 0; + width: 100%; +} + +/* line 80, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms .empty + label { + display: block; +} + +/* line 84, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus + label, +.zen-forms textarea:focus + label { + display: none; +} + +/* line 89, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms :focus { + outline-color: transparent; + outline-style: none; +} + +/** + * Dark theme + */ +/* line 97, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + background: #151a1c; +} + +/* line 101, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + color: #516066; +} + +/* line 105, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + color: #667981; +} + +/** + * Light theme + */ +/* line 113, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme { + background: #fefefe; +} + +/* line 117, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme label { + color: #959697; +} + +/* line 121, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme input, +.zen-forms.light-theme textarea { + color: #707071; +} + +/* line 4, ../../../hub/static/css/mod/zen-forms.scss */ +.write-content .enable-fullscreen { + position: absolute; + top: 5px; + right: 16px; + color: #333333; + opacity: .5; + line-height: 1em; +} + +/* line 5, ../../../hub/static/css/mod/zen-forms.scss */ +.mini-icon-fullscreen::before { + content: ""; +} + +/* line 6, ../../../hub/static/css/mod/zen-forms.scss */ +.fullscreen-overlay textarea, .zen-forms textarea { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + height: 100%; + padding: 20px; + border: 0; + font-size: 21px; + line-height: 1.6em; + resize: none; + -moz-transition: color 0.15s ease-in 0; + -webkit-transition: color 0.15s ease-in 0; + transition: color 0.15s ease-in 0; + box-shadow: none; +} + +/* line 7, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms.light-theme textarea { + background: #fff; + color: #999999; +} + +/* line 8, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms .zen-forms-input-wrap { + width: 100%; + height: 100%; +} + +/* line 9, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms label[for^=zen-forms-input] { + display: none; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-zen.scss */ +.previewable-comment-form .zen-enabled textarea { + padding: 10px 18px 10px 10px; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled { + position: relative; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled .go-zen { + position: absolute; + right: 15px; + top: 5px; +} + +/* line 1, ../../../hub/static/css/mod/loader.scss */ +.loader { + display: none; + position: absolute; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + background-color: #eee; +} + +/* line 2, ../../../hub/static/css/mod/loader.scss */ +.loader .spinner { + display: block; + width: 32px; + height: 32px; + margin: 0 auto; + top: 121px; + position: relative; + background: url(/static/img/spinner.gif) no-repeat; +} + +/* line 1, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view { + position: absolute; + top: 0; + left: 0; + display: none; + margin-top: 18px; + background: white; + border: 1px solid #DDD; + border-radius: 3px; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + min-width: 120px; + z-index: 10; +} + +/* line 15, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur { + background: #3366FF; + color: white; +} + +/* line 19, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur small { + color: white; +} + +/* line 22, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view strong { + color: #3366FF; +} + +/* line 25, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur strong { + color: white; + font: bold; +} + +/* line 29, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul { + /* width: 100px; */ + list-style: none; + padding: 0; + margin: auto; +} + +/* line 35, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul li { + display: block; + padding: 5px 10px; + border-bottom: 1px solid #DDD; + cursor: pointer; + /* border-top: 1px solid #C8C8C8; */ +} + +/* line 42, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view small { + font-size: smaller; + color: #777; + font-weight: normal; +} + +/* line 9, ../../../hub/static/css/mod/comment-form.scss */ +.side-avatar { + margin-left: 0; +} + +/* fix li header for newer version of bootstrap */ +/* line 12, ../../../hub/static/css/mod/comment-form.scss */ +.comment-form-head li { + line-height: 18px; +} + +/* line 16, ../../../hub/static/css/mod/comment-form.scss */ +#new_comment .form-content { + width: 880px; + margin-left: 60px; +} + +/* line 18, ../../../hub/static/css/mod/comment-form.scss */ +.discussion-bubble-avatar { + position: relative; + float: left; + border-radius: 3px; +} + +/* line 19, ../../../hub/static/css/mod/comment-form.scss */ +.discussion-bubble-inner { + min-height: 60px; + border: 1px solid #CACACA; + background-color: white; +} + +/* line 1, ../../../hub/static/css/mod/diff-stat.scss */ +#toc li { + border-bottom: 1px solid #DDD; + list-style-type: none; + padding: 5px; +} + +/* line 7, ../../../hub/static/css/mod/diff-stat.scss */ +#toc { + margin: 15px 0; +} + +/* line 11, ../../../hub/static/css/mod/diff-stat.scss */ +#toc .diffstat { + float: right; +} + +/* line 14, ../../../hub/static/css/mod/diff-stat.scss */ +#toc .mini-icon-modified { + color: #677A85; +} + +/* line 18, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat { + white-space: nowrap; + text-align: right; + font-family: Helvetica,arial,freesans,clean,sans-serif; + color: #666; + font-weight: bold; + font-size: 11px; +} + +/* line 26, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat a { + text-decoration: none; + color: #666; +} + +/* line 30, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar { + position: relative; + left: -3px; + display: inline-block; + height: 12px; + text-decoration: none; + text-align: left; + color: #EEE; + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + line-height: 1; + -webkit-font-smoothing: antialiased; + font-size: 16px; + letter-spacing: -7px; +} + +/* line 48, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar.diff-added, +span.diffstat .diffstat-bar i.plus { + color: #61C423; + font-style: normal; +} + +/* line 53, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar.diff-added, +span.diffstat .diffstat-bar i.minus { + color: #C52323; + font-style: normal; +} + +/* line 59, ../../../hub/static/css/mod/diff-stat.scss */ +p.explain { + font-size: 12px; + color: #666; + margin: 1em 0; +} + +/* line 65, ../../../hub/static/css/mod/diff-stat.scss */ +p.explain .minibutton { + float: right; + top: -4px; +} + +/* line 3, ../../../hub/static/css/mod/diffs-pane.scss */ +.diff-cutoff { + margin-bottom: -2px; + height: 35px; + line-height: 37px; + font-size: 12px; + font-weight: bold; + color: #000; + text-align: center; + background: url("/static/img/compare_too_big.gif") 0 0 no-repeat; +} + +/* line 5, ../../../hub/static/css/mod/diffs-pane.scss */ +.fullscreen-mode { + overflow: hidden; +} + +/* line 6, ../../../hub/static/css/mod/diffs-pane.scss */ +#fullscreen-stage { + display: none; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + overflow-y: auto; + background: #fff; + z-index: 9999; +} + +/* line 7, ../../../hub/static/css/mod/diffs-pane.scss */ +#files #fullscreen-stage .file { + margin: 0; +} + +/* line 5, ../../../hub/static/css/mod/commits.scss */ +div.container div.raw { + overflow: visible; +} + +/* line 9, ../../../hub/static/css/mod/commits.scss */ +#commits-graph { + position: absolute; + left: -200px; + width: 200px; +} + +/* line 15, ../../../hub/static/css/mod/commits.scss */ +.commits-body { + position: relative; +} + +/* line 19, ../../../hub/static/css/mod/commits.scss */ +h3.commit-group-heading { + margin: 15px 0 0 0; + padding: 5px 8px; + font-size: 13px; + color: #3a505b; + text-shadow: 0 1px white; + background: #e6f1f6; + border: 1px solid #c5d5dd; + border-top-right-radius: 4px; + border-top-left-radius: 4px; +} + +/* line 31, ../../../hub/static/css/mod/commits.scss */ +h3.history { + margin-top: 15px; +} + +/* line 35, ../../../hub/static/css/mod/commits.scss */ +.commit-group { + list-style-type: none; + margin: 15px 0; + background: #f7fbfc; + border: 1px solid #c5d5dd; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +/* line 46, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item { + position: relative; + padding: 8px 8px 8px 52px; + border-top: 1px solid #e2eaee; +} + +/* line 52, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:first-child { + border-top: none; +} + +/* line 56, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:last-child { + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +/* line 61, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:nth-child(2n) { + background: #fff; +} + +/* line 65, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus { + background: #fcfce2; +} + +/* line 69, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gravatar { + float: left; + margin-left: -44px; + border-radius: 4px; +} + +/* line 75, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .commit-title { + margin: 1px 0 1px 0; + font-size: 14px; + font-weight: bold; + color: #333; +} + +/* line 82, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .commit-title a { + color: #333; +} + +/* line 86, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .commit-desc pre { + margin-top: 5px; + margin-bottom: 10px; + font-size: 12px; + color: #596063; + border-left: 1px solid #e5e5e5; + padding-left: 8px; +} + +/* line 95, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship { + font-size: 12px; + color: #888; +} + +/* line 100, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship a { + color: #444; +} + +/* line 104, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship .author-name { + color: #444; +} + +/* line 108, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship .committer { + display: block; + font-size: 11px; +} + +/* line 113, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship .committer .mini-icon { + position: relative; + top: 2px; +} + +/* line 118, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .commit-links { + position: absolute; + top: 7px; + right: 8px; + width: 243px; + text-align: right; +} + +/* line 126, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .mini-icon-clippy { + visibility: hidden; + float: left; + margin-right: 7px; + margin-top: 5px; +} + +/* line 133, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:hover .mini-icon-clippy { + visibility: visible; +} + +/* line 137, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton { + float: right; + height: 18px; + padding: 0 7px; + line-height: 22px; + font-size: 11px; + color: #4e575b; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); + background: #eff6f9; + background: -moz-linear-gradient(#eff6f9, #ddecf3); + background: -webkit-linear-gradient(#eff6f9, #ddecf3); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#eff6f9',endColorstr='#ddecf3')"; + border: 1px solid #cedee5; + border-radius: 3px; + min-width: 70px; + text-align: center; +} + +/* line 155, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton .comment-popover { + color: #91A6B1; + border-right: 1px solid #ddd; + padding-right: 4px; +} + +/* line 161, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton { + color: #5a5b4e; +} + +/* line 165, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:nth-child(2n+1) .gobutton { + border-color: #d5dcdf; + background: #f2f5f6; + background: -moz-linear-gradient(#f2f5f6, #e3eaed); + background: -webkit-linear-gradient(#f2f5f6, #e3eaed); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f2f5f6',endColorstr='#e3eaed')"; +} + +/* line 173, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton { + border-color: #e7e86d; + background: #f9fac9; + background: -moz-linear-gradient(#f9fac9, #f3f494); + background: -webkit-linear-gradient(#f9fac9, #f3f494); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f9fac9',endColorstr='#f3f494')"; +} + +/* line 181, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton:hover { + text-decoration: none; + border-color: #cedee5; + background: #fbfdfe; + background: -moz-linear-gradient(#fbfdfe, #eaf4f8); + background: -webkit-linear-gradient(#fbfdfe, #eaf4f8); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbfdfe',endColorstr='#eaf4f8')"; +} + +/* line 190, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton > .sha, .commit-group-item.navigation-focus .gobutton:hover > .sha { + display: inline-block; + height: 22px; + margin-right: -3px; +} + +/* line 196, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton > .sha .mini-icon, .commit-group-item.navigation-focus .gobutton:hover > .sha .mini-icon { + position: relative; + top: 2px; + border-radius: 30px; + border: 1px solid #CFDEE5; + background-color: rgba(255, 255, 255, 0.5); + color: #91a6b1; + margin-left: 5px; + width: 16px; +} + +/* line 207, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton > .sha .mini-icon { + border: 1px solid #E7E86D; + color: #c3c45c; +} + +/* line 212, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton.with-comments { + padding-left: 5px; +} + +/* line 216, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton.with-comments .sha, .commit-group-item.navigation-focus .gobutton.with-comments:hover .sha { + padding-left: 8px; + border-left: 1px solid #cfdee5; +} + +/* line 221, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton.with-comments .sha { + border-left-color: #e1e29e; +} + +/* line 225, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton .comment-count, .commit-group-item.navigation-focus .gobutton:hover .comment-count { + float: left; + height: 22px; + padding-right: 9px; + line-height: 24px; + font-weight: bold; + border-right: 1px solid #f6fafc; +} + +/* line 234, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton .comment-count .mini-icon, .commit-group-item.navigation-focus .gobutton:hover .comment-count .mini-icon { + position: relative; + top: 2px; + color: #91A6B1; +} + +/* line 240, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton .comment-count .mini-icon { + color: #C3C45C; +} + +/* line 244, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .browse-button, .commit-group-item .compare-button { + clear: left; + margin-top: 1px; + font-size: 11px; + font-weight: bold; + text-align: right; + color: #999; +} + +/* line 253, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .browse-button .mini-icon { + position: relative; + top: 2px; +} + +/* line 258, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .browse-button:hover { + color: #4183C4; + background-position: 100% -95px; +} + +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 400; + src: local("Source Code Pro"), local("SourceCodePro-Regular"), url("/static/css/fonts/SourceCodePro-Regular.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 500; + src: local("Source Code Pro Medium"), local("SourceCodePro-Medium"), url("/static/css/fonts/SourceCodePro-Medium.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 600; + src: local("Source Code Pro Semibold"), local("SourceCodePro-Semibold"), url("/static/css/fonts/SourceCodePro-Semibold.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 700; + src: local("Source Code Pro Bold"), local("SourceCodePro-Bold"), url("/static/css/fonts/SourceCodePro-Bold.woff") format("woff"); +} +/* line 3, ../../../hub/static/css/mod/diff-base.scss */ +.code pre, xmp, plaintext, listing { + display: block; + font-size: 13px; + font-family: 'Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; + white-space: pre; + margin: 0; + padding: 0; +} + +/* line 12, ../../../hub/static/css/mod/diff-base.scss */ +.code pre { + line-height: 18px; +} + +/* line 16, ../../../hub/static/css/mod/diff-base.scss */ +.font-consolas pre { + font-family: Consolas,'Source Code Pro',Courier,Monaco,Menlo,monospace; +} + +/* line 20, ../../../hub/static/css/mod/diff-base.scss */ +.font-monaco pre { + font-family: Monaco,'Source Code Pro',Courier,Consolas,Menlo,monospace; +} + +/* line 24, ../../../hub/static/css/mod/diff-base.scss */ +.font-courier pre { + font-family: Courier,'Source Code Pro',Monaco,Consolas,Menlo,monospace; +} + +/* line 28, ../../../hub/static/css/mod/diff-base.scss */ +.font-dejavu pre { + font-family: 'DejaVu Sans Mono','Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; +} + +/* line 32, ../../../hub/static/css/mod/diff-base.scss */ +.font-ubuntu pre { + font-family: 'Ubuntu Mono','Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; +} + +/* line 37, ../../../hub/static/css/mod/diff-base.scss */ +pre, code, tt { + font-size: 12px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + border: 0; +} + +/* line 43, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .normal { + background-color: #FFF; +} + +/* line 47, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .deletion { + color: black; + background-color: #FDD; +} +/* line 50, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .deletion .x, .highlight .deletion .c { + color: black; + background-color: #ffaaaa; +} + +/* line 56, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .insertion { + color: black; + background-color: #DFD; +} +/* line 59, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .insertion .i, .highlight .insertion .c { + color: black; + background-color: #aaffaa; +} + +/* line 65, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped { + color: #cacaca; + background-color: #f9f9f9; +} +/* line 69, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a { + color: #cacaca; + vertical-align: middle; +} +/* line 73, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a:hover { + text-decoration: none; +} +/* line 77, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a[data-type="after"], .highlight .skipped a[data-type="before"] { + font-size: 20px; +} + +/* line 266, ../../../hub/static/css/mod/commits.scss */ +#files.commentable tr td pre:hover { + background-color: #FFC; +} + +/* line 268, ../../../hub/static/css/mod/commits.scss */ +.full-commit { + margin: 10px 0; + padding: 8px 8px 0; + background: #E6F1F6; + border: 1px solid #C5D5DD; + border-radius: 4px; +} + +/* line 276, ../../../hub/static/css/mod/commits.scss */ +.full-commit .commit-meta { + margin-left: -8px; + width: 100%; + padding: 8px; + background: white; + border-top: 1px solid #D8E6EC; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +/* line 286, ../../../hub/static/css/mod/commits.scss */ +.full-commit .commit-desc { + display: block; + margin: -4px 0 10px 0; +} + +/* line 291, ../../../hub/static/css/mod/commits.scss */ +.full-commit .commit-desc pre { + max-width: 100%; + font-size: 14px; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); +} + +/* line 297, ../../../hub/static/css/mod/commits.scss */ +.full-commit .browse-button { + float: right; + margin: -3px -3px 0 0; + height: 26px; + padding: 0 10px; + line-height: 26px; + font-size: 13px; + font-weight: bold; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); + background: #EFF6F9; + background: -moz-linear-gradient(#EFF6F9, #DDECF3); + background: -webkit-linear-gradient(#EFF6F9, #DDECF3); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#eff6f9',endColorstr='#ddecf3')"; + border: 1px solid #CEDEE5; + border-radius: 3px; +} + +/* line 314, ../../../hub/static/css/mod/commits.scss */ +.full-commit p.commit-title { + margin: 0 0 8px 0; + font-size: 18px; + font-weight: bold; + color: #213F4D; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); +} + +/* line 322, ../../../hub/static/css/mod/commits.scss */ +.clearfix { + display: block; +} + +/* line 326, ../../../hub/static/css/mod/commits.scss */ +.full-commit .sha-block { + float: right; + margin-left: 15px; + color: #888; + font-size: 12px; +} + +/* line 333, ../../../hub/static/css/mod/commits.scss */ +.full-commit .authorship { + margin-top: -2px; + margin-left: -4px; + margin-bottom: -4px; + font-size: 14px; + color: #999; +} + +/* line 341, ../../../hub/static/css/mod/commits.scss */ +.full-commit .authorship .gravatar { + margin-top: -2px; + margin-right: 3px; + vertical-align: middle; + border-radius: 3px; +} + +/* line 347, ../../../hub/static/css/mod/commits.scss */ +#files { + position: relative; +} + +/* line 351, ../../../hub/static/css/mod/commits.scss */ +#files .file, .file-box { + border: 1px solid #CCC; + margin-bottom: 13px; + position: relative; + background-color: #DDD; +} + +/* line 358, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta, .file-box .meta { + overflow: hidden; + padding: 5px 10px; + font-size: 12px; + height: 33px; + text-align: left; + color: #555; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #D8D8D8; + background: #FAFAFA; + background: -moz-linear-gradient(#FAFAFA, #EAEAEA); + background: -webkit-linear-gradient(#FAFAFA, #EAEAEA); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; +} + +/* line 373, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .info, .file-box .meta .info { + float: left; + height: 33px; + line-height: 33px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; +} + +/* line 380, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .actions, .file-box .meta .actions { + float: right; + height: 33px; + line-height: 33px; + margin-top: 1px; +} + +/* line 387, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .actions li:first-child, .file-box .meta .actions li:first-child { + background: transparent; + margin-left: 0; + padding-left: 0; +} + +/* line 393, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .actions li, .file-box .meta .actions li { + list-style-type: none; + float: left; + margin: 0 0 0 7px; +} + +/* line 399, ../../../hub/static/css/mod/commits.scss */ +.button-group li { + margin: 0 !important; +} + +/* line 403, ../../../hub/static/css/mod/commits.scss */ +.pagination-older-newer a { + padding: .1em .3em; + margin: .2em; + text-decoration: none; + color: #369; + float: none; +} + +/* line 411, ../../../hub/static/css/mod/commits.scss */ +.pagination-older-newer a:hover, .pagination a:active { + background-color: transparent; + color: #36f; +} + +/* line 416, ../../../hub/static/css/mod/commits.scss */ +.pagination-older-newer span.disabled { + padding: .1em .3em; + margin: .2em; + color: #bbb; + float: none; +} + +/* line 423, ../../../hub/static/css/mod/commits.scss */ +.commit .sha-block, .commit .sha { + padding-right: 3px; + font-size: 11px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; +} + +/* line 429, ../../../hub/static/css/mod/commits.scss */ +#files .file .data .line_numbers, .file-box .data .line_numbers { + background-color: #ECECEC; + color: #AAA; + padding: 0 6px; + border-right: 1px solid #DDD; + text-align: right; + cursor: pointer; +} + +/* line 437, ../../../hub/static/css/mod/commits.scss */ +#files .file .data .line_numbers a { + color: #AAA; +} + +/* line 441, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-added:before { + content: "\f06b"; +} + +/* line 442, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-removed:before { + content: "\f06c"; +} + +/* line 443, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-modified:before { + content: "\f06d"; +} + +/* line 444, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-moved:before, .mini-icon-renamed:before { + content: "\f06e"; +} + +/* line 445, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-commit-comment:before { + content: "\f02b"; +} + +/* line 447, ../../../hub/static/css/mod/commits.scss */ +.mega-icon-beer:before { + content: "\f269"; +} + +/* line 448, ../../../hub/static/css/mod/commits.scss */ +.mega-icon-commit-comment:before { + content: "\f22b"; +} + +/* line 450, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .info span.icon, +#files .file .meta .info span.diffstat, +.file-box .meta .info span.icon { + line-height: 0; + float: left; + margin: 5px 5px 0 0; + padding: 3px; + background: #F7F7F7; + border: 1px solid #CCC; + border-right-color: #E5E5E5; + border-bottom-color: #E5E5E5; + border-radius: 3px; +} + +/* line 463, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .info span.diffstat { + height: 16px; + padding: 3px 6px; +} + +/* line 467, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .info span:first-child, +#files .file .meta .info .icon + span, +.file-box .meta .info span:first-child, +.file-box .meta .info .icon + span { + border-left: 0 none; + box-shadow: inset 0 0 0 transparent; + margin-left: 0; + padding-left: 0; +} + +/* line 477, ../../../hub/static/css/mod/commits.scss */ +.commit-meta.comment-row .mini-icon { + color: #939AA0; + margin: 0 2px 0 1px; + top: 2px; + text-decoration: none; +} + +/* line 478, ../../../hub/static/css/mod/commits.scss */ +#files .file .data.empty, .file-box .data.empty { + padding: 10px 15px; + color: #777; +} + +/* line 482, ../../../hub/static/css/mod/commits.scss */ +.timeout { + width: 873px; + height: 528px; + border: 1px solid #C5D5DD; + background: url("/static/img/timeout.jpg") #E6F1F6 no-repeat; + background-position: 90% 50%; + padding: 0 32px 0 33px; + border-radius: 3px; +} + +/* line 491, ../../../hub/static/css/mod/commits.scss */ +.timeout h3 { + color: white; + font-size: 18px; + font-weight: bold; + text-shadow: darkGray 1px 1px 0; + padding: 15px 0 15px 0; +} + +/* line 498, ../../../hub/static/css/mod/commits.scss */ +.timeout h3 strong { + font-size: 30px; + display: block; +} + +/* line 502, ../../../hub/static/css/mod/commits.scss */ +.timeout p { + color: white; +} + +/* line 506, ../../../hub/static/css/mod/commits.scss */ +.side-avatar { + position: absolute; + float: left; + margin-left: -60px; +} + +/* line 512, ../../../hub/static/css/mod/commits.scss */ +div.generated, div.binary { + text-align: center; + background-color: #ddd; + padding: 30px; +} + +/* line 518, ../../../hub/static/css/mod/commits.scss */ +.commit-history-header { + margin-bottom: 55px; +} +/* line 521, ../../../hub/static/css/mod/commits.scss */ +.commit-history-header #search-commits { + margin: 15px 5px; +} + +/* button list */ +/* line 3, ../../../hub/static/css/mod/file-blob.scss */ +.button-group { + display: inline-block; + overflow: hidden; + border: 1px solid #d4d4d4; + border-radius: 3px; + border-bottom-color: #bcbcbc; + background: #f5f5f5; + background: -moz-linear-gradient(#f5f5f5, #e5e5e5); + background: -webkit-linear-gradient(#f5f5f5, #e5e5e5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; +} + +/* line 4, ../../../hub/static/css/mod/file-blob.scss */ +.button-group li { + margin: 0 !important; + float: left; +} + +/* line 5, ../../../hub/static/css/mod/file-blob.scss */ +.button-group li:first-child .grouped-button { + border-left: none; + border-bottom-left-radius: 2px; + border-top-left-radius: 2px; +} + +/* line 6, ../../../hub/static/css/mod/file-blob.scss */ +.button-group li:last-child .grouped-button { + border-right: none; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 2px; +} + +/* line 7, ../../../hub/static/css/mod/file-blob.scss */ +.button-group .grouped-button { + float: left; + background: none; + border-bottom: none; + border-top: none; + border-left: 1px solid rgba(0, 0, 0, 0.1); + border-right: 1px solid rgba(255, 255, 255, 0.5); + border-radius: 0; + cursor: pointer; +} + +/* line 8, ../../../hub/static/css/mod/file-blob.scss */ +.button-group .minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line-no */ +/* line 12, ../../../hub/static/css/mod/file-blob.scss */ +#blob .file { + min-height: 78px; + position: relative; + overflow: auto; +} + +/* line 13, ../../../hub/static/css/mod/file-blob.scss */ +#blob .file .rawfile { + text-align: center; + background-color: #ddd; + padding: 30px; + position: relative; +} + +/* line 14, ../../../hub/static/css/mod/file-blob.scss */ +.file table { + width: 100%; + border-collapse: collapse; + border-spacing: 0; +} + +/* line 15, ../../../hub/static/css/mod/file-blob.scss */ +.file table td, .file table th { + vertical-align: top; + padding: 0; +} + +/* line 16, ../../../hub/static/css/mod/file-blob.scss */ +.file .data { + overflow: auto; +} + +/* line 18, ../../../hub/static/css/mod/file-blob.scss */ +.code { + width: 100%; +} + +/* line 19, ../../../hub/static/css/mod/file-blob.scss */ +.code .highlight pre { + margin: 0; + padding: 8px; + border: none; + background-color: #FFF; + white-space: pre; +} + +/* line 20, ../../../hub/static/css/mod/file-blob.scss */ +.code .highlight pre a { + display: block; +} + +/* line 23, ../../../hub/static/css/mod/file-blob.scss */ +.linenos .linenodiv pre { + background-color: #ECECEC; + padding: 8px; + border: none; + border-right: 1px solid #DDD; + text-align: right; + white-space: pre; +} + +/* line 24, ../../../hub/static/css/mod/file-blob.scss */ +.linenos .linenodiv pre a { + color: #AAA; + text-decoration: none; + white-space: nowrap; + line-height: 18px; +} + +/* line 25, ../../../hub/static/css/mod/file-blob.scss */ +.code .highlight pre, .linenos .linenodiv pre { + margin: 0; + line-height: 18px; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +/* line 32, ../../../hub/static/css/mod/file-blob.scss */ +.linenos { + padding: 0; +} + +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 400; + src: local("Source Code Pro"), local("SourceCodePro-Regular"), url("/static/css/fonts/SourceCodePro-Regular.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 500; + src: local("Source Code Pro Medium"), local("SourceCodePro-Medium"), url("/static/css/fonts/SourceCodePro-Medium.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 600; + src: local("Source Code Pro Semibold"), local("SourceCodePro-Semibold"), url("/static/css/fonts/SourceCodePro-Semibold.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 700; + src: local("Source Code Pro Bold"), local("SourceCodePro-Bold"), url("/static/css/fonts/SourceCodePro-Bold.woff") format("woff"); +} +/* line 3, ../../../hub/static/css/mod/diff-base.scss */ +.code pre, xmp, plaintext, listing { + display: block; + font-size: 13px; + font-family: 'Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; + white-space: pre; + margin: 0; + padding: 0; +} + +/* line 12, ../../../hub/static/css/mod/diff-base.scss */ +.code pre { + line-height: 18px; +} + +/* line 16, ../../../hub/static/css/mod/diff-base.scss */ +.font-consolas pre { + font-family: Consolas,'Source Code Pro',Courier,Monaco,Menlo,monospace; +} + +/* line 20, ../../../hub/static/css/mod/diff-base.scss */ +.font-monaco pre { + font-family: Monaco,'Source Code Pro',Courier,Consolas,Menlo,monospace; +} + +/* line 24, ../../../hub/static/css/mod/diff-base.scss */ +.font-courier pre { + font-family: Courier,'Source Code Pro',Monaco,Consolas,Menlo,monospace; +} + +/* line 28, ../../../hub/static/css/mod/diff-base.scss */ +.font-dejavu pre { + font-family: 'DejaVu Sans Mono','Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; +} + +/* line 32, ../../../hub/static/css/mod/diff-base.scss */ +.font-ubuntu pre { + font-family: 'Ubuntu Mono','Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; +} + +/* line 37, ../../../hub/static/css/mod/diff-base.scss */ +pre, code, tt { + font-size: 12px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + border: 0; +} + +/* line 43, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .normal { + background-color: #FFF; +} + +/* line 47, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .deletion { + color: black; + background-color: #FDD; +} +/* line 50, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .deletion .x, .highlight .deletion .c { + color: black; + background-color: #ffaaaa; +} + +/* line 56, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .insertion { + color: black; + background-color: #DFD; +} +/* line 59, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .insertion .i, .highlight .insertion .c { + color: black; + background-color: #aaffaa; +} + +/* line 65, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped { + color: #cacaca; + background-color: #f9f9f9; +} +/* line 69, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a { + color: #cacaca; + vertical-align: middle; +} +/* line 73, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a:hover { + text-decoration: none; +} +/* line 77, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a[data-type="after"], .highlight .skipped a[data-type="before"] { + font-size: 20px; +} + +/* line 1, ../../../hub/static/css/mod/colorcube.scss */ +.colorcube { + position: absolute; + width: 30px; + height: 30px; + border: 1px solid #DDD; +} + +/* line 2, ../../../hub/static/css/mod/colorcube.scss */ +.colorcube::before { + content: ""; + display: block; + height: 0; + width: 0; + border: 5px solid #DDD; + border-width: 5px; + border-color: #DDD transparent transparent transparent; + left: 10px; + top: 30px; + float: left; + position: absolute; +} + +/* line 5, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .line_numbers, .file-box .data .line_numbers { + background-color: #ECECEC; + color: #AAA; + padding: 0 2px 0 16px; + border-right: 1px solid #DDD; + text-align: right; + cursor: pointer; +} +/* line 12, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .line_numbers.deletion, .file-box .data .line_numbers.deletion { + color: #AAA; + background-color: #f7c8c8; +} +/* line 16, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .line_numbers.insertion, .file-box .data .line_numbers.insertion { + color: #AAA; + background-color: #ceffce; +} + +/* line 21, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .line_numbers a { + color: #AAA; +} + +/* line 24, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .code { + width: 100%; +} + +/* line 28, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .side { + overflow-x: none; + display: none; +} + +/* line 33, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .side .file-col { + width: 50%; + float: left; + overflow-x: auto; +} + +/* line 40, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .diff-table { + border-collapse: collapse; +} + +/* line 44, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files.commentable tr td pre:hover { + background-color: #FFC; +} + +/* line 46, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .diff-table pre { + border-radius: 0px; +} + +/* line 48, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data table, .file-box .data table { + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + font-size: 12px; + line-height: 1.4; +} + +/* line 54, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .file-diff-line span.color { + cursor: default; +} + +/* Comment Bubble */ +/* line 58, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file-diff-line .add-bubble { + position: absolute; + left: 0; + width: 25px; + height: 16px; + margin-top: 0; + cursor: pointer; + opacity: 0; + color: #4183C4; +} + +/* line 69, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file-diff-line:hover .add-bubble { + opacity: 1; +} + +/* Comment Bubble icons */ +/* line 72, ../../../hub/static/css/mod/file-diff-blob.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 83, ../../../hub/static/css/mod/file-diff-blob.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 91, ../../../hub/static/css/mod/file-diff-blob.scss */ +.mini-icon-add-comment::before { + content: "\f06f"; +} + +/* line 93, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container:first-child:after { + margin: -18px 0 0; +} + +/* line 97, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container:after { + background: none repeat scroll 0 0 #fff; + content: ""; + display: block; + height: 2px; + margin: -16px 0 0; + position: absolute; + left: 0px; + width: 938px; +} + +/* line 109, ../../../hub/static/css/mod/file-diff-blob.scss */ +.data .line-numbers-skipped { + position: absolute; + width: 79px; + background-color: #f5f5f5; + border-right: 1px solid #ccc; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; +} + +/* line 119, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .skipped-top, .skipped-container .skipped-bottom { + height: 18px; + background-color: #f5f5f5; +} + +/* line 124, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-top::before { + background: #fff; + border-bottom: 1px solid #ccc; + border-top: 1px solid #ccc; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + content: ""; + display: block; + height: 4px; + position: relative; + top: -1px; + margin-left: -1px; +} + +/* line 140, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .ellipsis:hover { + background-color: #e6e6e6; + border-color: #999; +} + +/* line 145, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .ellipsis { + background: #f5f5f5; + border: 1px solid #ccc; + -moz-border-radius: 3px; + border-radius: 3px; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + box-shadow: 0 0 0 2px #fff; + cursor: pointer; + display: block; + float: left; + font-family: Arial, sans-serif; + font-size: 20px; + text-align: center; + color: #707070; + height: 16px; + line-height: 6px; + margin: 0 0 0 5px; + padding: 0; + position: absolute; + width: 30px; + z-index: 10; +} + +/* line 170, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-top .ellipsis { + margin-top: -10px; +} + +/* line 174, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .ellipsis::before, .skipped-container .ellipsis::after { + border: 1px solid #ccc; + -moz-border-radius: 4px; + border-radius: 4px; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + content: ""; + height: 9px; + left: -4px; + width: 36px; + position: absolute; +} + +/* line 188, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .ellipsis::before { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + content: "\2026"; + padding: 2px 0 0; + top: -4px; +} + +/* line 197, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .ellipsis::after { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; + bottom: -4px; + height: 10px; +} + +/* line 206, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .toggle_whitespace:hover { + background-color: #e6e6e6; + border-color: #999; +} + +/* line 211, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .toggle_whitespace { + background: #f5f5f5; + border: 1px solid #ccc; + -moz-border-radius: 3px; + border-radius: 3px; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + box-shadow: 0 0 0 2px #fff; + cursor: pointer; + display: block; + float: left; + font-family: Arial, sans-serif; + font-size: 16px; + text-align: center; + color: #707070; + height: 16px; + line-height: 6px; + margin: 0 0 0 44px; + padding: 0; + position: absolute; + width: 30px; + z-index: 10; +} + +/* line 236, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-top .toggle_whitespace { + margin-top: -10px; +} + +/* line 240, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .toggle_whitespace::before, .skipped-container .toggle_whitespace::after { + border: 1px solid #ccc; + -moz-border-radius: 4px; + border-radius: 4px; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + content: ""; + height: 9px; + left: -4px; + width: 36px; + position: absolute; +} + +/* line 254, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .toggle_whitespace::before { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + content: "\2423"; + padding: 2px 0 0; + top: -4px; +} + +/* line 263, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .toggle_whitespace::after { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; + bottom: -4px; + height: 10px; +} + +/* highlight style */ +/* line 2, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .hll { + background-color: #ffffcc; +} + +/* line 3, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight { + background: #ffffff; +} + +/* line 4, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .c { + color: #808080; +} + +/* Comment */ +/* line 5, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .err { + color: #F00000; + background-color: #F0A0A0; +} + +/* Error */ +/* line 6, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .k { + color: #008000; + font-weight: bold; +} + +/* Keyword */ +/* line 7, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .o { + color: #303030; +} + +/* Operator */ +/* line 8, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .cm { + color: #808080; +} + +/* Comment.Multiline */ +/* line 9, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .cp { + color: #507090; +} + +/* Comment.Preproc */ +/* line 10, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .c1 { + color: #808080; +} + +/* Comment.Single */ +/* line 11, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .cs { + color: #cc0000; + font-weight: bold; +} + +/* Comment.Special */ +/* line 12, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gd { + color: #A00000; +} + +/* Generic.Deleted */ +/* line 13, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ge { + font-style: italic; +} + +/* Generic.Emph */ +/* line 14, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gr { + color: #FF0000; +} + +/* Generic.Error */ +/* line 15, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gh { + color: #000080; + font-weight: bold; +} + +/* Generic.Heading */ +/* line 16, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gi { + color: #00A000; +} + +/* Generic.Inserted */ +/* line 17, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .go { + color: #808080; +} + +/* Generic.Output */ +/* line 18, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gp { + color: #c65d09; + font-weight: bold; +} + +/* Generic.Prompt */ +/* line 19, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gs { + font-weight: bold; +} + +/* Generic.Strong */ +/* line 20, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gu { + color: #800080; + font-weight: bold; +} + +/* Generic.Subheading */ +/* line 21, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gt { + color: #0040D0; +} + +/* Generic.Traceback */ +/* line 22, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kc { + color: #008000; + font-weight: bold; +} + +/* Keyword.Constant */ +/* line 23, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kd { + color: #008000; + font-weight: bold; +} + +/* Keyword.Declaration */ +/* line 24, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kn { + color: #008000; + font-weight: bold; +} + +/* Keyword.Namespace */ +/* line 25, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kp { + color: #003080; + font-weight: bold; +} + +/* Keyword.Pseudo */ +/* line 26, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kr { + color: #008000; + font-weight: bold; +} + +/* Keyword.Reserved */ +/* line 27, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kt { + color: #303090; + font-weight: bold; +} + +/* Keyword.Type */ +/* line 28, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .m { + color: #6000E0; + font-weight: bold; +} + +/* Literal.Number */ +/* line 29, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .s { + background-color: #fff0f0; +} + +/* Literal.String */ +/* line 30, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .na { + color: #0000C0; +} + +/* Name.Attribute */ +/* line 31, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nb { + color: #007020; +} + +/* Name.Builtin */ +/* line 32, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nc { + color: #B00060; + font-weight: bold; +} + +/* Name.Class */ +/* line 33, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .no { + color: #003060; + font-weight: bold; +} + +/* Name.Constant */ +/* line 34, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nd { + color: #505050; + font-weight: bold; +} + +/* Name.Decorator */ +/* line 35, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ni { + color: #800000; + font-weight: bold; +} + +/* Name.Entity */ +/* line 36, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ne { + color: #F00000; + font-weight: bold; +} + +/* Name.Exception */ +/* line 37, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nf { + color: #0060B0; + font-weight: bold; +} + +/* Name.Function */ +/* line 38, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nl { + color: #907000; + font-weight: bold; +} + +/* Name.Label */ +/* line 39, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nn { + color: #0e84b5; + font-weight: bold; +} + +/* Name.Namespace */ +/* line 40, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nt { + color: #007000; +} + +/* Name.Tag */ +/* line 41, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nv { + color: #906030; +} + +/* Name.Variable */ +/* line 42, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ow { + color: #000000; + font-weight: bold; +} + +/* Operator.Word */ +/* line 43, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .w { + color: #bbbbbb; +} + +/* Text.Whitespace */ +/* line 44, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mf { + color: #6000E0; + font-weight: bold; +} + +/* Literal.Number.Float */ +/* line 45, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mh { + color: #005080; + font-weight: bold; +} + +/* Literal.Number.Hex */ +/* line 46, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mi { + color: #0000D0; + font-weight: bold; +} + +/* Literal.Number.Integer */ +/* line 47, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mo { + color: #4000E0; + font-weight: bold; +} + +/* Literal.Number.Oct */ +/* line 48, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sb { + background-color: #fff0f0; +} + +/* Literal.String.Backtick */ +/* line 49, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sc { + color: #0040D0; +} + +/* Literal.String.Char */ +/* line 50, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sd { + color: #D04020; +} + +/* Literal.String.Doc */ +/* line 51, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .s2 { + background-color: #fff0f0; +} + +/* Literal.String.Double */ +/* line 52, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .se { + color: #606060; + font-weight: bold; + background-color: #fff0f0; +} + +/* Literal.String.Escape */ +/* line 53, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sh { + background-color: #fff0f0; +} + +/* Literal.String.Heredoc */ +/* line 54, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .si { + background-color: #e0e0e0; +} + +/* Literal.String.Interpol */ +/* line 55, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sx { + color: #D02000; + background-color: #fff0f0; +} + +/* Literal.String.Other */ +/* line 56, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sr { + color: #000000; + background-color: #fff0ff; +} + +/* Literal.String.Regex */ +/* line 57, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .s1 { + background-color: #fff0f0; +} + +/* Literal.String.Single */ +/* line 58, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ss { + color: #A06000; +} + +/* Literal.String.Symbol */ +/* line 59, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .bp { + color: #007020; +} + +/* Name.Builtin.Pseudo */ +/* line 60, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .vc { + color: #306090; +} + +/* Name.Variable.Class */ +/* line 61, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .vg { + color: #d07000; + font-weight: bold; +} + +/* Name.Variable.Global */ +/* line 62, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .vi { + color: #3030B0; +} + +/* Name.Variable.Instance */ +/* line 63, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .il { + color: #0000D0; + font-weight: bold; +} + +/* Literal.Number.Integer.Long */ +/* Highlight style from pygments */ +/* line 2, ../../../hub/static/css/mod/code-highlight.scss */ +.code .hll { + background-color: #ffffcc; +} + +/* line 3, ../../../hub/static/css/mod/code-highlight.scss */ +.code { + background: #ffffff; +} + +/* line 4, ../../../hub/static/css/mod/code-highlight.scss */ +.code .c { + color: #808080; +} + +/* Comment */ +/* line 5, ../../../hub/static/css/mod/code-highlight.scss */ +.code .err { + color: #F00000; + background-color: #F0A0A0; +} + +/* Error */ +/* line 6, ../../../hub/static/css/mod/code-highlight.scss */ +.code .k { + color: #008000; + font-weight: bold; +} + +/* Keyword */ +/* line 7, ../../../hub/static/css/mod/code-highlight.scss */ +.code .o { + color: #303030; +} + +/* Operator */ +/* line 8, ../../../hub/static/css/mod/code-highlight.scss */ +.code .cm { + color: #808080; +} + +/* Comment.Multiline */ +/* line 9, ../../../hub/static/css/mod/code-highlight.scss */ +.code .cp { + color: #507090; +} + +/* Comment.Preproc */ +/* line 10, ../../../hub/static/css/mod/code-highlight.scss */ +.code .c1 { + color: #808080; +} + +/* Comment.Single */ +/* line 11, ../../../hub/static/css/mod/code-highlight.scss */ +.code .cs { + color: #cc0000; + font-weight: bold; +} + +/* Comment.Special */ +/* line 12, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gd { + color: #A00000; +} + +/* Generic.Deleted */ +/* line 13, ../../../hub/static/css/mod/code-highlight.scss */ +.code .ge { + font-style: italic; +} + +/* Generic.Emph */ +/* line 14, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gr { + color: #FF0000; +} + +/* Generic.Error */ +/* line 15, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gh { + color: #000080; + font-weight: bold; +} + +/* Generic.Heading */ +/* line 16, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gi { + color: #00A000; +} + +/* Generic.Inserted */ +/* line 17, ../../../hub/static/css/mod/code-highlight.scss */ +.code .go { + color: #808080; +} + +/* Generic.Output */ +/* line 18, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gp { + color: #c65d09; + font-weight: bold; +} + +/* Generic.Prompt */ +/* line 19, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gs { + font-weight: bold; +} + +/* Generic.Strong */ +/* line 20, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gu { + color: #800080; + font-weight: bold; +} + +/* Generic.Subheading */ +/* line 21, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gt { + color: #0040D0; +} + +/* Generic.Traceback */ +/* line 22, ../../../hub/static/css/mod/code-highlight.scss */ +.code .kc { + color: #008000; + font-weight: bold; +} + +/* Keyword.Constant */ +/* line 23, ../../../hub/static/css/mod/code-highlight.scss */ +.code .kd { + color: #008000; + font-weight: bold; +} + +/* Keyword.Declaration */ +/* line 24, ../../../hub/static/css/mod/code-highlight.scss */ +.code .kn { + color: #008000; + font-weight: bold; +} + +/* Keyword.Namespace */ +/* line 25, ../../../hub/static/css/mod/code-highlight.scss */ +.code .kp { + color: #003080; + font-weight: bold; +} + +/* Keyword.Pseudo */ +/* line 26, ../../../hub/static/css/mod/code-highlight.scss */ +.code .kr { + color: #008000; + font-weight: bold; +} + +/* Keyword.Reserved */ +/* line 27, ../../../hub/static/css/mod/code-highlight.scss */ +.code .kt { + color: #303090; + font-weight: bold; +} + +/* Keyword.Type */ +/* line 28, ../../../hub/static/css/mod/code-highlight.scss */ +.code .m { + color: #6000E0; + font-weight: bold; +} + +/* Literal.Number */ +/* line 29, ../../../hub/static/css/mod/code-highlight.scss */ +.code .s { + background-color: #fff0f0; +} + +/* Literal.String */ +/* line 30, ../../../hub/static/css/mod/code-highlight.scss */ +.code .na { + color: #0000C0; +} + +/* Name.Attribute */ +/* line 31, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nb { + color: #007020; +} + +/* Name.Builtin */ +/* line 32, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nc { + color: #B00060; + font-weight: bold; +} + +/* Name.Class */ +/* line 33, ../../../hub/static/css/mod/code-highlight.scss */ +.code .no { + color: #003060; + font-weight: bold; +} + +/* Name.Constant */ +/* line 34, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nd { + color: #505050; + font-weight: bold; +} + +/* Name.Decorator */ +/* line 35, ../../../hub/static/css/mod/code-highlight.scss */ +.code .ni { + color: #800000; + font-weight: bold; +} + +/* Name.Entity */ +/* line 36, ../../../hub/static/css/mod/code-highlight.scss */ +.code .ne { + color: #F00000; + font-weight: bold; +} + +/* Name.Exception */ +/* line 37, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nf { + color: #0060B0; + font-weight: bold; +} + +/* Name.Function */ +/* line 38, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nl { + color: #907000; + font-weight: bold; +} + +/* Name.Label */ +/* line 39, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nn { + color: #0e84b5; + font-weight: bold; +} + +/* Name.Namespace */ +/* line 40, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nt { + color: #007000; +} + +/* Name.Tag */ +/* line 41, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nv { + color: #906030; +} + +/* Name.Variable */ +/* line 42, ../../../hub/static/css/mod/code-highlight.scss */ +.code .ow { + color: #000000; + font-weight: bold; +} + +/* Operator.Word */ +/* line 43, ../../../hub/static/css/mod/code-highlight.scss */ +.code .w { + color: #bbbbbb; +} + +/* Text.Whitespace */ +/* line 44, ../../../hub/static/css/mod/code-highlight.scss */ +.code .mf { + color: #6000E0; + font-weight: bold; +} + +/* Literal.Number.Float */ +/* line 45, ../../../hub/static/css/mod/code-highlight.scss */ +.code .mh { + color: #005080; + font-weight: bold; +} + +/* Literal.Number.Hex */ +/* line 46, ../../../hub/static/css/mod/code-highlight.scss */ +.code .mi { + color: #0000D0; + font-weight: bold; +} + +/* Literal.Number.Integer */ +/* line 47, ../../../hub/static/css/mod/code-highlight.scss */ +.code .mo { + color: #4000E0; + font-weight: bold; +} + +/* Literal.Number.Oct */ +/* line 48, ../../../hub/static/css/mod/code-highlight.scss */ +.code .sb { + background-color: #fff0f0; +} + +/* Literal.String.Backtick */ +/* line 49, ../../../hub/static/css/mod/code-highlight.scss */ +.code .sc { + color: #0040D0; +} + +/* Literal.String.Char */ +/* line 50, ../../../hub/static/css/mod/code-highlight.scss */ +.code .sd { + color: #D04020; +} + +/* Literal.String.Doc */ +/* line 51, ../../../hub/static/css/mod/code-highlight.scss */ +.code .s2 { + background-color: #fff0f0; +} + +/* Literal.String.Double */ +/* line 52, ../../../hub/static/css/mod/code-highlight.scss */ +.code .se { + color: #606060; + font-weight: bold; + background-color: #fff0f0; +} + +/* Literal.String.Escape */ +/* line 53, ../../../hub/static/css/mod/code-highlight.scss */ +.code .sh { + background-color: #fff0f0; +} + +/* Literal.String.Heredoc */ +/* line 54, ../../../hub/static/css/mod/code-highlight.scss */ +.code .si { + background-color: #e0e0e0; +} + +/* Literal.String.Interpol */ +/* line 55, ../../../hub/static/css/mod/code-highlight.scss */ +.code .sx { + color: #D02000; + background-color: #fff0f0; +} + +/* Literal.String.Other */ +/* line 56, ../../../hub/static/css/mod/code-highlight.scss */ +.code .sr { + color: #000000; + background-color: #fff0ff; +} + +/* Literal.String.Regex */ +/* line 57, ../../../hub/static/css/mod/code-highlight.scss */ +.code .s1 { + background-color: #fff0f0; +} + +/* Literal.String.Single */ +/* line 58, ../../../hub/static/css/mod/code-highlight.scss */ +.code .ss { + color: #A06000; +} + +/* Literal.String.Symbol */ +/* line 59, ../../../hub/static/css/mod/code-highlight.scss */ +.code .bp { + color: #007020; +} + +/* Name.Builtin.Pseudo */ +/* line 60, ../../../hub/static/css/mod/code-highlight.scss */ +.code .vc { + color: #306090; +} + +/* Name.Variable.Class */ +/* line 61, ../../../hub/static/css/mod/code-highlight.scss */ +.code .vg { + color: #d07000; + font-weight: bold; +} + +/* Name.Variable.Global */ +/* line 62, ../../../hub/static/css/mod/code-highlight.scss */ +.code .vi { + color: #3030B0; +} + +/* Name.Variable.Instance */ +/* line 63, ../../../hub/static/css/mod/code-highlight.scss */ +.code .il { + color: #0000D0; + font-weight: bold; +} + +/* Literal.Number.Integer.Long */ diff --git a/dist/css/app/gist.css b/dist/css/app/gist.css new file mode 100644 index 0000000..4c5203d --- /dev/null +++ b/dist/css/app/gist.css @@ -0,0 +1,7948 @@ +@charset "UTF-8"; +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* Highlight style from pygments */ +/* line 2, ../../../hub/static/css/mod/code-highlight.scss */ +.code .hll { + background-color: #ffffcc; +} + +/* line 3, ../../../hub/static/css/mod/code-highlight.scss */ +.code { + background: #ffffff; +} + +/* line 4, ../../../hub/static/css/mod/code-highlight.scss */ +.code .c { + color: #808080; +} + +/* Comment */ +/* line 5, ../../../hub/static/css/mod/code-highlight.scss */ +.code .err { + color: #F00000; + background-color: #F0A0A0; +} + +/* Error */ +/* line 6, ../../../hub/static/css/mod/code-highlight.scss */ +.code .k { + color: #008000; + font-weight: bold; +} + +/* Keyword */ +/* line 7, ../../../hub/static/css/mod/code-highlight.scss */ +.code .o { + color: #303030; +} + +/* Operator */ +/* line 8, ../../../hub/static/css/mod/code-highlight.scss */ +.code .cm { + color: #808080; +} + +/* Comment.Multiline */ +/* line 9, ../../../hub/static/css/mod/code-highlight.scss */ +.code .cp { + color: #507090; +} + +/* Comment.Preproc */ +/* line 10, ../../../hub/static/css/mod/code-highlight.scss */ +.code .c1 { + color: #808080; +} + +/* Comment.Single */ +/* line 11, ../../../hub/static/css/mod/code-highlight.scss */ +.code .cs { + color: #cc0000; + font-weight: bold; +} + +/* Comment.Special */ +/* line 12, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gd { + color: #A00000; +} + +/* Generic.Deleted */ +/* line 13, ../../../hub/static/css/mod/code-highlight.scss */ +.code .ge { + font-style: italic; +} + +/* Generic.Emph */ +/* line 14, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gr { + color: #FF0000; +} + +/* Generic.Error */ +/* line 15, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gh { + color: #000080; + font-weight: bold; +} + +/* Generic.Heading */ +/* line 16, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gi { + color: #00A000; +} + +/* Generic.Inserted */ +/* line 17, ../../../hub/static/css/mod/code-highlight.scss */ +.code .go { + color: #808080; +} + +/* Generic.Output */ +/* line 18, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gp { + color: #c65d09; + font-weight: bold; +} + +/* Generic.Prompt */ +/* line 19, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gs { + font-weight: bold; +} + +/* Generic.Strong */ +/* line 20, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gu { + color: #800080; + font-weight: bold; +} + +/* Generic.Subheading */ +/* line 21, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gt { + color: #0040D0; +} + +/* Generic.Traceback */ +/* line 22, ../../../hub/static/css/mod/code-highlight.scss */ +.code .kc { + color: #008000; + font-weight: bold; +} + +/* Keyword.Constant */ +/* line 23, ../../../hub/static/css/mod/code-highlight.scss */ +.code .kd { + color: #008000; + font-weight: bold; +} + +/* Keyword.Declaration */ +/* line 24, ../../../hub/static/css/mod/code-highlight.scss */ +.code .kn { + color: #008000; + font-weight: bold; +} + +/* Keyword.Namespace */ +/* line 25, ../../../hub/static/css/mod/code-highlight.scss */ +.code .kp { + color: #003080; + font-weight: bold; +} + +/* Keyword.Pseudo */ +/* line 26, ../../../hub/static/css/mod/code-highlight.scss */ +.code .kr { + color: #008000; + font-weight: bold; +} + +/* Keyword.Reserved */ +/* line 27, ../../../hub/static/css/mod/code-highlight.scss */ +.code .kt { + color: #303090; + font-weight: bold; +} + +/* Keyword.Type */ +/* line 28, ../../../hub/static/css/mod/code-highlight.scss */ +.code .m { + color: #6000E0; + font-weight: bold; +} + +/* Literal.Number */ +/* line 29, ../../../hub/static/css/mod/code-highlight.scss */ +.code .s { + background-color: #fff0f0; +} + +/* Literal.String */ +/* line 30, ../../../hub/static/css/mod/code-highlight.scss */ +.code .na { + color: #0000C0; +} + +/* Name.Attribute */ +/* line 31, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nb { + color: #007020; +} + +/* Name.Builtin */ +/* line 32, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nc { + color: #B00060; + font-weight: bold; +} + +/* Name.Class */ +/* line 33, ../../../hub/static/css/mod/code-highlight.scss */ +.code .no { + color: #003060; + font-weight: bold; +} + +/* Name.Constant */ +/* line 34, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nd { + color: #505050; + font-weight: bold; +} + +/* Name.Decorator */ +/* line 35, ../../../hub/static/css/mod/code-highlight.scss */ +.code .ni { + color: #800000; + font-weight: bold; +} + +/* Name.Entity */ +/* line 36, ../../../hub/static/css/mod/code-highlight.scss */ +.code .ne { + color: #F00000; + font-weight: bold; +} + +/* Name.Exception */ +/* line 37, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nf { + color: #0060B0; + font-weight: bold; +} + +/* Name.Function */ +/* line 38, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nl { + color: #907000; + font-weight: bold; +} + +/* Name.Label */ +/* line 39, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nn { + color: #0e84b5; + font-weight: bold; +} + +/* Name.Namespace */ +/* line 40, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nt { + color: #007000; +} + +/* Name.Tag */ +/* line 41, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nv { + color: #906030; +} + +/* Name.Variable */ +/* line 42, ../../../hub/static/css/mod/code-highlight.scss */ +.code .ow { + color: #000000; + font-weight: bold; +} + +/* Operator.Word */ +/* line 43, ../../../hub/static/css/mod/code-highlight.scss */ +.code .w { + color: #bbbbbb; +} + +/* Text.Whitespace */ +/* line 44, ../../../hub/static/css/mod/code-highlight.scss */ +.code .mf { + color: #6000E0; + font-weight: bold; +} + +/* Literal.Number.Float */ +/* line 45, ../../../hub/static/css/mod/code-highlight.scss */ +.code .mh { + color: #005080; + font-weight: bold; +} + +/* Literal.Number.Hex */ +/* line 46, ../../../hub/static/css/mod/code-highlight.scss */ +.code .mi { + color: #0000D0; + font-weight: bold; +} + +/* Literal.Number.Integer */ +/* line 47, ../../../hub/static/css/mod/code-highlight.scss */ +.code .mo { + color: #4000E0; + font-weight: bold; +} + +/* Literal.Number.Oct */ +/* line 48, ../../../hub/static/css/mod/code-highlight.scss */ +.code .sb { + background-color: #fff0f0; +} + +/* Literal.String.Backtick */ +/* line 49, ../../../hub/static/css/mod/code-highlight.scss */ +.code .sc { + color: #0040D0; +} + +/* Literal.String.Char */ +/* line 50, ../../../hub/static/css/mod/code-highlight.scss */ +.code .sd { + color: #D04020; +} + +/* Literal.String.Doc */ +/* line 51, ../../../hub/static/css/mod/code-highlight.scss */ +.code .s2 { + background-color: #fff0f0; +} + +/* Literal.String.Double */ +/* line 52, ../../../hub/static/css/mod/code-highlight.scss */ +.code .se { + color: #606060; + font-weight: bold; + background-color: #fff0f0; +} + +/* Literal.String.Escape */ +/* line 53, ../../../hub/static/css/mod/code-highlight.scss */ +.code .sh { + background-color: #fff0f0; +} + +/* Literal.String.Heredoc */ +/* line 54, ../../../hub/static/css/mod/code-highlight.scss */ +.code .si { + background-color: #e0e0e0; +} + +/* Literal.String.Interpol */ +/* line 55, ../../../hub/static/css/mod/code-highlight.scss */ +.code .sx { + color: #D02000; + background-color: #fff0f0; +} + +/* Literal.String.Other */ +/* line 56, ../../../hub/static/css/mod/code-highlight.scss */ +.code .sr { + color: #000000; + background-color: #fff0ff; +} + +/* Literal.String.Regex */ +/* line 57, ../../../hub/static/css/mod/code-highlight.scss */ +.code .s1 { + background-color: #fff0f0; +} + +/* Literal.String.Single */ +/* line 58, ../../../hub/static/css/mod/code-highlight.scss */ +.code .ss { + color: #A06000; +} + +/* Literal.String.Symbol */ +/* line 59, ../../../hub/static/css/mod/code-highlight.scss */ +.code .bp { + color: #007020; +} + +/* Name.Builtin.Pseudo */ +/* line 60, ../../../hub/static/css/mod/code-highlight.scss */ +.code .vc { + color: #306090; +} + +/* Name.Variable.Class */ +/* line 61, ../../../hub/static/css/mod/code-highlight.scss */ +.code .vg { + color: #d07000; + font-weight: bold; +} + +/* Name.Variable.Global */ +/* line 62, ../../../hub/static/css/mod/code-highlight.scss */ +.code .vi { + color: #3030B0; +} + +/* Name.Variable.Instance */ +/* line 63, ../../../hub/static/css/mod/code-highlight.scss */ +.code .il { + color: #0000D0; + font-weight: bold; +} + +/* Literal.Number.Integer.Long */ +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* preview comment form style */ +/* line 2, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav { + margin: 10px 0; + border-bottom: 1px solid #DDD; + height: 35px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs { + display: inline-block; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs > li { + display: inline-block; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab { + display: inline-block; + margin-bottom: -1px; + padding: 8px 12px 9px; + border: 1px solid transparent; + border-bottom: 0; + font-size: 14px; + color: #666; + text-decoration: none; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab.selected { + border-color: #DDD; + border-radius: 3px 3px 0 0; + background-color: white; + color: #333; + font-weight: bold; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab:hover { + text-decoration: none; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav { + position: relative; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav ul.tabnav-tabs { + padding-left: 10px; +} + +/* line 10, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 0 10px 10px; +} + +/* line 11, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form #preview_bucket .content-body { + padding: 10px; + min-height: 132px; +} + +/* ================================== *\ + * Zen Form + * ================================== */ +/* line 6, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + position: fixed; + z-index: 99999; + top: 0; + left: 0; + right: 0; + bottom: 0; + padding: 24px 30px 24px 24px; +} + +/* line 16, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-input-wrap { + max-width: 640px; + position: relative; + margin: 0 auto; +} + +/** + * Buttons style + */ +/* line 25, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button, +.zen-forms-theme-switch { + position: absolute; + width: 18px; + height: 18px; + text-align: center; + top: 10px; + right: 10px; + font-size: 24px; + color: #516066; + cursor: pointer; + line-height: 1; +} + +/* line 39, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-theme-switch { + top: 28px; + font-size: 34px; +} + +/* line 44, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button:hover, +.zen-forms-theme-switch:hover { + color: #667981; +} + +/** + * Inputs basic style + */ +/* line 52, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + padding: 8px 0; + width: 100%; + background: none; + border: none; + margin-bottom: 24px; + cursor: pointer; +} + +/* line 62, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus, +.zen-forms textarea:focus { + cursor: text; +} + +/* line 67, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms textarea { + resize: none; +} + +/* line 71, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + cursor: pointer; + display: none; + padding: 8px 3; + position: absolute; + top: 0; + width: 100%; +} + +/* line 80, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms .empty + label { + display: block; +} + +/* line 84, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus + label, +.zen-forms textarea:focus + label { + display: none; +} + +/* line 89, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms :focus { + outline-color: transparent; + outline-style: none; +} + +/** + * Dark theme + */ +/* line 97, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + background: #151a1c; +} + +/* line 101, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + color: #516066; +} + +/* line 105, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + color: #667981; +} + +/** + * Light theme + */ +/* line 113, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme { + background: #fefefe; +} + +/* line 117, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme label { + color: #959697; +} + +/* line 121, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme input, +.zen-forms.light-theme textarea { + color: #707071; +} + +/* line 4, ../../../hub/static/css/mod/zen-forms.scss */ +.write-content .enable-fullscreen { + position: absolute; + top: 5px; + right: 16px; + color: #333333; + opacity: .5; + line-height: 1em; +} + +/* line 5, ../../../hub/static/css/mod/zen-forms.scss */ +.mini-icon-fullscreen::before { + content: ""; +} + +/* line 6, ../../../hub/static/css/mod/zen-forms.scss */ +.fullscreen-overlay textarea, .zen-forms textarea { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + height: 100%; + padding: 20px; + border: 0; + font-size: 21px; + line-height: 1.6em; + resize: none; + -moz-transition: color 0.15s ease-in 0; + -webkit-transition: color 0.15s ease-in 0; + transition: color 0.15s ease-in 0; + box-shadow: none; +} + +/* line 7, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms.light-theme textarea { + background: #fff; + color: #999999; +} + +/* line 8, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms .zen-forms-input-wrap { + width: 100%; + height: 100%; +} + +/* line 9, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms label[for^=zen-forms-input] { + display: none; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-zen.scss */ +.previewable-comment-form .zen-enabled textarea { + padding: 10px 18px 10px 10px; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled { + position: relative; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled .go-zen { + position: absolute; + right: 15px; + top: 5px; +} + +/* button list */ +/* line 3, ../../../hub/static/css/mod/file-blob.scss */ +.button-group { + display: inline-block; + overflow: hidden; + border: 1px solid #d4d4d4; + border-radius: 3px; + border-bottom-color: #bcbcbc; + background: #f5f5f5; + background: -moz-linear-gradient(#f5f5f5, #e5e5e5); + background: -webkit-linear-gradient(#f5f5f5, #e5e5e5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; +} + +/* line 4, ../../../hub/static/css/mod/file-blob.scss */ +.button-group li { + margin: 0 !important; + float: left; +} + +/* line 5, ../../../hub/static/css/mod/file-blob.scss */ +.button-group li:first-child .grouped-button { + border-left: none; + border-bottom-left-radius: 2px; + border-top-left-radius: 2px; +} + +/* line 6, ../../../hub/static/css/mod/file-blob.scss */ +.button-group li:last-child .grouped-button { + border-right: none; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 2px; +} + +/* line 7, ../../../hub/static/css/mod/file-blob.scss */ +.button-group .grouped-button { + float: left; + background: none; + border-bottom: none; + border-top: none; + border-left: 1px solid rgba(0, 0, 0, 0.1); + border-right: 1px solid rgba(255, 255, 255, 0.5); + border-radius: 0; + cursor: pointer; +} + +/* line 8, ../../../hub/static/css/mod/file-blob.scss */ +.button-group .minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line-no */ +/* line 12, ../../../hub/static/css/mod/file-blob.scss */ +#blob .file { + min-height: 78px; + position: relative; + overflow: auto; +} + +/* line 13, ../../../hub/static/css/mod/file-blob.scss */ +#blob .file .rawfile { + text-align: center; + background-color: #ddd; + padding: 30px; + position: relative; +} + +/* line 14, ../../../hub/static/css/mod/file-blob.scss */ +.file table { + width: 100%; + border-collapse: collapse; + border-spacing: 0; +} + +/* line 15, ../../../hub/static/css/mod/file-blob.scss */ +.file table td, .file table th { + vertical-align: top; + padding: 0; +} + +/* line 16, ../../../hub/static/css/mod/file-blob.scss */ +.file .data { + overflow: auto; +} + +/* line 18, ../../../hub/static/css/mod/file-blob.scss */ +.code { + width: 100%; +} + +/* line 19, ../../../hub/static/css/mod/file-blob.scss */ +.code .highlight pre { + margin: 0; + padding: 8px; + border: none; + background-color: #FFF; + white-space: pre; +} + +/* line 20, ../../../hub/static/css/mod/file-blob.scss */ +.code .highlight pre a { + display: block; +} + +/* line 23, ../../../hub/static/css/mod/file-blob.scss */ +.linenos .linenodiv pre { + background-color: #ECECEC; + padding: 8px; + border: none; + border-right: 1px solid #DDD; + text-align: right; + white-space: pre; +} + +/* line 24, ../../../hub/static/css/mod/file-blob.scss */ +.linenos .linenodiv pre a { + color: #AAA; + text-decoration: none; + white-space: nowrap; + line-height: 18px; +} + +/* line 25, ../../../hub/static/css/mod/file-blob.scss */ +.code .highlight pre, .linenos .linenodiv pre { + margin: 0; + line-height: 18px; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +/* line 32, ../../../hub/static/css/mod/file-blob.scss */ +.linenos { + padding: 0; +} + +/* line 1, ../../../hub/static/css/mod/gist-miniicon.scss */ +.minibutton .mini-icon { + vertical-align: -2px; +} + +/* line 2, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-gist::before { + content: "\f00e"; +} + +/* line 3, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mega-icon-gist-secret::before { + content: "\f28c"; + color: #F8EEC7; +} + +/* line 4, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-gist-add::before { + content: "\f07a"; +} + +/* line 5, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-gist-private::before { + content: "\f00f"; +} + +/* line 6, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-gist-forked::before { + content: "\f079"; +} + +/* line 7, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-gist-starred::before { + content: "\f02a"; +} + +/* line 8, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-arr-up::before { + content: "\f03d"; +} + +/* line 9, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-gist-secret::before { + content: "\f08c"; +} + +/* line 10, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-gist-fork::before { + content: "\f020"; +} + +/* line 11, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-gist-star::before { + content: "\f02a"; +} + +/* line 12, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-arr-down::before { + content: "\f03f"; +} + +/* line 13, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-commit-comment::before { + content: "\f02b"; +} + +/* line 14, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-code::before { + content: "\f05f"; +} + +/* line 15, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-link::before { + content: "\f05c"; +} + +/* line 16, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-edit::before { + content: "\f058"; +} + +/* line 17, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-delete-note::before, .mini-icon-remove-close::beforeremove-close::before { + content: "\f050"; +} + +/* line 18, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-arr-right::before { + content: "\f03e"; +} + +/* line 19, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-diff::before { + content: "\f04d"; +} + +/* line 20, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-download::before { + content: "\f00b"; +} + +/* line 21, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-logout::before { + content: "\f032"; +} + +/* line 22, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mega-icon-code-file::before, .mega-icon-download-unknown::before { + content: "\f210"; +} + +/* line 23, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mega-icon-arr-right::before { + content: "\f23e"; +} + +/* line 24, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mega-icon-gist-add::before { + content: "\f27a"; +} + +/* line 25, ../../../hub/static/css/mod/gist-miniicon.scss */ +.discussion-bubble .discussion-bubble-content::before { + content: ""; + display: block; + height: 0; + width: 0; + border: 10px solid #EEE; + border-width: 10px 10px 10px 0; + border-color: transparent #EEE transparent transparent; + position: absolute; + left: -10px; + top: 15px; +} + +/* line 1, ../../../hub/static/css/mod/gist-dropzone.scss */ +#dropzone { + display: none; + background: rgba(0, 0, 0, 0.25); + height: 100%; + position: fixed; + top: 0; + left: 0; + width: 100%; + z-index: 100; +} + +/* line 2, ../../../hub/static/css/mod/gist-dropzone.scss */ +#dropzone #dropzone-pill { + background: rgba(0, 0, 0, 0.75); + border-radius: 6px; + color: #fff; + font-weight: bold; + text-align: center; + margin-left: -100px; + margin-top: -60px; + padding: 20px; + width: 160px; + height: 80px; + position: absolute; + top: 50%; + left: 50%; +} + +/* line 3, ../../../hub/static/css/mod/gist-dropzone.scss */ +#dropzone .mega-icon-code-file::before, .mega-icon-download-unknown::before, #dropzone .mega-icon-arr-right::before, #dropzone .mega-icon-gist-add::before { + font-size: 32px; +} + +/* line 4, ../../../hub/static/css/mod/gist-dropzone.scss */ +#dropzone p { + display: block; + -webkit-margin-before: 1em; + -webkit-margin-after: 1em; + -webkit-margin-start: 0px; + -webkit-margin-end: 0px; +} + +/* line 1, ../../../hub/static/css/mod/gist-comment.scss */ +.tabnav .tabnav-tabs > li:first-child .tabnav-tab.selected { + padding-left: 12px; +} + +/* line 2, ../../../hub/static/css/mod/gist-comment.scss */ +.previewable-comment-form .tabnav { + margin-bottom: 10px; + margin-top: 10px; + position: relative; +} + +/* line 3, ../../../hub/static/css/mod/gist-comment.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 0 10px 10px; +} + +/* line 4, ../../../hub/static/css/mod/gist-comment.scss */ +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* line 5, ../../../hub/static/css/mod/gist-comment.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + display: none; + padding: 0 10px 10px; +} + +/* line 6, ../../../hub/static/css/mod/gist-comment.scss */ +.previewable-comment-form.write-selected .write-content, .previewable-comment-form.preview-selected .preview-content { + display: block; +} + +/* line 7, ../../../hub/static/css/mod/gist-comment.scss */ +.previewable-comment-form .comment { + border: 1px solid #CACACA; +} + +/* line 8, ../../../hub/static/css/mod/gist-comment.scss */ +.comment-header { + height: 33px; + padding: 0 10px 0 6px; + border-bottom: 1px solid #CCC; + background-color: #E1E1E1; + background-image: -moz-linear-gradient(#F8F8F8, #E1E1E1); + background-image: -webkit-linear-gradient(#F8F8F8, #E1E1E1); + background-image: linear-gradient(#F8F8F8, #E1E1E1); + background-repeat: repeat-x; + font-size: 12px; +} + +/* line 9, ../../../hub/static/css/mod/gist-comment.scss */ +.comment-header .comment-header-gravatar { + display: inline-block; + margin-right: 3px; + vertical-align: middle; + border-radius: 3px; +} + +/* line 10, ../../../hub/static/css/mod/gist-comment.scss */ +.gist-form-actions { + text-align: right; + padding-bottom: 5px; +} + +/* line 11, ../../../hub/static/css/mod/gist-comment.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + display: none; + padding: 0 10px 10px; +} + +/* line 12, ../../../hub/static/css/mod/gist-comment.scss */ +.comment-header .comment-header-author { + display: inline-block; + max-width: 600px; + height: 33px; + line-height: 33px; + font-weight: bold; + color: #222; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.7); + white-space: nowrap; + text-overflow: ellipsis; +} + +/* line 13, ../../../hub/static/css/mod/gist-comment.scss */ +.comment-header a { + color: #666; +} + +/* line 14, ../../../hub/static/css/mod/gist-comment.scss */ +.comment-header a:hover { + text-decoration: underline; +} + +/* line 15, ../../../hub/static/css/mod/gist-comment.scss */ +.comment-header .comment-header-right { + float: right; +} + +/* line 16, ../../../hub/static/css/mod/gist-comment.scss */ +.comment-header .comment-header-date { + display: inline-block; + margin: 0; + height: 33px; + font-size: 11px; + line-height: 33px; + font-style: normal; + color: #777; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.7); + line-height: 33px; +} + +/* line 17, ../../../hub/static/css/mod/gist-comment.scss */ +.comment-content .comment-body { + padding: 10px; + font-size: 13px; + overflow: auto; + width: 100%; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +/* line 18, ../../../hub/static/css/mod/gist-comment.scss */ +.markdown-body { + font-size: 14px; + line-height: 1.6; + overflow: hidden; + background-color: white; +} + +/* line 19, ../../../hub/static/css/mod/gist-comment.scss */ +.comment-content { + color: #333; + font-size: 12px; +} + +/* line 20, ../../../hub/static/css/mod/gist-comment.scss */ +.markdown-body > :last-child { + margin-bottom: 0 !important; +} + +/* line 21, ../../../hub/static/css/mod/gist-comment.scss */ +.markdown-body > :first-child { + margin-top: 0 !important; +} + +/* line 22, ../../../hub/static/css/mod/gist-comment.scss */ +.markdown-body p, .markdown-body blockquote, .markdown-body ul, .markdown-body ol, .markdown-body dl, .markdown-body table, .markdown-body pre { + margin: 15px 0; +} + +/* line 23, ../../../hub/static/css/mod/gist-comment.scss */ +.comment-content .comment-body { + font-size: 13px; +} + +/* line 25, ../../../hub/static/css/mod/gist-comment.scss */ +.export-references { + list-style: none; + margin-top: 18px; +} + +/* line 26, ../../../hub/static/css/mod/gist-comment.scss */ +.export-references li, .export-references label { + color: #999; + font-size: 11px; + margin-bottom: 2px; +} + +/* line 27, ../../../hub/static/css/mod/gist-comment.scss */ +.export-references label { + display: block; + padding: 6px 0 1px; + margin-bottom: 0; +} + +/* line 28, ../../../hub/static/css/mod/gist-comment.scss */ +input.url-field { + border-radius: 3px; + border: 1px solid #CCC; + font-family: Monaco, "Liberation Mono", Courier, monospace; + font-size: 11px; + color: #666; + padding: 0 5px 0 5px; + width: 136px; + height: 24px; + margin-bottom: 0; +} + +/* line 29, ../../../hub/static/css/mod/gist-comment.scss */ +.comment-header-actions { + display: inline-block; + vertical-align: middle; + font-size: 13px; +} + +/* line 30, ../../../hub/static/css/mod/gist-comment.scss */ +.comment-header .mini-icon { + color: #939AA0; + margin: 0 2px 0 1px; + position: relative; + top: 1px; +} + +/* line 31, ../../../hub/static/css/mod/gist-comment.scss */ +.comment-header a:hover { + text-decoration: none; + color: #4183C4; +} + +/* line 1, ../../../hub/static/css/mod/gist-recent.scss */ +.recent-gists { + display: block; +} + +/* line 2, ../../../hub/static/css/mod/gist-recent.scss */ +.recent-gists::after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* line 3, ../../../hub/static/css/mod/gist-recent.scss */ +.recent-gists ul { + list-style: none; + margin: 0; + padding: 0; +} + +/* line 4, ../../../hub/static/css/mod/gist-recent.scss */ +.recent-gists li { + display: list-item; + text-align: -webkit-match-parent; + float: left; + width: 200px; +} + +/* line 5, ../../../hub/static/css/mod/gist-recent.scss */ +.recent-gists .metadata { + color: #999; +} + +/* line 6, ../../../hub/static/css/mod/gist-recent.scss */ +.recent-gists .description .blank { + color: rgba(153, 153, 153, 0.5); +} + +/* line 7, ../../../hub/static/css/mod/gist-recent.scss */ +.recent-gists .your-gists { + float: right; + width: 108px; +} + +/* line 8, ../../../hub/static/css/mod/gist-recent.scss */ +.recent-gists .mega-icon::before, .entry-title .meta-icon::before { + font-size: 32px; +} + +/* line 9, ../../../hub/static/css/mod/gist-recent.scss */ +.recent-gists .mega-icon { + color: #B9B9B9; + float: left; + top: -1px; + left: -4px; + position: relative; + font-size: 32px; + width: 32px; + height: 32px; +} + +/* line 1, ../../../hub/static/css/mod/gist-item.scss */ +.gist-item { + display: inline-block; + display: block; + margin-bottom: 2em; + position: relative; +} + +/* line 2, ../../../hub/static/css/mod/gist-item.scss */ +.gist-item ul.meta > li .mini-icon { + line-height: 0.6; + opacity: 0.5; +} + +/* line 3, ../../../hub/static/css/mod/gist-item.scss */ +.gist-item ul.meta { + position: absolute; + right: 0; +} + +/* line 4, ../../../hub/static/css/mod/gist-item.scss */ +.gist-item ul.meta > li { + font-size: 12px; + font-weight: bold; + list-style-type: none; + display: inline-block; + margin-left: 12px; +} + +/* line 5, ../../../hub/static/css/mod/gist-item.scss */ +.gist-item ul.meta > li > a { + display: block; + text-decoration: none; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/gist-item.scss */ +.gist-item .byline { + margin: 3px 0 11px; +} + +/* line 7, ../../../hub/static/css/mod/gist-item.scss */ +.gist-item .creator img { + border-radius: 3px; + width: 28px; + height: 28px; + position: absolute; + top: 0; + left: 0; + margin-left: 3px; +} + +/* line 8, ../../../hub/static/css/mod/gist-item.scss */ +.gist-item .creator { + color: rgba(51, 51, 51, 0.75); + font-size: 13px; + font-weight: 300; + padding-left: 40px; + position: relative; + width: 480px; +} + +/* line 9, ../../../hub/static/css/mod/gist-item.scss */ +.gist-item .creator a { + font-weight: bold; +} + +/* line 10, ../../../hub/static/css/mod/gist-item.scss */ +.gist-item .metadata { + font-size: 11px; + margin-left: 40px; +} + +/* line 11, ../../../hub/static/css/mod/gist-item.scss */ +.gist-item .metadata .datetime { + color: #999; +} + +/* line 12, ../../../hub/static/css/mod/gist-item.scss */ +.gist-item .description { + color: rgba(51, 51, 51, 0.75); + display: block; + font-size: 12px; + vertical-align: text-top; + margin-top: 6px; + margin-left: 40px; + width: 480px; +} + +/* line 13, ../../../hub/static/css/mod/gist-item.scss */ +.bubble { + background: #EEE; + border-radius: 3px; + margin-bottom: 1em; + padding: 3px; +} + +/* line 14, ../../../hub/static/css/mod/gist-item.scss */ +table { + font-size: inherit; + font: 100%; +} + +/* line 15, ../../../hub/static/css/mod/gist-item.scss */ +tbody { + display: table-row-group; + vertical-align: middle; + border-color: inherit; +} + +/* line 16, ../../../hub/static/css/mod/gist-item.scss */ +.file-box { + background-color: #DDD; + border: 1px solid #CCC; + margin-bottom: 1em; + position: relative; +} + +/* line 17, ../../../hub/static/css/mod/gist-item.scss */ +.file-box .data { + background-color: ghostWhite; + font-size: 12px; + overflow: auto; +} + +/* line 18, ../../../hub/static/css/mod/gist-item.scss */ +.file-box .highlight { + border: none; + padding: 0; +} + +/* line 19, ../../../hub/static/css/mod/gist-item.scss */ +.file-box .data tr:last-child td.line_numbers, .file-box .data tr:last-child .line_data { + padding-bottom: 12px; +} + +/* line 20, ../../../hub/static/css/mod/gist-item.scss */ +.file-box .data tr:first-child td.line_numbers, .file-box .data tr:first-child .line_data { + padding-top: 12px; +} + +/* line 21, ../../../hub/static/css/mod/gist-item.scss */ +.highlight { + background: white; +} + +/* line 22, ../../../hub/static/css/mod/gist-item.scss */ +.bubble .file-box:only-child { + border-bottom: 1px solid #CCC; +} + +/* line 23, ../../../hub/static/css/mod/gist-item.scss */ +.bubble .file-box .data { + background: ghostWhite; +} + +/* line 24, ../../../hub/static/css/mod/gist-item.scss */ +.gist-item .file-box { + position: relative; +} + +/* line 25, ../../../hub/static/css/mod/gist-item.scss */ +.bubble .file-box { + background: #ECECEC; + margin-bottom: 0; +} + +/* line 26, ../../../hub/static/css/mod/gist-item.scss */ +.bubble.secret { + background-color: #F8EEC7; +} + +/* line 1, ../../../hub/static/css/mod/gist-form.scss */ +.bubble { + background: #EEE; + border-radius: 3px; + margin-bottom: 1em; + padding: 3px; +} + +/* line 2, ../../../hub/static/css/mod/gist-form.scss */ +#gist-form .file { + border: 1px solid #D9D9D9; + background: whiteSmoke; +} + +/* line 3, ../../../hub/static/css/mod/gist-form.scss */ +#gist-form .file .meta { + background-color: #EAEAEA; + background-image: -moz-linear-gradient(#FAFAFA, #EAEAEA); + background-image: -webkit-linear-gradient(#FAFAFA, #EAEAEA); + background-image: linear-gradient(#FAFAFA, #EAEAEA); + background-repeat: repeat-x; + display: inline-block; + display: block; + border-bottom: 1px solid #D8D8D8; + color: #555; + font-size: 12px; + height: 26px; + padding: 8px; + position: relative; + text-align: left; + text-shadow: 0 1px 0 white; +} + +/* line 4, ../../../hub/static/css/mod/gist-form.scss */ +#gist-form .editor-options { + position: absolute; + top: 6px; + right: 5px; +} + +/* line 1, ../../../hub/static/css/mod/gist-render.scss */ +.link-overlay { + height: 100%; + width: 100%; + position: absolute; + visibility: hidden; + z-index: 50; +} + +/* line 2, ../../../hub/static/css/mod/gist-render.scss */ +.link-overlay .link { + background-color: rgba(0, 0, 0, 0.75); + color: white; + margin: -14px 0 0 0; + padding: 4px 8px 4px 10px; + height: 20px; + position: absolute; + top: 20px; + right: 6px; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/gist-render.scss */ +.link-overlay .link .mini-icon { + position: relative; + top: 2px; +} + +/* line 1, ../../../hub/static/css/mod/user-list.scss */ +.user-list { + border-top: 1px solid rgba(0, 0, 0, 0.05); + list-style: none; +} + +/* line 2, ../../../hub/static/css/mod/user-list.scss */ +.user-list li { + border-bottom: 1px solid rgba(0, 0, 0, 0.05); + line-height: 26px; + padding: 6px 0 6px 30px; + position: relative; +} + +/* line 3, ../../../hub/static/css/mod/user-list.scss */ +.user-list li a { + font-weight: bold; + color: #4183C4; +} + +/* line 4, ../../../hub/static/css/mod/user-list.scss */ +.user-list li img { + border-radius: 3px; + margin-top: 1px; + position: absolute; + left: 0; + border: 0; +} + +/* line 5, ../../../hub/static/css/mod/user-list.scss */ +.user-list li .actions { + position: absolute; + top: 6px; + right: 0; +} + +/* line 6, ../../../hub/static/css/mod/user-list.scss */ +.user-list li .actions a { + color: #333; +} + +/* line 7, ../../../hub/static/css/mod/user-list.scss */ +.user-list li .actions a:hover { + color: #FFF; +} + +/* line 1, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body { + padding: 30px; +} + +/* line 4, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body > :first-child { + margin-top: 0 !important; +} + +/* line 7, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body h1, +.markdown-body h2, +.markdown-body h3, +.markdown-body h4, +.markdown-body h5, +.markdown-body h6 { + margin: 20px 0 10px; + padding: 0; + font-weight: bold; + -webkit-font-smoothing: antialiased; + cursor: text; + position: relative; +} + +/* line 20, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body h2 { + font-size: 24px; + border-bottom: 1px solid #CCC; + color: black; +} + +/* line 25, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body, +.markdown-body p { + font-size: 14px; + line-height: 1.6; +} + +/* line 30, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body p, +.markdown-body blockquote, +.markdown-body ul, +.markdown-body ol, +.markdown-body dl, +.markdown-body table, +.markdown-body pre { + margin: 15px 0; +} + +/* line 39, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul, +.markdown-body ol { + padding-left: 30px; +} + +/* line 43, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul li { + line-height: 1.6; +} + +/* line 46, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul { + list-style: disc; +} + +/* line 49, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ol { + list-style: decimal; +} + +/* line 52, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table { + width: 100%; +} + +/* line 55, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table caption + thead tr:first-child th, +.markdown-body table caption + thead tr:first-child td, +.markdown-body table colgroup + thead tr:first-child th, +.markdown-body table colgroup + thead tr:first-child td, +.markdown-body table thead:first-child tr:first-child th, +.markdown-body table thead:first-child tr:first-child td { + border-top: 0; +} + +/* line 63, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table thead th { + vertical-align: bottom; +} + +/* line 66, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th { + font-weight: bold; +} + +/* line 69, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th, +.markdown-body table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #ddd; +} + +/* line 77, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th, +.markdown-body table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #ddd; +} + +/* line 85, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table tbody > tr:nth-child(odd) > td, +.markdown-body table tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} + +/* line 89, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body .progress-percentage { + color: #888; +} + +/* line 93, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page { + padding: 0px; +} + +/* line 96, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page h1, +.markdown-page h2, +.markdown-page h3, +.markdown-page h4, +.markdown-page h5, +.markdown-page h6 { + position: static; +} + +/* line 104, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page pre { + font-family: Consolas, 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 14px; +} + +/* line 108, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page .label { + background-color: transparent; +} + +/* line 111, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page dd { + margin-left: 1.5em; +} + +/* line 114, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body code { + white-space: pre-wrap; +} + +/* line 18, ../../../hub/static/css/app/gist.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* Gist */ +/* line 21, ../../../hub/static/css/app/gist.scss */ +a, a:hover { + text-decoration: none; +} + +/* line 23, ../../../hub/static/css/app/gist.scss */ +.pagehead.separation h1 { + margin-bottom: 15px; +} + +/* line 24, ../../../hub/static/css/app/gist.scss */ +.pagehead h1 { + margin: 0 0 10px 0; + font-size: 20px; + font-weight: normal; + letter-spacing: -1px; + line-height: 28px; + text-shadow: 1px 1px 0 white; + color: #495961; + z-index: 0; +} + +/* line 25, ../../../hub/static/css/app/gist.scss */ +.pagehead .title-actions-bar { + position: relative; +} + +/* line 26, ../../../hub/static/css/app/gist.scss */ +ul.pagehead-actions { + margin: 0; + float: right; + position: absolute; + right: 0; + z-index: 10; +} + +/* line 27, ../../../hub/static/css/app/gist.scss */ +.pagehead.repohead ul.pagehead-actions { + position: relative; + top: 0; + right: 0; + padding: 0 0 0 20px; +} + +/* line 28, ../../../hub/static/css/app/gist.scss */ +ul.pagehead-actions > li { + list-style-type: none; + display: inline-block; + font-size: 11px; + font-weight: bold; + color: #333; + margin: 0 0 0 5px; +} + +/* line 29, ../../../hub/static/css/app/gist.scss */ +li { + display: list-item; + text-align: -webkit-match-parent; +} + +/* line 30, ../../../hub/static/css/app/gist.scss */ +.pagehead.repohead span.repo-label { + position: absolute; + top: 14px; + left: -75px; + width: 65px; + margin-top: -14px; + text-align: right; + font-size: 11px; + text-transform: uppercase; + color: #B9B9B9; + font-weight: 300; + letter-spacing: 0px; + text-shadow: none; + -moz-transition: all 0.4s ease-in-out 0; + -webkit-transition: all 0.4s ease-in-out 0; +} + +/* line 31, ../../../hub/static/css/app/gist.scss */ +.pagehead.repohead span.repo-label { + text-align: right; + font-size: 11px; + text-transform: uppercase; + color: #B9B9B9; + font-weight: 300; + letter-spacing: 0px; + text-shadow: none; +} + +/* line 32, ../../../hub/static/css/app/gist.scss */ +.pagehead.repohead h1 .mega-icon-gist, .pagehead.repohead h1 .mega-icon-gist-secret, .pagehead.repohead h1 .mega-icon-gist-forked { + position: absolute; + left: -4px; + top: 12px; + line-height: 32px; + margin-top: -13px; +} + +/* line 33, ../../../hub/static/css/app/gist.scss */ +.mega-icon { + font-size: 32px; + width: 32px; + height: 32px; +} + +/* line 35, ../../../hub/static/css/app/gist.scss */ +ul.filter-list { + border-top: 1px solid #F1F1F1; + margin-top: 20px; + padding-top: 20px; +} + +/* line 36, ../../../hub/static/css/app/gist.scss */ +ul.filter-list .filter-item { + display: block; + padding: 8px 10px; + margin: 0 0 5px 0; + font-size: 14px; + border-radius: 3px; + text-decoration: none; + color: #777; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +/* line 37, ../../../hub/static/css/app/gist.scss */ +ul.filter-list.small .filter-item { + font-size: 12px; + padding: 4px 10px; + margin: 0 0 2px 0; +} + +/* line 38, ../../../hub/static/css/app/gist.scss */ +ul.filter-list .filter-item .count { + font-weight: bold; + float: right; +} + +/* line 39, ../../../hub/static/css/app/gist.scss */ +.filter-list li { + position: relative; +} + +/* line 41, ../../../hub/static/css/app/gist.scss */ +.tabnav { + margin: 0 0 20px; + border-bottom: 1px solid #DDD; + height: 35px; +} + +/* line 42, ../../../hub/static/css/app/gist.scss */ +.tabnav-right { + position: relative; + display: block; + float: right; +} + +/* line 43, ../../../hub/static/css/app/gist.scss */ +.tabnav-tab { + display: inline-block; + margin-bottom: -1px; + /*padding: 8px 12px;*/ + border: 1px solid transparent; + border-bottom: 0; + font-size: 14px; + color: #666; + text-decoration: none; +} + +/* line 44, ../../../hub/static/css/app/gist.scss */ +.sort-tabs .tabnav-tab { + color: #999; + font-size: 13px; +} + +/* line 45, ../../../hub/static/css/app/gist.scss */ +.tabnav .tabnav-tabs { + display: inline-block; +} + +/* line 46, ../../../hub/static/css/app/gist.scss */ +.tabnav .tabnav-tabs > li:first-child .tabnav-tab { + padding-left: 2px; +} + +/* line 47, ../../../hub/static/css/app/gist.scss */ +.sort-tabs li.active .tabnav-tab { + color: #333; +} + +/* line 50, ../../../hub/static/css/app/gist.scss */ +.infotip { + background: #FBFFCE; + border-radius: 3px; + border: 1px solid #DEEA53; + color: #333; + font-size: 12px; + margin: 0; + padding: 10px; +} + +/* line 51, ../../../hub/static/css/app/gist.scss */ +.root-pane { + float: left; + width: 148px; +} + +/* line 52, ../../../hub/static/css/app/gist.scss */ +.menu-container { + float: none; + width: 142px; + padding: 3px; + background: #EFEFEF; + border-radius: 2px; +} + +/* line 53, ../../../hub/static/css/app/gist.scss */ +.root-pane .menu { + background: #FAFAFB; + border-radius: 2px; + border: 1px solid #D8D8D8; + list-style: none; +} + +/* line 54, ../../../hub/static/css/app/gist.scss */ +.root-pane .menu ul, .root-pane .menu ol { + margin: 0; + padding: 0; +} + +/* line 55, ../../../hub/static/css/app/gist.scss */ +.root-pane .menu li { + border-bottom: 1px solid #EEE; + border-top: 1px solid white; +} + +/* line 56, ../../../hub/static/css/app/gist.scss */ +.root-pane .menu a { + display: block; + padding: 8px 10px 8px 8px; + text-shadow: 0 1px 0 white; + border-left: 2px solid #FAFAFB; + text-decoration: none; +} + +/* line 57, ../../../hub/static/css/app/gist.scss */ +.root-pane .menu a.selected { + background: white; + border-left: 2px solid #D26911; + font-weight: bold; + color: #222; + cursor: default; + box-shadow: inset 0 0px 1px rgba(0, 0, 0, 0.1); +} + +/* line 58, ../../../hub/static/css/app/gist.scss */ +.root-pane .menu a .counter { + float: right; + margin: 0 0 0 5px; + padding: 1px 5px 2px 5px; + font-size: 10px; + font-weight: bold; + color: #666; + background: #E5E5E5; + border-radius: 10px; +} + +/* line 59, ../../../hub/static/css/app/gist.scss */ +.menu a .mini-icon { + color: #333; +} + +/* line 61, ../../../hub/static/css/app/gist.scss */ +.right-content { + width: 770px; +} + +/* line 64, ../../../hub/static/css/app/gist.scss */ +.container { + display: inline-block; + display: block; + margin: 0 auto; +} + +/* line 65, ../../../hub/static/css/app/gist.scss */ +.discussion-bubble { + margin: 20px 0; +} + +/* line 66, ../../../hub/static/css/app/gist.scss */ +.discussion-bubble .discussion-bubble-avatar { + position: relative; + float: left; + border-radius: 3px; +} + +/* line 67, ../../../hub/static/css/app/gist.scss */ +.discussion-bubble .discussion-bubble-content { + position: relative; + margin-left: 60px; +} + +/* line 68, ../../../hub/static/css/app/gist.scss */ +.discussion-bubble-inner { + min-height: 60px; + border: 1px solid #CACACA; + background-color: white; +} + +/* line 69, ../../../hub/static/css/app/gist.scss */ +.discussion-bubble textarea { + -moz-box-sizing: border-box; + box-sizing: border-box; + border: none; + min-height: 60px; + padding: 6px; + width: 100%; + margin-bottom: 0; +} + +/* line 71, ../../../hub/static/css/app/gist.scss */ +a.button { + text-decoration: none; + outline: none; + display: inline-block; +} + +/* line 72, ../../../hub/static/css/app/gist.scss */ +#add-gist { + float: left; +} + +/* line 73, ../../../hub/static/css/app/gist.scss */ +.form-actions { + text-align: right; + padding-bottom: 5px; +} + +/* line 74, ../../../hub/static/css/app/gist.scss */ +button.classy.glowing, a.glowing.button.classy:disabled, a.glowing.button.classy.disabled, button.glowing.classy:disabled:hover, a.glowing.button.classy.disabled:hover, a.button.classy.glowing { + background-color: #E6E1C0; + background-image: -moz-linear-gradient(#FFFAD5, #E6E1C0); + background-image: -webkit-linear-gradient(#FFFAD5, #E6E1C0); + background-image: linear-gradient(#FFFAD5, #E6E1C0); + background-repeat: repeat-x; + border: 1px solid #DDD7AA; + border-bottom-color: #CCC27E; +} + +/* line 75, ../../../hub/static/css/app/gist.scss */ +#gist-form .form-actions { + padding-top: 0; + padding-right: 0; + margin-top: 0; +} + +/* line 77, ../../../hub/static/css/app/gist.scss */ +.bubble .blob { + margin: 0 0 0 0; +} + +/* line 78, ../../../hub/static/css/app/gist.scss */ +.blob .file { + min-height: 30px; + position: relative; + overflow: auto; +} + +/* line 79, ../../../hub/static/css/app/gist.scss */ +.pagehead span.repo-label { + position: absolute; + top: 14px; + left: -75px; + width: 65px; + margin-top: -14px; + text-align: right; + font-size: 11px; + text-transform: uppercase; + color: #B9B9B9; + font-weight: 300; + letter-spacing: 0px; + text-shadow: none; + -moz-transition: all 0.4s ease-in-out 0; + -webkit-transition: all 0.4s ease-in-out 0; +} + +/* line 80, ../../../hub/static/css/app/gist.scss */ +.pagehead span.repo-label { + text-align: right; + font-size: 11px; + text-transform: uppercase; + color: #B9B9B9; + font-weight: 300; + letter-spacing: 0px; + text-shadow: none; +} + +/* line 81, ../../../hub/static/css/app/gist.scss */ +.pagehead h1.secret .repo-label span { + padding: 3px 6px 2px; + background-color: #F8EEC7; + border-radius: 3px; + color: #A1882B; +} + +/* line 82, ../../../hub/static/css/app/gist.scss */ +h1 .mega-icon::before, .entry-title .meta-icon::before { + font-size: 32px; +} + +/* line 83, ../../../hub/static/css/app/gist.scss */ +h1 .mega-icon { + color: #CCC; + float: left; + top: -1px; + left: -4px; + position: relative; + font-size: 32px; + width: 32px; + height: 32px; +} + +/* line 84, ../../../hub/static/css/app/gist.scss */ +.pagehead h1 a { + color: #4183C4; + white-space: nowrap; +} + +/* line 85, ../../../hub/static/css/app/gist.scss */ +.pagehead h1 strong { + font-weight: bold; +} + +/* line 86, ../../../hub/static/css/app/gist.scss */ +.pagehead h1 a { + color: #4183C4; + white-space: nowrap; +} + +/* line 87, ../../../hub/static/css/app/gist.scss */ +.pagehead h1.avatared { + position: relative; + padding-left: 52px; + margin-bottom: 16px; + font-weight: bold; + line-height: 54px; +} + +/* line 88, ../../../hub/static/css/app/gist.scss */ +.pagehead h1.avatared img { + border-radius: 3px; + top: 0; + left: 0; + position: absolute; +} + +/* line 89, ../../../hub/static/css/app/gist.scss */ +.pagehead h1.avatared span { + display: block; + font-size: 24px; + line-height: 24px; +} + +/* line 90, ../../../hub/static/css/app/gist.scss */ +.pagehead h1.avatared em { + display: block; + font-size: 18px; + line-height: 20px; + font-style: normal; + font-weight: normal; + color: #99A7AF; +} + +/* line 91, ../../../hub/static/css/app/gist.scss */ +.gist-author img { + border-radius: 3px; + margin-right: 2px; + position: relative; + top: -3px; + vertical-align: middle; +} + +/* line 92, ../../../hub/static/css/app/gist.scss */ +.gist-timestamp { + color: #999; + font-size: 11px; + line-height: 20px; + letter-spacing: 0; + display: block; + margin-top: -7px; + margin-left: 64px; +} + +/* line 93, ../../../hub/static/css/app/gist.scss */ +.gist-timestamp .text { + color: #666; +} + +/* line 94, ../../../hub/static/css/app/gist.scss */ +.gist-description { + color: #666; + font-size: 14px; + line-height: 1.4; + margin-bottom: 20px; +} + +/* line 95, ../../../hub/static/css/app/gist.scss */ +button.classy.danger { + color: #900; +} + +/* line 97, ../../../hub/static/css/app/gist.scss */ +.revision { + margin-bottom: 24px; +} + +/* line 98, ../../../hub/static/css/app/gist.scss */ +.revision .revision-meta { + line-height: 24px; + padding: 0 0 0 0; +} + +/* line 99, ../../../hub/static/css/app/gist.scss */ +.revision .revision-meta .creator { + color: rgba(51, 51, 51, 0.75); + position: relative; +} + +/* line 100, ../../../hub/static/css/app/gist.scss */ +.revision .revision-meta { + line-height: 26px; +} + +/* line 101, ../../../hub/static/css/app/gist.scss */ +.revision .explain { + float: right; +} + +/* line 102, ../../../hub/static/css/app/gist.scss */ +.revision .creator img { + border-radius: 3px; + width: 23px; + height: 23px; + position: absolute; + top: -4px; + left: 0; + margin-right: 4px; +} + +/* line 103, ../../../hub/static/css/app/gist.scss */ +.revision .creator strong { + margin-left: 30px; +} + +/* line 104, ../../../hub/static/css/app/gist.scss */ +.explain { + font-size: 12px; + color: #666; + position: relative; +} + +/* line 105, ../../../hub/static/css/app/gist.scss */ +.revision .minibutton { + margin-left: 6px; +} + +/* line 106, ../../../hub/static/css/app/gist.scss */ +.pagination-older-newer a { + padding: .1em .3em; + margin: .2em; + text-decoration: none; + color: #369; + float: none; +} + +/* line 107, ../../../hub/static/css/app/gist.scss */ +.pagination-older-newer a:hover, .pagination a:active { + background-color: transparent; + color: #36f; +} + +/* line 108, ../../../hub/static/css/app/gist.scss */ +.pagination-older-newer span.disabled { + padding: .1em .3em; + margin: .2em; + color: #bbb; + float: none; +} + +/* line 110, ../../../hub/static/css/app/gist.scss */ +.counts-label { + position: relative; + display: inline-block; + margin-left: 3px; + padding: 3px 7px; + border: 1px solid #ccc; + border-radius: 3px; + color: #333; + background-color: #fafafa; + vertical-align: middle; +} + +/* line 122, ../../../hub/static/css/app/gist.scss */ +.counts-label::before, .counts-label::after { + content: ""; + position: absolute; + top: 50%; + right: 100%; + display: block; + margin-right: 0px; + margin-top: -6px; + width: 0; + height: 0; + border: 6px solid transparent; + border-right-color: #ccc; +} + +/* line 136, ../../../hub/static/css/app/gist.scss */ +.counts-label::after { + margin-right: -1px; + border-right-color: #fafafa; +} diff --git a/dist/css/app/graph.css b/dist/css/app/graph.css new file mode 100644 index 0000000..0289083 --- /dev/null +++ b/dist/css/app/graph.css @@ -0,0 +1,5594 @@ +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* line 1, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav { + margin-top: 6px; +} + +/* line 3, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label { + position: relative; + display: inline-block; + margin-left: 3px; + padding: 3px 7px; + border: 1px solid #ccc; + border-radius: 3px; + color: #333; + background-color: #fafafa; + vertical-align: middle; +} + +/* line 15, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::before, .metanav .counts-label::after { + content: ""; + position: absolute; + top: 50%; + right: 100%; + display: block; + margin-right: 0px; + margin-top: -6px; + width: 0; + height: 0; + border: 6px solid transparent; + border-right-color: #ccc; +} + +/* line 29, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::after { + margin-right: -1px; + border-right-color: #fafafa; +} + +/* line 5, ../../../hub/static/css/app/graph.scss */ +#gitstats-total { + display: inline-block; + display: block; +} + +/* line 9, ../../../hub/static/css/app/graph.scss */ +#gitstats-total .total-details { + clear: right; +} + +/* line 12, ../../../hub/static/css/app/graph.scss */ +#gitstats-total .total-details div:first-child { + border-left: none; +} + +/* line 15, ../../../hub/static/css/app/graph.scss */ +#gitstats-total .total-details div { + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 10px 0 0 0; + text-align: center; + border-left: 1px solid #ddd; + border-top: 1px solid #ddd; + color: #999; +} + +/* line 24, ../../../hub/static/css/app/graph.scss */ +.grid .col { + display: table-cell; + width: 1%; +} + +/* line 28, ../../../hub/static/css/app/graph.scss */ +#gitstats-total .total-details div .num { + font-weight: bold; + font-size: 16px; + display: block; + color: #333; +} + +/* line 34, ../../../hub/static/css/app/graph.scss */ +#gitstats-total .total-details div .lbl { + display: block; + font-weight: bold; + padding: 10px 0; + color: #777; + border-top: 1px solid #f7f7f7; + margin-top: 10px; + font-size: 11px; +} + +/* line 43, ../../../hub/static/css/app/graph.scss */ +.ext-lines-container { + display: inline; +} + +/* line 46, ../../../hub/static/css/app/graph.scss */ +.ext-files-container { + display: inline; +} + +/* line 49, ../../../hub/static/css/app/graph.scss */ +.lable p { + font-weight: bold; + font-size: 16px; + width: 465px; + float: left; + text-align: center; + padding-bottom: 5px; +} + +/* line 57, ../../../hub/static/css/app/graph.scss */ +div.ext { + height: 480px; +} + +/* line 60, ../../../hub/static/css/app/graph.scss */ +.axis path, +.axis line { + fill: none; + stroke: #000; + shape-rendering: crispEdges; +} + +/* line 67, ../../../hub/static/css/app/graph.scss */ +.x.axis path { + display: none; +} + +/* line 71, ../../../hub/static/css/app/graph.scss */ +.line { + fill: none; + stroke: steelblue; + stroke-width: 1.5px; +} + +/* line 76, ../../../hub/static/css/app/graph.scss */ +.lines-container g text { + font-size: 9px; +} + +/* line 80, ../../../hub/static/css/app/graph.scss */ +.chart rect { + fill: #DFDFDF; + stroke: white; +} diff --git a/dist/css/app/issue-new.css b/dist/css/app/issue-new.css new file mode 100644 index 0000000..7ec5964 --- /dev/null +++ b/dist/css/app/issue-new.css @@ -0,0 +1,6471 @@ +@charset "UTF-8"; +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* line 1, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body { + padding: 30px; +} + +/* line 4, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body > :first-child { + margin-top: 0 !important; +} + +/* line 7, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body h1, +.markdown-body h2, +.markdown-body h3, +.markdown-body h4, +.markdown-body h5, +.markdown-body h6 { + margin: 20px 0 10px; + padding: 0; + font-weight: bold; + -webkit-font-smoothing: antialiased; + cursor: text; + position: relative; +} + +/* line 20, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body h2 { + font-size: 24px; + border-bottom: 1px solid #CCC; + color: black; +} + +/* line 25, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body, +.markdown-body p { + font-size: 14px; + line-height: 1.6; +} + +/* line 30, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body p, +.markdown-body blockquote, +.markdown-body ul, +.markdown-body ol, +.markdown-body dl, +.markdown-body table, +.markdown-body pre { + margin: 15px 0; +} + +/* line 39, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul, +.markdown-body ol { + padding-left: 30px; +} + +/* line 43, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul li { + line-height: 1.6; +} + +/* line 46, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul { + list-style: disc; +} + +/* line 49, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ol { + list-style: decimal; +} + +/* line 52, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table { + width: 100%; +} + +/* line 55, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table caption + thead tr:first-child th, +.markdown-body table caption + thead tr:first-child td, +.markdown-body table colgroup + thead tr:first-child th, +.markdown-body table colgroup + thead tr:first-child td, +.markdown-body table thead:first-child tr:first-child th, +.markdown-body table thead:first-child tr:first-child td { + border-top: 0; +} + +/* line 63, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table thead th { + vertical-align: bottom; +} + +/* line 66, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th { + font-weight: bold; +} + +/* line 69, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th, +.markdown-body table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #ddd; +} + +/* line 77, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th, +.markdown-body table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #ddd; +} + +/* line 85, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table tbody > tr:nth-child(odd) > td, +.markdown-body table tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} + +/* line 89, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body .progress-percentage { + color: #888; +} + +/* line 93, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page { + padding: 0px; +} + +/* line 96, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page h1, +.markdown-page h2, +.markdown-page h3, +.markdown-page h4, +.markdown-page h5, +.markdown-page h6 { + position: static; +} + +/* line 104, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page pre { + font-family: Consolas, 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 14px; +} + +/* line 108, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page .label { + background-color: transparent; +} + +/* line 111, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page dd { + margin-left: 1.5em; +} + +/* line 114, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body code { + white-space: pre-wrap; +} + +/* line 1, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav { + margin-top: 6px; +} + +/* line 3, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label { + position: relative; + display: inline-block; + margin-left: 3px; + padding: 3px 7px; + border: 1px solid #ccc; + border-radius: 3px; + color: #333; + background-color: #fafafa; + vertical-align: middle; +} + +/* line 15, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::before, .metanav .counts-label::after { + content: ""; + position: absolute; + top: 50%; + right: 100%; + display: block; + margin-right: 0px; + margin-top: -6px; + width: 0; + height: 0; + border: 6px solid transparent; + border-right-color: #ccc; +} + +/* line 29, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::after { + margin-right: -1px; + border-right-color: #fafafa; +} + +/* line 2, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.metabox { + display: inline-block; + height: 8px; + background: #ccc; + text-indent: -9999px; + font-size: 12px; +} + +/* line 9, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats { + font: 13px Helvetica, arial, freesans, clean, sans-serif; + line-height: 1.4; + margin: 0; + padding: 0; + border: 0; + position: relative; + float: right; + width: 135px; + opacity: 0.5; + padding-bottom: 10px; +} + +/* line 21, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats:hover { + opacity: 1; +} + +/* line 24, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats:hover .list-tip { + display: block; +} + +/* line 27, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats a { + color: #4183c4; + text-decoration: none; +} + +/* line 31, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats-graph { + height: 10px; + overflow: hidden; +} + +/* line 35, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats-graph span { + display: inline-block; + height: 6px; + background: #ccc; + text-indent: -9999px; + float: left; +} + +/* line 42, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip, ul.list-tip { + border-radius: 3px; + box-shadow: 0 0 5px #ccc; + border: 1px solid #ddd; + background: #fff; + position: absolute; + padding-left: 0px; + top: 20px; + left: -20px; + width: 175px; + z-index: 100; + display: none; + margin-top: 0px; +} + +/* line 56, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip:before, ul.list-tip:before { + content: "▲"; + font-size: 14px; + margin: 0 auto; + width: 14px; + display: block; + margin-top: -13px; + color: #fff; + text-shadow: -1px -1px 2px #ccc; +} + +/* line 66, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li, ul.list-tip li { + margin: 0; + line-height: 100%; + list-style: none; + border-bottom: 1px solid #eee; + font-weight: bold; +} + +/* line 73, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li a, ol.list-tip li .other, ul.list-tip li a, ul.list-tip li .other { + color: #333; + padding: 8px 10px; + display: block; +} + +/* line 78, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li span.color-block, ul.list-tip li span.color-block { + display: inline-block; + width: 8px; + height: 10px; + margin-right: 5px; +} + +/* line 84, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li span.percent, ul.list-tip li span.percent { + float: right; + color: #999; +} + +/* fix project title for newer version of bootstrap*/ +/* line 6, ../../../hub/static/css/mod/project-info.scss */ +.pagehead .pull-left { + margin: 0; + font-size: 30px; + line-height: 36px; +} + +/* Hotfix for FlatUI */ +/* line 13, ../../../hub/static/css/mod/project-info.scss */ +.pagehead h2.pull-left { + margin: 0; +} + +/* line 17, ../../../hub/static/css/mod/project-info.scss */ +#project-info { + border: 1px solid #c5d5dd; + border-radius: 3px; + width: 100%; +} + +/* line 22, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div { + padding: 10px; +} + +/* line 25, ../../../hub/static/css/mod/project-info.scss */ +#project-info p { + margin: 0px; +} + +/* line 28, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div.team-label { + border-top: 1px solid #ccc; +} + +/* line 32, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div.git-url { + border-top: 1px solid #ccc; +} + +/* line 36, ../../../hub/static/css/mod/project-info.scss */ +#project-info input.git-url { + width: 480px; + margin: 0px; + cursor: auto; +} + +/* line 43, ../../../hub/static/css/mod/project-info.scss */ +#project-info .ssh div.ssh-url { + display: inline; +} +/* line 46, ../../../hub/static/css/mod/project-info.scss */ +#project-info .ssh div.http-url { + display: none; +} + +/* line 52, ../../../hub/static/css/mod/project-info.scss */ +#project-info .http div.ssh-url { + display: none; +} +/* line 55, ../../../hub/static/css/mod/project-info.scss */ +#project-info .http div.http-url { + display: inline; +} + +/* line 60, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar { + margin-top: 12px; + border-bottom: 1px solid #DDD; +} + +/* line 61, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar #back-old-browser { + padding-top: 8px; + float: right; +} + +/* line 62, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab { + padding-left: 20px; +} + +/* line 63, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li { + display: inline-block; + vertical-align: top; + cursor: pointer; +} + +/* line 64, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li a { + color: #666; + text-decoration: none; + padding: 8px 12px; + display: inline-block; + border-left: 1px solid transparent; + border-top: 1px solid transparent; + border-right: 1px solid transparent; + margin-bottom: -1px; +} + +/* line 65, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li a.active { + color: #333; + font-weight: bold; + border-left: 1px solid #DDD; + border-top: 1px solid #DDD; + border-right: 1px solid #DDD; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + background-color: white; +} + +/* line 67, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar .scope { + float: left; + margin-right: 10px; +} + +/* line 71, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar .scope i { + font-style: normal; +} + +/* line 75, ../../../hub/static/css/mod/project-info.scss */ +#breadcrumb { + margin: 10px 0; + font-size: 18px; + font-weight: bold; + color: #999; +} + +/* line 76, ../../../hub/static/css/mod/project-info.scss */ +#breadcrumb .final-path { + color: #000; +} + +/* line 1, ../../../hub/static/css/mod/upload-widget.scss */ +.upload-widget { + position: relative; + top: -50px; + width: 360px; +} +/* line 7, ../../../hub/static/css/mod/upload-widget.scss */ +.upload-widget input { + position: absolute; + width: 120px; + opacity: 0.0001; + cursor: pointer; + margin: 0; +} +/* line 15, ../../../hub/static/css/mod/upload-widget.scss */ +.upload-widget form { + width: 120px; + float: left; +} + +/* line 1, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit { + overflow: auto; +} + +/* line 4, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit li { + -moz-border-radius: 5px 5px 5px 5px; + display: block; + float: left; + margin: 2px 5px 2px 0; +} + +/* line 10, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit li.tagit-choice { + background-color: #00a89c; + padding: 2px 4px 3px; + color: #fff; + border-radius: 2px; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; +} + +/* line 19, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit li.tagit-choice:hover { + color: rgba(255, 255, 255, 0.8); + cursor: pointer; +} + +/* line 23, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit li.tagit-new { + padding: 2px 4px 3px; + padding: 2px 4px 1px; + padding: 2px 4px 1px 0; +} + +/* line 29, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit li.tagit-choice input { + display: block; + float: left; + margin: 2px 5px 2px 0; +} + +/* line 34, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit li.tagit-choice a.tag-close { + color: #fff; + cursor: pointer; + font-weight: bold; + padding-left: 3px; + text-decoration: none; + text-shadow: none; +} + +/* line 42, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit input[type="text"] { + width: 200px; +} + +/* line 1, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view { + position: absolute; + top: 0; + left: 0; + display: none; + margin-top: 18px; + background: white; + border: 1px solid #DDD; + border-radius: 3px; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + min-width: 120px; + z-index: 10; +} + +/* line 15, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur { + background: #3366FF; + color: white; +} + +/* line 19, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur small { + color: white; +} + +/* line 22, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view strong { + color: #3366FF; +} + +/* line 25, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur strong { + color: white; + font: bold; +} + +/* line 29, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul { + /* width: 100px; */ + list-style: none; + padding: 0; + margin: auto; +} + +/* line 35, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul li { + display: block; + padding: 5px 10px; + border-bottom: 1px solid #DDD; + cursor: pointer; + /* border-top: 1px solid #C8C8C8; */ +} + +/* line 42, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view small { + font-size: smaller; + color: #777; + font-weight: normal; +} + +/* highlight */ +/* highlight style */ +/* line 2, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .hll { + background-color: #ffffcc; +} + +/* line 3, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight { + background: #ffffff; +} + +/* line 4, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .c { + color: #808080; +} + +/* Comment */ +/* line 5, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .err { + color: #F00000; + background-color: #F0A0A0; +} + +/* Error */ +/* line 6, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .k { + color: #008000; + font-weight: bold; +} + +/* Keyword */ +/* line 7, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .o { + color: #303030; +} + +/* Operator */ +/* line 8, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .cm { + color: #808080; +} + +/* Comment.Multiline */ +/* line 9, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .cp { + color: #507090; +} + +/* Comment.Preproc */ +/* line 10, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .c1 { + color: #808080; +} + +/* Comment.Single */ +/* line 11, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .cs { + color: #cc0000; + font-weight: bold; +} + +/* Comment.Special */ +/* line 12, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gd { + color: #A00000; +} + +/* Generic.Deleted */ +/* line 13, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ge { + font-style: italic; +} + +/* Generic.Emph */ +/* line 14, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gr { + color: #FF0000; +} + +/* Generic.Error */ +/* line 15, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gh { + color: #000080; + font-weight: bold; +} + +/* Generic.Heading */ +/* line 16, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gi { + color: #00A000; +} + +/* Generic.Inserted */ +/* line 17, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .go { + color: #808080; +} + +/* Generic.Output */ +/* line 18, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gp { + color: #c65d09; + font-weight: bold; +} + +/* Generic.Prompt */ +/* line 19, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gs { + font-weight: bold; +} + +/* Generic.Strong */ +/* line 20, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gu { + color: #800080; + font-weight: bold; +} + +/* Generic.Subheading */ +/* line 21, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gt { + color: #0040D0; +} + +/* Generic.Traceback */ +/* line 22, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kc { + color: #008000; + font-weight: bold; +} + +/* Keyword.Constant */ +/* line 23, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kd { + color: #008000; + font-weight: bold; +} + +/* Keyword.Declaration */ +/* line 24, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kn { + color: #008000; + font-weight: bold; +} + +/* Keyword.Namespace */ +/* line 25, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kp { + color: #003080; + font-weight: bold; +} + +/* Keyword.Pseudo */ +/* line 26, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kr { + color: #008000; + font-weight: bold; +} + +/* Keyword.Reserved */ +/* line 27, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kt { + color: #303090; + font-weight: bold; +} + +/* Keyword.Type */ +/* line 28, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .m { + color: #6000E0; + font-weight: bold; +} + +/* Literal.Number */ +/* line 29, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .s { + background-color: #fff0f0; +} + +/* Literal.String */ +/* line 30, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .na { + color: #0000C0; +} + +/* Name.Attribute */ +/* line 31, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nb { + color: #007020; +} + +/* Name.Builtin */ +/* line 32, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nc { + color: #B00060; + font-weight: bold; +} + +/* Name.Class */ +/* line 33, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .no { + color: #003060; + font-weight: bold; +} + +/* Name.Constant */ +/* line 34, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nd { + color: #505050; + font-weight: bold; +} + +/* Name.Decorator */ +/* line 35, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ni { + color: #800000; + font-weight: bold; +} + +/* Name.Entity */ +/* line 36, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ne { + color: #F00000; + font-weight: bold; +} + +/* Name.Exception */ +/* line 37, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nf { + color: #0060B0; + font-weight: bold; +} + +/* Name.Function */ +/* line 38, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nl { + color: #907000; + font-weight: bold; +} + +/* Name.Label */ +/* line 39, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nn { + color: #0e84b5; + font-weight: bold; +} + +/* Name.Namespace */ +/* line 40, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nt { + color: #007000; +} + +/* Name.Tag */ +/* line 41, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nv { + color: #906030; +} + +/* Name.Variable */ +/* line 42, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ow { + color: #000000; + font-weight: bold; +} + +/* Operator.Word */ +/* line 43, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .w { + color: #bbbbbb; +} + +/* Text.Whitespace */ +/* line 44, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mf { + color: #6000E0; + font-weight: bold; +} + +/* Literal.Number.Float */ +/* line 45, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mh { + color: #005080; + font-weight: bold; +} + +/* Literal.Number.Hex */ +/* line 46, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mi { + color: #0000D0; + font-weight: bold; +} + +/* Literal.Number.Integer */ +/* line 47, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mo { + color: #4000E0; + font-weight: bold; +} + +/* Literal.Number.Oct */ +/* line 48, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sb { + background-color: #fff0f0; +} + +/* Literal.String.Backtick */ +/* line 49, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sc { + color: #0040D0; +} + +/* Literal.String.Char */ +/* line 50, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sd { + color: #D04020; +} + +/* Literal.String.Doc */ +/* line 51, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .s2 { + background-color: #fff0f0; +} + +/* Literal.String.Double */ +/* line 52, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .se { + color: #606060; + font-weight: bold; + background-color: #fff0f0; +} + +/* Literal.String.Escape */ +/* line 53, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sh { + background-color: #fff0f0; +} + +/* Literal.String.Heredoc */ +/* line 54, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .si { + background-color: #e0e0e0; +} + +/* Literal.String.Interpol */ +/* line 55, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sx { + color: #D02000; + background-color: #fff0f0; +} + +/* Literal.String.Other */ +/* line 56, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sr { + color: #000000; + background-color: #fff0ff; +} + +/* Literal.String.Regex */ +/* line 57, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .s1 { + background-color: #fff0f0; +} + +/* Literal.String.Single */ +/* line 58, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ss { + color: #A06000; +} + +/* Literal.String.Symbol */ +/* line 59, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .bp { + color: #007020; +} + +/* Name.Builtin.Pseudo */ +/* line 60, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .vc { + color: #306090; +} + +/* Name.Variable.Class */ +/* line 61, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .vg { + color: #d07000; + font-weight: bold; +} + +/* Name.Variable.Global */ +/* line 62, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .vi { + color: #3030B0; +} + +/* Name.Variable.Instance */ +/* line 63, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .il { + color: #0000D0; + font-weight: bold; +} + +/* Literal.Number.Integer.Long */ +/* line 11, ../../../hub/static/css/app/issue-new.scss */ +.pull-form input[type="text"] { + font-size: 14px; + padding: 5px 5px; + margin: 0 0 5px 0; + width: 98%; + color: #444; +} + +/* line 18, ../../../hub/static/css/app/issue-new.scss */ +.pull-form textarea { + height: 200px; +} + +/* line 21, ../../../hub/static/css/app/issue-new.scss */ +.pull-form-main .form-actions { + padding: 0; + margin-top: 10px; + text-align: right; + padding-bottom: 5px; + background-color: inherit; + border-top: none; +} + +/* line 30, ../../../hub/static/css/app/issue-new.scss */ +.previewable-comment-form .zen-enabled textarea { + padding: 10px 18px 10px 10px; +} + +/* line 33, ../../../hub/static/css/app/issue-new.scss */ +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* Write/Preview Control style for new PR component */ +/* line 47, ../../../hub/static/css/app/issue-new.scss */ +ul.edit-preview-tabs { + margin: 0 0 5px 0; + line-height: 13px; +} + +/* line 51, ../../../hub/static/css/app/issue-new.scss */ +ul.edit-preview-tabs li { + list-style-type: none; + margin: 0; + display: inline-block; +} + +/* line 56, ../../../hub/static/css/app/issue-new.scss */ +ul.edit-preview-tabs a { + display: inline-block; + padding: 2px 8px; + font-size: 11px; + font-weight: bold; + text-decoration: none; + color: #666; + border: 1px solid transparent; + border-radius: 10px; +} + +/* Description Component background & help text, from hub.css*/ +/* line 68, ../../../hub/static/css/app/issue-new.scss */ +.comment-form { + position: relative; +} + +/* line 72, ../../../hub/static/css/app/issue-new.scss */ +.comment-form p.help { + margin: 0; + float: right; + line-height: 32px; + font-size: 12px; + color: #bbb; +} + +/* tag */ +/* line 81, ../../../hub/static/css/app/issue-new.scss */ +.tag-groups p { + margin: 0; +} + +/* line 85, ../../../hub/static/css/app/issue-new.scss */ +.tags input[type="text"] { + font-size: 14px; + padding: 5px 0px; + margin: 0 0 5px 5px; + width: 98%; + color: #444; +} diff --git a/dist/css/app/issue.css b/dist/css/app/issue.css new file mode 100644 index 0000000..d673b80 --- /dev/null +++ b/dist/css/app/issue.css @@ -0,0 +1,7505 @@ +@charset "UTF-8"; +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(to bottom, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* line 1, ../../../hub/static/css/mod/user-card.scss */ +.user-card { + position: absolute; + padding: 3px 5px 5px; + min-height: 68px; + width: 210px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +/* line 2, ../../../hub/static/css/mod/user-card.scss */ +.user-card .desc { + margin-left: 3px; +} + +/* line 3, ../../../hub/static/css/mod/user-card.scss */ +.user-card .avatar-wrap { + width: 46px; + height: 36px; + float: left; + margin-right: 6px; + border-right: 1px solid #BEBEBE; +} + +/* line 4, ../../../hub/static/css/mod/user-card.scss */ +.user-card .badge-item { + float: left; + width: 30px; + height: 30px; + border: none; + padding: 2px; + background-color: white; + line-height: 0; + margin-right: 0.7em; +} + +/* line 5, ../../../hub/static/css/mod/user-card.scss */ +.user-card .title { + padding: 0 0 0.25em 0; +} + +/* line 6, ../../../hub/static/css/mod/user-card.scss */ +.user-card .desc .avatar { + float: left; + width: 30px; + height: 30px; + padding: 2px; + background-color: white; + line-height: 0; + margin-right: 0.7em; +} + +/* line 1, ../../../hub/static/css/mod/team-card.scss */ +.team-card { + position: absolute; + padding: 6px 10px; + min-height: 68px; + width: 236px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + overflow: hidden; +} +/* line 10, ../../../hub/static/css/mod/team-card.scss */ +.team-card .pic { + float: right; + max-height: 50px; + margin: 6px 0 0 10px; +} +/* line 15, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content { + word-wrap: break-word; +} +/* line 17, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .title { + margin: 6px 0; + font-size: 15px; + overflow: hidden; + white-space: nowrap; +} +/* line 23, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .info { + position: relative; + margin-top: 10px; + font-size: 13px; +} +/* line 27, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .info .desc { + white-space: nowrap; + overflow: hidden; +} + +/* line 35, ../../../hub/static/css/mod/team-card.scss */ +.member { + border-top: solid 1px #eaeaea; + padding-top: 8px; + height: 26px; +} +/* line 39, ../../../hub/static/css/mod/team-card.scss */ +.member .more-members { + float: right; + width: 24px; + height: 24px; + line-height: 26px; + text-align: center; + border: 1px solid #eaeaea; + background: #eaeaea; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 53, ../../../hub/static/css/mod/team-card.scss */ +.member .members li { + float: left; +} +/* line 55, ../../../hub/static/css/mod/team-card.scss */ +.member .members li a { + display: block; + width: 26px; + height: 26px; + overflow: hidden; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 65, ../../../hub/static/css/mod/team-card.scss */ +.member .members li a img { + width: 26px; + height: 26px; +} + +/* line 73, ../../../hub/static/css/mod/team-card.scss */ +.cf { + zoom: 1; +} +/* line 75, ../../../hub/static/css/mod/team-card.scss */ +.cf:before { + content: ""; + display: table; +} +/* line 79, ../../../hub/static/css/mod/team-card.scss */ +.cf .cf:after { + clear: both; + content: ""; + display: table; +} + +/* line 8, ../../../hub/static/css/mod/text-truncate.scss */ +.css-truncate.css-truncate-target, .css-truncate .css-truncate-target { + max-width: 125px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + vertical-align: top; + display: inline-block; +} + +/* line 14, ../../../hub/static/css/mod/text-truncate.scss */ +.css-truncate.expandable:hover .css-truncate-target { + max-width: 10000px !important; +} + +/* line 1, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav { + margin-top: 6px; +} + +/* line 3, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label { + position: relative; + display: inline-block; + margin-left: 3px; + padding: 3px 7px; + border: 1px solid #ccc; + border-radius: 3px; + color: #333; + background-color: #fafafa; + vertical-align: middle; +} + +/* line 15, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::before, .metanav .counts-label::after { + content: ""; + position: absolute; + top: 50%; + right: 100%; + display: block; + margin-right: 0px; + margin-top: -6px; + width: 0; + height: 0; + border: 6px solid transparent; + border-right-color: #ccc; +} + +/* line 29, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::after { + margin-right: -1px; + border-right-color: #fafafa; +} + +/* line 2, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.metabox { + display: inline-block; + height: 8px; + background: #ccc; + text-indent: -9999px; + font-size: 12px; +} + +/* line 9, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats { + font: 13px Helvetica, arial, freesans, clean, sans-serif; + line-height: 1.4; + margin: 0; + padding: 0; + border: 0; + position: relative; + float: right; + width: 135px; + opacity: 0.5; + padding-bottom: 10px; +} + +/* line 21, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats:hover { + opacity: 1; +} + +/* line 24, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats:hover .list-tip { + display: block; +} + +/* line 27, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats a { + color: #4183c4; + text-decoration: none; +} + +/* line 31, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats-graph { + height: 10px; + overflow: hidden; +} + +/* line 35, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats-graph span { + display: inline-block; + height: 6px; + background: #ccc; + text-indent: -9999px; + float: left; +} + +/* line 42, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip, ul.list-tip { + border-radius: 3px; + box-shadow: 0 0 5px #ccc; + border: 1px solid #ddd; + background: #fff; + position: absolute; + padding-left: 0px; + top: 20px; + left: -20px; + width: 175px; + z-index: 100; + display: none; + margin-top: 0px; +} + +/* line 56, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip:before, ul.list-tip:before { + content: "▲"; + font-size: 14px; + margin: 0 auto; + width: 14px; + display: block; + margin-top: -13px; + color: #fff; + text-shadow: -1px -1px 2px #ccc; +} + +/* line 66, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li, ul.list-tip li { + margin: 0; + line-height: 100%; + list-style: none; + border-bottom: 1px solid #eee; + font-weight: bold; +} + +/* line 73, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li a, ol.list-tip li .other, ul.list-tip li a, ul.list-tip li .other { + color: #333; + padding: 8px 10px; + display: block; +} + +/* line 78, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li span.color-block, ul.list-tip li span.color-block { + display: inline-block; + width: 8px; + height: 10px; + margin-right: 5px; +} + +/* line 84, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li span.percent, ul.list-tip li span.percent { + float: right; + color: #999; +} + +/* fix project title for newer version of bootstrap*/ +/* line 6, ../../../hub/static/css/mod/project-info.scss */ +.pagehead .pull-left { + margin: 0; + font-size: 30px; + line-height: 36px; +} + +/* Hotfix for FlatUI */ +/* line 13, ../../../hub/static/css/mod/project-info.scss */ +.pagehead h2.pull-left { + margin: 0; +} + +/* line 17, ../../../hub/static/css/mod/project-info.scss */ +#project-info { + border: 1px solid #c5d5dd; + border-radius: 3px; + width: 100%; +} + +/* line 22, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div { + padding: 10px; +} + +/* line 25, ../../../hub/static/css/mod/project-info.scss */ +#project-info p { + margin: 0px; +} + +/* line 28, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div.team-label { + border-top: 1px solid #ccc; +} + +/* line 32, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div.git-url { + border-top: 1px solid #ccc; +} + +/* line 36, ../../../hub/static/css/mod/project-info.scss */ +#project-info input.git-url { + width: 480px; + margin: 0px; + cursor: auto; +} + +/* line 43, ../../../hub/static/css/mod/project-info.scss */ +#project-info .ssh div.ssh-url { + display: inline; +} +/* line 46, ../../../hub/static/css/mod/project-info.scss */ +#project-info .ssh div.http-url { + display: none; +} + +/* line 52, ../../../hub/static/css/mod/project-info.scss */ +#project-info .http div.ssh-url { + display: none; +} +/* line 55, ../../../hub/static/css/mod/project-info.scss */ +#project-info .http div.http-url { + display: inline; +} + +/* line 60, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar { + margin-top: 12px; + border-bottom: 1px solid #DDD; +} + +/* line 61, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar #back-old-browser { + padding-top: 8px; + float: right; +} + +/* line 62, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab { + padding-left: 20px; +} + +/* line 63, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li { + display: inline-block; + vertical-align: top; + cursor: pointer; +} + +/* line 64, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li a { + color: #666; + text-decoration: none; + padding: 8px 12px; + display: inline-block; + border-left: 1px solid transparent; + border-top: 1px solid transparent; + border-right: 1px solid transparent; + margin-bottom: -1px; +} + +/* line 65, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li a.active { + color: #333; + font-weight: bold; + border-left: 1px solid #DDD; + border-top: 1px solid #DDD; + border-right: 1px solid #DDD; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + background-color: white; +} + +/* line 67, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar .scope { + float: left; + margin-right: 10px; +} + +/* line 71, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar .scope i { + font-style: normal; +} + +/* line 75, ../../../hub/static/css/mod/project-info.scss */ +#breadcrumb { + margin: 10px 0; + font-size: 18px; + font-weight: bold; + color: #999; +} + +/* line 76, ../../../hub/static/css/mod/project-info.scss */ +#breadcrumb .final-path { + color: #000; +} + +/* line 1, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body { + padding: 30px; +} + +/* line 4, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body > :first-child { + margin-top: 0 !important; +} + +/* line 7, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body h1, +.markdown-body h2, +.markdown-body h3, +.markdown-body h4, +.markdown-body h5, +.markdown-body h6 { + margin: 20px 0 10px; + padding: 0; + font-weight: bold; + -webkit-font-smoothing: antialiased; + cursor: text; + position: relative; +} + +/* line 20, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body h2 { + font-size: 24px; + border-bottom: 1px solid #CCC; + color: black; +} + +/* line 25, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body, +.markdown-body p { + font-size: 14px; + line-height: 1.6; +} + +/* line 30, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body p, +.markdown-body blockquote, +.markdown-body ul, +.markdown-body ol, +.markdown-body dl, +.markdown-body table, +.markdown-body pre { + margin: 15px 0; +} + +/* line 39, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul, +.markdown-body ol { + padding-left: 30px; +} + +/* line 43, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul li { + line-height: 1.6; +} + +/* line 46, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul { + list-style: disc; +} + +/* line 49, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ol { + list-style: decimal; +} + +/* line 52, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table { + width: 100%; +} + +/* line 55, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table caption + thead tr:first-child th, +.markdown-body table caption + thead tr:first-child td, +.markdown-body table colgroup + thead tr:first-child th, +.markdown-body table colgroup + thead tr:first-child td, +.markdown-body table thead:first-child tr:first-child th, +.markdown-body table thead:first-child tr:first-child td { + border-top: 0; +} + +/* line 63, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table thead th { + vertical-align: bottom; +} + +/* line 66, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th { + font-weight: bold; +} + +/* line 69, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th, +.markdown-body table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #ddd; +} + +/* line 77, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th, +.markdown-body table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #ddd; +} + +/* line 85, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table tbody > tr:nth-child(odd) > td, +.markdown-body table tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} + +/* line 89, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body .progress-percentage { + color: #888; +} + +/* line 93, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page { + padding: 0px; +} + +/* line 96, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page h1, +.markdown-page h2, +.markdown-page h3, +.markdown-page h4, +.markdown-page h5, +.markdown-page h6 { + position: static; +} + +/* line 104, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page pre { + font-family: Consolas, 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 14px; +} + +/* line 108, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page .label { + background-color: transparent; +} + +/* line 111, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page dd { + margin-left: 1.5em; +} + +/* line 114, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body code { + white-space: pre-wrap; +} + +/* preview comment form style */ +/* line 2, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav { + margin: 10px 0; + border-bottom: 1px solid #DDD; + height: 35px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs { + display: inline-block; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs > li { + display: inline-block; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab { + display: inline-block; + margin-bottom: -1px; + padding: 8px 12px 9px; + border: 1px solid transparent; + border-bottom: 0; + font-size: 14px; + color: #666; + text-decoration: none; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab.selected { + border-color: #DDD; + border-radius: 3px 3px 0 0; + background-color: white; + color: #333; + font-weight: bold; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab:hover { + text-decoration: none; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav { + position: relative; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav ul.tabnav-tabs { + padding-left: 10px; +} + +/* line 10, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 0 10px 10px; +} + +/* line 11, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form #preview_bucket .content-body { + padding: 10px; + min-height: 132px; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form.tab-content { + overflow: initial; + position: relative; +} + +/* line 2, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 10px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-actions { + padding: 0; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + position: relative; + border: 3px solid #EEE; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + padding: 0; + background: #EEE; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content .write-content { + padding: 0 10px 10px; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; + margin: 0; +} + +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary, button.primary.classy:disabled, button.primary.classy.disabled, button.primary.classy:disabled:hover, button.primary.classy.disabled:disabled:hover, button.classy:disabled:hover.primary, button.classy.disabled:disabled:hover.primary { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4); + border-color: #74BB5A; + border-bottom-color: #509338; + background: #8ADD6D; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#8add6d', endColorstr='#60b044')"; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); + background-image: -webkit-linear-gradient(top, #8ADD6D, #60B044); +} + +/* line 2, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary.disabled { + opacity: 0.5; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy, +button.classy:disabled, +button.classy.disabled, +a.button.classy:disabled, +a.button.classy.disabled, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover:disabled, +a.button.classy.disabled:hover, +a.button.classy, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy:disabled:hover, +a.button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover { + display: inline-block; + padding: 8px 15px; + line-height: normal; + position: relative; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 12px; + font-weight: bold; + color: #666; + text-shadow: 0 1px rgba(255, 255, 255, 0.9); + background: whiteSmoke; + background: -moz-linear-gradient(whiteSmoke, #E5E5E5); + background: -webkit-linear-gradient(whiteSmoke, #E5E5E5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; + border-radius: 3px; + border: 1px solid #DDD; + border-bottom-color: #BBB; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* ================================== *\ + * Zen Form + * ================================== */ +/* line 6, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + position: fixed; + z-index: 99999; + top: 0; + left: 0; + right: 0; + bottom: 0; + padding: 24px 30px 24px 24px; +} + +/* line 16, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-input-wrap { + max-width: 640px; + position: relative; + margin: 0 auto; +} + +/** + * Buttons style + */ +/* line 25, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button, +.zen-forms-theme-switch { + position: absolute; + width: 18px; + height: 18px; + text-align: center; + top: 10px; + right: 10px; + font-size: 24px; + color: #516066; + cursor: pointer; + line-height: 1; +} + +/* line 39, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-theme-switch { + top: 28px; + font-size: 34px; +} + +/* line 44, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button:hover, +.zen-forms-theme-switch:hover { + color: #667981; +} + +/** + * Inputs basic style + */ +/* line 52, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + padding: 8px 0; + width: 100%; + background: none; + border: none; + margin-bottom: 24px; + cursor: pointer; +} + +/* line 62, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus, +.zen-forms textarea:focus { + cursor: text; +} + +/* line 67, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms textarea { + resize: none; +} + +/* line 71, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + cursor: pointer; + display: none; + padding: 8px 3; + position: absolute; + top: 0; + width: 100%; +} + +/* line 80, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms .empty + label { + display: block; +} + +/* line 84, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus + label, +.zen-forms textarea:focus + label { + display: none; +} + +/* line 89, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms :focus { + outline-color: transparent; + outline-style: none; +} + +/** + * Dark theme + */ +/* line 97, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + background: #151a1c; +} + +/* line 101, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + color: #516066; +} + +/* line 105, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + color: #667981; +} + +/** + * Light theme + */ +/* line 113, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme { + background: #fefefe; +} + +/* line 117, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme label { + color: #959697; +} + +/* line 121, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme input, +.zen-forms.light-theme textarea { + color: #707071; +} + +/* line 4, ../../../hub/static/css/mod/zen-forms.scss */ +.write-content .enable-fullscreen { + position: absolute; + top: 5px; + right: 16px; + color: #333333; + opacity: .5; + line-height: 1em; +} + +/* line 5, ../../../hub/static/css/mod/zen-forms.scss */ +.mini-icon-fullscreen::before { + content: ""; +} + +/* line 6, ../../../hub/static/css/mod/zen-forms.scss */ +.fullscreen-overlay textarea, .zen-forms textarea { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + height: 100%; + padding: 20px; + border: 0; + font-size: 21px; + line-height: 1.6em; + resize: none; + -moz-transition: color 0.15s ease-in 0; + -webkit-transition: color 0.15s ease-in 0; + transition: color 0.15s ease-in 0; + box-shadow: none; +} + +/* line 7, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms.light-theme textarea { + background: #fff; + color: #999999; +} + +/* line 8, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms .zen-forms-input-wrap { + width: 100%; + height: 100%; +} + +/* line 9, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms label[for^=zen-forms-input] { + display: none; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-zen.scss */ +.previewable-comment-form .zen-enabled textarea { + padding: 10px 18px 10px 10px; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled { + position: relative; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled .go-zen { + position: absolute; + right: 15px; + top: 5px; +} + +/* line 1, ../../../hub/static/css/mod/loader.scss */ +.loader { + display: none; + position: absolute; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + background-color: #eee; +} + +/* line 2, ../../../hub/static/css/mod/loader.scss */ +.loader .spinner { + display: block; + width: 32px; + height: 32px; + margin: 0 auto; + top: 121px; + position: relative; + background: url(/static/img/spinner.gif) no-repeat; +} + +/* line 1, ../../../hub/static/css/mod/upload-widget.scss */ +.upload-widget { + position: relative; + top: -50px; + width: 360px; +} +/* line 7, ../../../hub/static/css/mod/upload-widget.scss */ +.upload-widget input { + position: absolute; + width: 120px; + opacity: 0.0001; + cursor: pointer; + margin: 0; +} +/* line 15, ../../../hub/static/css/mod/upload-widget.scss */ +.upload-widget form { + width: 120px; + float: left; +} + +/* line 1, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view { + position: absolute; + top: 0; + left: 0; + display: none; + margin-top: 18px; + background: white; + border: 1px solid #DDD; + border-radius: 3px; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + min-width: 120px; + z-index: 10; +} + +/* line 15, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur { + background: #3366FF; + color: white; +} + +/* line 19, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur small { + color: white; +} + +/* line 22, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view strong { + color: #3366FF; +} + +/* line 25, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur strong { + color: white; + font: bold; +} + +/* line 29, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul { + /* width: 100px; */ + list-style: none; + padding: 0; + margin: auto; +} + +/* line 35, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul li { + display: block; + padding: 5px 10px; + border-bottom: 1px solid #DDD; + cursor: pointer; + /* border-top: 1px solid #C8C8C8; */ +} + +/* line 42, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view small { + font-size: smaller; + color: #777; + font-weight: normal; +} + +/* line 11, ../../../hub/static/css/mod/flatui-comment-form.scss */ +.side-avatar { + float: left; + padding: 0px 5px 5px; + vertical-align: top; + margin-left: 0; +} + +/* line 18, ../../../hub/static/css/mod/flatui-comment-form.scss */ +.comment-form-head li { + line-height: 18px; +} + +/* line 22, ../../../hub/static/css/mod/flatui-comment-form.scss */ +#form-file-upload { + position: relative; + top: -50px; + width: 360px; +} + +/* line 28, ../../../hub/static/css/mod/flatui-comment-form.scss */ +#form-file-upload #file { + position: absolute; + width: 240px; + margin-left: -80px; + opacity: 0.0001; + cursor: pointer; +} + +/* line 36, ../../../hub/static/css/mod/flatui-comment-form.scss */ +.form-content { + padding: 10px; + display: none; + opacity: 1.0; +} + +/* line 43, ../../../hub/static/css/mod/flatui-comment-form.scss */ +form#add-comment-form .form-content { + display: block; + background: white; + border: 0px solid; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} +/* line 49, ../../../hub/static/css/mod/flatui-comment-form.scss */ +form#add-comment-form .form-content textarea#new_comment_content { + width: 100%; + background: white; +} +/* line 54, ../../../hub/static/css/mod/flatui-comment-form.scss */ +form#add-comment-form .form-content .tabnav { + border-bottom: none; + padding: 10px; +} +/* line 59, ../../../hub/static/css/mod/flatui-comment-form.scss */ +form#add-comment-form .form-content .write-content { + position: relative; + padding: 10px 10px 10px; +} + +/* Zen Mode button hacks for FlatUI */ +/* line 67, ../../../hub/static/css/mod/flatui-comment-form.scss */ +.write-content .enable-fullscreen { + top: 15px; +} + +/* line 71, ../../../hub/static/css/mod/flatui-comment-form.scss */ +.tab-content { + overflow: visible; +} + +/* Issue for Responsive Mobile Hacks */ +@media (max-width: 767px) { + /* line 79, ../../../hub/static/css/mod/flatui-comment-form.scss */ + .side-avatar { + padding: 0px; + } + + /* line 85, ../../../hub/static/css/mod/flatui-comment-form.scss */ + form#add-comment-form .form-content .tabnav { + max-width: 100%; + } +} +/* hacks for markdown paragraph content for flatui */ +/* line 4, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.markdown-body p, .markdown-body blockquote, .markdown-body ul, .markdown-body ol, .markdown-body dl, .markdown-body table, .markdown-body pre { + margin: 15px 0px 0px 0px; +} + +/* line 8, ../../../hub/static/css/mod/flatui-comment-content.scss */ +#summary.mod .header { + position: relative; +} + +/* line 12, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.mini-icon-edit:before { + content: ""; +} + +/* line 13, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.mini-icon-delete-note::before, .mini-icon-remove-close::before { + content: ""; +} + +/* line 15, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.content .form-content input.title-field { + font-size: 20px; + font-weight: bold; + margin-bottom: 5px; + width: 99%; +} + +/* line 22, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.content .form-content textarea { + min-height: 100px; + max-width: 100%; + width: 99%; + margin: 0; +} + +/* line 29, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.form-actions { + background-color: transparent; + border: none; + text-align: right; + margin: 0px; + padding: 10px 0px 0px; +} + +/* line 37, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.change-header-right { + float: right; +} +/* line 39, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.change-header-right a.change-header-date { + color: lightgray; +} + +/* line 44, ../../../hub/static/css/mod/flatui-comment-content.scss */ +ul.comment-header-actions { + margin-left: 10px; + display: inline; +} +/* line 47, ../../../hub/static/css/mod/flatui-comment-content.scss */ +ul.comment-header-actions li { + display: inline; +} + +/* line 52, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.comment-body { + padding: 0px; +} + +/* line 56, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.markdown-body { + padding: 0px; +} + +/* line 1, ../../../hub/static/css/mod/quick-emoji.scss */ +.quick-emoji { + margin-right: 10px; +} +/* line 4, ../../../hub/static/css/mod/quick-emoji.scss */ +.quick-emoji .description { + text-align: center; + color: #999; +} +/* line 9, ../../../hub/static/css/mod/quick-emoji.scss */ +.quick-emoji .emojis { + overflow-x: hidden; + overflow-y: scroll; + word-wrap: break-word; + word-break: break-all; + width: 290px; + height: 260px; +} +/* line 17, ../../../hub/static/css/mod/quick-emoji.scss */ +.quick-emoji .emojis a { + display: block; + float: left; + width: 25px; + height: 25px; + padding: 2px; + border: 1px solid white; +} +/* line 24, ../../../hub/static/css/mod/quick-emoji.scss */ +.quick-emoji .emojis a:hover { + background: #eef; + border: 1px solid #aad; +} + +/* line 1, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit { + overflow: auto; +} + +/* line 4, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit li { + -moz-border-radius: 5px 5px 5px 5px; + display: block; + float: left; + margin: 2px 5px 2px 0; +} + +/* line 10, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit li.tagit-choice { + background-color: #00a89c; + padding: 2px 4px 3px; + color: #fff; + border-radius: 2px; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; +} + +/* line 19, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit li.tagit-choice:hover { + color: rgba(255, 255, 255, 0.8); + cursor: pointer; +} + +/* line 23, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit li.tagit-new { + padding: 2px 4px 3px; + padding: 2px 4px 1px; + padding: 2px 4px 1px 0; +} + +/* line 29, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit li.tagit-choice input { + display: block; + float: left; + margin: 2px 5px 2px 0; +} + +/* line 34, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit li.tagit-choice a.tag-close { + color: #fff; + cursor: pointer; + font-weight: bold; + padding-left: 3px; + text-decoration: none; + text-shadow: none; +} + +/* line 42, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit input[type="text"] { + width: 200px; +} + +/* line 5, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content { + word-wrap: break-word; + word-break: normal; +} +/* line 10, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content .side-avatar a:hover { + text-decoration: none; +} +/* line 14, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content .side-avatar img { + width: 48px; + height: 48px; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} +/* line 20, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary { + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; + display: block; + margin-left: 65px; + /* Milestone */ +} +/* line 25, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary .form-content { + padding: 0px; +} +/* line 29, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary .is-comment-editing .content-body { + display: none; +} +/* line 33, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary h2 { + font-size: 24px; +} +/* line 37, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary ul.actions { + float: right; + text-align: right; +} +/* line 41, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary ul.actions li { + display: inline; +} +/* line 45, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary ul.actions #upvote i { + position: absolute; +} +/* line 49, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary .summary-bottom { + margin-top: 10px; +} +/* line 52, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary .summary-bottom .assignee { + float: right; + margin-right: 10px; +} +/* line 56, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary .summary-bottom .state { + float: left; +} +/* line 58, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary .summary-bottom .state a#issue-closer { + padding-left: 10px; +} +/* line 64, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary .milestone-body { + display: block; +} +/* line 66, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary .milestone-body .milestone-bar-title { + display: inline; +} +/* line 68, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary .milestone-body .milestone-bar-title label { + display: inline; +} +/* line 76, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content .participation p { + display: inline-block; + margin-left: 15px; +} +/* line 82, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog { + padding: 0px; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} +/* line 86, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog .change { + padding: 10px 15px; + border-bottom: 1px solid #eaeaea; +} +/* line 90, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog .change .change-text { + padding: 10px; +} +/* line 93, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog .change:hover .change-bottom .comment-header-actions { + display: inline; +} +/* line 96, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog .change .change-bottom { + position: relative; +} +/* line 98, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog .change .change-bottom .comment-header-actions { + display: none; + position: absolute; + bottom: 10px; + left: 10px; +} +/* line 104, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog .change .change-bottom .author-profile { + float: right; +} +/* line 106, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog .change .change-bottom .author-profile p { + margin: 5px; + display: inline-block; +} +/* line 110, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog .change .change-bottom .author-profile a.change-header-date { + color: lightgray; +} +/* line 113, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog .change .change-bottom .author-profile .side-avatar { + float: none; +} +/* line 116, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog .change .change-bottom .author-profile .side-avatar a:hover { + text-decoration: none; +} +/* line 120, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog .change .change-bottom .author-profile .side-avatar img { + width: 32px; + height: 32px; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} +/* line 130, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog > .change:last-child { + border-bottom: none; +} +/* line 134, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content .is-comment-editing .change-text { + display: none; +} +/* line 138, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content .markdown-body pre { + font-family: Consolas, Menlo, "Liberation Mono", Courier, monospace; + margin: 0; + border: 0; +} +/* line 144, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content .avatar.avatar-tiny { + display: inline-block; + margin: 0 3px 0 0; + vertical-align: baseline; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} + +/* modal */ +/* line 155, ../../../hub/static/css/mod/issue-body.scss */ +.modal-header { + background: #63b6ae; + color: white; + text-shadow: none; +} +/* line 160, ../../../hub/static/css/mod/issue-body.scss */ +.modal-header p { + margin: 0; +} + +/* line 165, ../../../hub/static/css/mod/issue-body.scss */ +.modal-body { + text-shadow: none; +} + +/* line 169, ../../../hub/static/css/mod/issue-body.scss */ +.modal-footer { + background: #63b6ae; + color: white; + text-shadow: none; +} + +/* line 175, ../../../hub/static/css/mod/issue-body.scss */ +.quick-emoji .emojis { + height: 120px; +} + +/* Tag */ +/* line 180, ../../../hub/static/css/mod/issue-body.scss */ +ul.tagit li.tagit-choice { + margin-top: 6px; +} + +/* line 183, ../../../hub/static/css/mod/issue-body.scss */ +ul.tagit input[type="text"] { + width: 540px; +} + +/* line 186, ../../../hub/static/css/mod/issue-body.scss */ +.tag-groups p { + margin: 0; +} + +/* line 189, ../../../hub/static/css/mod/issue-body.scss */ +.tag-groups { + margin-bottom: 10px; +} + +/* Milestone */ +/* line 195, ../../../hub/static/css/mod/issue-body.scss */ +#milestone-modal .milestone-menu { + list-style: none; + display: block; + float: none; + position: relative; + margin-bottom: 5px; + border: 1px solid rgba(0, 0, 0, 0.2); + padding: 5px 0; + border-color: rgba(99, 182, 174, 0.8); + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +/* line 208, ../../../hub/static/css/mod/issue-body.scss */ +#milestone-modal .milestone-menu > li > a:hover, +#milestone-modal .milestone-menu > li > a:focus, +#milestone-modal .milestone-menu > .active > a, +#milestone-modal .milestone-menu > .active > a:hover, +#milestone-modal .milestone-menu > .active > a:focus { + color: #fff; + text-decoration: none; + background: #63b6ae; +} +/* line 217, ../../../hub/static/css/mod/issue-body.scss */ +#milestone-modal .milestone-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 20px; + white-space: nowrap; +} +/* line 226, ../../../hub/static/css/mod/issue-body.scss */ +#milestone-modal input[type=radio] { + display: none; +} + +/* Issue for Responsive Mobile Hacks */ +@media (max-width: 767px) { + /* line 236, ../../../hub/static/css/mod/issue-body.scss */ + #issue #content .mod { + margin-left: 35px; + } + /* line 239, ../../../hub/static/css/mod/issue-body.scss */ + #issue #content span.side-avatar img.discussion-bubble-avatar { + width: 30px; + height: 30px; + } +} +/* line 1, ../../../hub/static/css/mod/fav-button.scss */ +a#fav-button { + height: 25px; + width: 25px; + display: block; + float: right; + background: url("/static/img/fav_star.png") 0 0 no-repeat; +} + +/* line 2, ../../../hub/static/css/mod/fav-button.scss */ +a#fav-button.faved { + background: url("/static/img/faved_star.png") 0 0 no-repeat; +} + +/* highlight */ +/* highlight style */ +/* line 2, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .hll { + background-color: #ffffcc; +} + +/* line 3, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight { + background: #ffffff; +} + +/* line 4, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .c { + color: #808080; +} + +/* Comment */ +/* line 5, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .err { + color: #F00000; + background-color: #F0A0A0; +} + +/* Error */ +/* line 6, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .k { + color: #008000; + font-weight: bold; +} + +/* Keyword */ +/* line 7, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .o { + color: #303030; +} + +/* Operator */ +/* line 8, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .cm { + color: #808080; +} + +/* Comment.Multiline */ +/* line 9, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .cp { + color: #507090; +} + +/* Comment.Preproc */ +/* line 10, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .c1 { + color: #808080; +} + +/* Comment.Single */ +/* line 11, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .cs { + color: #cc0000; + font-weight: bold; +} + +/* Comment.Special */ +/* line 12, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gd { + color: #A00000; +} + +/* Generic.Deleted */ +/* line 13, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ge { + font-style: italic; +} + +/* Generic.Emph */ +/* line 14, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gr { + color: #FF0000; +} + +/* Generic.Error */ +/* line 15, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gh { + color: #000080; + font-weight: bold; +} + +/* Generic.Heading */ +/* line 16, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gi { + color: #00A000; +} + +/* Generic.Inserted */ +/* line 17, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .go { + color: #808080; +} + +/* Generic.Output */ +/* line 18, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gp { + color: #c65d09; + font-weight: bold; +} + +/* Generic.Prompt */ +/* line 19, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gs { + font-weight: bold; +} + +/* Generic.Strong */ +/* line 20, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gu { + color: #800080; + font-weight: bold; +} + +/* Generic.Subheading */ +/* line 21, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gt { + color: #0040D0; +} + +/* Generic.Traceback */ +/* line 22, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kc { + color: #008000; + font-weight: bold; +} + +/* Keyword.Constant */ +/* line 23, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kd { + color: #008000; + font-weight: bold; +} + +/* Keyword.Declaration */ +/* line 24, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kn { + color: #008000; + font-weight: bold; +} + +/* Keyword.Namespace */ +/* line 25, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kp { + color: #003080; + font-weight: bold; +} + +/* Keyword.Pseudo */ +/* line 26, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kr { + color: #008000; + font-weight: bold; +} + +/* Keyword.Reserved */ +/* line 27, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kt { + color: #303090; + font-weight: bold; +} + +/* Keyword.Type */ +/* line 28, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .m { + color: #6000E0; + font-weight: bold; +} + +/* Literal.Number */ +/* line 29, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .s { + background-color: #fff0f0; +} + +/* Literal.String */ +/* line 30, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .na { + color: #0000C0; +} + +/* Name.Attribute */ +/* line 31, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nb { + color: #007020; +} + +/* Name.Builtin */ +/* line 32, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nc { + color: #B00060; + font-weight: bold; +} + +/* Name.Class */ +/* line 33, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .no { + color: #003060; + font-weight: bold; +} + +/* Name.Constant */ +/* line 34, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nd { + color: #505050; + font-weight: bold; +} + +/* Name.Decorator */ +/* line 35, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ni { + color: #800000; + font-weight: bold; +} + +/* Name.Entity */ +/* line 36, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ne { + color: #F00000; + font-weight: bold; +} + +/* Name.Exception */ +/* line 37, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nf { + color: #0060B0; + font-weight: bold; +} + +/* Name.Function */ +/* line 38, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nl { + color: #907000; + font-weight: bold; +} + +/* Name.Label */ +/* line 39, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nn { + color: #0e84b5; + font-weight: bold; +} + +/* Name.Namespace */ +/* line 40, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nt { + color: #007000; +} + +/* Name.Tag */ +/* line 41, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nv { + color: #906030; +} + +/* Name.Variable */ +/* line 42, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ow { + color: #000000; + font-weight: bold; +} + +/* Operator.Word */ +/* line 43, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .w { + color: #bbbbbb; +} + +/* Text.Whitespace */ +/* line 44, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mf { + color: #6000E0; + font-weight: bold; +} + +/* Literal.Number.Float */ +/* line 45, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mh { + color: #005080; + font-weight: bold; +} + +/* Literal.Number.Hex */ +/* line 46, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mi { + color: #0000D0; + font-weight: bold; +} + +/* Literal.Number.Integer */ +/* line 47, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mo { + color: #4000E0; + font-weight: bold; +} + +/* Literal.Number.Oct */ +/* line 48, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sb { + background-color: #fff0f0; +} + +/* Literal.String.Backtick */ +/* line 49, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sc { + color: #0040D0; +} + +/* Literal.String.Char */ +/* line 50, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sd { + color: #D04020; +} + +/* Literal.String.Doc */ +/* line 51, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .s2 { + background-color: #fff0f0; +} + +/* Literal.String.Double */ +/* line 52, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .se { + color: #606060; + font-weight: bold; + background-color: #fff0f0; +} + +/* Literal.String.Escape */ +/* line 53, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sh { + background-color: #fff0f0; +} + +/* Literal.String.Heredoc */ +/* line 54, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .si { + background-color: #e0e0e0; +} + +/* Literal.String.Interpol */ +/* line 55, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sx { + color: #D02000; + background-color: #fff0f0; +} + +/* Literal.String.Other */ +/* line 56, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sr { + color: #000000; + background-color: #fff0ff; +} + +/* Literal.String.Regex */ +/* line 57, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .s1 { + background-color: #fff0f0; +} + +/* Literal.String.Single */ +/* line 58, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ss { + color: #A06000; +} + +/* Literal.String.Symbol */ +/* line 59, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .bp { + color: #007020; +} + +/* Name.Builtin.Pseudo */ +/* line 60, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .vc { + color: #306090; +} + +/* Name.Variable.Class */ +/* line 61, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .vg { + color: #d07000; + font-weight: bold; +} + +/* Name.Variable.Global */ +/* line 62, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .vi { + color: #3030B0; +} + +/* Name.Variable.Instance */ +/* line 63, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .il { + color: #0000D0; + font-weight: bold; +} + +/* Literal.Number.Integer.Long */ diff --git a/dist/css/app/issues.css b/dist/css/app/issues.css new file mode 100644 index 0000000..610fc45 --- /dev/null +++ b/dist/css/app/issues.css @@ -0,0 +1,6188 @@ +@charset "UTF-8"; +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* line 1, ../../../hub/static/css/mod/user-card.scss */ +.user-card { + position: absolute; + padding: 3px 5px 5px; + min-height: 68px; + width: 210px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +/* line 2, ../../../hub/static/css/mod/user-card.scss */ +.user-card .desc { + margin-left: 3px; +} + +/* line 3, ../../../hub/static/css/mod/user-card.scss */ +.user-card .avatar-wrap { + width: 46px; + height: 36px; + float: left; + margin-right: 6px; + border-right: 1px solid #BEBEBE; +} + +/* line 4, ../../../hub/static/css/mod/user-card.scss */ +.user-card .badge-item { + float: left; + width: 30px; + height: 30px; + border: none; + padding: 2px; + background-color: white; + line-height: 0; + margin-right: 0.7em; +} + +/* line 5, ../../../hub/static/css/mod/user-card.scss */ +.user-card .title { + padding: 0 0 0.25em 0; +} + +/* line 6, ../../../hub/static/css/mod/user-card.scss */ +.user-card .desc .avatar { + float: left; + width: 30px; + height: 30px; + padding: 2px; + background-color: white; + line-height: 0; + margin-right: 0.7em; +} + +/* line 1, ../../../hub/static/css/mod/team-card.scss */ +.team-card { + position: absolute; + padding: 6px 10px; + min-height: 68px; + width: 236px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + overflow: hidden; +} +/* line 10, ../../../hub/static/css/mod/team-card.scss */ +.team-card .pic { + float: right; + max-height: 50px; + margin: 6px 0 0 10px; +} +/* line 15, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content { + word-wrap: break-word; +} +/* line 17, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .title { + margin: 6px 0; + font-size: 15px; + overflow: hidden; + white-space: nowrap; +} +/* line 23, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .info { + position: relative; + margin-top: 10px; + font-size: 13px; +} +/* line 27, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .info .desc { + white-space: nowrap; + overflow: hidden; +} + +/* line 35, ../../../hub/static/css/mod/team-card.scss */ +.member { + border-top: solid 1px #eaeaea; + padding-top: 8px; + height: 26px; +} +/* line 39, ../../../hub/static/css/mod/team-card.scss */ +.member .more-members { + float: right; + width: 24px; + height: 24px; + line-height: 26px; + text-align: center; + border: 1px solid #eaeaea; + background: #eaeaea; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 53, ../../../hub/static/css/mod/team-card.scss */ +.member .members li { + float: left; +} +/* line 55, ../../../hub/static/css/mod/team-card.scss */ +.member .members li a { + display: block; + width: 26px; + height: 26px; + overflow: hidden; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 65, ../../../hub/static/css/mod/team-card.scss */ +.member .members li a img { + width: 26px; + height: 26px; +} + +/* line 73, ../../../hub/static/css/mod/team-card.scss */ +.cf { + zoom: 1; +} +/* line 75, ../../../hub/static/css/mod/team-card.scss */ +.cf:before { + content: ""; + display: table; +} +/* line 79, ../../../hub/static/css/mod/team-card.scss */ +.cf .cf:after { + clear: both; + content: ""; + display: table; +} + +/* line 8, ../../../hub/static/css/mod/text-truncate.scss */ +.css-truncate.css-truncate-target, .css-truncate .css-truncate-target { + max-width: 125px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + vertical-align: top; + display: inline-block; +} + +/* line 14, ../../../hub/static/css/mod/text-truncate.scss */ +.css-truncate.expandable:hover .css-truncate-target { + max-width: 10000px !important; +} + +/* line 1, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav { + margin-top: 6px; +} + +/* line 3, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label { + position: relative; + display: inline-block; + margin-left: 3px; + padding: 3px 7px; + border: 1px solid #ccc; + border-radius: 3px; + color: #333; + background-color: #fafafa; + vertical-align: middle; +} + +/* line 15, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::before, .metanav .counts-label::after { + content: ""; + position: absolute; + top: 50%; + right: 100%; + display: block; + margin-right: 0px; + margin-top: -6px; + width: 0; + height: 0; + border: 6px solid transparent; + border-right-color: #ccc; +} + +/* line 29, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::after { + margin-right: -1px; + border-right-color: #fafafa; +} + +/* line 2, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.metabox { + display: inline-block; + height: 8px; + background: #ccc; + text-indent: -9999px; + font-size: 12px; +} + +/* line 9, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats { + font: 13px Helvetica, arial, freesans, clean, sans-serif; + line-height: 1.4; + margin: 0; + padding: 0; + border: 0; + position: relative; + float: right; + width: 135px; + opacity: 0.5; + padding-bottom: 10px; +} + +/* line 21, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats:hover { + opacity: 1; +} + +/* line 24, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats:hover .list-tip { + display: block; +} + +/* line 27, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats a { + color: #4183c4; + text-decoration: none; +} + +/* line 31, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats-graph { + height: 10px; + overflow: hidden; +} + +/* line 35, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats-graph span { + display: inline-block; + height: 6px; + background: #ccc; + text-indent: -9999px; + float: left; +} + +/* line 42, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip, ul.list-tip { + border-radius: 3px; + box-shadow: 0 0 5px #ccc; + border: 1px solid #ddd; + background: #fff; + position: absolute; + padding-left: 0px; + top: 20px; + left: -20px; + width: 175px; + z-index: 100; + display: none; + margin-top: 0px; +} + +/* line 56, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip:before, ul.list-tip:before { + content: "▲"; + font-size: 14px; + margin: 0 auto; + width: 14px; + display: block; + margin-top: -13px; + color: #fff; + text-shadow: -1px -1px 2px #ccc; +} + +/* line 66, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li, ul.list-tip li { + margin: 0; + line-height: 100%; + list-style: none; + border-bottom: 1px solid #eee; + font-weight: bold; +} + +/* line 73, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li a, ol.list-tip li .other, ul.list-tip li a, ul.list-tip li .other { + color: #333; + padding: 8px 10px; + display: block; +} + +/* line 78, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li span.color-block, ul.list-tip li span.color-block { + display: inline-block; + width: 8px; + height: 10px; + margin-right: 5px; +} + +/* line 84, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li span.percent, ul.list-tip li span.percent { + float: right; + color: #999; +} + +/* fix project title for newer version of bootstrap*/ +/* line 6, ../../../hub/static/css/mod/project-info.scss */ +.pagehead .pull-left { + margin: 0; + font-size: 30px; + line-height: 36px; +} + +/* Hotfix for FlatUI */ +/* line 13, ../../../hub/static/css/mod/project-info.scss */ +.pagehead h2.pull-left { + margin: 0; +} + +/* line 17, ../../../hub/static/css/mod/project-info.scss */ +#project-info { + border: 1px solid #c5d5dd; + border-radius: 3px; + width: 100%; +} + +/* line 22, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div { + padding: 10px; +} + +/* line 25, ../../../hub/static/css/mod/project-info.scss */ +#project-info p { + margin: 0px; +} + +/* line 28, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div.team-label { + border-top: 1px solid #ccc; +} + +/* line 32, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div.git-url { + border-top: 1px solid #ccc; +} + +/* line 36, ../../../hub/static/css/mod/project-info.scss */ +#project-info input.git-url { + width: 480px; + margin: 0px; + cursor: auto; +} + +/* line 43, ../../../hub/static/css/mod/project-info.scss */ +#project-info .ssh div.ssh-url { + display: inline; +} +/* line 46, ../../../hub/static/css/mod/project-info.scss */ +#project-info .ssh div.http-url { + display: none; +} + +/* line 52, ../../../hub/static/css/mod/project-info.scss */ +#project-info .http div.ssh-url { + display: none; +} +/* line 55, ../../../hub/static/css/mod/project-info.scss */ +#project-info .http div.http-url { + display: inline; +} + +/* line 60, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar { + margin-top: 12px; + border-bottom: 1px solid #DDD; +} + +/* line 61, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar #back-old-browser { + padding-top: 8px; + float: right; +} + +/* line 62, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab { + padding-left: 20px; +} + +/* line 63, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li { + display: inline-block; + vertical-align: top; + cursor: pointer; +} + +/* line 64, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li a { + color: #666; + text-decoration: none; + padding: 8px 12px; + display: inline-block; + border-left: 1px solid transparent; + border-top: 1px solid transparent; + border-right: 1px solid transparent; + margin-bottom: -1px; +} + +/* line 65, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li a.active { + color: #333; + font-weight: bold; + border-left: 1px solid #DDD; + border-top: 1px solid #DDD; + border-right: 1px solid #DDD; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + background-color: white; +} + +/* line 67, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar .scope { + float: left; + margin-right: 10px; +} + +/* line 71, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar .scope i { + font-style: normal; +} + +/* line 75, ../../../hub/static/css/mod/project-info.scss */ +#breadcrumb { + margin: 10px 0; + font-size: 18px; + font-weight: bold; + color: #999; +} + +/* line 76, ../../../hub/static/css/mod/project-info.scss */ +#breadcrumb .final-path { + color: #000; +} + +/* line 1, ../../../hub/static/css/mod/tag-list.scss */ +.issue-tags ul li .tag-filter, .issue-tags ul li .tag-remove, .issue-tags ul li .icon-remove, .issue-tags ul li .icon-white, .issue-tags ul .tag-filter, .issue-tags ul .tag-remove, .issue-tags ul .icon-remove, .issue-tags ul .icon-white { + background: #63b6ae; + background-image: none; + cursor: pointer; +} + +/* line 6, ../../../hub/static/css/mod/tag-list.scss */ +.issue-tags ul li a:hover, .issue-tags ul a:hover { + background: #63b6ae; + color: white; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + border-radius: 4px; +} + +/* line 12, ../../../hub/static/css/mod/tag-list.scss */ +.issue-tags { + padding: 8px 0; +} +/* line 15, ../../../hub/static/css/mod/tag-list.scss */ +.issue-tags ul li { + line-height: 20px; +} +/* line 23, ../../../hub/static/css/mod/tag-list.scss */ +.issue-tags ul li .tag-remove, .issue-tags ul li .icon-remove, .issue-tags ul li .icon-white { + float: right; +} +/* line 31, ../../../hub/static/css/mod/tag-list.scss */ +.issue-tags ul .tag-remove, .issue-tags ul .icon-remove, .issue-tags ul .icon-white { + float: right; +} +/* line 40, ../../../hub/static/css/mod/tag-list.scss */ +.issue-tags ul li.active a { + border-radius: 4px; +} +/* line 44, ../../../hub/static/css/mod/tag-list.scss */ +.issue-tags .nav-header { + margin-bottom: 8px; +} +/* line 47, ../../../hub/static/css/mod/tag-list.scss */ +.issue-tags .tag-admin { + float: right; + cursor: pointer; + font-weight: 400; +} +/* line 52, ../../../hub/static/css/mod/tag-list.scss */ +.issue-tags .tag-admin-unuse { + color: #63b6ae; +} +/* line 55, ../../../hub/static/css/mod/tag-list.scss */ +.issue-tags .tag-admin-using { + color: #999; +} +/* line 58, ../../../hub/static/css/mod/tag-list.scss */ +.issue-tags .nav-list-edit .tag-item { + display: block; + padding: 3px 1px; + color: #08c; +} + +/* edit tag */ +/* line 66, ../../../hub/static/css/mod/tag-list.scss */ +ul.color-chooser .color-cooser-color { + display: block; + text-align: center; + height: 25px; + cursor: pointer; + box-sizing: border-box; + border: solid 2px transparent; +} + +/* line 74, ../../../hub/static/css/mod/tag-list.scss */ +.edit-color-label-form.open .color-chooser, .edit-color-label-form.open .color-editor { + display: block; +} + +/* line 77, ../../../hub/static/css/mod/tag-list.scss */ +ul.color-chooser { + height: 25px; + list-style-type: none; + display: table-row; +} + +/* line 82, ../../../hub/static/css/mod/tag-list.scss */ +ul.color-chooser li { + display: table-cell; + width: 1%; + vertical-align: top; +} + +/* line 87, ../../../hub/static/css/mod/tag-list.scss */ +.fieldWithErrors { + display: inline; +} + +/* line 90, ../../../hub/static/css/mod/tag-list.scss */ +.edit-color-label-form .color-editor-bg { + position: absolute; + left: 0; + height: 25px; + width: 130px; + opacity: 0.12; + border-radius: 3px; +} + +/* line 98, ../../../hub/static/css/mod/tag-list.scss */ +.edit-color-label-form .color-editor .color-editor-input { + position: absolute; + left: 0; + background-color: transparent; + min-height: 25px; + border-left-width: 26px; + padding-top: 3px; + padding-bottom: 3px; + width: 130px; +} + +/* line 108, ../../../hub/static/css/mod/tag-list.scss */ +.edit-color-label-form .color-editor .invalid-color-indicator { + display: none; + position: absolute; + top: 5px; + left: 9px; + color: #c00; + z-index: 10; + font-weight: bold; +} + +/* line 117, ../../../hub/static/css/mod/tag-list.scss */ +.edit-color-label-form .color-editor { + margin-top: 5px; + position: relative; + height: 25px; + margin-bottom: 10px; +} + +/* line 123, ../../../hub/static/css/mod/tag-list.scss */ +.edit-color-label-form .color-editor .invalid-color-indicator { + display: none; + position: absolute; + top: 5px; + left: 9px; + color: #c00; + z-index: 10; + font-weight: bold; +} + +/* line 132, ../../../hub/static/css/mod/tag-list.scss */ +.edit-color-label-form input[type="text"] { + min-height: 34px; + padding: 7px 8px; + outline: none; + color: #333; + background-color: #fff; + background-repeat: no-repeat; + background-position: right center; + border: 1px solid #ccc; + border-radius: 3px; + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075); + -moz-box-sizing: border-box; + box-sizing: border-box; + vertical-align: middle; +} + +/* line 147, ../../../hub/static/css/mod/tag-list.scss */ +.edit-color-label-form.is-not-valid .color-editor .invalid-color-indicator { + display: block; +} + +/* line 1, ../../../hub/static/css/mod/issues-topbar.scss */ +.issues-topbar { + padding-bottom: 10px; +} + +/* line 2, ../../../hub/static/css/mod/navbar-search.scss */ +.navbar-search i { + color: #63b6ae; + padding-right: 4px; +} + +/* line 4, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar { + background: #fff; + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); + margin-bottom: 20px; +} +/* line 9, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar .nav { + margin: 0px; + -moz-border-radius: 0px; + -webkit-border-radius: 0px; + border-radius: 0px; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} +/* line 15, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar .issue-tags { + -moz-border-radius: 0px; + -webkit-border-radius: 0px; + border-radius: 0px; +} +/* line 19, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar > *:first-child { + -moz-border-radius-topleft: 3px; + -webkit-border-top-left-radius: 3px; + border-top-left-radius: 3px; + -moz-border-radius-topright: 3px; + -webkit-border-top-right-radius: 3px; + border-top-right-radius: 3px; +} +/* line 24, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar > *:last-child { + -moz-border-radius-bottomleft: 3px; + -webkit-border-bottom-left-radius: 3px; + border-bottom-left-radius: 3px; + -moz-border-radius-bottomright: 3px; + -webkit-border-bottom-right-radius: 3px; + border-bottom-right-radius: 3px; +} +/* line 29, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar .rule { + clear: both; + height: 0px; + padding: 0; + margin: 0; + overflow: hidden; + border: none; + background: transparent; + border-bottom: 3px solid rgba(99, 182, 174, 0.2); +} +/* line 40, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar .label { + margin: 2px 0px; +} +/* line 42, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar .label a { + color: #63b6ae; + text-decoration: none; +} +/* line 45, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar .label a:hover { + background: #63b6ae; + color: white; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; +} +/* line 54, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar .well { + margin-bottom: 0; + overflow: hidden; +} + +/* line 1, ../../../hub/static/css/mod/pagination.scss */ +.pagination { + display: block; + margin: 7px 0; + overflow: hidden; +} +/* line 5, ../../../hub/static/css/mod/pagination.scss */ +.pagination a { + padding: 8px; + width: 100%; + text-align: center; + line-height: 1.4; +} +/* line 11, ../../../hub/static/css/mod/pagination.scss */ +.pagination a, .pagination span { + float: left; + margin: 0; + color: #777; + font-size: 13px; + text-decoration: none; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #DADADA; +} +/* line 23, ../../../hub/static/css/mod/pagination.scss */ +.pagination ul li a { + width: 20px; +} +/* line 29, ../../../hub/static/css/mod/pagination.scss */ +.pagination ul .disabled a { + background-color: #fff; +} + +/* line 3, ../../../hub/static/css/mod/issues-list.scss */ +.new-issue { + float: left; +} + +/* line 7, ../../../hub/static/css/mod/issues-list.scss */ +.sortby-issues { + float: right; +} + +/* line 11, ../../../hub/static/css/mod/issues-list.scss */ +.issues-topbar { + overflow: hidden; + display: block; +} + +/* line 16, ../../../hub/static/css/mod/issues-list.scss */ +.issue-list { + background: white; + margin-bottom: 20px; + border-bottom: 1px solid #eaeaea; +} +/* line 21, ../../../hub/static/css/mod/issues-list.scss */ +.issue-list > :first-child { + margin-top: 0px; +} +/* line 25, ../../../hub/static/css/mod/issues-list.scss */ +.issue-list .issue-item { + padding: 15px; + border-bottom: 1px solid #eaeaea; +} +/* line 29, ../../../hub/static/css/mod/issues-list.scss */ +.issue-list .issue-item h3 { + font-size: 16px; + font-weight: 400; + overflow: hidden; + word-break: break-all; + margin: 0; +} +/* line 36, ../../../hub/static/css/mod/issues-list.scss */ +.issue-list .issue-item h3 a { + color: #273338; +} +/* line 42, ../../../hub/static/css/mod/issues-list.scss */ +.issue-list .issue-item p a { + color: #999; +} +/* line 51, ../../../hub/static/css/mod/issues-list.scss */ +.issue-list .issue-item .meta { + margin-top: 20px; +} +/* line 55, ../../../hub/static/css/mod/issues-list.scss */ +.issue-list a.comment-count, +.issue-list a.comment-count:link, +.issue-list span.issue-info { + color: #bbb; +} +/* line 61, ../../../hub/static/css/mod/issues-list.scss */ +.issue-list .rule { + clear: both; + height: 0px; + padding: 0; + overflow: hidden; + background: transparent; +} diff --git a/dist/css/app/m/gist.css b/dist/css/app/m/gist.css new file mode 100644 index 0000000..7e3c6b4 --- /dev/null +++ b/dist/css/app/m/gist.css @@ -0,0 +1,1585 @@ +/* Highlight style from pygments */ +/* line 2, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .hll { + background-color: #ffffcc; +} + +/* line 3, ../../../../hub/static/css/mod/code-highlight.scss */ +.code { + background: #ffffff; +} + +/* line 4, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .c { + color: #808080; +} + +/* Comment */ +/* line 5, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .err { + color: #F00000; + background-color: #F0A0A0; +} + +/* Error */ +/* line 6, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .k { + color: #008000; + font-weight: bold; +} + +/* Keyword */ +/* line 7, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .o { + color: #303030; +} + +/* Operator */ +/* line 8, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .cm { + color: #808080; +} + +/* Comment.Multiline */ +/* line 9, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .cp { + color: #507090; +} + +/* Comment.Preproc */ +/* line 10, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .c1 { + color: #808080; +} + +/* Comment.Single */ +/* line 11, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .cs { + color: #cc0000; + font-weight: bold; +} + +/* Comment.Special */ +/* line 12, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .gd { + color: #A00000; +} + +/* Generic.Deleted */ +/* line 13, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .ge { + font-style: italic; +} + +/* Generic.Emph */ +/* line 14, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .gr { + color: #FF0000; +} + +/* Generic.Error */ +/* line 15, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .gh { + color: #000080; + font-weight: bold; +} + +/* Generic.Heading */ +/* line 16, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .gi { + color: #00A000; +} + +/* Generic.Inserted */ +/* line 17, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .go { + color: #808080; +} + +/* Generic.Output */ +/* line 18, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .gp { + color: #c65d09; + font-weight: bold; +} + +/* Generic.Prompt */ +/* line 19, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .gs { + font-weight: bold; +} + +/* Generic.Strong */ +/* line 20, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .gu { + color: #800080; + font-weight: bold; +} + +/* Generic.Subheading */ +/* line 21, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .gt { + color: #0040D0; +} + +/* Generic.Traceback */ +/* line 22, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .kc { + color: #008000; + font-weight: bold; +} + +/* Keyword.Constant */ +/* line 23, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .kd { + color: #008000; + font-weight: bold; +} + +/* Keyword.Declaration */ +/* line 24, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .kn { + color: #008000; + font-weight: bold; +} + +/* Keyword.Namespace */ +/* line 25, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .kp { + color: #003080; + font-weight: bold; +} + +/* Keyword.Pseudo */ +/* line 26, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .kr { + color: #008000; + font-weight: bold; +} + +/* Keyword.Reserved */ +/* line 27, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .kt { + color: #303090; + font-weight: bold; +} + +/* Keyword.Type */ +/* line 28, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .m { + color: #6000E0; + font-weight: bold; +} + +/* Literal.Number */ +/* line 29, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .s { + background-color: #fff0f0; +} + +/* Literal.String */ +/* line 30, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .na { + color: #0000C0; +} + +/* Name.Attribute */ +/* line 31, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .nb { + color: #007020; +} + +/* Name.Builtin */ +/* line 32, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .nc { + color: #B00060; + font-weight: bold; +} + +/* Name.Class */ +/* line 33, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .no { + color: #003060; + font-weight: bold; +} + +/* Name.Constant */ +/* line 34, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .nd { + color: #505050; + font-weight: bold; +} + +/* Name.Decorator */ +/* line 35, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .ni { + color: #800000; + font-weight: bold; +} + +/* Name.Entity */ +/* line 36, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .ne { + color: #F00000; + font-weight: bold; +} + +/* Name.Exception */ +/* line 37, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .nf { + color: #0060B0; + font-weight: bold; +} + +/* Name.Function */ +/* line 38, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .nl { + color: #907000; + font-weight: bold; +} + +/* Name.Label */ +/* line 39, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .nn { + color: #0e84b5; + font-weight: bold; +} + +/* Name.Namespace */ +/* line 40, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .nt { + color: #007000; +} + +/* Name.Tag */ +/* line 41, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .nv { + color: #906030; +} + +/* Name.Variable */ +/* line 42, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .ow { + color: #000000; + font-weight: bold; +} + +/* Operator.Word */ +/* line 43, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .w { + color: #bbbbbb; +} + +/* Text.Whitespace */ +/* line 44, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .mf { + color: #6000E0; + font-weight: bold; +} + +/* Literal.Number.Float */ +/* line 45, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .mh { + color: #005080; + font-weight: bold; +} + +/* Literal.Number.Hex */ +/* line 46, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .mi { + color: #0000D0; + font-weight: bold; +} + +/* Literal.Number.Integer */ +/* line 47, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .mo { + color: #4000E0; + font-weight: bold; +} + +/* Literal.Number.Oct */ +/* line 48, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .sb { + background-color: #fff0f0; +} + +/* Literal.String.Backtick */ +/* line 49, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .sc { + color: #0040D0; +} + +/* Literal.String.Char */ +/* line 50, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .sd { + color: #D04020; +} + +/* Literal.String.Doc */ +/* line 51, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .s2 { + background-color: #fff0f0; +} + +/* Literal.String.Double */ +/* line 52, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .se { + color: #606060; + font-weight: bold; + background-color: #fff0f0; +} + +/* Literal.String.Escape */ +/* line 53, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .sh { + background-color: #fff0f0; +} + +/* Literal.String.Heredoc */ +/* line 54, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .si { + background-color: #e0e0e0; +} + +/* Literal.String.Interpol */ +/* line 55, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .sx { + color: #D02000; + background-color: #fff0f0; +} + +/* Literal.String.Other */ +/* line 56, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .sr { + color: #000000; + background-color: #fff0ff; +} + +/* Literal.String.Regex */ +/* line 57, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .s1 { + background-color: #fff0f0; +} + +/* Literal.String.Single */ +/* line 58, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .ss { + color: #A06000; +} + +/* Literal.String.Symbol */ +/* line 59, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .bp { + color: #007020; +} + +/* Name.Builtin.Pseudo */ +/* line 60, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .vc { + color: #306090; +} + +/* Name.Variable.Class */ +/* line 61, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .vg { + color: #d07000; + font-weight: bold; +} + +/* Name.Variable.Global */ +/* line 62, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .vi { + color: #3030B0; +} + +/* Name.Variable.Instance */ +/* line 63, ../../../../hub/static/css/mod/code-highlight.scss */ +.code .il { + color: #0000D0; + font-weight: bold; +} + +/* Literal.Number.Integer.Long */ +/* line 1, ../../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* Item Listing */ +/* line 2, ../../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* button list */ +/* line 3, ../../../../hub/static/css/mod/file-blob.scss */ +.button-group { + display: inline-block; + overflow: hidden; + border: 1px solid #d4d4d4; + border-radius: 3px; + border-bottom-color: #bcbcbc; + background: #f5f5f5; + background: -moz-linear-gradient(#f5f5f5, #e5e5e5); + background: -webkit-linear-gradient(#f5f5f5, #e5e5e5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; +} + +/* line 4, ../../../../hub/static/css/mod/file-blob.scss */ +.button-group li { + margin: 0 !important; + float: left; +} + +/* line 5, ../../../../hub/static/css/mod/file-blob.scss */ +.button-group li:first-child .grouped-button { + border-left: none; + border-bottom-left-radius: 2px; + border-top-left-radius: 2px; +} + +/* line 6, ../../../../hub/static/css/mod/file-blob.scss */ +.button-group li:last-child .grouped-button { + border-right: none; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 2px; +} + +/* line 7, ../../../../hub/static/css/mod/file-blob.scss */ +.button-group .grouped-button { + float: left; + background: none; + border-bottom: none; + border-top: none; + border-left: 1px solid rgba(0, 0, 0, 0.1); + border-right: 1px solid rgba(255, 255, 255, 0.5); + border-radius: 0; + cursor: pointer; +} + +/* line 8, ../../../../hub/static/css/mod/file-blob.scss */ +.button-group .minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line-no */ +/* line 12, ../../../../hub/static/css/mod/file-blob.scss */ +#blob .file { + min-height: 78px; + position: relative; + overflow: auto; +} + +/* line 13, ../../../../hub/static/css/mod/file-blob.scss */ +#blob .file .rawfile { + text-align: center; + background-color: #ddd; + padding: 30px; + position: relative; +} + +/* line 14, ../../../../hub/static/css/mod/file-blob.scss */ +.file table { + width: 100%; + border-collapse: collapse; + border-spacing: 0; +} + +/* line 15, ../../../../hub/static/css/mod/file-blob.scss */ +.file table td, .file table th { + vertical-align: top; + padding: 0; +} + +/* line 16, ../../../../hub/static/css/mod/file-blob.scss */ +.file .data { + overflow: auto; +} + +/* line 18, ../../../../hub/static/css/mod/file-blob.scss */ +.code { + width: 100%; +} + +/* line 19, ../../../../hub/static/css/mod/file-blob.scss */ +.code .highlight pre { + margin: 0; + padding: 8px; + border: none; + background-color: #FFF; + white-space: pre; +} + +/* line 20, ../../../../hub/static/css/mod/file-blob.scss */ +.code .highlight pre a { + display: block; +} + +/* line 23, ../../../../hub/static/css/mod/file-blob.scss */ +.linenos .linenodiv pre { + background-color: #ECECEC; + padding: 8px; + border: none; + border-right: 1px solid #DDD; + text-align: right; + white-space: pre; +} + +/* line 24, ../../../../hub/static/css/mod/file-blob.scss */ +.linenos .linenodiv pre a { + color: #AAA; + text-decoration: none; + white-space: nowrap; + line-height: 18px; +} + +/* line 25, ../../../../hub/static/css/mod/file-blob.scss */ +.code .highlight pre, .linenos .linenodiv pre { + margin: 0; + line-height: 18px; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +/* line 32, ../../../../hub/static/css/mod/file-blob.scss */ +.linenos { + padding: 0; +} + +/* line 1, ../../../../hub/static/css/mod/gist-miniicon.scss */ +.minibutton .mini-icon { + vertical-align: -2px; +} + +/* line 2, ../../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-gist::before { + content: "\f00e"; +} + +/* line 3, ../../../../hub/static/css/mod/gist-miniicon.scss */ +.mega-icon-gist-secret::before { + content: "\f28c"; + color: #F8EEC7; +} + +/* line 4, ../../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-gist-add::before { + content: "\f07a"; +} + +/* line 5, ../../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-gist-private::before { + content: "\f00f"; +} + +/* line 6, ../../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-gist-forked::before { + content: "\f079"; +} + +/* line 7, ../../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-gist-starred::before { + content: "\f02a"; +} + +/* line 8, ../../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-arr-up::before { + content: "\f03d"; +} + +/* line 9, ../../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-gist-secret::before { + content: "\f08c"; +} + +/* line 10, ../../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-gist-fork::before { + content: "\f020"; +} + +/* line 11, ../../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-gist-star::before { + content: "\f02a"; +} + +/* line 12, ../../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-arr-down::before { + content: "\f03f"; +} + +/* line 13, ../../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-commit-comment::before { + content: "\f02b"; +} + +/* line 14, ../../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-code::before { + content: "\f05f"; +} + +/* line 15, ../../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-link::before { + content: "\f05c"; +} + +/* line 16, ../../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-edit::before { + content: "\f058"; +} + +/* line 17, ../../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-delete-note::before, .mini-icon-remove-close::beforeremove-close::before { + content: "\f050"; +} + +/* line 18, ../../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-arr-right::before { + content: "\f03e"; +} + +/* line 19, ../../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-diff::before { + content: "\f04d"; +} + +/* line 20, ../../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-download::before { + content: "\f00b"; +} + +/* line 21, ../../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-logout::before { + content: "\f032"; +} + +/* line 22, ../../../../hub/static/css/mod/gist-miniicon.scss */ +.mega-icon-code-file::before, .mega-icon-download-unknown::before { + content: "\f210"; +} + +/* line 23, ../../../../hub/static/css/mod/gist-miniicon.scss */ +.mega-icon-arr-right::before { + content: "\f23e"; +} + +/* line 24, ../../../../hub/static/css/mod/gist-miniicon.scss */ +.mega-icon-gist-add::before { + content: "\f27a"; +} + +/* line 25, ../../../../hub/static/css/mod/gist-miniicon.scss */ +.discussion-bubble .discussion-bubble-content::before { + content: ""; + display: block; + height: 0; + width: 0; + border: 10px solid #EEE; + border-width: 10px 10px 10px 0; + border-color: transparent #EEE transparent transparent; + position: absolute; + left: -10px; + top: 15px; +} + +/* line 1, ../../../../hub/static/css/mod/gist-comment.scss */ +.tabnav .tabnav-tabs > li:first-child .tabnav-tab.selected { + padding-left: 12px; +} + +/* line 2, ../../../../hub/static/css/mod/gist-comment.scss */ +.previewable-comment-form .tabnav { + margin-bottom: 10px; + margin-top: 10px; + position: relative; +} + +/* line 3, ../../../../hub/static/css/mod/gist-comment.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 0 10px 10px; +} + +/* line 4, ../../../../hub/static/css/mod/gist-comment.scss */ +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* line 5, ../../../../hub/static/css/mod/gist-comment.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + display: none; + padding: 0 10px 10px; +} + +/* line 6, ../../../../hub/static/css/mod/gist-comment.scss */ +.previewable-comment-form.write-selected .write-content, .previewable-comment-form.preview-selected .preview-content { + display: block; +} + +/* line 7, ../../../../hub/static/css/mod/gist-comment.scss */ +.previewable-comment-form .comment { + border: 1px solid #CACACA; +} + +/* line 8, ../../../../hub/static/css/mod/gist-comment.scss */ +.comment-header { + height: 33px; + padding: 0 10px 0 6px; + border-bottom: 1px solid #CCC; + background-color: #E1E1E1; + background-image: -moz-linear-gradient(#F8F8F8, #E1E1E1); + background-image: -webkit-linear-gradient(#F8F8F8, #E1E1E1); + background-image: linear-gradient(#F8F8F8, #E1E1E1); + background-repeat: repeat-x; + font-size: 12px; +} + +/* line 9, ../../../../hub/static/css/mod/gist-comment.scss */ +.comment-header .comment-header-gravatar { + display: inline-block; + margin-right: 3px; + vertical-align: middle; + border-radius: 3px; +} + +/* line 10, ../../../../hub/static/css/mod/gist-comment.scss */ +.gist-form-actions { + text-align: right; + padding-bottom: 5px; +} + +/* line 11, ../../../../hub/static/css/mod/gist-comment.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + display: none; + padding: 0 10px 10px; +} + +/* line 12, ../../../../hub/static/css/mod/gist-comment.scss */ +.comment-header .comment-header-author { + display: inline-block; + max-width: 600px; + height: 33px; + line-height: 33px; + font-weight: bold; + color: #222; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.7); + white-space: nowrap; + text-overflow: ellipsis; +} + +/* line 13, ../../../../hub/static/css/mod/gist-comment.scss */ +.comment-header a { + color: #666; +} + +/* line 14, ../../../../hub/static/css/mod/gist-comment.scss */ +.comment-header a:hover { + text-decoration: underline; +} + +/* line 15, ../../../../hub/static/css/mod/gist-comment.scss */ +.comment-header .comment-header-right { + float: right; +} + +/* line 16, ../../../../hub/static/css/mod/gist-comment.scss */ +.comment-header .comment-header-date { + display: inline-block; + margin: 0; + height: 33px; + font-size: 11px; + line-height: 33px; + font-style: normal; + color: #777; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.7); + line-height: 33px; +} + +/* line 17, ../../../../hub/static/css/mod/gist-comment.scss */ +.comment-content .comment-body { + padding: 10px; + font-size: 13px; + overflow: auto; + width: 100%; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +/* line 18, ../../../../hub/static/css/mod/gist-comment.scss */ +.markdown-body { + font-size: 14px; + line-height: 1.6; + overflow: hidden; + background-color: white; +} + +/* line 19, ../../../../hub/static/css/mod/gist-comment.scss */ +.comment-content { + color: #333; + font-size: 12px; +} + +/* line 20, ../../../../hub/static/css/mod/gist-comment.scss */ +.markdown-body > :last-child { + margin-bottom: 0 !important; +} + +/* line 21, ../../../../hub/static/css/mod/gist-comment.scss */ +.markdown-body > :first-child { + margin-top: 0 !important; +} + +/* line 22, ../../../../hub/static/css/mod/gist-comment.scss */ +.markdown-body p, .markdown-body blockquote, .markdown-body ul, .markdown-body ol, .markdown-body dl, .markdown-body table, .markdown-body pre { + margin: 15px 0; +} + +/* line 23, ../../../../hub/static/css/mod/gist-comment.scss */ +.comment-content .comment-body { + font-size: 13px; +} + +/* line 25, ../../../../hub/static/css/mod/gist-comment.scss */ +.export-references { + list-style: none; + margin-top: 18px; +} + +/* line 26, ../../../../hub/static/css/mod/gist-comment.scss */ +.export-references li, .export-references label { + color: #999; + font-size: 11px; + margin-bottom: 2px; +} + +/* line 27, ../../../../hub/static/css/mod/gist-comment.scss */ +.export-references label { + display: block; + padding: 6px 0 1px; + margin-bottom: 0; +} + +/* line 28, ../../../../hub/static/css/mod/gist-comment.scss */ +input.url-field { + border-radius: 3px; + border: 1px solid #CCC; + font-family: Monaco, "Liberation Mono", Courier, monospace; + font-size: 11px; + color: #666; + padding: 0 5px 0 5px; + width: 136px; + height: 24px; + margin-bottom: 0; +} + +/* line 29, ../../../../hub/static/css/mod/gist-comment.scss */ +.comment-header-actions { + display: inline-block; + vertical-align: middle; + font-size: 13px; +} + +/* line 30, ../../../../hub/static/css/mod/gist-comment.scss */ +.comment-header .mini-icon { + color: #939AA0; + margin: 0 2px 0 1px; + position: relative; + top: 1px; +} + +/* line 31, ../../../../hub/static/css/mod/gist-comment.scss */ +.comment-header a:hover { + text-decoration: none; + color: #4183C4; +} + +/* line 1, ../../../../hub/static/css/mod/gist-item.scss */ +.gist-item { + display: inline-block; + display: block; + margin-bottom: 2em; + position: relative; +} + +/* line 2, ../../../../hub/static/css/mod/gist-item.scss */ +.gist-item ul.meta > li .mini-icon { + line-height: 0.6; + opacity: 0.5; +} + +/* line 3, ../../../../hub/static/css/mod/gist-item.scss */ +.gist-item ul.meta { + position: absolute; + right: 0; +} + +/* line 4, ../../../../hub/static/css/mod/gist-item.scss */ +.gist-item ul.meta > li { + font-size: 12px; + font-weight: bold; + list-style-type: none; + display: inline-block; + margin-left: 12px; +} + +/* line 5, ../../../../hub/static/css/mod/gist-item.scss */ +.gist-item ul.meta > li > a { + display: block; + text-decoration: none; + color: #666; +} + +/* line 6, ../../../../hub/static/css/mod/gist-item.scss */ +.gist-item .byline { + margin: 3px 0 11px; +} + +/* line 7, ../../../../hub/static/css/mod/gist-item.scss */ +.gist-item .creator img { + border-radius: 3px; + width: 28px; + height: 28px; + position: absolute; + top: 0; + left: 0; + margin-left: 3px; +} + +/* line 8, ../../../../hub/static/css/mod/gist-item.scss */ +.gist-item .creator { + color: rgba(51, 51, 51, 0.75); + font-size: 13px; + font-weight: 300; + padding-left: 40px; + position: relative; + width: 480px; +} + +/* line 9, ../../../../hub/static/css/mod/gist-item.scss */ +.gist-item .creator a { + font-weight: bold; +} + +/* line 10, ../../../../hub/static/css/mod/gist-item.scss */ +.gist-item .metadata { + font-size: 11px; + margin-left: 40px; +} + +/* line 11, ../../../../hub/static/css/mod/gist-item.scss */ +.gist-item .metadata .datetime { + color: #999; +} + +/* line 12, ../../../../hub/static/css/mod/gist-item.scss */ +.gist-item .description { + color: rgba(51, 51, 51, 0.75); + display: block; + font-size: 12px; + vertical-align: text-top; + margin-top: 6px; + margin-left: 40px; + width: 480px; +} + +/* line 13, ../../../../hub/static/css/mod/gist-item.scss */ +.bubble { + background: #EEE; + border-radius: 3px; + margin-bottom: 1em; + padding: 3px; +} + +/* line 14, ../../../../hub/static/css/mod/gist-item.scss */ +table { + font-size: inherit; + font: 100%; +} + +/* line 15, ../../../../hub/static/css/mod/gist-item.scss */ +tbody { + display: table-row-group; + vertical-align: middle; + border-color: inherit; +} + +/* line 16, ../../../../hub/static/css/mod/gist-item.scss */ +.file-box { + background-color: #DDD; + border: 1px solid #CCC; + margin-bottom: 1em; + position: relative; +} + +/* line 17, ../../../../hub/static/css/mod/gist-item.scss */ +.file-box .data { + background-color: ghostWhite; + font-size: 12px; + overflow: auto; +} + +/* line 18, ../../../../hub/static/css/mod/gist-item.scss */ +.file-box .highlight { + border: none; + padding: 0; +} + +/* line 19, ../../../../hub/static/css/mod/gist-item.scss */ +.file-box .data tr:last-child td.line_numbers, .file-box .data tr:last-child .line_data { + padding-bottom: 12px; +} + +/* line 20, ../../../../hub/static/css/mod/gist-item.scss */ +.file-box .data tr:first-child td.line_numbers, .file-box .data tr:first-child .line_data { + padding-top: 12px; +} + +/* line 21, ../../../../hub/static/css/mod/gist-item.scss */ +.highlight { + background: white; +} + +/* line 22, ../../../../hub/static/css/mod/gist-item.scss */ +.bubble .file-box:only-child { + border-bottom: 1px solid #CCC; +} + +/* line 23, ../../../../hub/static/css/mod/gist-item.scss */ +.bubble .file-box .data { + background: ghostWhite; +} + +/* line 24, ../../../../hub/static/css/mod/gist-item.scss */ +.gist-item .file-box { + position: relative; +} + +/* line 25, ../../../../hub/static/css/mod/gist-item.scss */ +.bubble .file-box { + background: #ECECEC; + margin-bottom: 0; +} + +/* line 26, ../../../../hub/static/css/mod/gist-item.scss */ +.bubble.secret { + background-color: #F8EEC7; +} + +/* line 1, ../../../../hub/static/css/mod/gist-form.scss */ +.bubble { + background: #EEE; + border-radius: 3px; + margin-bottom: 1em; + padding: 3px; +} + +/* line 2, ../../../../hub/static/css/mod/gist-form.scss */ +#gist-form .file { + border: 1px solid #D9D9D9; + background: whiteSmoke; +} + +/* line 3, ../../../../hub/static/css/mod/gist-form.scss */ +#gist-form .file .meta { + background-color: #EAEAEA; + background-image: -moz-linear-gradient(#FAFAFA, #EAEAEA); + background-image: -webkit-linear-gradient(#FAFAFA, #EAEAEA); + background-image: linear-gradient(#FAFAFA, #EAEAEA); + background-repeat: repeat-x; + display: inline-block; + display: block; + border-bottom: 1px solid #D8D8D8; + color: #555; + font-size: 12px; + height: 26px; + padding: 8px; + position: relative; + text-align: left; + text-shadow: 0 1px 0 white; +} + +/* line 4, ../../../../hub/static/css/mod/gist-form.scss */ +#gist-form .editor-options { + position: absolute; + top: 6px; + right: 5px; +} + +/* line 1, ../../../../hub/static/css/mod/gist-render.scss */ +.link-overlay { + height: 100%; + width: 100%; + position: absolute; + visibility: hidden; + z-index: 50; +} + +/* line 2, ../../../../hub/static/css/mod/gist-render.scss */ +.link-overlay .link { + background-color: rgba(0, 0, 0, 0.75); + color: white; + margin: -14px 0 0 0; + padding: 4px 8px 4px 10px; + height: 20px; + position: absolute; + top: 20px; + right: 6px; + z-index: 100; +} + +/* line 3, ../../../../hub/static/css/mod/gist-render.scss */ +.link-overlay .link .mini-icon { + position: relative; + top: 2px; +} + +/* line 1, ../../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body { + padding: 30px; +} + +/* line 4, ../../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body > :first-child { + margin-top: 0 !important; +} + +/* line 7, ../../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body h1, +.markdown-body h2, +.markdown-body h3, +.markdown-body h4, +.markdown-body h5, +.markdown-body h6 { + margin: 20px 0 10px; + padding: 0; + font-weight: bold; + -webkit-font-smoothing: antialiased; + cursor: text; + position: relative; +} + +/* line 20, ../../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body h2 { + font-size: 24px; + border-bottom: 1px solid #CCC; + color: black; +} + +/* line 25, ../../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body, +.markdown-body p { + font-size: 14px; + line-height: 1.6; +} + +/* line 30, ../../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body p, +.markdown-body blockquote, +.markdown-body ul, +.markdown-body ol, +.markdown-body dl, +.markdown-body table, +.markdown-body pre { + margin: 15px 0; +} + +/* line 39, ../../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul, +.markdown-body ol { + padding-left: 30px; +} + +/* line 43, ../../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul li { + line-height: 1.6; +} + +/* line 46, ../../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul { + list-style: disc; +} + +/* line 49, ../../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ol { + list-style: decimal; +} + +/* line 52, ../../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table { + width: 100%; +} + +/* line 55, ../../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table caption + thead tr:first-child th, +.markdown-body table caption + thead tr:first-child td, +.markdown-body table colgroup + thead tr:first-child th, +.markdown-body table colgroup + thead tr:first-child td, +.markdown-body table thead:first-child tr:first-child th, +.markdown-body table thead:first-child tr:first-child td { + border-top: 0; +} + +/* line 63, ../../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table thead th { + vertical-align: bottom; +} + +/* line 66, ../../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th { + font-weight: bold; +} + +/* line 69, ../../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th, +.markdown-body table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #ddd; +} + +/* line 77, ../../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th, +.markdown-body table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #ddd; +} + +/* line 85, ../../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table tbody > tr:nth-child(odd) > td, +.markdown-body table tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} + +/* line 89, ../../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body .progress-percentage { + color: #888; +} + +/* line 93, ../../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page { + padding: 0px; +} + +/* line 96, ../../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page h1, +.markdown-page h2, +.markdown-page h3, +.markdown-page h4, +.markdown-page h5, +.markdown-page h6 { + position: static; +} + +/* line 104, ../../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page pre { + font-family: Consolas, 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 14px; +} + +/* line 108, ../../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page .label { + background-color: transparent; +} + +/* line 111, ../../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page dd { + margin-left: 1.5em; +} + +/* line 114, ../../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body code { + white-space: pre-wrap; +} + +/* line 12, ../../../../hub/static/css/app/m/gist.scss */ +body { + margin: 0; +} + +/* line 13, ../../../../hub/static/css/app/m/gist.scss */ +.CodeMirror { + height: 300px; +} + +/* line 14, ../../../../hub/static/css/app/m/gist.scss */ +form { + margin: 0; +} + +/* line 15, ../../../../hub/static/css/app/m/gist.scss */ +.container { + width: 100%; +} + +/* line 16, ../../../../hub/static/css/app/m/gist.scss */ +#gist-form .file .meta { + position: fixed; + top: 0; + width: 100%; +} + +/* line 17, ../../../../hub/static/css/app/m/gist.scss */ +.input { + margin-top: 43px; +} + +/* line 18, ../../../../hub/static/css/app/m/gist.scss */ +#gist-form .editor-options { + right: 25px; +} + +/* line 19, ../../../../hub/static/css/app/m/gist.scss */ +.btn { + font-weight: bold; +} + +/* line 20, ../../../../hub/static/css/app/m/gist.scss */ +.link-overlay { + visibility: visible; +} + +/* line 21, ../../../../hub/static/css/app/m/gist.scss */ +input.gist-name-textbox { + width: 160px; +} + +/* line 23, ../../../../hub/static/css/app/m/gist.scss */ +.bubble .blob { + margin: 0 0 0 0; +} + +/* line 24, ../../../../hub/static/css/app/m/gist.scss */ +.blob .file { + min-height: 30px; + position: relative; + overflow: auto; +} + +/* line 26, ../../../../hub/static/css/app/m/gist.scss */ +.gist-options { + top: 5px; + position: absolute; + right: 5px; +} diff --git a/dist/css/app/mfeed.css b/dist/css/app/mfeed.css new file mode 100644 index 0000000..7106579 --- /dev/null +++ b/dist/css/app/mfeed.css @@ -0,0 +1,5707 @@ +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* line 1, ../../../hub/static/css/mod/user-card.scss */ +.user-card { + position: absolute; + padding: 3px 5px 5px; + min-height: 68px; + width: 210px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +/* line 2, ../../../hub/static/css/mod/user-card.scss */ +.user-card .desc { + margin-left: 3px; +} + +/* line 3, ../../../hub/static/css/mod/user-card.scss */ +.user-card .avatar-wrap { + width: 46px; + height: 36px; + float: left; + margin-right: 6px; + border-right: 1px solid #BEBEBE; +} + +/* line 4, ../../../hub/static/css/mod/user-card.scss */ +.user-card .badge-item { + float: left; + width: 30px; + height: 30px; + border: none; + padding: 2px; + background-color: white; + line-height: 0; + margin-right: 0.7em; +} + +/* line 5, ../../../hub/static/css/mod/user-card.scss */ +.user-card .title { + padding: 0 0 0.25em 0; +} + +/* line 6, ../../../hub/static/css/mod/user-card.scss */ +.user-card .desc .avatar { + float: left; + width: 30px; + height: 30px; + padding: 2px; + background-color: white; + line-height: 0; + margin-right: 0.7em; +} + +/* line 1, ../../../hub/static/css/mod/team-card.scss */ +.team-card { + position: absolute; + padding: 6px 10px; + min-height: 68px; + width: 236px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + overflow: hidden; +} +/* line 10, ../../../hub/static/css/mod/team-card.scss */ +.team-card .pic { + float: right; + max-height: 50px; + margin: 6px 0 0 10px; +} +/* line 15, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content { + word-wrap: break-word; +} +/* line 17, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .title { + margin: 6px 0; + font-size: 15px; + overflow: hidden; + white-space: nowrap; +} +/* line 23, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .info { + position: relative; + margin-top: 10px; + font-size: 13px; +} +/* line 27, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .info .desc { + white-space: nowrap; + overflow: hidden; +} + +/* line 35, ../../../hub/static/css/mod/team-card.scss */ +.member { + border-top: solid 1px #eaeaea; + padding-top: 8px; + height: 26px; +} +/* line 39, ../../../hub/static/css/mod/team-card.scss */ +.member .more-members { + float: right; + width: 24px; + height: 24px; + line-height: 26px; + text-align: center; + border: 1px solid #eaeaea; + background: #eaeaea; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 53, ../../../hub/static/css/mod/team-card.scss */ +.member .members li { + float: left; +} +/* line 55, ../../../hub/static/css/mod/team-card.scss */ +.member .members li a { + display: block; + width: 26px; + height: 26px; + overflow: hidden; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 65, ../../../hub/static/css/mod/team-card.scss */ +.member .members li a img { + width: 26px; + height: 26px; +} + +/* line 73, ../../../hub/static/css/mod/team-card.scss */ +.cf { + zoom: 1; +} +/* line 75, ../../../hub/static/css/mod/team-card.scss */ +.cf:before { + content: ""; + display: table; +} +/* line 79, ../../../hub/static/css/mod/team-card.scss */ +.cf .cf:after { + clear: both; + content: ""; + display: table; +} + +/* Timeline */ +@media (max-width: 767px) { + /* line 6, ../../../hub/static/css/mod/timeline.scss */ + .timeline { + padding: 10px; + } +} +/* line 9, ../../../hub/static/css/mod/timeline.scss */ +.timeline { + margin-top: 0px; + word-wrap: break-word; + word-break: normal; +} +/* line 14, ../../../hub/static/css/mod/timeline.scss */ +.timeline li { + position: relative; + list-style: none; + clear: both; + background: white; + padding: 10px 20px 10px 32px; + margin: 0 0 0px; + border-bottom: 1px solid #eaeaea; +} +/* line 23, ../../../hub/static/css/mod/timeline.scss */ +.timeline li .title { + margin-bottom: 0.5em; +} +/* line 25, ../../../hub/static/css/mod/timeline.scss */ +.timeline li .title i { + position: absolute; + left: 5px; + padding: 2px 5px 0; + color: #999; + font-size: 10px; +} +/* line 35, ../../../hub/static/css/mod/timeline.scss */ +.timeline .time { + float: right; + color: #ccc; + font-size: 12px; +} +/* line 41, ../../../hub/static/css/mod/timeline.scss */ +.timeline code { + white-space: normal; +} + +/* line 46, ../../../hub/static/css/mod/timeline.scss */ +.timeline .padding { + height: 2em; + font-weight: bold; +} + +/* line 50, ../../../hub/static/css/mod/timeline.scss */ +.timeline .more_items { + margin-left: 10px; + font-weight: bold; +} + +/* line 54, ../../../hub/static/css/mod/timeline.scss */ +.timeline .time { + color: #bbb; +} + +/* line 57, ../../../hub/static/css/mod/timeline.scss */ +.timeline .desc { + padding: 0 0 1em 0; + color: #666; + word-wrap: break-word; +} + +/* line 62, ../../../hub/static/css/mod/timeline.scss */ +.timeline .desc .right_side { + float: right; + margin-right: 30px; +} + +/* line 67, ../../../hub/static/css/mod/timeline.scss */ +.timeline .pagination { + display: none; + background: #63b6ae; +} + +/* line 71, ../../../hub/static/css/mod/timeline.scss */ +.pagination { + display: block; + margin: 7px 0; + overflow: hidden; + border: 1px solid #EAEAEA; + border-bottom-color: #CACACA; + border-top: none; + border-bottom: none; + border-radius: 3px; + background-image: -webkit-linear-gradient(top, white, #EFEFEF); +} + +/* line 82, ../../../hub/static/css/mod/timeline.scss */ +.timeline .pagination a { + color: white; +} + +/* line 85, ../../../hub/static/css/mod/timeline.scss */ +.pagination a { + padding: 8px; + width: 100%; + text-align: center; + line-height: 1.4; +} + +/* line 91, ../../../hub/static/css/mod/timeline.scss */ +.pagination a:last-child, .pagination span:last-child { + border-right: none; + border-bottom-right-radius: 3px; +} + +/* line 95, ../../../hub/static/css/mod/timeline.scss */ +.pagination a:first-child, .pagination span:first-child { + border-left: none; + border-bottom-left-radius: 3px; +} + +/* line 99, ../../../hub/static/css/mod/timeline.scss */ +.pagination a, .pagination span { + float: left; + margin: 0; + color: #777; + font-size: 13px; + text-decoration: none; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #DADADA; +} + +/* line 108, ../../../hub/static/css/mod/timeline.scss */ +.timeline .loader img { + display: block; + width: 16px; + height: 16px; + margin: 0 auto; + position: relative; +} + +/* Timeline on mobile */ +/* line 2, ../../../hub/static/css/mod/mobile_timeline.scss */ +body { + margin: 0; + padding: 0; +} + +/* line 4, ../../../hub/static/css/mod/mobile_timeline.scss */ +.ui-footer ul li { + line-height: 32px; +} + +/* line 5, ../../../hub/static/css/mod/mobile_timeline.scss */ +.scrollable .wrap { + background: #fff; +} + +/* line 7, ../../../hub/static/css/mod/mobile_timeline.scss */ +.timeline { + width: 100%; + height: 100%; + position: fixed; + margin-top: 0; +} + +/* line 8, ../../../hub/static/css/mod/mobile_timeline.scss */ +.timeline .action, .timeline .pulls { + margin-bottom: 0.5em; + padding: 0 12px 0 32px; + border-bottom: 1px solid #f1f1f1; +} + +/* line 9, ../../../hub/static/css/mod/mobile_timeline.scss */ +.timeline .desc { + border: none; + margin-bottom: 0.5em; + padding-bottom: 5px; +} diff --git a/dist/css/app/mirror-cloning.css b/dist/css/app/mirror-cloning.css new file mode 100644 index 0000000..857f555 --- /dev/null +++ b/dist/css/app/mirror-cloning.css @@ -0,0 +1,5673 @@ +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* line 1, ../../../hub/static/css/mod/user-card.scss */ +.user-card { + position: absolute; + padding: 3px 5px 5px; + min-height: 68px; + width: 210px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +/* line 2, ../../../hub/static/css/mod/user-card.scss */ +.user-card .desc { + margin-left: 3px; +} + +/* line 3, ../../../hub/static/css/mod/user-card.scss */ +.user-card .avatar-wrap { + width: 46px; + height: 36px; + float: left; + margin-right: 6px; + border-right: 1px solid #BEBEBE; +} + +/* line 4, ../../../hub/static/css/mod/user-card.scss */ +.user-card .badge-item { + float: left; + width: 30px; + height: 30px; + border: none; + padding: 2px; + background-color: white; + line-height: 0; + margin-right: 0.7em; +} + +/* line 5, ../../../hub/static/css/mod/user-card.scss */ +.user-card .title { + padding: 0 0 0.25em 0; +} + +/* line 6, ../../../hub/static/css/mod/user-card.scss */ +.user-card .desc .avatar { + float: left; + width: 30px; + height: 30px; + padding: 2px; + background-color: white; + line-height: 0; + margin-right: 0.7em; +} + +/* line 1, ../../../hub/static/css/mod/team-card.scss */ +.team-card { + position: absolute; + padding: 6px 10px; + min-height: 68px; + width: 236px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + overflow: hidden; +} +/* line 10, ../../../hub/static/css/mod/team-card.scss */ +.team-card .pic { + float: right; + max-height: 50px; + margin: 6px 0 0 10px; +} +/* line 15, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content { + word-wrap: break-word; +} +/* line 17, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .title { + margin: 6px 0; + font-size: 15px; + overflow: hidden; + white-space: nowrap; +} +/* line 23, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .info { + position: relative; + margin-top: 10px; + font-size: 13px; +} +/* line 27, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .info .desc { + white-space: nowrap; + overflow: hidden; +} + +/* line 35, ../../../hub/static/css/mod/team-card.scss */ +.member { + border-top: solid 1px #eaeaea; + padding-top: 8px; + height: 26px; +} +/* line 39, ../../../hub/static/css/mod/team-card.scss */ +.member .more-members { + float: right; + width: 24px; + height: 24px; + line-height: 26px; + text-align: center; + border: 1px solid #eaeaea; + background: #eaeaea; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 53, ../../../hub/static/css/mod/team-card.scss */ +.member .members li { + float: left; +} +/* line 55, ../../../hub/static/css/mod/team-card.scss */ +.member .members li a { + display: block; + width: 26px; + height: 26px; + overflow: hidden; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 65, ../../../hub/static/css/mod/team-card.scss */ +.member .members li a img { + width: 26px; + height: 26px; +} + +/* line 73, ../../../hub/static/css/mod/team-card.scss */ +.cf { + zoom: 1; +} +/* line 75, ../../../hub/static/css/mod/team-card.scss */ +.cf:before { + content: ""; + display: table; +} +/* line 79, ../../../hub/static/css/mod/team-card.scss */ +.cf .cf:after { + clear: both; + content: ""; + display: table; +} + +/* Timeline */ +@media (max-width: 767px) { + /* line 6, ../../../hub/static/css/mod/timeline.scss */ + .timeline { + padding: 10px; + } +} +/* line 9, ../../../hub/static/css/mod/timeline.scss */ +.timeline { + margin-top: 0px; + word-wrap: break-word; + word-break: normal; +} +/* line 14, ../../../hub/static/css/mod/timeline.scss */ +.timeline li { + position: relative; + list-style: none; + clear: both; + background: white; + padding: 10px 20px 10px 32px; + margin: 0 0 0px; + border-bottom: 1px solid #eaeaea; +} +/* line 23, ../../../hub/static/css/mod/timeline.scss */ +.timeline li .title { + margin-bottom: 0.5em; +} +/* line 25, ../../../hub/static/css/mod/timeline.scss */ +.timeline li .title i { + position: absolute; + left: 5px; + padding: 2px 5px 0; + color: #999; + font-size: 10px; +} +/* line 35, ../../../hub/static/css/mod/timeline.scss */ +.timeline .time { + float: right; + color: #ccc; + font-size: 12px; +} +/* line 41, ../../../hub/static/css/mod/timeline.scss */ +.timeline code { + white-space: normal; +} + +/* line 46, ../../../hub/static/css/mod/timeline.scss */ +.timeline .padding { + height: 2em; + font-weight: bold; +} + +/* line 50, ../../../hub/static/css/mod/timeline.scss */ +.timeline .more_items { + margin-left: 10px; + font-weight: bold; +} + +/* line 54, ../../../hub/static/css/mod/timeline.scss */ +.timeline .time { + color: #bbb; +} + +/* line 57, ../../../hub/static/css/mod/timeline.scss */ +.timeline .desc { + padding: 0 0 1em 0; + color: #666; + word-wrap: break-word; +} + +/* line 62, ../../../hub/static/css/mod/timeline.scss */ +.timeline .desc .right_side { + float: right; + margin-right: 30px; +} + +/* line 67, ../../../hub/static/css/mod/timeline.scss */ +.timeline .pagination { + display: none; + background: #63b6ae; +} + +/* line 71, ../../../hub/static/css/mod/timeline.scss */ +.pagination { + display: block; + margin: 7px 0; + overflow: hidden; + border: 1px solid #EAEAEA; + border-bottom-color: #CACACA; + border-top: none; + border-bottom: none; + border-radius: 3px; + background-image: -webkit-linear-gradient(top, white, #EFEFEF); +} + +/* line 82, ../../../hub/static/css/mod/timeline.scss */ +.timeline .pagination a { + color: white; +} + +/* line 85, ../../../hub/static/css/mod/timeline.scss */ +.pagination a { + padding: 8px; + width: 100%; + text-align: center; + line-height: 1.4; +} + +/* line 91, ../../../hub/static/css/mod/timeline.scss */ +.pagination a:last-child, .pagination span:last-child { + border-right: none; + border-bottom-right-radius: 3px; +} + +/* line 95, ../../../hub/static/css/mod/timeline.scss */ +.pagination a:first-child, .pagination span:first-child { + border-left: none; + border-bottom-left-radius: 3px; +} + +/* line 99, ../../../hub/static/css/mod/timeline.scss */ +.pagination a, .pagination span { + float: left; + margin: 0; + color: #777; + font-size: 13px; + text-decoration: none; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #DADADA; +} + +/* line 108, ../../../hub/static/css/mod/timeline.scss */ +.timeline .loader img { + display: block; + width: 16px; + height: 16px; + margin: 0 auto; + position: relative; +} + +/* line 4, ../../../hub/static/css/app/mirror-cloning.scss */ +.center { + text-align: center; +} diff --git a/dist/css/app/mirrors.css b/dist/css/app/mirrors.css new file mode 100644 index 0000000..eec87ac --- /dev/null +++ b/dist/css/app/mirrors.css @@ -0,0 +1,5445 @@ +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* Echo out a label for the example */ +/* line 2, ../../../hub/static/css/mod/project-item.scss */ +.bs-docs-project:after { + content: "Proj"; +} + +/* line 6, ../../../hub/static/css/mod/project-item.scss */ +.bs-docs-fork:after { + content: "Fork"; +} + +/* line 10, ../../../hub/static/css/mod/project-item.scss */ +.project-item { + overflow: hidden; + word-wrap: break-word; + word-break: normal; + min-height: 80px; + position: relative; + margin: 15px 0; + padding: 14px 19px 14px 49px; + *padding-top: 14px; + background-color: transparent; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +/* line 25, ../../../hub/static/css/mod/project-item.scss */ +.project-item:after { + position: absolute; + top: -1px; + left: -1px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + background-color: #f5f5f5; + border: 1px solid #ddd; + color: #9da0a4; + -webkit-border-radius: 4px 0 4px 0; + -moz-border-radius: 4px 0 4px 0; + border-radius: 4px 0 4px 0; +} +/* line 40, ../../../hub/static/css/mod/project-item.scss */ +.project-item h4.project-title { + margin: 0; +} +/* line 42, ../../../hub/static/css/mod/project-item.scss */ +.project-item h4.project-title i { + margin-top: 5px; +} +/* line 47, ../../../hub/static/css/mod/project-item.scss */ +.project-item ul.project-stats li { + float: left; + margin-left: 10px; +} +/* line 52, ../../../hub/static/css/mod/project-item.scss */ +.project-item .summary { + margin-top: 10px; +} +/* line 55, ../../../hub/static/css/mod/project-item.scss */ +.project-item .commit-graph { + position: absolute; + left: 10px; + bottom: 0; + z-index: -9999; + height: 80px; + width: 440px; +} diff --git a/dist/css/app/my-actions.css b/dist/css/app/my-actions.css new file mode 100644 index 0000000..6ff9d07 --- /dev/null +++ b/dist/css/app/my-actions.css @@ -0,0 +1,5735 @@ +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* line 1, ../../../hub/static/css/mod/user-card.scss */ +.user-card { + position: absolute; + padding: 3px 5px 5px; + min-height: 68px; + width: 210px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +/* line 2, ../../../hub/static/css/mod/user-card.scss */ +.user-card .desc { + margin-left: 3px; +} + +/* line 3, ../../../hub/static/css/mod/user-card.scss */ +.user-card .avatar-wrap { + width: 46px; + height: 36px; + float: left; + margin-right: 6px; + border-right: 1px solid #BEBEBE; +} + +/* line 4, ../../../hub/static/css/mod/user-card.scss */ +.user-card .badge-item { + float: left; + width: 30px; + height: 30px; + border: none; + padding: 2px; + background-color: white; + line-height: 0; + margin-right: 0.7em; +} + +/* line 5, ../../../hub/static/css/mod/user-card.scss */ +.user-card .title { + padding: 0 0 0.25em 0; +} + +/* line 6, ../../../hub/static/css/mod/user-card.scss */ +.user-card .desc .avatar { + float: left; + width: 30px; + height: 30px; + padding: 2px; + background-color: white; + line-height: 0; + margin-right: 0.7em; +} + +/* line 1, ../../../hub/static/css/mod/team-card.scss */ +.team-card { + position: absolute; + padding: 6px 10px; + min-height: 68px; + width: 236px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + overflow: hidden; +} +/* line 10, ../../../hub/static/css/mod/team-card.scss */ +.team-card .pic { + float: right; + max-height: 50px; + margin: 6px 0 0 10px; +} +/* line 15, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content { + word-wrap: break-word; +} +/* line 17, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .title { + margin: 6px 0; + font-size: 15px; + overflow: hidden; + white-space: nowrap; +} +/* line 23, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .info { + position: relative; + margin-top: 10px; + font-size: 13px; +} +/* line 27, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .info .desc { + white-space: nowrap; + overflow: hidden; +} + +/* line 35, ../../../hub/static/css/mod/team-card.scss */ +.member { + border-top: solid 1px #eaeaea; + padding-top: 8px; + height: 26px; +} +/* line 39, ../../../hub/static/css/mod/team-card.scss */ +.member .more-members { + float: right; + width: 24px; + height: 24px; + line-height: 26px; + text-align: center; + border: 1px solid #eaeaea; + background: #eaeaea; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 53, ../../../hub/static/css/mod/team-card.scss */ +.member .members li { + float: left; +} +/* line 55, ../../../hub/static/css/mod/team-card.scss */ +.member .members li a { + display: block; + width: 26px; + height: 26px; + overflow: hidden; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 65, ../../../hub/static/css/mod/team-card.scss */ +.member .members li a img { + width: 26px; + height: 26px; +} + +/* line 73, ../../../hub/static/css/mod/team-card.scss */ +.cf { + zoom: 1; +} +/* line 75, ../../../hub/static/css/mod/team-card.scss */ +.cf:before { + content: ""; + display: table; +} +/* line 79, ../../../hub/static/css/mod/team-card.scss */ +.cf .cf:after { + clear: both; + content: ""; + display: table; +} + +/* Timeline */ +@media (max-width: 767px) { + /* line 6, ../../../hub/static/css/mod/timeline.scss */ + .timeline { + padding: 10px; + } +} +/* line 9, ../../../hub/static/css/mod/timeline.scss */ +.timeline { + margin-top: 0px; + word-wrap: break-word; + word-break: normal; +} +/* line 14, ../../../hub/static/css/mod/timeline.scss */ +.timeline li { + position: relative; + list-style: none; + clear: both; + background: white; + padding: 10px 20px 10px 32px; + margin: 0 0 0px; + border-bottom: 1px solid #eaeaea; +} +/* line 23, ../../../hub/static/css/mod/timeline.scss */ +.timeline li .title { + margin-bottom: 0.5em; +} +/* line 25, ../../../hub/static/css/mod/timeline.scss */ +.timeline li .title i { + position: absolute; + left: 5px; + padding: 2px 5px 0; + color: #999; + font-size: 10px; +} +/* line 35, ../../../hub/static/css/mod/timeline.scss */ +.timeline .time { + float: right; + color: #ccc; + font-size: 12px; +} +/* line 41, ../../../hub/static/css/mod/timeline.scss */ +.timeline code { + white-space: normal; +} + +/* line 46, ../../../hub/static/css/mod/timeline.scss */ +.timeline .padding { + height: 2em; + font-weight: bold; +} + +/* line 50, ../../../hub/static/css/mod/timeline.scss */ +.timeline .more_items { + margin-left: 10px; + font-weight: bold; +} + +/* line 54, ../../../hub/static/css/mod/timeline.scss */ +.timeline .time { + color: #bbb; +} + +/* line 57, ../../../hub/static/css/mod/timeline.scss */ +.timeline .desc { + padding: 0 0 1em 0; + color: #666; + word-wrap: break-word; +} + +/* line 62, ../../../hub/static/css/mod/timeline.scss */ +.timeline .desc .right_side { + float: right; + margin-right: 30px; +} + +/* line 67, ../../../hub/static/css/mod/timeline.scss */ +.timeline .pagination { + display: none; + background: #63b6ae; +} + +/* line 71, ../../../hub/static/css/mod/timeline.scss */ +.pagination { + display: block; + margin: 7px 0; + overflow: hidden; + border: 1px solid #EAEAEA; + border-bottom-color: #CACACA; + border-top: none; + border-bottom: none; + border-radius: 3px; + background-image: -webkit-linear-gradient(top, white, #EFEFEF); +} + +/* line 82, ../../../hub/static/css/mod/timeline.scss */ +.timeline .pagination a { + color: white; +} + +/* line 85, ../../../hub/static/css/mod/timeline.scss */ +.pagination a { + padding: 8px; + width: 100%; + text-align: center; + line-height: 1.4; +} + +/* line 91, ../../../hub/static/css/mod/timeline.scss */ +.pagination a:last-child, .pagination span:last-child { + border-right: none; + border-bottom-right-radius: 3px; +} + +/* line 95, ../../../hub/static/css/mod/timeline.scss */ +.pagination a:first-child, .pagination span:first-child { + border-left: none; + border-bottom-left-radius: 3px; +} + +/* line 99, ../../../hub/static/css/mod/timeline.scss */ +.pagination a, .pagination span { + float: left; + margin: 0; + color: #777; + font-size: 13px; + text-decoration: none; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #DADADA; +} + +/* line 108, ../../../hub/static/css/mod/timeline.scss */ +.timeline .loader img { + display: block; + width: 16px; + height: 16px; + margin: 0 auto; + position: relative; +} + +/* line 8, ../../../hub/static/css/mod/text-truncate.scss */ +.css-truncate.css-truncate-target, .css-truncate .css-truncate-target { + max-width: 125px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + vertical-align: top; + display: inline-block; +} + +/* line 14, ../../../hub/static/css/mod/text-truncate.scss */ +.css-truncate.expandable:hover .css-truncate-target { + max-width: 10000px !important; +} + +/* line 3, ../../../hub/static/css/mod/my-projects.scss */ +.my_projects { + margin-top: 5px; +} +/* line 4, ../../../hub/static/css/mod/my-projects.scss */ +.my_projects a.right { + float: right; +} +/* line 8, ../../../hub/static/css/mod/my-projects.scss */ +.my_projects li { + max-width: 300px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +/* line 12, ../../../hub/static/css/mod/my-projects.scss */ +.my_projects li .delete-btn { + display: none; +} +/* line 16, ../../../hub/static/css/mod/my-projects.scss */ +.my_projects li.hover .delete-btn { + display: block; +} + +/* line 23, ../../../hub/static/css/mod/my-projects.scss */ +.my_projects .delete-btn { + padding: 0 6px 0 6px; +} + +/* line 8, ../../../hub/static/css/mod/text-truncate.scss */ +.css-truncate.css-truncate-target, .css-truncate .css-truncate-target { + max-width: 125px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + vertical-align: top; + display: inline-block; +} + +/* line 14, ../../../hub/static/css/mod/text-truncate.scss */ +.css-truncate.expandable:hover .css-truncate-target { + max-width: 10000px !important; +} + +/* line 4, ../../../hub/static/css/mod/watched-projects.scss */ +.watched-projects li { + max-width: 300px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} diff --git a/dist/css/app/my-issues.css b/dist/css/app/my-issues.css new file mode 100644 index 0000000..93c485c --- /dev/null +++ b/dist/css/app/my-issues.css @@ -0,0 +1,5724 @@ +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* line 1, ../../../hub/static/css/mod/user-card.scss */ +.user-card { + position: absolute; + padding: 3px 5px 5px; + min-height: 68px; + width: 210px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +/* line 2, ../../../hub/static/css/mod/user-card.scss */ +.user-card .desc { + margin-left: 3px; +} + +/* line 3, ../../../hub/static/css/mod/user-card.scss */ +.user-card .avatar-wrap { + width: 46px; + height: 36px; + float: left; + margin-right: 6px; + border-right: 1px solid #BEBEBE; +} + +/* line 4, ../../../hub/static/css/mod/user-card.scss */ +.user-card .badge-item { + float: left; + width: 30px; + height: 30px; + border: none; + padding: 2px; + background-color: white; + line-height: 0; + margin-right: 0.7em; +} + +/* line 5, ../../../hub/static/css/mod/user-card.scss */ +.user-card .title { + padding: 0 0 0.25em 0; +} + +/* line 6, ../../../hub/static/css/mod/user-card.scss */ +.user-card .desc .avatar { + float: left; + width: 30px; + height: 30px; + padding: 2px; + background-color: white; + line-height: 0; + margin-right: 0.7em; +} + +/* line 1, ../../../hub/static/css/mod/team-card.scss */ +.team-card { + position: absolute; + padding: 6px 10px; + min-height: 68px; + width: 236px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + overflow: hidden; +} +/* line 10, ../../../hub/static/css/mod/team-card.scss */ +.team-card .pic { + float: right; + max-height: 50px; + margin: 6px 0 0 10px; +} +/* line 15, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content { + word-wrap: break-word; +} +/* line 17, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .title { + margin: 6px 0; + font-size: 15px; + overflow: hidden; + white-space: nowrap; +} +/* line 23, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .info { + position: relative; + margin-top: 10px; + font-size: 13px; +} +/* line 27, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .info .desc { + white-space: nowrap; + overflow: hidden; +} + +/* line 35, ../../../hub/static/css/mod/team-card.scss */ +.member { + border-top: solid 1px #eaeaea; + padding-top: 8px; + height: 26px; +} +/* line 39, ../../../hub/static/css/mod/team-card.scss */ +.member .more-members { + float: right; + width: 24px; + height: 24px; + line-height: 26px; + text-align: center; + border: 1px solid #eaeaea; + background: #eaeaea; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 53, ../../../hub/static/css/mod/team-card.scss */ +.member .members li { + float: left; +} +/* line 55, ../../../hub/static/css/mod/team-card.scss */ +.member .members li a { + display: block; + width: 26px; + height: 26px; + overflow: hidden; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 65, ../../../hub/static/css/mod/team-card.scss */ +.member .members li a img { + width: 26px; + height: 26px; +} + +/* line 73, ../../../hub/static/css/mod/team-card.scss */ +.cf { + zoom: 1; +} +/* line 75, ../../../hub/static/css/mod/team-card.scss */ +.cf:before { + content: ""; + display: table; +} +/* line 79, ../../../hub/static/css/mod/team-card.scss */ +.cf .cf:after { + clear: both; + content: ""; + display: table; +} + +/* line 8, ../../../hub/static/css/mod/text-truncate.scss */ +.css-truncate.css-truncate-target, .css-truncate .css-truncate-target { + max-width: 125px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + vertical-align: top; + display: inline-block; +} + +/* line 14, ../../../hub/static/css/mod/text-truncate.scss */ +.css-truncate.expandable:hover .css-truncate-target { + max-width: 10000px !important; +} + +/* line 2, ../../../hub/static/css/mod/navbar-search.scss */ +.navbar-search i { + color: #63b6ae; + padding-right: 4px; +} + +/* line 4, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar { + background: #fff; + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); + margin-bottom: 20px; +} +/* line 9, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar .nav { + margin: 0px; + -moz-border-radius: 0px; + -webkit-border-radius: 0px; + border-radius: 0px; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} +/* line 15, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar .issue-tags { + -moz-border-radius: 0px; + -webkit-border-radius: 0px; + border-radius: 0px; +} +/* line 19, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar > *:first-child { + -moz-border-radius-topleft: 3px; + -webkit-border-top-left-radius: 3px; + border-top-left-radius: 3px; + -moz-border-radius-topright: 3px; + -webkit-border-top-right-radius: 3px; + border-top-right-radius: 3px; +} +/* line 24, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar > *:last-child { + -moz-border-radius-bottomleft: 3px; + -webkit-border-bottom-left-radius: 3px; + border-bottom-left-radius: 3px; + -moz-border-radius-bottomright: 3px; + -webkit-border-bottom-right-radius: 3px; + border-bottom-right-radius: 3px; +} +/* line 29, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar .rule { + clear: both; + height: 0px; + padding: 0; + margin: 0; + overflow: hidden; + border: none; + background: transparent; + border-bottom: 3px solid rgba(99, 182, 174, 0.2); +} +/* line 40, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar .label { + margin: 2px 0px; +} +/* line 42, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar .label a { + color: #63b6ae; + text-decoration: none; +} +/* line 45, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar .label a:hover { + background: #63b6ae; + color: white; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; +} +/* line 54, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar .well { + margin-bottom: 0; + overflow: hidden; +} + +/* line 1, ../../../hub/static/css/mod/pagination.scss */ +.pagination { + display: block; + margin: 7px 0; + overflow: hidden; +} +/* line 5, ../../../hub/static/css/mod/pagination.scss */ +.pagination a { + padding: 8px; + width: 100%; + text-align: center; + line-height: 1.4; +} +/* line 11, ../../../hub/static/css/mod/pagination.scss */ +.pagination a, .pagination span { + float: left; + margin: 0; + color: #777; + font-size: 13px; + text-decoration: none; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #DADADA; +} +/* line 23, ../../../hub/static/css/mod/pagination.scss */ +.pagination ul li a { + width: 20px; +} +/* line 29, ../../../hub/static/css/mod/pagination.scss */ +.pagination ul .disabled a { + background-color: #fff; +} + +/* line 3, ../../../hub/static/css/mod/issues-list.scss */ +.new-issue { + float: left; +} + +/* line 7, ../../../hub/static/css/mod/issues-list.scss */ +.sortby-issues { + float: right; +} + +/* line 11, ../../../hub/static/css/mod/issues-list.scss */ +.issues-topbar { + overflow: hidden; + display: block; +} + +/* line 16, ../../../hub/static/css/mod/issues-list.scss */ +.issue-list { + background: white; + margin-bottom: 20px; + border-bottom: 1px solid #eaeaea; +} +/* line 21, ../../../hub/static/css/mod/issues-list.scss */ +.issue-list > :first-child { + margin-top: 0px; +} +/* line 25, ../../../hub/static/css/mod/issues-list.scss */ +.issue-list .issue-item { + padding: 15px; + border-bottom: 1px solid #eaeaea; +} +/* line 29, ../../../hub/static/css/mod/issues-list.scss */ +.issue-list .issue-item h3 { + font-size: 16px; + font-weight: 400; + overflow: hidden; + word-break: break-all; + margin: 0; +} +/* line 36, ../../../hub/static/css/mod/issues-list.scss */ +.issue-list .issue-item h3 a { + color: #273338; +} +/* line 42, ../../../hub/static/css/mod/issues-list.scss */ +.issue-list .issue-item p a { + color: #999; +} +/* line 51, ../../../hub/static/css/mod/issues-list.scss */ +.issue-list .issue-item .meta { + margin-top: 20px; +} +/* line 55, ../../../hub/static/css/mod/issues-list.scss */ +.issue-list a.comment-count, +.issue-list a.comment-count:link, +.issue-list span.issue-info { + color: #bbb; +} +/* line 61, ../../../hub/static/css/mod/issues-list.scss */ +.issue-list .rule { + clear: both; + height: 0px; + padding: 0; + overflow: hidden; + background: transparent; +} diff --git a/dist/css/app/my-pullrequests.css b/dist/css/app/my-pullrequests.css new file mode 100644 index 0000000..fb326ba --- /dev/null +++ b/dist/css/app/my-pullrequests.css @@ -0,0 +1,5628 @@ +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* line 1, ../../../hub/static/css/mod/my-pull-requests-tab.scss */ +ul.filter-list .filter-item { + border-radius: 3px 3px 3px 3px; + color: #777777; + display: block; + font-size: 14px; + margin: 0 0 5px; + overflow: hidden; + padding: 8px 10px; + text-decoration: none; + text-overflow: ellipsis; + white-space: nowrap; +} +/* line 12, ../../../hub/static/css/mod/my-pull-requests-tab.scss */ +ul.filter-list .filter-item:hover { + background: none repeat scroll 0 0 #EEEEEE; +} +/* line 15, ../../../hub/static/css/mod/my-pull-requests-tab.scss */ +ul.filter-list .filter-item.selected { + background: none repeat scroll 0 0 #4183C4; + color: #FFFFFF; +} +/* line 19, ../../../hub/static/css/mod/my-pull-requests-tab.scss */ +ul.filter-list .filter-item .count { + float: right; + font-weight: bold; +} + +/* line 25, ../../../hub/static/css/mod/my-pull-requests-tab.scss */ +.my-pull-requests-tab { + margin-top: 27px; +} + +/* line 1, ../../../hub/static/css/mod/filter-tabs.scss */ +.list-browser-filter-tabs { + display: block; + float: left; + padding: 5px 5px 0; + overflow: hidden; +} +/* line 6, ../../../hub/static/css/mod/filter-tabs.scss */ +.list-browser-filter-tabs .filter-tab { + display: inline-block; + padding: 0 8px; + height: 24px; + line-height: 24px; + font-size: 12px; + font-weight: bold; + color: #888; + -webkit-font-smoothing: antialiased; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.3); + text-decoration: none; + border: 1px solid #CCC; + border-bottom: 0; + border-radius: 3px 3px 0 0; + background: rgba(255, 255, 255, 0.2); + cursor: pointer; +} +/* line 23, ../../../hub/static/css/mod/filter-tabs.scss */ +.list-browser-filter-tabs .selected { + color: #333; + background: white; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + border-color: #B4B4B4; + border-bottom: 1px solid white; +} + +/* line 1, ../../../hub/static/css/mod/pagination.scss */ +.pagination { + display: block; + margin: 7px 0; + overflow: hidden; +} +/* line 5, ../../../hub/static/css/mod/pagination.scss */ +.pagination a { + padding: 8px; + width: 100%; + text-align: center; + line-height: 1.4; +} +/* line 11, ../../../hub/static/css/mod/pagination.scss */ +.pagination a, .pagination span { + float: left; + margin: 0; + color: #777; + font-size: 13px; + text-decoration: none; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #DADADA; +} +/* line 23, ../../../hub/static/css/mod/pagination.scss */ +.pagination ul li a { + width: 20px; +} +/* line 29, ../../../hub/static/css/mod/pagination.scss */ +.pagination ul .disabled a { + background-color: #fff; +} + +/* line 4, ../../../hub/static/css/mod/pullrequest-list.scss */ +.pulls { + margin: 20px 0; +} +/* line 6, ../../../hub/static/css/mod/pullrequest-list.scss */ +.pulls h2 { + font-size: 16px; + font-weight: bold; + margin: 0; +} + +/* line 13, ../../../hub/static/css/mod/pullrequest-list.scss */ +.row.pulls .mod p { + word-wrap: break-word; +} + +/* line 17, ../../../hub/static/css/mod/pullrequest-list.scss */ +.pulls-list { + word-break: break-all; +} +/* line 19, ../../../hub/static/css/mod/pullrequest-list.scss */ +.pulls-list h3 { + margin: 0; + font-size: 14px; + line-height: 1.3; +} +/* line 23, ../../../hub/static/css/mod/pullrequest-list.scss */ +.pulls-list h3 a { + color: #333; +} +/* line 27, ../../../hub/static/css/mod/pullrequest-list.scss */ +.pulls-list .list-browser-item { + position: relative; + padding: 10px; + border-bottom: 1px solid #EAEAEA; +} +/* line 32, ../../../hub/static/css/mod/pullrequest-list.scss */ +.pulls-list .meta { + float: left; + margin-top: 4px; + margin-bottom: -2px; + height: 16px; + padding: 4px 6px; + font-size: 11px; + color: rgba(0, 0, 0, 0.55); + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.5); + background: rgba(0, 0, 0, 0.07); + border-radius: 3px; +} +/* line 44, ../../../hub/static/css/mod/pullrequest-list.scss */ +.pulls-list p a { + color: #555; + text-decoration: none; +} + +/* line 50, ../../../hub/static/css/mod/pullrequest-list.scss */ +.chromed-list-browser { + border-color: #D5D5D5; + position: relative; + border: 1px solid #DDD; + border-radius: 5px; +} +/* line 55, ../../../hub/static/css/mod/pullrequest-list.scss */ +.chromed-list-browser .pagination { + float: right; + margin: 7px; + font-weight: bold; + height: 26px; +} +/* line 60, ../../../hub/static/css/mod/pullrequest-list.scss */ +.chromed-list-browser .pagination a { + padding: 4px; + font-size: 11px; + color: #4183C4; + width: auto; +} +/* line 66, ../../../hub/static/css/mod/pullrequest-list.scss */ +.chromed-list-browser .pagination span { + padding: 4px; + font-size: 11px; + color: #4183C4; +} +/* line 72, ../../../hub/static/css/mod/pullrequest-list.scss */ +.chromed-list-browser .none, .chromed-list-browser .error { + padding: 10px; + border-bottom: 1px solid #DDD; +} +/* line 75, ../../../hub/static/css/mod/pullrequest-list.scss */ +.chromed-list-browser .none p, .chromed-list-browser .error p { + margin: 0; + padding: 20px; + border-radius: 3px; + text-align: center; + font-weight: bold; + font-size: 14px; + color: #999; + background: #F3F3F3; + -webkit-font-smoothing: antialiased; +} + +/* line 91, ../../../hub/static/css/mod/pullrequest-list.scss */ +.list-browser-item .list-browser-bottom-right-info { + position: absolute; + bottom: 3px; + right: 5px; +} +/* line 96, ../../../hub/static/css/mod/pullrequest-list.scss */ +.list-browser-item .list-browser-bottom-right-item { + padding-left: 18px; + font-size: 11px; + font-weight: bold; + color: #999; +} +/* line 101, ../../../hub/static/css/mod/pullrequest-list.scss */ +.list-browser-item .list-browser-bottom-right-item a { + color: #666; +} + +/* line 107, ../../../hub/static/css/mod/pullrequest-list.scss */ +.list-browser-filterbar { + font-family: "Helvetica Neue", Helvetica, Arial, freesans; + border-radius: 5px 5px 0 0; + height: 31px; + background-color: #CACACA; + background-image: -moz-linear-gradient(#EFEFEF, #CACACA); + background-image: -webkit-linear-gradient(#EFEFEF, #CACACA); + background-image: linear-gradient(#EFEFEF, #CACACA); + background-repeat: repeat-x; + border-bottom: 1px solid #B4B4B4; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +/* line 117, ../../../hub/static/css/mod/pullrequest-list.scss */ +.list-browser-filterbar li { + list-style-type: none; + display: inline; +} + +/* line 123, ../../../hub/static/css/mod/pullrequest-list.scss */ +.list-browser-footer { + font-size: 11px; + font-weight: bold; + color: #777; + overflow: hidden; + min-height: 15px; + background: #F6F6F6; + border-radius: 0 0 5px 5px; +} +/* line 131, ../../../hub/static/css/mod/pullrequest-list.scss */ +.list-browser-footer .pagination { + margin: 5px; +} diff --git a/dist/css/app/my-settings.css b/dist/css/app/my-settings.css new file mode 100644 index 0000000..b14b668 --- /dev/null +++ b/dist/css/app/my-settings.css @@ -0,0 +1,5603 @@ +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* line 1, ../../../hub/static/css/mod/setting-box.scss */ +.boxed-group { + position: relative; + background: #EFEFEF; + padding: 3px; + border-radius: 3px; + margin: 0 0 15px 0; +} + +/* line 8, ../../../hub/static/css/mod/setting-box.scss */ +.boxed-group > h3 { + background: #FAFAFA; + background: -moz-linear-gradient(#FAFAFA, #E0E0E0); + background: -webkit-linear-gradient(#FAFAFA, #E0E0E0); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#e0e0e0')"; + margin: 0; + border-top-left-radius: 1px; + border-top-right-radius: 1px; + border: 1px solid #D8D8D8; + border-bottom: 1px solid #CCC; + padding: 10px 10px 11px 10px; + font-size: 14px; + text-shadow: 0 1px 0 white; +} + +/* line 22, ../../../hub/static/css/mod/setting-box.scss */ +.boxed-group .boxed-group-inner { + padding: 1px 10px; + background: white; + border: 1px solid #D8D8D8; + border-top: none; + border-bottom-left-radius: 1px; + border-bottom-right-radius: 1px; + color: #666; + font-size: 13px; +} + +/* line 32, ../../../hub/static/css/mod/setting-box.scss */ +.boxed-group.condensed > h3 { + padding: 6px 6px 7px; + font-size: 12px; +} + +/* line 36, ../../../hub/static/css/mod/setting-box.scss */ +.boxed-group.condensed > h3 i { + position: relative; + padding: 0 6px 0 2px; +} + +/* line 40, ../../../hub/static/css/mod/setting-box.scss */ +.boxed-group.condensed .boxed-group-inner { + font-size: 12px; + padding: 0; +} + +/* line 45, ../../../hub/static/css/mod/setting-box.scss */ +.boxed-group-list > li { + display: block; + margin-left: -10px; + width: 100%; + padding: 5px 10px; + line-height: 23px; + border-bottom: 1px solid #E5E5E5; +} + +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* line 1, ../../../hub/static/css/mod/email.scss */ +span.email-actions { + float: right; +} + +/* line 2, ../../../hub/static/css/mod/email.scss */ +.new-email-form input#email { + padding: 6px; + margin: 2px 2px 2px 0px; +} + +/* line 3, ../../../hub/static/css/mod/email.scss */ +.new-email-form dd { + margin-left: 0px; +} + +/* line 1, ../../../hub/static/css/mod/github.scss */ +span.github-actions { + float: right; +} + +/* line 2, ../../../hub/static/css/mod/github.scss */ +.new-github-form input#github { + padding: 6px; + margin: 2px 2px 2px 0px; +} + +/* line 3, ../../../hub/static/css/mod/github.scss */ +.new-github-form dd { + margin-left: 0px; +} + +/* line 1, ../../../hub/static/css/mod/notification.scss */ +#settings-notifications h4 { + margin: 15px 0 5px 0; + font-size: 14px; + color: black; +} + +/* line 2, ../../../hub/static/css/mod/notification.scss */ +.user-mention { + font-weight: bold; + color: #333; +} + +/* line 3, ../../../hub/static/css/mod/notification.scss */ +#settings-notifications ul.compact-options { + margin: -6px 0 13px 0; +} + +/* line 4, ../../../hub/static/css/mod/notification.scss */ +#settings-notifications ul.compact-options li { + margin: 0 15px 0 0; + list-style-type: none; + font-weight: bold; +} + +/* line 5, ../../../hub/static/css/mod/notification.scss */ +.horizontal_line { + margin: 10px 0 10px -10px; + padding: 0 10px; + width: 100%; +} + +/* line 1, ../../../hub/static/css/mod/checkbox.scss */ +.checkbox-container { + display: inline-block; +} + +/* line 5, ../../../hub/static/css/mod/checkbox.scss */ +.checkbox-container input[type=checkbox] { + vertical-align: middle; +} + +/* line 9, ../../../hub/static/css/mod/checkbox.scss */ +.checkbox-container label { + display: inline; + vertical-align: middle; + padding: 0 0 0 5px; +} + +/* line 15, ../../../hub/static/css/mod/checkbox.scss */ +.checkbox-container label span { + margin: 0 0 0 5px; +} + +/* line 9, ../../../hub/static/css/app/my-settings.scss */ +.settings-content { + width: 60%; +} diff --git a/dist/css/app/newsfeed.css b/dist/css/app/newsfeed.css new file mode 100644 index 0000000..7a55fdc --- /dev/null +++ b/dist/css/app/newsfeed.css @@ -0,0 +1,5796 @@ +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* line 1, ../../../hub/static/css/mod/user-card.scss */ +.user-card { + position: absolute; + padding: 3px 5px 5px; + min-height: 68px; + width: 210px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +/* line 2, ../../../hub/static/css/mod/user-card.scss */ +.user-card .desc { + margin-left: 3px; +} + +/* line 3, ../../../hub/static/css/mod/user-card.scss */ +.user-card .avatar-wrap { + width: 46px; + height: 36px; + float: left; + margin-right: 6px; + border-right: 1px solid #BEBEBE; +} + +/* line 4, ../../../hub/static/css/mod/user-card.scss */ +.user-card .badge-item { + float: left; + width: 30px; + height: 30px; + border: none; + padding: 2px; + background-color: white; + line-height: 0; + margin-right: 0.7em; +} + +/* line 5, ../../../hub/static/css/mod/user-card.scss */ +.user-card .title { + padding: 0 0 0.25em 0; +} + +/* line 6, ../../../hub/static/css/mod/user-card.scss */ +.user-card .desc .avatar { + float: left; + width: 30px; + height: 30px; + padding: 2px; + background-color: white; + line-height: 0; + margin-right: 0.7em; +} + +/* line 1, ../../../hub/static/css/mod/team-card.scss */ +.team-card { + position: absolute; + padding: 6px 10px; + min-height: 68px; + width: 236px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + overflow: hidden; +} +/* line 10, ../../../hub/static/css/mod/team-card.scss */ +.team-card .pic { + float: right; + max-height: 50px; + margin: 6px 0 0 10px; +} +/* line 15, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content { + word-wrap: break-word; +} +/* line 17, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .title { + margin: 6px 0; + font-size: 15px; + overflow: hidden; + white-space: nowrap; +} +/* line 23, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .info { + position: relative; + margin-top: 10px; + font-size: 13px; +} +/* line 27, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .info .desc { + white-space: nowrap; + overflow: hidden; +} + +/* line 35, ../../../hub/static/css/mod/team-card.scss */ +.member { + border-top: solid 1px #eaeaea; + padding-top: 8px; + height: 26px; +} +/* line 39, ../../../hub/static/css/mod/team-card.scss */ +.member .more-members { + float: right; + width: 24px; + height: 24px; + line-height: 26px; + text-align: center; + border: 1px solid #eaeaea; + background: #eaeaea; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 53, ../../../hub/static/css/mod/team-card.scss */ +.member .members li { + float: left; +} +/* line 55, ../../../hub/static/css/mod/team-card.scss */ +.member .members li a { + display: block; + width: 26px; + height: 26px; + overflow: hidden; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 65, ../../../hub/static/css/mod/team-card.scss */ +.member .members li a img { + width: 26px; + height: 26px; +} + +/* line 73, ../../../hub/static/css/mod/team-card.scss */ +.cf { + zoom: 1; +} +/* line 75, ../../../hub/static/css/mod/team-card.scss */ +.cf:before { + content: ""; + display: table; +} +/* line 79, ../../../hub/static/css/mod/team-card.scss */ +.cf .cf:after { + clear: both; + content: ""; + display: table; +} + +/* Timeline */ +@media (max-width: 767px) { + /* line 6, ../../../hub/static/css/mod/timeline.scss */ + .timeline { + padding: 10px; + } +} +/* line 9, ../../../hub/static/css/mod/timeline.scss */ +.timeline { + margin-top: 0px; + word-wrap: break-word; + word-break: normal; +} +/* line 14, ../../../hub/static/css/mod/timeline.scss */ +.timeline li { + position: relative; + list-style: none; + clear: both; + background: white; + padding: 10px 20px 10px 32px; + margin: 0 0 0px; + border-bottom: 1px solid #eaeaea; +} +/* line 23, ../../../hub/static/css/mod/timeline.scss */ +.timeline li .title { + margin-bottom: 0.5em; +} +/* line 25, ../../../hub/static/css/mod/timeline.scss */ +.timeline li .title i { + position: absolute; + left: 5px; + padding: 2px 5px 0; + color: #999; + font-size: 10px; +} +/* line 35, ../../../hub/static/css/mod/timeline.scss */ +.timeline .time { + float: right; + color: #ccc; + font-size: 12px; +} +/* line 41, ../../../hub/static/css/mod/timeline.scss */ +.timeline code { + white-space: normal; +} + +/* line 46, ../../../hub/static/css/mod/timeline.scss */ +.timeline .padding { + height: 2em; + font-weight: bold; +} + +/* line 50, ../../../hub/static/css/mod/timeline.scss */ +.timeline .more_items { + margin-left: 10px; + font-weight: bold; +} + +/* line 54, ../../../hub/static/css/mod/timeline.scss */ +.timeline .time { + color: #bbb; +} + +/* line 57, ../../../hub/static/css/mod/timeline.scss */ +.timeline .desc { + padding: 0 0 1em 0; + color: #666; + word-wrap: break-word; +} + +/* line 62, ../../../hub/static/css/mod/timeline.scss */ +.timeline .desc .right_side { + float: right; + margin-right: 30px; +} + +/* line 67, ../../../hub/static/css/mod/timeline.scss */ +.timeline .pagination { + display: none; + background: #63b6ae; +} + +/* line 71, ../../../hub/static/css/mod/timeline.scss */ +.pagination { + display: block; + margin: 7px 0; + overflow: hidden; + border: 1px solid #EAEAEA; + border-bottom-color: #CACACA; + border-top: none; + border-bottom: none; + border-radius: 3px; + background-image: -webkit-linear-gradient(top, white, #EFEFEF); +} + +/* line 82, ../../../hub/static/css/mod/timeline.scss */ +.timeline .pagination a { + color: white; +} + +/* line 85, ../../../hub/static/css/mod/timeline.scss */ +.pagination a { + padding: 8px; + width: 100%; + text-align: center; + line-height: 1.4; +} + +/* line 91, ../../../hub/static/css/mod/timeline.scss */ +.pagination a:last-child, .pagination span:last-child { + border-right: none; + border-bottom-right-radius: 3px; +} + +/* line 95, ../../../hub/static/css/mod/timeline.scss */ +.pagination a:first-child, .pagination span:first-child { + border-left: none; + border-bottom-left-radius: 3px; +} + +/* line 99, ../../../hub/static/css/mod/timeline.scss */ +.pagination a, .pagination span { + float: left; + margin: 0; + color: #777; + font-size: 13px; + text-decoration: none; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #DADADA; +} + +/* line 108, ../../../hub/static/css/mod/timeline.scss */ +.timeline .loader img { + display: block; + width: 16px; + height: 16px; + margin: 0 auto; + position: relative; +} + +/* Timeline */ +@media (max-width: 767px) { + /* line 4, ../../../hub/static/css/mod/rightside.scss */ + .rightside { + padding: 10px; + } +} +/* line 7, ../../../hub/static/css/mod/rightside.scss */ +.rightside { + margin-top: 0px; + word-wrap: break-word; + word-break: normal; + margin-bottom: 20px; +} +/* line 12, ../../../hub/static/css/mod/rightside.scss */ +.rightside li { + position: relative; + list-style: none; + clear: both; + background: white; + padding: 1px 15px 10px 10px; + margin: 0 0 0px; + border-bottom: 1px solid #eaeaea; +} +/* line 21, ../../../hub/static/css/mod/rightside.scss */ +.rightside li .title { + margin-bottom: 0.5em; +} +/* line 23, ../../../hub/static/css/mod/rightside.scss */ +.rightside li .title i { + position: absolute; + left: 5px; + padding: 2px 5px 0; + color: #999; + font-size: 10px; +} +/* line 33, ../../../hub/static/css/mod/rightside.scss */ +.rightside .time { + float: right; + color: #ccc; + font-size: 12px; +} + +/* line 40, ../../../hub/static/css/mod/rightside.scss */ +.rightside .padding { + height: 2em; + font-weight: bold; +} + +/* line 45, ../../../hub/static/css/mod/rightside.scss */ +.rightside .more_items { + margin-left: 10px; + font-weight: bold; +} + +/* line 50, ../../../hub/static/css/mod/rightside.scss */ +.rightside .time { + color: #bbb; +} + +/* line 52, ../../../hub/static/css/mod/rightside.scss */ +.rightside .desc { + padding: 0 0 1em 0; + color: #666; + word-wrap: break-word; +} + +/* line 58, ../../../hub/static/css/mod/rightside.scss */ +.rightside .desc .right_side { + float: right; + margin-right: 30px; +} + +/* line 63, ../../../hub/static/css/mod/rightside.scss */ +div.right-tittle { + color: gray; + background: rgba(99, 182, 174, 0.2); + text-align: center; + padding-top: 6px; + padding-bottom: 6px; + font-size: 14px; + font-weight: bold; +} + +/* line 8, ../../../hub/static/css/mod/text-truncate.scss */ +.css-truncate.css-truncate-target, .css-truncate .css-truncate-target { + max-width: 125px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + vertical-align: top; + display: inline-block; +} + +/* line 14, ../../../hub/static/css/mod/text-truncate.scss */ +.css-truncate.expandable:hover .css-truncate-target { + max-width: 10000px !important; +} + +/* line 3, ../../../hub/static/css/mod/my-projects.scss */ +.my_projects { + margin-top: 5px; +} +/* line 4, ../../../hub/static/css/mod/my-projects.scss */ +.my_projects a.right { + float: right; +} +/* line 8, ../../../hub/static/css/mod/my-projects.scss */ +.my_projects li { + max-width: 300px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +/* line 12, ../../../hub/static/css/mod/my-projects.scss */ +.my_projects li .delete-btn { + display: none; +} +/* line 16, ../../../hub/static/css/mod/my-projects.scss */ +.my_projects li.hover .delete-btn { + display: block; +} + +/* line 23, ../../../hub/static/css/mod/my-projects.scss */ +.my_projects .delete-btn { + padding: 0 6px 0 6px; +} diff --git a/dist/css/app/notifications.css b/dist/css/app/notifications.css new file mode 100644 index 0000000..1241738 --- /dev/null +++ b/dist/css/app/notifications.css @@ -0,0 +1,5627 @@ +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(to bottom, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +@media (max-width: 767px) { + /* line 7, ../../../hub/static/css/app/notifications.scss */ + .notif-list { + padding: 10px; + } +} +/* line 10, ../../../hub/static/css/app/notifications.scss */ +.mark-all-as-read { + margin-left: 10px; + float: right; +} + +/* line 15, ../../../hub/static/css/app/notifications.scss */ +.notif-sidebar { + margin-bottom: 20px; +} +/* line 18, ../../../hub/static/css/app/notifications.scss */ +.notif-sidebar .rule { + clear: both; + height: 0px; + padding: 0; + margin: 0; + overflow: hidden; + border: none; + background: transparent; + border-bottom: 3px solid rgba(99, 182, 174, 0.2); +} +/* line 30, ../../../hub/static/css/app/notifications.scss */ +.notif-sidebar .target-list { + background: #fff; + font-size: 12px; +} + +/* line 36, ../../../hub/static/css/app/notifications.scss */ +.notif-list { + margin-top: 0px; + word-wrap: break-word; + word-break: normal; +} +/* line 41, ../../../hub/static/css/app/notifications.scss */ +.notif-list form { + margin: 0; +} +/* line 45, ../../../hub/static/css/app/notifications.scss */ +.notif-list .title > a:hover { + text-decoration: none; +} +/* line 49, ../../../hub/static/css/app/notifications.scss */ +.notif-list .unread { + background-color: #EAF2F5 !important; + border-radius: 3px; +} +/* line 54, ../../../hub/static/css/app/notifications.scss */ +.notif-list .notif-item { + margin: 0 0 20px 0; + background: #fff; + -moz-box-shadow: 1px 1px 5px 0.8px rgba(0, 0, 0, 0.3); + -webkit-box-shadow: 1px 1px 5px 0.8px rgba(0, 0, 0, 0.3); + box-shadow: 1px 1px 5px 0.8px rgba(0, 0, 0, 0.3); +} +/* line 59, ../../../hub/static/css/app/notifications.scss */ +.notif-list .notif-item .item-header { + background: rgba(99, 182, 174, 0.6); +} +/* line 62, ../../../hub/static/css/app/notifications.scss */ +.notif-list .notif-item .item-header .mark-item { + float: right; +} +/* line 65, ../../../hub/static/css/app/notifications.scss */ +.notif-list .notif-item .item-header .mark-item button { + padding: 8px; + background-color: transparent; + color: #555; + border: solid #d5d5d5; + border-width: 0 1px; + box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.5); +} +/* line 75, ../../../hub/static/css/app/notifications.scss */ +.notif-list .notif-item .item-header .title { + font-size: 14px; + padding: 8px 16px; +} +/* line 81, ../../../hub/static/css/app/notifications.scss */ +.notif-list .notif-item .item-body .entry { + padding: 10px; + border-bottom: 1px solid #eee; +} +/* line 85, ../../../hub/static/css/app/notifications.scss */ +.notif-list .notif-item .item-body .entry .entry-title { + padding: 0 10px; +} +/* line 88, ../../../hub/static/css/app/notifications.scss */ +.notif-list .notif-item .item-body .entry .entry-title .title { + margin-right: 100px; + font-size: 15px; + cursor: pointer; +} +/* line 93, ../../../hub/static/css/app/notifications.scss */ +.notif-list .notif-item .item-body .entry .entry-title .title i { + margin-right: 10px; +} +/* line 97, ../../../hub/static/css/app/notifications.scss */ +.notif-list .notif-item .item-body .entry .entry-title .title .label { + text-shadow: none; + margin-left: 5px; +} +/* line 103, ../../../hub/static/css/app/notifications.scss */ +.notif-list .notif-item .item-body .entry .entry-title .entry-actions { + float: right; + margin: 0; + padding: 5px; +} +/* line 108, ../../../hub/static/css/app/notifications.scss */ +.notif-list .notif-item .item-body .entry .entry-title .entry-actions li { + float: right; + margin-left: 10px; +} +/* line 112, ../../../hub/static/css/app/notifications.scss */ +.notif-list .notif-item .item-body .entry .entry-title .entry-actions li button { + background-color: transparent; + color: #999999; + border: none; + padding: 0; +} +/* line 123, ../../../hub/static/css/app/notifications.scss */ +.notif-list .notif-item .item-body .entry .entry-body > :last-child { + border-bottom: none !important; +} +/* line 127, ../../../hub/static/css/app/notifications.scss */ +.notif-list .notif-item .item-body .entry .entry-body .entry-item { + position: relative; + clear: both; + padding: 10px 20px 10px 32px; + border-bottom: 1px solid #eaeaea; +} +/* line 134, ../../../hub/static/css/app/notifications.scss */ +.notif-list .notif-item .item-body .entry .entry-body .entry-item .title { + margin-bottom: 0.5em; +} +/* line 136, ../../../hub/static/css/app/notifications.scss */ +.notif-list .notif-item .item-body .entry .entry-body .entry-item .title i { + position: absolute; + left: 5px; + padding: 2px 5px 0; + color: #999; + font-size: 10px; +} +/* line 143, ../../../hub/static/css/app/notifications.scss */ +.notif-list .notif-item .item-body .entry .entry-body .entry-item .title .time { + float: right; + color: #bbb; + font-size: 12px; +} +/* line 156, ../../../hub/static/css/app/notifications.scss */ +.notif-list .padding { + height: 2em; + font-weight: bold; +} +/* line 157, ../../../hub/static/css/app/notifications.scss */ +.notif-list .desc { + color: #666; + word-wrap: break-word; +} +/* line 158, ../../../hub/static/css/app/notifications.scss */ +.notif-list .desc .right_side { + float: right; + margin-right: 30px; +} + +/* // TODO: pagination +.timeline .pagination { display:none; background: rgba(99, 182, 174, 1);} +.pagination { display:block; margin:7px 0; overflow:hidden; border:1px solid #EAEAEA; border-bottom-color:#CACACA; border-top:none; border-bottom:none; border-radius: 3px; background-image: -webkit-linear-gradient(top, white, #EFEFEF); } +.timeline .pagination a {color: rgba(255,255,255,1);} +.pagination a { padding:8px; width:100%; text-align:center; line-height: 1.4; } +.pagination a:last-child, .pagination span:last-child { border-right:none; border-bottom-right-radius:3px; } +.pagination a:first-child, .pagination span:first-child { border-left:none; border-bottom-left-radius:3px; } +.pagination a, .pagination span { float:left; margin:0; color:#777; font-size:13px; text-decoration:none; text-shadow:0 1px 0 white; border-bottom:1px solid #DADADA; } +.timeline .loader img{display:block; width:16px; height:16px; margin:0 auto; position: relative; } +*/ diff --git a/dist/css/app/people.css b/dist/css/app/people.css new file mode 100644 index 0000000..850c6a1 --- /dev/null +++ b/dist/css/app/people.css @@ -0,0 +1,6387 @@ +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* Echo out a label for the example */ +/* line 2, ../../../hub/static/css/mod/project-item.scss */ +.bs-docs-project:after { + content: "Proj"; +} + +/* line 6, ../../../hub/static/css/mod/project-item.scss */ +.bs-docs-fork:after { + content: "Fork"; +} + +/* line 10, ../../../hub/static/css/mod/project-item.scss */ +.project-item { + overflow: hidden; + word-wrap: break-word; + word-break: normal; + min-height: 80px; + position: relative; + margin: 15px 0; + padding: 14px 19px 14px 49px; + *padding-top: 14px; + background-color: transparent; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +/* line 25, ../../../hub/static/css/mod/project-item.scss */ +.project-item:after { + position: absolute; + top: -1px; + left: -1px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + background-color: #f5f5f5; + border: 1px solid #ddd; + color: #9da0a4; + -webkit-border-radius: 4px 0 4px 0; + -moz-border-radius: 4px 0 4px 0; + border-radius: 4px 0 4px 0; +} +/* line 40, ../../../hub/static/css/mod/project-item.scss */ +.project-item h4.project-title { + margin: 0; +} +/* line 42, ../../../hub/static/css/mod/project-item.scss */ +.project-item h4.project-title i { + margin-top: 5px; +} +/* line 47, ../../../hub/static/css/mod/project-item.scss */ +.project-item ul.project-stats li { + float: left; + margin-left: 10px; +} +/* line 52, ../../../hub/static/css/mod/project-item.scss */ +.project-item .summary { + margin-top: 10px; +} +/* line 55, ../../../hub/static/css/mod/project-item.scss */ +.project-item .commit-graph { + position: absolute; + left: 10px; + bottom: 0; + z-index: -9999; + height: 80px; + width: 440px; +} + +/* line 1, ../../../hub/static/css/mod/team-item.scss */ +.bs-docs-team:after { + content: "Team"; +} + +/* line 4, ../../../hub/static/css/mod/team-item.scss */ +.team-item { + position: relative; + margin: 15px 0; + padding: 14px 19px 14px 49px; + *padding-top: 14px; + background-color: transparent; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +/* line 14, ../../../hub/static/css/mod/team-item.scss */ +.team-item:after { + position: absolute; + top: -1px; + left: -1px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + background-color: #f5f5f5; + border: 1px solid #ddd; + color: #9da0a4; + -webkit-border-radius: 4px 0 4px 0; + -moz-border-radius: 4px 0 4px 0; + border-radius: 4px 0 4px 0; +} +/* line 28, ../../../hub/static/css/mod/team-item.scss */ +.team-item h4.team-title { + margin: 0; +} +/* line 30, ../../../hub/static/css/mod/team-item.scss */ +.team-item h4.team-title i { + margin-top: 5px; +} +/* line 34, ../../../hub/static/css/mod/team-item.scss */ +.team-item ul.team-stats li { + float: left; + margin-left: 10px; +} +/* line 38, ../../../hub/static/css/mod/team-item.scss */ +.team-item .team-item .summary { + margin-top: 10px; +} + +/* line 43, ../../../hub/static/css/mod/team-item.scss */ +.team-user-list { + height: 26px; + margin-bottom: 1px; + list-style: none; + display: block; +} +/* line 48, ../../../hub/static/css/mod/team-item.scss */ +.team-user-list ul { + float: right; + margin-right: 10px; + margin-top: 0px; +} +/* line 53, ../../../hub/static/css/mod/team-item.scss */ +.team-user-list li { + float: left; + margin-left: 10px; + line-height: 20px; +} +/* line 57, ../../../hub/static/css/mod/team-item.scss */ +.team-user-list li a { + display: block; + width: 26px; + height: 26px; + overflow: hidden; + -webkit-border-radius: 4px; + border-radius: 4px; + text-decoration: none; +} +/* line 65, ../../../hub/static/css/mod/team-item.scss */ +.team-user-list li a img { + width: 26px; + height: 26px; +} + +/* line 1, ../../../hub/static/css/mod/user-card.scss */ +.user-card { + position: absolute; + padding: 3px 5px 5px; + min-height: 68px; + width: 210px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +/* line 2, ../../../hub/static/css/mod/user-card.scss */ +.user-card .desc { + margin-left: 3px; +} + +/* line 3, ../../../hub/static/css/mod/user-card.scss */ +.user-card .avatar-wrap { + width: 46px; + height: 36px; + float: left; + margin-right: 6px; + border-right: 1px solid #BEBEBE; +} + +/* line 4, ../../../hub/static/css/mod/user-card.scss */ +.user-card .badge-item { + float: left; + width: 30px; + height: 30px; + border: none; + padding: 2px; + background-color: white; + line-height: 0; + margin-right: 0.7em; +} + +/* line 5, ../../../hub/static/css/mod/user-card.scss */ +.user-card .title { + padding: 0 0 0.25em 0; +} + +/* line 6, ../../../hub/static/css/mod/user-card.scss */ +.user-card .desc .avatar { + float: left; + width: 30px; + height: 30px; + padding: 2px; + background-color: white; + line-height: 0; + margin-right: 0.7em; +} + +/* line 1, ../../../hub/static/css/mod/team-card.scss */ +.team-card { + position: absolute; + padding: 6px 10px; + min-height: 68px; + width: 236px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + overflow: hidden; +} +/* line 10, ../../../hub/static/css/mod/team-card.scss */ +.team-card .pic { + float: right; + max-height: 50px; + margin: 6px 0 0 10px; +} +/* line 15, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content { + word-wrap: break-word; +} +/* line 17, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .title { + margin: 6px 0; + font-size: 15px; + overflow: hidden; + white-space: nowrap; +} +/* line 23, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .info { + position: relative; + margin-top: 10px; + font-size: 13px; +} +/* line 27, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .info .desc { + white-space: nowrap; + overflow: hidden; +} + +/* line 35, ../../../hub/static/css/mod/team-card.scss */ +.member { + border-top: solid 1px #eaeaea; + padding-top: 8px; + height: 26px; +} +/* line 39, ../../../hub/static/css/mod/team-card.scss */ +.member .more-members { + float: right; + width: 24px; + height: 24px; + line-height: 26px; + text-align: center; + border: 1px solid #eaeaea; + background: #eaeaea; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 53, ../../../hub/static/css/mod/team-card.scss */ +.member .members li { + float: left; +} +/* line 55, ../../../hub/static/css/mod/team-card.scss */ +.member .members li a { + display: block; + width: 26px; + height: 26px; + overflow: hidden; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 65, ../../../hub/static/css/mod/team-card.scss */ +.member .members li a img { + width: 26px; + height: 26px; +} + +/* line 73, ../../../hub/static/css/mod/team-card.scss */ +.cf { + zoom: 1; +} +/* line 75, ../../../hub/static/css/mod/team-card.scss */ +.cf:before { + content: ""; + display: table; +} +/* line 79, ../../../hub/static/css/mod/team-card.scss */ +.cf .cf:after { + clear: both; + content: ""; + display: table; +} + +/* Timeline */ +@media (max-width: 767px) { + /* line 6, ../../../hub/static/css/mod/timeline.scss */ + .timeline { + padding: 10px; + } +} +/* line 9, ../../../hub/static/css/mod/timeline.scss */ +.timeline { + margin-top: 0px; + word-wrap: break-word; + word-break: normal; +} +/* line 14, ../../../hub/static/css/mod/timeline.scss */ +.timeline li { + position: relative; + list-style: none; + clear: both; + background: white; + padding: 10px 20px 10px 32px; + margin: 0 0 0px; + border-bottom: 1px solid #eaeaea; +} +/* line 23, ../../../hub/static/css/mod/timeline.scss */ +.timeline li .title { + margin-bottom: 0.5em; +} +/* line 25, ../../../hub/static/css/mod/timeline.scss */ +.timeline li .title i { + position: absolute; + left: 5px; + padding: 2px 5px 0; + color: #999; + font-size: 10px; +} +/* line 35, ../../../hub/static/css/mod/timeline.scss */ +.timeline .time { + float: right; + color: #ccc; + font-size: 12px; +} +/* line 41, ../../../hub/static/css/mod/timeline.scss */ +.timeline code { + white-space: normal; +} + +/* line 46, ../../../hub/static/css/mod/timeline.scss */ +.timeline .padding { + height: 2em; + font-weight: bold; +} + +/* line 50, ../../../hub/static/css/mod/timeline.scss */ +.timeline .more_items { + margin-left: 10px; + font-weight: bold; +} + +/* line 54, ../../../hub/static/css/mod/timeline.scss */ +.timeline .time { + color: #bbb; +} + +/* line 57, ../../../hub/static/css/mod/timeline.scss */ +.timeline .desc { + padding: 0 0 1em 0; + color: #666; + word-wrap: break-word; +} + +/* line 62, ../../../hub/static/css/mod/timeline.scss */ +.timeline .desc .right_side { + float: right; + margin-right: 30px; +} + +/* line 67, ../../../hub/static/css/mod/timeline.scss */ +.timeline .pagination { + display: none; + background: #63b6ae; +} + +/* line 71, ../../../hub/static/css/mod/timeline.scss */ +.pagination { + display: block; + margin: 7px 0; + overflow: hidden; + border: 1px solid #EAEAEA; + border-bottom-color: #CACACA; + border-top: none; + border-bottom: none; + border-radius: 3px; + background-image: -webkit-linear-gradient(top, white, #EFEFEF); +} + +/* line 82, ../../../hub/static/css/mod/timeline.scss */ +.timeline .pagination a { + color: white; +} + +/* line 85, ../../../hub/static/css/mod/timeline.scss */ +.pagination a { + padding: 8px; + width: 100%; + text-align: center; + line-height: 1.4; +} + +/* line 91, ../../../hub/static/css/mod/timeline.scss */ +.pagination a:last-child, .pagination span:last-child { + border-right: none; + border-bottom-right-radius: 3px; +} + +/* line 95, ../../../hub/static/css/mod/timeline.scss */ +.pagination a:first-child, .pagination span:first-child { + border-left: none; + border-bottom-left-radius: 3px; +} + +/* line 99, ../../../hub/static/css/mod/timeline.scss */ +.pagination a, .pagination span { + float: left; + margin: 0; + color: #777; + font-size: 13px; + text-decoration: none; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #DADADA; +} + +/* line 108, ../../../hub/static/css/mod/timeline.scss */ +.timeline .loader img { + display: block; + width: 16px; + height: 16px; + margin: 0 auto; + position: relative; +} + +/* line 1, ../../../hub/static/css/mod/contribution.scss */ +h3.conversation-list-heading { + margin: 25px 0 10px 0; + height: 0; + text-align: center; + font-size: 16px; + font-weight: normal; + color: #999999; + border-bottom: 1px solid #ddd; +} + +/* line 2, ../../../hub/static/css/mod/contribution.scss */ +h3.conversation-list-heading .inner { + display: inline-block; + position: relative; + top: -10px; + padding: 0 5px; + background: #fff; +} + +/* line 3, ../../../hub/static/css/mod/contribution.scss */ +h3.conversation-list-heading strong { + font-weight: bold; + color: #333333; +} + +/* line 4, ../../../hub/static/css/mod/contribution.scss */ +.simple-conversation-list > li .title .project-info { + color: #999999; +} + +/* line 1, ../../../hub/static/css/mod/praise.scss */ +.recs, .rec-paginator { + margin: 35px 87px; +} + +/* line 2, ../../../hub/static/css/mod/praise.scss */ +.recs .rec { + margin-bottom: 36px; + width: 100%; +} + +/* line 3, ../../../hub/static/css/mod/praise.scss */ +.rec blockquote { + padding-left: 1.5em; + color: #404040; + background: url(/static/img/big_quotel.png) no-repeat 0 0 transparent; + margin: 0 15px; + border: none; + font-size: 15px; +} + +/* line 4, ../../../hub/static/css/mod/praise.scss */ +.rec .to-user-info { + margin-bottom: 15px; +} + +/* line 5, ../../../hub/static/css/mod/praise.scss */ +.rec .to-user-info img { + margin: 0 7px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/praise.scss */ +.rec .from-user-info { + float: right; + display: inline-block; + font-style: italic; +} + +/* line 7, ../../../hub/static/css/mod/praise.scss */ +.rec img { + width: 32px; + height: 32px; + margin-left: 7px; +} + +/* line 8, ../../../hub/static/css/mod/praise.scss */ +.rec .vote-buttons { + float: left; + text-align: center; +} + +/* line 9, ../../../hub/static/css/mod/praise.scss */ +.rec a.rec-vote { + display: block; + position: relative; + width: 24px; + height: 24px; + opacity: 0.5; +} + +/* line 10, ../../../hub/static/css/mod/praise.scss */ +.rec a.rec-vote:hover { + opacity: 0.8; +} + +/* line 11, ../../../hub/static/css/mod/praise.scss */ +.rec a.rec-vote { + background: url("/static/img/arrow-up.png") no-repeat scroll center center transparent; +} + +/* line 12, ../../../hub/static/css/mod/praise.scss */ +.rec .vote-buttons.likes a.rec-vote, .rec .vote-buttons.voted a.rec-vote { + background: url("/static/img/arrow-up-orange.png") no-repeat scroll center center transparent; +} + +/* line 13, ../../../hub/static/css/mod/praise.scss */ +.rec .rec-score { + font-weight: bold; + font-size: 20px; + margin-top: 3px; +} + +/* line 14, ../../../hub/static/css/mod/praise.scss */ +.rec .rec-score.current { + color: #C6C6C6; + display: block; +} + +/* line 15, ../../../hub/static/css/mod/praise.scss */ +.rec .vote-buttons.likes .rec-score.current { + display: none; +} + +/* line 16, ../../../hub/static/css/mod/praise.scss */ +.rec .rec-score.likes { + display: none; + color: #FF8B60; +} + +/* line 17, ../../../hub/static/css/mod/praise.scss */ +.rec .vote-buttons.likes .rec-score.likes { + display: block; +} + +/* line 19, ../../../hub/static/css/mod/praise.scss */ +.rec .item-right { + margin-left: 32px; + padding: 12px 5px; + border-bottom: 1px solid #DDD; +} + +/* line 20, ../../../hub/static/css/mod/praise.scss */ +.rec .item-right:hover { + background: #FFF6ED; + border-bottom: 1px solid #FFF6ED; +} + +/* line 22, ../../../hub/static/css/mod/praise.scss */ +.rec-paginator { + font-size: 14px; +} + +/* line 23, ../../../hub/static/css/mod/praise.scss */ +.rec-paginator .next { + float: right; +} + +/* line 8, ../../../hub/static/css/mod/text-truncate.scss */ +.css-truncate.css-truncate-target, .css-truncate .css-truncate-target { + max-width: 125px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + vertical-align: top; + display: inline-block; +} + +/* line 14, ../../../hub/static/css/mod/text-truncate.scss */ +.css-truncate.expandable:hover .css-truncate-target { + max-width: 10000px !important; +} + +/* Cal-HeatMap CSS */ +/* line 3, ../../../hub/static/css/lib/_cal-heatmap.scss */ +.graph-browse-previous, .graph-browse-next { + padding: 5px; + background-image: linear-gradient(to bottom, white, #e6e6e6); + border: 1px solid #999; + border-radius: 3px; + line-height: 12px; + font-size: 12px; +} + +/* line 13, ../../../hub/static/css/lib/_cal-heatmap.scss */ +.graph-browse-previous:hover, .graph-browse-next:hover { + text-decoration: none; +} + +/* line 17, ../../../hub/static/css/lib/_cal-heatmap.scss */ +.graph-browse-previous { + margin-right: 5px; +} + +/* line 22, ../../../hub/static/css/lib/_cal-heatmap.scss */ +.graph { + clear: both; + display: block; + margin-top: 10px; +} + +/* line 29, ../../../hub/static/css/lib/_cal-heatmap.scss */ +.graph-label { + fill: #999; + font-size: 10px; +} + +/* line 35, ../../../hub/static/css/lib/_cal-heatmap.scss */ +.graph-rect { + fill: #ededed; + shape-rendering: crispedges; +} + +/* line 41, ../../../hub/static/css/lib/_cal-heatmap.scss */ +.graph-rect:hover { + stroke: #000; + stroke-width: 1px; +} + +/* line 47, ../../../hub/static/css/lib/_cal-heatmap.scss */ +.qi { + background-color: #999; + fill: #999; +} + +/* line 52, ../../../hub/static/css/lib/_cal-heatmap.scss */ +.q0 { + background-color: #fff; + fill: #fff; + stroke: #ededed; +} + +/* line 59, ../../../hub/static/css/lib/_cal-heatmap.scss */ +.q1 { + background-color: #dae289; + fill: #dae289; +} + +/* line 65, ../../../hub/static/css/lib/_cal-heatmap.scss */ +.q2 { + background-color: #cedb9c; + fill: #9cc069; +} + +/* line 71, ../../../hub/static/css/lib/_cal-heatmap.scss */ +.q3 { + background-color: #b5cf6b; + fill: #669d45; +} + +/* line 77, ../../../hub/static/css/lib/_cal-heatmap.scss */ +.q4 { + background-color: #637939; + fill: #637939; +} + +/* line 83, ../../../hub/static/css/lib/_cal-heatmap.scss */ +.q5 { + background-color: #3b6427; + fill: #3b6427; +} + +/* for flat-ui new people profile page */ +/* line 13, ../../../hub/static/css/app/people.scss */ +.span3, .span4 { + margin-left: 0px; +} + +/* line 18, ../../../hub/static/css/app/people.scss */ +.people-info img { + border-radius: 3px; + padding: 3px; + border: 1px solid lightgray; +} +/* line 24, ../../../hub/static/css/app/people.scss */ +.people-info .username { + font-size: 18px; + line-height: 36px; + font-weight: bold; + height: auto; + text-shadow: 1px 1px 0 white; + width: 180px; +} +/* line 33, ../../../hub/static/css/app/people.scss */ +.people-info dl > dd { + width: 170px; +} +/* line 37, ../../../hub/static/css/app/people.scss */ +.people-info .username, .people-info dl > dd { + max-width: 180px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +/* line 41, ../../../hub/static/css/app/people.scss */ +.people-info .follow-btn { + margin: 10px auto; +} +/* line 45, ../../../hub/static/css/app/people.scss */ +.people-info .contact { + border-bottom: 1px solid #eee; +} +/* line 49, ../../../hub/static/css/app/people.scss */ +.people-info .avatar-group-item { + display: inline-block; + margin-bottom: 3px; +} +/* line 52, ../../../hub/static/css/app/people.scss */ +.people-info .avatar-group-item .avatar { + display: inline-block; + vertical-align: middle; + width: 31px; + height: 31px; +} +/* line 60, ../../../hub/static/css/app/people.scss */ +.people-info .follow-stats { + margin: 15px auto; +} +/* line 64, ../../../hub/static/css/app/people.scss */ +.people-info .follow-stats ul li { + float: left; + margin: 5px 5px; +} +/* line 70, ../../../hub/static/css/app/people.scss */ +.people-info .follow-stats strong { + text-align: center; + display: block; + font-size: 26px; +} +/* line 76, ../../../hub/static/css/app/people.scss */ +.people-info .follow-stats span { + font-size: 12px; +} +/* line 81, ../../../hub/static/css/app/people.scss */ +.people-info .follow-stats a:hover { + color: #00ccbd; + text-decoration: none; +} + +/* line 90, ../../../hub/static/css/app/people.scss */ +.follow-list { + margin-bottom: 20px; +} +/* line 94, ../../../hub/static/css/app/people.scss */ +.follow-list h1 a:hover { + text-decoration: none; +} +/* line 100, ../../../hub/static/css/app/people.scss */ +.follow-list .user-list .follow-list-item { + float: left; + width: 250px; + padding-bottom: 5px; + margin-bottom: 15px; + margin-right: 20px; + border-bottom: 1px solid #ddd; + height: 100px; +} +/* line 109, ../../../hub/static/css/app/people.scss */ +.follow-list .user-list .follow-list-item .avatar { + width: 64px; + height: 64px; +} +/* line 113, ../../../hub/static/css/app/people.scss */ +.follow-list .user-list .follow-list-item .email { + margin-top: 10px; +} +/* line 117, ../../../hub/static/css/app/people.scss */ +.follow-list .user-list .follow-list-item .follow-btn { + float: right; + margin: 20px 5px; +} +/* line 120, ../../../hub/static/css/app/people.scss */ +.follow-list .user-list .follow-list-item .follow-btn a { + display: block; + width: 50px; + text-align: center; +} +/* line 128, ../../../hub/static/css/app/people.scss */ +.follow-list .user-list .follow-list-item .username { + display: inline-block; + max-width: 90px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +/* line 136, ../../../hub/static/css/app/people.scss */ +.glory { + padding: 10px 20px; +} + +/* line 138, ../../../hub/static/css/app/people.scss */ +.rec, .badge-list, .rec-num { + display: inline-block; +} + +/* line 142, ../../../hub/static/css/app/people.scss */ +.rec { + margin-right: 20px; +} + +/* fix for newer bootstrap to make it look just like old page */ +/* line 146, ../../../hub/static/css/app/people.scss */ +.dl-horizontal dt { + float: none; + width: 50px; + text-align: left; +} + +/* People Page */ +/* line 149, ../../../hub/static/css/app/people.scss */ +.add-rec { + background: url("../../static/img/recommend.png") 0 10px no-repeat; + width: 32px; + height: 36px; + opacity: 0.7; + display: inline-block; +} + +/* line 150, ../../../hub/static/css/app/people.scss */ +.add-rec:hover { + opacity: 1; +} + +/* line 151, ../../../hub/static/css/app/people.scss */ +.add-rec.mine:hover { + opacity: 0.7; +} + +/* line 153, ../../../hub/static/css/app/people.scss */ +h1.people-info img, .rec img { + vertical-align: middle; + position: relative; + top: -2px; + margin-right: 5px; + padding: 2px; + border: 1px solid #DDD; +} + +/* line 156, ../../../hub/static/css/app/people.scss */ +h1.people-info img, h1.people-info .username, +h1.people-info .follow-btn, h1.people-info .rec { + float: left; + margin-right: 12px; +} + +/* line 159, ../../../hub/static/css/app/people.scss */ +h1.people-info .rec-num { + display: inline-block; +} + +/* line 160, ../../../hub/static/css/app/people.scss */ +h1.people-info .rec-num a { + font-size: 20px; + color: #888; + text-decoration: none; +} + +/* line 161, ../../../hub/static/css/app/people.scss */ +h1.people-info .rec-num a:hover { + color: #08C; +} + +/* line 163, ../../../hub/static/css/app/people.scss */ +.right-info { + float: right; + font-size: 14px; + margin-top: 20px; +} +/* line 167, ../../../hub/static/css/app/people.scss */ +.right-info a { + color: #333; +} + +/* line 172, ../../../hub/static/css/app/people.scss */ +#add-rec-form { + margin: 0; +} +/* line 175, ../../../hub/static/css/app/people.scss */ +#add-rec-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} +/* line 189, ../../../hub/static/css/app/people.scss */ +#add-rec-form .form-actions { + padding: 0; + margin: 0; +} + +/* line 195, ../../../hub/static/css/app/people.scss */ +.form-actions { + text-align: right; + padding-bottom: 5px; + background: #fff; + border: none; +} +/* line 201, ../../../hub/static/css/app/people.scss */ +.form-actions .optional { + display: block; + padding-top: 8px; + float: left; + margin-right: 15px; + padding-top: 3px; +} +/* line 209, ../../../hub/static/css/app/people.scss */ +.form-actions .primary { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4); + border-color: #74BB5A; + border-bottom-color: #509338; + background: #8ADD6D; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#8add6d', endColorstr='#60b044')"; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); + background-image: -webkit-linear-gradient(top, #8ADD6D, #60B044); +} + +/* line 222, ../../../hub/static/css/app/people.scss */ +.rec-wnd { + position: fixed; + top: 120px; + left: 453px; + width: 360px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + padding: 5px; +} + +/* line 233, ../../../hub/static/css/app/people.scss */ +.people-activity .info { + color: #888; + margin: 15px 5px; +} + +/* line 238, ../../../hub/static/css/app/people.scss */ +.pagination { + margin-right: 100px; +} +/* line 241, ../../../hub/static/css/app/people.scss */ +.pagination a { + float: left; + padding: 6px 15px 5px; + margin: 0; + font-size: 13px; + text-decoration: none; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #DADADA; + border-top: none; + width: auto; +} + +/* line 254, ../../../hub/static/css/app/people.scss */ +img.is-new { + float: right; +} diff --git a/dist/css/app/project-create.css b/dist/css/app/project-create.css new file mode 100644 index 0000000..08093af --- /dev/null +++ b/dist/css/app/project-create.css @@ -0,0 +1,5412 @@ +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* line 3, ../../../hub/static/css/app/project-create.scss */ +#mirror { + display: none; +} + +/* line 7, ../../../hub/static/css/app/project-create.scss */ +.mirror-url { + display: none; +} + +/* line 11, ../../../hub/static/css/app/project-create.scss */ +.mirror-with-proxy { + display: none; + margin: 15px 0 5px 0; +} + +/* line 16, ../../../hub/static/css/app/project-create.scss */ +.splash { + margin: 0; + padding-top: 22px; + margin-left: 0; + width: auto; +} + +/* line 24, ../../../hub/static/css/app/project-create.scss */ +#owner img { + padding-top: 3px; + padding-left: 20px; +} + +/* line 31, ../../../hub/static/css/app/project-create.scss */ +#mirror img { + padding-top: 3px; + padding-left: 20px; +} diff --git a/dist/css/app/public-timeline.css b/dist/css/app/public-timeline.css new file mode 100644 index 0000000..c1d1271 --- /dev/null +++ b/dist/css/app/public-timeline.css @@ -0,0 +1,5668 @@ +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* line 1, ../../../hub/static/css/mod/user-card.scss */ +.user-card { + position: absolute; + padding: 3px 5px 5px; + min-height: 68px; + width: 210px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +/* line 2, ../../../hub/static/css/mod/user-card.scss */ +.user-card .desc { + margin-left: 3px; +} + +/* line 3, ../../../hub/static/css/mod/user-card.scss */ +.user-card .avatar-wrap { + width: 46px; + height: 36px; + float: left; + margin-right: 6px; + border-right: 1px solid #BEBEBE; +} + +/* line 4, ../../../hub/static/css/mod/user-card.scss */ +.user-card .badge-item { + float: left; + width: 30px; + height: 30px; + border: none; + padding: 2px; + background-color: white; + line-height: 0; + margin-right: 0.7em; +} + +/* line 5, ../../../hub/static/css/mod/user-card.scss */ +.user-card .title { + padding: 0 0 0.25em 0; +} + +/* line 6, ../../../hub/static/css/mod/user-card.scss */ +.user-card .desc .avatar { + float: left; + width: 30px; + height: 30px; + padding: 2px; + background-color: white; + line-height: 0; + margin-right: 0.7em; +} + +/* line 1, ../../../hub/static/css/mod/team-card.scss */ +.team-card { + position: absolute; + padding: 6px 10px; + min-height: 68px; + width: 236px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + overflow: hidden; +} +/* line 10, ../../../hub/static/css/mod/team-card.scss */ +.team-card .pic { + float: right; + max-height: 50px; + margin: 6px 0 0 10px; +} +/* line 15, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content { + word-wrap: break-word; +} +/* line 17, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .title { + margin: 6px 0; + font-size: 15px; + overflow: hidden; + white-space: nowrap; +} +/* line 23, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .info { + position: relative; + margin-top: 10px; + font-size: 13px; +} +/* line 27, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .info .desc { + white-space: nowrap; + overflow: hidden; +} + +/* line 35, ../../../hub/static/css/mod/team-card.scss */ +.member { + border-top: solid 1px #eaeaea; + padding-top: 8px; + height: 26px; +} +/* line 39, ../../../hub/static/css/mod/team-card.scss */ +.member .more-members { + float: right; + width: 24px; + height: 24px; + line-height: 26px; + text-align: center; + border: 1px solid #eaeaea; + background: #eaeaea; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 53, ../../../hub/static/css/mod/team-card.scss */ +.member .members li { + float: left; +} +/* line 55, ../../../hub/static/css/mod/team-card.scss */ +.member .members li a { + display: block; + width: 26px; + height: 26px; + overflow: hidden; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 65, ../../../hub/static/css/mod/team-card.scss */ +.member .members li a img { + width: 26px; + height: 26px; +} + +/* line 73, ../../../hub/static/css/mod/team-card.scss */ +.cf { + zoom: 1; +} +/* line 75, ../../../hub/static/css/mod/team-card.scss */ +.cf:before { + content: ""; + display: table; +} +/* line 79, ../../../hub/static/css/mod/team-card.scss */ +.cf .cf:after { + clear: both; + content: ""; + display: table; +} + +/* Timeline */ +@media (max-width: 767px) { + /* line 6, ../../../hub/static/css/mod/timeline.scss */ + .timeline { + padding: 10px; + } +} +/* line 9, ../../../hub/static/css/mod/timeline.scss */ +.timeline { + margin-top: 0px; + word-wrap: break-word; + word-break: normal; +} +/* line 14, ../../../hub/static/css/mod/timeline.scss */ +.timeline li { + position: relative; + list-style: none; + clear: both; + background: white; + padding: 10px 20px 10px 32px; + margin: 0 0 0px; + border-bottom: 1px solid #eaeaea; +} +/* line 23, ../../../hub/static/css/mod/timeline.scss */ +.timeline li .title { + margin-bottom: 0.5em; +} +/* line 25, ../../../hub/static/css/mod/timeline.scss */ +.timeline li .title i { + position: absolute; + left: 5px; + padding: 2px 5px 0; + color: #999; + font-size: 10px; +} +/* line 35, ../../../hub/static/css/mod/timeline.scss */ +.timeline .time { + float: right; + color: #ccc; + font-size: 12px; +} +/* line 41, ../../../hub/static/css/mod/timeline.scss */ +.timeline code { + white-space: normal; +} + +/* line 46, ../../../hub/static/css/mod/timeline.scss */ +.timeline .padding { + height: 2em; + font-weight: bold; +} + +/* line 50, ../../../hub/static/css/mod/timeline.scss */ +.timeline .more_items { + margin-left: 10px; + font-weight: bold; +} + +/* line 54, ../../../hub/static/css/mod/timeline.scss */ +.timeline .time { + color: #bbb; +} + +/* line 57, ../../../hub/static/css/mod/timeline.scss */ +.timeline .desc { + padding: 0 0 1em 0; + color: #666; + word-wrap: break-word; +} + +/* line 62, ../../../hub/static/css/mod/timeline.scss */ +.timeline .desc .right_side { + float: right; + margin-right: 30px; +} + +/* line 67, ../../../hub/static/css/mod/timeline.scss */ +.timeline .pagination { + display: none; + background: #63b6ae; +} + +/* line 71, ../../../hub/static/css/mod/timeline.scss */ +.pagination { + display: block; + margin: 7px 0; + overflow: hidden; + border: 1px solid #EAEAEA; + border-bottom-color: #CACACA; + border-top: none; + border-bottom: none; + border-radius: 3px; + background-image: -webkit-linear-gradient(top, white, #EFEFEF); +} + +/* line 82, ../../../hub/static/css/mod/timeline.scss */ +.timeline .pagination a { + color: white; +} + +/* line 85, ../../../hub/static/css/mod/timeline.scss */ +.pagination a { + padding: 8px; + width: 100%; + text-align: center; + line-height: 1.4; +} + +/* line 91, ../../../hub/static/css/mod/timeline.scss */ +.pagination a:last-child, .pagination span:last-child { + border-right: none; + border-bottom-right-radius: 3px; +} + +/* line 95, ../../../hub/static/css/mod/timeline.scss */ +.pagination a:first-child, .pagination span:first-child { + border-left: none; + border-bottom-left-radius: 3px; +} + +/* line 99, ../../../hub/static/css/mod/timeline.scss */ +.pagination a, .pagination span { + float: left; + margin: 0; + color: #777; + font-size: 13px; + text-decoration: none; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #DADADA; +} + +/* line 108, ../../../hub/static/css/mod/timeline.scss */ +.timeline .loader img { + display: block; + width: 16px; + height: 16px; + margin: 0 auto; + position: relative; +} diff --git a/dist/css/app/pull-new.css b/dist/css/app/pull-new.css new file mode 100644 index 0000000..080bd24 --- /dev/null +++ b/dist/css/app/pull-new.css @@ -0,0 +1,12012 @@ +@charset "UTF-8"; +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* TODO Refactor the following mods into components */ +/* line 1, ../../../hub/static/css/mod/pull-new.scss */ +.pull-heading .btn-change { + float: right; + margin: 9px 10px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/pull-new.scss */ +.editor-expander { + cursor: pointer; +} + +/* line 10, ../../../hub/static/css/mod/pull-new.scss */ +.pull-head { + padding: 10px; + border: 1px solid whiteSmoke; + border-top: none; + border-bottom: 2px solid #EEE; + border-radius: 5px; +} + +/* line 18, ../../../hub/static/css/mod/pull-new.scss */ +.pull-description { + font-size: 14px; + margin: 0; + color: #333; + font-weight: 300; +} + +/* line 24, ../../../hub/static/css/mod/pull-new.scss */ +.pull-description a { + font-weight: bold; + color: black; +} + +/* line 28, ../../../hub/static/css/mod/pull-new.scss */ +.pull-description .commit-ref { + margin: 0 3px; +} + +/* line 32, ../../../hub/static/css/mod/pull-new.scss */ +.commit-ref { + padding: 2px 5px; + line-height: 19px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + font-size: 12px; + font-weight: normal; + color: white; + text-shadow: -1px -1px 0 black; + text-decoration: none; + background: #787878; + background: -moz-linear-gradient(#787878, #282828); + background: -webkit-linear-gradient(#787878, #282828); + border-radius: 3px; +} + +/* line 46, ../../../hub/static/css/mod/pull-new.scss */ +.commit-ref .project { + font-weight: normal; + color: #CCC; +} + +/* line 51, ../../../hub/static/css/mod/pull-new.scss */ +.range-editor { + margin: 15px 0 20px; + background: url("http://t.douban.com/img/files/file-1363274223.gif") 50% 80px no-repeat; +} + +/* line 55, ../../../hub/static/css/mod/pull-new.scss */ +.range-editor .chooser-box { + float: left; + width: 420px; +} + +/* line 59, ../../../hub/static/css/mod/pull-new.scss */ +.range-editor .chooser-box.head { + float: right; +} + +/* line 62, ../../../hub/static/css/mod/pull-new.scss */ +.range-editor table.reposha { + margin: 15px 0 0 0; + width: 100%; +} + +/* line 66, ../../../hub/static/css/mod/pull-new.scss */ +.range-editor .commit-preview .message, +.range-editor .commit-preview p.error { + margin: 10px 0 0 0; + background: #F7F8F9; + border: 1px solid #DDD; + border-bottom: none; + border-radius: 3px; +} + +/* line 74, ../../../hub/static/css/mod/pull-new.scss */ +.range-editor .form-actions { + margin: 10px 0 0; + text-align: right; + padding-bottom: 5px; + padding: 0; + background-color: inherit; + border-top: none; +} + +/* line 83, ../../../hub/static/css/mod/pull-new.scss */ +.chooser-box { + padding: 0 10px 10px; + background: white; + background: -moz-linear-gradient(white, #F1F1F1); + background: -webkit-linear-gradient(white, #F1F1F1); + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 91, ../../../hub/static/css/mod/pull-new.scss */ +.chooser-box h3 { + margin: 0 0 0 -10px; + width: 100%; + padding: 13px 10px 10px; + font-size: 16px; + line-height: 1.2; + color: #222; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.5); + background: #FBFBFB; + background: -moz-linear-gradient(#FBFBFB, #F2F2F2); + background: -webkit-linear-gradient(#FBFBFB, #F2F2F2); + border-top-left-radius: 5px; + border-bottom: 1px solid white; +} + +/* line 105, ../../../hub/static/css/mod/pull-new.scss */ +.chooser-box .fakerule { + margin: 0 0 0 -10px; + width: 100%; + height: 1px; + padding: 0 10px; + font-size: 1px; + line-height: 1px; + background: #DDD; +} + +/* line 115, ../../../hub/static/css/mod/pull-new.scss */ +.reposha td.repo { + width: 1%; + white-space: nowrap; +} + +/* line 119, ../../../hub/static/css/mod/pull-new.scss */ +.reposha .repo .at { + padding-right: 5px; + color: #666; +} + +/* line 123, ../../../hub/static/css/mod/pull-new.scss */ +.reposha .sha { + text-align: left; +} + +/* line 126, ../../../hub/static/css/mod/pull-new.scss */ +.reposha input[type="text"] { + width: 98%; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 12px; + line-height: 20px; + color: #444; +} + +/* following commit-preview styles are also used in commits.html */ +/* line 136, ../../../hub/static/css/mod/pull-new.scss */ +.commit-preview { + margin: 10px 0 0 0; + font-size: 11px; +} + +/* line 140, ../../../hub/static/css/mod/pull-new.scss */ +.commit-preview p.name { + margin: 0; + height: 20px; + line-height: 20px; + font-size: 12px; + color: #5B6375; +} + +/* line 147, ../../../hub/static/css/mod/pull-new.scss */ +.commit-preview p.name .avatar { + float: left; + margin-right: 5px; + width: 16px; + height: 16px; + padding: 1px; + background: white; + border: 1px solid #CEDADF; +} + +/* line 156, ../../../hub/static/css/mod/pull-new.scss */ +.commit-preview p.name a { + font-weight: bold; + color: black; +} + +/* line 160, ../../../hub/static/css/mod/pull-new.scss */ +.commit-preview p.name .date { + color: #5B6375; +} + +/* line 163, ../../../hub/static/css/mod/pull-new.scss */ +.commit-preview .message, +.commit-preview p.error { + clear: both; + padding: 5px; + background: #EAF2F5; + border: 1px solid #BEDCE7; +} + +/* line 170, ../../../hub/static/css/mod/pull-new.scss */ +.commit-preview .message pre { + font-size: 11px; + color: #333; + white-space: pre-wrap; + word-wrap: break-word; + border: none; +} + +/* line 177, ../../../hub/static/css/mod/pull-new.scss */ +.commit-preview .message p.commit-id { + margin: 5px 0 0 0; + padding: 0; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + font-size: 11px; +} + +/* line 184, ../../../hub/static/css/mod/pull-new.scss */ +.new-pull-request .pull-tabs { + clear: both; +} + +/* line 188, ../../../hub/static/css/mod/pull-new.scss */ +.mini-icon-commit::before { + content: "\f01f"; +} + +/* line 191, ../../../hub/static/css/mod/pull-new.scss */ +.mini-icon-discussion::before { + content: "\f04f"; +} + +/* line 194, ../../../hub/static/css/mod/pull-new.scss */ +.mini-icon-diff::before { + content: "\f04d"; +} + +/* line 198, ../../../hub/static/css/mod/pull-new.scss */ +.pull-form { + margin: 0; +} + +/* line 201, ../../../hub/static/css/mod/pull-new.scss */ +.pull-form input[type="text"] { + font-size: 14px; + padding: 5px 5px; + margin: 0 0 5px 0; + width: 98%; + color: #444; +} + +/* line 208, ../../../hub/static/css/mod/pull-new.scss */ +.pull-form textarea { + height: 200px; +} + +/* line 211, ../../../hub/static/css/mod/pull-new.scss */ +.pull-form .preview-content { + background: white; +} + +/* line 215, ../../../hub/static/css/mod/pull-new.scss */ +.pull-form-main .form-actions { + padding: 0; + margin-top: 10px; + text-align: right; + padding-bottom: 5px; + background-color: inherit; + border-top: none; +} + +/* line 224, ../../../hub/static/css/mod/pull-new.scss */ +.pull-dest-repo a { + font-size: 12px; + font-weight: bold; + padding: 5px 0; +} + +/* line 229, ../../../hub/static/css/mod/pull-new.scss */ +.pull-dest-repo p { + font-size: 11px; + color: #999; + margin: 5px 0 15px 0; +} + +/* preview comment form style */ +/* line 2, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav { + margin: 10px 0; + border-bottom: 1px solid #DDD; + height: 35px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs { + display: inline-block; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs > li { + display: inline-block; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab { + display: inline-block; + margin-bottom: -1px; + padding: 8px 12px 9px; + border: 1px solid transparent; + border-bottom: 0; + font-size: 14px; + color: #666; + text-decoration: none; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab.selected { + border-color: #DDD; + border-radius: 3px 3px 0 0; + background-color: white; + color: #333; + font-weight: bold; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab:hover { + text-decoration: none; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav { + position: relative; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav ul.tabnav-tabs { + padding-left: 10px; +} + +/* line 10, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 0 10px 10px; +} + +/* line 11, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form #preview_bucket .content-body { + padding: 10px; + min-height: 132px; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form.tab-content { + overflow: initial; + position: relative; +} + +/* line 2, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 10px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-actions { + padding: 0; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + position: relative; + border: 3px solid #EEE; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + padding: 0; + background: #EEE; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content .write-content { + padding: 0 10px 10px; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; + margin: 0; +} + +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary, button.primary.classy:disabled, button.primary.classy.disabled, button.primary.classy:disabled:hover, button.primary.classy.disabled:disabled:hover, button.classy:disabled:hover.primary, button.classy.disabled:disabled:hover.primary { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4); + border-color: #74BB5A; + border-bottom-color: #509338; + background: #8ADD6D; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#8add6d', endColorstr='#60b044')"; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); + background-image: -webkit-linear-gradient(top, #8ADD6D, #60B044); +} + +/* line 2, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary.disabled { + opacity: 0.5; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy, +button.classy:disabled, +button.classy.disabled, +a.button.classy:disabled, +a.button.classy.disabled, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover:disabled, +a.button.classy.disabled:hover, +a.button.classy, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy:disabled:hover, +a.button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover { + display: inline-block; + padding: 8px 15px; + line-height: normal; + position: relative; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 12px; + font-weight: bold; + color: #666; + text-shadow: 0 1px rgba(255, 255, 255, 0.9); + background: whiteSmoke; + background: -moz-linear-gradient(whiteSmoke, #E5E5E5); + background: -webkit-linear-gradient(whiteSmoke, #E5E5E5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; + border-radius: 3px; + border: 1px solid #DDD; + border-bottom-color: #BBB; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* ================================== *\ + * Zen Form + * ================================== */ +/* line 6, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + position: fixed; + z-index: 99999; + top: 0; + left: 0; + right: 0; + bottom: 0; + padding: 24px 30px 24px 24px; +} + +/* line 16, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-input-wrap { + max-width: 640px; + position: relative; + margin: 0 auto; +} + +/** + * Buttons style + */ +/* line 25, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button, +.zen-forms-theme-switch { + position: absolute; + width: 18px; + height: 18px; + text-align: center; + top: 10px; + right: 10px; + font-size: 24px; + color: #516066; + cursor: pointer; + line-height: 1; +} + +/* line 39, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-theme-switch { + top: 28px; + font-size: 34px; +} + +/* line 44, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button:hover, +.zen-forms-theme-switch:hover { + color: #667981; +} + +/** + * Inputs basic style + */ +/* line 52, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + padding: 8px 0; + width: 100%; + background: none; + border: none; + margin-bottom: 24px; + cursor: pointer; +} + +/* line 62, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus, +.zen-forms textarea:focus { + cursor: text; +} + +/* line 67, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms textarea { + resize: none; +} + +/* line 71, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + cursor: pointer; + display: none; + padding: 8px 3; + position: absolute; + top: 0; + width: 100%; +} + +/* line 80, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms .empty + label { + display: block; +} + +/* line 84, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus + label, +.zen-forms textarea:focus + label { + display: none; +} + +/* line 89, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms :focus { + outline-color: transparent; + outline-style: none; +} + +/** + * Dark theme + */ +/* line 97, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + background: #151a1c; +} + +/* line 101, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + color: #516066; +} + +/* line 105, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + color: #667981; +} + +/** + * Light theme + */ +/* line 113, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme { + background: #fefefe; +} + +/* line 117, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme label { + color: #959697; +} + +/* line 121, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme input, +.zen-forms.light-theme textarea { + color: #707071; +} + +/* line 4, ../../../hub/static/css/mod/zen-forms.scss */ +.write-content .enable-fullscreen { + position: absolute; + top: 5px; + right: 16px; + color: #333333; + opacity: .5; + line-height: 1em; +} + +/* line 5, ../../../hub/static/css/mod/zen-forms.scss */ +.mini-icon-fullscreen::before { + content: ""; +} + +/* line 6, ../../../hub/static/css/mod/zen-forms.scss */ +.fullscreen-overlay textarea, .zen-forms textarea { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + height: 100%; + padding: 20px; + border: 0; + font-size: 21px; + line-height: 1.6em; + resize: none; + -moz-transition: color 0.15s ease-in 0; + -webkit-transition: color 0.15s ease-in 0; + transition: color 0.15s ease-in 0; + box-shadow: none; +} + +/* line 7, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms.light-theme textarea { + background: #fff; + color: #999999; +} + +/* line 8, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms .zen-forms-input-wrap { + width: 100%; + height: 100%; +} + +/* line 9, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms label[for^=zen-forms-input] { + display: none; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-zen.scss */ +.previewable-comment-form .zen-enabled textarea { + padding: 10px 18px 10px 10px; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled { + position: relative; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled .go-zen { + position: absolute; + right: 15px; + top: 5px; +} + +/* line 1, ../../../hub/static/css/mod/loader.scss */ +.loader { + display: none; + position: absolute; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + background-color: #eee; +} + +/* line 2, ../../../hub/static/css/mod/loader.scss */ +.loader .spinner { + display: block; + width: 32px; + height: 32px; + margin: 0 auto; + top: 121px; + position: relative; + background: url(/static/img/spinner.gif) no-repeat; +} + +/* line 1, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view { + position: absolute; + top: 0; + left: 0; + display: none; + margin-top: 18px; + background: white; + border: 1px solid #DDD; + border-radius: 3px; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + min-width: 120px; + z-index: 10; +} + +/* line 15, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur { + background: #3366FF; + color: white; +} + +/* line 19, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur small { + color: white; +} + +/* line 22, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view strong { + color: #3366FF; +} + +/* line 25, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur strong { + color: white; + font: bold; +} + +/* line 29, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul { + /* width: 100px; */ + list-style: none; + padding: 0; + margin: auto; +} + +/* line 35, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul li { + display: block; + padding: 5px 10px; + border-bottom: 1px solid #DDD; + cursor: pointer; + /* border-top: 1px solid #C8C8C8; */ +} + +/* line 42, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view small { + font-size: smaller; + color: #777; + font-weight: normal; +} + +/* line 9, ../../../hub/static/css/mod/comment-form.scss */ +.side-avatar { + margin-left: 0; +} + +/* fix li header for newer version of bootstrap */ +/* line 12, ../../../hub/static/css/mod/comment-form.scss */ +.comment-form-head li { + line-height: 18px; +} + +/* line 16, ../../../hub/static/css/mod/comment-form.scss */ +#new_comment .form-content { + width: 880px; + margin-left: 60px; +} + +/* line 18, ../../../hub/static/css/mod/comment-form.scss */ +.discussion-bubble-avatar { + position: relative; + float: left; + border-radius: 3px; +} + +/* line 19, ../../../hub/static/css/mod/comment-form.scss */ +.discussion-bubble-inner { + min-height: 60px; + border: 1px solid #CACACA; + background-color: white; +} + +/* line 1, ../../../hub/static/css/mod/loader.scss */ +.loader { + display: none; + position: absolute; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + background-color: #eee; +} + +/* line 2, ../../../hub/static/css/mod/loader.scss */ +.loader .spinner { + display: block; + width: 32px; + height: 32px; + margin: 0 auto; + top: 121px; + position: relative; + background: url(/static/img/spinner.gif) no-repeat; +} + +/* line 1, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description .css-truncate-target + .css-truncate-target { + max-width: 125px; +} + +/* line 2, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description p .commit-ref .user { + color: #CCC; +} + +/* line 3, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head { + margin: 20px 0; + background-color: #FAFAFA; + border: 1px solid #EEE; + border-bottom-width: 2px; + border-radius: 3px; +} + +/* line 4, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description .attention-icon { + position: relative; + float: left; + margin: 4px 10px 0 0; +} + +/* line 5, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description p { + padding-left: 10px; + position: relative; + float: left; + margin: 0; + line-height: 36px; + font-size: 13px; + max-width: 690px; + white-space: nowrap; +} + +/* line 6, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description p .user { + font-weight: bold; + color: #333; +} + +/* line 8, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description p { + padding-left: 0; +} + +/* line 12, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description .pull-state { + float: left; + padding: 8px; + margin-right: 8px; + border-right: 1px solid #EEE; + line-height: 20px; +} + +/* line 13, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description .state-indicator { + font-size: 13px; + display: inline-block; + height: 20px; + line-height: 20px; + padding: 0 5px; +} + +/* line 15, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +.commit-ref { + position: relative; + height: 20px; + display: inline-block; + padding: 0 5px; + border: 1px solid black; + border-radius: 3px; + font: 10px/20px Monaco,"Liberation Mono",Courier,monospace; + color: white; + white-space: nowrap; + vertical-align: middle; + background-color: #222; + background-image: -moz-linear-gradient(#444, #222); + background-image: -webkit-linear-gradient(#444, #222); + background-image: linear-gradient(#444, #222); + background-repeat: repeat-x; +} + +/* line 1, ../../../hub/static/css/mod/fav-button.scss */ +a#fav-button { + height: 25px; + width: 25px; + display: block; + float: right; + background: url("/static/img/fav_star.png") 0 0 no-repeat; +} + +/* line 2, ../../../hub/static/css/mod/fav-button.scss */ +a#fav-button.faved { + background: url("/static/img/faved_star.png") 0 0 no-repeat; +} + +/* line 6, ../../../hub/static/css/mod/pull-request.scss */ +#project-info { + margin-bottom: 15px; +} + +/* line 8, ../../../hub/static/css/mod/pull-request.scss */ +.tab-content { + overflow: initial; + position: relative; +} + +/* line 9, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest.tab-content { + min-height: 280px; + overflow: visible; +} + +/* line 11, ../../../hub/static/css/mod/pull-request.scss */ +.commit-preview .date { + color: #5B6375; +} + +/* line 13, ../../../hub/static/css/mod/pull-request.scss */ +.pull-nav.tabnav { + margin: 0 0 10px; + border-bottom: none; + height: 35px; +} + +/* line 14, ../../../hub/static/css/mod/pull-request.scss */ +.pull-nav.tabnav .nav li.active { + font-weight: bold; +} + +/* line 15, ../../../hub/static/css/mod/pull-request.scss */ +.pull-nav.tabnav .nav li a:hover { + background-color: transparent; + border: 1px solid transparent; +} + +/* line 16, ../../../hub/static/css/mod/pull-request.scss */ +.pull-nav.tabnav .nav li.active a { + background-color: #fff; + border-bottom: 1px solid #fff; +} + +/* line 17, ../../../hub/static/css/mod/pull-request.scss */ +.pull-nav.tabnav .nav li.active a:hover { + background-color: #fff; + border: 1px solid #DDD; + border-bottom: 1px solid #fff; +} + +/* line 19, ../../../hub/static/css/mod/pull-request.scss */ +.tabnav .counter { + position: relative; + top: -1px; + margin: 0 0 0 5px; + padding: 1px 5px 2px 5px; + font-size: 10px; + font-weight: bold; + color: #666; + background: #E5E5E5; + border-radius: 10px; +} + +/* line 21, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .explain { + margin: 15px 0; +} + +/* line 23, ../../../hub/static/css/mod/pull-request.scss */ +.discussion-topic-header { + position: relative; + margin: 10px; +} + +/* line 24, ../../../hub/static/css/mod/pull-request.scss */ +.discusion-topic-infobar { + border-bottom: 1px solid #e5e5e5; +} + +/* line 25, ../../../hub/static/css/mod/pull-request.scss */ +.discussion-topic-header .comment-topic-actions { + position: absolute; + top: 10px; + right: 10px; + list-style-type: none; +} + +/* line 26, ../../../hub/static/css/mod/pull-request.scss */ +.discussion-topic-header .comment-topic-actions li { + float: left; + margin-left: 12px; +} + +/* line 28, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest blockquote.citation { + border: none; +} + +/* line 29, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #trac-ticket-title { + display: none; +} + +/* line 30, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket { + margin-top: 23px; +} + +/* line 31, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .trac-topnav { + margin-top: 0; + top: -20px; + position: absolute; + right: 0; +} + +/* line 33, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket, .pullrequest div.change { + margin-bottom: 20px; + background: #fff; + border-radius: 3px; + border: 3px solid #eee; +} + +/* line 34, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket::before, .pullrequest div.change::before, .pullrequest #propertyform fieldset.iefix::before, .pullrequest #add-comment-form .form-content::before { + content: ""; + display: block; + height: 0; + width: 0; + border: 10px solid #EEE; + border-width: 10px 10px 10px 0; + border-color: transparent #EEE transparent transparent; + left: -12px; + top: 15px; + float: left; + position: absolute; +} + +/* line 35, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket::before { + position: absolute; +} + +/* line 36, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest div.change::before, .pullrequest #propertyform fieldset.iefix::before { + position: relative; +} + +/* line 37, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket { + padding: 5px; +} + +/* line 39, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket .date { + float: none; + clear: both; + color: #666; + font-size: 12px; +} + +/* line 40, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket .date::after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* line 41, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket .date p { + float: left; +} + +/* line 42, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket .summary { + font-size: 20px; + font-weight: bold; + margin: 0; +} + +/* line 43, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket .properties { + display: none; + border: none; +} + +/* line 44, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket .description { + margin-top: 10px; +} + +/* line 45, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket .description div { + padding: 0; +} + +/* line 46, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket .description h3 { + display: none; +} + +/* line 47, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket .description #addreply { + float: right; +} + +/* line 51, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .commits-condensed tr td.message { + word-break: break-all; +} +/* line 55, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog { + border: none; + padding: 0; +} +/* line 60, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .change table.commits tr td.author { + width: 80px; +} +/* line 63, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .change table.commits tr td.date { + width: 100px; +} +/* line 66, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .change table.commits tr td.status { + width: 20px; +} +/* line 71, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .change table.commits tr td span.commit-status { + width: 100px; + display: inline-block; + border-radius: 100px; + width: 15px; + height: 15px; + vertical-align: middle; +} +/* line 79, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .change table.commits tr td span.dirty { + background-color: #f6e69f; +} +/* line 82, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .change table.commits tr td span.error { + background-color: #da4f49; +} +/* line 85, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .change table.commits tr td span.success { + background-color: #6eda62; +} + +/* line 93, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog h3 { + border: none; +} + +/* line 94, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .change div.outdated_mark { + background-color: #DDD; + height: 31px; + text-align: center; + color: #777; + line-height: 31px; +} + +/* line 95, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .change div.outdated_commits { + display: none; +} + +/* line 96, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .change div.outdated_codereview { + display: none; +} + +/* line 97, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest div.change { + padding: 0; + background: #FBFBFB; +} + +/* line 98, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .change h3.change { + color: #333; + margin: 0; + font-size: 12px; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.7); + white-space: nowrap; + text-overflow: ellipsis; + padding: 0 10px 0 6px; + border-bottom: 1px solid #CCC; + background: -webkit-linear-gradient(#F8FBFC, #DDE8EB); + background-image: -webkit-linear-gradient(#F8F8F8, #E1E1E1); + background-image: linear-gradient(#F8F8F8, #E1E1E1); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f8fbfc', endColorstr='#dde8eb')"; +} + +/* line 99, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest div.change form[id^=reply-to-comment-] { + right: 7px; +} + +/* line 100, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest div.change table.commits .commit code { + background-color: transparent; +} + +/* line 101, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .comment { + margin: 0; + top: -1px; + position: relative; +} + +/* line 102, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .comment #files { + margin-top: -24px; +} + +/* line 103, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .comment #files .file { + width: 100%; + margin: 0 0 0 -1px; +} + +/* line 104, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .comment p br { + height: 0; +} + +/* line 105, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .comment p { + padding: 5px; + margin: 0; + color: #333; +} + +/* line 107, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest div.change form#trac-comment-editor { + position: relative; + right: 0; + margin: 12px; +} + +/* line 108, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest h2#trac-add-comment, .pullrequest .trac-nav { + display: none; +} + +/* line 109, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest fieldset.iefix { + padding: 6px; + background: #EEE; + border-radius: 3px; +} + +/* line 110, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest fieldset.iefix h3 { + font-size: 13px; + line-height: 1.4; + color: #333; + margin: 0 5px; +} + +/* line 112, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #propertyform .btn[type=submit] { + padding: 8px 15px; +} + +/* line 113, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #modify { + background-color: #EEE; + padding: 12px; +} + +/* line 114, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #ticketchange.ticketdraft { + padding: 1em; + background: none; + background-color: #FBFBFB; +} + +/* line 115, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #ticketchange.ticketdraft .comment { + margin: 1em; +} + +/* line 116, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #ticketchange.ticketdraft .comment blockquote.citation { + margin: 12px 0; +} + +/* line 117, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #ticketchange.ticketdraft .comment blockquote.citation p { + font-size: 13px; +} + +/* line 119, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket .side-avatar { + position: absolute; + float: left; + margin-left: -60px; +} + +/* line 121, ../../../hub/static/css/mod/pull-request.scss */ +table.commits { + margin: 0; + font-size: 12px; +} + +/* line 123, ../../../hub/static/css/mod/pull-request.scss */ +.pull-participation { + margin: -10px 0 15px; + font-size: 13px; + font-weight: 300; + color: #666; +} + +/* line 124, ../../../hub/static/css/mod/pull-request.scss */ +.pull-participation p.quickstat { + display: inline-block; + margin: 0 5px 0 0; +} + +/* line 125, ../../../hub/static/css/mod/pull-request.scss */ +.pull-participation a { + color: #666; +} + +/* line 126, ../../../hub/static/css/mod/pull-request.scss */ +.pull-participation .avatar { + position: relative; + display: inline-block; + height: 24px; + top: -2px; + margin-right: 3px; + margin-bottom: 3px; +} + +/* line 127, ../../../hub/static/css/mod/pull-request.scss */ +.pull-participation .avatar img { + vertical-align: middle; +} + +/* action-bubble part is also used in commits.html */ +/* line 131, ../../../hub/static/css/mod/pull-request.scss */ +.action-bubble { + margin: 20px 0; +} + +/* line 132, ../../../hub/static/css/mod/pull-request.scss */ +.action-bubble .action { + float: left; + line-height: 29px; +} + +/* line 133, ../../../hub/static/css/mod/pull-request.scss */ +.action-bubble .state-indicator { + display: inline-block; + margin-right: 8px; + font-size: 12px; + padding: 0 5px; + line-height: 24px; +} + +/* line 134, ../../../hub/static/css/mod/pull-request.scss */ +.state-indicator.closed { + background: #BD2C00; +} + +/* line 135, ../../../hub/static/css/mod/pull-request.scss */ +.state-indicator { + display: block; + font-size: 14px; + font-weight: bold; + color: white; + text-align: center; + border-radius: 3px; + background: #999; +} + +/* line 136, ../../../hub/static/css/mod/pull-request.scss */ +.action-bubble .bubble { + font-size: 13px; + font-weight: 300; + background-color: transparent; +} + +/* line 137, ../../../hub/static/css/mod/pull-request.scss */ +.bubble { + padding: 3px; + background: #EEE; + border-radius: 3px; +} + +/* line 138, ../../../hub/static/css/mod/pull-request.scss */ +.action-bubble .bubble p { + margin: 0; + line-height: 26px; +} + +/* line 139, ../../../hub/static/css/mod/pull-request.scss */ +.action-bubble .bubble strong { + font-weight: bold; +} + +/* line 140, ../../../hub/static/css/mod/pull-request.scss */ +.action-bubble .avatar { + position: relative; + top: -2px; + display: inline-block; + height: 24px; + margin-right: 3px; + line-height: 1px; +} + +/* line 141, ../../../hub/static/css/mod/pull-request.scss */ +.action-bubble .avatar img { + vertical-align: middle; +} + +/* line 142, ../../../hub/static/css/mod/pull-request.scss */ +.state-indicator.open, .state-indicator.reopened, .state-indicator.merged { + background: #6CC644; +} + +/* the following action-bubble style seems only used in commits.html */ +/* line 146, ../../../hub/static/css/mod/pull-request.scss */ +.action-bubble .state-renamed { + color: black; + background-color: #FFFA5D; + text-shadow: none; +} + +/* line 151, ../../../hub/static/css/mod/pull-request.scss */ +.action-bubble .state { + display: inline-block; + padding: 0 5px; + height: 24px; + line-height: 25px; + text-shadow: 0 -1px -1px rgba(0, 0, 0, 0.25); +} + +/* line 158, ../../../hub/static/css/mod/pull-request.scss */ +.action-bubble .state { + float: none; + padding: 3px 5px; + font-size: 11px; +} + +/* line 165, ../../../hub/static/css/mod/pull-request.scss */ +.closed-banner { + margin: 15px 0; + height: 7px; + overflow: hidden; + background: url("/static/img/closed_pattern.gif"); + border-radius: 5px; +} + +/* line 167, ../../../hub/static/css/mod/pull-request.scss */ +.change-header .change-header-right { + float: right; + height: 15px; +} + +/* line 168, ../../../hub/static/css/mod/pull-request.scss */ +.change-header .change-header-date { + display: inline-block; + margin: 0; + height: 33px; + font-size: 11px; + font-style: normal; + color: #777; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.7); +} + +/* line 170, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket { + padding: 0; +} + +/* line 171, ../../../hub/static/css/mod/pull-request.scss */ +.discussion-bubble-avatar { + position: relative; + float: left; + border-radius: 3px; +} + +/* line 172, ../../../hub/static/css/mod/pull-request.scss */ +.discussion-bubble-inner { + min-height: 60px; + border: 1px solid #CACACA; + background-color: white; +} + +/* line 174, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .change .change-header { + height: 23px; + color: #333; + margin: 0; + font-size: 12px; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.7); + white-space: nowrap; + text-overflow: ellipsis; + padding: 3px 10px 0 6px; + border-bottom: 1px solid #CCC; + background: -webkit-linear-gradient(#F8FBFC, #DDE8EB); + background-image: -webkit-linear-gradient(#F8F8F8, #E1E1E1); + background-image: linear-gradient(#F8F8F8, #E1E1E1); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f8fbfc', endColorstr='#dde8eb')"; +} + +/* line 176, ../../../hub/static/css/mod/pull-request.scss */ +.comment-content .comment-body, .pullrequest .ticket #ticket .comment-content .comment-body { + padding: 10px; + font-size: 13px; + overflow: auto; + width: 100%; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +/* line 177, ../../../hub/static/css/mod/pull-request.scss */ +.comment-content .comment-body, .pullrequest #changelog .comment p { + font-size: 13px; +} + +/* line 179, ../../../hub/static/css/mod/pull-request.scss */ +.user-mention, .team-mention { + font-weight: bold; + color: #333; +} + +/* line 181, ../../../hub/static/css/mod/pull-request.scss */ +.change #files .file { + border: none; +} + +/*========= Github Style ========*/ +/* line 4, ../../../hub/static/css/mod/pull-github.scss */ +span.diffstat { + white-space: nowrap; + text-align: right; + font-family: Helvetica,arial,freesans,clean,sans-serif; + color: #666; + font-weight: bold; + font-size: 11px; +} + +/* line 12, ../../../hub/static/css/mod/pull-github.scss */ +span.diffstat a { + text-decoration: none; + color: #666; +} + +/* line 16, ../../../hub/static/css/mod/pull-github.scss */ +span.diffstat .diffstat-bar { + position: relative; + left: -3px; + display: inline-block; + height: 12px; + text-decoration: none; + text-align: left; + color: #EEE; + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + line-height: 1; + -webkit-font-smoothing: antialiased; + font-size: 16px; + letter-spacing: -7px; +} + +/* line 34, ../../../hub/static/css/mod/pull-github.scss */ +span.diffstat .diffstat-bar.diff-added, +span.diffstat .diffstat-bar i.plus { + color: #61C423; + font-style: normal; +} + +/* line 39, ../../../hub/static/css/mod/pull-github.scss */ +span.diffstat .diffstat-bar.diff-added, +span.diffstat .diffstat-bar i.minus { + color: #C52323; + font-style: normal; +} + +/* line 45, ../../../hub/static/css/mod/pull-github.scss */ +.mini-icon-added:before { + content: "\f06b"; +} + +/* line 46, ../../../hub/static/css/mod/pull-github.scss */ +.mini-icon-removed:before { + content: "\f06c"; +} + +/* line 47, ../../../hub/static/css/mod/pull-github.scss */ +.mini-icon-modified:before { + content: "\f06d"; +} + +/* line 48, ../../../hub/static/css/mod/pull-github.scss */ +.mini-icon-moved:before, .mini-icon-renamed:before { + content: "\f06e"; +} + +/* TODO remove the following line */ +/* file-blame-blob should only be import at blame page */ +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* line 3, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files { + position: relative; +} + +/* line 6, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file { + margin-top: 0; +} + +/* line 9, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file, .file-box { + border: 1px solid #CCC; + margin-bottom: 13px; + position: relative; + background-color: #DDD; +} + +/* line 15, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta, +.file-box .meta { + overflow: hidden; + padding: 5px 10px; + font-size: 12px; + height: 33px; + text-align: left; + color: #555; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #D8D8D8; + background: #FAFAFA; + background: -moz-linear-gradient(#FAFAFA, #EAEAEA); + background: -webkit-linear-gradient(#FAFAFA, #EAEAEA); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; +} + +/* line 30, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .info, +.file-box .meta .info { + float: left; + height: 33px; + max-width: 555px; + line-height: 33px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +/* line 41, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .info span, +.file-box .meta .info span { + padding-left: 9px; + margin-left: 5px; + border-left: 1px solid #C1C1C1; + box-shadow: inset 1px 0 0 white; +} + +/* line 50, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .info span.icon, +#files .file .meta .info span.diffstat, +.file-box .meta .info span.icon { + line-height: 0; + float: left; + margin: 5px 5px 0 0; + padding: 3px; + background: #F7F7F7; + border: 1px solid #CCC; + border-right-color: #E5E5E5; + border-bottom-color: #E5E5E5; + border-radius: 3px; +} + +/* line 63, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .info span.diffstat { + height: 16px; + padding: 3px 6px; +} + +/* line 67, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .info span:first-child, +#files .file .meta .info .icon + span, +.file-box .meta .info span:first-child, +.file-box .meta .info .icon + span { + border-left: 0 none; + box-shadow: inset 0 0 0 transparent; + margin-left: 0; + padding-left: 0; +} + +/* line 76, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .info span.diffstat .diffstat-bar { + color: #D8D8D8; +} + +/* line 79, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .actions, .file-box .meta .actions { + float: right; + height: 33px; + line-height: 33px; + margin-top: 1px; +} + +/* line 85, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .actions .show-inline-notes { + display: block; + position: relative; + display: block; + float: left; + margin-right: 10px; +} + +/* line 92, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .actions .show-inline-notes label { + font-weight: bold; + margin: 5px 0; +} + +/* line 96, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .actions .show-inline-notes input { + margin: 0; +} + +/* line 99, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .actions .button-group, +.file-box .meta .actions .button-group { + float: right; + margin-top: 2px; +} + +/* line 104, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .actions code, +.file-box .meta .actions code { + background: inherit; + border: none; + font-size: 11px; + color: inherit; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + padding: 0; +} + +/* line 114, ../../../hub/static/css/mod/file-blame-blob.scss */ +.file { + margin: 15px 0; +} + +/* line 118, ../../../hub/static/css/mod/file-blame-blob.scss */ +.file .data { + overflow: auto; +} + +/* line 120, ../../../hub/static/css/mod/file-blame-blob.scss */ +.change #files .file, .file-box, .change .file { + margin-bottom: 0; +} + +/* line 122, ../../../hub/static/css/mod/file-blame-blob.scss */ +.blame .line-data { + font-size: 12px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; +} + +/* ticket style */ +/* line 2, ../../../hub/static/css/mod/pull-ticket.scss */ +#content.ticket { + width: 63em; + max-width: 100%; + margin-left: auto; +} + +/* line 8, ../../../hub/static/css/mod/pull-ticket.scss */ +#field-description-help { + float: right; +} + +/* line 9, ../../../hub/static/css/mod/pull-ticket.scss */ +#properties div.trac-resizable, #field-description { + width: 100%; +} + +/* line 11, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket { + background: #ffd; + border: 1px outset #996; + margin-top: 1em; + padding: .5em 1em; + position: relative; +} + +/* line 19, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket.ticketdraft { + background: #f8f8f8 url(../draft.png); +} + +/* line 22, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticketchange.ticketdraft { + padding: 0 1em; + margin: 1em 0; +} + +/* line 26, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticketchange.ticketdraft h3 { + margin-top: .5em; +} + +/* line 29, ../../../hub/static/css/mod/pull-ticket.scss */ +.preview-notice { + font-weight: bold; +} + +/* line 31, ../../../hub/static/css/mod/pull-ticket.scss */ +.ticketdraft { + background: #f8f8f8 url(../draft.png); + border: 1px outset #996; + padding: 0 .2em; +} + +/* line 37, ../../../hub/static/css/mod/pull-ticket.scss */ +h1 .status { + color: #444; +} + +/* line 38, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket h2.summary { + margin: 0 0 0.8em 0; +} + +/* line 39, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket .date { + color: #996; + float: right; + font-size: 85%; + position: relative; +} + +/* line 40, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket .date p { + margin: 0.3em; +} + +/* line 42, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket table.properties { + clear: both; + border-top: 1px solid #dd9; + border-collapse: collapse; + table-layout: fixed; + width: 100%; +} + +/* line 49, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket table.properties tr { + border-bottom: 1px dotted #eed; +} + +/* line 50, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket table.properties td, #ticket table.properties th { + font-size: 80%; + padding: .5em 1em; + vertical-align: top; +} + +/* line 55, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket table.properties th { + color: #663; + font-weight: normal; + text-align: left; + width: 20%; +} + +/* line 61, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket table.properties td { + width: 30%; +} + +/* line 62, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket table.properties td p:first-child { + margin-top: 0; +} + +/* line 63, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket table.properties td p:last-child { + margin-bottom: 0; +} + +/* line 64, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket table.properties .description { + border-top: 1px solid #dd9; +} + +/* line 66, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket .description h3 { + border-bottom: 1px solid #dd9; + color: #663; + font-size: 100%; + font-weight: normal; +} + +/* line 72, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket .description h3 .lastmod { + font-size: 90%; +} + +/* line 75, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket .inlinebuttons { + float: right; + position: relative; + bottom: 0.3em; + margin-left: 0.2em; +} + +/* line 82, ../../../hub/static/css/mod/pull-ticket.scss */ +#changelog { + border: 1px outset #996; + padding: 1em; +} + +/* line 83, ../../../hub/static/css/mod/pull-ticket.scss */ +.trac-shade { + background-color: #eee; +} + +/* line 84, ../../../hub/static/css/mod/pull-ticket.scss */ +#trac-comment-editor { + margin-left: 2em; + margin-bottom: 1em; +} + +/* line 85, ../../../hub/static/css/mod/pull-ticket.scss */ +#trac-comment-editor div.trac-resizable { + width: 100%; +} + +/* line 86, ../../../hub/static/css/mod/pull-ticket.scss */ +#trac-comment-editor textarea { + background: #ffffe0; + margin-left: -1px; + margin-right: -1px; + width: 100%; +} + +/* line 92, ../../../hub/static/css/mod/pull-ticket.scss */ +#trac-comment-editor .wikitoolbar { + margin-left: -1px; +} + +/* line 93, ../../../hub/static/css/mod/pull-ticket.scss */ +#trac-add-comment :link, #trac-add-comment :visited { + color: #b00; +} + +/* line 94, ../../../hub/static/css/mod/pull-ticket.scss */ +#changelog h3, #ticketchange h3 { + border-bottom: 1px solid #d7d7d7; + color: #999; + font-size: 100%; + font-weight: normal; +} + +/* line 100, ../../../hub/static/css/mod/pull-ticket.scss */ +.threading, #changelog .inlinebuttons { + float: right; + margin-left: 0.2em; +} + +/* line 101, ../../../hub/static/css/mod/pull-ticket.scss */ +.threading { + font-size: 85%; +} + +/* line 102, ../../../hub/static/css/mod/pull-ticket.scss */ +.threading :link, .threading :visited { + border-bottom: 0; +} + +/* line 103, ../../../hub/static/css/mod/pull-ticket.scss */ +#changelog .trac-lastedit { + padding-left: 2.5em; + color: #999; + font-size: 80%; +} + +/* line 108, ../../../hub/static/css/mod/pull-ticket.scss */ +#changelog .trac-lastedit :link, #changelog .trac-lastedit :visited { + color: inherit; +} + +/* line 110, ../../../hub/static/css/mod/pull-ticket.scss */ +#changelog .changes, #ticketchange .changes { + list-style: square; + margin-left: 2em; + padding: 0; +} + +/* line 111, ../../../hub/static/css/mod/pull-ticket.scss */ +#changelog .comment, #ticketchange .comment { + margin-left: 2em; +} + +/* line 113, ../../../hub/static/css/mod/pull-ticket.scss */ +form .field { + margin-top: .75em; + width: 100%; +} + +/* line 114, ../../../hub/static/css/mod/pull-ticket.scss */ +form .field fieldset.iefix { + margin-left: 1px; + margin-right: 1px; +} + +/* line 115, ../../../hub/static/css/mod/pull-ticket.scss */ +label[for=comment] { + float: right; +} + +/* line 116, ../../../hub/static/css/mod/pull-ticket.scss */ +form .field .wikitoolbar { + margin-left: -1px; +} + +/* line 117, ../../../hub/static/css/mod/pull-ticket.scss */ +form .field div.trac-resizable { + width: 100%; +} + +/* line 119, ../../../hub/static/css/mod/pull-ticket.scss */ +#properties { + white-space: nowrap; + line-height: 160%; + padding: 0.5em; +} + +/* line 120, ../../../hub/static/css/mod/pull-ticket.scss */ +#properties table { + border-spacing: 0; + width: 100%; + padding: 0 0.5em; +} + +/* line 121, ../../../hub/static/css/mod/pull-ticket.scss */ +#properties table th { + padding: .4em; + text-align: right; + width: 20%; + vertical-align: top; +} + +/* line 127, ../../../hub/static/css/mod/pull-ticket.scss */ +#properties table th.col2 { + border-left: 1px dotted #d7d7d7; +} + +/* line 128, ../../../hub/static/css/mod/pull-ticket.scss */ +#properties table td { + vertical-align: middle; + width: 30%; +} + +/* line 129, ../../../hub/static/css/mod/pull-ticket.scss */ +#properties table td.fullrow { + vertical-align: middle; + width: 80%; +} + +/* line 131, ../../../hub/static/css/mod/pull-ticket.scss */ +#action { + line-height: 2em; +} + +/* line 133, ../../../hub/static/css/mod/pull-ticket.scss */ +fieldset.radio { + border: none; + margin: 0; + padding: 0; +} + +/* line 134, ../../../hub/static/css/mod/pull-ticket.scss */ +fieldset.radio legend { + color: #000; + float: left; + font-size: 100%; + font-weight: normal; + padding: 0 1em 0 0; +} + +/* line 141, ../../../hub/static/css/mod/pull-ticket.scss */ +fieldset.radio label { + padding-right: 1em; +} + +/* tabs */ +/* line 3, ../../../hub/static/css/mod/pull-tabs.scss */ +ul.smalltabs { + margin: 15px 0 15px 0; + height: 24px; + line-height: 24px; + font-size: 12px; + color: #555; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.5); + background: #E8E8E8; + background: -moz-linear-gradient(#E8E8E8, #D2D2D2); + background: -webkit-linear-gradient(#E8E8E8, #D2D2D2); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#e8e8e8',endColorstr='#d2d2d2')"; + border: 1px solid #D1D1D1; + border-bottom-color: #BBB; + border-radius: 3px; +} + +/* line 18, ../../../hub/static/css/mod/pull-tabs.scss */ +ul.smalltabs li { + list-style-type: none; + display: inline; + line-height: 24px; +} + +/* line 23, ../../../hub/static/css/mod/pull-tabs.scss */ +ul.smalltabs li:first-child a.selected { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} + +/* line 27, ../../../hub/static/css/mod/pull-tabs.scss */ +ul.smalltabs li:first-child a { + border-left: none; +} + +/* line 30, ../../../hub/static/css/mod/pull-tabs.scss */ +ul.smalltabs li.active a { + color: #333; + background: white; + background: -moz-linear-gradient(white, #F2F2F2); + background: -webkit-linear-gradient(white, #F2F2F2); +} + +/* line 36, ../../../hub/static/css/mod/pull-tabs.scss */ +ul.smalltabs a { + float: left; + height: 24px; + padding: 0 7px; + color: #666; + font-weight: bold; + text-decoration: none; + border-right: 1px solid #ABABAB; + border-left: 1px solid #F6F6F6; +} + +/* line 46, ../../../hub/static/css/mod/pull-tabs.scss */ +ul.smalltabs .mini-icon { + vertical-align: middle; + color: #888; +} + +/* line 50, ../../../hub/static/css/mod/pull-tabs.scss */ +ul.smalltabs .counter { + display: inline-block; + position: relative; + top: -1px; + margin-left: 2px; + line-height: 12px; + padding: 1px 3px 0 3px; + font-size: 9px; + background: #ECECEC; + border: 1px solid #AFAFAF; + border-right-color: #ECECEC; + border-bottom-color: #ECECEC; + border-radius: 2px; +} + +/* codereview style */ +/* comments style is also used in pull-new page's description input box */ +/* line 5, ../../../hub/static/css/mod/pull-codereview.scss */ +.comments-row .comments { + padding: 5px; +} + +/* line 8, ../../../hub/static/css/mod/pull-codereview.scss */ +.comments-row .comment { + margin: 5px 0; + border: 1px solid #CACACA; +} + +/* line 12, ../../../hub/static/css/mod/pull-codereview.scss */ +.comments-row .comment-meta { + padding: 5px 10px; + border-bottom: 1px solid #CCC; + background-image: linear-gradient(top, #F4F8F9, #DCE8EC); + background-image: -o-linear-gradient(top, #F4F8F9, #DCE8EC); + background-image: -moz-linear-gradient(top, #F4F8F9, #DCE8EC); + background-image: -webkit-linear-gradient(top, #F4F8F9, #DCE8EC); + background-image: -ms-linear-gradient(top, #F4F8F9, #DCE8EC); +} + +/* line 22, ../../../hub/static/css/mod/pull-codereview.scss */ +.comments-row .comment .body { + color: #333; + font-size: 13px; + padding: 10px; + background: #FBFBFB; +} + +/* line 29, ../../../hub/static/css/mod/pull-codereview.scss */ +.comments-row .comment-form .help { + margin: 3px 0 0 0; + float: right; + font-size: 11px; + color: #666; +} + +/* line 35, ../../../hub/static/css/mod/pull-codereview.scss */ +.comments-row .comment-form textarea { + width: 100%; + height: 100px; + font-size: 12px; +} + +/* For other page that still depends on commits.scss */ +/* preview comment form style */ +/* line 2, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav { + margin: 10px 0; + border-bottom: 1px solid #DDD; + height: 35px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs { + display: inline-block; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs > li { + display: inline-block; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab { + display: inline-block; + margin-bottom: -1px; + padding: 8px 12px 9px; + border: 1px solid transparent; + border-bottom: 0; + font-size: 14px; + color: #666; + text-decoration: none; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab.selected { + border-color: #DDD; + border-radius: 3px 3px 0 0; + background-color: white; + color: #333; + font-weight: bold; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab:hover { + text-decoration: none; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav { + position: relative; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav ul.tabnav-tabs { + padding-left: 10px; +} + +/* line 10, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 0 10px 10px; +} + +/* line 11, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form #preview_bucket .content-body { + padding: 10px; + min-height: 132px; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form.tab-content { + overflow: initial; + position: relative; +} + +/* line 2, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 10px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-actions { + padding: 0; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + position: relative; + border: 3px solid #EEE; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + padding: 0; + background: #EEE; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content .write-content { + padding: 0 10px 10px; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; + margin: 0; +} + +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary, button.primary.classy:disabled, button.primary.classy.disabled, button.primary.classy:disabled:hover, button.primary.classy.disabled:disabled:hover, button.classy:disabled:hover.primary, button.classy.disabled:disabled:hover.primary { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4); + border-color: #74BB5A; + border-bottom-color: #509338; + background: #8ADD6D; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#8add6d', endColorstr='#60b044')"; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); + background-image: -webkit-linear-gradient(top, #8ADD6D, #60B044); +} + +/* line 2, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary.disabled { + opacity: 0.5; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy, +button.classy:disabled, +button.classy.disabled, +a.button.classy:disabled, +a.button.classy.disabled, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover:disabled, +a.button.classy.disabled:hover, +a.button.classy, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy:disabled:hover, +a.button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover { + display: inline-block; + padding: 8px 15px; + line-height: normal; + position: relative; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 12px; + font-weight: bold; + color: #666; + text-shadow: 0 1px rgba(255, 255, 255, 0.9); + background: whiteSmoke; + background: -moz-linear-gradient(whiteSmoke, #E5E5E5); + background: -webkit-linear-gradient(whiteSmoke, #E5E5E5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; + border-radius: 3px; + border: 1px solid #DDD; + border-bottom-color: #BBB; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* ================================== *\ + * Zen Form + * ================================== */ +/* line 6, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + position: fixed; + z-index: 99999; + top: 0; + left: 0; + right: 0; + bottom: 0; + padding: 24px 30px 24px 24px; +} + +/* line 16, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-input-wrap { + max-width: 640px; + position: relative; + margin: 0 auto; +} + +/** + * Buttons style + */ +/* line 25, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button, +.zen-forms-theme-switch { + position: absolute; + width: 18px; + height: 18px; + text-align: center; + top: 10px; + right: 10px; + font-size: 24px; + color: #516066; + cursor: pointer; + line-height: 1; +} + +/* line 39, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-theme-switch { + top: 28px; + font-size: 34px; +} + +/* line 44, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button:hover, +.zen-forms-theme-switch:hover { + color: #667981; +} + +/** + * Inputs basic style + */ +/* line 52, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + padding: 8px 0; + width: 100%; + background: none; + border: none; + margin-bottom: 24px; + cursor: pointer; +} + +/* line 62, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus, +.zen-forms textarea:focus { + cursor: text; +} + +/* line 67, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms textarea { + resize: none; +} + +/* line 71, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + cursor: pointer; + display: none; + padding: 8px 3; + position: absolute; + top: 0; + width: 100%; +} + +/* line 80, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms .empty + label { + display: block; +} + +/* line 84, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus + label, +.zen-forms textarea:focus + label { + display: none; +} + +/* line 89, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms :focus { + outline-color: transparent; + outline-style: none; +} + +/** + * Dark theme + */ +/* line 97, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + background: #151a1c; +} + +/* line 101, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + color: #516066; +} + +/* line 105, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + color: #667981; +} + +/** + * Light theme + */ +/* line 113, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme { + background: #fefefe; +} + +/* line 117, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme label { + color: #959697; +} + +/* line 121, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme input, +.zen-forms.light-theme textarea { + color: #707071; +} + +/* line 4, ../../../hub/static/css/mod/zen-forms.scss */ +.write-content .enable-fullscreen { + position: absolute; + top: 5px; + right: 16px; + color: #333333; + opacity: .5; + line-height: 1em; +} + +/* line 5, ../../../hub/static/css/mod/zen-forms.scss */ +.mini-icon-fullscreen::before { + content: ""; +} + +/* line 6, ../../../hub/static/css/mod/zen-forms.scss */ +.fullscreen-overlay textarea, .zen-forms textarea { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + height: 100%; + padding: 20px; + border: 0; + font-size: 21px; + line-height: 1.6em; + resize: none; + -moz-transition: color 0.15s ease-in 0; + -webkit-transition: color 0.15s ease-in 0; + transition: color 0.15s ease-in 0; + box-shadow: none; +} + +/* line 7, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms.light-theme textarea { + background: #fff; + color: #999999; +} + +/* line 8, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms .zen-forms-input-wrap { + width: 100%; + height: 100%; +} + +/* line 9, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms label[for^=zen-forms-input] { + display: none; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-zen.scss */ +.previewable-comment-form .zen-enabled textarea { + padding: 10px 18px 10px 10px; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled { + position: relative; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled .go-zen { + position: absolute; + right: 15px; + top: 5px; +} + +/* line 1, ../../../hub/static/css/mod/loader.scss */ +.loader { + display: none; + position: absolute; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + background-color: #eee; +} + +/* line 2, ../../../hub/static/css/mod/loader.scss */ +.loader .spinner { + display: block; + width: 32px; + height: 32px; + margin: 0 auto; + top: 121px; + position: relative; + background: url(/static/img/spinner.gif) no-repeat; +} + +/* line 1, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view { + position: absolute; + top: 0; + left: 0; + display: none; + margin-top: 18px; + background: white; + border: 1px solid #DDD; + border-radius: 3px; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + min-width: 120px; + z-index: 10; +} + +/* line 15, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur { + background: #3366FF; + color: white; +} + +/* line 19, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur small { + color: white; +} + +/* line 22, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view strong { + color: #3366FF; +} + +/* line 25, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur strong { + color: white; + font: bold; +} + +/* line 29, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul { + /* width: 100px; */ + list-style: none; + padding: 0; + margin: auto; +} + +/* line 35, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul li { + display: block; + padding: 5px 10px; + border-bottom: 1px solid #DDD; + cursor: pointer; + /* border-top: 1px solid #C8C8C8; */ +} + +/* line 42, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view small { + font-size: smaller; + color: #777; + font-weight: normal; +} + +/* line 9, ../../../hub/static/css/mod/comment-form.scss */ +.side-avatar { + margin-left: 0; +} + +/* fix li header for newer version of bootstrap */ +/* line 12, ../../../hub/static/css/mod/comment-form.scss */ +.comment-form-head li { + line-height: 18px; +} + +/* line 16, ../../../hub/static/css/mod/comment-form.scss */ +#new_comment .form-content { + width: 880px; + margin-left: 60px; +} + +/* line 18, ../../../hub/static/css/mod/comment-form.scss */ +.discussion-bubble-avatar { + position: relative; + float: left; + border-radius: 3px; +} + +/* line 19, ../../../hub/static/css/mod/comment-form.scss */ +.discussion-bubble-inner { + min-height: 60px; + border: 1px solid #CACACA; + background-color: white; +} + +/* line 1, ../../../hub/static/css/mod/diff-stat.scss */ +#toc li { + border-bottom: 1px solid #DDD; + list-style-type: none; + padding: 5px; +} + +/* line 7, ../../../hub/static/css/mod/diff-stat.scss */ +#toc { + margin: 15px 0; +} + +/* line 11, ../../../hub/static/css/mod/diff-stat.scss */ +#toc .diffstat { + float: right; +} + +/* line 14, ../../../hub/static/css/mod/diff-stat.scss */ +#toc .mini-icon-modified { + color: #677A85; +} + +/* line 18, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat { + white-space: nowrap; + text-align: right; + font-family: Helvetica,arial,freesans,clean,sans-serif; + color: #666; + font-weight: bold; + font-size: 11px; +} + +/* line 26, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat a { + text-decoration: none; + color: #666; +} + +/* line 30, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar { + position: relative; + left: -3px; + display: inline-block; + height: 12px; + text-decoration: none; + text-align: left; + color: #EEE; + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + line-height: 1; + -webkit-font-smoothing: antialiased; + font-size: 16px; + letter-spacing: -7px; +} + +/* line 48, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar.diff-added, +span.diffstat .diffstat-bar i.plus { + color: #61C423; + font-style: normal; +} + +/* line 53, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar.diff-added, +span.diffstat .diffstat-bar i.minus { + color: #C52323; + font-style: normal; +} + +/* line 59, ../../../hub/static/css/mod/diff-stat.scss */ +p.explain { + font-size: 12px; + color: #666; + margin: 1em 0; +} + +/* line 65, ../../../hub/static/css/mod/diff-stat.scss */ +p.explain .minibutton { + float: right; + top: -4px; +} + +/* line 3, ../../../hub/static/css/mod/diffs-pane.scss */ +.diff-cutoff { + margin-bottom: -2px; + height: 35px; + line-height: 37px; + font-size: 12px; + font-weight: bold; + color: #000; + text-align: center; + background: url("/static/img/compare_too_big.gif") 0 0 no-repeat; +} + +/* line 5, ../../../hub/static/css/mod/diffs-pane.scss */ +.fullscreen-mode { + overflow: hidden; +} + +/* line 6, ../../../hub/static/css/mod/diffs-pane.scss */ +#fullscreen-stage { + display: none; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + overflow-y: auto; + background: #fff; + z-index: 9999; +} + +/* line 7, ../../../hub/static/css/mod/diffs-pane.scss */ +#files #fullscreen-stage .file { + margin: 0; +} + +/* line 5, ../../../hub/static/css/mod/commits.scss */ +div.container div.raw { + overflow: visible; +} + +/* line 9, ../../../hub/static/css/mod/commits.scss */ +#commits-graph { + position: absolute; + left: -200px; + width: 200px; +} + +/* line 15, ../../../hub/static/css/mod/commits.scss */ +.commits-body { + position: relative; +} + +/* line 19, ../../../hub/static/css/mod/commits.scss */ +h3.commit-group-heading { + margin: 15px 0 0 0; + padding: 5px 8px; + font-size: 13px; + color: #3a505b; + text-shadow: 0 1px white; + background: #e6f1f6; + border: 1px solid #c5d5dd; + border-top-right-radius: 4px; + border-top-left-radius: 4px; +} + +/* line 31, ../../../hub/static/css/mod/commits.scss */ +h3.history { + margin-top: 15px; +} + +/* line 35, ../../../hub/static/css/mod/commits.scss */ +.commit-group { + list-style-type: none; + margin: 15px 0; + background: #f7fbfc; + border: 1px solid #c5d5dd; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +/* line 46, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item { + position: relative; + padding: 8px 8px 8px 52px; + border-top: 1px solid #e2eaee; +} + +/* line 52, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:first-child { + border-top: none; +} + +/* line 56, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:last-child { + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +/* line 61, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:nth-child(2n) { + background: #fff; +} + +/* line 65, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus { + background: #fcfce2; +} + +/* line 69, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gravatar { + float: left; + margin-left: -44px; + border-radius: 4px; +} + +/* line 75, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .commit-title { + margin: 1px 0 1px 0; + font-size: 14px; + font-weight: bold; + color: #333; +} + +/* line 82, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .commit-title a { + color: #333; +} + +/* line 86, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .commit-desc pre { + margin-top: 5px; + margin-bottom: 10px; + font-size: 12px; + color: #596063; + border-left: 1px solid #e5e5e5; + padding-left: 8px; +} + +/* line 95, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship { + font-size: 12px; + color: #888; +} + +/* line 100, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship a { + color: #444; +} + +/* line 104, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship .author-name { + color: #444; +} + +/* line 108, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship .committer { + display: block; + font-size: 11px; +} + +/* line 113, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship .committer .mini-icon { + position: relative; + top: 2px; +} + +/* line 118, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .commit-links { + position: absolute; + top: 7px; + right: 8px; + width: 243px; + text-align: right; +} + +/* line 126, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .mini-icon-clippy { + visibility: hidden; + float: left; + margin-right: 7px; + margin-top: 5px; +} + +/* line 133, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:hover .mini-icon-clippy { + visibility: visible; +} + +/* line 137, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton { + float: right; + height: 18px; + padding: 0 7px; + line-height: 22px; + font-size: 11px; + color: #4e575b; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); + background: #eff6f9; + background: -moz-linear-gradient(#eff6f9, #ddecf3); + background: -webkit-linear-gradient(#eff6f9, #ddecf3); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#eff6f9',endColorstr='#ddecf3')"; + border: 1px solid #cedee5; + border-radius: 3px; + min-width: 70px; + text-align: center; +} + +/* line 155, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton .comment-popover { + color: #91A6B1; + border-right: 1px solid #ddd; + padding-right: 4px; +} + +/* line 161, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton { + color: #5a5b4e; +} + +/* line 165, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:nth-child(2n+1) .gobutton { + border-color: #d5dcdf; + background: #f2f5f6; + background: -moz-linear-gradient(#f2f5f6, #e3eaed); + background: -webkit-linear-gradient(#f2f5f6, #e3eaed); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f2f5f6',endColorstr='#e3eaed')"; +} + +/* line 173, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton { + border-color: #e7e86d; + background: #f9fac9; + background: -moz-linear-gradient(#f9fac9, #f3f494); + background: -webkit-linear-gradient(#f9fac9, #f3f494); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f9fac9',endColorstr='#f3f494')"; +} + +/* line 181, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton:hover { + text-decoration: none; + border-color: #cedee5; + background: #fbfdfe; + background: -moz-linear-gradient(#fbfdfe, #eaf4f8); + background: -webkit-linear-gradient(#fbfdfe, #eaf4f8); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbfdfe',endColorstr='#eaf4f8')"; +} + +/* line 190, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton > .sha, .commit-group-item.navigation-focus .gobutton:hover > .sha { + display: inline-block; + height: 22px; + margin-right: -3px; +} + +/* line 196, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton > .sha .mini-icon, .commit-group-item.navigation-focus .gobutton:hover > .sha .mini-icon { + position: relative; + top: 2px; + border-radius: 30px; + border: 1px solid #CFDEE5; + background-color: rgba(255, 255, 255, 0.5); + color: #91a6b1; + margin-left: 5px; + width: 16px; +} + +/* line 207, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton > .sha .mini-icon { + border: 1px solid #E7E86D; + color: #c3c45c; +} + +/* line 212, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton.with-comments { + padding-left: 5px; +} + +/* line 216, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton.with-comments .sha, .commit-group-item.navigation-focus .gobutton.with-comments:hover .sha { + padding-left: 8px; + border-left: 1px solid #cfdee5; +} + +/* line 221, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton.with-comments .sha { + border-left-color: #e1e29e; +} + +/* line 225, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton .comment-count, .commit-group-item.navigation-focus .gobutton:hover .comment-count { + float: left; + height: 22px; + padding-right: 9px; + line-height: 24px; + font-weight: bold; + border-right: 1px solid #f6fafc; +} + +/* line 234, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton .comment-count .mini-icon, .commit-group-item.navigation-focus .gobutton:hover .comment-count .mini-icon { + position: relative; + top: 2px; + color: #91A6B1; +} + +/* line 240, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton .comment-count .mini-icon { + color: #C3C45C; +} + +/* line 244, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .browse-button, .commit-group-item .compare-button { + clear: left; + margin-top: 1px; + font-size: 11px; + font-weight: bold; + text-align: right; + color: #999; +} + +/* line 253, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .browse-button .mini-icon { + position: relative; + top: 2px; +} + +/* line 258, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .browse-button:hover { + color: #4183C4; + background-position: 100% -95px; +} + +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 400; + src: local("Source Code Pro"), local("SourceCodePro-Regular"), url("/static/css/fonts/SourceCodePro-Regular.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 500; + src: local("Source Code Pro Medium"), local("SourceCodePro-Medium"), url("/static/css/fonts/SourceCodePro-Medium.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 600; + src: local("Source Code Pro Semibold"), local("SourceCodePro-Semibold"), url("/static/css/fonts/SourceCodePro-Semibold.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 700; + src: local("Source Code Pro Bold"), local("SourceCodePro-Bold"), url("/static/css/fonts/SourceCodePro-Bold.woff") format("woff"); +} +/* line 3, ../../../hub/static/css/mod/diff-base.scss */ +.code pre, xmp, plaintext, listing { + display: block; + font-size: 13px; + font-family: 'Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; + white-space: pre; + margin: 0; + padding: 0; +} + +/* line 12, ../../../hub/static/css/mod/diff-base.scss */ +.code pre { + line-height: 18px; +} + +/* line 16, ../../../hub/static/css/mod/diff-base.scss */ +.font-consolas pre { + font-family: Consolas,'Source Code Pro',Courier,Monaco,Menlo,monospace; +} + +/* line 20, ../../../hub/static/css/mod/diff-base.scss */ +.font-monaco pre { + font-family: Monaco,'Source Code Pro',Courier,Consolas,Menlo,monospace; +} + +/* line 24, ../../../hub/static/css/mod/diff-base.scss */ +.font-courier pre { + font-family: Courier,'Source Code Pro',Monaco,Consolas,Menlo,monospace; +} + +/* line 28, ../../../hub/static/css/mod/diff-base.scss */ +.font-dejavu pre { + font-family: 'DejaVu Sans Mono','Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; +} + +/* line 32, ../../../hub/static/css/mod/diff-base.scss */ +.font-ubuntu pre { + font-family: 'Ubuntu Mono','Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; +} + +/* line 37, ../../../hub/static/css/mod/diff-base.scss */ +pre, code, tt { + font-size: 12px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + border: 0; +} + +/* line 43, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .normal { + background-color: #FFF; +} + +/* line 47, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .deletion { + color: black; + background-color: #FDD; +} +/* line 50, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .deletion .x, .highlight .deletion .c { + color: black; + background-color: #ffaaaa; +} + +/* line 56, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .insertion { + color: black; + background-color: #DFD; +} +/* line 59, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .insertion .i, .highlight .insertion .c { + color: black; + background-color: #aaffaa; +} + +/* line 65, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped { + color: #cacaca; + background-color: #f9f9f9; +} +/* line 69, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a { + color: #cacaca; + vertical-align: middle; +} +/* line 73, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a:hover { + text-decoration: none; +} +/* line 77, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a[data-type="after"], .highlight .skipped a[data-type="before"] { + font-size: 20px; +} + +/* line 266, ../../../hub/static/css/mod/commits.scss */ +#files.commentable tr td pre:hover { + background-color: #FFC; +} + +/* line 268, ../../../hub/static/css/mod/commits.scss */ +.full-commit { + margin: 10px 0; + padding: 8px 8px 0; + background: #E6F1F6; + border: 1px solid #C5D5DD; + border-radius: 4px; +} + +/* line 276, ../../../hub/static/css/mod/commits.scss */ +.full-commit .commit-meta { + margin-left: -8px; + width: 100%; + padding: 8px; + background: white; + border-top: 1px solid #D8E6EC; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +/* line 286, ../../../hub/static/css/mod/commits.scss */ +.full-commit .commit-desc { + display: block; + margin: -4px 0 10px 0; +} + +/* line 291, ../../../hub/static/css/mod/commits.scss */ +.full-commit .commit-desc pre { + max-width: 100%; + font-size: 14px; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); +} + +/* line 297, ../../../hub/static/css/mod/commits.scss */ +.full-commit .browse-button { + float: right; + margin: -3px -3px 0 0; + height: 26px; + padding: 0 10px; + line-height: 26px; + font-size: 13px; + font-weight: bold; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); + background: #EFF6F9; + background: -moz-linear-gradient(#EFF6F9, #DDECF3); + background: -webkit-linear-gradient(#EFF6F9, #DDECF3); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#eff6f9',endColorstr='#ddecf3')"; + border: 1px solid #CEDEE5; + border-radius: 3px; +} + +/* line 314, ../../../hub/static/css/mod/commits.scss */ +.full-commit p.commit-title { + margin: 0 0 8px 0; + font-size: 18px; + font-weight: bold; + color: #213F4D; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); +} + +/* line 322, ../../../hub/static/css/mod/commits.scss */ +.clearfix { + display: block; +} + +/* line 326, ../../../hub/static/css/mod/commits.scss */ +.full-commit .sha-block { + float: right; + margin-left: 15px; + color: #888; + font-size: 12px; +} + +/* line 333, ../../../hub/static/css/mod/commits.scss */ +.full-commit .authorship { + margin-top: -2px; + margin-left: -4px; + margin-bottom: -4px; + font-size: 14px; + color: #999; +} + +/* line 341, ../../../hub/static/css/mod/commits.scss */ +.full-commit .authorship .gravatar { + margin-top: -2px; + margin-right: 3px; + vertical-align: middle; + border-radius: 3px; +} + +/* line 347, ../../../hub/static/css/mod/commits.scss */ +#files { + position: relative; +} + +/* line 351, ../../../hub/static/css/mod/commits.scss */ +#files .file, .file-box { + border: 1px solid #CCC; + margin-bottom: 13px; + position: relative; + background-color: #DDD; +} + +/* line 358, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta, .file-box .meta { + overflow: hidden; + padding: 5px 10px; + font-size: 12px; + height: 33px; + text-align: left; + color: #555; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #D8D8D8; + background: #FAFAFA; + background: -moz-linear-gradient(#FAFAFA, #EAEAEA); + background: -webkit-linear-gradient(#FAFAFA, #EAEAEA); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; +} + +/* line 373, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .info, .file-box .meta .info { + float: left; + height: 33px; + line-height: 33px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; +} + +/* line 380, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .actions, .file-box .meta .actions { + float: right; + height: 33px; + line-height: 33px; + margin-top: 1px; +} + +/* line 387, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .actions li:first-child, .file-box .meta .actions li:first-child { + background: transparent; + margin-left: 0; + padding-left: 0; +} + +/* line 393, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .actions li, .file-box .meta .actions li { + list-style-type: none; + float: left; + margin: 0 0 0 7px; +} + +/* line 399, ../../../hub/static/css/mod/commits.scss */ +.button-group li { + margin: 0 !important; +} + +/* line 403, ../../../hub/static/css/mod/commits.scss */ +.pagination-older-newer a { + padding: .1em .3em; + margin: .2em; + text-decoration: none; + color: #369; + float: none; +} + +/* line 411, ../../../hub/static/css/mod/commits.scss */ +.pagination-older-newer a:hover, .pagination a:active { + background-color: transparent; + color: #36f; +} + +/* line 416, ../../../hub/static/css/mod/commits.scss */ +.pagination-older-newer span.disabled { + padding: .1em .3em; + margin: .2em; + color: #bbb; + float: none; +} + +/* line 423, ../../../hub/static/css/mod/commits.scss */ +.commit .sha-block, .commit .sha { + padding-right: 3px; + font-size: 11px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; +} + +/* line 429, ../../../hub/static/css/mod/commits.scss */ +#files .file .data .line_numbers, .file-box .data .line_numbers { + background-color: #ECECEC; + color: #AAA; + padding: 0 6px; + border-right: 1px solid #DDD; + text-align: right; + cursor: pointer; +} + +/* line 437, ../../../hub/static/css/mod/commits.scss */ +#files .file .data .line_numbers a { + color: #AAA; +} + +/* line 441, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-added:before { + content: "\f06b"; +} + +/* line 442, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-removed:before { + content: "\f06c"; +} + +/* line 443, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-modified:before { + content: "\f06d"; +} + +/* line 444, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-moved:before, .mini-icon-renamed:before { + content: "\f06e"; +} + +/* line 445, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-commit-comment:before { + content: "\f02b"; +} + +/* line 447, ../../../hub/static/css/mod/commits.scss */ +.mega-icon-beer:before { + content: "\f269"; +} + +/* line 448, ../../../hub/static/css/mod/commits.scss */ +.mega-icon-commit-comment:before { + content: "\f22b"; +} + +/* line 450, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .info span.icon, +#files .file .meta .info span.diffstat, +.file-box .meta .info span.icon { + line-height: 0; + float: left; + margin: 5px 5px 0 0; + padding: 3px; + background: #F7F7F7; + border: 1px solid #CCC; + border-right-color: #E5E5E5; + border-bottom-color: #E5E5E5; + border-radius: 3px; +} + +/* line 463, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .info span.diffstat { + height: 16px; + padding: 3px 6px; +} + +/* line 467, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .info span:first-child, +#files .file .meta .info .icon + span, +.file-box .meta .info span:first-child, +.file-box .meta .info .icon + span { + border-left: 0 none; + box-shadow: inset 0 0 0 transparent; + margin-left: 0; + padding-left: 0; +} + +/* line 477, ../../../hub/static/css/mod/commits.scss */ +.commit-meta.comment-row .mini-icon { + color: #939AA0; + margin: 0 2px 0 1px; + top: 2px; + text-decoration: none; +} + +/* line 478, ../../../hub/static/css/mod/commits.scss */ +#files .file .data.empty, .file-box .data.empty { + padding: 10px 15px; + color: #777; +} + +/* line 482, ../../../hub/static/css/mod/commits.scss */ +.timeout { + width: 873px; + height: 528px; + border: 1px solid #C5D5DD; + background: url("/static/img/timeout.jpg") #E6F1F6 no-repeat; + background-position: 90% 50%; + padding: 0 32px 0 33px; + border-radius: 3px; +} + +/* line 491, ../../../hub/static/css/mod/commits.scss */ +.timeout h3 { + color: white; + font-size: 18px; + font-weight: bold; + text-shadow: darkGray 1px 1px 0; + padding: 15px 0 15px 0; +} + +/* line 498, ../../../hub/static/css/mod/commits.scss */ +.timeout h3 strong { + font-size: 30px; + display: block; +} + +/* line 502, ../../../hub/static/css/mod/commits.scss */ +.timeout p { + color: white; +} + +/* line 506, ../../../hub/static/css/mod/commits.scss */ +.side-avatar { + position: absolute; + float: left; + margin-left: -60px; +} + +/* line 512, ../../../hub/static/css/mod/commits.scss */ +div.generated, div.binary { + text-align: center; + background-color: #ddd; + padding: 30px; +} + +/* line 518, ../../../hub/static/css/mod/commits.scss */ +.commit-history-header { + margin-bottom: 55px; +} +/* line 521, ../../../hub/static/css/mod/commits.scss */ +.commit-history-header #search-commits { + margin: 15px 5px; +} + +/* Like these */ +/* line 1, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view { + position: absolute; + top: 0; + left: 0; + display: none; + margin-top: 18px; + background: white; + border: 1px solid #DDD; + border-radius: 3px; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + min-width: 120px; + z-index: 10; +} + +/* line 15, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur { + background: #3366FF; + color: white; +} + +/* line 19, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur small { + color: white; +} + +/* line 22, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view strong { + color: #3366FF; +} + +/* line 25, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur strong { + color: white; + font: bold; +} + +/* line 29, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul { + /* width: 100px; */ + list-style: none; + padding: 0; + margin: auto; +} + +/* line 35, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul li { + display: block; + padding: 5px 10px; + border-bottom: 1px solid #DDD; + cursor: pointer; + /* border-top: 1px solid #C8C8C8; */ +} + +/* line 42, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view small { + font-size: smaller; + color: #777; + font-weight: normal; +} + +/* line 1, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav { + margin-top: 6px; +} + +/* line 3, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label { + position: relative; + display: inline-block; + margin-left: 3px; + padding: 3px 7px; + border: 1px solid #ccc; + border-radius: 3px; + color: #333; + background-color: #fafafa; + vertical-align: middle; +} + +/* line 15, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::before, .metanav .counts-label::after { + content: ""; + position: absolute; + top: 50%; + right: 100%; + display: block; + margin-right: 0px; + margin-top: -6px; + width: 0; + height: 0; + border: 6px solid transparent; + border-right-color: #ccc; +} + +/* line 29, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::after { + margin-right: -1px; + border-right-color: #fafafa; +} + +/* line 2, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.metabox { + display: inline-block; + height: 8px; + background: #ccc; + text-indent: -9999px; + font-size: 12px; +} + +/* line 9, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats { + font: 13px Helvetica, arial, freesans, clean, sans-serif; + line-height: 1.4; + margin: 0; + padding: 0; + border: 0; + position: relative; + float: right; + width: 135px; + opacity: 0.5; + padding-bottom: 10px; +} + +/* line 21, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats:hover { + opacity: 1; +} + +/* line 24, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats:hover .list-tip { + display: block; +} + +/* line 27, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats a { + color: #4183c4; + text-decoration: none; +} + +/* line 31, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats-graph { + height: 10px; + overflow: hidden; +} + +/* line 35, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats-graph span { + display: inline-block; + height: 6px; + background: #ccc; + text-indent: -9999px; + float: left; +} + +/* line 42, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip, ul.list-tip { + border-radius: 3px; + box-shadow: 0 0 5px #ccc; + border: 1px solid #ddd; + background: #fff; + position: absolute; + padding-left: 0px; + top: 20px; + left: -20px; + width: 175px; + z-index: 100; + display: none; + margin-top: 0px; +} + +/* line 56, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip:before, ul.list-tip:before { + content: "▲"; + font-size: 14px; + margin: 0 auto; + width: 14px; + display: block; + margin-top: -13px; + color: #fff; + text-shadow: -1px -1px 2px #ccc; +} + +/* line 66, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li, ul.list-tip li { + margin: 0; + line-height: 100%; + list-style: none; + border-bottom: 1px solid #eee; + font-weight: bold; +} + +/* line 73, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li a, ol.list-tip li .other, ul.list-tip li a, ul.list-tip li .other { + color: #333; + padding: 8px 10px; + display: block; +} + +/* line 78, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li span.color-block, ul.list-tip li span.color-block { + display: inline-block; + width: 8px; + height: 10px; + margin-right: 5px; +} + +/* line 84, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li span.percent, ul.list-tip li span.percent { + float: right; + color: #999; +} + +/* fix project title for newer version of bootstrap*/ +/* line 6, ../../../hub/static/css/mod/project-info.scss */ +.pagehead .pull-left { + margin: 0; + font-size: 30px; + line-height: 36px; +} + +/* Hotfix for FlatUI */ +/* line 13, ../../../hub/static/css/mod/project-info.scss */ +.pagehead h2.pull-left { + margin: 0; +} + +/* line 17, ../../../hub/static/css/mod/project-info.scss */ +#project-info { + border: 1px solid #c5d5dd; + border-radius: 3px; + width: 100%; +} + +/* line 22, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div { + padding: 10px; +} + +/* line 25, ../../../hub/static/css/mod/project-info.scss */ +#project-info p { + margin: 0px; +} + +/* line 28, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div.team-label { + border-top: 1px solid #ccc; +} + +/* line 32, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div.git-url { + border-top: 1px solid #ccc; +} + +/* line 36, ../../../hub/static/css/mod/project-info.scss */ +#project-info input.git-url { + width: 480px; + margin: 0px; + cursor: auto; +} + +/* line 43, ../../../hub/static/css/mod/project-info.scss */ +#project-info .ssh div.ssh-url { + display: inline; +} +/* line 46, ../../../hub/static/css/mod/project-info.scss */ +#project-info .ssh div.http-url { + display: none; +} + +/* line 52, ../../../hub/static/css/mod/project-info.scss */ +#project-info .http div.ssh-url { + display: none; +} +/* line 55, ../../../hub/static/css/mod/project-info.scss */ +#project-info .http div.http-url { + display: inline; +} + +/* line 60, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar { + margin-top: 12px; + border-bottom: 1px solid #DDD; +} + +/* line 61, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar #back-old-browser { + padding-top: 8px; + float: right; +} + +/* line 62, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab { + padding-left: 20px; +} + +/* line 63, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li { + display: inline-block; + vertical-align: top; + cursor: pointer; +} + +/* line 64, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li a { + color: #666; + text-decoration: none; + padding: 8px 12px; + display: inline-block; + border-left: 1px solid transparent; + border-top: 1px solid transparent; + border-right: 1px solid transparent; + margin-bottom: -1px; +} + +/* line 65, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li a.active { + color: #333; + font-weight: bold; + border-left: 1px solid #DDD; + border-top: 1px solid #DDD; + border-right: 1px solid #DDD; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + background-color: white; +} + +/* line 67, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar .scope { + float: left; + margin-right: 10px; +} + +/* line 71, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar .scope i { + font-style: normal; +} + +/* line 75, ../../../hub/static/css/mod/project-info.scss */ +#breadcrumb { + margin: 10px 0; + font-size: 18px; + font-weight: bold; + color: #999; +} + +/* line 76, ../../../hub/static/css/mod/project-info.scss */ +#breadcrumb .final-path { + color: #000; +} + +/* line 1, ../../../hub/static/css/mod/commits-condensed.scss */ +table.commits { + width: 100%; + margin-top: 10px; +} + +/* line 6, ../../../hub/static/css/mod/commits-condensed.scss */ +.boxed-group { + position: relative; + background: #EFEFEF; + padding: 3px; + border-radius: 3px; + margin: 0 0 15px 0; +} + +/* line 13, ../../../hub/static/css/mod/commits-condensed.scss */ +.boxed-group > h3 { + background: #FAFAFA; + background: -moz-linear-gradient(#FAFAFA, #E0E0E0); + background: -webkit-linear-gradient(#FAFAFA, #E0E0E0); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#e0e0e0')"; + margin: 0; + border-top-left-radius: 1px; + border-top-right-radius: 1px; + border: 1px solid #D8D8D8; + border-bottom: 1px solid #CCC; + padding: 10px 10px 11px 10px; + font-size: 14px; + text-shadow: 0 1px 0 white; +} + +/* line 27, ../../../hub/static/css/mod/commits-condensed.scss */ +.boxed-group .boxed-group-inner { + padding: 1px 10px; + background: white; + border: 1px solid #D8D8D8; + border-top: none; + border-bottom-left-radius: 1px; + border-bottom-right-radius: 1px; + color: #666; + font-size: 13px; +} + +/* line 37, ../../../hub/static/css/mod/commits-condensed.scss */ +.boxed-group.condensed > h3 { + padding: 6px 6px 7px; + font-size: 12px; +} + +/* line 41, ../../../hub/static/css/mod/commits-condensed.scss */ +.boxed-group.condensed > h3 i { + position: relative; + padding: 0 6px 0 2px; +} + +/* line 45, ../../../hub/static/css/mod/commits-condensed.scss */ +.boxed-group.condensed .boxed-group-inner { + font-size: 12px; + padding: 0; +} + +/* line 50, ../../../hub/static/css/mod/commits-condensed.scss */ +.boxed-group-list > li { + display: block; + margin-left: -10px; + width: 100%; + padding: 5px 10px; + line-height: 23px; + border-bottom: 1px solid #E5E5E5; +} + +/* line 59, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed { + margin-top: 0; + border: none; + background-color: white; +} + +/* line 64, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td { + padding: 4px; + vertical-align: top; + border-top: 1px solid #E2EAEE; +} + +/* line 69, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td.gravatar { + width: 29px; + padding: 5px; +} + +/* line 74, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed tr:first-child td { + border-top: 0; +} + +/* line 77, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed tr:nth-child(2n) td { + background: #F7FBFC; +} + +/* line 80, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed span.gravatar { + display: block; + width: 16px; + height: 16px; + line-height: 1px; + padding: 1px; + border: 1px solid #DDD; + background: white; +} + +/* line 89, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed span.gravatar a { + display: inline-block; +} + +/* line 92, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td.author { + padding-left: 0; + color: #666; + width: 100px; + font-weight: bold; +} + +/* line 98, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td.author span.commit-author { + display: inline-block; + width: 100px; + text-overflow: ellipsis; + overflow: hidden; + line-height: 22px; +} + +/* line 105, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td.author a { + color: #333; +} + +/* line 108, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td.message { + padding-left: 0; +} + +/* line 111, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed code { + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + background: inherit; +} + +/* line 115, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td.message code { + line-height: 22px; +} + +/* line 118, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td.message a { + color: #333; +} + +/* line 121, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed .commit-desc pre { + margin-top: 5px; + margin-bottom: 4px; + border-left: 1px solid #E5E5E5; + padding-left: 8px; + font-size: 11px; + font-weight: normal; + color: #596063; +} + +/* line 130, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td.commit-meta { + width: 1%; + text-align: right; + white-space: nowrap; + padding-right: 10px; +} + +/* line 136, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td.commit-meta code { + line-height: 22px; +} + +/* following style for new-pull 'xxx add commits' commits-condense style */ +/* line 142, ../../../hub/static/css/mod/commits-condensed.scss */ +table.commits { + width: 100%; + margin: 0; + font-size: 12px; +} + +/* line 147, ../../../hub/static/css/mod/commits-condensed.scss */ +table.commits .commit { + width: 59px; + padding-right: 10px; +} + +/* line 151, ../../../hub/static/css/mod/commits-condensed.scss */ +table.commits code { + border: none; +} + +/* line 154, ../../../hub/static/css/mod/commits-condensed.scss */ +table.commits td.message { + /* width: 70%;*/ +} + +/* line 157, ../../../hub/static/css/mod/commits-condensed.scss */ +table.commits td.date { + text-align: right; +} + +/* line 161, ../../../hub/static/css/mod/commits-condensed.scss */ +table.commits-condensed code { + white-space: normal; +} + +/* line 164, ../../../hub/static/css/mod/commits-condensed.scss */ +table.commits-condensed pre { + white-space: pre-wrap; +} + +/* button list */ +/* line 3, ../../../hub/static/css/mod/file-blob.scss */ +.button-group { + display: inline-block; + overflow: hidden; + border: 1px solid #d4d4d4; + border-radius: 3px; + border-bottom-color: #bcbcbc; + background: #f5f5f5; + background: -moz-linear-gradient(#f5f5f5, #e5e5e5); + background: -webkit-linear-gradient(#f5f5f5, #e5e5e5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; +} + +/* line 4, ../../../hub/static/css/mod/file-blob.scss */ +.button-group li { + margin: 0 !important; + float: left; +} + +/* line 5, ../../../hub/static/css/mod/file-blob.scss */ +.button-group li:first-child .grouped-button { + border-left: none; + border-bottom-left-radius: 2px; + border-top-left-radius: 2px; +} + +/* line 6, ../../../hub/static/css/mod/file-blob.scss */ +.button-group li:last-child .grouped-button { + border-right: none; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 2px; +} + +/* line 7, ../../../hub/static/css/mod/file-blob.scss */ +.button-group .grouped-button { + float: left; + background: none; + border-bottom: none; + border-top: none; + border-left: 1px solid rgba(0, 0, 0, 0.1); + border-right: 1px solid rgba(255, 255, 255, 0.5); + border-radius: 0; + cursor: pointer; +} + +/* line 8, ../../../hub/static/css/mod/file-blob.scss */ +.button-group .minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line-no */ +/* line 12, ../../../hub/static/css/mod/file-blob.scss */ +#blob .file { + min-height: 78px; + position: relative; + overflow: auto; +} + +/* line 13, ../../../hub/static/css/mod/file-blob.scss */ +#blob .file .rawfile { + text-align: center; + background-color: #ddd; + padding: 30px; + position: relative; +} + +/* line 14, ../../../hub/static/css/mod/file-blob.scss */ +.file table { + width: 100%; + border-collapse: collapse; + border-spacing: 0; +} + +/* line 15, ../../../hub/static/css/mod/file-blob.scss */ +.file table td, .file table th { + vertical-align: top; + padding: 0; +} + +/* line 16, ../../../hub/static/css/mod/file-blob.scss */ +.file .data { + overflow: auto; +} + +/* line 18, ../../../hub/static/css/mod/file-blob.scss */ +.code { + width: 100%; +} + +/* line 19, ../../../hub/static/css/mod/file-blob.scss */ +.code .highlight pre { + margin: 0; + padding: 8px; + border: none; + background-color: #FFF; + white-space: pre; +} + +/* line 20, ../../../hub/static/css/mod/file-blob.scss */ +.code .highlight pre a { + display: block; +} + +/* line 23, ../../../hub/static/css/mod/file-blob.scss */ +.linenos .linenodiv pre { + background-color: #ECECEC; + padding: 8px; + border: none; + border-right: 1px solid #DDD; + text-align: right; + white-space: pre; +} + +/* line 24, ../../../hub/static/css/mod/file-blob.scss */ +.linenos .linenodiv pre a { + color: #AAA; + text-decoration: none; + white-space: nowrap; + line-height: 18px; +} + +/* line 25, ../../../hub/static/css/mod/file-blob.scss */ +.code .highlight pre, .linenos .linenodiv pre { + margin: 0; + line-height: 18px; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +/* line 32, ../../../hub/static/css/mod/file-blob.scss */ +.linenos { + padding: 0; +} + +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 400; + src: local("Source Code Pro"), local("SourceCodePro-Regular"), url("/static/css/fonts/SourceCodePro-Regular.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 500; + src: local("Source Code Pro Medium"), local("SourceCodePro-Medium"), url("/static/css/fonts/SourceCodePro-Medium.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 600; + src: local("Source Code Pro Semibold"), local("SourceCodePro-Semibold"), url("/static/css/fonts/SourceCodePro-Semibold.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 700; + src: local("Source Code Pro Bold"), local("SourceCodePro-Bold"), url("/static/css/fonts/SourceCodePro-Bold.woff") format("woff"); +} +/* line 3, ../../../hub/static/css/mod/diff-base.scss */ +.code pre, xmp, plaintext, listing { + display: block; + font-size: 13px; + font-family: 'Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; + white-space: pre; + margin: 0; + padding: 0; +} + +/* line 12, ../../../hub/static/css/mod/diff-base.scss */ +.code pre { + line-height: 18px; +} + +/* line 16, ../../../hub/static/css/mod/diff-base.scss */ +.font-consolas pre { + font-family: Consolas,'Source Code Pro',Courier,Monaco,Menlo,monospace; +} + +/* line 20, ../../../hub/static/css/mod/diff-base.scss */ +.font-monaco pre { + font-family: Monaco,'Source Code Pro',Courier,Consolas,Menlo,monospace; +} + +/* line 24, ../../../hub/static/css/mod/diff-base.scss */ +.font-courier pre { + font-family: Courier,'Source Code Pro',Monaco,Consolas,Menlo,monospace; +} + +/* line 28, ../../../hub/static/css/mod/diff-base.scss */ +.font-dejavu pre { + font-family: 'DejaVu Sans Mono','Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; +} + +/* line 32, ../../../hub/static/css/mod/diff-base.scss */ +.font-ubuntu pre { + font-family: 'Ubuntu Mono','Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; +} + +/* line 37, ../../../hub/static/css/mod/diff-base.scss */ +pre, code, tt { + font-size: 12px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + border: 0; +} + +/* line 43, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .normal { + background-color: #FFF; +} + +/* line 47, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .deletion { + color: black; + background-color: #FDD; +} +/* line 50, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .deletion .x, .highlight .deletion .c { + color: black; + background-color: #ffaaaa; +} + +/* line 56, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .insertion { + color: black; + background-color: #DFD; +} +/* line 59, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .insertion .i, .highlight .insertion .c { + color: black; + background-color: #aaffaa; +} + +/* line 65, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped { + color: #cacaca; + background-color: #f9f9f9; +} +/* line 69, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a { + color: #cacaca; + vertical-align: middle; +} +/* line 73, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a:hover { + text-decoration: none; +} +/* line 77, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a[data-type="after"], .highlight .skipped a[data-type="before"] { + font-size: 20px; +} + +/* line 1, ../../../hub/static/css/mod/colorcube.scss */ +.colorcube { + position: absolute; + width: 30px; + height: 30px; + border: 1px solid #DDD; +} + +/* line 2, ../../../hub/static/css/mod/colorcube.scss */ +.colorcube::before { + content: ""; + display: block; + height: 0; + width: 0; + border: 5px solid #DDD; + border-width: 5px; + border-color: #DDD transparent transparent transparent; + left: 10px; + top: 30px; + float: left; + position: absolute; +} + +/* line 5, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .line_numbers, .file-box .data .line_numbers { + background-color: #ECECEC; + color: #AAA; + padding: 0 2px 0 16px; + border-right: 1px solid #DDD; + text-align: right; + cursor: pointer; +} +/* line 12, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .line_numbers.deletion, .file-box .data .line_numbers.deletion { + color: #AAA; + background-color: #f7c8c8; +} +/* line 16, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .line_numbers.insertion, .file-box .data .line_numbers.insertion { + color: #AAA; + background-color: #ceffce; +} + +/* line 21, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .line_numbers a { + color: #AAA; +} + +/* line 24, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .code { + width: 100%; +} + +/* line 28, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .side { + overflow-x: none; + display: none; +} + +/* line 33, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .side .file-col { + width: 50%; + float: left; + overflow-x: auto; +} + +/* line 40, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .diff-table { + border-collapse: collapse; +} + +/* line 44, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files.commentable tr td pre:hover { + background-color: #FFC; +} + +/* line 46, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .diff-table pre { + border-radius: 0px; +} + +/* line 48, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data table, .file-box .data table { + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + font-size: 12px; + line-height: 1.4; +} + +/* line 54, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .file-diff-line span.color { + cursor: default; +} + +/* Comment Bubble */ +/* line 58, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file-diff-line .add-bubble { + position: absolute; + left: 0; + width: 25px; + height: 16px; + margin-top: 0; + cursor: pointer; + opacity: 0; + color: #4183C4; +} + +/* line 69, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file-diff-line:hover .add-bubble { + opacity: 1; +} + +/* Comment Bubble icons */ +/* line 72, ../../../hub/static/css/mod/file-diff-blob.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 83, ../../../hub/static/css/mod/file-diff-blob.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 91, ../../../hub/static/css/mod/file-diff-blob.scss */ +.mini-icon-add-comment::before { + content: "\f06f"; +} + +/* line 93, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container:first-child:after { + margin: -18px 0 0; +} + +/* line 97, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container:after { + background: none repeat scroll 0 0 #fff; + content: ""; + display: block; + height: 2px; + margin: -16px 0 0; + position: absolute; + left: 0px; + width: 938px; +} + +/* line 109, ../../../hub/static/css/mod/file-diff-blob.scss */ +.data .line-numbers-skipped { + position: absolute; + width: 79px; + background-color: #f5f5f5; + border-right: 1px solid #ccc; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; +} + +/* line 119, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .skipped-top, .skipped-container .skipped-bottom { + height: 18px; + background-color: #f5f5f5; +} + +/* line 124, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-top::before { + background: #fff; + border-bottom: 1px solid #ccc; + border-top: 1px solid #ccc; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + content: ""; + display: block; + height: 4px; + position: relative; + top: -1px; + margin-left: -1px; +} + +/* line 140, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .ellipsis:hover { + background-color: #e6e6e6; + border-color: #999; +} + +/* line 145, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .ellipsis { + background: #f5f5f5; + border: 1px solid #ccc; + -moz-border-radius: 3px; + border-radius: 3px; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + box-shadow: 0 0 0 2px #fff; + cursor: pointer; + display: block; + float: left; + font-family: Arial, sans-serif; + font-size: 20px; + text-align: center; + color: #707070; + height: 16px; + line-height: 6px; + margin: 0 0 0 5px; + padding: 0; + position: absolute; + width: 30px; + z-index: 10; +} + +/* line 170, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-top .ellipsis { + margin-top: -10px; +} + +/* line 174, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .ellipsis::before, .skipped-container .ellipsis::after { + border: 1px solid #ccc; + -moz-border-radius: 4px; + border-radius: 4px; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + content: ""; + height: 9px; + left: -4px; + width: 36px; + position: absolute; +} + +/* line 188, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .ellipsis::before { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + content: "\2026"; + padding: 2px 0 0; + top: -4px; +} + +/* line 197, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .ellipsis::after { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; + bottom: -4px; + height: 10px; +} + +/* line 206, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .toggle_whitespace:hover { + background-color: #e6e6e6; + border-color: #999; +} + +/* line 211, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .toggle_whitespace { + background: #f5f5f5; + border: 1px solid #ccc; + -moz-border-radius: 3px; + border-radius: 3px; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + box-shadow: 0 0 0 2px #fff; + cursor: pointer; + display: block; + float: left; + font-family: Arial, sans-serif; + font-size: 16px; + text-align: center; + color: #707070; + height: 16px; + line-height: 6px; + margin: 0 0 0 44px; + padding: 0; + position: absolute; + width: 30px; + z-index: 10; +} + +/* line 236, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-top .toggle_whitespace { + margin-top: -10px; +} + +/* line 240, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .toggle_whitespace::before, .skipped-container .toggle_whitespace::after { + border: 1px solid #ccc; + -moz-border-radius: 4px; + border-radius: 4px; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + content: ""; + height: 9px; + left: -4px; + width: 36px; + position: absolute; +} + +/* line 254, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .toggle_whitespace::before { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + content: "\2423"; + padding: 2px 0 0; + top: -4px; +} + +/* line 263, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .toggle_whitespace::after { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; + bottom: -4px; + height: 10px; +} + +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* line 3, ../../../hub/static/css/mod/merge-guide.scss */ +.pullrequest .merge-guide { + margin: 20px 0; +} + +/* line 4, ../../../hub/static/css/mod/merge-guide.scss */ +.commit-preview { + margin: 10px 0 0 0; +} +/* line 7, ../../../hub/static/css/mod/merge-guide.scss */ +.commit-preview .message, .commit-preview .commit-preview p.error { + clear: both; + padding: 5px; + background: #eaf2f5; + border: 1px solid #bedce7; +} +/* line 14, ../../../hub/static/css/mod/merge-guide.scss */ +.commit-preview .message pre { + font-size: 11px; + color: #333; + white-space: pre-wrap; + word-wrap: break-word; +} + +/* line 24, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch .mergeable { + padding: 8px 10px; + border: 1px solid #ddd; + border-radius: 2px; +} +/* line 30, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch .mergeable.merging { + background-color: #589ab3; + background-image: -moz-linear-gradient(#82bccd, #589ab3); + background-image: -webkit-linear-gradient(#82bccd, #589ab3); + background-image: linear-gradient(#82bccd, #589ab3); + background-repeat: repeat-x; + border-color: #7699ad; + border-bottom-color: #648192; + border-top-left-radius: 0; + border-top-right-radius: 0; + background-repeat: repeat-x; + border-color: #8bc384; +} +/* line 44, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch.mergeable-clean .mergeable { + background-color: #6eda62; + background-image: -moz-linear-gradient(#9ee692, #6eda62); + background-image: -webkit-linear-gradient(#9ee692, #6eda62); + background-image: linear-gradient(#9ee692, #6eda62); +} +/* line 50, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch.mergeable-clean .mergeable p.message { + color: #0b5f00; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.4); +} +/* line 54, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch.mergeable-clean .mergeable p.message span.blue { + color: blue; +} +/* line 58, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch.mergeable-dirty .mergeable, .merge-branch .dirty-cleanup .mergeable { + position: relative; + background-color: #f6e69f; + background-image: -moz-linear-gradient(#f6e69f, #f6e69f); + background-image: -webkit-linear-gradient(#f6e69f, #f6e69f); + background-image: linear-gradient(#f6e69f, #f6e69f); + background-repeat: repeat-x; + border-color: #888; +} +/* line 68, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch.mergeable-error .mergeable, .merge-branch .dirty-cleanup .mergeable { + position: relative; + background-color: #da4f49; + background-image: -moz-linear-gradient(#da4f49, #da4f49); + background-image: -webkit-linear-gradient(#da4f49, #da4f49); + background-image: linear-gradient(#da4f49, #da4f49); + background-repeat: repeat-x; + border-color: #888; +} +/* line 78, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch .minibutton { + float: right; + margin: -3px 0 0 15px; +} +/* line 83, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch p.message { + margin: 0; + font-size: 13px; + font-weight: bold; +} +/* line 89, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch .merge-form .merge-error-message { + display: none; + margin: 10px 0 0 0; + padding: 5px 7px; + color: #bd2c00; + font-weight: bold; + font-size: 12px; + line-height: 19px; + background: rgba(255, 255, 255, 0.8); + border-radius: 2px; +} +/* line 101, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch .commit-preview { + position: relative; + display: table-row; + font-size: 12px; +} +/* line 106, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch .commit-preview .author { + display: table-cell; + width: 36px; + padding: 8px 10px; + vertical-align: top; + background: #d3e5eb; + border: 1px solid #bedce7; + border-right: none; +} +/* line 116, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch .commit-preview .gravatar { + float: left; + margin: 2px 8px 0 0; +} +/* line 121, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch .commit-preview .message { + display: table-cell; + width: 805px; + padding: 8px 10px; + vertical-align: top; + background-color: #e7f0f3; + background-image: -moz-linear-gradient(#f6f9fa, #e7f0f3); + background-image: -webkit-linear-gradient(#f6f9fa, #e7f0f3); + background-image: linear-gradient(#f6f9fa, #e7f0f3); + background-repeat: repeat-x; + border: 1px solid #bedce7; +} +/* line 133, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch .commit-preview .message pre { + font-family: Monaco, "Liberation Mono", Courier, monospace; + font-size: 12px; + color: #5b6f74; +} +/* line 139, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch .commit-preview .message textarea { + margin-top: 5px; + box-sizing: border-box; + width: 100%; + height: 50px; + padding: 4px; + font-family: Monaco, "Liberation Mono", Courier, monospace; + font-size: 12px; + color: #666; + background-color: #fafafa; +} + +/* line 154, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-form { + display: none; +} + +/* line 1, ../../../hub/static/css/mod/diff-stat.scss */ +#toc li { + border-bottom: 1px solid #DDD; + list-style-type: none; + padding: 5px; +} + +/* line 7, ../../../hub/static/css/mod/diff-stat.scss */ +#toc { + margin: 15px 0; +} + +/* line 11, ../../../hub/static/css/mod/diff-stat.scss */ +#toc .diffstat { + float: right; +} + +/* line 14, ../../../hub/static/css/mod/diff-stat.scss */ +#toc .mini-icon-modified { + color: #677A85; +} + +/* line 18, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat { + white-space: nowrap; + text-align: right; + font-family: Helvetica,arial,freesans,clean,sans-serif; + color: #666; + font-weight: bold; + font-size: 11px; +} + +/* line 26, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat a { + text-decoration: none; + color: #666; +} + +/* line 30, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar { + position: relative; + left: -3px; + display: inline-block; + height: 12px; + text-decoration: none; + text-align: left; + color: #EEE; + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + line-height: 1; + -webkit-font-smoothing: antialiased; + font-size: 16px; + letter-spacing: -7px; +} + +/* line 48, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar.diff-added, +span.diffstat .diffstat-bar i.plus { + color: #61C423; + font-style: normal; +} + +/* line 53, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar.diff-added, +span.diffstat .diffstat-bar i.minus { + color: #C52323; + font-style: normal; +} + +/* line 59, ../../../hub/static/css/mod/diff-stat.scss */ +p.explain { + font-size: 12px; + color: #666; + margin: 1em 0; +} + +/* line 65, ../../../hub/static/css/mod/diff-stat.scss */ +p.explain .minibutton { + float: right; + top: -4px; +} + +/* line 3, ../../../hub/static/css/mod/diffs-pane.scss */ +.diff-cutoff { + margin-bottom: -2px; + height: 35px; + line-height: 37px; + font-size: 12px; + font-weight: bold; + color: #000; + text-align: center; + background: url("/static/img/compare_too_big.gif") 0 0 no-repeat; +} + +/* line 5, ../../../hub/static/css/mod/diffs-pane.scss */ +.fullscreen-mode { + overflow: hidden; +} + +/* line 6, ../../../hub/static/css/mod/diffs-pane.scss */ +#fullscreen-stage { + display: none; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + overflow-y: auto; + background: #fff; + z-index: 9999; +} + +/* line 7, ../../../hub/static/css/mod/diffs-pane.scss */ +#files #fullscreen-stage .file { + margin: 0; +} + +/* preview comment form style */ +/* line 2, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav { + margin: 10px 0; + border-bottom: 1px solid #DDD; + height: 35px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs { + display: inline-block; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs > li { + display: inline-block; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab { + display: inline-block; + margin-bottom: -1px; + padding: 8px 12px 9px; + border: 1px solid transparent; + border-bottom: 0; + font-size: 14px; + color: #666; + text-decoration: none; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab.selected { + border-color: #DDD; + border-radius: 3px 3px 0 0; + background-color: white; + color: #333; + font-weight: bold; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab:hover { + text-decoration: none; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav { + position: relative; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav ul.tabnav-tabs { + padding-left: 10px; +} + +/* line 10, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 0 10px 10px; +} + +/* line 11, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form #preview_bucket .content-body { + padding: 10px; + min-height: 132px; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form.tab-content { + overflow: initial; + position: relative; +} + +/* line 2, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 10px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-actions { + padding: 0; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + position: relative; + border: 3px solid #EEE; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + padding: 0; + background: #EEE; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content .write-content { + padding: 0 10px 10px; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; + margin: 0; +} + +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary, button.primary.classy:disabled, button.primary.classy.disabled, button.primary.classy:disabled:hover, button.primary.classy.disabled:disabled:hover, button.classy:disabled:hover.primary, button.classy.disabled:disabled:hover.primary { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4); + border-color: #74BB5A; + border-bottom-color: #509338; + background: #8ADD6D; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#8add6d', endColorstr='#60b044')"; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); + background-image: -webkit-linear-gradient(top, #8ADD6D, #60B044); +} + +/* line 2, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary.disabled { + opacity: 0.5; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy, +button.classy:disabled, +button.classy.disabled, +a.button.classy:disabled, +a.button.classy.disabled, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover:disabled, +a.button.classy.disabled:hover, +a.button.classy, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy:disabled:hover, +a.button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover { + display: inline-block; + padding: 8px 15px; + line-height: normal; + position: relative; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 12px; + font-weight: bold; + color: #666; + text-shadow: 0 1px rgba(255, 255, 255, 0.9); + background: whiteSmoke; + background: -moz-linear-gradient(whiteSmoke, #E5E5E5); + background: -webkit-linear-gradient(whiteSmoke, #E5E5E5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; + border-radius: 3px; + border: 1px solid #DDD; + border-bottom-color: #BBB; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* ================================== *\ + * Zen Form + * ================================== */ +/* line 6, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + position: fixed; + z-index: 99999; + top: 0; + left: 0; + right: 0; + bottom: 0; + padding: 24px 30px 24px 24px; +} + +/* line 16, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-input-wrap { + max-width: 640px; + position: relative; + margin: 0 auto; +} + +/** + * Buttons style + */ +/* line 25, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button, +.zen-forms-theme-switch { + position: absolute; + width: 18px; + height: 18px; + text-align: center; + top: 10px; + right: 10px; + font-size: 24px; + color: #516066; + cursor: pointer; + line-height: 1; +} + +/* line 39, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-theme-switch { + top: 28px; + font-size: 34px; +} + +/* line 44, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button:hover, +.zen-forms-theme-switch:hover { + color: #667981; +} + +/** + * Inputs basic style + */ +/* line 52, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + padding: 8px 0; + width: 100%; + background: none; + border: none; + margin-bottom: 24px; + cursor: pointer; +} + +/* line 62, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus, +.zen-forms textarea:focus { + cursor: text; +} + +/* line 67, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms textarea { + resize: none; +} + +/* line 71, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + cursor: pointer; + display: none; + padding: 8px 3; + position: absolute; + top: 0; + width: 100%; +} + +/* line 80, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms .empty + label { + display: block; +} + +/* line 84, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus + label, +.zen-forms textarea:focus + label { + display: none; +} + +/* line 89, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms :focus { + outline-color: transparent; + outline-style: none; +} + +/** + * Dark theme + */ +/* line 97, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + background: #151a1c; +} + +/* line 101, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + color: #516066; +} + +/* line 105, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + color: #667981; +} + +/** + * Light theme + */ +/* line 113, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme { + background: #fefefe; +} + +/* line 117, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme label { + color: #959697; +} + +/* line 121, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme input, +.zen-forms.light-theme textarea { + color: #707071; +} + +/* line 4, ../../../hub/static/css/mod/zen-forms.scss */ +.write-content .enable-fullscreen { + position: absolute; + top: 5px; + right: 16px; + color: #333333; + opacity: .5; + line-height: 1em; +} + +/* line 5, ../../../hub/static/css/mod/zen-forms.scss */ +.mini-icon-fullscreen::before { + content: ""; +} + +/* line 6, ../../../hub/static/css/mod/zen-forms.scss */ +.fullscreen-overlay textarea, .zen-forms textarea { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + height: 100%; + padding: 20px; + border: 0; + font-size: 21px; + line-height: 1.6em; + resize: none; + -moz-transition: color 0.15s ease-in 0; + -webkit-transition: color 0.15s ease-in 0; + transition: color 0.15s ease-in 0; + box-shadow: none; +} + +/* line 7, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms.light-theme textarea { + background: #fff; + color: #999999; +} + +/* line 8, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms .zen-forms-input-wrap { + width: 100%; + height: 100%; +} + +/* line 9, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms label[for^=zen-forms-input] { + display: none; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-zen.scss */ +.previewable-comment-form .zen-enabled textarea { + padding: 10px 18px 10px 10px; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled { + position: relative; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled .go-zen { + position: absolute; + right: 15px; + top: 5px; +} + +/* line 1, ../../../hub/static/css/mod/loader.scss */ +.loader { + display: none; + position: absolute; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + background-color: #eee; +} + +/* line 2, ../../../hub/static/css/mod/loader.scss */ +.loader .spinner { + display: block; + width: 32px; + height: 32px; + margin: 0 auto; + top: 121px; + position: relative; + background: url(/static/img/spinner.gif) no-repeat; +} + +/* line 1, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view { + position: absolute; + top: 0; + left: 0; + display: none; + margin-top: 18px; + background: white; + border: 1px solid #DDD; + border-radius: 3px; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + min-width: 120px; + z-index: 10; +} + +/* line 15, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur { + background: #3366FF; + color: white; +} + +/* line 19, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur small { + color: white; +} + +/* line 22, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view strong { + color: #3366FF; +} + +/* line 25, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur strong { + color: white; + font: bold; +} + +/* line 29, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul { + /* width: 100px; */ + list-style: none; + padding: 0; + margin: auto; +} + +/* line 35, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul li { + display: block; + padding: 5px 10px; + border-bottom: 1px solid #DDD; + cursor: pointer; + /* border-top: 1px solid #C8C8C8; */ +} + +/* line 42, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view small { + font-size: smaller; + color: #777; + font-weight: normal; +} + +/* line 9, ../../../hub/static/css/mod/comment-form.scss */ +.side-avatar { + margin-left: 0; +} + +/* fix li header for newer version of bootstrap */ +/* line 12, ../../../hub/static/css/mod/comment-form.scss */ +.comment-form-head li { + line-height: 18px; +} + +/* line 16, ../../../hub/static/css/mod/comment-form.scss */ +#new_comment .form-content { + width: 880px; + margin-left: 60px; +} + +/* line 18, ../../../hub/static/css/mod/comment-form.scss */ +.discussion-bubble-avatar { + position: relative; + float: left; + border-radius: 3px; +} + +/* line 19, ../../../hub/static/css/mod/comment-form.scss */ +.discussion-bubble-inner { + min-height: 60px; + border: 1px solid #CACACA; + background-color: white; +} + +/* line 1, ../../../hub/static/css/mod/upload-widget.scss */ +.upload-widget { + position: relative; + top: -50px; + width: 360px; +} +/* line 7, ../../../hub/static/css/mod/upload-widget.scss */ +.upload-widget input { + position: absolute; + width: 120px; + opacity: 0.0001; + cursor: pointer; + margin: 0; +} +/* line 15, ../../../hub/static/css/mod/upload-widget.scss */ +.upload-widget form { + width: 120px; + float: left; +} + +/* line 1, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body { + padding: 30px; +} + +/* line 4, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body > :first-child { + margin-top: 0 !important; +} + +/* line 7, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body h1, +.markdown-body h2, +.markdown-body h3, +.markdown-body h4, +.markdown-body h5, +.markdown-body h6 { + margin: 20px 0 10px; + padding: 0; + font-weight: bold; + -webkit-font-smoothing: antialiased; + cursor: text; + position: relative; +} + +/* line 20, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body h2 { + font-size: 24px; + border-bottom: 1px solid #CCC; + color: black; +} + +/* line 25, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body, +.markdown-body p { + font-size: 14px; + line-height: 1.6; +} + +/* line 30, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body p, +.markdown-body blockquote, +.markdown-body ul, +.markdown-body ol, +.markdown-body dl, +.markdown-body table, +.markdown-body pre { + margin: 15px 0; +} + +/* line 39, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul, +.markdown-body ol { + padding-left: 30px; +} + +/* line 43, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul li { + line-height: 1.6; +} + +/* line 46, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul { + list-style: disc; +} + +/* line 49, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ol { + list-style: decimal; +} + +/* line 52, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table { + width: 100%; +} + +/* line 55, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table caption + thead tr:first-child th, +.markdown-body table caption + thead tr:first-child td, +.markdown-body table colgroup + thead tr:first-child th, +.markdown-body table colgroup + thead tr:first-child td, +.markdown-body table thead:first-child tr:first-child th, +.markdown-body table thead:first-child tr:first-child td { + border-top: 0; +} + +/* line 63, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table thead th { + vertical-align: bottom; +} + +/* line 66, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th { + font-weight: bold; +} + +/* line 69, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th, +.markdown-body table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #ddd; +} + +/* line 77, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th, +.markdown-body table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #ddd; +} + +/* line 85, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table tbody > tr:nth-child(odd) > td, +.markdown-body table tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} + +/* line 89, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body .progress-percentage { + color: #888; +} + +/* line 93, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page { + padding: 0px; +} + +/* line 96, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page h1, +.markdown-page h2, +.markdown-page h3, +.markdown-page h4, +.markdown-page h5, +.markdown-page h6 { + position: static; +} + +/* line 104, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page pre { + font-family: Consolas, 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 14px; +} + +/* line 108, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page .label { + background-color: transparent; +} + +/* line 111, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page dd { + margin-left: 1.5em; +} + +/* line 114, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body code { + white-space: pre-wrap; +} + +/* highlight */ +/* highlight style */ +/* line 2, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .hll { + background-color: #ffffcc; +} + +/* line 3, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight { + background: #ffffff; +} + +/* line 4, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .c { + color: #808080; +} + +/* Comment */ +/* line 5, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .err { + color: #F00000; + background-color: #F0A0A0; +} + +/* Error */ +/* line 6, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .k { + color: #008000; + font-weight: bold; +} + +/* Keyword */ +/* line 7, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .o { + color: #303030; +} + +/* Operator */ +/* line 8, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .cm { + color: #808080; +} + +/* Comment.Multiline */ +/* line 9, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .cp { + color: #507090; +} + +/* Comment.Preproc */ +/* line 10, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .c1 { + color: #808080; +} + +/* Comment.Single */ +/* line 11, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .cs { + color: #cc0000; + font-weight: bold; +} + +/* Comment.Special */ +/* line 12, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gd { + color: #A00000; +} + +/* Generic.Deleted */ +/* line 13, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ge { + font-style: italic; +} + +/* Generic.Emph */ +/* line 14, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gr { + color: #FF0000; +} + +/* Generic.Error */ +/* line 15, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gh { + color: #000080; + font-weight: bold; +} + +/* Generic.Heading */ +/* line 16, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gi { + color: #00A000; +} + +/* Generic.Inserted */ +/* line 17, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .go { + color: #808080; +} + +/* Generic.Output */ +/* line 18, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gp { + color: #c65d09; + font-weight: bold; +} + +/* Generic.Prompt */ +/* line 19, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gs { + font-weight: bold; +} + +/* Generic.Strong */ +/* line 20, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gu { + color: #800080; + font-weight: bold; +} + +/* Generic.Subheading */ +/* line 21, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gt { + color: #0040D0; +} + +/* Generic.Traceback */ +/* line 22, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kc { + color: #008000; + font-weight: bold; +} + +/* Keyword.Constant */ +/* line 23, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kd { + color: #008000; + font-weight: bold; +} + +/* Keyword.Declaration */ +/* line 24, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kn { + color: #008000; + font-weight: bold; +} + +/* Keyword.Namespace */ +/* line 25, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kp { + color: #003080; + font-weight: bold; +} + +/* Keyword.Pseudo */ +/* line 26, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kr { + color: #008000; + font-weight: bold; +} + +/* Keyword.Reserved */ +/* line 27, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kt { + color: #303090; + font-weight: bold; +} + +/* Keyword.Type */ +/* line 28, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .m { + color: #6000E0; + font-weight: bold; +} + +/* Literal.Number */ +/* line 29, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .s { + background-color: #fff0f0; +} + +/* Literal.String */ +/* line 30, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .na { + color: #0000C0; +} + +/* Name.Attribute */ +/* line 31, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nb { + color: #007020; +} + +/* Name.Builtin */ +/* line 32, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nc { + color: #B00060; + font-weight: bold; +} + +/* Name.Class */ +/* line 33, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .no { + color: #003060; + font-weight: bold; +} + +/* Name.Constant */ +/* line 34, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nd { + color: #505050; + font-weight: bold; +} + +/* Name.Decorator */ +/* line 35, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ni { + color: #800000; + font-weight: bold; +} + +/* Name.Entity */ +/* line 36, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ne { + color: #F00000; + font-weight: bold; +} + +/* Name.Exception */ +/* line 37, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nf { + color: #0060B0; + font-weight: bold; +} + +/* Name.Function */ +/* line 38, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nl { + color: #907000; + font-weight: bold; +} + +/* Name.Label */ +/* line 39, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nn { + color: #0e84b5; + font-weight: bold; +} + +/* Name.Namespace */ +/* line 40, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nt { + color: #007000; +} + +/* Name.Tag */ +/* line 41, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nv { + color: #906030; +} + +/* Name.Variable */ +/* line 42, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ow { + color: #000000; + font-weight: bold; +} + +/* Operator.Word */ +/* line 43, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .w { + color: #bbbbbb; +} + +/* Text.Whitespace */ +/* line 44, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mf { + color: #6000E0; + font-weight: bold; +} + +/* Literal.Number.Float */ +/* line 45, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mh { + color: #005080; + font-weight: bold; +} + +/* Literal.Number.Hex */ +/* line 46, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mi { + color: #0000D0; + font-weight: bold; +} + +/* Literal.Number.Integer */ +/* line 47, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mo { + color: #4000E0; + font-weight: bold; +} + +/* Literal.Number.Oct */ +/* line 48, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sb { + background-color: #fff0f0; +} + +/* Literal.String.Backtick */ +/* line 49, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sc { + color: #0040D0; +} + +/* Literal.String.Char */ +/* line 50, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sd { + color: #D04020; +} + +/* Literal.String.Doc */ +/* line 51, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .s2 { + background-color: #fff0f0; +} + +/* Literal.String.Double */ +/* line 52, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .se { + color: #606060; + font-weight: bold; + background-color: #fff0f0; +} + +/* Literal.String.Escape */ +/* line 53, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sh { + background-color: #fff0f0; +} + +/* Literal.String.Heredoc */ +/* line 54, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .si { + background-color: #e0e0e0; +} + +/* Literal.String.Interpol */ +/* line 55, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sx { + color: #D02000; + background-color: #fff0f0; +} + +/* Literal.String.Other */ +/* line 56, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sr { + color: #000000; + background-color: #fff0ff; +} + +/* Literal.String.Regex */ +/* line 57, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .s1 { + background-color: #fff0f0; +} + +/* Literal.String.Single */ +/* line 58, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ss { + color: #A06000; +} + +/* Literal.String.Symbol */ +/* line 59, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .bp { + color: #007020; +} + +/* Name.Builtin.Pseudo */ +/* line 60, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .vc { + color: #306090; +} + +/* Name.Variable.Class */ +/* line 61, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .vg { + color: #d07000; + font-weight: bold; +} + +/* Name.Variable.Global */ +/* line 62, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .vi { + color: #3030B0; +} + +/* Name.Variable.Instance */ +/* line 63, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .il { + color: #0000D0; + font-weight: bold; +} + +/* Literal.Number.Integer.Long */ +/* Write/Preview Control style for new PR component */ +/* line 27, ../../../hub/static/css/app/pull-new.scss */ +ul.edit-preview-tabs { + margin: 0 0 5px 0; + line-height: 13px; +} + +/* line 31, ../../../hub/static/css/app/pull-new.scss */ +ul.edit-preview-tabs li { + list-style-type: none; + margin: 0; + display: inline-block; +} + +/* line 36, ../../../hub/static/css/app/pull-new.scss */ +ul.edit-preview-tabs a { + display: inline-block; + padding: 2px 8px; + font-size: 11px; + font-weight: bold; + text-decoration: none; + color: #666; + border: 1px solid transparent; + border-radius: 10px; +} + +/* line 47, ../../../hub/static/css/app/pull-new.scss */ +.previewable-comment-form li.active .write-tab, +.previewable-comment-form li.active .preview-tab { + color: #333; + background: white; + border-color: #BBB; + border-right-color: #DDD; + border-bottom-color: #DDD; +} + +/* Description Component background & help text, from hub.css*/ +/* line 57, ../../../hub/static/css/app/pull-new.scss */ +.comment-form { + position: relative; + margin: -10px 0 10px 0; + padding: 5px; + background: #EEE; + border-radius: 5px; +} + +/* line 65, ../../../hub/static/css/app/pull-new.scss */ +.comment-form p.help { + margin: 3px 0 0 0; + float: right; + font-size: 11px; + color: #666; +} + +/* line 72, ../../../hub/static/css/app/pull-new.scss */ +.write-content.zen-enabled .go-zen { + top: 15px; +} + +/* line 74, ../../../hub/static/css/app/pull-new.scss */ +#form-file-upload { + top: -70px; +} + +/* line 76, ../../../hub/static/css/app/pull-new.scss */ +.contributing { + padding: 15px; + margin: 15px 0; + font-size: 14px; + color: #4c4a42; + background-color: #fff9ea; + border: 1px solid #dfd8c2; + border-radius: 3px; +} diff --git a/dist/css/app/pulls.css b/dist/css/app/pulls.css new file mode 100644 index 0000000..486d2fc --- /dev/null +++ b/dist/css/app/pulls.css @@ -0,0 +1,6001 @@ +@charset "UTF-8"; +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* line 1, ../../../hub/static/css/mod/filter-tabs.scss */ +.list-browser-filter-tabs { + display: block; + float: left; + padding: 5px 5px 0; + overflow: hidden; +} +/* line 6, ../../../hub/static/css/mod/filter-tabs.scss */ +.list-browser-filter-tabs .filter-tab { + display: inline-block; + padding: 0 8px; + height: 24px; + line-height: 24px; + font-size: 12px; + font-weight: bold; + color: #888; + -webkit-font-smoothing: antialiased; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.3); + text-decoration: none; + border: 1px solid #CCC; + border-bottom: 0; + border-radius: 3px 3px 0 0; + background: rgba(255, 255, 255, 0.2); + cursor: pointer; +} +/* line 23, ../../../hub/static/css/mod/filter-tabs.scss */ +.list-browser-filter-tabs .selected { + color: #333; + background: white; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + border-color: #B4B4B4; + border-bottom: 1px solid white; +} + +/* line 1, ../../../hub/static/css/mod/pagination.scss */ +.pagination { + display: block; + margin: 7px 0; + overflow: hidden; +} +/* line 5, ../../../hub/static/css/mod/pagination.scss */ +.pagination a { + padding: 8px; + width: 100%; + text-align: center; + line-height: 1.4; +} +/* line 11, ../../../hub/static/css/mod/pagination.scss */ +.pagination a, .pagination span { + float: left; + margin: 0; + color: #777; + font-size: 13px; + text-decoration: none; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #DADADA; +} +/* line 23, ../../../hub/static/css/mod/pagination.scss */ +.pagination ul li a { + width: 20px; +} +/* line 29, ../../../hub/static/css/mod/pagination.scss */ +.pagination ul .disabled a { + background-color: #fff; +} + +/* line 4, ../../../hub/static/css/mod/pullrequest-list.scss */ +.pulls { + margin: 20px 0; +} +/* line 6, ../../../hub/static/css/mod/pullrequest-list.scss */ +.pulls h2 { + font-size: 16px; + font-weight: bold; + margin: 0; +} + +/* line 13, ../../../hub/static/css/mod/pullrequest-list.scss */ +.row.pulls .mod p { + word-wrap: break-word; +} + +/* line 17, ../../../hub/static/css/mod/pullrequest-list.scss */ +.pulls-list { + word-break: break-all; +} +/* line 19, ../../../hub/static/css/mod/pullrequest-list.scss */ +.pulls-list h3 { + margin: 0; + font-size: 14px; + line-height: 1.3; +} +/* line 23, ../../../hub/static/css/mod/pullrequest-list.scss */ +.pulls-list h3 a { + color: #333; +} +/* line 27, ../../../hub/static/css/mod/pullrequest-list.scss */ +.pulls-list .list-browser-item { + position: relative; + padding: 10px; + border-bottom: 1px solid #EAEAEA; +} +/* line 32, ../../../hub/static/css/mod/pullrequest-list.scss */ +.pulls-list .meta { + float: left; + margin-top: 4px; + margin-bottom: -2px; + height: 16px; + padding: 4px 6px; + font-size: 11px; + color: rgba(0, 0, 0, 0.55); + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.5); + background: rgba(0, 0, 0, 0.07); + border-radius: 3px; +} +/* line 44, ../../../hub/static/css/mod/pullrequest-list.scss */ +.pulls-list p a { + color: #555; + text-decoration: none; +} + +/* line 50, ../../../hub/static/css/mod/pullrequest-list.scss */ +.chromed-list-browser { + border-color: #D5D5D5; + position: relative; + border: 1px solid #DDD; + border-radius: 5px; +} +/* line 55, ../../../hub/static/css/mod/pullrequest-list.scss */ +.chromed-list-browser .pagination { + float: right; + margin: 7px; + font-weight: bold; + height: 26px; +} +/* line 60, ../../../hub/static/css/mod/pullrequest-list.scss */ +.chromed-list-browser .pagination a { + padding: 4px; + font-size: 11px; + color: #4183C4; + width: auto; +} +/* line 66, ../../../hub/static/css/mod/pullrequest-list.scss */ +.chromed-list-browser .pagination span { + padding: 4px; + font-size: 11px; + color: #4183C4; +} +/* line 72, ../../../hub/static/css/mod/pullrequest-list.scss */ +.chromed-list-browser .none, .chromed-list-browser .error { + padding: 10px; + border-bottom: 1px solid #DDD; +} +/* line 75, ../../../hub/static/css/mod/pullrequest-list.scss */ +.chromed-list-browser .none p, .chromed-list-browser .error p { + margin: 0; + padding: 20px; + border-radius: 3px; + text-align: center; + font-weight: bold; + font-size: 14px; + color: #999; + background: #F3F3F3; + -webkit-font-smoothing: antialiased; +} + +/* line 91, ../../../hub/static/css/mod/pullrequest-list.scss */ +.list-browser-item .list-browser-bottom-right-info { + position: absolute; + bottom: 3px; + right: 5px; +} +/* line 96, ../../../hub/static/css/mod/pullrequest-list.scss */ +.list-browser-item .list-browser-bottom-right-item { + padding-left: 18px; + font-size: 11px; + font-weight: bold; + color: #999; +} +/* line 101, ../../../hub/static/css/mod/pullrequest-list.scss */ +.list-browser-item .list-browser-bottom-right-item a { + color: #666; +} + +/* line 107, ../../../hub/static/css/mod/pullrequest-list.scss */ +.list-browser-filterbar { + font-family: "Helvetica Neue", Helvetica, Arial, freesans; + border-radius: 5px 5px 0 0; + height: 31px; + background-color: #CACACA; + background-image: -moz-linear-gradient(#EFEFEF, #CACACA); + background-image: -webkit-linear-gradient(#EFEFEF, #CACACA); + background-image: linear-gradient(#EFEFEF, #CACACA); + background-repeat: repeat-x; + border-bottom: 1px solid #B4B4B4; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +/* line 117, ../../../hub/static/css/mod/pullrequest-list.scss */ +.list-browser-filterbar li { + list-style-type: none; + display: inline; +} + +/* line 123, ../../../hub/static/css/mod/pullrequest-list.scss */ +.list-browser-footer { + font-size: 11px; + font-weight: bold; + color: #777; + overflow: hidden; + min-height: 15px; + background: #F6F6F6; + border-radius: 0 0 5px 5px; +} +/* line 131, ../../../hub/static/css/mod/pullrequest-list.scss */ +.list-browser-footer .pagination { + margin: 5px; +} + +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* line 1, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav { + margin-top: 6px; +} + +/* line 3, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label { + position: relative; + display: inline-block; + margin-left: 3px; + padding: 3px 7px; + border: 1px solid #ccc; + border-radius: 3px; + color: #333; + background-color: #fafafa; + vertical-align: middle; +} + +/* line 15, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::before, .metanav .counts-label::after { + content: ""; + position: absolute; + top: 50%; + right: 100%; + display: block; + margin-right: 0px; + margin-top: -6px; + width: 0; + height: 0; + border: 6px solid transparent; + border-right-color: #ccc; +} + +/* line 29, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::after { + margin-right: -1px; + border-right-color: #fafafa; +} + +/* line 1, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav { + margin-top: 6px; +} + +/* line 3, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label { + position: relative; + display: inline-block; + margin-left: 3px; + padding: 3px 7px; + border: 1px solid #ccc; + border-radius: 3px; + color: #333; + background-color: #fafafa; + vertical-align: middle; +} + +/* line 15, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::before, .metanav .counts-label::after { + content: ""; + position: absolute; + top: 50%; + right: 100%; + display: block; + margin-right: 0px; + margin-top: -6px; + width: 0; + height: 0; + border: 6px solid transparent; + border-right-color: #ccc; +} + +/* line 29, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::after { + margin-right: -1px; + border-right-color: #fafafa; +} + +/* line 2, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.metabox { + display: inline-block; + height: 8px; + background: #ccc; + text-indent: -9999px; + font-size: 12px; +} + +/* line 9, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats { + font: 13px Helvetica, arial, freesans, clean, sans-serif; + line-height: 1.4; + margin: 0; + padding: 0; + border: 0; + position: relative; + float: right; + width: 135px; + opacity: 0.5; + padding-bottom: 10px; +} + +/* line 21, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats:hover { + opacity: 1; +} + +/* line 24, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats:hover .list-tip { + display: block; +} + +/* line 27, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats a { + color: #4183c4; + text-decoration: none; +} + +/* line 31, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats-graph { + height: 10px; + overflow: hidden; +} + +/* line 35, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats-graph span { + display: inline-block; + height: 6px; + background: #ccc; + text-indent: -9999px; + float: left; +} + +/* line 42, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip, ul.list-tip { + border-radius: 3px; + box-shadow: 0 0 5px #ccc; + border: 1px solid #ddd; + background: #fff; + position: absolute; + padding-left: 0px; + top: 20px; + left: -20px; + width: 175px; + z-index: 100; + display: none; + margin-top: 0px; +} + +/* line 56, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip:before, ul.list-tip:before { + content: "▲"; + font-size: 14px; + margin: 0 auto; + width: 14px; + display: block; + margin-top: -13px; + color: #fff; + text-shadow: -1px -1px 2px #ccc; +} + +/* line 66, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li, ul.list-tip li { + margin: 0; + line-height: 100%; + list-style: none; + border-bottom: 1px solid #eee; + font-weight: bold; +} + +/* line 73, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li a, ol.list-tip li .other, ul.list-tip li a, ul.list-tip li .other { + color: #333; + padding: 8px 10px; + display: block; +} + +/* line 78, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li span.color-block, ul.list-tip li span.color-block { + display: inline-block; + width: 8px; + height: 10px; + margin-right: 5px; +} + +/* line 84, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li span.percent, ul.list-tip li span.percent { + float: right; + color: #999; +} + +/* fix project title for newer version of bootstrap*/ +/* line 6, ../../../hub/static/css/mod/project-info.scss */ +.pagehead .pull-left { + margin: 0; + font-size: 30px; + line-height: 36px; +} + +/* Hotfix for FlatUI */ +/* line 13, ../../../hub/static/css/mod/project-info.scss */ +.pagehead h2.pull-left { + margin: 0; +} + +/* line 17, ../../../hub/static/css/mod/project-info.scss */ +#project-info { + border: 1px solid #c5d5dd; + border-radius: 3px; + width: 100%; +} + +/* line 22, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div { + padding: 10px; +} + +/* line 25, ../../../hub/static/css/mod/project-info.scss */ +#project-info p { + margin: 0px; +} + +/* line 28, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div.team-label { + border-top: 1px solid #ccc; +} + +/* line 32, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div.git-url { + border-top: 1px solid #ccc; +} + +/* line 36, ../../../hub/static/css/mod/project-info.scss */ +#project-info input.git-url { + width: 480px; + margin: 0px; + cursor: auto; +} + +/* line 43, ../../../hub/static/css/mod/project-info.scss */ +#project-info .ssh div.ssh-url { + display: inline; +} +/* line 46, ../../../hub/static/css/mod/project-info.scss */ +#project-info .ssh div.http-url { + display: none; +} + +/* line 52, ../../../hub/static/css/mod/project-info.scss */ +#project-info .http div.ssh-url { + display: none; +} +/* line 55, ../../../hub/static/css/mod/project-info.scss */ +#project-info .http div.http-url { + display: inline; +} + +/* line 60, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar { + margin-top: 12px; + border-bottom: 1px solid #DDD; +} + +/* line 61, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar #back-old-browser { + padding-top: 8px; + float: right; +} + +/* line 62, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab { + padding-left: 20px; +} + +/* line 63, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li { + display: inline-block; + vertical-align: top; + cursor: pointer; +} + +/* line 64, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li a { + color: #666; + text-decoration: none; + padding: 8px 12px; + display: inline-block; + border-left: 1px solid transparent; + border-top: 1px solid transparent; + border-right: 1px solid transparent; + margin-bottom: -1px; +} + +/* line 65, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li a.active { + color: #333; + font-weight: bold; + border-left: 1px solid #DDD; + border-top: 1px solid #DDD; + border-right: 1px solid #DDD; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + background-color: white; +} + +/* line 67, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar .scope { + float: left; + margin-right: 10px; +} + +/* line 71, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar .scope i { + font-style: normal; +} + +/* line 75, ../../../hub/static/css/mod/project-info.scss */ +#breadcrumb { + margin: 10px 0; + font-size: 18px; + font-weight: bold; + color: #999; +} + +/* line 76, ../../../hub/static/css/mod/project-info.scss */ +#breadcrumb .final-path { + color: #000; +} + +/* line 2, ../../../hub/static/css/mod/navbar-search.scss */ +.navbar-search i { + color: #63b6ae; + padding-right: 4px; +} diff --git a/dist/css/app/settings.css b/dist/css/app/settings.css new file mode 100644 index 0000000..d546ae9 --- /dev/null +++ b/dist/css/app/settings.css @@ -0,0 +1,5526 @@ +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* line 1, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav { + margin-top: 6px; +} + +/* line 3, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label { + position: relative; + display: inline-block; + margin-left: 3px; + padding: 3px 7px; + border: 1px solid #ccc; + border-radius: 3px; + color: #333; + background-color: #fafafa; + vertical-align: middle; +} + +/* line 15, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::before, .metanav .counts-label::after { + content: ""; + position: absolute; + top: 50%; + right: 100%; + display: block; + margin-right: 0px; + margin-top: -6px; + width: 0; + height: 0; + border: 6px solid transparent; + border-right-color: #ccc; +} + +/* line 29, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::after { + margin-right: -1px; + border-right-color: #fafafa; +} + +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* line 5, ../../../hub/static/css/app/settings.scss */ +.avatar { + display: inline-block; + width: 48px; + margin-right: 5px; +} + +/* line 10, ../../../hub/static/css/app/settings.scss */ +img.avatar { + width: 18px; + height: 18px; +} + +/* line 14, ../../../hub/static/css/app/settings.scss */ +.form-note { + margin-top: -1px; + display: inline-block; + padding: 5px; + font-size: 11px; + color: #494620; + background: #f7ea57; + border: 1px solid #c0b536; + border-top-color: #fff; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} + +/* line 26, ../../../hub/static/css/app/settings.scss */ +ul.hook-list li a { + display: inline-block; + padding: 3px 0 3px 5px; + color: #999; + text-decoration: none; +} + +/* line 33, ../../../hub/static/css/app/settings.scss */ +.btn-details { + margin-right: 4px; +} diff --git a/dist/css/app/source.css b/dist/css/app/source.css new file mode 100644 index 0000000..b7148da --- /dev/null +++ b/dist/css/app/source.css @@ -0,0 +1,8541 @@ +@charset "UTF-8"; +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* TODO Refactor the following mods into components */ +/* line 1, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body { + padding: 30px; +} + +/* line 4, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body > :first-child { + margin-top: 0 !important; +} + +/* line 7, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body h1, +.markdown-body h2, +.markdown-body h3, +.markdown-body h4, +.markdown-body h5, +.markdown-body h6 { + margin: 20px 0 10px; + padding: 0; + font-weight: bold; + -webkit-font-smoothing: antialiased; + cursor: text; + position: relative; +} + +/* line 20, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body h2 { + font-size: 24px; + border-bottom: 1px solid #CCC; + color: black; +} + +/* line 25, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body, +.markdown-body p { + font-size: 14px; + line-height: 1.6; +} + +/* line 30, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body p, +.markdown-body blockquote, +.markdown-body ul, +.markdown-body ol, +.markdown-body dl, +.markdown-body table, +.markdown-body pre { + margin: 15px 0; +} + +/* line 39, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul, +.markdown-body ol { + padding-left: 30px; +} + +/* line 43, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul li { + line-height: 1.6; +} + +/* line 46, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul { + list-style: disc; +} + +/* line 49, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ol { + list-style: decimal; +} + +/* line 52, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table { + width: 100%; +} + +/* line 55, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table caption + thead tr:first-child th, +.markdown-body table caption + thead tr:first-child td, +.markdown-body table colgroup + thead tr:first-child th, +.markdown-body table colgroup + thead tr:first-child td, +.markdown-body table thead:first-child tr:first-child th, +.markdown-body table thead:first-child tr:first-child td { + border-top: 0; +} + +/* line 63, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table thead th { + vertical-align: bottom; +} + +/* line 66, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th { + font-weight: bold; +} + +/* line 69, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th, +.markdown-body table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #ddd; +} + +/* line 77, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th, +.markdown-body table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #ddd; +} + +/* line 85, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table tbody > tr:nth-child(odd) > td, +.markdown-body table tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} + +/* line 89, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body .progress-percentage { + color: #888; +} + +/* line 93, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page { + padding: 0px; +} + +/* line 96, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page h1, +.markdown-page h2, +.markdown-page h3, +.markdown-page h4, +.markdown-page h5, +.markdown-page h6 { + position: static; +} + +/* line 104, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page pre { + font-family: Consolas, 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 14px; +} + +/* line 108, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page .label { + background-color: transparent; +} + +/* line 111, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page dd { + margin-left: 1.5em; +} + +/* line 114, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body code { + white-space: pre-wrap; +} + +/* For other page that still depends on commits.scss */ +/* preview comment form style */ +/* line 2, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav { + margin: 10px 0; + border-bottom: 1px solid #DDD; + height: 35px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs { + display: inline-block; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs > li { + display: inline-block; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab { + display: inline-block; + margin-bottom: -1px; + padding: 8px 12px 9px; + border: 1px solid transparent; + border-bottom: 0; + font-size: 14px; + color: #666; + text-decoration: none; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab.selected { + border-color: #DDD; + border-radius: 3px 3px 0 0; + background-color: white; + color: #333; + font-weight: bold; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab:hover { + text-decoration: none; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav { + position: relative; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav ul.tabnav-tabs { + padding-left: 10px; +} + +/* line 10, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 0 10px 10px; +} + +/* line 11, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form #preview_bucket .content-body { + padding: 10px; + min-height: 132px; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form.tab-content { + overflow: initial; + position: relative; +} + +/* line 2, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 10px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-actions { + padding: 0; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + position: relative; + border: 3px solid #EEE; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + padding: 0; + background: #EEE; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content .write-content { + padding: 0 10px 10px; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; + margin: 0; +} + +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary, button.primary.classy:disabled, button.primary.classy.disabled, button.primary.classy:disabled:hover, button.primary.classy.disabled:disabled:hover, button.classy:disabled:hover.primary, button.classy.disabled:disabled:hover.primary { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4); + border-color: #74BB5A; + border-bottom-color: #509338; + background: #8ADD6D; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#8add6d', endColorstr='#60b044')"; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); + background-image: -webkit-linear-gradient(top, #8ADD6D, #60B044); +} + +/* line 2, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary.disabled { + opacity: 0.5; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy, +button.classy:disabled, +button.classy.disabled, +a.button.classy:disabled, +a.button.classy.disabled, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover:disabled, +a.button.classy.disabled:hover, +a.button.classy, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy:disabled:hover, +a.button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover { + display: inline-block; + padding: 8px 15px; + line-height: normal; + position: relative; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 12px; + font-weight: bold; + color: #666; + text-shadow: 0 1px rgba(255, 255, 255, 0.9); + background: whiteSmoke; + background: -moz-linear-gradient(whiteSmoke, #E5E5E5); + background: -webkit-linear-gradient(whiteSmoke, #E5E5E5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; + border-radius: 3px; + border: 1px solid #DDD; + border-bottom-color: #BBB; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* ================================== *\ + * Zen Form + * ================================== */ +/* line 6, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + position: fixed; + z-index: 99999; + top: 0; + left: 0; + right: 0; + bottom: 0; + padding: 24px 30px 24px 24px; +} + +/* line 16, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-input-wrap { + max-width: 640px; + position: relative; + margin: 0 auto; +} + +/** + * Buttons style + */ +/* line 25, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button, +.zen-forms-theme-switch { + position: absolute; + width: 18px; + height: 18px; + text-align: center; + top: 10px; + right: 10px; + font-size: 24px; + color: #516066; + cursor: pointer; + line-height: 1; +} + +/* line 39, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-theme-switch { + top: 28px; + font-size: 34px; +} + +/* line 44, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button:hover, +.zen-forms-theme-switch:hover { + color: #667981; +} + +/** + * Inputs basic style + */ +/* line 52, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + padding: 8px 0; + width: 100%; + background: none; + border: none; + margin-bottom: 24px; + cursor: pointer; +} + +/* line 62, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus, +.zen-forms textarea:focus { + cursor: text; +} + +/* line 67, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms textarea { + resize: none; +} + +/* line 71, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + cursor: pointer; + display: none; + padding: 8px 3; + position: absolute; + top: 0; + width: 100%; +} + +/* line 80, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms .empty + label { + display: block; +} + +/* line 84, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus + label, +.zen-forms textarea:focus + label { + display: none; +} + +/* line 89, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms :focus { + outline-color: transparent; + outline-style: none; +} + +/** + * Dark theme + */ +/* line 97, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + background: #151a1c; +} + +/* line 101, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + color: #516066; +} + +/* line 105, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + color: #667981; +} + +/** + * Light theme + */ +/* line 113, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme { + background: #fefefe; +} + +/* line 117, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme label { + color: #959697; +} + +/* line 121, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme input, +.zen-forms.light-theme textarea { + color: #707071; +} + +/* line 4, ../../../hub/static/css/mod/zen-forms.scss */ +.write-content .enable-fullscreen { + position: absolute; + top: 5px; + right: 16px; + color: #333333; + opacity: .5; + line-height: 1em; +} + +/* line 5, ../../../hub/static/css/mod/zen-forms.scss */ +.mini-icon-fullscreen::before { + content: ""; +} + +/* line 6, ../../../hub/static/css/mod/zen-forms.scss */ +.fullscreen-overlay textarea, .zen-forms textarea { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + height: 100%; + padding: 20px; + border: 0; + font-size: 21px; + line-height: 1.6em; + resize: none; + -moz-transition: color 0.15s ease-in 0; + -webkit-transition: color 0.15s ease-in 0; + transition: color 0.15s ease-in 0; + box-shadow: none; +} + +/* line 7, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms.light-theme textarea { + background: #fff; + color: #999999; +} + +/* line 8, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms .zen-forms-input-wrap { + width: 100%; + height: 100%; +} + +/* line 9, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms label[for^=zen-forms-input] { + display: none; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-zen.scss */ +.previewable-comment-form .zen-enabled textarea { + padding: 10px 18px 10px 10px; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled { + position: relative; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled .go-zen { + position: absolute; + right: 15px; + top: 5px; +} + +/* line 1, ../../../hub/static/css/mod/loader.scss */ +.loader { + display: none; + position: absolute; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + background-color: #eee; +} + +/* line 2, ../../../hub/static/css/mod/loader.scss */ +.loader .spinner { + display: block; + width: 32px; + height: 32px; + margin: 0 auto; + top: 121px; + position: relative; + background: url(/static/img/spinner.gif) no-repeat; +} + +/* line 1, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view { + position: absolute; + top: 0; + left: 0; + display: none; + margin-top: 18px; + background: white; + border: 1px solid #DDD; + border-radius: 3px; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + min-width: 120px; + z-index: 10; +} + +/* line 15, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur { + background: #3366FF; + color: white; +} + +/* line 19, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur small { + color: white; +} + +/* line 22, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view strong { + color: #3366FF; +} + +/* line 25, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur strong { + color: white; + font: bold; +} + +/* line 29, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul { + /* width: 100px; */ + list-style: none; + padding: 0; + margin: auto; +} + +/* line 35, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul li { + display: block; + padding: 5px 10px; + border-bottom: 1px solid #DDD; + cursor: pointer; + /* border-top: 1px solid #C8C8C8; */ +} + +/* line 42, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view small { + font-size: smaller; + color: #777; + font-weight: normal; +} + +/* line 9, ../../../hub/static/css/mod/comment-form.scss */ +.side-avatar { + margin-left: 0; +} + +/* fix li header for newer version of bootstrap */ +/* line 12, ../../../hub/static/css/mod/comment-form.scss */ +.comment-form-head li { + line-height: 18px; +} + +/* line 16, ../../../hub/static/css/mod/comment-form.scss */ +#new_comment .form-content { + width: 880px; + margin-left: 60px; +} + +/* line 18, ../../../hub/static/css/mod/comment-form.scss */ +.discussion-bubble-avatar { + position: relative; + float: left; + border-radius: 3px; +} + +/* line 19, ../../../hub/static/css/mod/comment-form.scss */ +.discussion-bubble-inner { + min-height: 60px; + border: 1px solid #CACACA; + background-color: white; +} + +/* line 1, ../../../hub/static/css/mod/diff-stat.scss */ +#toc li { + border-bottom: 1px solid #DDD; + list-style-type: none; + padding: 5px; +} + +/* line 7, ../../../hub/static/css/mod/diff-stat.scss */ +#toc { + margin: 15px 0; +} + +/* line 11, ../../../hub/static/css/mod/diff-stat.scss */ +#toc .diffstat { + float: right; +} + +/* line 14, ../../../hub/static/css/mod/diff-stat.scss */ +#toc .mini-icon-modified { + color: #677A85; +} + +/* line 18, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat { + white-space: nowrap; + text-align: right; + font-family: Helvetica,arial,freesans,clean,sans-serif; + color: #666; + font-weight: bold; + font-size: 11px; +} + +/* line 26, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat a { + text-decoration: none; + color: #666; +} + +/* line 30, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar { + position: relative; + left: -3px; + display: inline-block; + height: 12px; + text-decoration: none; + text-align: left; + color: #EEE; + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + line-height: 1; + -webkit-font-smoothing: antialiased; + font-size: 16px; + letter-spacing: -7px; +} + +/* line 48, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar.diff-added, +span.diffstat .diffstat-bar i.plus { + color: #61C423; + font-style: normal; +} + +/* line 53, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar.diff-added, +span.diffstat .diffstat-bar i.minus { + color: #C52323; + font-style: normal; +} + +/* line 59, ../../../hub/static/css/mod/diff-stat.scss */ +p.explain { + font-size: 12px; + color: #666; + margin: 1em 0; +} + +/* line 65, ../../../hub/static/css/mod/diff-stat.scss */ +p.explain .minibutton { + float: right; + top: -4px; +} + +/* line 3, ../../../hub/static/css/mod/diffs-pane.scss */ +.diff-cutoff { + margin-bottom: -2px; + height: 35px; + line-height: 37px; + font-size: 12px; + font-weight: bold; + color: #000; + text-align: center; + background: url("/static/img/compare_too_big.gif") 0 0 no-repeat; +} + +/* line 5, ../../../hub/static/css/mod/diffs-pane.scss */ +.fullscreen-mode { + overflow: hidden; +} + +/* line 6, ../../../hub/static/css/mod/diffs-pane.scss */ +#fullscreen-stage { + display: none; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + overflow-y: auto; + background: #fff; + z-index: 9999; +} + +/* line 7, ../../../hub/static/css/mod/diffs-pane.scss */ +#files #fullscreen-stage .file { + margin: 0; +} + +/* line 5, ../../../hub/static/css/mod/commits.scss */ +div.container div.raw { + overflow: visible; +} + +/* line 9, ../../../hub/static/css/mod/commits.scss */ +#commits-graph { + position: absolute; + left: -200px; + width: 200px; +} + +/* line 15, ../../../hub/static/css/mod/commits.scss */ +.commits-body { + position: relative; +} + +/* line 19, ../../../hub/static/css/mod/commits.scss */ +h3.commit-group-heading { + margin: 15px 0 0 0; + padding: 5px 8px; + font-size: 13px; + color: #3a505b; + text-shadow: 0 1px white; + background: #e6f1f6; + border: 1px solid #c5d5dd; + border-top-right-radius: 4px; + border-top-left-radius: 4px; +} + +/* line 31, ../../../hub/static/css/mod/commits.scss */ +h3.history { + margin-top: 15px; +} + +/* line 35, ../../../hub/static/css/mod/commits.scss */ +.commit-group { + list-style-type: none; + margin: 15px 0; + background: #f7fbfc; + border: 1px solid #c5d5dd; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +/* line 46, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item { + position: relative; + padding: 8px 8px 8px 52px; + border-top: 1px solid #e2eaee; +} + +/* line 52, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:first-child { + border-top: none; +} + +/* line 56, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:last-child { + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +/* line 61, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:nth-child(2n) { + background: #fff; +} + +/* line 65, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus { + background: #fcfce2; +} + +/* line 69, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gravatar { + float: left; + margin-left: -44px; + border-radius: 4px; +} + +/* line 75, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .commit-title { + margin: 1px 0 1px 0; + font-size: 14px; + font-weight: bold; + color: #333; +} + +/* line 82, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .commit-title a { + color: #333; +} + +/* line 86, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .commit-desc pre { + margin-top: 5px; + margin-bottom: 10px; + font-size: 12px; + color: #596063; + border-left: 1px solid #e5e5e5; + padding-left: 8px; +} + +/* line 95, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship { + font-size: 12px; + color: #888; +} + +/* line 100, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship a { + color: #444; +} + +/* line 104, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship .author-name { + color: #444; +} + +/* line 108, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship .committer { + display: block; + font-size: 11px; +} + +/* line 113, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship .committer .mini-icon { + position: relative; + top: 2px; +} + +/* line 118, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .commit-links { + position: absolute; + top: 7px; + right: 8px; + width: 243px; + text-align: right; +} + +/* line 126, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .mini-icon-clippy { + visibility: hidden; + float: left; + margin-right: 7px; + margin-top: 5px; +} + +/* line 133, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:hover .mini-icon-clippy { + visibility: visible; +} + +/* line 137, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton { + float: right; + height: 18px; + padding: 0 7px; + line-height: 22px; + font-size: 11px; + color: #4e575b; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); + background: #eff6f9; + background: -moz-linear-gradient(#eff6f9, #ddecf3); + background: -webkit-linear-gradient(#eff6f9, #ddecf3); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#eff6f9',endColorstr='#ddecf3')"; + border: 1px solid #cedee5; + border-radius: 3px; + min-width: 70px; + text-align: center; +} + +/* line 155, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton .comment-popover { + color: #91A6B1; + border-right: 1px solid #ddd; + padding-right: 4px; +} + +/* line 161, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton { + color: #5a5b4e; +} + +/* line 165, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:nth-child(2n+1) .gobutton { + border-color: #d5dcdf; + background: #f2f5f6; + background: -moz-linear-gradient(#f2f5f6, #e3eaed); + background: -webkit-linear-gradient(#f2f5f6, #e3eaed); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f2f5f6',endColorstr='#e3eaed')"; +} + +/* line 173, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton { + border-color: #e7e86d; + background: #f9fac9; + background: -moz-linear-gradient(#f9fac9, #f3f494); + background: -webkit-linear-gradient(#f9fac9, #f3f494); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f9fac9',endColorstr='#f3f494')"; +} + +/* line 181, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton:hover { + text-decoration: none; + border-color: #cedee5; + background: #fbfdfe; + background: -moz-linear-gradient(#fbfdfe, #eaf4f8); + background: -webkit-linear-gradient(#fbfdfe, #eaf4f8); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbfdfe',endColorstr='#eaf4f8')"; +} + +/* line 190, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton > .sha, .commit-group-item.navigation-focus .gobutton:hover > .sha { + display: inline-block; + height: 22px; + margin-right: -3px; +} + +/* line 196, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton > .sha .mini-icon, .commit-group-item.navigation-focus .gobutton:hover > .sha .mini-icon { + position: relative; + top: 2px; + border-radius: 30px; + border: 1px solid #CFDEE5; + background-color: rgba(255, 255, 255, 0.5); + color: #91a6b1; + margin-left: 5px; + width: 16px; +} + +/* line 207, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton > .sha .mini-icon { + border: 1px solid #E7E86D; + color: #c3c45c; +} + +/* line 212, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton.with-comments { + padding-left: 5px; +} + +/* line 216, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton.with-comments .sha, .commit-group-item.navigation-focus .gobutton.with-comments:hover .sha { + padding-left: 8px; + border-left: 1px solid #cfdee5; +} + +/* line 221, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton.with-comments .sha { + border-left-color: #e1e29e; +} + +/* line 225, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton .comment-count, .commit-group-item.navigation-focus .gobutton:hover .comment-count { + float: left; + height: 22px; + padding-right: 9px; + line-height: 24px; + font-weight: bold; + border-right: 1px solid #f6fafc; +} + +/* line 234, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton .comment-count .mini-icon, .commit-group-item.navigation-focus .gobutton:hover .comment-count .mini-icon { + position: relative; + top: 2px; + color: #91A6B1; +} + +/* line 240, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton .comment-count .mini-icon { + color: #C3C45C; +} + +/* line 244, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .browse-button, .commit-group-item .compare-button { + clear: left; + margin-top: 1px; + font-size: 11px; + font-weight: bold; + text-align: right; + color: #999; +} + +/* line 253, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .browse-button .mini-icon { + position: relative; + top: 2px; +} + +/* line 258, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .browse-button:hover { + color: #4183C4; + background-position: 100% -95px; +} + +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 400; + src: local("Source Code Pro"), local("SourceCodePro-Regular"), url("/static/css/fonts/SourceCodePro-Regular.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 500; + src: local("Source Code Pro Medium"), local("SourceCodePro-Medium"), url("/static/css/fonts/SourceCodePro-Medium.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 600; + src: local("Source Code Pro Semibold"), local("SourceCodePro-Semibold"), url("/static/css/fonts/SourceCodePro-Semibold.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 700; + src: local("Source Code Pro Bold"), local("SourceCodePro-Bold"), url("/static/css/fonts/SourceCodePro-Bold.woff") format("woff"); +} +/* line 3, ../../../hub/static/css/mod/diff-base.scss */ +.code pre, xmp, plaintext, listing { + display: block; + font-size: 13px; + font-family: 'Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; + white-space: pre; + margin: 0; + padding: 0; +} + +/* line 12, ../../../hub/static/css/mod/diff-base.scss */ +.code pre { + line-height: 18px; +} + +/* line 16, ../../../hub/static/css/mod/diff-base.scss */ +.font-consolas pre { + font-family: Consolas,'Source Code Pro',Courier,Monaco,Menlo,monospace; +} + +/* line 20, ../../../hub/static/css/mod/diff-base.scss */ +.font-monaco pre { + font-family: Monaco,'Source Code Pro',Courier,Consolas,Menlo,monospace; +} + +/* line 24, ../../../hub/static/css/mod/diff-base.scss */ +.font-courier pre { + font-family: Courier,'Source Code Pro',Monaco,Consolas,Menlo,monospace; +} + +/* line 28, ../../../hub/static/css/mod/diff-base.scss */ +.font-dejavu pre { + font-family: 'DejaVu Sans Mono','Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; +} + +/* line 32, ../../../hub/static/css/mod/diff-base.scss */ +.font-ubuntu pre { + font-family: 'Ubuntu Mono','Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; +} + +/* line 37, ../../../hub/static/css/mod/diff-base.scss */ +pre, code, tt { + font-size: 12px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + border: 0; +} + +/* line 43, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .normal { + background-color: #FFF; +} + +/* line 47, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .deletion { + color: black; + background-color: #FDD; +} +/* line 50, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .deletion .x, .highlight .deletion .c { + color: black; + background-color: #ffaaaa; +} + +/* line 56, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .insertion { + color: black; + background-color: #DFD; +} +/* line 59, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .insertion .i, .highlight .insertion .c { + color: black; + background-color: #aaffaa; +} + +/* line 65, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped { + color: #cacaca; + background-color: #f9f9f9; +} +/* line 69, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a { + color: #cacaca; + vertical-align: middle; +} +/* line 73, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a:hover { + text-decoration: none; +} +/* line 77, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a[data-type="after"], .highlight .skipped a[data-type="before"] { + font-size: 20px; +} + +/* line 266, ../../../hub/static/css/mod/commits.scss */ +#files.commentable tr td pre:hover { + background-color: #FFC; +} + +/* line 268, ../../../hub/static/css/mod/commits.scss */ +.full-commit { + margin: 10px 0; + padding: 8px 8px 0; + background: #E6F1F6; + border: 1px solid #C5D5DD; + border-radius: 4px; +} + +/* line 276, ../../../hub/static/css/mod/commits.scss */ +.full-commit .commit-meta { + margin-left: -8px; + width: 100%; + padding: 8px; + background: white; + border-top: 1px solid #D8E6EC; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +/* line 286, ../../../hub/static/css/mod/commits.scss */ +.full-commit .commit-desc { + display: block; + margin: -4px 0 10px 0; +} + +/* line 291, ../../../hub/static/css/mod/commits.scss */ +.full-commit .commit-desc pre { + max-width: 100%; + font-size: 14px; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); +} + +/* line 297, ../../../hub/static/css/mod/commits.scss */ +.full-commit .browse-button { + float: right; + margin: -3px -3px 0 0; + height: 26px; + padding: 0 10px; + line-height: 26px; + font-size: 13px; + font-weight: bold; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); + background: #EFF6F9; + background: -moz-linear-gradient(#EFF6F9, #DDECF3); + background: -webkit-linear-gradient(#EFF6F9, #DDECF3); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#eff6f9',endColorstr='#ddecf3')"; + border: 1px solid #CEDEE5; + border-radius: 3px; +} + +/* line 314, ../../../hub/static/css/mod/commits.scss */ +.full-commit p.commit-title { + margin: 0 0 8px 0; + font-size: 18px; + font-weight: bold; + color: #213F4D; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); +} + +/* line 322, ../../../hub/static/css/mod/commits.scss */ +.clearfix { + display: block; +} + +/* line 326, ../../../hub/static/css/mod/commits.scss */ +.full-commit .sha-block { + float: right; + margin-left: 15px; + color: #888; + font-size: 12px; +} + +/* line 333, ../../../hub/static/css/mod/commits.scss */ +.full-commit .authorship { + margin-top: -2px; + margin-left: -4px; + margin-bottom: -4px; + font-size: 14px; + color: #999; +} + +/* line 341, ../../../hub/static/css/mod/commits.scss */ +.full-commit .authorship .gravatar { + margin-top: -2px; + margin-right: 3px; + vertical-align: middle; + border-radius: 3px; +} + +/* line 347, ../../../hub/static/css/mod/commits.scss */ +#files { + position: relative; +} + +/* line 351, ../../../hub/static/css/mod/commits.scss */ +#files .file, .file-box { + border: 1px solid #CCC; + margin-bottom: 13px; + position: relative; + background-color: #DDD; +} + +/* line 358, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta, .file-box .meta { + overflow: hidden; + padding: 5px 10px; + font-size: 12px; + height: 33px; + text-align: left; + color: #555; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #D8D8D8; + background: #FAFAFA; + background: -moz-linear-gradient(#FAFAFA, #EAEAEA); + background: -webkit-linear-gradient(#FAFAFA, #EAEAEA); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; +} + +/* line 373, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .info, .file-box .meta .info { + float: left; + height: 33px; + line-height: 33px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; +} + +/* line 380, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .actions, .file-box .meta .actions { + float: right; + height: 33px; + line-height: 33px; + margin-top: 1px; +} + +/* line 387, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .actions li:first-child, .file-box .meta .actions li:first-child { + background: transparent; + margin-left: 0; + padding-left: 0; +} + +/* line 393, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .actions li, .file-box .meta .actions li { + list-style-type: none; + float: left; + margin: 0 0 0 7px; +} + +/* line 399, ../../../hub/static/css/mod/commits.scss */ +.button-group li { + margin: 0 !important; +} + +/* line 403, ../../../hub/static/css/mod/commits.scss */ +.pagination-older-newer a { + padding: .1em .3em; + margin: .2em; + text-decoration: none; + color: #369; + float: none; +} + +/* line 411, ../../../hub/static/css/mod/commits.scss */ +.pagination-older-newer a:hover, .pagination a:active { + background-color: transparent; + color: #36f; +} + +/* line 416, ../../../hub/static/css/mod/commits.scss */ +.pagination-older-newer span.disabled { + padding: .1em .3em; + margin: .2em; + color: #bbb; + float: none; +} + +/* line 423, ../../../hub/static/css/mod/commits.scss */ +.commit .sha-block, .commit .sha { + padding-right: 3px; + font-size: 11px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; +} + +/* line 429, ../../../hub/static/css/mod/commits.scss */ +#files .file .data .line_numbers, .file-box .data .line_numbers { + background-color: #ECECEC; + color: #AAA; + padding: 0 6px; + border-right: 1px solid #DDD; + text-align: right; + cursor: pointer; +} + +/* line 437, ../../../hub/static/css/mod/commits.scss */ +#files .file .data .line_numbers a { + color: #AAA; +} + +/* line 441, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-added:before { + content: "\f06b"; +} + +/* line 442, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-removed:before { + content: "\f06c"; +} + +/* line 443, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-modified:before { + content: "\f06d"; +} + +/* line 444, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-moved:before, .mini-icon-renamed:before { + content: "\f06e"; +} + +/* line 445, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-commit-comment:before { + content: "\f02b"; +} + +/* line 447, ../../../hub/static/css/mod/commits.scss */ +.mega-icon-beer:before { + content: "\f269"; +} + +/* line 448, ../../../hub/static/css/mod/commits.scss */ +.mega-icon-commit-comment:before { + content: "\f22b"; +} + +/* line 450, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .info span.icon, +#files .file .meta .info span.diffstat, +.file-box .meta .info span.icon { + line-height: 0; + float: left; + margin: 5px 5px 0 0; + padding: 3px; + background: #F7F7F7; + border: 1px solid #CCC; + border-right-color: #E5E5E5; + border-bottom-color: #E5E5E5; + border-radius: 3px; +} + +/* line 463, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .info span.diffstat { + height: 16px; + padding: 3px 6px; +} + +/* line 467, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .info span:first-child, +#files .file .meta .info .icon + span, +.file-box .meta .info span:first-child, +.file-box .meta .info .icon + span { + border-left: 0 none; + box-shadow: inset 0 0 0 transparent; + margin-left: 0; + padding-left: 0; +} + +/* line 477, ../../../hub/static/css/mod/commits.scss */ +.commit-meta.comment-row .mini-icon { + color: #939AA0; + margin: 0 2px 0 1px; + top: 2px; + text-decoration: none; +} + +/* line 478, ../../../hub/static/css/mod/commits.scss */ +#files .file .data.empty, .file-box .data.empty { + padding: 10px 15px; + color: #777; +} + +/* line 482, ../../../hub/static/css/mod/commits.scss */ +.timeout { + width: 873px; + height: 528px; + border: 1px solid #C5D5DD; + background: url("/static/img/timeout.jpg") #E6F1F6 no-repeat; + background-position: 90% 50%; + padding: 0 32px 0 33px; + border-radius: 3px; +} + +/* line 491, ../../../hub/static/css/mod/commits.scss */ +.timeout h3 { + color: white; + font-size: 18px; + font-weight: bold; + text-shadow: darkGray 1px 1px 0; + padding: 15px 0 15px 0; +} + +/* line 498, ../../../hub/static/css/mod/commits.scss */ +.timeout h3 strong { + font-size: 30px; + display: block; +} + +/* line 502, ../../../hub/static/css/mod/commits.scss */ +.timeout p { + color: white; +} + +/* line 506, ../../../hub/static/css/mod/commits.scss */ +.side-avatar { + position: absolute; + float: left; + margin-left: -60px; +} + +/* line 512, ../../../hub/static/css/mod/commits.scss */ +div.generated, div.binary { + text-align: center; + background-color: #ddd; + padding: 30px; +} + +/* line 518, ../../../hub/static/css/mod/commits.scss */ +.commit-history-header { + margin-bottom: 55px; +} +/* line 521, ../../../hub/static/css/mod/commits.scss */ +.commit-history-header #search-commits { + margin: 15px 5px; +} + +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.svg") format("svg"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 8, ../../../hub/static/css/mod/source.scss */ +.last-bar { + margin-top: 5px; +} + +/* line 11, ../../../hub/static/css/mod/source.scss */ +p.last-commit { + margin: 10px 0 -5px 0; + font-size: 11px; + color: #888; +} +/* line 16, ../../../hub/static/css/mod/source.scss */ +p.last-commit .mini-icon { + color: #BBB; + position: relative; + top: 1px; +} + +/* line 22, ../../../hub/static/css/mod/source.scss */ +.pr-latest-branch { + color: #888; + margin-top: 10px; + line-height: 27px; + border-bottom: 1px solid #DDD; + padding-bottom: 10px; +} + +/* line 29, ../../../hub/static/css/mod/source.scss */ +.pr-latest-branch #pullrequest-btn { + margin-right: 5px; +} + +/* line 32, ../../../hub/static/css/mod/source.scss */ +.mini-icon, .mega-icon { + line-height: 1; + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + line-height: 1; + -webkit-font-smoothing: antialiased; + text-decoration: none; +} + +/* line 43, ../../../hub/static/css/mod/source.scss */ +.commit-tease { + margin: 10px 0; + padding: 8px 8px 0; + background: #EEE; + border: 1px solid #C5D5DD; + border-radius: 4px; +} + +/* line 50, ../../../hub/static/css/mod/source.scss */ +.commit-tease p.commit-title { + margin: 0 0 6px 0; +} + +/* line 53, ../../../hub/static/css/mod/source.scss */ +.commit .commit-title, .commit .commit-title a { + color: #4E575B; +} + +/* line 56, ../../../hub/static/css/mod/source.scss */ +.commit-tease .commit-meta { + margin-left: -8px; + width: 100%; + padding: 8px; + background: white; + border-top: 1px solid #D8E6EC; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +/* line 65, ../../../hub/static/css/mod/source.scss */ +.commit-tease .sha-block { + float: right; + color: #888; +} + +/* line 69, ../../../hub/static/css/mod/source.scss */ +.commit .sha-block, .commit .sha { + font-size: 11px; + font-family: Monaco,"Courier New","DejaVu Sans Mono","Bitstream Vera Sans Mono",monospace; +} + +/* line 73, ../../../hub/static/css/mod/source.scss */ +.commit-tease .authorship { + font-size: 12px; + color: #999; + margin-left: -4px; + margin-bottom: -4px; + margin-top: -2px; +} +/* line 79, ../../../hub/static/css/mod/source.scss */ +.commit-tease .authorship .gravatar { + margin-top: -2px; + margin-right: 3px; + vertical-align: middle; + border-radius: 3px; +} +/* line 85, ../../../hub/static/css/mod/source.scss */ +.commit-tease .authorship a, .commit-tease .authorship span { + color: #444; + text-decoration: none; + font-weight: bold; +} +/* line 89, ../../../hub/static/css/mod/source.scss */ +.commit-tease .authorship a:hover, .commit-tease .authorship span:hover { + text-decoration: underline; +} + +/* line 95, ../../../hub/static/css/mod/source.scss */ +.commit-tease .mini-icon-clippy { + margin-right: 5px; + float: right; +} + +/* line 99, ../../../hub/static/css/mod/source.scss */ +.mini-icon-clippy { + display: inline-block; + height: 16px; + width: 16px; + background-color: transparent; + background-position: 0 0; + background-repeat: no-repeat; + vertical-align: text-bottom; + background-image: url("/static/img/clippy.png"); +} + +/* line 109, ../../../hub/static/css/mod/source.scss */ +.mini-icon-u-list:before { + content: "\f061"; +} + +/* line 110, ../../../hub/static/css/mod/source.scss */ +.mini-icon-text-file:before { + content: "\f211"; +} + +/* line 111, ../../../hub/static/css/mod/source.scss */ +.mini-icon-code-file:before { + content: "\f210"; +} + +/* line 112, ../../../hub/static/css/mod/source.scss */ +.mini-icon-directory:before { + content: "\f016"; +} + +/* line 113, ../../../hub/static/css/mod/source.scss */ +.mini-icon-submodule:before { + content: "\f017"; +} + +/* line 115, ../../../hub/static/css/mod/source.scss */ +ul.browsefiles li { + padding: 3px 0 2px 0; + border-top: 1px solid #eee; +} + +/* line 116, ../../../hub/static/css/mod/source.scss */ +ul.browsefiles a.mode-040000 { + color: #333; +} + +/* line 117, ../../../hub/static/css/mod/source.scss */ +ul.browsefiles li a { + display: block; +} + +/* line 118, ../../../hub/static/css/mod/source.scss */ +ul.browsefiles li:hover { + background: #eee; +} + +/* line 119, ../../../hub/static/css/mod/source.scss */ +ul.browsefiles li a.warn-bad { + color: red; +} + +/* line 1, ../../../hub/static/css/mod/source-edit.scss */ +.raw { + overflow: visible; +} + +/* line 2, ../../../hub/static/css/mod/source-edit.scss */ +div.helpop { + float: right; + width: 137px; + height: 140px; + margin-top: -140px; + margin-right: 20px; + overflow: hidden; + position: relative; +} + +/* line 9, ../../../hub/static/css/mod/source-edit.scss */ +div.helpop .popic { + display: block; + position: absolute; + bottom: -115px; + -webkit-transition: all 300ms ease-out; + -moz-transition: all 300ms ease-out; + -o-transition: all 300ms ease-out; + -ms-transition: all 300ms ease-out; +} + +/* line 19, ../../../hub/static/css/mod/source-edit.scss */ +div.helpop:hover .popic { + bottom: -10px; + -webkit-transition: all 300ms ease-out; + -moz-transition: all 300ms ease-out; + -o-transition: all 300ms ease-out; + -ms-transition: all 300ms ease-out; +} + +/* Like these */ +/* highlight style */ +/* line 2, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .hll { + background-color: #ffffcc; +} + +/* line 3, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight { + background: #ffffff; +} + +/* line 4, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .c { + color: #808080; +} + +/* Comment */ +/* line 5, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .err { + color: #F00000; + background-color: #F0A0A0; +} + +/* Error */ +/* line 6, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .k { + color: #008000; + font-weight: bold; +} + +/* Keyword */ +/* line 7, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .o { + color: #303030; +} + +/* Operator */ +/* line 8, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .cm { + color: #808080; +} + +/* Comment.Multiline */ +/* line 9, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .cp { + color: #507090; +} + +/* Comment.Preproc */ +/* line 10, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .c1 { + color: #808080; +} + +/* Comment.Single */ +/* line 11, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .cs { + color: #cc0000; + font-weight: bold; +} + +/* Comment.Special */ +/* line 12, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gd { + color: #A00000; +} + +/* Generic.Deleted */ +/* line 13, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ge { + font-style: italic; +} + +/* Generic.Emph */ +/* line 14, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gr { + color: #FF0000; +} + +/* Generic.Error */ +/* line 15, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gh { + color: #000080; + font-weight: bold; +} + +/* Generic.Heading */ +/* line 16, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gi { + color: #00A000; +} + +/* Generic.Inserted */ +/* line 17, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .go { + color: #808080; +} + +/* Generic.Output */ +/* line 18, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gp { + color: #c65d09; + font-weight: bold; +} + +/* Generic.Prompt */ +/* line 19, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gs { + font-weight: bold; +} + +/* Generic.Strong */ +/* line 20, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gu { + color: #800080; + font-weight: bold; +} + +/* Generic.Subheading */ +/* line 21, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gt { + color: #0040D0; +} + +/* Generic.Traceback */ +/* line 22, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kc { + color: #008000; + font-weight: bold; +} + +/* Keyword.Constant */ +/* line 23, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kd { + color: #008000; + font-weight: bold; +} + +/* Keyword.Declaration */ +/* line 24, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kn { + color: #008000; + font-weight: bold; +} + +/* Keyword.Namespace */ +/* line 25, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kp { + color: #003080; + font-weight: bold; +} + +/* Keyword.Pseudo */ +/* line 26, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kr { + color: #008000; + font-weight: bold; +} + +/* Keyword.Reserved */ +/* line 27, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kt { + color: #303090; + font-weight: bold; +} + +/* Keyword.Type */ +/* line 28, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .m { + color: #6000E0; + font-weight: bold; +} + +/* Literal.Number */ +/* line 29, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .s { + background-color: #fff0f0; +} + +/* Literal.String */ +/* line 30, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .na { + color: #0000C0; +} + +/* Name.Attribute */ +/* line 31, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nb { + color: #007020; +} + +/* Name.Builtin */ +/* line 32, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nc { + color: #B00060; + font-weight: bold; +} + +/* Name.Class */ +/* line 33, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .no { + color: #003060; + font-weight: bold; +} + +/* Name.Constant */ +/* line 34, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nd { + color: #505050; + font-weight: bold; +} + +/* Name.Decorator */ +/* line 35, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ni { + color: #800000; + font-weight: bold; +} + +/* Name.Entity */ +/* line 36, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ne { + color: #F00000; + font-weight: bold; +} + +/* Name.Exception */ +/* line 37, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nf { + color: #0060B0; + font-weight: bold; +} + +/* Name.Function */ +/* line 38, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nl { + color: #907000; + font-weight: bold; +} + +/* Name.Label */ +/* line 39, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nn { + color: #0e84b5; + font-weight: bold; +} + +/* Name.Namespace */ +/* line 40, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nt { + color: #007000; +} + +/* Name.Tag */ +/* line 41, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nv { + color: #906030; +} + +/* Name.Variable */ +/* line 42, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ow { + color: #000000; + font-weight: bold; +} + +/* Operator.Word */ +/* line 43, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .w { + color: #bbbbbb; +} + +/* Text.Whitespace */ +/* line 44, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mf { + color: #6000E0; + font-weight: bold; +} + +/* Literal.Number.Float */ +/* line 45, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mh { + color: #005080; + font-weight: bold; +} + +/* Literal.Number.Hex */ +/* line 46, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mi { + color: #0000D0; + font-weight: bold; +} + +/* Literal.Number.Integer */ +/* line 47, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mo { + color: #4000E0; + font-weight: bold; +} + +/* Literal.Number.Oct */ +/* line 48, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sb { + background-color: #fff0f0; +} + +/* Literal.String.Backtick */ +/* line 49, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sc { + color: #0040D0; +} + +/* Literal.String.Char */ +/* line 50, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sd { + color: #D04020; +} + +/* Literal.String.Doc */ +/* line 51, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .s2 { + background-color: #fff0f0; +} + +/* Literal.String.Double */ +/* line 52, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .se { + color: #606060; + font-weight: bold; + background-color: #fff0f0; +} + +/* Literal.String.Escape */ +/* line 53, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sh { + background-color: #fff0f0; +} + +/* Literal.String.Heredoc */ +/* line 54, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .si { + background-color: #e0e0e0; +} + +/* Literal.String.Interpol */ +/* line 55, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sx { + color: #D02000; + background-color: #fff0f0; +} + +/* Literal.String.Other */ +/* line 56, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sr { + color: #000000; + background-color: #fff0ff; +} + +/* Literal.String.Regex */ +/* line 57, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .s1 { + background-color: #fff0f0; +} + +/* Literal.String.Single */ +/* line 58, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ss { + color: #A06000; +} + +/* Literal.String.Symbol */ +/* line 59, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .bp { + color: #007020; +} + +/* Name.Builtin.Pseudo */ +/* line 60, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .vc { + color: #306090; +} + +/* Name.Variable.Class */ +/* line 61, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .vg { + color: #d07000; + font-weight: bold; +} + +/* Name.Variable.Global */ +/* line 62, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .vi { + color: #3030B0; +} + +/* Name.Variable.Instance */ +/* line 63, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .il { + color: #0000D0; + font-weight: bold; +} + +/* Literal.Number.Integer.Long */ +/* Highlight style from pygments */ +/* line 2, ../../../hub/static/css/mod/code-highlight.scss */ +.code .hll { + background-color: #ffffcc; +} + +/* line 3, ../../../hub/static/css/mod/code-highlight.scss */ +.code { + background: #ffffff; +} + +/* line 4, ../../../hub/static/css/mod/code-highlight.scss */ +.code .c { + color: #808080; +} + +/* Comment */ +/* line 5, ../../../hub/static/css/mod/code-highlight.scss */ +.code .err { + color: #F00000; + background-color: #F0A0A0; +} + +/* Error */ +/* line 6, ../../../hub/static/css/mod/code-highlight.scss */ +.code .k { + color: #008000; + font-weight: bold; +} + +/* Keyword */ +/* line 7, ../../../hub/static/css/mod/code-highlight.scss */ +.code .o { + color: #303030; +} + +/* Operator */ +/* line 8, ../../../hub/static/css/mod/code-highlight.scss */ +.code .cm { + color: #808080; +} + +/* Comment.Multiline */ +/* line 9, ../../../hub/static/css/mod/code-highlight.scss */ +.code .cp { + color: #507090; +} + +/* Comment.Preproc */ +/* line 10, ../../../hub/static/css/mod/code-highlight.scss */ +.code .c1 { + color: #808080; +} + +/* Comment.Single */ +/* line 11, ../../../hub/static/css/mod/code-highlight.scss */ +.code .cs { + color: #cc0000; + font-weight: bold; +} + +/* Comment.Special */ +/* line 12, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gd { + color: #A00000; +} + +/* Generic.Deleted */ +/* line 13, ../../../hub/static/css/mod/code-highlight.scss */ +.code .ge { + font-style: italic; +} + +/* Generic.Emph */ +/* line 14, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gr { + color: #FF0000; +} + +/* Generic.Error */ +/* line 15, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gh { + color: #000080; + font-weight: bold; +} + +/* Generic.Heading */ +/* line 16, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gi { + color: #00A000; +} + +/* Generic.Inserted */ +/* line 17, ../../../hub/static/css/mod/code-highlight.scss */ +.code .go { + color: #808080; +} + +/* Generic.Output */ +/* line 18, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gp { + color: #c65d09; + font-weight: bold; +} + +/* Generic.Prompt */ +/* line 19, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gs { + font-weight: bold; +} + +/* Generic.Strong */ +/* line 20, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gu { + color: #800080; + font-weight: bold; +} + +/* Generic.Subheading */ +/* line 21, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gt { + color: #0040D0; +} + +/* Generic.Traceback */ +/* line 22, ../../../hub/static/css/mod/code-highlight.scss */ +.code .kc { + color: #008000; + font-weight: bold; +} + +/* Keyword.Constant */ +/* line 23, ../../../hub/static/css/mod/code-highlight.scss */ +.code .kd { + color: #008000; + font-weight: bold; +} + +/* Keyword.Declaration */ +/* line 24, ../../../hub/static/css/mod/code-highlight.scss */ +.code .kn { + color: #008000; + font-weight: bold; +} + +/* Keyword.Namespace */ +/* line 25, ../../../hub/static/css/mod/code-highlight.scss */ +.code .kp { + color: #003080; + font-weight: bold; +} + +/* Keyword.Pseudo */ +/* line 26, ../../../hub/static/css/mod/code-highlight.scss */ +.code .kr { + color: #008000; + font-weight: bold; +} + +/* Keyword.Reserved */ +/* line 27, ../../../hub/static/css/mod/code-highlight.scss */ +.code .kt { + color: #303090; + font-weight: bold; +} + +/* Keyword.Type */ +/* line 28, ../../../hub/static/css/mod/code-highlight.scss */ +.code .m { + color: #6000E0; + font-weight: bold; +} + +/* Literal.Number */ +/* line 29, ../../../hub/static/css/mod/code-highlight.scss */ +.code .s { + background-color: #fff0f0; +} + +/* Literal.String */ +/* line 30, ../../../hub/static/css/mod/code-highlight.scss */ +.code .na { + color: #0000C0; +} + +/* Name.Attribute */ +/* line 31, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nb { + color: #007020; +} + +/* Name.Builtin */ +/* line 32, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nc { + color: #B00060; + font-weight: bold; +} + +/* Name.Class */ +/* line 33, ../../../hub/static/css/mod/code-highlight.scss */ +.code .no { + color: #003060; + font-weight: bold; +} + +/* Name.Constant */ +/* line 34, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nd { + color: #505050; + font-weight: bold; +} + +/* Name.Decorator */ +/* line 35, ../../../hub/static/css/mod/code-highlight.scss */ +.code .ni { + color: #800000; + font-weight: bold; +} + +/* Name.Entity */ +/* line 36, ../../../hub/static/css/mod/code-highlight.scss */ +.code .ne { + color: #F00000; + font-weight: bold; +} + +/* Name.Exception */ +/* line 37, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nf { + color: #0060B0; + font-weight: bold; +} + +/* Name.Function */ +/* line 38, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nl { + color: #907000; + font-weight: bold; +} + +/* Name.Label */ +/* line 39, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nn { + color: #0e84b5; + font-weight: bold; +} + +/* Name.Namespace */ +/* line 40, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nt { + color: #007000; +} + +/* Name.Tag */ +/* line 41, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nv { + color: #906030; +} + +/* Name.Variable */ +/* line 42, ../../../hub/static/css/mod/code-highlight.scss */ +.code .ow { + color: #000000; + font-weight: bold; +} + +/* Operator.Word */ +/* line 43, ../../../hub/static/css/mod/code-highlight.scss */ +.code .w { + color: #bbbbbb; +} + +/* Text.Whitespace */ +/* line 44, ../../../hub/static/css/mod/code-highlight.scss */ +.code .mf { + color: #6000E0; + font-weight: bold; +} + +/* Literal.Number.Float */ +/* line 45, ../../../hub/static/css/mod/code-highlight.scss */ +.code .mh { + color: #005080; + font-weight: bold; +} + +/* Literal.Number.Hex */ +/* line 46, ../../../hub/static/css/mod/code-highlight.scss */ +.code .mi { + color: #0000D0; + font-weight: bold; +} + +/* Literal.Number.Integer */ +/* line 47, ../../../hub/static/css/mod/code-highlight.scss */ +.code .mo { + color: #4000E0; + font-weight: bold; +} + +/* Literal.Number.Oct */ +/* line 48, ../../../hub/static/css/mod/code-highlight.scss */ +.code .sb { + background-color: #fff0f0; +} + +/* Literal.String.Backtick */ +/* line 49, ../../../hub/static/css/mod/code-highlight.scss */ +.code .sc { + color: #0040D0; +} + +/* Literal.String.Char */ +/* line 50, ../../../hub/static/css/mod/code-highlight.scss */ +.code .sd { + color: #D04020; +} + +/* Literal.String.Doc */ +/* line 51, ../../../hub/static/css/mod/code-highlight.scss */ +.code .s2 { + background-color: #fff0f0; +} + +/* Literal.String.Double */ +/* line 52, ../../../hub/static/css/mod/code-highlight.scss */ +.code .se { + color: #606060; + font-weight: bold; + background-color: #fff0f0; +} + +/* Literal.String.Escape */ +/* line 53, ../../../hub/static/css/mod/code-highlight.scss */ +.code .sh { + background-color: #fff0f0; +} + +/* Literal.String.Heredoc */ +/* line 54, ../../../hub/static/css/mod/code-highlight.scss */ +.code .si { + background-color: #e0e0e0; +} + +/* Literal.String.Interpol */ +/* line 55, ../../../hub/static/css/mod/code-highlight.scss */ +.code .sx { + color: #D02000; + background-color: #fff0f0; +} + +/* Literal.String.Other */ +/* line 56, ../../../hub/static/css/mod/code-highlight.scss */ +.code .sr { + color: #000000; + background-color: #fff0ff; +} + +/* Literal.String.Regex */ +/* line 57, ../../../hub/static/css/mod/code-highlight.scss */ +.code .s1 { + background-color: #fff0f0; +} + +/* Literal.String.Single */ +/* line 58, ../../../hub/static/css/mod/code-highlight.scss */ +.code .ss { + color: #A06000; +} + +/* Literal.String.Symbol */ +/* line 59, ../../../hub/static/css/mod/code-highlight.scss */ +.code .bp { + color: #007020; +} + +/* Name.Builtin.Pseudo */ +/* line 60, ../../../hub/static/css/mod/code-highlight.scss */ +.code .vc { + color: #306090; +} + +/* Name.Variable.Class */ +/* line 61, ../../../hub/static/css/mod/code-highlight.scss */ +.code .vg { + color: #d07000; + font-weight: bold; +} + +/* Name.Variable.Global */ +/* line 62, ../../../hub/static/css/mod/code-highlight.scss */ +.code .vi { + color: #3030B0; +} + +/* Name.Variable.Instance */ +/* line 63, ../../../hub/static/css/mod/code-highlight.scss */ +.code .il { + color: #0000D0; + font-weight: bold; +} + +/* Literal.Number.Integer.Long */ +/* line 1, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav { + margin-top: 6px; +} + +/* line 3, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label { + position: relative; + display: inline-block; + margin-left: 3px; + padding: 3px 7px; + border: 1px solid #ccc; + border-radius: 3px; + color: #333; + background-color: #fafafa; + vertical-align: middle; +} + +/* line 15, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::before, .metanav .counts-label::after { + content: ""; + position: absolute; + top: 50%; + right: 100%; + display: block; + margin-right: 0px; + margin-top: -6px; + width: 0; + height: 0; + border: 6px solid transparent; + border-right-color: #ccc; +} + +/* line 29, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::after { + margin-right: -1px; + border-right-color: #fafafa; +} + +/* line 2, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.metabox { + display: inline-block; + height: 8px; + background: #ccc; + text-indent: -9999px; + font-size: 12px; +} + +/* line 9, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats { + font: 13px Helvetica, arial, freesans, clean, sans-serif; + line-height: 1.4; + margin: 0; + padding: 0; + border: 0; + position: relative; + float: right; + width: 135px; + opacity: 0.5; + padding-bottom: 10px; +} + +/* line 21, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats:hover { + opacity: 1; +} + +/* line 24, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats:hover .list-tip { + display: block; +} + +/* line 27, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats a { + color: #4183c4; + text-decoration: none; +} + +/* line 31, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats-graph { + height: 10px; + overflow: hidden; +} + +/* line 35, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats-graph span { + display: inline-block; + height: 6px; + background: #ccc; + text-indent: -9999px; + float: left; +} + +/* line 42, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip, ul.list-tip { + border-radius: 3px; + box-shadow: 0 0 5px #ccc; + border: 1px solid #ddd; + background: #fff; + position: absolute; + padding-left: 0px; + top: 20px; + left: -20px; + width: 175px; + z-index: 100; + display: none; + margin-top: 0px; +} + +/* line 56, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip:before, ul.list-tip:before { + content: "▲"; + font-size: 14px; + margin: 0 auto; + width: 14px; + display: block; + margin-top: -13px; + color: #fff; + text-shadow: -1px -1px 2px #ccc; +} + +/* line 66, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li, ul.list-tip li { + margin: 0; + line-height: 100%; + list-style: none; + border-bottom: 1px solid #eee; + font-weight: bold; +} + +/* line 73, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li a, ol.list-tip li .other, ul.list-tip li a, ul.list-tip li .other { + color: #333; + padding: 8px 10px; + display: block; +} + +/* line 78, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li span.color-block, ul.list-tip li span.color-block { + display: inline-block; + width: 8px; + height: 10px; + margin-right: 5px; +} + +/* line 84, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li span.percent, ul.list-tip li span.percent { + float: right; + color: #999; +} + +/* fix project title for newer version of bootstrap*/ +/* line 6, ../../../hub/static/css/mod/project-info.scss */ +.pagehead .pull-left { + margin: 0; + font-size: 30px; + line-height: 36px; +} + +/* Hotfix for FlatUI */ +/* line 13, ../../../hub/static/css/mod/project-info.scss */ +.pagehead h2.pull-left { + margin: 0; +} + +/* line 17, ../../../hub/static/css/mod/project-info.scss */ +#project-info { + border: 1px solid #c5d5dd; + border-radius: 3px; + width: 100%; +} + +/* line 22, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div { + padding: 10px; +} + +/* line 25, ../../../hub/static/css/mod/project-info.scss */ +#project-info p { + margin: 0px; +} + +/* line 28, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div.team-label { + border-top: 1px solid #ccc; +} + +/* line 32, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div.git-url { + border-top: 1px solid #ccc; +} + +/* line 36, ../../../hub/static/css/mod/project-info.scss */ +#project-info input.git-url { + width: 480px; + margin: 0px; + cursor: auto; +} + +/* line 43, ../../../hub/static/css/mod/project-info.scss */ +#project-info .ssh div.ssh-url { + display: inline; +} +/* line 46, ../../../hub/static/css/mod/project-info.scss */ +#project-info .ssh div.http-url { + display: none; +} + +/* line 52, ../../../hub/static/css/mod/project-info.scss */ +#project-info .http div.ssh-url { + display: none; +} +/* line 55, ../../../hub/static/css/mod/project-info.scss */ +#project-info .http div.http-url { + display: inline; +} + +/* line 60, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar { + margin-top: 12px; + border-bottom: 1px solid #DDD; +} + +/* line 61, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar #back-old-browser { + padding-top: 8px; + float: right; +} + +/* line 62, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab { + padding-left: 20px; +} + +/* line 63, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li { + display: inline-block; + vertical-align: top; + cursor: pointer; +} + +/* line 64, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li a { + color: #666; + text-decoration: none; + padding: 8px 12px; + display: inline-block; + border-left: 1px solid transparent; + border-top: 1px solid transparent; + border-right: 1px solid transparent; + margin-bottom: -1px; +} + +/* line 65, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li a.active { + color: #333; + font-weight: bold; + border-left: 1px solid #DDD; + border-top: 1px solid #DDD; + border-right: 1px solid #DDD; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + background-color: white; +} + +/* line 67, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar .scope { + float: left; + margin-right: 10px; +} + +/* line 71, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar .scope i { + font-style: normal; +} + +/* line 75, ../../../hub/static/css/mod/project-info.scss */ +#breadcrumb { + margin: 10px 0; + font-size: 18px; + font-weight: bold; + color: #999; +} + +/* line 76, ../../../hub/static/css/mod/project-info.scss */ +#breadcrumb .final-path { + color: #000; +} + +/* line 1, ../../../hub/static/css/mod/file-browser.scss */ +#tree, #blob { + margin: 0 0 27px; +} + +/* line 3, ../../../hub/static/css/mod/file-browser.scss */ +.tree-browser { + width: 100%; + margin: 0; + border-radius: 3px; + border: 1px solid #CACACA; +} + +/* line 4, ../../../hub/static/css/mod/file-browser.scss */ +.tree-browser th { + text-align: left; + font-weight: bold; + padding: 6px 3px; + color: #555; + text-shadow: 0 1px 0 #fff; + border-bottom: 1px solid #d8d8d8; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; +} + +/* line 5, ../../../hub/static/css/mod/file-browser.scss */ +.tree-browser td { + background: #f8f8f8; + border-bottom: 1px solid #eee; + padding: 7px 3px; + color: #484848; + vertical-align: middle; +} + +/* line 6, ../../../hub/static/css/mod/file-browser.scss */ +.tree-browser tbody tr:last-child td { + border-bottom: 0; +} + +/* line 7, ../../../hub/static/css/mod/file-browser.scss */ +.tree-browser .message { + min-width: 270px; + max-width: 484px; +} + +/* line 8, ../../../hub/static/css/mod/file-browser.scss */ +.tree-browser td a.message { + color: #484848; +} + +/* line 10, ../../../hub/static/css/mod/file-browser.scss */ +.tree-browser i, .file i, .commit-group-item i { + filter: alpha(opacity=70); + opacity: .7; +} + +/* line 11, ../../../hub/static/css/mod/file-browser.scss */ +.file .error { + text-align: center; + margin: 30px; + color: #666; +} + +/* button list */ +/* line 3, ../../../hub/static/css/mod/file-blob.scss */ +.button-group { + display: inline-block; + overflow: hidden; + border: 1px solid #d4d4d4; + border-radius: 3px; + border-bottom-color: #bcbcbc; + background: #f5f5f5; + background: -moz-linear-gradient(#f5f5f5, #e5e5e5); + background: -webkit-linear-gradient(#f5f5f5, #e5e5e5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; +} + +/* line 4, ../../../hub/static/css/mod/file-blob.scss */ +.button-group li { + margin: 0 !important; + float: left; +} + +/* line 5, ../../../hub/static/css/mod/file-blob.scss */ +.button-group li:first-child .grouped-button { + border-left: none; + border-bottom-left-radius: 2px; + border-top-left-radius: 2px; +} + +/* line 6, ../../../hub/static/css/mod/file-blob.scss */ +.button-group li:last-child .grouped-button { + border-right: none; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 2px; +} + +/* line 7, ../../../hub/static/css/mod/file-blob.scss */ +.button-group .grouped-button { + float: left; + background: none; + border-bottom: none; + border-top: none; + border-left: 1px solid rgba(0, 0, 0, 0.1); + border-right: 1px solid rgba(255, 255, 255, 0.5); + border-radius: 0; + cursor: pointer; +} + +/* line 8, ../../../hub/static/css/mod/file-blob.scss */ +.button-group .minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line-no */ +/* line 12, ../../../hub/static/css/mod/file-blob.scss */ +#blob .file { + min-height: 78px; + position: relative; + overflow: auto; +} + +/* line 13, ../../../hub/static/css/mod/file-blob.scss */ +#blob .file .rawfile { + text-align: center; + background-color: #ddd; + padding: 30px; + position: relative; +} + +/* line 14, ../../../hub/static/css/mod/file-blob.scss */ +.file table { + width: 100%; + border-collapse: collapse; + border-spacing: 0; +} + +/* line 15, ../../../hub/static/css/mod/file-blob.scss */ +.file table td, .file table th { + vertical-align: top; + padding: 0; +} + +/* line 16, ../../../hub/static/css/mod/file-blob.scss */ +.file .data { + overflow: auto; +} + +/* line 18, ../../../hub/static/css/mod/file-blob.scss */ +.code { + width: 100%; +} + +/* line 19, ../../../hub/static/css/mod/file-blob.scss */ +.code .highlight pre { + margin: 0; + padding: 8px; + border: none; + background-color: #FFF; + white-space: pre; +} + +/* line 20, ../../../hub/static/css/mod/file-blob.scss */ +.code .highlight pre a { + display: block; +} + +/* line 23, ../../../hub/static/css/mod/file-blob.scss */ +.linenos .linenodiv pre { + background-color: #ECECEC; + padding: 8px; + border: none; + border-right: 1px solid #DDD; + text-align: right; + white-space: pre; +} + +/* line 24, ../../../hub/static/css/mod/file-blob.scss */ +.linenos .linenodiv pre a { + color: #AAA; + text-decoration: none; + white-space: nowrap; + line-height: 18px; +} + +/* line 25, ../../../hub/static/css/mod/file-blob.scss */ +.code .highlight pre, .linenos .linenodiv pre { + margin: 0; + line-height: 18px; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +/* line 32, ../../../hub/static/css/mod/file-blob.scss */ +.linenos { + padding: 0; +} diff --git a/dist/css/app/stat.css b/dist/css/app/stat.css new file mode 100644 index 0000000..3edf2ea --- /dev/null +++ b/dist/css/app/stat.css @@ -0,0 +1,5528 @@ +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* line 2, ../../../hub/static/css/lib/odometer.scss */ +.odometer.odometer-auto-theme, .odometer.odometer-theme-default { + display: -moz-inline-box; + -moz-box-orient: vertical; + display: inline-block; + vertical-align: middle; + *vertical-align: auto; + position: relative; +} +/* line 10, ../../../hub/static/css/lib/odometer.scss */ +.odometer.odometer-auto-theme, .odometer.odometer-theme-default { + *display: inline; +} +/* line 13, ../../../hub/static/css/lib/odometer.scss */ +.odometer.odometer-auto-theme .odometer-digit, .odometer.odometer-theme-default .odometer-digit { + display: -moz-inline-box; + -moz-box-orient: vertical; + display: inline-block; + vertical-align: middle; + *vertical-align: auto; + position: relative; +} +/* line 21, ../../../hub/static/css/lib/odometer.scss */ +.odometer.odometer-auto-theme .odometer-digit, .odometer.odometer-theme-default .odometer-digit { + *display: inline; +} +/* line 24, ../../../hub/static/css/lib/odometer.scss */ +.odometer.odometer-auto-theme .odometer-digit .odometer-digit-spacer, .odometer.odometer-theme-default .odometer-digit .odometer-digit-spacer { + display: -moz-inline-box; + -moz-box-orient: vertical; + display: inline-block; + vertical-align: middle; + *vertical-align: auto; + visibility: hidden; +} +/* line 32, ../../../hub/static/css/lib/odometer.scss */ +.odometer.odometer-auto-theme .odometer-digit .odometer-digit-spacer, .odometer.odometer-theme-default .odometer-digit .odometer-digit-spacer { + *display: inline; +} +/* line 35, ../../../hub/static/css/lib/odometer.scss */ +.odometer.odometer-auto-theme .odometer-digit .odometer-digit-inner, .odometer.odometer-theme-default .odometer-digit .odometer-digit-inner { + text-align: left; + display: block; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + overflow: hidden; +} +/* line 45, ../../../hub/static/css/lib/odometer.scss */ +.odometer.odometer-auto-theme .odometer-digit .odometer-ribbon, .odometer.odometer-theme-default .odometer-digit .odometer-ribbon { + display: block; +} +/* line 48, ../../../hub/static/css/lib/odometer.scss */ +.odometer.odometer-auto-theme .odometer-digit .odometer-ribbon-inner, .odometer.odometer-theme-default .odometer-digit .odometer-ribbon-inner { + display: block; + -webkit-backface-visibility: hidden; +} +/* line 52, ../../../hub/static/css/lib/odometer.scss */ +.odometer.odometer-auto-theme .odometer-digit .odometer-value, .odometer.odometer-theme-default .odometer-digit .odometer-value { + display: block; + -webkit-transform: translateZ(0); +} +/* line 56, ../../../hub/static/css/lib/odometer.scss */ +.odometer.odometer-auto-theme .odometer-digit .odometer-value.odometer-last-value, .odometer.odometer-theme-default .odometer-digit .odometer-value.odometer-last-value { + position: absolute; +} +/* line 59, ../../../hub/static/css/lib/odometer.scss */ +.odometer.odometer-auto-theme.odometer-animating-up .odometer-ribbon-inner, .odometer.odometer-theme-default.odometer-animating-up .odometer-ribbon-inner { + -webkit-transition: -webkit-transform 2s; + -moz-transition: -moz-transform 2s; + -ms-transition: -ms-transform 2s; + -o-transition: -o-transform 2s; + transition: transform 2s; +} +/* line 66, ../../../hub/static/css/lib/odometer.scss */ +.odometer.odometer-auto-theme.odometer-animating-up.odometer-animating .odometer-ribbon-inner, .odometer.odometer-theme-default.odometer-animating-up.odometer-animating .odometer-ribbon-inner { + -webkit-transform: translateY(-100%); + -moz-transform: translateY(-100%); + -ms-transform: translateY(-100%); + -o-transform: translateY(-100%); + transform: translateY(-100%); +} +/* line 73, ../../../hub/static/css/lib/odometer.scss */ +.odometer.odometer-auto-theme.odometer-animating-down .odometer-ribbon-inner, .odometer.odometer-theme-default.odometer-animating-down .odometer-ribbon-inner { + -webkit-transform: translateY(-100%); + -moz-transform: translateY(-100%); + -ms-transform: translateY(-100%); + -o-transform: translateY(-100%); + transform: translateY(-100%); +} +/* line 80, ../../../hub/static/css/lib/odometer.scss */ +.odometer.odometer-auto-theme.odometer-animating-down.odometer-animating .odometer-ribbon-inner, .odometer.odometer-theme-default.odometer-animating-down.odometer-animating .odometer-ribbon-inner { + -webkit-transition: -webkit-transform 2s; + -moz-transition: -moz-transform 2s; + -ms-transition: -ms-transform 2s; + -o-transition: -o-transform 2s; + transition: transform 2s; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -ms-transform: translateY(0); + -o-transform: translateY(0); + transform: translateY(0); +} +/* line 92, ../../../hub/static/css/lib/odometer.scss */ +.odometer.odometer-auto-theme, .odometer.odometer-theme-default { + line-height: 0.7; + font-size: 52px; + font-family: "HelveticaNeue-CondensedBold","Helvetica Neue","Arial Narrow",Arial,sans-serif; + font-weight: bold; + font-stretch: condensed; +} +/* line 99, ../../../hub/static/css/lib/odometer.scss */ +.odometer.odometer-auto-theme .odometer-value, .odometer.odometer-theme-default .odometer-value { + text-align: center; +} + +/* line 3, ../../../hub/static/css/app/stat.scss */ +h2 { + margin: 0px 20px 20px 20px; +} + +/* line 7, ../../../hub/static/css/app/stat.scss */ +.data { + display: block; + margin: 20px; +} + +/* line 12, ../../../hub/static/css/app/stat.scss */ +.data h2 { + margin: 0 0 6px; + line-height: 1.1; + font-size: 15px; + color: #999; +} + +/* line 19, ../../../hub/static/css/app/stat.scss */ +.mod { + padding: 15px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} + +/* line 28, ../../../hub/static/css/app/stat.scss */ +.indent { + margin-left: -10px; +} diff --git a/dist/css/app/team-add-project.css b/dist/css/app/team-add-project.css new file mode 100644 index 0000000..4be3628 --- /dev/null +++ b/dist/css/app/team-add-project.css @@ -0,0 +1,5496 @@ +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* line 2, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-left { + margin: 0; + font-size: 30px; + line-height: 36px; + float: left; +} +/* line 8, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-desc { + margin-top: 12px; + margin-left: 5px; + margin-bottom: 0; + width: 60%; + float: left; +} +/* line 9, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-desc p { + margin: 0; +} +/* line 10, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-desc p small { + padding: 0 6px; + background: rgba(99, 182, 174, 0.2); + color: #63b6ae; +} +/* line 23, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-right { + float: right; +} + +/* line 1, ../../../hub/static/css/mod/drop-down-list.scss */ +.add-item-menu { + display: none; + position: absolute; + top: 35px; + width: 218px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 10, ../../../hub/static/css/mod/drop-down-list.scss */ +.add-item-menu ul li.intro { + padding: 7px; + color: #666666; +} + +/* line 14, ../../../hub/static/css/mod/drop-down-list.scss */ +.add-item-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666666; +} + +/* line 19, ../../../hub/static/css/mod/drop-down-list.scss */ +.add-item-menu ul li.active { + background: #4183C4; + color: white; +} + +/* line 23, ../../../hub/static/css/mod/drop-down-list.scss */ +.add-item-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 30, ../../../hub/static/css/mod/drop-down-list.scss */ +.add-item-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; + border-radius: 3px; +} + +/* line 4, ../../../hub/static/css/app/team-add-project.scss */ +.boxed-group { + position: relative; + background: #EFEFEF; + padding: 3px; + border-radius: 3px; + margin: 0 0 15px 0; +} +/* line 10, ../../../hub/static/css/app/team-add-project.scss */ +.boxed-group .boxed-group-inner { + padding: 1px 10px; + background: white; + border: 1px solid #D8D8D8; + border-top: none; + border-bottom-left-radius: 1px; + border-bottom-right-radius: 1px; + color: #666; + font-size: 13px; +} + +/* line 21, ../../../hub/static/css/app/team-add-project.scss */ +#project_id { + margin-bottom: 1px; +} + +/* line 24, ../../../hub/static/css/app/team-add-project.scss */ +label { + margin-left: 10px; + color: #63b6ae; +} + +/* line 28, ../../../hub/static/css/app/team-add-project.scss */ +dd { + position: relative; +} + +/* line 31, ../../../hub/static/css/app/team-add-project.scss */ +.add-item-menu { + top: 30px; +} diff --git a/dist/css/app/team-groups.css b/dist/css/app/team-groups.css new file mode 100644 index 0000000..ea54c7d --- /dev/null +++ b/dist/css/app/team-groups.css @@ -0,0 +1,5768 @@ +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* line 2, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-left { + margin: 0; + font-size: 30px; + line-height: 36px; + float: left; +} +/* line 8, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-desc { + margin-top: 12px; + margin-left: 5px; + margin-bottom: 0; + width: 60%; + float: left; +} +/* line 9, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-desc p { + margin: 0; +} +/* line 10, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-desc p small { + padding: 0 6px; + background: rgba(99, 182, 174, 0.2); + color: #63b6ae; +} +/* line 23, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-right { + float: right; +} + +/* line 1, ../../../hub/static/css/mod/user-card.scss */ +.user-card { + position: absolute; + padding: 3px 5px 5px; + min-height: 68px; + width: 210px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +/* line 2, ../../../hub/static/css/mod/user-card.scss */ +.user-card .desc { + margin-left: 3px; +} + +/* line 3, ../../../hub/static/css/mod/user-card.scss */ +.user-card .avatar-wrap { + width: 46px; + height: 36px; + float: left; + margin-right: 6px; + border-right: 1px solid #BEBEBE; +} + +/* line 4, ../../../hub/static/css/mod/user-card.scss */ +.user-card .badge-item { + float: left; + width: 30px; + height: 30px; + border: none; + padding: 2px; + background-color: white; + line-height: 0; + margin-right: 0.7em; +} + +/* line 5, ../../../hub/static/css/mod/user-card.scss */ +.user-card .title { + padding: 0 0 0.25em 0; +} + +/* line 6, ../../../hub/static/css/mod/user-card.scss */ +.user-card .desc .avatar { + float: left; + width: 30px; + height: 30px; + padding: 2px; + background-color: white; + line-height: 0; + margin-right: 0.7em; +} + +/* line 1, ../../../hub/static/css/mod/team-card.scss */ +.team-card { + position: absolute; + padding: 6px 10px; + min-height: 68px; + width: 236px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + overflow: hidden; +} +/* line 10, ../../../hub/static/css/mod/team-card.scss */ +.team-card .pic { + float: right; + max-height: 50px; + margin: 6px 0 0 10px; +} +/* line 15, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content { + word-wrap: break-word; +} +/* line 17, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .title { + margin: 6px 0; + font-size: 15px; + overflow: hidden; + white-space: nowrap; +} +/* line 23, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .info { + position: relative; + margin-top: 10px; + font-size: 13px; +} +/* line 27, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .info .desc { + white-space: nowrap; + overflow: hidden; +} + +/* line 35, ../../../hub/static/css/mod/team-card.scss */ +.member { + border-top: solid 1px #eaeaea; + padding-top: 8px; + height: 26px; +} +/* line 39, ../../../hub/static/css/mod/team-card.scss */ +.member .more-members { + float: right; + width: 24px; + height: 24px; + line-height: 26px; + text-align: center; + border: 1px solid #eaeaea; + background: #eaeaea; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 53, ../../../hub/static/css/mod/team-card.scss */ +.member .members li { + float: left; +} +/* line 55, ../../../hub/static/css/mod/team-card.scss */ +.member .members li a { + display: block; + width: 26px; + height: 26px; + overflow: hidden; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 65, ../../../hub/static/css/mod/team-card.scss */ +.member .members li a img { + width: 26px; + height: 26px; +} + +/* line 73, ../../../hub/static/css/mod/team-card.scss */ +.cf { + zoom: 1; +} +/* line 75, ../../../hub/static/css/mod/team-card.scss */ +.cf:before { + content: ""; + display: table; +} +/* line 79, ../../../hub/static/css/mod/team-card.scss */ +.cf .cf:after { + clear: both; + content: ""; + display: table; +} + +/* Timeline */ +@media (max-width: 767px) { + /* line 6, ../../../hub/static/css/mod/timeline.scss */ + .timeline { + padding: 10px; + } +} +/* line 9, ../../../hub/static/css/mod/timeline.scss */ +.timeline { + margin-top: 0px; + word-wrap: break-word; + word-break: normal; +} +/* line 14, ../../../hub/static/css/mod/timeline.scss */ +.timeline li { + position: relative; + list-style: none; + clear: both; + background: white; + padding: 10px 20px 10px 32px; + margin: 0 0 0px; + border-bottom: 1px solid #eaeaea; +} +/* line 23, ../../../hub/static/css/mod/timeline.scss */ +.timeline li .title { + margin-bottom: 0.5em; +} +/* line 25, ../../../hub/static/css/mod/timeline.scss */ +.timeline li .title i { + position: absolute; + left: 5px; + padding: 2px 5px 0; + color: #999; + font-size: 10px; +} +/* line 35, ../../../hub/static/css/mod/timeline.scss */ +.timeline .time { + float: right; + color: #ccc; + font-size: 12px; +} +/* line 41, ../../../hub/static/css/mod/timeline.scss */ +.timeline code { + white-space: normal; +} + +/* line 46, ../../../hub/static/css/mod/timeline.scss */ +.timeline .padding { + height: 2em; + font-weight: bold; +} + +/* line 50, ../../../hub/static/css/mod/timeline.scss */ +.timeline .more_items { + margin-left: 10px; + font-weight: bold; +} + +/* line 54, ../../../hub/static/css/mod/timeline.scss */ +.timeline .time { + color: #bbb; +} + +/* line 57, ../../../hub/static/css/mod/timeline.scss */ +.timeline .desc { + padding: 0 0 1em 0; + color: #666; + word-wrap: break-word; +} + +/* line 62, ../../../hub/static/css/mod/timeline.scss */ +.timeline .desc .right_side { + float: right; + margin-right: 30px; +} + +/* line 67, ../../../hub/static/css/mod/timeline.scss */ +.timeline .pagination { + display: none; + background: #63b6ae; +} + +/* line 71, ../../../hub/static/css/mod/timeline.scss */ +.pagination { + display: block; + margin: 7px 0; + overflow: hidden; + border: 1px solid #EAEAEA; + border-bottom-color: #CACACA; + border-top: none; + border-bottom: none; + border-radius: 3px; + background-image: -webkit-linear-gradient(top, white, #EFEFEF); +} + +/* line 82, ../../../hub/static/css/mod/timeline.scss */ +.timeline .pagination a { + color: white; +} + +/* line 85, ../../../hub/static/css/mod/timeline.scss */ +.pagination a { + padding: 8px; + width: 100%; + text-align: center; + line-height: 1.4; +} + +/* line 91, ../../../hub/static/css/mod/timeline.scss */ +.pagination a:last-child, .pagination span:last-child { + border-right: none; + border-bottom-right-radius: 3px; +} + +/* line 95, ../../../hub/static/css/mod/timeline.scss */ +.pagination a:first-child, .pagination span:first-child { + border-left: none; + border-bottom-left-radius: 3px; +} + +/* line 99, ../../../hub/static/css/mod/timeline.scss */ +.pagination a, .pagination span { + float: left; + margin: 0; + color: #777; + font-size: 13px; + text-decoration: none; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #DADADA; +} + +/* line 108, ../../../hub/static/css/mod/timeline.scss */ +.timeline .loader img { + display: block; + width: 16px; + height: 16px; + margin: 0 auto; + position: relative; +} + +/* line 8, ../../../hub/static/css/mod/text-truncate.scss */ +.css-truncate.css-truncate-target, .css-truncate .css-truncate-target { + max-width: 125px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + vertical-align: top; + display: inline-block; +} + +/* line 14, ../../../hub/static/css/mod/text-truncate.scss */ +.css-truncate.expandable:hover .css-truncate-target { + max-width: 10000px !important; +} + +/* line 3, ../../../hub/static/css/mod/my-projects.scss */ +.my_projects { + margin-top: 5px; +} +/* line 4, ../../../hub/static/css/mod/my-projects.scss */ +.my_projects a.right { + float: right; +} +/* line 8, ../../../hub/static/css/mod/my-projects.scss */ +.my_projects li { + max-width: 300px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +/* line 12, ../../../hub/static/css/mod/my-projects.scss */ +.my_projects li .delete-btn { + display: none; +} +/* line 16, ../../../hub/static/css/mod/my-projects.scss */ +.my_projects li.hover .delete-btn { + display: block; +} + +/* line 23, ../../../hub/static/css/mod/my-projects.scss */ +.my_projects .delete-btn { + padding: 0 6px 0 6px; +} + +/* line 6, ../../../hub/static/css/app/team-groups.scss */ +.group-link { + text-decoration: none; +} + +/* line 9, ../../../hub/static/css/app/team-groups.scss */ +.group-link:focus { + outline: none; +} + +/* line 12, ../../../hub/static/css/app/team-groups.scss */ +.group-link:hover { + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/app/team-groups.scss */ +.group-description { + overflow: hidden; + max-width: 80%; + margin-top: 5px; + font-size: 14px; + color: #777; + text-overflow: ellipsis; + white-space: nowrap; +} diff --git a/dist/css/app/team-issue.css b/dist/css/app/team-issue.css new file mode 100644 index 0000000..874de41 --- /dev/null +++ b/dist/css/app/team-issue.css @@ -0,0 +1,7521 @@ +@charset "UTF-8"; +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(to bottom, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* line 1, ../../../hub/static/css/mod/user-card.scss */ +.user-card { + position: absolute; + padding: 3px 5px 5px; + min-height: 68px; + width: 210px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +/* line 2, ../../../hub/static/css/mod/user-card.scss */ +.user-card .desc { + margin-left: 3px; +} + +/* line 3, ../../../hub/static/css/mod/user-card.scss */ +.user-card .avatar-wrap { + width: 46px; + height: 36px; + float: left; + margin-right: 6px; + border-right: 1px solid #BEBEBE; +} + +/* line 4, ../../../hub/static/css/mod/user-card.scss */ +.user-card .badge-item { + float: left; + width: 30px; + height: 30px; + border: none; + padding: 2px; + background-color: white; + line-height: 0; + margin-right: 0.7em; +} + +/* line 5, ../../../hub/static/css/mod/user-card.scss */ +.user-card .title { + padding: 0 0 0.25em 0; +} + +/* line 6, ../../../hub/static/css/mod/user-card.scss */ +.user-card .desc .avatar { + float: left; + width: 30px; + height: 30px; + padding: 2px; + background-color: white; + line-height: 0; + margin-right: 0.7em; +} + +/* line 1, ../../../hub/static/css/mod/team-card.scss */ +.team-card { + position: absolute; + padding: 6px 10px; + min-height: 68px; + width: 236px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + overflow: hidden; +} +/* line 10, ../../../hub/static/css/mod/team-card.scss */ +.team-card .pic { + float: right; + max-height: 50px; + margin: 6px 0 0 10px; +} +/* line 15, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content { + word-wrap: break-word; +} +/* line 17, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .title { + margin: 6px 0; + font-size: 15px; + overflow: hidden; + white-space: nowrap; +} +/* line 23, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .info { + position: relative; + margin-top: 10px; + font-size: 13px; +} +/* line 27, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .info .desc { + white-space: nowrap; + overflow: hidden; +} + +/* line 35, ../../../hub/static/css/mod/team-card.scss */ +.member { + border-top: solid 1px #eaeaea; + padding-top: 8px; + height: 26px; +} +/* line 39, ../../../hub/static/css/mod/team-card.scss */ +.member .more-members { + float: right; + width: 24px; + height: 24px; + line-height: 26px; + text-align: center; + border: 1px solid #eaeaea; + background: #eaeaea; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 53, ../../../hub/static/css/mod/team-card.scss */ +.member .members li { + float: left; +} +/* line 55, ../../../hub/static/css/mod/team-card.scss */ +.member .members li a { + display: block; + width: 26px; + height: 26px; + overflow: hidden; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 65, ../../../hub/static/css/mod/team-card.scss */ +.member .members li a img { + width: 26px; + height: 26px; +} + +/* line 73, ../../../hub/static/css/mod/team-card.scss */ +.cf { + zoom: 1; +} +/* line 75, ../../../hub/static/css/mod/team-card.scss */ +.cf:before { + content: ""; + display: table; +} +/* line 79, ../../../hub/static/css/mod/team-card.scss */ +.cf .cf:after { + clear: both; + content: ""; + display: table; +} + +/* line 8, ../../../hub/static/css/mod/text-truncate.scss */ +.css-truncate.css-truncate-target, .css-truncate .css-truncate-target { + max-width: 125px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + vertical-align: top; + display: inline-block; +} + +/* line 14, ../../../hub/static/css/mod/text-truncate.scss */ +.css-truncate.expandable:hover .css-truncate-target { + max-width: 10000px !important; +} + +/* line 1, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav { + margin-top: 6px; +} + +/* line 3, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label { + position: relative; + display: inline-block; + margin-left: 3px; + padding: 3px 7px; + border: 1px solid #ccc; + border-radius: 3px; + color: #333; + background-color: #fafafa; + vertical-align: middle; +} + +/* line 15, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::before, .metanav .counts-label::after { + content: ""; + position: absolute; + top: 50%; + right: 100%; + display: block; + margin-right: 0px; + margin-top: -6px; + width: 0; + height: 0; + border: 6px solid transparent; + border-right-color: #ccc; +} + +/* line 29, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::after { + margin-right: -1px; + border-right-color: #fafafa; +} + +/* line 2, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.metabox { + display: inline-block; + height: 8px; + background: #ccc; + text-indent: -9999px; + font-size: 12px; +} + +/* line 9, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats { + font: 13px Helvetica, arial, freesans, clean, sans-serif; + line-height: 1.4; + margin: 0; + padding: 0; + border: 0; + position: relative; + float: right; + width: 135px; + opacity: 0.5; + padding-bottom: 10px; +} + +/* line 21, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats:hover { + opacity: 1; +} + +/* line 24, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats:hover .list-tip { + display: block; +} + +/* line 27, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats a { + color: #4183c4; + text-decoration: none; +} + +/* line 31, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats-graph { + height: 10px; + overflow: hidden; +} + +/* line 35, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats-graph span { + display: inline-block; + height: 6px; + background: #ccc; + text-indent: -9999px; + float: left; +} + +/* line 42, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip, ul.list-tip { + border-radius: 3px; + box-shadow: 0 0 5px #ccc; + border: 1px solid #ddd; + background: #fff; + position: absolute; + padding-left: 0px; + top: 20px; + left: -20px; + width: 175px; + z-index: 100; + display: none; + margin-top: 0px; +} + +/* line 56, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip:before, ul.list-tip:before { + content: "▲"; + font-size: 14px; + margin: 0 auto; + width: 14px; + display: block; + margin-top: -13px; + color: #fff; + text-shadow: -1px -1px 2px #ccc; +} + +/* line 66, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li, ul.list-tip li { + margin: 0; + line-height: 100%; + list-style: none; + border-bottom: 1px solid #eee; + font-weight: bold; +} + +/* line 73, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li a, ol.list-tip li .other, ul.list-tip li a, ul.list-tip li .other { + color: #333; + padding: 8px 10px; + display: block; +} + +/* line 78, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li span.color-block, ul.list-tip li span.color-block { + display: inline-block; + width: 8px; + height: 10px; + margin-right: 5px; +} + +/* line 84, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li span.percent, ul.list-tip li span.percent { + float: right; + color: #999; +} + +/* fix project title for newer version of bootstrap*/ +/* line 6, ../../../hub/static/css/mod/project-info.scss */ +.pagehead .pull-left { + margin: 0; + font-size: 30px; + line-height: 36px; +} + +/* Hotfix for FlatUI */ +/* line 13, ../../../hub/static/css/mod/project-info.scss */ +.pagehead h2.pull-left { + margin: 0; +} + +/* line 17, ../../../hub/static/css/mod/project-info.scss */ +#project-info { + border: 1px solid #c5d5dd; + border-radius: 3px; + width: 100%; +} + +/* line 22, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div { + padding: 10px; +} + +/* line 25, ../../../hub/static/css/mod/project-info.scss */ +#project-info p { + margin: 0px; +} + +/* line 28, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div.team-label { + border-top: 1px solid #ccc; +} + +/* line 32, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div.git-url { + border-top: 1px solid #ccc; +} + +/* line 36, ../../../hub/static/css/mod/project-info.scss */ +#project-info input.git-url { + width: 480px; + margin: 0px; + cursor: auto; +} + +/* line 43, ../../../hub/static/css/mod/project-info.scss */ +#project-info .ssh div.ssh-url { + display: inline; +} +/* line 46, ../../../hub/static/css/mod/project-info.scss */ +#project-info .ssh div.http-url { + display: none; +} + +/* line 52, ../../../hub/static/css/mod/project-info.scss */ +#project-info .http div.ssh-url { + display: none; +} +/* line 55, ../../../hub/static/css/mod/project-info.scss */ +#project-info .http div.http-url { + display: inline; +} + +/* line 60, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar { + margin-top: 12px; + border-bottom: 1px solid #DDD; +} + +/* line 61, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar #back-old-browser { + padding-top: 8px; + float: right; +} + +/* line 62, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab { + padding-left: 20px; +} + +/* line 63, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li { + display: inline-block; + vertical-align: top; + cursor: pointer; +} + +/* line 64, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li a { + color: #666; + text-decoration: none; + padding: 8px 12px; + display: inline-block; + border-left: 1px solid transparent; + border-top: 1px solid transparent; + border-right: 1px solid transparent; + margin-bottom: -1px; +} + +/* line 65, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li a.active { + color: #333; + font-weight: bold; + border-left: 1px solid #DDD; + border-top: 1px solid #DDD; + border-right: 1px solid #DDD; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + background-color: white; +} + +/* line 67, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar .scope { + float: left; + margin-right: 10px; +} + +/* line 71, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar .scope i { + font-style: normal; +} + +/* line 75, ../../../hub/static/css/mod/project-info.scss */ +#breadcrumb { + margin: 10px 0; + font-size: 18px; + font-weight: bold; + color: #999; +} + +/* line 76, ../../../hub/static/css/mod/project-info.scss */ +#breadcrumb .final-path { + color: #000; +} + +/* line 1, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body { + padding: 30px; +} + +/* line 4, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body > :first-child { + margin-top: 0 !important; +} + +/* line 7, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body h1, +.markdown-body h2, +.markdown-body h3, +.markdown-body h4, +.markdown-body h5, +.markdown-body h6 { + margin: 20px 0 10px; + padding: 0; + font-weight: bold; + -webkit-font-smoothing: antialiased; + cursor: text; + position: relative; +} + +/* line 20, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body h2 { + font-size: 24px; + border-bottom: 1px solid #CCC; + color: black; +} + +/* line 25, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body, +.markdown-body p { + font-size: 14px; + line-height: 1.6; +} + +/* line 30, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body p, +.markdown-body blockquote, +.markdown-body ul, +.markdown-body ol, +.markdown-body dl, +.markdown-body table, +.markdown-body pre { + margin: 15px 0; +} + +/* line 39, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul, +.markdown-body ol { + padding-left: 30px; +} + +/* line 43, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul li { + line-height: 1.6; +} + +/* line 46, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul { + list-style: disc; +} + +/* line 49, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ol { + list-style: decimal; +} + +/* line 52, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table { + width: 100%; +} + +/* line 55, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table caption + thead tr:first-child th, +.markdown-body table caption + thead tr:first-child td, +.markdown-body table colgroup + thead tr:first-child th, +.markdown-body table colgroup + thead tr:first-child td, +.markdown-body table thead:first-child tr:first-child th, +.markdown-body table thead:first-child tr:first-child td { + border-top: 0; +} + +/* line 63, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table thead th { + vertical-align: bottom; +} + +/* line 66, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th { + font-weight: bold; +} + +/* line 69, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th, +.markdown-body table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #ddd; +} + +/* line 77, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th, +.markdown-body table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #ddd; +} + +/* line 85, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table tbody > tr:nth-child(odd) > td, +.markdown-body table tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} + +/* line 89, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body .progress-percentage { + color: #888; +} + +/* line 93, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page { + padding: 0px; +} + +/* line 96, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page h1, +.markdown-page h2, +.markdown-page h3, +.markdown-page h4, +.markdown-page h5, +.markdown-page h6 { + position: static; +} + +/* line 104, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page pre { + font-family: Consolas, 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 14px; +} + +/* line 108, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page .label { + background-color: transparent; +} + +/* line 111, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page dd { + margin-left: 1.5em; +} + +/* line 114, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body code { + white-space: pre-wrap; +} + +/* preview comment form style */ +/* line 2, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav { + margin: 10px 0; + border-bottom: 1px solid #DDD; + height: 35px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs { + display: inline-block; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs > li { + display: inline-block; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab { + display: inline-block; + margin-bottom: -1px; + padding: 8px 12px 9px; + border: 1px solid transparent; + border-bottom: 0; + font-size: 14px; + color: #666; + text-decoration: none; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab.selected { + border-color: #DDD; + border-radius: 3px 3px 0 0; + background-color: white; + color: #333; + font-weight: bold; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab:hover { + text-decoration: none; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav { + position: relative; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav ul.tabnav-tabs { + padding-left: 10px; +} + +/* line 10, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 0 10px 10px; +} + +/* line 11, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form #preview_bucket .content-body { + padding: 10px; + min-height: 132px; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form.tab-content { + overflow: initial; + position: relative; +} + +/* line 2, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 10px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-actions { + padding: 0; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + position: relative; + border: 3px solid #EEE; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + padding: 0; + background: #EEE; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content .write-content { + padding: 0 10px 10px; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; + margin: 0; +} + +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary, button.primary.classy:disabled, button.primary.classy.disabled, button.primary.classy:disabled:hover, button.primary.classy.disabled:disabled:hover, button.classy:disabled:hover.primary, button.classy.disabled:disabled:hover.primary { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4); + border-color: #74BB5A; + border-bottom-color: #509338; + background: #8ADD6D; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#8add6d', endColorstr='#60b044')"; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); + background-image: -webkit-linear-gradient(top, #8ADD6D, #60B044); +} + +/* line 2, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary.disabled { + opacity: 0.5; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy, +button.classy:disabled, +button.classy.disabled, +a.button.classy:disabled, +a.button.classy.disabled, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover:disabled, +a.button.classy.disabled:hover, +a.button.classy, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy:disabled:hover, +a.button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover { + display: inline-block; + padding: 8px 15px; + line-height: normal; + position: relative; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 12px; + font-weight: bold; + color: #666; + text-shadow: 0 1px rgba(255, 255, 255, 0.9); + background: whiteSmoke; + background: -moz-linear-gradient(whiteSmoke, #E5E5E5); + background: -webkit-linear-gradient(whiteSmoke, #E5E5E5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; + border-radius: 3px; + border: 1px solid #DDD; + border-bottom-color: #BBB; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* ================================== *\ + * Zen Form + * ================================== */ +/* line 6, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + position: fixed; + z-index: 99999; + top: 0; + left: 0; + right: 0; + bottom: 0; + padding: 24px 30px 24px 24px; +} + +/* line 16, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-input-wrap { + max-width: 640px; + position: relative; + margin: 0 auto; +} + +/** + * Buttons style + */ +/* line 25, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button, +.zen-forms-theme-switch { + position: absolute; + width: 18px; + height: 18px; + text-align: center; + top: 10px; + right: 10px; + font-size: 24px; + color: #516066; + cursor: pointer; + line-height: 1; +} + +/* line 39, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-theme-switch { + top: 28px; + font-size: 34px; +} + +/* line 44, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button:hover, +.zen-forms-theme-switch:hover { + color: #667981; +} + +/** + * Inputs basic style + */ +/* line 52, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + padding: 8px 0; + width: 100%; + background: none; + border: none; + margin-bottom: 24px; + cursor: pointer; +} + +/* line 62, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus, +.zen-forms textarea:focus { + cursor: text; +} + +/* line 67, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms textarea { + resize: none; +} + +/* line 71, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + cursor: pointer; + display: none; + padding: 8px 3; + position: absolute; + top: 0; + width: 100%; +} + +/* line 80, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms .empty + label { + display: block; +} + +/* line 84, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus + label, +.zen-forms textarea:focus + label { + display: none; +} + +/* line 89, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms :focus { + outline-color: transparent; + outline-style: none; +} + +/** + * Dark theme + */ +/* line 97, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + background: #151a1c; +} + +/* line 101, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + color: #516066; +} + +/* line 105, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + color: #667981; +} + +/** + * Light theme + */ +/* line 113, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme { + background: #fefefe; +} + +/* line 117, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme label { + color: #959697; +} + +/* line 121, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme input, +.zen-forms.light-theme textarea { + color: #707071; +} + +/* line 4, ../../../hub/static/css/mod/zen-forms.scss */ +.write-content .enable-fullscreen { + position: absolute; + top: 5px; + right: 16px; + color: #333333; + opacity: .5; + line-height: 1em; +} + +/* line 5, ../../../hub/static/css/mod/zen-forms.scss */ +.mini-icon-fullscreen::before { + content: ""; +} + +/* line 6, ../../../hub/static/css/mod/zen-forms.scss */ +.fullscreen-overlay textarea, .zen-forms textarea { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + height: 100%; + padding: 20px; + border: 0; + font-size: 21px; + line-height: 1.6em; + resize: none; + -moz-transition: color 0.15s ease-in 0; + -webkit-transition: color 0.15s ease-in 0; + transition: color 0.15s ease-in 0; + box-shadow: none; +} + +/* line 7, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms.light-theme textarea { + background: #fff; + color: #999999; +} + +/* line 8, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms .zen-forms-input-wrap { + width: 100%; + height: 100%; +} + +/* line 9, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms label[for^=zen-forms-input] { + display: none; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-zen.scss */ +.previewable-comment-form .zen-enabled textarea { + padding: 10px 18px 10px 10px; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled { + position: relative; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled .go-zen { + position: absolute; + right: 15px; + top: 5px; +} + +/* line 1, ../../../hub/static/css/mod/loader.scss */ +.loader { + display: none; + position: absolute; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + background-color: #eee; +} + +/* line 2, ../../../hub/static/css/mod/loader.scss */ +.loader .spinner { + display: block; + width: 32px; + height: 32px; + margin: 0 auto; + top: 121px; + position: relative; + background: url(/static/img/spinner.gif) no-repeat; +} + +/* line 1, ../../../hub/static/css/mod/upload-widget.scss */ +.upload-widget { + position: relative; + top: -50px; + width: 360px; +} +/* line 7, ../../../hub/static/css/mod/upload-widget.scss */ +.upload-widget input { + position: absolute; + width: 120px; + opacity: 0.0001; + cursor: pointer; + margin: 0; +} +/* line 15, ../../../hub/static/css/mod/upload-widget.scss */ +.upload-widget form { + width: 120px; + float: left; +} + +/* line 1, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view { + position: absolute; + top: 0; + left: 0; + display: none; + margin-top: 18px; + background: white; + border: 1px solid #DDD; + border-radius: 3px; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + min-width: 120px; + z-index: 10; +} + +/* line 15, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur { + background: #3366FF; + color: white; +} + +/* line 19, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur small { + color: white; +} + +/* line 22, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view strong { + color: #3366FF; +} + +/* line 25, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur strong { + color: white; + font: bold; +} + +/* line 29, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul { + /* width: 100px; */ + list-style: none; + padding: 0; + margin: auto; +} + +/* line 35, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul li { + display: block; + padding: 5px 10px; + border-bottom: 1px solid #DDD; + cursor: pointer; + /* border-top: 1px solid #C8C8C8; */ +} + +/* line 42, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view small { + font-size: smaller; + color: #777; + font-weight: normal; +} + +/* line 11, ../../../hub/static/css/mod/flatui-comment-form.scss */ +.side-avatar { + float: left; + padding: 0px 5px 5px; + vertical-align: top; + margin-left: 0; +} + +/* line 18, ../../../hub/static/css/mod/flatui-comment-form.scss */ +.comment-form-head li { + line-height: 18px; +} + +/* line 22, ../../../hub/static/css/mod/flatui-comment-form.scss */ +#form-file-upload { + position: relative; + top: -50px; + width: 360px; +} + +/* line 28, ../../../hub/static/css/mod/flatui-comment-form.scss */ +#form-file-upload #file { + position: absolute; + width: 240px; + margin-left: -80px; + opacity: 0.0001; + cursor: pointer; +} + +/* line 36, ../../../hub/static/css/mod/flatui-comment-form.scss */ +.form-content { + padding: 10px; + display: none; + opacity: 1.0; +} + +/* line 43, ../../../hub/static/css/mod/flatui-comment-form.scss */ +form#add-comment-form .form-content { + display: block; + background: white; + border: 0px solid; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} +/* line 49, ../../../hub/static/css/mod/flatui-comment-form.scss */ +form#add-comment-form .form-content textarea#new_comment_content { + width: 100%; + background: white; +} +/* line 54, ../../../hub/static/css/mod/flatui-comment-form.scss */ +form#add-comment-form .form-content .tabnav { + border-bottom: none; + padding: 10px; +} +/* line 59, ../../../hub/static/css/mod/flatui-comment-form.scss */ +form#add-comment-form .form-content .write-content { + position: relative; + padding: 10px 10px 10px; +} + +/* Zen Mode button hacks for FlatUI */ +/* line 67, ../../../hub/static/css/mod/flatui-comment-form.scss */ +.write-content .enable-fullscreen { + top: 15px; +} + +/* line 71, ../../../hub/static/css/mod/flatui-comment-form.scss */ +.tab-content { + overflow: visible; +} + +/* Issue for Responsive Mobile Hacks */ +@media (max-width: 767px) { + /* line 79, ../../../hub/static/css/mod/flatui-comment-form.scss */ + .side-avatar { + padding: 0px; + } + + /* line 85, ../../../hub/static/css/mod/flatui-comment-form.scss */ + form#add-comment-form .form-content .tabnav { + max-width: 100%; + } +} +/* hacks for markdown paragraph content for flatui */ +/* line 4, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.markdown-body p, .markdown-body blockquote, .markdown-body ul, .markdown-body ol, .markdown-body dl, .markdown-body table, .markdown-body pre { + margin: 15px 0px 0px 0px; +} + +/* line 8, ../../../hub/static/css/mod/flatui-comment-content.scss */ +#summary.mod .header { + position: relative; +} + +/* line 12, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.mini-icon-edit:before { + content: ""; +} + +/* line 13, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.mini-icon-delete-note::before, .mini-icon-remove-close::before { + content: ""; +} + +/* line 15, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.content .form-content input.title-field { + font-size: 20px; + font-weight: bold; + margin-bottom: 5px; + width: 99%; +} + +/* line 22, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.content .form-content textarea { + min-height: 100px; + max-width: 100%; + width: 99%; + margin: 0; +} + +/* line 29, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.form-actions { + background-color: transparent; + border: none; + text-align: right; + margin: 0px; + padding: 10px 0px 0px; +} + +/* line 37, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.change-header-right { + float: right; +} +/* line 39, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.change-header-right a.change-header-date { + color: lightgray; +} + +/* line 44, ../../../hub/static/css/mod/flatui-comment-content.scss */ +ul.comment-header-actions { + margin-left: 10px; + display: inline; +} +/* line 47, ../../../hub/static/css/mod/flatui-comment-content.scss */ +ul.comment-header-actions li { + display: inline; +} + +/* line 52, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.comment-body { + padding: 0px; +} + +/* line 56, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.markdown-body { + padding: 0px; +} + +/* line 1, ../../../hub/static/css/mod/quick-emoji.scss */ +.quick-emoji { + margin-right: 10px; +} +/* line 4, ../../../hub/static/css/mod/quick-emoji.scss */ +.quick-emoji .description { + text-align: center; + color: #999; +} +/* line 9, ../../../hub/static/css/mod/quick-emoji.scss */ +.quick-emoji .emojis { + overflow-x: hidden; + overflow-y: scroll; + word-wrap: break-word; + word-break: break-all; + width: 290px; + height: 260px; +} +/* line 17, ../../../hub/static/css/mod/quick-emoji.scss */ +.quick-emoji .emojis a { + display: block; + float: left; + width: 25px; + height: 25px; + padding: 2px; + border: 1px solid white; +} +/* line 24, ../../../hub/static/css/mod/quick-emoji.scss */ +.quick-emoji .emojis a:hover { + background: #eef; + border: 1px solid #aad; +} + +/* line 1, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit { + overflow: auto; +} + +/* line 4, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit li { + -moz-border-radius: 5px 5px 5px 5px; + display: block; + float: left; + margin: 2px 5px 2px 0; +} + +/* line 10, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit li.tagit-choice { + background-color: #00a89c; + padding: 2px 4px 3px; + color: #fff; + border-radius: 2px; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; +} + +/* line 19, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit li.tagit-choice:hover { + color: rgba(255, 255, 255, 0.8); + cursor: pointer; +} + +/* line 23, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit li.tagit-new { + padding: 2px 4px 3px; + padding: 2px 4px 1px; + padding: 2px 4px 1px 0; +} + +/* line 29, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit li.tagit-choice input { + display: block; + float: left; + margin: 2px 5px 2px 0; +} + +/* line 34, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit li.tagit-choice a.tag-close { + color: #fff; + cursor: pointer; + font-weight: bold; + padding-left: 3px; + text-decoration: none; + text-shadow: none; +} + +/* line 42, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit input[type="text"] { + width: 200px; +} + +/* line 2, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-left { + margin: 0; + font-size: 30px; + line-height: 36px; + float: left; +} +/* line 8, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-desc { + margin-top: 12px; + margin-left: 5px; + margin-bottom: 0; + width: 60%; + float: left; +} +/* line 9, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-desc p { + margin: 0; +} +/* line 10, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-desc p small { + padding: 0 6px; + background: rgba(99, 182, 174, 0.2); + color: #63b6ae; +} +/* line 23, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-right { + float: right; +} + +/* line 5, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content { + word-wrap: break-word; + word-break: normal; +} +/* line 10, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content .side-avatar a:hover { + text-decoration: none; +} +/* line 14, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content .side-avatar img { + width: 48px; + height: 48px; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} +/* line 20, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary { + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; + display: block; + margin-left: 65px; + /* Milestone */ +} +/* line 25, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary .form-content { + padding: 0px; +} +/* line 29, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary .is-comment-editing .content-body { + display: none; +} +/* line 33, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary h2 { + font-size: 24px; +} +/* line 37, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary ul.actions { + float: right; + text-align: right; +} +/* line 41, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary ul.actions li { + display: inline; +} +/* line 45, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary ul.actions #upvote i { + position: absolute; +} +/* line 49, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary .summary-bottom { + margin-top: 10px; +} +/* line 52, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary .summary-bottom .assignee { + float: right; + margin-right: 10px; +} +/* line 56, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary .summary-bottom .state { + float: left; +} +/* line 58, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary .summary-bottom .state a#issue-closer { + padding-left: 10px; +} +/* line 64, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary .milestone-body { + display: block; +} +/* line 66, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary .milestone-body .milestone-bar-title { + display: inline; +} +/* line 68, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary .milestone-body .milestone-bar-title label { + display: inline; +} +/* line 76, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content .participation p { + display: inline-block; + margin-left: 15px; +} +/* line 82, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog { + padding: 0px; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} +/* line 86, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog .change { + padding: 10px 15px; + border-bottom: 1px solid #eaeaea; +} +/* line 90, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog .change .change-text { + padding: 10px; +} +/* line 93, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog .change:hover .change-bottom .comment-header-actions { + display: inline; +} +/* line 96, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog .change .change-bottom { + position: relative; +} +/* line 98, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog .change .change-bottom .comment-header-actions { + display: none; + position: absolute; + bottom: 10px; + left: 10px; +} +/* line 104, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog .change .change-bottom .author-profile { + float: right; +} +/* line 106, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog .change .change-bottom .author-profile p { + margin: 5px; + display: inline-block; +} +/* line 110, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog .change .change-bottom .author-profile a.change-header-date { + color: lightgray; +} +/* line 113, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog .change .change-bottom .author-profile .side-avatar { + float: none; +} +/* line 116, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog .change .change-bottom .author-profile .side-avatar a:hover { + text-decoration: none; +} +/* line 120, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog .change .change-bottom .author-profile .side-avatar img { + width: 32px; + height: 32px; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} +/* line 130, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog > .change:last-child { + border-bottom: none; +} +/* line 134, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content .is-comment-editing .change-text { + display: none; +} +/* line 138, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content .markdown-body pre { + font-family: Consolas, Menlo, "Liberation Mono", Courier, monospace; + margin: 0; + border: 0; +} +/* line 144, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content .avatar.avatar-tiny { + display: inline-block; + margin: 0 3px 0 0; + vertical-align: baseline; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} + +/* modal */ +/* line 155, ../../../hub/static/css/mod/issue-body.scss */ +.modal-header { + background: #63b6ae; + color: white; + text-shadow: none; +} +/* line 160, ../../../hub/static/css/mod/issue-body.scss */ +.modal-header p { + margin: 0; +} + +/* line 165, ../../../hub/static/css/mod/issue-body.scss */ +.modal-body { + text-shadow: none; +} + +/* line 169, ../../../hub/static/css/mod/issue-body.scss */ +.modal-footer { + background: #63b6ae; + color: white; + text-shadow: none; +} + +/* line 175, ../../../hub/static/css/mod/issue-body.scss */ +.quick-emoji .emojis { + height: 120px; +} + +/* Tag */ +/* line 180, ../../../hub/static/css/mod/issue-body.scss */ +ul.tagit li.tagit-choice { + margin-top: 6px; +} + +/* line 183, ../../../hub/static/css/mod/issue-body.scss */ +ul.tagit input[type="text"] { + width: 540px; +} + +/* line 186, ../../../hub/static/css/mod/issue-body.scss */ +.tag-groups p { + margin: 0; +} + +/* line 189, ../../../hub/static/css/mod/issue-body.scss */ +.tag-groups { + margin-bottom: 10px; +} + +/* Milestone */ +/* line 195, ../../../hub/static/css/mod/issue-body.scss */ +#milestone-modal .milestone-menu { + list-style: none; + display: block; + float: none; + position: relative; + margin-bottom: 5px; + border: 1px solid rgba(0, 0, 0, 0.2); + padding: 5px 0; + border-color: rgba(99, 182, 174, 0.8); + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +/* line 208, ../../../hub/static/css/mod/issue-body.scss */ +#milestone-modal .milestone-menu > li > a:hover, +#milestone-modal .milestone-menu > li > a:focus, +#milestone-modal .milestone-menu > .active > a, +#milestone-modal .milestone-menu > .active > a:hover, +#milestone-modal .milestone-menu > .active > a:focus { + color: #fff; + text-decoration: none; + background: #63b6ae; +} +/* line 217, ../../../hub/static/css/mod/issue-body.scss */ +#milestone-modal .milestone-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 20px; + white-space: nowrap; +} +/* line 226, ../../../hub/static/css/mod/issue-body.scss */ +#milestone-modal input[type=radio] { + display: none; +} + +/* Issue for Responsive Mobile Hacks */ +@media (max-width: 767px) { + /* line 236, ../../../hub/static/css/mod/issue-body.scss */ + #issue #content .mod { + margin-left: 35px; + } + /* line 239, ../../../hub/static/css/mod/issue-body.scss */ + #issue #content span.side-avatar img.discussion-bubble-avatar { + width: 30px; + height: 30px; + } +} +/* highlight */ +/* highlight style */ +/* line 2, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .hll { + background-color: #ffffcc; +} + +/* line 3, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight { + background: #ffffff; +} + +/* line 4, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .c { + color: #808080; +} + +/* Comment */ +/* line 5, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .err { + color: #F00000; + background-color: #F0A0A0; +} + +/* Error */ +/* line 6, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .k { + color: #008000; + font-weight: bold; +} + +/* Keyword */ +/* line 7, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .o { + color: #303030; +} + +/* Operator */ +/* line 8, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .cm { + color: #808080; +} + +/* Comment.Multiline */ +/* line 9, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .cp { + color: #507090; +} + +/* Comment.Preproc */ +/* line 10, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .c1 { + color: #808080; +} + +/* Comment.Single */ +/* line 11, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .cs { + color: #cc0000; + font-weight: bold; +} + +/* Comment.Special */ +/* line 12, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gd { + color: #A00000; +} + +/* Generic.Deleted */ +/* line 13, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ge { + font-style: italic; +} + +/* Generic.Emph */ +/* line 14, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gr { + color: #FF0000; +} + +/* Generic.Error */ +/* line 15, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gh { + color: #000080; + font-weight: bold; +} + +/* Generic.Heading */ +/* line 16, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gi { + color: #00A000; +} + +/* Generic.Inserted */ +/* line 17, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .go { + color: #808080; +} + +/* Generic.Output */ +/* line 18, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gp { + color: #c65d09; + font-weight: bold; +} + +/* Generic.Prompt */ +/* line 19, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gs { + font-weight: bold; +} + +/* Generic.Strong */ +/* line 20, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gu { + color: #800080; + font-weight: bold; +} + +/* Generic.Subheading */ +/* line 21, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gt { + color: #0040D0; +} + +/* Generic.Traceback */ +/* line 22, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kc { + color: #008000; + font-weight: bold; +} + +/* Keyword.Constant */ +/* line 23, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kd { + color: #008000; + font-weight: bold; +} + +/* Keyword.Declaration */ +/* line 24, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kn { + color: #008000; + font-weight: bold; +} + +/* Keyword.Namespace */ +/* line 25, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kp { + color: #003080; + font-weight: bold; +} + +/* Keyword.Pseudo */ +/* line 26, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kr { + color: #008000; + font-weight: bold; +} + +/* Keyword.Reserved */ +/* line 27, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kt { + color: #303090; + font-weight: bold; +} + +/* Keyword.Type */ +/* line 28, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .m { + color: #6000E0; + font-weight: bold; +} + +/* Literal.Number */ +/* line 29, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .s { + background-color: #fff0f0; +} + +/* Literal.String */ +/* line 30, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .na { + color: #0000C0; +} + +/* Name.Attribute */ +/* line 31, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nb { + color: #007020; +} + +/* Name.Builtin */ +/* line 32, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nc { + color: #B00060; + font-weight: bold; +} + +/* Name.Class */ +/* line 33, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .no { + color: #003060; + font-weight: bold; +} + +/* Name.Constant */ +/* line 34, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nd { + color: #505050; + font-weight: bold; +} + +/* Name.Decorator */ +/* line 35, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ni { + color: #800000; + font-weight: bold; +} + +/* Name.Entity */ +/* line 36, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ne { + color: #F00000; + font-weight: bold; +} + +/* Name.Exception */ +/* line 37, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nf { + color: #0060B0; + font-weight: bold; +} + +/* Name.Function */ +/* line 38, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nl { + color: #907000; + font-weight: bold; +} + +/* Name.Label */ +/* line 39, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nn { + color: #0e84b5; + font-weight: bold; +} + +/* Name.Namespace */ +/* line 40, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nt { + color: #007000; +} + +/* Name.Tag */ +/* line 41, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nv { + color: #906030; +} + +/* Name.Variable */ +/* line 42, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ow { + color: #000000; + font-weight: bold; +} + +/* Operator.Word */ +/* line 43, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .w { + color: #bbbbbb; +} + +/* Text.Whitespace */ +/* line 44, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mf { + color: #6000E0; + font-weight: bold; +} + +/* Literal.Number.Float */ +/* line 45, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mh { + color: #005080; + font-weight: bold; +} + +/* Literal.Number.Hex */ +/* line 46, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mi { + color: #0000D0; + font-weight: bold; +} + +/* Literal.Number.Integer */ +/* line 47, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mo { + color: #4000E0; + font-weight: bold; +} + +/* Literal.Number.Oct */ +/* line 48, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sb { + background-color: #fff0f0; +} + +/* Literal.String.Backtick */ +/* line 49, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sc { + color: #0040D0; +} + +/* Literal.String.Char */ +/* line 50, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sd { + color: #D04020; +} + +/* Literal.String.Doc */ +/* line 51, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .s2 { + background-color: #fff0f0; +} + +/* Literal.String.Double */ +/* line 52, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .se { + color: #606060; + font-weight: bold; + background-color: #fff0f0; +} + +/* Literal.String.Escape */ +/* line 53, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sh { + background-color: #fff0f0; +} + +/* Literal.String.Heredoc */ +/* line 54, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .si { + background-color: #e0e0e0; +} + +/* Literal.String.Interpol */ +/* line 55, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sx { + color: #D02000; + background-color: #fff0f0; +} + +/* Literal.String.Other */ +/* line 56, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sr { + color: #000000; + background-color: #fff0ff; +} + +/* Literal.String.Regex */ +/* line 57, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .s1 { + background-color: #fff0f0; +} + +/* Literal.String.Single */ +/* line 58, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ss { + color: #A06000; +} + +/* Literal.String.Symbol */ +/* line 59, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .bp { + color: #007020; +} + +/* Name.Builtin.Pseudo */ +/* line 60, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .vc { + color: #306090; +} + +/* Name.Variable.Class */ +/* line 61, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .vg { + color: #d07000; + font-weight: bold; +} + +/* Name.Variable.Global */ +/* line 62, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .vi { + color: #3030B0; +} + +/* Name.Variable.Instance */ +/* line 63, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .il { + color: #0000D0; + font-weight: bold; +} + +/* Literal.Number.Integer.Long */ diff --git a/dist/css/app/team-issues.css b/dist/css/app/team-issues.css new file mode 100644 index 0000000..39a03f3 --- /dev/null +++ b/dist/css/app/team-issues.css @@ -0,0 +1,5761 @@ +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* line 2, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-left { + margin: 0; + font-size: 30px; + line-height: 36px; + float: left; +} +/* line 8, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-desc { + margin-top: 12px; + margin-left: 5px; + margin-bottom: 0; + width: 60%; + float: left; +} +/* line 9, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-desc p { + margin: 0; +} +/* line 10, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-desc p small { + padding: 0 6px; + background: rgba(99, 182, 174, 0.2); + color: #63b6ae; +} +/* line 23, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-right { + float: right; +} + +/* line 2, ../../../hub/static/css/mod/navbar-search.scss */ +.navbar-search i { + color: #63b6ae; + padding-right: 4px; +} + +/* line 4, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar { + background: #fff; + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); + margin-bottom: 20px; +} +/* line 9, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar .nav { + margin: 0px; + -moz-border-radius: 0px; + -webkit-border-radius: 0px; + border-radius: 0px; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} +/* line 15, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar .issue-tags { + -moz-border-radius: 0px; + -webkit-border-radius: 0px; + border-radius: 0px; +} +/* line 19, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar > *:first-child { + -moz-border-radius-topleft: 3px; + -webkit-border-top-left-radius: 3px; + border-top-left-radius: 3px; + -moz-border-radius-topright: 3px; + -webkit-border-top-right-radius: 3px; + border-top-right-radius: 3px; +} +/* line 24, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar > *:last-child { + -moz-border-radius-bottomleft: 3px; + -webkit-border-bottom-left-radius: 3px; + border-bottom-left-radius: 3px; + -moz-border-radius-bottomright: 3px; + -webkit-border-bottom-right-radius: 3px; + border-bottom-right-radius: 3px; +} +/* line 29, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar .rule { + clear: both; + height: 0px; + padding: 0; + margin: 0; + overflow: hidden; + border: none; + background: transparent; + border-bottom: 3px solid rgba(99, 182, 174, 0.2); +} +/* line 40, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar .label { + margin: 2px 0px; +} +/* line 42, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar .label a { + color: #63b6ae; + text-decoration: none; +} +/* line 45, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar .label a:hover { + background: #63b6ae; + color: white; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; +} +/* line 54, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar .well { + margin-bottom: 0; + overflow: hidden; +} + +/* line 1, ../../../hub/static/css/mod/issues-topbar.scss */ +.issues-topbar { + padding-bottom: 10px; +} + +/* line 1, ../../../hub/static/css/mod/pagination.scss */ +.pagination { + display: block; + margin: 7px 0; + overflow: hidden; +} +/* line 5, ../../../hub/static/css/mod/pagination.scss */ +.pagination a { + padding: 8px; + width: 100%; + text-align: center; + line-height: 1.4; +} +/* line 11, ../../../hub/static/css/mod/pagination.scss */ +.pagination a, .pagination span { + float: left; + margin: 0; + color: #777; + font-size: 13px; + text-decoration: none; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #DADADA; +} +/* line 23, ../../../hub/static/css/mod/pagination.scss */ +.pagination ul li a { + width: 20px; +} +/* line 29, ../../../hub/static/css/mod/pagination.scss */ +.pagination ul .disabled a { + background-color: #fff; +} + +/* line 3, ../../../hub/static/css/mod/issues-list.scss */ +.new-issue { + float: left; +} + +/* line 7, ../../../hub/static/css/mod/issues-list.scss */ +.sortby-issues { + float: right; +} + +/* line 11, ../../../hub/static/css/mod/issues-list.scss */ +.issues-topbar { + overflow: hidden; + display: block; +} + +/* line 16, ../../../hub/static/css/mod/issues-list.scss */ +.issue-list { + background: white; + margin-bottom: 20px; + border-bottom: 1px solid #eaeaea; +} +/* line 21, ../../../hub/static/css/mod/issues-list.scss */ +.issue-list > :first-child { + margin-top: 0px; +} +/* line 25, ../../../hub/static/css/mod/issues-list.scss */ +.issue-list .issue-item { + padding: 15px; + border-bottom: 1px solid #eaeaea; +} +/* line 29, ../../../hub/static/css/mod/issues-list.scss */ +.issue-list .issue-item h3 { + font-size: 16px; + font-weight: 400; + overflow: hidden; + word-break: break-all; + margin: 0; +} +/* line 36, ../../../hub/static/css/mod/issues-list.scss */ +.issue-list .issue-item h3 a { + color: #273338; +} +/* line 42, ../../../hub/static/css/mod/issues-list.scss */ +.issue-list .issue-item p a { + color: #999; +} +/* line 51, ../../../hub/static/css/mod/issues-list.scss */ +.issue-list .issue-item .meta { + margin-top: 20px; +} +/* line 55, ../../../hub/static/css/mod/issues-list.scss */ +.issue-list a.comment-count, +.issue-list a.comment-count:link, +.issue-list span.issue-info { + color: #bbb; +} +/* line 61, ../../../hub/static/css/mod/issues-list.scss */ +.issue-list .rule { + clear: both; + height: 0px; + padding: 0; + overflow: hidden; + background: transparent; +} + +/* line 1, ../../../hub/static/css/mod/tag-list.scss */ +.issue-tags ul li .tag-filter, .issue-tags ul li .tag-remove, .issue-tags ul li .icon-remove, .issue-tags ul li .icon-white, .issue-tags ul .tag-filter, .issue-tags ul .tag-remove, .issue-tags ul .icon-remove, .issue-tags ul .icon-white { + background: #63b6ae; + background-image: none; + cursor: pointer; +} + +/* line 6, ../../../hub/static/css/mod/tag-list.scss */ +.issue-tags ul li a:hover, .issue-tags ul a:hover { + background: #63b6ae; + color: white; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + border-radius: 4px; +} + +/* line 12, ../../../hub/static/css/mod/tag-list.scss */ +.issue-tags { + padding: 8px 0; +} +/* line 15, ../../../hub/static/css/mod/tag-list.scss */ +.issue-tags ul li { + line-height: 20px; +} +/* line 23, ../../../hub/static/css/mod/tag-list.scss */ +.issue-tags ul li .tag-remove, .issue-tags ul li .icon-remove, .issue-tags ul li .icon-white { + float: right; +} +/* line 31, ../../../hub/static/css/mod/tag-list.scss */ +.issue-tags ul .tag-remove, .issue-tags ul .icon-remove, .issue-tags ul .icon-white { + float: right; +} +/* line 40, ../../../hub/static/css/mod/tag-list.scss */ +.issue-tags ul li.active a { + border-radius: 4px; +} +/* line 44, ../../../hub/static/css/mod/tag-list.scss */ +.issue-tags .nav-header { + margin-bottom: 8px; +} +/* line 47, ../../../hub/static/css/mod/tag-list.scss */ +.issue-tags .tag-admin { + float: right; + cursor: pointer; + font-weight: 400; +} +/* line 52, ../../../hub/static/css/mod/tag-list.scss */ +.issue-tags .tag-admin-unuse { + color: #63b6ae; +} +/* line 55, ../../../hub/static/css/mod/tag-list.scss */ +.issue-tags .tag-admin-using { + color: #999; +} +/* line 58, ../../../hub/static/css/mod/tag-list.scss */ +.issue-tags .nav-list-edit .tag-item { + display: block; + padding: 3px 1px; + color: #08c; +} + +/* edit tag */ +/* line 66, ../../../hub/static/css/mod/tag-list.scss */ +ul.color-chooser .color-cooser-color { + display: block; + text-align: center; + height: 25px; + cursor: pointer; + box-sizing: border-box; + border: solid 2px transparent; +} + +/* line 74, ../../../hub/static/css/mod/tag-list.scss */ +.edit-color-label-form.open .color-chooser, .edit-color-label-form.open .color-editor { + display: block; +} + +/* line 77, ../../../hub/static/css/mod/tag-list.scss */ +ul.color-chooser { + height: 25px; + list-style-type: none; + display: table-row; +} + +/* line 82, ../../../hub/static/css/mod/tag-list.scss */ +ul.color-chooser li { + display: table-cell; + width: 1%; + vertical-align: top; +} + +/* line 87, ../../../hub/static/css/mod/tag-list.scss */ +.fieldWithErrors { + display: inline; +} + +/* line 90, ../../../hub/static/css/mod/tag-list.scss */ +.edit-color-label-form .color-editor-bg { + position: absolute; + left: 0; + height: 25px; + width: 130px; + opacity: 0.12; + border-radius: 3px; +} + +/* line 98, ../../../hub/static/css/mod/tag-list.scss */ +.edit-color-label-form .color-editor .color-editor-input { + position: absolute; + left: 0; + background-color: transparent; + min-height: 25px; + border-left-width: 26px; + padding-top: 3px; + padding-bottom: 3px; + width: 130px; +} + +/* line 108, ../../../hub/static/css/mod/tag-list.scss */ +.edit-color-label-form .color-editor .invalid-color-indicator { + display: none; + position: absolute; + top: 5px; + left: 9px; + color: #c00; + z-index: 10; + font-weight: bold; +} + +/* line 117, ../../../hub/static/css/mod/tag-list.scss */ +.edit-color-label-form .color-editor { + margin-top: 5px; + position: relative; + height: 25px; + margin-bottom: 10px; +} + +/* line 123, ../../../hub/static/css/mod/tag-list.scss */ +.edit-color-label-form .color-editor .invalid-color-indicator { + display: none; + position: absolute; + top: 5px; + left: 9px; + color: #c00; + z-index: 10; + font-weight: bold; +} + +/* line 132, ../../../hub/static/css/mod/tag-list.scss */ +.edit-color-label-form input[type="text"] { + min-height: 34px; + padding: 7px 8px; + outline: none; + color: #333; + background-color: #fff; + background-repeat: no-repeat; + background-position: right center; + border: 1px solid #ccc; + border-radius: 3px; + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075); + -moz-box-sizing: border-box; + box-sizing: border-box; + vertical-align: middle; +} + +/* line 147, ../../../hub/static/css/mod/tag-list.scss */ +.edit-color-label-form.is-not-valid .color-editor .invalid-color-indicator { + display: block; +} diff --git a/dist/css/app/team-new-issue.css b/dist/css/app/team-new-issue.css new file mode 100644 index 0000000..e85c020 --- /dev/null +++ b/dist/css/app/team-new-issue.css @@ -0,0 +1,5762 @@ +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* line 2, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-left { + margin: 0; + font-size: 30px; + line-height: 36px; + float: left; +} +/* line 8, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-desc { + margin-top: 12px; + margin-left: 5px; + margin-bottom: 0; + width: 60%; + float: left; +} +/* line 9, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-desc p { + margin: 0; +} +/* line 10, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-desc p small { + padding: 0 6px; + background: rgba(99, 182, 174, 0.2); + color: #63b6ae; +} +/* line 23, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-right { + float: right; +} + +/* line 2, ../../../hub/static/css/mod/flat-hack.scss */ +a.btn i { + padding-right: 5px; +} + +/* line 1, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body { + padding: 30px; +} + +/* line 4, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body > :first-child { + margin-top: 0 !important; +} + +/* line 7, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body h1, +.markdown-body h2, +.markdown-body h3, +.markdown-body h4, +.markdown-body h5, +.markdown-body h6 { + margin: 20px 0 10px; + padding: 0; + font-weight: bold; + -webkit-font-smoothing: antialiased; + cursor: text; + position: relative; +} + +/* line 20, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body h2 { + font-size: 24px; + border-bottom: 1px solid #CCC; + color: black; +} + +/* line 25, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body, +.markdown-body p { + font-size: 14px; + line-height: 1.6; +} + +/* line 30, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body p, +.markdown-body blockquote, +.markdown-body ul, +.markdown-body ol, +.markdown-body dl, +.markdown-body table, +.markdown-body pre { + margin: 15px 0; +} + +/* line 39, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul, +.markdown-body ol { + padding-left: 30px; +} + +/* line 43, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul li { + line-height: 1.6; +} + +/* line 46, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul { + list-style: disc; +} + +/* line 49, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ol { + list-style: decimal; +} + +/* line 52, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table { + width: 100%; +} + +/* line 55, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table caption + thead tr:first-child th, +.markdown-body table caption + thead tr:first-child td, +.markdown-body table colgroup + thead tr:first-child th, +.markdown-body table colgroup + thead tr:first-child td, +.markdown-body table thead:first-child tr:first-child th, +.markdown-body table thead:first-child tr:first-child td { + border-top: 0; +} + +/* line 63, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table thead th { + vertical-align: bottom; +} + +/* line 66, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th { + font-weight: bold; +} + +/* line 69, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th, +.markdown-body table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #ddd; +} + +/* line 77, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th, +.markdown-body table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #ddd; +} + +/* line 85, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table tbody > tr:nth-child(odd) > td, +.markdown-body table tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} + +/* line 89, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body .progress-percentage { + color: #888; +} + +/* line 93, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page { + padding: 0px; +} + +/* line 96, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page h1, +.markdown-page h2, +.markdown-page h3, +.markdown-page h4, +.markdown-page h5, +.markdown-page h6 { + position: static; +} + +/* line 104, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page pre { + font-family: Consolas, 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 14px; +} + +/* line 108, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page .label { + background-color: transparent; +} + +/* line 111, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page dd { + margin-left: 1.5em; +} + +/* line 114, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body code { + white-space: pre-wrap; +} + +/* line 1, ../../../hub/static/css/mod/upload-widget.scss */ +.upload-widget { + position: relative; + top: -50px; + width: 360px; +} +/* line 7, ../../../hub/static/css/mod/upload-widget.scss */ +.upload-widget input { + position: absolute; + width: 120px; + opacity: 0.0001; + cursor: pointer; + margin: 0; +} +/* line 15, ../../../hub/static/css/mod/upload-widget.scss */ +.upload-widget form { + width: 120px; + float: left; +} + +/* line 1, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit { + overflow: auto; +} + +/* line 4, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit li { + -moz-border-radius: 5px 5px 5px 5px; + display: block; + float: left; + margin: 2px 5px 2px 0; +} + +/* line 10, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit li.tagit-choice { + background-color: #00a89c; + padding: 2px 4px 3px; + color: #fff; + border-radius: 2px; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; +} + +/* line 19, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit li.tagit-choice:hover { + color: rgba(255, 255, 255, 0.8); + cursor: pointer; +} + +/* line 23, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit li.tagit-new { + padding: 2px 4px 3px; + padding: 2px 4px 1px; + padding: 2px 4px 1px 0; +} + +/* line 29, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit li.tagit-choice input { + display: block; + float: left; + margin: 2px 5px 2px 0; +} + +/* line 34, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit li.tagit-choice a.tag-close { + color: #fff; + cursor: pointer; + font-weight: bold; + padding-left: 3px; + text-decoration: none; + text-shadow: none; +} + +/* line 42, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit input[type="text"] { + width: 200px; +} + +/* line 8, ../../../hub/static/css/app/team-new-issue.scss */ +.pull-form input[type="text"] { + font-size: 14px; + padding: 5px 5px; + margin: 0 0 5px 0; + width: 98%; + color: #444; +} + +/* line 15, ../../../hub/static/css/app/team-new-issue.scss */ +.pull-form textarea { + height: 200px; +} + +/* line 18, ../../../hub/static/css/app/team-new-issue.scss */ +.pull-form-main .form-actions { + padding: 0; + margin-top: 10px; + text-align: right; + padding-bottom: 5px; + background-color: inherit; + border-top: none; +} + +/* line 27, ../../../hub/static/css/app/team-new-issue.scss */ +.previewable-comment-form .zen-enabled textarea { + padding: 10px 18px 10px 10px; +} + +/* line 30, ../../../hub/static/css/app/team-new-issue.scss */ +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* Write/Preview Control style for new PR component */ +/* line 44, ../../../hub/static/css/app/team-new-issue.scss */ +ul.edit-preview-tabs { + margin: 0 0 5px 0; + line-height: 13px; +} + +/* line 48, ../../../hub/static/css/app/team-new-issue.scss */ +ul.edit-preview-tabs li { + list-style-type: none; + margin: 0; + display: inline-block; +} + +/* line 53, ../../../hub/static/css/app/team-new-issue.scss */ +ul.edit-preview-tabs a { + display: inline-block; + padding: 2px 8px; + font-size: 11px; + font-weight: bold; + text-decoration: none; + color: #666; + border: 1px solid transparent; + border-radius: 10px; +} + +/* line 64, ../../../hub/static/css/app/team-new-issue.scss */ +.previewable-comment-form li.active .write-tab, +.previewable-comment-form li.active .preview-tab { + color: #333; + background: white; + border-color: #BBB; + border-right-color: #DDD; + border-bottom-color: #DDD; +} + +/* Description Component background & help text, from hub.css*/ +/* line 74, ../../../hub/static/css/app/team-new-issue.scss */ +.comment-form { + position: relative; + margin: -10px 0 10px 0; + padding: 5px; +} + +/* line 80, ../../../hub/static/css/app/team-new-issue.scss */ +.comment-form p.help { + margin: 3px 0 0 0; + float: right; + font-size: 11px; + color: #666; +} + +/* tag */ +/* line 88, ../../../hub/static/css/app/team-new-issue.scss */ +.tag-groups p { + margin: 0; +} + +/* line 91, ../../../hub/static/css/app/team-new-issue.scss */ +.tags input[type="text"] { + font-size: 14px; + padding: 5px 0px; + margin: 0 0 5px 5px; + width: 98%; + color: #444; +} diff --git a/dist/css/app/team-pulls.css b/dist/css/app/team-pulls.css new file mode 100644 index 0000000..1250c51 --- /dev/null +++ b/dist/css/app/team-pulls.css @@ -0,0 +1,5625 @@ +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* line 2, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-left { + margin: 0; + font-size: 30px; + line-height: 36px; + float: left; +} +/* line 8, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-desc { + margin-top: 12px; + margin-left: 5px; + margin-bottom: 0; + width: 60%; + float: left; +} +/* line 9, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-desc p { + margin: 0; +} +/* line 10, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-desc p small { + padding: 0 6px; + background: rgba(99, 182, 174, 0.2); + color: #63b6ae; +} +/* line 23, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-right { + float: right; +} + +/* line 1, ../../../hub/static/css/mod/filter-tabs.scss */ +.list-browser-filter-tabs { + display: block; + float: left; + padding: 5px 5px 0; + overflow: hidden; +} +/* line 6, ../../../hub/static/css/mod/filter-tabs.scss */ +.list-browser-filter-tabs .filter-tab { + display: inline-block; + padding: 0 8px; + height: 24px; + line-height: 24px; + font-size: 12px; + font-weight: bold; + color: #888; + -webkit-font-smoothing: antialiased; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.3); + text-decoration: none; + border: 1px solid #CCC; + border-bottom: 0; + border-radius: 3px 3px 0 0; + background: rgba(255, 255, 255, 0.2); + cursor: pointer; +} +/* line 23, ../../../hub/static/css/mod/filter-tabs.scss */ +.list-browser-filter-tabs .selected { + color: #333; + background: white; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + border-color: #B4B4B4; + border-bottom: 1px solid white; +} + +/* line 1, ../../../hub/static/css/mod/pagination.scss */ +.pagination { + display: block; + margin: 7px 0; + overflow: hidden; +} +/* line 5, ../../../hub/static/css/mod/pagination.scss */ +.pagination a { + padding: 8px; + width: 100%; + text-align: center; + line-height: 1.4; +} +/* line 11, ../../../hub/static/css/mod/pagination.scss */ +.pagination a, .pagination span { + float: left; + margin: 0; + color: #777; + font-size: 13px; + text-decoration: none; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #DADADA; +} +/* line 23, ../../../hub/static/css/mod/pagination.scss */ +.pagination ul li a { + width: 20px; +} +/* line 29, ../../../hub/static/css/mod/pagination.scss */ +.pagination ul .disabled a { + background-color: #fff; +} + +/* line 4, ../../../hub/static/css/mod/pullrequest-list.scss */ +.pulls { + margin: 20px 0; +} +/* line 6, ../../../hub/static/css/mod/pullrequest-list.scss */ +.pulls h2 { + font-size: 16px; + font-weight: bold; + margin: 0; +} + +/* line 13, ../../../hub/static/css/mod/pullrequest-list.scss */ +.row.pulls .mod p { + word-wrap: break-word; +} + +/* line 17, ../../../hub/static/css/mod/pullrequest-list.scss */ +.pulls-list { + word-break: break-all; +} +/* line 19, ../../../hub/static/css/mod/pullrequest-list.scss */ +.pulls-list h3 { + margin: 0; + font-size: 14px; + line-height: 1.3; +} +/* line 23, ../../../hub/static/css/mod/pullrequest-list.scss */ +.pulls-list h3 a { + color: #333; +} +/* line 27, ../../../hub/static/css/mod/pullrequest-list.scss */ +.pulls-list .list-browser-item { + position: relative; + padding: 10px; + border-bottom: 1px solid #EAEAEA; +} +/* line 32, ../../../hub/static/css/mod/pullrequest-list.scss */ +.pulls-list .meta { + float: left; + margin-top: 4px; + margin-bottom: -2px; + height: 16px; + padding: 4px 6px; + font-size: 11px; + color: rgba(0, 0, 0, 0.55); + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.5); + background: rgba(0, 0, 0, 0.07); + border-radius: 3px; +} +/* line 44, ../../../hub/static/css/mod/pullrequest-list.scss */ +.pulls-list p a { + color: #555; + text-decoration: none; +} + +/* line 50, ../../../hub/static/css/mod/pullrequest-list.scss */ +.chromed-list-browser { + border-color: #D5D5D5; + position: relative; + border: 1px solid #DDD; + border-radius: 5px; +} +/* line 55, ../../../hub/static/css/mod/pullrequest-list.scss */ +.chromed-list-browser .pagination { + float: right; + margin: 7px; + font-weight: bold; + height: 26px; +} +/* line 60, ../../../hub/static/css/mod/pullrequest-list.scss */ +.chromed-list-browser .pagination a { + padding: 4px; + font-size: 11px; + color: #4183C4; + width: auto; +} +/* line 66, ../../../hub/static/css/mod/pullrequest-list.scss */ +.chromed-list-browser .pagination span { + padding: 4px; + font-size: 11px; + color: #4183C4; +} +/* line 72, ../../../hub/static/css/mod/pullrequest-list.scss */ +.chromed-list-browser .none, .chromed-list-browser .error { + padding: 10px; + border-bottom: 1px solid #DDD; +} +/* line 75, ../../../hub/static/css/mod/pullrequest-list.scss */ +.chromed-list-browser .none p, .chromed-list-browser .error p { + margin: 0; + padding: 20px; + border-radius: 3px; + text-align: center; + font-weight: bold; + font-size: 14px; + color: #999; + background: #F3F3F3; + -webkit-font-smoothing: antialiased; +} + +/* line 91, ../../../hub/static/css/mod/pullrequest-list.scss */ +.list-browser-item .list-browser-bottom-right-info { + position: absolute; + bottom: 3px; + right: 5px; +} +/* line 96, ../../../hub/static/css/mod/pullrequest-list.scss */ +.list-browser-item .list-browser-bottom-right-item { + padding-left: 18px; + font-size: 11px; + font-weight: bold; + color: #999; +} +/* line 101, ../../../hub/static/css/mod/pullrequest-list.scss */ +.list-browser-item .list-browser-bottom-right-item a { + color: #666; +} + +/* line 107, ../../../hub/static/css/mod/pullrequest-list.scss */ +.list-browser-filterbar { + font-family: "Helvetica Neue", Helvetica, Arial, freesans; + border-radius: 5px 5px 0 0; + height: 31px; + background-color: #CACACA; + background-image: -moz-linear-gradient(#EFEFEF, #CACACA); + background-image: -webkit-linear-gradient(#EFEFEF, #CACACA); + background-image: linear-gradient(#EFEFEF, #CACACA); + background-repeat: repeat-x; + border-bottom: 1px solid #B4B4B4; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +/* line 117, ../../../hub/static/css/mod/pullrequest-list.scss */ +.list-browser-filterbar li { + list-style-type: none; + display: inline; +} + +/* line 123, ../../../hub/static/css/mod/pullrequest-list.scss */ +.list-browser-footer { + font-size: 11px; + font-weight: bold; + color: #777; + overflow: hidden; + min-height: 15px; + background: #F6F6F6; + border-radius: 0 0 5px 5px; +} +/* line 131, ../../../hub/static/css/mod/pullrequest-list.scss */ +.list-browser-footer .pagination { + margin: 5px; +} diff --git a/dist/css/app/team-settings.css b/dist/css/app/team-settings.css new file mode 100644 index 0000000..ccb8cde --- /dev/null +++ b/dist/css/app/team-settings.css @@ -0,0 +1,5674 @@ +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* line 2, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-left { + margin: 0; + font-size: 30px; + line-height: 36px; + float: left; +} +/* line 8, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-desc { + margin-top: 12px; + margin-left: 5px; + margin-bottom: 0; + width: 60%; + float: left; +} +/* line 9, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-desc p { + margin: 0; +} +/* line 10, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-desc p small { + padding: 0 6px; + background: rgba(99, 182, 174, 0.2); + color: #63b6ae; +} +/* line 23, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-right { + float: right; +} + +/* line 1, ../../../hub/static/css/mod/drop-down-list.scss */ +.add-item-menu { + display: none; + position: absolute; + top: 35px; + width: 218px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 10, ../../../hub/static/css/mod/drop-down-list.scss */ +.add-item-menu ul li.intro { + padding: 7px; + color: #666666; +} + +/* line 14, ../../../hub/static/css/mod/drop-down-list.scss */ +.add-item-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666666; +} + +/* line 19, ../../../hub/static/css/mod/drop-down-list.scss */ +.add-item-menu ul li.active { + background: #4183C4; + color: white; +} + +/* line 23, ../../../hub/static/css/mod/drop-down-list.scss */ +.add-item-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 30, ../../../hub/static/css/mod/drop-down-list.scss */ +.add-item-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; + border-radius: 3px; +} + +/* line 5, ../../../hub/static/css/app/team-settings.scss */ +.columns { + display: block; +} +/* line 7, ../../../hub/static/css/app/team-settings.scss */ +.columns:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} +/* line 14, ../../../hub/static/css/app/team-settings.scss */ +.columns.equacols .column { + width: 520px; + float: left; +} + +/* line 21, ../../../hub/static/css/app/team-settings.scss */ +.equacols .column > .fieldgroup:first-child { + margin-top: 0; +} +/* line 24, ../../../hub/static/css/app/team-settings.scss */ +.equacols .fieldgroup .fields { + text-align: center; + background-image: url(""); +} + +/* line 29, ../../../hub/static/css/app/team-settings.scss */ +.fieldgroup { + position: relative; + margin-top: 10px; + width: 440px; +} +/* line 33, ../../../hub/static/css/app/team-settings.scss */ +.fieldgroup .fields { + margin: 10px 0 0 0; + padding: 10px; + background: url("") 0 0 no-repeat; +} +/* line 38, ../../../hub/static/css/app/team-settings.scss */ +.fieldgroup h2 { + margin: 15px 0 0 0; + font-size: 18px; + font-weight: normal; + color: #666; +} + +/* line 45, ../../../hub/static/css/app/team-settings.scss */ +ul.fieldpills { + position: relative; + margin: 0; +} +/* line 48, ../../../hub/static/css/app/team-settings.scss */ +ul.fieldpills li { + position: relative; + list-style-type: none; + margin: 3px 0; + min-height: 24px; + line-height: 24px; + padding: 4px 5px; + background: #eee; + font-size: 12px; + font-weight: bold; + color: #333; + border: 1px solid #ddd; + border-radius: 3px; +} +/* line 62, ../../../hub/static/css/app/team-settings.scss */ +ul.fieldpills.usernames li img { + margin-right: 2px; + padding: 1px; + background: #fff; + border: 1px solid #ddd; + vertical-align: middle; +} + +/* line 70, ../../../hub/static/css/app/team-settings.scss */ +a { + text-decoration: none; +} +/* line 72, ../../../hub/static/css/app/team-settings.scss */ +a.action { + color: #d00; + text-decoration: underline; +} + +/* line 78, ../../../hub/static/css/app/team-settings.scss */ +.team-setting input[type="text"] { + min-height: 34px; + padding: 7px 8px; + outline: none; + color: #333; + background-color: #fff; + background-repeat: no-repeat; + background-position: right center; + border: 1px solid #ccc; + border-radius: 3px; + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075); + -moz-box-sizing: border-box; + box-sizing: border-box; + transition: all 0.15s ease-in; + -webkit-transition: all 0.15s ease-in 0; + vertical-align: middle; +} + +/* line 96, ../../../hub/static/css/app/team-settings.scss */ +.add-pill-form { + margin-top: 15px; + padding: 4px 5px; + background: #f5f5f5; + font-size: 12px; + color: #333; + border: 1px solid #ddd; + border-radius: 5px; + position: relative; + height: 40px; +} +/* line 106, ../../../hub/static/css/app/team-settings.scss */ +.add-pill-form input[type=text] { + font-size: 14px; + width: 350px; + padding: 2px 5px; + color: #666; + width: 332px; + margin-bottom: 1px; +} + +/* line 115, ../../../hub/static/css/app/team-settings.scss */ +.autocomplete-results { + display: none; + position: absolute; + max-height: 20em; + list-style: none; + background: #fff; + border: 1px solid #c1c1c1; + border-radius: 3px; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.3); + overflow-y: auto; + font-size: 13px; + z-index: 99; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +/* line 130, ../../../hub/static/css/app/team-settings.scss */ +.autocomplete-group { + width: 100%; + overflow: hidden; + border-radius: 0 0 3px 3px; +} +/* line 134, ../../../hub/static/css/app/team-settings.scss */ +.autocomplete-group:first-child { + border-radius: 3px; +} + +/* line 138, ../../../hub/static/css/app/team-settings.scss */ +.button, .minibutton { + position: relative; + display: inline-block; + padding: 7px 15px; + font-size: 13px; + font-weight: bold; + color: #333; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.9); + white-space: nowrap; + background-color: #eaeaea; + background-image: -moz-linear-gradient(#fafafa, #eaeaea); + background-image: -webkit-linear-gradient(#fafafa, #eaeaea); + background-image: linear-gradient(#fafafa, #eaeaea); + background-repeat: repeat-x; + border-radius: 3px; + border: 1px solid #ddd; + border-bottom-color: #c5c5c5; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.075); + vertical-align: middle; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-appearance: none; +} + +/* line 166, ../../../hub/static/css/app/team-settings.scss */ +.minibutton { + padding: 0 10px; + line-height: 24px; + box-shadow: none; +} + +/* line 171, ../../../hub/static/css/app/team-settings.scss */ +.button:hover, .button:active, .minibutton:hover, .minibutton:active { + color: #fff; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #3072b3; + background-image: -moz-linear-gradient(#599bcd, #3072b3); + background-image: -webkit-linear-gradient(#599bcd, #3072b3); + background-image: linear-gradient(#599bcd, #3072b3); + background-repeat: repeat-x; + border-color: #2a65a0; +} + +/* line 182, ../../../hub/static/css/app/team-settings.scss */ +.team-setting-item { + margin-top: 15px; + border-radius: 5px; +} +/* line 185, ../../../hub/static/css/app/team-settings.scss */ +.team-setting-item h2 { + margin: 15px 0 15px 0; + font-size: 18px; + font-weight: normal; + color: #666; +} diff --git a/dist/css/app/team.css b/dist/css/app/team.css new file mode 100644 index 0000000..896e558 --- /dev/null +++ b/dist/css/app/team.css @@ -0,0 +1,5747 @@ +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* line 2, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-left { + margin: 0; + font-size: 30px; + line-height: 36px; + float: left; +} +/* line 8, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-desc { + margin-top: 12px; + margin-left: 5px; + margin-bottom: 0; + width: 60%; + float: left; +} +/* line 9, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-desc p { + margin: 0; +} +/* line 10, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-desc p small { + padding: 0 6px; + background: rgba(99, 182, 174, 0.2); + color: #63b6ae; +} +/* line 23, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-right { + float: right; +} + +/* line 1, ../../../hub/static/css/mod/user-card.scss */ +.user-card { + position: absolute; + padding: 3px 5px 5px; + min-height: 68px; + width: 210px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +/* line 2, ../../../hub/static/css/mod/user-card.scss */ +.user-card .desc { + margin-left: 3px; +} + +/* line 3, ../../../hub/static/css/mod/user-card.scss */ +.user-card .avatar-wrap { + width: 46px; + height: 36px; + float: left; + margin-right: 6px; + border-right: 1px solid #BEBEBE; +} + +/* line 4, ../../../hub/static/css/mod/user-card.scss */ +.user-card .badge-item { + float: left; + width: 30px; + height: 30px; + border: none; + padding: 2px; + background-color: white; + line-height: 0; + margin-right: 0.7em; +} + +/* line 5, ../../../hub/static/css/mod/user-card.scss */ +.user-card .title { + padding: 0 0 0.25em 0; +} + +/* line 6, ../../../hub/static/css/mod/user-card.scss */ +.user-card .desc .avatar { + float: left; + width: 30px; + height: 30px; + padding: 2px; + background-color: white; + line-height: 0; + margin-right: 0.7em; +} + +/* line 1, ../../../hub/static/css/mod/team-card.scss */ +.team-card { + position: absolute; + padding: 6px 10px; + min-height: 68px; + width: 236px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + overflow: hidden; +} +/* line 10, ../../../hub/static/css/mod/team-card.scss */ +.team-card .pic { + float: right; + max-height: 50px; + margin: 6px 0 0 10px; +} +/* line 15, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content { + word-wrap: break-word; +} +/* line 17, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .title { + margin: 6px 0; + font-size: 15px; + overflow: hidden; + white-space: nowrap; +} +/* line 23, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .info { + position: relative; + margin-top: 10px; + font-size: 13px; +} +/* line 27, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .info .desc { + white-space: nowrap; + overflow: hidden; +} + +/* line 35, ../../../hub/static/css/mod/team-card.scss */ +.member { + border-top: solid 1px #eaeaea; + padding-top: 8px; + height: 26px; +} +/* line 39, ../../../hub/static/css/mod/team-card.scss */ +.member .more-members { + float: right; + width: 24px; + height: 24px; + line-height: 26px; + text-align: center; + border: 1px solid #eaeaea; + background: #eaeaea; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 53, ../../../hub/static/css/mod/team-card.scss */ +.member .members li { + float: left; +} +/* line 55, ../../../hub/static/css/mod/team-card.scss */ +.member .members li a { + display: block; + width: 26px; + height: 26px; + overflow: hidden; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 65, ../../../hub/static/css/mod/team-card.scss */ +.member .members li a img { + width: 26px; + height: 26px; +} + +/* line 73, ../../../hub/static/css/mod/team-card.scss */ +.cf { + zoom: 1; +} +/* line 75, ../../../hub/static/css/mod/team-card.scss */ +.cf:before { + content: ""; + display: table; +} +/* line 79, ../../../hub/static/css/mod/team-card.scss */ +.cf .cf:after { + clear: both; + content: ""; + display: table; +} + +/* Timeline */ +@media (max-width: 767px) { + /* line 6, ../../../hub/static/css/mod/timeline.scss */ + .timeline { + padding: 10px; + } +} +/* line 9, ../../../hub/static/css/mod/timeline.scss */ +.timeline { + margin-top: 0px; + word-wrap: break-word; + word-break: normal; +} +/* line 14, ../../../hub/static/css/mod/timeline.scss */ +.timeline li { + position: relative; + list-style: none; + clear: both; + background: white; + padding: 10px 20px 10px 32px; + margin: 0 0 0px; + border-bottom: 1px solid #eaeaea; +} +/* line 23, ../../../hub/static/css/mod/timeline.scss */ +.timeline li .title { + margin-bottom: 0.5em; +} +/* line 25, ../../../hub/static/css/mod/timeline.scss */ +.timeline li .title i { + position: absolute; + left: 5px; + padding: 2px 5px 0; + color: #999; + font-size: 10px; +} +/* line 35, ../../../hub/static/css/mod/timeline.scss */ +.timeline .time { + float: right; + color: #ccc; + font-size: 12px; +} +/* line 41, ../../../hub/static/css/mod/timeline.scss */ +.timeline code { + white-space: normal; +} + +/* line 46, ../../../hub/static/css/mod/timeline.scss */ +.timeline .padding { + height: 2em; + font-weight: bold; +} + +/* line 50, ../../../hub/static/css/mod/timeline.scss */ +.timeline .more_items { + margin-left: 10px; + font-weight: bold; +} + +/* line 54, ../../../hub/static/css/mod/timeline.scss */ +.timeline .time { + color: #bbb; +} + +/* line 57, ../../../hub/static/css/mod/timeline.scss */ +.timeline .desc { + padding: 0 0 1em 0; + color: #666; + word-wrap: break-word; +} + +/* line 62, ../../../hub/static/css/mod/timeline.scss */ +.timeline .desc .right_side { + float: right; + margin-right: 30px; +} + +/* line 67, ../../../hub/static/css/mod/timeline.scss */ +.timeline .pagination { + display: none; + background: #63b6ae; +} + +/* line 71, ../../../hub/static/css/mod/timeline.scss */ +.pagination { + display: block; + margin: 7px 0; + overflow: hidden; + border: 1px solid #EAEAEA; + border-bottom-color: #CACACA; + border-top: none; + border-bottom: none; + border-radius: 3px; + background-image: -webkit-linear-gradient(top, white, #EFEFEF); +} + +/* line 82, ../../../hub/static/css/mod/timeline.scss */ +.timeline .pagination a { + color: white; +} + +/* line 85, ../../../hub/static/css/mod/timeline.scss */ +.pagination a { + padding: 8px; + width: 100%; + text-align: center; + line-height: 1.4; +} + +/* line 91, ../../../hub/static/css/mod/timeline.scss */ +.pagination a:last-child, .pagination span:last-child { + border-right: none; + border-bottom-right-radius: 3px; +} + +/* line 95, ../../../hub/static/css/mod/timeline.scss */ +.pagination a:first-child, .pagination span:first-child { + border-left: none; + border-bottom-left-radius: 3px; +} + +/* line 99, ../../../hub/static/css/mod/timeline.scss */ +.pagination a, .pagination span { + float: left; + margin: 0; + color: #777; + font-size: 13px; + text-decoration: none; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #DADADA; +} + +/* line 108, ../../../hub/static/css/mod/timeline.scss */ +.timeline .loader img { + display: block; + width: 16px; + height: 16px; + margin: 0 auto; + position: relative; +} + +/* line 8, ../../../hub/static/css/mod/text-truncate.scss */ +.css-truncate.css-truncate-target, .css-truncate .css-truncate-target { + max-width: 125px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + vertical-align: top; + display: inline-block; +} + +/* line 14, ../../../hub/static/css/mod/text-truncate.scss */ +.css-truncate.expandable:hover .css-truncate-target { + max-width: 10000px !important; +} + +/* line 3, ../../../hub/static/css/mod/my-projects.scss */ +.my_projects { + margin-top: 5px; +} +/* line 4, ../../../hub/static/css/mod/my-projects.scss */ +.my_projects a.right { + float: right; +} +/* line 8, ../../../hub/static/css/mod/my-projects.scss */ +.my_projects li { + max-width: 300px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +/* line 12, ../../../hub/static/css/mod/my-projects.scss */ +.my_projects li .delete-btn { + display: none; +} +/* line 16, ../../../hub/static/css/mod/my-projects.scss */ +.my_projects li.hover .delete-btn { + display: block; +} + +/* line 23, ../../../hub/static/css/mod/my-projects.scss */ +.my_projects .delete-btn { + padding: 0 6px 0 6px; +} + +/* line 6, ../../../hub/static/css/app/team.scss */ +.text-center .add_team_btn { + margin-left: 150px; +} diff --git a/dist/css/app/teams.css b/dist/css/app/teams.css new file mode 100644 index 0000000..1ee9964 --- /dev/null +++ b/dist/css/app/teams.css @@ -0,0 +1,5637 @@ +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* line 2, ../../../hub/static/css/app/teams.scss */ +img { + border: 0; + -ms-interpolation-mode: bicubic; +} + +/* line 6, ../../../hub/static/css/app/teams.scss */ +.cf { + zoom: 1; +} +/* line 8, ../../../hub/static/css/app/teams.scss */ +.cf:before { + content: ""; + display: table; +} +/* line 12, ../../../hub/static/css/app/teams.scss */ +.cf .cf:after { + clear: both; + content: ""; + display: table; +} + +/* line 18, ../../../hub/static/css/app/teams.scss */ +ul { + list-style: none; + display: block; + -webkit-margin-before: 1em; + -webkit-margin-after: 1em; + -webkit-margin-start: 0px; + -webkit-margin-end: 0px; +} + +/* line 26, ../../../hub/static/css/app/teams.scss */ +h3 { + font-family: "MuseoSans-500", arial, sans-serif; +} + +/* line 29, ../../../hub/static/css/app/teams.scss */ +h2 { + display: block; + font-size: 1.5em; + -webkit-margin-before: 0.83em; + -webkit-margin-after: 0.83em; + -webkit-margin-start: 0px; + -webkit-margin-end: 0px; + font-weight: bold; +} + +/* line 38, ../../../hub/static/css/app/teams.scss */ +.featured-team-list { + width: 940px; +} +/* line 40, ../../../hub/static/css/app/teams.scss */ +.featured-team-list a { + text-decoration: none; +} +/* line 43, ../../../hub/static/css/app/teams.scss */ +.featured-team-list > li { + text-align: -webkit-match-parent; + display: inline-block; + vertical-align: top; + width: 450px; + margin-left: 32px; + margin-bottom: 30px; + background: #fff; + border: 1px solid #c1ccd4; + position: relative; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 58, ../../../hub/static/css/app/teams.scss */ +.featured-team-list > li .image { + height: 150px; + line-height: 150px; + text-align: center; +} +/* line 62, ../../../hub/static/css/app/teams.scss */ +.featured-team-list > li .image img { + max-width: 100%; + max-height: 100%; + vertical-align: middle; +} +/* line 68, ../../../hub/static/css/app/teams.scss */ +.featured-team-list > li header { + border-bottom: solid 1px #eaeaea; + display: block; +} +/* line 71, ../../../hub/static/css/app/teams.scss */ +.featured-team-list > li header h2 { + font-size: 1.5em; + margin-bottom: 3px; + color: #343131; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + -o-text-overflow: ellipsis; + -ms-text-overflow: ellipsis; + height: 22px; + margin-top: 1px; + line-height: 20px; +} +/* line 84, ../../../hub/static/css/app/teams.scss */ +.featured-team-list > li header h3 { + font-size: 1.0em; + color: #5d5d5d; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + -o-text-overflow: ellipsis; + -ms-text-overflow: ellipsis; + height: 16px; + margin-top: 1px; + margin-bottom: 1px; + line-height: 20px; +} +/* line 97, ../../../hub/static/css/app/teams.scss */ +.featured-team-list > li header .avatar { + float: left; + margin-right: 15px; +} +/* line 100, ../../../hub/static/css/app/teams.scss */ +.featured-team-list > li header .avatar img { + display: block; + width: 39px; + height: 39px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 112, ../../../hub/static/css/app/teams.scss */ +.featured-team-list > li .team-link { + display: block; + padding: 20px; + height: 40px; + -webkit-transform: translate3d(0, 0, 0); + text-rendering: optimizeLegibility; + -webkit-font-smoothing: subpixel-antialiased; + -moz-font-smoothing: subpixel-antialiased; + font-smoothing: subpixel-antialiased; + -webkit-transition: all 0.2s ease-out; + -moz-transition: all 0.2s ease-out; + -ms-transition: all 0.2s ease-out; + -o-transition: all 0.2s ease-out; + transition: all 0.2s ease-out; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +/* line 133, ../../../hub/static/css/app/teams.scss */ +.featured-team-list > li .hiring-ribbon { + position: absolute; + z-index: 100; + width: 76px; + height: 77px; + top: -6px; + right: -5px; + background: url("/static/img/join_team.png") no-repeat; +} +/* line 141, ../../../hub/static/css/app/teams.scss */ +.featured-team-list > li .hiring-ribbon span { + display: none; +} +/* line 145, ../../../hub/static/css/app/teams.scss */ +.featured-team-list > li:nth-child(odd) { + margin-left: 0; +} +/* line 148, ../../../hub/static/css/app/teams.scss */ +.featured-team-list > li .content { + padding: 20px; + -webkit-box-shadow: inset 0px 0px 2px 2px #ffffff; + box-shadow: inset 0px 0px 2px 2px #ffffff; + background: url("/static/img/team_paper_texture.jpg") repeat; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; +} +/* line 160, ../../../hub/static/css/app/teams.scss */ +.featured-team-list > li footer { + border-top: solid 1px #eaeaea; + padding-top: 20px; + height: 26px; +} +/* line 164, ../../../hub/static/css/app/teams.scss */ +.featured-team-list > li footer .more-members { + float: right; + width: 24px; + height: 24px; + line-height: 26px; + text-align: center; + border: 1px solid #eaeaea; + background: #eaeaea; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 178, ../../../hub/static/css/app/teams.scss */ +.featured-team-list > li footer .members { + float: right; + margin-right: 10px; + margin-top: 0px; +} +/* line 182, ../../../hub/static/css/app/teams.scss */ +.featured-team-list > li footer .members li { + float: left; + margin-left: 10px; +} +/* line 185, ../../../hub/static/css/app/teams.scss */ +.featured-team-list > li footer .members li a { + display: block; + width: 26px; + height: 26px; + overflow: hidden; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 195, ../../../hub/static/css/app/teams.scss */ +.featured-team-list > li footer .members li a img { + width: 26px; + height: 26px; +} + +/* line 206, ../../../hub/static/css/app/teams.scss */ +.pagehead h2 { + margin: 0; + font-size: 30px; + line-height: 36px; + float: left; +} +/* line 212, ../../../hub/static/css/app/teams.scss */ +.pagehead .teams-right { + float: right; + width: 100px; +} + +/* line 217, ../../../hub/static/css/app/teams.scss */ +.add_team { + float: left; + margin-right: 5px; +} + +/* line 221, ../../../hub/static/css/app/teams.scss */ +.clearfix { + display: block; +} diff --git a/dist/css/app/ticket.css b/dist/css/app/ticket.css new file mode 100644 index 0000000..98d4f42 --- /dev/null +++ b/dist/css/app/ticket.css @@ -0,0 +1,10946 @@ +@charset "UTF-8"; +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* TODO Refactor the following mods into components */ +/* preview comment form style */ +/* line 2, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav { + margin: 10px 0; + border-bottom: 1px solid #DDD; + height: 35px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs { + display: inline-block; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs > li { + display: inline-block; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab { + display: inline-block; + margin-bottom: -1px; + padding: 8px 12px 9px; + border: 1px solid transparent; + border-bottom: 0; + font-size: 14px; + color: #666; + text-decoration: none; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab.selected { + border-color: #DDD; + border-radius: 3px 3px 0 0; + background-color: white; + color: #333; + font-weight: bold; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab:hover { + text-decoration: none; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav { + position: relative; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav ul.tabnav-tabs { + padding-left: 10px; +} + +/* line 10, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 0 10px 10px; +} + +/* line 11, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form #preview_bucket .content-body { + padding: 10px; + min-height: 132px; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form.tab-content { + overflow: initial; + position: relative; +} + +/* line 2, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 10px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-actions { + padding: 0; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + position: relative; + border: 3px solid #EEE; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + padding: 0; + background: #EEE; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content .write-content { + padding: 0 10px 10px; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; + margin: 0; +} + +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary, button.primary.classy:disabled, button.primary.classy.disabled, button.primary.classy:disabled:hover, button.primary.classy.disabled:disabled:hover, button.classy:disabled:hover.primary, button.classy.disabled:disabled:hover.primary { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4); + border-color: #74BB5A; + border-bottom-color: #509338; + background: #8ADD6D; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#8add6d', endColorstr='#60b044')"; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); + background-image: -webkit-linear-gradient(top, #8ADD6D, #60B044); +} + +/* line 2, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary.disabled { + opacity: 0.5; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy, +button.classy:disabled, +button.classy.disabled, +a.button.classy:disabled, +a.button.classy.disabled, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover:disabled, +a.button.classy.disabled:hover, +a.button.classy, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy:disabled:hover, +a.button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover { + display: inline-block; + padding: 8px 15px; + line-height: normal; + position: relative; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 12px; + font-weight: bold; + color: #666; + text-shadow: 0 1px rgba(255, 255, 255, 0.9); + background: whiteSmoke; + background: -moz-linear-gradient(whiteSmoke, #E5E5E5); + background: -webkit-linear-gradient(whiteSmoke, #E5E5E5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; + border-radius: 3px; + border: 1px solid #DDD; + border-bottom-color: #BBB; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* ================================== *\ + * Zen Form + * ================================== */ +/* line 6, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + position: fixed; + z-index: 99999; + top: 0; + left: 0; + right: 0; + bottom: 0; + padding: 24px 30px 24px 24px; +} + +/* line 16, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-input-wrap { + max-width: 640px; + position: relative; + margin: 0 auto; +} + +/** + * Buttons style + */ +/* line 25, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button, +.zen-forms-theme-switch { + position: absolute; + width: 18px; + height: 18px; + text-align: center; + top: 10px; + right: 10px; + font-size: 24px; + color: #516066; + cursor: pointer; + line-height: 1; +} + +/* line 39, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-theme-switch { + top: 28px; + font-size: 34px; +} + +/* line 44, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button:hover, +.zen-forms-theme-switch:hover { + color: #667981; +} + +/** + * Inputs basic style + */ +/* line 52, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + padding: 8px 0; + width: 100%; + background: none; + border: none; + margin-bottom: 24px; + cursor: pointer; +} + +/* line 62, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus, +.zen-forms textarea:focus { + cursor: text; +} + +/* line 67, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms textarea { + resize: none; +} + +/* line 71, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + cursor: pointer; + display: none; + padding: 8px 3; + position: absolute; + top: 0; + width: 100%; +} + +/* line 80, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms .empty + label { + display: block; +} + +/* line 84, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus + label, +.zen-forms textarea:focus + label { + display: none; +} + +/* line 89, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms :focus { + outline-color: transparent; + outline-style: none; +} + +/** + * Dark theme + */ +/* line 97, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + background: #151a1c; +} + +/* line 101, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + color: #516066; +} + +/* line 105, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + color: #667981; +} + +/** + * Light theme + */ +/* line 113, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme { + background: #fefefe; +} + +/* line 117, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme label { + color: #959697; +} + +/* line 121, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme input, +.zen-forms.light-theme textarea { + color: #707071; +} + +/* line 4, ../../../hub/static/css/mod/zen-forms.scss */ +.write-content .enable-fullscreen { + position: absolute; + top: 5px; + right: 16px; + color: #333333; + opacity: .5; + line-height: 1em; +} + +/* line 5, ../../../hub/static/css/mod/zen-forms.scss */ +.mini-icon-fullscreen::before { + content: ""; +} + +/* line 6, ../../../hub/static/css/mod/zen-forms.scss */ +.fullscreen-overlay textarea, .zen-forms textarea { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + height: 100%; + padding: 20px; + border: 0; + font-size: 21px; + line-height: 1.6em; + resize: none; + -moz-transition: color 0.15s ease-in 0; + -webkit-transition: color 0.15s ease-in 0; + transition: color 0.15s ease-in 0; + box-shadow: none; +} + +/* line 7, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms.light-theme textarea { + background: #fff; + color: #999999; +} + +/* line 8, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms .zen-forms-input-wrap { + width: 100%; + height: 100%; +} + +/* line 9, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms label[for^=zen-forms-input] { + display: none; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-zen.scss */ +.previewable-comment-form .zen-enabled textarea { + padding: 10px 18px 10px 10px; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled { + position: relative; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled .go-zen { + position: absolute; + right: 15px; + top: 5px; +} + +/* line 1, ../../../hub/static/css/mod/loader.scss */ +.loader { + display: none; + position: absolute; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + background-color: #eee; +} + +/* line 2, ../../../hub/static/css/mod/loader.scss */ +.loader .spinner { + display: block; + width: 32px; + height: 32px; + margin: 0 auto; + top: 121px; + position: relative; + background: url(/static/img/spinner.gif) no-repeat; +} + +/* line 1, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view { + position: absolute; + top: 0; + left: 0; + display: none; + margin-top: 18px; + background: white; + border: 1px solid #DDD; + border-radius: 3px; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + min-width: 120px; + z-index: 10; +} + +/* line 15, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur { + background: #3366FF; + color: white; +} + +/* line 19, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur small { + color: white; +} + +/* line 22, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view strong { + color: #3366FF; +} + +/* line 25, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur strong { + color: white; + font: bold; +} + +/* line 29, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul { + /* width: 100px; */ + list-style: none; + padding: 0; + margin: auto; +} + +/* line 35, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul li { + display: block; + padding: 5px 10px; + border-bottom: 1px solid #DDD; + cursor: pointer; + /* border-top: 1px solid #C8C8C8; */ +} + +/* line 42, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view small { + font-size: smaller; + color: #777; + font-weight: normal; +} + +/* line 9, ../../../hub/static/css/mod/comment-form.scss */ +.side-avatar { + margin-left: 0; +} + +/* fix li header for newer version of bootstrap */ +/* line 12, ../../../hub/static/css/mod/comment-form.scss */ +.comment-form-head li { + line-height: 18px; +} + +/* line 16, ../../../hub/static/css/mod/comment-form.scss */ +#new_comment .form-content { + width: 880px; + margin-left: 60px; +} + +/* line 18, ../../../hub/static/css/mod/comment-form.scss */ +.discussion-bubble-avatar { + position: relative; + float: left; + border-radius: 3px; +} + +/* line 19, ../../../hub/static/css/mod/comment-form.scss */ +.discussion-bubble-inner { + min-height: 60px; + border: 1px solid #CACACA; + background-color: white; +} + +/* line 1, ../../../hub/static/css/mod/loader.scss */ +.loader { + display: none; + position: absolute; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + background-color: #eee; +} + +/* line 2, ../../../hub/static/css/mod/loader.scss */ +.loader .spinner { + display: block; + width: 32px; + height: 32px; + margin: 0 auto; + top: 121px; + position: relative; + background: url(/static/img/spinner.gif) no-repeat; +} + +/* line 1, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description .css-truncate-target + .css-truncate-target { + max-width: 125px; +} + +/* line 2, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description p .commit-ref .user { + color: #CCC; +} + +/* line 3, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head { + margin: 20px 0; + background-color: #FAFAFA; + border: 1px solid #EEE; + border-bottom-width: 2px; + border-radius: 3px; +} + +/* line 4, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description .attention-icon { + position: relative; + float: left; + margin: 4px 10px 0 0; +} + +/* line 5, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description p { + padding-left: 10px; + position: relative; + float: left; + margin: 0; + line-height: 36px; + font-size: 13px; + max-width: 690px; + white-space: nowrap; +} + +/* line 6, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description p .user { + font-weight: bold; + color: #333; +} + +/* line 8, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description p { + padding-left: 0; +} + +/* line 12, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description .pull-state { + float: left; + padding: 8px; + margin-right: 8px; + border-right: 1px solid #EEE; + line-height: 20px; +} + +/* line 13, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description .state-indicator { + font-size: 13px; + display: inline-block; + height: 20px; + line-height: 20px; + padding: 0 5px; +} + +/* line 15, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +.commit-ref { + position: relative; + height: 20px; + display: inline-block; + padding: 0 5px; + border: 1px solid black; + border-radius: 3px; + font: 10px/20px Monaco,"Liberation Mono",Courier,monospace; + color: white; + white-space: nowrap; + vertical-align: middle; + background-color: #222; + background-image: -moz-linear-gradient(#444, #222); + background-image: -webkit-linear-gradient(#444, #222); + background-image: linear-gradient(#444, #222); + background-repeat: repeat-x; +} + +/* line 1, ../../../hub/static/css/mod/fav-button.scss */ +a#fav-button { + height: 25px; + width: 25px; + display: block; + float: right; + background: url("/static/img/fav_star.png") 0 0 no-repeat; +} + +/* line 2, ../../../hub/static/css/mod/fav-button.scss */ +a#fav-button.faved { + background: url("/static/img/faved_star.png") 0 0 no-repeat; +} + +/* line 6, ../../../hub/static/css/mod/pull-request.scss */ +#project-info { + margin-bottom: 15px; +} + +/* line 8, ../../../hub/static/css/mod/pull-request.scss */ +.tab-content { + overflow: initial; + position: relative; +} + +/* line 9, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest.tab-content { + min-height: 280px; + overflow: visible; +} + +/* line 11, ../../../hub/static/css/mod/pull-request.scss */ +.commit-preview .date { + color: #5B6375; +} + +/* line 13, ../../../hub/static/css/mod/pull-request.scss */ +.pull-nav.tabnav { + margin: 0 0 10px; + border-bottom: none; + height: 35px; +} + +/* line 14, ../../../hub/static/css/mod/pull-request.scss */ +.pull-nav.tabnav .nav li.active { + font-weight: bold; +} + +/* line 15, ../../../hub/static/css/mod/pull-request.scss */ +.pull-nav.tabnav .nav li a:hover { + background-color: transparent; + border: 1px solid transparent; +} + +/* line 16, ../../../hub/static/css/mod/pull-request.scss */ +.pull-nav.tabnav .nav li.active a { + background-color: #fff; + border-bottom: 1px solid #fff; +} + +/* line 17, ../../../hub/static/css/mod/pull-request.scss */ +.pull-nav.tabnav .nav li.active a:hover { + background-color: #fff; + border: 1px solid #DDD; + border-bottom: 1px solid #fff; +} + +/* line 19, ../../../hub/static/css/mod/pull-request.scss */ +.tabnav .counter { + position: relative; + top: -1px; + margin: 0 0 0 5px; + padding: 1px 5px 2px 5px; + font-size: 10px; + font-weight: bold; + color: #666; + background: #E5E5E5; + border-radius: 10px; +} + +/* line 21, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .explain { + margin: 15px 0; +} + +/* line 23, ../../../hub/static/css/mod/pull-request.scss */ +.discussion-topic-header { + position: relative; + margin: 10px; +} + +/* line 24, ../../../hub/static/css/mod/pull-request.scss */ +.discusion-topic-infobar { + border-bottom: 1px solid #e5e5e5; +} + +/* line 25, ../../../hub/static/css/mod/pull-request.scss */ +.discussion-topic-header .comment-topic-actions { + position: absolute; + top: 10px; + right: 10px; + list-style-type: none; +} + +/* line 26, ../../../hub/static/css/mod/pull-request.scss */ +.discussion-topic-header .comment-topic-actions li { + float: left; + margin-left: 12px; +} + +/* line 28, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest blockquote.citation { + border: none; +} + +/* line 29, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #trac-ticket-title { + display: none; +} + +/* line 30, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket { + margin-top: 23px; +} + +/* line 31, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .trac-topnav { + margin-top: 0; + top: -20px; + position: absolute; + right: 0; +} + +/* line 33, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket, .pullrequest div.change { + margin-bottom: 20px; + background: #fff; + border-radius: 3px; + border: 3px solid #eee; +} + +/* line 34, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket::before, .pullrequest div.change::before, .pullrequest #propertyform fieldset.iefix::before, .pullrequest #add-comment-form .form-content::before { + content: ""; + display: block; + height: 0; + width: 0; + border: 10px solid #EEE; + border-width: 10px 10px 10px 0; + border-color: transparent #EEE transparent transparent; + left: -12px; + top: 15px; + float: left; + position: absolute; +} + +/* line 35, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket::before { + position: absolute; +} + +/* line 36, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest div.change::before, .pullrequest #propertyform fieldset.iefix::before { + position: relative; +} + +/* line 37, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket { + padding: 5px; +} + +/* line 39, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket .date { + float: none; + clear: both; + color: #666; + font-size: 12px; +} + +/* line 40, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket .date::after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* line 41, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket .date p { + float: left; +} + +/* line 42, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket .summary { + font-size: 20px; + font-weight: bold; + margin: 0; +} + +/* line 43, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket .properties { + display: none; + border: none; +} + +/* line 44, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket .description { + margin-top: 10px; +} + +/* line 45, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket .description div { + padding: 0; +} + +/* line 46, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket .description h3 { + display: none; +} + +/* line 47, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket .description #addreply { + float: right; +} + +/* line 51, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .commits-condensed tr td.message { + word-break: break-all; +} +/* line 55, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog { + border: none; + padding: 0; +} +/* line 60, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .change table.commits tr td.author { + width: 80px; +} +/* line 63, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .change table.commits tr td.date { + width: 100px; +} +/* line 66, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .change table.commits tr td.status { + width: 20px; +} +/* line 71, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .change table.commits tr td span.commit-status { + width: 100px; + display: inline-block; + border-radius: 100px; + width: 15px; + height: 15px; + vertical-align: middle; +} +/* line 79, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .change table.commits tr td span.dirty { + background-color: #f6e69f; +} +/* line 82, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .change table.commits tr td span.error { + background-color: #da4f49; +} +/* line 85, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .change table.commits tr td span.success { + background-color: #6eda62; +} + +/* line 93, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog h3 { + border: none; +} + +/* line 94, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .change div.outdated_mark { + background-color: #DDD; + height: 31px; + text-align: center; + color: #777; + line-height: 31px; +} + +/* line 95, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .change div.outdated_commits { + display: none; +} + +/* line 96, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .change div.outdated_codereview { + display: none; +} + +/* line 97, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest div.change { + padding: 0; + background: #FBFBFB; +} + +/* line 98, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .change h3.change { + color: #333; + margin: 0; + font-size: 12px; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.7); + white-space: nowrap; + text-overflow: ellipsis; + padding: 0 10px 0 6px; + border-bottom: 1px solid #CCC; + background: -webkit-linear-gradient(#F8FBFC, #DDE8EB); + background-image: -webkit-linear-gradient(#F8F8F8, #E1E1E1); + background-image: linear-gradient(#F8F8F8, #E1E1E1); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f8fbfc', endColorstr='#dde8eb')"; +} + +/* line 99, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest div.change form[id^=reply-to-comment-] { + right: 7px; +} + +/* line 100, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest div.change table.commits .commit code { + background-color: transparent; +} + +/* line 101, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .comment { + margin: 0; + top: -1px; + position: relative; +} + +/* line 102, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .comment #files { + margin-top: -24px; +} + +/* line 103, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .comment #files .file { + width: 100%; + margin: 0 0 0 -1px; +} + +/* line 104, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .comment p br { + height: 0; +} + +/* line 105, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .comment p { + padding: 5px; + margin: 0; + color: #333; +} + +/* line 107, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest div.change form#trac-comment-editor { + position: relative; + right: 0; + margin: 12px; +} + +/* line 108, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest h2#trac-add-comment, .pullrequest .trac-nav { + display: none; +} + +/* line 109, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest fieldset.iefix { + padding: 6px; + background: #EEE; + border-radius: 3px; +} + +/* line 110, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest fieldset.iefix h3 { + font-size: 13px; + line-height: 1.4; + color: #333; + margin: 0 5px; +} + +/* line 112, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #propertyform .btn[type=submit] { + padding: 8px 15px; +} + +/* line 113, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #modify { + background-color: #EEE; + padding: 12px; +} + +/* line 114, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #ticketchange.ticketdraft { + padding: 1em; + background: none; + background-color: #FBFBFB; +} + +/* line 115, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #ticketchange.ticketdraft .comment { + margin: 1em; +} + +/* line 116, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #ticketchange.ticketdraft .comment blockquote.citation { + margin: 12px 0; +} + +/* line 117, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #ticketchange.ticketdraft .comment blockquote.citation p { + font-size: 13px; +} + +/* line 119, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket .side-avatar { + position: absolute; + float: left; + margin-left: -60px; +} + +/* line 121, ../../../hub/static/css/mod/pull-request.scss */ +table.commits { + margin: 0; + font-size: 12px; +} + +/* line 123, ../../../hub/static/css/mod/pull-request.scss */ +.pull-participation { + margin: -10px 0 15px; + font-size: 13px; + font-weight: 300; + color: #666; +} + +/* line 124, ../../../hub/static/css/mod/pull-request.scss */ +.pull-participation p.quickstat { + display: inline-block; + margin: 0 5px 0 0; +} + +/* line 125, ../../../hub/static/css/mod/pull-request.scss */ +.pull-participation a { + color: #666; +} + +/* line 126, ../../../hub/static/css/mod/pull-request.scss */ +.pull-participation .avatar { + position: relative; + display: inline-block; + height: 24px; + top: -2px; + margin-right: 3px; + margin-bottom: 3px; +} + +/* line 127, ../../../hub/static/css/mod/pull-request.scss */ +.pull-participation .avatar img { + vertical-align: middle; +} + +/* action-bubble part is also used in commits.html */ +/* line 131, ../../../hub/static/css/mod/pull-request.scss */ +.action-bubble { + margin: 20px 0; +} + +/* line 132, ../../../hub/static/css/mod/pull-request.scss */ +.action-bubble .action { + float: left; + line-height: 29px; +} + +/* line 133, ../../../hub/static/css/mod/pull-request.scss */ +.action-bubble .state-indicator { + display: inline-block; + margin-right: 8px; + font-size: 12px; + padding: 0 5px; + line-height: 24px; +} + +/* line 134, ../../../hub/static/css/mod/pull-request.scss */ +.state-indicator.closed { + background: #BD2C00; +} + +/* line 135, ../../../hub/static/css/mod/pull-request.scss */ +.state-indicator { + display: block; + font-size: 14px; + font-weight: bold; + color: white; + text-align: center; + border-radius: 3px; + background: #999; +} + +/* line 136, ../../../hub/static/css/mod/pull-request.scss */ +.action-bubble .bubble { + font-size: 13px; + font-weight: 300; + background-color: transparent; +} + +/* line 137, ../../../hub/static/css/mod/pull-request.scss */ +.bubble { + padding: 3px; + background: #EEE; + border-radius: 3px; +} + +/* line 138, ../../../hub/static/css/mod/pull-request.scss */ +.action-bubble .bubble p { + margin: 0; + line-height: 26px; +} + +/* line 139, ../../../hub/static/css/mod/pull-request.scss */ +.action-bubble .bubble strong { + font-weight: bold; +} + +/* line 140, ../../../hub/static/css/mod/pull-request.scss */ +.action-bubble .avatar { + position: relative; + top: -2px; + display: inline-block; + height: 24px; + margin-right: 3px; + line-height: 1px; +} + +/* line 141, ../../../hub/static/css/mod/pull-request.scss */ +.action-bubble .avatar img { + vertical-align: middle; +} + +/* line 142, ../../../hub/static/css/mod/pull-request.scss */ +.state-indicator.open, .state-indicator.reopened, .state-indicator.merged { + background: #6CC644; +} + +/* the following action-bubble style seems only used in commits.html */ +/* line 146, ../../../hub/static/css/mod/pull-request.scss */ +.action-bubble .state-renamed { + color: black; + background-color: #FFFA5D; + text-shadow: none; +} + +/* line 151, ../../../hub/static/css/mod/pull-request.scss */ +.action-bubble .state { + display: inline-block; + padding: 0 5px; + height: 24px; + line-height: 25px; + text-shadow: 0 -1px -1px rgba(0, 0, 0, 0.25); +} + +/* line 158, ../../../hub/static/css/mod/pull-request.scss */ +.action-bubble .state { + float: none; + padding: 3px 5px; + font-size: 11px; +} + +/* line 165, ../../../hub/static/css/mod/pull-request.scss */ +.closed-banner { + margin: 15px 0; + height: 7px; + overflow: hidden; + background: url("/static/img/closed_pattern.gif"); + border-radius: 5px; +} + +/* line 167, ../../../hub/static/css/mod/pull-request.scss */ +.change-header .change-header-right { + float: right; + height: 15px; +} + +/* line 168, ../../../hub/static/css/mod/pull-request.scss */ +.change-header .change-header-date { + display: inline-block; + margin: 0; + height: 33px; + font-size: 11px; + font-style: normal; + color: #777; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.7); +} + +/* line 170, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket { + padding: 0; +} + +/* line 171, ../../../hub/static/css/mod/pull-request.scss */ +.discussion-bubble-avatar { + position: relative; + float: left; + border-radius: 3px; +} + +/* line 172, ../../../hub/static/css/mod/pull-request.scss */ +.discussion-bubble-inner { + min-height: 60px; + border: 1px solid #CACACA; + background-color: white; +} + +/* line 174, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .change .change-header { + height: 23px; + color: #333; + margin: 0; + font-size: 12px; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.7); + white-space: nowrap; + text-overflow: ellipsis; + padding: 3px 10px 0 6px; + border-bottom: 1px solid #CCC; + background: -webkit-linear-gradient(#F8FBFC, #DDE8EB); + background-image: -webkit-linear-gradient(#F8F8F8, #E1E1E1); + background-image: linear-gradient(#F8F8F8, #E1E1E1); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f8fbfc', endColorstr='#dde8eb')"; +} + +/* line 176, ../../../hub/static/css/mod/pull-request.scss */ +.comment-content .comment-body, .pullrequest .ticket #ticket .comment-content .comment-body { + padding: 10px; + font-size: 13px; + overflow: auto; + width: 100%; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +/* line 177, ../../../hub/static/css/mod/pull-request.scss */ +.comment-content .comment-body, .pullrequest #changelog .comment p { + font-size: 13px; +} + +/* line 179, ../../../hub/static/css/mod/pull-request.scss */ +.user-mention, .team-mention { + font-weight: bold; + color: #333; +} + +/* line 181, ../../../hub/static/css/mod/pull-request.scss */ +.change #files .file { + border: none; +} + +/* line 1, ../../../hub/static/css/mod/pull-comment.scss */ +.comment-content { + padding: 0; + width: 100%; +} + +/* line 2, ../../../hub/static/css/mod/pull-comment.scss */ +.comment-content .form-content { + padding: 10px; + display: none; + opacity: 1.0; +} + +/* line 3, ../../../hub/static/css/mod/pull-comment.scss */ +.comment-content.is-comment-editing .comment-body { + display: none; +} + +/* line 4, ../../../hub/static/css/mod/pull-comment.scss */ +.comment-content.is-comment-editing .form-content { + display: block; + background-color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/pull-comment.scss */ +.comment-content .form-content form { + margin: 0; +} + +/* line 6, ../../../hub/static/css/mod/pull-comment.scss */ +.comment-content .form-content input.title-field { + font-size: 20px; + font-weight: bold; +} + +/* line 7, ../../../hub/static/css/mod/pull-comment.scss */ +.comment-content .form-content input[type="text"] { + margin-bottom: 5px; + width: 99%; +} + +/* line 8, ../../../hub/static/css/mod/pull-comment.scss */ +.comment-content .form-content textarea { + margin: 0; + width: 99%; + max-width: 100%; + height: 100px; + min-height: 100px; +} + +/* line 9, ../../../hub/static/css/mod/pull-comment.scss */ +.comment-content .form-content .form-actions { + padding: 0; + margin: 10px 0 0 0; +} + +/* line 10, ../../../hub/static/css/mod/pull-comment.scss */ +.comment-content .comment-cancel-button { + float: left; +} + +/* line 12, ../../../hub/static/css/mod/pull-comment.scss */ +.pullrequest #attachments, .pullrequest .foldable, .pullrequest .threading { + display: none; +} + +/* preview comment form style */ +/* line 2, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav { + margin: 10px 0; + border-bottom: 1px solid #DDD; + height: 35px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs { + display: inline-block; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs > li { + display: inline-block; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab { + display: inline-block; + margin-bottom: -1px; + padding: 8px 12px 9px; + border: 1px solid transparent; + border-bottom: 0; + font-size: 14px; + color: #666; + text-decoration: none; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab.selected { + border-color: #DDD; + border-radius: 3px 3px 0 0; + background-color: white; + color: #333; + font-weight: bold; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab:hover { + text-decoration: none; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav { + position: relative; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav ul.tabnav-tabs { + padding-left: 10px; +} + +/* line 10, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 0 10px 10px; +} + +/* line 11, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form #preview_bucket .content-body { + padding: 10px; + min-height: 132px; +} + +/* Button style from hub.css */ +/* line 17, ../../../hub/static/css/mod/pull-comment.scss */ +button.classy, +button.classy:disabled, +button.classy.disabled, +a.button.classy:disabled, +a.button.classy.disabled, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover:disabled, +a.button.classy.disabled:hover, +a.button.classy, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy:disabled:hover, +a.button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover { + display: inline-block; + padding: 8px 15px; + line-height: normal; + position: relative; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 12px; + font-weight: bold; + color: #666; + text-shadow: 0 1px rgba(255, 255, 255, 0.9); + background: whiteSmoke; + background: -moz-linear-gradient(whiteSmoke, #E5E5E5); + background: -webkit-linear-gradient(whiteSmoke, #E5E5E5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; + border-radius: 3px; + border: 1px solid #DDD; + border-bottom-color: #BBB; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* codereview style */ +/* comments style is also used in pull-new page's description input box */ +/* line 5, ../../../hub/static/css/mod/pull-codereview.scss */ +.comments-row .comments { + padding: 5px; +} + +/* line 8, ../../../hub/static/css/mod/pull-codereview.scss */ +.comments-row .comment { + margin: 5px 0; + border: 1px solid #CACACA; +} + +/* line 12, ../../../hub/static/css/mod/pull-codereview.scss */ +.comments-row .comment-meta { + padding: 5px 10px; + border-bottom: 1px solid #CCC; + background-image: linear-gradient(top, #F4F8F9, #DCE8EC); + background-image: -o-linear-gradient(top, #F4F8F9, #DCE8EC); + background-image: -moz-linear-gradient(top, #F4F8F9, #DCE8EC); + background-image: -webkit-linear-gradient(top, #F4F8F9, #DCE8EC); + background-image: -ms-linear-gradient(top, #F4F8F9, #DCE8EC); +} + +/* line 22, ../../../hub/static/css/mod/pull-codereview.scss */ +.comments-row .comment .body { + color: #333; + font-size: 13px; + padding: 10px; + background: #FBFBFB; +} + +/* line 29, ../../../hub/static/css/mod/pull-codereview.scss */ +.comments-row .comment-form .help { + margin: 3px 0 0 0; + float: right; + font-size: 11px; + color: #666; +} + +/* line 35, ../../../hub/static/css/mod/pull-codereview.scss */ +.comments-row .comment-form textarea { + width: 100%; + height: 100px; + font-size: 12px; +} + +/*========= Github Style ========*/ +/* line 4, ../../../hub/static/css/mod/pull-github.scss */ +span.diffstat { + white-space: nowrap; + text-align: right; + font-family: Helvetica,arial,freesans,clean,sans-serif; + color: #666; + font-weight: bold; + font-size: 11px; +} + +/* line 12, ../../../hub/static/css/mod/pull-github.scss */ +span.diffstat a { + text-decoration: none; + color: #666; +} + +/* line 16, ../../../hub/static/css/mod/pull-github.scss */ +span.diffstat .diffstat-bar { + position: relative; + left: -3px; + display: inline-block; + height: 12px; + text-decoration: none; + text-align: left; + color: #EEE; + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + line-height: 1; + -webkit-font-smoothing: antialiased; + font-size: 16px; + letter-spacing: -7px; +} + +/* line 34, ../../../hub/static/css/mod/pull-github.scss */ +span.diffstat .diffstat-bar.diff-added, +span.diffstat .diffstat-bar i.plus { + color: #61C423; + font-style: normal; +} + +/* line 39, ../../../hub/static/css/mod/pull-github.scss */ +span.diffstat .diffstat-bar.diff-added, +span.diffstat .diffstat-bar i.minus { + color: #C52323; + font-style: normal; +} + +/* line 45, ../../../hub/static/css/mod/pull-github.scss */ +.mini-icon-added:before { + content: "\f06b"; +} + +/* line 46, ../../../hub/static/css/mod/pull-github.scss */ +.mini-icon-removed:before { + content: "\f06c"; +} + +/* line 47, ../../../hub/static/css/mod/pull-github.scss */ +.mini-icon-modified:before { + content: "\f06d"; +} + +/* line 48, ../../../hub/static/css/mod/pull-github.scss */ +.mini-icon-moved:before, .mini-icon-renamed:before { + content: "\f06e"; +} + +/* TODO remove the following line */ +/* file-blame-blob should only be import at blame page */ +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* line 3, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files { + position: relative; +} + +/* line 6, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file { + margin-top: 0; +} + +/* line 9, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file, .file-box { + border: 1px solid #CCC; + margin-bottom: 13px; + position: relative; + background-color: #DDD; +} + +/* line 15, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta, +.file-box .meta { + overflow: hidden; + padding: 5px 10px; + font-size: 12px; + height: 33px; + text-align: left; + color: #555; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #D8D8D8; + background: #FAFAFA; + background: -moz-linear-gradient(#FAFAFA, #EAEAEA); + background: -webkit-linear-gradient(#FAFAFA, #EAEAEA); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; +} + +/* line 30, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .info, +.file-box .meta .info { + float: left; + height: 33px; + max-width: 555px; + line-height: 33px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +/* line 41, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .info span, +.file-box .meta .info span { + padding-left: 9px; + margin-left: 5px; + border-left: 1px solid #C1C1C1; + box-shadow: inset 1px 0 0 white; +} + +/* line 50, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .info span.icon, +#files .file .meta .info span.diffstat, +.file-box .meta .info span.icon { + line-height: 0; + float: left; + margin: 5px 5px 0 0; + padding: 3px; + background: #F7F7F7; + border: 1px solid #CCC; + border-right-color: #E5E5E5; + border-bottom-color: #E5E5E5; + border-radius: 3px; +} + +/* line 63, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .info span.diffstat { + height: 16px; + padding: 3px 6px; +} + +/* line 67, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .info span:first-child, +#files .file .meta .info .icon + span, +.file-box .meta .info span:first-child, +.file-box .meta .info .icon + span { + border-left: 0 none; + box-shadow: inset 0 0 0 transparent; + margin-left: 0; + padding-left: 0; +} + +/* line 76, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .info span.diffstat .diffstat-bar { + color: #D8D8D8; +} + +/* line 79, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .actions, .file-box .meta .actions { + float: right; + height: 33px; + line-height: 33px; + margin-top: 1px; +} + +/* line 85, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .actions .show-inline-notes { + display: block; + position: relative; + display: block; + float: left; + margin-right: 10px; +} + +/* line 92, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .actions .show-inline-notes label { + font-weight: bold; + margin: 5px 0; +} + +/* line 96, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .actions .show-inline-notes input { + margin: 0; +} + +/* line 99, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .actions .button-group, +.file-box .meta .actions .button-group { + float: right; + margin-top: 2px; +} + +/* line 104, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .actions code, +.file-box .meta .actions code { + background: inherit; + border: none; + font-size: 11px; + color: inherit; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + padding: 0; +} + +/* line 114, ../../../hub/static/css/mod/file-blame-blob.scss */ +.file { + margin: 15px 0; +} + +/* line 118, ../../../hub/static/css/mod/file-blame-blob.scss */ +.file .data { + overflow: auto; +} + +/* line 120, ../../../hub/static/css/mod/file-blame-blob.scss */ +.change #files .file, .file-box, .change .file { + margin-bottom: 0; +} + +/* line 122, ../../../hub/static/css/mod/file-blame-blob.scss */ +.blame .line-data { + font-size: 12px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; +} + +/* highlight style */ +/* line 2, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .hll { + background-color: #ffffcc; +} + +/* line 3, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight { + background: #ffffff; +} + +/* line 4, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .c { + color: #808080; +} + +/* Comment */ +/* line 5, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .err { + color: #F00000; + background-color: #F0A0A0; +} + +/* Error */ +/* line 6, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .k { + color: #008000; + font-weight: bold; +} + +/* Keyword */ +/* line 7, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .o { + color: #303030; +} + +/* Operator */ +/* line 8, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .cm { + color: #808080; +} + +/* Comment.Multiline */ +/* line 9, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .cp { + color: #507090; +} + +/* Comment.Preproc */ +/* line 10, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .c1 { + color: #808080; +} + +/* Comment.Single */ +/* line 11, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .cs { + color: #cc0000; + font-weight: bold; +} + +/* Comment.Special */ +/* line 12, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gd { + color: #A00000; +} + +/* Generic.Deleted */ +/* line 13, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ge { + font-style: italic; +} + +/* Generic.Emph */ +/* line 14, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gr { + color: #FF0000; +} + +/* Generic.Error */ +/* line 15, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gh { + color: #000080; + font-weight: bold; +} + +/* Generic.Heading */ +/* line 16, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gi { + color: #00A000; +} + +/* Generic.Inserted */ +/* line 17, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .go { + color: #808080; +} + +/* Generic.Output */ +/* line 18, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gp { + color: #c65d09; + font-weight: bold; +} + +/* Generic.Prompt */ +/* line 19, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gs { + font-weight: bold; +} + +/* Generic.Strong */ +/* line 20, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gu { + color: #800080; + font-weight: bold; +} + +/* Generic.Subheading */ +/* line 21, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gt { + color: #0040D0; +} + +/* Generic.Traceback */ +/* line 22, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kc { + color: #008000; + font-weight: bold; +} + +/* Keyword.Constant */ +/* line 23, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kd { + color: #008000; + font-weight: bold; +} + +/* Keyword.Declaration */ +/* line 24, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kn { + color: #008000; + font-weight: bold; +} + +/* Keyword.Namespace */ +/* line 25, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kp { + color: #003080; + font-weight: bold; +} + +/* Keyword.Pseudo */ +/* line 26, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kr { + color: #008000; + font-weight: bold; +} + +/* Keyword.Reserved */ +/* line 27, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kt { + color: #303090; + font-weight: bold; +} + +/* Keyword.Type */ +/* line 28, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .m { + color: #6000E0; + font-weight: bold; +} + +/* Literal.Number */ +/* line 29, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .s { + background-color: #fff0f0; +} + +/* Literal.String */ +/* line 30, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .na { + color: #0000C0; +} + +/* Name.Attribute */ +/* line 31, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nb { + color: #007020; +} + +/* Name.Builtin */ +/* line 32, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nc { + color: #B00060; + font-weight: bold; +} + +/* Name.Class */ +/* line 33, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .no { + color: #003060; + font-weight: bold; +} + +/* Name.Constant */ +/* line 34, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nd { + color: #505050; + font-weight: bold; +} + +/* Name.Decorator */ +/* line 35, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ni { + color: #800000; + font-weight: bold; +} + +/* Name.Entity */ +/* line 36, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ne { + color: #F00000; + font-weight: bold; +} + +/* Name.Exception */ +/* line 37, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nf { + color: #0060B0; + font-weight: bold; +} + +/* Name.Function */ +/* line 38, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nl { + color: #907000; + font-weight: bold; +} + +/* Name.Label */ +/* line 39, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nn { + color: #0e84b5; + font-weight: bold; +} + +/* Name.Namespace */ +/* line 40, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nt { + color: #007000; +} + +/* Name.Tag */ +/* line 41, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nv { + color: #906030; +} + +/* Name.Variable */ +/* line 42, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ow { + color: #000000; + font-weight: bold; +} + +/* Operator.Word */ +/* line 43, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .w { + color: #bbbbbb; +} + +/* Text.Whitespace */ +/* line 44, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mf { + color: #6000E0; + font-weight: bold; +} + +/* Literal.Number.Float */ +/* line 45, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mh { + color: #005080; + font-weight: bold; +} + +/* Literal.Number.Hex */ +/* line 46, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mi { + color: #0000D0; + font-weight: bold; +} + +/* Literal.Number.Integer */ +/* line 47, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mo { + color: #4000E0; + font-weight: bold; +} + +/* Literal.Number.Oct */ +/* line 48, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sb { + background-color: #fff0f0; +} + +/* Literal.String.Backtick */ +/* line 49, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sc { + color: #0040D0; +} + +/* Literal.String.Char */ +/* line 50, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sd { + color: #D04020; +} + +/* Literal.String.Doc */ +/* line 51, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .s2 { + background-color: #fff0f0; +} + +/* Literal.String.Double */ +/* line 52, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .se { + color: #606060; + font-weight: bold; + background-color: #fff0f0; +} + +/* Literal.String.Escape */ +/* line 53, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sh { + background-color: #fff0f0; +} + +/* Literal.String.Heredoc */ +/* line 54, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .si { + background-color: #e0e0e0; +} + +/* Literal.String.Interpol */ +/* line 55, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sx { + color: #D02000; + background-color: #fff0f0; +} + +/* Literal.String.Other */ +/* line 56, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sr { + color: #000000; + background-color: #fff0ff; +} + +/* Literal.String.Regex */ +/* line 57, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .s1 { + background-color: #fff0f0; +} + +/* Literal.String.Single */ +/* line 58, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ss { + color: #A06000; +} + +/* Literal.String.Symbol */ +/* line 59, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .bp { + color: #007020; +} + +/* Name.Builtin.Pseudo */ +/* line 60, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .vc { + color: #306090; +} + +/* Name.Variable.Class */ +/* line 61, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .vg { + color: #d07000; + font-weight: bold; +} + +/* Name.Variable.Global */ +/* line 62, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .vi { + color: #3030B0; +} + +/* Name.Variable.Instance */ +/* line 63, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .il { + color: #0000D0; + font-weight: bold; +} + +/* Literal.Number.Integer.Long */ +/* ticket style */ +/* line 2, ../../../hub/static/css/mod/pull-ticket.scss */ +#content.ticket { + width: 63em; + max-width: 100%; + margin-left: auto; +} + +/* line 8, ../../../hub/static/css/mod/pull-ticket.scss */ +#field-description-help { + float: right; +} + +/* line 9, ../../../hub/static/css/mod/pull-ticket.scss */ +#properties div.trac-resizable, #field-description { + width: 100%; +} + +/* line 11, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket { + background: #ffd; + border: 1px outset #996; + margin-top: 1em; + padding: .5em 1em; + position: relative; +} + +/* line 19, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket.ticketdraft { + background: #f8f8f8 url(../draft.png); +} + +/* line 22, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticketchange.ticketdraft { + padding: 0 1em; + margin: 1em 0; +} + +/* line 26, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticketchange.ticketdraft h3 { + margin-top: .5em; +} + +/* line 29, ../../../hub/static/css/mod/pull-ticket.scss */ +.preview-notice { + font-weight: bold; +} + +/* line 31, ../../../hub/static/css/mod/pull-ticket.scss */ +.ticketdraft { + background: #f8f8f8 url(../draft.png); + border: 1px outset #996; + padding: 0 .2em; +} + +/* line 37, ../../../hub/static/css/mod/pull-ticket.scss */ +h1 .status { + color: #444; +} + +/* line 38, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket h2.summary { + margin: 0 0 0.8em 0; +} + +/* line 39, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket .date { + color: #996; + float: right; + font-size: 85%; + position: relative; +} + +/* line 40, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket .date p { + margin: 0.3em; +} + +/* line 42, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket table.properties { + clear: both; + border-top: 1px solid #dd9; + border-collapse: collapse; + table-layout: fixed; + width: 100%; +} + +/* line 49, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket table.properties tr { + border-bottom: 1px dotted #eed; +} + +/* line 50, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket table.properties td, #ticket table.properties th { + font-size: 80%; + padding: .5em 1em; + vertical-align: top; +} + +/* line 55, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket table.properties th { + color: #663; + font-weight: normal; + text-align: left; + width: 20%; +} + +/* line 61, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket table.properties td { + width: 30%; +} + +/* line 62, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket table.properties td p:first-child { + margin-top: 0; +} + +/* line 63, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket table.properties td p:last-child { + margin-bottom: 0; +} + +/* line 64, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket table.properties .description { + border-top: 1px solid #dd9; +} + +/* line 66, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket .description h3 { + border-bottom: 1px solid #dd9; + color: #663; + font-size: 100%; + font-weight: normal; +} + +/* line 72, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket .description h3 .lastmod { + font-size: 90%; +} + +/* line 75, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket .inlinebuttons { + float: right; + position: relative; + bottom: 0.3em; + margin-left: 0.2em; +} + +/* line 82, ../../../hub/static/css/mod/pull-ticket.scss */ +#changelog { + border: 1px outset #996; + padding: 1em; +} + +/* line 83, ../../../hub/static/css/mod/pull-ticket.scss */ +.trac-shade { + background-color: #eee; +} + +/* line 84, ../../../hub/static/css/mod/pull-ticket.scss */ +#trac-comment-editor { + margin-left: 2em; + margin-bottom: 1em; +} + +/* line 85, ../../../hub/static/css/mod/pull-ticket.scss */ +#trac-comment-editor div.trac-resizable { + width: 100%; +} + +/* line 86, ../../../hub/static/css/mod/pull-ticket.scss */ +#trac-comment-editor textarea { + background: #ffffe0; + margin-left: -1px; + margin-right: -1px; + width: 100%; +} + +/* line 92, ../../../hub/static/css/mod/pull-ticket.scss */ +#trac-comment-editor .wikitoolbar { + margin-left: -1px; +} + +/* line 93, ../../../hub/static/css/mod/pull-ticket.scss */ +#trac-add-comment :link, #trac-add-comment :visited { + color: #b00; +} + +/* line 94, ../../../hub/static/css/mod/pull-ticket.scss */ +#changelog h3, #ticketchange h3 { + border-bottom: 1px solid #d7d7d7; + color: #999; + font-size: 100%; + font-weight: normal; +} + +/* line 100, ../../../hub/static/css/mod/pull-ticket.scss */ +.threading, #changelog .inlinebuttons { + float: right; + margin-left: 0.2em; +} + +/* line 101, ../../../hub/static/css/mod/pull-ticket.scss */ +.threading { + font-size: 85%; +} + +/* line 102, ../../../hub/static/css/mod/pull-ticket.scss */ +.threading :link, .threading :visited { + border-bottom: 0; +} + +/* line 103, ../../../hub/static/css/mod/pull-ticket.scss */ +#changelog .trac-lastedit { + padding-left: 2.5em; + color: #999; + font-size: 80%; +} + +/* line 108, ../../../hub/static/css/mod/pull-ticket.scss */ +#changelog .trac-lastedit :link, #changelog .trac-lastedit :visited { + color: inherit; +} + +/* line 110, ../../../hub/static/css/mod/pull-ticket.scss */ +#changelog .changes, #ticketchange .changes { + list-style: square; + margin-left: 2em; + padding: 0; +} + +/* line 111, ../../../hub/static/css/mod/pull-ticket.scss */ +#changelog .comment, #ticketchange .comment { + margin-left: 2em; +} + +/* line 113, ../../../hub/static/css/mod/pull-ticket.scss */ +form .field { + margin-top: .75em; + width: 100%; +} + +/* line 114, ../../../hub/static/css/mod/pull-ticket.scss */ +form .field fieldset.iefix { + margin-left: 1px; + margin-right: 1px; +} + +/* line 115, ../../../hub/static/css/mod/pull-ticket.scss */ +label[for=comment] { + float: right; +} + +/* line 116, ../../../hub/static/css/mod/pull-ticket.scss */ +form .field .wikitoolbar { + margin-left: -1px; +} + +/* line 117, ../../../hub/static/css/mod/pull-ticket.scss */ +form .field div.trac-resizable { + width: 100%; +} + +/* line 119, ../../../hub/static/css/mod/pull-ticket.scss */ +#properties { + white-space: nowrap; + line-height: 160%; + padding: 0.5em; +} + +/* line 120, ../../../hub/static/css/mod/pull-ticket.scss */ +#properties table { + border-spacing: 0; + width: 100%; + padding: 0 0.5em; +} + +/* line 121, ../../../hub/static/css/mod/pull-ticket.scss */ +#properties table th { + padding: .4em; + text-align: right; + width: 20%; + vertical-align: top; +} + +/* line 127, ../../../hub/static/css/mod/pull-ticket.scss */ +#properties table th.col2 { + border-left: 1px dotted #d7d7d7; +} + +/* line 128, ../../../hub/static/css/mod/pull-ticket.scss */ +#properties table td { + vertical-align: middle; + width: 30%; +} + +/* line 129, ../../../hub/static/css/mod/pull-ticket.scss */ +#properties table td.fullrow { + vertical-align: middle; + width: 80%; +} + +/* line 131, ../../../hub/static/css/mod/pull-ticket.scss */ +#action { + line-height: 2em; +} + +/* line 133, ../../../hub/static/css/mod/pull-ticket.scss */ +fieldset.radio { + border: none; + margin: 0; + padding: 0; +} + +/* line 134, ../../../hub/static/css/mod/pull-ticket.scss */ +fieldset.radio legend { + color: #000; + float: left; + font-size: 100%; + font-weight: normal; + padding: 0 1em 0 0; +} + +/* line 141, ../../../hub/static/css/mod/pull-ticket.scss */ +fieldset.radio label { + padding-right: 1em; +} + +/* Like these */ +/* line 1, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description .css-truncate-target + .css-truncate-target { + max-width: 125px; +} + +/* line 2, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description p .commit-ref .user { + color: #CCC; +} + +/* line 3, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head { + margin: 20px 0; + background-color: #FAFAFA; + border: 1px solid #EEE; + border-bottom-width: 2px; + border-radius: 3px; +} + +/* line 4, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description .attention-icon { + position: relative; + float: left; + margin: 4px 10px 0 0; +} + +/* line 5, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description p { + padding-left: 10px; + position: relative; + float: left; + margin: 0; + line-height: 36px; + font-size: 13px; + max-width: 690px; + white-space: nowrap; +} + +/* line 6, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description p .user { + font-weight: bold; + color: #333; +} + +/* line 8, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description p { + padding-left: 0; +} + +/* line 12, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description .pull-state { + float: left; + padding: 8px; + margin-right: 8px; + border-right: 1px solid #EEE; + line-height: 20px; +} + +/* line 13, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description .state-indicator { + font-size: 13px; + display: inline-block; + height: 20px; + line-height: 20px; + padding: 0 5px; +} + +/* line 15, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +.commit-ref { + position: relative; + height: 20px; + display: inline-block; + padding: 0 5px; + border: 1px solid black; + border-radius: 3px; + font: 10px/20px Monaco,"Liberation Mono",Courier,monospace; + color: white; + white-space: nowrap; + vertical-align: middle; + background-color: #222; + background-image: -moz-linear-gradient(#444, #222); + background-image: -webkit-linear-gradient(#444, #222); + background-image: linear-gradient(#444, #222); + background-repeat: repeat-x; +} + +@media (max-width: 767px) { + /* line 2, ../../../hub/static/css/mod/pullrequest-pull-head-responsive.scss */ + div.pull-head .pull-description p { + white-space: normal; + } +} +/* line 1, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav { + margin-top: 6px; +} + +/* line 3, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label { + position: relative; + display: inline-block; + margin-left: 3px; + padding: 3px 7px; + border: 1px solid #ccc; + border-radius: 3px; + color: #333; + background-color: #fafafa; + vertical-align: middle; +} + +/* line 15, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::before, .metanav .counts-label::after { + content: ""; + position: absolute; + top: 50%; + right: 100%; + display: block; + margin-right: 0px; + margin-top: -6px; + width: 0; + height: 0; + border: 6px solid transparent; + border-right-color: #ccc; +} + +/* line 29, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::after { + margin-right: -1px; + border-right-color: #fafafa; +} + +/* line 2, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.metabox { + display: inline-block; + height: 8px; + background: #ccc; + text-indent: -9999px; + font-size: 12px; +} + +/* line 9, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats { + font: 13px Helvetica, arial, freesans, clean, sans-serif; + line-height: 1.4; + margin: 0; + padding: 0; + border: 0; + position: relative; + float: right; + width: 135px; + opacity: 0.5; + padding-bottom: 10px; +} + +/* line 21, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats:hover { + opacity: 1; +} + +/* line 24, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats:hover .list-tip { + display: block; +} + +/* line 27, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats a { + color: #4183c4; + text-decoration: none; +} + +/* line 31, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats-graph { + height: 10px; + overflow: hidden; +} + +/* line 35, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats-graph span { + display: inline-block; + height: 6px; + background: #ccc; + text-indent: -9999px; + float: left; +} + +/* line 42, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip, ul.list-tip { + border-radius: 3px; + box-shadow: 0 0 5px #ccc; + border: 1px solid #ddd; + background: #fff; + position: absolute; + padding-left: 0px; + top: 20px; + left: -20px; + width: 175px; + z-index: 100; + display: none; + margin-top: 0px; +} + +/* line 56, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip:before, ul.list-tip:before { + content: "▲"; + font-size: 14px; + margin: 0 auto; + width: 14px; + display: block; + margin-top: -13px; + color: #fff; + text-shadow: -1px -1px 2px #ccc; +} + +/* line 66, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li, ul.list-tip li { + margin: 0; + line-height: 100%; + list-style: none; + border-bottom: 1px solid #eee; + font-weight: bold; +} + +/* line 73, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li a, ol.list-tip li .other, ul.list-tip li a, ul.list-tip li .other { + color: #333; + padding: 8px 10px; + display: block; +} + +/* line 78, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li span.color-block, ul.list-tip li span.color-block { + display: inline-block; + width: 8px; + height: 10px; + margin-right: 5px; +} + +/* line 84, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li span.percent, ul.list-tip li span.percent { + float: right; + color: #999; +} + +/* fix project title for newer version of bootstrap*/ +/* line 6, ../../../hub/static/css/mod/project-info.scss */ +.pagehead .pull-left { + margin: 0; + font-size: 30px; + line-height: 36px; +} + +/* Hotfix for FlatUI */ +/* line 13, ../../../hub/static/css/mod/project-info.scss */ +.pagehead h2.pull-left { + margin: 0; +} + +/* line 17, ../../../hub/static/css/mod/project-info.scss */ +#project-info { + border: 1px solid #c5d5dd; + border-radius: 3px; + width: 100%; +} + +/* line 22, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div { + padding: 10px; +} + +/* line 25, ../../../hub/static/css/mod/project-info.scss */ +#project-info p { + margin: 0px; +} + +/* line 28, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div.team-label { + border-top: 1px solid #ccc; +} + +/* line 32, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div.git-url { + border-top: 1px solid #ccc; +} + +/* line 36, ../../../hub/static/css/mod/project-info.scss */ +#project-info input.git-url { + width: 480px; + margin: 0px; + cursor: auto; +} + +/* line 43, ../../../hub/static/css/mod/project-info.scss */ +#project-info .ssh div.ssh-url { + display: inline; +} +/* line 46, ../../../hub/static/css/mod/project-info.scss */ +#project-info .ssh div.http-url { + display: none; +} + +/* line 52, ../../../hub/static/css/mod/project-info.scss */ +#project-info .http div.ssh-url { + display: none; +} +/* line 55, ../../../hub/static/css/mod/project-info.scss */ +#project-info .http div.http-url { + display: inline; +} + +/* line 60, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar { + margin-top: 12px; + border-bottom: 1px solid #DDD; +} + +/* line 61, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar #back-old-browser { + padding-top: 8px; + float: right; +} + +/* line 62, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab { + padding-left: 20px; +} + +/* line 63, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li { + display: inline-block; + vertical-align: top; + cursor: pointer; +} + +/* line 64, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li a { + color: #666; + text-decoration: none; + padding: 8px 12px; + display: inline-block; + border-left: 1px solid transparent; + border-top: 1px solid transparent; + border-right: 1px solid transparent; + margin-bottom: -1px; +} + +/* line 65, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li a.active { + color: #333; + font-weight: bold; + border-left: 1px solid #DDD; + border-top: 1px solid #DDD; + border-right: 1px solid #DDD; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + background-color: white; +} + +/* line 67, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar .scope { + float: left; + margin-right: 10px; +} + +/* line 71, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar .scope i { + font-style: normal; +} + +/* line 75, ../../../hub/static/css/mod/project-info.scss */ +#breadcrumb { + margin: 10px 0; + font-size: 18px; + font-weight: bold; + color: #999; +} + +/* line 76, ../../../hub/static/css/mod/project-info.scss */ +#breadcrumb .final-path { + color: #000; +} + +/* line 1, ../../../hub/static/css/mod/commits-condensed.scss */ +table.commits { + width: 100%; + margin-top: 10px; +} + +/* line 6, ../../../hub/static/css/mod/commits-condensed.scss */ +.boxed-group { + position: relative; + background: #EFEFEF; + padding: 3px; + border-radius: 3px; + margin: 0 0 15px 0; +} + +/* line 13, ../../../hub/static/css/mod/commits-condensed.scss */ +.boxed-group > h3 { + background: #FAFAFA; + background: -moz-linear-gradient(#FAFAFA, #E0E0E0); + background: -webkit-linear-gradient(#FAFAFA, #E0E0E0); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#e0e0e0')"; + margin: 0; + border-top-left-radius: 1px; + border-top-right-radius: 1px; + border: 1px solid #D8D8D8; + border-bottom: 1px solid #CCC; + padding: 10px 10px 11px 10px; + font-size: 14px; + text-shadow: 0 1px 0 white; +} + +/* line 27, ../../../hub/static/css/mod/commits-condensed.scss */ +.boxed-group .boxed-group-inner { + padding: 1px 10px; + background: white; + border: 1px solid #D8D8D8; + border-top: none; + border-bottom-left-radius: 1px; + border-bottom-right-radius: 1px; + color: #666; + font-size: 13px; +} + +/* line 37, ../../../hub/static/css/mod/commits-condensed.scss */ +.boxed-group.condensed > h3 { + padding: 6px 6px 7px; + font-size: 12px; +} + +/* line 41, ../../../hub/static/css/mod/commits-condensed.scss */ +.boxed-group.condensed > h3 i { + position: relative; + padding: 0 6px 0 2px; +} + +/* line 45, ../../../hub/static/css/mod/commits-condensed.scss */ +.boxed-group.condensed .boxed-group-inner { + font-size: 12px; + padding: 0; +} + +/* line 50, ../../../hub/static/css/mod/commits-condensed.scss */ +.boxed-group-list > li { + display: block; + margin-left: -10px; + width: 100%; + padding: 5px 10px; + line-height: 23px; + border-bottom: 1px solid #E5E5E5; +} + +/* line 59, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed { + margin-top: 0; + border: none; + background-color: white; +} + +/* line 64, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td { + padding: 4px; + vertical-align: top; + border-top: 1px solid #E2EAEE; +} + +/* line 69, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td.gravatar { + width: 29px; + padding: 5px; +} + +/* line 74, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed tr:first-child td { + border-top: 0; +} + +/* line 77, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed tr:nth-child(2n) td { + background: #F7FBFC; +} + +/* line 80, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed span.gravatar { + display: block; + width: 16px; + height: 16px; + line-height: 1px; + padding: 1px; + border: 1px solid #DDD; + background: white; +} + +/* line 89, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed span.gravatar a { + display: inline-block; +} + +/* line 92, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td.author { + padding-left: 0; + color: #666; + width: 100px; + font-weight: bold; +} + +/* line 98, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td.author span.commit-author { + display: inline-block; + width: 100px; + text-overflow: ellipsis; + overflow: hidden; + line-height: 22px; +} + +/* line 105, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td.author a { + color: #333; +} + +/* line 108, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td.message { + padding-left: 0; +} + +/* line 111, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed code { + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + background: inherit; +} + +/* line 115, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td.message code { + line-height: 22px; +} + +/* line 118, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td.message a { + color: #333; +} + +/* line 121, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed .commit-desc pre { + margin-top: 5px; + margin-bottom: 4px; + border-left: 1px solid #E5E5E5; + padding-left: 8px; + font-size: 11px; + font-weight: normal; + color: #596063; +} + +/* line 130, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td.commit-meta { + width: 1%; + text-align: right; + white-space: nowrap; + padding-right: 10px; +} + +/* line 136, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td.commit-meta code { + line-height: 22px; +} + +/* following style for new-pull 'xxx add commits' commits-condense style */ +/* line 142, ../../../hub/static/css/mod/commits-condensed.scss */ +table.commits { + width: 100%; + margin: 0; + font-size: 12px; +} + +/* line 147, ../../../hub/static/css/mod/commits-condensed.scss */ +table.commits .commit { + width: 59px; + padding-right: 10px; +} + +/* line 151, ../../../hub/static/css/mod/commits-condensed.scss */ +table.commits code { + border: none; +} + +/* line 154, ../../../hub/static/css/mod/commits-condensed.scss */ +table.commits td.message { + /* width: 70%;*/ +} + +/* line 157, ../../../hub/static/css/mod/commits-condensed.scss */ +table.commits td.date { + text-align: right; +} + +/* line 161, ../../../hub/static/css/mod/commits-condensed.scss */ +table.commits-condensed code { + white-space: normal; +} + +/* line 164, ../../../hub/static/css/mod/commits-condensed.scss */ +table.commits-condensed pre { + white-space: pre-wrap; +} + +/* button list */ +/* line 3, ../../../hub/static/css/mod/file-blob.scss */ +.button-group { + display: inline-block; + overflow: hidden; + border: 1px solid #d4d4d4; + border-radius: 3px; + border-bottom-color: #bcbcbc; + background: #f5f5f5; + background: -moz-linear-gradient(#f5f5f5, #e5e5e5); + background: -webkit-linear-gradient(#f5f5f5, #e5e5e5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; +} + +/* line 4, ../../../hub/static/css/mod/file-blob.scss */ +.button-group li { + margin: 0 !important; + float: left; +} + +/* line 5, ../../../hub/static/css/mod/file-blob.scss */ +.button-group li:first-child .grouped-button { + border-left: none; + border-bottom-left-radius: 2px; + border-top-left-radius: 2px; +} + +/* line 6, ../../../hub/static/css/mod/file-blob.scss */ +.button-group li:last-child .grouped-button { + border-right: none; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 2px; +} + +/* line 7, ../../../hub/static/css/mod/file-blob.scss */ +.button-group .grouped-button { + float: left; + background: none; + border-bottom: none; + border-top: none; + border-left: 1px solid rgba(0, 0, 0, 0.1); + border-right: 1px solid rgba(255, 255, 255, 0.5); + border-radius: 0; + cursor: pointer; +} + +/* line 8, ../../../hub/static/css/mod/file-blob.scss */ +.button-group .minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line-no */ +/* line 12, ../../../hub/static/css/mod/file-blob.scss */ +#blob .file { + min-height: 78px; + position: relative; + overflow: auto; +} + +/* line 13, ../../../hub/static/css/mod/file-blob.scss */ +#blob .file .rawfile { + text-align: center; + background-color: #ddd; + padding: 30px; + position: relative; +} + +/* line 14, ../../../hub/static/css/mod/file-blob.scss */ +.file table { + width: 100%; + border-collapse: collapse; + border-spacing: 0; +} + +/* line 15, ../../../hub/static/css/mod/file-blob.scss */ +.file table td, .file table th { + vertical-align: top; + padding: 0; +} + +/* line 16, ../../../hub/static/css/mod/file-blob.scss */ +.file .data { + overflow: auto; +} + +/* line 18, ../../../hub/static/css/mod/file-blob.scss */ +.code { + width: 100%; +} + +/* line 19, ../../../hub/static/css/mod/file-blob.scss */ +.code .highlight pre { + margin: 0; + padding: 8px; + border: none; + background-color: #FFF; + white-space: pre; +} + +/* line 20, ../../../hub/static/css/mod/file-blob.scss */ +.code .highlight pre a { + display: block; +} + +/* line 23, ../../../hub/static/css/mod/file-blob.scss */ +.linenos .linenodiv pre { + background-color: #ECECEC; + padding: 8px; + border: none; + border-right: 1px solid #DDD; + text-align: right; + white-space: pre; +} + +/* line 24, ../../../hub/static/css/mod/file-blob.scss */ +.linenos .linenodiv pre a { + color: #AAA; + text-decoration: none; + white-space: nowrap; + line-height: 18px; +} + +/* line 25, ../../../hub/static/css/mod/file-blob.scss */ +.code .highlight pre, .linenos .linenodiv pre { + margin: 0; + line-height: 18px; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +/* line 32, ../../../hub/static/css/mod/file-blob.scss */ +.linenos { + padding: 0; +} + +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 400; + src: local("Source Code Pro"), local("SourceCodePro-Regular"), url("/static/css/fonts/SourceCodePro-Regular.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 500; + src: local("Source Code Pro Medium"), local("SourceCodePro-Medium"), url("/static/css/fonts/SourceCodePro-Medium.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 600; + src: local("Source Code Pro Semibold"), local("SourceCodePro-Semibold"), url("/static/css/fonts/SourceCodePro-Semibold.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 700; + src: local("Source Code Pro Bold"), local("SourceCodePro-Bold"), url("/static/css/fonts/SourceCodePro-Bold.woff") format("woff"); +} +/* line 3, ../../../hub/static/css/mod/diff-base.scss */ +.code pre, xmp, plaintext, listing { + display: block; + font-size: 13px; + font-family: 'Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; + white-space: pre; + margin: 0; + padding: 0; +} + +/* line 12, ../../../hub/static/css/mod/diff-base.scss */ +.code pre { + line-height: 18px; +} + +/* line 16, ../../../hub/static/css/mod/diff-base.scss */ +.font-consolas pre { + font-family: Consolas,'Source Code Pro',Courier,Monaco,Menlo,monospace; +} + +/* line 20, ../../../hub/static/css/mod/diff-base.scss */ +.font-monaco pre { + font-family: Monaco,'Source Code Pro',Courier,Consolas,Menlo,monospace; +} + +/* line 24, ../../../hub/static/css/mod/diff-base.scss */ +.font-courier pre { + font-family: Courier,'Source Code Pro',Monaco,Consolas,Menlo,monospace; +} + +/* line 28, ../../../hub/static/css/mod/diff-base.scss */ +.font-dejavu pre { + font-family: 'DejaVu Sans Mono','Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; +} + +/* line 32, ../../../hub/static/css/mod/diff-base.scss */ +.font-ubuntu pre { + font-family: 'Ubuntu Mono','Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; +} + +/* line 37, ../../../hub/static/css/mod/diff-base.scss */ +pre, code, tt { + font-size: 12px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + border: 0; +} + +/* line 43, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .normal { + background-color: #FFF; +} + +/* line 47, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .deletion { + color: black; + background-color: #FDD; +} +/* line 50, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .deletion .x, .highlight .deletion .c { + color: black; + background-color: #ffaaaa; +} + +/* line 56, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .insertion { + color: black; + background-color: #DFD; +} +/* line 59, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .insertion .i, .highlight .insertion .c { + color: black; + background-color: #aaffaa; +} + +/* line 65, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped { + color: #cacaca; + background-color: #f9f9f9; +} +/* line 69, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a { + color: #cacaca; + vertical-align: middle; +} +/* line 73, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a:hover { + text-decoration: none; +} +/* line 77, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a[data-type="after"], .highlight .skipped a[data-type="before"] { + font-size: 20px; +} + +/* line 1, ../../../hub/static/css/mod/colorcube.scss */ +.colorcube { + position: absolute; + width: 30px; + height: 30px; + border: 1px solid #DDD; +} + +/* line 2, ../../../hub/static/css/mod/colorcube.scss */ +.colorcube::before { + content: ""; + display: block; + height: 0; + width: 0; + border: 5px solid #DDD; + border-width: 5px; + border-color: #DDD transparent transparent transparent; + left: 10px; + top: 30px; + float: left; + position: absolute; +} + +/* line 5, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .line_numbers, .file-box .data .line_numbers { + background-color: #ECECEC; + color: #AAA; + padding: 0 2px 0 16px; + border-right: 1px solid #DDD; + text-align: right; + cursor: pointer; +} +/* line 12, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .line_numbers.deletion, .file-box .data .line_numbers.deletion { + color: #AAA; + background-color: #f7c8c8; +} +/* line 16, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .line_numbers.insertion, .file-box .data .line_numbers.insertion { + color: #AAA; + background-color: #ceffce; +} + +/* line 21, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .line_numbers a { + color: #AAA; +} + +/* line 24, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .code { + width: 100%; +} + +/* line 28, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .side { + overflow-x: none; + display: none; +} + +/* line 33, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .side .file-col { + width: 50%; + float: left; + overflow-x: auto; +} + +/* line 40, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .diff-table { + border-collapse: collapse; +} + +/* line 44, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files.commentable tr td pre:hover { + background-color: #FFC; +} + +/* line 46, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .diff-table pre { + border-radius: 0px; +} + +/* line 48, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data table, .file-box .data table { + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + font-size: 12px; + line-height: 1.4; +} + +/* line 54, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .file-diff-line span.color { + cursor: default; +} + +/* Comment Bubble */ +/* line 58, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file-diff-line .add-bubble { + position: absolute; + left: 0; + width: 25px; + height: 16px; + margin-top: 0; + cursor: pointer; + opacity: 0; + color: #4183C4; +} + +/* line 69, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file-diff-line:hover .add-bubble { + opacity: 1; +} + +/* Comment Bubble icons */ +/* line 72, ../../../hub/static/css/mod/file-diff-blob.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 83, ../../../hub/static/css/mod/file-diff-blob.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 91, ../../../hub/static/css/mod/file-diff-blob.scss */ +.mini-icon-add-comment::before { + content: "\f06f"; +} + +/* line 93, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container:first-child:after { + margin: -18px 0 0; +} + +/* line 97, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container:after { + background: none repeat scroll 0 0 #fff; + content: ""; + display: block; + height: 2px; + margin: -16px 0 0; + position: absolute; + left: 0px; + width: 938px; +} + +/* line 109, ../../../hub/static/css/mod/file-diff-blob.scss */ +.data .line-numbers-skipped { + position: absolute; + width: 79px; + background-color: #f5f5f5; + border-right: 1px solid #ccc; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; +} + +/* line 119, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .skipped-top, .skipped-container .skipped-bottom { + height: 18px; + background-color: #f5f5f5; +} + +/* line 124, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-top::before { + background: #fff; + border-bottom: 1px solid #ccc; + border-top: 1px solid #ccc; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + content: ""; + display: block; + height: 4px; + position: relative; + top: -1px; + margin-left: -1px; +} + +/* line 140, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .ellipsis:hover { + background-color: #e6e6e6; + border-color: #999; +} + +/* line 145, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .ellipsis { + background: #f5f5f5; + border: 1px solid #ccc; + -moz-border-radius: 3px; + border-radius: 3px; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + box-shadow: 0 0 0 2px #fff; + cursor: pointer; + display: block; + float: left; + font-family: Arial, sans-serif; + font-size: 20px; + text-align: center; + color: #707070; + height: 16px; + line-height: 6px; + margin: 0 0 0 5px; + padding: 0; + position: absolute; + width: 30px; + z-index: 10; +} + +/* line 170, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-top .ellipsis { + margin-top: -10px; +} + +/* line 174, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .ellipsis::before, .skipped-container .ellipsis::after { + border: 1px solid #ccc; + -moz-border-radius: 4px; + border-radius: 4px; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + content: ""; + height: 9px; + left: -4px; + width: 36px; + position: absolute; +} + +/* line 188, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .ellipsis::before { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + content: "\2026"; + padding: 2px 0 0; + top: -4px; +} + +/* line 197, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .ellipsis::after { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; + bottom: -4px; + height: 10px; +} + +/* line 206, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .toggle_whitespace:hover { + background-color: #e6e6e6; + border-color: #999; +} + +/* line 211, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .toggle_whitespace { + background: #f5f5f5; + border: 1px solid #ccc; + -moz-border-radius: 3px; + border-radius: 3px; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + box-shadow: 0 0 0 2px #fff; + cursor: pointer; + display: block; + float: left; + font-family: Arial, sans-serif; + font-size: 16px; + text-align: center; + color: #707070; + height: 16px; + line-height: 6px; + margin: 0 0 0 44px; + padding: 0; + position: absolute; + width: 30px; + z-index: 10; +} + +/* line 236, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-top .toggle_whitespace { + margin-top: -10px; +} + +/* line 240, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .toggle_whitespace::before, .skipped-container .toggle_whitespace::after { + border: 1px solid #ccc; + -moz-border-radius: 4px; + border-radius: 4px; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + content: ""; + height: 9px; + left: -4px; + width: 36px; + position: absolute; +} + +/* line 254, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .toggle_whitespace::before { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + content: "\2423"; + padding: 2px 0 0; + top: -4px; +} + +/* line 263, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .toggle_whitespace::after { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; + bottom: -4px; + height: 10px; +} + +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* line 3, ../../../hub/static/css/mod/merge-guide.scss */ +.pullrequest .merge-guide { + margin: 20px 0; +} + +/* line 4, ../../../hub/static/css/mod/merge-guide.scss */ +.commit-preview { + margin: 10px 0 0 0; +} +/* line 7, ../../../hub/static/css/mod/merge-guide.scss */ +.commit-preview .message, .commit-preview .commit-preview p.error { + clear: both; + padding: 5px; + background: #eaf2f5; + border: 1px solid #bedce7; +} +/* line 14, ../../../hub/static/css/mod/merge-guide.scss */ +.commit-preview .message pre { + font-size: 11px; + color: #333; + white-space: pre-wrap; + word-wrap: break-word; +} + +/* line 24, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch .mergeable { + padding: 8px 10px; + border: 1px solid #ddd; + border-radius: 2px; +} +/* line 30, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch .mergeable.merging { + background-color: #589ab3; + background-image: -moz-linear-gradient(#82bccd, #589ab3); + background-image: -webkit-linear-gradient(#82bccd, #589ab3); + background-image: linear-gradient(#82bccd, #589ab3); + background-repeat: repeat-x; + border-color: #7699ad; + border-bottom-color: #648192; + border-top-left-radius: 0; + border-top-right-radius: 0; + background-repeat: repeat-x; + border-color: #8bc384; +} +/* line 44, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch.mergeable-clean .mergeable { + background-color: #6eda62; + background-image: -moz-linear-gradient(#9ee692, #6eda62); + background-image: -webkit-linear-gradient(#9ee692, #6eda62); + background-image: linear-gradient(#9ee692, #6eda62); +} +/* line 50, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch.mergeable-clean .mergeable p.message { + color: #0b5f00; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.4); +} +/* line 54, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch.mergeable-clean .mergeable p.message span.blue { + color: blue; +} +/* line 58, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch.mergeable-dirty .mergeable, .merge-branch .dirty-cleanup .mergeable { + position: relative; + background-color: #f6e69f; + background-image: -moz-linear-gradient(#f6e69f, #f6e69f); + background-image: -webkit-linear-gradient(#f6e69f, #f6e69f); + background-image: linear-gradient(#f6e69f, #f6e69f); + background-repeat: repeat-x; + border-color: #888; +} +/* line 68, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch.mergeable-error .mergeable, .merge-branch .dirty-cleanup .mergeable { + position: relative; + background-color: #da4f49; + background-image: -moz-linear-gradient(#da4f49, #da4f49); + background-image: -webkit-linear-gradient(#da4f49, #da4f49); + background-image: linear-gradient(#da4f49, #da4f49); + background-repeat: repeat-x; + border-color: #888; +} +/* line 78, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch .minibutton { + float: right; + margin: -3px 0 0 15px; +} +/* line 83, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch p.message { + margin: 0; + font-size: 13px; + font-weight: bold; +} +/* line 89, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch .merge-form .merge-error-message { + display: none; + margin: 10px 0 0 0; + padding: 5px 7px; + color: #bd2c00; + font-weight: bold; + font-size: 12px; + line-height: 19px; + background: rgba(255, 255, 255, 0.8); + border-radius: 2px; +} +/* line 101, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch .commit-preview { + position: relative; + display: table-row; + font-size: 12px; +} +/* line 106, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch .commit-preview .author { + display: table-cell; + width: 36px; + padding: 8px 10px; + vertical-align: top; + background: #d3e5eb; + border: 1px solid #bedce7; + border-right: none; +} +/* line 116, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch .commit-preview .gravatar { + float: left; + margin: 2px 8px 0 0; +} +/* line 121, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch .commit-preview .message { + display: table-cell; + width: 805px; + padding: 8px 10px; + vertical-align: top; + background-color: #e7f0f3; + background-image: -moz-linear-gradient(#f6f9fa, #e7f0f3); + background-image: -webkit-linear-gradient(#f6f9fa, #e7f0f3); + background-image: linear-gradient(#f6f9fa, #e7f0f3); + background-repeat: repeat-x; + border: 1px solid #bedce7; +} +/* line 133, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch .commit-preview .message pre { + font-family: Monaco, "Liberation Mono", Courier, monospace; + font-size: 12px; + color: #5b6f74; +} +/* line 139, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch .commit-preview .message textarea { + margin-top: 5px; + box-sizing: border-box; + width: 100%; + height: 50px; + padding: 4px; + font-family: Monaco, "Liberation Mono", Courier, monospace; + font-size: 12px; + color: #666; + background-color: #fafafa; +} + +/* line 154, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-form { + display: none; +} + +/* line 1, ../../../hub/static/css/mod/diff-stat.scss */ +#toc li { + border-bottom: 1px solid #DDD; + list-style-type: none; + padding: 5px; +} + +/* line 7, ../../../hub/static/css/mod/diff-stat.scss */ +#toc { + margin: 15px 0; +} + +/* line 11, ../../../hub/static/css/mod/diff-stat.scss */ +#toc .diffstat { + float: right; +} + +/* line 14, ../../../hub/static/css/mod/diff-stat.scss */ +#toc .mini-icon-modified { + color: #677A85; +} + +/* line 18, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat { + white-space: nowrap; + text-align: right; + font-family: Helvetica,arial,freesans,clean,sans-serif; + color: #666; + font-weight: bold; + font-size: 11px; +} + +/* line 26, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat a { + text-decoration: none; + color: #666; +} + +/* line 30, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar { + position: relative; + left: -3px; + display: inline-block; + height: 12px; + text-decoration: none; + text-align: left; + color: #EEE; + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + line-height: 1; + -webkit-font-smoothing: antialiased; + font-size: 16px; + letter-spacing: -7px; +} + +/* line 48, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar.diff-added, +span.diffstat .diffstat-bar i.plus { + color: #61C423; + font-style: normal; +} + +/* line 53, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar.diff-added, +span.diffstat .diffstat-bar i.minus { + color: #C52323; + font-style: normal; +} + +/* line 59, ../../../hub/static/css/mod/diff-stat.scss */ +p.explain { + font-size: 12px; + color: #666; + margin: 1em 0; +} + +/* line 65, ../../../hub/static/css/mod/diff-stat.scss */ +p.explain .minibutton { + float: right; + top: -4px; +} + +/* line 3, ../../../hub/static/css/mod/diffs-pane.scss */ +.diff-cutoff { + margin-bottom: -2px; + height: 35px; + line-height: 37px; + font-size: 12px; + font-weight: bold; + color: #000; + text-align: center; + background: url("/static/img/compare_too_big.gif") 0 0 no-repeat; +} + +/* line 5, ../../../hub/static/css/mod/diffs-pane.scss */ +.fullscreen-mode { + overflow: hidden; +} + +/* line 6, ../../../hub/static/css/mod/diffs-pane.scss */ +#fullscreen-stage { + display: none; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + overflow-y: auto; + background: #fff; + z-index: 9999; +} + +/* line 7, ../../../hub/static/css/mod/diffs-pane.scss */ +#files #fullscreen-stage .file { + margin: 0; +} + +/* line 1, ../../../hub/static/css/mod/user-card.scss */ +.user-card { + position: absolute; + padding: 3px 5px 5px; + min-height: 68px; + width: 210px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +/* line 2, ../../../hub/static/css/mod/user-card.scss */ +.user-card .desc { + margin-left: 3px; +} + +/* line 3, ../../../hub/static/css/mod/user-card.scss */ +.user-card .avatar-wrap { + width: 46px; + height: 36px; + float: left; + margin-right: 6px; + border-right: 1px solid #BEBEBE; +} + +/* line 4, ../../../hub/static/css/mod/user-card.scss */ +.user-card .badge-item { + float: left; + width: 30px; + height: 30px; + border: none; + padding: 2px; + background-color: white; + line-height: 0; + margin-right: 0.7em; +} + +/* line 5, ../../../hub/static/css/mod/user-card.scss */ +.user-card .title { + padding: 0 0 0.25em 0; +} + +/* line 6, ../../../hub/static/css/mod/user-card.scss */ +.user-card .desc .avatar { + float: left; + width: 30px; + height: 30px; + padding: 2px; + background-color: white; + line-height: 0; + margin-right: 0.7em; +} + +/* line 1, ../../../hub/static/css/mod/team-card.scss */ +.team-card { + position: absolute; + padding: 6px 10px; + min-height: 68px; + width: 236px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + overflow: hidden; +} +/* line 10, ../../../hub/static/css/mod/team-card.scss */ +.team-card .pic { + float: right; + max-height: 50px; + margin: 6px 0 0 10px; +} +/* line 15, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content { + word-wrap: break-word; +} +/* line 17, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .title { + margin: 6px 0; + font-size: 15px; + overflow: hidden; + white-space: nowrap; +} +/* line 23, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .info { + position: relative; + margin-top: 10px; + font-size: 13px; +} +/* line 27, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .info .desc { + white-space: nowrap; + overflow: hidden; +} + +/* line 35, ../../../hub/static/css/mod/team-card.scss */ +.member { + border-top: solid 1px #eaeaea; + padding-top: 8px; + height: 26px; +} +/* line 39, ../../../hub/static/css/mod/team-card.scss */ +.member .more-members { + float: right; + width: 24px; + height: 24px; + line-height: 26px; + text-align: center; + border: 1px solid #eaeaea; + background: #eaeaea; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 53, ../../../hub/static/css/mod/team-card.scss */ +.member .members li { + float: left; +} +/* line 55, ../../../hub/static/css/mod/team-card.scss */ +.member .members li a { + display: block; + width: 26px; + height: 26px; + overflow: hidden; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 65, ../../../hub/static/css/mod/team-card.scss */ +.member .members li a img { + width: 26px; + height: 26px; +} + +/* line 73, ../../../hub/static/css/mod/team-card.scss */ +.cf { + zoom: 1; +} +/* line 75, ../../../hub/static/css/mod/team-card.scss */ +.cf:before { + content: ""; + display: table; +} +/* line 79, ../../../hub/static/css/mod/team-card.scss */ +.cf .cf:after { + clear: both; + content: ""; + display: table; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary, button.primary.classy:disabled, button.primary.classy.disabled, button.primary.classy:disabled:hover, button.primary.classy.disabled:disabled:hover, button.classy:disabled:hover.primary, button.classy.disabled:disabled:hover.primary { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4); + border-color: #74BB5A; + border-bottom-color: #509338; + background: #8ADD6D; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#8add6d', endColorstr='#60b044')"; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); + background-image: -webkit-linear-gradient(top, #8ADD6D, #60B044); +} + +/* line 2, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary.disabled { + opacity: 0.5; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy, +button.classy:disabled, +button.classy.disabled, +a.button.classy:disabled, +a.button.classy.disabled, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover:disabled, +a.button.classy.disabled:hover, +a.button.classy, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy:disabled:hover, +a.button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover { + display: inline-block; + padding: 8px 15px; + line-height: normal; + position: relative; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 12px; + font-weight: bold; + color: #666; + text-shadow: 0 1px rgba(255, 255, 255, 0.9); + background: whiteSmoke; + background: -moz-linear-gradient(whiteSmoke, #E5E5E5); + background: -webkit-linear-gradient(whiteSmoke, #E5E5E5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; + border-radius: 3px; + border: 1px solid #DDD; + border-bottom-color: #BBB; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form.tab-content { + overflow: initial; + position: relative; +} + +/* line 2, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 10px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-actions { + padding: 0; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + position: relative; + border: 3px solid #EEE; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + padding: 0; + background: #EEE; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content .write-content { + padding: 0 10px 10px; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; + margin: 0; +} + +/* line 5, ../../../hub/static/css/mod/inline-comment-form.scss */ +.show-inline-comment-form { + margin: 10px; +} + +/* line 6, ../../../hub/static/css/mod/inline-comment-form.scss */ +tr.inline-comments.show-inline-comment-form .show-inline-comment-form { + display: none; +} + +/* line 7, ../../../hub/static/css/mod/inline-comment-form.scss */ +.inline-comments .comment-count { + overflow: hidden; + padding: 0 !important; + border: solid #DDD; + border-width: 1px 0; + vertical-align: top; + text-align: center !important; +} + +/* line 8, ../../../hub/static/css/mod/inline-comment-form.scss */ +.inline-comments .counter { + display: inline-block; + padding: 2px 8px 6px; + font-family: 11px/1.2 bold Helvetica,arial,freesans,clean,sans-serif !important; + color: #333 !important; + border: 1px solid #C0CCD0; + border-top: 0; + border-radius: 0 0 3px 3px; + cursor: default !important; +} + +/* line 9, ../../../hub/static/css/mod/inline-comment-form.scss */ +#files .file.show-inline-notes tr.inline-comments { + display: table-row; +} + +/* line 10, ../../../hub/static/css/mod/inline-comment-form.scss */ +.inline-comments .line-comments { + overflow: auto; + padding: 0; + border-top: 1px solid #CCC; + border-bottom: 1px solid #DDD; + background: #fff; + font-family: Helvetica, arial, freesans, clean, sans-serif !important; +} + +/* line 11, ../../../hub/static/css/mod/inline-comment-form.scss */ +.inline-comment-form { + max-width: 870px; +} + +/* line 12, ../../../hub/static/css/mod/inline-comment-form.scss */ +.inline-comment-form form { + margin: 0; +} + +/* line 14, ../../../hub/static/css/mod/inline-comment-form.scss */ +.inline-comments .form-actions { + padding: 0 10px 10px; + margin: 0; +} + +/* line 15, ../../../hub/static/css/mod/inline-comment-form.scss */ +.form-content .form-actions { + background-color: transparent; +} + +/* line 16, ../../../hub/static/css/mod/inline-comment-form.scss */ +.form-actions { + text-align: right; + padding-bottom: 5px; + background: #fff; + border: none; +} + +/* line 17, ../../../hub/static/css/mod/inline-comment-form.scss */ +.form-actions .optional { + display: block; + padding-top: 8px; + float: left; + margin-right: 15px; + padding-top: 3px; +} + +/* preview comment form style */ +/* line 2, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav { + margin: 10px 0; + border-bottom: 1px solid #DDD; + height: 35px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs { + display: inline-block; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs > li { + display: inline-block; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab { + display: inline-block; + margin-bottom: -1px; + padding: 8px 12px 9px; + border: 1px solid transparent; + border-bottom: 0; + font-size: 14px; + color: #666; + text-decoration: none; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab.selected { + border-color: #DDD; + border-radius: 3px 3px 0 0; + background-color: white; + color: #333; + font-weight: bold; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab:hover { + text-decoration: none; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav { + position: relative; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav ul.tabnav-tabs { + padding-left: 10px; +} + +/* line 10, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 0 10px 10px; +} + +/* line 11, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form #preview_bucket .content-body { + padding: 10px; + min-height: 132px; +} + +/* line 5, ../../../hub/static/css/mod/inline-comment.scss */ +.inline-comments .comment-holder { + max-width: 850px; + margin: 10px; +} + +/* line 6, ../../../hub/static/css/mod/inline-comment.scss */ +.inline-comments .comment { + margin: 5px 0 !important; + border: 1px solid #CACACA; +} + +/* line 7, ../../../hub/static/css/mod/inline-comment.scss */ +.comment-header { + height: 33px; + padding: 0 10px 0 6px; + border-bottom: 1px solid #CCC; + background: #F8F8F8; + font-size: 12px; + background-image: -webkit-linear-gradient(top, #F4FAF6, #D8E5DD); +} + +/* line 8, ../../../hub/static/css/mod/inline-comment.scss */ +.comment-header .comment-header-gravatar { + display: inline-block; + margin-right: 3px; + vertical-align: middle; + border-radius: 3px; +} + +/* line 9, ../../../hub/static/css/mod/inline-comment.scss */ +.comment-header .comment-header-author { + display: inline-block; + max-width: 600px; + height: 33px; + line-height: 33px; + font-weight: bold; + color: #222; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.7); + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/inline-comment.scss */ +.comment-header .comment-header-right { + float: right; +} + +/* line 11, ../../../hub/static/css/mod/inline-comment.scss */ +.comment-header .comment-header-date { + display: inline-block; + margin: 0; + height: 33px; + font-size: 11px; + ine-height: 33px; + font-style: normal; + color: #777; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.7); + line-height: 33px; +} + +/* line 12, ../../../hub/static/css/mod/inline-comment.scss */ +.mini-icon-delete-note::before, .mini-icon-remove-close::before { + content: ""; +} + +/* line 13, ../../../hub/static/css/mod/inline-comment.scss */ +.mini-icon-edit:before { + content: ""; +} + +/* line 14, ../../../hub/static/css/mod/inline-comment.scss */ +.comment-header .comment-header-actions { + display: inline-block; + vertical-align: middle; + font-size: 13px; + margin-left: 7px; +} + +/* line 15, ../../../hub/static/css/mod/inline-comment.scss */ +.comment-header .mini-icon { + color: #939AA0; + margin: 0 2px 0 1px; + position: relative; + top: 2px; +} + +/* line 16, ../../../hub/static/css/mod/inline-comment.scss */ +.comment-header .comment-header-actions li .mini-icon { + -moz-transition: all 0.15s ease-in 0; + -webkit-transition: all 0.15s ease-in 0; + text-decoration: none; +} + +/* line 17, ../../../hub/static/css/mod/inline-comment.scss */ +.comment-header .comment-header-date { + color: #939AA0; + text-decoration: none; +} + +/* line 18, ../../../hub/static/css/mod/inline-comment.scss */ +.comment-content { + padding: 0; + color: #333; + font-size: 12px; + background: #FBFBFB; +} + +/* line 19, ../../../hub/static/css/mod/inline-comment.scss */ +.comment-content .comment-body { + padding: 10px; + font-size: 13px; + overflow: auto; + width: 100%; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +/* line 20, ../../../hub/static/css/mod/inline-comment.scss */ +.comment-header .comment-header-actions li { + list-style-type: none; + float: left; + margin: 0 0 0 8px; +} + +/* preview comment form style */ +/* line 2, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav { + margin: 10px 0; + border-bottom: 1px solid #DDD; + height: 35px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs { + display: inline-block; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs > li { + display: inline-block; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab { + display: inline-block; + margin-bottom: -1px; + padding: 8px 12px 9px; + border: 1px solid transparent; + border-bottom: 0; + font-size: 14px; + color: #666; + text-decoration: none; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab.selected { + border-color: #DDD; + border-radius: 3px 3px 0 0; + background-color: white; + color: #333; + font-weight: bold; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab:hover { + text-decoration: none; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav { + position: relative; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav ul.tabnav-tabs { + padding-left: 10px; +} + +/* line 10, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 0 10px 10px; +} + +/* line 11, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form #preview_bucket .content-body { + padding: 10px; + min-height: 132px; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form.tab-content { + overflow: initial; + position: relative; +} + +/* line 2, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 10px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-actions { + padding: 0; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + position: relative; + border: 3px solid #EEE; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + padding: 0; + background: #EEE; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content .write-content { + padding: 0 10px 10px; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; + margin: 0; +} + +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary, button.primary.classy:disabled, button.primary.classy.disabled, button.primary.classy:disabled:hover, button.primary.classy.disabled:disabled:hover, button.classy:disabled:hover.primary, button.classy.disabled:disabled:hover.primary { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4); + border-color: #74BB5A; + border-bottom-color: #509338; + background: #8ADD6D; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#8add6d', endColorstr='#60b044')"; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); + background-image: -webkit-linear-gradient(top, #8ADD6D, #60B044); +} + +/* line 2, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary.disabled { + opacity: 0.5; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy, +button.classy:disabled, +button.classy.disabled, +a.button.classy:disabled, +a.button.classy.disabled, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover:disabled, +a.button.classy.disabled:hover, +a.button.classy, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy:disabled:hover, +a.button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover { + display: inline-block; + padding: 8px 15px; + line-height: normal; + position: relative; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 12px; + font-weight: bold; + color: #666; + text-shadow: 0 1px rgba(255, 255, 255, 0.9); + background: whiteSmoke; + background: -moz-linear-gradient(whiteSmoke, #E5E5E5); + background: -webkit-linear-gradient(whiteSmoke, #E5E5E5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; + border-radius: 3px; + border: 1px solid #DDD; + border-bottom-color: #BBB; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* ================================== *\ + * Zen Form + * ================================== */ +/* line 6, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + position: fixed; + z-index: 99999; + top: 0; + left: 0; + right: 0; + bottom: 0; + padding: 24px 30px 24px 24px; +} + +/* line 16, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-input-wrap { + max-width: 640px; + position: relative; + margin: 0 auto; +} + +/** + * Buttons style + */ +/* line 25, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button, +.zen-forms-theme-switch { + position: absolute; + width: 18px; + height: 18px; + text-align: center; + top: 10px; + right: 10px; + font-size: 24px; + color: #516066; + cursor: pointer; + line-height: 1; +} + +/* line 39, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-theme-switch { + top: 28px; + font-size: 34px; +} + +/* line 44, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button:hover, +.zen-forms-theme-switch:hover { + color: #667981; +} + +/** + * Inputs basic style + */ +/* line 52, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + padding: 8px 0; + width: 100%; + background: none; + border: none; + margin-bottom: 24px; + cursor: pointer; +} + +/* line 62, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus, +.zen-forms textarea:focus { + cursor: text; +} + +/* line 67, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms textarea { + resize: none; +} + +/* line 71, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + cursor: pointer; + display: none; + padding: 8px 3; + position: absolute; + top: 0; + width: 100%; +} + +/* line 80, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms .empty + label { + display: block; +} + +/* line 84, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus + label, +.zen-forms textarea:focus + label { + display: none; +} + +/* line 89, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms :focus { + outline-color: transparent; + outline-style: none; +} + +/** + * Dark theme + */ +/* line 97, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + background: #151a1c; +} + +/* line 101, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + color: #516066; +} + +/* line 105, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + color: #667981; +} + +/** + * Light theme + */ +/* line 113, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme { + background: #fefefe; +} + +/* line 117, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme label { + color: #959697; +} + +/* line 121, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme input, +.zen-forms.light-theme textarea { + color: #707071; +} + +/* line 4, ../../../hub/static/css/mod/zen-forms.scss */ +.write-content .enable-fullscreen { + position: absolute; + top: 5px; + right: 16px; + color: #333333; + opacity: .5; + line-height: 1em; +} + +/* line 5, ../../../hub/static/css/mod/zen-forms.scss */ +.mini-icon-fullscreen::before { + content: ""; +} + +/* line 6, ../../../hub/static/css/mod/zen-forms.scss */ +.fullscreen-overlay textarea, .zen-forms textarea { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + height: 100%; + padding: 20px; + border: 0; + font-size: 21px; + line-height: 1.6em; + resize: none; + -moz-transition: color 0.15s ease-in 0; + -webkit-transition: color 0.15s ease-in 0; + transition: color 0.15s ease-in 0; + box-shadow: none; +} + +/* line 7, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms.light-theme textarea { + background: #fff; + color: #999999; +} + +/* line 8, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms .zen-forms-input-wrap { + width: 100%; + height: 100%; +} + +/* line 9, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms label[for^=zen-forms-input] { + display: none; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-zen.scss */ +.previewable-comment-form .zen-enabled textarea { + padding: 10px 18px 10px 10px; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled { + position: relative; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled .go-zen { + position: absolute; + right: 15px; + top: 5px; +} + +/* line 1, ../../../hub/static/css/mod/loader.scss */ +.loader { + display: none; + position: absolute; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + background-color: #eee; +} + +/* line 2, ../../../hub/static/css/mod/loader.scss */ +.loader .spinner { + display: block; + width: 32px; + height: 32px; + margin: 0 auto; + top: 121px; + position: relative; + background: url(/static/img/spinner.gif) no-repeat; +} + +/* line 1, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view { + position: absolute; + top: 0; + left: 0; + display: none; + margin-top: 18px; + background: white; + border: 1px solid #DDD; + border-radius: 3px; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + min-width: 120px; + z-index: 10; +} + +/* line 15, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur { + background: #3366FF; + color: white; +} + +/* line 19, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur small { + color: white; +} + +/* line 22, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view strong { + color: #3366FF; +} + +/* line 25, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur strong { + color: white; + font: bold; +} + +/* line 29, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul { + /* width: 100px; */ + list-style: none; + padding: 0; + margin: auto; +} + +/* line 35, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul li { + display: block; + padding: 5px 10px; + border-bottom: 1px solid #DDD; + cursor: pointer; + /* border-top: 1px solid #C8C8C8; */ +} + +/* line 42, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view small { + font-size: smaller; + color: #777; + font-weight: normal; +} + +/* line 9, ../../../hub/static/css/mod/comment-form.scss */ +.side-avatar { + margin-left: 0; +} + +/* fix li header for newer version of bootstrap */ +/* line 12, ../../../hub/static/css/mod/comment-form.scss */ +.comment-form-head li { + line-height: 18px; +} + +/* line 16, ../../../hub/static/css/mod/comment-form.scss */ +#new_comment .form-content { + width: 880px; + margin-left: 60px; +} + +/* line 18, ../../../hub/static/css/mod/comment-form.scss */ +.discussion-bubble-avatar { + position: relative; + float: left; + border-radius: 3px; +} + +/* line 19, ../../../hub/static/css/mod/comment-form.scss */ +.discussion-bubble-inner { + min-height: 60px; + border: 1px solid #CACACA; + background-color: white; +} + +/* line 8, ../../../hub/static/css/mod/text-truncate.scss */ +.css-truncate.css-truncate-target, .css-truncate .css-truncate-target { + max-width: 125px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + vertical-align: top; + display: inline-block; +} + +/* line 14, ../../../hub/static/css/mod/text-truncate.scss */ +.css-truncate.expandable:hover .css-truncate-target { + max-width: 10000px !important; +} + +/* line 1, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body { + padding: 30px; +} + +/* line 4, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body > :first-child { + margin-top: 0 !important; +} + +/* line 7, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body h1, +.markdown-body h2, +.markdown-body h3, +.markdown-body h4, +.markdown-body h5, +.markdown-body h6 { + margin: 20px 0 10px; + padding: 0; + font-weight: bold; + -webkit-font-smoothing: antialiased; + cursor: text; + position: relative; +} + +/* line 20, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body h2 { + font-size: 24px; + border-bottom: 1px solid #CCC; + color: black; +} + +/* line 25, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body, +.markdown-body p { + font-size: 14px; + line-height: 1.6; +} + +/* line 30, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body p, +.markdown-body blockquote, +.markdown-body ul, +.markdown-body ol, +.markdown-body dl, +.markdown-body table, +.markdown-body pre { + margin: 15px 0; +} + +/* line 39, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul, +.markdown-body ol { + padding-left: 30px; +} + +/* line 43, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul li { + line-height: 1.6; +} + +/* line 46, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul { + list-style: disc; +} + +/* line 49, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ol { + list-style: decimal; +} + +/* line 52, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table { + width: 100%; +} + +/* line 55, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table caption + thead tr:first-child th, +.markdown-body table caption + thead tr:first-child td, +.markdown-body table colgroup + thead tr:first-child th, +.markdown-body table colgroup + thead tr:first-child td, +.markdown-body table thead:first-child tr:first-child th, +.markdown-body table thead:first-child tr:first-child td { + border-top: 0; +} + +/* line 63, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table thead th { + vertical-align: bottom; +} + +/* line 66, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th { + font-weight: bold; +} + +/* line 69, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th, +.markdown-body table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #ddd; +} + +/* line 77, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th, +.markdown-body table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #ddd; +} + +/* line 85, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table tbody > tr:nth-child(odd) > td, +.markdown-body table tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} + +/* line 89, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body .progress-percentage { + color: #888; +} + +/* line 93, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page { + padding: 0px; +} + +/* line 96, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page h1, +.markdown-page h2, +.markdown-page h3, +.markdown-page h4, +.markdown-page h5, +.markdown-page h6 { + position: static; +} + +/* line 104, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page pre { + font-family: Consolas, 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 14px; +} + +/* line 108, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page .label { + background-color: transparent; +} + +/* line 111, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page dd { + margin-left: 1.5em; +} + +/* line 114, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body code { + white-space: pre-wrap; +} + +/* line 1, ../../../hub/static/css/mod/upload-widget.scss */ +.upload-widget { + position: relative; + top: -50px; + width: 360px; +} +/* line 7, ../../../hub/static/css/mod/upload-widget.scss */ +.upload-widget input { + position: absolute; + width: 120px; + opacity: 0.0001; + cursor: pointer; + margin: 0; +} +/* line 15, ../../../hub/static/css/mod/upload-widget.scss */ +.upload-widget form { + width: 120px; + float: left; +} + +/* line 1, ../../../hub/static/css/mod/quick-emoji.scss */ +.quick-emoji { + margin-right: 10px; +} +/* line 4, ../../../hub/static/css/mod/quick-emoji.scss */ +.quick-emoji .description { + text-align: center; + color: #999; +} +/* line 9, ../../../hub/static/css/mod/quick-emoji.scss */ +.quick-emoji .emojis { + overflow-x: hidden; + overflow-y: scroll; + word-wrap: break-word; + word-break: break-all; + width: 290px; + height: 260px; +} +/* line 17, ../../../hub/static/css/mod/quick-emoji.scss */ +.quick-emoji .emojis a { + display: block; + float: left; + width: 25px; + height: 25px; + padding: 2px; + border: 1px solid white; +} +/* line 24, ../../../hub/static/css/mod/quick-emoji.scss */ +.quick-emoji .emojis a:hover { + background: #eef; + border: 1px solid #aad; +} + +/* line 1, ../../../hub/static/css/mod/checkbox.scss */ +.checkbox-container { + display: inline-block; +} + +/* line 5, ../../../hub/static/css/mod/checkbox.scss */ +.checkbox-container input[type=checkbox] { + vertical-align: middle; +} + +/* line 9, ../../../hub/static/css/mod/checkbox.scss */ +.checkbox-container label { + display: inline; + vertical-align: middle; + padding: 0 0 0 5px; +} + +/* line 15, ../../../hub/static/css/mod/checkbox.scss */ +.checkbox-container label span { + margin: 0 0 0 5px; +} + +/* line 30, ../../../hub/static/css/app/ticket.scss */ +.mini-icon-commit-comment:before { + content: "\f02b"; +} + +/* line 35, ../../../hub/static/css/app/ticket.scss */ +#files .file .meta .info { + max-width: 410px !important; +} +/* line 38, ../../../hub/static/css/app/ticket.scss */ +#files .file .meta .info .patch-title { + padding: 0; + margin: 0; + border: 0; + box-shadow: none; +} diff --git a/dist/css/app/watchers.css b/dist/css/app/watchers.css new file mode 100644 index 0000000..c57d652 --- /dev/null +++ b/dist/css/app/watchers.css @@ -0,0 +1,5514 @@ +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* line 1, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav { + margin-top: 6px; +} + +/* line 3, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label { + position: relative; + display: inline-block; + margin-left: 3px; + padding: 3px 7px; + border: 1px solid #ccc; + border-radius: 3px; + color: #333; + background-color: #fafafa; + vertical-align: middle; +} + +/* line 15, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::before, .metanav .counts-label::after { + content: ""; + position: absolute; + top: 50%; + right: 100%; + display: block; + margin-right: 0px; + margin-top: -6px; + width: 0; + height: 0; + border: 6px solid transparent; + border-right-color: #ccc; +} + +/* line 29, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::after { + margin-right: -1px; + border-right-color: #fafafa; +} + +/* line 5, ../../../hub/static/css/app/watchers.scss */ +.userlist { + padding: 5px; +} + +/* line 9, ../../../hub/static/css/app/watchers.scss */ +.gray { + color: #ccc; + margin-top: 10px; + padding: 5px; +} + +/* line 15, ../../../hub/static/css/app/watchers.scss */ +.userlist .user { + margin-top: 15px; +} + +/* line 19, ../../../hub/static/css/app/watchers.scss */ +.userlist .user img { + width: 32px; + height: 32px; +} + +/* line 24, ../../../hub/static/css/app/watchers.scss */ +.userlist a { + margin-right: 10px; +} diff --git a/dist/css/app/watching.css b/dist/css/app/watching.css new file mode 100644 index 0000000..1cee0e6 --- /dev/null +++ b/dist/css/app/watching.css @@ -0,0 +1,5458 @@ +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} + +/* line 1, ../../../hub/static/css/mod/setting-box.scss */ +.boxed-group { + position: relative; + background: #EFEFEF; + padding: 3px; + border-radius: 3px; + margin: 0 0 15px 0; +} + +/* line 8, ../../../hub/static/css/mod/setting-box.scss */ +.boxed-group > h3 { + background: #FAFAFA; + background: -moz-linear-gradient(#FAFAFA, #E0E0E0); + background: -webkit-linear-gradient(#FAFAFA, #E0E0E0); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#e0e0e0')"; + margin: 0; + border-top-left-radius: 1px; + border-top-right-radius: 1px; + border: 1px solid #D8D8D8; + border-bottom: 1px solid #CCC; + padding: 10px 10px 11px 10px; + font-size: 14px; + text-shadow: 0 1px 0 white; +} + +/* line 22, ../../../hub/static/css/mod/setting-box.scss */ +.boxed-group .boxed-group-inner { + padding: 1px 10px; + background: white; + border: 1px solid #D8D8D8; + border-top: none; + border-bottom-left-radius: 1px; + border-bottom-right-radius: 1px; + color: #666; + font-size: 13px; +} + +/* line 32, ../../../hub/static/css/mod/setting-box.scss */ +.boxed-group.condensed > h3 { + padding: 6px 6px 7px; + font-size: 12px; +} + +/* line 36, ../../../hub/static/css/mod/setting-box.scss */ +.boxed-group.condensed > h3 i { + position: relative; + padding: 0 6px 0 2px; +} + +/* line 40, ../../../hub/static/css/mod/setting-box.scss */ +.boxed-group.condensed .boxed-group-inner { + font-size: 12px; + padding: 0; +} + +/* line 45, ../../../hub/static/css/mod/setting-box.scss */ +.boxed-group-list > li { + display: block; + margin-left: -10px; + width: 100%; + padding: 5px 10px; + line-height: 23px; + border-bottom: 1px solid #E5E5E5; +} + +/* line 4, ../../../hub/static/css/app/watching.scss */ +.settings-content { + width: 60%; +} + +/* line 5, ../../../hub/static/css/app/watching.scss */ +.watch-btn { + display: inline-table; + float: right; +} + +/* line 6, ../../../hub/static/css/app/watching.scss */ +li.inline-list { + clear: both; + margin: 2px 5px; +} diff --git a/dist/css/lib/bootstrap-responsive.css b/dist/css/lib/bootstrap-responsive.css new file mode 100644 index 0000000..895fa67 --- /dev/null +++ b/dist/css/lib/bootstrap-responsive.css @@ -0,0 +1,1067 @@ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} diff --git a/dist/css/lib/jquery.atwho.css b/dist/css/lib/jquery.atwho.css new file mode 100644 index 0000000..d497791 --- /dev/null +++ b/dist/css/lib/jquery.atwho.css @@ -0,0 +1,60 @@ +/* line 1, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view { + position: absolute; + top: 0; + left: 0; + display: none; + margin-top: 18px; + background: white; + border: 1px solid #DDD; + border-radius: 3px; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + min-width: 120px; + z-index: 10; +} + +/* line 15, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur { + background: #3366FF; + color: white; +} + +/* line 19, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur small { + color: white; +} + +/* line 22, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view strong { + color: #3366FF; +} + +/* line 25, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur strong { + color: white; + font: bold; +} + +/* line 29, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul { + /* width: 100px; */ + list-style: none; + padding: 0; + margin: auto; +} + +/* line 35, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul li { + display: block; + padding: 5px 10px; + border-bottom: 1px solid #DDD; + cursor: pointer; + /* border-top: 1px solid #C8C8C8; */ +} + +/* line 42, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view small { + font-size: smaller; + color: #777; + font-weight: normal; +} diff --git a/dist/css/lib/odometer.css b/dist/css/lib/odometer.css new file mode 100644 index 0000000..9414735 --- /dev/null +++ b/dist/css/lib/odometer.css @@ -0,0 +1,117 @@ +/* line 2, ../../../hub/static/css/lib/odometer.scss */ +.odometer.odometer-auto-theme, .odometer.odometer-theme-default { + display: -moz-inline-box; + -moz-box-orient: vertical; + display: inline-block; + vertical-align: middle; + *vertical-align: auto; + position: relative; +} +/* line 10, ../../../hub/static/css/lib/odometer.scss */ +.odometer.odometer-auto-theme, .odometer.odometer-theme-default { + *display: inline; +} +/* line 13, ../../../hub/static/css/lib/odometer.scss */ +.odometer.odometer-auto-theme .odometer-digit, .odometer.odometer-theme-default .odometer-digit { + display: -moz-inline-box; + -moz-box-orient: vertical; + display: inline-block; + vertical-align: middle; + *vertical-align: auto; + position: relative; +} +/* line 21, ../../../hub/static/css/lib/odometer.scss */ +.odometer.odometer-auto-theme .odometer-digit, .odometer.odometer-theme-default .odometer-digit { + *display: inline; +} +/* line 24, ../../../hub/static/css/lib/odometer.scss */ +.odometer.odometer-auto-theme .odometer-digit .odometer-digit-spacer, .odometer.odometer-theme-default .odometer-digit .odometer-digit-spacer { + display: -moz-inline-box; + -moz-box-orient: vertical; + display: inline-block; + vertical-align: middle; + *vertical-align: auto; + visibility: hidden; +} +/* line 32, ../../../hub/static/css/lib/odometer.scss */ +.odometer.odometer-auto-theme .odometer-digit .odometer-digit-spacer, .odometer.odometer-theme-default .odometer-digit .odometer-digit-spacer { + *display: inline; +} +/* line 35, ../../../hub/static/css/lib/odometer.scss */ +.odometer.odometer-auto-theme .odometer-digit .odometer-digit-inner, .odometer.odometer-theme-default .odometer-digit .odometer-digit-inner { + text-align: left; + display: block; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + overflow: hidden; +} +/* line 45, ../../../hub/static/css/lib/odometer.scss */ +.odometer.odometer-auto-theme .odometer-digit .odometer-ribbon, .odometer.odometer-theme-default .odometer-digit .odometer-ribbon { + display: block; +} +/* line 48, ../../../hub/static/css/lib/odometer.scss */ +.odometer.odometer-auto-theme .odometer-digit .odometer-ribbon-inner, .odometer.odometer-theme-default .odometer-digit .odometer-ribbon-inner { + display: block; + -webkit-backface-visibility: hidden; +} +/* line 52, ../../../hub/static/css/lib/odometer.scss */ +.odometer.odometer-auto-theme .odometer-digit .odometer-value, .odometer.odometer-theme-default .odometer-digit .odometer-value { + display: block; + -webkit-transform: translateZ(0); +} +/* line 56, ../../../hub/static/css/lib/odometer.scss */ +.odometer.odometer-auto-theme .odometer-digit .odometer-value.odometer-last-value, .odometer.odometer-theme-default .odometer-digit .odometer-value.odometer-last-value { + position: absolute; +} +/* line 59, ../../../hub/static/css/lib/odometer.scss */ +.odometer.odometer-auto-theme.odometer-animating-up .odometer-ribbon-inner, .odometer.odometer-theme-default.odometer-animating-up .odometer-ribbon-inner { + -webkit-transition: -webkit-transform 2s; + -moz-transition: -moz-transform 2s; + -ms-transition: -ms-transform 2s; + -o-transition: -o-transform 2s; + transition: transform 2s; +} +/* line 66, ../../../hub/static/css/lib/odometer.scss */ +.odometer.odometer-auto-theme.odometer-animating-up.odometer-animating .odometer-ribbon-inner, .odometer.odometer-theme-default.odometer-animating-up.odometer-animating .odometer-ribbon-inner { + -webkit-transform: translateY(-100%); + -moz-transform: translateY(-100%); + -ms-transform: translateY(-100%); + -o-transform: translateY(-100%); + transform: translateY(-100%); +} +/* line 73, ../../../hub/static/css/lib/odometer.scss */ +.odometer.odometer-auto-theme.odometer-animating-down .odometer-ribbon-inner, .odometer.odometer-theme-default.odometer-animating-down .odometer-ribbon-inner { + -webkit-transform: translateY(-100%); + -moz-transform: translateY(-100%); + -ms-transform: translateY(-100%); + -o-transform: translateY(-100%); + transform: translateY(-100%); +} +/* line 80, ../../../hub/static/css/lib/odometer.scss */ +.odometer.odometer-auto-theme.odometer-animating-down.odometer-animating .odometer-ribbon-inner, .odometer.odometer-theme-default.odometer-animating-down.odometer-animating .odometer-ribbon-inner { + -webkit-transition: -webkit-transform 2s; + -moz-transition: -moz-transform 2s; + -ms-transition: -ms-transform 2s; + -o-transition: -o-transform 2s; + transition: transform 2s; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -ms-transform: translateY(0); + -o-transform: translateY(0); + transform: translateY(0); +} +/* line 92, ../../../hub/static/css/lib/odometer.scss */ +.odometer.odometer-auto-theme, .odometer.odometer-theme-default { + line-height: 0.7; + font-size: 52px; + font-family: "HelveticaNeue-CondensedBold","Helvetica Neue","Arial Narrow",Arial,sans-serif; + font-weight: bold; + font-stretch: condensed; +} +/* line 99, ../../../hub/static/css/lib/odometer.scss */ +.odometer.odometer-auto-theme .odometer-value, .odometer.odometer-theme-default .odometer-value { + text-align: center; +} diff --git a/dist/css/lib/tag-it.css b/dist/css/lib/tag-it.css new file mode 100644 index 0000000..ab67455 --- /dev/null +++ b/dist/css/lib/tag-it.css @@ -0,0 +1,57 @@ +/* line 1, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit { + overflow: auto; +} + +/* line 4, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit li { + -moz-border-radius: 5px 5px 5px 5px; + display: block; + float: left; + margin: 2px 5px 2px 0; +} + +/* line 10, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit li.tagit-choice { + background-color: #00a89c; + padding: 2px 4px 3px; + color: #fff; + border-radius: 2px; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; +} + +/* line 19, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit li.tagit-choice:hover { + color: rgba(255, 255, 255, 0.8); + cursor: pointer; +} + +/* line 23, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit li.tagit-new { + padding: 2px 4px 3px; + padding: 2px 4px 1px; + padding: 2px 4px 1px 0; +} + +/* line 29, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit li.tagit-choice input { + display: block; + float: left; + margin: 2px 5px 2px 0; +} + +/* line 34, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit li.tagit-choice a.tag-close { + color: #fff; + cursor: pointer; + font-weight: bold; + padding-left: 3px; + text-decoration: none; + text-shadow: none; +} + +/* line 42, ../../../hub/static/css/lib/tag-it.scss */ +ul.tagit input[type="text"] { + width: 200px; +} diff --git a/dist/css/lib/zen-form.css b/dist/css/lib/zen-form.css new file mode 100644 index 0000000..1a39193 --- /dev/null +++ b/dist/css/lib/zen-form.css @@ -0,0 +1,140 @@ +/* ================================== *\ + * Zen Form + * ================================== */ +/* line 6, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + position: fixed; + z-index: 99999; + top: 0; + left: 0; + right: 0; + bottom: 0; + padding: 24px 30px 24px 24px; +} + +/* line 16, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-input-wrap { + max-width: 640px; + position: relative; + margin: 0 auto; +} + +/** + * Buttons style + */ +/* line 25, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button, +.zen-forms-theme-switch { + position: absolute; + width: 18px; + height: 18px; + text-align: center; + top: 10px; + right: 10px; + font-size: 24px; + color: #516066; + cursor: pointer; + line-height: 1; +} + +/* line 39, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-theme-switch { + top: 28px; + font-size: 34px; +} + +/* line 44, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button:hover, +.zen-forms-theme-switch:hover { + color: #667981; +} + +/** + * Inputs basic style + */ +/* line 52, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + padding: 8px 0; + width: 100%; + background: none; + border: none; + margin-bottom: 24px; + cursor: pointer; +} + +/* line 62, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus, +.zen-forms textarea:focus { + cursor: text; +} + +/* line 67, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms textarea { + resize: none; +} + +/* line 71, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + cursor: pointer; + display: none; + padding: 8px 3; + position: absolute; + top: 0; + width: 100%; +} + +/* line 80, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms .empty + label { + display: block; +} + +/* line 84, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus + label, +.zen-forms textarea:focus + label { + display: none; +} + +/* line 89, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms :focus { + outline-color: transparent; + outline-style: none; +} + +/** + * Dark theme + */ +/* line 97, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + background: #151a1c; +} + +/* line 101, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + color: #516066; +} + +/* line 105, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + color: #667981; +} + +/** + * Light theme + */ +/* line 113, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme { + background: #fefefe; +} + +/* line 117, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme label { + color: #959697; +} + +/* line 121, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme input, +.zen-forms.light-theme textarea { + color: #707071; +} diff --git a/dist/css/mod/checkbox.css b/dist/css/mod/checkbox.css new file mode 100644 index 0000000..209066d --- /dev/null +++ b/dist/css/mod/checkbox.css @@ -0,0 +1,21 @@ +/* line 1, ../../../hub/static/css/mod/checkbox.scss */ +.checkbox-container { + display: inline-block; +} + +/* line 5, ../../../hub/static/css/mod/checkbox.scss */ +.checkbox-container input[type=checkbox] { + vertical-align: middle; +} + +/* line 9, ../../../hub/static/css/mod/checkbox.scss */ +.checkbox-container label { + display: inline; + vertical-align: middle; + padding: 0 0 0 5px; +} + +/* line 15, ../../../hub/static/css/mod/checkbox.scss */ +.checkbox-container label span { + margin: 0 0 0 5px; +} diff --git a/dist/css/mod/code-highlight.css b/dist/css/mod/code-highlight.css new file mode 100644 index 0000000..efa53f4 --- /dev/null +++ b/dist/css/mod/code-highlight.css @@ -0,0 +1,403 @@ +/* Highlight style from pygments */ +/* line 2, ../../../hub/static/css/mod/code-highlight.scss */ +.code .hll { + background-color: #ffffcc; +} + +/* line 3, ../../../hub/static/css/mod/code-highlight.scss */ +.code { + background: #ffffff; +} + +/* line 4, ../../../hub/static/css/mod/code-highlight.scss */ +.code .c { + color: #808080; +} + +/* Comment */ +/* line 5, ../../../hub/static/css/mod/code-highlight.scss */ +.code .err { + color: #F00000; + background-color: #F0A0A0; +} + +/* Error */ +/* line 6, ../../../hub/static/css/mod/code-highlight.scss */ +.code .k { + color: #008000; + font-weight: bold; +} + +/* Keyword */ +/* line 7, ../../../hub/static/css/mod/code-highlight.scss */ +.code .o { + color: #303030; +} + +/* Operator */ +/* line 8, ../../../hub/static/css/mod/code-highlight.scss */ +.code .cm { + color: #808080; +} + +/* Comment.Multiline */ +/* line 9, ../../../hub/static/css/mod/code-highlight.scss */ +.code .cp { + color: #507090; +} + +/* Comment.Preproc */ +/* line 10, ../../../hub/static/css/mod/code-highlight.scss */ +.code .c1 { + color: #808080; +} + +/* Comment.Single */ +/* line 11, ../../../hub/static/css/mod/code-highlight.scss */ +.code .cs { + color: #cc0000; + font-weight: bold; +} + +/* Comment.Special */ +/* line 12, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gd { + color: #A00000; +} + +/* Generic.Deleted */ +/* line 13, ../../../hub/static/css/mod/code-highlight.scss */ +.code .ge { + font-style: italic; +} + +/* Generic.Emph */ +/* line 14, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gr { + color: #FF0000; +} + +/* Generic.Error */ +/* line 15, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gh { + color: #000080; + font-weight: bold; +} + +/* Generic.Heading */ +/* line 16, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gi { + color: #00A000; +} + +/* Generic.Inserted */ +/* line 17, ../../../hub/static/css/mod/code-highlight.scss */ +.code .go { + color: #808080; +} + +/* Generic.Output */ +/* line 18, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gp { + color: #c65d09; + font-weight: bold; +} + +/* Generic.Prompt */ +/* line 19, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gs { + font-weight: bold; +} + +/* Generic.Strong */ +/* line 20, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gu { + color: #800080; + font-weight: bold; +} + +/* Generic.Subheading */ +/* line 21, ../../../hub/static/css/mod/code-highlight.scss */ +.code .gt { + color: #0040D0; +} + +/* Generic.Traceback */ +/* line 22, ../../../hub/static/css/mod/code-highlight.scss */ +.code .kc { + color: #008000; + font-weight: bold; +} + +/* Keyword.Constant */ +/* line 23, ../../../hub/static/css/mod/code-highlight.scss */ +.code .kd { + color: #008000; + font-weight: bold; +} + +/* Keyword.Declaration */ +/* line 24, ../../../hub/static/css/mod/code-highlight.scss */ +.code .kn { + color: #008000; + font-weight: bold; +} + +/* Keyword.Namespace */ +/* line 25, ../../../hub/static/css/mod/code-highlight.scss */ +.code .kp { + color: #003080; + font-weight: bold; +} + +/* Keyword.Pseudo */ +/* line 26, ../../../hub/static/css/mod/code-highlight.scss */ +.code .kr { + color: #008000; + font-weight: bold; +} + +/* Keyword.Reserved */ +/* line 27, ../../../hub/static/css/mod/code-highlight.scss */ +.code .kt { + color: #303090; + font-weight: bold; +} + +/* Keyword.Type */ +/* line 28, ../../../hub/static/css/mod/code-highlight.scss */ +.code .m { + color: #6000E0; + font-weight: bold; +} + +/* Literal.Number */ +/* line 29, ../../../hub/static/css/mod/code-highlight.scss */ +.code .s { + background-color: #fff0f0; +} + +/* Literal.String */ +/* line 30, ../../../hub/static/css/mod/code-highlight.scss */ +.code .na { + color: #0000C0; +} + +/* Name.Attribute */ +/* line 31, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nb { + color: #007020; +} + +/* Name.Builtin */ +/* line 32, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nc { + color: #B00060; + font-weight: bold; +} + +/* Name.Class */ +/* line 33, ../../../hub/static/css/mod/code-highlight.scss */ +.code .no { + color: #003060; + font-weight: bold; +} + +/* Name.Constant */ +/* line 34, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nd { + color: #505050; + font-weight: bold; +} + +/* Name.Decorator */ +/* line 35, ../../../hub/static/css/mod/code-highlight.scss */ +.code .ni { + color: #800000; + font-weight: bold; +} + +/* Name.Entity */ +/* line 36, ../../../hub/static/css/mod/code-highlight.scss */ +.code .ne { + color: #F00000; + font-weight: bold; +} + +/* Name.Exception */ +/* line 37, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nf { + color: #0060B0; + font-weight: bold; +} + +/* Name.Function */ +/* line 38, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nl { + color: #907000; + font-weight: bold; +} + +/* Name.Label */ +/* line 39, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nn { + color: #0e84b5; + font-weight: bold; +} + +/* Name.Namespace */ +/* line 40, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nt { + color: #007000; +} + +/* Name.Tag */ +/* line 41, ../../../hub/static/css/mod/code-highlight.scss */ +.code .nv { + color: #906030; +} + +/* Name.Variable */ +/* line 42, ../../../hub/static/css/mod/code-highlight.scss */ +.code .ow { + color: #000000; + font-weight: bold; +} + +/* Operator.Word */ +/* line 43, ../../../hub/static/css/mod/code-highlight.scss */ +.code .w { + color: #bbbbbb; +} + +/* Text.Whitespace */ +/* line 44, ../../../hub/static/css/mod/code-highlight.scss */ +.code .mf { + color: #6000E0; + font-weight: bold; +} + +/* Literal.Number.Float */ +/* line 45, ../../../hub/static/css/mod/code-highlight.scss */ +.code .mh { + color: #005080; + font-weight: bold; +} + +/* Literal.Number.Hex */ +/* line 46, ../../../hub/static/css/mod/code-highlight.scss */ +.code .mi { + color: #0000D0; + font-weight: bold; +} + +/* Literal.Number.Integer */ +/* line 47, ../../../hub/static/css/mod/code-highlight.scss */ +.code .mo { + color: #4000E0; + font-weight: bold; +} + +/* Literal.Number.Oct */ +/* line 48, ../../../hub/static/css/mod/code-highlight.scss */ +.code .sb { + background-color: #fff0f0; +} + +/* Literal.String.Backtick */ +/* line 49, ../../../hub/static/css/mod/code-highlight.scss */ +.code .sc { + color: #0040D0; +} + +/* Literal.String.Char */ +/* line 50, ../../../hub/static/css/mod/code-highlight.scss */ +.code .sd { + color: #D04020; +} + +/* Literal.String.Doc */ +/* line 51, ../../../hub/static/css/mod/code-highlight.scss */ +.code .s2 { + background-color: #fff0f0; +} + +/* Literal.String.Double */ +/* line 52, ../../../hub/static/css/mod/code-highlight.scss */ +.code .se { + color: #606060; + font-weight: bold; + background-color: #fff0f0; +} + +/* Literal.String.Escape */ +/* line 53, ../../../hub/static/css/mod/code-highlight.scss */ +.code .sh { + background-color: #fff0f0; +} + +/* Literal.String.Heredoc */ +/* line 54, ../../../hub/static/css/mod/code-highlight.scss */ +.code .si { + background-color: #e0e0e0; +} + +/* Literal.String.Interpol */ +/* line 55, ../../../hub/static/css/mod/code-highlight.scss */ +.code .sx { + color: #D02000; + background-color: #fff0f0; +} + +/* Literal.String.Other */ +/* line 56, ../../../hub/static/css/mod/code-highlight.scss */ +.code .sr { + color: #000000; + background-color: #fff0ff; +} + +/* Literal.String.Regex */ +/* line 57, ../../../hub/static/css/mod/code-highlight.scss */ +.code .s1 { + background-color: #fff0f0; +} + +/* Literal.String.Single */ +/* line 58, ../../../hub/static/css/mod/code-highlight.scss */ +.code .ss { + color: #A06000; +} + +/* Literal.String.Symbol */ +/* line 59, ../../../hub/static/css/mod/code-highlight.scss */ +.code .bp { + color: #007020; +} + +/* Name.Builtin.Pseudo */ +/* line 60, ../../../hub/static/css/mod/code-highlight.scss */ +.code .vc { + color: #306090; +} + +/* Name.Variable.Class */ +/* line 61, ../../../hub/static/css/mod/code-highlight.scss */ +.code .vg { + color: #d07000; + font-weight: bold; +} + +/* Name.Variable.Global */ +/* line 62, ../../../hub/static/css/mod/code-highlight.scss */ +.code .vi { + color: #3030B0; +} + +/* Name.Variable.Instance */ +/* line 63, ../../../hub/static/css/mod/code-highlight.scss */ +.code .il { + color: #0000D0; + font-weight: bold; +} + +/* Literal.Number.Integer.Long */ diff --git a/dist/css/mod/colorcube.css b/dist/css/mod/colorcube.css new file mode 100644 index 0000000..6a675e9 --- /dev/null +++ b/dist/css/mod/colorcube.css @@ -0,0 +1,22 @@ +/* line 1, ../../../hub/static/css/mod/colorcube.scss */ +.colorcube { + position: absolute; + width: 30px; + height: 30px; + border: 1px solid #DDD; +} + +/* line 2, ../../../hub/static/css/mod/colorcube.scss */ +.colorcube::before { + content: ""; + display: block; + height: 0; + width: 0; + border: 5px solid #DDD; + border-width: 5px; + border-color: #DDD transparent transparent transparent; + left: 10px; + top: 30px; + float: left; + position: absolute; +} diff --git a/dist/css/mod/comment-form-button.css b/dist/css/mod/comment-form-button.css new file mode 100644 index 0000000..5e2a55f --- /dev/null +++ b/dist/css/mod/comment-form-button.css @@ -0,0 +1,58 @@ +/* line 1, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary, button.primary.classy:disabled, button.primary.classy.disabled, button.primary.classy:disabled:hover, button.primary.classy.disabled:disabled:hover, button.classy:disabled:hover.primary, button.classy.disabled:disabled:hover.primary { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4); + border-color: #74BB5A; + border-bottom-color: #509338; + background: #8ADD6D; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#8add6d', endColorstr='#60b044')"; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); + background-image: -webkit-linear-gradient(top, #8ADD6D, #60B044); +} + +/* line 2, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary.disabled { + opacity: 0.5; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy, +button.classy:disabled, +button.classy.disabled, +a.button.classy:disabled, +a.button.classy.disabled, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover:disabled, +a.button.classy.disabled:hover, +a.button.classy, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy:disabled:hover, +a.button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover { + display: inline-block; + padding: 8px 15px; + line-height: normal; + position: relative; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 12px; + font-weight: bold; + color: #666; + text-shadow: 0 1px rgba(255, 255, 255, 0.9); + background: whiteSmoke; + background: -moz-linear-gradient(whiteSmoke, #E5E5E5); + background: -webkit-linear-gradient(whiteSmoke, #E5E5E5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; + border-radius: 3px; + border: 1px solid #DDD; + border-bottom-color: #BBB; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} diff --git a/dist/css/mod/comment-form-content.css b/dist/css/mod/comment-form-content.css new file mode 100644 index 0000000..8698d76 --- /dev/null +++ b/dist/css/mod/comment-form-content.css @@ -0,0 +1,63 @@ +/* line 1, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form.tab-content { + overflow: initial; + position: relative; +} + +/* line 2, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 10px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-actions { + padding: 0; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + position: relative; + border: 3px solid #EEE; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + padding: 0; + background: #EEE; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content .write-content { + padding: 0 10px 10px; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; + margin: 0; +} diff --git a/dist/css/mod/comment-form-preview.css b/dist/css/mod/comment-form-preview.css new file mode 100644 index 0000000..d7a599c --- /dev/null +++ b/dist/css/mod/comment-form-preview.css @@ -0,0 +1,64 @@ +/* preview comment form style */ +/* line 2, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav { + margin: 10px 0; + border-bottom: 1px solid #DDD; + height: 35px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs { + display: inline-block; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs > li { + display: inline-block; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab { + display: inline-block; + margin-bottom: -1px; + padding: 8px 12px 9px; + border: 1px solid transparent; + border-bottom: 0; + font-size: 14px; + color: #666; + text-decoration: none; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab.selected { + border-color: #DDD; + border-radius: 3px 3px 0 0; + background-color: white; + color: #333; + font-weight: bold; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab:hover { + text-decoration: none; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav { + position: relative; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav ul.tabnav-tabs { + padding-left: 10px; +} + +/* line 10, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 0 10px 10px; +} + +/* line 11, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form #preview_bucket .content-body { + padding: 10px; + min-height: 132px; +} diff --git a/dist/css/mod/comment-form-zen.css b/dist/css/mod/comment-form-zen.css new file mode 100644 index 0000000..d7b22d4 --- /dev/null +++ b/dist/css/mod/comment-form-zen.css @@ -0,0 +1,208 @@ +@charset "UTF-8"; +/* ================================== *\ + * Zen Form + * ================================== */ +/* line 6, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + position: fixed; + z-index: 99999; + top: 0; + left: 0; + right: 0; + bottom: 0; + padding: 24px 30px 24px 24px; +} + +/* line 16, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-input-wrap { + max-width: 640px; + position: relative; + margin: 0 auto; +} + +/** + * Buttons style + */ +/* line 25, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button, +.zen-forms-theme-switch { + position: absolute; + width: 18px; + height: 18px; + text-align: center; + top: 10px; + right: 10px; + font-size: 24px; + color: #516066; + cursor: pointer; + line-height: 1; +} + +/* line 39, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-theme-switch { + top: 28px; + font-size: 34px; +} + +/* line 44, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button:hover, +.zen-forms-theme-switch:hover { + color: #667981; +} + +/** + * Inputs basic style + */ +/* line 52, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + padding: 8px 0; + width: 100%; + background: none; + border: none; + margin-bottom: 24px; + cursor: pointer; +} + +/* line 62, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus, +.zen-forms textarea:focus { + cursor: text; +} + +/* line 67, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms textarea { + resize: none; +} + +/* line 71, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + cursor: pointer; + display: none; + padding: 8px 3; + position: absolute; + top: 0; + width: 100%; +} + +/* line 80, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms .empty + label { + display: block; +} + +/* line 84, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus + label, +.zen-forms textarea:focus + label { + display: none; +} + +/* line 89, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms :focus { + outline-color: transparent; + outline-style: none; +} + +/** + * Dark theme + */ +/* line 97, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + background: #151a1c; +} + +/* line 101, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + color: #516066; +} + +/* line 105, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + color: #667981; +} + +/** + * Light theme + */ +/* line 113, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme { + background: #fefefe; +} + +/* line 117, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme label { + color: #959697; +} + +/* line 121, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme input, +.zen-forms.light-theme textarea { + color: #707071; +} + +/* line 4, ../../../hub/static/css/mod/zen-forms.scss */ +.write-content .enable-fullscreen { + position: absolute; + top: 5px; + right: 16px; + color: #333333; + opacity: .5; + line-height: 1em; +} + +/* line 5, ../../../hub/static/css/mod/zen-forms.scss */ +.mini-icon-fullscreen::before { + content: ""; +} + +/* line 6, ../../../hub/static/css/mod/zen-forms.scss */ +.fullscreen-overlay textarea, .zen-forms textarea { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + height: 100%; + padding: 20px; + border: 0; + font-size: 21px; + line-height: 1.6em; + resize: none; + -moz-transition: color 0.15s ease-in 0; + -webkit-transition: color 0.15s ease-in 0; + transition: color 0.15s ease-in 0; + box-shadow: none; +} + +/* line 7, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms.light-theme textarea { + background: #fff; + color: #999999; +} + +/* line 8, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms .zen-forms-input-wrap { + width: 100%; + height: 100%; +} + +/* line 9, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms label[for^=zen-forms-input] { + display: none; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-zen.scss */ +.previewable-comment-form .zen-enabled textarea { + padding: 10px 18px 10px 10px; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled { + position: relative; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled .go-zen { + position: absolute; + right: 15px; + top: 5px; +} diff --git a/dist/css/mod/comment-form.css b/dist/css/mod/comment-form.css new file mode 100644 index 0000000..52e3e3c --- /dev/null +++ b/dist/css/mod/comment-form.css @@ -0,0 +1,581 @@ +@charset "UTF-8"; +/* preview comment form style */ +/* line 2, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav { + margin: 10px 0; + border-bottom: 1px solid #DDD; + height: 35px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs { + display: inline-block; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs > li { + display: inline-block; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab { + display: inline-block; + margin-bottom: -1px; + padding: 8px 12px 9px; + border: 1px solid transparent; + border-bottom: 0; + font-size: 14px; + color: #666; + text-decoration: none; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab.selected { + border-color: #DDD; + border-radius: 3px 3px 0 0; + background-color: white; + color: #333; + font-weight: bold; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab:hover { + text-decoration: none; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav { + position: relative; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav ul.tabnav-tabs { + padding-left: 10px; +} + +/* line 10, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 0 10px 10px; +} + +/* line 11, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form #preview_bucket .content-body { + padding: 10px; + min-height: 132px; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form.tab-content { + overflow: initial; + position: relative; +} + +/* line 2, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 10px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-actions { + padding: 0; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + position: relative; + border: 3px solid #EEE; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + padding: 0; + background: #EEE; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content .write-content { + padding: 0 10px 10px; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; + margin: 0; +} + +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary, button.primary.classy:disabled, button.primary.classy.disabled, button.primary.classy:disabled:hover, button.primary.classy.disabled:disabled:hover, button.classy:disabled:hover.primary, button.classy.disabled:disabled:hover.primary { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4); + border-color: #74BB5A; + border-bottom-color: #509338; + background: #8ADD6D; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#8add6d', endColorstr='#60b044')"; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); + background-image: -webkit-linear-gradient(top, #8ADD6D, #60B044); +} + +/* line 2, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary.disabled { + opacity: 0.5; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy, +button.classy:disabled, +button.classy.disabled, +a.button.classy:disabled, +a.button.classy.disabled, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover:disabled, +a.button.classy.disabled:hover, +a.button.classy, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy:disabled:hover, +a.button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover { + display: inline-block; + padding: 8px 15px; + line-height: normal; + position: relative; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 12px; + font-weight: bold; + color: #666; + text-shadow: 0 1px rgba(255, 255, 255, 0.9); + background: whiteSmoke; + background: -moz-linear-gradient(whiteSmoke, #E5E5E5); + background: -webkit-linear-gradient(whiteSmoke, #E5E5E5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; + border-radius: 3px; + border: 1px solid #DDD; + border-bottom-color: #BBB; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* ================================== *\ + * Zen Form + * ================================== */ +/* line 6, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + position: fixed; + z-index: 99999; + top: 0; + left: 0; + right: 0; + bottom: 0; + padding: 24px 30px 24px 24px; +} + +/* line 16, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-input-wrap { + max-width: 640px; + position: relative; + margin: 0 auto; +} + +/** + * Buttons style + */ +/* line 25, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button, +.zen-forms-theme-switch { + position: absolute; + width: 18px; + height: 18px; + text-align: center; + top: 10px; + right: 10px; + font-size: 24px; + color: #516066; + cursor: pointer; + line-height: 1; +} + +/* line 39, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-theme-switch { + top: 28px; + font-size: 34px; +} + +/* line 44, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button:hover, +.zen-forms-theme-switch:hover { + color: #667981; +} + +/** + * Inputs basic style + */ +/* line 52, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + padding: 8px 0; + width: 100%; + background: none; + border: none; + margin-bottom: 24px; + cursor: pointer; +} + +/* line 62, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus, +.zen-forms textarea:focus { + cursor: text; +} + +/* line 67, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms textarea { + resize: none; +} + +/* line 71, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + cursor: pointer; + display: none; + padding: 8px 3; + position: absolute; + top: 0; + width: 100%; +} + +/* line 80, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms .empty + label { + display: block; +} + +/* line 84, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus + label, +.zen-forms textarea:focus + label { + display: none; +} + +/* line 89, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms :focus { + outline-color: transparent; + outline-style: none; +} + +/** + * Dark theme + */ +/* line 97, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + background: #151a1c; +} + +/* line 101, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + color: #516066; +} + +/* line 105, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + color: #667981; +} + +/** + * Light theme + */ +/* line 113, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme { + background: #fefefe; +} + +/* line 117, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme label { + color: #959697; +} + +/* line 121, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme input, +.zen-forms.light-theme textarea { + color: #707071; +} + +/* line 4, ../../../hub/static/css/mod/zen-forms.scss */ +.write-content .enable-fullscreen { + position: absolute; + top: 5px; + right: 16px; + color: #333333; + opacity: .5; + line-height: 1em; +} + +/* line 5, ../../../hub/static/css/mod/zen-forms.scss */ +.mini-icon-fullscreen::before { + content: ""; +} + +/* line 6, ../../../hub/static/css/mod/zen-forms.scss */ +.fullscreen-overlay textarea, .zen-forms textarea { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + height: 100%; + padding: 20px; + border: 0; + font-size: 21px; + line-height: 1.6em; + resize: none; + -moz-transition: color 0.15s ease-in 0; + -webkit-transition: color 0.15s ease-in 0; + transition: color 0.15s ease-in 0; + box-shadow: none; +} + +/* line 7, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms.light-theme textarea { + background: #fff; + color: #999999; +} + +/* line 8, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms .zen-forms-input-wrap { + width: 100%; + height: 100%; +} + +/* line 9, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms label[for^=zen-forms-input] { + display: none; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-zen.scss */ +.previewable-comment-form .zen-enabled textarea { + padding: 10px 18px 10px 10px; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled { + position: relative; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled .go-zen { + position: absolute; + right: 15px; + top: 5px; +} + +/* line 1, ../../../hub/static/css/mod/loader.scss */ +.loader { + display: none; + position: absolute; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + background-color: #eee; +} + +/* line 2, ../../../hub/static/css/mod/loader.scss */ +.loader .spinner { + display: block; + width: 32px; + height: 32px; + margin: 0 auto; + top: 121px; + position: relative; + background: url(/static/img/spinner.gif) no-repeat; +} + +/* line 1, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view { + position: absolute; + top: 0; + left: 0; + display: none; + margin-top: 18px; + background: white; + border: 1px solid #DDD; + border-radius: 3px; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + min-width: 120px; + z-index: 10; +} + +/* line 15, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur { + background: #3366FF; + color: white; +} + +/* line 19, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur small { + color: white; +} + +/* line 22, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view strong { + color: #3366FF; +} + +/* line 25, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur strong { + color: white; + font: bold; +} + +/* line 29, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul { + /* width: 100px; */ + list-style: none; + padding: 0; + margin: auto; +} + +/* line 35, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul li { + display: block; + padding: 5px 10px; + border-bottom: 1px solid #DDD; + cursor: pointer; + /* border-top: 1px solid #C8C8C8; */ +} + +/* line 42, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view small { + font-size: smaller; + color: #777; + font-weight: normal; +} + +/* line 9, ../../../hub/static/css/mod/comment-form.scss */ +.side-avatar { + margin-left: 0; +} + +/* fix li header for newer version of bootstrap */ +/* line 12, ../../../hub/static/css/mod/comment-form.scss */ +.comment-form-head li { + line-height: 18px; +} + +/* line 16, ../../../hub/static/css/mod/comment-form.scss */ +#new_comment .form-content { + width: 880px; + margin-left: 60px; +} + +/* line 18, ../../../hub/static/css/mod/comment-form.scss */ +.discussion-bubble-avatar { + position: relative; + float: left; + border-radius: 3px; +} + +/* line 19, ../../../hub/static/css/mod/comment-form.scss */ +.discussion-bubble-inner { + min-height: 60px; + border: 1px solid #CACACA; + background-color: white; +} diff --git a/dist/css/mod/comment.css b/dist/css/mod/comment.css new file mode 100644 index 0000000..68ee708 --- /dev/null +++ b/dist/css/mod/comment.css @@ -0,0 +1,75 @@ +/* line 2, ../../../hub/static/css/mod/comment.scss */ +.full-comment .comment-row { + padding: 0; + background: #FBFBFB; + margin-bottom: 20px; + border-radius: 3px; + border: 3px solid #eee; +} + +/* line 9, ../../../hub/static/css/mod/comment.scss */ +.full-comment .comment-row:before { + position: relative; + content: ""; + display: block; + height: 0; + width: 0; + border: 10px solid #EEE; + border-width: 10px 10px 10px 0; + border-color: transparent #EEE transparent transparent; + left: -12px; + top: 15px; + float: left; +} + +/* line 22, ../../../hub/static/css/mod/comment.scss */ +.full-comment .side-avatar { + position: relative; + float: left; + border-radius: 3px; + margin-left: -70px; +} + +/* line 28, ../../../hub/static/css/mod/comment.scss */ +.full-comment { + width: 63em; + max-width: 100%; + margin-left: auto; +} + +/* line 33, ../../../hub/static/css/mod/comment.scss */ +.full-comment .comment-header { + height: 23px; + color: #333; + margin: 0; + font-size: 12px; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.7); + white-space: nowrap; + text-overflow: ellipsis; + padding: 3px 10px 0 6px; + border-bottom: 1px solid #CCC; + background: -webkit-linear-gradient(#f8fbfc, #dde8eb); + background-image: linear-gradient(#f8f8f8, #e1e1e1); +} + +/* line 46, ../../../hub/static/css/mod/comment.scss */ +#new_comment .form-content { + width: auto; + position: relative; + border: 3px solid #EEE; +} + +/* line 51, ../../../hub/static/css/mod/comment.scss */ +.form-content:before { + content: ""; + display: block; + height: 0; + width: 0; + border: 10px solid #EEE; + border-width: 10px 10px 10px 0; + border-color: transparent #EEE transparent transparent; + left: -12px; + top: 15px; + float: left; + position: absolute; +} diff --git a/dist/css/mod/commits-condensed.css b/dist/css/mod/commits-condensed.css new file mode 100644 index 0000000..c671d66 --- /dev/null +++ b/dist/css/mod/commits-condensed.css @@ -0,0 +1,222 @@ +/* line 1, ../../../hub/static/css/mod/commits-condensed.scss */ +table.commits { + width: 100%; + margin-top: 10px; +} + +/* line 6, ../../../hub/static/css/mod/commits-condensed.scss */ +.boxed-group { + position: relative; + background: #EFEFEF; + padding: 3px; + border-radius: 3px; + margin: 0 0 15px 0; +} + +/* line 13, ../../../hub/static/css/mod/commits-condensed.scss */ +.boxed-group > h3 { + background: #FAFAFA; + background: -moz-linear-gradient(#FAFAFA, #E0E0E0); + background: -webkit-linear-gradient(#FAFAFA, #E0E0E0); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#e0e0e0')"; + margin: 0; + border-top-left-radius: 1px; + border-top-right-radius: 1px; + border: 1px solid #D8D8D8; + border-bottom: 1px solid #CCC; + padding: 10px 10px 11px 10px; + font-size: 14px; + text-shadow: 0 1px 0 white; +} + +/* line 27, ../../../hub/static/css/mod/commits-condensed.scss */ +.boxed-group .boxed-group-inner { + padding: 1px 10px; + background: white; + border: 1px solid #D8D8D8; + border-top: none; + border-bottom-left-radius: 1px; + border-bottom-right-radius: 1px; + color: #666; + font-size: 13px; +} + +/* line 37, ../../../hub/static/css/mod/commits-condensed.scss */ +.boxed-group.condensed > h3 { + padding: 6px 6px 7px; + font-size: 12px; +} + +/* line 41, ../../../hub/static/css/mod/commits-condensed.scss */ +.boxed-group.condensed > h3 i { + position: relative; + padding: 0 6px 0 2px; +} + +/* line 45, ../../../hub/static/css/mod/commits-condensed.scss */ +.boxed-group.condensed .boxed-group-inner { + font-size: 12px; + padding: 0; +} + +/* line 50, ../../../hub/static/css/mod/commits-condensed.scss */ +.boxed-group-list > li { + display: block; + margin-left: -10px; + width: 100%; + padding: 5px 10px; + line-height: 23px; + border-bottom: 1px solid #E5E5E5; +} + +/* line 59, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed { + margin-top: 0; + border: none; + background-color: white; +} + +/* line 64, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td { + padding: 4px; + vertical-align: top; + border-top: 1px solid #E2EAEE; +} + +/* line 69, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td.gravatar { + width: 29px; + padding: 5px; +} + +/* line 74, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed tr:first-child td { + border-top: 0; +} + +/* line 77, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed tr:nth-child(2n) td { + background: #F7FBFC; +} + +/* line 80, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed span.gravatar { + display: block; + width: 16px; + height: 16px; + line-height: 1px; + padding: 1px; + border: 1px solid #DDD; + background: white; +} + +/* line 89, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed span.gravatar a { + display: inline-block; +} + +/* line 92, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td.author { + padding-left: 0; + color: #666; + width: 100px; + font-weight: bold; +} + +/* line 98, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td.author span.commit-author { + display: inline-block; + width: 100px; + text-overflow: ellipsis; + overflow: hidden; + line-height: 22px; +} + +/* line 105, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td.author a { + color: #333; +} + +/* line 108, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td.message { + padding-left: 0; +} + +/* line 111, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed code { + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + background: inherit; +} + +/* line 115, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td.message code { + line-height: 22px; +} + +/* line 118, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td.message a { + color: #333; +} + +/* line 121, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed .commit-desc pre { + margin-top: 5px; + margin-bottom: 4px; + border-left: 1px solid #E5E5E5; + padding-left: 8px; + font-size: 11px; + font-weight: normal; + color: #596063; +} + +/* line 130, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td.commit-meta { + width: 1%; + text-align: right; + white-space: nowrap; + padding-right: 10px; +} + +/* line 136, ../../../hub/static/css/mod/commits-condensed.scss */ +.commits-condensed td.commit-meta code { + line-height: 22px; +} + +/* following style for new-pull 'xxx add commits' commits-condense style */ +/* line 142, ../../../hub/static/css/mod/commits-condensed.scss */ +table.commits { + width: 100%; + margin: 0; + font-size: 12px; +} + +/* line 147, ../../../hub/static/css/mod/commits-condensed.scss */ +table.commits .commit { + width: 59px; + padding-right: 10px; +} + +/* line 151, ../../../hub/static/css/mod/commits-condensed.scss */ +table.commits code { + border: none; +} + +/* line 154, ../../../hub/static/css/mod/commits-condensed.scss */ +table.commits td.message { + /* width: 70%;*/ +} + +/* line 157, ../../../hub/static/css/mod/commits-condensed.scss */ +table.commits td.date { + text-align: right; +} + +/* line 161, ../../../hub/static/css/mod/commits-condensed.scss */ +table.commits-condensed code { + white-space: normal; +} + +/* line 164, ../../../hub/static/css/mod/commits-condensed.scss */ +table.commits-condensed pre { + white-space: pre-wrap; +} diff --git a/dist/css/mod/commits.css b/dist/css/mod/commits.css new file mode 100644 index 0000000..059c6cf --- /dev/null +++ b/dist/css/mod/commits.css @@ -0,0 +1,1457 @@ +@charset "UTF-8"; +/* For other page that still depends on commits.scss */ +/* preview comment form style */ +/* line 2, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav { + margin: 10px 0; + border-bottom: 1px solid #DDD; + height: 35px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs { + display: inline-block; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs > li { + display: inline-block; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab { + display: inline-block; + margin-bottom: -1px; + padding: 8px 12px 9px; + border: 1px solid transparent; + border-bottom: 0; + font-size: 14px; + color: #666; + text-decoration: none; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab.selected { + border-color: #DDD; + border-radius: 3px 3px 0 0; + background-color: white; + color: #333; + font-weight: bold; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab:hover { + text-decoration: none; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav { + position: relative; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav ul.tabnav-tabs { + padding-left: 10px; +} + +/* line 10, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 0 10px 10px; +} + +/* line 11, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form #preview_bucket .content-body { + padding: 10px; + min-height: 132px; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form.tab-content { + overflow: initial; + position: relative; +} + +/* line 2, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 10px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-actions { + padding: 0; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + position: relative; + border: 3px solid #EEE; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + padding: 0; + background: #EEE; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content .write-content { + padding: 0 10px 10px; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; + margin: 0; +} + +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary, button.primary.classy:disabled, button.primary.classy.disabled, button.primary.classy:disabled:hover, button.primary.classy.disabled:disabled:hover, button.classy:disabled:hover.primary, button.classy.disabled:disabled:hover.primary { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4); + border-color: #74BB5A; + border-bottom-color: #509338; + background: #8ADD6D; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#8add6d', endColorstr='#60b044')"; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); + background-image: -webkit-linear-gradient(top, #8ADD6D, #60B044); +} + +/* line 2, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary.disabled { + opacity: 0.5; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy, +button.classy:disabled, +button.classy.disabled, +a.button.classy:disabled, +a.button.classy.disabled, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover:disabled, +a.button.classy.disabled:hover, +a.button.classy, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy:disabled:hover, +a.button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover { + display: inline-block; + padding: 8px 15px; + line-height: normal; + position: relative; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 12px; + font-weight: bold; + color: #666; + text-shadow: 0 1px rgba(255, 255, 255, 0.9); + background: whiteSmoke; + background: -moz-linear-gradient(whiteSmoke, #E5E5E5); + background: -webkit-linear-gradient(whiteSmoke, #E5E5E5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; + border-radius: 3px; + border: 1px solid #DDD; + border-bottom-color: #BBB; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* ================================== *\ + * Zen Form + * ================================== */ +/* line 6, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + position: fixed; + z-index: 99999; + top: 0; + left: 0; + right: 0; + bottom: 0; + padding: 24px 30px 24px 24px; +} + +/* line 16, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-input-wrap { + max-width: 640px; + position: relative; + margin: 0 auto; +} + +/** + * Buttons style + */ +/* line 25, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button, +.zen-forms-theme-switch { + position: absolute; + width: 18px; + height: 18px; + text-align: center; + top: 10px; + right: 10px; + font-size: 24px; + color: #516066; + cursor: pointer; + line-height: 1; +} + +/* line 39, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-theme-switch { + top: 28px; + font-size: 34px; +} + +/* line 44, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button:hover, +.zen-forms-theme-switch:hover { + color: #667981; +} + +/** + * Inputs basic style + */ +/* line 52, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + padding: 8px 0; + width: 100%; + background: none; + border: none; + margin-bottom: 24px; + cursor: pointer; +} + +/* line 62, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus, +.zen-forms textarea:focus { + cursor: text; +} + +/* line 67, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms textarea { + resize: none; +} + +/* line 71, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + cursor: pointer; + display: none; + padding: 8px 3; + position: absolute; + top: 0; + width: 100%; +} + +/* line 80, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms .empty + label { + display: block; +} + +/* line 84, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus + label, +.zen-forms textarea:focus + label { + display: none; +} + +/* line 89, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms :focus { + outline-color: transparent; + outline-style: none; +} + +/** + * Dark theme + */ +/* line 97, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + background: #151a1c; +} + +/* line 101, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + color: #516066; +} + +/* line 105, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + color: #667981; +} + +/** + * Light theme + */ +/* line 113, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme { + background: #fefefe; +} + +/* line 117, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme label { + color: #959697; +} + +/* line 121, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme input, +.zen-forms.light-theme textarea { + color: #707071; +} + +/* line 4, ../../../hub/static/css/mod/zen-forms.scss */ +.write-content .enable-fullscreen { + position: absolute; + top: 5px; + right: 16px; + color: #333333; + opacity: .5; + line-height: 1em; +} + +/* line 5, ../../../hub/static/css/mod/zen-forms.scss */ +.mini-icon-fullscreen::before { + content: ""; +} + +/* line 6, ../../../hub/static/css/mod/zen-forms.scss */ +.fullscreen-overlay textarea, .zen-forms textarea { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + height: 100%; + padding: 20px; + border: 0; + font-size: 21px; + line-height: 1.6em; + resize: none; + -moz-transition: color 0.15s ease-in 0; + -webkit-transition: color 0.15s ease-in 0; + transition: color 0.15s ease-in 0; + box-shadow: none; +} + +/* line 7, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms.light-theme textarea { + background: #fff; + color: #999999; +} + +/* line 8, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms .zen-forms-input-wrap { + width: 100%; + height: 100%; +} + +/* line 9, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms label[for^=zen-forms-input] { + display: none; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-zen.scss */ +.previewable-comment-form .zen-enabled textarea { + padding: 10px 18px 10px 10px; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled { + position: relative; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled .go-zen { + position: absolute; + right: 15px; + top: 5px; +} + +/* line 1, ../../../hub/static/css/mod/loader.scss */ +.loader { + display: none; + position: absolute; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + background-color: #eee; +} + +/* line 2, ../../../hub/static/css/mod/loader.scss */ +.loader .spinner { + display: block; + width: 32px; + height: 32px; + margin: 0 auto; + top: 121px; + position: relative; + background: url(/static/img/spinner.gif) no-repeat; +} + +/* line 1, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view { + position: absolute; + top: 0; + left: 0; + display: none; + margin-top: 18px; + background: white; + border: 1px solid #DDD; + border-radius: 3px; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + min-width: 120px; + z-index: 10; +} + +/* line 15, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur { + background: #3366FF; + color: white; +} + +/* line 19, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur small { + color: white; +} + +/* line 22, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view strong { + color: #3366FF; +} + +/* line 25, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur strong { + color: white; + font: bold; +} + +/* line 29, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul { + /* width: 100px; */ + list-style: none; + padding: 0; + margin: auto; +} + +/* line 35, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul li { + display: block; + padding: 5px 10px; + border-bottom: 1px solid #DDD; + cursor: pointer; + /* border-top: 1px solid #C8C8C8; */ +} + +/* line 42, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view small { + font-size: smaller; + color: #777; + font-weight: normal; +} + +/* line 9, ../../../hub/static/css/mod/comment-form.scss */ +.side-avatar { + margin-left: 0; +} + +/* fix li header for newer version of bootstrap */ +/* line 12, ../../../hub/static/css/mod/comment-form.scss */ +.comment-form-head li { + line-height: 18px; +} + +/* line 16, ../../../hub/static/css/mod/comment-form.scss */ +#new_comment .form-content { + width: 880px; + margin-left: 60px; +} + +/* line 18, ../../../hub/static/css/mod/comment-form.scss */ +.discussion-bubble-avatar { + position: relative; + float: left; + border-radius: 3px; +} + +/* line 19, ../../../hub/static/css/mod/comment-form.scss */ +.discussion-bubble-inner { + min-height: 60px; + border: 1px solid #CACACA; + background-color: white; +} + +/* line 1, ../../../hub/static/css/mod/diff-stat.scss */ +#toc li { + border-bottom: 1px solid #DDD; + list-style-type: none; + padding: 5px; +} + +/* line 7, ../../../hub/static/css/mod/diff-stat.scss */ +#toc { + margin: 15px 0; +} + +/* line 11, ../../../hub/static/css/mod/diff-stat.scss */ +#toc .diffstat { + float: right; +} + +/* line 14, ../../../hub/static/css/mod/diff-stat.scss */ +#toc .mini-icon-modified { + color: #677A85; +} + +/* line 18, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat { + white-space: nowrap; + text-align: right; + font-family: Helvetica,arial,freesans,clean,sans-serif; + color: #666; + font-weight: bold; + font-size: 11px; +} + +/* line 26, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat a { + text-decoration: none; + color: #666; +} + +/* line 30, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar { + position: relative; + left: -3px; + display: inline-block; + height: 12px; + text-decoration: none; + text-align: left; + color: #EEE; + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + line-height: 1; + -webkit-font-smoothing: antialiased; + font-size: 16px; + letter-spacing: -7px; +} + +/* line 48, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar.diff-added, +span.diffstat .diffstat-bar i.plus { + color: #61C423; + font-style: normal; +} + +/* line 53, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar.diff-added, +span.diffstat .diffstat-bar i.minus { + color: #C52323; + font-style: normal; +} + +/* line 59, ../../../hub/static/css/mod/diff-stat.scss */ +p.explain { + font-size: 12px; + color: #666; + margin: 1em 0; +} + +/* line 65, ../../../hub/static/css/mod/diff-stat.scss */ +p.explain .minibutton { + float: right; + top: -4px; +} + +/* line 3, ../../../hub/static/css/mod/diffs-pane.scss */ +.diff-cutoff { + margin-bottom: -2px; + height: 35px; + line-height: 37px; + font-size: 12px; + font-weight: bold; + color: #000; + text-align: center; + background: url("/static/img/compare_too_big.gif") 0 0 no-repeat; +} + +/* line 5, ../../../hub/static/css/mod/diffs-pane.scss */ +.fullscreen-mode { + overflow: hidden; +} + +/* line 6, ../../../hub/static/css/mod/diffs-pane.scss */ +#fullscreen-stage { + display: none; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + overflow-y: auto; + background: #fff; + z-index: 9999; +} + +/* line 7, ../../../hub/static/css/mod/diffs-pane.scss */ +#files #fullscreen-stage .file { + margin: 0; +} + +/* line 5, ../../../hub/static/css/mod/commits.scss */ +div.container div.raw { + overflow: visible; +} + +/* line 9, ../../../hub/static/css/mod/commits.scss */ +#commits-graph { + position: absolute; + left: -200px; + width: 200px; +} + +/* line 15, ../../../hub/static/css/mod/commits.scss */ +.commits-body { + position: relative; +} + +/* line 19, ../../../hub/static/css/mod/commits.scss */ +h3.commit-group-heading { + margin: 15px 0 0 0; + padding: 5px 8px; + font-size: 13px; + color: #3a505b; + text-shadow: 0 1px white; + background: #e6f1f6; + border: 1px solid #c5d5dd; + border-top-right-radius: 4px; + border-top-left-radius: 4px; +} + +/* line 31, ../../../hub/static/css/mod/commits.scss */ +h3.history { + margin-top: 15px; +} + +/* line 35, ../../../hub/static/css/mod/commits.scss */ +.commit-group { + list-style-type: none; + margin: 15px 0; + background: #f7fbfc; + border: 1px solid #c5d5dd; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +/* line 46, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item { + position: relative; + padding: 8px 8px 8px 52px; + border-top: 1px solid #e2eaee; +} + +/* line 52, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:first-child { + border-top: none; +} + +/* line 56, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:last-child { + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +/* line 61, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:nth-child(2n) { + background: #fff; +} + +/* line 65, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus { + background: #fcfce2; +} + +/* line 69, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gravatar { + float: left; + margin-left: -44px; + border-radius: 4px; +} + +/* line 75, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .commit-title { + margin: 1px 0 1px 0; + font-size: 14px; + font-weight: bold; + color: #333; +} + +/* line 82, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .commit-title a { + color: #333; +} + +/* line 86, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .commit-desc pre { + margin-top: 5px; + margin-bottom: 10px; + font-size: 12px; + color: #596063; + border-left: 1px solid #e5e5e5; + padding-left: 8px; +} + +/* line 95, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship { + font-size: 12px; + color: #888; +} + +/* line 100, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship a { + color: #444; +} + +/* line 104, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship .author-name { + color: #444; +} + +/* line 108, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship .committer { + display: block; + font-size: 11px; +} + +/* line 113, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .authorship .committer .mini-icon { + position: relative; + top: 2px; +} + +/* line 118, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .commit-links { + position: absolute; + top: 7px; + right: 8px; + width: 243px; + text-align: right; +} + +/* line 126, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .mini-icon-clippy { + visibility: hidden; + float: left; + margin-right: 7px; + margin-top: 5px; +} + +/* line 133, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:hover .mini-icon-clippy { + visibility: visible; +} + +/* line 137, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton { + float: right; + height: 18px; + padding: 0 7px; + line-height: 22px; + font-size: 11px; + color: #4e575b; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); + background: #eff6f9; + background: -moz-linear-gradient(#eff6f9, #ddecf3); + background: -webkit-linear-gradient(#eff6f9, #ddecf3); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#eff6f9',endColorstr='#ddecf3')"; + border: 1px solid #cedee5; + border-radius: 3px; + min-width: 70px; + text-align: center; +} + +/* line 155, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton .comment-popover { + color: #91A6B1; + border-right: 1px solid #ddd; + padding-right: 4px; +} + +/* line 161, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton { + color: #5a5b4e; +} + +/* line 165, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item:nth-child(2n+1) .gobutton { + border-color: #d5dcdf; + background: #f2f5f6; + background: -moz-linear-gradient(#f2f5f6, #e3eaed); + background: -webkit-linear-gradient(#f2f5f6, #e3eaed); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f2f5f6',endColorstr='#e3eaed')"; +} + +/* line 173, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton { + border-color: #e7e86d; + background: #f9fac9; + background: -moz-linear-gradient(#f9fac9, #f3f494); + background: -webkit-linear-gradient(#f9fac9, #f3f494); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f9fac9',endColorstr='#f3f494')"; +} + +/* line 181, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton:hover { + text-decoration: none; + border-color: #cedee5; + background: #fbfdfe; + background: -moz-linear-gradient(#fbfdfe, #eaf4f8); + background: -webkit-linear-gradient(#fbfdfe, #eaf4f8); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbfdfe',endColorstr='#eaf4f8')"; +} + +/* line 190, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton > .sha, .commit-group-item.navigation-focus .gobutton:hover > .sha { + display: inline-block; + height: 22px; + margin-right: -3px; +} + +/* line 196, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton > .sha .mini-icon, .commit-group-item.navigation-focus .gobutton:hover > .sha .mini-icon { + position: relative; + top: 2px; + border-radius: 30px; + border: 1px solid #CFDEE5; + background-color: rgba(255, 255, 255, 0.5); + color: #91a6b1; + margin-left: 5px; + width: 16px; +} + +/* line 207, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton > .sha .mini-icon { + border: 1px solid #E7E86D; + color: #c3c45c; +} + +/* line 212, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton.with-comments { + padding-left: 5px; +} + +/* line 216, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton.with-comments .sha, .commit-group-item.navigation-focus .gobutton.with-comments:hover .sha { + padding-left: 8px; + border-left: 1px solid #cfdee5; +} + +/* line 221, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton.with-comments .sha { + border-left-color: #e1e29e; +} + +/* line 225, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton .comment-count, .commit-group-item.navigation-focus .gobutton:hover .comment-count { + float: left; + height: 22px; + padding-right: 9px; + line-height: 24px; + font-weight: bold; + border-right: 1px solid #f6fafc; +} + +/* line 234, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .gobutton .comment-count .mini-icon, .commit-group-item.navigation-focus .gobutton:hover .comment-count .mini-icon { + position: relative; + top: 2px; + color: #91A6B1; +} + +/* line 240, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item.navigation-focus .gobutton .comment-count .mini-icon { + color: #C3C45C; +} + +/* line 244, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .browse-button, .commit-group-item .compare-button { + clear: left; + margin-top: 1px; + font-size: 11px; + font-weight: bold; + text-align: right; + color: #999; +} + +/* line 253, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .browse-button .mini-icon { + position: relative; + top: 2px; +} + +/* line 258, ../../../hub/static/css/mod/commits.scss */ +.commit-group-item .browse-button:hover { + color: #4183C4; + background-position: 100% -95px; +} + +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 400; + src: local("Source Code Pro"), local("SourceCodePro-Regular"), url("/static/css/fonts/SourceCodePro-Regular.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 500; + src: local("Source Code Pro Medium"), local("SourceCodePro-Medium"), url("/static/css/fonts/SourceCodePro-Medium.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 600; + src: local("Source Code Pro Semibold"), local("SourceCodePro-Semibold"), url("/static/css/fonts/SourceCodePro-Semibold.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 700; + src: local("Source Code Pro Bold"), local("SourceCodePro-Bold"), url("/static/css/fonts/SourceCodePro-Bold.woff") format("woff"); +} +/* line 3, ../../../hub/static/css/mod/diff-base.scss */ +.code pre, xmp, plaintext, listing { + display: block; + font-size: 13px; + font-family: 'Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; + white-space: pre; + margin: 0; + padding: 0; +} + +/* line 12, ../../../hub/static/css/mod/diff-base.scss */ +.code pre { + line-height: 18px; +} + +/* line 16, ../../../hub/static/css/mod/diff-base.scss */ +.font-consolas pre { + font-family: Consolas,'Source Code Pro',Courier,Monaco,Menlo,monospace; +} + +/* line 20, ../../../hub/static/css/mod/diff-base.scss */ +.font-monaco pre { + font-family: Monaco,'Source Code Pro',Courier,Consolas,Menlo,monospace; +} + +/* line 24, ../../../hub/static/css/mod/diff-base.scss */ +.font-courier pre { + font-family: Courier,'Source Code Pro',Monaco,Consolas,Menlo,monospace; +} + +/* line 28, ../../../hub/static/css/mod/diff-base.scss */ +.font-dejavu pre { + font-family: 'DejaVu Sans Mono','Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; +} + +/* line 32, ../../../hub/static/css/mod/diff-base.scss */ +.font-ubuntu pre { + font-family: 'Ubuntu Mono','Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; +} + +/* line 37, ../../../hub/static/css/mod/diff-base.scss */ +pre, code, tt { + font-size: 12px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + border: 0; +} + +/* line 43, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .normal { + background-color: #FFF; +} + +/* line 47, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .deletion { + color: black; + background-color: #FDD; +} +/* line 50, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .deletion .x, .highlight .deletion .c { + color: black; + background-color: #ffaaaa; +} + +/* line 56, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .insertion { + color: black; + background-color: #DFD; +} +/* line 59, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .insertion .i, .highlight .insertion .c { + color: black; + background-color: #aaffaa; +} + +/* line 65, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped { + color: #cacaca; + background-color: #f9f9f9; +} +/* line 69, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a { + color: #cacaca; + vertical-align: middle; +} +/* line 73, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a:hover { + text-decoration: none; +} +/* line 77, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a[data-type="after"], .highlight .skipped a[data-type="before"] { + font-size: 20px; +} + +/* line 266, ../../../hub/static/css/mod/commits.scss */ +#files.commentable tr td pre:hover { + background-color: #FFC; +} + +/* line 268, ../../../hub/static/css/mod/commits.scss */ +.full-commit { + margin: 10px 0; + padding: 8px 8px 0; + background: #E6F1F6; + border: 1px solid #C5D5DD; + border-radius: 4px; +} + +/* line 276, ../../../hub/static/css/mod/commits.scss */ +.full-commit .commit-meta { + margin-left: -8px; + width: 100%; + padding: 8px; + background: white; + border-top: 1px solid #D8E6EC; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +/* line 286, ../../../hub/static/css/mod/commits.scss */ +.full-commit .commit-desc { + display: block; + margin: -4px 0 10px 0; +} + +/* line 291, ../../../hub/static/css/mod/commits.scss */ +.full-commit .commit-desc pre { + max-width: 100%; + font-size: 14px; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); +} + +/* line 297, ../../../hub/static/css/mod/commits.scss */ +.full-commit .browse-button { + float: right; + margin: -3px -3px 0 0; + height: 26px; + padding: 0 10px; + line-height: 26px; + font-size: 13px; + font-weight: bold; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); + background: #EFF6F9; + background: -moz-linear-gradient(#EFF6F9, #DDECF3); + background: -webkit-linear-gradient(#EFF6F9, #DDECF3); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#eff6f9',endColorstr='#ddecf3')"; + border: 1px solid #CEDEE5; + border-radius: 3px; +} + +/* line 314, ../../../hub/static/css/mod/commits.scss */ +.full-commit p.commit-title { + margin: 0 0 8px 0; + font-size: 18px; + font-weight: bold; + color: #213F4D; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); +} + +/* line 322, ../../../hub/static/css/mod/commits.scss */ +.clearfix { + display: block; +} + +/* line 326, ../../../hub/static/css/mod/commits.scss */ +.full-commit .sha-block { + float: right; + margin-left: 15px; + color: #888; + font-size: 12px; +} + +/* line 333, ../../../hub/static/css/mod/commits.scss */ +.full-commit .authorship { + margin-top: -2px; + margin-left: -4px; + margin-bottom: -4px; + font-size: 14px; + color: #999; +} + +/* line 341, ../../../hub/static/css/mod/commits.scss */ +.full-commit .authorship .gravatar { + margin-top: -2px; + margin-right: 3px; + vertical-align: middle; + border-radius: 3px; +} + +/* line 347, ../../../hub/static/css/mod/commits.scss */ +#files { + position: relative; +} + +/* line 351, ../../../hub/static/css/mod/commits.scss */ +#files .file, .file-box { + border: 1px solid #CCC; + margin-bottom: 13px; + position: relative; + background-color: #DDD; +} + +/* line 358, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta, .file-box .meta { + overflow: hidden; + padding: 5px 10px; + font-size: 12px; + height: 33px; + text-align: left; + color: #555; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #D8D8D8; + background: #FAFAFA; + background: -moz-linear-gradient(#FAFAFA, #EAEAEA); + background: -webkit-linear-gradient(#FAFAFA, #EAEAEA); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; +} + +/* line 373, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .info, .file-box .meta .info { + float: left; + height: 33px; + line-height: 33px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; +} + +/* line 380, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .actions, .file-box .meta .actions { + float: right; + height: 33px; + line-height: 33px; + margin-top: 1px; +} + +/* line 387, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .actions li:first-child, .file-box .meta .actions li:first-child { + background: transparent; + margin-left: 0; + padding-left: 0; +} + +/* line 393, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .actions li, .file-box .meta .actions li { + list-style-type: none; + float: left; + margin: 0 0 0 7px; +} + +/* line 399, ../../../hub/static/css/mod/commits.scss */ +.button-group li { + margin: 0 !important; +} + +/* line 403, ../../../hub/static/css/mod/commits.scss */ +.pagination-older-newer a { + padding: .1em .3em; + margin: .2em; + text-decoration: none; + color: #369; + float: none; +} + +/* line 411, ../../../hub/static/css/mod/commits.scss */ +.pagination-older-newer a:hover, .pagination a:active { + background-color: transparent; + color: #36f; +} + +/* line 416, ../../../hub/static/css/mod/commits.scss */ +.pagination-older-newer span.disabled { + padding: .1em .3em; + margin: .2em; + color: #bbb; + float: none; +} + +/* line 423, ../../../hub/static/css/mod/commits.scss */ +.commit .sha-block, .commit .sha { + padding-right: 3px; + font-size: 11px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; +} + +/* line 429, ../../../hub/static/css/mod/commits.scss */ +#files .file .data .line_numbers, .file-box .data .line_numbers { + background-color: #ECECEC; + color: #AAA; + padding: 0 6px; + border-right: 1px solid #DDD; + text-align: right; + cursor: pointer; +} + +/* line 437, ../../../hub/static/css/mod/commits.scss */ +#files .file .data .line_numbers a { + color: #AAA; +} + +/* line 441, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-added:before { + content: "\f06b"; +} + +/* line 442, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-removed:before { + content: "\f06c"; +} + +/* line 443, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-modified:before { + content: "\f06d"; +} + +/* line 444, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-moved:before, .mini-icon-renamed:before { + content: "\f06e"; +} + +/* line 445, ../../../hub/static/css/mod/commits.scss */ +.mini-icon-commit-comment:before { + content: "\f02b"; +} + +/* line 447, ../../../hub/static/css/mod/commits.scss */ +.mega-icon-beer:before { + content: "\f269"; +} + +/* line 448, ../../../hub/static/css/mod/commits.scss */ +.mega-icon-commit-comment:before { + content: "\f22b"; +} + +/* line 450, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .info span.icon, +#files .file .meta .info span.diffstat, +.file-box .meta .info span.icon { + line-height: 0; + float: left; + margin: 5px 5px 0 0; + padding: 3px; + background: #F7F7F7; + border: 1px solid #CCC; + border-right-color: #E5E5E5; + border-bottom-color: #E5E5E5; + border-radius: 3px; +} + +/* line 463, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .info span.diffstat { + height: 16px; + padding: 3px 6px; +} + +/* line 467, ../../../hub/static/css/mod/commits.scss */ +#files .file .meta .info span:first-child, +#files .file .meta .info .icon + span, +.file-box .meta .info span:first-child, +.file-box .meta .info .icon + span { + border-left: 0 none; + box-shadow: inset 0 0 0 transparent; + margin-left: 0; + padding-left: 0; +} + +/* line 477, ../../../hub/static/css/mod/commits.scss */ +.commit-meta.comment-row .mini-icon { + color: #939AA0; + margin: 0 2px 0 1px; + top: 2px; + text-decoration: none; +} + +/* line 478, ../../../hub/static/css/mod/commits.scss */ +#files .file .data.empty, .file-box .data.empty { + padding: 10px 15px; + color: #777; +} + +/* line 482, ../../../hub/static/css/mod/commits.scss */ +.timeout { + width: 873px; + height: 528px; + border: 1px solid #C5D5DD; + background: url("/static/img/timeout.jpg") #E6F1F6 no-repeat; + background-position: 90% 50%; + padding: 0 32px 0 33px; + border-radius: 3px; +} + +/* line 491, ../../../hub/static/css/mod/commits.scss */ +.timeout h3 { + color: white; + font-size: 18px; + font-weight: bold; + text-shadow: darkGray 1px 1px 0; + padding: 15px 0 15px 0; +} + +/* line 498, ../../../hub/static/css/mod/commits.scss */ +.timeout h3 strong { + font-size: 30px; + display: block; +} + +/* line 502, ../../../hub/static/css/mod/commits.scss */ +.timeout p { + color: white; +} + +/* line 506, ../../../hub/static/css/mod/commits.scss */ +.side-avatar { + position: absolute; + float: left; + margin-left: -60px; +} + +/* line 512, ../../../hub/static/css/mod/commits.scss */ +div.generated, div.binary { + text-align: center; + background-color: #ddd; + padding: 30px; +} + +/* line 518, ../../../hub/static/css/mod/commits.scss */ +.commit-history-header { + margin-bottom: 55px; +} +/* line 521, ../../../hub/static/css/mod/commits.scss */ +.commit-history-header #search-commits { + margin: 15px 5px; +} diff --git a/dist/css/mod/common.css b/dist/css/mod/common.css new file mode 100644 index 0000000..836c136 --- /dev/null +++ b/dist/css/mod/common.css @@ -0,0 +1,5376 @@ +/* Styles that are used in ALL pages. */ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +/* line 11, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix { + *zoom: 1; +} + +/* line 15, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +/* line 22, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.clearfix:after { + clear: both; +} + +/* line 26, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +/* line 34, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} +/* line 47, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden { + display: none; + visibility: hidden; +} + +/* line 52, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-phone { + display: none !important; +} + +/* line 56, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-tablet { + display: none !important; +} + +/* line 60, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.hidden-desktop { + display: none !important; +} + +/* line 64, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + /* line 69, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 72, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 75, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-tablet { + display: inherit !important; + } + + /* line 78, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + /* line 84, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-desktop { + display: inherit !important; + } + + /* line 87, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-desktop { + display: none !important; + } + + /* line 90, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-phone { + display: inherit !important; + } + + /* line 93, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-phone { + display: none !important; + } +} +/* line 98, ../../../hub/static/css/lib/bootstrap-responsive.scss */ +.visible-print { + display: none !important; +} + +@media print { + /* line 103, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .visible-print { + display: inherit !important; + } + + /* line 106, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .hidden-print { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 979px) { + /* line 112, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row { + margin-left: -20px; + *zoom: 1; + } + + /* line 116, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 122, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row:after { + clear: both; + } + + /* line 125, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + + /* line 130, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + + /* line 136, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12 { + width: 724px; + } + + /* line 139, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span11 { + width: 662px; + } + + /* line 142, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span10 { + width: 600px; + } + + /* line 145, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span9 { + width: 538px; + } + + /* line 148, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span8 { + width: 476px; + } + + /* line 151, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span7 { + width: 414px; + } + + /* line 154, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span6 { + width: 352px; + } + + /* line 157, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span5 { + width: 290px; + } + + /* line 160, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span4 { + width: 228px; + } + + /* line 163, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span3 { + width: 166px; + } + + /* line 166, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span2 { + width: 104px; + } + + /* line 169, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span1 { + width: 42px; + } + + /* line 172, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset12 { + margin-left: 764px; + } + + /* line 175, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset11 { + margin-left: 702px; + } + + /* line 178, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset10 { + margin-left: 640px; + } + + /* line 181, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset9 { + margin-left: 578px; + } + + /* line 184, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset8 { + margin-left: 516px; + } + + /* line 187, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset7 { + margin-left: 454px; + } + + /* line 190, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset6 { + margin-left: 392px; + } + + /* line 193, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset5 { + margin-left: 330px; + } + + /* line 196, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset4 { + margin-left: 268px; + } + + /* line 199, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset3 { + margin-left: 206px; + } + + /* line 202, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset2 { + margin-left: 144px; + } + + /* line 205, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .offset1 { + margin-left: 82px; + } + + /* line 208, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + *zoom: 1; + } + + /* line 212, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + + /* line 218, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid:after { + clear: both; + } + + /* line 221, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 232, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + + /* line 235, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + + /* line 238, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + + /* line 242, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + + /* line 246, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + + /* line 250, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + + /* line 254, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + + /* line 258, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + + /* line 262, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + + /* line 266, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + + /* line 270, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + + /* line 274, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + + /* line 278, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + + /* line 282, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + + /* line 286, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + + /* line 290, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + + /* line 294, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + + /* line 298, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + + /* line 302, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + + /* line 306, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + + /* line 310, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + + /* line 314, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + + /* line 318, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + + /* line 322, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + + /* line 326, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + + /* line 330, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + + /* line 334, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + + /* line 338, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + + /* line 342, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + + /* line 346, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + + /* line 350, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + + /* line 354, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + + /* line 358, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + + /* line 362, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + + /* line 366, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + + /* line 370, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + + /* line 374, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + + /* line 378, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + + /* line 382, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input, + textarea, + .uneditable-input { + margin-left: 0; + } + + /* line 387, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + + /* line 390, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + + /* line 395, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + + /* line 400, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + + /* line 405, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + + /* line 410, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + + /* line 415, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + + /* line 420, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + + /* line 425, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + + /* line 430, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + + /* line 435, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + + /* line 440, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + + /* line 445, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 767px) { + /* line 453, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-right: 20px; + padding-left: 20px; + } + + /* line 457, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + + /* line 463, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container-fluid { + padding: 0; + } + + /* line 466, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + + /* line 472, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .dl-horizontal dd { + margin-left: 0; + } + + /* line 475, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .container { + width: auto; + } + + /* line 478, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid { + width: 100%; + } + + /* line 481, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row, + .thumbnails { + margin-left: 0; + } + + /* line 485, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .thumbnails > li { + float: none; + margin-left: 0; + } + + /* line 489, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 500, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 507, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + /* line 510, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + + /* line 524, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + + /* line 531, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + /* line 534, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + + /* line 542, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade { + top: -100px; + } + + /* line 545, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + /* line 551, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + + /* line 554, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .page-header h1 small { + display: block; + line-height: 20px; + } + + /* line 558, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + /* line 562, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + + /* line 568, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .controls { + margin-left: 0; + } + + /* line 571, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .control-list { + padding-top: 0; + } + + /* line 574, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + + /* line 578, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + + /* line 584, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .media-object { + margin-right: 0; + margin-left: 0; + } + + /* line 588, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal { + top: 10px; + right: 10px; + left: 10px; + } + + /* line 593, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .modal-header .close { + padding: 10px; + margin: -10px; + } + + /* line 597, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .carousel-caption { + position: static; + } +} +@media (max-width: 979px) { + /* line 603, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + body { + padding-top: 0; + } + + /* line 606, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + + /* line 610, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top { + margin-bottom: 20px; + } + + /* line 613, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-bottom { + margin-top: 20px; + } + + /* line 616, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + + /* line 620, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .container { + width: auto; + padding: 0; + } + + /* line 624, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + + /* line 629, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse { + clear: both; + } + + /* line 632, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + + /* line 636, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li { + float: none; + } + + /* line 639, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + + /* line 642, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > .divider-vertical { + display: none; + } + + /* line 645, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + + /* line 649, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + + /* line 658, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + + /* line 665, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + + /* line 668, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + + /* line 674, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + + /* line 678, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + + /* line 684, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + + /* line 688, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + + /* line 706, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .open > .dropdown-menu { + display: block; + } + + /* line 709, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + + /* line 713, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .dropdown-menu .divider { + display: none; + } + + /* line 716, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + + /* line 720, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + + /* line 731, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + + /* line 736, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + + /* line 740, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + + /* line 745, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar .btn-navbar { + display: block; + } + + /* line 748, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} +@media (min-width: 980px) { + /* line 755, ../../../hub/static/css/lib/bootstrap-responsive.scss */ + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} + +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} + +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} + +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} + +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} + +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} + +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} + +/* TODO: to be removed */ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 15, ../../../hub/static/css/mod/common.scss */ +.hidden { + display: none; +} + +/* line 19, ../../../hub/static/css/mod/common.scss */ +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +/* line 25, ../../../hub/static/css/mod/common.scss */ +.pagehead { + margin-bottom: 7px; +} + +/* line 27, ../../../hub/static/css/mod/common.scss */ +.raw { + overflow: hidden; + margin-left: -20px; +} diff --git a/dist/css/mod/compare.css b/dist/css/mod/compare.css new file mode 100644 index 0000000..e72b995 --- /dev/null +++ b/dist/css/mod/compare.css @@ -0,0 +1,259 @@ +@charset "UTF-8"; +/* line 2, ../../../hub/static/css/mod/compare.scss */ +.compare-range { + margin-top: -15px; + float: right; +} + +/* line 7, ../../../hub/static/css/mod/compare.scss */ +.compare-range .switch { + display: inline-block; + width: 16px; + height: 16px; + text-indent: -9999px; + background: url("/static/img/switch_icon.png") 0 0 no-repeat; +} + +/* line 15, ../../../hub/static/css/mod/compare.scss */ +.commit-ref { + padding: 2px 5px; + line-height: 19px; + font-family: Monaco,"Courier New","DejaVu Sans Mono","Bitstream Vera Sans Mono",monospace; + font-size: 12px; + font-weight: normal; + color: white; + text-shadow: -1px -1px 0 black; + text-decoration: none; + background: #787878; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#787878',endColorstr='#282828')"; + border-radius: 3px; +} + +/* line 29, ../../../hub/static/css/mod/compare.scss */ +#compare p.subtext { + margin: -15px 0 10px 0; + color: #666; +} + +/* line 34, ../../../hub/static/css/mod/compare.scss */ +.rule, hr { + clear: both; + margin: 15px 0; + height: 0; + overflow: hidden; + border: none; + background: transparent; + border-bottom: 1px solid #DDD; +} + +/* line 43, ../../../hub/static/css/mod/compare.scss */ +.commits-condensed { + margin-top: 15px; + border: 1px solid #DDD; + border-width: 1px 1px 0 1px; +} + +/* line 49, ../../../hub/static/css/mod/compare.scss */ +table { + border-collapse: collapse; + border-spacing: 0; + font-size: 100%; + font: inherit; +} + +/* line 56, ../../../hub/static/css/mod/compare.scss */ +.avatar-bubble::before { + content: ""; + display: block; + height: 0; + width: 0; + border: 10px solid #EEE; + border-width: 10px 10px 10px 0; + border-color: transparent #EEE transparent transparent; + position: absolute; + left: 51px; + top: 15px; +} + +/* line 69, ../../../hub/static/css/mod/compare.scss */ +.bubble { + padding: 3px; + background: #EEE; + border-radius: 3px; +} + +/* line 75, ../../../hub/static/css/mod/compare.scss */ +.new-comments .bubble .comment { + margin: 0; +} + +/* line 78, ../../../hub/static/css/mod/compare.scss */ +.new-comments .comment { + margin: 10px 0; + border: 1px solid #CACACA; +} + +/* line 83, ../../../hub/static/css/mod/compare.scss */ +.new-comments .comment .cmeta { + height: 33px; + padding: 0 10px 0 6px; + border-bottom: 1px solid #CCC; + background: #F8F8F8; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f8f8f8',endColorstr='#e1e1e1')"; +} + +/* line 91, ../../../hub/static/css/mod/compare.scss */ +.new-comments .comment > .body { + position: relative; + padding: 0; + color: #333; + font-size: 12px; + background: #FBFBFB; +} + +/* line 99, ../../../hub/static/css/mod/compare.scss */ +.avatar-bubble { + margin: 20px 0; + padding-left: 60px; + position: relative; +} + +/* line 105, ../../../hub/static/css/mod/compare.scss */ +.avatar-bubble > .avatar { + position: relative; + float: left; + margin-left: -60px; +} + +/* line 111, ../../../hub/static/css/mod/compare.scss */ +.comment .content-body { + padding: 10px; + font-size: 13px; +} + +/* line 116, ../../../hub/static/css/mod/compare.scss */ +.markdown-body { + font-size: 14px; + line-height: 1.6; +} + +/* line 121, ../../../hub/static/css/mod/compare.scss */ +.markdown-body p, .markdown-body blockquote, .markdown-body ul, .markdown-body ol, .markdown-body dl, .markdown-body li, .markdown-body table, .markdown-body pre { + margin: 15px 0; +} + +/* line 125, ../../../hub/static/css/mod/compare.scss */ +.new-comments .comment .cmeta p.author { + margin: 0; + float: left; + max-width: 600px; + font-size: 12px; + height: 33px; + line-height: 33px; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.7); + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +/* line 138, ../../../hub/static/css/mod/compare.scss */ +.new-comments .comment .cmeta p.info { + float: right; + margin: 0; + font-size: 11px; + height: 33px; + line-height: 33px; +} + +/* line 145, ../../../hub/static/css/mod/compare.scss */ +a.commit-ref:hover { + text-shadow: -1px -1px 0 #04284B; + background: #74A4D4; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#74a4d4',endColorstr='#2a5177')"; + text-decoration: none; +} + +/* line 152, ../../../hub/static/css/mod/compare.scss */ +#compare h2 { + font-size: 20px; +} + +/* line 156, ../../../hub/static/css/mod/compare.scss */ +.commit-preview { + margin: 10px 0 0 0; + font-size: 11px; +} + +/* line 161, ../../../hub/static/css/mod/compare.scss */ +form-actions { + text-align: right; + padding-bottom: 5px; +} + +/* line 166, ../../../hub/static/css/mod/compare.scss */ +.commit-preview > p { + margin: 16px 0; + font-size: 14px; + text-align: center; +} + +/* compare-popup related styles copied from hub.css */ +/* line 173, ../../../hub/static/css/mod/compare.scss */ +.mini-icon-remove-close::before { + content: ""; +} + +/* line 174, ../../../hub/static/css/mod/compare.scss */ +#compare-popup { + position: absolute; + top: 159px; + left: 407px; + z-index: 100; +} + +/* line 180, ../../../hub/static/css/mod/compare.scss */ +#compare-popup .popup { + position: relative; + border-radius: 5px; + box-shadow: 0 0 18px rgba(0, 0, 0, 0.4); +} + +/* line 181, ../../../hub/static/css/mod/compare.scss */ +#compare-popup .content { + width: 425px; + color: #333; + font-size: 12px; + padding: 10px; + border-radius: 4px; + background: white; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='white',endColorstr='#f4f9fb')"; +} + +/* line 182, ../../../hub/static/css/mod/compare.scss */ +#compare-popup .form-actions { + margin: 10px 0 0; + background-color: #fff; + text-align: right; +} + +/* line 183, ../../../hub/static/css/mod/compare.scss */ +#compare-popup .close { + position: absolute; + top: 4px; + right: 5px; + padding: 2px; +} + +/* line 184, ../../../hub/static/css/mod/compare.scss */ +#compare-popup .close .mini-icon-remove-close { + line-height: 16px; + height: 16px; + color: #CCC; +} + +/* line 185, ../../../hub/static/css/mod/compare.scss */ +#compare-popup input[type="text"] { + width: 96%; + padding: 5px 5px; + font-size: 12px; +} diff --git a/dist/css/mod/contribution.css b/dist/css/mod/contribution.css new file mode 100644 index 0000000..aa7cc57 --- /dev/null +++ b/dist/css/mod/contribution.css @@ -0,0 +1,30 @@ +/* line 1, ../../../hub/static/css/mod/contribution.scss */ +h3.conversation-list-heading { + margin: 25px 0 10px 0; + height: 0; + text-align: center; + font-size: 16px; + font-weight: normal; + color: #999999; + border-bottom: 1px solid #ddd; +} + +/* line 2, ../../../hub/static/css/mod/contribution.scss */ +h3.conversation-list-heading .inner { + display: inline-block; + position: relative; + top: -10px; + padding: 0 5px; + background: #fff; +} + +/* line 3, ../../../hub/static/css/mod/contribution.scss */ +h3.conversation-list-heading strong { + font-weight: bold; + color: #333333; +} + +/* line 4, ../../../hub/static/css/mod/contribution.scss */ +.simple-conversation-list > li .title .project-info { + color: #999999; +} diff --git a/dist/css/mod/diff-base.css b/dist/css/mod/diff-base.css new file mode 100644 index 0000000..120dc3d --- /dev/null +++ b/dist/css/mod/diff-base.css @@ -0,0 +1,116 @@ +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 400; + src: local("Source Code Pro"), local("SourceCodePro-Regular"), url("/static/css/fonts/SourceCodePro-Regular.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 500; + src: local("Source Code Pro Medium"), local("SourceCodePro-Medium"), url("/static/css/fonts/SourceCodePro-Medium.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 600; + src: local("Source Code Pro Semibold"), local("SourceCodePro-Semibold"), url("/static/css/fonts/SourceCodePro-Semibold.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 700; + src: local("Source Code Pro Bold"), local("SourceCodePro-Bold"), url("/static/css/fonts/SourceCodePro-Bold.woff") format("woff"); +} +/* line 3, ../../../hub/static/css/mod/diff-base.scss */ +.code pre, xmp, plaintext, listing { + display: block; + font-size: 13px; + font-family: 'Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; + white-space: pre; + margin: 0; + padding: 0; +} + +/* line 12, ../../../hub/static/css/mod/diff-base.scss */ +.code pre { + line-height: 18px; +} + +/* line 16, ../../../hub/static/css/mod/diff-base.scss */ +.font-consolas pre { + font-family: Consolas,'Source Code Pro',Courier,Monaco,Menlo,monospace; +} + +/* line 20, ../../../hub/static/css/mod/diff-base.scss */ +.font-monaco pre { + font-family: Monaco,'Source Code Pro',Courier,Consolas,Menlo,monospace; +} + +/* line 24, ../../../hub/static/css/mod/diff-base.scss */ +.font-courier pre { + font-family: Courier,'Source Code Pro',Monaco,Consolas,Menlo,monospace; +} + +/* line 28, ../../../hub/static/css/mod/diff-base.scss */ +.font-dejavu pre { + font-family: 'DejaVu Sans Mono','Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; +} + +/* line 32, ../../../hub/static/css/mod/diff-base.scss */ +.font-ubuntu pre { + font-family: 'Ubuntu Mono','Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; +} + +/* line 37, ../../../hub/static/css/mod/diff-base.scss */ +pre, code, tt { + font-size: 12px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + border: 0; +} + +/* line 43, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .normal { + background-color: #FFF; +} + +/* line 47, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .deletion { + color: black; + background-color: #FDD; +} +/* line 50, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .deletion .x, .highlight .deletion .c { + color: black; + background-color: #ffaaaa; +} + +/* line 56, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .insertion { + color: black; + background-color: #DFD; +} +/* line 59, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .insertion .i, .highlight .insertion .c { + color: black; + background-color: #aaffaa; +} + +/* line 65, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped { + color: #cacaca; + background-color: #f9f9f9; +} +/* line 69, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a { + color: #cacaca; + vertical-align: middle; +} +/* line 73, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a:hover { + text-decoration: none; +} +/* line 77, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a[data-type="after"], .highlight .skipped a[data-type="before"] { + font-size: 20px; +} diff --git a/dist/css/mod/diff-stat.css b/dist/css/mod/diff-stat.css new file mode 100644 index 0000000..49c3c7e --- /dev/null +++ b/dist/css/mod/diff-stat.css @@ -0,0 +1,84 @@ +/* line 1, ../../../hub/static/css/mod/diff-stat.scss */ +#toc li { + border-bottom: 1px solid #DDD; + list-style-type: none; + padding: 5px; +} + +/* line 7, ../../../hub/static/css/mod/diff-stat.scss */ +#toc { + margin: 15px 0; +} + +/* line 11, ../../../hub/static/css/mod/diff-stat.scss */ +#toc .diffstat { + float: right; +} + +/* line 14, ../../../hub/static/css/mod/diff-stat.scss */ +#toc .mini-icon-modified { + color: #677A85; +} + +/* line 18, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat { + white-space: nowrap; + text-align: right; + font-family: Helvetica,arial,freesans,clean,sans-serif; + color: #666; + font-weight: bold; + font-size: 11px; +} + +/* line 26, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat a { + text-decoration: none; + color: #666; +} + +/* line 30, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar { + position: relative; + left: -3px; + display: inline-block; + height: 12px; + text-decoration: none; + text-align: left; + color: #EEE; + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + line-height: 1; + -webkit-font-smoothing: antialiased; + font-size: 16px; + letter-spacing: -7px; +} + +/* line 48, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar.diff-added, +span.diffstat .diffstat-bar i.plus { + color: #61C423; + font-style: normal; +} + +/* line 53, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar.diff-added, +span.diffstat .diffstat-bar i.minus { + color: #C52323; + font-style: normal; +} + +/* line 59, ../../../hub/static/css/mod/diff-stat.scss */ +p.explain { + font-size: 12px; + color: #666; + margin: 1em 0; +} + +/* line 65, ../../../hub/static/css/mod/diff-stat.scss */ +p.explain .minibutton { + float: right; + top: -4px; +} diff --git a/dist/css/mod/diffs-pane.css b/dist/css/mod/diffs-pane.css new file mode 100644 index 0000000..5300655 --- /dev/null +++ b/dist/css/mod/diffs-pane.css @@ -0,0 +1,119 @@ +/* line 1, ../../../hub/static/css/mod/diff-stat.scss */ +#toc li { + border-bottom: 1px solid #DDD; + list-style-type: none; + padding: 5px; +} + +/* line 7, ../../../hub/static/css/mod/diff-stat.scss */ +#toc { + margin: 15px 0; +} + +/* line 11, ../../../hub/static/css/mod/diff-stat.scss */ +#toc .diffstat { + float: right; +} + +/* line 14, ../../../hub/static/css/mod/diff-stat.scss */ +#toc .mini-icon-modified { + color: #677A85; +} + +/* line 18, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat { + white-space: nowrap; + text-align: right; + font-family: Helvetica,arial,freesans,clean,sans-serif; + color: #666; + font-weight: bold; + font-size: 11px; +} + +/* line 26, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat a { + text-decoration: none; + color: #666; +} + +/* line 30, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar { + position: relative; + left: -3px; + display: inline-block; + height: 12px; + text-decoration: none; + text-align: left; + color: #EEE; + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + line-height: 1; + -webkit-font-smoothing: antialiased; + font-size: 16px; + letter-spacing: -7px; +} + +/* line 48, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar.diff-added, +span.diffstat .diffstat-bar i.plus { + color: #61C423; + font-style: normal; +} + +/* line 53, ../../../hub/static/css/mod/diff-stat.scss */ +span.diffstat .diffstat-bar.diff-added, +span.diffstat .diffstat-bar i.minus { + color: #C52323; + font-style: normal; +} + +/* line 59, ../../../hub/static/css/mod/diff-stat.scss */ +p.explain { + font-size: 12px; + color: #666; + margin: 1em 0; +} + +/* line 65, ../../../hub/static/css/mod/diff-stat.scss */ +p.explain .minibutton { + float: right; + top: -4px; +} + +/* line 3, ../../../hub/static/css/mod/diffs-pane.scss */ +.diff-cutoff { + margin-bottom: -2px; + height: 35px; + line-height: 37px; + font-size: 12px; + font-weight: bold; + color: #000; + text-align: center; + background: url("/static/img/compare_too_big.gif") 0 0 no-repeat; +} + +/* line 5, ../../../hub/static/css/mod/diffs-pane.scss */ +.fullscreen-mode { + overflow: hidden; +} + +/* line 6, ../../../hub/static/css/mod/diffs-pane.scss */ +#fullscreen-stage { + display: none; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + overflow-y: auto; + background: #fff; + z-index: 9999; +} + +/* line 7, ../../../hub/static/css/mod/diffs-pane.scss */ +#files #fullscreen-stage .file { + margin: 0; +} diff --git a/dist/css/mod/docs-nav.css b/dist/css/mod/docs-nav.css new file mode 100644 index 0000000..fe1abd7 --- /dev/null +++ b/dist/css/mod/docs-nav.css @@ -0,0 +1,61 @@ +/* line 1, ../../../hub/static/css/mod/docs-nav.scss */ +.docsnav { + clear: both; + font-size: 120%; + margin: 15px 0 25px; + color: #34833E; + padding: 4px 0 6px 0; +} + +/* line 2, ../../../hub/static/css/mod/docs-nav.scss */ +.docsnav a { + color: #34833E; + text-indent: 5px; +} + +/* line 3, ../../../hub/static/css/mod/docs-nav.scss */ +.docsnav table { + width: 100%; +} + +/* line 4, ../../../hub/static/css/mod/docs-nav.scss */ +.docsnav table td { + vertical-align: top; +} + +/* line 5, ../../../hub/static/css/mod/docs-nav.scss */ +.docsnav .bigger::before { + font-size: 160%; + vertical-align: bottom; + line-height: 16px; +} + +/* line 6, ../../../hub/static/css/mod/docs-nav.scss */ +.docsnav .biggest::before { + font-size: 200%; + vertical-align: bottom; + line-height: 10px; +} + +/* line 7, ../../../hub/static/css/mod/docs-nav.scss */ +.docsnav .search::before { + font-size: 130%; + vertical-align: bottom; + line-height: 13px; +} + +/* line 9, ../../../hub/static/css/mod/docs-nav.scss */ +.docsnav tr.first td { + width: 33%; + padding: 0 6px 0px 6px; +} + +/* line 10, ../../../hub/static/css/mod/docs-nav.scss */ +.docsnav tr.second td { + padding-top: 9px; +} + +/* line 12, ../../../hub/static/css/mod/docs-nav.scss */ +.docsnav { + border-bottom: 1px solid #CCC; +} diff --git a/dist/css/mod/docs-page.css b/dist/css/mod/docs-page.css new file mode 100644 index 0000000..5d25d80 --- /dev/null +++ b/dist/css/mod/docs-page.css @@ -0,0 +1,21 @@ +/* line 1, ../../../hub/static/css/mod/docs-page.scss */ +.pages_doc { + border-radius: 5px; + border: 2px solid #394249; + float: right; + padding: 5px; + margin: 5px 0 3px 15px; + font-weight: bold; + color: #fbfbf9; + font-size: 110%; + height: 35px; + width: 280px; + background: #739890 url("/static/img/smokinggal.jpg") no-repeat scroll 25px -175px; +} + +/* line 8, ../../../hub/static/css/mod/docs-page.scss */ +.pages_doc a { + font-weight: bold; + color: #435159; + text-shadow: -1px +0px 7px #f9f0e2; +} diff --git a/dist/css/mod/drop-down-list.css b/dist/css/mod/drop-down-list.css new file mode 100644 index 0000000..035fd88 --- /dev/null +++ b/dist/css/mod/drop-down-list.css @@ -0,0 +1,48 @@ +/* line 1, ../../../hub/static/css/mod/drop-down-list.scss */ +.add-item-menu { + display: none; + position: absolute; + top: 35px; + width: 218px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 10, ../../../hub/static/css/mod/drop-down-list.scss */ +.add-item-menu ul li.intro { + padding: 7px; + color: #666666; +} + +/* line 14, ../../../hub/static/css/mod/drop-down-list.scss */ +.add-item-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666666; +} + +/* line 19, ../../../hub/static/css/mod/drop-down-list.scss */ +.add-item-menu ul li.active { + background: #4183C4; + color: white; +} + +/* line 23, ../../../hub/static/css/mod/drop-down-list.scss */ +.add-item-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 30, ../../../hub/static/css/mod/drop-down-list.scss */ +.add-item-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; + border-radius: 3px; +} diff --git a/dist/css/mod/email.css b/dist/css/mod/email.css new file mode 100644 index 0000000..e7969ba --- /dev/null +++ b/dist/css/mod/email.css @@ -0,0 +1,15 @@ +/* line 1, ../../../hub/static/css/mod/email.scss */ +span.email-actions { + float: right; +} + +/* line 2, ../../../hub/static/css/mod/email.scss */ +.new-email-form input#email { + padding: 6px; + margin: 2px 2px 2px 0px; +} + +/* line 3, ../../../hub/static/css/mod/email.scss */ +.new-email-form dd { + margin-left: 0px; +} diff --git a/dist/css/mod/emoji-hint.css b/dist/css/mod/emoji-hint.css new file mode 100644 index 0000000..87b67b5 --- /dev/null +++ b/dist/css/mod/emoji-hint.css @@ -0,0 +1,23 @@ +/* line 2, ../../../hub/static/css/mod/emoji-hint.scss */ +#show-emoji-hint { + float: right; +} + +/* line 6, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +/* line 17, ../../../hub/static/css/mod/emoji-hint.scss */ +.emoji-hint #close { + position: absolute; + top: 10px; + right: 10px; +} diff --git a/dist/css/mod/emoji.css b/dist/css/mod/emoji.css new file mode 100644 index 0000000..94e6a7e --- /dev/null +++ b/dist/css/mod/emoji.css @@ -0,0 +1,3773 @@ +/* line 1, ../../../hub/static/css/mod/emoji.scss */ +.emoji { + background: url("/static/img/iphone_emoji.png") top left no-repeat; + width: 20px; + height: 20px; + display: -moz-inline-stack; + display: inline-block; + vertical-align: top; + zoom: 1; + *display: inline; +} + +/* line 2, ../../../hub/static/css/mod/emoji.scss */ +.emoji2600 { + background-position: 0px -260px; +} + +/* line 3, ../../../hub/static/css/mod/emoji.scss */ +.emoji2601 { + background-position: 0px -20px; +} + +/* line 4, ../../../hub/static/css/mod/emoji.scss */ +.emoji2614 { + background-position: 0px -40px; +} + +/* line 5, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c4 { + background-position: 0px -60px; +} + +/* line 6, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a1 { + background-position: 0px -80px; +} + +/* line 7, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f300 { + background-position: 0px -100px; +} + +/* line 8, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f301 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 9, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f302 { + background-position: 0px -120px; +} + +/* line 10, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f303 { + background-position: 0px -920px; +} + +/* line 11, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f304 { + background-position: 0px -160px; +} + +/* line 12, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f305 { + background-position: 0px -180px; +} + +/* line 13, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f306 { + background-position: 0px -200px; +} + +/* line 14, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f307 { + background-position: 0px -220px; +} + +/* line 15, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f308 { + background-position: 0px -240px; +} + +/* line 16, ../../../hub/static/css/mod/emoji.scss */ +.emoji2744 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 17, ../../../hub/static/css/mod/emoji.scss */ +.emoji26c5 { + background-position: 0px -260px; +} + +/* line 18, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f309 { + background-position: 0px -920px; +} + +/* line 19, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30a { + background-position: 0px -900px; +} + +/* line 20, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 21, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30c { + background-position: 0px -920px; +} + +/* line 22, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f30f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 23, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f311 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 24, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f314 { + background-position: 0px -360px; +} + +/* line 25, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f313 { + background-position: 0px -360px; +} + +/* line 26, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f319 { + background-position: 0px -360px; +} + +/* line 27, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f315 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 28, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31b { + background-position: 0px -360px; +} + +/* line 29, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f31f { + background-position: 0px -10740px; +} + +/* line 30, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f320 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 31, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f550 { + background-position: 0px -380px; +} + +/* line 32, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f551 { + background-position: 0px -400px; +} + +/* line 33, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f552 { + background-position: 0px -420px; +} + +/* line 34, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f553 { + background-position: 0px -440px; +} + +/* line 35, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f554 { + background-position: 0px -460px; +} + +/* line 36, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f555 { + background-position: 0px -480px; +} + +/* line 37, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f556 { + background-position: 0px -500px; +} + +/* line 38, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f557 { + background-position: 0px -520px; +} + +/* line 39, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f558 { + background-position: 0px -540px; +} + +/* line 40, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f559 { + background-position: 0px -620px; +} + +/* line 41, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55a { + background-position: 0px -580px; +} + +/* line 42, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f55b { + background-position: 0px -600px; +} + +/* line 43, ../../../hub/static/css/mod/emoji.scss */ +.emoji231a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 44, ../../../hub/static/css/mod/emoji.scss */ +.emoji231b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 45, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f0 { + background-position: 0px -620px; +} + +/* line 46, ../../../hub/static/css/mod/emoji.scss */ +.emoji23f3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 47, ../../../hub/static/css/mod/emoji.scss */ +.emoji2648 { + background-position: 0px -640px; +} + +/* line 48, ../../../hub/static/css/mod/emoji.scss */ +.emoji2649 { + background-position: 0px -660px; +} + +/* line 49, ../../../hub/static/css/mod/emoji.scss */ +.emoji264a { + background-position: 0px -680px; +} + +/* line 50, ../../../hub/static/css/mod/emoji.scss */ +.emoji264b { + background-position: 0px -700px; +} + +/* line 51, ../../../hub/static/css/mod/emoji.scss */ +.emoji264c { + background-position: 0px -720px; +} + +/* line 52, ../../../hub/static/css/mod/emoji.scss */ +.emoji264d { + background-position: 0px -740px; +} + +/* line 53, ../../../hub/static/css/mod/emoji.scss */ +.emoji264e { + background-position: 0px -760px; +} + +/* line 54, ../../../hub/static/css/mod/emoji.scss */ +.emoji264f { + background-position: 0px -780px; +} + +/* line 55, ../../../hub/static/css/mod/emoji.scss */ +.emoji2650 { + background-position: 0px -800px; +} + +/* line 56, ../../../hub/static/css/mod/emoji.scss */ +.emoji2651 { + background-position: 0px -820px; +} + +/* line 57, ../../../hub/static/css/mod/emoji.scss */ +.emoji2652 { + background-position: 0px -840px; +} + +/* line 58, ../../../hub/static/css/mod/emoji.scss */ +.emoji2653 { + background-position: 0px -860px; +} + +/* line 59, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ce { + background-position: 0px -880px; +} + +/* line 60, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f340 { + background-position: 0px -1220px; +} + +/* line 61, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f337 { + background-position: 0px -960px; +} + +/* line 62, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f331 { + background-position: 0px -1220px; +} + +/* line 63, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f341 { + background-position: 0px -1000px; +} + +/* line 64, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f338 { + background-position: 0px -1020px; +} + +/* line 65, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f339 { + background-position: 0px -1040px; +} + +/* line 66, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f342 { + background-position: 0px -1060px; +} + +/* line 67, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f343 { + background-position: 0px -1080px; +} + +/* line 68, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33a { + background-position: 0px -1100px; +} + +/* line 69, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33b { + background-position: 0px -1200px; +} + +/* line 70, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f334 { + background-position: 0px -1140px; +} + +/* line 71, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f335 { + background-position: 0px -1160px; +} + +/* line 72, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33e { + background-position: 0px -1180px; +} + +/* line 73, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 74, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f344 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 75, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f330 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 76, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33c { + background-position: 0px -1200px; +} + +/* line 77, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f33f { + background-position: 0px -1220px; +} + +/* line 78, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f352 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 79, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 80, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34e { + background-position: 0px -1360px; +} + +/* line 81, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34a { + background-position: 0px -1260px; +} + +/* line 82, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f353 { + background-position: 0px -1280px; +} + +/* line 83, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f349 { + background-position: 0px -1300px; +} + +/* line 84, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f345 { + background-position: 0px -1320px; +} + +/* line 85, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f346 { + background-position: 0px -1340px; +} + +/* line 86, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f348 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 87, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 88, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f347 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 89, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f351 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 90, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f34f { + background-position: 0px -1360px; +} + +/* line 91, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f440 { + background-position: 0px -1380px; +} + +/* line 92, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f442 { + background-position: 0px -1400px; +} + +/* line 93, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f443 { + background-position: 0px -1420px; +} + +/* line 94, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f444 { + background-position: 0px -1440px; +} + +/* line 95, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f445 { + background-position: 0px -3000px; +} + +/* line 96, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f484 { + background-position: 0px -1480px; +} + +/* line 97, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f485 { + background-position: 0px -1500px; +} + +/* line 98, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f486 { + background-position: 0px -1520px; +} + +/* line 99, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f487 { + background-position: 0px -1540px; +} + +/* line 100, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f488 { + background-position: 0px -1560px; +} + +/* line 101, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f464 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 102, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f466 { + background-position: 0px -1580px; +} + +/* line 103, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f467 { + background-position: 0px -1600px; +} + +/* line 104, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f468 { + background-position: 0px -1620px; +} + +/* line 105, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f469 { + background-position: 0px -1640px; +} + +/* line 106, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 107, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46b { + background-position: 0px -1660px; +} + +/* line 108, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46e { + background-position: 0px -1680px; +} + +/* line 109, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f46f { + background-position: 0px -1700px; +} + +/* line 110, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f470 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 111, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f471 { + background-position: 0px -1720px; +} + +/* line 112, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f472 { + background-position: 0px -1740px; +} + +/* line 113, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f473 { + background-position: 0px -1760px; +} + +/* line 114, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f474 { + background-position: 0px -1780px; +} + +/* line 115, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f475 { + background-position: 0px -1800px; +} + +/* line 116, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f476 { + background-position: 0px -1820px; +} + +/* line 117, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f477 { + background-position: 0px -1840px; +} + +/* line 118, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f478 { + background-position: 0px -1860px; +} + +/* line 119, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f479 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 120, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 121, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47b { + background-position: 0px -1880px; +} + +/* line 122, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47c { + background-position: 0px -1900px; +} + +/* line 123, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47d { + background-position: 0px -1920px; +} + +/* line 124, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47e { + background-position: 0px -1940px; +} + +/* line 125, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f47f { + background-position: 0px -1960px; +} + +/* line 126, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f480 { + background-position: 0px -1980px; +} + +/* line 127, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f481 { + background-position: 0px -2000px; +} + +/* line 128, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f482 { + background-position: 0px -2020px; +} + +/* line 129, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f483 { + background-position: 0px -2040px; +} + +/* line 130, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 131, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40d { + background-position: 0px -2620px; +} + +/* line 132, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f40e { + background-position: 0px -6680px; +} + +/* line 133, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f414 { + background-position: 0px -2640px; +} + +/* line 134, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f417 { + background-position: 0px -2660px; +} + +/* line 135, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42b { + background-position: 0px -2680px; +} + +/* line 136, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f418 { + background-position: 0px -2480px; +} + +/* line 137, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f428 { + background-position: 0px -2500px; +} + +/* line 138, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f412 { + background-position: 0px -2520px; +} + +/* line 139, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f411 { + background-position: 0px -2540px; +} + +/* line 140, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f419 { + background-position: 0px -2340px; +} + +/* line 141, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41a { + background-position: 0px -2360px; +} + +/* line 142, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41b { + background-position: 0px -2460px; +} + +/* line 143, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 144, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 145, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 146, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f420 { + background-position: 0px -2420px; +} + +/* line 147, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f421 { + background-position: 0px -7360px; +} + +/* line 148, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f422 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 149, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f424 { + background-position: 0px -2140px; +} + +/* line 150, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f425 { + background-position: 0px -2140px; +} + +/* line 151, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f426 { + background-position: 0px -2400px; +} + +/* line 152, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f423 { + background-position: 0px -2140px; +} + +/* line 153, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f427 { + background-position: 0px -2160px; +} + +/* line 154, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f429 { + background-position: 0px -2720px; +} + +/* line 155, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f41f { + background-position: 0px -7360px; +} + +/* line 156, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42c { + background-position: 0px -2380px; +} + +/* line 157, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42d { + background-position: 0px -2280px; +} + +/* line 158, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42f { + background-position: 0px -2240px; +} + +/* line 159, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f431 { + background-position: 0px -2080px; +} + +/* line 160, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f433 { + background-position: 0px -2300px; +} + +/* line 161, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f434 { + background-position: 0px -2200px; +} + +/* line 162, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f435 { + background-position: 0px -2320px; +} + +/* line 163, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f436 { + background-position: 0px -2720px; +} + +/* line 164, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f437 { + background-position: 0px -2780px; +} + +/* line 165, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43b { + background-position: 0px -2260px; +} + +/* line 166, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f439 { + background-position: 0px -2440px; +} + +/* line 167, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43a { + background-position: 0px -2560px; +} + +/* line 168, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f42e { + background-position: 0px -2580px; +} + +/* line 169, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f430 { + background-position: 0px -2600px; +} + +/* line 170, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f438 { + background-position: 0px -2700px; +} + +/* line 171, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43e { + background-position: 0px -6460px; +} + +/* line 172, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f432 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 173, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 174, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f43d { + background-position: 0px -2780px; +} + +/* line 175, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f620 { + background-position: 0px -2800px; +} + +/* line 176, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f629 { + background-position: 0px -3860px; +} + +/* line 177, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f632 { + background-position: 0px -2840px; +} + +/* line 178, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61e { + background-position: 0px -2860px; +} + +/* line 179, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f635 { + background-position: 0px -3540px; +} + +/* line 180, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f630 { + background-position: 0px -2900px; +} + +/* line 181, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f612 { + background-position: 0px -2920px; +} + +/* line 182, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60d { + background-position: 0px -3660px; +} + +/* line 183, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f624 { + background-position: 0px -3720px; +} + +/* line 184, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61c { + background-position: 0px -2980px; +} + +/* line 185, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61d { + background-position: 0px -3000px; +} + +/* line 186, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60b { + background-position: 0px -3220px; +} + +/* line 187, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f618 { + background-position: 0px -3640px; +} + +/* line 188, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f61a { + background-position: 0px -3060px; +} + +/* line 189, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f637 { + background-position: 0px -3080px; +} + +/* line 190, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f633 { + background-position: 0px -3100px; +} + +/* line 191, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f603 { + background-position: 0px -3580px; +} + +/* line 192, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f605 { + background-position: 0px -3260px; +} + +/* line 193, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f606 { + background-position: 0px -3380px; +} + +/* line 194, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f601 { + background-position: 0px -3720px; +} + +/* line 195, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f602 { + background-position: 0px -3620px; +} + +/* line 196, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60a { + background-position: 0px -3220px; +} + +/* line 197, ../../../hub/static/css/mod/emoji.scss */ +.emoji263a { + background-position: 0px -3240px; +} + +/* line 198, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f604 { + background-position: 0px -3260px; +} + +/* line 199, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f622 { + background-position: 0px -3680px; +} + +/* line 200, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62d { + background-position: 0px -3300px; +} + +/* line 201, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f628 { + background-position: 0px -3320px; +} + +/* line 202, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f623 { + background-position: 0px -3540px; +} + +/* line 203, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f621 { + background-position: 0px -3880px; +} + +/* line 204, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60c { + background-position: 0px -3380px; +} + +/* line 205, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f616 { + background-position: 0px -10520px; +} + +/* line 206, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f614 { + background-position: 0px -3860px; +} + +/* line 207, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f631 { + background-position: 0px -3440px; +} + +/* line 208, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62a { + background-position: 0px -3460px; +} + +/* line 209, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f60f { + background-position: 0px -3480px; +} + +/* line 210, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f613 { + background-position: 0px -3500px; +} + +/* line 211, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f625 { + background-position: 0px -3520px; +} + +/* line 212, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f62b { + background-position: 0px -3540px; +} + +/* line 213, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f609 { + background-position: 0px -3560px; +} + +/* line 214, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63a { + background-position: 0px -3580px; +} + +/* line 215, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f638 { + background-position: 0px -3720px; +} + +/* line 216, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f639 { + background-position: 0px -3620px; +} + +/* line 217, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63d { + background-position: 0px -3640px; +} + +/* line 218, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63b { + background-position: 0px -3660px; +} + +/* line 219, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63f { + background-position: 0px -3680px; +} + +/* line 220, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63e { + background-position: 0px -3880px; +} + +/* line 221, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f63c { + background-position: 0px -3720px; +} + +/* line 222, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f640 { + background-position: 0px -3860px; +} + +/* line 223, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f645 { + background-position: 0px -3760px; +} + +/* line 224, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f646 { + background-position: 0px -3780px; +} + +/* line 225, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f647 { + background-position: 0px -3800px; +} + +/* line 226, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f648 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 227, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 228, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f649 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 229, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64b { + background-position: 0px -11240px; +} + +/* line 230, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64c { + background-position: 0px -3840px; +} + +/* line 231, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64d { + background-position: 0px -3860px; +} + +/* line 232, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64e { + background-position: 0px -3880px; +} + +/* line 233, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f64f { + background-position: 0px -3900px; +} + +/* line 234, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e0 { + background-position: 0px -3940px; +} + +/* line 235, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e1 { + background-position: 0px -3940px; +} + +/* line 236, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e2 { + background-position: 0px -3960px; +} + +/* line 237, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e3 { + background-position: 0px -3980px; +} + +/* line 238, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e5 { + background-position: 0px -4000px; +} + +/* line 239, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e6 { + background-position: 0px -4020px; +} + +/* line 240, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e7 { + background-position: 0px -4040px; +} + +/* line 241, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e8 { + background-position: 0px -4060px; +} + +/* line 242, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3e9 { + background-position: 0px -4080px; +} + +/* line 243, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ea { + background-position: 0px -4100px; +} + +/* line 244, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3eb { + background-position: 0px -4120px; +} + +/* line 245, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ea { + background-position: 0px -4140px; +} + +/* line 246, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f2 { + background-position: 0px -4160px; +} + +/* line 247, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ec { + background-position: 0px -4180px; +} + +/* line 248, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ef { + background-position: 0px -4200px; +} + +/* line 249, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3f0 { + background-position: 0px -4220px; +} + +/* line 250, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ed { + background-position: 0px -4240px; +} + +/* line 251, ../../../hub/static/css/mod/emoji.scss */ +.emoji2693 { + background-position: 0px -6920px; +} + +/* line 252, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ee { + background-position: 0px -8800px; +} + +/* line 253, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fb { + background-position: 0px -4300px; +} + +/* line 254, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fc { + background-position: 0px -4320px; +} + +/* line 255, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fd { + background-position: 0px -4340px; +} + +/* line 256, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5fe { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 257, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f5ff { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 258, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45e { + background-position: 0px -4400px; +} + +/* line 259, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45f { + background-position: 0px -4400px; +} + +/* line 260, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f460 { + background-position: 0px -4420px; +} + +/* line 261, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f461 { + background-position: 0px -4440px; +} + +/* line 262, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f462 { + background-position: 0px -4460px; +} + +/* line 263, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f463 { + background-position: 0px -6460px; +} + +/* line 264, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f453 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 265, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f455 { + background-position: 0px -4620px; +} + +/* line 266, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f456 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 267, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f451 { + background-position: 0px -4500px; +} + +/* line 268, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f454 { + background-position: 0px -4520px; +} + +/* line 269, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f452 { + background-position: 0px -4540px; +} + +/* line 270, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f457 { + background-position: 0px -4560px; +} + +/* line 271, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f458 { + background-position: 0px -4580px; +} + +/* line 272, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f459 { + background-position: 0px -4600px; +} + +/* line 273, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45a { + background-position: 0px -4620px; +} + +/* line 274, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 275, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45c { + background-position: 0px -4960px; +} + +/* line 276, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f45d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 277, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b0 { + background-position: 0px -4720px; +} + +/* line 278, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b1 { + background-position: 0px -4660px; +} + +/* line 279, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b9 { + background-position: 0px -6380px; +} + +/* line 280, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b2 { + background-position: 0px -4720px; +} + +/* line 281, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 282, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 283, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b5 { + background-position: 0px -4720px; +} + +/* line 284, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4b8 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 285, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e81f1f3 { + background-position: 0px -4740px; +} + +/* line 286, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1e91f1ea { + background-position: 0px -4760px; +} + +/* line 287, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ea1f1f8 { + background-position: 0px -4780px; +} + +/* line 288, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1eb1f1f7 { + background-position: 0px -4800px; +} + +/* line 289, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ec1f1e7 { + background-position: 0px -4820px; +} + +/* line 290, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ee1f1f9 { + background-position: 0px -4840px; +} + +/* line 291, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1ef1f1f5 { + background-position: 0px -4860px; +} + +/* line 292, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f01f1f7 { + background-position: 0px -4880px; +} + +/* line 293, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1f71f1fa { + background-position: 0px -4900px; +} + +/* line 294, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f1fa1f1f8 { + background-position: 0px -4920px; +} + +/* line 295, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f525 { + background-position: 0px -5040px; +} + +/* line 296, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f526 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 297, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f527 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 298, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f528 { + background-position: 0px -4360px; +} + +/* line 299, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f529 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 300, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 301, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52b { + background-position: 0px -5020px; +} + +/* line 302, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52e { + background-position: 0px -5080px; +} + +/* line 303, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f52f { + background-position: 0px -5080px; +} + +/* line 304, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f530 { + background-position: 0px -9660px; +} + +/* line 305, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f531 { + background-position: 0px -9680px; +} + +/* line 306, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f489 { + background-position: 0px -5300px; +} + +/* line 307, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48a { + background-position: 0px -5320px; +} + +/* line 308, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f170 { + background-position: 0px -5340px; +} + +/* line 309, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f171 { + background-position: 0px -5360px; +} + +/* line 310, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f18e { + background-position: 0px -5380px; +} + +/* line 311, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17e { + background-position: 0px -5400px; +} + +/* line 312, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f380 { + background-position: 0px -5420px; +} + +/* line 313, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f381 { + background-position: 0px -6080px; +} + +/* line 314, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f382 { + background-position: 0px -5460px; +} + +/* line 315, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f384 { + background-position: 0px -5480px; +} + +/* line 316, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f385 { + background-position: 0px -5500px; +} + +/* line 317, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38c { + background-position: 0px -5520px; +} + +/* line 318, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f386 { + background-position: 0px -5540px; +} + +/* line 319, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f388 { + background-position: 0px -5560px; +} + +/* line 320, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f389 { + background-position: 0px -5580px; +} + +/* line 321, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38d { + background-position: 0px -5600px; +} + +/* line 322, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38e { + background-position: 0px -5620px; +} + +/* line 323, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f393 { + background-position: 0px -5640px; +} + +/* line 324, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f392 { + background-position: 0px -5660px; +} + +/* line 325, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38f { + background-position: 0px -5680px; +} + +/* line 326, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f387 { + background-position: 0px -5700px; +} + +/* line 327, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f390 { + background-position: 0px -5720px; +} + +/* line 328, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f383 { + background-position: 0px -5740px; +} + +/* line 329, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 330, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f38b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 331, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f391 { + background-position: 0px -5760px; +} + +/* line 332, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4df { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 333, ../../../hub/static/css/mod/emoji.scss */ +.emoji260e { + background-position: 0px -5800px; +} + +/* line 334, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4de { + background-position: 0px -5800px; +} + +/* line 335, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f1 { + background-position: 0px -5820px; +} + +/* line 336, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f2 { + background-position: 0px -5840px; +} + +/* line 337, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dd { + background-position: 0px -6440px; +} + +/* line 338, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e0 { + background-position: 0px -5880px; +} + +/* line 339, ../../../hub/static/css/mod/emoji.scss */ +.emoji2709 { + background-position: 0px -11200px; +} + +/* line 340, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e8 { + background-position: 0px -11200px; +} + +/* line 341, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e9 { + background-position: 0px -11200px; +} + +/* line 342, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ea { + background-position: 0px -5980px; +} + +/* line 343, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4eb { + background-position: 0px -5980px; +} + +/* line 344, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ee { + background-position: 0px -6000px; +} + +/* line 345, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 346, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e2 { + background-position: 0px -6020px; +} + +/* line 347, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e3 { + background-position: 0px -6040px; +} + +/* line 348, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e1 { + background-position: 0px -6060px; +} + +/* line 349, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 350, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 351, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e6 { + background-position: 0px -6080px; +} + +/* line 352, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4e7 { + background-position: 0px -11200px; +} + +/* line 353, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f520 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 354, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f521 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 355, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f522 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 356, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f523 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 357, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f524 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 358, ../../../hub/static/css/mod/emoji.scss */ +.emoji2712 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 359, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ba { + background-position: 0px -6100px; +} + +/* line 360, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bb { + background-position: 0px -6120px; +} + +/* line 361, ../../../hub/static/css/mod/emoji.scss */ +.emoji270f { + background-position: 0px -6440px; +} + +/* line 362, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ce { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 363, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bc { + background-position: 0px -6160px; +} + +/* line 364, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bd { + background-position: 0px -6200px; +} + +/* line 365, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4be { + background-position: 0px -6200px; +} + +/* line 366, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4bf { + background-position: 0px -7800px; +} + +/* line 367, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c0 { + background-position: 0px -7820px; +} + +/* line 368, ../../../hub/static/css/mod/emoji.scss */ +.emoji2702 { + background-position: 0px -6220px; +} + +/* line 369, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 370, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c3 { + background-position: 0px -6440px; +} + +/* line 371, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c4 { + background-position: 0px -6440px; +} + +/* line 372, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 373, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c1 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 374, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 375, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d3 { + background-position: 0px -6420px; +} + +/* line 376, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d6 { + background-position: 0px -6420px; +} + +/* line 377, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d4 { + background-position: 0px -6420px; +} + +/* line 378, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d5 { + background-position: 0px -6420px; +} + +/* line 379, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d7 { + background-position: 0px -6420px; +} + +/* line 380, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d8 { + background-position: 0px -6420px; +} + +/* line 381, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d9 { + background-position: 0px -6420px; +} + +/* line 382, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4da { + background-position: 0px -6420px; +} + +/* line 383, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4db { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 384, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4dc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 385, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cb { + background-position: 0px -6440px; +} + +/* line 386, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c6 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 387, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ca { + background-position: 0px -6380px; +} + +/* line 388, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c8 { + background-position: 0px -6380px; +} + +/* line 389, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 390, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4c7 { + background-position: 0px -6420px; +} + +/* line 391, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cc { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 392, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d2 { + background-position: 0px -6420px; +} + +/* line 393, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 394, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 395, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4d1 { + background-position: 0px -6440px; +} + +/* line 396, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bd { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 397, ../../../hub/static/css/mod/emoji.scss */ +.emoji26be { + background-position: 0px -6480px; +} + +/* line 398, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f3 { + background-position: 0px -6500px; +} + +/* line 399, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3be { + background-position: 0px -6520px; +} + +/* line 400, ../../../hub/static/css/mod/emoji.scss */ +.emoji26bd { + background-position: 0px -6540px; +} + +/* line 401, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bf { + background-position: 0px -6560px; +} + +/* line 402, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c0 { + background-position: 0px -6580px; +} + +/* line 403, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c1 { + background-position: 0px -6600px; +} + +/* line 404, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 405, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c3 { + background-position: 0px -6620px; +} + +/* line 406, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c4 { + background-position: 0px -6640px; +} + +/* line 407, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c6 { + background-position: 0px -6660px; +} + +/* line 408, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3c8 { + background-position: 0px -6700px; +} + +/* line 409, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ca { + background-position: 0px -6720px; +} + +/* line 410, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f683 { + background-position: 0px -6740px; +} + +/* line 411, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f687 { + background-position: 0px -6780px; +} + +/* line 412, ../../../hub/static/css/mod/emoji.scss */ +.emoji24c2 { + background-position: 0px -6780px; +} + +/* line 413, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f684 { + background-position: 0px -6800px; +} + +/* line 414, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f685 { + background-position: 0px -6820px; +} + +/* line 415, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f697 { + background-position: 0px -6840px; +} + +/* line 416, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f699 { + background-position: 0px -6860px; +} + +/* line 417, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68c { + background-position: 0px -6880px; +} + +/* line 418, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f68f { + background-position: 0px -6900px; +} + +/* line 419, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a2 { + background-position: 0px -6920px; +} + +/* line 420, ../../../hub/static/css/mod/emoji.scss */ +.emoji2708 { + background-position: 0px -6940px; +} + +/* line 421, ../../../hub/static/css/mod/emoji.scss */ +.emoji26f5 { + background-position: 0px -6960px; +} + +/* line 422, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f689 { + background-position: 0px -7000px; +} + +/* line 423, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f680 { + background-position: 0px -7020px; +} + +/* line 424, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a4 { + background-position: 0px -7040px; +} + +/* line 425, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f695 { + background-position: 0px -7060px; +} + +/* line 426, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f69a { + background-position: 0px -7100px; +} + +/* line 427, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f692 { + background-position: 0px -7120px; +} + +/* line 428, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f691 { + background-position: 0px -7140px; +} + +/* line 429, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f693 { + background-position: 0px -7260px; +} + +/* line 430, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fd { + background-position: 0px -7180px; +} + +/* line 431, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f17f { + background-position: 0px -7200px; +} + +/* line 432, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a5 { + background-position: 0px -7220px; +} + +/* line 433, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a7 { + background-position: 0px -9720px; +} + +/* line 434, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a8 { + background-position: 0px -7260px; +} + +/* line 435, ../../../hub/static/css/mod/emoji.scss */ +.emoji2668 { + background-position: 0px -7280px; +} + +/* line 436, ../../../hub/static/css/mod/emoji.scss */ +.emoji26fa { + background-position: 0px -7300px; +} + +/* line 437, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 438, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a1 { + background-position: 0px -7320px; +} + +/* line 439, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a2 { + background-position: 0px -7340px; +} + +/* line 440, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a3 { + background-position: 0px -7360px; +} + +/* line 441, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a4 { + background-position: 0px -7380px; +} + +/* line 442, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a5 { + background-position: 0px -7400px; +} + +/* line 443, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a6 { + background-position: 0px -7420px; +} + +/* line 444, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a7 { + background-position: 0px -7440px; +} + +/* line 445, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a8 { + background-position: 0px -7460px; +} + +/* line 446, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3a9 { + background-position: 0px -7540px; +} + +/* line 447, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 448, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ab { + background-position: 0px -7500px; +} + +/* line 449, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ac { + background-position: 0px -7520px; +} + +/* line 450, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ad { + background-position: 0px -7540px; +} + +/* line 451, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 452, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f004 { + background-position: 0px -7560px; +} + +/* line 453, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3af { + background-position: 0px -7580px; +} + +/* line 454, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b0 { + background-position: 0px -7600px; +} + +/* line 455, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b1 { + background-position: 0px -7620px; +} + +/* line 456, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b2 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 457, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b3 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 458, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b4 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 459, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f0cf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 460, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b5 { + background-position: 0px -7640px; +} + +/* line 461, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b6 { + background-position: 0px -7740px; +} + +/* line 462, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b7 { + background-position: 0px -7680px; +} + +/* line 463, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b8 { + background-position: 0px -7700px; +} + +/* line 464, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3b9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 465, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3ba { + background-position: 0px -7720px; +} + +/* line 466, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 467, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f3bc { + background-position: 0px -7740px; +} + +/* line 468, ../../../hub/static/css/mod/emoji.scss */ +.emoji303d { + background-position: 0px -7760px; +} + +/* line 469, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f7 { + background-position: 0px -4940px; +} + +/* line 470, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f9 { + background-position: 0px -7400px; +} + +/* line 471, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fa { + background-position: 0px -7780px; +} + +/* line 472, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fb { + background-position: 0px -7840px; +} + +/* line 473, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4fc { + background-position: 0px -7860px; +} + +/* line 474, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48b { + background-position: 0px -7900px; +} + +/* line 475, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48c { + background-position: 0px -11200px; +} + +/* line 476, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48d { + background-position: 0px -7940px; +} + +/* line 477, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48e { + background-position: 0px -7960px; +} + +/* line 478, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f48f { + background-position: 0px -7980px; +} + +/* line 479, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f490 { + background-position: 0px -8000px; +} + +/* line 480, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f491 { + background-position: 0px -8020px; +} + +/* line 481, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f492 { + background-position: 0px -8040px; +} + +/* line 482, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51e { + background-position: 0px -9860px; +} + +/* line 483, ../../../hub/static/css/mod/emoji.scss */ +.emojia9 { + background-position: 0px -9900px; +} + +/* line 484, ../../../hub/static/css/mod/emoji.scss */ +.emojiae { + background-position: 0px -9920px; +} + +/* line 485, ../../../hub/static/css/mod/emoji.scss */ +.emoji2122 { + background-position: 0px -9940px; +} + +/* line 486, ../../../hub/static/css/mod/emoji.scss */ +.emoji2139 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 487, ../../../hub/static/css/mod/emoji.scss */ +.emoji2320e3 { + background-position: 0px -8060px; +} + +/* line 488, ../../../hub/static/css/mod/emoji.scss */ +.emoji3120e3 { + background-position: 0px -8080px; +} + +/* line 489, ../../../hub/static/css/mod/emoji.scss */ +.emoji3220e3 { + background-position: 0px -8100px; +} + +/* line 490, ../../../hub/static/css/mod/emoji.scss */ +.emoji3320e3 { + background-position: 0px -8120px; +} + +/* line 491, ../../../hub/static/css/mod/emoji.scss */ +.emoji3420e3 { + background-position: 0px -8140px; +} + +/* line 492, ../../../hub/static/css/mod/emoji.scss */ +.emoji3520e3 { + background-position: 0px -8160px; +} + +/* line 493, ../../../hub/static/css/mod/emoji.scss */ +.emoji3620e3 { + background-position: 0px -8180px; +} + +/* line 494, ../../../hub/static/css/mod/emoji.scss */ +.emoji3720e3 { + background-position: 0px -8200px; +} + +/* line 495, ../../../hub/static/css/mod/emoji.scss */ +.emoji3820e3 { + background-position: 0px -8220px; +} + +/* line 496, ../../../hub/static/css/mod/emoji.scss */ +.emoji3920e3 { + background-position: 0px -8240px; +} + +/* line 497, ../../../hub/static/css/mod/emoji.scss */ +.emoji3020e3 { + background-position: 0px -8260px; +} + +/* line 498, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 499, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f6 { + background-position: 0px -8280px; +} + +/* line 500, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f3 { + background-position: 0px -8300px; +} + +/* line 501, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4f4 { + background-position: 0px -8320px; +} + +/* line 502, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f354 { + background-position: 0px -8340px; +} + +/* line 503, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f359 { + background-position: 0px -8360px; +} + +/* line 504, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f370 { + background-position: 0px -8380px; +} + +/* line 505, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35c { + background-position: 0px -8400px; +} + +/* line 506, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35e { + background-position: 0px -8420px; +} + +/* line 507, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f373 { + background-position: 0px -8440px; +} + +/* line 508, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f366 { + background-position: 0px -8460px; +} + +/* line 509, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35f { + background-position: 0px -8480px; +} + +/* line 510, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f361 { + background-position: 0px -8500px; +} + +/* line 511, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f358 { + background-position: 0px -8520px; +} + +/* line 512, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35a { + background-position: 0px -8540px; +} + +/* line 513, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35d { + background-position: 0px -8560px; +} + +/* line 514, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f35b { + background-position: 0px -8580px; +} + +/* line 515, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f362 { + background-position: 0px -8600px; +} + +/* line 516, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f363 { + background-position: 0px -8620px; +} + +/* line 517, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f371 { + background-position: 0px -8640px; +} + +/* line 518, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f372 { + background-position: 0px -8660px; +} + +/* line 519, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f367 { + background-position: 0px -8680px; +} + +/* line 520, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f356 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 521, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f365 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 522, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f360 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 523, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f355 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 524, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f357 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 525, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f368 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 526, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f369 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 527, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 528, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 529, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 530, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 531, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36e { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 532, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f36f { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 533, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f364 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 534, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f374 { + background-position: 0px -8700px; +} + +/* line 535, ../../../hub/static/css/mod/emoji.scss */ +.emoji2615 { + background-position: 0px -8720px; +} + +/* line 536, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f378 { + background-position: 0px -8860px; +} + +/* line 537, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37a { + background-position: 0px -8760px; +} + +/* line 538, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f375 { + background-position: 0px -8780px; +} + +/* line 539, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f376 { + background-position: 0px -8800px; +} + +/* line 540, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f377 { + background-position: 0px -8860px; +} + +/* line 541, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f37b { + background-position: 0px -8840px; +} + +/* line 542, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f379 { + background-position: 0px -8860px; +} + +/* line 543, ../../../hub/static/css/mod/emoji.scss */ +.emoji2197 { + background-position: 0px -8960px; +} + +/* line 544, ../../../hub/static/css/mod/emoji.scss */ +.emoji2198 { + background-position: 0px -8980px; +} + +/* line 545, ../../../hub/static/css/mod/emoji.scss */ +.emoji2196 { + background-position: 0px -8920px; +} + +/* line 546, ../../../hub/static/css/mod/emoji.scss */ +.emoji2199 { + background-position: 0px -8940px; +} + +/* line 547, ../../../hub/static/css/mod/emoji.scss */ +.emoji2934 { + background-position: 0px -8960px; +} + +/* line 548, ../../../hub/static/css/mod/emoji.scss */ +.emoji2935 { + background-position: 0px -8980px; +} + +/* line 549, ../../../hub/static/css/mod/emoji.scss */ +.emoji2194 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 550, ../../../hub/static/css/mod/emoji.scss */ +.emoji2195 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 551, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b06 { + background-position: 0px -9000px; +} + +/* line 552, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b07 { + background-position: 0px -9020px; +} + +/* line 553, ../../../hub/static/css/mod/emoji.scss */ +.emoji27a1 { + background-position: 0px -9040px; +} + +/* line 554, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b05 { + background-position: 0px -11180px; +} + +/* line 555, ../../../hub/static/css/mod/emoji.scss */ +.emoji25b6 { + background-position: 0px -9080px; +} + +/* line 556, ../../../hub/static/css/mod/emoji.scss */ +.emoji25c0 { + background-position: 0px -9100px; +} + +/* line 557, ../../../hub/static/css/mod/emoji.scss */ +.emoji23e9 { + background-position: 0px -9120px; +} + +/* line 558, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ea { + background-position: 0px -9140px; +} + +/* line 559, ../../../hub/static/css/mod/emoji.scss */ +.emoji23eb { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 560, ../../../hub/static/css/mod/emoji.scss */ +.emoji23ec { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 561, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 562, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 563, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 564, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f53d { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 565, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b55 { + background-position: 0px -9800px; +} + +/* line 566, ../../../hub/static/css/mod/emoji.scss */ +.emoji274c { + background-position: 0px -10340px; +} + +/* line 567, ../../../hub/static/css/mod/emoji.scss */ +.emoji274e { + background-position: 0px -10340px; +} + +/* line 568, ../../../hub/static/css/mod/emoji.scss */ +.emoji2757 { + background-position: 0px -9160px; +} + +/* line 569, ../../../hub/static/css/mod/emoji.scss */ +.emoji2049 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 570, ../../../hub/static/css/mod/emoji.scss */ +.emoji203c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 571, ../../../hub/static/css/mod/emoji.scss */ +.emoji2753 { + background-position: 0px -9180px; +} + +/* line 572, ../../../hub/static/css/mod/emoji.scss */ +.emoji2754 { + background-position: 0px -9200px; +} + +/* line 573, ../../../hub/static/css/mod/emoji.scss */ +.emoji2755 { + background-position: 0px -9220px; +} + +/* line 574, ../../../hub/static/css/mod/emoji.scss */ +.emoji3030 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 575, ../../../hub/static/css/mod/emoji.scss */ +.emoji27b0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 576, ../../../hub/static/css/mod/emoji.scss */ +.emoji27bf { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 577, ../../../hub/static/css/mod/emoji.scss */ +.emoji2764 { + background-position: 0px -9240px; +} + +/* line 578, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f493 { + background-position: 0px -9480px; +} + +/* line 579, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f494 { + background-position: 0px -9280px; +} + +/* line 580, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f495 { + background-position: 0px -9480px; +} + +/* line 581, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f496 { + background-position: 0px -9480px; +} + +/* line 582, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f497 { + background-position: 0px -9340px; +} + +/* line 583, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f498 { + background-position: 0px -9360px; +} + +/* line 584, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f499 { + background-position: 0px -9380px; +} + +/* line 585, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49a { + background-position: 0px -9400px; +} + +/* line 586, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49b { + background-position: 0px -9420px; +} + +/* line 587, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49c { + background-position: 0px -9440px; +} + +/* line 588, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49d { + background-position: 0px -9460px; +} + +/* line 589, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49e { + background-position: 0px -9480px; +} + +/* line 590, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f49f { + background-position: 0px -9500px; +} + +/* line 591, ../../../hub/static/css/mod/emoji.scss */ +.emoji2665 { + background-position: 0px -9520px; +} + +/* line 592, ../../../hub/static/css/mod/emoji.scss */ +.emoji2660 { + background-position: 0px -9540px; +} + +/* line 593, ../../../hub/static/css/mod/emoji.scss */ +.emoji2666 { + background-position: 0px -9560px; +} + +/* line 594, ../../../hub/static/css/mod/emoji.scss */ +.emoji2663 { + background-position: 0px -9580px; +} + +/* line 595, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ac { + background-position: 0px -9600px; +} + +/* line 596, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ad { + background-position: 0px -9620px; +} + +/* line 597, ../../../hub/static/css/mod/emoji.scss */ +.emoji267f { + background-position: 0px -9640px; +} + +/* line 598, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 599, ../../../hub/static/css/mod/emoji.scss */ +.emoji26a0 { + background-position: 0px -9700px; +} + +/* line 600, ../../../hub/static/css/mod/emoji.scss */ +.emoji26d4 { + background-position: 0px -9720px; +} + +/* line 601, ../../../hub/static/css/mod/emoji.scss */ +.emoji267b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 602, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b2 { + background-position: 0px -6980px; +} + +/* line 603, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b6 { + background-position: 0px -7080px; +} + +/* line 604, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6b9 { + background-position: 0px -9740px; +} + +/* line 605, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ba { + background-position: 0px -9760px; +} + +/* line 606, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6c0 { + background-position: 0px -5220px; +} + +/* line 607, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bb { + background-position: 0px -5240px; +} + +/* line 608, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bd { + background-position: 0px -5260px; +} + +/* line 609, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6be { + background-position: 0px -5280px; +} + +/* line 610, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6bc { + background-position: 0px -9780px; +} + +/* line 611, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 612, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f6ab { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 613, ../../../hub/static/css/mod/emoji.scss */ +.emoji2714 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 614, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f191 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 615, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f192 { + background-position: 0px -10020px; +} + +/* line 616, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f193 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 617, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f194 { + background-position: 0px -11020px; +} + +/* line 618, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f195 { + background-position: 0px -9980px; +} + +/* line 619, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f196 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 620, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f197 { + background-position: 0px -9880px; +} + +/* line 621, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f198 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 622, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f199 { + background-position: 0px -10000px; +} + +/* line 623, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f19a { + background-position: 0px -9960px; +} + +/* line 624, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f201 { + background-position: 0px -10060px; +} + +/* line 625, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f202 { + background-position: 0px -10080px; +} + +/* line 626, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f232 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 627, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f233 { + background-position: 0px -10100px; +} + +/* line 628, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f234 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 629, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f235 { + background-position: 0px -10120px; +} + +/* line 630, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f236 { + background-position: 0px -10140px; +} + +/* line 631, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f21a { + background-position: 0px -10160px; +} + +/* line 632, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f237 { + background-position: 0px -10180px; +} + +/* line 633, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f238 { + background-position: 0px -10200px; +} + +/* line 634, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f239 { + background-position: 0px -10220px; +} + +/* line 635, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f22f { + background-position: 0px -10240px; +} + +/* line 636, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f23a { + background-position: 0px -10260px; +} + +/* line 637, ../../../hub/static/css/mod/emoji.scss */ +.emoji3299 { + background-position: 0px -10280px; +} + +/* line 638, ../../../hub/static/css/mod/emoji.scss */ +.emoji3297 { + background-position: 0px -10300px; +} + +/* line 639, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f250 { + background-position: 0px -10320px; +} + +/* line 640, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f251 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 641, ../../../hub/static/css/mod/emoji.scss */ +.emoji2795 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 642, ../../../hub/static/css/mod/emoji.scss */ +.emoji2796 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 643, ../../../hub/static/css/mod/emoji.scss */ +.emoji2716 { + background-position: 0px -10340px; +} + +/* line 644, ../../../hub/static/css/mod/emoji.scss */ +.emoji2797 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 645, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a0 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 646, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a1 { + background-position: 0px -10360px; +} + +/* line 647, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a2 { + background-position: 0px -10380px; +} + +/* line 648, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a3 { + background-position: 0px -10400px; +} + +/* line 649, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a4 { + background-position: 0px -10420px; +} + +/* line 650, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a5 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 651, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a6 { + background-position: 0px -10460px; +} + +/* line 652, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a7 { + background-position: 0px -10460px; +} + +/* line 653, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a8 { + background-position: 0px -10480px; +} + +/* line 654, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4a9 { + background-position: 0px -5000px; +} + +/* line 655, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4aa { + background-position: 0px -10500px; +} + +/* line 656, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ab { + background-position: 0px -10520px; +} + +/* line 657, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ac { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 658, ../../../hub/static/css/mod/emoji.scss */ +.emoji2728 { + background-position: 0px -11000px; +} + +/* line 659, ../../../hub/static/css/mod/emoji.scss */ +.emoji2734 { + background-position: 0px -10560px; +} + +/* line 660, ../../../hub/static/css/mod/emoji.scss */ +.emoji2733 { + background-position: 0px -10580px; +} + +/* line 661, ../../../hub/static/css/mod/emoji.scss */ +.emoji26aa { + background-position: 0px -10640px; +} + +/* line 662, ../../../hub/static/css/mod/emoji.scss */ +.emoji26ab { + background-position: 0px -10640px; +} + +/* line 663, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f534 { + background-position: 0px -10640px; +} + +/* line 664, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f535 { + background-position: 0px -10900px; +} + +/* line 665, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f532 { + background-position: 0px -10900px; +} + +/* line 666, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f533 { + background-position: 0px -10980px; +} + +/* line 667, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b50 { + background-position: 0px -10720px; +} + +/* line 668, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1c { + background-position: 0px -10980px; +} + +/* line 669, ../../../hub/static/css/mod/emoji.scss */ +.emoji2b1b { + background-position: 0px -10900px; +} + +/* line 670, ../../../hub/static/css/mod/emoji.scss */ +.emoji25ab { + background-position: 0px -10980px; +} + +/* line 671, ../../../hub/static/css/mod/emoji.scss */ +.emoji25aa { + background-position: 0px -10900px; +} + +/* line 672, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fd { + background-position: 0px -10980px; +} + +/* line 673, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fe { + background-position: 0px -10900px; +} + +/* line 674, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fb { + background-position: 0px -10980px; +} + +/* line 675, ../../../hub/static/css/mod/emoji.scss */ +.emoji25fc { + background-position: 0px -10900px; +} + +/* line 676, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f536 { + background-position: 0px -10980px; +} + +/* line 677, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f537 { + background-position: 0px -10980px; +} + +/* line 678, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f538 { + background-position: 0px -10980px; +} + +/* line 679, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f539 { + background-position: 0px -10980px; +} + +/* line 680, ../../../hub/static/css/mod/emoji.scss */ +.emoji2747 { + background-position: 0px -11000px; +} + +/* line 681, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4ae { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 682, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f4af { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 683, ../../../hub/static/css/mod/emoji.scss */ +.emoji21a9 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 684, ../../../hub/static/css/mod/emoji.scss */ +.emoji21aa { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 685, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f503 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 686, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50a { + background-position: 0px -7880px; +} + +/* line 687, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 688, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 689, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50d { + background-position: 0px -11060px; +} + +/* line 690, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50e { + background-position: 0px -11060px; +} + +/* line 691, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f512 { + background-position: 0px -11140px; +} + +/* line 692, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f513 { + background-position: 0px -11100px; +} + +/* line 693, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f50f { + background-position: 0px -11140px; +} + +/* line 694, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f510 { + background-position: 0px -11140px; +} + +/* line 695, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f511 { + background-position: 0px -11160px; +} + +/* line 696, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f514 { + background-position: 0px -4980px; +} + +/* line 697, ../../../hub/static/css/mod/emoji.scss */ +.emoji2611 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 698, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f518 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 699, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f516 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 700, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f517 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 701, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f519 { + background-position: 0px -11180px; +} + +/* line 702, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51a { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 703, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51b { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 704, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51c { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 705, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f51d { + background-position: 0px -10040px; +} + +/* line 706, ../../../hub/static/css/mod/emoji.scss */ +.emoji2003 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 707, ../../../hub/static/css/mod/emoji.scss */ +.emoji2002 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 708, ../../../hub/static/css/mod/emoji.scss */ +.emoji2005 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 709, ../../../hub/static/css/mod/emoji.scss */ +.emoji2705 { + background-position: 0px -9200px; +} + +/* placeholder */ +/* line 710, ../../../hub/static/css/mod/emoji.scss */ +.emoji270a { + background-position: 0px -11220px; +} + +/* line 711, ../../../hub/static/css/mod/emoji.scss */ +.emoji270b { + background-position: 0px -11240px; +} + +/* line 712, ../../../hub/static/css/mod/emoji.scss */ +.emoji270c { + background-position: 0px -11260px; +} + +/* line 713, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44a { + background-position: 0px -11280px; +} + +/* line 714, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44d { + background-position: 0px -11300px; +} + +/* line 715, ../../../hub/static/css/mod/emoji.scss */ +.emoji261d { + background-position: 0px -11320px; +} + +/* line 716, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f446 { + background-position: 0px -11340px; +} + +/* line 717, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f447 { + background-position: 0px -11360px; +} + +/* line 718, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f448 { + background-position: 0px -11380px; +} + +/* line 719, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f449 { + background-position: 0px -11400px; +} + +/* line 720, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44b { + background-position: 0px -11420px; +} + +/* line 721, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44f { + background-position: 0px -11440px; +} + +/* line 722, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44c { + background-position: 0px -11460px; +} + +/* line 723, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f44e { + background-position: 0px -11480px; +} + +/* line 724, ../../../hub/static/css/mod/emoji.scss */ +.emoji1f450 { + background-position: 0px -11500px; +} diff --git a/dist/css/mod/fav-button.css b/dist/css/mod/fav-button.css new file mode 100644 index 0000000..667310f --- /dev/null +++ b/dist/css/mod/fav-button.css @@ -0,0 +1,13 @@ +/* line 1, ../../../hub/static/css/mod/fav-button.scss */ +a#fav-button { + height: 25px; + width: 25px; + display: block; + float: right; + background: url("/static/img/fav_star.png") 0 0 no-repeat; +} + +/* line 2, ../../../hub/static/css/mod/fav-button.scss */ +a#fav-button.faved { + background: url("/static/img/faved_star.png") 0 0 no-repeat; +} diff --git a/dist/css/mod/file-blame-blob.css b/dist/css/mod/file-blame-blob.css new file mode 100644 index 0000000..82bd0f8 --- /dev/null +++ b/dist/css/mod/file-blame-blob.css @@ -0,0 +1,231 @@ +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* line 3, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files { + position: relative; +} + +/* line 6, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file { + margin-top: 0; +} + +/* line 9, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file, .file-box { + border: 1px solid #CCC; + margin-bottom: 13px; + position: relative; + background-color: #DDD; +} + +/* line 15, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta, +.file-box .meta { + overflow: hidden; + padding: 5px 10px; + font-size: 12px; + height: 33px; + text-align: left; + color: #555; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #D8D8D8; + background: #FAFAFA; + background: -moz-linear-gradient(#FAFAFA, #EAEAEA); + background: -webkit-linear-gradient(#FAFAFA, #EAEAEA); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; +} + +/* line 30, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .info, +.file-box .meta .info { + float: left; + height: 33px; + max-width: 555px; + line-height: 33px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +/* line 41, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .info span, +.file-box .meta .info span { + padding-left: 9px; + margin-left: 5px; + border-left: 1px solid #C1C1C1; + box-shadow: inset 1px 0 0 white; +} + +/* line 50, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .info span.icon, +#files .file .meta .info span.diffstat, +.file-box .meta .info span.icon { + line-height: 0; + float: left; + margin: 5px 5px 0 0; + padding: 3px; + background: #F7F7F7; + border: 1px solid #CCC; + border-right-color: #E5E5E5; + border-bottom-color: #E5E5E5; + border-radius: 3px; +} + +/* line 63, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .info span.diffstat { + height: 16px; + padding: 3px 6px; +} + +/* line 67, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .info span:first-child, +#files .file .meta .info .icon + span, +.file-box .meta .info span:first-child, +.file-box .meta .info .icon + span { + border-left: 0 none; + box-shadow: inset 0 0 0 transparent; + margin-left: 0; + padding-left: 0; +} + +/* line 76, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .info span.diffstat .diffstat-bar { + color: #D8D8D8; +} + +/* line 79, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .actions, .file-box .meta .actions { + float: right; + height: 33px; + line-height: 33px; + margin-top: 1px; +} + +/* line 85, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .actions .show-inline-notes { + display: block; + position: relative; + display: block; + float: left; + margin-right: 10px; +} + +/* line 92, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .actions .show-inline-notes label { + font-weight: bold; + margin: 5px 0; +} + +/* line 96, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .actions .show-inline-notes input { + margin: 0; +} + +/* line 99, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .actions .button-group, +.file-box .meta .actions .button-group { + float: right; + margin-top: 2px; +} + +/* line 104, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .actions code, +.file-box .meta .actions code { + background: inherit; + border: none; + font-size: 11px; + color: inherit; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + padding: 0; +} + +/* line 114, ../../../hub/static/css/mod/file-blame-blob.scss */ +.file { + margin: 15px 0; +} + +/* line 118, ../../../hub/static/css/mod/file-blame-blob.scss */ +.file .data { + overflow: auto; +} + +/* line 120, ../../../hub/static/css/mod/file-blame-blob.scss */ +.change #files .file, .file-box, .change .file { + margin-bottom: 0; +} + +/* line 122, ../../../hub/static/css/mod/file-blame-blob.scss */ +.blame .line-data { + font-size: 12px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; +} diff --git a/dist/css/mod/file-blob.css b/dist/css/mod/file-blob.css new file mode 100644 index 0000000..b382db1 --- /dev/null +++ b/dist/css/mod/file-blob.css @@ -0,0 +1,157 @@ +/* button list */ +/* line 3, ../../../hub/static/css/mod/file-blob.scss */ +.button-group { + display: inline-block; + overflow: hidden; + border: 1px solid #d4d4d4; + border-radius: 3px; + border-bottom-color: #bcbcbc; + background: #f5f5f5; + background: -moz-linear-gradient(#f5f5f5, #e5e5e5); + background: -webkit-linear-gradient(#f5f5f5, #e5e5e5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; +} + +/* line 4, ../../../hub/static/css/mod/file-blob.scss */ +.button-group li { + margin: 0 !important; + float: left; +} + +/* line 5, ../../../hub/static/css/mod/file-blob.scss */ +.button-group li:first-child .grouped-button { + border-left: none; + border-bottom-left-radius: 2px; + border-top-left-radius: 2px; +} + +/* line 6, ../../../hub/static/css/mod/file-blob.scss */ +.button-group li:last-child .grouped-button { + border-right: none; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 2px; +} + +/* line 7, ../../../hub/static/css/mod/file-blob.scss */ +.button-group .grouped-button { + float: left; + background: none; + border-bottom: none; + border-top: none; + border-left: 1px solid rgba(0, 0, 0, 0.1); + border-right: 1px solid rgba(255, 255, 255, 0.5); + border-radius: 0; + cursor: pointer; +} + +/* line 8, ../../../hub/static/css/mod/file-blob.scss */ +.button-group .minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line-no */ +/* line 12, ../../../hub/static/css/mod/file-blob.scss */ +#blob .file { + min-height: 78px; + position: relative; + overflow: auto; +} + +/* line 13, ../../../hub/static/css/mod/file-blob.scss */ +#blob .file .rawfile { + text-align: center; + background-color: #ddd; + padding: 30px; + position: relative; +} + +/* line 14, ../../../hub/static/css/mod/file-blob.scss */ +.file table { + width: 100%; + border-collapse: collapse; + border-spacing: 0; +} + +/* line 15, ../../../hub/static/css/mod/file-blob.scss */ +.file table td, .file table th { + vertical-align: top; + padding: 0; +} + +/* line 16, ../../../hub/static/css/mod/file-blob.scss */ +.file .data { + overflow: auto; +} + +/* line 18, ../../../hub/static/css/mod/file-blob.scss */ +.code { + width: 100%; +} + +/* line 19, ../../../hub/static/css/mod/file-blob.scss */ +.code .highlight pre { + margin: 0; + padding: 8px; + border: none; + background-color: #FFF; + white-space: pre; +} + +/* line 20, ../../../hub/static/css/mod/file-blob.scss */ +.code .highlight pre a { + display: block; +} + +/* line 23, ../../../hub/static/css/mod/file-blob.scss */ +.linenos .linenodiv pre { + background-color: #ECECEC; + padding: 8px; + border: none; + border-right: 1px solid #DDD; + text-align: right; + white-space: pre; +} + +/* line 24, ../../../hub/static/css/mod/file-blob.scss */ +.linenos .linenodiv pre a { + color: #AAA; + text-decoration: none; + white-space: nowrap; + line-height: 18px; +} + +/* line 25, ../../../hub/static/css/mod/file-blob.scss */ +.code .highlight pre, .linenos .linenodiv pre { + margin: 0; + line-height: 18px; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +/* line 32, ../../../hub/static/css/mod/file-blob.scss */ +.linenos { + padding: 0; +} diff --git a/dist/css/mod/file-browser.css b/dist/css/mod/file-browser.css new file mode 100644 index 0000000..8c115b0 --- /dev/null +++ b/dist/css/mod/file-browser.css @@ -0,0 +1,64 @@ +/* line 1, ../../../hub/static/css/mod/file-browser.scss */ +#tree, #blob { + margin: 0 0 27px; +} + +/* line 3, ../../../hub/static/css/mod/file-browser.scss */ +.tree-browser { + width: 100%; + margin: 0; + border-radius: 3px; + border: 1px solid #CACACA; +} + +/* line 4, ../../../hub/static/css/mod/file-browser.scss */ +.tree-browser th { + text-align: left; + font-weight: bold; + padding: 6px 3px; + color: #555; + text-shadow: 0 1px 0 #fff; + border-bottom: 1px solid #d8d8d8; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; +} + +/* line 5, ../../../hub/static/css/mod/file-browser.scss */ +.tree-browser td { + background: #f8f8f8; + border-bottom: 1px solid #eee; + padding: 7px 3px; + color: #484848; + vertical-align: middle; +} + +/* line 6, ../../../hub/static/css/mod/file-browser.scss */ +.tree-browser tbody tr:last-child td { + border-bottom: 0; +} + +/* line 7, ../../../hub/static/css/mod/file-browser.scss */ +.tree-browser .message { + min-width: 270px; + max-width: 484px; +} + +/* line 8, ../../../hub/static/css/mod/file-browser.scss */ +.tree-browser td a.message { + color: #484848; +} + +/* line 10, ../../../hub/static/css/mod/file-browser.scss */ +.tree-browser i, .file i, .commit-group-item i { + filter: alpha(opacity=70); + opacity: .7; +} + +/* line 11, ../../../hub/static/css/mod/file-browser.scss */ +.file .error { + text-align: center; + margin: 30px; + color: #666; +} diff --git a/dist/css/mod/file-diff-blob.css b/dist/css/mod/file-diff-blob.css new file mode 100644 index 0000000..62a6c4a --- /dev/null +++ b/dist/css/mod/file-diff-blob.css @@ -0,0 +1,605 @@ +/* button list */ +/* line 3, ../../../hub/static/css/mod/file-blob.scss */ +.button-group { + display: inline-block; + overflow: hidden; + border: 1px solid #d4d4d4; + border-radius: 3px; + border-bottom-color: #bcbcbc; + background: #f5f5f5; + background: -moz-linear-gradient(#f5f5f5, #e5e5e5); + background: -webkit-linear-gradient(#f5f5f5, #e5e5e5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; +} + +/* line 4, ../../../hub/static/css/mod/file-blob.scss */ +.button-group li { + margin: 0 !important; + float: left; +} + +/* line 5, ../../../hub/static/css/mod/file-blob.scss */ +.button-group li:first-child .grouped-button { + border-left: none; + border-bottom-left-radius: 2px; + border-top-left-radius: 2px; +} + +/* line 6, ../../../hub/static/css/mod/file-blob.scss */ +.button-group li:last-child .grouped-button { + border-right: none; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 2px; +} + +/* line 7, ../../../hub/static/css/mod/file-blob.scss */ +.button-group .grouped-button { + float: left; + background: none; + border-bottom: none; + border-top: none; + border-left: 1px solid rgba(0, 0, 0, 0.1); + border-right: 1px solid rgba(255, 255, 255, 0.5); + border-radius: 0; + cursor: pointer; +} + +/* line 8, ../../../hub/static/css/mod/file-blob.scss */ +.button-group .minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line-no */ +/* line 12, ../../../hub/static/css/mod/file-blob.scss */ +#blob .file { + min-height: 78px; + position: relative; + overflow: auto; +} + +/* line 13, ../../../hub/static/css/mod/file-blob.scss */ +#blob .file .rawfile { + text-align: center; + background-color: #ddd; + padding: 30px; + position: relative; +} + +/* line 14, ../../../hub/static/css/mod/file-blob.scss */ +.file table { + width: 100%; + border-collapse: collapse; + border-spacing: 0; +} + +/* line 15, ../../../hub/static/css/mod/file-blob.scss */ +.file table td, .file table th { + vertical-align: top; + padding: 0; +} + +/* line 16, ../../../hub/static/css/mod/file-blob.scss */ +.file .data { + overflow: auto; +} + +/* line 18, ../../../hub/static/css/mod/file-blob.scss */ +.code { + width: 100%; +} + +/* line 19, ../../../hub/static/css/mod/file-blob.scss */ +.code .highlight pre { + margin: 0; + padding: 8px; + border: none; + background-color: #FFF; + white-space: pre; +} + +/* line 20, ../../../hub/static/css/mod/file-blob.scss */ +.code .highlight pre a { + display: block; +} + +/* line 23, ../../../hub/static/css/mod/file-blob.scss */ +.linenos .linenodiv pre { + background-color: #ECECEC; + padding: 8px; + border: none; + border-right: 1px solid #DDD; + text-align: right; + white-space: pre; +} + +/* line 24, ../../../hub/static/css/mod/file-blob.scss */ +.linenos .linenodiv pre a { + color: #AAA; + text-decoration: none; + white-space: nowrap; + line-height: 18px; +} + +/* line 25, ../../../hub/static/css/mod/file-blob.scss */ +.code .highlight pre, .linenos .linenodiv pre { + margin: 0; + line-height: 18px; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +/* line 32, ../../../hub/static/css/mod/file-blob.scss */ +.linenos { + padding: 0; +} + +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 400; + src: local("Source Code Pro"), local("SourceCodePro-Regular"), url("/static/css/fonts/SourceCodePro-Regular.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 500; + src: local("Source Code Pro Medium"), local("SourceCodePro-Medium"), url("/static/css/fonts/SourceCodePro-Medium.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 600; + src: local("Source Code Pro Semibold"), local("SourceCodePro-Semibold"), url("/static/css/fonts/SourceCodePro-Semibold.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 700; + src: local("Source Code Pro Bold"), local("SourceCodePro-Bold"), url("/static/css/fonts/SourceCodePro-Bold.woff") format("woff"); +} +/* line 3, ../../../hub/static/css/mod/diff-base.scss */ +.code pre, xmp, plaintext, listing { + display: block; + font-size: 13px; + font-family: 'Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; + white-space: pre; + margin: 0; + padding: 0; +} + +/* line 12, ../../../hub/static/css/mod/diff-base.scss */ +.code pre { + line-height: 18px; +} + +/* line 16, ../../../hub/static/css/mod/diff-base.scss */ +.font-consolas pre { + font-family: Consolas,'Source Code Pro',Courier,Monaco,Menlo,monospace; +} + +/* line 20, ../../../hub/static/css/mod/diff-base.scss */ +.font-monaco pre { + font-family: Monaco,'Source Code Pro',Courier,Consolas,Menlo,monospace; +} + +/* line 24, ../../../hub/static/css/mod/diff-base.scss */ +.font-courier pre { + font-family: Courier,'Source Code Pro',Monaco,Consolas,Menlo,monospace; +} + +/* line 28, ../../../hub/static/css/mod/diff-base.scss */ +.font-dejavu pre { + font-family: 'DejaVu Sans Mono','Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; +} + +/* line 32, ../../../hub/static/css/mod/diff-base.scss */ +.font-ubuntu pre { + font-family: 'Ubuntu Mono','Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; +} + +/* line 37, ../../../hub/static/css/mod/diff-base.scss */ +pre, code, tt { + font-size: 12px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + border: 0; +} + +/* line 43, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .normal { + background-color: #FFF; +} + +/* line 47, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .deletion { + color: black; + background-color: #FDD; +} +/* line 50, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .deletion .x, .highlight .deletion .c { + color: black; + background-color: #ffaaaa; +} + +/* line 56, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .insertion { + color: black; + background-color: #DFD; +} +/* line 59, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .insertion .i, .highlight .insertion .c { + color: black; + background-color: #aaffaa; +} + +/* line 65, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped { + color: #cacaca; + background-color: #f9f9f9; +} +/* line 69, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a { + color: #cacaca; + vertical-align: middle; +} +/* line 73, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a:hover { + text-decoration: none; +} +/* line 77, ../../../hub/static/css/mod/diff-base.scss */ +.highlight .skipped a[data-type="after"], .highlight .skipped a[data-type="before"] { + font-size: 20px; +} + +/* line 1, ../../../hub/static/css/mod/colorcube.scss */ +.colorcube { + position: absolute; + width: 30px; + height: 30px; + border: 1px solid #DDD; +} + +/* line 2, ../../../hub/static/css/mod/colorcube.scss */ +.colorcube::before { + content: ""; + display: block; + height: 0; + width: 0; + border: 5px solid #DDD; + border-width: 5px; + border-color: #DDD transparent transparent transparent; + left: 10px; + top: 30px; + float: left; + position: absolute; +} + +/* line 5, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .line_numbers, .file-box .data .line_numbers { + background-color: #ECECEC; + color: #AAA; + padding: 0 2px 0 16px; + border-right: 1px solid #DDD; + text-align: right; + cursor: pointer; +} +/* line 12, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .line_numbers.deletion, .file-box .data .line_numbers.deletion { + color: #AAA; + background-color: #f7c8c8; +} +/* line 16, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .line_numbers.insertion, .file-box .data .line_numbers.insertion { + color: #AAA; + background-color: #ceffce; +} + +/* line 21, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .line_numbers a { + color: #AAA; +} + +/* line 24, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .code { + width: 100%; +} + +/* line 28, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .side { + overflow-x: none; + display: none; +} + +/* line 33, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .side .file-col { + width: 50%; + float: left; + overflow-x: auto; +} + +/* line 40, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .diff-table { + border-collapse: collapse; +} + +/* line 44, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files.commentable tr td pre:hover { + background-color: #FFC; +} + +/* line 46, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .diff-table pre { + border-radius: 0px; +} + +/* line 48, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data table, .file-box .data table { + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + font-size: 12px; + line-height: 1.4; +} + +/* line 54, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file .data .file-diff-line span.color { + cursor: default; +} + +/* Comment Bubble */ +/* line 58, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file-diff-line .add-bubble { + position: absolute; + left: 0; + width: 25px; + height: 16px; + margin-top: 0; + cursor: pointer; + opacity: 0; + color: #4183C4; +} + +/* line 69, ../../../hub/static/css/mod/file-diff-blob.scss */ +#files .file-diff-line:hover .add-bubble { + opacity: 1; +} + +/* Comment Bubble icons */ +/* line 72, ../../../hub/static/css/mod/file-diff-blob.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 83, ../../../hub/static/css/mod/file-diff-blob.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +/* line 91, ../../../hub/static/css/mod/file-diff-blob.scss */ +.mini-icon-add-comment::before { + content: "\f06f"; +} + +/* line 93, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container:first-child:after { + margin: -18px 0 0; +} + +/* line 97, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container:after { + background: none repeat scroll 0 0 #fff; + content: ""; + display: block; + height: 2px; + margin: -16px 0 0; + position: absolute; + left: 0px; + width: 938px; +} + +/* line 109, ../../../hub/static/css/mod/file-diff-blob.scss */ +.data .line-numbers-skipped { + position: absolute; + width: 79px; + background-color: #f5f5f5; + border-right: 1px solid #ccc; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; +} + +/* line 119, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .skipped-top, .skipped-container .skipped-bottom { + height: 18px; + background-color: #f5f5f5; +} + +/* line 124, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-top::before { + background: #fff; + border-bottom: 1px solid #ccc; + border-top: 1px solid #ccc; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + content: ""; + display: block; + height: 4px; + position: relative; + top: -1px; + margin-left: -1px; +} + +/* line 140, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .ellipsis:hover { + background-color: #e6e6e6; + border-color: #999; +} + +/* line 145, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .ellipsis { + background: #f5f5f5; + border: 1px solid #ccc; + -moz-border-radius: 3px; + border-radius: 3px; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + box-shadow: 0 0 0 2px #fff; + cursor: pointer; + display: block; + float: left; + font-family: Arial, sans-serif; + font-size: 20px; + text-align: center; + color: #707070; + height: 16px; + line-height: 6px; + margin: 0 0 0 5px; + padding: 0; + position: absolute; + width: 30px; + z-index: 10; +} + +/* line 170, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-top .ellipsis { + margin-top: -10px; +} + +/* line 174, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .ellipsis::before, .skipped-container .ellipsis::after { + border: 1px solid #ccc; + -moz-border-radius: 4px; + border-radius: 4px; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + content: ""; + height: 9px; + left: -4px; + width: 36px; + position: absolute; +} + +/* line 188, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .ellipsis::before { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + content: "\2026"; + padding: 2px 0 0; + top: -4px; +} + +/* line 197, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .ellipsis::after { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; + bottom: -4px; + height: 10px; +} + +/* line 206, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .toggle_whitespace:hover { + background-color: #e6e6e6; + border-color: #999; +} + +/* line 211, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .toggle_whitespace { + background: #f5f5f5; + border: 1px solid #ccc; + -moz-border-radius: 3px; + border-radius: 3px; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + box-shadow: 0 0 0 2px #fff; + cursor: pointer; + display: block; + float: left; + font-family: Arial, sans-serif; + font-size: 16px; + text-align: center; + color: #707070; + height: 16px; + line-height: 6px; + margin: 0 0 0 44px; + padding: 0; + position: absolute; + width: 30px; + z-index: 10; +} + +/* line 236, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-top .toggle_whitespace { + margin-top: -10px; +} + +/* line 240, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .toggle_whitespace::before, .skipped-container .toggle_whitespace::after { + border: 1px solid #ccc; + -moz-border-radius: 4px; + border-radius: 4px; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + content: ""; + height: 9px; + left: -4px; + width: 36px; + position: absolute; +} + +/* line 254, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .toggle_whitespace::before { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + content: "\2423"; + padding: 2px 0 0; + top: -4px; +} + +/* line 263, ../../../hub/static/css/mod/file-diff-blob.scss */ +.skipped-container .toggle_whitespace::after { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; + bottom: -4px; + height: 10px; +} diff --git a/dist/css/mod/filter-tabs.css b/dist/css/mod/filter-tabs.css new file mode 100644 index 0000000..d0dd084 --- /dev/null +++ b/dist/css/mod/filter-tabs.css @@ -0,0 +1,33 @@ +/* line 1, ../../../hub/static/css/mod/filter-tabs.scss */ +.list-browser-filter-tabs { + display: block; + float: left; + padding: 5px 5px 0; + overflow: hidden; +} +/* line 6, ../../../hub/static/css/mod/filter-tabs.scss */ +.list-browser-filter-tabs .filter-tab { + display: inline-block; + padding: 0 8px; + height: 24px; + line-height: 24px; + font-size: 12px; + font-weight: bold; + color: #888; + -webkit-font-smoothing: antialiased; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.3); + text-decoration: none; + border: 1px solid #CCC; + border-bottom: 0; + border-radius: 3px 3px 0 0; + background: rgba(255, 255, 255, 0.2); + cursor: pointer; +} +/* line 23, ../../../hub/static/css/mod/filter-tabs.scss */ +.list-browser-filter-tabs .selected { + color: #333; + background: white; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + border-color: #B4B4B4; + border-bottom: 1px solid white; +} diff --git a/dist/css/mod/flat-hack.css b/dist/css/mod/flat-hack.css new file mode 100644 index 0000000..f387ef8 --- /dev/null +++ b/dist/css/mod/flat-hack.css @@ -0,0 +1,4 @@ +/* line 2, ../../../hub/static/css/mod/flat-hack.scss */ +a.btn i { + padding-right: 5px; +} diff --git a/dist/css/mod/flatui-comment-content.css b/dist/css/mod/flatui-comment-content.css new file mode 100644 index 0000000..b94772c --- /dev/null +++ b/dist/css/mod/flatui-comment-content.css @@ -0,0 +1,729 @@ +@charset "UTF-8"; +/* preview comment form style */ +/* line 2, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav { + margin: 10px 0; + border-bottom: 1px solid #DDD; + height: 35px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs { + display: inline-block; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs > li { + display: inline-block; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab { + display: inline-block; + margin-bottom: -1px; + padding: 8px 12px 9px; + border: 1px solid transparent; + border-bottom: 0; + font-size: 14px; + color: #666; + text-decoration: none; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab.selected { + border-color: #DDD; + border-radius: 3px 3px 0 0; + background-color: white; + color: #333; + font-weight: bold; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab:hover { + text-decoration: none; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav { + position: relative; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav ul.tabnav-tabs { + padding-left: 10px; +} + +/* line 10, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 0 10px 10px; +} + +/* line 11, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form #preview_bucket .content-body { + padding: 10px; + min-height: 132px; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form.tab-content { + overflow: initial; + position: relative; +} + +/* line 2, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 10px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-actions { + padding: 0; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + position: relative; + border: 3px solid #EEE; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + padding: 0; + background: #EEE; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content .write-content { + padding: 0 10px 10px; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; + margin: 0; +} + +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary, button.primary.classy:disabled, button.primary.classy.disabled, button.primary.classy:disabled:hover, button.primary.classy.disabled:disabled:hover, button.classy:disabled:hover.primary, button.classy.disabled:disabled:hover.primary { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4); + border-color: #74BB5A; + border-bottom-color: #509338; + background: #8ADD6D; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#8add6d', endColorstr='#60b044')"; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); + background-image: -webkit-linear-gradient(top, #8ADD6D, #60B044); +} + +/* line 2, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary.disabled { + opacity: 0.5; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy, +button.classy:disabled, +button.classy.disabled, +a.button.classy:disabled, +a.button.classy.disabled, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover:disabled, +a.button.classy.disabled:hover, +a.button.classy, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy:disabled:hover, +a.button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover { + display: inline-block; + padding: 8px 15px; + line-height: normal; + position: relative; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 12px; + font-weight: bold; + color: #666; + text-shadow: 0 1px rgba(255, 255, 255, 0.9); + background: whiteSmoke; + background: -moz-linear-gradient(whiteSmoke, #E5E5E5); + background: -webkit-linear-gradient(whiteSmoke, #E5E5E5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; + border-radius: 3px; + border: 1px solid #DDD; + border-bottom-color: #BBB; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* ================================== *\ + * Zen Form + * ================================== */ +/* line 6, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + position: fixed; + z-index: 99999; + top: 0; + left: 0; + right: 0; + bottom: 0; + padding: 24px 30px 24px 24px; +} + +/* line 16, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-input-wrap { + max-width: 640px; + position: relative; + margin: 0 auto; +} + +/** + * Buttons style + */ +/* line 25, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button, +.zen-forms-theme-switch { + position: absolute; + width: 18px; + height: 18px; + text-align: center; + top: 10px; + right: 10px; + font-size: 24px; + color: #516066; + cursor: pointer; + line-height: 1; +} + +/* line 39, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-theme-switch { + top: 28px; + font-size: 34px; +} + +/* line 44, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button:hover, +.zen-forms-theme-switch:hover { + color: #667981; +} + +/** + * Inputs basic style + */ +/* line 52, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + padding: 8px 0; + width: 100%; + background: none; + border: none; + margin-bottom: 24px; + cursor: pointer; +} + +/* line 62, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus, +.zen-forms textarea:focus { + cursor: text; +} + +/* line 67, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms textarea { + resize: none; +} + +/* line 71, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + cursor: pointer; + display: none; + padding: 8px 3; + position: absolute; + top: 0; + width: 100%; +} + +/* line 80, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms .empty + label { + display: block; +} + +/* line 84, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus + label, +.zen-forms textarea:focus + label { + display: none; +} + +/* line 89, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms :focus { + outline-color: transparent; + outline-style: none; +} + +/** + * Dark theme + */ +/* line 97, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + background: #151a1c; +} + +/* line 101, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + color: #516066; +} + +/* line 105, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + color: #667981; +} + +/** + * Light theme + */ +/* line 113, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme { + background: #fefefe; +} + +/* line 117, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme label { + color: #959697; +} + +/* line 121, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme input, +.zen-forms.light-theme textarea { + color: #707071; +} + +/* line 4, ../../../hub/static/css/mod/zen-forms.scss */ +.write-content .enable-fullscreen { + position: absolute; + top: 5px; + right: 16px; + color: #333333; + opacity: .5; + line-height: 1em; +} + +/* line 5, ../../../hub/static/css/mod/zen-forms.scss */ +.mini-icon-fullscreen::before { + content: ""; +} + +/* line 6, ../../../hub/static/css/mod/zen-forms.scss */ +.fullscreen-overlay textarea, .zen-forms textarea { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + height: 100%; + padding: 20px; + border: 0; + font-size: 21px; + line-height: 1.6em; + resize: none; + -moz-transition: color 0.15s ease-in 0; + -webkit-transition: color 0.15s ease-in 0; + transition: color 0.15s ease-in 0; + box-shadow: none; +} + +/* line 7, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms.light-theme textarea { + background: #fff; + color: #999999; +} + +/* line 8, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms .zen-forms-input-wrap { + width: 100%; + height: 100%; +} + +/* line 9, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms label[for^=zen-forms-input] { + display: none; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-zen.scss */ +.previewable-comment-form .zen-enabled textarea { + padding: 10px 18px 10px 10px; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled { + position: relative; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled .go-zen { + position: absolute; + right: 15px; + top: 5px; +} + +/* line 1, ../../../hub/static/css/mod/loader.scss */ +.loader { + display: none; + position: absolute; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + background-color: #eee; +} + +/* line 2, ../../../hub/static/css/mod/loader.scss */ +.loader .spinner { + display: block; + width: 32px; + height: 32px; + margin: 0 auto; + top: 121px; + position: relative; + background: url(/static/img/spinner.gif) no-repeat; +} + +/* line 1, ../../../hub/static/css/mod/upload-widget.scss */ +.upload-widget { + position: relative; + top: -50px; + width: 360px; +} +/* line 7, ../../../hub/static/css/mod/upload-widget.scss */ +.upload-widget input { + position: absolute; + width: 120px; + opacity: 0.0001; + cursor: pointer; + margin: 0; +} +/* line 15, ../../../hub/static/css/mod/upload-widget.scss */ +.upload-widget form { + width: 120px; + float: left; +} + +/* line 1, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view { + position: absolute; + top: 0; + left: 0; + display: none; + margin-top: 18px; + background: white; + border: 1px solid #DDD; + border-radius: 3px; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + min-width: 120px; + z-index: 10; +} + +/* line 15, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur { + background: #3366FF; + color: white; +} + +/* line 19, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur small { + color: white; +} + +/* line 22, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view strong { + color: #3366FF; +} + +/* line 25, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur strong { + color: white; + font: bold; +} + +/* line 29, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul { + /* width: 100px; */ + list-style: none; + padding: 0; + margin: auto; +} + +/* line 35, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul li { + display: block; + padding: 5px 10px; + border-bottom: 1px solid #DDD; + cursor: pointer; + /* border-top: 1px solid #C8C8C8; */ +} + +/* line 42, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view small { + font-size: smaller; + color: #777; + font-weight: normal; +} + +/* line 11, ../../../hub/static/css/mod/flatui-comment-form.scss */ +.side-avatar { + float: left; + padding: 0px 5px 5px; + vertical-align: top; + margin-left: 0; +} + +/* line 18, ../../../hub/static/css/mod/flatui-comment-form.scss */ +.comment-form-head li { + line-height: 18px; +} + +/* line 22, ../../../hub/static/css/mod/flatui-comment-form.scss */ +#form-file-upload { + position: relative; + top: -50px; + width: 360px; +} + +/* line 28, ../../../hub/static/css/mod/flatui-comment-form.scss */ +#form-file-upload #file { + position: absolute; + width: 240px; + margin-left: -80px; + opacity: 0.0001; + cursor: pointer; +} + +/* line 36, ../../../hub/static/css/mod/flatui-comment-form.scss */ +.form-content { + padding: 10px; + display: none; + opacity: 1.0; +} + +/* line 43, ../../../hub/static/css/mod/flatui-comment-form.scss */ +form#add-comment-form .form-content { + display: block; + background: white; + border: 0px solid; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} +/* line 49, ../../../hub/static/css/mod/flatui-comment-form.scss */ +form#add-comment-form .form-content textarea#new_comment_content { + width: 100%; + background: white; +} +/* line 54, ../../../hub/static/css/mod/flatui-comment-form.scss */ +form#add-comment-form .form-content .tabnav { + border-bottom: none; + padding: 10px; +} +/* line 59, ../../../hub/static/css/mod/flatui-comment-form.scss */ +form#add-comment-form .form-content .write-content { + position: relative; + padding: 10px 10px 10px; +} + +/* Zen Mode button hacks for FlatUI */ +/* line 67, ../../../hub/static/css/mod/flatui-comment-form.scss */ +.write-content .enable-fullscreen { + top: 15px; +} + +/* line 71, ../../../hub/static/css/mod/flatui-comment-form.scss */ +.tab-content { + overflow: visible; +} + +/* Issue for Responsive Mobile Hacks */ +@media (max-width: 767px) { + /* line 79, ../../../hub/static/css/mod/flatui-comment-form.scss */ + .side-avatar { + padding: 0px; + } + + /* line 85, ../../../hub/static/css/mod/flatui-comment-form.scss */ + form#add-comment-form .form-content .tabnav { + max-width: 100%; + } +} +/* hacks for markdown paragraph content for flatui */ +/* line 4, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.markdown-body p, .markdown-body blockquote, .markdown-body ul, .markdown-body ol, .markdown-body dl, .markdown-body table, .markdown-body pre { + margin: 15px 0px 0px 0px; +} + +/* line 8, ../../../hub/static/css/mod/flatui-comment-content.scss */ +#summary.mod .header { + position: relative; +} + +/* line 12, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.mini-icon-edit:before { + content: ""; +} + +/* line 13, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.mini-icon-delete-note::before, .mini-icon-remove-close::before { + content: ""; +} + +/* line 15, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.content .form-content input.title-field { + font-size: 20px; + font-weight: bold; + margin-bottom: 5px; + width: 99%; +} + +/* line 22, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.content .form-content textarea { + min-height: 100px; + max-width: 100%; + width: 99%; + margin: 0; +} + +/* line 29, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.form-actions { + background-color: transparent; + border: none; + text-align: right; + margin: 0px; + padding: 10px 0px 0px; +} + +/* line 37, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.change-header-right { + float: right; +} +/* line 39, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.change-header-right a.change-header-date { + color: lightgray; +} + +/* line 44, ../../../hub/static/css/mod/flatui-comment-content.scss */ +ul.comment-header-actions { + margin-left: 10px; + display: inline; +} +/* line 47, ../../../hub/static/css/mod/flatui-comment-content.scss */ +ul.comment-header-actions li { + display: inline; +} + +/* line 52, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.comment-body { + padding: 0px; +} + +/* line 56, ../../../hub/static/css/mod/flatui-comment-content.scss */ +.markdown-body { + padding: 0px; +} diff --git a/dist/css/mod/flatui-comment-form.css b/dist/css/mod/flatui-comment-form.css new file mode 100644 index 0000000..163cb37 --- /dev/null +++ b/dist/css/mod/flatui-comment-form.css @@ -0,0 +1,655 @@ +@charset "UTF-8"; +/* preview comment form style */ +/* line 2, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav { + margin: 10px 0; + border-bottom: 1px solid #DDD; + height: 35px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs { + display: inline-block; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs > li { + display: inline-block; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab { + display: inline-block; + margin-bottom: -1px; + padding: 8px 12px 9px; + border: 1px solid transparent; + border-bottom: 0; + font-size: 14px; + color: #666; + text-decoration: none; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab.selected { + border-color: #DDD; + border-radius: 3px 3px 0 0; + background-color: white; + color: #333; + font-weight: bold; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab:hover { + text-decoration: none; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav { + position: relative; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav ul.tabnav-tabs { + padding-left: 10px; +} + +/* line 10, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 0 10px 10px; +} + +/* line 11, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form #preview_bucket .content-body { + padding: 10px; + min-height: 132px; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form.tab-content { + overflow: initial; + position: relative; +} + +/* line 2, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 10px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-actions { + padding: 0; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + position: relative; + border: 3px solid #EEE; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + padding: 0; + background: #EEE; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content .write-content { + padding: 0 10px 10px; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; + margin: 0; +} + +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary, button.primary.classy:disabled, button.primary.classy.disabled, button.primary.classy:disabled:hover, button.primary.classy.disabled:disabled:hover, button.classy:disabled:hover.primary, button.classy.disabled:disabled:hover.primary { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4); + border-color: #74BB5A; + border-bottom-color: #509338; + background: #8ADD6D; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#8add6d', endColorstr='#60b044')"; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); + background-image: -webkit-linear-gradient(top, #8ADD6D, #60B044); +} + +/* line 2, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary.disabled { + opacity: 0.5; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy, +button.classy:disabled, +button.classy.disabled, +a.button.classy:disabled, +a.button.classy.disabled, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover:disabled, +a.button.classy.disabled:hover, +a.button.classy, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy:disabled:hover, +a.button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover { + display: inline-block; + padding: 8px 15px; + line-height: normal; + position: relative; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 12px; + font-weight: bold; + color: #666; + text-shadow: 0 1px rgba(255, 255, 255, 0.9); + background: whiteSmoke; + background: -moz-linear-gradient(whiteSmoke, #E5E5E5); + background: -webkit-linear-gradient(whiteSmoke, #E5E5E5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; + border-radius: 3px; + border: 1px solid #DDD; + border-bottom-color: #BBB; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* ================================== *\ + * Zen Form + * ================================== */ +/* line 6, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + position: fixed; + z-index: 99999; + top: 0; + left: 0; + right: 0; + bottom: 0; + padding: 24px 30px 24px 24px; +} + +/* line 16, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-input-wrap { + max-width: 640px; + position: relative; + margin: 0 auto; +} + +/** + * Buttons style + */ +/* line 25, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button, +.zen-forms-theme-switch { + position: absolute; + width: 18px; + height: 18px; + text-align: center; + top: 10px; + right: 10px; + font-size: 24px; + color: #516066; + cursor: pointer; + line-height: 1; +} + +/* line 39, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-theme-switch { + top: 28px; + font-size: 34px; +} + +/* line 44, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button:hover, +.zen-forms-theme-switch:hover { + color: #667981; +} + +/** + * Inputs basic style + */ +/* line 52, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + padding: 8px 0; + width: 100%; + background: none; + border: none; + margin-bottom: 24px; + cursor: pointer; +} + +/* line 62, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus, +.zen-forms textarea:focus { + cursor: text; +} + +/* line 67, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms textarea { + resize: none; +} + +/* line 71, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + cursor: pointer; + display: none; + padding: 8px 3; + position: absolute; + top: 0; + width: 100%; +} + +/* line 80, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms .empty + label { + display: block; +} + +/* line 84, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus + label, +.zen-forms textarea:focus + label { + display: none; +} + +/* line 89, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms :focus { + outline-color: transparent; + outline-style: none; +} + +/** + * Dark theme + */ +/* line 97, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + background: #151a1c; +} + +/* line 101, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + color: #516066; +} + +/* line 105, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + color: #667981; +} + +/** + * Light theme + */ +/* line 113, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme { + background: #fefefe; +} + +/* line 117, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme label { + color: #959697; +} + +/* line 121, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme input, +.zen-forms.light-theme textarea { + color: #707071; +} + +/* line 4, ../../../hub/static/css/mod/zen-forms.scss */ +.write-content .enable-fullscreen { + position: absolute; + top: 5px; + right: 16px; + color: #333333; + opacity: .5; + line-height: 1em; +} + +/* line 5, ../../../hub/static/css/mod/zen-forms.scss */ +.mini-icon-fullscreen::before { + content: ""; +} + +/* line 6, ../../../hub/static/css/mod/zen-forms.scss */ +.fullscreen-overlay textarea, .zen-forms textarea { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + height: 100%; + padding: 20px; + border: 0; + font-size: 21px; + line-height: 1.6em; + resize: none; + -moz-transition: color 0.15s ease-in 0; + -webkit-transition: color 0.15s ease-in 0; + transition: color 0.15s ease-in 0; + box-shadow: none; +} + +/* line 7, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms.light-theme textarea { + background: #fff; + color: #999999; +} + +/* line 8, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms .zen-forms-input-wrap { + width: 100%; + height: 100%; +} + +/* line 9, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms label[for^=zen-forms-input] { + display: none; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-zen.scss */ +.previewable-comment-form .zen-enabled textarea { + padding: 10px 18px 10px 10px; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled { + position: relative; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled .go-zen { + position: absolute; + right: 15px; + top: 5px; +} + +/* line 1, ../../../hub/static/css/mod/loader.scss */ +.loader { + display: none; + position: absolute; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + background-color: #eee; +} + +/* line 2, ../../../hub/static/css/mod/loader.scss */ +.loader .spinner { + display: block; + width: 32px; + height: 32px; + margin: 0 auto; + top: 121px; + position: relative; + background: url(/static/img/spinner.gif) no-repeat; +} + +/* line 1, ../../../hub/static/css/mod/upload-widget.scss */ +.upload-widget { + position: relative; + top: -50px; + width: 360px; +} +/* line 7, ../../../hub/static/css/mod/upload-widget.scss */ +.upload-widget input { + position: absolute; + width: 120px; + opacity: 0.0001; + cursor: pointer; + margin: 0; +} +/* line 15, ../../../hub/static/css/mod/upload-widget.scss */ +.upload-widget form { + width: 120px; + float: left; +} + +/* line 1, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view { + position: absolute; + top: 0; + left: 0; + display: none; + margin-top: 18px; + background: white; + border: 1px solid #DDD; + border-radius: 3px; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + min-width: 120px; + z-index: 10; +} + +/* line 15, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur { + background: #3366FF; + color: white; +} + +/* line 19, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur small { + color: white; +} + +/* line 22, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view strong { + color: #3366FF; +} + +/* line 25, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur strong { + color: white; + font: bold; +} + +/* line 29, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul { + /* width: 100px; */ + list-style: none; + padding: 0; + margin: auto; +} + +/* line 35, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul li { + display: block; + padding: 5px 10px; + border-bottom: 1px solid #DDD; + cursor: pointer; + /* border-top: 1px solid #C8C8C8; */ +} + +/* line 42, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view small { + font-size: smaller; + color: #777; + font-weight: normal; +} + +/* line 11, ../../../hub/static/css/mod/flatui-comment-form.scss */ +.side-avatar { + float: left; + padding: 0px 5px 5px; + vertical-align: top; + margin-left: 0; +} + +/* line 18, ../../../hub/static/css/mod/flatui-comment-form.scss */ +.comment-form-head li { + line-height: 18px; +} + +/* line 22, ../../../hub/static/css/mod/flatui-comment-form.scss */ +#form-file-upload { + position: relative; + top: -50px; + width: 360px; +} + +/* line 28, ../../../hub/static/css/mod/flatui-comment-form.scss */ +#form-file-upload #file { + position: absolute; + width: 240px; + margin-left: -80px; + opacity: 0.0001; + cursor: pointer; +} + +/* line 36, ../../../hub/static/css/mod/flatui-comment-form.scss */ +.form-content { + padding: 10px; + display: none; + opacity: 1.0; +} + +/* line 43, ../../../hub/static/css/mod/flatui-comment-form.scss */ +form#add-comment-form .form-content { + display: block; + background: white; + border: 0px solid; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} +/* line 49, ../../../hub/static/css/mod/flatui-comment-form.scss */ +form#add-comment-form .form-content textarea#new_comment_content { + width: 100%; + background: white; +} +/* line 54, ../../../hub/static/css/mod/flatui-comment-form.scss */ +form#add-comment-form .form-content .tabnav { + border-bottom: none; + padding: 10px; +} +/* line 59, ../../../hub/static/css/mod/flatui-comment-form.scss */ +form#add-comment-form .form-content .write-content { + position: relative; + padding: 10px 10px 10px; +} + +/* Zen Mode button hacks for FlatUI */ +/* line 67, ../../../hub/static/css/mod/flatui-comment-form.scss */ +.write-content .enable-fullscreen { + top: 15px; +} + +/* line 71, ../../../hub/static/css/mod/flatui-comment-form.scss */ +.tab-content { + overflow: visible; +} + +/* Issue for Responsive Mobile Hacks */ +@media (max-width: 767px) { + /* line 79, ../../../hub/static/css/mod/flatui-comment-form.scss */ + .side-avatar { + padding: 0px; + } + + /* line 85, ../../../hub/static/css/mod/flatui-comment-form.scss */ + form#add-comment-form .form-content .tabnav { + max-width: 100%; + } +} diff --git a/dist/css/mod/footer.css b/dist/css/mod/footer.css new file mode 100644 index 0000000..8d40e33 --- /dev/null +++ b/dist/css/mod/footer.css @@ -0,0 +1,26 @@ +/* line 1, ../../../hub/static/css/mod/footer.scss */ +#footer { + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background: url("/static/img/pb2.png") no-repeat center center; +} + +/* line 8, ../../../hub/static/css/mod/footer.scss */ +#footer .footer-logo { + float: left; + opacity: 0.6; +} + +/* line 9, ../../../hub/static/css/mod/footer.scss */ +#footer #revision { + color: lightgray; + float: right; + display: inline-table; +} + +/* line 10, ../../../hub/static/css/mod/footer.scss */ +#footer #revision span { + padding: 0 5px; +} diff --git a/dist/css/mod/gist-comment.css b/dist/css/mod/gist-comment.css new file mode 100644 index 0000000..2dfd9b6 --- /dev/null +++ b/dist/css/mod/gist-comment.css @@ -0,0 +1,219 @@ +/* line 1, ../../../hub/static/css/mod/gist-comment.scss */ +.tabnav .tabnav-tabs > li:first-child .tabnav-tab.selected { + padding-left: 12px; +} + +/* line 2, ../../../hub/static/css/mod/gist-comment.scss */ +.previewable-comment-form .tabnav { + margin-bottom: 10px; + margin-top: 10px; + position: relative; +} + +/* line 3, ../../../hub/static/css/mod/gist-comment.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 0 10px 10px; +} + +/* line 4, ../../../hub/static/css/mod/gist-comment.scss */ +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* line 5, ../../../hub/static/css/mod/gist-comment.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + display: none; + padding: 0 10px 10px; +} + +/* line 6, ../../../hub/static/css/mod/gist-comment.scss */ +.previewable-comment-form.write-selected .write-content, .previewable-comment-form.preview-selected .preview-content { + display: block; +} + +/* line 7, ../../../hub/static/css/mod/gist-comment.scss */ +.previewable-comment-form .comment { + border: 1px solid #CACACA; +} + +/* line 8, ../../../hub/static/css/mod/gist-comment.scss */ +.comment-header { + height: 33px; + padding: 0 10px 0 6px; + border-bottom: 1px solid #CCC; + background-color: #E1E1E1; + background-image: -moz-linear-gradient(#F8F8F8, #E1E1E1); + background-image: -webkit-linear-gradient(#F8F8F8, #E1E1E1); + background-image: linear-gradient(#F8F8F8, #E1E1E1); + background-repeat: repeat-x; + font-size: 12px; +} + +/* line 9, ../../../hub/static/css/mod/gist-comment.scss */ +.comment-header .comment-header-gravatar { + display: inline-block; + margin-right: 3px; + vertical-align: middle; + border-radius: 3px; +} + +/* line 10, ../../../hub/static/css/mod/gist-comment.scss */ +.gist-form-actions { + text-align: right; + padding-bottom: 5px; +} + +/* line 11, ../../../hub/static/css/mod/gist-comment.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + display: none; + padding: 0 10px 10px; +} + +/* line 12, ../../../hub/static/css/mod/gist-comment.scss */ +.comment-header .comment-header-author { + display: inline-block; + max-width: 600px; + height: 33px; + line-height: 33px; + font-weight: bold; + color: #222; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.7); + white-space: nowrap; + text-overflow: ellipsis; +} + +/* line 13, ../../../hub/static/css/mod/gist-comment.scss */ +.comment-header a { + color: #666; +} + +/* line 14, ../../../hub/static/css/mod/gist-comment.scss */ +.comment-header a:hover { + text-decoration: underline; +} + +/* line 15, ../../../hub/static/css/mod/gist-comment.scss */ +.comment-header .comment-header-right { + float: right; +} + +/* line 16, ../../../hub/static/css/mod/gist-comment.scss */ +.comment-header .comment-header-date { + display: inline-block; + margin: 0; + height: 33px; + font-size: 11px; + line-height: 33px; + font-style: normal; + color: #777; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.7); + line-height: 33px; +} + +/* line 17, ../../../hub/static/css/mod/gist-comment.scss */ +.comment-content .comment-body { + padding: 10px; + font-size: 13px; + overflow: auto; + width: 100%; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +/* line 18, ../../../hub/static/css/mod/gist-comment.scss */ +.markdown-body { + font-size: 14px; + line-height: 1.6; + overflow: hidden; + background-color: white; +} + +/* line 19, ../../../hub/static/css/mod/gist-comment.scss */ +.comment-content { + color: #333; + font-size: 12px; +} + +/* line 20, ../../../hub/static/css/mod/gist-comment.scss */ +.markdown-body > :last-child { + margin-bottom: 0 !important; +} + +/* line 21, ../../../hub/static/css/mod/gist-comment.scss */ +.markdown-body > :first-child { + margin-top: 0 !important; +} + +/* line 22, ../../../hub/static/css/mod/gist-comment.scss */ +.markdown-body p, .markdown-body blockquote, .markdown-body ul, .markdown-body ol, .markdown-body dl, .markdown-body table, .markdown-body pre { + margin: 15px 0; +} + +/* line 23, ../../../hub/static/css/mod/gist-comment.scss */ +.comment-content .comment-body { + font-size: 13px; +} + +/* line 25, ../../../hub/static/css/mod/gist-comment.scss */ +.export-references { + list-style: none; + margin-top: 18px; +} + +/* line 26, ../../../hub/static/css/mod/gist-comment.scss */ +.export-references li, .export-references label { + color: #999; + font-size: 11px; + margin-bottom: 2px; +} + +/* line 27, ../../../hub/static/css/mod/gist-comment.scss */ +.export-references label { + display: block; + padding: 6px 0 1px; + margin-bottom: 0; +} + +/* line 28, ../../../hub/static/css/mod/gist-comment.scss */ +input.url-field { + border-radius: 3px; + border: 1px solid #CCC; + font-family: Monaco, "Liberation Mono", Courier, monospace; + font-size: 11px; + color: #666; + padding: 0 5px 0 5px; + width: 136px; + height: 24px; + margin-bottom: 0; +} + +/* line 29, ../../../hub/static/css/mod/gist-comment.scss */ +.comment-header-actions { + display: inline-block; + vertical-align: middle; + font-size: 13px; +} + +/* line 30, ../../../hub/static/css/mod/gist-comment.scss */ +.comment-header .mini-icon { + color: #939AA0; + margin: 0 2px 0 1px; + position: relative; + top: 1px; +} + +/* line 31, ../../../hub/static/css/mod/gist-comment.scss */ +.comment-header a:hover { + text-decoration: none; + color: #4183C4; +} diff --git a/dist/css/mod/gist-dropzone.css b/dist/css/mod/gist-dropzone.css new file mode 100644 index 0000000..25ae697 --- /dev/null +++ b/dist/css/mod/gist-dropzone.css @@ -0,0 +1,42 @@ +/* line 1, ../../../hub/static/css/mod/gist-dropzone.scss */ +#dropzone { + display: none; + background: rgba(0, 0, 0, 0.25); + height: 100%; + position: fixed; + top: 0; + left: 0; + width: 100%; + z-index: 100; +} + +/* line 2, ../../../hub/static/css/mod/gist-dropzone.scss */ +#dropzone #dropzone-pill { + background: rgba(0, 0, 0, 0.75); + border-radius: 6px; + color: #fff; + font-weight: bold; + text-align: center; + margin-left: -100px; + margin-top: -60px; + padding: 20px; + width: 160px; + height: 80px; + position: absolute; + top: 50%; + left: 50%; +} + +/* line 3, ../../../hub/static/css/mod/gist-dropzone.scss */ +#dropzone .mega-icon-code-file::before, .mega-icon-download-unknown::before, #dropzone .mega-icon-arr-right::before, #dropzone .mega-icon-gist-add::before { + font-size: 32px; +} + +/* line 4, ../../../hub/static/css/mod/gist-dropzone.scss */ +#dropzone p { + display: block; + -webkit-margin-before: 1em; + -webkit-margin-after: 1em; + -webkit-margin-start: 0px; + -webkit-margin-end: 0px; +} diff --git a/dist/css/mod/gist-form.css b/dist/css/mod/gist-form.css new file mode 100644 index 0000000..3720971 --- /dev/null +++ b/dist/css/mod/gist-form.css @@ -0,0 +1,39 @@ +/* line 1, ../../../hub/static/css/mod/gist-form.scss */ +.bubble { + background: #EEE; + border-radius: 3px; + margin-bottom: 1em; + padding: 3px; +} + +/* line 2, ../../../hub/static/css/mod/gist-form.scss */ +#gist-form .file { + border: 1px solid #D9D9D9; + background: whiteSmoke; +} + +/* line 3, ../../../hub/static/css/mod/gist-form.scss */ +#gist-form .file .meta { + background-color: #EAEAEA; + background-image: -moz-linear-gradient(#FAFAFA, #EAEAEA); + background-image: -webkit-linear-gradient(#FAFAFA, #EAEAEA); + background-image: linear-gradient(#FAFAFA, #EAEAEA); + background-repeat: repeat-x; + display: inline-block; + display: block; + border-bottom: 1px solid #D8D8D8; + color: #555; + font-size: 12px; + height: 26px; + padding: 8px; + position: relative; + text-align: left; + text-shadow: 0 1px 0 white; +} + +/* line 4, ../../../hub/static/css/mod/gist-form.scss */ +#gist-form .editor-options { + position: absolute; + top: 6px; + right: 5px; +} diff --git a/dist/css/mod/gist-item.css b/dist/css/mod/gist-item.css new file mode 100644 index 0000000..3fd21a9 --- /dev/null +++ b/dist/css/mod/gist-item.css @@ -0,0 +1,171 @@ +/* line 1, ../../../hub/static/css/mod/gist-item.scss */ +.gist-item { + display: inline-block; + display: block; + margin-bottom: 2em; + position: relative; +} + +/* line 2, ../../../hub/static/css/mod/gist-item.scss */ +.gist-item ul.meta > li .mini-icon { + line-height: 0.6; + opacity: 0.5; +} + +/* line 3, ../../../hub/static/css/mod/gist-item.scss */ +.gist-item ul.meta { + position: absolute; + right: 0; +} + +/* line 4, ../../../hub/static/css/mod/gist-item.scss */ +.gist-item ul.meta > li { + font-size: 12px; + font-weight: bold; + list-style-type: none; + display: inline-block; + margin-left: 12px; +} + +/* line 5, ../../../hub/static/css/mod/gist-item.scss */ +.gist-item ul.meta > li > a { + display: block; + text-decoration: none; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/gist-item.scss */ +.gist-item .byline { + margin: 3px 0 11px; +} + +/* line 7, ../../../hub/static/css/mod/gist-item.scss */ +.gist-item .creator img { + border-radius: 3px; + width: 28px; + height: 28px; + position: absolute; + top: 0; + left: 0; + margin-left: 3px; +} + +/* line 8, ../../../hub/static/css/mod/gist-item.scss */ +.gist-item .creator { + color: rgba(51, 51, 51, 0.75); + font-size: 13px; + font-weight: 300; + padding-left: 40px; + position: relative; + width: 480px; +} + +/* line 9, ../../../hub/static/css/mod/gist-item.scss */ +.gist-item .creator a { + font-weight: bold; +} + +/* line 10, ../../../hub/static/css/mod/gist-item.scss */ +.gist-item .metadata { + font-size: 11px; + margin-left: 40px; +} + +/* line 11, ../../../hub/static/css/mod/gist-item.scss */ +.gist-item .metadata .datetime { + color: #999; +} + +/* line 12, ../../../hub/static/css/mod/gist-item.scss */ +.gist-item .description { + color: rgba(51, 51, 51, 0.75); + display: block; + font-size: 12px; + vertical-align: text-top; + margin-top: 6px; + margin-left: 40px; + width: 480px; +} + +/* line 13, ../../../hub/static/css/mod/gist-item.scss */ +.bubble { + background: #EEE; + border-radius: 3px; + margin-bottom: 1em; + padding: 3px; +} + +/* line 14, ../../../hub/static/css/mod/gist-item.scss */ +table { + font-size: inherit; + font: 100%; +} + +/* line 15, ../../../hub/static/css/mod/gist-item.scss */ +tbody { + display: table-row-group; + vertical-align: middle; + border-color: inherit; +} + +/* line 16, ../../../hub/static/css/mod/gist-item.scss */ +.file-box { + background-color: #DDD; + border: 1px solid #CCC; + margin-bottom: 1em; + position: relative; +} + +/* line 17, ../../../hub/static/css/mod/gist-item.scss */ +.file-box .data { + background-color: ghostWhite; + font-size: 12px; + overflow: auto; +} + +/* line 18, ../../../hub/static/css/mod/gist-item.scss */ +.file-box .highlight { + border: none; + padding: 0; +} + +/* line 19, ../../../hub/static/css/mod/gist-item.scss */ +.file-box .data tr:last-child td.line_numbers, .file-box .data tr:last-child .line_data { + padding-bottom: 12px; +} + +/* line 20, ../../../hub/static/css/mod/gist-item.scss */ +.file-box .data tr:first-child td.line_numbers, .file-box .data tr:first-child .line_data { + padding-top: 12px; +} + +/* line 21, ../../../hub/static/css/mod/gist-item.scss */ +.highlight { + background: white; +} + +/* line 22, ../../../hub/static/css/mod/gist-item.scss */ +.bubble .file-box:only-child { + border-bottom: 1px solid #CCC; +} + +/* line 23, ../../../hub/static/css/mod/gist-item.scss */ +.bubble .file-box .data { + background: ghostWhite; +} + +/* line 24, ../../../hub/static/css/mod/gist-item.scss */ +.gist-item .file-box { + position: relative; +} + +/* line 25, ../../../hub/static/css/mod/gist-item.scss */ +.bubble .file-box { + background: #ECECEC; + margin-bottom: 0; +} + +/* line 26, ../../../hub/static/css/mod/gist-item.scss */ +.bubble.secret { + background-color: #F8EEC7; +} diff --git a/dist/css/mod/gist-miniicon.css b/dist/css/mod/gist-miniicon.css new file mode 100644 index 0000000..6963dec --- /dev/null +++ b/dist/css/mod/gist-miniicon.css @@ -0,0 +1,134 @@ +/* line 1, ../../../hub/static/css/mod/gist-miniicon.scss */ +.minibutton .mini-icon { + vertical-align: -2px; +} + +/* line 2, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-gist::before { + content: "\f00e"; +} + +/* line 3, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mega-icon-gist-secret::before { + content: "\f28c"; + color: #F8EEC7; +} + +/* line 4, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-gist-add::before { + content: "\f07a"; +} + +/* line 5, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-gist-private::before { + content: "\f00f"; +} + +/* line 6, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-gist-forked::before { + content: "\f079"; +} + +/* line 7, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-gist-starred::before { + content: "\f02a"; +} + +/* line 8, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-arr-up::before { + content: "\f03d"; +} + +/* line 9, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-gist-secret::before { + content: "\f08c"; +} + +/* line 10, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-gist-fork::before { + content: "\f020"; +} + +/* line 11, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-gist-star::before { + content: "\f02a"; +} + +/* line 12, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-arr-down::before { + content: "\f03f"; +} + +/* line 13, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-commit-comment::before { + content: "\f02b"; +} + +/* line 14, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-code::before { + content: "\f05f"; +} + +/* line 15, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-link::before { + content: "\f05c"; +} + +/* line 16, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-edit::before { + content: "\f058"; +} + +/* line 17, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-delete-note::before, .mini-icon-remove-close::beforeremove-close::before { + content: "\f050"; +} + +/* line 18, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-arr-right::before { + content: "\f03e"; +} + +/* line 19, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-diff::before { + content: "\f04d"; +} + +/* line 20, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-download::before { + content: "\f00b"; +} + +/* line 21, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mini-icon-logout::before { + content: "\f032"; +} + +/* line 22, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mega-icon-code-file::before, .mega-icon-download-unknown::before { + content: "\f210"; +} + +/* line 23, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mega-icon-arr-right::before { + content: "\f23e"; +} + +/* line 24, ../../../hub/static/css/mod/gist-miniicon.scss */ +.mega-icon-gist-add::before { + content: "\f27a"; +} + +/* line 25, ../../../hub/static/css/mod/gist-miniicon.scss */ +.discussion-bubble .discussion-bubble-content::before { + content: ""; + display: block; + height: 0; + width: 0; + border: 10px solid #EEE; + border-width: 10px 10px 10px 0; + border-color: transparent #EEE transparent transparent; + position: absolute; + left: -10px; + top: 15px; +} diff --git a/dist/css/mod/gist-recent.css b/dist/css/mod/gist-recent.css new file mode 100644 index 0000000..4b85dc2 --- /dev/null +++ b/dist/css/mod/gist-recent.css @@ -0,0 +1,61 @@ +/* line 1, ../../../hub/static/css/mod/gist-recent.scss */ +.recent-gists { + display: block; +} + +/* line 2, ../../../hub/static/css/mod/gist-recent.scss */ +.recent-gists::after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* line 3, ../../../hub/static/css/mod/gist-recent.scss */ +.recent-gists ul { + list-style: none; + margin: 0; + padding: 0; +} + +/* line 4, ../../../hub/static/css/mod/gist-recent.scss */ +.recent-gists li { + display: list-item; + text-align: -webkit-match-parent; + float: left; + width: 200px; +} + +/* line 5, ../../../hub/static/css/mod/gist-recent.scss */ +.recent-gists .metadata { + color: #999; +} + +/* line 6, ../../../hub/static/css/mod/gist-recent.scss */ +.recent-gists .description .blank { + color: rgba(153, 153, 153, 0.5); +} + +/* line 7, ../../../hub/static/css/mod/gist-recent.scss */ +.recent-gists .your-gists { + float: right; + width: 108px; +} + +/* line 8, ../../../hub/static/css/mod/gist-recent.scss */ +.recent-gists .mega-icon::before, .entry-title .meta-icon::before { + font-size: 32px; +} + +/* line 9, ../../../hub/static/css/mod/gist-recent.scss */ +.recent-gists .mega-icon { + color: #B9B9B9; + float: left; + top: -1px; + left: -4px; + position: relative; + font-size: 32px; + width: 32px; + height: 32px; +} diff --git a/dist/css/mod/gist-render.css b/dist/css/mod/gist-render.css new file mode 100644 index 0000000..f0041ec --- /dev/null +++ b/dist/css/mod/gist-render.css @@ -0,0 +1,27 @@ +/* line 1, ../../../hub/static/css/mod/gist-render.scss */ +.link-overlay { + height: 100%; + width: 100%; + position: absolute; + visibility: hidden; + z-index: 50; +} + +/* line 2, ../../../hub/static/css/mod/gist-render.scss */ +.link-overlay .link { + background-color: rgba(0, 0, 0, 0.75); + color: white; + margin: -14px 0 0 0; + padding: 4px 8px 4px 10px; + height: 20px; + position: absolute; + top: 20px; + right: 6px; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/gist-render.scss */ +.link-overlay .link .mini-icon { + position: relative; + top: 2px; +} diff --git a/dist/css/mod/github.css b/dist/css/mod/github.css new file mode 100644 index 0000000..ce11b6d --- /dev/null +++ b/dist/css/mod/github.css @@ -0,0 +1,15 @@ +/* line 1, ../../../hub/static/css/mod/github.scss */ +span.github-actions { + float: right; +} + +/* line 2, ../../../hub/static/css/mod/github.scss */ +.new-github-form input#github { + padding: 6px; + margin: 2px 2px 2px 0px; +} + +/* line 3, ../../../hub/static/css/mod/github.scss */ +.new-github-form dd { + margin-left: 0px; +} diff --git a/dist/css/mod/inline-comment-form.css b/dist/css/mod/inline-comment-form.css new file mode 100644 index 0000000..cb27ef6 --- /dev/null +++ b/dist/css/mod/inline-comment-form.css @@ -0,0 +1,207 @@ +/* line 1, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary, button.primary.classy:disabled, button.primary.classy.disabled, button.primary.classy:disabled:hover, button.primary.classy.disabled:disabled:hover, button.classy:disabled:hover.primary, button.classy.disabled:disabled:hover.primary { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4); + border-color: #74BB5A; + border-bottom-color: #509338; + background: #8ADD6D; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#8add6d', endColorstr='#60b044')"; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); + background-image: -webkit-linear-gradient(top, #8ADD6D, #60B044); +} + +/* line 2, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary.disabled { + opacity: 0.5; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy, +button.classy:disabled, +button.classy.disabled, +a.button.classy:disabled, +a.button.classy.disabled, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover:disabled, +a.button.classy.disabled:hover, +a.button.classy, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy:disabled:hover, +a.button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover { + display: inline-block; + padding: 8px 15px; + line-height: normal; + position: relative; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 12px; + font-weight: bold; + color: #666; + text-shadow: 0 1px rgba(255, 255, 255, 0.9); + background: whiteSmoke; + background: -moz-linear-gradient(whiteSmoke, #E5E5E5); + background: -webkit-linear-gradient(whiteSmoke, #E5E5E5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; + border-radius: 3px; + border: 1px solid #DDD; + border-bottom-color: #BBB; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form.tab-content { + overflow: initial; + position: relative; +} + +/* line 2, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 10px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-actions { + padding: 0; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + position: relative; + border: 3px solid #EEE; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + padding: 0; + background: #EEE; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content .write-content { + padding: 0 10px 10px; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; + margin: 0; +} + +/* line 5, ../../../hub/static/css/mod/inline-comment-form.scss */ +.show-inline-comment-form { + margin: 10px; +} + +/* line 6, ../../../hub/static/css/mod/inline-comment-form.scss */ +tr.inline-comments.show-inline-comment-form .show-inline-comment-form { + display: none; +} + +/* line 7, ../../../hub/static/css/mod/inline-comment-form.scss */ +.inline-comments .comment-count { + overflow: hidden; + padding: 0 !important; + border: solid #DDD; + border-width: 1px 0; + vertical-align: top; + text-align: center !important; +} + +/* line 8, ../../../hub/static/css/mod/inline-comment-form.scss */ +.inline-comments .counter { + display: inline-block; + padding: 2px 8px 6px; + font-family: 11px/1.2 bold Helvetica,arial,freesans,clean,sans-serif !important; + color: #333 !important; + border: 1px solid #C0CCD0; + border-top: 0; + border-radius: 0 0 3px 3px; + cursor: default !important; +} + +/* line 9, ../../../hub/static/css/mod/inline-comment-form.scss */ +#files .file.show-inline-notes tr.inline-comments { + display: table-row; +} + +/* line 10, ../../../hub/static/css/mod/inline-comment-form.scss */ +.inline-comments .line-comments { + overflow: auto; + padding: 0; + border-top: 1px solid #CCC; + border-bottom: 1px solid #DDD; + background: #fff; + font-family: Helvetica, arial, freesans, clean, sans-serif !important; +} + +/* line 11, ../../../hub/static/css/mod/inline-comment-form.scss */ +.inline-comment-form { + max-width: 870px; +} + +/* line 12, ../../../hub/static/css/mod/inline-comment-form.scss */ +.inline-comment-form form { + margin: 0; +} + +/* line 14, ../../../hub/static/css/mod/inline-comment-form.scss */ +.inline-comments .form-actions { + padding: 0 10px 10px; + margin: 0; +} + +/* line 15, ../../../hub/static/css/mod/inline-comment-form.scss */ +.form-content .form-actions { + background-color: transparent; +} + +/* line 16, ../../../hub/static/css/mod/inline-comment-form.scss */ +.form-actions { + text-align: right; + padding-bottom: 5px; + background: #fff; + border: none; +} + +/* line 17, ../../../hub/static/css/mod/inline-comment-form.scss */ +.form-actions .optional { + display: block; + padding-top: 8px; + float: left; + margin-right: 15px; + padding-top: 3px; +} diff --git a/dist/css/mod/inline-comment.css b/dist/css/mod/inline-comment.css new file mode 100644 index 0000000..391e8bb --- /dev/null +++ b/dist/css/mod/inline-comment.css @@ -0,0 +1,400 @@ +@charset "UTF-8"; +/* line 1, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary, button.primary.classy:disabled, button.primary.classy.disabled, button.primary.classy:disabled:hover, button.primary.classy.disabled:disabled:hover, button.classy:disabled:hover.primary, button.classy.disabled:disabled:hover.primary { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4); + border-color: #74BB5A; + border-bottom-color: #509338; + background: #8ADD6D; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#8add6d', endColorstr='#60b044')"; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); + background-image: -webkit-linear-gradient(top, #8ADD6D, #60B044); +} + +/* line 2, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary.disabled { + opacity: 0.5; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy, +button.classy:disabled, +button.classy.disabled, +a.button.classy:disabled, +a.button.classy.disabled, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover:disabled, +a.button.classy.disabled:hover, +a.button.classy, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy:disabled:hover, +a.button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover { + display: inline-block; + padding: 8px 15px; + line-height: normal; + position: relative; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 12px; + font-weight: bold; + color: #666; + text-shadow: 0 1px rgba(255, 255, 255, 0.9); + background: whiteSmoke; + background: -moz-linear-gradient(whiteSmoke, #E5E5E5); + background: -webkit-linear-gradient(whiteSmoke, #E5E5E5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; + border-radius: 3px; + border: 1px solid #DDD; + border-bottom-color: #BBB; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form.tab-content { + overflow: initial; + position: relative; +} + +/* line 2, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 10px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-actions { + padding: 0; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + position: relative; + border: 3px solid #EEE; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + padding: 0; + background: #EEE; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content .write-content { + padding: 0 10px 10px; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; + margin: 0; +} + +/* line 5, ../../../hub/static/css/mod/inline-comment-form.scss */ +.show-inline-comment-form { + margin: 10px; +} + +/* line 6, ../../../hub/static/css/mod/inline-comment-form.scss */ +tr.inline-comments.show-inline-comment-form .show-inline-comment-form { + display: none; +} + +/* line 7, ../../../hub/static/css/mod/inline-comment-form.scss */ +.inline-comments .comment-count { + overflow: hidden; + padding: 0 !important; + border: solid #DDD; + border-width: 1px 0; + vertical-align: top; + text-align: center !important; +} + +/* line 8, ../../../hub/static/css/mod/inline-comment-form.scss */ +.inline-comments .counter { + display: inline-block; + padding: 2px 8px 6px; + font-family: 11px/1.2 bold Helvetica,arial,freesans,clean,sans-serif !important; + color: #333 !important; + border: 1px solid #C0CCD0; + border-top: 0; + border-radius: 0 0 3px 3px; + cursor: default !important; +} + +/* line 9, ../../../hub/static/css/mod/inline-comment-form.scss */ +#files .file.show-inline-notes tr.inline-comments { + display: table-row; +} + +/* line 10, ../../../hub/static/css/mod/inline-comment-form.scss */ +.inline-comments .line-comments { + overflow: auto; + padding: 0; + border-top: 1px solid #CCC; + border-bottom: 1px solid #DDD; + background: #fff; + font-family: Helvetica, arial, freesans, clean, sans-serif !important; +} + +/* line 11, ../../../hub/static/css/mod/inline-comment-form.scss */ +.inline-comment-form { + max-width: 870px; +} + +/* line 12, ../../../hub/static/css/mod/inline-comment-form.scss */ +.inline-comment-form form { + margin: 0; +} + +/* line 14, ../../../hub/static/css/mod/inline-comment-form.scss */ +.inline-comments .form-actions { + padding: 0 10px 10px; + margin: 0; +} + +/* line 15, ../../../hub/static/css/mod/inline-comment-form.scss */ +.form-content .form-actions { + background-color: transparent; +} + +/* line 16, ../../../hub/static/css/mod/inline-comment-form.scss */ +.form-actions { + text-align: right; + padding-bottom: 5px; + background: #fff; + border: none; +} + +/* line 17, ../../../hub/static/css/mod/inline-comment-form.scss */ +.form-actions .optional { + display: block; + padding-top: 8px; + float: left; + margin-right: 15px; + padding-top: 3px; +} + +/* preview comment form style */ +/* line 2, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav { + margin: 10px 0; + border-bottom: 1px solid #DDD; + height: 35px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs { + display: inline-block; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs > li { + display: inline-block; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab { + display: inline-block; + margin-bottom: -1px; + padding: 8px 12px 9px; + border: 1px solid transparent; + border-bottom: 0; + font-size: 14px; + color: #666; + text-decoration: none; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab.selected { + border-color: #DDD; + border-radius: 3px 3px 0 0; + background-color: white; + color: #333; + font-weight: bold; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab:hover { + text-decoration: none; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav { + position: relative; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav ul.tabnav-tabs { + padding-left: 10px; +} + +/* line 10, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 0 10px 10px; +} + +/* line 11, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form #preview_bucket .content-body { + padding: 10px; + min-height: 132px; +} + +/* line 5, ../../../hub/static/css/mod/inline-comment.scss */ +.inline-comments .comment-holder { + max-width: 850px; + margin: 10px; +} + +/* line 6, ../../../hub/static/css/mod/inline-comment.scss */ +.inline-comments .comment { + margin: 5px 0 !important; + border: 1px solid #CACACA; +} + +/* line 7, ../../../hub/static/css/mod/inline-comment.scss */ +.comment-header { + height: 33px; + padding: 0 10px 0 6px; + border-bottom: 1px solid #CCC; + background: #F8F8F8; + font-size: 12px; + background-image: -webkit-linear-gradient(top, #F4FAF6, #D8E5DD); +} + +/* line 8, ../../../hub/static/css/mod/inline-comment.scss */ +.comment-header .comment-header-gravatar { + display: inline-block; + margin-right: 3px; + vertical-align: middle; + border-radius: 3px; +} + +/* line 9, ../../../hub/static/css/mod/inline-comment.scss */ +.comment-header .comment-header-author { + display: inline-block; + max-width: 600px; + height: 33px; + line-height: 33px; + font-weight: bold; + color: #222; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.7); + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/inline-comment.scss */ +.comment-header .comment-header-right { + float: right; +} + +/* line 11, ../../../hub/static/css/mod/inline-comment.scss */ +.comment-header .comment-header-date { + display: inline-block; + margin: 0; + height: 33px; + font-size: 11px; + ine-height: 33px; + font-style: normal; + color: #777; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.7); + line-height: 33px; +} + +/* line 12, ../../../hub/static/css/mod/inline-comment.scss */ +.mini-icon-delete-note::before, .mini-icon-remove-close::before { + content: ""; +} + +/* line 13, ../../../hub/static/css/mod/inline-comment.scss */ +.mini-icon-edit:before { + content: ""; +} + +/* line 14, ../../../hub/static/css/mod/inline-comment.scss */ +.comment-header .comment-header-actions { + display: inline-block; + vertical-align: middle; + font-size: 13px; + margin-left: 7px; +} + +/* line 15, ../../../hub/static/css/mod/inline-comment.scss */ +.comment-header .mini-icon { + color: #939AA0; + margin: 0 2px 0 1px; + position: relative; + top: 2px; +} + +/* line 16, ../../../hub/static/css/mod/inline-comment.scss */ +.comment-header .comment-header-actions li .mini-icon { + -moz-transition: all 0.15s ease-in 0; + -webkit-transition: all 0.15s ease-in 0; + text-decoration: none; +} + +/* line 17, ../../../hub/static/css/mod/inline-comment.scss */ +.comment-header .comment-header-date { + color: #939AA0; + text-decoration: none; +} + +/* line 18, ../../../hub/static/css/mod/inline-comment.scss */ +.comment-content { + padding: 0; + color: #333; + font-size: 12px; + background: #FBFBFB; +} + +/* line 19, ../../../hub/static/css/mod/inline-comment.scss */ +.comment-content .comment-body { + padding: 10px; + font-size: 13px; + overflow: auto; + width: 100%; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +/* line 20, ../../../hub/static/css/mod/inline-comment.scss */ +.comment-header .comment-header-actions li { + list-style-type: none; + float: left; + margin: 0 0 0 8px; +} diff --git a/dist/css/mod/issue-body.css b/dist/css/mod/issue-body.css new file mode 100644 index 0000000..1655a9b --- /dev/null +++ b/dist/css/mod/issue-body.css @@ -0,0 +1,270 @@ +/* line 5, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content { + word-wrap: break-word; + word-break: normal; +} +/* line 10, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content .side-avatar a:hover { + text-decoration: none; +} +/* line 14, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content .side-avatar img { + width: 48px; + height: 48px; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} +/* line 20, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary { + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; + display: block; + margin-left: 65px; + /* Milestone */ +} +/* line 25, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary .form-content { + padding: 0px; +} +/* line 29, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary .is-comment-editing .content-body { + display: none; +} +/* line 33, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary h2 { + font-size: 24px; +} +/* line 37, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary ul.actions { + float: right; + text-align: right; +} +/* line 41, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary ul.actions li { + display: inline; +} +/* line 45, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary ul.actions #upvote i { + position: absolute; +} +/* line 49, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary .summary-bottom { + margin-top: 10px; +} +/* line 52, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary .summary-bottom .assignee { + float: right; + margin-right: 10px; +} +/* line 56, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary .summary-bottom .state { + float: left; +} +/* line 58, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary .summary-bottom .state a#issue-closer { + padding-left: 10px; +} +/* line 64, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary .milestone-body { + display: block; +} +/* line 66, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary .milestone-body .milestone-bar-title { + display: inline; +} +/* line 68, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #summary .milestone-body .milestone-bar-title label { + display: inline; +} +/* line 76, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content .participation p { + display: inline-block; + margin-left: 15px; +} +/* line 82, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog { + padding: 0px; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} +/* line 86, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog .change { + padding: 10px 15px; + border-bottom: 1px solid #eaeaea; +} +/* line 90, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog .change .change-text { + padding: 10px; +} +/* line 93, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog .change:hover .change-bottom .comment-header-actions { + display: inline; +} +/* line 96, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog .change .change-bottom { + position: relative; +} +/* line 98, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog .change .change-bottom .comment-header-actions { + display: none; + position: absolute; + bottom: 10px; + left: 10px; +} +/* line 104, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog .change .change-bottom .author-profile { + float: right; +} +/* line 106, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog .change .change-bottom .author-profile p { + margin: 5px; + display: inline-block; +} +/* line 110, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog .change .change-bottom .author-profile a.change-header-date { + color: lightgray; +} +/* line 113, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog .change .change-bottom .author-profile .side-avatar { + float: none; +} +/* line 116, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog .change .change-bottom .author-profile .side-avatar a:hover { + text-decoration: none; +} +/* line 120, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog .change .change-bottom .author-profile .side-avatar img { + width: 32px; + height: 32px; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} +/* line 130, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content #changelog > .change:last-child { + border-bottom: none; +} +/* line 134, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content .is-comment-editing .change-text { + display: none; +} +/* line 138, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content .markdown-body pre { + font-family: Consolas, Menlo, "Liberation Mono", Courier, monospace; + margin: 0; + border: 0; +} +/* line 144, ../../../hub/static/css/mod/issue-body.scss */ +#issue #content .avatar.avatar-tiny { + display: inline-block; + margin: 0 3px 0 0; + vertical-align: baseline; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} + +/* modal */ +/* line 155, ../../../hub/static/css/mod/issue-body.scss */ +.modal-header { + background: #63b6ae; + color: white; + text-shadow: none; +} +/* line 160, ../../../hub/static/css/mod/issue-body.scss */ +.modal-header p { + margin: 0; +} + +/* line 165, ../../../hub/static/css/mod/issue-body.scss */ +.modal-body { + text-shadow: none; +} + +/* line 169, ../../../hub/static/css/mod/issue-body.scss */ +.modal-footer { + background: #63b6ae; + color: white; + text-shadow: none; +} + +/* line 175, ../../../hub/static/css/mod/issue-body.scss */ +.quick-emoji .emojis { + height: 120px; +} + +/* Tag */ +/* line 180, ../../../hub/static/css/mod/issue-body.scss */ +ul.tagit li.tagit-choice { + margin-top: 6px; +} + +/* line 183, ../../../hub/static/css/mod/issue-body.scss */ +ul.tagit input[type="text"] { + width: 540px; +} + +/* line 186, ../../../hub/static/css/mod/issue-body.scss */ +.tag-groups p { + margin: 0; +} + +/* line 189, ../../../hub/static/css/mod/issue-body.scss */ +.tag-groups { + margin-bottom: 10px; +} + +/* Milestone */ +/* line 195, ../../../hub/static/css/mod/issue-body.scss */ +#milestone-modal .milestone-menu { + list-style: none; + display: block; + float: none; + position: relative; + margin-bottom: 5px; + border: 1px solid rgba(0, 0, 0, 0.2); + padding: 5px 0; + border-color: rgba(99, 182, 174, 0.8); + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +/* line 208, ../../../hub/static/css/mod/issue-body.scss */ +#milestone-modal .milestone-menu > li > a:hover, +#milestone-modal .milestone-menu > li > a:focus, +#milestone-modal .milestone-menu > .active > a, +#milestone-modal .milestone-menu > .active > a:hover, +#milestone-modal .milestone-menu > .active > a:focus { + color: #fff; + text-decoration: none; + background: #63b6ae; +} +/* line 217, ../../../hub/static/css/mod/issue-body.scss */ +#milestone-modal .milestone-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 20px; + white-space: nowrap; +} +/* line 226, ../../../hub/static/css/mod/issue-body.scss */ +#milestone-modal input[type=radio] { + display: none; +} + +/* Issue for Responsive Mobile Hacks */ +@media (max-width: 767px) { + /* line 236, ../../../hub/static/css/mod/issue-body.scss */ + #issue #content .mod { + margin-left: 35px; + } + /* line 239, ../../../hub/static/css/mod/issue-body.scss */ + #issue #content span.side-avatar img.discussion-bubble-avatar { + width: 30px; + height: 30px; + } +} diff --git a/dist/css/mod/issues-list.css b/dist/css/mod/issues-list.css new file mode 100644 index 0000000..b2fda57 --- /dev/null +++ b/dist/css/mod/issues-list.css @@ -0,0 +1,97 @@ +/* line 1, ../../../hub/static/css/mod/pagination.scss */ +.pagination { + display: block; + margin: 7px 0; + overflow: hidden; +} +/* line 5, ../../../hub/static/css/mod/pagination.scss */ +.pagination a { + padding: 8px; + width: 100%; + text-align: center; + line-height: 1.4; +} +/* line 11, ../../../hub/static/css/mod/pagination.scss */ +.pagination a, .pagination span { + float: left; + margin: 0; + color: #777; + font-size: 13px; + text-decoration: none; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #DADADA; +} +/* line 23, ../../../hub/static/css/mod/pagination.scss */ +.pagination ul li a { + width: 20px; +} +/* line 29, ../../../hub/static/css/mod/pagination.scss */ +.pagination ul .disabled a { + background-color: #fff; +} + +/* line 3, ../../../hub/static/css/mod/issues-list.scss */ +.new-issue { + float: left; +} + +/* line 7, ../../../hub/static/css/mod/issues-list.scss */ +.sortby-issues { + float: right; +} + +/* line 11, ../../../hub/static/css/mod/issues-list.scss */ +.issues-topbar { + overflow: hidden; + display: block; +} + +/* line 16, ../../../hub/static/css/mod/issues-list.scss */ +.issue-list { + background: white; + margin-bottom: 20px; + border-bottom: 1px solid #eaeaea; +} +/* line 21, ../../../hub/static/css/mod/issues-list.scss */ +.issue-list > :first-child { + margin-top: 0px; +} +/* line 25, ../../../hub/static/css/mod/issues-list.scss */ +.issue-list .issue-item { + padding: 15px; + border-bottom: 1px solid #eaeaea; +} +/* line 29, ../../../hub/static/css/mod/issues-list.scss */ +.issue-list .issue-item h3 { + font-size: 16px; + font-weight: 400; + overflow: hidden; + word-break: break-all; + margin: 0; +} +/* line 36, ../../../hub/static/css/mod/issues-list.scss */ +.issue-list .issue-item h3 a { + color: #273338; +} +/* line 42, ../../../hub/static/css/mod/issues-list.scss */ +.issue-list .issue-item p a { + color: #999; +} +/* line 51, ../../../hub/static/css/mod/issues-list.scss */ +.issue-list .issue-item .meta { + margin-top: 20px; +} +/* line 55, ../../../hub/static/css/mod/issues-list.scss */ +.issue-list a.comment-count, +.issue-list a.comment-count:link, +.issue-list span.issue-info { + color: #bbb; +} +/* line 61, ../../../hub/static/css/mod/issues-list.scss */ +.issue-list .rule { + clear: both; + height: 0px; + padding: 0; + overflow: hidden; + background: transparent; +} diff --git a/dist/css/mod/issues-sidebar.css b/dist/css/mod/issues-sidebar.css new file mode 100644 index 0000000..2b53b87 --- /dev/null +++ b/dist/css/mod/issues-sidebar.css @@ -0,0 +1,82 @@ +/* line 2, ../../../hub/static/css/mod/navbar-search.scss */ +.navbar-search i { + color: #63b6ae; + padding-right: 4px; +} + +/* line 4, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar { + background: #fff; + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); + margin-bottom: 20px; +} +/* line 9, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar .nav { + margin: 0px; + -moz-border-radius: 0px; + -webkit-border-radius: 0px; + border-radius: 0px; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} +/* line 15, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar .issue-tags { + -moz-border-radius: 0px; + -webkit-border-radius: 0px; + border-radius: 0px; +} +/* line 19, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar > *:first-child { + -moz-border-radius-topleft: 3px; + -webkit-border-top-left-radius: 3px; + border-top-left-radius: 3px; + -moz-border-radius-topright: 3px; + -webkit-border-top-right-radius: 3px; + border-top-right-radius: 3px; +} +/* line 24, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar > *:last-child { + -moz-border-radius-bottomleft: 3px; + -webkit-border-bottom-left-radius: 3px; + border-bottom-left-radius: 3px; + -moz-border-radius-bottomright: 3px; + -webkit-border-bottom-right-radius: 3px; + border-bottom-right-radius: 3px; +} +/* line 29, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar .rule { + clear: both; + height: 0px; + padding: 0; + margin: 0; + overflow: hidden; + border: none; + background: transparent; + border-bottom: 3px solid rgba(99, 182, 174, 0.2); +} +/* line 40, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar .label { + margin: 2px 0px; +} +/* line 42, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar .label a { + color: #63b6ae; + text-decoration: none; +} +/* line 45, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar .label a:hover { + background: #63b6ae; + color: white; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; +} +/* line 54, ../../../hub/static/css/mod/issues-sidebar.scss */ +.issues-sidebar .well { + margin-bottom: 0; + overflow: hidden; +} diff --git a/dist/css/mod/issues-tab.css b/dist/css/mod/issues-tab.css new file mode 100644 index 0000000..1588307 --- /dev/null +++ b/dist/css/mod/issues-tab.css @@ -0,0 +1,35 @@ +/* line 2, ../../../hub/static/css/mod/issues-tab.scss */ +ul.filter-list .filter-item { + border-radius: 3px 3px 3px 3px; + color: #777777; + display: block; + font-size: 14px; + margin: 0 0 5px; + overflow: hidden; + padding: 8px 10px; + text-decoration: none; + text-overflow: ellipsis; + white-space: nowrap; +} + +/* line 15, ../../../hub/static/css/mod/issues-tab.scss */ +ul.filter-list .filter-item:hover { + background: none repeat scroll 0 0 #EEEEEE; +} + +/* line 19, ../../../hub/static/css/mod/issues-tab.scss */ +ul.filter-list .filter-item.selected { + background: none repeat scroll 0 0 #4183C4; + color: #FFFFFF; +} + +/* line 24, ../../../hub/static/css/mod/issues-tab.scss */ +ul.filter-list .filter-item .count { + float: right; + font-weight: bold; +} + +/* line 29, ../../../hub/static/css/mod/issues-tab.scss */ +.issues-tab { + margin-top: 27px; +} diff --git a/dist/css/mod/issues-topbar.css b/dist/css/mod/issues-topbar.css new file mode 100644 index 0000000..ab34dc2 --- /dev/null +++ b/dist/css/mod/issues-topbar.css @@ -0,0 +1,4 @@ +/* line 1, ../../../hub/static/css/mod/issues-topbar.scss */ +.issues-topbar { + padding-bottom: 10px; +} diff --git a/dist/css/mod/loader.css b/dist/css/mod/loader.css new file mode 100644 index 0000000..89303f1 --- /dev/null +++ b/dist/css/mod/loader.css @@ -0,0 +1,21 @@ +/* line 1, ../../../hub/static/css/mod/loader.scss */ +.loader { + display: none; + position: absolute; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + background-color: #eee; +} + +/* line 2, ../../../hub/static/css/mod/loader.scss */ +.loader .spinner { + display: block; + width: 32px; + height: 32px; + margin: 0 auto; + top: 121px; + position: relative; + background: url(/static/img/spinner.gif) no-repeat; +} diff --git a/dist/css/mod/markdown-content.css b/dist/css/mod/markdown-content.css new file mode 100644 index 0000000..97f2e85 --- /dev/null +++ b/dist/css/mod/markdown-content.css @@ -0,0 +1,162 @@ +/* line 1, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body { + padding: 30px; +} + +/* line 4, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body > :first-child { + margin-top: 0 !important; +} + +/* line 7, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body h1, +.markdown-body h2, +.markdown-body h3, +.markdown-body h4, +.markdown-body h5, +.markdown-body h6 { + margin: 20px 0 10px; + padding: 0; + font-weight: bold; + -webkit-font-smoothing: antialiased; + cursor: text; + position: relative; +} + +/* line 20, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body h2 { + font-size: 24px; + border-bottom: 1px solid #CCC; + color: black; +} + +/* line 25, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body, +.markdown-body p { + font-size: 14px; + line-height: 1.6; +} + +/* line 30, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body p, +.markdown-body blockquote, +.markdown-body ul, +.markdown-body ol, +.markdown-body dl, +.markdown-body table, +.markdown-body pre { + margin: 15px 0; +} + +/* line 39, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul, +.markdown-body ol { + padding-left: 30px; +} + +/* line 43, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul li { + line-height: 1.6; +} + +/* line 46, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ul { + list-style: disc; +} + +/* line 49, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body ol { + list-style: decimal; +} + +/* line 52, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table { + width: 100%; +} + +/* line 55, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table caption + thead tr:first-child th, +.markdown-body table caption + thead tr:first-child td, +.markdown-body table colgroup + thead tr:first-child th, +.markdown-body table colgroup + thead tr:first-child td, +.markdown-body table thead:first-child tr:first-child th, +.markdown-body table thead:first-child tr:first-child td { + border-top: 0; +} + +/* line 63, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table thead th { + vertical-align: bottom; +} + +/* line 66, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th { + font-weight: bold; +} + +/* line 69, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th, +.markdown-body table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #ddd; +} + +/* line 77, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table th, +.markdown-body table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #ddd; +} + +/* line 85, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body table tbody > tr:nth-child(odd) > td, +.markdown-body table tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} + +/* line 89, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body .progress-percentage { + color: #888; +} + +/* line 93, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page { + padding: 0px; +} + +/* line 96, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page h1, +.markdown-page h2, +.markdown-page h3, +.markdown-page h4, +.markdown-page h5, +.markdown-page h6 { + position: static; +} + +/* line 104, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page pre { + font-family: Consolas, 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 14px; +} + +/* line 108, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page .label { + background-color: transparent; +} + +/* line 111, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-page dd { + margin-left: 1.5em; +} + +/* line 114, ../../../hub/static/css/mod/markdown-content.scss */ +.markdown-body code { + white-space: pre-wrap; +} diff --git a/dist/css/mod/merge-guide.css b/dist/css/mod/merge-guide.css new file mode 100644 index 0000000..15d9a1d --- /dev/null +++ b/dist/css/mod/merge-guide.css @@ -0,0 +1,231 @@ +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* line 3, ../../../hub/static/css/mod/merge-guide.scss */ +.pullrequest .merge-guide { + margin: 20px 0; +} + +/* line 4, ../../../hub/static/css/mod/merge-guide.scss */ +.commit-preview { + margin: 10px 0 0 0; +} +/* line 7, ../../../hub/static/css/mod/merge-guide.scss */ +.commit-preview .message, .commit-preview .commit-preview p.error { + clear: both; + padding: 5px; + background: #eaf2f5; + border: 1px solid #bedce7; +} +/* line 14, ../../../hub/static/css/mod/merge-guide.scss */ +.commit-preview .message pre { + font-size: 11px; + color: #333; + white-space: pre-wrap; + word-wrap: break-word; +} + +/* line 24, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch .mergeable { + padding: 8px 10px; + border: 1px solid #ddd; + border-radius: 2px; +} +/* line 30, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch .mergeable.merging { + background-color: #589ab3; + background-image: -moz-linear-gradient(#82bccd, #589ab3); + background-image: -webkit-linear-gradient(#82bccd, #589ab3); + background-image: linear-gradient(#82bccd, #589ab3); + background-repeat: repeat-x; + border-color: #7699ad; + border-bottom-color: #648192; + border-top-left-radius: 0; + border-top-right-radius: 0; + background-repeat: repeat-x; + border-color: #8bc384; +} +/* line 44, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch.mergeable-clean .mergeable { + background-color: #6eda62; + background-image: -moz-linear-gradient(#9ee692, #6eda62); + background-image: -webkit-linear-gradient(#9ee692, #6eda62); + background-image: linear-gradient(#9ee692, #6eda62); +} +/* line 50, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch.mergeable-clean .mergeable p.message { + color: #0b5f00; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.4); +} +/* line 54, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch.mergeable-clean .mergeable p.message span.blue { + color: blue; +} +/* line 58, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch.mergeable-dirty .mergeable, .merge-branch .dirty-cleanup .mergeable { + position: relative; + background-color: #f6e69f; + background-image: -moz-linear-gradient(#f6e69f, #f6e69f); + background-image: -webkit-linear-gradient(#f6e69f, #f6e69f); + background-image: linear-gradient(#f6e69f, #f6e69f); + background-repeat: repeat-x; + border-color: #888; +} +/* line 68, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch.mergeable-error .mergeable, .merge-branch .dirty-cleanup .mergeable { + position: relative; + background-color: #da4f49; + background-image: -moz-linear-gradient(#da4f49, #da4f49); + background-image: -webkit-linear-gradient(#da4f49, #da4f49); + background-image: linear-gradient(#da4f49, #da4f49); + background-repeat: repeat-x; + border-color: #888; +} +/* line 78, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch .minibutton { + float: right; + margin: -3px 0 0 15px; +} +/* line 83, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch p.message { + margin: 0; + font-size: 13px; + font-weight: bold; +} +/* line 89, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch .merge-form .merge-error-message { + display: none; + margin: 10px 0 0 0; + padding: 5px 7px; + color: #bd2c00; + font-weight: bold; + font-size: 12px; + line-height: 19px; + background: rgba(255, 255, 255, 0.8); + border-radius: 2px; +} +/* line 101, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch .commit-preview { + position: relative; + display: table-row; + font-size: 12px; +} +/* line 106, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch .commit-preview .author { + display: table-cell; + width: 36px; + padding: 8px 10px; + vertical-align: top; + background: #d3e5eb; + border: 1px solid #bedce7; + border-right: none; +} +/* line 116, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch .commit-preview .gravatar { + float: left; + margin: 2px 8px 0 0; +} +/* line 121, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch .commit-preview .message { + display: table-cell; + width: 805px; + padding: 8px 10px; + vertical-align: top; + background-color: #e7f0f3; + background-image: -moz-linear-gradient(#f6f9fa, #e7f0f3); + background-image: -webkit-linear-gradient(#f6f9fa, #e7f0f3); + background-image: linear-gradient(#f6f9fa, #e7f0f3); + background-repeat: repeat-x; + border: 1px solid #bedce7; +} +/* line 133, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch .commit-preview .message pre { + font-family: Monaco, "Liberation Mono", Courier, monospace; + font-size: 12px; + color: #5b6f74; +} +/* line 139, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-branch .commit-preview .message textarea { + margin-top: 5px; + box-sizing: border-box; + width: 100%; + height: 50px; + padding: 4px; + font-family: Monaco, "Liberation Mono", Courier, monospace; + font-size: 12px; + color: #666; + background-color: #fafafa; +} + +/* line 154, ../../../hub/static/css/mod/merge-guide.scss */ +.merge-form { + display: none; +} diff --git a/dist/css/mod/meta-nav.css b/dist/css/mod/meta-nav.css new file mode 100644 index 0000000..ec722eb --- /dev/null +++ b/dist/css/mod/meta-nav.css @@ -0,0 +1,38 @@ +/* line 1, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav { + margin-top: 6px; +} + +/* line 3, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label { + position: relative; + display: inline-block; + margin-left: 3px; + padding: 3px 7px; + border: 1px solid #ccc; + border-radius: 3px; + color: #333; + background-color: #fafafa; + vertical-align: middle; +} + +/* line 15, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::before, .metanav .counts-label::after { + content: ""; + position: absolute; + top: 50%; + right: 100%; + display: block; + margin-right: 0px; + margin-top: -6px; + width: 0; + height: 0; + border: 6px solid transparent; + border-right-color: #ccc; +} + +/* line 29, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::after { + margin-right: -1px; + border-right-color: #fafafa; +} diff --git a/dist/css/mod/mini-icons.css b/dist/css/mod/mini-icons.css new file mode 100644 index 0000000..bf99b66 --- /dev/null +++ b/dist/css/mod/mini-icons.css @@ -0,0 +1,29 @@ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.eot") format("eot"), url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"), url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 15, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +/* line 26, ../../../hub/static/css/mod/mini-icons.scss */ +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} diff --git a/dist/css/mod/minibutton.css b/dist/css/mod/minibutton.css new file mode 100644 index 0000000..7a0724b --- /dev/null +++ b/dist/css/mod/minibutton.css @@ -0,0 +1,70 @@ +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} diff --git a/dist/css/mod/mobile_timeline.css b/dist/css/mod/mobile_timeline.css new file mode 100644 index 0000000..b22351a --- /dev/null +++ b/dist/css/mod/mobile_timeline.css @@ -0,0 +1,38 @@ +/* Timeline on mobile */ +/* line 2, ../../../hub/static/css/mod/mobile_timeline.scss */ +body { + margin: 0; + padding: 0; +} + +/* line 4, ../../../hub/static/css/mod/mobile_timeline.scss */ +.ui-footer ul li { + line-height: 32px; +} + +/* line 5, ../../../hub/static/css/mod/mobile_timeline.scss */ +.scrollable .wrap { + background: #fff; +} + +/* line 7, ../../../hub/static/css/mod/mobile_timeline.scss */ +.timeline { + width: 100%; + height: 100%; + position: fixed; + margin-top: 0; +} + +/* line 8, ../../../hub/static/css/mod/mobile_timeline.scss */ +.timeline .action, .timeline .pulls { + margin-bottom: 0.5em; + padding: 0 12px 0 32px; + border-bottom: 1px solid #f1f1f1; +} + +/* line 9, ../../../hub/static/css/mod/mobile_timeline.scss */ +.timeline .desc { + border: none; + margin-bottom: 0.5em; + padding-bottom: 5px; +} diff --git a/dist/css/mod/my-projects.css b/dist/css/mod/my-projects.css new file mode 100644 index 0000000..3f9f569 --- /dev/null +++ b/dist/css/mod/my-projects.css @@ -0,0 +1,43 @@ +/* line 8, ../../../hub/static/css/mod/text-truncate.scss */ +.css-truncate.css-truncate-target, .css-truncate .css-truncate-target { + max-width: 125px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + vertical-align: top; + display: inline-block; +} + +/* line 14, ../../../hub/static/css/mod/text-truncate.scss */ +.css-truncate.expandable:hover .css-truncate-target { + max-width: 10000px !important; +} + +/* line 3, ../../../hub/static/css/mod/my-projects.scss */ +.my_projects { + margin-top: 5px; +} +/* line 4, ../../../hub/static/css/mod/my-projects.scss */ +.my_projects a.right { + float: right; +} +/* line 8, ../../../hub/static/css/mod/my-projects.scss */ +.my_projects li { + max-width: 300px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +/* line 12, ../../../hub/static/css/mod/my-projects.scss */ +.my_projects li .delete-btn { + display: none; +} +/* line 16, ../../../hub/static/css/mod/my-projects.scss */ +.my_projects li.hover .delete-btn { + display: block; +} + +/* line 23, ../../../hub/static/css/mod/my-projects.scss */ +.my_projects .delete-btn { + padding: 0 6px 0 6px; +} diff --git a/dist/css/mod/my-pull-requests-tab.css b/dist/css/mod/my-pull-requests-tab.css new file mode 100644 index 0000000..12fbb01 --- /dev/null +++ b/dist/css/mod/my-pull-requests-tab.css @@ -0,0 +1,32 @@ +/* line 1, ../../../hub/static/css/mod/my-pull-requests-tab.scss */ +ul.filter-list .filter-item { + border-radius: 3px 3px 3px 3px; + color: #777777; + display: block; + font-size: 14px; + margin: 0 0 5px; + overflow: hidden; + padding: 8px 10px; + text-decoration: none; + text-overflow: ellipsis; + white-space: nowrap; +} +/* line 12, ../../../hub/static/css/mod/my-pull-requests-tab.scss */ +ul.filter-list .filter-item:hover { + background: none repeat scroll 0 0 #EEEEEE; +} +/* line 15, ../../../hub/static/css/mod/my-pull-requests-tab.scss */ +ul.filter-list .filter-item.selected { + background: none repeat scroll 0 0 #4183C4; + color: #FFFFFF; +} +/* line 19, ../../../hub/static/css/mod/my-pull-requests-tab.scss */ +ul.filter-list .filter-item .count { + float: right; + font-weight: bold; +} + +/* line 25, ../../../hub/static/css/mod/my-pull-requests-tab.scss */ +.my-pull-requests-tab { + margin-top: 27px; +} diff --git a/dist/css/mod/nav-search-dropdown-codeui.css b/dist/css/mod/nav-search-dropdown-codeui.css new file mode 100644 index 0000000..eb03224 --- /dev/null +++ b/dist/css/mod/nav-search-dropdown-codeui.css @@ -0,0 +1,52 @@ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown-codeui.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 370px; + background-color: white; + border: 1px solid rgba(99, 182, 174, 0.4); + z-index: 100; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown-codeui.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown-codeui.scss */ +#search-repos-menu ul li.active { + background: #63b6ae; + color: #fff; +} + +/* line 12, ../../../hub/static/css/mod/nav-search-dropdown-codeui.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 13, ../../../hub/static/css/mod/nav-search-dropdown-codeui.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 14, ../../../hub/static/css/mod/nav-search-dropdown-codeui.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 15, ../../../hub/static/css/mod/nav-search-dropdown-codeui.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} diff --git a/dist/css/mod/nav-search-dropdown.css b/dist/css/mod/nav-search-dropdown.css new file mode 100644 index 0000000..2c7f5f8 --- /dev/null +++ b/dist/css/mod/nav-search-dropdown.css @@ -0,0 +1,52 @@ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} diff --git a/dist/css/mod/nav.css b/dist/css/mod/nav.css new file mode 100644 index 0000000..d6429f1 --- /dev/null +++ b/dist/css/mod/nav.css @@ -0,0 +1,108 @@ +/* TODO: still has Github UI in this mod */ +/* line 2, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu { + display: none; + position: absolute; + top: 30px; + width: 228px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} + +/* line 3, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} + +/* line 4, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.active { + background: #4183C4; + color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro { + padding: 7px; + color: #666; +} + +/* line 6, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666; +} + +/* line 7, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .repo-name { + padding: 3px; +} + +/* line 8, ../../../hub/static/css/mod/nav-search-dropdown.scss */ +#search-repos-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; +} + +/* line 4, ../../../hub/static/css/mod/nav.scss */ +.navbar .container { + width: 100%; +} + +/* line 5, ../../../hub/static/css/mod/nav.scss */ +div.navbar .nav-logo { + float: left; + margin: 2px 2px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/nav.scss */ +.span4 .items { + max-width: 300px; +} + +/* line 7, ../../../hub/static/css/mod/nav.scss */ +body div.container { + max-width: 940px; +} + +/* line 9, ../../../hub/static/css/mod/nav.scss */ +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ +@media (max-width: 767px) { + /* line 17, ../../../hub/static/css/mod/nav.scss */ + body { + padding: 50px 0px 0px; + } + + /* line 20, ../../../hub/static/css/mod/nav.scss */ + body div.container { + max-width: 950px; + padding: 5px 5px; + } + + /* line 24, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} +@media (max-width: 979px) { + /* line 32, ../../../hub/static/css/mod/nav.scss */ + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} diff --git a/dist/css/mod/navbar-search.css b/dist/css/mod/navbar-search.css new file mode 100644 index 0000000..646fd5f --- /dev/null +++ b/dist/css/mod/navbar-search.css @@ -0,0 +1,5 @@ +/* line 2, ../../../hub/static/css/mod/navbar-search.scss */ +.navbar-search i { + color: #63b6ae; + padding-right: 4px; +} diff --git a/dist/css/mod/notification.css b/dist/css/mod/notification.css new file mode 100644 index 0000000..b32c0b3 --- /dev/null +++ b/dist/css/mod/notification.css @@ -0,0 +1,31 @@ +/* line 1, ../../../hub/static/css/mod/notification.scss */ +#settings-notifications h4 { + margin: 15px 0 5px 0; + font-size: 14px; + color: black; +} + +/* line 2, ../../../hub/static/css/mod/notification.scss */ +.user-mention { + font-weight: bold; + color: #333; +} + +/* line 3, ../../../hub/static/css/mod/notification.scss */ +#settings-notifications ul.compact-options { + margin: -6px 0 13px 0; +} + +/* line 4, ../../../hub/static/css/mod/notification.scss */ +#settings-notifications ul.compact-options li { + margin: 0 15px 0 0; + list-style-type: none; + font-weight: bold; +} + +/* line 5, ../../../hub/static/css/mod/notification.scss */ +.horizontal_line { + margin: 10px 0 10px -10px; + padding: 0 10px; + width: 100%; +} diff --git a/dist/css/mod/pagination.css b/dist/css/mod/pagination.css new file mode 100644 index 0000000..72fbd27 --- /dev/null +++ b/dist/css/mod/pagination.css @@ -0,0 +1,31 @@ +/* line 1, ../../../hub/static/css/mod/pagination.scss */ +.pagination { + display: block; + margin: 7px 0; + overflow: hidden; +} +/* line 5, ../../../hub/static/css/mod/pagination.scss */ +.pagination a { + padding: 8px; + width: 100%; + text-align: center; + line-height: 1.4; +} +/* line 11, ../../../hub/static/css/mod/pagination.scss */ +.pagination a, .pagination span { + float: left; + margin: 0; + color: #777; + font-size: 13px; + text-decoration: none; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #DADADA; +} +/* line 23, ../../../hub/static/css/mod/pagination.scss */ +.pagination ul li a { + width: 20px; +} +/* line 29, ../../../hub/static/css/mod/pagination.scss */ +.pagination ul .disabled a { + background-color: #fff; +} diff --git a/dist/css/mod/praise.css b/dist/css/mod/praise.css new file mode 100644 index 0000000..6af0e00 --- /dev/null +++ b/dist/css/mod/praise.css @@ -0,0 +1,126 @@ +/* line 1, ../../../hub/static/css/mod/praise.scss */ +.recs, .rec-paginator { + margin: 35px 87px; +} + +/* line 2, ../../../hub/static/css/mod/praise.scss */ +.recs .rec { + margin-bottom: 36px; + width: 100%; +} + +/* line 3, ../../../hub/static/css/mod/praise.scss */ +.rec blockquote { + padding-left: 1.5em; + color: #404040; + background: url(/static/img/big_quotel.png) no-repeat 0 0 transparent; + margin: 0 15px; + border: none; + font-size: 15px; +} + +/* line 4, ../../../hub/static/css/mod/praise.scss */ +.rec .to-user-info { + margin-bottom: 15px; +} + +/* line 5, ../../../hub/static/css/mod/praise.scss */ +.rec .to-user-info img { + margin: 0 7px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/praise.scss */ +.rec .from-user-info { + float: right; + display: inline-block; + font-style: italic; +} + +/* line 7, ../../../hub/static/css/mod/praise.scss */ +.rec img { + width: 32px; + height: 32px; + margin-left: 7px; +} + +/* line 8, ../../../hub/static/css/mod/praise.scss */ +.rec .vote-buttons { + float: left; + text-align: center; +} + +/* line 9, ../../../hub/static/css/mod/praise.scss */ +.rec a.rec-vote { + display: block; + position: relative; + width: 24px; + height: 24px; + opacity: 0.5; +} + +/* line 10, ../../../hub/static/css/mod/praise.scss */ +.rec a.rec-vote:hover { + opacity: 0.8; +} + +/* line 11, ../../../hub/static/css/mod/praise.scss */ +.rec a.rec-vote { + background: url("/static/img/arrow-up.png") no-repeat scroll center center transparent; +} + +/* line 12, ../../../hub/static/css/mod/praise.scss */ +.rec .vote-buttons.likes a.rec-vote, .rec .vote-buttons.voted a.rec-vote { + background: url("/static/img/arrow-up-orange.png") no-repeat scroll center center transparent; +} + +/* line 13, ../../../hub/static/css/mod/praise.scss */ +.rec .rec-score { + font-weight: bold; + font-size: 20px; + margin-top: 3px; +} + +/* line 14, ../../../hub/static/css/mod/praise.scss */ +.rec .rec-score.current { + color: #C6C6C6; + display: block; +} + +/* line 15, ../../../hub/static/css/mod/praise.scss */ +.rec .vote-buttons.likes .rec-score.current { + display: none; +} + +/* line 16, ../../../hub/static/css/mod/praise.scss */ +.rec .rec-score.likes { + display: none; + color: #FF8B60; +} + +/* line 17, ../../../hub/static/css/mod/praise.scss */ +.rec .vote-buttons.likes .rec-score.likes { + display: block; +} + +/* line 19, ../../../hub/static/css/mod/praise.scss */ +.rec .item-right { + margin-left: 32px; + padding: 12px 5px; + border-bottom: 1px solid #DDD; +} + +/* line 20, ../../../hub/static/css/mod/praise.scss */ +.rec .item-right:hover { + background: #FFF6ED; + border-bottom: 1px solid #FFF6ED; +} + +/* line 22, ../../../hub/static/css/mod/praise.scss */ +.rec-paginator { + font-size: 14px; +} + +/* line 23, ../../../hub/static/css/mod/praise.scss */ +.rec-paginator .next { + float: right; +} diff --git a/dist/css/mod/project-info.css b/dist/css/mod/project-info.css new file mode 100644 index 0000000..38db4b2 --- /dev/null +++ b/dist/css/mod/project-info.css @@ -0,0 +1,289 @@ +@charset "UTF-8"; +/* line 1, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav { + margin-top: 6px; +} + +/* line 3, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label { + position: relative; + display: inline-block; + margin-left: 3px; + padding: 3px 7px; + border: 1px solid #ccc; + border-radius: 3px; + color: #333; + background-color: #fafafa; + vertical-align: middle; +} + +/* line 15, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::before, .metanav .counts-label::after { + content: ""; + position: absolute; + top: 50%; + right: 100%; + display: block; + margin-right: 0px; + margin-top: -6px; + width: 0; + height: 0; + border: 6px solid transparent; + border-right-color: #ccc; +} + +/* line 29, ../../../hub/static/css/mod/meta-nav.scss */ +.metanav .counts-label::after { + margin-right: -1px; + border-right-color: #fafafa; +} + +/* line 2, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.metabox { + display: inline-block; + height: 8px; + background: #ccc; + text-indent: -9999px; + font-size: 12px; +} + +/* line 9, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats { + font: 13px Helvetica, arial, freesans, clean, sans-serif; + line-height: 1.4; + margin: 0; + padding: 0; + border: 0; + position: relative; + float: right; + width: 135px; + opacity: 0.5; + padding-bottom: 10px; +} + +/* line 21, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats:hover { + opacity: 1; +} + +/* line 24, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats:hover .list-tip { + display: block; +} + +/* line 27, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats a { + color: #4183c4; + text-decoration: none; +} + +/* line 31, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats-graph { + height: 10px; + overflow: hidden; +} + +/* line 35, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats-graph span { + display: inline-block; + height: 6px; + background: #ccc; + text-indent: -9999px; + float: left; +} + +/* line 42, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip, ul.list-tip { + border-radius: 3px; + box-shadow: 0 0 5px #ccc; + border: 1px solid #ddd; + background: #fff; + position: absolute; + padding-left: 0px; + top: 20px; + left: -20px; + width: 175px; + z-index: 100; + display: none; + margin-top: 0px; +} + +/* line 56, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip:before, ul.list-tip:before { + content: "▲"; + font-size: 14px; + margin: 0 auto; + width: 14px; + display: block; + margin-top: -13px; + color: #fff; + text-shadow: -1px -1px 2px #ccc; +} + +/* line 66, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li, ul.list-tip li { + margin: 0; + line-height: 100%; + list-style: none; + border-bottom: 1px solid #eee; + font-weight: bold; +} + +/* line 73, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li a, ol.list-tip li .other, ul.list-tip li a, ul.list-tip li .other { + color: #333; + padding: 8px 10px; + display: block; +} + +/* line 78, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li span.color-block, ul.list-tip li span.color-block { + display: inline-block; + width: 8px; + height: 10px; + margin-right: 5px; +} + +/* line 84, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li span.percent, ul.list-tip li span.percent { + float: right; + color: #999; +} + +/* fix project title for newer version of bootstrap*/ +/* line 6, ../../../hub/static/css/mod/project-info.scss */ +.pagehead .pull-left { + margin: 0; + font-size: 30px; + line-height: 36px; +} + +/* Hotfix for FlatUI */ +/* line 13, ../../../hub/static/css/mod/project-info.scss */ +.pagehead h2.pull-left { + margin: 0; +} + +/* line 17, ../../../hub/static/css/mod/project-info.scss */ +#project-info { + border: 1px solid #c5d5dd; + border-radius: 3px; + width: 100%; +} + +/* line 22, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div { + padding: 10px; +} + +/* line 25, ../../../hub/static/css/mod/project-info.scss */ +#project-info p { + margin: 0px; +} + +/* line 28, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div.team-label { + border-top: 1px solid #ccc; +} + +/* line 32, ../../../hub/static/css/mod/project-info.scss */ +#project-info > div.git-url { + border-top: 1px solid #ccc; +} + +/* line 36, ../../../hub/static/css/mod/project-info.scss */ +#project-info input.git-url { + width: 480px; + margin: 0px; + cursor: auto; +} + +/* line 43, ../../../hub/static/css/mod/project-info.scss */ +#project-info .ssh div.ssh-url { + display: inline; +} +/* line 46, ../../../hub/static/css/mod/project-info.scss */ +#project-info .ssh div.http-url { + display: none; +} + +/* line 52, ../../../hub/static/css/mod/project-info.scss */ +#project-info .http div.ssh-url { + display: none; +} +/* line 55, ../../../hub/static/css/mod/project-info.scss */ +#project-info .http div.http-url { + display: inline; +} + +/* line 60, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar { + margin-top: 12px; + border-bottom: 1px solid #DDD; +} + +/* line 61, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar #back-old-browser { + padding-top: 8px; + float: right; +} + +/* line 62, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab { + padding-left: 20px; +} + +/* line 63, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li { + display: inline-block; + vertical-align: top; + cursor: pointer; +} + +/* line 64, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li a { + color: #666; + text-decoration: none; + padding: 8px 12px; + display: inline-block; + border-left: 1px solid transparent; + border-top: 1px solid transparent; + border-right: 1px solid transparent; + margin-bottom: -1px; +} + +/* line 65, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar ul.tab li a.active { + color: #333; + font-weight: bold; + border-left: 1px solid #DDD; + border-top: 1px solid #DDD; + border-right: 1px solid #DDD; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + background-color: white; +} + +/* line 67, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar .scope { + float: left; + margin-right: 10px; +} + +/* line 71, ../../../hub/static/css/mod/project-info.scss */ +.sourcenav-bar .scope i { + font-style: normal; +} + +/* line 75, ../../../hub/static/css/mod/project-info.scss */ +#breadcrumb { + margin: 10px 0; + font-size: 18px; + font-weight: bold; + color: #999; +} + +/* line 76, ../../../hub/static/css/mod/project-info.scss */ +#breadcrumb .final-path { + color: #000; +} diff --git a/dist/css/mod/project-item.css b/dist/css/mod/project-item.css new file mode 100644 index 0000000..2919353 --- /dev/null +++ b/dist/css/mod/project-item.css @@ -0,0 +1,68 @@ +/* Echo out a label for the example */ +/* line 2, ../../../hub/static/css/mod/project-item.scss */ +.bs-docs-project:after { + content: "Proj"; +} + +/* line 6, ../../../hub/static/css/mod/project-item.scss */ +.bs-docs-fork:after { + content: "Fork"; +} + +/* line 10, ../../../hub/static/css/mod/project-item.scss */ +.project-item { + overflow: hidden; + word-wrap: break-word; + word-break: normal; + min-height: 80px; + position: relative; + margin: 15px 0; + padding: 14px 19px 14px 49px; + *padding-top: 14px; + background-color: transparent; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +/* line 25, ../../../hub/static/css/mod/project-item.scss */ +.project-item:after { + position: absolute; + top: -1px; + left: -1px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + background-color: #f5f5f5; + border: 1px solid #ddd; + color: #9da0a4; + -webkit-border-radius: 4px 0 4px 0; + -moz-border-radius: 4px 0 4px 0; + border-radius: 4px 0 4px 0; +} +/* line 40, ../../../hub/static/css/mod/project-item.scss */ +.project-item h4.project-title { + margin: 0; +} +/* line 42, ../../../hub/static/css/mod/project-item.scss */ +.project-item h4.project-title i { + margin-top: 5px; +} +/* line 47, ../../../hub/static/css/mod/project-item.scss */ +.project-item ul.project-stats li { + float: left; + margin-left: 10px; +} +/* line 52, ../../../hub/static/css/mod/project-item.scss */ +.project-item .summary { + margin-top: 10px; +} +/* line 55, ../../../hub/static/css/mod/project-item.scss */ +.project-item .commit-graph { + position: absolute; + left: 10px; + bottom: 0; + z-index: -9999; + height: 80px; + width: 440px; +} diff --git a/dist/css/mod/pull-codereview.css b/dist/css/mod/pull-codereview.css new file mode 100644 index 0000000..f2ddad7 --- /dev/null +++ b/dist/css/mod/pull-codereview.css @@ -0,0 +1,46 @@ +/* codereview style */ +/* comments style is also used in pull-new page's description input box */ +/* line 5, ../../../hub/static/css/mod/pull-codereview.scss */ +.comments-row .comments { + padding: 5px; +} + +/* line 8, ../../../hub/static/css/mod/pull-codereview.scss */ +.comments-row .comment { + margin: 5px 0; + border: 1px solid #CACACA; +} + +/* line 12, ../../../hub/static/css/mod/pull-codereview.scss */ +.comments-row .comment-meta { + padding: 5px 10px; + border-bottom: 1px solid #CCC; + background-image: linear-gradient(top, #F4F8F9, #DCE8EC); + background-image: -o-linear-gradient(top, #F4F8F9, #DCE8EC); + background-image: -moz-linear-gradient(top, #F4F8F9, #DCE8EC); + background-image: -webkit-linear-gradient(top, #F4F8F9, #DCE8EC); + background-image: -ms-linear-gradient(top, #F4F8F9, #DCE8EC); +} + +/* line 22, ../../../hub/static/css/mod/pull-codereview.scss */ +.comments-row .comment .body { + color: #333; + font-size: 13px; + padding: 10px; + background: #FBFBFB; +} + +/* line 29, ../../../hub/static/css/mod/pull-codereview.scss */ +.comments-row .comment-form .help { + margin: 3px 0 0 0; + float: right; + font-size: 11px; + color: #666; +} + +/* line 35, ../../../hub/static/css/mod/pull-codereview.scss */ +.comments-row .comment-form textarea { + width: 100%; + height: 100px; + font-size: 12px; +} diff --git a/dist/css/mod/pull-comment.css b/dist/css/mod/pull-comment.css new file mode 100644 index 0000000..1ab841d --- /dev/null +++ b/dist/css/mod/pull-comment.css @@ -0,0 +1,173 @@ +/* line 1, ../../../hub/static/css/mod/pull-comment.scss */ +.comment-content { + padding: 0; + width: 100%; +} + +/* line 2, ../../../hub/static/css/mod/pull-comment.scss */ +.comment-content .form-content { + padding: 10px; + display: none; + opacity: 1.0; +} + +/* line 3, ../../../hub/static/css/mod/pull-comment.scss */ +.comment-content.is-comment-editing .comment-body { + display: none; +} + +/* line 4, ../../../hub/static/css/mod/pull-comment.scss */ +.comment-content.is-comment-editing .form-content { + display: block; + background-color: #fff; +} + +/* line 5, ../../../hub/static/css/mod/pull-comment.scss */ +.comment-content .form-content form { + margin: 0; +} + +/* line 6, ../../../hub/static/css/mod/pull-comment.scss */ +.comment-content .form-content input.title-field { + font-size: 20px; + font-weight: bold; +} + +/* line 7, ../../../hub/static/css/mod/pull-comment.scss */ +.comment-content .form-content input[type="text"] { + margin-bottom: 5px; + width: 99%; +} + +/* line 8, ../../../hub/static/css/mod/pull-comment.scss */ +.comment-content .form-content textarea { + margin: 0; + width: 99%; + max-width: 100%; + height: 100px; + min-height: 100px; +} + +/* line 9, ../../../hub/static/css/mod/pull-comment.scss */ +.comment-content .form-content .form-actions { + padding: 0; + margin: 10px 0 0 0; +} + +/* line 10, ../../../hub/static/css/mod/pull-comment.scss */ +.comment-content .comment-cancel-button { + float: left; +} + +/* line 12, ../../../hub/static/css/mod/pull-comment.scss */ +.pullrequest #attachments, .pullrequest .foldable, .pullrequest .threading { + display: none; +} + +/* preview comment form style */ +/* line 2, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav { + margin: 10px 0; + border-bottom: 1px solid #DDD; + height: 35px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs { + display: inline-block; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs > li { + display: inline-block; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab { + display: inline-block; + margin-bottom: -1px; + padding: 8px 12px 9px; + border: 1px solid transparent; + border-bottom: 0; + font-size: 14px; + color: #666; + text-decoration: none; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab.selected { + border-color: #DDD; + border-radius: 3px 3px 0 0; + background-color: white; + color: #333; + font-weight: bold; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab:hover { + text-decoration: none; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav { + position: relative; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav ul.tabnav-tabs { + padding-left: 10px; +} + +/* line 10, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 0 10px 10px; +} + +/* line 11, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form #preview_bucket .content-body { + padding: 10px; + min-height: 132px; +} + +/* Button style from hub.css */ +/* line 17, ../../../hub/static/css/mod/pull-comment.scss */ +button.classy, +button.classy:disabled, +button.classy.disabled, +a.button.classy:disabled, +a.button.classy.disabled, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover:disabled, +a.button.classy.disabled:hover, +a.button.classy, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy:disabled:hover, +a.button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover { + display: inline-block; + padding: 8px 15px; + line-height: normal; + position: relative; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 12px; + font-weight: bold; + color: #666; + text-shadow: 0 1px rgba(255, 255, 255, 0.9); + background: whiteSmoke; + background: -moz-linear-gradient(whiteSmoke, #E5E5E5); + background: -webkit-linear-gradient(whiteSmoke, #E5E5E5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; + border-radius: 3px; + border: 1px solid #DDD; + border-bottom-color: #BBB; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} diff --git a/dist/css/mod/pull-github.css b/dist/css/mod/pull-github.css new file mode 100644 index 0000000..be43203 --- /dev/null +++ b/dist/css/mod/pull-github.css @@ -0,0 +1,304 @@ +/*========= Github Style ========*/ +/* line 4, ../../../hub/static/css/mod/pull-github.scss */ +span.diffstat { + white-space: nowrap; + text-align: right; + font-family: Helvetica,arial,freesans,clean,sans-serif; + color: #666; + font-weight: bold; + font-size: 11px; +} + +/* line 12, ../../../hub/static/css/mod/pull-github.scss */ +span.diffstat a { + text-decoration: none; + color: #666; +} + +/* line 16, ../../../hub/static/css/mod/pull-github.scss */ +span.diffstat .diffstat-bar { + position: relative; + left: -3px; + display: inline-block; + height: 12px; + text-decoration: none; + text-align: left; + color: #EEE; + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + line-height: 1; + -webkit-font-smoothing: antialiased; + font-size: 16px; + letter-spacing: -7px; +} + +/* line 34, ../../../hub/static/css/mod/pull-github.scss */ +span.diffstat .diffstat-bar.diff-added, +span.diffstat .diffstat-bar i.plus { + color: #61C423; + font-style: normal; +} + +/* line 39, ../../../hub/static/css/mod/pull-github.scss */ +span.diffstat .diffstat-bar.diff-added, +span.diffstat .diffstat-bar i.minus { + color: #C52323; + font-style: normal; +} + +/* line 45, ../../../hub/static/css/mod/pull-github.scss */ +.mini-icon-added:before { + content: "\f06b"; +} + +/* line 46, ../../../hub/static/css/mod/pull-github.scss */ +.mini-icon-removed:before { + content: "\f06c"; +} + +/* line 47, ../../../hub/static/css/mod/pull-github.scss */ +.mini-icon-modified:before { + content: "\f06d"; +} + +/* line 48, ../../../hub/static/css/mod/pull-github.scss */ +.mini-icon-moved:before, .mini-icon-renamed:before { + content: "\f06e"; +} + +/* TODO remove the following line */ +/* file-blame-blob should only be import at blame page */ +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* line 3, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files { + position: relative; +} + +/* line 6, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file { + margin-top: 0; +} + +/* line 9, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file, .file-box { + border: 1px solid #CCC; + margin-bottom: 13px; + position: relative; + background-color: #DDD; +} + +/* line 15, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta, +.file-box .meta { + overflow: hidden; + padding: 5px 10px; + font-size: 12px; + height: 33px; + text-align: left; + color: #555; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #D8D8D8; + background: #FAFAFA; + background: -moz-linear-gradient(#FAFAFA, #EAEAEA); + background: -webkit-linear-gradient(#FAFAFA, #EAEAEA); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; +} + +/* line 30, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .info, +.file-box .meta .info { + float: left; + height: 33px; + max-width: 555px; + line-height: 33px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +/* line 41, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .info span, +.file-box .meta .info span { + padding-left: 9px; + margin-left: 5px; + border-left: 1px solid #C1C1C1; + box-shadow: inset 1px 0 0 white; +} + +/* line 50, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .info span.icon, +#files .file .meta .info span.diffstat, +.file-box .meta .info span.icon { + line-height: 0; + float: left; + margin: 5px 5px 0 0; + padding: 3px; + background: #F7F7F7; + border: 1px solid #CCC; + border-right-color: #E5E5E5; + border-bottom-color: #E5E5E5; + border-radius: 3px; +} + +/* line 63, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .info span.diffstat { + height: 16px; + padding: 3px 6px; +} + +/* line 67, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .info span:first-child, +#files .file .meta .info .icon + span, +.file-box .meta .info span:first-child, +.file-box .meta .info .icon + span { + border-left: 0 none; + box-shadow: inset 0 0 0 transparent; + margin-left: 0; + padding-left: 0; +} + +/* line 76, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .info span.diffstat .diffstat-bar { + color: #D8D8D8; +} + +/* line 79, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .actions, .file-box .meta .actions { + float: right; + height: 33px; + line-height: 33px; + margin-top: 1px; +} + +/* line 85, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .actions .show-inline-notes { + display: block; + position: relative; + display: block; + float: left; + margin-right: 10px; +} + +/* line 92, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .actions .show-inline-notes label { + font-weight: bold; + margin: 5px 0; +} + +/* line 96, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .actions .show-inline-notes input { + margin: 0; +} + +/* line 99, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .actions .button-group, +.file-box .meta .actions .button-group { + float: right; + margin-top: 2px; +} + +/* line 104, ../../../hub/static/css/mod/file-blame-blob.scss */ +#files .file .meta .actions code, +.file-box .meta .actions code { + background: inherit; + border: none; + font-size: 11px; + color: inherit; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + padding: 0; +} + +/* line 114, ../../../hub/static/css/mod/file-blame-blob.scss */ +.file { + margin: 15px 0; +} + +/* line 118, ../../../hub/static/css/mod/file-blame-blob.scss */ +.file .data { + overflow: auto; +} + +/* line 120, ../../../hub/static/css/mod/file-blame-blob.scss */ +.change #files .file, .file-box, .change .file { + margin-bottom: 0; +} + +/* line 122, ../../../hub/static/css/mod/file-blame-blob.scss */ +.blame .line-data { + font-size: 12px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; +} diff --git a/dist/css/mod/pull-highlight.css b/dist/css/mod/pull-highlight.css new file mode 100644 index 0000000..c980f2d --- /dev/null +++ b/dist/css/mod/pull-highlight.css @@ -0,0 +1,403 @@ +/* highlight style */ +/* line 2, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .hll { + background-color: #ffffcc; +} + +/* line 3, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight { + background: #ffffff; +} + +/* line 4, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .c { + color: #808080; +} + +/* Comment */ +/* line 5, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .err { + color: #F00000; + background-color: #F0A0A0; +} + +/* Error */ +/* line 6, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .k { + color: #008000; + font-weight: bold; +} + +/* Keyword */ +/* line 7, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .o { + color: #303030; +} + +/* Operator */ +/* line 8, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .cm { + color: #808080; +} + +/* Comment.Multiline */ +/* line 9, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .cp { + color: #507090; +} + +/* Comment.Preproc */ +/* line 10, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .c1 { + color: #808080; +} + +/* Comment.Single */ +/* line 11, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .cs { + color: #cc0000; + font-weight: bold; +} + +/* Comment.Special */ +/* line 12, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gd { + color: #A00000; +} + +/* Generic.Deleted */ +/* line 13, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ge { + font-style: italic; +} + +/* Generic.Emph */ +/* line 14, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gr { + color: #FF0000; +} + +/* Generic.Error */ +/* line 15, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gh { + color: #000080; + font-weight: bold; +} + +/* Generic.Heading */ +/* line 16, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gi { + color: #00A000; +} + +/* Generic.Inserted */ +/* line 17, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .go { + color: #808080; +} + +/* Generic.Output */ +/* line 18, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gp { + color: #c65d09; + font-weight: bold; +} + +/* Generic.Prompt */ +/* line 19, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gs { + font-weight: bold; +} + +/* Generic.Strong */ +/* line 20, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gu { + color: #800080; + font-weight: bold; +} + +/* Generic.Subheading */ +/* line 21, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .gt { + color: #0040D0; +} + +/* Generic.Traceback */ +/* line 22, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kc { + color: #008000; + font-weight: bold; +} + +/* Keyword.Constant */ +/* line 23, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kd { + color: #008000; + font-weight: bold; +} + +/* Keyword.Declaration */ +/* line 24, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kn { + color: #008000; + font-weight: bold; +} + +/* Keyword.Namespace */ +/* line 25, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kp { + color: #003080; + font-weight: bold; +} + +/* Keyword.Pseudo */ +/* line 26, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kr { + color: #008000; + font-weight: bold; +} + +/* Keyword.Reserved */ +/* line 27, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .kt { + color: #303090; + font-weight: bold; +} + +/* Keyword.Type */ +/* line 28, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .m { + color: #6000E0; + font-weight: bold; +} + +/* Literal.Number */ +/* line 29, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .s { + background-color: #fff0f0; +} + +/* Literal.String */ +/* line 30, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .na { + color: #0000C0; +} + +/* Name.Attribute */ +/* line 31, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nb { + color: #007020; +} + +/* Name.Builtin */ +/* line 32, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nc { + color: #B00060; + font-weight: bold; +} + +/* Name.Class */ +/* line 33, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .no { + color: #003060; + font-weight: bold; +} + +/* Name.Constant */ +/* line 34, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nd { + color: #505050; + font-weight: bold; +} + +/* Name.Decorator */ +/* line 35, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ni { + color: #800000; + font-weight: bold; +} + +/* Name.Entity */ +/* line 36, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ne { + color: #F00000; + font-weight: bold; +} + +/* Name.Exception */ +/* line 37, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nf { + color: #0060B0; + font-weight: bold; +} + +/* Name.Function */ +/* line 38, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nl { + color: #907000; + font-weight: bold; +} + +/* Name.Label */ +/* line 39, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nn { + color: #0e84b5; + font-weight: bold; +} + +/* Name.Namespace */ +/* line 40, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nt { + color: #007000; +} + +/* Name.Tag */ +/* line 41, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .nv { + color: #906030; +} + +/* Name.Variable */ +/* line 42, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ow { + color: #000000; + font-weight: bold; +} + +/* Operator.Word */ +/* line 43, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .w { + color: #bbbbbb; +} + +/* Text.Whitespace */ +/* line 44, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mf { + color: #6000E0; + font-weight: bold; +} + +/* Literal.Number.Float */ +/* line 45, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mh { + color: #005080; + font-weight: bold; +} + +/* Literal.Number.Hex */ +/* line 46, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mi { + color: #0000D0; + font-weight: bold; +} + +/* Literal.Number.Integer */ +/* line 47, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .mo { + color: #4000E0; + font-weight: bold; +} + +/* Literal.Number.Oct */ +/* line 48, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sb { + background-color: #fff0f0; +} + +/* Literal.String.Backtick */ +/* line 49, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sc { + color: #0040D0; +} + +/* Literal.String.Char */ +/* line 50, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sd { + color: #D04020; +} + +/* Literal.String.Doc */ +/* line 51, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .s2 { + background-color: #fff0f0; +} + +/* Literal.String.Double */ +/* line 52, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .se { + color: #606060; + font-weight: bold; + background-color: #fff0f0; +} + +/* Literal.String.Escape */ +/* line 53, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sh { + background-color: #fff0f0; +} + +/* Literal.String.Heredoc */ +/* line 54, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .si { + background-color: #e0e0e0; +} + +/* Literal.String.Interpol */ +/* line 55, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sx { + color: #D02000; + background-color: #fff0f0; +} + +/* Literal.String.Other */ +/* line 56, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .sr { + color: #000000; + background-color: #fff0ff; +} + +/* Literal.String.Regex */ +/* line 57, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .s1 { + background-color: #fff0f0; +} + +/* Literal.String.Single */ +/* line 58, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .ss { + color: #A06000; +} + +/* Literal.String.Symbol */ +/* line 59, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .bp { + color: #007020; +} + +/* Name.Builtin.Pseudo */ +/* line 60, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .vc { + color: #306090; +} + +/* Name.Variable.Class */ +/* line 61, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .vg { + color: #d07000; + font-weight: bold; +} + +/* Name.Variable.Global */ +/* line 62, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .vi { + color: #3030B0; +} + +/* Name.Variable.Instance */ +/* line 63, ../../../hub/static/css/mod/pull-highlight.scss */ +.highlight .il { + color: #0000D0; + font-weight: bold; +} + +/* Literal.Number.Integer.Long */ diff --git a/dist/css/mod/pull-new.css b/dist/css/mod/pull-new.css new file mode 100644 index 0000000..aed6ad7 --- /dev/null +++ b/dist/css/mod/pull-new.css @@ -0,0 +1,298 @@ +/* line 1, ../../../hub/static/css/mod/pull-new.scss */ +.pull-heading .btn-change { + float: right; + margin: 9px 10px 0 0; +} + +/* line 6, ../../../hub/static/css/mod/pull-new.scss */ +.editor-expander { + cursor: pointer; +} + +/* line 10, ../../../hub/static/css/mod/pull-new.scss */ +.pull-head { + padding: 10px; + border: 1px solid whiteSmoke; + border-top: none; + border-bottom: 2px solid #EEE; + border-radius: 5px; +} + +/* line 18, ../../../hub/static/css/mod/pull-new.scss */ +.pull-description { + font-size: 14px; + margin: 0; + color: #333; + font-weight: 300; +} + +/* line 24, ../../../hub/static/css/mod/pull-new.scss */ +.pull-description a { + font-weight: bold; + color: black; +} + +/* line 28, ../../../hub/static/css/mod/pull-new.scss */ +.pull-description .commit-ref { + margin: 0 3px; +} + +/* line 32, ../../../hub/static/css/mod/pull-new.scss */ +.commit-ref { + padding: 2px 5px; + line-height: 19px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + font-size: 12px; + font-weight: normal; + color: white; + text-shadow: -1px -1px 0 black; + text-decoration: none; + background: #787878; + background: -moz-linear-gradient(#787878, #282828); + background: -webkit-linear-gradient(#787878, #282828); + border-radius: 3px; +} + +/* line 46, ../../../hub/static/css/mod/pull-new.scss */ +.commit-ref .project { + font-weight: normal; + color: #CCC; +} + +/* line 51, ../../../hub/static/css/mod/pull-new.scss */ +.range-editor { + margin: 15px 0 20px; + background: url("http://t.douban.com/img/files/file-1363274223.gif") 50% 80px no-repeat; +} + +/* line 55, ../../../hub/static/css/mod/pull-new.scss */ +.range-editor .chooser-box { + float: left; + width: 420px; +} + +/* line 59, ../../../hub/static/css/mod/pull-new.scss */ +.range-editor .chooser-box.head { + float: right; +} + +/* line 62, ../../../hub/static/css/mod/pull-new.scss */ +.range-editor table.reposha { + margin: 15px 0 0 0; + width: 100%; +} + +/* line 66, ../../../hub/static/css/mod/pull-new.scss */ +.range-editor .commit-preview .message, +.range-editor .commit-preview p.error { + margin: 10px 0 0 0; + background: #F7F8F9; + border: 1px solid #DDD; + border-bottom: none; + border-radius: 3px; +} + +/* line 74, ../../../hub/static/css/mod/pull-new.scss */ +.range-editor .form-actions { + margin: 10px 0 0; + text-align: right; + padding-bottom: 5px; + padding: 0; + background-color: inherit; + border-top: none; +} + +/* line 83, ../../../hub/static/css/mod/pull-new.scss */ +.chooser-box { + padding: 0 10px 10px; + background: white; + background: -moz-linear-gradient(white, #F1F1F1); + background: -webkit-linear-gradient(white, #F1F1F1); + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 91, ../../../hub/static/css/mod/pull-new.scss */ +.chooser-box h3 { + margin: 0 0 0 -10px; + width: 100%; + padding: 13px 10px 10px; + font-size: 16px; + line-height: 1.2; + color: #222; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.5); + background: #FBFBFB; + background: -moz-linear-gradient(#FBFBFB, #F2F2F2); + background: -webkit-linear-gradient(#FBFBFB, #F2F2F2); + border-top-left-radius: 5px; + border-bottom: 1px solid white; +} + +/* line 105, ../../../hub/static/css/mod/pull-new.scss */ +.chooser-box .fakerule { + margin: 0 0 0 -10px; + width: 100%; + height: 1px; + padding: 0 10px; + font-size: 1px; + line-height: 1px; + background: #DDD; +} + +/* line 115, ../../../hub/static/css/mod/pull-new.scss */ +.reposha td.repo { + width: 1%; + white-space: nowrap; +} + +/* line 119, ../../../hub/static/css/mod/pull-new.scss */ +.reposha .repo .at { + padding-right: 5px; + color: #666; +} + +/* line 123, ../../../hub/static/css/mod/pull-new.scss */ +.reposha .sha { + text-align: left; +} + +/* line 126, ../../../hub/static/css/mod/pull-new.scss */ +.reposha input[type="text"] { + width: 98%; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 12px; + line-height: 20px; + color: #444; +} + +/* following commit-preview styles are also used in commits.html */ +/* line 136, ../../../hub/static/css/mod/pull-new.scss */ +.commit-preview { + margin: 10px 0 0 0; + font-size: 11px; +} + +/* line 140, ../../../hub/static/css/mod/pull-new.scss */ +.commit-preview p.name { + margin: 0; + height: 20px; + line-height: 20px; + font-size: 12px; + color: #5B6375; +} + +/* line 147, ../../../hub/static/css/mod/pull-new.scss */ +.commit-preview p.name .avatar { + float: left; + margin-right: 5px; + width: 16px; + height: 16px; + padding: 1px; + background: white; + border: 1px solid #CEDADF; +} + +/* line 156, ../../../hub/static/css/mod/pull-new.scss */ +.commit-preview p.name a { + font-weight: bold; + color: black; +} + +/* line 160, ../../../hub/static/css/mod/pull-new.scss */ +.commit-preview p.name .date { + color: #5B6375; +} + +/* line 163, ../../../hub/static/css/mod/pull-new.scss */ +.commit-preview .message, +.commit-preview p.error { + clear: both; + padding: 5px; + background: #EAF2F5; + border: 1px solid #BEDCE7; +} + +/* line 170, ../../../hub/static/css/mod/pull-new.scss */ +.commit-preview .message pre { + font-size: 11px; + color: #333; + white-space: pre-wrap; + word-wrap: break-word; + border: none; +} + +/* line 177, ../../../hub/static/css/mod/pull-new.scss */ +.commit-preview .message p.commit-id { + margin: 5px 0 0 0; + padding: 0; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + font-size: 11px; +} + +/* line 184, ../../../hub/static/css/mod/pull-new.scss */ +.new-pull-request .pull-tabs { + clear: both; +} + +/* line 188, ../../../hub/static/css/mod/pull-new.scss */ +.mini-icon-commit::before { + content: "\f01f"; +} + +/* line 191, ../../../hub/static/css/mod/pull-new.scss */ +.mini-icon-discussion::before { + content: "\f04f"; +} + +/* line 194, ../../../hub/static/css/mod/pull-new.scss */ +.mini-icon-diff::before { + content: "\f04d"; +} + +/* line 198, ../../../hub/static/css/mod/pull-new.scss */ +.pull-form { + margin: 0; +} + +/* line 201, ../../../hub/static/css/mod/pull-new.scss */ +.pull-form input[type="text"] { + font-size: 14px; + padding: 5px 5px; + margin: 0 0 5px 0; + width: 98%; + color: #444; +} + +/* line 208, ../../../hub/static/css/mod/pull-new.scss */ +.pull-form textarea { + height: 200px; +} + +/* line 211, ../../../hub/static/css/mod/pull-new.scss */ +.pull-form .preview-content { + background: white; +} + +/* line 215, ../../../hub/static/css/mod/pull-new.scss */ +.pull-form-main .form-actions { + padding: 0; + margin-top: 10px; + text-align: right; + padding-bottom: 5px; + background-color: inherit; + border-top: none; +} + +/* line 224, ../../../hub/static/css/mod/pull-new.scss */ +.pull-dest-repo a { + font-size: 12px; + font-weight: bold; + padding: 5px 0; +} + +/* line 229, ../../../hub/static/css/mod/pull-new.scss */ +.pull-dest-repo p { + font-size: 11px; + color: #999; + margin: 5px 0 15px 0; +} diff --git a/dist/css/mod/pull-request.css b/dist/css/mod/pull-request.css new file mode 100644 index 0000000..a871e1f --- /dev/null +++ b/dist/css/mod/pull-request.css @@ -0,0 +1,1345 @@ +@charset "UTF-8"; +/* preview comment form style */ +/* line 2, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav { + margin: 10px 0; + border-bottom: 1px solid #DDD; + height: 35px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs { + display: inline-block; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav .tabnav-tabs > li { + display: inline-block; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab { + display: inline-block; + margin-bottom: -1px; + padding: 8px 12px 9px; + border: 1px solid transparent; + border-bottom: 0; + font-size: 14px; + color: #666; + text-decoration: none; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab.selected { + border-color: #DDD; + border-radius: 3px 3px 0 0; + background-color: white; + color: #333; + font-weight: bold; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-preview.scss */ +.tabnav-tab:hover { + text-decoration: none; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav { + position: relative; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .tabnav ul.tabnav-tabs { + padding-left: 10px; +} + +/* line 10, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 0 10px 10px; +} + +/* line 11, ../../../hub/static/css/mod/comment-form-preview.scss */ +.previewable-comment-form #preview_bucket .content-body { + padding: 10px; + min-height: 132px; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form.tab-content { + overflow: initial; + position: relative; +} + +/* line 2, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { + padding: 10px; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-content.scss */ +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-actions { + padding: 0; +} + +/* line 6, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + position: relative; + border: 3px solid #EEE; +} + +/* line 7, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content { + padding: 0; + background: #EEE; +} + +/* line 8, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content .write-content { + padding: 0 10px 10px; +} + +/* line 9, ../../../hub/static/css/mod/comment-form-content.scss */ +#add-comment-form .form-content textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; + margin: 0; +} + +/* line 1, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton { + position: relative; + display: inline-block; + padding: 0 10px 0 10px; + color: #333; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 13px; + font-weight: bold; + line-height: 24px; + text-shadow: 0 1px 0 #fff; + white-space: nowrap; + border: 1px solid #d4d4d4; + border-bottom-color: #bcbcbc; + border-radius: 3px; + background: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* line 2, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton.green { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + background: #36b825; + background: -moz-linear-gradient(#36b825, #28881b); + background: -webkit-linear-gradient(#36b825, #28881b); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')"; + border-color: #4a993e; +} + +/* line 3, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover.btn-windows:before, .button-group .btn-windows.grouped-button:before:hover { + background-position: -17px 3px; +} + +/* line 4, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:disabled, .minibutton.disabled { + opacity: .5; + cursor: default; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +button.minibutton::-moz-focus-inner { + margin: -1px -3px; +} + +/* line 5, ../../../hub/static/css/mod/minibutton.scss */ +input[type=text] + .minibutton { + margin-left: 5px; +} + +/* line 7, ../../../hub/static/css/mod/minibutton.scss */ +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} + +/* line 1, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary, button.primary.classy:disabled, button.primary.classy.disabled, button.primary.classy:disabled:hover, button.primary.classy.disabled:disabled:hover, button.classy:disabled:hover.primary, button.classy.disabled:disabled:hover.primary { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4); + border-color: #74BB5A; + border-bottom-color: #509338; + background: #8ADD6D; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#8add6d', endColorstr='#60b044')"; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); + background-image: -webkit-linear-gradient(top, #8ADD6D, #60B044); +} + +/* line 2, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy.primary.disabled { + opacity: 0.5; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-button.scss */ +button.classy, +button.classy:disabled, +button.classy.disabled, +a.button.classy:disabled, +a.button.classy.disabled, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover:disabled, +a.button.classy.disabled:hover, +a.button.classy, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy:disabled:hover, +a.button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover { + display: inline-block; + padding: 8px 15px; + line-height: normal; + position: relative; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 12px; + font-weight: bold; + color: #666; + text-shadow: 0 1px rgba(255, 255, 255, 0.9); + background: whiteSmoke; + background: -moz-linear-gradient(whiteSmoke, #E5E5E5); + background: -webkit-linear-gradient(whiteSmoke, #E5E5E5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; + border-radius: 3px; + border: 1px solid #DDD; + border-bottom-color: #BBB; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* ================================== *\ + * Zen Form + * ================================== */ +/* line 6, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + position: fixed; + z-index: 99999; + top: 0; + left: 0; + right: 0; + bottom: 0; + padding: 24px 30px 24px 24px; +} + +/* line 16, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-input-wrap { + max-width: 640px; + position: relative; + margin: 0 auto; +} + +/** + * Buttons style + */ +/* line 25, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button, +.zen-forms-theme-switch { + position: absolute; + width: 18px; + height: 18px; + text-align: center; + top: 10px; + right: 10px; + font-size: 24px; + color: #516066; + cursor: pointer; + line-height: 1; +} + +/* line 39, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-theme-switch { + top: 28px; + font-size: 34px; +} + +/* line 44, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button:hover, +.zen-forms-theme-switch:hover { + color: #667981; +} + +/** + * Inputs basic style + */ +/* line 52, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + padding: 8px 0; + width: 100%; + background: none; + border: none; + margin-bottom: 24px; + cursor: pointer; +} + +/* line 62, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus, +.zen-forms textarea:focus { + cursor: text; +} + +/* line 67, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms textarea { + resize: none; +} + +/* line 71, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + cursor: pointer; + display: none; + padding: 8px 3; + position: absolute; + top: 0; + width: 100%; +} + +/* line 80, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms .empty + label { + display: block; +} + +/* line 84, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus + label, +.zen-forms textarea:focus + label { + display: none; +} + +/* line 89, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms :focus { + outline-color: transparent; + outline-style: none; +} + +/** + * Dark theme + */ +/* line 97, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + background: #151a1c; +} + +/* line 101, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + color: #516066; +} + +/* line 105, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + color: #667981; +} + +/** + * Light theme + */ +/* line 113, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme { + background: #fefefe; +} + +/* line 117, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme label { + color: #959697; +} + +/* line 121, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme input, +.zen-forms.light-theme textarea { + color: #707071; +} + +/* line 4, ../../../hub/static/css/mod/zen-forms.scss */ +.write-content .enable-fullscreen { + position: absolute; + top: 5px; + right: 16px; + color: #333333; + opacity: .5; + line-height: 1em; +} + +/* line 5, ../../../hub/static/css/mod/zen-forms.scss */ +.mini-icon-fullscreen::before { + content: ""; +} + +/* line 6, ../../../hub/static/css/mod/zen-forms.scss */ +.fullscreen-overlay textarea, .zen-forms textarea { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + height: 100%; + padding: 20px; + border: 0; + font-size: 21px; + line-height: 1.6em; + resize: none; + -moz-transition: color 0.15s ease-in 0; + -webkit-transition: color 0.15s ease-in 0; + transition: color 0.15s ease-in 0; + box-shadow: none; +} + +/* line 7, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms.light-theme textarea { + background: #fff; + color: #999999; +} + +/* line 8, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms .zen-forms-input-wrap { + width: 100%; + height: 100%; +} + +/* line 9, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms label[for^=zen-forms-input] { + display: none; +} + +/* line 3, ../../../hub/static/css/mod/comment-form-zen.scss */ +.previewable-comment-form .zen-enabled textarea { + padding: 10px 18px 10px 10px; +} + +/* line 4, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled { + position: relative; +} + +/* line 5, ../../../hub/static/css/mod/comment-form-zen.scss */ +.write-content.zen-enabled .go-zen { + position: absolute; + right: 15px; + top: 5px; +} + +/* line 1, ../../../hub/static/css/mod/loader.scss */ +.loader { + display: none; + position: absolute; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + background-color: #eee; +} + +/* line 2, ../../../hub/static/css/mod/loader.scss */ +.loader .spinner { + display: block; + width: 32px; + height: 32px; + margin: 0 auto; + top: 121px; + position: relative; + background: url(/static/img/spinner.gif) no-repeat; +} + +/* line 1, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view { + position: absolute; + top: 0; + left: 0; + display: none; + margin-top: 18px; + background: white; + border: 1px solid #DDD; + border-radius: 3px; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + min-width: 120px; + z-index: 10; +} + +/* line 15, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur { + background: #3366FF; + color: white; +} + +/* line 19, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur small { + color: white; +} + +/* line 22, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view strong { + color: #3366FF; +} + +/* line 25, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view .cur strong { + color: white; + font: bold; +} + +/* line 29, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul { + /* width: 100px; */ + list-style: none; + padding: 0; + margin: auto; +} + +/* line 35, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view ul li { + display: block; + padding: 5px 10px; + border-bottom: 1px solid #DDD; + cursor: pointer; + /* border-top: 1px solid #C8C8C8; */ +} + +/* line 42, ../../../hub/static/css/lib/jquery.atwho.scss */ +#at-view small { + font-size: smaller; + color: #777; + font-weight: normal; +} + +/* line 9, ../../../hub/static/css/mod/comment-form.scss */ +.side-avatar { + margin-left: 0; +} + +/* fix li header for newer version of bootstrap */ +/* line 12, ../../../hub/static/css/mod/comment-form.scss */ +.comment-form-head li { + line-height: 18px; +} + +/* line 16, ../../../hub/static/css/mod/comment-form.scss */ +#new_comment .form-content { + width: 880px; + margin-left: 60px; +} + +/* line 18, ../../../hub/static/css/mod/comment-form.scss */ +.discussion-bubble-avatar { + position: relative; + float: left; + border-radius: 3px; +} + +/* line 19, ../../../hub/static/css/mod/comment-form.scss */ +.discussion-bubble-inner { + min-height: 60px; + border: 1px solid #CACACA; + background-color: white; +} + +/* line 1, ../../../hub/static/css/mod/loader.scss */ +.loader { + display: none; + position: absolute; + top: 0; + width: 100%; + height: 100%; + opacity: 0.3; + background-color: #eee; +} + +/* line 2, ../../../hub/static/css/mod/loader.scss */ +.loader .spinner { + display: block; + width: 32px; + height: 32px; + margin: 0 auto; + top: 121px; + position: relative; + background: url(/static/img/spinner.gif) no-repeat; +} + +/* line 1, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description .css-truncate-target + .css-truncate-target { + max-width: 125px; +} + +/* line 2, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description p .commit-ref .user { + color: #CCC; +} + +/* line 3, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head { + margin: 20px 0; + background-color: #FAFAFA; + border: 1px solid #EEE; + border-bottom-width: 2px; + border-radius: 3px; +} + +/* line 4, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description .attention-icon { + position: relative; + float: left; + margin: 4px 10px 0 0; +} + +/* line 5, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description p { + padding-left: 10px; + position: relative; + float: left; + margin: 0; + line-height: 36px; + font-size: 13px; + max-width: 690px; + white-space: nowrap; +} + +/* line 6, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description p .user { + font-weight: bold; + color: #333; +} + +/* line 8, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description p { + padding-left: 0; +} + +/* line 12, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description .pull-state { + float: left; + padding: 8px; + margin-right: 8px; + border-right: 1px solid #EEE; + line-height: 20px; +} + +/* line 13, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description .state-indicator { + font-size: 13px; + display: inline-block; + height: 20px; + line-height: 20px; + padding: 0 5px; +} + +/* line 15, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +.commit-ref { + position: relative; + height: 20px; + display: inline-block; + padding: 0 5px; + border: 1px solid black; + border-radius: 3px; + font: 10px/20px Monaco,"Liberation Mono",Courier,monospace; + color: white; + white-space: nowrap; + vertical-align: middle; + background-color: #222; + background-image: -moz-linear-gradient(#444, #222); + background-image: -webkit-linear-gradient(#444, #222); + background-image: linear-gradient(#444, #222); + background-repeat: repeat-x; +} + +/* line 1, ../../../hub/static/css/mod/fav-button.scss */ +a#fav-button { + height: 25px; + width: 25px; + display: block; + float: right; + background: url("/static/img/fav_star.png") 0 0 no-repeat; +} + +/* line 2, ../../../hub/static/css/mod/fav-button.scss */ +a#fav-button.faved { + background: url("/static/img/faved_star.png") 0 0 no-repeat; +} + +/* line 6, ../../../hub/static/css/mod/pull-request.scss */ +#project-info { + margin-bottom: 15px; +} + +/* line 8, ../../../hub/static/css/mod/pull-request.scss */ +.tab-content { + overflow: initial; + position: relative; +} + +/* line 9, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest.tab-content { + min-height: 280px; + overflow: visible; +} + +/* line 11, ../../../hub/static/css/mod/pull-request.scss */ +.commit-preview .date { + color: #5B6375; +} + +/* line 13, ../../../hub/static/css/mod/pull-request.scss */ +.pull-nav.tabnav { + margin: 0 0 10px; + border-bottom: none; + height: 35px; +} + +/* line 14, ../../../hub/static/css/mod/pull-request.scss */ +.pull-nav.tabnav .nav li.active { + font-weight: bold; +} + +/* line 15, ../../../hub/static/css/mod/pull-request.scss */ +.pull-nav.tabnav .nav li a:hover { + background-color: transparent; + border: 1px solid transparent; +} + +/* line 16, ../../../hub/static/css/mod/pull-request.scss */ +.pull-nav.tabnav .nav li.active a { + background-color: #fff; + border-bottom: 1px solid #fff; +} + +/* line 17, ../../../hub/static/css/mod/pull-request.scss */ +.pull-nav.tabnav .nav li.active a:hover { + background-color: #fff; + border: 1px solid #DDD; + border-bottom: 1px solid #fff; +} + +/* line 19, ../../../hub/static/css/mod/pull-request.scss */ +.tabnav .counter { + position: relative; + top: -1px; + margin: 0 0 0 5px; + padding: 1px 5px 2px 5px; + font-size: 10px; + font-weight: bold; + color: #666; + background: #E5E5E5; + border-radius: 10px; +} + +/* line 21, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .explain { + margin: 15px 0; +} + +/* line 23, ../../../hub/static/css/mod/pull-request.scss */ +.discussion-topic-header { + position: relative; + margin: 10px; +} + +/* line 24, ../../../hub/static/css/mod/pull-request.scss */ +.discusion-topic-infobar { + border-bottom: 1px solid #e5e5e5; +} + +/* line 25, ../../../hub/static/css/mod/pull-request.scss */ +.discussion-topic-header .comment-topic-actions { + position: absolute; + top: 10px; + right: 10px; + list-style-type: none; +} + +/* line 26, ../../../hub/static/css/mod/pull-request.scss */ +.discussion-topic-header .comment-topic-actions li { + float: left; + margin-left: 12px; +} + +/* line 28, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest blockquote.citation { + border: none; +} + +/* line 29, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #trac-ticket-title { + display: none; +} + +/* line 30, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket { + margin-top: 23px; +} + +/* line 31, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .trac-topnav { + margin-top: 0; + top: -20px; + position: absolute; + right: 0; +} + +/* line 33, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket, .pullrequest div.change { + margin-bottom: 20px; + background: #fff; + border-radius: 3px; + border: 3px solid #eee; +} + +/* line 34, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket::before, .pullrequest div.change::before, .pullrequest #propertyform fieldset.iefix::before, .pullrequest #add-comment-form .form-content::before { + content: ""; + display: block; + height: 0; + width: 0; + border: 10px solid #EEE; + border-width: 10px 10px 10px 0; + border-color: transparent #EEE transparent transparent; + left: -12px; + top: 15px; + float: left; + position: absolute; +} + +/* line 35, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket::before { + position: absolute; +} + +/* line 36, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest div.change::before, .pullrequest #propertyform fieldset.iefix::before { + position: relative; +} + +/* line 37, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket { + padding: 5px; +} + +/* line 39, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket .date { + float: none; + clear: both; + color: #666; + font-size: 12px; +} + +/* line 40, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket .date::after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* line 41, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket .date p { + float: left; +} + +/* line 42, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket .summary { + font-size: 20px; + font-weight: bold; + margin: 0; +} + +/* line 43, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket .properties { + display: none; + border: none; +} + +/* line 44, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket .description { + margin-top: 10px; +} + +/* line 45, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket .description div { + padding: 0; +} + +/* line 46, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket .description h3 { + display: none; +} + +/* line 47, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket .description #addreply { + float: right; +} + +/* line 51, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .commits-condensed tr td.message { + word-break: break-all; +} +/* line 55, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog { + border: none; + padding: 0; +} +/* line 60, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .change table.commits tr td.author { + width: 80px; +} +/* line 63, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .change table.commits tr td.date { + width: 100px; +} +/* line 66, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .change table.commits tr td.status { + width: 20px; +} +/* line 71, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .change table.commits tr td span.commit-status { + width: 100px; + display: inline-block; + border-radius: 100px; + width: 15px; + height: 15px; + vertical-align: middle; +} +/* line 79, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .change table.commits tr td span.dirty { + background-color: #f6e69f; +} +/* line 82, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .change table.commits tr td span.error { + background-color: #da4f49; +} +/* line 85, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .change table.commits tr td span.success { + background-color: #6eda62; +} + +/* line 93, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog h3 { + border: none; +} + +/* line 94, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .change div.outdated_mark { + background-color: #DDD; + height: 31px; + text-align: center; + color: #777; + line-height: 31px; +} + +/* line 95, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .change div.outdated_commits { + display: none; +} + +/* line 96, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .change div.outdated_codereview { + display: none; +} + +/* line 97, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest div.change { + padding: 0; + background: #FBFBFB; +} + +/* line 98, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .change h3.change { + color: #333; + margin: 0; + font-size: 12px; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.7); + white-space: nowrap; + text-overflow: ellipsis; + padding: 0 10px 0 6px; + border-bottom: 1px solid #CCC; + background: -webkit-linear-gradient(#F8FBFC, #DDE8EB); + background-image: -webkit-linear-gradient(#F8F8F8, #E1E1E1); + background-image: linear-gradient(#F8F8F8, #E1E1E1); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f8fbfc', endColorstr='#dde8eb')"; +} + +/* line 99, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest div.change form[id^=reply-to-comment-] { + right: 7px; +} + +/* line 100, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest div.change table.commits .commit code { + background-color: transparent; +} + +/* line 101, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .comment { + margin: 0; + top: -1px; + position: relative; +} + +/* line 102, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .comment #files { + margin-top: -24px; +} + +/* line 103, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .comment #files .file { + width: 100%; + margin: 0 0 0 -1px; +} + +/* line 104, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .comment p br { + height: 0; +} + +/* line 105, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .comment p { + padding: 5px; + margin: 0; + color: #333; +} + +/* line 107, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest div.change form#trac-comment-editor { + position: relative; + right: 0; + margin: 12px; +} + +/* line 108, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest h2#trac-add-comment, .pullrequest .trac-nav { + display: none; +} + +/* line 109, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest fieldset.iefix { + padding: 6px; + background: #EEE; + border-radius: 3px; +} + +/* line 110, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest fieldset.iefix h3 { + font-size: 13px; + line-height: 1.4; + color: #333; + margin: 0 5px; +} + +/* line 112, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #propertyform .btn[type=submit] { + padding: 8px 15px; +} + +/* line 113, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #modify { + background-color: #EEE; + padding: 12px; +} + +/* line 114, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #ticketchange.ticketdraft { + padding: 1em; + background: none; + background-color: #FBFBFB; +} + +/* line 115, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #ticketchange.ticketdraft .comment { + margin: 1em; +} + +/* line 116, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #ticketchange.ticketdraft .comment blockquote.citation { + margin: 12px 0; +} + +/* line 117, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #ticketchange.ticketdraft .comment blockquote.citation p { + font-size: 13px; +} + +/* line 119, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket .side-avatar { + position: absolute; + float: left; + margin-left: -60px; +} + +/* line 121, ../../../hub/static/css/mod/pull-request.scss */ +table.commits { + margin: 0; + font-size: 12px; +} + +/* line 123, ../../../hub/static/css/mod/pull-request.scss */ +.pull-participation { + margin: -10px 0 15px; + font-size: 13px; + font-weight: 300; + color: #666; +} + +/* line 124, ../../../hub/static/css/mod/pull-request.scss */ +.pull-participation p.quickstat { + display: inline-block; + margin: 0 5px 0 0; +} + +/* line 125, ../../../hub/static/css/mod/pull-request.scss */ +.pull-participation a { + color: #666; +} + +/* line 126, ../../../hub/static/css/mod/pull-request.scss */ +.pull-participation .avatar { + position: relative; + display: inline-block; + height: 24px; + top: -2px; + margin-right: 3px; + margin-bottom: 3px; +} + +/* line 127, ../../../hub/static/css/mod/pull-request.scss */ +.pull-participation .avatar img { + vertical-align: middle; +} + +/* action-bubble part is also used in commits.html */ +/* line 131, ../../../hub/static/css/mod/pull-request.scss */ +.action-bubble { + margin: 20px 0; +} + +/* line 132, ../../../hub/static/css/mod/pull-request.scss */ +.action-bubble .action { + float: left; + line-height: 29px; +} + +/* line 133, ../../../hub/static/css/mod/pull-request.scss */ +.action-bubble .state-indicator { + display: inline-block; + margin-right: 8px; + font-size: 12px; + padding: 0 5px; + line-height: 24px; +} + +/* line 134, ../../../hub/static/css/mod/pull-request.scss */ +.state-indicator.closed { + background: #BD2C00; +} + +/* line 135, ../../../hub/static/css/mod/pull-request.scss */ +.state-indicator { + display: block; + font-size: 14px; + font-weight: bold; + color: white; + text-align: center; + border-radius: 3px; + background: #999; +} + +/* line 136, ../../../hub/static/css/mod/pull-request.scss */ +.action-bubble .bubble { + font-size: 13px; + font-weight: 300; + background-color: transparent; +} + +/* line 137, ../../../hub/static/css/mod/pull-request.scss */ +.bubble { + padding: 3px; + background: #EEE; + border-radius: 3px; +} + +/* line 138, ../../../hub/static/css/mod/pull-request.scss */ +.action-bubble .bubble p { + margin: 0; + line-height: 26px; +} + +/* line 139, ../../../hub/static/css/mod/pull-request.scss */ +.action-bubble .bubble strong { + font-weight: bold; +} + +/* line 140, ../../../hub/static/css/mod/pull-request.scss */ +.action-bubble .avatar { + position: relative; + top: -2px; + display: inline-block; + height: 24px; + margin-right: 3px; + line-height: 1px; +} + +/* line 141, ../../../hub/static/css/mod/pull-request.scss */ +.action-bubble .avatar img { + vertical-align: middle; +} + +/* line 142, ../../../hub/static/css/mod/pull-request.scss */ +.state-indicator.open, .state-indicator.reopened, .state-indicator.merged { + background: #6CC644; +} + +/* the following action-bubble style seems only used in commits.html */ +/* line 146, ../../../hub/static/css/mod/pull-request.scss */ +.action-bubble .state-renamed { + color: black; + background-color: #FFFA5D; + text-shadow: none; +} + +/* line 151, ../../../hub/static/css/mod/pull-request.scss */ +.action-bubble .state { + display: inline-block; + padding: 0 5px; + height: 24px; + line-height: 25px; + text-shadow: 0 -1px -1px rgba(0, 0, 0, 0.25); +} + +/* line 158, ../../../hub/static/css/mod/pull-request.scss */ +.action-bubble .state { + float: none; + padding: 3px 5px; + font-size: 11px; +} + +/* line 165, ../../../hub/static/css/mod/pull-request.scss */ +.closed-banner { + margin: 15px 0; + height: 7px; + overflow: hidden; + background: url("/static/img/closed_pattern.gif"); + border-radius: 5px; +} + +/* line 167, ../../../hub/static/css/mod/pull-request.scss */ +.change-header .change-header-right { + float: right; + height: 15px; +} + +/* line 168, ../../../hub/static/css/mod/pull-request.scss */ +.change-header .change-header-date { + display: inline-block; + margin: 0; + height: 33px; + font-size: 11px; + font-style: normal; + color: #777; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.7); +} + +/* line 170, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest .ticket #ticket { + padding: 0; +} + +/* line 171, ../../../hub/static/css/mod/pull-request.scss */ +.discussion-bubble-avatar { + position: relative; + float: left; + border-radius: 3px; +} + +/* line 172, ../../../hub/static/css/mod/pull-request.scss */ +.discussion-bubble-inner { + min-height: 60px; + border: 1px solid #CACACA; + background-color: white; +} + +/* line 174, ../../../hub/static/css/mod/pull-request.scss */ +.pullrequest #changelog .change .change-header { + height: 23px; + color: #333; + margin: 0; + font-size: 12px; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.7); + white-space: nowrap; + text-overflow: ellipsis; + padding: 3px 10px 0 6px; + border-bottom: 1px solid #CCC; + background: -webkit-linear-gradient(#F8FBFC, #DDE8EB); + background-image: -webkit-linear-gradient(#F8F8F8, #E1E1E1); + background-image: linear-gradient(#F8F8F8, #E1E1E1); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f8fbfc', endColorstr='#dde8eb')"; +} + +/* line 176, ../../../hub/static/css/mod/pull-request.scss */ +.comment-content .comment-body, .pullrequest .ticket #ticket .comment-content .comment-body { + padding: 10px; + font-size: 13px; + overflow: auto; + width: 100%; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +/* line 177, ../../../hub/static/css/mod/pull-request.scss */ +.comment-content .comment-body, .pullrequest #changelog .comment p { + font-size: 13px; +} + +/* line 179, ../../../hub/static/css/mod/pull-request.scss */ +.user-mention, .team-mention { + font-weight: bold; + color: #333; +} + +/* line 181, ../../../hub/static/css/mod/pull-request.scss */ +.change #files .file { + border: none; +} diff --git a/dist/css/mod/pull-tabs.css b/dist/css/mod/pull-tabs.css new file mode 100644 index 0000000..7c4f835 --- /dev/null +++ b/dist/css/mod/pull-tabs.css @@ -0,0 +1,77 @@ +/* tabs */ +/* line 3, ../../../hub/static/css/mod/pull-tabs.scss */ +ul.smalltabs { + margin: 15px 0 15px 0; + height: 24px; + line-height: 24px; + font-size: 12px; + color: #555; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.5); + background: #E8E8E8; + background: -moz-linear-gradient(#E8E8E8, #D2D2D2); + background: -webkit-linear-gradient(#E8E8E8, #D2D2D2); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#e8e8e8',endColorstr='#d2d2d2')"; + border: 1px solid #D1D1D1; + border-bottom-color: #BBB; + border-radius: 3px; +} + +/* line 18, ../../../hub/static/css/mod/pull-tabs.scss */ +ul.smalltabs li { + list-style-type: none; + display: inline; + line-height: 24px; +} + +/* line 23, ../../../hub/static/css/mod/pull-tabs.scss */ +ul.smalltabs li:first-child a.selected { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} + +/* line 27, ../../../hub/static/css/mod/pull-tabs.scss */ +ul.smalltabs li:first-child a { + border-left: none; +} + +/* line 30, ../../../hub/static/css/mod/pull-tabs.scss */ +ul.smalltabs li.active a { + color: #333; + background: white; + background: -moz-linear-gradient(white, #F2F2F2); + background: -webkit-linear-gradient(white, #F2F2F2); +} + +/* line 36, ../../../hub/static/css/mod/pull-tabs.scss */ +ul.smalltabs a { + float: left; + height: 24px; + padding: 0 7px; + color: #666; + font-weight: bold; + text-decoration: none; + border-right: 1px solid #ABABAB; + border-left: 1px solid #F6F6F6; +} + +/* line 46, ../../../hub/static/css/mod/pull-tabs.scss */ +ul.smalltabs .mini-icon { + vertical-align: middle; + color: #888; +} + +/* line 50, ../../../hub/static/css/mod/pull-tabs.scss */ +ul.smalltabs .counter { + display: inline-block; + position: relative; + top: -1px; + margin-left: 2px; + line-height: 12px; + padding: 1px 3px 0 3px; + font-size: 9px; + background: #ECECEC; + border: 1px solid #AFAFAF; + border-right-color: #ECECEC; + border-bottom-color: #ECECEC; + border-radius: 2px; +} diff --git a/dist/css/mod/pull-ticket.css b/dist/css/mod/pull-ticket.css new file mode 100644 index 0000000..d84e066 --- /dev/null +++ b/dist/css/mod/pull-ticket.css @@ -0,0 +1,327 @@ +/* ticket style */ +/* line 2, ../../../hub/static/css/mod/pull-ticket.scss */ +#content.ticket { + width: 63em; + max-width: 100%; + margin-left: auto; +} + +/* line 8, ../../../hub/static/css/mod/pull-ticket.scss */ +#field-description-help { + float: right; +} + +/* line 9, ../../../hub/static/css/mod/pull-ticket.scss */ +#properties div.trac-resizable, #field-description { + width: 100%; +} + +/* line 11, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket { + background: #ffd; + border: 1px outset #996; + margin-top: 1em; + padding: .5em 1em; + position: relative; +} + +/* line 19, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket.ticketdraft { + background: #f8f8f8 url(../draft.png); +} + +/* line 22, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticketchange.ticketdraft { + padding: 0 1em; + margin: 1em 0; +} + +/* line 26, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticketchange.ticketdraft h3 { + margin-top: .5em; +} + +/* line 29, ../../../hub/static/css/mod/pull-ticket.scss */ +.preview-notice { + font-weight: bold; +} + +/* line 31, ../../../hub/static/css/mod/pull-ticket.scss */ +.ticketdraft { + background: #f8f8f8 url(../draft.png); + border: 1px outset #996; + padding: 0 .2em; +} + +/* line 37, ../../../hub/static/css/mod/pull-ticket.scss */ +h1 .status { + color: #444; +} + +/* line 38, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket h2.summary { + margin: 0 0 0.8em 0; +} + +/* line 39, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket .date { + color: #996; + float: right; + font-size: 85%; + position: relative; +} + +/* line 40, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket .date p { + margin: 0.3em; +} + +/* line 42, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket table.properties { + clear: both; + border-top: 1px solid #dd9; + border-collapse: collapse; + table-layout: fixed; + width: 100%; +} + +/* line 49, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket table.properties tr { + border-bottom: 1px dotted #eed; +} + +/* line 50, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket table.properties td, #ticket table.properties th { + font-size: 80%; + padding: .5em 1em; + vertical-align: top; +} + +/* line 55, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket table.properties th { + color: #663; + font-weight: normal; + text-align: left; + width: 20%; +} + +/* line 61, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket table.properties td { + width: 30%; +} + +/* line 62, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket table.properties td p:first-child { + margin-top: 0; +} + +/* line 63, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket table.properties td p:last-child { + margin-bottom: 0; +} + +/* line 64, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket table.properties .description { + border-top: 1px solid #dd9; +} + +/* line 66, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket .description h3 { + border-bottom: 1px solid #dd9; + color: #663; + font-size: 100%; + font-weight: normal; +} + +/* line 72, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket .description h3 .lastmod { + font-size: 90%; +} + +/* line 75, ../../../hub/static/css/mod/pull-ticket.scss */ +#ticket .inlinebuttons { + float: right; + position: relative; + bottom: 0.3em; + margin-left: 0.2em; +} + +/* line 82, ../../../hub/static/css/mod/pull-ticket.scss */ +#changelog { + border: 1px outset #996; + padding: 1em; +} + +/* line 83, ../../../hub/static/css/mod/pull-ticket.scss */ +.trac-shade { + background-color: #eee; +} + +/* line 84, ../../../hub/static/css/mod/pull-ticket.scss */ +#trac-comment-editor { + margin-left: 2em; + margin-bottom: 1em; +} + +/* line 85, ../../../hub/static/css/mod/pull-ticket.scss */ +#trac-comment-editor div.trac-resizable { + width: 100%; +} + +/* line 86, ../../../hub/static/css/mod/pull-ticket.scss */ +#trac-comment-editor textarea { + background: #ffffe0; + margin-left: -1px; + margin-right: -1px; + width: 100%; +} + +/* line 92, ../../../hub/static/css/mod/pull-ticket.scss */ +#trac-comment-editor .wikitoolbar { + margin-left: -1px; +} + +/* line 93, ../../../hub/static/css/mod/pull-ticket.scss */ +#trac-add-comment :link, #trac-add-comment :visited { + color: #b00; +} + +/* line 94, ../../../hub/static/css/mod/pull-ticket.scss */ +#changelog h3, #ticketchange h3 { + border-bottom: 1px solid #d7d7d7; + color: #999; + font-size: 100%; + font-weight: normal; +} + +/* line 100, ../../../hub/static/css/mod/pull-ticket.scss */ +.threading, #changelog .inlinebuttons { + float: right; + margin-left: 0.2em; +} + +/* line 101, ../../../hub/static/css/mod/pull-ticket.scss */ +.threading { + font-size: 85%; +} + +/* line 102, ../../../hub/static/css/mod/pull-ticket.scss */ +.threading :link, .threading :visited { + border-bottom: 0; +} + +/* line 103, ../../../hub/static/css/mod/pull-ticket.scss */ +#changelog .trac-lastedit { + padding-left: 2.5em; + color: #999; + font-size: 80%; +} + +/* line 108, ../../../hub/static/css/mod/pull-ticket.scss */ +#changelog .trac-lastedit :link, #changelog .trac-lastedit :visited { + color: inherit; +} + +/* line 110, ../../../hub/static/css/mod/pull-ticket.scss */ +#changelog .changes, #ticketchange .changes { + list-style: square; + margin-left: 2em; + padding: 0; +} + +/* line 111, ../../../hub/static/css/mod/pull-ticket.scss */ +#changelog .comment, #ticketchange .comment { + margin-left: 2em; +} + +/* line 113, ../../../hub/static/css/mod/pull-ticket.scss */ +form .field { + margin-top: .75em; + width: 100%; +} + +/* line 114, ../../../hub/static/css/mod/pull-ticket.scss */ +form .field fieldset.iefix { + margin-left: 1px; + margin-right: 1px; +} + +/* line 115, ../../../hub/static/css/mod/pull-ticket.scss */ +label[for=comment] { + float: right; +} + +/* line 116, ../../../hub/static/css/mod/pull-ticket.scss */ +form .field .wikitoolbar { + margin-left: -1px; +} + +/* line 117, ../../../hub/static/css/mod/pull-ticket.scss */ +form .field div.trac-resizable { + width: 100%; +} + +/* line 119, ../../../hub/static/css/mod/pull-ticket.scss */ +#properties { + white-space: nowrap; + line-height: 160%; + padding: 0.5em; +} + +/* line 120, ../../../hub/static/css/mod/pull-ticket.scss */ +#properties table { + border-spacing: 0; + width: 100%; + padding: 0 0.5em; +} + +/* line 121, ../../../hub/static/css/mod/pull-ticket.scss */ +#properties table th { + padding: .4em; + text-align: right; + width: 20%; + vertical-align: top; +} + +/* line 127, ../../../hub/static/css/mod/pull-ticket.scss */ +#properties table th.col2 { + border-left: 1px dotted #d7d7d7; +} + +/* line 128, ../../../hub/static/css/mod/pull-ticket.scss */ +#properties table td { + vertical-align: middle; + width: 30%; +} + +/* line 129, ../../../hub/static/css/mod/pull-ticket.scss */ +#properties table td.fullrow { + vertical-align: middle; + width: 80%; +} + +/* line 131, ../../../hub/static/css/mod/pull-ticket.scss */ +#action { + line-height: 2em; +} + +/* line 133, ../../../hub/static/css/mod/pull-ticket.scss */ +fieldset.radio { + border: none; + margin: 0; + padding: 0; +} + +/* line 134, ../../../hub/static/css/mod/pull-ticket.scss */ +fieldset.radio legend { + color: #000; + float: left; + font-size: 100%; + font-weight: normal; + padding: 0 1em 0 0; +} + +/* line 141, ../../../hub/static/css/mod/pull-ticket.scss */ +fieldset.radio label { + padding-right: 1em; +} diff --git a/dist/css/mod/pullrequest-list.css b/dist/css/mod/pullrequest-list.css new file mode 100644 index 0000000..f02ea96 --- /dev/null +++ b/dist/css/mod/pullrequest-list.css @@ -0,0 +1,218 @@ +/* line 1, ../../../hub/static/css/mod/filter-tabs.scss */ +.list-browser-filter-tabs { + display: block; + float: left; + padding: 5px 5px 0; + overflow: hidden; +} +/* line 6, ../../../hub/static/css/mod/filter-tabs.scss */ +.list-browser-filter-tabs .filter-tab { + display: inline-block; + padding: 0 8px; + height: 24px; + line-height: 24px; + font-size: 12px; + font-weight: bold; + color: #888; + -webkit-font-smoothing: antialiased; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.3); + text-decoration: none; + border: 1px solid #CCC; + border-bottom: 0; + border-radius: 3px 3px 0 0; + background: rgba(255, 255, 255, 0.2); + cursor: pointer; +} +/* line 23, ../../../hub/static/css/mod/filter-tabs.scss */ +.list-browser-filter-tabs .selected { + color: #333; + background: white; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + border-color: #B4B4B4; + border-bottom: 1px solid white; +} + +/* line 1, ../../../hub/static/css/mod/pagination.scss */ +.pagination { + display: block; + margin: 7px 0; + overflow: hidden; +} +/* line 5, ../../../hub/static/css/mod/pagination.scss */ +.pagination a { + padding: 8px; + width: 100%; + text-align: center; + line-height: 1.4; +} +/* line 11, ../../../hub/static/css/mod/pagination.scss */ +.pagination a, .pagination span { + float: left; + margin: 0; + color: #777; + font-size: 13px; + text-decoration: none; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #DADADA; +} +/* line 23, ../../../hub/static/css/mod/pagination.scss */ +.pagination ul li a { + width: 20px; +} +/* line 29, ../../../hub/static/css/mod/pagination.scss */ +.pagination ul .disabled a { + background-color: #fff; +} + +/* line 4, ../../../hub/static/css/mod/pullrequest-list.scss */ +.pulls { + margin: 20px 0; +} +/* line 6, ../../../hub/static/css/mod/pullrequest-list.scss */ +.pulls h2 { + font-size: 16px; + font-weight: bold; + margin: 0; +} + +/* line 13, ../../../hub/static/css/mod/pullrequest-list.scss */ +.row.pulls .mod p { + word-wrap: break-word; +} + +/* line 17, ../../../hub/static/css/mod/pullrequest-list.scss */ +.pulls-list { + word-break: break-all; +} +/* line 19, ../../../hub/static/css/mod/pullrequest-list.scss */ +.pulls-list h3 { + margin: 0; + font-size: 14px; + line-height: 1.3; +} +/* line 23, ../../../hub/static/css/mod/pullrequest-list.scss */ +.pulls-list h3 a { + color: #333; +} +/* line 27, ../../../hub/static/css/mod/pullrequest-list.scss */ +.pulls-list .list-browser-item { + position: relative; + padding: 10px; + border-bottom: 1px solid #EAEAEA; +} +/* line 32, ../../../hub/static/css/mod/pullrequest-list.scss */ +.pulls-list .meta { + float: left; + margin-top: 4px; + margin-bottom: -2px; + height: 16px; + padding: 4px 6px; + font-size: 11px; + color: rgba(0, 0, 0, 0.55); + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.5); + background: rgba(0, 0, 0, 0.07); + border-radius: 3px; +} +/* line 44, ../../../hub/static/css/mod/pullrequest-list.scss */ +.pulls-list p a { + color: #555; + text-decoration: none; +} + +/* line 50, ../../../hub/static/css/mod/pullrequest-list.scss */ +.chromed-list-browser { + border-color: #D5D5D5; + position: relative; + border: 1px solid #DDD; + border-radius: 5px; +} +/* line 55, ../../../hub/static/css/mod/pullrequest-list.scss */ +.chromed-list-browser .pagination { + float: right; + margin: 7px; + font-weight: bold; + height: 26px; +} +/* line 60, ../../../hub/static/css/mod/pullrequest-list.scss */ +.chromed-list-browser .pagination a { + padding: 4px; + font-size: 11px; + color: #4183C4; + width: auto; +} +/* line 66, ../../../hub/static/css/mod/pullrequest-list.scss */ +.chromed-list-browser .pagination span { + padding: 4px; + font-size: 11px; + color: #4183C4; +} +/* line 72, ../../../hub/static/css/mod/pullrequest-list.scss */ +.chromed-list-browser .none, .chromed-list-browser .error { + padding: 10px; + border-bottom: 1px solid #DDD; +} +/* line 75, ../../../hub/static/css/mod/pullrequest-list.scss */ +.chromed-list-browser .none p, .chromed-list-browser .error p { + margin: 0; + padding: 20px; + border-radius: 3px; + text-align: center; + font-weight: bold; + font-size: 14px; + color: #999; + background: #F3F3F3; + -webkit-font-smoothing: antialiased; +} + +/* line 91, ../../../hub/static/css/mod/pullrequest-list.scss */ +.list-browser-item .list-browser-bottom-right-info { + position: absolute; + bottom: 3px; + right: 5px; +} +/* line 96, ../../../hub/static/css/mod/pullrequest-list.scss */ +.list-browser-item .list-browser-bottom-right-item { + padding-left: 18px; + font-size: 11px; + font-weight: bold; + color: #999; +} +/* line 101, ../../../hub/static/css/mod/pullrequest-list.scss */ +.list-browser-item .list-browser-bottom-right-item a { + color: #666; +} + +/* line 107, ../../../hub/static/css/mod/pullrequest-list.scss */ +.list-browser-filterbar { + font-family: "Helvetica Neue", Helvetica, Arial, freesans; + border-radius: 5px 5px 0 0; + height: 31px; + background-color: #CACACA; + background-image: -moz-linear-gradient(#EFEFEF, #CACACA); + background-image: -webkit-linear-gradient(#EFEFEF, #CACACA); + background-image: linear-gradient(#EFEFEF, #CACACA); + background-repeat: repeat-x; + border-bottom: 1px solid #B4B4B4; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +/* line 117, ../../../hub/static/css/mod/pullrequest-list.scss */ +.list-browser-filterbar li { + list-style-type: none; + display: inline; +} + +/* line 123, ../../../hub/static/css/mod/pullrequest-list.scss */ +.list-browser-footer { + font-size: 11px; + font-weight: bold; + color: #777; + overflow: hidden; + min-height: 15px; + background: #F6F6F6; + border-radius: 0 0 5px 5px; +} +/* line 131, ../../../hub/static/css/mod/pullrequest-list.scss */ +.list-browser-footer .pagination { + margin: 5px; +} diff --git a/dist/css/mod/pullrequest-pull-head-responsive.css b/dist/css/mod/pullrequest-pull-head-responsive.css new file mode 100644 index 0000000..6e8cd8a --- /dev/null +++ b/dist/css/mod/pullrequest-pull-head-responsive.css @@ -0,0 +1,6 @@ +@media (max-width: 767px) { + /* line 2, ../../../hub/static/css/mod/pullrequest-pull-head-responsive.scss */ + div.pull-head .pull-description p { + white-space: normal; + } +} diff --git a/dist/css/mod/pullrequest-pull-head.css b/dist/css/mod/pullrequest-pull-head.css new file mode 100644 index 0000000..78e0b50 --- /dev/null +++ b/dist/css/mod/pullrequest-pull-head.css @@ -0,0 +1,85 @@ +/* line 1, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description .css-truncate-target + .css-truncate-target { + max-width: 125px; +} + +/* line 2, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description p .commit-ref .user { + color: #CCC; +} + +/* line 3, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head { + margin: 20px 0; + background-color: #FAFAFA; + border: 1px solid #EEE; + border-bottom-width: 2px; + border-radius: 3px; +} + +/* line 4, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description .attention-icon { + position: relative; + float: left; + margin: 4px 10px 0 0; +} + +/* line 5, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description p { + padding-left: 10px; + position: relative; + float: left; + margin: 0; + line-height: 36px; + font-size: 13px; + max-width: 690px; + white-space: nowrap; +} + +/* line 6, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description p .user { + font-weight: bold; + color: #333; +} + +/* line 8, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description p { + padding-left: 0; +} + +/* line 12, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description .pull-state { + float: left; + padding: 8px; + margin-right: 8px; + border-right: 1px solid #EEE; + line-height: 20px; +} + +/* line 13, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +div.pull-head .pull-description .state-indicator { + font-size: 13px; + display: inline-block; + height: 20px; + line-height: 20px; + padding: 0 5px; +} + +/* line 15, ../../../hub/static/css/mod/pullrequest-pull-head.scss */ +.commit-ref { + position: relative; + height: 20px; + display: inline-block; + padding: 0 5px; + border: 1px solid black; + border-radius: 3px; + font: 10px/20px Monaco,"Liberation Mono",Courier,monospace; + color: white; + white-space: nowrap; + vertical-align: middle; + background-color: #222; + background-image: -moz-linear-gradient(#444, #222); + background-image: -webkit-linear-gradient(#444, #222); + background-image: linear-gradient(#444, #222); + background-repeat: repeat-x; +} diff --git a/dist/css/mod/quick-emoji.css b/dist/css/mod/quick-emoji.css new file mode 100644 index 0000000..e53c330 --- /dev/null +++ b/dist/css/mod/quick-emoji.css @@ -0,0 +1,32 @@ +/* line 1, ../../../hub/static/css/mod/quick-emoji.scss */ +.quick-emoji { + margin-right: 10px; +} +/* line 4, ../../../hub/static/css/mod/quick-emoji.scss */ +.quick-emoji .description { + text-align: center; + color: #999; +} +/* line 9, ../../../hub/static/css/mod/quick-emoji.scss */ +.quick-emoji .emojis { + overflow-x: hidden; + overflow-y: scroll; + word-wrap: break-word; + word-break: break-all; + width: 290px; + height: 260px; +} +/* line 17, ../../../hub/static/css/mod/quick-emoji.scss */ +.quick-emoji .emojis a { + display: block; + float: left; + width: 25px; + height: 25px; + padding: 2px; + border: 1px solid white; +} +/* line 24, ../../../hub/static/css/mod/quick-emoji.scss */ +.quick-emoji .emojis a:hover { + background: #eef; + border: 1px solid #aad; +} diff --git a/dist/css/mod/repository-lang-stats.css b/dist/css/mod/repository-lang-stats.css new file mode 100644 index 0000000..b1f9e13 --- /dev/null +++ b/dist/css/mod/repository-lang-stats.css @@ -0,0 +1,112 @@ +@charset "UTF-8"; +/* line 2, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.metabox { + display: inline-block; + height: 8px; + background: #ccc; + text-indent: -9999px; + font-size: 12px; +} + +/* line 9, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats { + font: 13px Helvetica, arial, freesans, clean, sans-serif; + line-height: 1.4; + margin: 0; + padding: 0; + border: 0; + position: relative; + float: right; + width: 135px; + opacity: 0.5; + padding-bottom: 10px; +} + +/* line 21, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats:hover { + opacity: 1; +} + +/* line 24, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats:hover .list-tip { + display: block; +} + +/* line 27, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats a { + color: #4183c4; + text-decoration: none; +} + +/* line 31, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats-graph { + height: 10px; + overflow: hidden; +} + +/* line 35, ../../../hub/static/css/mod/repository-lang-stats.scss */ +.repository-lang-stats-graph span { + display: inline-block; + height: 6px; + background: #ccc; + text-indent: -9999px; + float: left; +} + +/* line 42, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip, ul.list-tip { + border-radius: 3px; + box-shadow: 0 0 5px #ccc; + border: 1px solid #ddd; + background: #fff; + position: absolute; + padding-left: 0px; + top: 20px; + left: -20px; + width: 175px; + z-index: 100; + display: none; + margin-top: 0px; +} + +/* line 56, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip:before, ul.list-tip:before { + content: "▲"; + font-size: 14px; + margin: 0 auto; + width: 14px; + display: block; + margin-top: -13px; + color: #fff; + text-shadow: -1px -1px 2px #ccc; +} + +/* line 66, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li, ul.list-tip li { + margin: 0; + line-height: 100%; + list-style: none; + border-bottom: 1px solid #eee; + font-weight: bold; +} + +/* line 73, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li a, ol.list-tip li .other, ul.list-tip li a, ul.list-tip li .other { + color: #333; + padding: 8px 10px; + display: block; +} + +/* line 78, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li span.color-block, ul.list-tip li span.color-block { + display: inline-block; + width: 8px; + height: 10px; + margin-right: 5px; +} + +/* line 84, ../../../hub/static/css/mod/repository-lang-stats.scss */ +ol.list-tip li span.percent, ul.list-tip li span.percent { + float: right; + color: #999; +} diff --git a/dist/css/mod/reset.css b/dist/css/mod/reset.css new file mode 100644 index 0000000..fbeaeb3 --- /dev/null +++ b/dist/css/mod/reset.css @@ -0,0 +1,35 @@ +/* line 1, ../../../hub/static/css/mod/reset.scss */ +ul, ol { + list-style-type: none; + display: block; + margin: 0; +} + +/* line 7, ../../../hub/static/css/mod/reset.scss */ +.clear { + clear: both; +} + +/* line 9, ../../../hub/static/css/mod/reset.scss */ +.clearfix { + display: block; +} +/* line 11, ../../../hub/static/css/mod/reset.scss */ +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +/* hacks for adopting new version of bootstrap */ +/* line 21, ../../../hub/static/css/mod/reset.scss */ +h3 { + line-height: 27px; +} + +/* line 25, ../../../hub/static/css/mod/reset.scss */ +input[type="checkbox"] { + margin: 0; +} diff --git a/dist/css/mod/rightside.css b/dist/css/mod/rightside.css new file mode 100644 index 0000000..6d3529a --- /dev/null +++ b/dist/css/mod/rightside.css @@ -0,0 +1,83 @@ +/* Timeline */ +@media (max-width: 767px) { + /* line 4, ../../../hub/static/css/mod/rightside.scss */ + .rightside { + padding: 10px; + } +} +/* line 7, ../../../hub/static/css/mod/rightside.scss */ +.rightside { + margin-top: 0px; + word-wrap: break-word; + word-break: normal; + margin-bottom: 20px; +} +/* line 12, ../../../hub/static/css/mod/rightside.scss */ +.rightside li { + position: relative; + list-style: none; + clear: both; + background: white; + padding: 1px 15px 10px 10px; + margin: 0 0 0px; + border-bottom: 1px solid #eaeaea; +} +/* line 21, ../../../hub/static/css/mod/rightside.scss */ +.rightside li .title { + margin-bottom: 0.5em; +} +/* line 23, ../../../hub/static/css/mod/rightside.scss */ +.rightside li .title i { + position: absolute; + left: 5px; + padding: 2px 5px 0; + color: #999; + font-size: 10px; +} +/* line 33, ../../../hub/static/css/mod/rightside.scss */ +.rightside .time { + float: right; + color: #ccc; + font-size: 12px; +} + +/* line 40, ../../../hub/static/css/mod/rightside.scss */ +.rightside .padding { + height: 2em; + font-weight: bold; +} + +/* line 45, ../../../hub/static/css/mod/rightside.scss */ +.rightside .more_items { + margin-left: 10px; + font-weight: bold; +} + +/* line 50, ../../../hub/static/css/mod/rightside.scss */ +.rightside .time { + color: #bbb; +} + +/* line 52, ../../../hub/static/css/mod/rightside.scss */ +.rightside .desc { + padding: 0 0 1em 0; + color: #666; + word-wrap: break-word; +} + +/* line 58, ../../../hub/static/css/mod/rightside.scss */ +.rightside .desc .right_side { + float: right; + margin-right: 30px; +} + +/* line 63, ../../../hub/static/css/mod/rightside.scss */ +div.right-tittle { + color: gray; + background: rgba(99, 182, 174, 0.2); + text-align: center; + padding-top: 6px; + padding-bottom: 6px; + font-size: 14px; + font-weight: bold; +} diff --git a/dist/css/mod/setting-box.css b/dist/css/mod/setting-box.css new file mode 100644 index 0000000..7aa9b3c --- /dev/null +++ b/dist/css/mod/setting-box.css @@ -0,0 +1,64 @@ +/* line 1, ../../../hub/static/css/mod/setting-box.scss */ +.boxed-group { + position: relative; + background: #EFEFEF; + padding: 3px; + border-radius: 3px; + margin: 0 0 15px 0; +} + +/* line 8, ../../../hub/static/css/mod/setting-box.scss */ +.boxed-group > h3 { + background: #FAFAFA; + background: -moz-linear-gradient(#FAFAFA, #E0E0E0); + background: -webkit-linear-gradient(#FAFAFA, #E0E0E0); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#e0e0e0')"; + margin: 0; + border-top-left-radius: 1px; + border-top-right-radius: 1px; + border: 1px solid #D8D8D8; + border-bottom: 1px solid #CCC; + padding: 10px 10px 11px 10px; + font-size: 14px; + text-shadow: 0 1px 0 white; +} + +/* line 22, ../../../hub/static/css/mod/setting-box.scss */ +.boxed-group .boxed-group-inner { + padding: 1px 10px; + background: white; + border: 1px solid #D8D8D8; + border-top: none; + border-bottom-left-radius: 1px; + border-bottom-right-radius: 1px; + color: #666; + font-size: 13px; +} + +/* line 32, ../../../hub/static/css/mod/setting-box.scss */ +.boxed-group.condensed > h3 { + padding: 6px 6px 7px; + font-size: 12px; +} + +/* line 36, ../../../hub/static/css/mod/setting-box.scss */ +.boxed-group.condensed > h3 i { + position: relative; + padding: 0 6px 0 2px; +} + +/* line 40, ../../../hub/static/css/mod/setting-box.scss */ +.boxed-group.condensed .boxed-group-inner { + font-size: 12px; + padding: 0; +} + +/* line 45, ../../../hub/static/css/mod/setting-box.scss */ +.boxed-group-list > li { + display: block; + margin-left: -10px; + width: 100%; + padding: 5px 10px; + line-height: 23px; + border-bottom: 1px solid #E5E5E5; +} diff --git a/dist/css/mod/side-item.css b/dist/css/mod/side-item.css new file mode 100644 index 0000000..a267542 --- /dev/null +++ b/dist/css/mod/side-item.css @@ -0,0 +1,124 @@ +/* Item Listing */ +/* line 2, ../../../hub/static/css/mod/side-item.scss */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} + +/* line 7, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +/* line 23, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa, #eaeaea); + background: -ms-linear-gradient(#fafafa, #eaeaea); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fafafa), color-stop(100%, #eaeaea)); + background: -webkit-linear-gradient(#fafafa, #eaeaea); + background: -o-linear-gradient(#fafafa, #eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa, #eaeaea); +} + +/* line 41, ../../../hub/static/css/mod/side-item.scss */ +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +/* line 47, ../../../hub/static/css/mod/side-item.scss */ +.items h2 em { + color: #99A4AA; + font-style: normal; +} + +/* line 51, ../../../hub/static/css/mod/side-item.scss */ +.items input { + margin-bottom: 0; +} + +/* line 54, ../../../hub/static/css/mod/side-item.scss */ +.items ul.item_list { + margin: 0; +} + +/* line 57, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +/* line 64, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.action { + float: right; +} + +/* line 67, ../../../hub/static/css/mod/side-item.scss */ +.items .item_list li a.item { + font-weight: bold; +} + +/* line 70, ../../../hub/static/css/mod/side-item.scss */ +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +/* line 78, ../../../hub/static/css/mod/side-item.scss */ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +/* line 83, ../../../hub/static/css/mod/side-item.scss */ +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +/* line 90, ../../../hub/static/css/mod/side-item.scss */ +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +/* line 96, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li { + line-height: 27px; +} + +/* line 100, ../../../hub/static/css/mod/side-item.scss */ +.nav-list li a.item { + display: inline; +} diff --git a/dist/css/mod/source-code-pro.css b/dist/css/mod/source-code-pro.css new file mode 100644 index 0000000..0a30686 --- /dev/null +++ b/dist/css/mod/source-code-pro.css @@ -0,0 +1,24 @@ +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 400; + src: local("Source Code Pro"), local("SourceCodePro-Regular"), url("/static/css/fonts/SourceCodePro-Regular.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 500; + src: local("Source Code Pro Medium"), local("SourceCodePro-Medium"), url("/static/css/fonts/SourceCodePro-Medium.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 600; + src: local("Source Code Pro Semibold"), local("SourceCodePro-Semibold"), url("/static/css/fonts/SourceCodePro-Semibold.woff") format("woff"); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 700; + src: local("Source Code Pro Bold"), local("SourceCodePro-Bold"), url("/static/css/fonts/SourceCodePro-Bold.woff") format("woff"); +} diff --git a/dist/css/mod/source-edit.css b/dist/css/mod/source-edit.css new file mode 100644 index 0000000..f044134 --- /dev/null +++ b/dist/css/mod/source-edit.css @@ -0,0 +1,35 @@ +/* line 1, ../../../hub/static/css/mod/source-edit.scss */ +.raw { + overflow: visible; +} + +/* line 2, ../../../hub/static/css/mod/source-edit.scss */ +div.helpop { + float: right; + width: 137px; + height: 140px; + margin-top: -140px; + margin-right: 20px; + overflow: hidden; + position: relative; +} + +/* line 9, ../../../hub/static/css/mod/source-edit.scss */ +div.helpop .popic { + display: block; + position: absolute; + bottom: -115px; + -webkit-transition: all 300ms ease-out; + -moz-transition: all 300ms ease-out; + -o-transition: all 300ms ease-out; + -ms-transition: all 300ms ease-out; +} + +/* line 19, ../../../hub/static/css/mod/source-edit.scss */ +div.helpop:hover .popic { + bottom: -10px; + -webkit-transition: all 300ms ease-out; + -moz-transition: all 300ms ease-out; + -o-transition: all 300ms ease-out; + -ms-transition: all 300ms ease-out; +} diff --git a/dist/css/mod/source.css b/dist/css/mod/source.css new file mode 100644 index 0000000..4d5c64b --- /dev/null +++ b/dist/css/mod/source.css @@ -0,0 +1,187 @@ +@font-face { + font-family: 'Octicons Regular'; + src: url("/static/octicons/octicons-regular-webfont.svg") format("svg"), url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +/* line 8, ../../../hub/static/css/mod/source.scss */ +.last-bar { + margin-top: 5px; +} + +/* line 11, ../../../hub/static/css/mod/source.scss */ +p.last-commit { + margin: 10px 0 -5px 0; + font-size: 11px; + color: #888; +} +/* line 16, ../../../hub/static/css/mod/source.scss */ +p.last-commit .mini-icon { + color: #BBB; + position: relative; + top: 1px; +} + +/* line 22, ../../../hub/static/css/mod/source.scss */ +.pr-latest-branch { + color: #888; + margin-top: 10px; + line-height: 27px; + border-bottom: 1px solid #DDD; + padding-bottom: 10px; +} + +/* line 29, ../../../hub/static/css/mod/source.scss */ +.pr-latest-branch #pullrequest-btn { + margin-right: 5px; +} + +/* line 32, ../../../hub/static/css/mod/source.scss */ +.mini-icon, .mega-icon { + line-height: 1; + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + line-height: 1; + -webkit-font-smoothing: antialiased; + text-decoration: none; +} + +/* line 43, ../../../hub/static/css/mod/source.scss */ +.commit-tease { + margin: 10px 0; + padding: 8px 8px 0; + background: #EEE; + border: 1px solid #C5D5DD; + border-radius: 4px; +} + +/* line 50, ../../../hub/static/css/mod/source.scss */ +.commit-tease p.commit-title { + margin: 0 0 6px 0; +} + +/* line 53, ../../../hub/static/css/mod/source.scss */ +.commit .commit-title, .commit .commit-title a { + color: #4E575B; +} + +/* line 56, ../../../hub/static/css/mod/source.scss */ +.commit-tease .commit-meta { + margin-left: -8px; + width: 100%; + padding: 8px; + background: white; + border-top: 1px solid #D8E6EC; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +/* line 65, ../../../hub/static/css/mod/source.scss */ +.commit-tease .sha-block { + float: right; + color: #888; +} + +/* line 69, ../../../hub/static/css/mod/source.scss */ +.commit .sha-block, .commit .sha { + font-size: 11px; + font-family: Monaco,"Courier New","DejaVu Sans Mono","Bitstream Vera Sans Mono",monospace; +} + +/* line 73, ../../../hub/static/css/mod/source.scss */ +.commit-tease .authorship { + font-size: 12px; + color: #999; + margin-left: -4px; + margin-bottom: -4px; + margin-top: -2px; +} +/* line 79, ../../../hub/static/css/mod/source.scss */ +.commit-tease .authorship .gravatar { + margin-top: -2px; + margin-right: 3px; + vertical-align: middle; + border-radius: 3px; +} +/* line 85, ../../../hub/static/css/mod/source.scss */ +.commit-tease .authorship a, .commit-tease .authorship span { + color: #444; + text-decoration: none; + font-weight: bold; +} +/* line 89, ../../../hub/static/css/mod/source.scss */ +.commit-tease .authorship a:hover, .commit-tease .authorship span:hover { + text-decoration: underline; +} + +/* line 95, ../../../hub/static/css/mod/source.scss */ +.commit-tease .mini-icon-clippy { + margin-right: 5px; + float: right; +} + +/* line 99, ../../../hub/static/css/mod/source.scss */ +.mini-icon-clippy { + display: inline-block; + height: 16px; + width: 16px; + background-color: transparent; + background-position: 0 0; + background-repeat: no-repeat; + vertical-align: text-bottom; + background-image: url("/static/img/clippy.png"); +} + +/* line 109, ../../../hub/static/css/mod/source.scss */ +.mini-icon-u-list:before { + content: "\f061"; +} + +/* line 110, ../../../hub/static/css/mod/source.scss */ +.mini-icon-text-file:before { + content: "\f211"; +} + +/* line 111, ../../../hub/static/css/mod/source.scss */ +.mini-icon-code-file:before { + content: "\f210"; +} + +/* line 112, ../../../hub/static/css/mod/source.scss */ +.mini-icon-directory:before { + content: "\f016"; +} + +/* line 113, ../../../hub/static/css/mod/source.scss */ +.mini-icon-submodule:before { + content: "\f017"; +} + +/* line 115, ../../../hub/static/css/mod/source.scss */ +ul.browsefiles li { + padding: 3px 0 2px 0; + border-top: 1px solid #eee; +} + +/* line 116, ../../../hub/static/css/mod/source.scss */ +ul.browsefiles a.mode-040000 { + color: #333; +} + +/* line 117, ../../../hub/static/css/mod/source.scss */ +ul.browsefiles li a { + display: block; +} + +/* line 118, ../../../hub/static/css/mod/source.scss */ +ul.browsefiles li:hover { + background: #eee; +} + +/* line 119, ../../../hub/static/css/mod/source.scss */ +ul.browsefiles li a.warn-bad { + color: red; +} diff --git a/dist/css/mod/subnav.css b/dist/css/mod/subnav.css new file mode 100644 index 0000000..c0d0970 --- /dev/null +++ b/dist/css/mod/subnav.css @@ -0,0 +1,125 @@ +/* Subnav */ +/* line 2, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li { + list-style-display: none; + float: none; + width: 1%; + display: table-cell; + text-align: center; +} + +/* line 3, ../../../hub/static/css/mod/subnav.scss */ +.nav-pills li a .counter { + position: relative; + top: -1px; + display: inline-block; + height: 14px; + margin: 0 0 0 5px; + padding: 0 8px 0px 8px; + height: auto; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 10px; + line-height: 12px; + text-align: center; + color: #777; + background: white; + border-top: 1px solid #CCC; + border-radius: 8px; +} + +/* line 5, ../../../hub/static/css/mod/subnav.scss */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; + /* Old browsers */ + background-repeat: repeat-x; + /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); + /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); + /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); + /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +/* line 22, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} + +/* line 26, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} + +/* line 43, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} + +/* line 46, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} + +/* line 49, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.05); +} + +/* line 60, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} + +/* line 64, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +/* line 72, ../../../hub/static/css/mod/subnav.scss */ +.subnav .nav > li:last-child > a { + border-right: 0; +} diff --git a/dist/css/mod/tag-list.css b/dist/css/mod/tag-list.css new file mode 100644 index 0000000..aef3154 --- /dev/null +++ b/dist/css/mod/tag-list.css @@ -0,0 +1,168 @@ +/* line 1, ../../../hub/static/css/mod/tag-list.scss */ +.issue-tags ul li .tag-filter, .issue-tags ul li .tag-remove, .issue-tags ul li .icon-remove, .issue-tags ul li .icon-white, .issue-tags ul .tag-filter, .issue-tags ul .tag-remove, .issue-tags ul .icon-remove, .issue-tags ul .icon-white { + background: #63b6ae; + background-image: none; + cursor: pointer; +} + +/* line 6, ../../../hub/static/css/mod/tag-list.scss */ +.issue-tags ul li a:hover, .issue-tags ul a:hover { + background: #63b6ae; + color: white; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + border-radius: 4px; +} + +/* line 12, ../../../hub/static/css/mod/tag-list.scss */ +.issue-tags { + padding: 8px 0; +} +/* line 15, ../../../hub/static/css/mod/tag-list.scss */ +.issue-tags ul li { + line-height: 20px; +} +/* line 23, ../../../hub/static/css/mod/tag-list.scss */ +.issue-tags ul li .tag-remove, .issue-tags ul li .icon-remove, .issue-tags ul li .icon-white { + float: right; +} +/* line 31, ../../../hub/static/css/mod/tag-list.scss */ +.issue-tags ul .tag-remove, .issue-tags ul .icon-remove, .issue-tags ul .icon-white { + float: right; +} +/* line 40, ../../../hub/static/css/mod/tag-list.scss */ +.issue-tags ul li.active a { + border-radius: 4px; +} +/* line 44, ../../../hub/static/css/mod/tag-list.scss */ +.issue-tags .nav-header { + margin-bottom: 8px; +} +/* line 47, ../../../hub/static/css/mod/tag-list.scss */ +.issue-tags .tag-admin { + float: right; + cursor: pointer; + font-weight: 400; +} +/* line 52, ../../../hub/static/css/mod/tag-list.scss */ +.issue-tags .tag-admin-unuse { + color: #63b6ae; +} +/* line 55, ../../../hub/static/css/mod/tag-list.scss */ +.issue-tags .tag-admin-using { + color: #999; +} +/* line 58, ../../../hub/static/css/mod/tag-list.scss */ +.issue-tags .nav-list-edit .tag-item { + display: block; + padding: 3px 1px; + color: #08c; +} + +/* edit tag */ +/* line 66, ../../../hub/static/css/mod/tag-list.scss */ +ul.color-chooser .color-cooser-color { + display: block; + text-align: center; + height: 25px; + cursor: pointer; + box-sizing: border-box; + border: solid 2px transparent; +} + +/* line 74, ../../../hub/static/css/mod/tag-list.scss */ +.edit-color-label-form.open .color-chooser, .edit-color-label-form.open .color-editor { + display: block; +} + +/* line 77, ../../../hub/static/css/mod/tag-list.scss */ +ul.color-chooser { + height: 25px; + list-style-type: none; + display: table-row; +} + +/* line 82, ../../../hub/static/css/mod/tag-list.scss */ +ul.color-chooser li { + display: table-cell; + width: 1%; + vertical-align: top; +} + +/* line 87, ../../../hub/static/css/mod/tag-list.scss */ +.fieldWithErrors { + display: inline; +} + +/* line 90, ../../../hub/static/css/mod/tag-list.scss */ +.edit-color-label-form .color-editor-bg { + position: absolute; + left: 0; + height: 25px; + width: 130px; + opacity: 0.12; + border-radius: 3px; +} + +/* line 98, ../../../hub/static/css/mod/tag-list.scss */ +.edit-color-label-form .color-editor .color-editor-input { + position: absolute; + left: 0; + background-color: transparent; + min-height: 25px; + border-left-width: 26px; + padding-top: 3px; + padding-bottom: 3px; + width: 130px; +} + +/* line 108, ../../../hub/static/css/mod/tag-list.scss */ +.edit-color-label-form .color-editor .invalid-color-indicator { + display: none; + position: absolute; + top: 5px; + left: 9px; + color: #c00; + z-index: 10; + font-weight: bold; +} + +/* line 117, ../../../hub/static/css/mod/tag-list.scss */ +.edit-color-label-form .color-editor { + margin-top: 5px; + position: relative; + height: 25px; + margin-bottom: 10px; +} + +/* line 123, ../../../hub/static/css/mod/tag-list.scss */ +.edit-color-label-form .color-editor .invalid-color-indicator { + display: none; + position: absolute; + top: 5px; + left: 9px; + color: #c00; + z-index: 10; + font-weight: bold; +} + +/* line 132, ../../../hub/static/css/mod/tag-list.scss */ +.edit-color-label-form input[type="text"] { + min-height: 34px; + padding: 7px 8px; + outline: none; + color: #333; + background-color: #fff; + background-repeat: no-repeat; + background-position: right center; + border: 1px solid #ccc; + border-radius: 3px; + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075); + -moz-box-sizing: border-box; + box-sizing: border-box; + vertical-align: middle; +} + +/* line 147, ../../../hub/static/css/mod/tag-list.scss */ +.edit-color-label-form.is-not-valid .color-editor .invalid-color-indicator { + display: block; +} diff --git a/dist/css/mod/team-card.css b/dist/css/mod/team-card.css new file mode 100644 index 0000000..a53b058 --- /dev/null +++ b/dist/css/mod/team-card.css @@ -0,0 +1,98 @@ +/* line 1, ../../../hub/static/css/mod/team-card.scss */ +.team-card { + position: absolute; + padding: 6px 10px; + min-height: 68px; + width: 236px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + overflow: hidden; +} +/* line 10, ../../../hub/static/css/mod/team-card.scss */ +.team-card .pic { + float: right; + max-height: 50px; + margin: 6px 0 0 10px; +} +/* line 15, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content { + word-wrap: break-word; +} +/* line 17, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .title { + margin: 6px 0; + font-size: 15px; + overflow: hidden; + white-space: nowrap; +} +/* line 23, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .info { + position: relative; + margin-top: 10px; + font-size: 13px; +} +/* line 27, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .info .desc { + white-space: nowrap; + overflow: hidden; +} + +/* line 35, ../../../hub/static/css/mod/team-card.scss */ +.member { + border-top: solid 1px #eaeaea; + padding-top: 8px; + height: 26px; +} +/* line 39, ../../../hub/static/css/mod/team-card.scss */ +.member .more-members { + float: right; + width: 24px; + height: 24px; + line-height: 26px; + text-align: center; + border: 1px solid #eaeaea; + background: #eaeaea; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 53, ../../../hub/static/css/mod/team-card.scss */ +.member .members li { + float: left; +} +/* line 55, ../../../hub/static/css/mod/team-card.scss */ +.member .members li a { + display: block; + width: 26px; + height: 26px; + overflow: hidden; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 65, ../../../hub/static/css/mod/team-card.scss */ +.member .members li a img { + width: 26px; + height: 26px; +} + +/* line 73, ../../../hub/static/css/mod/team-card.scss */ +.cf { + zoom: 1; +} +/* line 75, ../../../hub/static/css/mod/team-card.scss */ +.cf:before { + content: ""; + display: table; +} +/* line 79, ../../../hub/static/css/mod/team-card.scss */ +.cf .cf:after { + clear: both; + content: ""; + display: table; +} diff --git a/dist/css/mod/team-header.css b/dist/css/mod/team-header.css new file mode 100644 index 0000000..4574625 --- /dev/null +++ b/dist/css/mod/team-header.css @@ -0,0 +1,29 @@ +/* line 2, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-left { + margin: 0; + font-size: 30px; + line-height: 36px; + float: left; +} +/* line 8, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-desc { + margin-top: 12px; + margin-left: 5px; + margin-bottom: 0; + width: 60%; + float: left; +} +/* line 9, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-desc p { + margin: 0; +} +/* line 10, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-desc p small { + padding: 0 6px; + background: rgba(99, 182, 174, 0.2); + color: #63b6ae; +} +/* line 23, ../../../hub/static/css/mod/team-header.scss */ +.pagehead .team-right { + float: right; +} diff --git a/dist/css/mod/team-item.css b/dist/css/mod/team-item.css new file mode 100644 index 0000000..35b2e12 --- /dev/null +++ b/dist/css/mod/team-item.css @@ -0,0 +1,84 @@ +/* line 1, ../../../hub/static/css/mod/team-item.scss */ +.bs-docs-team:after { + content: "Team"; +} + +/* line 4, ../../../hub/static/css/mod/team-item.scss */ +.team-item { + position: relative; + margin: 15px 0; + padding: 14px 19px 14px 49px; + *padding-top: 14px; + background-color: transparent; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +/* line 14, ../../../hub/static/css/mod/team-item.scss */ +.team-item:after { + position: absolute; + top: -1px; + left: -1px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + background-color: #f5f5f5; + border: 1px solid #ddd; + color: #9da0a4; + -webkit-border-radius: 4px 0 4px 0; + -moz-border-radius: 4px 0 4px 0; + border-radius: 4px 0 4px 0; +} +/* line 28, ../../../hub/static/css/mod/team-item.scss */ +.team-item h4.team-title { + margin: 0; +} +/* line 30, ../../../hub/static/css/mod/team-item.scss */ +.team-item h4.team-title i { + margin-top: 5px; +} +/* line 34, ../../../hub/static/css/mod/team-item.scss */ +.team-item ul.team-stats li { + float: left; + margin-left: 10px; +} +/* line 38, ../../../hub/static/css/mod/team-item.scss */ +.team-item .team-item .summary { + margin-top: 10px; +} + +/* line 43, ../../../hub/static/css/mod/team-item.scss */ +.team-user-list { + height: 26px; + margin-bottom: 1px; + list-style: none; + display: block; +} +/* line 48, ../../../hub/static/css/mod/team-item.scss */ +.team-user-list ul { + float: right; + margin-right: 10px; + margin-top: 0px; +} +/* line 53, ../../../hub/static/css/mod/team-item.scss */ +.team-user-list li { + float: left; + margin-left: 10px; + line-height: 20px; +} +/* line 57, ../../../hub/static/css/mod/team-item.scss */ +.team-user-list li a { + display: block; + width: 26px; + height: 26px; + overflow: hidden; + -webkit-border-radius: 4px; + border-radius: 4px; + text-decoration: none; +} +/* line 65, ../../../hub/static/css/mod/team-item.scss */ +.team-user-list li a img { + width: 26px; + height: 26px; +} diff --git a/dist/css/mod/text-truncate.css b/dist/css/mod/text-truncate.css new file mode 100644 index 0000000..9317d53 --- /dev/null +++ b/dist/css/mod/text-truncate.css @@ -0,0 +1,14 @@ +/* line 8, ../../../hub/static/css/mod/text-truncate.scss */ +.css-truncate.css-truncate-target, .css-truncate .css-truncate-target { + max-width: 125px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + vertical-align: top; + display: inline-block; +} + +/* line 14, ../../../hub/static/css/mod/text-truncate.scss */ +.css-truncate.expandable:hover .css-truncate-target { + max-width: 10000px !important; +} diff --git a/dist/css/mod/timeline.css b/dist/css/mod/timeline.css new file mode 100644 index 0000000..8d44b12 --- /dev/null +++ b/dist/css/mod/timeline.css @@ -0,0 +1,291 @@ +/* line 1, ../../../hub/static/css/mod/user-card.scss */ +.user-card { + position: absolute; + padding: 3px 5px 5px; + min-height: 68px; + width: 210px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +/* line 2, ../../../hub/static/css/mod/user-card.scss */ +.user-card .desc { + margin-left: 3px; +} + +/* line 3, ../../../hub/static/css/mod/user-card.scss */ +.user-card .avatar-wrap { + width: 46px; + height: 36px; + float: left; + margin-right: 6px; + border-right: 1px solid #BEBEBE; +} + +/* line 4, ../../../hub/static/css/mod/user-card.scss */ +.user-card .badge-item { + float: left; + width: 30px; + height: 30px; + border: none; + padding: 2px; + background-color: white; + line-height: 0; + margin-right: 0.7em; +} + +/* line 5, ../../../hub/static/css/mod/user-card.scss */ +.user-card .title { + padding: 0 0 0.25em 0; +} + +/* line 6, ../../../hub/static/css/mod/user-card.scss */ +.user-card .desc .avatar { + float: left; + width: 30px; + height: 30px; + padding: 2px; + background-color: white; + line-height: 0; + margin-right: 0.7em; +} + +/* line 1, ../../../hub/static/css/mod/team-card.scss */ +.team-card { + position: absolute; + padding: 6px 10px; + min-height: 68px; + width: 236px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + overflow: hidden; +} +/* line 10, ../../../hub/static/css/mod/team-card.scss */ +.team-card .pic { + float: right; + max-height: 50px; + margin: 6px 0 0 10px; +} +/* line 15, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content { + word-wrap: break-word; +} +/* line 17, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .title { + margin: 6px 0; + font-size: 15px; + overflow: hidden; + white-space: nowrap; +} +/* line 23, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .info { + position: relative; + margin-top: 10px; + font-size: 13px; +} +/* line 27, ../../../hub/static/css/mod/team-card.scss */ +.team-card .content .info .desc { + white-space: nowrap; + overflow: hidden; +} + +/* line 35, ../../../hub/static/css/mod/team-card.scss */ +.member { + border-top: solid 1px #eaeaea; + padding-top: 8px; + height: 26px; +} +/* line 39, ../../../hub/static/css/mod/team-card.scss */ +.member .more-members { + float: right; + width: 24px; + height: 24px; + line-height: 26px; + text-align: center; + border: 1px solid #eaeaea; + background: #eaeaea; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 53, ../../../hub/static/css/mod/team-card.scss */ +.member .members li { + float: left; +} +/* line 55, ../../../hub/static/css/mod/team-card.scss */ +.member .members li a { + display: block; + width: 26px; + height: 26px; + overflow: hidden; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} +/* line 65, ../../../hub/static/css/mod/team-card.scss */ +.member .members li a img { + width: 26px; + height: 26px; +} + +/* line 73, ../../../hub/static/css/mod/team-card.scss */ +.cf { + zoom: 1; +} +/* line 75, ../../../hub/static/css/mod/team-card.scss */ +.cf:before { + content: ""; + display: table; +} +/* line 79, ../../../hub/static/css/mod/team-card.scss */ +.cf .cf:after { + clear: both; + content: ""; + display: table; +} + +/* Timeline */ +@media (max-width: 767px) { + /* line 6, ../../../hub/static/css/mod/timeline.scss */ + .timeline { + padding: 10px; + } +} +/* line 9, ../../../hub/static/css/mod/timeline.scss */ +.timeline { + margin-top: 0px; + word-wrap: break-word; + word-break: normal; +} +/* line 14, ../../../hub/static/css/mod/timeline.scss */ +.timeline li { + position: relative; + list-style: none; + clear: both; + background: white; + padding: 10px 20px 10px 32px; + margin: 0 0 0px; + border-bottom: 1px solid #eaeaea; +} +/* line 23, ../../../hub/static/css/mod/timeline.scss */ +.timeline li .title { + margin-bottom: 0.5em; +} +/* line 25, ../../../hub/static/css/mod/timeline.scss */ +.timeline li .title i { + position: absolute; + left: 5px; + padding: 2px 5px 0; + color: #999; + font-size: 10px; +} +/* line 35, ../../../hub/static/css/mod/timeline.scss */ +.timeline .time { + float: right; + color: #ccc; + font-size: 12px; +} +/* line 41, ../../../hub/static/css/mod/timeline.scss */ +.timeline code { + white-space: normal; +} + +/* line 46, ../../../hub/static/css/mod/timeline.scss */ +.timeline .padding { + height: 2em; + font-weight: bold; +} + +/* line 50, ../../../hub/static/css/mod/timeline.scss */ +.timeline .more_items { + margin-left: 10px; + font-weight: bold; +} + +/* line 54, ../../../hub/static/css/mod/timeline.scss */ +.timeline .time { + color: #bbb; +} + +/* line 57, ../../../hub/static/css/mod/timeline.scss */ +.timeline .desc { + padding: 0 0 1em 0; + color: #666; + word-wrap: break-word; +} + +/* line 62, ../../../hub/static/css/mod/timeline.scss */ +.timeline .desc .right_side { + float: right; + margin-right: 30px; +} + +/* line 67, ../../../hub/static/css/mod/timeline.scss */ +.timeline .pagination { + display: none; + background: #63b6ae; +} + +/* line 71, ../../../hub/static/css/mod/timeline.scss */ +.pagination { + display: block; + margin: 7px 0; + overflow: hidden; + border: 1px solid #EAEAEA; + border-bottom-color: #CACACA; + border-top: none; + border-bottom: none; + border-radius: 3px; + background-image: -webkit-linear-gradient(top, white, #EFEFEF); +} + +/* line 82, ../../../hub/static/css/mod/timeline.scss */ +.timeline .pagination a { + color: white; +} + +/* line 85, ../../../hub/static/css/mod/timeline.scss */ +.pagination a { + padding: 8px; + width: 100%; + text-align: center; + line-height: 1.4; +} + +/* line 91, ../../../hub/static/css/mod/timeline.scss */ +.pagination a:last-child, .pagination span:last-child { + border-right: none; + border-bottom-right-radius: 3px; +} + +/* line 95, ../../../hub/static/css/mod/timeline.scss */ +.pagination a:first-child, .pagination span:first-child { + border-left: none; + border-bottom-left-radius: 3px; +} + +/* line 99, ../../../hub/static/css/mod/timeline.scss */ +.pagination a, .pagination span { + float: left; + margin: 0; + color: #777; + font-size: 13px; + text-decoration: none; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #DADADA; +} + +/* line 108, ../../../hub/static/css/mod/timeline.scss */ +.timeline .loader img { + display: block; + width: 16px; + height: 16px; + margin: 0 auto; + position: relative; +} diff --git a/dist/css/mod/upload-widget.css b/dist/css/mod/upload-widget.css new file mode 100644 index 0000000..023521b --- /dev/null +++ b/dist/css/mod/upload-widget.css @@ -0,0 +1,19 @@ +/* line 1, ../../../hub/static/css/mod/upload-widget.scss */ +.upload-widget { + position: relative; + top: -50px; + width: 360px; +} +/* line 7, ../../../hub/static/css/mod/upload-widget.scss */ +.upload-widget input { + position: absolute; + width: 120px; + opacity: 0.0001; + cursor: pointer; + margin: 0; +} +/* line 15, ../../../hub/static/css/mod/upload-widget.scss */ +.upload-widget form { + width: 120px; + float: left; +} diff --git a/dist/css/mod/user-avatar.css b/dist/css/mod/user-avatar.css new file mode 100644 index 0000000..a60dcba --- /dev/null +++ b/dist/css/mod/user-avatar.css @@ -0,0 +1,34 @@ +/* line 1, ../../../hub/static/css/mod/user-avatar.scss */ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +/* line 6, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar { + margin-right: 5px; + vertical-align: middle; +} + +/* line 10, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.tiny { + width: 16px; + height: 16px; +} + +/* line 14, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.small { + width: 20px; + height: 20px; +} + +/* line 18, ../../../hub/static/css/mod/user-avatar.scss */ +img.avatar.medium { + width: 40px; + height: 40px; +} + +/* line 23, ../../../hub/static/css/mod/user-avatar.scss */ +.avatar img { + border-radius: 3px; +} diff --git a/dist/css/mod/user-card.css b/dist/css/mod/user-card.css new file mode 100644 index 0000000..10ed544 --- /dev/null +++ b/dist/css/mod/user-card.css @@ -0,0 +1,52 @@ +/* line 1, ../../../hub/static/css/mod/user-card.scss */ +.user-card { + position: absolute; + padding: 3px 5px 5px; + min-height: 68px; + width: 210px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +/* line 2, ../../../hub/static/css/mod/user-card.scss */ +.user-card .desc { + margin-left: 3px; +} + +/* line 3, ../../../hub/static/css/mod/user-card.scss */ +.user-card .avatar-wrap { + width: 46px; + height: 36px; + float: left; + margin-right: 6px; + border-right: 1px solid #BEBEBE; +} + +/* line 4, ../../../hub/static/css/mod/user-card.scss */ +.user-card .badge-item { + float: left; + width: 30px; + height: 30px; + border: none; + padding: 2px; + background-color: white; + line-height: 0; + margin-right: 0.7em; +} + +/* line 5, ../../../hub/static/css/mod/user-card.scss */ +.user-card .title { + padding: 0 0 0.25em 0; +} + +/* line 6, ../../../hub/static/css/mod/user-card.scss */ +.user-card .desc .avatar { + float: left; + width: 30px; + height: 30px; + padding: 2px; + background-color: white; + line-height: 0; + margin-right: 0.7em; +} diff --git a/dist/css/mod/user-list.css b/dist/css/mod/user-list.css new file mode 100644 index 0000000..5754b89 --- /dev/null +++ b/dist/css/mod/user-list.css @@ -0,0 +1,45 @@ +/* line 1, ../../../hub/static/css/mod/user-list.scss */ +.user-list { + border-top: 1px solid rgba(0, 0, 0, 0.05); + list-style: none; +} + +/* line 2, ../../../hub/static/css/mod/user-list.scss */ +.user-list li { + border-bottom: 1px solid rgba(0, 0, 0, 0.05); + line-height: 26px; + padding: 6px 0 6px 30px; + position: relative; +} + +/* line 3, ../../../hub/static/css/mod/user-list.scss */ +.user-list li a { + font-weight: bold; + color: #4183C4; +} + +/* line 4, ../../../hub/static/css/mod/user-list.scss */ +.user-list li img { + border-radius: 3px; + margin-top: 1px; + position: absolute; + left: 0; + border: 0; +} + +/* line 5, ../../../hub/static/css/mod/user-list.scss */ +.user-list li .actions { + position: absolute; + top: 6px; + right: 0; +} + +/* line 6, ../../../hub/static/css/mod/user-list.scss */ +.user-list li .actions a { + color: #333; +} + +/* line 7, ../../../hub/static/css/mod/user-list.scss */ +.user-list li .actions a:hover { + color: #FFF; +} diff --git a/dist/css/mod/watched-projects.css b/dist/css/mod/watched-projects.css new file mode 100644 index 0000000..23082ae --- /dev/null +++ b/dist/css/mod/watched-projects.css @@ -0,0 +1,22 @@ +/* line 8, ../../../hub/static/css/mod/text-truncate.scss */ +.css-truncate.css-truncate-target, .css-truncate .css-truncate-target { + max-width: 125px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + vertical-align: top; + display: inline-block; +} + +/* line 14, ../../../hub/static/css/mod/text-truncate.scss */ +.css-truncate.expandable:hover .css-truncate-target { + max-width: 10000px !important; +} + +/* line 4, ../../../hub/static/css/mod/watched-projects.scss */ +.watched-projects li { + max-width: 300px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} diff --git a/dist/css/mod/zen-forms.css b/dist/css/mod/zen-forms.css new file mode 100644 index 0000000..1d4d1b7 --- /dev/null +++ b/dist/css/mod/zen-forms.css @@ -0,0 +1,191 @@ +@charset "UTF-8"; +/* ================================== *\ + * Zen Form + * ================================== */ +/* line 6, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + position: fixed; + z-index: 99999; + top: 0; + left: 0; + right: 0; + bottom: 0; + padding: 24px 30px 24px 24px; +} + +/* line 16, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-input-wrap { + max-width: 640px; + position: relative; + margin: 0 auto; +} + +/** + * Buttons style + */ +/* line 25, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button, +.zen-forms-theme-switch { + position: absolute; + width: 18px; + height: 18px; + text-align: center; + top: 10px; + right: 10px; + font-size: 24px; + color: #516066; + cursor: pointer; + line-height: 1; +} + +/* line 39, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-theme-switch { + top: 28px; + font-size: 34px; +} + +/* line 44, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms-close-button:hover, +.zen-forms-theme-switch:hover { + color: #667981; +} + +/** + * Inputs basic style + */ +/* line 52, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + padding: 8px 0; + width: 100%; + background: none; + border: none; + margin-bottom: 24px; + cursor: pointer; +} + +/* line 62, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus, +.zen-forms textarea:focus { + cursor: text; +} + +/* line 67, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms textarea { + resize: none; +} + +/* line 71, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + cursor: pointer; + display: none; + padding: 8px 3; + position: absolute; + top: 0; + width: 100%; +} + +/* line 80, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms .empty + label { + display: block; +} + +/* line 84, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input:focus + label, +.zen-forms textarea:focus + label { + display: none; +} + +/* line 89, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms :focus { + outline-color: transparent; + outline-style: none; +} + +/** + * Dark theme + */ +/* line 97, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms { + background: #151a1c; +} + +/* line 101, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms label { + color: #516066; +} + +/* line 105, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms input, +.zen-forms textarea { + color: #667981; +} + +/** + * Light theme + */ +/* line 113, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme { + background: #fefefe; +} + +/* line 117, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme label { + color: #959697; +} + +/* line 121, ../../../hub/static/css/lib/zen-form.scss */ +.zen-forms.light-theme input, +.zen-forms.light-theme textarea { + color: #707071; +} + +/* line 4, ../../../hub/static/css/mod/zen-forms.scss */ +.write-content .enable-fullscreen { + position: absolute; + top: 5px; + right: 16px; + color: #333333; + opacity: .5; + line-height: 1em; +} + +/* line 5, ../../../hub/static/css/mod/zen-forms.scss */ +.mini-icon-fullscreen::before { + content: ""; +} + +/* line 6, ../../../hub/static/css/mod/zen-forms.scss */ +.fullscreen-overlay textarea, .zen-forms textarea { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + height: 100%; + padding: 20px; + border: 0; + font-size: 21px; + line-height: 1.6em; + resize: none; + -moz-transition: color 0.15s ease-in 0; + -webkit-transition: color 0.15s ease-in 0; + transition: color 0.15s ease-in 0; + box-shadow: none; +} + +/* line 7, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms.light-theme textarea { + background: #fff; + color: #999999; +} + +/* line 8, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms .zen-forms-input-wrap { + width: 100%; + height: 100%; +} + +/* line 9, ../../../hub/static/css/mod/zen-forms.scss */ +.zen-forms label[for^=zen-forms-input] { + display: none; +} diff --git a/dist/js/app/badge/main.js b/dist/js/app/badge/main.js new file mode 100644 index 0000000..736b4ae --- /dev/null +++ b/dist/js/app/badge/main.js @@ -0,0 +1,75 @@ + +require.config({ enable_ozma: true }); + + +/* @source */; + +require(['jquery-tmpl'], function(){ + + var increment = 10; //badge_item per page / Additional badges displayed per click + var index = 0; //Number of times more badge info has been requested + var badge_list; + var item_count; + var last_day = null; + + $(function get_badges() { + $.getJSON("/badge/badges", function(badges) { + badge_list = badges; + get_item_count(); + }); + }); + + var get_item_count = function() { + $.getJSON("/badge/count", {}, function(count) { + item_count = count[0]; + populate_list(); + if (increment < item_count) { + $(".timeline .more").append("See more"); + $("a.more_items").click(populate_list); + } + }); + }; + + var populate_list = function() { + index++; + var data_vars = { + ind: index - 1, + inc: increment + }; + $.getJSON("/badge/items", data_vars, function(items) { + $.each(items, function(i, day) { + var badge_date = new Date(day[0][3]); + var text = ""; + if (last_day == null || last_day.toDateString() != badge_date.toDateString()) { + var date_string = badge_date.getFullYear() + "-" + (badge_date.getMonth()+1) + "-" + badge_date.getDate(); + text += "

" + date_string + "

"; + } + last_day = badge_date; + text += "
"; + $(".timeline>dl").append(text); + var data = []; + $.each(day, function(j, item) { + var id = item[0]; + var item_date = new Date(item[3]); + item_date.setHours(item_date.getHours() + item_date.getTimezoneOffset()/60); + var time_string = item_date.toLocaleTimeString(); + var item_data = { + badge_id: id, + recipient: item[1], + avatar: item[4], + reason: item[2] == null ? "" : item[2], + item_time: time_string.substring(0, time_string.length - 3), + badge_name: badge_list[id-1][1], + summary: badge_list[id-1][2] + }; + data.push(item_data); + }); + $("#timeline_template").tmpl(data).appendTo(".action:last"); + }); + if (index * increment > item_count) { + $(".more_items").remove(); + } + }); + }; + +}); diff --git a/dist/js/app/center/main.js b/dist/js/app/center/main.js new file mode 100644 index 0000000..135dea1 --- /dev/null +++ b/dist/js/app/center/main.js @@ -0,0 +1,1641 @@ + +require.config({ enable_ozma: true }); + + +/* @source lib/zen-form.js */; + +/** Zen Forms 1.0.0 | MIT License | git.io/zen-form */ + +(function($) { + + $.fn.zenForm = function(settings) { + + settings = $.extend({ + trigger: '.go-zen', + theme: 'dark' + }, settings); + + /** + * Helper functions + */ + var Utils = { + + watchEmpty: function($form) { + + $form.find('input, textarea').each(function() { + $(this).on('change', function() { + $(this)[ $(this).val() ? 'removeClass' : 'addClass' ]('empty'); + }).trigger('change'); + }); + + } + + }, // Utils + + /** + * Core functionality + */ + App = { + + /** + * Wrapper element + */ + Environment: null, + + /** + * Functions to create and manipulate environment + */ + env: { + + create: function() { + + var theme = settings.theme == 'dark' ? '' : ' light-theme'; + + return $('
', {class: 'zen-forms' + theme}).hide().appendTo('body').fadeIn(200); + + }, // create + + /** + * Update orginal inputs with new values and destroy Environment + */ + destroy: function($elements) { + + // Update orginal inputs with new values + $elements.each(function(i) { + + var $el = $('#zen-forms-input' + i); + + if ( $el.length ) + $(this).val($el.val()); + + }).filter('input:text,textarea').eq(0).focus(); + + $('.zen-forms').fadeOut(200, function() { + $(this).remove(); + }); + + }, // destroy + + /** + * Append inputs, textareas to Environment + */ + add: function($elements) { + + $elements.each(function(i) { + + var $this = $(this), + $wrapper = App.env.addObject(App.Environment, 'div', {class: 'zen-forms-input-wrap'}), + + value = $this.val(), + id = $this.attr('id'), + ID = 'zen-forms-input' + i, + label = $("label[for=" + id + "]").text() || $this.attr('placeholder') || ''; + + // Exclude specified elements + if ( $.inArray( $this.attr('type'), ['checkbox', 'radio', 'submit']) == -1) { + + if ( $this.is('input') ) + App.env.addObject($wrapper, 'input', { + id: ID, + value: value, + type: $this.attr('type') + }); + else + App.env.addObject($wrapper, 'textarea', { + id: ID, + text: value + }); + + App.env.addObject($wrapper, 'label', { + for: ID, + text: label + }); + + } + + }); + + }, // add + + /** + * Wrapper for creating jQuery objects + */ + addObject: function($wrapper, type, params, fn, fnMethod) { + + return $('<'+type+'>', params).on(fnMethod || 'click', fn).appendTo($wrapper); + + }, // addObject + + switchTheme: function() { + + App.Environment.toggleClass('light-theme'); + + } // switchTheme + + }, // env + + zen: function($elements) { + + // Create environment + App.Environment = App.env.create(); + + // Add close button + App.env.addObject(App.Environment, 'a', { + class: 'zen-forms-close-button', + html: '×' + }, function() { + App.env.destroy($elements); + }); + + // Add theme switch button + App.env.addObject(App.Environment, 'a', { + class: 'zen-forms-theme-switch', + html: '•' + }, function() { + App.env.switchTheme(); + }); + + // Add inputs and textareas from form + App.env.add($elements); + + App.Environment.keydown(function(e) { + // Esc close + if (e.which == 27) { + App.env.destroy($elements); + } + }).find('input:text, textarea').eq(0).focus(); + + // Watch inputs and add "empty" class if needed + Utils.watchEmpty(App.Environment); + + }, // zen + + }; // App + + return this.each(function() { + + var $this = $(this); + + function zen() { + App.zen( $this.is('form') ? $this.find('input, textarea') : $this ); + } + + if (!settings.trigger) return zen(); + + $(settings.trigger).on('click', function(event) { + event.preventDefault(); + zen(); + }); + + }); + + }; + +})(jQuery); + +/* autogeneration */ +define("lib/zen-form", [], function(){}); + +/* @source lib/mousetrap.js */; + +/** + * Copyright 2012 Craig Campbell + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Mousetrap is a simple keyboard shortcut library for Javascript with + * no external dependencies + * + * @version 1.2.2 + * @url craig.is/killing/mice + */ +(function() { + + /** + * mapping of special keycodes to their corresponding keys + * + * everything in this dictionary cannot use keypress events + * so it has to be here to map to the correct keycodes for + * keyup/keydown events + * + * @type {Object} + */ + var _MAP = { + 8: 'backspace', + 9: 'tab', + 13: 'enter', + 16: 'shift', + 17: 'ctrl', + 18: 'alt', + 20: 'capslock', + 27: 'esc', + 32: 'space', + 33: 'pageup', + 34: 'pagedown', + 35: 'end', + 36: 'home', + 37: 'left', + 38: 'up', + 39: 'right', + 40: 'down', + 45: 'ins', + 46: 'del', + 91: 'meta', + 93: 'meta', + 224: 'meta' + }, + + /** + * mapping for special characters so they can support + * + * this dictionary is only used incase you want to bind a + * keyup or keydown event to one of these keys + * + * @type {Object} + */ + _KEYCODE_MAP = { + 106: '*', + 107: '+', + 109: '-', + 110: '.', + 111 : '/', + 186: ';', + 187: '=', + 188: ',', + 189: '-', + 190: '.', + 191: '/', + 192: '`', + 219: '[', + 220: '\\', + 221: ']', + 222: '\'' + }, + + /** + * this is a mapping of keys that require shift on a US keypad + * back to the non shift equivelents + * + * this is so you can use keyup events with these keys + * + * note that this will only work reliably on US keyboards + * + * @type {Object} + */ + _SHIFT_MAP = { + '~': '`', + '!': '1', + '@': '2', + '#': '3', + '$': '4', + '%': '5', + '^': '6', + '&': '7', + '*': '8', + '(': '9', + ')': '0', + '_': '-', + '+': '=', + ':': ';', + '\"': '\'', + '<': ',', + '>': '.', + '?': '/', + '|': '\\' + }, + + /** + * this is a list of special strings you can use to map + * to modifier keys when you specify your keyboard shortcuts + * + * @type {Object} + */ + _SPECIAL_ALIASES = { + 'option': 'alt', + 'command': 'meta', + 'return': 'enter', + 'escape': 'esc' + }, + + /** + * variable to store the flipped version of _MAP from above + * needed to check if we should use keypress or not when no action + * is specified + * + * @type {Object|undefined} + */ + _REVERSE_MAP, + + /** + * a list of all the callbacks setup via Mousetrap.bind() + * + * @type {Object} + */ + _callbacks = {}, + + /** + * direct map of string combinations to callbacks used for trigger() + * + * @type {Object} + */ + _direct_map = {}, + + /** + * keeps track of what level each sequence is at since multiple + * sequences can start out with the same sequence + * + * @type {Object} + */ + _sequence_levels = {}, + + /** + * variable to store the setTimeout call + * + * @type {null|number} + */ + _reset_timer, + + /** + * temporary state where we will ignore the next keyup + * + * @type {boolean|string} + */ + _ignore_next_keyup = false, + + /** + * are we currently inside of a sequence? + * type of action ("keyup" or "keydown" or "keypress") or false + * + * @type {boolean|string} + */ + _sequence_type = false; + + /** + * loop through the f keys, f1 to f19 and add them to the map + * programatically + */ + for (var i = 1; i < 20; ++i) { + _MAP[111 + i] = 'f' + i; + } + + /** + * loop through to map numbers on the numeric keypad + */ + for (i = 0; i <= 9; ++i) { + _MAP[i + 96] = i; + } + + /** + * cross browser add event method + * + * @param {Element|HTMLDocument} object + * @param {string} type + * @param {Function} callback + * @returns void + */ + function _addEvent(object, type, callback) { + if (object.addEventListener) { + object.addEventListener(type, callback, false); + return; + } + + object.attachEvent('on' + type, callback); + } + + /** + * takes the event and returns the key character + * + * @param {Event} e + * @return {string} + */ + function _characterFromEvent(e) { + + // for keypress events we should return the character as is + if (e.type == 'keypress') { + return String.fromCharCode(e.which); + } + + // for non keypress events the special maps are needed + if (_MAP[e.which]) { + return _MAP[e.which]; + } + + if (_KEYCODE_MAP[e.which]) { + return _KEYCODE_MAP[e.which]; + } + + // if it is not in the special map + return String.fromCharCode(e.which).toLowerCase(); + } + + /** + * checks if two arrays are equal + * + * @param {Array} modifiers1 + * @param {Array} modifiers2 + * @returns {boolean} + */ + function _modifiersMatch(modifiers1, modifiers2) { + return modifiers1.sort().join(',') === modifiers2.sort().join(','); + } + + /** + * resets all sequence counters except for the ones passed in + * + * @param {Object} do_not_reset + * @returns void + */ + function _resetSequences(do_not_reset, max_level) { + do_not_reset = do_not_reset || {}; + + var active_sequences = false, + key; + + for (key in _sequence_levels) { + if (do_not_reset[key] && _sequence_levels[key] > max_level) { + active_sequences = true; + continue; + } + _sequence_levels[key] = 0; + } + + if (!active_sequences) { + _sequence_type = false; + } + } + + /** + * finds all callbacks that match based on the keycode, modifiers, + * and action + * + * @param {string} character + * @param {Array} modifiers + * @param {Event|Object} e + * @param {boolean=} remove - should we remove any matches + * @param {string=} combination + * @returns {Array} + */ + function _getMatches(character, modifiers, e, remove, combination) { + var i, + callback, + matches = [], + action = e.type; + + // if there are no events related to this keycode + if (!_callbacks[character]) { + return []; + } + + // if a modifier key is coming up on its own we should allow it + if (action == 'keyup' && _isModifier(character)) { + modifiers = [character]; + } + + // loop through all callbacks for the key that was pressed + // and see if any of them match + for (i = 0; i < _callbacks[character].length; ++i) { + callback = _callbacks[character][i]; + + // if this is a sequence but it is not at the right level + // then move onto the next match + if (callback.seq && _sequence_levels[callback.seq] != callback.level) { + continue; + } + + // if the action we are looking for doesn't match the action we got + // then we should keep going + if (action != callback.action) { + continue; + } + + // if this is a keypress event and the meta key and control key + // are not pressed that means that we need to only look at the + // character, otherwise check the modifiers as well + // + // chrome will not fire a keypress if meta or control is down + // safari will fire a keypress if meta or meta+shift is down + // firefox will fire a keypress if meta or control is down + if ((action == 'keypress' && !e.metaKey && !e.ctrlKey) || _modifiersMatch(modifiers, callback.modifiers)) { + + // remove is used so if you change your mind and call bind a + // second time with a new function the first one is overwritten + if (remove && callback.combo == combination) { + _callbacks[character].splice(i, 1); + } + + matches.push(callback); + } + } + + return matches; + } + + /** + * takes a key event and figures out what the modifiers are + * + * @param {Event} e + * @returns {Array} + */ + function _eventModifiers(e) { + var modifiers = []; + + if (e.shiftKey) { + modifiers.push('shift'); + } + + if (e.altKey) { + modifiers.push('alt'); + } + + if (e.ctrlKey) { + modifiers.push('ctrl'); + } + + if (e.metaKey) { + modifiers.push('meta'); + } + + return modifiers; + } + + /** + * actually calls the callback function + * + * if your callback function returns false this will use the jquery + * convention - prevent default and stop propogation on the event + * + * @param {Function} callback + * @param {Event} e + * @returns void + */ + function _fireCallback(callback, e, combo) { + + // if this event should not happen stop here + if (Mousetrap.stopCallback(e, e.target || e.srcElement, combo)) { + return; + } + + if (callback(e, combo) === false) { + if (e.preventDefault) { + e.preventDefault(); + } + + if (e.stopPropagation) { + e.stopPropagation(); + } + + e.returnValue = false; + e.cancelBubble = true; + } + } + + /** + * handles a character key event + * + * @param {string} character + * @param {Event} e + * @returns void + */ + function _handleCharacter(character, e) { + var callbacks = _getMatches(character, _eventModifiers(e), e), + i, + do_not_reset = {}, + max_level = 0, + processed_sequence_callback = false; + + // loop through matching callbacks for this key event + for (i = 0; i < callbacks.length; ++i) { + + // fire for all sequence callbacks + // this is because if for example you have multiple sequences + // bound such as "g i" and "g t" they both need to fire the + // callback for matching g cause otherwise you can only ever + // match the first one + if (callbacks[i].seq) { + processed_sequence_callback = true; + + // as we loop through keep track of the max + // any sequence at a lower level will be discarded + max_level = Math.max(max_level, callbacks[i].level); + + // keep a list of which sequences were matches for later + do_not_reset[callbacks[i].seq] = 1; + _fireCallback(callbacks[i].callback, e, callbacks[i].combo); + continue; + } + + // if there were no sequence matches but we are still here + // that means this is a regular match so we should fire that + if (!processed_sequence_callback && !_sequence_type) { + _fireCallback(callbacks[i].callback, e, callbacks[i].combo); + } + } + + // if you are inside of a sequence and the key you are pressing + // is not a modifier key then we should reset all sequences + // that were not matched by this key event + if (e.type == _sequence_type && !_isModifier(character)) { + _resetSequences(do_not_reset, max_level); + } + } + + /** + * handles a keydown event + * + * @param {Event} e + * @returns void + */ + function _handleKey(e) { + + // normalize e.which for key events + // @see http://stackoverflow.com/questions/4285627/javascript-keycode-vs-charcode-utter-confusion + if (typeof e.which !== 'number') { + e.which = e.keyCode; + } + + var character = _characterFromEvent(e); + + // no character found then stop + if (!character) { + return; + } + + if (e.type == 'keyup' && _ignore_next_keyup == character) { + _ignore_next_keyup = false; + return; + } + + _handleCharacter(character, e); + } + + /** + * determines if the keycode specified is a modifier key or not + * + * @param {string} key + * @returns {boolean} + */ + function _isModifier(key) { + return key == 'shift' || key == 'ctrl' || key == 'alt' || key == 'meta'; + } + + /** + * called to set a 1 second timeout on the specified sequence + * + * this is so after each key press in the sequence you have 1 second + * to press the next key before you have to start over + * + * @returns void + */ + function _resetSequenceTimer() { + clearTimeout(_reset_timer); + _reset_timer = setTimeout(_resetSequences, 1000); + } + + /** + * reverses the map lookup so that we can look for specific keys + * to see what can and can't use keypress + * + * @return {Object} + */ + function _getReverseMap() { + if (!_REVERSE_MAP) { + _REVERSE_MAP = {}; + for (var key in _MAP) { + + // pull out the numeric keypad from here cause keypress should + // be able to detect the keys from the character + if (key > 95 && key < 112) { + continue; + } + + if (_MAP.hasOwnProperty(key)) { + _REVERSE_MAP[_MAP[key]] = key; + } + } + } + return _REVERSE_MAP; + } + + /** + * picks the best action based on the key combination + * + * @param {string} key - character for key + * @param {Array} modifiers + * @param {string=} action passed in + */ + function _pickBestAction(key, modifiers, action) { + + // if no action was picked in we should try to pick the one + // that we think would work best for this key + if (!action) { + action = _getReverseMap()[key] ? 'keydown' : 'keypress'; + } + + // modifier keys don't work as expected with keypress, + // switch to keydown + if (action == 'keypress' && modifiers.length) { + action = 'keydown'; + } + + return action; + } + + /** + * binds a key sequence to an event + * + * @param {string} combo - combo specified in bind call + * @param {Array} keys + * @param {Function} callback + * @param {string=} action + * @returns void + */ + function _bindSequence(combo, keys, callback, action) { + + // start off by adding a sequence level record for this combination + // and setting the level to 0 + _sequence_levels[combo] = 0; + + // if there is no action pick the best one for the first key + // in the sequence + if (!action) { + action = _pickBestAction(keys[0], []); + } + + /** + * callback to increase the sequence level for this sequence and reset + * all other sequences that were active + * + * @param {Event} e + * @returns void + */ + var _increaseSequence = function(e) { + _sequence_type = action; + ++_sequence_levels[combo]; + _resetSequenceTimer(); + }, + + /** + * wraps the specified callback inside of another function in order + * to reset all sequence counters as soon as this sequence is done + * + * @param {Event} e + * @returns void + */ + _callbackAndReset = function(e) { + _fireCallback(callback, e, combo); + + // we should ignore the next key up if the action is key down + // or keypress. this is so if you finish a sequence and + // release the key the final key will not trigger a keyup + if (action !== 'keyup') { + _ignore_next_keyup = _characterFromEvent(e); + } + + // weird race condition if a sequence ends with the key + // another sequence begins with + setTimeout(_resetSequences, 10); + }, + i; + + // loop through keys one at a time and bind the appropriate callback + // function. for any key leading up to the final one it should + // increase the sequence. after the final, it should reset all sequences + for (i = 0; i < keys.length; ++i) { + _bindSingle(keys[i], i < keys.length - 1 ? _increaseSequence : _callbackAndReset, action, combo, i); + } + } + + /** + * binds a single keyboard combination + * + * @param {string} combination + * @param {Function} callback + * @param {string=} action + * @param {string=} sequence_name - name of sequence if part of sequence + * @param {number=} level - what part of the sequence the command is + * @returns void + */ + function _bindSingle(combination, callback, action, sequence_name, level) { + + // make sure multiple spaces in a row become a single space + combination = combination.replace(/\s+/g, ' '); + + var sequence = combination.split(' '), + i, + key, + keys, + modifiers = []; + + // if this pattern is a sequence of keys then run through this method + // to reprocess each pattern one key at a time + if (sequence.length > 1) { + _bindSequence(combination, sequence, callback, action); + return; + } + + // take the keys from this pattern and figure out what the actual + // pattern is all about + keys = combination === '+' ? ['+'] : combination.split('+'); + + for (i = 0; i < keys.length; ++i) { + key = keys[i]; + + // normalize key names + if (_SPECIAL_ALIASES[key]) { + key = _SPECIAL_ALIASES[key]; + } + + // if this is not a keypress event then we should + // be smart about using shift keys + // this will only work for US keyboards however + if (action && action != 'keypress' && _SHIFT_MAP[key]) { + key = _SHIFT_MAP[key]; + modifiers.push('shift'); + } + + // if this key is a modifier then add it to the list of modifiers + if (_isModifier(key)) { + modifiers.push(key); + } + } + + // depending on what the key combination is + // we will try to pick the best event for it + action = _pickBestAction(key, modifiers, action); + + // make sure to initialize array if this is the first time + // a callback is added for this key + if (!_callbacks[key]) { + _callbacks[key] = []; + } + + // remove an existing match if there is one + _getMatches(key, modifiers, {type: action}, !sequence_name, combination); + + // add this call back to the array + // if it is a sequence put it at the beginning + // if not put it at the end + // + // this is important because the way these are processed expects + // the sequence ones to come first + _callbacks[key][sequence_name ? 'unshift' : 'push']({ + callback: callback, + modifiers: modifiers, + action: action, + seq: sequence_name, + level: level, + combo: combination + }); + } + + /** + * binds multiple combinations to the same callback + * + * @param {Array} combinations + * @param {Function} callback + * @param {string|undefined} action + * @returns void + */ + function _bindMultiple(combinations, callback, action) { + for (var i = 0; i < combinations.length; ++i) { + _bindSingle(combinations[i], callback, action); + } + } + + // start! + _addEvent(document, 'keypress', _handleKey); + _addEvent(document, 'keydown', _handleKey); + _addEvent(document, 'keyup', _handleKey); + + var Mousetrap = { + + /** + * binds an event to mousetrap + * + * can be a single key, a combination of keys separated with +, + * an array of keys, or a sequence of keys separated by spaces + * + * be sure to list the modifier keys first to make sure that the + * correct key ends up getting bound (the last key in the pattern) + * + * @param {string|Array} keys + * @param {Function} callback + * @param {string=} action - 'keypress', 'keydown', or 'keyup' + * @returns void + */ + bind: function(keys, callback, action) { + _bindMultiple(keys instanceof Array ? keys : [keys], callback, action); + _direct_map[keys + ':' + action] = callback; + return this; + }, + + /** + * unbinds an event to mousetrap + * + * the unbinding sets the callback function of the specified key combo + * to an empty function and deletes the corresponding key in the + * _direct_map dict. + * + * the keycombo+action has to be exactly the same as + * it was defined in the bind method + * + * TODO: actually remove this from the _callbacks dictionary instead + * of binding an empty function + * + * @param {string|Array} keys + * @param {string} action + * @returns void + */ + unbind: function(keys, action) { + if (_direct_map[keys + ':' + action]) { + delete _direct_map[keys + ':' + action]; + this.bind(keys, function() {}, action); + } + return this; + }, + + /** + * triggers an event that has already been bound + * + * @param {string} keys + * @param {string=} action + * @returns void + */ + trigger: function(keys, action) { + _direct_map[keys + ':' + action](); + return this; + }, + + /** + * resets the library back to its initial state. this is useful + * if you want to clear out the current keyboard shortcuts and bind + * new ones - for example if you switch to another page + * + * @returns void + */ + reset: function() { + _callbacks = {}; + _direct_map = {}; + return this; + }, + + /** + * should we stop this event before firing off callbacks + * + * @param {Event} e + * @param {Element} element + * @return {boolean} + */ + stopCallback: function(e, element, combo) { + + // if the element has the class "mousetrap" then no need to stop + if ((' ' + element.className + ' ').indexOf(' mousetrap ') > -1) { + return false; + } + + // stop for input, select, and textarea + return element.tagName == 'INPUT' || element.tagName == 'SELECT' || element.tagName == 'TEXTAREA' || (element.contentEditable && element.contentEditable == 'true'); + } + }; + + // expose mousetrap to the global object + window.Mousetrap = Mousetrap; + + // expose mousetrap as an AMD module + if (typeof define === 'function' && define.amd) { + define("mousetrap", Mousetrap); + } +}) (); + +/* @source lib/store.js */; + +;(function(win){ + var store = {}, + doc = win.document, + localStorageName = 'localStorage', + namespace = '__storejs__', + storage + + store.disabled = false + store.set = function(key, value) {} + store.get = function(key) {} + store.remove = function(key) {} + store.clear = function() {} + store.transact = function(key, defaultVal, transactionFn) { + var val = store.get(key) + if (transactionFn == null) { + transactionFn = defaultVal + defaultVal = null + } + if (typeof val == 'undefined') { val = defaultVal || {} } + transactionFn(val) + store.set(key, val) + } + store.getAll = function() {} + + store.serialize = function(value) { + return JSON.stringify(value) + } + store.deserialize = function(value) { + if (typeof value != 'string') { return undefined } + try { return JSON.parse(value) } + catch(e) { return value || undefined } + } + + // Functions to encapsulate questionable FireFox 3.6.13 behavior + // when about.config::dom.storage.enabled === false + // See https://github.com/marcuswestin/store.js/issues#issue/13 + function isLocalStorageNameSupported() { + try { return (localStorageName in win && win[localStorageName]) } + catch(err) { return false } + } + + if (isLocalStorageNameSupported()) { + storage = win[localStorageName] + store.set = function(key, val) { + if (val === undefined) { return store.remove(key) } + storage.setItem(key, store.serialize(val)) + return val + } + store.get = function(key) { return store.deserialize(storage.getItem(key)) } + store.remove = function(key) { storage.removeItem(key) } + store.clear = function() { storage.clear() } + store.getAll = function() { + var ret = {} + for (var i=0; idocument.w=window') + storageContainer.close() + storageOwner = storageContainer.w.frames[0].document + storage = storageOwner.createElement('div') + } catch(e) { + // somehow ActiveXObject instantiation failed (perhaps some special + // security settings or otherwse), fall back to per-path storage + storage = doc.createElement('div') + storageOwner = doc.body + } + function withIEStorage(storeFunction) { + return function() { + var args = Array.prototype.slice.call(arguments, 0) + args.unshift(storage) + // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx + // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx + storageOwner.appendChild(storage) + storage.addBehavior('#default#userData') + storage.load(localStorageName) + var result = storeFunction.apply(store, args) + storageOwner.removeChild(storage) + return result + } + } + + // In IE7, keys may not contain special chars. See all of https://github.com/marcuswestin/store.js/issues/40 + var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g") + function ieKeyFix(key) { + return key.replace(forbiddenCharsRegex, '___') + } + store.set = withIEStorage(function(storage, key, val) { + key = ieKeyFix(key) + if (val === undefined) { return store.remove(key) } + storage.setAttribute(key, store.serialize(val)) + storage.save(localStorageName) + return val + }) + store.get = withIEStorage(function(storage, key) { + key = ieKeyFix(key) + return store.deserialize(storage.getAttribute(key)) + }) + store.remove = withIEStorage(function(storage, key) { + key = ieKeyFix(key) + storage.removeAttribute(key) + storage.save(localStorageName) + }) + store.clear = withIEStorage(function(storage) { + var attributes = storage.XMLDocument.documentElement.attributes + storage.load(localStorageName) + for (var i=0, attr; attr=attributes[i]; i++) { + storage.removeAttribute(attr.name) + } + storage.save(localStorageName) + }) + store.getAll = withIEStorage(function(storage) { + var attributes = storage.XMLDocument.documentElement.attributes + var ret = {} + for (var i=0, attr; attr=attributes[i]; ++i) { + var key = ieKeyFix(attr.name) + ret[attr.name] = store.deserialize(storage.getAttribute(key)) + } + return ret + }) + } + + try { + store.set(namespace, namespace) + if (store.get(namespace) != namespace) { store.disabled = true } + store.remove(namespace) + } catch(e) { + store.disabled = true + } + store.enabled = !store.disabled + if (typeof module != 'undefined' && module.exports) { module.exports = store } + else if (typeof define === 'function' && define.amd) { define("store", store) } + else { win.store = store } +})(this.window || global); + +/* @source mod/user_following.js */; + +define('store', 'lib/store.js'); +define('mod/user_following', [ + "jquery", + "store" +], function($, store) { + var API_USER_FOLLOWING_PATH = "/api/user/following" + var USER_FOLLOWING_KEY = "user-following"; + var USER_FOLLOWING_UPDATE_KEY= "date:user-following" + var ONE_DAY_IN_SECONDS = 60*60*24; + + var update = function() { + var currentTime = new Date().getTime(); + var lastTime = store.get(USER_FOLLOWING_UPDATE_KEY); + if (lastTime && (currentTime - lastTime) < ONE_DAY_IN_SECONDS ) { + return; + } + + $.ajax( + API_USER_FOLLOWING_PATH + ).done(function(users){ + var following = $.map(users, function(item){ + return item["username"]; + }); + store.set(USER_FOLLOWING_KEY, following); + store.set(USER_FOLLOWING_UPDATE_KEY, currentTime); + }).fail(function(jqxhr, textStatus, error){ + return; + }); + } + + return { + update: update, + val: function(){ + return store.get(USER_FOLLOWING_KEY) || []; + } + }; + +}); + +/* @source mod/input-ext.js */; + +define('mousetrap', 'lib/mousetrap.js'); + +define("mod/input-ext", + [ + "jquery", + "mod/user_following", + "jquery-caret", + "jquery-atwho", + "mousetrap", + "lib/zen-form" +], + function ($, userFollowing) { + var inputExt = {}; + var emojis = [ + 'airplane', 'alien', 'art', 'bear', 'beer', 'bike', 'bomb', 'book', + 'bulb', 'bus', 'cake', 'calling', 'clap', 'cocktail', 'code', 'computer', + 'cool', 'cop', 'email', 'feet', 'fire', 'fish', 'fist', 'gift', 'hammer', + 'heart', 'iphone', 'key', 'leaves', 'lgtm', 'lipstick', 'lock', 'mag', 'mega', + 'memo', 'moneybag', 'new', 'octocat', 'ok', 'palm_tree', 'pencil', 'punch', + 'runner', 'scissors', 'ship', 'shipit', 'ski', 'smile', 'smoking', 'sparkles', + 'star', 'sunny', 'taxi', 'thumbsdown', 'thumbsup', 'tm', 'tophat', 'train', + 'trollface', 'v', 'vs', 'warning', 'wheelchair', 'zap', 'zzz', 'see_no_evil', + 'hear_no_evil', 'speak_no_evil', 'monkey', 'monkey_face', 'manybeers', 'beers', + 'hhkb', 'ruby' + ], emoji_list = $.map(emojis, function(value, i) {return {key: value + ':', name:value};}); + inputExt.enableEmojiInput = function (el) { + el.atwho('(?:^|\\s):', + {data:emoji_list, limit:7, + tpl:'
  • ${name}
  • '}); + return el; + }; + + inputExt.enableAutoCompleteFollowingAndTeam = function (el) { + var teams = JSON.parse($('#all-teams').val() || '[]'); + var users = teams.concat(userFollowing.val()); + + $(el).atwho("@", { + data: users, + limit: 7 + }); + }; + + // 输入#自动提示pr信息 + inputExt.enablePullsInput = function (el) { + var projectName = el.attr('data-project-name'); + if (!projectName) return el; + $.getJSON('/' + projectName + '/pulls/all_data', function (r) { + var pulls = $.map( + r, function(value, i) { + return {key: value.id, name:value.id + ' ' + value.title, title:value.title}; + }); + el.atwho('(?:^|\\s)#', + {data:pulls, limit:7, + tpl:'
  • #${key} ${title}
  • '}); + }); + return el; + }; + + inputExt.shortcut2submit = function (el) { + Mousetrap.bind( + ['command+enter', 'ctrl+enter'], + function (e) { + if (el && (e.srcElement || e.target) == $(el)[0] && !$(el).closest('form').hasClass('submitting')) { + e.preventDefault ? e.preventDefault() : (e.returnValue = false); + $(el).closest('form').addClass('submitting').submit(); + } + }, + 'keydown' + ); + }; + + // 进入全屏模式 + inputExt.enableZenMode = function (el) { + var trigger = '.go-zen'; + el = $(el); + el.zenForm({trigger:trigger, theme:'light'}).dblclick(function(e) { + if (!e.altKey) return; + $(this).zenForm({ trigger: null, theme: 'light' }); + fix(); + }); + + $(trigger).click(fix); + + function fix() { + var textarea = $('.zen-forms-input-wrap textarea'); + if (textarea) { + inputExt.enableEmojiInput(textarea); + textarea.attr({ + 'data-project-name': el.attr('data-project-name'), + 'placeholder': el.attr('placeholder') + }); + + inputExt.enablePullsInput(textarea); + + var participants = $('#participants').val(); + if (participants) { + participants = JSON.parse(participants); + textarea.atwho("@", {data:participants, limit:7}); + } + + // 因为zen-form设置的z-index非常高(99999)所以将at-view调更高 + $('#at-view').css('z-index', 100000); + } + } + }; + + var focusToEnd = function(els) { + return $(els).each(function() { + var v = $(this).val(); + $(this).focus().val("").val(v); + }); + }; + + inputExt.enableQuickQuotes = function (el) { + Mousetrap.bind( + ['r'], + function (e) { + var oldVal = $(el).val(), newVal, selVal = window.getSelection().toString(); + selVal = '> ' + selVal.split('\n').join('\n> '); + newVal = oldVal.concat((oldVal != '') ? '\n\n':'', selVal, '\n\n'); + $("html, body").animate({scrollTop: $(document).height()}, "slow"); + $(el).val(newVal); + focusToEnd(el); + }, + 'keyup' + ); + }; + + inputExt.enableFileUpload = function (uploader, textarea, is_image) { + uploader.submit( + function() { + $(this).ajaxSubmit({ + dataType: 'json', + type: 'POST', + delegation: true, + success: function(r) { + var oldText = textarea.val(), + newText = oldText + + (oldText.length == 0 ? '' : '\n') + + (is_image? '!' : '') + + '[' + r.origin_filename + '](' + r.url + ')'; + textarea.val(newText); + }, + error: function(r) { + alert("上传错误,请确认您上传的文件类型合法"); + } + }); + return false; + }); + + uploader.find('input').change(function () { + uploader.submit(); + }); + }; + + inputExt.enableImageUpload = function (uploader, textarea) { + inputExt.enableFileUpload(uploader,textarea, true); + }; + + inputExt.enableUpload = function(upload_widget,textarea){ + inputExt.enableImageUpload(upload_widget.find(".upload-image-form"),textarea); + inputExt.enableFileUpload(upload_widget.find(".upload-file-form"),textarea); + }; + + return inputExt; + } +); + +/* @source mod/user_avatar.js */; + +define('mod/user_avatar', [ + "jquery", + "jquery-lazyload" +], function($, _) { + var isRetinaDisplay = window.devicePixelRatio > 1; + + var patchForRetina = function(originalURL) { + var match = /^(.+\Ws=)(\d+)(.*)$/.exec(originalURL); + if (match === null) { + return originalURL; + } + + var oldSize = parseInt(match[2], 10); + var newSize = Math.ceil(window.devicePixelRatio * oldSize); + + return match[1] + newSize.toString(10) + match[3]; + }; + + var checkLoad = function() { + var e = $(this); + if (isRetinaDisplay) { + var dataOriginalURL = e.attr('data-original') || e.attr('src'); + e.attr('data-original', patchForRetina(dataOriginalURL)); + + e.lazyload({effect:"fadeIn", threshold:300}); + } + }; + + var loadAvatar = function () { + // $("img.user-avatar").each(checkLoad); + // $("img.avatar").each(checkLoad); + // $(window).resize(); + }; + return loadAvatar; +}); + +/* @source lib/date.extensions.js */; + +/** + * Returns a description of this date in relative terms. + + * Examples, where new Date().toString() == "Mon Nov 23 2009 17:36:51 GMT-0500 (EST)": + * + * new Date().toRelativeTime() + * --> 'Just now' + * + * new Date("Nov 21, 2009").toRelativeTime() + * --> '2 days ago' + * + * new Date("Nov 25, 2009").toRelativeTime() + * --> '2 days from now' + * + * // One second ago + * new Date("Nov 23 2009 17:36:50 GMT-0500 (EST)").toRelativeTime() + * --> '1 second ago' + * + * toRelativeTime() takes an optional argument - a configuration object. + * It can have the following properties: + * - now - Date object that defines "now" for the purpose of conversion. + * By default, current date & time is used (i.e. new Date()) + * - nowThreshold - Threshold in milliseconds which is considered "Just now" + * for times in the past or "Right now" for now or the immediate future + * - smartDays - If enabled, dates within a week of now will use Today/Yesterday/Tomorrow + * or weekdays along with time, e.g. "Thursday at 15:10:34" + * rather than "4 days ago" or "Tomorrow at 20:12:01" + * instead of "1 day from now" + * + * If a single number is given as argument, it is interpreted as nowThreshold: + * + * // One second ago, now setting a now_threshold to 5 seconds + * new Date("Nov 23 2009 17:36:50 GMT-0500 (EST)").toRelativeTime(5000) + * --> 'Just now' + * + * // One second in the future, now setting a now_threshold to 5 seconds + * new Date("Nov 23 2009 17:36:52 GMT-0500 (EST)").toRelativeTime(5000) + * --> 'Right now' + * + */ +var TRANSLATIONS = { + 'Right now':'现在', + 'Just now':'刚刚', + 'from now':'之后', + 'ago':'前', + 'Today':'今天', + 'Yesterday':'昨天', + 'Tomorrow':'明天', + ' at ':'', + 's':'', + ' ':'', + 'millisecond':'毫秒', + 'second':'秒', + 'minute':'分钟', + 'hour':'小时', + 'day':'天', + 'month':'个月', + 'year':'年', + 'Sunday':'星期天', + 'Monday':'星期六', + 'Tuesday':'星期二', + 'Wednesday':'星期三', + 'Thursday':'星期四', + 'Friday':'星期五', + 'Saturday':'星期六' +}, +_t = function (key) {return TRANSLATIONS[key];}; + + Date.prototype.toRelativeTime = (function() { + + var _ = function(options) { + var opts = processOptions(options); + + var now = opts.now || new Date(); + var delta = now - this; + var future = (delta <= 0); + delta = Math.abs(delta); + + // special cases controlled by options + if (delta <= opts.nowThreshold) { + return future ? _t('Right now') : _t('Just now'); + } + if (opts.smartDays && delta <= 6 * MS_IN_DAY) { + return toSmartDays(this, now); + } + + var units = null; + for (var key in CONVERSIONS) { + if (delta < CONVERSIONS[key]) + break; + units = _t(key); // keeps track of the selected key over the iteration + delta = delta / CONVERSIONS[key]; + } + + // pluralize a unit when the difference is greater than 1. + delta = Math.floor(delta); + if (delta !== 1) { units += _t("s"); } + return [delta, units, future ? _t("from now") : _t("ago")].join(_t(" ")); + }; + + var processOptions = function(arg) { + if (!arg) arg = 0; + if (typeof arg === 'string') { + arg = parseInt(arg, 10); + } + if (typeof arg === 'number') { + if (isNaN(arg)) arg = 0; + return {nowThreshold: arg}; + } + return arg; + }; + + var toSmartDays = function(date, now) { + var day; + var weekday = date.getDay(), + dayDiff = weekday - now.getDay(); + if (dayDiff == 0) day = _t('Today'); + else if (dayDiff == -1) day = _t('Yesterday'); + else if (dayDiff == 1 && date > now) day = _t('Tomorrow'); + else day = WEEKDAYS[weekday]; + return day + _t(" at ") + date.toLocaleTimeString(); + }; + + var CONVERSIONS = { + millisecond: 1, // ms -> ms + second: 1000, // ms -> sec + minute: 60, // sec -> min + hour: 60, // min -> hour + day: 24, // hour -> day + month: 30, // day -> month (roughly) + year: 12 // month -> year + }; + var MS_IN_DAY = (CONVERSIONS.millisecond * CONVERSIONS.second * CONVERSIONS.minute * CONVERSIONS.hour * CONVERSIONS.day); + + var WEEKDAYS = [_t('Sunday'), _t('Monday'), _t('Tuesday'), _t('Wednesday'), _t('Thursday'), _t('Friday'), _t('Saturday')]; + + return _; + +})(); + + + +/* + * Wraps up a common pattern used with this plugin whereby you take a String + * representation of a Date, and want back a date object. + */ +Date.fromString = function(str) { + return new Date(Date.parse(str)); +}; + +/* autogeneration */ +define("lib/date.extensions", [], function(){}); + +/* @source mod/relative_date.js */; + +define('mod/relative_date', [ + "jquery", + "lib/date.extensions" +], function($) { + var updateRelativeDate = function () { + $('.js-relative-date').each( + function (i, el) { + var el = $(el); + var t = (el.attr('datetime') || el.attr('data-time')).split(/[- : + T]/); + var d = new Date(t[0], t[1]-1, t[2], t[3], t[4], t[5]); + !isNaN(d.getTime()) && el.html(d.toRelativeTime({nowThreshold:60*1000})); + }); + }; + return updateRelativeDate; + }); + +/* @source */; + +require( + ['jquery', + 'mod/relative_date', + 'mod/user_avatar', + 'jquery-tmpl', + 'mod/input-ext'], function ($, updateRelativeDate, loadAvatar) { + var tmpl = $("#tmpl-timeline-activity"); + //previewable-comment-form + $('.previewable-comment-form .js-preview-tabs a.preview-tab').on('show', function(e) { + $('#preview_bucket p').html("Loading preview..."); + }).on('shown', function(e) { + var url = $('#preview_bucket .content-body').data('api-url'); + var text = $('#write_bucket textarea').val(); + $('#preview_bucket .content-body').load(url, {text: text}); + }); + + $('.timeline .loader').hide(); + $('.timeline .pagination').show().click( + function () { + var id = $('.timeline .activity .action').length; + var url = "/api/center/activity/?start=" + id + "&limit=10"; + $.ajax({type: "GET", + url: url, + dataType: "json", + beforeSend: function() { + $('.timeline .loader').show(); + }, + success: function(data) { + for (var x in data) { + $('.timeline .activity').append($.tmpl(tmpl, data[x])); + } + $('.timeline .loader').hide(); + if (data.length < 10) { + $('.timeline .pagination').hide(); + } + updateRelativeDate(); + loadAvatar(); + } + }); + }); + } +); + diff --git a/dist/js/app/chat/main.js b/dist/js/app/chat/main.js new file mode 100644 index 0000000..8283a49 --- /dev/null +++ b/dist/js/app/chat/main.js @@ -0,0 +1,5465 @@ + +require.config({ enable_ozma: true }); + + +/* @source mod/user_avatar.js */; + +define('mod/user_avatar', [ + "jquery", + "jquery-lazyload" +], function($, _) { + var isRetinaDisplay = window.devicePixelRatio > 1; + + var patchForRetina = function(originalURL) { + var match = /^(.+\Ws=)(\d+)(.*)$/.exec(originalURL); + if (match === null) { + return originalURL; + } + + var oldSize = parseInt(match[2], 10); + var newSize = Math.ceil(window.devicePixelRatio * oldSize); + + return match[1] + newSize.toString(10) + match[3]; + }; + + var checkLoad = function() { + var e = $(this); + if (isRetinaDisplay) { + var dataOriginalURL = e.attr('data-original') || e.attr('src'); + e.attr('data-original', patchForRetina(dataOriginalURL)); + + e.lazyload({effect:"fadeIn", threshold:300}); + } + }; + + var loadAvatar = function () { + // $("img.user-avatar").each(checkLoad); + // $("img.avatar").each(checkLoad); + // $(window).resize(); + }; + return loadAvatar; +}); + +/* @source mod/node_config.js */; + +define('mod/node_config', function() { + var config = { + port:'7076', + host:'code.intra.douban.com', + };//need to write this when online + return config; +}); + +/* @source lib/socket.io.js */; + +/*! Socket.IO.js build:0.9.16, development. Copyright(c) 2011 LearnBoost MIT Licensed */ + +var io = ('undefined' === typeof module ? {} : module.exports); +(function() { + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, global) { + + /** + * IO namespace. + * + * @namespace + */ + + var io = exports; + + /** + * Socket.IO version + * + * @api public + */ + + io.version = '0.9.16'; + + /** + * Protocol implemented. + * + * @api public + */ + + io.protocol = 1; + + /** + * Available transports, these will be populated with the available transports + * + * @api public + */ + + io.transports = []; + + /** + * Keep track of jsonp callbacks. + * + * @api private + */ + + io.j = []; + + /** + * Keep track of our io.Sockets + * + * @api private + */ + io.sockets = {}; + + + /** + * Manages connections to hosts. + * + * @param {String} uri + * @Param {Boolean} force creation of new socket (defaults to false) + * @api public + */ + + io.connect = function (host, details) { + var uri = io.util.parseUri(host) + , uuri + , socket; + + if (global && global.location) { + uri.protocol = uri.protocol || global.location.protocol.slice(0, -1); + uri.host = uri.host || (global.document + ? global.document.domain : global.location.hostname); + uri.port = uri.port || global.location.port; + } + + uuri = io.util.uniqueUri(uri); + + var options = { + host: uri.host + , secure: 'https' == uri.protocol + , port: uri.port || ('https' == uri.protocol ? 443 : 80) + , query: uri.query || '' + }; + + io.util.merge(options, details); + + if (options['force new connection'] || !io.sockets[uuri]) { + socket = new io.Socket(options); + } + + if (!options['force new connection'] && socket) { + io.sockets[uuri] = socket; + } + + socket = socket || io.sockets[uuri]; + + // if path is different from '' or / + return socket.of(uri.path.length > 1 ? uri.path : ''); + }; + +})('object' === typeof module ? module.exports : (this.io = {}), this); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, global) { + + /** + * Utilities namespace. + * + * @namespace + */ + + var util = exports.util = {}; + + /** + * Parses an URI + * + * @author Steven Levithan (MIT license) + * @api public + */ + + var re = /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/; + + var parts = ['source', 'protocol', 'authority', 'userInfo', 'user', 'password', + 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', + 'anchor']; + + util.parseUri = function (str) { + var m = re.exec(str || '') + , uri = {} + , i = 14; + + while (i--) { + uri[parts[i]] = m[i] || ''; + } + + return uri; + }; + + /** + * Produces a unique url that identifies a Socket.IO connection. + * + * @param {Object} uri + * @api public + */ + + util.uniqueUri = function (uri) { + var protocol = uri.protocol + , host = uri.host + , port = uri.port; + + if ('document' in global) { + host = host || document.domain; + port = port || (protocol == 'https' + && document.location.protocol !== 'https:' ? 443 : document.location.port); + } else { + host = host || 'localhost'; + + if (!port && protocol == 'https') { + port = 443; + } + } + + return (protocol || 'http') + '://' + host + ':' + (port || 80); + }; + + /** + * Mergest 2 query strings in to once unique query string + * + * @param {String} base + * @param {String} addition + * @api public + */ + + util.query = function (base, addition) { + var query = util.chunkQuery(base || '') + , components = []; + + util.merge(query, util.chunkQuery(addition || '')); + for (var part in query) { + if (query.hasOwnProperty(part)) { + components.push(part + '=' + query[part]); + } + } + + return components.length ? '?' + components.join('&') : ''; + }; + + /** + * Transforms a querystring in to an object + * + * @param {String} qs + * @api public + */ + + util.chunkQuery = function (qs) { + var query = {} + , params = qs.split('&') + , i = 0 + , l = params.length + , kv; + + for (; i < l; ++i) { + kv = params[i].split('='); + if (kv[0]) { + query[kv[0]] = kv[1]; + } + } + + return query; + }; + + /** + * Executes the given function when the page is loaded. + * + * io.util.load(function () { console.log('page loaded'); }); + * + * @param {Function} fn + * @api public + */ + + var pageLoaded = false; + + util.load = function (fn) { + if ('document' in global && document.readyState === 'complete' || pageLoaded) { + return fn(); + } + + util.on(global, 'load', fn, false); + }; + + /** + * Adds an event. + * + * @api private + */ + + util.on = function (element, event, fn, capture) { + if (element.attachEvent) { + element.attachEvent('on' + event, fn); + } else if (element.addEventListener) { + element.addEventListener(event, fn, capture); + } + }; + + /** + * Generates the correct `XMLHttpRequest` for regular and cross domain requests. + * + * @param {Boolean} [xdomain] Create a request that can be used cross domain. + * @returns {XMLHttpRequest|false} If we can create a XMLHttpRequest. + * @api private + */ + + util.request = function (xdomain) { + + if (xdomain && 'undefined' != typeof XDomainRequest && !util.ua.hasCORS) { + return new XDomainRequest(); + } + + if ('undefined' != typeof XMLHttpRequest && (!xdomain || util.ua.hasCORS)) { + return new XMLHttpRequest(); + } + + if (!xdomain) { + try { + return new window[(['Active'].concat('Object').join('X'))]('Microsoft.XMLHTTP'); + } catch(e) { } + } + + return null; + }; + + /** + * XHR based transport constructor. + * + * @constructor + * @api public + */ + + /** + * Change the internal pageLoaded value. + */ + + if ('undefined' != typeof window) { + util.load(function () { + pageLoaded = true; + }); + } + + /** + * Defers a function to ensure a spinner is not displayed by the browser + * + * @param {Function} fn + * @api public + */ + + util.defer = function (fn) { + if (!util.ua.webkit || 'undefined' != typeof importScripts) { + return fn(); + } + + util.load(function () { + setTimeout(fn, 100); + }); + }; + + /** + * Merges two objects. + * + * @api public + */ + + util.merge = function merge (target, additional, deep, lastseen) { + var seen = lastseen || [] + , depth = typeof deep == 'undefined' ? 2 : deep + , prop; + + for (prop in additional) { + if (additional.hasOwnProperty(prop) && util.indexOf(seen, prop) < 0) { + if (typeof target[prop] !== 'object' || !depth) { + target[prop] = additional[prop]; + seen.push(additional[prop]); + } else { + util.merge(target[prop], additional[prop], depth - 1, seen); + } + } + } + + return target; + }; + + /** + * Merges prototypes from objects + * + * @api public + */ + + util.mixin = function (ctor, ctor2) { + util.merge(ctor.prototype, ctor2.prototype); + }; + + /** + * Shortcut for prototypical and static inheritance. + * + * @api private + */ + + util.inherit = function (ctor, ctor2) { + function f() {}; + f.prototype = ctor2.prototype; + ctor.prototype = new f; + }; + + /** + * Checks if the given object is an Array. + * + * io.util.isArray([]); // true + * io.util.isArray({}); // false + * + * @param Object obj + * @api public + */ + + util.isArray = Array.isArray || function (obj) { + return Object.prototype.toString.call(obj) === '[object Array]'; + }; + + /** + * Intersects values of two arrays into a third + * + * @api public + */ + + util.intersect = function (arr, arr2) { + var ret = [] + , longest = arr.length > arr2.length ? arr : arr2 + , shortest = arr.length > arr2.length ? arr2 : arr; + + for (var i = 0, l = shortest.length; i < l; i++) { + if (~util.indexOf(longest, shortest[i])) + ret.push(shortest[i]); + } + + return ret; + }; + + /** + * Array indexOf compatibility. + * + * @see bit.ly/a5Dxa2 + * @api public + */ + + util.indexOf = function (arr, o, i) { + + for (var j = arr.length, i = i < 0 ? i + j < 0 ? 0 : i + j : i || 0; + i < j && arr[i] !== o; i++) {} + + return j <= i ? -1 : i; + }; + + /** + * Converts enumerables to array. + * + * @api public + */ + + util.toArray = function (enu) { + var arr = []; + + for (var i = 0, l = enu.length; i < l; i++) + arr.push(enu[i]); + + return arr; + }; + + /** + * UA / engines detection namespace. + * + * @namespace + */ + + util.ua = {}; + + /** + * Whether the UA supports CORS for XHR. + * + * @api public + */ + + util.ua.hasCORS = 'undefined' != typeof XMLHttpRequest && (function () { + try { + var a = new XMLHttpRequest(); + } catch (e) { + return false; + } + + return a.withCredentials != undefined; + })(); + + /** + * Detect webkit. + * + * @api public + */ + + util.ua.webkit = 'undefined' != typeof navigator + && /webkit/i.test(navigator.userAgent); + + /** + * Detect iPad/iPhone/iPod. + * + * @api public + */ + + util.ua.iDevice = 'undefined' != typeof navigator + && /iPad|iPhone|iPod/i.test(navigator.userAgent); + +})('undefined' != typeof io ? io : module.exports, this); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.EventEmitter = EventEmitter; + + /** + * Event emitter constructor. + * + * @api public. + */ + + function EventEmitter () {}; + + /** + * Adds a listener + * + * @api public + */ + + EventEmitter.prototype.on = function (name, fn) { + if (!this.$events) { + this.$events = {}; + } + + if (!this.$events[name]) { + this.$events[name] = fn; + } else if (io.util.isArray(this.$events[name])) { + this.$events[name].push(fn); + } else { + this.$events[name] = [this.$events[name], fn]; + } + + return this; + }; + + EventEmitter.prototype.addListener = EventEmitter.prototype.on; + + /** + * Adds a volatile listener. + * + * @api public + */ + + EventEmitter.prototype.once = function (name, fn) { + var self = this; + + function on () { + self.removeListener(name, on); + fn.apply(this, arguments); + }; + + on.listener = fn; + this.on(name, on); + + return this; + }; + + /** + * Removes a listener. + * + * @api public + */ + + EventEmitter.prototype.removeListener = function (name, fn) { + if (this.$events && this.$events[name]) { + var list = this.$events[name]; + + if (io.util.isArray(list)) { + var pos = -1; + + for (var i = 0, l = list.length; i < l; i++) { + if (list[i] === fn || (list[i].listener && list[i].listener === fn)) { + pos = i; + break; + } + } + + if (pos < 0) { + return this; + } + + list.splice(pos, 1); + + if (!list.length) { + delete this.$events[name]; + } + } else if (list === fn || (list.listener && list.listener === fn)) { + delete this.$events[name]; + } + } + + return this; + }; + + /** + * Removes all listeners for an event. + * + * @api public + */ + + EventEmitter.prototype.removeAllListeners = function (name) { + if (name === undefined) { + this.$events = {}; + return this; + } + + if (this.$events && this.$events[name]) { + this.$events[name] = null; + } + + return this; + }; + + /** + * Gets all listeners for a certain event. + * + * @api publci + */ + + EventEmitter.prototype.listeners = function (name) { + if (!this.$events) { + this.$events = {}; + } + + if (!this.$events[name]) { + this.$events[name] = []; + } + + if (!io.util.isArray(this.$events[name])) { + this.$events[name] = [this.$events[name]]; + } + + return this.$events[name]; + }; + + /** + * Emits an event. + * + * @api public + */ + + EventEmitter.prototype.emit = function (name) { + if (!this.$events) { + return false; + } + + var handler = this.$events[name]; + + if (!handler) { + return false; + } + + var args = Array.prototype.slice.call(arguments, 1); + + if ('function' == typeof handler) { + handler.apply(this, args); + } else if (io.util.isArray(handler)) { + var listeners = handler.slice(); + + for (var i = 0, l = listeners.length; i < l; i++) { + listeners[i].apply(this, args); + } + } else { + return false; + } + + return true; + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +/** + * Based on JSON2 (http://www.JSON.org/js.html). + */ + +(function (exports, nativeJSON) { + "use strict"; + + // use native JSON if it's available + if (nativeJSON && nativeJSON.parse){ + return exports.JSON = { + parse: nativeJSON.parse + , stringify: nativeJSON.stringify + }; + } + + var JSON = exports.JSON = {}; + + function f(n) { + // Format integers to have at least two digits. + return n < 10 ? '0' + n : n; + } + + function date(d, key) { + return isFinite(d.valueOf()) ? + d.getUTCFullYear() + '-' + + f(d.getUTCMonth() + 1) + '-' + + f(d.getUTCDate()) + 'T' + + f(d.getUTCHours()) + ':' + + f(d.getUTCMinutes()) + ':' + + f(d.getUTCSeconds()) + 'Z' : null; + }; + + var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + gap, + indent, + meta = { // table of character substitutions + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '\\': '\\\\' + }, + rep; + + + function quote(string) { + +// If the string contains no control characters, no quote characters, and no +// backslash characters, then we can safely slap some quotes around it. +// Otherwise we must also replace the offending characters with safe escape +// sequences. + + escapable.lastIndex = 0; + return escapable.test(string) ? '"' + string.replace(escapable, function (a) { + var c = meta[a]; + return typeof c === 'string' ? c : + '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }) + '"' : '"' + string + '"'; + } + + + function str(key, holder) { + +// Produce a string from holder[key]. + + var i, // The loop counter. + k, // The member key. + v, // The member value. + length, + mind = gap, + partial, + value = holder[key]; + +// If the value has a toJSON method, call it to obtain a replacement value. + + if (value instanceof Date) { + value = date(key); + } + +// If we were called with a replacer function, then call the replacer to +// obtain a replacement value. + + if (typeof rep === 'function') { + value = rep.call(holder, key, value); + } + +// What happens next depends on the value's type. + + switch (typeof value) { + case 'string': + return quote(value); + + case 'number': + +// JSON numbers must be finite. Encode non-finite numbers as null. + + return isFinite(value) ? String(value) : 'null'; + + case 'boolean': + case 'null': + +// If the value is a boolean or null, convert it to a string. Note: +// typeof null does not produce 'null'. The case is included here in +// the remote chance that this gets fixed someday. + + return String(value); + +// If the type is 'object', we might be dealing with an object or an array or +// null. + + case 'object': + +// Due to a specification blunder in ECMAScript, typeof null is 'object', +// so watch out for that case. + + if (!value) { + return 'null'; + } + +// Make an array to hold the partial results of stringifying this object value. + + gap += indent; + partial = []; + +// Is the value an array? + + if (Object.prototype.toString.apply(value) === '[object Array]') { + +// The value is an array. Stringify every element. Use null as a placeholder +// for non-JSON values. + + length = value.length; + for (i = 0; i < length; i += 1) { + partial[i] = str(i, value) || 'null'; + } + +// Join all of the elements together, separated with commas, and wrap them in +// brackets. + + v = partial.length === 0 ? '[]' : gap ? + '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : + '[' + partial.join(',') + ']'; + gap = mind; + return v; + } + +// If the replacer is an array, use it to select the members to be stringified. + + if (rep && typeof rep === 'object') { + length = rep.length; + for (i = 0; i < length; i += 1) { + if (typeof rep[i] === 'string') { + k = rep[i]; + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } else { + +// Otherwise, iterate through all of the keys in the object. + + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } + +// Join all of the member texts together, separated with commas, +// and wrap them in braces. + + v = partial.length === 0 ? '{}' : gap ? + '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : + '{' + partial.join(',') + '}'; + gap = mind; + return v; + } + } + +// If the JSON object does not yet have a stringify method, give it one. + + JSON.stringify = function (value, replacer, space) { + +// The stringify method takes a value and an optional replacer, and an optional +// space parameter, and returns a JSON text. The replacer can be a function +// that can replace values, or an array of strings that will select the keys. +// A default replacer method can be provided. Use of the space parameter can +// produce text that is more easily readable. + + var i; + gap = ''; + indent = ''; + +// If the space parameter is a number, make an indent string containing that +// many spaces. + + if (typeof space === 'number') { + for (i = 0; i < space; i += 1) { + indent += ' '; + } + +// If the space parameter is a string, it will be used as the indent string. + + } else if (typeof space === 'string') { + indent = space; + } + +// If there is a replacer, it must be a function or an array. +// Otherwise, throw an error. + + rep = replacer; + if (replacer && typeof replacer !== 'function' && + (typeof replacer !== 'object' || + typeof replacer.length !== 'number')) { + throw new Error('JSON.stringify'); + } + +// Make a fake root object containing our value under the key of ''. +// Return the result of stringifying the value. + + return str('', {'': value}); + }; + +// If the JSON object does not yet have a parse method, give it one. + + JSON.parse = function (text, reviver) { + // The parse method takes a text and an optional reviver function, and returns + // a JavaScript value if the text is a valid JSON text. + + var j; + + function walk(holder, key) { + + // The walk method is used to recursively walk the resulting structure so + // that modifications can be made. + + var k, v, value = holder[key]; + if (value && typeof value === 'object') { + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = walk(value, k); + if (v !== undefined) { + value[k] = v; + } else { + delete value[k]; + } + } + } + } + return reviver.call(holder, key, value); + } + + + // Parsing happens in four stages. In the first stage, we replace certain + // Unicode characters with escape sequences. JavaScript handles many characters + // incorrectly, either silently deleting them, or treating them as line endings. + + text = String(text); + cx.lastIndex = 0; + if (cx.test(text)) { + text = text.replace(cx, function (a) { + return '\\u' + + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }); + } + + // In the second stage, we run the text against regular expressions that look + // for non-JSON patterns. We are especially concerned with '()' and 'new' + // because they can cause invocation, and '=' because it can cause mutation. + // But just to be safe, we want to reject all unexpected forms. + + // We split the second stage into 4 regexp operations in order to work around + // crippling inefficiencies in IE's and Safari's regexp engines. First we + // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we + // replace all simple value tokens with ']' characters. Third, we delete all + // open brackets that follow a colon or comma or that begin the text. Finally, + // we look to see that the remaining characters are only whitespace or ']' or + // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. + + if (/^[\],:{}\s]*$/ + .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') + .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') + .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { + + // In the third stage we use the eval function to compile the text into a + // JavaScript structure. The '{' operator is subject to a syntactic ambiguity + // in JavaScript: it can begin a block or an object literal. We wrap the text + // in parens to eliminate the ambiguity. + + j = eval('(' + text + ')'); + + // In the optional fourth stage, we recursively walk the new structure, passing + // each name/value pair to a reviver function for possible transformation. + + return typeof reviver === 'function' ? + walk({'': j}, '') : j; + } + + // If the text is not JSON parseable, then a SyntaxError is thrown. + + throw new SyntaxError('JSON.parse'); + }; + +})( + 'undefined' != typeof io ? io : module.exports + , typeof JSON !== 'undefined' ? JSON : undefined +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Parser namespace. + * + * @namespace + */ + + var parser = exports.parser = {}; + + /** + * Packet types. + */ + + var packets = parser.packets = [ + 'disconnect' + , 'connect' + , 'heartbeat' + , 'message' + , 'json' + , 'event' + , 'ack' + , 'error' + , 'noop' + ]; + + /** + * Errors reasons. + */ + + var reasons = parser.reasons = [ + 'transport not supported' + , 'client not handshaken' + , 'unauthorized' + ]; + + /** + * Errors advice. + */ + + var advice = parser.advice = [ + 'reconnect' + ]; + + /** + * Shortcuts. + */ + + var JSON = io.JSON + , indexOf = io.util.indexOf; + + /** + * Encodes a packet. + * + * @api private + */ + + parser.encodePacket = function (packet) { + var type = indexOf(packets, packet.type) + , id = packet.id || '' + , endpoint = packet.endpoint || '' + , ack = packet.ack + , data = null; + + switch (packet.type) { + case 'error': + var reason = packet.reason ? indexOf(reasons, packet.reason) : '' + , adv = packet.advice ? indexOf(advice, packet.advice) : ''; + + if (reason !== '' || adv !== '') + data = reason + (adv !== '' ? ('+' + adv) : ''); + + break; + + case 'message': + if (packet.data !== '') + data = packet.data; + break; + + case 'event': + var ev = { name: packet.name }; + + if (packet.args && packet.args.length) { + ev.args = packet.args; + } + + data = JSON.stringify(ev); + break; + + case 'json': + data = JSON.stringify(packet.data); + break; + + case 'connect': + if (packet.qs) + data = packet.qs; + break; + + case 'ack': + data = packet.ackId + + (packet.args && packet.args.length + ? '+' + JSON.stringify(packet.args) : ''); + break; + } + + // construct packet with required fragments + var encoded = [ + type + , id + (ack == 'data' ? '+' : '') + , endpoint + ]; + + // data fragment is optional + if (data !== null && data !== undefined) + encoded.push(data); + + return encoded.join(':'); + }; + + /** + * Encodes multiple messages (payload). + * + * @param {Array} messages + * @api private + */ + + parser.encodePayload = function (packets) { + var decoded = ''; + + if (packets.length == 1) + return packets[0]; + + for (var i = 0, l = packets.length; i < l; i++) { + var packet = packets[i]; + decoded += '\ufffd' + packet.length + '\ufffd' + packets[i]; + } + + return decoded; + }; + + /** + * Decodes a packet + * + * @api private + */ + + var regexp = /([^:]+):([0-9]+)?(\+)?:([^:]+)?:?([\s\S]*)?/; + + parser.decodePacket = function (data) { + var pieces = data.match(regexp); + + if (!pieces) return {}; + + var id = pieces[2] || '' + , data = pieces[5] || '' + , packet = { + type: packets[pieces[1]] + , endpoint: pieces[4] || '' + }; + + // whether we need to acknowledge the packet + if (id) { + packet.id = id; + if (pieces[3]) + packet.ack = 'data'; + else + packet.ack = true; + } + + // handle different packet types + switch (packet.type) { + case 'error': + var pieces = data.split('+'); + packet.reason = reasons[pieces[0]] || ''; + packet.advice = advice[pieces[1]] || ''; + break; + + case 'message': + packet.data = data || ''; + break; + + case 'event': + try { + var opts = JSON.parse(data); + packet.name = opts.name; + packet.args = opts.args; + } catch (e) { } + + packet.args = packet.args || []; + break; + + case 'json': + try { + packet.data = JSON.parse(data); + } catch (e) { } + break; + + case 'connect': + packet.qs = data || ''; + break; + + case 'ack': + var pieces = data.match(/^([0-9]+)(\+)?(.*)/); + if (pieces) { + packet.ackId = pieces[1]; + packet.args = []; + + if (pieces[3]) { + try { + packet.args = pieces[3] ? JSON.parse(pieces[3]) : []; + } catch (e) { } + } + } + break; + + case 'disconnect': + case 'heartbeat': + break; + }; + + return packet; + }; + + /** + * Decodes data payload. Detects multiple messages + * + * @return {Array} messages + * @api public + */ + + parser.decodePayload = function (data) { + // IE doesn't like data[i] for unicode chars, charAt works fine + if (data.charAt(0) == '\ufffd') { + var ret = []; + + for (var i = 1, length = ''; i < data.length; i++) { + if (data.charAt(i) == '\ufffd') { + ret.push(parser.decodePacket(data.substr(i + 1).substr(0, length))); + i += Number(length) + 1; + length = ''; + } else { + length += data.charAt(i); + } + } + + return ret; + } else { + return [parser.decodePacket(data)]; + } + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.Transport = Transport; + + /** + * This is the transport template for all supported transport methods. + * + * @constructor + * @api public + */ + + function Transport (socket, sessid) { + this.socket = socket; + this.sessid = sessid; + }; + + /** + * Apply EventEmitter mixin. + */ + + io.util.mixin(Transport, io.EventEmitter); + + + /** + * Indicates whether heartbeats is enabled for this transport + * + * @api private + */ + + Transport.prototype.heartbeats = function () { + return true; + }; + + /** + * Handles the response from the server. When a new response is received + * it will automatically update the timeout, decode the message and + * forwards the response to the onMessage function for further processing. + * + * @param {String} data Response from the server. + * @api private + */ + + Transport.prototype.onData = function (data) { + this.clearCloseTimeout(); + + // If the connection in currently open (or in a reopening state) reset the close + // timeout since we have just received data. This check is necessary so + // that we don't reset the timeout on an explicitly disconnected connection. + if (this.socket.connected || this.socket.connecting || this.socket.reconnecting) { + this.setCloseTimeout(); + } + + if (data !== '') { + // todo: we should only do decodePayload for xhr transports + var msgs = io.parser.decodePayload(data); + + if (msgs && msgs.length) { + for (var i = 0, l = msgs.length; i < l; i++) { + this.onPacket(msgs[i]); + } + } + } + + return this; + }; + + /** + * Handles packets. + * + * @api private + */ + + Transport.prototype.onPacket = function (packet) { + this.socket.setHeartbeatTimeout(); + + if (packet.type == 'heartbeat') { + return this.onHeartbeat(); + } + + if (packet.type == 'connect' && packet.endpoint == '') { + this.onConnect(); + } + + if (packet.type == 'error' && packet.advice == 'reconnect') { + this.isOpen = false; + } + + this.socket.onPacket(packet); + + return this; + }; + + /** + * Sets close timeout + * + * @api private + */ + + Transport.prototype.setCloseTimeout = function () { + if (!this.closeTimeout) { + var self = this; + + this.closeTimeout = setTimeout(function () { + self.onDisconnect(); + }, this.socket.closeTimeout); + } + }; + + /** + * Called when transport disconnects. + * + * @api private + */ + + Transport.prototype.onDisconnect = function () { + if (this.isOpen) this.close(); + this.clearTimeouts(); + this.socket.onDisconnect(); + return this; + }; + + /** + * Called when transport connects + * + * @api private + */ + + Transport.prototype.onConnect = function () { + this.socket.onConnect(); + return this; + }; + + /** + * Clears close timeout + * + * @api private + */ + + Transport.prototype.clearCloseTimeout = function () { + if (this.closeTimeout) { + clearTimeout(this.closeTimeout); + this.closeTimeout = null; + } + }; + + /** + * Clear timeouts + * + * @api private + */ + + Transport.prototype.clearTimeouts = function () { + this.clearCloseTimeout(); + + if (this.reopenTimeout) { + clearTimeout(this.reopenTimeout); + } + }; + + /** + * Sends a packet + * + * @param {Object} packet object. + * @api private + */ + + Transport.prototype.packet = function (packet) { + this.send(io.parser.encodePacket(packet)); + }; + + /** + * Send the received heartbeat message back to server. So the server + * knows we are still connected. + * + * @param {String} heartbeat Heartbeat response from the server. + * @api private + */ + + Transport.prototype.onHeartbeat = function (heartbeat) { + this.packet({ type: 'heartbeat' }); + }; + + /** + * Called when the transport opens. + * + * @api private + */ + + Transport.prototype.onOpen = function () { + this.isOpen = true; + this.clearCloseTimeout(); + this.socket.onOpen(); + }; + + /** + * Notifies the base when the connection with the Socket.IO server + * has been disconnected. + * + * @api private + */ + + Transport.prototype.onClose = function () { + var self = this; + + /* FIXME: reopen delay causing a infinit loop + this.reopenTimeout = setTimeout(function () { + self.open(); + }, this.socket.options['reopen delay']);*/ + + this.isOpen = false; + this.socket.onClose(); + this.onDisconnect(); + }; + + /** + * Generates a connection url based on the Socket.IO URL Protocol. + * See for more details. + * + * @returns {String} Connection url + * @api private + */ + + Transport.prototype.prepareUrl = function () { + var options = this.socket.options; + + return this.scheme() + '://' + + options.host + ':' + options.port + '/' + + options.resource + '/' + io.protocol + + '/' + this.name + '/' + this.sessid; + }; + + /** + * Checks if the transport is ready to start a connection. + * + * @param {Socket} socket The socket instance that needs a transport + * @param {Function} fn The callback + * @api private + */ + + Transport.prototype.ready = function (socket, fn) { + fn.call(this); + }; +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + */ + + exports.Socket = Socket; + + /** + * Create a new `Socket.IO client` which can establish a persistent + * connection with a Socket.IO enabled server. + * + * @api public + */ + + function Socket (options) { + this.options = { + port: 80 + , secure: false + , document: 'document' in global ? document : false + , resource: 'socket.io' + , transports: io.transports + , 'connect timeout': 10000 + , 'try multiple transports': true + , 'reconnect': true + , 'reconnection delay': 500 + , 'reconnection limit': Infinity + , 'reopen delay': 3000 + , 'max reconnection attempts': 10 + , 'sync disconnect on unload': false + , 'auto connect': true + , 'flash policy port': 10843 + , 'manualFlush': false + }; + + io.util.merge(this.options, options); + + this.connected = false; + this.open = false; + this.connecting = false; + this.reconnecting = false; + this.namespaces = {}; + this.buffer = []; + this.doBuffer = false; + + if (this.options['sync disconnect on unload'] && + (!this.isXDomain() || io.util.ua.hasCORS)) { + var self = this; + io.util.on(global, 'beforeunload', function () { + self.disconnectSync(); + }, false); + } + + if (this.options['auto connect']) { + this.connect(); + } +}; + + /** + * Apply EventEmitter mixin. + */ + + io.util.mixin(Socket, io.EventEmitter); + + /** + * Returns a namespace listener/emitter for this socket + * + * @api public + */ + + Socket.prototype.of = function (name) { + if (!this.namespaces[name]) { + this.namespaces[name] = new io.SocketNamespace(this, name); + + if (name !== '') { + this.namespaces[name].packet({ type: 'connect' }); + } + } + + return this.namespaces[name]; + }; + + /** + * Emits the given event to the Socket and all namespaces + * + * @api private + */ + + Socket.prototype.publish = function () { + this.emit.apply(this, arguments); + + var nsp; + + for (var i in this.namespaces) { + if (this.namespaces.hasOwnProperty(i)) { + nsp = this.of(i); + nsp.$emit.apply(nsp, arguments); + } + } + }; + + /** + * Performs the handshake + * + * @api private + */ + + function empty () { }; + + Socket.prototype.handshake = function (fn) { + var self = this + , options = this.options; + + function complete (data) { + if (data instanceof Error) { + self.connecting = false; + self.onError(data.message); + } else { + fn.apply(null, data.split(':')); + } + }; + + var url = [ + 'http' + (options.secure ? 's' : '') + ':/' + , options.host + ':' + options.port + , options.resource + , io.protocol + , io.util.query(this.options.query, 't=' + +new Date) + ].join('/'); + + if (this.isXDomain() && !io.util.ua.hasCORS) { + var insertAt = document.getElementsByTagName('script')[0] + , script = document.createElement('script'); + + script.src = url + '&jsonp=' + io.j.length; + insertAt.parentNode.insertBefore(script, insertAt); + + io.j.push(function (data) { + complete(data); + script.parentNode.removeChild(script); + }); + } else { + var xhr = io.util.request(); + + xhr.open('GET', url, true); + if (this.isXDomain()) { + xhr.withCredentials = true; + } + xhr.onreadystatechange = function () { + if (xhr.readyState == 4) { + xhr.onreadystatechange = empty; + + if (xhr.status == 200) { + complete(xhr.responseText); + } else if (xhr.status == 403) { + self.onError(xhr.responseText); + } else { + self.connecting = false; + !self.reconnecting && self.onError(xhr.responseText); + } + } + }; + xhr.send(null); + } + }; + + /** + * Find an available transport based on the options supplied in the constructor. + * + * @api private + */ + + Socket.prototype.getTransport = function (override) { + var transports = override || this.transports, match; + + for (var i = 0, transport; transport = transports[i]; i++) { + if (io.Transport[transport] + && io.Transport[transport].check(this) + && (!this.isXDomain() || io.Transport[transport].xdomainCheck(this))) { + return new io.Transport[transport](this, this.sessionid); + } + } + + return null; + }; + + /** + * Connects to the server. + * + * @param {Function} [fn] Callback. + * @returns {io.Socket} + * @api public + */ + + Socket.prototype.connect = function (fn) { + if (this.connecting) { + return this; + } + + var self = this; + self.connecting = true; + + this.handshake(function (sid, heartbeat, close, transports) { + self.sessionid = sid; + self.closeTimeout = close * 1000; + self.heartbeatTimeout = heartbeat * 1000; + if(!self.transports) + self.transports = self.origTransports = (transports ? io.util.intersect( + transports.split(',') + , self.options.transports + ) : self.options.transports); + + self.setHeartbeatTimeout(); + + function connect (transports){ + if (self.transport) self.transport.clearTimeouts(); + + self.transport = self.getTransport(transports); + if (!self.transport) return self.publish('connect_failed'); + + // once the transport is ready + self.transport.ready(self, function () { + self.connecting = true; + self.publish('connecting', self.transport.name); + self.transport.open(); + + if (self.options['connect timeout']) { + self.connectTimeoutTimer = setTimeout(function () { + if (!self.connected) { + self.connecting = false; + + if (self.options['try multiple transports']) { + var remaining = self.transports; + + while (remaining.length > 0 && remaining.splice(0,1)[0] != + self.transport.name) {} + + if (remaining.length){ + connect(remaining); + } else { + self.publish('connect_failed'); + } + } + } + }, self.options['connect timeout']); + } + }); + } + + connect(self.transports); + + self.once('connect', function (){ + clearTimeout(self.connectTimeoutTimer); + + fn && typeof fn == 'function' && fn(); + }); + }); + + return this; + }; + + /** + * Clears and sets a new heartbeat timeout using the value given by the + * server during the handshake. + * + * @api private + */ + + Socket.prototype.setHeartbeatTimeout = function () { + clearTimeout(this.heartbeatTimeoutTimer); + if(this.transport && !this.transport.heartbeats()) return; + + var self = this; + this.heartbeatTimeoutTimer = setTimeout(function () { + self.transport.onClose(); + }, this.heartbeatTimeout); + }; + + /** + * Sends a message. + * + * @param {Object} data packet. + * @returns {io.Socket} + * @api public + */ + + Socket.prototype.packet = function (data) { + if (this.connected && !this.doBuffer) { + this.transport.packet(data); + } else { + this.buffer.push(data); + } + + return this; + }; + + /** + * Sets buffer state + * + * @api private + */ + + Socket.prototype.setBuffer = function (v) { + this.doBuffer = v; + + if (!v && this.connected && this.buffer.length) { + if (!this.options['manualFlush']) { + this.flushBuffer(); + } + } + }; + + /** + * Flushes the buffer data over the wire. + * To be invoked manually when 'manualFlush' is set to true. + * + * @api public + */ + + Socket.prototype.flushBuffer = function() { + this.transport.payload(this.buffer); + this.buffer = []; + }; + + + /** + * Disconnect the established connect. + * + * @returns {io.Socket} + * @api public + */ + + Socket.prototype.disconnect = function () { + if (this.connected || this.connecting) { + if (this.open) { + this.of('').packet({ type: 'disconnect' }); + } + + // handle disconnection immediately + this.onDisconnect('booted'); + } + + return this; + }; + + /** + * Disconnects the socket with a sync XHR. + * + * @api private + */ + + Socket.prototype.disconnectSync = function () { + // ensure disconnection + var xhr = io.util.request(); + var uri = [ + 'http' + (this.options.secure ? 's' : '') + ':/' + , this.options.host + ':' + this.options.port + , this.options.resource + , io.protocol + , '' + , this.sessionid + ].join('/') + '/?disconnect=1'; + + xhr.open('GET', uri, false); + xhr.send(null); + + // handle disconnection immediately + this.onDisconnect('booted'); + }; + + /** + * Check if we need to use cross domain enabled transports. Cross domain would + * be a different port or different domain name. + * + * @returns {Boolean} + * @api private + */ + + Socket.prototype.isXDomain = function () { + + var port = global.location.port || + ('https:' == global.location.protocol ? 443 : 80); + + return this.options.host !== global.location.hostname + || this.options.port != port; + }; + + /** + * Called upon handshake. + * + * @api private + */ + + Socket.prototype.onConnect = function () { + if (!this.connected) { + this.connected = true; + this.connecting = false; + if (!this.doBuffer) { + // make sure to flush the buffer + this.setBuffer(false); + } + this.emit('connect'); + } + }; + + /** + * Called when the transport opens + * + * @api private + */ + + Socket.prototype.onOpen = function () { + this.open = true; + }; + + /** + * Called when the transport closes. + * + * @api private + */ + + Socket.prototype.onClose = function () { + this.open = false; + clearTimeout(this.heartbeatTimeoutTimer); + }; + + /** + * Called when the transport first opens a connection + * + * @param text + */ + + Socket.prototype.onPacket = function (packet) { + this.of(packet.endpoint).onPacket(packet); + }; + + /** + * Handles an error. + * + * @api private + */ + + Socket.prototype.onError = function (err) { + if (err && err.advice) { + if (err.advice === 'reconnect' && (this.connected || this.connecting)) { + this.disconnect(); + if (this.options.reconnect) { + this.reconnect(); + } + } + } + + this.publish('error', err && err.reason ? err.reason : err); + }; + + /** + * Called when the transport disconnects. + * + * @api private + */ + + Socket.prototype.onDisconnect = function (reason) { + var wasConnected = this.connected + , wasConnecting = this.connecting; + + this.connected = false; + this.connecting = false; + this.open = false; + + if (wasConnected || wasConnecting) { + this.transport.close(); + this.transport.clearTimeouts(); + if (wasConnected) { + this.publish('disconnect', reason); + + if ('booted' != reason && this.options.reconnect && !this.reconnecting) { + this.reconnect(); + } + } + } + }; + + /** + * Called upon reconnection. + * + * @api private + */ + + Socket.prototype.reconnect = function () { + this.reconnecting = true; + this.reconnectionAttempts = 0; + this.reconnectionDelay = this.options['reconnection delay']; + + var self = this + , maxAttempts = this.options['max reconnection attempts'] + , tryMultiple = this.options['try multiple transports'] + , limit = this.options['reconnection limit']; + + function reset () { + if (self.connected) { + for (var i in self.namespaces) { + if (self.namespaces.hasOwnProperty(i) && '' !== i) { + self.namespaces[i].packet({ type: 'connect' }); + } + } + self.publish('reconnect', self.transport.name, self.reconnectionAttempts); + } + + clearTimeout(self.reconnectionTimer); + + self.removeListener('connect_failed', maybeReconnect); + self.removeListener('connect', maybeReconnect); + + self.reconnecting = false; + + delete self.reconnectionAttempts; + delete self.reconnectionDelay; + delete self.reconnectionTimer; + delete self.redoTransports; + + self.options['try multiple transports'] = tryMultiple; + }; + + function maybeReconnect () { + if (!self.reconnecting) { + return; + } + + if (self.connected) { + return reset(); + }; + + if (self.connecting && self.reconnecting) { + return self.reconnectionTimer = setTimeout(maybeReconnect, 1000); + } + + if (self.reconnectionAttempts++ >= maxAttempts) { + if (!self.redoTransports) { + self.on('connect_failed', maybeReconnect); + self.options['try multiple transports'] = true; + self.transports = self.origTransports; + self.transport = self.getTransport(); + self.redoTransports = true; + self.connect(); + } else { + self.publish('reconnect_failed'); + reset(); + } + } else { + if (self.reconnectionDelay < limit) { + self.reconnectionDelay *= 2; // exponential back off + } + + self.connect(); + self.publish('reconnecting', self.reconnectionDelay, self.reconnectionAttempts); + self.reconnectionTimer = setTimeout(maybeReconnect, self.reconnectionDelay); + } + }; + + this.options['try multiple transports'] = false; + this.reconnectionTimer = setTimeout(maybeReconnect, this.reconnectionDelay); + + this.on('connect', maybeReconnect); + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.SocketNamespace = SocketNamespace; + + /** + * Socket namespace constructor. + * + * @constructor + * @api public + */ + + function SocketNamespace (socket, name) { + this.socket = socket; + this.name = name || ''; + this.flags = {}; + this.json = new Flag(this, 'json'); + this.ackPackets = 0; + this.acks = {}; + }; + + /** + * Apply EventEmitter mixin. + */ + + io.util.mixin(SocketNamespace, io.EventEmitter); + + /** + * Copies emit since we override it + * + * @api private + */ + + SocketNamespace.prototype.$emit = io.EventEmitter.prototype.emit; + + /** + * Creates a new namespace, by proxying the request to the socket. This + * allows us to use the synax as we do on the server. + * + * @api public + */ + + SocketNamespace.prototype.of = function () { + return this.socket.of.apply(this.socket, arguments); + }; + + /** + * Sends a packet. + * + * @api private + */ + + SocketNamespace.prototype.packet = function (packet) { + packet.endpoint = this.name; + this.socket.packet(packet); + this.flags = {}; + return this; + }; + + /** + * Sends a message + * + * @api public + */ + + SocketNamespace.prototype.send = function (data, fn) { + var packet = { + type: this.flags.json ? 'json' : 'message' + , data: data + }; + + if ('function' == typeof fn) { + packet.id = ++this.ackPackets; + packet.ack = true; + this.acks[packet.id] = fn; + } + + return this.packet(packet); + }; + + /** + * Emits an event + * + * @api public + */ + + SocketNamespace.prototype.emit = function (name) { + var args = Array.prototype.slice.call(arguments, 1) + , lastArg = args[args.length - 1] + , packet = { + type: 'event' + , name: name + }; + + if ('function' == typeof lastArg) { + packet.id = ++this.ackPackets; + packet.ack = 'data'; + this.acks[packet.id] = lastArg; + args = args.slice(0, args.length - 1); + } + + packet.args = args; + + return this.packet(packet); + }; + + /** + * Disconnects the namespace + * + * @api private + */ + + SocketNamespace.prototype.disconnect = function () { + if (this.name === '') { + this.socket.disconnect(); + } else { + this.packet({ type: 'disconnect' }); + this.$emit('disconnect'); + } + + return this; + }; + + /** + * Handles a packet + * + * @api private + */ + + SocketNamespace.prototype.onPacket = function (packet) { + var self = this; + + function ack () { + self.packet({ + type: 'ack' + , args: io.util.toArray(arguments) + , ackId: packet.id + }); + }; + + switch (packet.type) { + case 'connect': + this.$emit('connect'); + break; + + case 'disconnect': + if (this.name === '') { + this.socket.onDisconnect(packet.reason || 'booted'); + } else { + this.$emit('disconnect', packet.reason); + } + break; + + case 'message': + case 'json': + var params = ['message', packet.data]; + + if (packet.ack == 'data') { + params.push(ack); + } else if (packet.ack) { + this.packet({ type: 'ack', ackId: packet.id }); + } + + this.$emit.apply(this, params); + break; + + case 'event': + var params = [packet.name].concat(packet.args); + + if (packet.ack == 'data') + params.push(ack); + + this.$emit.apply(this, params); + break; + + case 'ack': + if (this.acks[packet.ackId]) { + this.acks[packet.ackId].apply(this, packet.args); + delete this.acks[packet.ackId]; + } + break; + + case 'error': + if (packet.advice){ + this.socket.onError(packet); + } else { + if (packet.reason == 'unauthorized') { + this.$emit('connect_failed', packet.reason); + } else { + this.$emit('error', packet.reason); + } + } + break; + } + }; + + /** + * Flag interface. + * + * @api private + */ + + function Flag (nsp, name) { + this.namespace = nsp; + this.name = name; + }; + + /** + * Send a message + * + * @api public + */ + + Flag.prototype.send = function () { + this.namespace.flags[this.name] = true; + this.namespace.send.apply(this.namespace, arguments); + }; + + /** + * Emit an event + * + * @api public + */ + + Flag.prototype.emit = function () { + this.namespace.flags[this.name] = true; + this.namespace.emit.apply(this.namespace, arguments); + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + */ + + exports.websocket = WS; + + /** + * The WebSocket transport uses the HTML5 WebSocket API to establish an + * persistent connection with the Socket.IO server. This transport will also + * be inherited by the FlashSocket fallback as it provides a API compatible + * polyfill for the WebSockets. + * + * @constructor + * @extends {io.Transport} + * @api public + */ + + function WS (socket) { + io.Transport.apply(this, arguments); + }; + + /** + * Inherits from Transport. + */ + + io.util.inherit(WS, io.Transport); + + /** + * Transport name + * + * @api public + */ + + WS.prototype.name = 'websocket'; + + /** + * Initializes a new `WebSocket` connection with the Socket.IO server. We attach + * all the appropriate listeners to handle the responses from the server. + * + * @returns {Transport} + * @api public + */ + + WS.prototype.open = function () { + var query = io.util.query(this.socket.options.query) + , self = this + , Socket + + + if (!Socket) { + Socket = global.MozWebSocket || global.WebSocket; + } + + this.websocket = new Socket(this.prepareUrl() + query); + + this.websocket.onopen = function () { + self.onOpen(); + self.socket.setBuffer(false); + }; + this.websocket.onmessage = function (ev) { + self.onData(ev.data); + }; + this.websocket.onclose = function () { + self.onClose(); + self.socket.setBuffer(true); + }; + this.websocket.onerror = function (e) { + self.onError(e); + }; + + return this; + }; + + /** + * Send a message to the Socket.IO server. The message will automatically be + * encoded in the correct message format. + * + * @returns {Transport} + * @api public + */ + + // Do to a bug in the current IDevices browser, we need to wrap the send in a + // setTimeout, when they resume from sleeping the browser will crash if + // we don't allow the browser time to detect the socket has been closed + if (io.util.ua.iDevice) { + WS.prototype.send = function (data) { + var self = this; + setTimeout(function() { + self.websocket.send(data); + },0); + return this; + }; + } else { + WS.prototype.send = function (data) { + this.websocket.send(data); + return this; + }; + } + + /** + * Payload + * + * @api private + */ + + WS.prototype.payload = function (arr) { + for (var i = 0, l = arr.length; i < l; i++) { + this.packet(arr[i]); + } + return this; + }; + + /** + * Disconnect the established `WebSocket` connection. + * + * @returns {Transport} + * @api public + */ + + WS.prototype.close = function () { + this.websocket.close(); + return this; + }; + + /** + * Handle the errors that `WebSocket` might be giving when we + * are attempting to connect or send messages. + * + * @param {Error} e The error. + * @api private + */ + + WS.prototype.onError = function (e) { + this.socket.onError(e); + }; + + /** + * Returns the appropriate scheme for the URI generation. + * + * @api private + */ + WS.prototype.scheme = function () { + return this.socket.options.secure ? 'wss' : 'ws'; + }; + + /** + * Checks if the browser has support for native `WebSockets` and that + * it's not the polyfill created for the FlashSocket transport. + * + * @return {Boolean} + * @api public + */ + + WS.check = function () { + return ('WebSocket' in global && !('__addTask' in WebSocket)) + || 'MozWebSocket' in global; + }; + + /** + * Check if the `WebSocket` transport support cross domain communications. + * + * @returns {Boolean} + * @api public + */ + + WS.xdomainCheck = function () { + return true; + }; + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('websocket'); + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.flashsocket = Flashsocket; + + /** + * The FlashSocket transport. This is a API wrapper for the HTML5 WebSocket + * specification. It uses a .swf file to communicate with the server. If you want + * to serve the .swf file from a other server than where the Socket.IO script is + * coming from you need to use the insecure version of the .swf. More information + * about this can be found on the github page. + * + * @constructor + * @extends {io.Transport.websocket} + * @api public + */ + + function Flashsocket () { + io.Transport.websocket.apply(this, arguments); + }; + + /** + * Inherits from Transport. + */ + + io.util.inherit(Flashsocket, io.Transport.websocket); + + /** + * Transport name + * + * @api public + */ + + Flashsocket.prototype.name = 'flashsocket'; + + /** + * Disconnect the established `FlashSocket` connection. This is done by adding a + * new task to the FlashSocket. The rest will be handled off by the `WebSocket` + * transport. + * + * @returns {Transport} + * @api public + */ + + Flashsocket.prototype.open = function () { + var self = this + , args = arguments; + + WebSocket.__addTask(function () { + io.Transport.websocket.prototype.open.apply(self, args); + }); + return this; + }; + + /** + * Sends a message to the Socket.IO server. This is done by adding a new + * task to the FlashSocket. The rest will be handled off by the `WebSocket` + * transport. + * + * @returns {Transport} + * @api public + */ + + Flashsocket.prototype.send = function () { + var self = this, args = arguments; + WebSocket.__addTask(function () { + io.Transport.websocket.prototype.send.apply(self, args); + }); + return this; + }; + + /** + * Disconnects the established `FlashSocket` connection. + * + * @returns {Transport} + * @api public + */ + + Flashsocket.prototype.close = function () { + WebSocket.__tasks.length = 0; + io.Transport.websocket.prototype.close.call(this); + return this; + }; + + /** + * The WebSocket fall back needs to append the flash container to the body + * element, so we need to make sure we have access to it. Or defer the call + * until we are sure there is a body element. + * + * @param {Socket} socket The socket instance that needs a transport + * @param {Function} fn The callback + * @api private + */ + + Flashsocket.prototype.ready = function (socket, fn) { + function init () { + var options = socket.options + , port = options['flash policy port'] + , path = [ + 'http' + (options.secure ? 's' : '') + ':/' + , options.host + ':' + options.port + , options.resource + , 'static/flashsocket' + , 'WebSocketMain' + (socket.isXDomain() ? 'Insecure' : '') + '.swf' + ]; + + // Only start downloading the swf file when the checked that this browser + // actually supports it + if (!Flashsocket.loaded) { + if (typeof WEB_SOCKET_SWF_LOCATION === 'undefined') { + // Set the correct file based on the XDomain settings + WEB_SOCKET_SWF_LOCATION = path.join('/'); + } + + if (port !== 843) { + WebSocket.loadFlashPolicyFile('xmlsocket://' + options.host + ':' + port); + } + + WebSocket.__initialize(); + Flashsocket.loaded = true; + } + + fn.call(self); + } + + var self = this; + if (document.body) return init(); + + io.util.load(init); + }; + + /** + * Check if the FlashSocket transport is supported as it requires that the Adobe + * Flash Player plug-in version `10.0.0` or greater is installed. And also check if + * the polyfill is correctly loaded. + * + * @returns {Boolean} + * @api public + */ + + Flashsocket.check = function () { + if ( + typeof WebSocket == 'undefined' + || !('__initialize' in WebSocket) || !swfobject + ) return false; + + return swfobject.getFlashPlayerVersion().major >= 10; + }; + + /** + * Check if the FlashSocket transport can be used as cross domain / cross origin + * transport. Because we can't see which type (secure or insecure) of .swf is used + * we will just return true. + * + * @returns {Boolean} + * @api public + */ + + Flashsocket.xdomainCheck = function () { + return true; + }; + + /** + * Disable AUTO_INITIALIZATION + */ + + if (typeof window != 'undefined') { + WEB_SOCKET_DISABLE_AUTO_INITIALIZATION = true; + } + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('flashsocket'); +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); +/* SWFObject v2.2 + is released under the MIT License +*/ +if ('undefined' != typeof window) { +var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O[(['Active'].concat('Object').join('X'))]!=D){try{var ad=new window[(['Active'].concat('Object').join('X'))](W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y0){for(var af=0;af0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad'}}aa.outerHTML='"+af+"";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab +// License: New BSD License +// Reference: http://dev.w3.org/html5/websockets/ +// Reference: http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol + +(function() { + + if ('undefined' == typeof window || window.WebSocket) return; + + var console = window.console; + if (!console || !console.log || !console.error) { + console = {log: function(){ }, error: function(){ }}; + } + + if (!swfobject.hasFlashPlayerVersion("10.0.0")) { + console.error("Flash Player >= 10.0.0 is required."); + return; + } + if (location.protocol == "file:") { + console.error( + "WARNING: web-socket-js doesn't work in file:///... URL " + + "unless you set Flash Security Settings properly. " + + "Open the page via Web server i.e. http://..."); + } + + /** + * This class represents a faux web socket. + * @param {string} url + * @param {array or string} protocols + * @param {string} proxyHost + * @param {int} proxyPort + * @param {string} headers + */ + WebSocket = function(url, protocols, proxyHost, proxyPort, headers) { + var self = this; + self.__id = WebSocket.__nextId++; + WebSocket.__instances[self.__id] = self; + self.readyState = WebSocket.CONNECTING; + self.bufferedAmount = 0; + self.__events = {}; + if (!protocols) { + protocols = []; + } else if (typeof protocols == "string") { + protocols = [protocols]; + } + // Uses setTimeout() to make sure __createFlash() runs after the caller sets ws.onopen etc. + // Otherwise, when onopen fires immediately, onopen is called before it is set. + setTimeout(function() { + WebSocket.__addTask(function() { + WebSocket.__flash.create( + self.__id, url, protocols, proxyHost || null, proxyPort || 0, headers || null); + }); + }, 0); + }; + + /** + * Send data to the web socket. + * @param {string} data The data to send to the socket. + * @return {boolean} True for success, false for failure. + */ + WebSocket.prototype.send = function(data) { + if (this.readyState == WebSocket.CONNECTING) { + throw "INVALID_STATE_ERR: Web Socket connection has not been established"; + } + // We use encodeURIComponent() here, because FABridge doesn't work if + // the argument includes some characters. We don't use escape() here + // because of this: + // https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Functions#escape_and_unescape_Functions + // But it looks decodeURIComponent(encodeURIComponent(s)) doesn't + // preserve all Unicode characters either e.g. "\uffff" in Firefox. + // Note by wtritch: Hopefully this will not be necessary using ExternalInterface. Will require + // additional testing. + var result = WebSocket.__flash.send(this.__id, encodeURIComponent(data)); + if (result < 0) { // success + return true; + } else { + this.bufferedAmount += result; + return false; + } + }; + + /** + * Close this web socket gracefully. + */ + WebSocket.prototype.close = function() { + if (this.readyState == WebSocket.CLOSED || this.readyState == WebSocket.CLOSING) { + return; + } + this.readyState = WebSocket.CLOSING; + WebSocket.__flash.close(this.__id); + }; + + /** + * Implementation of {@link DOM 2 EventTarget Interface} + * + * @param {string} type + * @param {function} listener + * @param {boolean} useCapture + * @return void + */ + WebSocket.prototype.addEventListener = function(type, listener, useCapture) { + if (!(type in this.__events)) { + this.__events[type] = []; + } + this.__events[type].push(listener); + }; + + /** + * Implementation of {@link DOM 2 EventTarget Interface} + * + * @param {string} type + * @param {function} listener + * @param {boolean} useCapture + * @return void + */ + WebSocket.prototype.removeEventListener = function(type, listener, useCapture) { + if (!(type in this.__events)) return; + var events = this.__events[type]; + for (var i = events.length - 1; i >= 0; --i) { + if (events[i] === listener) { + events.splice(i, 1); + break; + } + } + }; + + /** + * Implementation of {@link DOM 2 EventTarget Interface} + * + * @param {Event} event + * @return void + */ + WebSocket.prototype.dispatchEvent = function(event) { + var events = this.__events[event.type] || []; + for (var i = 0; i < events.length; ++i) { + events[i](event); + } + var handler = this["on" + event.type]; + if (handler) handler(event); + }; + + /** + * Handles an event from Flash. + * @param {Object} flashEvent + */ + WebSocket.prototype.__handleEvent = function(flashEvent) { + if ("readyState" in flashEvent) { + this.readyState = flashEvent.readyState; + } + if ("protocol" in flashEvent) { + this.protocol = flashEvent.protocol; + } + + var jsEvent; + if (flashEvent.type == "open" || flashEvent.type == "error") { + jsEvent = this.__createSimpleEvent(flashEvent.type); + } else if (flashEvent.type == "close") { + // TODO implement jsEvent.wasClean + jsEvent = this.__createSimpleEvent("close"); + } else if (flashEvent.type == "message") { + var data = decodeURIComponent(flashEvent.message); + jsEvent = this.__createMessageEvent("message", data); + } else { + throw "unknown event type: " + flashEvent.type; + } + + this.dispatchEvent(jsEvent); + }; + + WebSocket.prototype.__createSimpleEvent = function(type) { + if (document.createEvent && window.Event) { + var event = document.createEvent("Event"); + event.initEvent(type, false, false); + return event; + } else { + return {type: type, bubbles: false, cancelable: false}; + } + }; + + WebSocket.prototype.__createMessageEvent = function(type, data) { + if (document.createEvent && window.MessageEvent && !window.opera) { + var event = document.createEvent("MessageEvent"); + event.initMessageEvent("message", false, false, data, null, null, window, null); + return event; + } else { + // IE and Opera, the latter one truncates the data parameter after any 0x00 bytes. + return {type: type, data: data, bubbles: false, cancelable: false}; + } + }; + + /** + * Define the WebSocket readyState enumeration. + */ + WebSocket.CONNECTING = 0; + WebSocket.OPEN = 1; + WebSocket.CLOSING = 2; + WebSocket.CLOSED = 3; + + WebSocket.__flash = null; + WebSocket.__instances = {}; + WebSocket.__tasks = []; + WebSocket.__nextId = 0; + + /** + * Load a new flash security policy file. + * @param {string} url + */ + WebSocket.loadFlashPolicyFile = function(url){ + WebSocket.__addTask(function() { + WebSocket.__flash.loadManualPolicyFile(url); + }); + }; + + /** + * Loads WebSocketMain.swf and creates WebSocketMain object in Flash. + */ + WebSocket.__initialize = function() { + if (WebSocket.__flash) return; + + if (WebSocket.__swfLocation) { + // For backword compatibility. + window.WEB_SOCKET_SWF_LOCATION = WebSocket.__swfLocation; + } + if (!window.WEB_SOCKET_SWF_LOCATION) { + console.error("[WebSocket] set WEB_SOCKET_SWF_LOCATION to location of WebSocketMain.swf"); + return; + } + var container = document.createElement("div"); + container.id = "webSocketContainer"; + // Hides Flash box. We cannot use display: none or visibility: hidden because it prevents + // Flash from loading at least in IE. So we move it out of the screen at (-100, -100). + // But this even doesn't work with Flash Lite (e.g. in Droid Incredible). So with Flash + // Lite, we put it at (0, 0). This shows 1x1 box visible at left-top corner but this is + // the best we can do as far as we know now. + container.style.position = "absolute"; + if (WebSocket.__isFlashLite()) { + container.style.left = "0px"; + container.style.top = "0px"; + } else { + container.style.left = "-100px"; + container.style.top = "-100px"; + } + var holder = document.createElement("div"); + holder.id = "webSocketFlash"; + container.appendChild(holder); + document.body.appendChild(container); + // See this article for hasPriority: + // http://help.adobe.com/en_US/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-7ffd.html + swfobject.embedSWF( + WEB_SOCKET_SWF_LOCATION, + "webSocketFlash", + "1" /* width */, + "1" /* height */, + "10.0.0" /* SWF version */, + null, + null, + {hasPriority: true, swliveconnect : true, allowScriptAccess: "always"}, + null, + function(e) { + if (!e.success) { + console.error("[WebSocket] swfobject.embedSWF failed"); + } + }); + }; + + /** + * Called by Flash to notify JS that it's fully loaded and ready + * for communication. + */ + WebSocket.__onFlashInitialized = function() { + // We need to set a timeout here to avoid round-trip calls + // to flash during the initialization process. + setTimeout(function() { + WebSocket.__flash = document.getElementById("webSocketFlash"); + WebSocket.__flash.setCallerUrl(location.href); + WebSocket.__flash.setDebug(!!window.WEB_SOCKET_DEBUG); + for (var i = 0; i < WebSocket.__tasks.length; ++i) { + WebSocket.__tasks[i](); + } + WebSocket.__tasks = []; + }, 0); + }; + + /** + * Called by Flash to notify WebSockets events are fired. + */ + WebSocket.__onFlashEvent = function() { + setTimeout(function() { + try { + // Gets events using receiveEvents() instead of getting it from event object + // of Flash event. This is to make sure to keep message order. + // It seems sometimes Flash events don't arrive in the same order as they are sent. + var events = WebSocket.__flash.receiveEvents(); + for (var i = 0; i < events.length; ++i) { + WebSocket.__instances[events[i].webSocketId].__handleEvent(events[i]); + } + } catch (e) { + console.error(e); + } + }, 0); + return true; + }; + + // Called by Flash. + WebSocket.__log = function(message) { + console.log(decodeURIComponent(message)); + }; + + // Called by Flash. + WebSocket.__error = function(message) { + console.error(decodeURIComponent(message)); + }; + + WebSocket.__addTask = function(task) { + if (WebSocket.__flash) { + task(); + } else { + WebSocket.__tasks.push(task); + } + }; + + /** + * Test if the browser is running flash lite. + * @return {boolean} True if flash lite is running, false otherwise. + */ + WebSocket.__isFlashLite = function() { + if (!window.navigator || !window.navigator.mimeTypes) { + return false; + } + var mimeType = window.navigator.mimeTypes["application/x-shockwave-flash"]; + if (!mimeType || !mimeType.enabledPlugin || !mimeType.enabledPlugin.filename) { + return false; + } + return mimeType.enabledPlugin.filename.match(/flashlite/i) ? true : false; + }; + + if (!window.WEB_SOCKET_DISABLE_AUTO_INITIALIZATION) { + if (window.addEventListener) { + window.addEventListener("load", function(){ + WebSocket.__initialize(); + }, false); + } else { + window.attachEvent("onload", function(){ + WebSocket.__initialize(); + }); + } + } + +})(); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + * + * @api public + */ + + exports.XHR = XHR; + + /** + * XHR constructor + * + * @costructor + * @api public + */ + + function XHR (socket) { + if (!socket) return; + + io.Transport.apply(this, arguments); + this.sendBuffer = []; + }; + + /** + * Inherits from Transport. + */ + + io.util.inherit(XHR, io.Transport); + + /** + * Establish a connection + * + * @returns {Transport} + * @api public + */ + + XHR.prototype.open = function () { + this.socket.setBuffer(false); + this.onOpen(); + this.get(); + + // we need to make sure the request succeeds since we have no indication + // whether the request opened or not until it succeeded. + this.setCloseTimeout(); + + return this; + }; + + /** + * Check if we need to send data to the Socket.IO server, if we have data in our + * buffer we encode it and forward it to the `post` method. + * + * @api private + */ + + XHR.prototype.payload = function (payload) { + var msgs = []; + + for (var i = 0, l = payload.length; i < l; i++) { + msgs.push(io.parser.encodePacket(payload[i])); + } + + this.send(io.parser.encodePayload(msgs)); + }; + + /** + * Send data to the Socket.IO server. + * + * @param data The message + * @returns {Transport} + * @api public + */ + + XHR.prototype.send = function (data) { + this.post(data); + return this; + }; + + /** + * Posts a encoded message to the Socket.IO server. + * + * @param {String} data A encoded message. + * @api private + */ + + function empty () { }; + + XHR.prototype.post = function (data) { + var self = this; + this.socket.setBuffer(true); + + function stateChange () { + if (this.readyState == 4) { + this.onreadystatechange = empty; + self.posting = false; + + if (this.status == 200){ + self.socket.setBuffer(false); + } else { + self.onClose(); + } + } + } + + function onload () { + this.onload = empty; + self.socket.setBuffer(false); + }; + + this.sendXHR = this.request('POST'); + + if (global.XDomainRequest && this.sendXHR instanceof XDomainRequest) { + this.sendXHR.onload = this.sendXHR.onerror = onload; + } else { + this.sendXHR.onreadystatechange = stateChange; + } + + this.sendXHR.send(data); + }; + + /** + * Disconnects the established `XHR` connection. + * + * @returns {Transport} + * @api public + */ + + XHR.prototype.close = function () { + this.onClose(); + return this; + }; + + /** + * Generates a configured XHR request + * + * @param {String} url The url that needs to be requested. + * @param {String} method The method the request should use. + * @returns {XMLHttpRequest} + * @api private + */ + + XHR.prototype.request = function (method) { + var req = io.util.request(this.socket.isXDomain()) + , query = io.util.query(this.socket.options.query, 't=' + +new Date); + + req.open(method || 'GET', this.prepareUrl() + query, true); + + if (method == 'POST') { + try { + if (req.setRequestHeader) { + req.setRequestHeader('Content-type', 'text/plain;charset=UTF-8'); + } else { + // XDomainRequest + req.contentType = 'text/plain'; + } + } catch (e) {} + } + + return req; + }; + + /** + * Returns the scheme to use for the transport URLs. + * + * @api private + */ + + XHR.prototype.scheme = function () { + return this.socket.options.secure ? 'https' : 'http'; + }; + + /** + * Check if the XHR transports are supported + * + * @param {Boolean} xdomain Check if we support cross domain requests. + * @returns {Boolean} + * @api public + */ + + XHR.check = function (socket, xdomain) { + try { + var request = io.util.request(xdomain), + usesXDomReq = (global.XDomainRequest && request instanceof XDomainRequest), + socketProtocol = (socket && socket.options && socket.options.secure ? 'https:' : 'http:'), + isXProtocol = (global.location && socketProtocol != global.location.protocol); + if (request && !(usesXDomReq && isXProtocol)) { + return true; + } + } catch(e) {} + + return false; + }; + + /** + * Check if the XHR transport supports cross domain requests. + * + * @returns {Boolean} + * @api public + */ + + XHR.xdomainCheck = function (socket) { + return XHR.check(socket, true); + }; + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.htmlfile = HTMLFile; + + /** + * The HTMLFile transport creates a `forever iframe` based transport + * for Internet Explorer. Regular forever iframe implementations will + * continuously trigger the browsers buzy indicators. If the forever iframe + * is created inside a `htmlfile` these indicators will not be trigged. + * + * @constructor + * @extends {io.Transport.XHR} + * @api public + */ + + function HTMLFile (socket) { + io.Transport.XHR.apply(this, arguments); + }; + + /** + * Inherits from XHR transport. + */ + + io.util.inherit(HTMLFile, io.Transport.XHR); + + /** + * Transport name + * + * @api public + */ + + HTMLFile.prototype.name = 'htmlfile'; + + /** + * Creates a new Ac...eX `htmlfile` with a forever loading iframe + * that can be used to listen to messages. Inside the generated + * `htmlfile` a reference will be made to the HTMLFile transport. + * + * @api private + */ + + HTMLFile.prototype.get = function () { + this.doc = new window[(['Active'].concat('Object').join('X'))]('htmlfile'); + this.doc.open(); + this.doc.write(''); + this.doc.close(); + this.doc.parentWindow.s = this; + + var iframeC = this.doc.createElement('div'); + iframeC.className = 'socketio'; + + this.doc.body.appendChild(iframeC); + this.iframe = this.doc.createElement('iframe'); + + iframeC.appendChild(this.iframe); + + var self = this + , query = io.util.query(this.socket.options.query, 't='+ +new Date); + + this.iframe.src = this.prepareUrl() + query; + + io.util.on(window, 'unload', function () { + self.destroy(); + }); + }; + + /** + * The Socket.IO server will write script tags inside the forever + * iframe, this function will be used as callback for the incoming + * information. + * + * @param {String} data The message + * @param {document} doc Reference to the context + * @api private + */ + + HTMLFile.prototype._ = function (data, doc) { + // unescape all forward slashes. see GH-1251 + data = data.replace(/\\\//g, '/'); + this.onData(data); + try { + var script = doc.getElementsByTagName('script')[0]; + script.parentNode.removeChild(script); + } catch (e) { } + }; + + /** + * Destroy the established connection, iframe and `htmlfile`. + * And calls the `CollectGarbage` function of Internet Explorer + * to release the memory. + * + * @api private + */ + + HTMLFile.prototype.destroy = function () { + if (this.iframe){ + try { + this.iframe.src = 'about:blank'; + } catch(e){} + + this.doc = null; + this.iframe.parentNode.removeChild(this.iframe); + this.iframe = null; + + CollectGarbage(); + } + }; + + /** + * Disconnects the established connection. + * + * @returns {Transport} Chaining. + * @api public + */ + + HTMLFile.prototype.close = function () { + this.destroy(); + return io.Transport.XHR.prototype.close.call(this); + }; + + /** + * Checks if the browser supports this transport. The browser + * must have an `Ac...eXObject` implementation. + * + * @return {Boolean} + * @api public + */ + + HTMLFile.check = function (socket) { + if (typeof window != "undefined" && (['Active'].concat('Object').join('X')) in window){ + try { + var a = new window[(['Active'].concat('Object').join('X'))]('htmlfile'); + return a && io.Transport.XHR.check(socket); + } catch(e){} + } + return false; + }; + + /** + * Check if cross domain requests are supported. + * + * @returns {Boolean} + * @api public + */ + + HTMLFile.xdomainCheck = function () { + // we can probably do handling for sub-domains, we should + // test that it's cross domain but a subdomain here + return false; + }; + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('htmlfile'); + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + */ + + exports['xhr-polling'] = XHRPolling; + + /** + * The XHR-polling transport uses long polling XHR requests to create a + * "persistent" connection with the server. + * + * @constructor + * @api public + */ + + function XHRPolling () { + io.Transport.XHR.apply(this, arguments); + }; + + /** + * Inherits from XHR transport. + */ + + io.util.inherit(XHRPolling, io.Transport.XHR); + + /** + * Merge the properties from XHR transport + */ + + io.util.merge(XHRPolling, io.Transport.XHR); + + /** + * Transport name + * + * @api public + */ + + XHRPolling.prototype.name = 'xhr-polling'; + + /** + * Indicates whether heartbeats is enabled for this transport + * + * @api private + */ + + XHRPolling.prototype.heartbeats = function () { + return false; + }; + + /** + * Establish a connection, for iPhone and Android this will be done once the page + * is loaded. + * + * @returns {Transport} Chaining. + * @api public + */ + + XHRPolling.prototype.open = function () { + var self = this; + + io.Transport.XHR.prototype.open.call(self); + return false; + }; + + /** + * Starts a XHR request to wait for incoming messages. + * + * @api private + */ + + function empty () {}; + + XHRPolling.prototype.get = function () { + if (!this.isOpen) return; + + var self = this; + + function stateChange () { + if (this.readyState == 4) { + this.onreadystatechange = empty; + + if (this.status == 200) { + self.onData(this.responseText); + self.get(); + } else { + self.onClose(); + } + } + }; + + function onload () { + this.onload = empty; + this.onerror = empty; + self.retryCounter = 1; + self.onData(this.responseText); + self.get(); + }; + + function onerror () { + self.retryCounter ++; + if(!self.retryCounter || self.retryCounter > 3) { + self.onClose(); + } else { + self.get(); + } + }; + + this.xhr = this.request(); + + if (global.XDomainRequest && this.xhr instanceof XDomainRequest) { + this.xhr.onload = onload; + this.xhr.onerror = onerror; + } else { + this.xhr.onreadystatechange = stateChange; + } + + this.xhr.send(null); + }; + + /** + * Handle the unclean close behavior. + * + * @api private + */ + + XHRPolling.prototype.onClose = function () { + io.Transport.XHR.prototype.onClose.call(this); + + if (this.xhr) { + this.xhr.onreadystatechange = this.xhr.onload = this.xhr.onerror = empty; + try { + this.xhr.abort(); + } catch(e){} + this.xhr = null; + } + }; + + /** + * Webkit based browsers show a infinit spinner when you start a XHR request + * before the browsers onload event is called so we need to defer opening of + * the transport until the onload event is called. Wrapping the cb in our + * defer method solve this. + * + * @param {Socket} socket The socket instance that needs a transport + * @param {Function} fn The callback + * @api private + */ + + XHRPolling.prototype.ready = function (socket, fn) { + var self = this; + + io.util.defer(function () { + fn.call(self); + }); + }; + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('xhr-polling'); + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io, global) { + /** + * There is a way to hide the loading indicator in Firefox. If you create and + * remove a iframe it will stop showing the current loading indicator. + * Unfortunately we can't feature detect that and UA sniffing is evil. + * + * @api private + */ + + var indicator = global.document && "MozAppearance" in + global.document.documentElement.style; + + /** + * Expose constructor. + */ + + exports['jsonp-polling'] = JSONPPolling; + + /** + * The JSONP transport creates an persistent connection by dynamically + * inserting a script tag in the page. This script tag will receive the + * information of the Socket.IO server. When new information is received + * it creates a new script tag for the new data stream. + * + * @constructor + * @extends {io.Transport.xhr-polling} + * @api public + */ + + function JSONPPolling (socket) { + io.Transport['xhr-polling'].apply(this, arguments); + + this.index = io.j.length; + + var self = this; + + io.j.push(function (msg) { + self._(msg); + }); + }; + + /** + * Inherits from XHR polling transport. + */ + + io.util.inherit(JSONPPolling, io.Transport['xhr-polling']); + + /** + * Transport name + * + * @api public + */ + + JSONPPolling.prototype.name = 'jsonp-polling'; + + /** + * Posts a encoded message to the Socket.IO server using an iframe. + * The iframe is used because script tags can create POST based requests. + * The iframe is positioned outside of the view so the user does not + * notice it's existence. + * + * @param {String} data A encoded message. + * @api private + */ + + JSONPPolling.prototype.post = function (data) { + var self = this + , query = io.util.query( + this.socket.options.query + , 't='+ (+new Date) + '&i=' + this.index + ); + + if (!this.form) { + var form = document.createElement('form') + , area = document.createElement('textarea') + , id = this.iframeId = 'socketio_iframe_' + this.index + , iframe; + + form.className = 'socketio'; + form.style.position = 'absolute'; + form.style.top = '0px'; + form.style.left = '0px'; + form.style.display = 'none'; + form.target = id; + form.method = 'POST'; + form.setAttribute('accept-charset', 'utf-8'); + area.name = 'd'; + form.appendChild(area); + document.body.appendChild(form); + + this.form = form; + this.area = area; + } + + this.form.action = this.prepareUrl() + query; + + function complete () { + initIframe(); + self.socket.setBuffer(false); + }; + + function initIframe () { + if (self.iframe) { + self.form.removeChild(self.iframe); + } + + try { + // ie6 dynamic iframes with target="" support (thanks Chris Lambacher) + iframe = document.createElement('') + storageContainer.close() + storageOwner = storageContainer.w.frames[0].document + storage = storageOwner.createElement('div') + } catch(e) { + // somehow ActiveXObject instantiation failed (perhaps some special + // security settings or otherwse), fall back to per-path storage + storage = doc.createElement('div') + storageOwner = doc.body + } + function withIEStorage(storeFunction) { + return function() { + var args = Array.prototype.slice.call(arguments, 0) + args.unshift(storage) + // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx + // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx + storageOwner.appendChild(storage) + storage.addBehavior('#default#userData') + storage.load(localStorageName) + var result = storeFunction.apply(store, args) + storageOwner.removeChild(storage) + return result + } + } + + // In IE7, keys may not contain special chars. See all of https://github.com/marcuswestin/store.js/issues/40 + var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g") + function ieKeyFix(key) { + return key.replace(forbiddenCharsRegex, '___') + } + store.set = withIEStorage(function(storage, key, val) { + key = ieKeyFix(key) + if (val === undefined) { return store.remove(key) } + storage.setAttribute(key, store.serialize(val)) + storage.save(localStorageName) + return val + }) + store.get = withIEStorage(function(storage, key) { + key = ieKeyFix(key) + return store.deserialize(storage.getAttribute(key)) + }) + store.remove = withIEStorage(function(storage, key) { + key = ieKeyFix(key) + storage.removeAttribute(key) + storage.save(localStorageName) + }) + store.clear = withIEStorage(function(storage) { + var attributes = storage.XMLDocument.documentElement.attributes + storage.load(localStorageName) + for (var i=0, attr; attr=attributes[i]; i++) { + storage.removeAttribute(attr.name) + } + storage.save(localStorageName) + }) + store.getAll = withIEStorage(function(storage) { + var attributes = storage.XMLDocument.documentElement.attributes + var ret = {} + for (var i=0, attr; attr=attributes[i]; ++i) { + var key = ieKeyFix(attr.name) + ret[attr.name] = store.deserialize(storage.getAttribute(key)) + } + return ret + }) + } + + try { + store.set(namespace, namespace) + if (store.get(namespace) != namespace) { store.disabled = true } + store.remove(namespace) + } catch(e) { + store.disabled = true + } + store.enabled = !store.disabled + if (typeof module != 'undefined' && module.exports) { module.exports = store } + else if (typeof define === 'function' && define.amd) { define("store", store) } + else { win.store = store } +})(this.window || global); + +/* @source mod/user_following.js */; + +define('store', 'lib/store.js'); +define('mod/user_following', [ + "jquery", + "store" +], function($, store) { + var API_USER_FOLLOWING_PATH = "/api/user/following" + var USER_FOLLOWING_KEY = "user-following"; + var USER_FOLLOWING_UPDATE_KEY= "date:user-following" + var ONE_DAY_IN_SECONDS = 60*60*24; + + var update = function() { + var currentTime = new Date().getTime(); + var lastTime = store.get(USER_FOLLOWING_UPDATE_KEY); + if (lastTime && (currentTime - lastTime) < ONE_DAY_IN_SECONDS ) { + return; + } + + $.ajax( + API_USER_FOLLOWING_PATH + ).done(function(users){ + var following = $.map(users, function(item){ + return item["username"]; + }); + store.set(USER_FOLLOWING_KEY, following); + store.set(USER_FOLLOWING_UPDATE_KEY, currentTime); + }).fail(function(jqxhr, textStatus, error){ + return; + }); + } + + return { + update: update, + val: function(){ + return store.get(USER_FOLLOWING_KEY) || []; + } + }; + +}); + +/* @source mod/input-ext.js */; + +define('mousetrap', 'lib/mousetrap.js'); + +define("mod/input-ext", + [ + "jquery", + "mod/user_following", + "jquery-caret", + "jquery-atwho", + "mousetrap", + "lib/zen-form" +], + function ($, userFollowing) { + var inputExt = {}; + var emojis = [ + 'airplane', 'alien', 'art', 'bear', 'beer', 'bike', 'bomb', 'book', + 'bulb', 'bus', 'cake', 'calling', 'clap', 'cocktail', 'code', 'computer', + 'cool', 'cop', 'email', 'feet', 'fire', 'fish', 'fist', 'gift', 'hammer', + 'heart', 'iphone', 'key', 'leaves', 'lgtm', 'lipstick', 'lock', 'mag', 'mega', + 'memo', 'moneybag', 'new', 'octocat', 'ok', 'palm_tree', 'pencil', 'punch', + 'runner', 'scissors', 'ship', 'shipit', 'ski', 'smile', 'smoking', 'sparkles', + 'star', 'sunny', 'taxi', 'thumbsdown', 'thumbsup', 'tm', 'tophat', 'train', + 'trollface', 'v', 'vs', 'warning', 'wheelchair', 'zap', 'zzz', 'see_no_evil', + 'hear_no_evil', 'speak_no_evil', 'monkey', 'monkey_face', 'manybeers', 'beers', + 'hhkb', 'ruby' + ], emoji_list = $.map(emojis, function(value, i) {return {key: value + ':', name:value};}); + inputExt.enableEmojiInput = function (el) { + el.atwho('(?:^|\\s):', + {data:emoji_list, limit:7, + tpl:'
  • ${name}
  • '}); + return el; + }; + + inputExt.enableAutoCompleteFollowingAndTeam = function (el) { + var teams = JSON.parse($('#all-teams').val() || '[]'); + var users = teams.concat(userFollowing.val()); + + $(el).atwho("@", { + data: users, + limit: 7 + }); + }; + + // 输入#自动提示pr信息 + inputExt.enablePullsInput = function (el) { + var projectName = el.attr('data-project-name'); + if (!projectName) return el; + $.getJSON('/' + projectName + '/pulls/all_data', function (r) { + var pulls = $.map( + r, function(value, i) { + return {key: value.id, name:value.id + ' ' + value.title, title:value.title}; + }); + el.atwho('(?:^|\\s)#', + {data:pulls, limit:7, + tpl:'
  • #${key} ${title}
  • '}); + }); + return el; + }; + + inputExt.shortcut2submit = function (el) { + Mousetrap.bind( + ['command+enter', 'ctrl+enter'], + function (e) { + if (el && (e.srcElement || e.target) == $(el)[0] && !$(el).closest('form').hasClass('submitting')) { + e.preventDefault ? e.preventDefault() : (e.returnValue = false); + $(el).closest('form').addClass('submitting').submit(); + } + }, + 'keydown' + ); + }; + + // 进入全屏模式 + inputExt.enableZenMode = function (el) { + var trigger = '.go-zen'; + el = $(el); + el.zenForm({trigger:trigger, theme:'light'}).dblclick(function(e) { + if (!e.altKey) return; + $(this).zenForm({ trigger: null, theme: 'light' }); + fix(); + }); + + $(trigger).click(fix); + + function fix() { + var textarea = $('.zen-forms-input-wrap textarea'); + if (textarea) { + inputExt.enableEmojiInput(textarea); + textarea.attr({ + 'data-project-name': el.attr('data-project-name'), + 'placeholder': el.attr('placeholder') + }); + + inputExt.enablePullsInput(textarea); + + var participants = $('#participants').val(); + if (participants) { + participants = JSON.parse(participants); + textarea.atwho("@", {data:participants, limit:7}); + } + + // 因为zen-form设置的z-index非常高(99999)所以将at-view调更高 + $('#at-view').css('z-index', 100000); + } + } + }; + + var focusToEnd = function(els) { + return $(els).each(function() { + var v = $(this).val(); + $(this).focus().val("").val(v); + }); + }; + + inputExt.enableQuickQuotes = function (el) { + Mousetrap.bind( + ['r'], + function (e) { + var oldVal = $(el).val(), newVal, selVal = window.getSelection().toString(); + selVal = '> ' + selVal.split('\n').join('\n> '); + newVal = oldVal.concat((oldVal != '') ? '\n\n':'', selVal, '\n\n'); + $("html, body").animate({scrollTop: $(document).height()}, "slow"); + $(el).val(newVal); + focusToEnd(el); + }, + 'keyup' + ); + }; + + inputExt.enableFileUpload = function (uploader, textarea, is_image) { + uploader.submit( + function() { + $(this).ajaxSubmit({ + dataType: 'json', + type: 'POST', + delegation: true, + success: function(r) { + var oldText = textarea.val(), + newText = oldText + + (oldText.length == 0 ? '' : '\n') + + (is_image? '!' : '') + + '[' + r.origin_filename + '](' + r.url + ')'; + textarea.val(newText); + }, + error: function(r) { + alert("上传错误,请确认您上传的文件类型合法"); + } + }); + return false; + }); + + uploader.find('input').change(function () { + uploader.submit(); + }); + }; + + inputExt.enableImageUpload = function (uploader, textarea) { + inputExt.enableFileUpload(uploader,textarea, true); + }; + + inputExt.enableUpload = function(upload_widget,textarea){ + inputExt.enableImageUpload(upload_widget.find(".upload-image-form"),textarea); + inputExt.enableFileUpload(upload_widget.find(".upload-file-form"),textarea); + }; + + return inputExt; + } +); + +/* @source mod/chat.js */; + +define('mousetrap', 'lib/mousetrap.js'); + +define('mod/chat', [ + "jquery", + "jquery-atwho", + "jquery-forms", + "mod/connect", + "mod/user_avatar", + "mod/input-ext", + "mousetrap", + "bootbox" +], function ($, _, _, connectNode, loadAvatar, inputExt) { + $(function () { + var ajaxGet = function (url, nowMessageId) { + $.ajax({type: "GET", + url: url, + dataType: "json", + success: function (data) { + if (data.r === 0) { + $(".alert-error").show(); + location.hash = '#lobby'; + return; + } + + var messages = data.msg; + for (var i = 0; i < messages.length; i++) { + nowMessageId.append(messages[i]); + } + loadAvatar(); + var $d = nowMessageId; + $d[0].scrollTop = $d[0].scrollHeight; + $('#message_input').focus(); + } + }); + }; + + var roomName = "lobby"; + if (location.hash.slice(1)) { + roomName = location.hash.slice(1); + } + var channelPrefix = "chat:room:"; + var roomChannel = channelPrefix + roomName; + var io = connectNode(roomChannel); + io.on('announce', function(data) { + var channel = data.channel; + var room = channel.split(':')[2]; + $('#'+room).append(data.send_message); + loadAvatar(); + var $d= $('#'+room); + $d[0].scrollTop = $d[0].scrollHeight; + }); + var sliceUrl = '#' + roomName; + var lastActive = $('[href=' + sliceUrl + ']').parents('li'); + lastActive.attr("class", "active"); + var lastMessageId = $("#"+roomName); + var nowMessageId = $("#"+roomName); + lastMessageId.hide(); + nowMessageId.show(); + nowMessageId.html(''); + + var urlPrefix = "/j/chat/"; + var url = urlPrefix + roomName; + $('#message-form').attr('action', url); + ajaxGet(url, nowMessageId); + + $(window).on('hashchange',function(){ + roomName = location.hash.slice(1); + sliceUrl = '#' + roomName; + var needActive = $('[href='+sliceUrl+']').parents('li'); + lastActive.attr("class", ""); + needActive.attr("class", "active"); + lastActive = needActive; + + url = urlPrefix + roomName; + $('#message-form').attr('action', url); + lastMessageId.hide(); + nowMessageId = $('#'+roomName); + nowMessageId.show(); + nowMessageId.html(''); + lastMessageId = nowMessageId; + + ajaxGet(url, nowMessageId); + + roomChannel = channelPrefix + roomName; + io.emit('ready', {channel:roomChannel}); + }); + + $('#message_input').focus(); + var messageInput = $('textarea#message_input'); + inputExt.shortcut2submit(messageInput); + inputExt.enableEmojiInput(messageInput); + $('#message-form').ajaxForm({ + dataType: 'json', + success: function(r) { + if (r.r === 1) { + $('#message_input').val(''); + $('#message_input').focus(); + $('#message_input').closest('form').removeClass('submitting'); + } + } + }); + + $('.del-room').on('click', function () { + var roomName = $(this).attr("data-name"), + roomItem = $(this), + msg = '你确定要删除room: ' + roomName + '?'; + + if (roomName) { + bootbox.confirm(msg, function(confirmed) { + if (confirmed) { + $.post(urlPrefix + 'delete_room', {'room_name': roomName}, + function (ret) { + if (ret.r === 1) { + var li = roomItem.parents('li'); + li.remove(); + } + }, + 'json' + ); + } + }); + } + }); + }); +}); + +/* @source */; + +require(['jquery' +, 'mod/chat' +, 'mod/connect' +, 'mod/user_avatar' +], function() { +}); diff --git a/dist/js/app/create/main.js b/dist/js/app/create/main.js new file mode 100644 index 0000000..386d4a1 --- /dev/null +++ b/dist/js/app/create/main.js @@ -0,0 +1,32 @@ + +require.config({ enable_ozma: true }); + + +/* @source */; + +//define('jquery', 'lib/jquery.min.js') +require(['jquery'], function($){ + $(function(){ + $("#org_proj").click(function(){ + $("#owner").hide("slow"); + $(".splash").hide("slow"); + $("#mirror").hide("slow"); + $(".mirror-url").hide(); + $(".mirror-with-proxy").hide(); + }); + $("#people_proj").click(function(){ + $("#owner").show("slow"); + $(".splash").show("slow"); + $("#mirror").hide(); + $(".mirror-url").hide(); + $(".mirror-with-proxy").hide(); + }); + $("#mirror_proj").click(function(){ + $("#owner").hide(); + $("#mirror").show("slow"); + $(".splash").show("slow"); + $(".mirror-url").show(); + $(".mirror-with-proxy").show(); + }); + }); +}); diff --git a/dist/js/app/explore/main.js b/dist/js/app/explore/main.js new file mode 100644 index 0000000..d00902c --- /dev/null +++ b/dist/js/app/explore/main.js @@ -0,0 +1,80 @@ + +require.config({ enable_ozma: true }); + + +/* @source mod/confirm.js */; + +define('mod/confirm', [ + "jquery", + "bootbox" +], function($){ + + $("a.confirm").click(function(e) { + e.preventDefault(); + var location = $(this).attr('href'); + bootbox.confirm("Are you sure?", function(confirmed) { + if(confirmed){ + window.location.replace(location); + } + }); + }); + +}); + +/* @source */; + +//define('jquery', 'lib/jquery.min.js') +//define('mustache', 'lib/mustache.js') +//define('bootstrap', 'lib/bootstrap-amd.js') +//define('jquery-tmpl', 'lib/jquery.tmpl.min.js') +//define('bootbox', 'lib/bootbox.js') +require(['jquery' +, 'mustache' +, 'mod/confirm'], function($, Mustache){ + + $("div.trending-repositories a[href^='#tab_']").click( + function(e) { + tab_name = $(this).attr("href").slice("#tab_".length); + $.ajax({type: "GET", + url: "/api/projects?without_commits=true&sortby=" + tab_name, + dataType: "json", + success: function(data){ + var template = $("script#item-project").html(); + var render = ''; + + for(idx_proj in data['projects']){ + proj = data['projects'][idx_proj]; + render += Mustache.to_html(template, proj); + if (idx_proj >= 5) { break } + } + render += '
    '; + $("div#tab_" + tab_name).html(render); + }, + }); + }); + + $("div.repositories-by-dept a[href^='#proj_dept_']").click( + function(e) { + dept_name = $(this).attr("href").slice("#proj_dept_".length); + $.ajax({type: "GET", + url: "/api/projects?without_commits=true&by_dept=" + dept_name, + dataType: "json", + success: function(data){ + var template = $("script#item-project").html(); + var render = ''; + + for(idx_proj in data['projects']){ + proj = data['projects'][idx_proj]; + render += Mustache.to_html(template, proj); + } + render += '
    '; + $("div#proj_dept_" + dept_name).html(render); + } + }); + }); + + $("div.trending-repositories a[href='#tab_updated']").click(); + $("div.repositories-by-dept a[href='#proj_dept_public']").click(); + + +}); diff --git a/dist/js/app/explore/notify_timeline.js b/dist/js/app/explore/notify_timeline.js new file mode 100644 index 0000000..a02a44d --- /dev/null +++ b/dist/js/app/explore/notify_timeline.js @@ -0,0 +1,115 @@ + +require.config({ enable_ozma: true }); + + +/* @source mod/user_avatar.js */; + +define('mod/user_avatar', [ + "jquery", + "jquery-lazyload" +], function($, _) { + var isRetinaDisplay = window.devicePixelRatio > 1; + + var patchForRetina = function(originalURL) { + var match = /^(.+\Ws=)(\d+)(.*)$/.exec(originalURL); + if (match === null) { + return originalURL; + } + + var oldSize = parseInt(match[2], 10); + var newSize = Math.ceil(window.devicePixelRatio * oldSize); + + return match[1] + newSize.toString(10) + match[3]; + }; + + var checkLoad = function() { + var e = $(this); + if (isRetinaDisplay) { + var dataOriginalURL = e.attr('data-original') || e.attr('src'); + e.attr('data-original', patchForRetina(dataOriginalURL)); + + e.lazyload({effect:"fadeIn", threshold:300}); + } + }; + + var loadAvatar = function () { + // $("img.user-avatar").each(checkLoad); + // $("img.avatar").each(checkLoad); + // $(window).resize(); + }; + return loadAvatar; +}); + +/* @source */; + +require(['jquery' +, 'mod/user_avatar' +//, 'mod/notify_pagination' +], function($, loadAvatar) { + //TODO: add notify realtime show + // + $(function () { + $('.entry').delegate('.entry-title .title', 'click', function(){ + $(this).parent().next().toggle(300); + loadAvatar(); + }); + + var removeSlow = function($this) { + $this.fadeOut(350, function() { $this.remove();}); + }; + + $('.notif-list').delegate('.mark-item', 'click', function (e) { + var $this = $(this); + $this.ajaxForm({ + dataType: 'json', + success: function(r) { + if (r.r === 0) { + removeSlow($this.parents('.notif-item')); + } + } + }); + }); + + $('.notif-list').delegate('.mark-entry', 'click', function (e) { + var $this = $(this); + $this.ajaxForm({ + dataType: 'json', + success: function(r) { + if (r.r === 0) { + if ($this.parents('.item-body').children().length == 1) { + removeSlow($this.parents('.notif-item')); + } else { + removeSlow($this.parents('.entry')); + } + } + } + }); + }); + + $('.notif-list').delegate('.mute-entry', 'click', function (e) { + var $this = $(this); + $this.ajaxForm({ + dataType: 'json', + success: function(r) { + if (r.r === 0) { + $this.find('i').removeClass('icon-volume-up').addClass('icon-volume-off'); + } + } + }); + }); + + $('.mark-all-as-read').click(function() { + var $this = $(this), + type = $this.data('type'); + if(type == 'merged_pr') { + var form = $('#merged-pr-uids'); + form.ajaxSubmit({ + success: function() { + location.reload(); + } + }); + } + }) + + }); +}); diff --git a/dist/js/app/explore/public_timeline.js b/dist/js/app/explore/public_timeline.js new file mode 100644 index 0000000..357fc26 --- /dev/null +++ b/dist/js/app/explore/public_timeline.js @@ -0,0 +1,4288 @@ + +require.config({ enable_ozma: true }); + + +/* @source mod/count.js */; + +define('mod/count', [], function() { + var countDict = { + public_num: 35, + teamfeed_num: 35, + userfeed_num: 35, + }; + return countDict; +}); + +/* @source mod/user_avatar.js */; + +define('mod/user_avatar', [ + "jquery", + "jquery-lazyload" +], function($, _) { + var isRetinaDisplay = window.devicePixelRatio > 1; + + var patchForRetina = function(originalURL) { + var match = /^(.+\Ws=)(\d+)(.*)$/.exec(originalURL); + if (match === null) { + return originalURL; + } + + var oldSize = parseInt(match[2], 10); + var newSize = Math.ceil(window.devicePixelRatio * oldSize); + + return match[1] + newSize.toString(10) + match[3]; + }; + + var checkLoad = function() { + var e = $(this); + if (isRetinaDisplay) { + var dataOriginalURL = e.attr('data-original') || e.attr('src'); + e.attr('data-original', patchForRetina(dataOriginalURL)); + + e.lazyload({effect:"fadeIn", threshold:300}); + } + }; + + var loadAvatar = function () { + // $("img.user-avatar").each(checkLoad); + // $("img.avatar").each(checkLoad); + // $(window).resize(); + }; + return loadAvatar; +}); + +/* @source lib/date.extensions.js */; + +/** + * Returns a description of this date in relative terms. + + * Examples, where new Date().toString() == "Mon Nov 23 2009 17:36:51 GMT-0500 (EST)": + * + * new Date().toRelativeTime() + * --> 'Just now' + * + * new Date("Nov 21, 2009").toRelativeTime() + * --> '2 days ago' + * + * new Date("Nov 25, 2009").toRelativeTime() + * --> '2 days from now' + * + * // One second ago + * new Date("Nov 23 2009 17:36:50 GMT-0500 (EST)").toRelativeTime() + * --> '1 second ago' + * + * toRelativeTime() takes an optional argument - a configuration object. + * It can have the following properties: + * - now - Date object that defines "now" for the purpose of conversion. + * By default, current date & time is used (i.e. new Date()) + * - nowThreshold - Threshold in milliseconds which is considered "Just now" + * for times in the past or "Right now" for now or the immediate future + * - smartDays - If enabled, dates within a week of now will use Today/Yesterday/Tomorrow + * or weekdays along with time, e.g. "Thursday at 15:10:34" + * rather than "4 days ago" or "Tomorrow at 20:12:01" + * instead of "1 day from now" + * + * If a single number is given as argument, it is interpreted as nowThreshold: + * + * // One second ago, now setting a now_threshold to 5 seconds + * new Date("Nov 23 2009 17:36:50 GMT-0500 (EST)").toRelativeTime(5000) + * --> 'Just now' + * + * // One second in the future, now setting a now_threshold to 5 seconds + * new Date("Nov 23 2009 17:36:52 GMT-0500 (EST)").toRelativeTime(5000) + * --> 'Right now' + * + */ +var TRANSLATIONS = { + 'Right now':'现在', + 'Just now':'刚刚', + 'from now':'之后', + 'ago':'前', + 'Today':'今天', + 'Yesterday':'昨天', + 'Tomorrow':'明天', + ' at ':'', + 's':'', + ' ':'', + 'millisecond':'毫秒', + 'second':'秒', + 'minute':'分钟', + 'hour':'小时', + 'day':'天', + 'month':'个月', + 'year':'年', + 'Sunday':'星期天', + 'Monday':'星期六', + 'Tuesday':'星期二', + 'Wednesday':'星期三', + 'Thursday':'星期四', + 'Friday':'星期五', + 'Saturday':'星期六' +}, +_t = function (key) {return TRANSLATIONS[key];}; + + Date.prototype.toRelativeTime = (function() { + + var _ = function(options) { + var opts = processOptions(options); + + var now = opts.now || new Date(); + var delta = now - this; + var future = (delta <= 0); + delta = Math.abs(delta); + + // special cases controlled by options + if (delta <= opts.nowThreshold) { + return future ? _t('Right now') : _t('Just now'); + } + if (opts.smartDays && delta <= 6 * MS_IN_DAY) { + return toSmartDays(this, now); + } + + var units = null; + for (var key in CONVERSIONS) { + if (delta < CONVERSIONS[key]) + break; + units = _t(key); // keeps track of the selected key over the iteration + delta = delta / CONVERSIONS[key]; + } + + // pluralize a unit when the difference is greater than 1. + delta = Math.floor(delta); + if (delta !== 1) { units += _t("s"); } + return [delta, units, future ? _t("from now") : _t("ago")].join(_t(" ")); + }; + + var processOptions = function(arg) { + if (!arg) arg = 0; + if (typeof arg === 'string') { + arg = parseInt(arg, 10); + } + if (typeof arg === 'number') { + if (isNaN(arg)) arg = 0; + return {nowThreshold: arg}; + } + return arg; + }; + + var toSmartDays = function(date, now) { + var day; + var weekday = date.getDay(), + dayDiff = weekday - now.getDay(); + if (dayDiff == 0) day = _t('Today'); + else if (dayDiff == -1) day = _t('Yesterday'); + else if (dayDiff == 1 && date > now) day = _t('Tomorrow'); + else day = WEEKDAYS[weekday]; + return day + _t(" at ") + date.toLocaleTimeString(); + }; + + var CONVERSIONS = { + millisecond: 1, // ms -> ms + second: 1000, // ms -> sec + minute: 60, // sec -> min + hour: 60, // min -> hour + day: 24, // hour -> day + month: 30, // day -> month (roughly) + year: 12 // month -> year + }; + var MS_IN_DAY = (CONVERSIONS.millisecond * CONVERSIONS.second * CONVERSIONS.minute * CONVERSIONS.hour * CONVERSIONS.day); + + var WEEKDAYS = [_t('Sunday'), _t('Monday'), _t('Tuesday'), _t('Wednesday'), _t('Thursday'), _t('Friday'), _t('Saturday')]; + + return _; + +})(); + + + +/* + * Wraps up a common pattern used with this plugin whereby you take a String + * representation of a Date, and want back a date object. + */ +Date.fromString = function(str) { + return new Date(Date.parse(str)); +}; + +/* autogeneration */ +define("lib/date.extensions", [], function(){}); + +/* @source mod/relative_date.js */; + +define('mod/relative_date', [ + "jquery", + "lib/date.extensions" +], function($) { + var updateRelativeDate = function () { + $('.js-relative-date').each( + function (i, el) { + var el = $(el); + var t = (el.attr('datetime') || el.attr('data-time')).split(/[- : + T]/); + var d = new Date(t[0], t[1]-1, t[2], t[3], t[4], t[5]); + !isNaN(d.getTime()) && el.html(d.toRelativeTime({nowThreshold:60*1000})); + }); + }; + return updateRelativeDate; + }); + +/* @source mod/ajax_load.js */; + +define('mod/ajax_load', [ + "jquery", + "mod/count", + "mod/relative_date", + "mod/user_avatar" +], function($, countDict, updateRelativeDate, loadAvatar) { + var ajaxLoad = function(url, number_type) { + var maxShown = 35; + $.ajax({type: "GET", + url: url, + dataType: "json", + beforeSend: function() { + $('.timeline .loader').show(); + }, + success: function(data) { + var result = data.result; + var length = data.length; + + $('.timeline>ul').append(result); + $('.timeline .loader').hide(); + if (length < maxShown) { + $('.timeline .pagination').hide(); + } else { + countDict[number_type] += maxShown; + } + updateRelativeDate(); + loadAvatar(); + } + }); + }; + + return ajaxLoad; +}); + +/* @source mod/newsfeed_pagination.js */; + +define('mod/newsfeed_pagination', [ + "jquery", + "mod/ajax_load", + "mod/count" +], function($, ajaxLoad, countDict) { + $(function () { + $('.timeline .loader').hide(); + $('.timeline .pagination').show().click( + function () { + var number_type = "public_num"; + var url = "/j/more/pub/" + countDict.public_num; + ajaxLoad(url, number_type); + }); + }); +}); + +/* @source mod/newsfeed.js */; + +define('mod/newsfeed', [ + "jquery", + "mod/user_avatar" +], function($, loadAvatar) { + $(function () { + $('.timeline').delegate('.expand-rest', 'click', function(){ + var last = $(this).parents('.expand-last'); + last.prevUntil('.expand-first').show(300); + last.hide(); + loadAvatar(); + }); + }); +}); + + +/* @source mod/user_profile_card.js */; + +define('mod/user_profile_card', [ + "jquery", + "jquery-tmpl" +], function($) { + $(function () { + var userCard, teamCard, users = {}, user_type = {}; + $(document).delegate( + '.user-link,.user-mention', 'mouseover', + function (e) { + if (!userCard) { + userCard = $('
    ').appendTo('body') + .mouseleave(function () { + $(this).hide(); + $('.team-card').hide(); + }); + } + if (!teamCard) { + teamCard = $('
    ').appendTo('body') + .mouseleave(function () { + $(this).hide(); + $('.user-card').hide(); + }); + } + var pos = $(this).offset(); + pos.left = pos.left - 5; + pos.top = pos.top - 5; + var name = /@?(\w+)/.exec($(this).text())[1], user = users[name]; + + if (!user) { + $.getJSON('/api/card_info', {user: name}, + function (r) { + if (r.team) { + teamCard.css(pos).empty().show(); + teamCard.append($.tmpl($('#templ-team-card'), r.team)); + user_type[name] = 'team'; + users[name] = r.team; + } else { + userCard.css(pos).empty().show(); + userCard.append($.tmpl($('#templ-user-card'), r.user)); + user_type[name] = 'user'; + users[name] = r.user; + } + }); + } else { + if (user_type[name] === 'team') { + teamCard.css(pos).empty().show(); + teamCard.append($.tmpl($('#templ-team-card'), user)); + } else { + userCard.css(pos).empty().show(); + userCard.append($.tmpl($('#templ-user-card'), user)); + } + } + }); + }); +}); + +/* @source mod/node_config.js */; + +define('mod/node_config', function() { + var config = { + port:'7076', + host:'code.intra.douban.com', + };//need to write this when online + return config; +}); + +/* @source lib/socket.io.js */; + +/*! Socket.IO.js build:0.9.16, development. Copyright(c) 2011 LearnBoost MIT Licensed */ + +var io = ('undefined' === typeof module ? {} : module.exports); +(function() { + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, global) { + + /** + * IO namespace. + * + * @namespace + */ + + var io = exports; + + /** + * Socket.IO version + * + * @api public + */ + + io.version = '0.9.16'; + + /** + * Protocol implemented. + * + * @api public + */ + + io.protocol = 1; + + /** + * Available transports, these will be populated with the available transports + * + * @api public + */ + + io.transports = []; + + /** + * Keep track of jsonp callbacks. + * + * @api private + */ + + io.j = []; + + /** + * Keep track of our io.Sockets + * + * @api private + */ + io.sockets = {}; + + + /** + * Manages connections to hosts. + * + * @param {String} uri + * @Param {Boolean} force creation of new socket (defaults to false) + * @api public + */ + + io.connect = function (host, details) { + var uri = io.util.parseUri(host) + , uuri + , socket; + + if (global && global.location) { + uri.protocol = uri.protocol || global.location.protocol.slice(0, -1); + uri.host = uri.host || (global.document + ? global.document.domain : global.location.hostname); + uri.port = uri.port || global.location.port; + } + + uuri = io.util.uniqueUri(uri); + + var options = { + host: uri.host + , secure: 'https' == uri.protocol + , port: uri.port || ('https' == uri.protocol ? 443 : 80) + , query: uri.query || '' + }; + + io.util.merge(options, details); + + if (options['force new connection'] || !io.sockets[uuri]) { + socket = new io.Socket(options); + } + + if (!options['force new connection'] && socket) { + io.sockets[uuri] = socket; + } + + socket = socket || io.sockets[uuri]; + + // if path is different from '' or / + return socket.of(uri.path.length > 1 ? uri.path : ''); + }; + +})('object' === typeof module ? module.exports : (this.io = {}), this); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, global) { + + /** + * Utilities namespace. + * + * @namespace + */ + + var util = exports.util = {}; + + /** + * Parses an URI + * + * @author Steven Levithan (MIT license) + * @api public + */ + + var re = /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/; + + var parts = ['source', 'protocol', 'authority', 'userInfo', 'user', 'password', + 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', + 'anchor']; + + util.parseUri = function (str) { + var m = re.exec(str || '') + , uri = {} + , i = 14; + + while (i--) { + uri[parts[i]] = m[i] || ''; + } + + return uri; + }; + + /** + * Produces a unique url that identifies a Socket.IO connection. + * + * @param {Object} uri + * @api public + */ + + util.uniqueUri = function (uri) { + var protocol = uri.protocol + , host = uri.host + , port = uri.port; + + if ('document' in global) { + host = host || document.domain; + port = port || (protocol == 'https' + && document.location.protocol !== 'https:' ? 443 : document.location.port); + } else { + host = host || 'localhost'; + + if (!port && protocol == 'https') { + port = 443; + } + } + + return (protocol || 'http') + '://' + host + ':' + (port || 80); + }; + + /** + * Mergest 2 query strings in to once unique query string + * + * @param {String} base + * @param {String} addition + * @api public + */ + + util.query = function (base, addition) { + var query = util.chunkQuery(base || '') + , components = []; + + util.merge(query, util.chunkQuery(addition || '')); + for (var part in query) { + if (query.hasOwnProperty(part)) { + components.push(part + '=' + query[part]); + } + } + + return components.length ? '?' + components.join('&') : ''; + }; + + /** + * Transforms a querystring in to an object + * + * @param {String} qs + * @api public + */ + + util.chunkQuery = function (qs) { + var query = {} + , params = qs.split('&') + , i = 0 + , l = params.length + , kv; + + for (; i < l; ++i) { + kv = params[i].split('='); + if (kv[0]) { + query[kv[0]] = kv[1]; + } + } + + return query; + }; + + /** + * Executes the given function when the page is loaded. + * + * io.util.load(function () { console.log('page loaded'); }); + * + * @param {Function} fn + * @api public + */ + + var pageLoaded = false; + + util.load = function (fn) { + if ('document' in global && document.readyState === 'complete' || pageLoaded) { + return fn(); + } + + util.on(global, 'load', fn, false); + }; + + /** + * Adds an event. + * + * @api private + */ + + util.on = function (element, event, fn, capture) { + if (element.attachEvent) { + element.attachEvent('on' + event, fn); + } else if (element.addEventListener) { + element.addEventListener(event, fn, capture); + } + }; + + /** + * Generates the correct `XMLHttpRequest` for regular and cross domain requests. + * + * @param {Boolean} [xdomain] Create a request that can be used cross domain. + * @returns {XMLHttpRequest|false} If we can create a XMLHttpRequest. + * @api private + */ + + util.request = function (xdomain) { + + if (xdomain && 'undefined' != typeof XDomainRequest && !util.ua.hasCORS) { + return new XDomainRequest(); + } + + if ('undefined' != typeof XMLHttpRequest && (!xdomain || util.ua.hasCORS)) { + return new XMLHttpRequest(); + } + + if (!xdomain) { + try { + return new window[(['Active'].concat('Object').join('X'))]('Microsoft.XMLHTTP'); + } catch(e) { } + } + + return null; + }; + + /** + * XHR based transport constructor. + * + * @constructor + * @api public + */ + + /** + * Change the internal pageLoaded value. + */ + + if ('undefined' != typeof window) { + util.load(function () { + pageLoaded = true; + }); + } + + /** + * Defers a function to ensure a spinner is not displayed by the browser + * + * @param {Function} fn + * @api public + */ + + util.defer = function (fn) { + if (!util.ua.webkit || 'undefined' != typeof importScripts) { + return fn(); + } + + util.load(function () { + setTimeout(fn, 100); + }); + }; + + /** + * Merges two objects. + * + * @api public + */ + + util.merge = function merge (target, additional, deep, lastseen) { + var seen = lastseen || [] + , depth = typeof deep == 'undefined' ? 2 : deep + , prop; + + for (prop in additional) { + if (additional.hasOwnProperty(prop) && util.indexOf(seen, prop) < 0) { + if (typeof target[prop] !== 'object' || !depth) { + target[prop] = additional[prop]; + seen.push(additional[prop]); + } else { + util.merge(target[prop], additional[prop], depth - 1, seen); + } + } + } + + return target; + }; + + /** + * Merges prototypes from objects + * + * @api public + */ + + util.mixin = function (ctor, ctor2) { + util.merge(ctor.prototype, ctor2.prototype); + }; + + /** + * Shortcut for prototypical and static inheritance. + * + * @api private + */ + + util.inherit = function (ctor, ctor2) { + function f() {}; + f.prototype = ctor2.prototype; + ctor.prototype = new f; + }; + + /** + * Checks if the given object is an Array. + * + * io.util.isArray([]); // true + * io.util.isArray({}); // false + * + * @param Object obj + * @api public + */ + + util.isArray = Array.isArray || function (obj) { + return Object.prototype.toString.call(obj) === '[object Array]'; + }; + + /** + * Intersects values of two arrays into a third + * + * @api public + */ + + util.intersect = function (arr, arr2) { + var ret = [] + , longest = arr.length > arr2.length ? arr : arr2 + , shortest = arr.length > arr2.length ? arr2 : arr; + + for (var i = 0, l = shortest.length; i < l; i++) { + if (~util.indexOf(longest, shortest[i])) + ret.push(shortest[i]); + } + + return ret; + }; + + /** + * Array indexOf compatibility. + * + * @see bit.ly/a5Dxa2 + * @api public + */ + + util.indexOf = function (arr, o, i) { + + for (var j = arr.length, i = i < 0 ? i + j < 0 ? 0 : i + j : i || 0; + i < j && arr[i] !== o; i++) {} + + return j <= i ? -1 : i; + }; + + /** + * Converts enumerables to array. + * + * @api public + */ + + util.toArray = function (enu) { + var arr = []; + + for (var i = 0, l = enu.length; i < l; i++) + arr.push(enu[i]); + + return arr; + }; + + /** + * UA / engines detection namespace. + * + * @namespace + */ + + util.ua = {}; + + /** + * Whether the UA supports CORS for XHR. + * + * @api public + */ + + util.ua.hasCORS = 'undefined' != typeof XMLHttpRequest && (function () { + try { + var a = new XMLHttpRequest(); + } catch (e) { + return false; + } + + return a.withCredentials != undefined; + })(); + + /** + * Detect webkit. + * + * @api public + */ + + util.ua.webkit = 'undefined' != typeof navigator + && /webkit/i.test(navigator.userAgent); + + /** + * Detect iPad/iPhone/iPod. + * + * @api public + */ + + util.ua.iDevice = 'undefined' != typeof navigator + && /iPad|iPhone|iPod/i.test(navigator.userAgent); + +})('undefined' != typeof io ? io : module.exports, this); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.EventEmitter = EventEmitter; + + /** + * Event emitter constructor. + * + * @api public. + */ + + function EventEmitter () {}; + + /** + * Adds a listener + * + * @api public + */ + + EventEmitter.prototype.on = function (name, fn) { + if (!this.$events) { + this.$events = {}; + } + + if (!this.$events[name]) { + this.$events[name] = fn; + } else if (io.util.isArray(this.$events[name])) { + this.$events[name].push(fn); + } else { + this.$events[name] = [this.$events[name], fn]; + } + + return this; + }; + + EventEmitter.prototype.addListener = EventEmitter.prototype.on; + + /** + * Adds a volatile listener. + * + * @api public + */ + + EventEmitter.prototype.once = function (name, fn) { + var self = this; + + function on () { + self.removeListener(name, on); + fn.apply(this, arguments); + }; + + on.listener = fn; + this.on(name, on); + + return this; + }; + + /** + * Removes a listener. + * + * @api public + */ + + EventEmitter.prototype.removeListener = function (name, fn) { + if (this.$events && this.$events[name]) { + var list = this.$events[name]; + + if (io.util.isArray(list)) { + var pos = -1; + + for (var i = 0, l = list.length; i < l; i++) { + if (list[i] === fn || (list[i].listener && list[i].listener === fn)) { + pos = i; + break; + } + } + + if (pos < 0) { + return this; + } + + list.splice(pos, 1); + + if (!list.length) { + delete this.$events[name]; + } + } else if (list === fn || (list.listener && list.listener === fn)) { + delete this.$events[name]; + } + } + + return this; + }; + + /** + * Removes all listeners for an event. + * + * @api public + */ + + EventEmitter.prototype.removeAllListeners = function (name) { + if (name === undefined) { + this.$events = {}; + return this; + } + + if (this.$events && this.$events[name]) { + this.$events[name] = null; + } + + return this; + }; + + /** + * Gets all listeners for a certain event. + * + * @api publci + */ + + EventEmitter.prototype.listeners = function (name) { + if (!this.$events) { + this.$events = {}; + } + + if (!this.$events[name]) { + this.$events[name] = []; + } + + if (!io.util.isArray(this.$events[name])) { + this.$events[name] = [this.$events[name]]; + } + + return this.$events[name]; + }; + + /** + * Emits an event. + * + * @api public + */ + + EventEmitter.prototype.emit = function (name) { + if (!this.$events) { + return false; + } + + var handler = this.$events[name]; + + if (!handler) { + return false; + } + + var args = Array.prototype.slice.call(arguments, 1); + + if ('function' == typeof handler) { + handler.apply(this, args); + } else if (io.util.isArray(handler)) { + var listeners = handler.slice(); + + for (var i = 0, l = listeners.length; i < l; i++) { + listeners[i].apply(this, args); + } + } else { + return false; + } + + return true; + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +/** + * Based on JSON2 (http://www.JSON.org/js.html). + */ + +(function (exports, nativeJSON) { + "use strict"; + + // use native JSON if it's available + if (nativeJSON && nativeJSON.parse){ + return exports.JSON = { + parse: nativeJSON.parse + , stringify: nativeJSON.stringify + }; + } + + var JSON = exports.JSON = {}; + + function f(n) { + // Format integers to have at least two digits. + return n < 10 ? '0' + n : n; + } + + function date(d, key) { + return isFinite(d.valueOf()) ? + d.getUTCFullYear() + '-' + + f(d.getUTCMonth() + 1) + '-' + + f(d.getUTCDate()) + 'T' + + f(d.getUTCHours()) + ':' + + f(d.getUTCMinutes()) + ':' + + f(d.getUTCSeconds()) + 'Z' : null; + }; + + var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + gap, + indent, + meta = { // table of character substitutions + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '\\': '\\\\' + }, + rep; + + + function quote(string) { + +// If the string contains no control characters, no quote characters, and no +// backslash characters, then we can safely slap some quotes around it. +// Otherwise we must also replace the offending characters with safe escape +// sequences. + + escapable.lastIndex = 0; + return escapable.test(string) ? '"' + string.replace(escapable, function (a) { + var c = meta[a]; + return typeof c === 'string' ? c : + '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }) + '"' : '"' + string + '"'; + } + + + function str(key, holder) { + +// Produce a string from holder[key]. + + var i, // The loop counter. + k, // The member key. + v, // The member value. + length, + mind = gap, + partial, + value = holder[key]; + +// If the value has a toJSON method, call it to obtain a replacement value. + + if (value instanceof Date) { + value = date(key); + } + +// If we were called with a replacer function, then call the replacer to +// obtain a replacement value. + + if (typeof rep === 'function') { + value = rep.call(holder, key, value); + } + +// What happens next depends on the value's type. + + switch (typeof value) { + case 'string': + return quote(value); + + case 'number': + +// JSON numbers must be finite. Encode non-finite numbers as null. + + return isFinite(value) ? String(value) : 'null'; + + case 'boolean': + case 'null': + +// If the value is a boolean or null, convert it to a string. Note: +// typeof null does not produce 'null'. The case is included here in +// the remote chance that this gets fixed someday. + + return String(value); + +// If the type is 'object', we might be dealing with an object or an array or +// null. + + case 'object': + +// Due to a specification blunder in ECMAScript, typeof null is 'object', +// so watch out for that case. + + if (!value) { + return 'null'; + } + +// Make an array to hold the partial results of stringifying this object value. + + gap += indent; + partial = []; + +// Is the value an array? + + if (Object.prototype.toString.apply(value) === '[object Array]') { + +// The value is an array. Stringify every element. Use null as a placeholder +// for non-JSON values. + + length = value.length; + for (i = 0; i < length; i += 1) { + partial[i] = str(i, value) || 'null'; + } + +// Join all of the elements together, separated with commas, and wrap them in +// brackets. + + v = partial.length === 0 ? '[]' : gap ? + '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : + '[' + partial.join(',') + ']'; + gap = mind; + return v; + } + +// If the replacer is an array, use it to select the members to be stringified. + + if (rep && typeof rep === 'object') { + length = rep.length; + for (i = 0; i < length; i += 1) { + if (typeof rep[i] === 'string') { + k = rep[i]; + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } else { + +// Otherwise, iterate through all of the keys in the object. + + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } + +// Join all of the member texts together, separated with commas, +// and wrap them in braces. + + v = partial.length === 0 ? '{}' : gap ? + '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : + '{' + partial.join(',') + '}'; + gap = mind; + return v; + } + } + +// If the JSON object does not yet have a stringify method, give it one. + + JSON.stringify = function (value, replacer, space) { + +// The stringify method takes a value and an optional replacer, and an optional +// space parameter, and returns a JSON text. The replacer can be a function +// that can replace values, or an array of strings that will select the keys. +// A default replacer method can be provided. Use of the space parameter can +// produce text that is more easily readable. + + var i; + gap = ''; + indent = ''; + +// If the space parameter is a number, make an indent string containing that +// many spaces. + + if (typeof space === 'number') { + for (i = 0; i < space; i += 1) { + indent += ' '; + } + +// If the space parameter is a string, it will be used as the indent string. + + } else if (typeof space === 'string') { + indent = space; + } + +// If there is a replacer, it must be a function or an array. +// Otherwise, throw an error. + + rep = replacer; + if (replacer && typeof replacer !== 'function' && + (typeof replacer !== 'object' || + typeof replacer.length !== 'number')) { + throw new Error('JSON.stringify'); + } + +// Make a fake root object containing our value under the key of ''. +// Return the result of stringifying the value. + + return str('', {'': value}); + }; + +// If the JSON object does not yet have a parse method, give it one. + + JSON.parse = function (text, reviver) { + // The parse method takes a text and an optional reviver function, and returns + // a JavaScript value if the text is a valid JSON text. + + var j; + + function walk(holder, key) { + + // The walk method is used to recursively walk the resulting structure so + // that modifications can be made. + + var k, v, value = holder[key]; + if (value && typeof value === 'object') { + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = walk(value, k); + if (v !== undefined) { + value[k] = v; + } else { + delete value[k]; + } + } + } + } + return reviver.call(holder, key, value); + } + + + // Parsing happens in four stages. In the first stage, we replace certain + // Unicode characters with escape sequences. JavaScript handles many characters + // incorrectly, either silently deleting them, or treating them as line endings. + + text = String(text); + cx.lastIndex = 0; + if (cx.test(text)) { + text = text.replace(cx, function (a) { + return '\\u' + + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }); + } + + // In the second stage, we run the text against regular expressions that look + // for non-JSON patterns. We are especially concerned with '()' and 'new' + // because they can cause invocation, and '=' because it can cause mutation. + // But just to be safe, we want to reject all unexpected forms. + + // We split the second stage into 4 regexp operations in order to work around + // crippling inefficiencies in IE's and Safari's regexp engines. First we + // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we + // replace all simple value tokens with ']' characters. Third, we delete all + // open brackets that follow a colon or comma or that begin the text. Finally, + // we look to see that the remaining characters are only whitespace or ']' or + // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. + + if (/^[\],:{}\s]*$/ + .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') + .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') + .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { + + // In the third stage we use the eval function to compile the text into a + // JavaScript structure. The '{' operator is subject to a syntactic ambiguity + // in JavaScript: it can begin a block or an object literal. We wrap the text + // in parens to eliminate the ambiguity. + + j = eval('(' + text + ')'); + + // In the optional fourth stage, we recursively walk the new structure, passing + // each name/value pair to a reviver function for possible transformation. + + return typeof reviver === 'function' ? + walk({'': j}, '') : j; + } + + // If the text is not JSON parseable, then a SyntaxError is thrown. + + throw new SyntaxError('JSON.parse'); + }; + +})( + 'undefined' != typeof io ? io : module.exports + , typeof JSON !== 'undefined' ? JSON : undefined +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Parser namespace. + * + * @namespace + */ + + var parser = exports.parser = {}; + + /** + * Packet types. + */ + + var packets = parser.packets = [ + 'disconnect' + , 'connect' + , 'heartbeat' + , 'message' + , 'json' + , 'event' + , 'ack' + , 'error' + , 'noop' + ]; + + /** + * Errors reasons. + */ + + var reasons = parser.reasons = [ + 'transport not supported' + , 'client not handshaken' + , 'unauthorized' + ]; + + /** + * Errors advice. + */ + + var advice = parser.advice = [ + 'reconnect' + ]; + + /** + * Shortcuts. + */ + + var JSON = io.JSON + , indexOf = io.util.indexOf; + + /** + * Encodes a packet. + * + * @api private + */ + + parser.encodePacket = function (packet) { + var type = indexOf(packets, packet.type) + , id = packet.id || '' + , endpoint = packet.endpoint || '' + , ack = packet.ack + , data = null; + + switch (packet.type) { + case 'error': + var reason = packet.reason ? indexOf(reasons, packet.reason) : '' + , adv = packet.advice ? indexOf(advice, packet.advice) : ''; + + if (reason !== '' || adv !== '') + data = reason + (adv !== '' ? ('+' + adv) : ''); + + break; + + case 'message': + if (packet.data !== '') + data = packet.data; + break; + + case 'event': + var ev = { name: packet.name }; + + if (packet.args && packet.args.length) { + ev.args = packet.args; + } + + data = JSON.stringify(ev); + break; + + case 'json': + data = JSON.stringify(packet.data); + break; + + case 'connect': + if (packet.qs) + data = packet.qs; + break; + + case 'ack': + data = packet.ackId + + (packet.args && packet.args.length + ? '+' + JSON.stringify(packet.args) : ''); + break; + } + + // construct packet with required fragments + var encoded = [ + type + , id + (ack == 'data' ? '+' : '') + , endpoint + ]; + + // data fragment is optional + if (data !== null && data !== undefined) + encoded.push(data); + + return encoded.join(':'); + }; + + /** + * Encodes multiple messages (payload). + * + * @param {Array} messages + * @api private + */ + + parser.encodePayload = function (packets) { + var decoded = ''; + + if (packets.length == 1) + return packets[0]; + + for (var i = 0, l = packets.length; i < l; i++) { + var packet = packets[i]; + decoded += '\ufffd' + packet.length + '\ufffd' + packets[i]; + } + + return decoded; + }; + + /** + * Decodes a packet + * + * @api private + */ + + var regexp = /([^:]+):([0-9]+)?(\+)?:([^:]+)?:?([\s\S]*)?/; + + parser.decodePacket = function (data) { + var pieces = data.match(regexp); + + if (!pieces) return {}; + + var id = pieces[2] || '' + , data = pieces[5] || '' + , packet = { + type: packets[pieces[1]] + , endpoint: pieces[4] || '' + }; + + // whether we need to acknowledge the packet + if (id) { + packet.id = id; + if (pieces[3]) + packet.ack = 'data'; + else + packet.ack = true; + } + + // handle different packet types + switch (packet.type) { + case 'error': + var pieces = data.split('+'); + packet.reason = reasons[pieces[0]] || ''; + packet.advice = advice[pieces[1]] || ''; + break; + + case 'message': + packet.data = data || ''; + break; + + case 'event': + try { + var opts = JSON.parse(data); + packet.name = opts.name; + packet.args = opts.args; + } catch (e) { } + + packet.args = packet.args || []; + break; + + case 'json': + try { + packet.data = JSON.parse(data); + } catch (e) { } + break; + + case 'connect': + packet.qs = data || ''; + break; + + case 'ack': + var pieces = data.match(/^([0-9]+)(\+)?(.*)/); + if (pieces) { + packet.ackId = pieces[1]; + packet.args = []; + + if (pieces[3]) { + try { + packet.args = pieces[3] ? JSON.parse(pieces[3]) : []; + } catch (e) { } + } + } + break; + + case 'disconnect': + case 'heartbeat': + break; + }; + + return packet; + }; + + /** + * Decodes data payload. Detects multiple messages + * + * @return {Array} messages + * @api public + */ + + parser.decodePayload = function (data) { + // IE doesn't like data[i] for unicode chars, charAt works fine + if (data.charAt(0) == '\ufffd') { + var ret = []; + + for (var i = 1, length = ''; i < data.length; i++) { + if (data.charAt(i) == '\ufffd') { + ret.push(parser.decodePacket(data.substr(i + 1).substr(0, length))); + i += Number(length) + 1; + length = ''; + } else { + length += data.charAt(i); + } + } + + return ret; + } else { + return [parser.decodePacket(data)]; + } + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.Transport = Transport; + + /** + * This is the transport template for all supported transport methods. + * + * @constructor + * @api public + */ + + function Transport (socket, sessid) { + this.socket = socket; + this.sessid = sessid; + }; + + /** + * Apply EventEmitter mixin. + */ + + io.util.mixin(Transport, io.EventEmitter); + + + /** + * Indicates whether heartbeats is enabled for this transport + * + * @api private + */ + + Transport.prototype.heartbeats = function () { + return true; + }; + + /** + * Handles the response from the server. When a new response is received + * it will automatically update the timeout, decode the message and + * forwards the response to the onMessage function for further processing. + * + * @param {String} data Response from the server. + * @api private + */ + + Transport.prototype.onData = function (data) { + this.clearCloseTimeout(); + + // If the connection in currently open (or in a reopening state) reset the close + // timeout since we have just received data. This check is necessary so + // that we don't reset the timeout on an explicitly disconnected connection. + if (this.socket.connected || this.socket.connecting || this.socket.reconnecting) { + this.setCloseTimeout(); + } + + if (data !== '') { + // todo: we should only do decodePayload for xhr transports + var msgs = io.parser.decodePayload(data); + + if (msgs && msgs.length) { + for (var i = 0, l = msgs.length; i < l; i++) { + this.onPacket(msgs[i]); + } + } + } + + return this; + }; + + /** + * Handles packets. + * + * @api private + */ + + Transport.prototype.onPacket = function (packet) { + this.socket.setHeartbeatTimeout(); + + if (packet.type == 'heartbeat') { + return this.onHeartbeat(); + } + + if (packet.type == 'connect' && packet.endpoint == '') { + this.onConnect(); + } + + if (packet.type == 'error' && packet.advice == 'reconnect') { + this.isOpen = false; + } + + this.socket.onPacket(packet); + + return this; + }; + + /** + * Sets close timeout + * + * @api private + */ + + Transport.prototype.setCloseTimeout = function () { + if (!this.closeTimeout) { + var self = this; + + this.closeTimeout = setTimeout(function () { + self.onDisconnect(); + }, this.socket.closeTimeout); + } + }; + + /** + * Called when transport disconnects. + * + * @api private + */ + + Transport.prototype.onDisconnect = function () { + if (this.isOpen) this.close(); + this.clearTimeouts(); + this.socket.onDisconnect(); + return this; + }; + + /** + * Called when transport connects + * + * @api private + */ + + Transport.prototype.onConnect = function () { + this.socket.onConnect(); + return this; + }; + + /** + * Clears close timeout + * + * @api private + */ + + Transport.prototype.clearCloseTimeout = function () { + if (this.closeTimeout) { + clearTimeout(this.closeTimeout); + this.closeTimeout = null; + } + }; + + /** + * Clear timeouts + * + * @api private + */ + + Transport.prototype.clearTimeouts = function () { + this.clearCloseTimeout(); + + if (this.reopenTimeout) { + clearTimeout(this.reopenTimeout); + } + }; + + /** + * Sends a packet + * + * @param {Object} packet object. + * @api private + */ + + Transport.prototype.packet = function (packet) { + this.send(io.parser.encodePacket(packet)); + }; + + /** + * Send the received heartbeat message back to server. So the server + * knows we are still connected. + * + * @param {String} heartbeat Heartbeat response from the server. + * @api private + */ + + Transport.prototype.onHeartbeat = function (heartbeat) { + this.packet({ type: 'heartbeat' }); + }; + + /** + * Called when the transport opens. + * + * @api private + */ + + Transport.prototype.onOpen = function () { + this.isOpen = true; + this.clearCloseTimeout(); + this.socket.onOpen(); + }; + + /** + * Notifies the base when the connection with the Socket.IO server + * has been disconnected. + * + * @api private + */ + + Transport.prototype.onClose = function () { + var self = this; + + /* FIXME: reopen delay causing a infinit loop + this.reopenTimeout = setTimeout(function () { + self.open(); + }, this.socket.options['reopen delay']);*/ + + this.isOpen = false; + this.socket.onClose(); + this.onDisconnect(); + }; + + /** + * Generates a connection url based on the Socket.IO URL Protocol. + * See for more details. + * + * @returns {String} Connection url + * @api private + */ + + Transport.prototype.prepareUrl = function () { + var options = this.socket.options; + + return this.scheme() + '://' + + options.host + ':' + options.port + '/' + + options.resource + '/' + io.protocol + + '/' + this.name + '/' + this.sessid; + }; + + /** + * Checks if the transport is ready to start a connection. + * + * @param {Socket} socket The socket instance that needs a transport + * @param {Function} fn The callback + * @api private + */ + + Transport.prototype.ready = function (socket, fn) { + fn.call(this); + }; +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + */ + + exports.Socket = Socket; + + /** + * Create a new `Socket.IO client` which can establish a persistent + * connection with a Socket.IO enabled server. + * + * @api public + */ + + function Socket (options) { + this.options = { + port: 80 + , secure: false + , document: 'document' in global ? document : false + , resource: 'socket.io' + , transports: io.transports + , 'connect timeout': 10000 + , 'try multiple transports': true + , 'reconnect': true + , 'reconnection delay': 500 + , 'reconnection limit': Infinity + , 'reopen delay': 3000 + , 'max reconnection attempts': 10 + , 'sync disconnect on unload': false + , 'auto connect': true + , 'flash policy port': 10843 + , 'manualFlush': false + }; + + io.util.merge(this.options, options); + + this.connected = false; + this.open = false; + this.connecting = false; + this.reconnecting = false; + this.namespaces = {}; + this.buffer = []; + this.doBuffer = false; + + if (this.options['sync disconnect on unload'] && + (!this.isXDomain() || io.util.ua.hasCORS)) { + var self = this; + io.util.on(global, 'beforeunload', function () { + self.disconnectSync(); + }, false); + } + + if (this.options['auto connect']) { + this.connect(); + } +}; + + /** + * Apply EventEmitter mixin. + */ + + io.util.mixin(Socket, io.EventEmitter); + + /** + * Returns a namespace listener/emitter for this socket + * + * @api public + */ + + Socket.prototype.of = function (name) { + if (!this.namespaces[name]) { + this.namespaces[name] = new io.SocketNamespace(this, name); + + if (name !== '') { + this.namespaces[name].packet({ type: 'connect' }); + } + } + + return this.namespaces[name]; + }; + + /** + * Emits the given event to the Socket and all namespaces + * + * @api private + */ + + Socket.prototype.publish = function () { + this.emit.apply(this, arguments); + + var nsp; + + for (var i in this.namespaces) { + if (this.namespaces.hasOwnProperty(i)) { + nsp = this.of(i); + nsp.$emit.apply(nsp, arguments); + } + } + }; + + /** + * Performs the handshake + * + * @api private + */ + + function empty () { }; + + Socket.prototype.handshake = function (fn) { + var self = this + , options = this.options; + + function complete (data) { + if (data instanceof Error) { + self.connecting = false; + self.onError(data.message); + } else { + fn.apply(null, data.split(':')); + } + }; + + var url = [ + 'http' + (options.secure ? 's' : '') + ':/' + , options.host + ':' + options.port + , options.resource + , io.protocol + , io.util.query(this.options.query, 't=' + +new Date) + ].join('/'); + + if (this.isXDomain() && !io.util.ua.hasCORS) { + var insertAt = document.getElementsByTagName('script')[0] + , script = document.createElement('script'); + + script.src = url + '&jsonp=' + io.j.length; + insertAt.parentNode.insertBefore(script, insertAt); + + io.j.push(function (data) { + complete(data); + script.parentNode.removeChild(script); + }); + } else { + var xhr = io.util.request(); + + xhr.open('GET', url, true); + if (this.isXDomain()) { + xhr.withCredentials = true; + } + xhr.onreadystatechange = function () { + if (xhr.readyState == 4) { + xhr.onreadystatechange = empty; + + if (xhr.status == 200) { + complete(xhr.responseText); + } else if (xhr.status == 403) { + self.onError(xhr.responseText); + } else { + self.connecting = false; + !self.reconnecting && self.onError(xhr.responseText); + } + } + }; + xhr.send(null); + } + }; + + /** + * Find an available transport based on the options supplied in the constructor. + * + * @api private + */ + + Socket.prototype.getTransport = function (override) { + var transports = override || this.transports, match; + + for (var i = 0, transport; transport = transports[i]; i++) { + if (io.Transport[transport] + && io.Transport[transport].check(this) + && (!this.isXDomain() || io.Transport[transport].xdomainCheck(this))) { + return new io.Transport[transport](this, this.sessionid); + } + } + + return null; + }; + + /** + * Connects to the server. + * + * @param {Function} [fn] Callback. + * @returns {io.Socket} + * @api public + */ + + Socket.prototype.connect = function (fn) { + if (this.connecting) { + return this; + } + + var self = this; + self.connecting = true; + + this.handshake(function (sid, heartbeat, close, transports) { + self.sessionid = sid; + self.closeTimeout = close * 1000; + self.heartbeatTimeout = heartbeat * 1000; + if(!self.transports) + self.transports = self.origTransports = (transports ? io.util.intersect( + transports.split(',') + , self.options.transports + ) : self.options.transports); + + self.setHeartbeatTimeout(); + + function connect (transports){ + if (self.transport) self.transport.clearTimeouts(); + + self.transport = self.getTransport(transports); + if (!self.transport) return self.publish('connect_failed'); + + // once the transport is ready + self.transport.ready(self, function () { + self.connecting = true; + self.publish('connecting', self.transport.name); + self.transport.open(); + + if (self.options['connect timeout']) { + self.connectTimeoutTimer = setTimeout(function () { + if (!self.connected) { + self.connecting = false; + + if (self.options['try multiple transports']) { + var remaining = self.transports; + + while (remaining.length > 0 && remaining.splice(0,1)[0] != + self.transport.name) {} + + if (remaining.length){ + connect(remaining); + } else { + self.publish('connect_failed'); + } + } + } + }, self.options['connect timeout']); + } + }); + } + + connect(self.transports); + + self.once('connect', function (){ + clearTimeout(self.connectTimeoutTimer); + + fn && typeof fn == 'function' && fn(); + }); + }); + + return this; + }; + + /** + * Clears and sets a new heartbeat timeout using the value given by the + * server during the handshake. + * + * @api private + */ + + Socket.prototype.setHeartbeatTimeout = function () { + clearTimeout(this.heartbeatTimeoutTimer); + if(this.transport && !this.transport.heartbeats()) return; + + var self = this; + this.heartbeatTimeoutTimer = setTimeout(function () { + self.transport.onClose(); + }, this.heartbeatTimeout); + }; + + /** + * Sends a message. + * + * @param {Object} data packet. + * @returns {io.Socket} + * @api public + */ + + Socket.prototype.packet = function (data) { + if (this.connected && !this.doBuffer) { + this.transport.packet(data); + } else { + this.buffer.push(data); + } + + return this; + }; + + /** + * Sets buffer state + * + * @api private + */ + + Socket.prototype.setBuffer = function (v) { + this.doBuffer = v; + + if (!v && this.connected && this.buffer.length) { + if (!this.options['manualFlush']) { + this.flushBuffer(); + } + } + }; + + /** + * Flushes the buffer data over the wire. + * To be invoked manually when 'manualFlush' is set to true. + * + * @api public + */ + + Socket.prototype.flushBuffer = function() { + this.transport.payload(this.buffer); + this.buffer = []; + }; + + + /** + * Disconnect the established connect. + * + * @returns {io.Socket} + * @api public + */ + + Socket.prototype.disconnect = function () { + if (this.connected || this.connecting) { + if (this.open) { + this.of('').packet({ type: 'disconnect' }); + } + + // handle disconnection immediately + this.onDisconnect('booted'); + } + + return this; + }; + + /** + * Disconnects the socket with a sync XHR. + * + * @api private + */ + + Socket.prototype.disconnectSync = function () { + // ensure disconnection + var xhr = io.util.request(); + var uri = [ + 'http' + (this.options.secure ? 's' : '') + ':/' + , this.options.host + ':' + this.options.port + , this.options.resource + , io.protocol + , '' + , this.sessionid + ].join('/') + '/?disconnect=1'; + + xhr.open('GET', uri, false); + xhr.send(null); + + // handle disconnection immediately + this.onDisconnect('booted'); + }; + + /** + * Check if we need to use cross domain enabled transports. Cross domain would + * be a different port or different domain name. + * + * @returns {Boolean} + * @api private + */ + + Socket.prototype.isXDomain = function () { + + var port = global.location.port || + ('https:' == global.location.protocol ? 443 : 80); + + return this.options.host !== global.location.hostname + || this.options.port != port; + }; + + /** + * Called upon handshake. + * + * @api private + */ + + Socket.prototype.onConnect = function () { + if (!this.connected) { + this.connected = true; + this.connecting = false; + if (!this.doBuffer) { + // make sure to flush the buffer + this.setBuffer(false); + } + this.emit('connect'); + } + }; + + /** + * Called when the transport opens + * + * @api private + */ + + Socket.prototype.onOpen = function () { + this.open = true; + }; + + /** + * Called when the transport closes. + * + * @api private + */ + + Socket.prototype.onClose = function () { + this.open = false; + clearTimeout(this.heartbeatTimeoutTimer); + }; + + /** + * Called when the transport first opens a connection + * + * @param text + */ + + Socket.prototype.onPacket = function (packet) { + this.of(packet.endpoint).onPacket(packet); + }; + + /** + * Handles an error. + * + * @api private + */ + + Socket.prototype.onError = function (err) { + if (err && err.advice) { + if (err.advice === 'reconnect' && (this.connected || this.connecting)) { + this.disconnect(); + if (this.options.reconnect) { + this.reconnect(); + } + } + } + + this.publish('error', err && err.reason ? err.reason : err); + }; + + /** + * Called when the transport disconnects. + * + * @api private + */ + + Socket.prototype.onDisconnect = function (reason) { + var wasConnected = this.connected + , wasConnecting = this.connecting; + + this.connected = false; + this.connecting = false; + this.open = false; + + if (wasConnected || wasConnecting) { + this.transport.close(); + this.transport.clearTimeouts(); + if (wasConnected) { + this.publish('disconnect', reason); + + if ('booted' != reason && this.options.reconnect && !this.reconnecting) { + this.reconnect(); + } + } + } + }; + + /** + * Called upon reconnection. + * + * @api private + */ + + Socket.prototype.reconnect = function () { + this.reconnecting = true; + this.reconnectionAttempts = 0; + this.reconnectionDelay = this.options['reconnection delay']; + + var self = this + , maxAttempts = this.options['max reconnection attempts'] + , tryMultiple = this.options['try multiple transports'] + , limit = this.options['reconnection limit']; + + function reset () { + if (self.connected) { + for (var i in self.namespaces) { + if (self.namespaces.hasOwnProperty(i) && '' !== i) { + self.namespaces[i].packet({ type: 'connect' }); + } + } + self.publish('reconnect', self.transport.name, self.reconnectionAttempts); + } + + clearTimeout(self.reconnectionTimer); + + self.removeListener('connect_failed', maybeReconnect); + self.removeListener('connect', maybeReconnect); + + self.reconnecting = false; + + delete self.reconnectionAttempts; + delete self.reconnectionDelay; + delete self.reconnectionTimer; + delete self.redoTransports; + + self.options['try multiple transports'] = tryMultiple; + }; + + function maybeReconnect () { + if (!self.reconnecting) { + return; + } + + if (self.connected) { + return reset(); + }; + + if (self.connecting && self.reconnecting) { + return self.reconnectionTimer = setTimeout(maybeReconnect, 1000); + } + + if (self.reconnectionAttempts++ >= maxAttempts) { + if (!self.redoTransports) { + self.on('connect_failed', maybeReconnect); + self.options['try multiple transports'] = true; + self.transports = self.origTransports; + self.transport = self.getTransport(); + self.redoTransports = true; + self.connect(); + } else { + self.publish('reconnect_failed'); + reset(); + } + } else { + if (self.reconnectionDelay < limit) { + self.reconnectionDelay *= 2; // exponential back off + } + + self.connect(); + self.publish('reconnecting', self.reconnectionDelay, self.reconnectionAttempts); + self.reconnectionTimer = setTimeout(maybeReconnect, self.reconnectionDelay); + } + }; + + this.options['try multiple transports'] = false; + this.reconnectionTimer = setTimeout(maybeReconnect, this.reconnectionDelay); + + this.on('connect', maybeReconnect); + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.SocketNamespace = SocketNamespace; + + /** + * Socket namespace constructor. + * + * @constructor + * @api public + */ + + function SocketNamespace (socket, name) { + this.socket = socket; + this.name = name || ''; + this.flags = {}; + this.json = new Flag(this, 'json'); + this.ackPackets = 0; + this.acks = {}; + }; + + /** + * Apply EventEmitter mixin. + */ + + io.util.mixin(SocketNamespace, io.EventEmitter); + + /** + * Copies emit since we override it + * + * @api private + */ + + SocketNamespace.prototype.$emit = io.EventEmitter.prototype.emit; + + /** + * Creates a new namespace, by proxying the request to the socket. This + * allows us to use the synax as we do on the server. + * + * @api public + */ + + SocketNamespace.prototype.of = function () { + return this.socket.of.apply(this.socket, arguments); + }; + + /** + * Sends a packet. + * + * @api private + */ + + SocketNamespace.prototype.packet = function (packet) { + packet.endpoint = this.name; + this.socket.packet(packet); + this.flags = {}; + return this; + }; + + /** + * Sends a message + * + * @api public + */ + + SocketNamespace.prototype.send = function (data, fn) { + var packet = { + type: this.flags.json ? 'json' : 'message' + , data: data + }; + + if ('function' == typeof fn) { + packet.id = ++this.ackPackets; + packet.ack = true; + this.acks[packet.id] = fn; + } + + return this.packet(packet); + }; + + /** + * Emits an event + * + * @api public + */ + + SocketNamespace.prototype.emit = function (name) { + var args = Array.prototype.slice.call(arguments, 1) + , lastArg = args[args.length - 1] + , packet = { + type: 'event' + , name: name + }; + + if ('function' == typeof lastArg) { + packet.id = ++this.ackPackets; + packet.ack = 'data'; + this.acks[packet.id] = lastArg; + args = args.slice(0, args.length - 1); + } + + packet.args = args; + + return this.packet(packet); + }; + + /** + * Disconnects the namespace + * + * @api private + */ + + SocketNamespace.prototype.disconnect = function () { + if (this.name === '') { + this.socket.disconnect(); + } else { + this.packet({ type: 'disconnect' }); + this.$emit('disconnect'); + } + + return this; + }; + + /** + * Handles a packet + * + * @api private + */ + + SocketNamespace.prototype.onPacket = function (packet) { + var self = this; + + function ack () { + self.packet({ + type: 'ack' + , args: io.util.toArray(arguments) + , ackId: packet.id + }); + }; + + switch (packet.type) { + case 'connect': + this.$emit('connect'); + break; + + case 'disconnect': + if (this.name === '') { + this.socket.onDisconnect(packet.reason || 'booted'); + } else { + this.$emit('disconnect', packet.reason); + } + break; + + case 'message': + case 'json': + var params = ['message', packet.data]; + + if (packet.ack == 'data') { + params.push(ack); + } else if (packet.ack) { + this.packet({ type: 'ack', ackId: packet.id }); + } + + this.$emit.apply(this, params); + break; + + case 'event': + var params = [packet.name].concat(packet.args); + + if (packet.ack == 'data') + params.push(ack); + + this.$emit.apply(this, params); + break; + + case 'ack': + if (this.acks[packet.ackId]) { + this.acks[packet.ackId].apply(this, packet.args); + delete this.acks[packet.ackId]; + } + break; + + case 'error': + if (packet.advice){ + this.socket.onError(packet); + } else { + if (packet.reason == 'unauthorized') { + this.$emit('connect_failed', packet.reason); + } else { + this.$emit('error', packet.reason); + } + } + break; + } + }; + + /** + * Flag interface. + * + * @api private + */ + + function Flag (nsp, name) { + this.namespace = nsp; + this.name = name; + }; + + /** + * Send a message + * + * @api public + */ + + Flag.prototype.send = function () { + this.namespace.flags[this.name] = true; + this.namespace.send.apply(this.namespace, arguments); + }; + + /** + * Emit an event + * + * @api public + */ + + Flag.prototype.emit = function () { + this.namespace.flags[this.name] = true; + this.namespace.emit.apply(this.namespace, arguments); + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + */ + + exports.websocket = WS; + + /** + * The WebSocket transport uses the HTML5 WebSocket API to establish an + * persistent connection with the Socket.IO server. This transport will also + * be inherited by the FlashSocket fallback as it provides a API compatible + * polyfill for the WebSockets. + * + * @constructor + * @extends {io.Transport} + * @api public + */ + + function WS (socket) { + io.Transport.apply(this, arguments); + }; + + /** + * Inherits from Transport. + */ + + io.util.inherit(WS, io.Transport); + + /** + * Transport name + * + * @api public + */ + + WS.prototype.name = 'websocket'; + + /** + * Initializes a new `WebSocket` connection with the Socket.IO server. We attach + * all the appropriate listeners to handle the responses from the server. + * + * @returns {Transport} + * @api public + */ + + WS.prototype.open = function () { + var query = io.util.query(this.socket.options.query) + , self = this + , Socket + + + if (!Socket) { + Socket = global.MozWebSocket || global.WebSocket; + } + + this.websocket = new Socket(this.prepareUrl() + query); + + this.websocket.onopen = function () { + self.onOpen(); + self.socket.setBuffer(false); + }; + this.websocket.onmessage = function (ev) { + self.onData(ev.data); + }; + this.websocket.onclose = function () { + self.onClose(); + self.socket.setBuffer(true); + }; + this.websocket.onerror = function (e) { + self.onError(e); + }; + + return this; + }; + + /** + * Send a message to the Socket.IO server. The message will automatically be + * encoded in the correct message format. + * + * @returns {Transport} + * @api public + */ + + // Do to a bug in the current IDevices browser, we need to wrap the send in a + // setTimeout, when they resume from sleeping the browser will crash if + // we don't allow the browser time to detect the socket has been closed + if (io.util.ua.iDevice) { + WS.prototype.send = function (data) { + var self = this; + setTimeout(function() { + self.websocket.send(data); + },0); + return this; + }; + } else { + WS.prototype.send = function (data) { + this.websocket.send(data); + return this; + }; + } + + /** + * Payload + * + * @api private + */ + + WS.prototype.payload = function (arr) { + for (var i = 0, l = arr.length; i < l; i++) { + this.packet(arr[i]); + } + return this; + }; + + /** + * Disconnect the established `WebSocket` connection. + * + * @returns {Transport} + * @api public + */ + + WS.prototype.close = function () { + this.websocket.close(); + return this; + }; + + /** + * Handle the errors that `WebSocket` might be giving when we + * are attempting to connect or send messages. + * + * @param {Error} e The error. + * @api private + */ + + WS.prototype.onError = function (e) { + this.socket.onError(e); + }; + + /** + * Returns the appropriate scheme for the URI generation. + * + * @api private + */ + WS.prototype.scheme = function () { + return this.socket.options.secure ? 'wss' : 'ws'; + }; + + /** + * Checks if the browser has support for native `WebSockets` and that + * it's not the polyfill created for the FlashSocket transport. + * + * @return {Boolean} + * @api public + */ + + WS.check = function () { + return ('WebSocket' in global && !('__addTask' in WebSocket)) + || 'MozWebSocket' in global; + }; + + /** + * Check if the `WebSocket` transport support cross domain communications. + * + * @returns {Boolean} + * @api public + */ + + WS.xdomainCheck = function () { + return true; + }; + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('websocket'); + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.flashsocket = Flashsocket; + + /** + * The FlashSocket transport. This is a API wrapper for the HTML5 WebSocket + * specification. It uses a .swf file to communicate with the server. If you want + * to serve the .swf file from a other server than where the Socket.IO script is + * coming from you need to use the insecure version of the .swf. More information + * about this can be found on the github page. + * + * @constructor + * @extends {io.Transport.websocket} + * @api public + */ + + function Flashsocket () { + io.Transport.websocket.apply(this, arguments); + }; + + /** + * Inherits from Transport. + */ + + io.util.inherit(Flashsocket, io.Transport.websocket); + + /** + * Transport name + * + * @api public + */ + + Flashsocket.prototype.name = 'flashsocket'; + + /** + * Disconnect the established `FlashSocket` connection. This is done by adding a + * new task to the FlashSocket. The rest will be handled off by the `WebSocket` + * transport. + * + * @returns {Transport} + * @api public + */ + + Flashsocket.prototype.open = function () { + var self = this + , args = arguments; + + WebSocket.__addTask(function () { + io.Transport.websocket.prototype.open.apply(self, args); + }); + return this; + }; + + /** + * Sends a message to the Socket.IO server. This is done by adding a new + * task to the FlashSocket. The rest will be handled off by the `WebSocket` + * transport. + * + * @returns {Transport} + * @api public + */ + + Flashsocket.prototype.send = function () { + var self = this, args = arguments; + WebSocket.__addTask(function () { + io.Transport.websocket.prototype.send.apply(self, args); + }); + return this; + }; + + /** + * Disconnects the established `FlashSocket` connection. + * + * @returns {Transport} + * @api public + */ + + Flashsocket.prototype.close = function () { + WebSocket.__tasks.length = 0; + io.Transport.websocket.prototype.close.call(this); + return this; + }; + + /** + * The WebSocket fall back needs to append the flash container to the body + * element, so we need to make sure we have access to it. Or defer the call + * until we are sure there is a body element. + * + * @param {Socket} socket The socket instance that needs a transport + * @param {Function} fn The callback + * @api private + */ + + Flashsocket.prototype.ready = function (socket, fn) { + function init () { + var options = socket.options + , port = options['flash policy port'] + , path = [ + 'http' + (options.secure ? 's' : '') + ':/' + , options.host + ':' + options.port + , options.resource + , 'static/flashsocket' + , 'WebSocketMain' + (socket.isXDomain() ? 'Insecure' : '') + '.swf' + ]; + + // Only start downloading the swf file when the checked that this browser + // actually supports it + if (!Flashsocket.loaded) { + if (typeof WEB_SOCKET_SWF_LOCATION === 'undefined') { + // Set the correct file based on the XDomain settings + WEB_SOCKET_SWF_LOCATION = path.join('/'); + } + + if (port !== 843) { + WebSocket.loadFlashPolicyFile('xmlsocket://' + options.host + ':' + port); + } + + WebSocket.__initialize(); + Flashsocket.loaded = true; + } + + fn.call(self); + } + + var self = this; + if (document.body) return init(); + + io.util.load(init); + }; + + /** + * Check if the FlashSocket transport is supported as it requires that the Adobe + * Flash Player plug-in version `10.0.0` or greater is installed. And also check if + * the polyfill is correctly loaded. + * + * @returns {Boolean} + * @api public + */ + + Flashsocket.check = function () { + if ( + typeof WebSocket == 'undefined' + || !('__initialize' in WebSocket) || !swfobject + ) return false; + + return swfobject.getFlashPlayerVersion().major >= 10; + }; + + /** + * Check if the FlashSocket transport can be used as cross domain / cross origin + * transport. Because we can't see which type (secure or insecure) of .swf is used + * we will just return true. + * + * @returns {Boolean} + * @api public + */ + + Flashsocket.xdomainCheck = function () { + return true; + }; + + /** + * Disable AUTO_INITIALIZATION + */ + + if (typeof window != 'undefined') { + WEB_SOCKET_DISABLE_AUTO_INITIALIZATION = true; + } + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('flashsocket'); +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); +/* SWFObject v2.2 + is released under the MIT License +*/ +if ('undefined' != typeof window) { +var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O[(['Active'].concat('Object').join('X'))]!=D){try{var ad=new window[(['Active'].concat('Object').join('X'))](W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y0){for(var af=0;af0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad'}}aa.outerHTML='"+af+"";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab +// License: New BSD License +// Reference: http://dev.w3.org/html5/websockets/ +// Reference: http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol + +(function() { + + if ('undefined' == typeof window || window.WebSocket) return; + + var console = window.console; + if (!console || !console.log || !console.error) { + console = {log: function(){ }, error: function(){ }}; + } + + if (!swfobject.hasFlashPlayerVersion("10.0.0")) { + console.error("Flash Player >= 10.0.0 is required."); + return; + } + if (location.protocol == "file:") { + console.error( + "WARNING: web-socket-js doesn't work in file:///... URL " + + "unless you set Flash Security Settings properly. " + + "Open the page via Web server i.e. http://..."); + } + + /** + * This class represents a faux web socket. + * @param {string} url + * @param {array or string} protocols + * @param {string} proxyHost + * @param {int} proxyPort + * @param {string} headers + */ + WebSocket = function(url, protocols, proxyHost, proxyPort, headers) { + var self = this; + self.__id = WebSocket.__nextId++; + WebSocket.__instances[self.__id] = self; + self.readyState = WebSocket.CONNECTING; + self.bufferedAmount = 0; + self.__events = {}; + if (!protocols) { + protocols = []; + } else if (typeof protocols == "string") { + protocols = [protocols]; + } + // Uses setTimeout() to make sure __createFlash() runs after the caller sets ws.onopen etc. + // Otherwise, when onopen fires immediately, onopen is called before it is set. + setTimeout(function() { + WebSocket.__addTask(function() { + WebSocket.__flash.create( + self.__id, url, protocols, proxyHost || null, proxyPort || 0, headers || null); + }); + }, 0); + }; + + /** + * Send data to the web socket. + * @param {string} data The data to send to the socket. + * @return {boolean} True for success, false for failure. + */ + WebSocket.prototype.send = function(data) { + if (this.readyState == WebSocket.CONNECTING) { + throw "INVALID_STATE_ERR: Web Socket connection has not been established"; + } + // We use encodeURIComponent() here, because FABridge doesn't work if + // the argument includes some characters. We don't use escape() here + // because of this: + // https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Functions#escape_and_unescape_Functions + // But it looks decodeURIComponent(encodeURIComponent(s)) doesn't + // preserve all Unicode characters either e.g. "\uffff" in Firefox. + // Note by wtritch: Hopefully this will not be necessary using ExternalInterface. Will require + // additional testing. + var result = WebSocket.__flash.send(this.__id, encodeURIComponent(data)); + if (result < 0) { // success + return true; + } else { + this.bufferedAmount += result; + return false; + } + }; + + /** + * Close this web socket gracefully. + */ + WebSocket.prototype.close = function() { + if (this.readyState == WebSocket.CLOSED || this.readyState == WebSocket.CLOSING) { + return; + } + this.readyState = WebSocket.CLOSING; + WebSocket.__flash.close(this.__id); + }; + + /** + * Implementation of {@link DOM 2 EventTarget Interface} + * + * @param {string} type + * @param {function} listener + * @param {boolean} useCapture + * @return void + */ + WebSocket.prototype.addEventListener = function(type, listener, useCapture) { + if (!(type in this.__events)) { + this.__events[type] = []; + } + this.__events[type].push(listener); + }; + + /** + * Implementation of {@link DOM 2 EventTarget Interface} + * + * @param {string} type + * @param {function} listener + * @param {boolean} useCapture + * @return void + */ + WebSocket.prototype.removeEventListener = function(type, listener, useCapture) { + if (!(type in this.__events)) return; + var events = this.__events[type]; + for (var i = events.length - 1; i >= 0; --i) { + if (events[i] === listener) { + events.splice(i, 1); + break; + } + } + }; + + /** + * Implementation of {@link DOM 2 EventTarget Interface} + * + * @param {Event} event + * @return void + */ + WebSocket.prototype.dispatchEvent = function(event) { + var events = this.__events[event.type] || []; + for (var i = 0; i < events.length; ++i) { + events[i](event); + } + var handler = this["on" + event.type]; + if (handler) handler(event); + }; + + /** + * Handles an event from Flash. + * @param {Object} flashEvent + */ + WebSocket.prototype.__handleEvent = function(flashEvent) { + if ("readyState" in flashEvent) { + this.readyState = flashEvent.readyState; + } + if ("protocol" in flashEvent) { + this.protocol = flashEvent.protocol; + } + + var jsEvent; + if (flashEvent.type == "open" || flashEvent.type == "error") { + jsEvent = this.__createSimpleEvent(flashEvent.type); + } else if (flashEvent.type == "close") { + // TODO implement jsEvent.wasClean + jsEvent = this.__createSimpleEvent("close"); + } else if (flashEvent.type == "message") { + var data = decodeURIComponent(flashEvent.message); + jsEvent = this.__createMessageEvent("message", data); + } else { + throw "unknown event type: " + flashEvent.type; + } + + this.dispatchEvent(jsEvent); + }; + + WebSocket.prototype.__createSimpleEvent = function(type) { + if (document.createEvent && window.Event) { + var event = document.createEvent("Event"); + event.initEvent(type, false, false); + return event; + } else { + return {type: type, bubbles: false, cancelable: false}; + } + }; + + WebSocket.prototype.__createMessageEvent = function(type, data) { + if (document.createEvent && window.MessageEvent && !window.opera) { + var event = document.createEvent("MessageEvent"); + event.initMessageEvent("message", false, false, data, null, null, window, null); + return event; + } else { + // IE and Opera, the latter one truncates the data parameter after any 0x00 bytes. + return {type: type, data: data, bubbles: false, cancelable: false}; + } + }; + + /** + * Define the WebSocket readyState enumeration. + */ + WebSocket.CONNECTING = 0; + WebSocket.OPEN = 1; + WebSocket.CLOSING = 2; + WebSocket.CLOSED = 3; + + WebSocket.__flash = null; + WebSocket.__instances = {}; + WebSocket.__tasks = []; + WebSocket.__nextId = 0; + + /** + * Load a new flash security policy file. + * @param {string} url + */ + WebSocket.loadFlashPolicyFile = function(url){ + WebSocket.__addTask(function() { + WebSocket.__flash.loadManualPolicyFile(url); + }); + }; + + /** + * Loads WebSocketMain.swf and creates WebSocketMain object in Flash. + */ + WebSocket.__initialize = function() { + if (WebSocket.__flash) return; + + if (WebSocket.__swfLocation) { + // For backword compatibility. + window.WEB_SOCKET_SWF_LOCATION = WebSocket.__swfLocation; + } + if (!window.WEB_SOCKET_SWF_LOCATION) { + console.error("[WebSocket] set WEB_SOCKET_SWF_LOCATION to location of WebSocketMain.swf"); + return; + } + var container = document.createElement("div"); + container.id = "webSocketContainer"; + // Hides Flash box. We cannot use display: none or visibility: hidden because it prevents + // Flash from loading at least in IE. So we move it out of the screen at (-100, -100). + // But this even doesn't work with Flash Lite (e.g. in Droid Incredible). So with Flash + // Lite, we put it at (0, 0). This shows 1x1 box visible at left-top corner but this is + // the best we can do as far as we know now. + container.style.position = "absolute"; + if (WebSocket.__isFlashLite()) { + container.style.left = "0px"; + container.style.top = "0px"; + } else { + container.style.left = "-100px"; + container.style.top = "-100px"; + } + var holder = document.createElement("div"); + holder.id = "webSocketFlash"; + container.appendChild(holder); + document.body.appendChild(container); + // See this article for hasPriority: + // http://help.adobe.com/en_US/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-7ffd.html + swfobject.embedSWF( + WEB_SOCKET_SWF_LOCATION, + "webSocketFlash", + "1" /* width */, + "1" /* height */, + "10.0.0" /* SWF version */, + null, + null, + {hasPriority: true, swliveconnect : true, allowScriptAccess: "always"}, + null, + function(e) { + if (!e.success) { + console.error("[WebSocket] swfobject.embedSWF failed"); + } + }); + }; + + /** + * Called by Flash to notify JS that it's fully loaded and ready + * for communication. + */ + WebSocket.__onFlashInitialized = function() { + // We need to set a timeout here to avoid round-trip calls + // to flash during the initialization process. + setTimeout(function() { + WebSocket.__flash = document.getElementById("webSocketFlash"); + WebSocket.__flash.setCallerUrl(location.href); + WebSocket.__flash.setDebug(!!window.WEB_SOCKET_DEBUG); + for (var i = 0; i < WebSocket.__tasks.length; ++i) { + WebSocket.__tasks[i](); + } + WebSocket.__tasks = []; + }, 0); + }; + + /** + * Called by Flash to notify WebSockets events are fired. + */ + WebSocket.__onFlashEvent = function() { + setTimeout(function() { + try { + // Gets events using receiveEvents() instead of getting it from event object + // of Flash event. This is to make sure to keep message order. + // It seems sometimes Flash events don't arrive in the same order as they are sent. + var events = WebSocket.__flash.receiveEvents(); + for (var i = 0; i < events.length; ++i) { + WebSocket.__instances[events[i].webSocketId].__handleEvent(events[i]); + } + } catch (e) { + console.error(e); + } + }, 0); + return true; + }; + + // Called by Flash. + WebSocket.__log = function(message) { + console.log(decodeURIComponent(message)); + }; + + // Called by Flash. + WebSocket.__error = function(message) { + console.error(decodeURIComponent(message)); + }; + + WebSocket.__addTask = function(task) { + if (WebSocket.__flash) { + task(); + } else { + WebSocket.__tasks.push(task); + } + }; + + /** + * Test if the browser is running flash lite. + * @return {boolean} True if flash lite is running, false otherwise. + */ + WebSocket.__isFlashLite = function() { + if (!window.navigator || !window.navigator.mimeTypes) { + return false; + } + var mimeType = window.navigator.mimeTypes["application/x-shockwave-flash"]; + if (!mimeType || !mimeType.enabledPlugin || !mimeType.enabledPlugin.filename) { + return false; + } + return mimeType.enabledPlugin.filename.match(/flashlite/i) ? true : false; + }; + + if (!window.WEB_SOCKET_DISABLE_AUTO_INITIALIZATION) { + if (window.addEventListener) { + window.addEventListener("load", function(){ + WebSocket.__initialize(); + }, false); + } else { + window.attachEvent("onload", function(){ + WebSocket.__initialize(); + }); + } + } + +})(); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + * + * @api public + */ + + exports.XHR = XHR; + + /** + * XHR constructor + * + * @costructor + * @api public + */ + + function XHR (socket) { + if (!socket) return; + + io.Transport.apply(this, arguments); + this.sendBuffer = []; + }; + + /** + * Inherits from Transport. + */ + + io.util.inherit(XHR, io.Transport); + + /** + * Establish a connection + * + * @returns {Transport} + * @api public + */ + + XHR.prototype.open = function () { + this.socket.setBuffer(false); + this.onOpen(); + this.get(); + + // we need to make sure the request succeeds since we have no indication + // whether the request opened or not until it succeeded. + this.setCloseTimeout(); + + return this; + }; + + /** + * Check if we need to send data to the Socket.IO server, if we have data in our + * buffer we encode it and forward it to the `post` method. + * + * @api private + */ + + XHR.prototype.payload = function (payload) { + var msgs = []; + + for (var i = 0, l = payload.length; i < l; i++) { + msgs.push(io.parser.encodePacket(payload[i])); + } + + this.send(io.parser.encodePayload(msgs)); + }; + + /** + * Send data to the Socket.IO server. + * + * @param data The message + * @returns {Transport} + * @api public + */ + + XHR.prototype.send = function (data) { + this.post(data); + return this; + }; + + /** + * Posts a encoded message to the Socket.IO server. + * + * @param {String} data A encoded message. + * @api private + */ + + function empty () { }; + + XHR.prototype.post = function (data) { + var self = this; + this.socket.setBuffer(true); + + function stateChange () { + if (this.readyState == 4) { + this.onreadystatechange = empty; + self.posting = false; + + if (this.status == 200){ + self.socket.setBuffer(false); + } else { + self.onClose(); + } + } + } + + function onload () { + this.onload = empty; + self.socket.setBuffer(false); + }; + + this.sendXHR = this.request('POST'); + + if (global.XDomainRequest && this.sendXHR instanceof XDomainRequest) { + this.sendXHR.onload = this.sendXHR.onerror = onload; + } else { + this.sendXHR.onreadystatechange = stateChange; + } + + this.sendXHR.send(data); + }; + + /** + * Disconnects the established `XHR` connection. + * + * @returns {Transport} + * @api public + */ + + XHR.prototype.close = function () { + this.onClose(); + return this; + }; + + /** + * Generates a configured XHR request + * + * @param {String} url The url that needs to be requested. + * @param {String} method The method the request should use. + * @returns {XMLHttpRequest} + * @api private + */ + + XHR.prototype.request = function (method) { + var req = io.util.request(this.socket.isXDomain()) + , query = io.util.query(this.socket.options.query, 't=' + +new Date); + + req.open(method || 'GET', this.prepareUrl() + query, true); + + if (method == 'POST') { + try { + if (req.setRequestHeader) { + req.setRequestHeader('Content-type', 'text/plain;charset=UTF-8'); + } else { + // XDomainRequest + req.contentType = 'text/plain'; + } + } catch (e) {} + } + + return req; + }; + + /** + * Returns the scheme to use for the transport URLs. + * + * @api private + */ + + XHR.prototype.scheme = function () { + return this.socket.options.secure ? 'https' : 'http'; + }; + + /** + * Check if the XHR transports are supported + * + * @param {Boolean} xdomain Check if we support cross domain requests. + * @returns {Boolean} + * @api public + */ + + XHR.check = function (socket, xdomain) { + try { + var request = io.util.request(xdomain), + usesXDomReq = (global.XDomainRequest && request instanceof XDomainRequest), + socketProtocol = (socket && socket.options && socket.options.secure ? 'https:' : 'http:'), + isXProtocol = (global.location && socketProtocol != global.location.protocol); + if (request && !(usesXDomReq && isXProtocol)) { + return true; + } + } catch(e) {} + + return false; + }; + + /** + * Check if the XHR transport supports cross domain requests. + * + * @returns {Boolean} + * @api public + */ + + XHR.xdomainCheck = function (socket) { + return XHR.check(socket, true); + }; + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.htmlfile = HTMLFile; + + /** + * The HTMLFile transport creates a `forever iframe` based transport + * for Internet Explorer. Regular forever iframe implementations will + * continuously trigger the browsers buzy indicators. If the forever iframe + * is created inside a `htmlfile` these indicators will not be trigged. + * + * @constructor + * @extends {io.Transport.XHR} + * @api public + */ + + function HTMLFile (socket) { + io.Transport.XHR.apply(this, arguments); + }; + + /** + * Inherits from XHR transport. + */ + + io.util.inherit(HTMLFile, io.Transport.XHR); + + /** + * Transport name + * + * @api public + */ + + HTMLFile.prototype.name = 'htmlfile'; + + /** + * Creates a new Ac...eX `htmlfile` with a forever loading iframe + * that can be used to listen to messages. Inside the generated + * `htmlfile` a reference will be made to the HTMLFile transport. + * + * @api private + */ + + HTMLFile.prototype.get = function () { + this.doc = new window[(['Active'].concat('Object').join('X'))]('htmlfile'); + this.doc.open(); + this.doc.write(''); + this.doc.close(); + this.doc.parentWindow.s = this; + + var iframeC = this.doc.createElement('div'); + iframeC.className = 'socketio'; + + this.doc.body.appendChild(iframeC); + this.iframe = this.doc.createElement('iframe'); + + iframeC.appendChild(this.iframe); + + var self = this + , query = io.util.query(this.socket.options.query, 't='+ +new Date); + + this.iframe.src = this.prepareUrl() + query; + + io.util.on(window, 'unload', function () { + self.destroy(); + }); + }; + + /** + * The Socket.IO server will write script tags inside the forever + * iframe, this function will be used as callback for the incoming + * information. + * + * @param {String} data The message + * @param {document} doc Reference to the context + * @api private + */ + + HTMLFile.prototype._ = function (data, doc) { + // unescape all forward slashes. see GH-1251 + data = data.replace(/\\\//g, '/'); + this.onData(data); + try { + var script = doc.getElementsByTagName('script')[0]; + script.parentNode.removeChild(script); + } catch (e) { } + }; + + /** + * Destroy the established connection, iframe and `htmlfile`. + * And calls the `CollectGarbage` function of Internet Explorer + * to release the memory. + * + * @api private + */ + + HTMLFile.prototype.destroy = function () { + if (this.iframe){ + try { + this.iframe.src = 'about:blank'; + } catch(e){} + + this.doc = null; + this.iframe.parentNode.removeChild(this.iframe); + this.iframe = null; + + CollectGarbage(); + } + }; + + /** + * Disconnects the established connection. + * + * @returns {Transport} Chaining. + * @api public + */ + + HTMLFile.prototype.close = function () { + this.destroy(); + return io.Transport.XHR.prototype.close.call(this); + }; + + /** + * Checks if the browser supports this transport. The browser + * must have an `Ac...eXObject` implementation. + * + * @return {Boolean} + * @api public + */ + + HTMLFile.check = function (socket) { + if (typeof window != "undefined" && (['Active'].concat('Object').join('X')) in window){ + try { + var a = new window[(['Active'].concat('Object').join('X'))]('htmlfile'); + return a && io.Transport.XHR.check(socket); + } catch(e){} + } + return false; + }; + + /** + * Check if cross domain requests are supported. + * + * @returns {Boolean} + * @api public + */ + + HTMLFile.xdomainCheck = function () { + // we can probably do handling for sub-domains, we should + // test that it's cross domain but a subdomain here + return false; + }; + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('htmlfile'); + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + */ + + exports['xhr-polling'] = XHRPolling; + + /** + * The XHR-polling transport uses long polling XHR requests to create a + * "persistent" connection with the server. + * + * @constructor + * @api public + */ + + function XHRPolling () { + io.Transport.XHR.apply(this, arguments); + }; + + /** + * Inherits from XHR transport. + */ + + io.util.inherit(XHRPolling, io.Transport.XHR); + + /** + * Merge the properties from XHR transport + */ + + io.util.merge(XHRPolling, io.Transport.XHR); + + /** + * Transport name + * + * @api public + */ + + XHRPolling.prototype.name = 'xhr-polling'; + + /** + * Indicates whether heartbeats is enabled for this transport + * + * @api private + */ + + XHRPolling.prototype.heartbeats = function () { + return false; + }; + + /** + * Establish a connection, for iPhone and Android this will be done once the page + * is loaded. + * + * @returns {Transport} Chaining. + * @api public + */ + + XHRPolling.prototype.open = function () { + var self = this; + + io.Transport.XHR.prototype.open.call(self); + return false; + }; + + /** + * Starts a XHR request to wait for incoming messages. + * + * @api private + */ + + function empty () {}; + + XHRPolling.prototype.get = function () { + if (!this.isOpen) return; + + var self = this; + + function stateChange () { + if (this.readyState == 4) { + this.onreadystatechange = empty; + + if (this.status == 200) { + self.onData(this.responseText); + self.get(); + } else { + self.onClose(); + } + } + }; + + function onload () { + this.onload = empty; + this.onerror = empty; + self.retryCounter = 1; + self.onData(this.responseText); + self.get(); + }; + + function onerror () { + self.retryCounter ++; + if(!self.retryCounter || self.retryCounter > 3) { + self.onClose(); + } else { + self.get(); + } + }; + + this.xhr = this.request(); + + if (global.XDomainRequest && this.xhr instanceof XDomainRequest) { + this.xhr.onload = onload; + this.xhr.onerror = onerror; + } else { + this.xhr.onreadystatechange = stateChange; + } + + this.xhr.send(null); + }; + + /** + * Handle the unclean close behavior. + * + * @api private + */ + + XHRPolling.prototype.onClose = function () { + io.Transport.XHR.prototype.onClose.call(this); + + if (this.xhr) { + this.xhr.onreadystatechange = this.xhr.onload = this.xhr.onerror = empty; + try { + this.xhr.abort(); + } catch(e){} + this.xhr = null; + } + }; + + /** + * Webkit based browsers show a infinit spinner when you start a XHR request + * before the browsers onload event is called so we need to defer opening of + * the transport until the onload event is called. Wrapping the cb in our + * defer method solve this. + * + * @param {Socket} socket The socket instance that needs a transport + * @param {Function} fn The callback + * @api private + */ + + XHRPolling.prototype.ready = function (socket, fn) { + var self = this; + + io.util.defer(function () { + fn.call(self); + }); + }; + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('xhr-polling'); + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io, global) { + /** + * There is a way to hide the loading indicator in Firefox. If you create and + * remove a iframe it will stop showing the current loading indicator. + * Unfortunately we can't feature detect that and UA sniffing is evil. + * + * @api private + */ + + var indicator = global.document && "MozAppearance" in + global.document.documentElement.style; + + /** + * Expose constructor. + */ + + exports['jsonp-polling'] = JSONPPolling; + + /** + * The JSONP transport creates an persistent connection by dynamically + * inserting a script tag in the page. This script tag will receive the + * information of the Socket.IO server. When new information is received + * it creates a new script tag for the new data stream. + * + * @constructor + * @extends {io.Transport.xhr-polling} + * @api public + */ + + function JSONPPolling (socket) { + io.Transport['xhr-polling'].apply(this, arguments); + + this.index = io.j.length; + + var self = this; + + io.j.push(function (msg) { + self._(msg); + }); + }; + + /** + * Inherits from XHR polling transport. + */ + + io.util.inherit(JSONPPolling, io.Transport['xhr-polling']); + + /** + * Transport name + * + * @api public + */ + + JSONPPolling.prototype.name = 'jsonp-polling'; + + /** + * Posts a encoded message to the Socket.IO server using an iframe. + * The iframe is used because script tags can create POST based requests. + * The iframe is positioned outside of the view so the user does not + * notice it's existence. + * + * @param {String} data A encoded message. + * @api private + */ + + JSONPPolling.prototype.post = function (data) { + var self = this + , query = io.util.query( + this.socket.options.query + , 't='+ (+new Date) + '&i=' + this.index + ); + + if (!this.form) { + var form = document.createElement('form') + , area = document.createElement('textarea') + , id = this.iframeId = 'socketio_iframe_' + this.index + , iframe; + + form.className = 'socketio'; + form.style.position = 'absolute'; + form.style.top = '0px'; + form.style.left = '0px'; + form.style.display = 'none'; + form.target = id; + form.method = 'POST'; + form.setAttribute('accept-charset', 'utf-8'); + area.name = 'd'; + form.appendChild(area); + document.body.appendChild(form); + + this.form = form; + this.area = area; + } + + this.form.action = this.prepareUrl() + query; + + function complete () { + initIframe(); + self.socket.setBuffer(false); + }; + + function initIframe () { + if (self.iframe) { + self.form.removeChild(self.iframe); + } + + try { + // ie6 dynamic iframes with target="" support (thanks Chris Lambacher) + iframe = document.createElement('') + storageContainer.close() + storageOwner = storageContainer.w.frames[0].document + storage = storageOwner.createElement('div') + } catch(e) { + // somehow ActiveXObject instantiation failed (perhaps some special + // security settings or otherwse), fall back to per-path storage + storage = doc.createElement('div') + storageOwner = doc.body + } + function withIEStorage(storeFunction) { + return function() { + var args = Array.prototype.slice.call(arguments, 0) + args.unshift(storage) + // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx + // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx + storageOwner.appendChild(storage) + storage.addBehavior('#default#userData') + storage.load(localStorageName) + var result = storeFunction.apply(store, args) + storageOwner.removeChild(storage) + return result + } + } + + // In IE7, keys may not contain special chars. See all of https://github.com/marcuswestin/store.js/issues/40 + var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g") + function ieKeyFix(key) { + return key.replace(forbiddenCharsRegex, '___') + } + store.set = withIEStorage(function(storage, key, val) { + key = ieKeyFix(key) + if (val === undefined) { return store.remove(key) } + storage.setAttribute(key, store.serialize(val)) + storage.save(localStorageName) + return val + }) + store.get = withIEStorage(function(storage, key) { + key = ieKeyFix(key) + return store.deserialize(storage.getAttribute(key)) + }) + store.remove = withIEStorage(function(storage, key) { + key = ieKeyFix(key) + storage.removeAttribute(key) + storage.save(localStorageName) + }) + store.clear = withIEStorage(function(storage) { + var attributes = storage.XMLDocument.documentElement.attributes + storage.load(localStorageName) + for (var i=0, attr; attr=attributes[i]; i++) { + storage.removeAttribute(attr.name) + } + storage.save(localStorageName) + }) + store.getAll = withIEStorage(function(storage) { + var attributes = storage.XMLDocument.documentElement.attributes + var ret = {} + for (var i=0, attr; attr=attributes[i]; ++i) { + var key = ieKeyFix(attr.name) + ret[attr.name] = store.deserialize(storage.getAttribute(key)) + } + return ret + }) + } + + try { + store.set(namespace, namespace) + if (store.get(namespace) != namespace) { store.disabled = true } + store.remove(namespace) + } catch(e) { + store.disabled = true + } + store.enabled = !store.disabled + if (typeof module != 'undefined' && module.exports) { module.exports = store } + else if (typeof define === 'function' && define.amd) { define("store", store) } + else { win.store = store } +})(this.window || global); + +/* @source mod/user_following.js */; + +define('store', 'lib/store.js'); +define('mod/user_following', [ + "jquery", + "store" +], function($, store) { + var API_USER_FOLLOWING_PATH = "/api/user/following" + var USER_FOLLOWING_KEY = "user-following"; + var USER_FOLLOWING_UPDATE_KEY= "date:user-following" + var ONE_DAY_IN_SECONDS = 60*60*24; + + var update = function() { + var currentTime = new Date().getTime(); + var lastTime = store.get(USER_FOLLOWING_UPDATE_KEY); + if (lastTime && (currentTime - lastTime) < ONE_DAY_IN_SECONDS ) { + return; + } + + $.ajax( + API_USER_FOLLOWING_PATH + ).done(function(users){ + var following = $.map(users, function(item){ + return item["username"]; + }); + store.set(USER_FOLLOWING_KEY, following); + store.set(USER_FOLLOWING_UPDATE_KEY, currentTime); + }).fail(function(jqxhr, textStatus, error){ + return; + }); + } + + return { + update: update, + val: function(){ + return store.get(USER_FOLLOWING_KEY) || []; + } + }; + +}); + +/* @source lib/zen-form.js */; + +/** Zen Forms 1.0.0 | MIT License | git.io/zen-form */ + +(function($) { + + $.fn.zenForm = function(settings) { + + settings = $.extend({ + trigger: '.go-zen', + theme: 'dark' + }, settings); + + /** + * Helper functions + */ + var Utils = { + + watchEmpty: function($form) { + + $form.find('input, textarea').each(function() { + $(this).on('change', function() { + $(this)[ $(this).val() ? 'removeClass' : 'addClass' ]('empty'); + }).trigger('change'); + }); + + } + + }, // Utils + + /** + * Core functionality + */ + App = { + + /** + * Wrapper element + */ + Environment: null, + + /** + * Functions to create and manipulate environment + */ + env: { + + create: function() { + + var theme = settings.theme == 'dark' ? '' : ' light-theme'; + + return $('
    ', {class: 'zen-forms' + theme}).hide().appendTo('body').fadeIn(200); + + }, // create + + /** + * Update orginal inputs with new values and destroy Environment + */ + destroy: function($elements) { + + // Update orginal inputs with new values + $elements.each(function(i) { + + var $el = $('#zen-forms-input' + i); + + if ( $el.length ) + $(this).val($el.val()); + + }).filter('input:text,textarea').eq(0).focus(); + + $('.zen-forms').fadeOut(200, function() { + $(this).remove(); + }); + + }, // destroy + + /** + * Append inputs, textareas to Environment + */ + add: function($elements) { + + $elements.each(function(i) { + + var $this = $(this), + $wrapper = App.env.addObject(App.Environment, 'div', {class: 'zen-forms-input-wrap'}), + + value = $this.val(), + id = $this.attr('id'), + ID = 'zen-forms-input' + i, + label = $("label[for=" + id + "]").text() || $this.attr('placeholder') || ''; + + // Exclude specified elements + if ( $.inArray( $this.attr('type'), ['checkbox', 'radio', 'submit']) == -1) { + + if ( $this.is('input') ) + App.env.addObject($wrapper, 'input', { + id: ID, + value: value, + type: $this.attr('type') + }); + else + App.env.addObject($wrapper, 'textarea', { + id: ID, + text: value + }); + + App.env.addObject($wrapper, 'label', { + for: ID, + text: label + }); + + } + + }); + + }, // add + + /** + * Wrapper for creating jQuery objects + */ + addObject: function($wrapper, type, params, fn, fnMethod) { + + return $('<'+type+'>', params).on(fnMethod || 'click', fn).appendTo($wrapper); + + }, // addObject + + switchTheme: function() { + + App.Environment.toggleClass('light-theme'); + + } // switchTheme + + }, // env + + zen: function($elements) { + + // Create environment + App.Environment = App.env.create(); + + // Add close button + App.env.addObject(App.Environment, 'a', { + class: 'zen-forms-close-button', + html: '×' + }, function() { + App.env.destroy($elements); + }); + + // Add theme switch button + App.env.addObject(App.Environment, 'a', { + class: 'zen-forms-theme-switch', + html: '•' + }, function() { + App.env.switchTheme(); + }); + + // Add inputs and textareas from form + App.env.add($elements); + + App.Environment.keydown(function(e) { + // Esc close + if (e.which == 27) { + App.env.destroy($elements); + } + }).find('input:text, textarea').eq(0).focus(); + + // Watch inputs and add "empty" class if needed + Utils.watchEmpty(App.Environment); + + }, // zen + + }; // App + + return this.each(function() { + + var $this = $(this); + + function zen() { + App.zen( $this.is('form') ? $this.find('input, textarea') : $this ); + } + + if (!settings.trigger) return zen(); + + $(settings.trigger).on('click', function(event) { + event.preventDefault(); + zen(); + }); + + }); + + }; + +})(jQuery); + +/* autogeneration */ +define("lib/zen-form", [], function(){}); + +/* @source mod/input-ext.js */; + +define('mousetrap', 'lib/mousetrap.js'); + +define("mod/input-ext", + [ + "jquery", + "mod/user_following", + "jquery-caret", + "jquery-atwho", + "mousetrap", + "lib/zen-form" +], + function ($, userFollowing) { + var inputExt = {}; + var emojis = [ + 'airplane', 'alien', 'art', 'bear', 'beer', 'bike', 'bomb', 'book', + 'bulb', 'bus', 'cake', 'calling', 'clap', 'cocktail', 'code', 'computer', + 'cool', 'cop', 'email', 'feet', 'fire', 'fish', 'fist', 'gift', 'hammer', + 'heart', 'iphone', 'key', 'leaves', 'lgtm', 'lipstick', 'lock', 'mag', 'mega', + 'memo', 'moneybag', 'new', 'octocat', 'ok', 'palm_tree', 'pencil', 'punch', + 'runner', 'scissors', 'ship', 'shipit', 'ski', 'smile', 'smoking', 'sparkles', + 'star', 'sunny', 'taxi', 'thumbsdown', 'thumbsup', 'tm', 'tophat', 'train', + 'trollface', 'v', 'vs', 'warning', 'wheelchair', 'zap', 'zzz', 'see_no_evil', + 'hear_no_evil', 'speak_no_evil', 'monkey', 'monkey_face', 'manybeers', 'beers', + 'hhkb', 'ruby' + ], emoji_list = $.map(emojis, function(value, i) {return {key: value + ':', name:value};}); + inputExt.enableEmojiInput = function (el) { + el.atwho('(?:^|\\s):', + {data:emoji_list, limit:7, + tpl:'
  • ${name}
  • '}); + return el; + }; + + inputExt.enableAutoCompleteFollowingAndTeam = function (el) { + var teams = JSON.parse($('#all-teams').val() || '[]'); + var users = teams.concat(userFollowing.val()); + + $(el).atwho("@", { + data: users, + limit: 7 + }); + }; + + // 输入#自动提示pr信息 + inputExt.enablePullsInput = function (el) { + var projectName = el.attr('data-project-name'); + if (!projectName) return el; + $.getJSON('/' + projectName + '/pulls/all_data', function (r) { + var pulls = $.map( + r, function(value, i) { + return {key: value.id, name:value.id + ' ' + value.title, title:value.title}; + }); + el.atwho('(?:^|\\s)#', + {data:pulls, limit:7, + tpl:'
  • #${key} ${title}
  • '}); + }); + return el; + }; + + inputExt.shortcut2submit = function (el) { + Mousetrap.bind( + ['command+enter', 'ctrl+enter'], + function (e) { + if (el && (e.srcElement || e.target) == $(el)[0] && !$(el).closest('form').hasClass('submitting')) { + e.preventDefault ? e.preventDefault() : (e.returnValue = false); + $(el).closest('form').addClass('submitting').submit(); + } + }, + 'keydown' + ); + }; + + // 进入全屏模式 + inputExt.enableZenMode = function (el) { + var trigger = '.go-zen'; + el = $(el); + el.zenForm({trigger:trigger, theme:'light'}).dblclick(function(e) { + if (!e.altKey) return; + $(this).zenForm({ trigger: null, theme: 'light' }); + fix(); + }); + + $(trigger).click(fix); + + function fix() { + var textarea = $('.zen-forms-input-wrap textarea'); + if (textarea) { + inputExt.enableEmojiInput(textarea); + textarea.attr({ + 'data-project-name': el.attr('data-project-name'), + 'placeholder': el.attr('placeholder') + }); + + inputExt.enablePullsInput(textarea); + + var participants = $('#participants').val(); + if (participants) { + participants = JSON.parse(participants); + textarea.atwho("@", {data:participants, limit:7}); + } + + // 因为zen-form设置的z-index非常高(99999)所以将at-view调更高 + $('#at-view').css('z-index', 100000); + } + } + }; + + var focusToEnd = function(els) { + return $(els).each(function() { + var v = $(this).val(); + $(this).focus().val("").val(v); + }); + }; + + inputExt.enableQuickQuotes = function (el) { + Mousetrap.bind( + ['r'], + function (e) { + var oldVal = $(el).val(), newVal, selVal = window.getSelection().toString(); + selVal = '> ' + selVal.split('\n').join('\n> '); + newVal = oldVal.concat((oldVal != '') ? '\n\n':'', selVal, '\n\n'); + $("html, body").animate({scrollTop: $(document).height()}, "slow"); + $(el).val(newVal); + focusToEnd(el); + }, + 'keyup' + ); + }; + + inputExt.enableFileUpload = function (uploader, textarea, is_image) { + uploader.submit( + function() { + $(this).ajaxSubmit({ + dataType: 'json', + type: 'POST', + delegation: true, + success: function(r) { + var oldText = textarea.val(), + newText = oldText + + (oldText.length == 0 ? '' : '\n') + + (is_image? '!' : '') + + '[' + r.origin_filename + '](' + r.url + ')'; + textarea.val(newText); + }, + error: function(r) { + alert("上传错误,请确认您上传的文件类型合法"); + } + }); + return false; + }); + + uploader.find('input').change(function () { + uploader.submit(); + }); + }; + + inputExt.enableImageUpload = function (uploader, textarea) { + inputExt.enableFileUpload(uploader,textarea, true); + }; + + inputExt.enableUpload = function(upload_widget,textarea){ + inputExt.enableImageUpload(upload_widget.find(".upload-image-form"),textarea); + inputExt.enableFileUpload(upload_widget.find(".upload-file-form"),textarea); + }; + + return inputExt; + } +); + +/* @source lib/date.extensions.js */; + +/** + * Returns a description of this date in relative terms. + + * Examples, where new Date().toString() == "Mon Nov 23 2009 17:36:51 GMT-0500 (EST)": + * + * new Date().toRelativeTime() + * --> 'Just now' + * + * new Date("Nov 21, 2009").toRelativeTime() + * --> '2 days ago' + * + * new Date("Nov 25, 2009").toRelativeTime() + * --> '2 days from now' + * + * // One second ago + * new Date("Nov 23 2009 17:36:50 GMT-0500 (EST)").toRelativeTime() + * --> '1 second ago' + * + * toRelativeTime() takes an optional argument - a configuration object. + * It can have the following properties: + * - now - Date object that defines "now" for the purpose of conversion. + * By default, current date & time is used (i.e. new Date()) + * - nowThreshold - Threshold in milliseconds which is considered "Just now" + * for times in the past or "Right now" for now or the immediate future + * - smartDays - If enabled, dates within a week of now will use Today/Yesterday/Tomorrow + * or weekdays along with time, e.g. "Thursday at 15:10:34" + * rather than "4 days ago" or "Tomorrow at 20:12:01" + * instead of "1 day from now" + * + * If a single number is given as argument, it is interpreted as nowThreshold: + * + * // One second ago, now setting a now_threshold to 5 seconds + * new Date("Nov 23 2009 17:36:50 GMT-0500 (EST)").toRelativeTime(5000) + * --> 'Just now' + * + * // One second in the future, now setting a now_threshold to 5 seconds + * new Date("Nov 23 2009 17:36:52 GMT-0500 (EST)").toRelativeTime(5000) + * --> 'Right now' + * + */ +var TRANSLATIONS = { + 'Right now':'现在', + 'Just now':'刚刚', + 'from now':'之后', + 'ago':'前', + 'Today':'今天', + 'Yesterday':'昨天', + 'Tomorrow':'明天', + ' at ':'', + 's':'', + ' ':'', + 'millisecond':'毫秒', + 'second':'秒', + 'minute':'分钟', + 'hour':'小时', + 'day':'天', + 'month':'个月', + 'year':'年', + 'Sunday':'星期天', + 'Monday':'星期六', + 'Tuesday':'星期二', + 'Wednesday':'星期三', + 'Thursday':'星期四', + 'Friday':'星期五', + 'Saturday':'星期六' +}, +_t = function (key) {return TRANSLATIONS[key];}; + + Date.prototype.toRelativeTime = (function() { + + var _ = function(options) { + var opts = processOptions(options); + + var now = opts.now || new Date(); + var delta = now - this; + var future = (delta <= 0); + delta = Math.abs(delta); + + // special cases controlled by options + if (delta <= opts.nowThreshold) { + return future ? _t('Right now') : _t('Just now'); + } + if (opts.smartDays && delta <= 6 * MS_IN_DAY) { + return toSmartDays(this, now); + } + + var units = null; + for (var key in CONVERSIONS) { + if (delta < CONVERSIONS[key]) + break; + units = _t(key); // keeps track of the selected key over the iteration + delta = delta / CONVERSIONS[key]; + } + + // pluralize a unit when the difference is greater than 1. + delta = Math.floor(delta); + if (delta !== 1) { units += _t("s"); } + return [delta, units, future ? _t("from now") : _t("ago")].join(_t(" ")); + }; + + var processOptions = function(arg) { + if (!arg) arg = 0; + if (typeof arg === 'string') { + arg = parseInt(arg, 10); + } + if (typeof arg === 'number') { + if (isNaN(arg)) arg = 0; + return {nowThreshold: arg}; + } + return arg; + }; + + var toSmartDays = function(date, now) { + var day; + var weekday = date.getDay(), + dayDiff = weekday - now.getDay(); + if (dayDiff == 0) day = _t('Today'); + else if (dayDiff == -1) day = _t('Yesterday'); + else if (dayDiff == 1 && date > now) day = _t('Tomorrow'); + else day = WEEKDAYS[weekday]; + return day + _t(" at ") + date.toLocaleTimeString(); + }; + + var CONVERSIONS = { + millisecond: 1, // ms -> ms + second: 1000, // ms -> sec + minute: 60, // sec -> min + hour: 60, // min -> hour + day: 24, // hour -> day + month: 30, // day -> month (roughly) + year: 12 // month -> year + }; + var MS_IN_DAY = (CONVERSIONS.millisecond * CONVERSIONS.second * CONVERSIONS.minute * CONVERSIONS.hour * CONVERSIONS.day); + + var WEEKDAYS = [_t('Sunday'), _t('Monday'), _t('Tuesday'), _t('Wednesday'), _t('Thursday'), _t('Friday'), _t('Saturday')]; + + return _; + +})(); + + + +/* + * Wraps up a common pattern used with this plugin whereby you take a String + * representation of a Date, and want back a date object. + */ +Date.fromString = function(str) { + return new Date(Date.parse(str)); +}; + +/* autogeneration */ +define("lib/date.extensions", [], function(){}); + +/* @source mod/relative_date.js */; + +define('mod/relative_date', [ + "jquery", + "lib/date.extensions" +], function($) { + var updateRelativeDate = function () { + $('.js-relative-date').each( + function (i, el) { + var el = $(el); + var t = (el.attr('datetime') || el.attr('data-time')).split(/[- : + T]/); + var d = new Date(t[0], t[1]-1, t[2], t[3], t[4], t[5]); + !isNaN(d.getTime()) && el.html(d.toRelativeTime({nowThreshold:60*1000})); + }); + }; + return updateRelativeDate; + }); + +/* @source lib/socket.io.js */; + +/*! Socket.IO.js build:0.9.16, development. Copyright(c) 2011 LearnBoost MIT Licensed */ + +var io = ('undefined' === typeof module ? {} : module.exports); +(function() { + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, global) { + + /** + * IO namespace. + * + * @namespace + */ + + var io = exports; + + /** + * Socket.IO version + * + * @api public + */ + + io.version = '0.9.16'; + + /** + * Protocol implemented. + * + * @api public + */ + + io.protocol = 1; + + /** + * Available transports, these will be populated with the available transports + * + * @api public + */ + + io.transports = []; + + /** + * Keep track of jsonp callbacks. + * + * @api private + */ + + io.j = []; + + /** + * Keep track of our io.Sockets + * + * @api private + */ + io.sockets = {}; + + + /** + * Manages connections to hosts. + * + * @param {String} uri + * @Param {Boolean} force creation of new socket (defaults to false) + * @api public + */ + + io.connect = function (host, details) { + var uri = io.util.parseUri(host) + , uuri + , socket; + + if (global && global.location) { + uri.protocol = uri.protocol || global.location.protocol.slice(0, -1); + uri.host = uri.host || (global.document + ? global.document.domain : global.location.hostname); + uri.port = uri.port || global.location.port; + } + + uuri = io.util.uniqueUri(uri); + + var options = { + host: uri.host + , secure: 'https' == uri.protocol + , port: uri.port || ('https' == uri.protocol ? 443 : 80) + , query: uri.query || '' + }; + + io.util.merge(options, details); + + if (options['force new connection'] || !io.sockets[uuri]) { + socket = new io.Socket(options); + } + + if (!options['force new connection'] && socket) { + io.sockets[uuri] = socket; + } + + socket = socket || io.sockets[uuri]; + + // if path is different from '' or / + return socket.of(uri.path.length > 1 ? uri.path : ''); + }; + +})('object' === typeof module ? module.exports : (this.io = {}), this); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, global) { + + /** + * Utilities namespace. + * + * @namespace + */ + + var util = exports.util = {}; + + /** + * Parses an URI + * + * @author Steven Levithan (MIT license) + * @api public + */ + + var re = /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/; + + var parts = ['source', 'protocol', 'authority', 'userInfo', 'user', 'password', + 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', + 'anchor']; + + util.parseUri = function (str) { + var m = re.exec(str || '') + , uri = {} + , i = 14; + + while (i--) { + uri[parts[i]] = m[i] || ''; + } + + return uri; + }; + + /** + * Produces a unique url that identifies a Socket.IO connection. + * + * @param {Object} uri + * @api public + */ + + util.uniqueUri = function (uri) { + var protocol = uri.protocol + , host = uri.host + , port = uri.port; + + if ('document' in global) { + host = host || document.domain; + port = port || (protocol == 'https' + && document.location.protocol !== 'https:' ? 443 : document.location.port); + } else { + host = host || 'localhost'; + + if (!port && protocol == 'https') { + port = 443; + } + } + + return (protocol || 'http') + '://' + host + ':' + (port || 80); + }; + + /** + * Mergest 2 query strings in to once unique query string + * + * @param {String} base + * @param {String} addition + * @api public + */ + + util.query = function (base, addition) { + var query = util.chunkQuery(base || '') + , components = []; + + util.merge(query, util.chunkQuery(addition || '')); + for (var part in query) { + if (query.hasOwnProperty(part)) { + components.push(part + '=' + query[part]); + } + } + + return components.length ? '?' + components.join('&') : ''; + }; + + /** + * Transforms a querystring in to an object + * + * @param {String} qs + * @api public + */ + + util.chunkQuery = function (qs) { + var query = {} + , params = qs.split('&') + , i = 0 + , l = params.length + , kv; + + for (; i < l; ++i) { + kv = params[i].split('='); + if (kv[0]) { + query[kv[0]] = kv[1]; + } + } + + return query; + }; + + /** + * Executes the given function when the page is loaded. + * + * io.util.load(function () { console.log('page loaded'); }); + * + * @param {Function} fn + * @api public + */ + + var pageLoaded = false; + + util.load = function (fn) { + if ('document' in global && document.readyState === 'complete' || pageLoaded) { + return fn(); + } + + util.on(global, 'load', fn, false); + }; + + /** + * Adds an event. + * + * @api private + */ + + util.on = function (element, event, fn, capture) { + if (element.attachEvent) { + element.attachEvent('on' + event, fn); + } else if (element.addEventListener) { + element.addEventListener(event, fn, capture); + } + }; + + /** + * Generates the correct `XMLHttpRequest` for regular and cross domain requests. + * + * @param {Boolean} [xdomain] Create a request that can be used cross domain. + * @returns {XMLHttpRequest|false} If we can create a XMLHttpRequest. + * @api private + */ + + util.request = function (xdomain) { + + if (xdomain && 'undefined' != typeof XDomainRequest && !util.ua.hasCORS) { + return new XDomainRequest(); + } + + if ('undefined' != typeof XMLHttpRequest && (!xdomain || util.ua.hasCORS)) { + return new XMLHttpRequest(); + } + + if (!xdomain) { + try { + return new window[(['Active'].concat('Object').join('X'))]('Microsoft.XMLHTTP'); + } catch(e) { } + } + + return null; + }; + + /** + * XHR based transport constructor. + * + * @constructor + * @api public + */ + + /** + * Change the internal pageLoaded value. + */ + + if ('undefined' != typeof window) { + util.load(function () { + pageLoaded = true; + }); + } + + /** + * Defers a function to ensure a spinner is not displayed by the browser + * + * @param {Function} fn + * @api public + */ + + util.defer = function (fn) { + if (!util.ua.webkit || 'undefined' != typeof importScripts) { + return fn(); + } + + util.load(function () { + setTimeout(fn, 100); + }); + }; + + /** + * Merges two objects. + * + * @api public + */ + + util.merge = function merge (target, additional, deep, lastseen) { + var seen = lastseen || [] + , depth = typeof deep == 'undefined' ? 2 : deep + , prop; + + for (prop in additional) { + if (additional.hasOwnProperty(prop) && util.indexOf(seen, prop) < 0) { + if (typeof target[prop] !== 'object' || !depth) { + target[prop] = additional[prop]; + seen.push(additional[prop]); + } else { + util.merge(target[prop], additional[prop], depth - 1, seen); + } + } + } + + return target; + }; + + /** + * Merges prototypes from objects + * + * @api public + */ + + util.mixin = function (ctor, ctor2) { + util.merge(ctor.prototype, ctor2.prototype); + }; + + /** + * Shortcut for prototypical and static inheritance. + * + * @api private + */ + + util.inherit = function (ctor, ctor2) { + function f() {}; + f.prototype = ctor2.prototype; + ctor.prototype = new f; + }; + + /** + * Checks if the given object is an Array. + * + * io.util.isArray([]); // true + * io.util.isArray({}); // false + * + * @param Object obj + * @api public + */ + + util.isArray = Array.isArray || function (obj) { + return Object.prototype.toString.call(obj) === '[object Array]'; + }; + + /** + * Intersects values of two arrays into a third + * + * @api public + */ + + util.intersect = function (arr, arr2) { + var ret = [] + , longest = arr.length > arr2.length ? arr : arr2 + , shortest = arr.length > arr2.length ? arr2 : arr; + + for (var i = 0, l = shortest.length; i < l; i++) { + if (~util.indexOf(longest, shortest[i])) + ret.push(shortest[i]); + } + + return ret; + }; + + /** + * Array indexOf compatibility. + * + * @see bit.ly/a5Dxa2 + * @api public + */ + + util.indexOf = function (arr, o, i) { + + for (var j = arr.length, i = i < 0 ? i + j < 0 ? 0 : i + j : i || 0; + i < j && arr[i] !== o; i++) {} + + return j <= i ? -1 : i; + }; + + /** + * Converts enumerables to array. + * + * @api public + */ + + util.toArray = function (enu) { + var arr = []; + + for (var i = 0, l = enu.length; i < l; i++) + arr.push(enu[i]); + + return arr; + }; + + /** + * UA / engines detection namespace. + * + * @namespace + */ + + util.ua = {}; + + /** + * Whether the UA supports CORS for XHR. + * + * @api public + */ + + util.ua.hasCORS = 'undefined' != typeof XMLHttpRequest && (function () { + try { + var a = new XMLHttpRequest(); + } catch (e) { + return false; + } + + return a.withCredentials != undefined; + })(); + + /** + * Detect webkit. + * + * @api public + */ + + util.ua.webkit = 'undefined' != typeof navigator + && /webkit/i.test(navigator.userAgent); + + /** + * Detect iPad/iPhone/iPod. + * + * @api public + */ + + util.ua.iDevice = 'undefined' != typeof navigator + && /iPad|iPhone|iPod/i.test(navigator.userAgent); + +})('undefined' != typeof io ? io : module.exports, this); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.EventEmitter = EventEmitter; + + /** + * Event emitter constructor. + * + * @api public. + */ + + function EventEmitter () {}; + + /** + * Adds a listener + * + * @api public + */ + + EventEmitter.prototype.on = function (name, fn) { + if (!this.$events) { + this.$events = {}; + } + + if (!this.$events[name]) { + this.$events[name] = fn; + } else if (io.util.isArray(this.$events[name])) { + this.$events[name].push(fn); + } else { + this.$events[name] = [this.$events[name], fn]; + } + + return this; + }; + + EventEmitter.prototype.addListener = EventEmitter.prototype.on; + + /** + * Adds a volatile listener. + * + * @api public + */ + + EventEmitter.prototype.once = function (name, fn) { + var self = this; + + function on () { + self.removeListener(name, on); + fn.apply(this, arguments); + }; + + on.listener = fn; + this.on(name, on); + + return this; + }; + + /** + * Removes a listener. + * + * @api public + */ + + EventEmitter.prototype.removeListener = function (name, fn) { + if (this.$events && this.$events[name]) { + var list = this.$events[name]; + + if (io.util.isArray(list)) { + var pos = -1; + + for (var i = 0, l = list.length; i < l; i++) { + if (list[i] === fn || (list[i].listener && list[i].listener === fn)) { + pos = i; + break; + } + } + + if (pos < 0) { + return this; + } + + list.splice(pos, 1); + + if (!list.length) { + delete this.$events[name]; + } + } else if (list === fn || (list.listener && list.listener === fn)) { + delete this.$events[name]; + } + } + + return this; + }; + + /** + * Removes all listeners for an event. + * + * @api public + */ + + EventEmitter.prototype.removeAllListeners = function (name) { + if (name === undefined) { + this.$events = {}; + return this; + } + + if (this.$events && this.$events[name]) { + this.$events[name] = null; + } + + return this; + }; + + /** + * Gets all listeners for a certain event. + * + * @api publci + */ + + EventEmitter.prototype.listeners = function (name) { + if (!this.$events) { + this.$events = {}; + } + + if (!this.$events[name]) { + this.$events[name] = []; + } + + if (!io.util.isArray(this.$events[name])) { + this.$events[name] = [this.$events[name]]; + } + + return this.$events[name]; + }; + + /** + * Emits an event. + * + * @api public + */ + + EventEmitter.prototype.emit = function (name) { + if (!this.$events) { + return false; + } + + var handler = this.$events[name]; + + if (!handler) { + return false; + } + + var args = Array.prototype.slice.call(arguments, 1); + + if ('function' == typeof handler) { + handler.apply(this, args); + } else if (io.util.isArray(handler)) { + var listeners = handler.slice(); + + for (var i = 0, l = listeners.length; i < l; i++) { + listeners[i].apply(this, args); + } + } else { + return false; + } + + return true; + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +/** + * Based on JSON2 (http://www.JSON.org/js.html). + */ + +(function (exports, nativeJSON) { + "use strict"; + + // use native JSON if it's available + if (nativeJSON && nativeJSON.parse){ + return exports.JSON = { + parse: nativeJSON.parse + , stringify: nativeJSON.stringify + }; + } + + var JSON = exports.JSON = {}; + + function f(n) { + // Format integers to have at least two digits. + return n < 10 ? '0' + n : n; + } + + function date(d, key) { + return isFinite(d.valueOf()) ? + d.getUTCFullYear() + '-' + + f(d.getUTCMonth() + 1) + '-' + + f(d.getUTCDate()) + 'T' + + f(d.getUTCHours()) + ':' + + f(d.getUTCMinutes()) + ':' + + f(d.getUTCSeconds()) + 'Z' : null; + }; + + var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + gap, + indent, + meta = { // table of character substitutions + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '\\': '\\\\' + }, + rep; + + + function quote(string) { + +// If the string contains no control characters, no quote characters, and no +// backslash characters, then we can safely slap some quotes around it. +// Otherwise we must also replace the offending characters with safe escape +// sequences. + + escapable.lastIndex = 0; + return escapable.test(string) ? '"' + string.replace(escapable, function (a) { + var c = meta[a]; + return typeof c === 'string' ? c : + '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }) + '"' : '"' + string + '"'; + } + + + function str(key, holder) { + +// Produce a string from holder[key]. + + var i, // The loop counter. + k, // The member key. + v, // The member value. + length, + mind = gap, + partial, + value = holder[key]; + +// If the value has a toJSON method, call it to obtain a replacement value. + + if (value instanceof Date) { + value = date(key); + } + +// If we were called with a replacer function, then call the replacer to +// obtain a replacement value. + + if (typeof rep === 'function') { + value = rep.call(holder, key, value); + } + +// What happens next depends on the value's type. + + switch (typeof value) { + case 'string': + return quote(value); + + case 'number': + +// JSON numbers must be finite. Encode non-finite numbers as null. + + return isFinite(value) ? String(value) : 'null'; + + case 'boolean': + case 'null': + +// If the value is a boolean or null, convert it to a string. Note: +// typeof null does not produce 'null'. The case is included here in +// the remote chance that this gets fixed someday. + + return String(value); + +// If the type is 'object', we might be dealing with an object or an array or +// null. + + case 'object': + +// Due to a specification blunder in ECMAScript, typeof null is 'object', +// so watch out for that case. + + if (!value) { + return 'null'; + } + +// Make an array to hold the partial results of stringifying this object value. + + gap += indent; + partial = []; + +// Is the value an array? + + if (Object.prototype.toString.apply(value) === '[object Array]') { + +// The value is an array. Stringify every element. Use null as a placeholder +// for non-JSON values. + + length = value.length; + for (i = 0; i < length; i += 1) { + partial[i] = str(i, value) || 'null'; + } + +// Join all of the elements together, separated with commas, and wrap them in +// brackets. + + v = partial.length === 0 ? '[]' : gap ? + '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : + '[' + partial.join(',') + ']'; + gap = mind; + return v; + } + +// If the replacer is an array, use it to select the members to be stringified. + + if (rep && typeof rep === 'object') { + length = rep.length; + for (i = 0; i < length; i += 1) { + if (typeof rep[i] === 'string') { + k = rep[i]; + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } else { + +// Otherwise, iterate through all of the keys in the object. + + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } + +// Join all of the member texts together, separated with commas, +// and wrap them in braces. + + v = partial.length === 0 ? '{}' : gap ? + '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : + '{' + partial.join(',') + '}'; + gap = mind; + return v; + } + } + +// If the JSON object does not yet have a stringify method, give it one. + + JSON.stringify = function (value, replacer, space) { + +// The stringify method takes a value and an optional replacer, and an optional +// space parameter, and returns a JSON text. The replacer can be a function +// that can replace values, or an array of strings that will select the keys. +// A default replacer method can be provided. Use of the space parameter can +// produce text that is more easily readable. + + var i; + gap = ''; + indent = ''; + +// If the space parameter is a number, make an indent string containing that +// many spaces. + + if (typeof space === 'number') { + for (i = 0; i < space; i += 1) { + indent += ' '; + } + +// If the space parameter is a string, it will be used as the indent string. + + } else if (typeof space === 'string') { + indent = space; + } + +// If there is a replacer, it must be a function or an array. +// Otherwise, throw an error. + + rep = replacer; + if (replacer && typeof replacer !== 'function' && + (typeof replacer !== 'object' || + typeof replacer.length !== 'number')) { + throw new Error('JSON.stringify'); + } + +// Make a fake root object containing our value under the key of ''. +// Return the result of stringifying the value. + + return str('', {'': value}); + }; + +// If the JSON object does not yet have a parse method, give it one. + + JSON.parse = function (text, reviver) { + // The parse method takes a text and an optional reviver function, and returns + // a JavaScript value if the text is a valid JSON text. + + var j; + + function walk(holder, key) { + + // The walk method is used to recursively walk the resulting structure so + // that modifications can be made. + + var k, v, value = holder[key]; + if (value && typeof value === 'object') { + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = walk(value, k); + if (v !== undefined) { + value[k] = v; + } else { + delete value[k]; + } + } + } + } + return reviver.call(holder, key, value); + } + + + // Parsing happens in four stages. In the first stage, we replace certain + // Unicode characters with escape sequences. JavaScript handles many characters + // incorrectly, either silently deleting them, or treating them as line endings. + + text = String(text); + cx.lastIndex = 0; + if (cx.test(text)) { + text = text.replace(cx, function (a) { + return '\\u' + + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }); + } + + // In the second stage, we run the text against regular expressions that look + // for non-JSON patterns. We are especially concerned with '()' and 'new' + // because they can cause invocation, and '=' because it can cause mutation. + // But just to be safe, we want to reject all unexpected forms. + + // We split the second stage into 4 regexp operations in order to work around + // crippling inefficiencies in IE's and Safari's regexp engines. First we + // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we + // replace all simple value tokens with ']' characters. Third, we delete all + // open brackets that follow a colon or comma or that begin the text. Finally, + // we look to see that the remaining characters are only whitespace or ']' or + // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. + + if (/^[\],:{}\s]*$/ + .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') + .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') + .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { + + // In the third stage we use the eval function to compile the text into a + // JavaScript structure. The '{' operator is subject to a syntactic ambiguity + // in JavaScript: it can begin a block or an object literal. We wrap the text + // in parens to eliminate the ambiguity. + + j = eval('(' + text + ')'); + + // In the optional fourth stage, we recursively walk the new structure, passing + // each name/value pair to a reviver function for possible transformation. + + return typeof reviver === 'function' ? + walk({'': j}, '') : j; + } + + // If the text is not JSON parseable, then a SyntaxError is thrown. + + throw new SyntaxError('JSON.parse'); + }; + +})( + 'undefined' != typeof io ? io : module.exports + , typeof JSON !== 'undefined' ? JSON : undefined +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Parser namespace. + * + * @namespace + */ + + var parser = exports.parser = {}; + + /** + * Packet types. + */ + + var packets = parser.packets = [ + 'disconnect' + , 'connect' + , 'heartbeat' + , 'message' + , 'json' + , 'event' + , 'ack' + , 'error' + , 'noop' + ]; + + /** + * Errors reasons. + */ + + var reasons = parser.reasons = [ + 'transport not supported' + , 'client not handshaken' + , 'unauthorized' + ]; + + /** + * Errors advice. + */ + + var advice = parser.advice = [ + 'reconnect' + ]; + + /** + * Shortcuts. + */ + + var JSON = io.JSON + , indexOf = io.util.indexOf; + + /** + * Encodes a packet. + * + * @api private + */ + + parser.encodePacket = function (packet) { + var type = indexOf(packets, packet.type) + , id = packet.id || '' + , endpoint = packet.endpoint || '' + , ack = packet.ack + , data = null; + + switch (packet.type) { + case 'error': + var reason = packet.reason ? indexOf(reasons, packet.reason) : '' + , adv = packet.advice ? indexOf(advice, packet.advice) : ''; + + if (reason !== '' || adv !== '') + data = reason + (adv !== '' ? ('+' + adv) : ''); + + break; + + case 'message': + if (packet.data !== '') + data = packet.data; + break; + + case 'event': + var ev = { name: packet.name }; + + if (packet.args && packet.args.length) { + ev.args = packet.args; + } + + data = JSON.stringify(ev); + break; + + case 'json': + data = JSON.stringify(packet.data); + break; + + case 'connect': + if (packet.qs) + data = packet.qs; + break; + + case 'ack': + data = packet.ackId + + (packet.args && packet.args.length + ? '+' + JSON.stringify(packet.args) : ''); + break; + } + + // construct packet with required fragments + var encoded = [ + type + , id + (ack == 'data' ? '+' : '') + , endpoint + ]; + + // data fragment is optional + if (data !== null && data !== undefined) + encoded.push(data); + + return encoded.join(':'); + }; + + /** + * Encodes multiple messages (payload). + * + * @param {Array} messages + * @api private + */ + + parser.encodePayload = function (packets) { + var decoded = ''; + + if (packets.length == 1) + return packets[0]; + + for (var i = 0, l = packets.length; i < l; i++) { + var packet = packets[i]; + decoded += '\ufffd' + packet.length + '\ufffd' + packets[i]; + } + + return decoded; + }; + + /** + * Decodes a packet + * + * @api private + */ + + var regexp = /([^:]+):([0-9]+)?(\+)?:([^:]+)?:?([\s\S]*)?/; + + parser.decodePacket = function (data) { + var pieces = data.match(regexp); + + if (!pieces) return {}; + + var id = pieces[2] || '' + , data = pieces[5] || '' + , packet = { + type: packets[pieces[1]] + , endpoint: pieces[4] || '' + }; + + // whether we need to acknowledge the packet + if (id) { + packet.id = id; + if (pieces[3]) + packet.ack = 'data'; + else + packet.ack = true; + } + + // handle different packet types + switch (packet.type) { + case 'error': + var pieces = data.split('+'); + packet.reason = reasons[pieces[0]] || ''; + packet.advice = advice[pieces[1]] || ''; + break; + + case 'message': + packet.data = data || ''; + break; + + case 'event': + try { + var opts = JSON.parse(data); + packet.name = opts.name; + packet.args = opts.args; + } catch (e) { } + + packet.args = packet.args || []; + break; + + case 'json': + try { + packet.data = JSON.parse(data); + } catch (e) { } + break; + + case 'connect': + packet.qs = data || ''; + break; + + case 'ack': + var pieces = data.match(/^([0-9]+)(\+)?(.*)/); + if (pieces) { + packet.ackId = pieces[1]; + packet.args = []; + + if (pieces[3]) { + try { + packet.args = pieces[3] ? JSON.parse(pieces[3]) : []; + } catch (e) { } + } + } + break; + + case 'disconnect': + case 'heartbeat': + break; + }; + + return packet; + }; + + /** + * Decodes data payload. Detects multiple messages + * + * @return {Array} messages + * @api public + */ + + parser.decodePayload = function (data) { + // IE doesn't like data[i] for unicode chars, charAt works fine + if (data.charAt(0) == '\ufffd') { + var ret = []; + + for (var i = 1, length = ''; i < data.length; i++) { + if (data.charAt(i) == '\ufffd') { + ret.push(parser.decodePacket(data.substr(i + 1).substr(0, length))); + i += Number(length) + 1; + length = ''; + } else { + length += data.charAt(i); + } + } + + return ret; + } else { + return [parser.decodePacket(data)]; + } + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.Transport = Transport; + + /** + * This is the transport template for all supported transport methods. + * + * @constructor + * @api public + */ + + function Transport (socket, sessid) { + this.socket = socket; + this.sessid = sessid; + }; + + /** + * Apply EventEmitter mixin. + */ + + io.util.mixin(Transport, io.EventEmitter); + + + /** + * Indicates whether heartbeats is enabled for this transport + * + * @api private + */ + + Transport.prototype.heartbeats = function () { + return true; + }; + + /** + * Handles the response from the server. When a new response is received + * it will automatically update the timeout, decode the message and + * forwards the response to the onMessage function for further processing. + * + * @param {String} data Response from the server. + * @api private + */ + + Transport.prototype.onData = function (data) { + this.clearCloseTimeout(); + + // If the connection in currently open (or in a reopening state) reset the close + // timeout since we have just received data. This check is necessary so + // that we don't reset the timeout on an explicitly disconnected connection. + if (this.socket.connected || this.socket.connecting || this.socket.reconnecting) { + this.setCloseTimeout(); + } + + if (data !== '') { + // todo: we should only do decodePayload for xhr transports + var msgs = io.parser.decodePayload(data); + + if (msgs && msgs.length) { + for (var i = 0, l = msgs.length; i < l; i++) { + this.onPacket(msgs[i]); + } + } + } + + return this; + }; + + /** + * Handles packets. + * + * @api private + */ + + Transport.prototype.onPacket = function (packet) { + this.socket.setHeartbeatTimeout(); + + if (packet.type == 'heartbeat') { + return this.onHeartbeat(); + } + + if (packet.type == 'connect' && packet.endpoint == '') { + this.onConnect(); + } + + if (packet.type == 'error' && packet.advice == 'reconnect') { + this.isOpen = false; + } + + this.socket.onPacket(packet); + + return this; + }; + + /** + * Sets close timeout + * + * @api private + */ + + Transport.prototype.setCloseTimeout = function () { + if (!this.closeTimeout) { + var self = this; + + this.closeTimeout = setTimeout(function () { + self.onDisconnect(); + }, this.socket.closeTimeout); + } + }; + + /** + * Called when transport disconnects. + * + * @api private + */ + + Transport.prototype.onDisconnect = function () { + if (this.isOpen) this.close(); + this.clearTimeouts(); + this.socket.onDisconnect(); + return this; + }; + + /** + * Called when transport connects + * + * @api private + */ + + Transport.prototype.onConnect = function () { + this.socket.onConnect(); + return this; + }; + + /** + * Clears close timeout + * + * @api private + */ + + Transport.prototype.clearCloseTimeout = function () { + if (this.closeTimeout) { + clearTimeout(this.closeTimeout); + this.closeTimeout = null; + } + }; + + /** + * Clear timeouts + * + * @api private + */ + + Transport.prototype.clearTimeouts = function () { + this.clearCloseTimeout(); + + if (this.reopenTimeout) { + clearTimeout(this.reopenTimeout); + } + }; + + /** + * Sends a packet + * + * @param {Object} packet object. + * @api private + */ + + Transport.prototype.packet = function (packet) { + this.send(io.parser.encodePacket(packet)); + }; + + /** + * Send the received heartbeat message back to server. So the server + * knows we are still connected. + * + * @param {String} heartbeat Heartbeat response from the server. + * @api private + */ + + Transport.prototype.onHeartbeat = function (heartbeat) { + this.packet({ type: 'heartbeat' }); + }; + + /** + * Called when the transport opens. + * + * @api private + */ + + Transport.prototype.onOpen = function () { + this.isOpen = true; + this.clearCloseTimeout(); + this.socket.onOpen(); + }; + + /** + * Notifies the base when the connection with the Socket.IO server + * has been disconnected. + * + * @api private + */ + + Transport.prototype.onClose = function () { + var self = this; + + /* FIXME: reopen delay causing a infinit loop + this.reopenTimeout = setTimeout(function () { + self.open(); + }, this.socket.options['reopen delay']);*/ + + this.isOpen = false; + this.socket.onClose(); + this.onDisconnect(); + }; + + /** + * Generates a connection url based on the Socket.IO URL Protocol. + * See for more details. + * + * @returns {String} Connection url + * @api private + */ + + Transport.prototype.prepareUrl = function () { + var options = this.socket.options; + + return this.scheme() + '://' + + options.host + ':' + options.port + '/' + + options.resource + '/' + io.protocol + + '/' + this.name + '/' + this.sessid; + }; + + /** + * Checks if the transport is ready to start a connection. + * + * @param {Socket} socket The socket instance that needs a transport + * @param {Function} fn The callback + * @api private + */ + + Transport.prototype.ready = function (socket, fn) { + fn.call(this); + }; +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + */ + + exports.Socket = Socket; + + /** + * Create a new `Socket.IO client` which can establish a persistent + * connection with a Socket.IO enabled server. + * + * @api public + */ + + function Socket (options) { + this.options = { + port: 80 + , secure: false + , document: 'document' in global ? document : false + , resource: 'socket.io' + , transports: io.transports + , 'connect timeout': 10000 + , 'try multiple transports': true + , 'reconnect': true + , 'reconnection delay': 500 + , 'reconnection limit': Infinity + , 'reopen delay': 3000 + , 'max reconnection attempts': 10 + , 'sync disconnect on unload': false + , 'auto connect': true + , 'flash policy port': 10843 + , 'manualFlush': false + }; + + io.util.merge(this.options, options); + + this.connected = false; + this.open = false; + this.connecting = false; + this.reconnecting = false; + this.namespaces = {}; + this.buffer = []; + this.doBuffer = false; + + if (this.options['sync disconnect on unload'] && + (!this.isXDomain() || io.util.ua.hasCORS)) { + var self = this; + io.util.on(global, 'beforeunload', function () { + self.disconnectSync(); + }, false); + } + + if (this.options['auto connect']) { + this.connect(); + } +}; + + /** + * Apply EventEmitter mixin. + */ + + io.util.mixin(Socket, io.EventEmitter); + + /** + * Returns a namespace listener/emitter for this socket + * + * @api public + */ + + Socket.prototype.of = function (name) { + if (!this.namespaces[name]) { + this.namespaces[name] = new io.SocketNamespace(this, name); + + if (name !== '') { + this.namespaces[name].packet({ type: 'connect' }); + } + } + + return this.namespaces[name]; + }; + + /** + * Emits the given event to the Socket and all namespaces + * + * @api private + */ + + Socket.prototype.publish = function () { + this.emit.apply(this, arguments); + + var nsp; + + for (var i in this.namespaces) { + if (this.namespaces.hasOwnProperty(i)) { + nsp = this.of(i); + nsp.$emit.apply(nsp, arguments); + } + } + }; + + /** + * Performs the handshake + * + * @api private + */ + + function empty () { }; + + Socket.prototype.handshake = function (fn) { + var self = this + , options = this.options; + + function complete (data) { + if (data instanceof Error) { + self.connecting = false; + self.onError(data.message); + } else { + fn.apply(null, data.split(':')); + } + }; + + var url = [ + 'http' + (options.secure ? 's' : '') + ':/' + , options.host + ':' + options.port + , options.resource + , io.protocol + , io.util.query(this.options.query, 't=' + +new Date) + ].join('/'); + + if (this.isXDomain() && !io.util.ua.hasCORS) { + var insertAt = document.getElementsByTagName('script')[0] + , script = document.createElement('script'); + + script.src = url + '&jsonp=' + io.j.length; + insertAt.parentNode.insertBefore(script, insertAt); + + io.j.push(function (data) { + complete(data); + script.parentNode.removeChild(script); + }); + } else { + var xhr = io.util.request(); + + xhr.open('GET', url, true); + if (this.isXDomain()) { + xhr.withCredentials = true; + } + xhr.onreadystatechange = function () { + if (xhr.readyState == 4) { + xhr.onreadystatechange = empty; + + if (xhr.status == 200) { + complete(xhr.responseText); + } else if (xhr.status == 403) { + self.onError(xhr.responseText); + } else { + self.connecting = false; + !self.reconnecting && self.onError(xhr.responseText); + } + } + }; + xhr.send(null); + } + }; + + /** + * Find an available transport based on the options supplied in the constructor. + * + * @api private + */ + + Socket.prototype.getTransport = function (override) { + var transports = override || this.transports, match; + + for (var i = 0, transport; transport = transports[i]; i++) { + if (io.Transport[transport] + && io.Transport[transport].check(this) + && (!this.isXDomain() || io.Transport[transport].xdomainCheck(this))) { + return new io.Transport[transport](this, this.sessionid); + } + } + + return null; + }; + + /** + * Connects to the server. + * + * @param {Function} [fn] Callback. + * @returns {io.Socket} + * @api public + */ + + Socket.prototype.connect = function (fn) { + if (this.connecting) { + return this; + } + + var self = this; + self.connecting = true; + + this.handshake(function (sid, heartbeat, close, transports) { + self.sessionid = sid; + self.closeTimeout = close * 1000; + self.heartbeatTimeout = heartbeat * 1000; + if(!self.transports) + self.transports = self.origTransports = (transports ? io.util.intersect( + transports.split(',') + , self.options.transports + ) : self.options.transports); + + self.setHeartbeatTimeout(); + + function connect (transports){ + if (self.transport) self.transport.clearTimeouts(); + + self.transport = self.getTransport(transports); + if (!self.transport) return self.publish('connect_failed'); + + // once the transport is ready + self.transport.ready(self, function () { + self.connecting = true; + self.publish('connecting', self.transport.name); + self.transport.open(); + + if (self.options['connect timeout']) { + self.connectTimeoutTimer = setTimeout(function () { + if (!self.connected) { + self.connecting = false; + + if (self.options['try multiple transports']) { + var remaining = self.transports; + + while (remaining.length > 0 && remaining.splice(0,1)[0] != + self.transport.name) {} + + if (remaining.length){ + connect(remaining); + } else { + self.publish('connect_failed'); + } + } + } + }, self.options['connect timeout']); + } + }); + } + + connect(self.transports); + + self.once('connect', function (){ + clearTimeout(self.connectTimeoutTimer); + + fn && typeof fn == 'function' && fn(); + }); + }); + + return this; + }; + + /** + * Clears and sets a new heartbeat timeout using the value given by the + * server during the handshake. + * + * @api private + */ + + Socket.prototype.setHeartbeatTimeout = function () { + clearTimeout(this.heartbeatTimeoutTimer); + if(this.transport && !this.transport.heartbeats()) return; + + var self = this; + this.heartbeatTimeoutTimer = setTimeout(function () { + self.transport.onClose(); + }, this.heartbeatTimeout); + }; + + /** + * Sends a message. + * + * @param {Object} data packet. + * @returns {io.Socket} + * @api public + */ + + Socket.prototype.packet = function (data) { + if (this.connected && !this.doBuffer) { + this.transport.packet(data); + } else { + this.buffer.push(data); + } + + return this; + }; + + /** + * Sets buffer state + * + * @api private + */ + + Socket.prototype.setBuffer = function (v) { + this.doBuffer = v; + + if (!v && this.connected && this.buffer.length) { + if (!this.options['manualFlush']) { + this.flushBuffer(); + } + } + }; + + /** + * Flushes the buffer data over the wire. + * To be invoked manually when 'manualFlush' is set to true. + * + * @api public + */ + + Socket.prototype.flushBuffer = function() { + this.transport.payload(this.buffer); + this.buffer = []; + }; + + + /** + * Disconnect the established connect. + * + * @returns {io.Socket} + * @api public + */ + + Socket.prototype.disconnect = function () { + if (this.connected || this.connecting) { + if (this.open) { + this.of('').packet({ type: 'disconnect' }); + } + + // handle disconnection immediately + this.onDisconnect('booted'); + } + + return this; + }; + + /** + * Disconnects the socket with a sync XHR. + * + * @api private + */ + + Socket.prototype.disconnectSync = function () { + // ensure disconnection + var xhr = io.util.request(); + var uri = [ + 'http' + (this.options.secure ? 's' : '') + ':/' + , this.options.host + ':' + this.options.port + , this.options.resource + , io.protocol + , '' + , this.sessionid + ].join('/') + '/?disconnect=1'; + + xhr.open('GET', uri, false); + xhr.send(null); + + // handle disconnection immediately + this.onDisconnect('booted'); + }; + + /** + * Check if we need to use cross domain enabled transports. Cross domain would + * be a different port or different domain name. + * + * @returns {Boolean} + * @api private + */ + + Socket.prototype.isXDomain = function () { + + var port = global.location.port || + ('https:' == global.location.protocol ? 443 : 80); + + return this.options.host !== global.location.hostname + || this.options.port != port; + }; + + /** + * Called upon handshake. + * + * @api private + */ + + Socket.prototype.onConnect = function () { + if (!this.connected) { + this.connected = true; + this.connecting = false; + if (!this.doBuffer) { + // make sure to flush the buffer + this.setBuffer(false); + } + this.emit('connect'); + } + }; + + /** + * Called when the transport opens + * + * @api private + */ + + Socket.prototype.onOpen = function () { + this.open = true; + }; + + /** + * Called when the transport closes. + * + * @api private + */ + + Socket.prototype.onClose = function () { + this.open = false; + clearTimeout(this.heartbeatTimeoutTimer); + }; + + /** + * Called when the transport first opens a connection + * + * @param text + */ + + Socket.prototype.onPacket = function (packet) { + this.of(packet.endpoint).onPacket(packet); + }; + + /** + * Handles an error. + * + * @api private + */ + + Socket.prototype.onError = function (err) { + if (err && err.advice) { + if (err.advice === 'reconnect' && (this.connected || this.connecting)) { + this.disconnect(); + if (this.options.reconnect) { + this.reconnect(); + } + } + } + + this.publish('error', err && err.reason ? err.reason : err); + }; + + /** + * Called when the transport disconnects. + * + * @api private + */ + + Socket.prototype.onDisconnect = function (reason) { + var wasConnected = this.connected + , wasConnecting = this.connecting; + + this.connected = false; + this.connecting = false; + this.open = false; + + if (wasConnected || wasConnecting) { + this.transport.close(); + this.transport.clearTimeouts(); + if (wasConnected) { + this.publish('disconnect', reason); + + if ('booted' != reason && this.options.reconnect && !this.reconnecting) { + this.reconnect(); + } + } + } + }; + + /** + * Called upon reconnection. + * + * @api private + */ + + Socket.prototype.reconnect = function () { + this.reconnecting = true; + this.reconnectionAttempts = 0; + this.reconnectionDelay = this.options['reconnection delay']; + + var self = this + , maxAttempts = this.options['max reconnection attempts'] + , tryMultiple = this.options['try multiple transports'] + , limit = this.options['reconnection limit']; + + function reset () { + if (self.connected) { + for (var i in self.namespaces) { + if (self.namespaces.hasOwnProperty(i) && '' !== i) { + self.namespaces[i].packet({ type: 'connect' }); + } + } + self.publish('reconnect', self.transport.name, self.reconnectionAttempts); + } + + clearTimeout(self.reconnectionTimer); + + self.removeListener('connect_failed', maybeReconnect); + self.removeListener('connect', maybeReconnect); + + self.reconnecting = false; + + delete self.reconnectionAttempts; + delete self.reconnectionDelay; + delete self.reconnectionTimer; + delete self.redoTransports; + + self.options['try multiple transports'] = tryMultiple; + }; + + function maybeReconnect () { + if (!self.reconnecting) { + return; + } + + if (self.connected) { + return reset(); + }; + + if (self.connecting && self.reconnecting) { + return self.reconnectionTimer = setTimeout(maybeReconnect, 1000); + } + + if (self.reconnectionAttempts++ >= maxAttempts) { + if (!self.redoTransports) { + self.on('connect_failed', maybeReconnect); + self.options['try multiple transports'] = true; + self.transports = self.origTransports; + self.transport = self.getTransport(); + self.redoTransports = true; + self.connect(); + } else { + self.publish('reconnect_failed'); + reset(); + } + } else { + if (self.reconnectionDelay < limit) { + self.reconnectionDelay *= 2; // exponential back off + } + + self.connect(); + self.publish('reconnecting', self.reconnectionDelay, self.reconnectionAttempts); + self.reconnectionTimer = setTimeout(maybeReconnect, self.reconnectionDelay); + } + }; + + this.options['try multiple transports'] = false; + this.reconnectionTimer = setTimeout(maybeReconnect, this.reconnectionDelay); + + this.on('connect', maybeReconnect); + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.SocketNamespace = SocketNamespace; + + /** + * Socket namespace constructor. + * + * @constructor + * @api public + */ + + function SocketNamespace (socket, name) { + this.socket = socket; + this.name = name || ''; + this.flags = {}; + this.json = new Flag(this, 'json'); + this.ackPackets = 0; + this.acks = {}; + }; + + /** + * Apply EventEmitter mixin. + */ + + io.util.mixin(SocketNamespace, io.EventEmitter); + + /** + * Copies emit since we override it + * + * @api private + */ + + SocketNamespace.prototype.$emit = io.EventEmitter.prototype.emit; + + /** + * Creates a new namespace, by proxying the request to the socket. This + * allows us to use the synax as we do on the server. + * + * @api public + */ + + SocketNamespace.prototype.of = function () { + return this.socket.of.apply(this.socket, arguments); + }; + + /** + * Sends a packet. + * + * @api private + */ + + SocketNamespace.prototype.packet = function (packet) { + packet.endpoint = this.name; + this.socket.packet(packet); + this.flags = {}; + return this; + }; + + /** + * Sends a message + * + * @api public + */ + + SocketNamespace.prototype.send = function (data, fn) { + var packet = { + type: this.flags.json ? 'json' : 'message' + , data: data + }; + + if ('function' == typeof fn) { + packet.id = ++this.ackPackets; + packet.ack = true; + this.acks[packet.id] = fn; + } + + return this.packet(packet); + }; + + /** + * Emits an event + * + * @api public + */ + + SocketNamespace.prototype.emit = function (name) { + var args = Array.prototype.slice.call(arguments, 1) + , lastArg = args[args.length - 1] + , packet = { + type: 'event' + , name: name + }; + + if ('function' == typeof lastArg) { + packet.id = ++this.ackPackets; + packet.ack = 'data'; + this.acks[packet.id] = lastArg; + args = args.slice(0, args.length - 1); + } + + packet.args = args; + + return this.packet(packet); + }; + + /** + * Disconnects the namespace + * + * @api private + */ + + SocketNamespace.prototype.disconnect = function () { + if (this.name === '') { + this.socket.disconnect(); + } else { + this.packet({ type: 'disconnect' }); + this.$emit('disconnect'); + } + + return this; + }; + + /** + * Handles a packet + * + * @api private + */ + + SocketNamespace.prototype.onPacket = function (packet) { + var self = this; + + function ack () { + self.packet({ + type: 'ack' + , args: io.util.toArray(arguments) + , ackId: packet.id + }); + }; + + switch (packet.type) { + case 'connect': + this.$emit('connect'); + break; + + case 'disconnect': + if (this.name === '') { + this.socket.onDisconnect(packet.reason || 'booted'); + } else { + this.$emit('disconnect', packet.reason); + } + break; + + case 'message': + case 'json': + var params = ['message', packet.data]; + + if (packet.ack == 'data') { + params.push(ack); + } else if (packet.ack) { + this.packet({ type: 'ack', ackId: packet.id }); + } + + this.$emit.apply(this, params); + break; + + case 'event': + var params = [packet.name].concat(packet.args); + + if (packet.ack == 'data') + params.push(ack); + + this.$emit.apply(this, params); + break; + + case 'ack': + if (this.acks[packet.ackId]) { + this.acks[packet.ackId].apply(this, packet.args); + delete this.acks[packet.ackId]; + } + break; + + case 'error': + if (packet.advice){ + this.socket.onError(packet); + } else { + if (packet.reason == 'unauthorized') { + this.$emit('connect_failed', packet.reason); + } else { + this.$emit('error', packet.reason); + } + } + break; + } + }; + + /** + * Flag interface. + * + * @api private + */ + + function Flag (nsp, name) { + this.namespace = nsp; + this.name = name; + }; + + /** + * Send a message + * + * @api public + */ + + Flag.prototype.send = function () { + this.namespace.flags[this.name] = true; + this.namespace.send.apply(this.namespace, arguments); + }; + + /** + * Emit an event + * + * @api public + */ + + Flag.prototype.emit = function () { + this.namespace.flags[this.name] = true; + this.namespace.emit.apply(this.namespace, arguments); + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + */ + + exports.websocket = WS; + + /** + * The WebSocket transport uses the HTML5 WebSocket API to establish an + * persistent connection with the Socket.IO server. This transport will also + * be inherited by the FlashSocket fallback as it provides a API compatible + * polyfill for the WebSockets. + * + * @constructor + * @extends {io.Transport} + * @api public + */ + + function WS (socket) { + io.Transport.apply(this, arguments); + }; + + /** + * Inherits from Transport. + */ + + io.util.inherit(WS, io.Transport); + + /** + * Transport name + * + * @api public + */ + + WS.prototype.name = 'websocket'; + + /** + * Initializes a new `WebSocket` connection with the Socket.IO server. We attach + * all the appropriate listeners to handle the responses from the server. + * + * @returns {Transport} + * @api public + */ + + WS.prototype.open = function () { + var query = io.util.query(this.socket.options.query) + , self = this + , Socket + + + if (!Socket) { + Socket = global.MozWebSocket || global.WebSocket; + } + + this.websocket = new Socket(this.prepareUrl() + query); + + this.websocket.onopen = function () { + self.onOpen(); + self.socket.setBuffer(false); + }; + this.websocket.onmessage = function (ev) { + self.onData(ev.data); + }; + this.websocket.onclose = function () { + self.onClose(); + self.socket.setBuffer(true); + }; + this.websocket.onerror = function (e) { + self.onError(e); + }; + + return this; + }; + + /** + * Send a message to the Socket.IO server. The message will automatically be + * encoded in the correct message format. + * + * @returns {Transport} + * @api public + */ + + // Do to a bug in the current IDevices browser, we need to wrap the send in a + // setTimeout, when they resume from sleeping the browser will crash if + // we don't allow the browser time to detect the socket has been closed + if (io.util.ua.iDevice) { + WS.prototype.send = function (data) { + var self = this; + setTimeout(function() { + self.websocket.send(data); + },0); + return this; + }; + } else { + WS.prototype.send = function (data) { + this.websocket.send(data); + return this; + }; + } + + /** + * Payload + * + * @api private + */ + + WS.prototype.payload = function (arr) { + for (var i = 0, l = arr.length; i < l; i++) { + this.packet(arr[i]); + } + return this; + }; + + /** + * Disconnect the established `WebSocket` connection. + * + * @returns {Transport} + * @api public + */ + + WS.prototype.close = function () { + this.websocket.close(); + return this; + }; + + /** + * Handle the errors that `WebSocket` might be giving when we + * are attempting to connect or send messages. + * + * @param {Error} e The error. + * @api private + */ + + WS.prototype.onError = function (e) { + this.socket.onError(e); + }; + + /** + * Returns the appropriate scheme for the URI generation. + * + * @api private + */ + WS.prototype.scheme = function () { + return this.socket.options.secure ? 'wss' : 'ws'; + }; + + /** + * Checks if the browser has support for native `WebSockets` and that + * it's not the polyfill created for the FlashSocket transport. + * + * @return {Boolean} + * @api public + */ + + WS.check = function () { + return ('WebSocket' in global && !('__addTask' in WebSocket)) + || 'MozWebSocket' in global; + }; + + /** + * Check if the `WebSocket` transport support cross domain communications. + * + * @returns {Boolean} + * @api public + */ + + WS.xdomainCheck = function () { + return true; + }; + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('websocket'); + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.flashsocket = Flashsocket; + + /** + * The FlashSocket transport. This is a API wrapper for the HTML5 WebSocket + * specification. It uses a .swf file to communicate with the server. If you want + * to serve the .swf file from a other server than where the Socket.IO script is + * coming from you need to use the insecure version of the .swf. More information + * about this can be found on the github page. + * + * @constructor + * @extends {io.Transport.websocket} + * @api public + */ + + function Flashsocket () { + io.Transport.websocket.apply(this, arguments); + }; + + /** + * Inherits from Transport. + */ + + io.util.inherit(Flashsocket, io.Transport.websocket); + + /** + * Transport name + * + * @api public + */ + + Flashsocket.prototype.name = 'flashsocket'; + + /** + * Disconnect the established `FlashSocket` connection. This is done by adding a + * new task to the FlashSocket. The rest will be handled off by the `WebSocket` + * transport. + * + * @returns {Transport} + * @api public + */ + + Flashsocket.prototype.open = function () { + var self = this + , args = arguments; + + WebSocket.__addTask(function () { + io.Transport.websocket.prototype.open.apply(self, args); + }); + return this; + }; + + /** + * Sends a message to the Socket.IO server. This is done by adding a new + * task to the FlashSocket. The rest will be handled off by the `WebSocket` + * transport. + * + * @returns {Transport} + * @api public + */ + + Flashsocket.prototype.send = function () { + var self = this, args = arguments; + WebSocket.__addTask(function () { + io.Transport.websocket.prototype.send.apply(self, args); + }); + return this; + }; + + /** + * Disconnects the established `FlashSocket` connection. + * + * @returns {Transport} + * @api public + */ + + Flashsocket.prototype.close = function () { + WebSocket.__tasks.length = 0; + io.Transport.websocket.prototype.close.call(this); + return this; + }; + + /** + * The WebSocket fall back needs to append the flash container to the body + * element, so we need to make sure we have access to it. Or defer the call + * until we are sure there is a body element. + * + * @param {Socket} socket The socket instance that needs a transport + * @param {Function} fn The callback + * @api private + */ + + Flashsocket.prototype.ready = function (socket, fn) { + function init () { + var options = socket.options + , port = options['flash policy port'] + , path = [ + 'http' + (options.secure ? 's' : '') + ':/' + , options.host + ':' + options.port + , options.resource + , 'static/flashsocket' + , 'WebSocketMain' + (socket.isXDomain() ? 'Insecure' : '') + '.swf' + ]; + + // Only start downloading the swf file when the checked that this browser + // actually supports it + if (!Flashsocket.loaded) { + if (typeof WEB_SOCKET_SWF_LOCATION === 'undefined') { + // Set the correct file based on the XDomain settings + WEB_SOCKET_SWF_LOCATION = path.join('/'); + } + + if (port !== 843) { + WebSocket.loadFlashPolicyFile('xmlsocket://' + options.host + ':' + port); + } + + WebSocket.__initialize(); + Flashsocket.loaded = true; + } + + fn.call(self); + } + + var self = this; + if (document.body) return init(); + + io.util.load(init); + }; + + /** + * Check if the FlashSocket transport is supported as it requires that the Adobe + * Flash Player plug-in version `10.0.0` or greater is installed. And also check if + * the polyfill is correctly loaded. + * + * @returns {Boolean} + * @api public + */ + + Flashsocket.check = function () { + if ( + typeof WebSocket == 'undefined' + || !('__initialize' in WebSocket) || !swfobject + ) return false; + + return swfobject.getFlashPlayerVersion().major >= 10; + }; + + /** + * Check if the FlashSocket transport can be used as cross domain / cross origin + * transport. Because we can't see which type (secure or insecure) of .swf is used + * we will just return true. + * + * @returns {Boolean} + * @api public + */ + + Flashsocket.xdomainCheck = function () { + return true; + }; + + /** + * Disable AUTO_INITIALIZATION + */ + + if (typeof window != 'undefined') { + WEB_SOCKET_DISABLE_AUTO_INITIALIZATION = true; + } + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('flashsocket'); +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); +/* SWFObject v2.2 + is released under the MIT License +*/ +if ('undefined' != typeof window) { +var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O[(['Active'].concat('Object').join('X'))]!=D){try{var ad=new window[(['Active'].concat('Object').join('X'))](W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y0){for(var af=0;af0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad'}}aa.outerHTML='"+af+"";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab +// License: New BSD License +// Reference: http://dev.w3.org/html5/websockets/ +// Reference: http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol + +(function() { + + if ('undefined' == typeof window || window.WebSocket) return; + + var console = window.console; + if (!console || !console.log || !console.error) { + console = {log: function(){ }, error: function(){ }}; + } + + if (!swfobject.hasFlashPlayerVersion("10.0.0")) { + console.error("Flash Player >= 10.0.0 is required."); + return; + } + if (location.protocol == "file:") { + console.error( + "WARNING: web-socket-js doesn't work in file:///... URL " + + "unless you set Flash Security Settings properly. " + + "Open the page via Web server i.e. http://..."); + } + + /** + * This class represents a faux web socket. + * @param {string} url + * @param {array or string} protocols + * @param {string} proxyHost + * @param {int} proxyPort + * @param {string} headers + */ + WebSocket = function(url, protocols, proxyHost, proxyPort, headers) { + var self = this; + self.__id = WebSocket.__nextId++; + WebSocket.__instances[self.__id] = self; + self.readyState = WebSocket.CONNECTING; + self.bufferedAmount = 0; + self.__events = {}; + if (!protocols) { + protocols = []; + } else if (typeof protocols == "string") { + protocols = [protocols]; + } + // Uses setTimeout() to make sure __createFlash() runs after the caller sets ws.onopen etc. + // Otherwise, when onopen fires immediately, onopen is called before it is set. + setTimeout(function() { + WebSocket.__addTask(function() { + WebSocket.__flash.create( + self.__id, url, protocols, proxyHost || null, proxyPort || 0, headers || null); + }); + }, 0); + }; + + /** + * Send data to the web socket. + * @param {string} data The data to send to the socket. + * @return {boolean} True for success, false for failure. + */ + WebSocket.prototype.send = function(data) { + if (this.readyState == WebSocket.CONNECTING) { + throw "INVALID_STATE_ERR: Web Socket connection has not been established"; + } + // We use encodeURIComponent() here, because FABridge doesn't work if + // the argument includes some characters. We don't use escape() here + // because of this: + // https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Functions#escape_and_unescape_Functions + // But it looks decodeURIComponent(encodeURIComponent(s)) doesn't + // preserve all Unicode characters either e.g. "\uffff" in Firefox. + // Note by wtritch: Hopefully this will not be necessary using ExternalInterface. Will require + // additional testing. + var result = WebSocket.__flash.send(this.__id, encodeURIComponent(data)); + if (result < 0) { // success + return true; + } else { + this.bufferedAmount += result; + return false; + } + }; + + /** + * Close this web socket gracefully. + */ + WebSocket.prototype.close = function() { + if (this.readyState == WebSocket.CLOSED || this.readyState == WebSocket.CLOSING) { + return; + } + this.readyState = WebSocket.CLOSING; + WebSocket.__flash.close(this.__id); + }; + + /** + * Implementation of {@link DOM 2 EventTarget Interface} + * + * @param {string} type + * @param {function} listener + * @param {boolean} useCapture + * @return void + */ + WebSocket.prototype.addEventListener = function(type, listener, useCapture) { + if (!(type in this.__events)) { + this.__events[type] = []; + } + this.__events[type].push(listener); + }; + + /** + * Implementation of {@link DOM 2 EventTarget Interface} + * + * @param {string} type + * @param {function} listener + * @param {boolean} useCapture + * @return void + */ + WebSocket.prototype.removeEventListener = function(type, listener, useCapture) { + if (!(type in this.__events)) return; + var events = this.__events[type]; + for (var i = events.length - 1; i >= 0; --i) { + if (events[i] === listener) { + events.splice(i, 1); + break; + } + } + }; + + /** + * Implementation of {@link DOM 2 EventTarget Interface} + * + * @param {Event} event + * @return void + */ + WebSocket.prototype.dispatchEvent = function(event) { + var events = this.__events[event.type] || []; + for (var i = 0; i < events.length; ++i) { + events[i](event); + } + var handler = this["on" + event.type]; + if (handler) handler(event); + }; + + /** + * Handles an event from Flash. + * @param {Object} flashEvent + */ + WebSocket.prototype.__handleEvent = function(flashEvent) { + if ("readyState" in flashEvent) { + this.readyState = flashEvent.readyState; + } + if ("protocol" in flashEvent) { + this.protocol = flashEvent.protocol; + } + + var jsEvent; + if (flashEvent.type == "open" || flashEvent.type == "error") { + jsEvent = this.__createSimpleEvent(flashEvent.type); + } else if (flashEvent.type == "close") { + // TODO implement jsEvent.wasClean + jsEvent = this.__createSimpleEvent("close"); + } else if (flashEvent.type == "message") { + var data = decodeURIComponent(flashEvent.message); + jsEvent = this.__createMessageEvent("message", data); + } else { + throw "unknown event type: " + flashEvent.type; + } + + this.dispatchEvent(jsEvent); + }; + + WebSocket.prototype.__createSimpleEvent = function(type) { + if (document.createEvent && window.Event) { + var event = document.createEvent("Event"); + event.initEvent(type, false, false); + return event; + } else { + return {type: type, bubbles: false, cancelable: false}; + } + }; + + WebSocket.prototype.__createMessageEvent = function(type, data) { + if (document.createEvent && window.MessageEvent && !window.opera) { + var event = document.createEvent("MessageEvent"); + event.initMessageEvent("message", false, false, data, null, null, window, null); + return event; + } else { + // IE and Opera, the latter one truncates the data parameter after any 0x00 bytes. + return {type: type, data: data, bubbles: false, cancelable: false}; + } + }; + + /** + * Define the WebSocket readyState enumeration. + */ + WebSocket.CONNECTING = 0; + WebSocket.OPEN = 1; + WebSocket.CLOSING = 2; + WebSocket.CLOSED = 3; + + WebSocket.__flash = null; + WebSocket.__instances = {}; + WebSocket.__tasks = []; + WebSocket.__nextId = 0; + + /** + * Load a new flash security policy file. + * @param {string} url + */ + WebSocket.loadFlashPolicyFile = function(url){ + WebSocket.__addTask(function() { + WebSocket.__flash.loadManualPolicyFile(url); + }); + }; + + /** + * Loads WebSocketMain.swf and creates WebSocketMain object in Flash. + */ + WebSocket.__initialize = function() { + if (WebSocket.__flash) return; + + if (WebSocket.__swfLocation) { + // For backword compatibility. + window.WEB_SOCKET_SWF_LOCATION = WebSocket.__swfLocation; + } + if (!window.WEB_SOCKET_SWF_LOCATION) { + console.error("[WebSocket] set WEB_SOCKET_SWF_LOCATION to location of WebSocketMain.swf"); + return; + } + var container = document.createElement("div"); + container.id = "webSocketContainer"; + // Hides Flash box. We cannot use display: none or visibility: hidden because it prevents + // Flash from loading at least in IE. So we move it out of the screen at (-100, -100). + // But this even doesn't work with Flash Lite (e.g. in Droid Incredible). So with Flash + // Lite, we put it at (0, 0). This shows 1x1 box visible at left-top corner but this is + // the best we can do as far as we know now. + container.style.position = "absolute"; + if (WebSocket.__isFlashLite()) { + container.style.left = "0px"; + container.style.top = "0px"; + } else { + container.style.left = "-100px"; + container.style.top = "-100px"; + } + var holder = document.createElement("div"); + holder.id = "webSocketFlash"; + container.appendChild(holder); + document.body.appendChild(container); + // See this article for hasPriority: + // http://help.adobe.com/en_US/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-7ffd.html + swfobject.embedSWF( + WEB_SOCKET_SWF_LOCATION, + "webSocketFlash", + "1" /* width */, + "1" /* height */, + "10.0.0" /* SWF version */, + null, + null, + {hasPriority: true, swliveconnect : true, allowScriptAccess: "always"}, + null, + function(e) { + if (!e.success) { + console.error("[WebSocket] swfobject.embedSWF failed"); + } + }); + }; + + /** + * Called by Flash to notify JS that it's fully loaded and ready + * for communication. + */ + WebSocket.__onFlashInitialized = function() { + // We need to set a timeout here to avoid round-trip calls + // to flash during the initialization process. + setTimeout(function() { + WebSocket.__flash = document.getElementById("webSocketFlash"); + WebSocket.__flash.setCallerUrl(location.href); + WebSocket.__flash.setDebug(!!window.WEB_SOCKET_DEBUG); + for (var i = 0; i < WebSocket.__tasks.length; ++i) { + WebSocket.__tasks[i](); + } + WebSocket.__tasks = []; + }, 0); + }; + + /** + * Called by Flash to notify WebSockets events are fired. + */ + WebSocket.__onFlashEvent = function() { + setTimeout(function() { + try { + // Gets events using receiveEvents() instead of getting it from event object + // of Flash event. This is to make sure to keep message order. + // It seems sometimes Flash events don't arrive in the same order as they are sent. + var events = WebSocket.__flash.receiveEvents(); + for (var i = 0; i < events.length; ++i) { + WebSocket.__instances[events[i].webSocketId].__handleEvent(events[i]); + } + } catch (e) { + console.error(e); + } + }, 0); + return true; + }; + + // Called by Flash. + WebSocket.__log = function(message) { + console.log(decodeURIComponent(message)); + }; + + // Called by Flash. + WebSocket.__error = function(message) { + console.error(decodeURIComponent(message)); + }; + + WebSocket.__addTask = function(task) { + if (WebSocket.__flash) { + task(); + } else { + WebSocket.__tasks.push(task); + } + }; + + /** + * Test if the browser is running flash lite. + * @return {boolean} True if flash lite is running, false otherwise. + */ + WebSocket.__isFlashLite = function() { + if (!window.navigator || !window.navigator.mimeTypes) { + return false; + } + var mimeType = window.navigator.mimeTypes["application/x-shockwave-flash"]; + if (!mimeType || !mimeType.enabledPlugin || !mimeType.enabledPlugin.filename) { + return false; + } + return mimeType.enabledPlugin.filename.match(/flashlite/i) ? true : false; + }; + + if (!window.WEB_SOCKET_DISABLE_AUTO_INITIALIZATION) { + if (window.addEventListener) { + window.addEventListener("load", function(){ + WebSocket.__initialize(); + }, false); + } else { + window.attachEvent("onload", function(){ + WebSocket.__initialize(); + }); + } + } + +})(); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + * + * @api public + */ + + exports.XHR = XHR; + + /** + * XHR constructor + * + * @costructor + * @api public + */ + + function XHR (socket) { + if (!socket) return; + + io.Transport.apply(this, arguments); + this.sendBuffer = []; + }; + + /** + * Inherits from Transport. + */ + + io.util.inherit(XHR, io.Transport); + + /** + * Establish a connection + * + * @returns {Transport} + * @api public + */ + + XHR.prototype.open = function () { + this.socket.setBuffer(false); + this.onOpen(); + this.get(); + + // we need to make sure the request succeeds since we have no indication + // whether the request opened or not until it succeeded. + this.setCloseTimeout(); + + return this; + }; + + /** + * Check if we need to send data to the Socket.IO server, if we have data in our + * buffer we encode it and forward it to the `post` method. + * + * @api private + */ + + XHR.prototype.payload = function (payload) { + var msgs = []; + + for (var i = 0, l = payload.length; i < l; i++) { + msgs.push(io.parser.encodePacket(payload[i])); + } + + this.send(io.parser.encodePayload(msgs)); + }; + + /** + * Send data to the Socket.IO server. + * + * @param data The message + * @returns {Transport} + * @api public + */ + + XHR.prototype.send = function (data) { + this.post(data); + return this; + }; + + /** + * Posts a encoded message to the Socket.IO server. + * + * @param {String} data A encoded message. + * @api private + */ + + function empty () { }; + + XHR.prototype.post = function (data) { + var self = this; + this.socket.setBuffer(true); + + function stateChange () { + if (this.readyState == 4) { + this.onreadystatechange = empty; + self.posting = false; + + if (this.status == 200){ + self.socket.setBuffer(false); + } else { + self.onClose(); + } + } + } + + function onload () { + this.onload = empty; + self.socket.setBuffer(false); + }; + + this.sendXHR = this.request('POST'); + + if (global.XDomainRequest && this.sendXHR instanceof XDomainRequest) { + this.sendXHR.onload = this.sendXHR.onerror = onload; + } else { + this.sendXHR.onreadystatechange = stateChange; + } + + this.sendXHR.send(data); + }; + + /** + * Disconnects the established `XHR` connection. + * + * @returns {Transport} + * @api public + */ + + XHR.prototype.close = function () { + this.onClose(); + return this; + }; + + /** + * Generates a configured XHR request + * + * @param {String} url The url that needs to be requested. + * @param {String} method The method the request should use. + * @returns {XMLHttpRequest} + * @api private + */ + + XHR.prototype.request = function (method) { + var req = io.util.request(this.socket.isXDomain()) + , query = io.util.query(this.socket.options.query, 't=' + +new Date); + + req.open(method || 'GET', this.prepareUrl() + query, true); + + if (method == 'POST') { + try { + if (req.setRequestHeader) { + req.setRequestHeader('Content-type', 'text/plain;charset=UTF-8'); + } else { + // XDomainRequest + req.contentType = 'text/plain'; + } + } catch (e) {} + } + + return req; + }; + + /** + * Returns the scheme to use for the transport URLs. + * + * @api private + */ + + XHR.prototype.scheme = function () { + return this.socket.options.secure ? 'https' : 'http'; + }; + + /** + * Check if the XHR transports are supported + * + * @param {Boolean} xdomain Check if we support cross domain requests. + * @returns {Boolean} + * @api public + */ + + XHR.check = function (socket, xdomain) { + try { + var request = io.util.request(xdomain), + usesXDomReq = (global.XDomainRequest && request instanceof XDomainRequest), + socketProtocol = (socket && socket.options && socket.options.secure ? 'https:' : 'http:'), + isXProtocol = (global.location && socketProtocol != global.location.protocol); + if (request && !(usesXDomReq && isXProtocol)) { + return true; + } + } catch(e) {} + + return false; + }; + + /** + * Check if the XHR transport supports cross domain requests. + * + * @returns {Boolean} + * @api public + */ + + XHR.xdomainCheck = function (socket) { + return XHR.check(socket, true); + }; + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.htmlfile = HTMLFile; + + /** + * The HTMLFile transport creates a `forever iframe` based transport + * for Internet Explorer. Regular forever iframe implementations will + * continuously trigger the browsers buzy indicators. If the forever iframe + * is created inside a `htmlfile` these indicators will not be trigged. + * + * @constructor + * @extends {io.Transport.XHR} + * @api public + */ + + function HTMLFile (socket) { + io.Transport.XHR.apply(this, arguments); + }; + + /** + * Inherits from XHR transport. + */ + + io.util.inherit(HTMLFile, io.Transport.XHR); + + /** + * Transport name + * + * @api public + */ + + HTMLFile.prototype.name = 'htmlfile'; + + /** + * Creates a new Ac...eX `htmlfile` with a forever loading iframe + * that can be used to listen to messages. Inside the generated + * `htmlfile` a reference will be made to the HTMLFile transport. + * + * @api private + */ + + HTMLFile.prototype.get = function () { + this.doc = new window[(['Active'].concat('Object').join('X'))]('htmlfile'); + this.doc.open(); + this.doc.write(''); + this.doc.close(); + this.doc.parentWindow.s = this; + + var iframeC = this.doc.createElement('div'); + iframeC.className = 'socketio'; + + this.doc.body.appendChild(iframeC); + this.iframe = this.doc.createElement('iframe'); + + iframeC.appendChild(this.iframe); + + var self = this + , query = io.util.query(this.socket.options.query, 't='+ +new Date); + + this.iframe.src = this.prepareUrl() + query; + + io.util.on(window, 'unload', function () { + self.destroy(); + }); + }; + + /** + * The Socket.IO server will write script tags inside the forever + * iframe, this function will be used as callback for the incoming + * information. + * + * @param {String} data The message + * @param {document} doc Reference to the context + * @api private + */ + + HTMLFile.prototype._ = function (data, doc) { + // unescape all forward slashes. see GH-1251 + data = data.replace(/\\\//g, '/'); + this.onData(data); + try { + var script = doc.getElementsByTagName('script')[0]; + script.parentNode.removeChild(script); + } catch (e) { } + }; + + /** + * Destroy the established connection, iframe and `htmlfile`. + * And calls the `CollectGarbage` function of Internet Explorer + * to release the memory. + * + * @api private + */ + + HTMLFile.prototype.destroy = function () { + if (this.iframe){ + try { + this.iframe.src = 'about:blank'; + } catch(e){} + + this.doc = null; + this.iframe.parentNode.removeChild(this.iframe); + this.iframe = null; + + CollectGarbage(); + } + }; + + /** + * Disconnects the established connection. + * + * @returns {Transport} Chaining. + * @api public + */ + + HTMLFile.prototype.close = function () { + this.destroy(); + return io.Transport.XHR.prototype.close.call(this); + }; + + /** + * Checks if the browser supports this transport. The browser + * must have an `Ac...eXObject` implementation. + * + * @return {Boolean} + * @api public + */ + + HTMLFile.check = function (socket) { + if (typeof window != "undefined" && (['Active'].concat('Object').join('X')) in window){ + try { + var a = new window[(['Active'].concat('Object').join('X'))]('htmlfile'); + return a && io.Transport.XHR.check(socket); + } catch(e){} + } + return false; + }; + + /** + * Check if cross domain requests are supported. + * + * @returns {Boolean} + * @api public + */ + + HTMLFile.xdomainCheck = function () { + // we can probably do handling for sub-domains, we should + // test that it's cross domain but a subdomain here + return false; + }; + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('htmlfile'); + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + */ + + exports['xhr-polling'] = XHRPolling; + + /** + * The XHR-polling transport uses long polling XHR requests to create a + * "persistent" connection with the server. + * + * @constructor + * @api public + */ + + function XHRPolling () { + io.Transport.XHR.apply(this, arguments); + }; + + /** + * Inherits from XHR transport. + */ + + io.util.inherit(XHRPolling, io.Transport.XHR); + + /** + * Merge the properties from XHR transport + */ + + io.util.merge(XHRPolling, io.Transport.XHR); + + /** + * Transport name + * + * @api public + */ + + XHRPolling.prototype.name = 'xhr-polling'; + + /** + * Indicates whether heartbeats is enabled for this transport + * + * @api private + */ + + XHRPolling.prototype.heartbeats = function () { + return false; + }; + + /** + * Establish a connection, for iPhone and Android this will be done once the page + * is loaded. + * + * @returns {Transport} Chaining. + * @api public + */ + + XHRPolling.prototype.open = function () { + var self = this; + + io.Transport.XHR.prototype.open.call(self); + return false; + }; + + /** + * Starts a XHR request to wait for incoming messages. + * + * @api private + */ + + function empty () {}; + + XHRPolling.prototype.get = function () { + if (!this.isOpen) return; + + var self = this; + + function stateChange () { + if (this.readyState == 4) { + this.onreadystatechange = empty; + + if (this.status == 200) { + self.onData(this.responseText); + self.get(); + } else { + self.onClose(); + } + } + }; + + function onload () { + this.onload = empty; + this.onerror = empty; + self.retryCounter = 1; + self.onData(this.responseText); + self.get(); + }; + + function onerror () { + self.retryCounter ++; + if(!self.retryCounter || self.retryCounter > 3) { + self.onClose(); + } else { + self.get(); + } + }; + + this.xhr = this.request(); + + if (global.XDomainRequest && this.xhr instanceof XDomainRequest) { + this.xhr.onload = onload; + this.xhr.onerror = onerror; + } else { + this.xhr.onreadystatechange = stateChange; + } + + this.xhr.send(null); + }; + + /** + * Handle the unclean close behavior. + * + * @api private + */ + + XHRPolling.prototype.onClose = function () { + io.Transport.XHR.prototype.onClose.call(this); + + if (this.xhr) { + this.xhr.onreadystatechange = this.xhr.onload = this.xhr.onerror = empty; + try { + this.xhr.abort(); + } catch(e){} + this.xhr = null; + } + }; + + /** + * Webkit based browsers show a infinit spinner when you start a XHR request + * before the browsers onload event is called so we need to defer opening of + * the transport until the onload event is called. Wrapping the cb in our + * defer method solve this. + * + * @param {Socket} socket The socket instance that needs a transport + * @param {Function} fn The callback + * @api private + */ + + XHRPolling.prototype.ready = function (socket, fn) { + var self = this; + + io.util.defer(function () { + fn.call(self); + }); + }; + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('xhr-polling'); + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io, global) { + /** + * There is a way to hide the loading indicator in Firefox. If you create and + * remove a iframe it will stop showing the current loading indicator. + * Unfortunately we can't feature detect that and UA sniffing is evil. + * + * @api private + */ + + var indicator = global.document && "MozAppearance" in + global.document.documentElement.style; + + /** + * Expose constructor. + */ + + exports['jsonp-polling'] = JSONPPolling; + + /** + * The JSONP transport creates an persistent connection by dynamically + * inserting a script tag in the page. This script tag will receive the + * information of the Socket.IO server. When new information is received + * it creates a new script tag for the new data stream. + * + * @constructor + * @extends {io.Transport.xhr-polling} + * @api public + */ + + function JSONPPolling (socket) { + io.Transport['xhr-polling'].apply(this, arguments); + + this.index = io.j.length; + + var self = this; + + io.j.push(function (msg) { + self._(msg); + }); + }; + + /** + * Inherits from XHR polling transport. + */ + + io.util.inherit(JSONPPolling, io.Transport['xhr-polling']); + + /** + * Transport name + * + * @api public + */ + + JSONPPolling.prototype.name = 'jsonp-polling'; + + /** + * Posts a encoded message to the Socket.IO server using an iframe. + * The iframe is used because script tags can create POST based requests. + * The iframe is positioned outside of the view so the user does not + * notice it's existence. + * + * @param {String} data A encoded message. + * @api private + */ + + JSONPPolling.prototype.post = function (data) { + var self = this + , query = io.util.query( + this.socket.options.query + , 't='+ (+new Date) + '&i=' + this.index + ); + + if (!this.form) { + var form = document.createElement('form') + , area = document.createElement('textarea') + , id = this.iframeId = 'socketio_iframe_' + this.index + , iframe; + + form.className = 'socketio'; + form.style.position = 'absolute'; + form.style.top = '0px'; + form.style.left = '0px'; + form.style.display = 'none'; + form.target = id; + form.method = 'POST'; + form.setAttribute('accept-charset', 'utf-8'); + area.name = 'd'; + form.appendChild(area); + document.body.appendChild(form); + + this.form = form; + this.area = area; + } + + this.form.action = this.prepareUrl() + query; + + function complete () { + initIframe(); + self.socket.setBuffer(false); + }; + + function initIframe () { + if (self.iframe) { + self.form.removeChild(self.iframe); + } + + try { + // ie6 dynamic iframes with target="" support (thanks Chris Lambacher) + iframe = document.createElement('') + storageContainer.close() + storageOwner = storageContainer.w.frames[0].document + storage = storageOwner.createElement('div') + } catch(e) { + // somehow ActiveXObject instantiation failed (perhaps some special + // security settings or otherwse), fall back to per-path storage + storage = doc.createElement('div') + storageOwner = doc.body + } + function withIEStorage(storeFunction) { + return function() { + var args = Array.prototype.slice.call(arguments, 0) + args.unshift(storage) + // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx + // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx + storageOwner.appendChild(storage) + storage.addBehavior('#default#userData') + storage.load(localStorageName) + var result = storeFunction.apply(store, args) + storageOwner.removeChild(storage) + return result + } + } + + // In IE7, keys may not contain special chars. See all of https://github.com/marcuswestin/store.js/issues/40 + var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g") + function ieKeyFix(key) { + return key.replace(forbiddenCharsRegex, '___') + } + store.set = withIEStorage(function(storage, key, val) { + key = ieKeyFix(key) + if (val === undefined) { return store.remove(key) } + storage.setAttribute(key, store.serialize(val)) + storage.save(localStorageName) + return val + }) + store.get = withIEStorage(function(storage, key) { + key = ieKeyFix(key) + return store.deserialize(storage.getAttribute(key)) + }) + store.remove = withIEStorage(function(storage, key) { + key = ieKeyFix(key) + storage.removeAttribute(key) + storage.save(localStorageName) + }) + store.clear = withIEStorage(function(storage) { + var attributes = storage.XMLDocument.documentElement.attributes + storage.load(localStorageName) + for (var i=0, attr; attr=attributes[i]; i++) { + storage.removeAttribute(attr.name) + } + storage.save(localStorageName) + }) + store.getAll = withIEStorage(function(storage) { + var attributes = storage.XMLDocument.documentElement.attributes + var ret = {} + for (var i=0, attr; attr=attributes[i]; ++i) { + var key = ieKeyFix(attr.name) + ret[attr.name] = store.deserialize(storage.getAttribute(key)) + } + return ret + }) + } + + try { + store.set(namespace, namespace) + if (store.get(namespace) != namespace) { store.disabled = true } + store.remove(namespace) + } catch(e) { + store.disabled = true + } + store.enabled = !store.disabled + if (typeof module != 'undefined' && module.exports) { module.exports = store } + else if (typeof define === 'function' && define.amd) { define("store", store) } + else { win.store = store } +})(this.window || global); + +/* @source mod/user_following.js */; + +define('store', 'lib/store.js'); +define('mod/user_following', [ + "jquery", + "store" +], function($, store) { + var API_USER_FOLLOWING_PATH = "/api/user/following" + var USER_FOLLOWING_KEY = "user-following"; + var USER_FOLLOWING_UPDATE_KEY= "date:user-following" + var ONE_DAY_IN_SECONDS = 60*60*24; + + var update = function() { + var currentTime = new Date().getTime(); + var lastTime = store.get(USER_FOLLOWING_UPDATE_KEY); + if (lastTime && (currentTime - lastTime) < ONE_DAY_IN_SECONDS ) { + return; + } + + $.ajax( + API_USER_FOLLOWING_PATH + ).done(function(users){ + var following = $.map(users, function(item){ + return item["username"]; + }); + store.set(USER_FOLLOWING_KEY, following); + store.set(USER_FOLLOWING_UPDATE_KEY, currentTime); + }).fail(function(jqxhr, textStatus, error){ + return; + }); + } + + return { + update: update, + val: function(){ + return store.get(USER_FOLLOWING_KEY) || []; + } + }; + +}); + +/* @source mod/input-ext.js */; + +define('mousetrap', 'lib/mousetrap.js'); + +define("mod/input-ext", + [ + "jquery", + "mod/user_following", + "jquery-caret", + "jquery-atwho", + "mousetrap", + "lib/zen-form" +], + function ($, userFollowing) { + var inputExt = {}; + var emojis = [ + 'airplane', 'alien', 'art', 'bear', 'beer', 'bike', 'bomb', 'book', + 'bulb', 'bus', 'cake', 'calling', 'clap', 'cocktail', 'code', 'computer', + 'cool', 'cop', 'email', 'feet', 'fire', 'fish', 'fist', 'gift', 'hammer', + 'heart', 'iphone', 'key', 'leaves', 'lgtm', 'lipstick', 'lock', 'mag', 'mega', + 'memo', 'moneybag', 'new', 'octocat', 'ok', 'palm_tree', 'pencil', 'punch', + 'runner', 'scissors', 'ship', 'shipit', 'ski', 'smile', 'smoking', 'sparkles', + 'star', 'sunny', 'taxi', 'thumbsdown', 'thumbsup', 'tm', 'tophat', 'train', + 'trollface', 'v', 'vs', 'warning', 'wheelchair', 'zap', 'zzz', 'see_no_evil', + 'hear_no_evil', 'speak_no_evil', 'monkey', 'monkey_face', 'manybeers', 'beers', + 'hhkb', 'ruby' + ], emoji_list = $.map(emojis, function(value, i) {return {key: value + ':', name:value};}); + inputExt.enableEmojiInput = function (el) { + el.atwho('(?:^|\\s):', + {data:emoji_list, limit:7, + tpl:'
  • ${name}
  • '}); + return el; + }; + + inputExt.enableAutoCompleteFollowingAndTeam = function (el) { + var teams = JSON.parse($('#all-teams').val() || '[]'); + var users = teams.concat(userFollowing.val()); + + $(el).atwho("@", { + data: users, + limit: 7 + }); + }; + + // 输入#自动提示pr信息 + inputExt.enablePullsInput = function (el) { + var projectName = el.attr('data-project-name'); + if (!projectName) return el; + $.getJSON('/' + projectName + '/pulls/all_data', function (r) { + var pulls = $.map( + r, function(value, i) { + return {key: value.id, name:value.id + ' ' + value.title, title:value.title}; + }); + el.atwho('(?:^|\\s)#', + {data:pulls, limit:7, + tpl:'
  • #${key} ${title}
  • '}); + }); + return el; + }; + + inputExt.shortcut2submit = function (el) { + Mousetrap.bind( + ['command+enter', 'ctrl+enter'], + function (e) { + if (el && (e.srcElement || e.target) == $(el)[0] && !$(el).closest('form').hasClass('submitting')) { + e.preventDefault ? e.preventDefault() : (e.returnValue = false); + $(el).closest('form').addClass('submitting').submit(); + } + }, + 'keydown' + ); + }; + + // 进入全屏模式 + inputExt.enableZenMode = function (el) { + var trigger = '.go-zen'; + el = $(el); + el.zenForm({trigger:trigger, theme:'light'}).dblclick(function(e) { + if (!e.altKey) return; + $(this).zenForm({ trigger: null, theme: 'light' }); + fix(); + }); + + $(trigger).click(fix); + + function fix() { + var textarea = $('.zen-forms-input-wrap textarea'); + if (textarea) { + inputExt.enableEmojiInput(textarea); + textarea.attr({ + 'data-project-name': el.attr('data-project-name'), + 'placeholder': el.attr('placeholder') + }); + + inputExt.enablePullsInput(textarea); + + var participants = $('#participants').val(); + if (participants) { + participants = JSON.parse(participants); + textarea.atwho("@", {data:participants, limit:7}); + } + + // 因为zen-form设置的z-index非常高(99999)所以将at-view调更高 + $('#at-view').css('z-index', 100000); + } + } + }; + + var focusToEnd = function(els) { + return $(els).each(function() { + var v = $(this).val(); + $(this).focus().val("").val(v); + }); + }; + + inputExt.enableQuickQuotes = function (el) { + Mousetrap.bind( + ['r'], + function (e) { + var oldVal = $(el).val(), newVal, selVal = window.getSelection().toString(); + selVal = '> ' + selVal.split('\n').join('\n> '); + newVal = oldVal.concat((oldVal != '') ? '\n\n':'', selVal, '\n\n'); + $("html, body").animate({scrollTop: $(document).height()}, "slow"); + $(el).val(newVal); + focusToEnd(el); + }, + 'keyup' + ); + }; + + inputExt.enableFileUpload = function (uploader, textarea, is_image) { + uploader.submit( + function() { + $(this).ajaxSubmit({ + dataType: 'json', + type: 'POST', + delegation: true, + success: function(r) { + var oldText = textarea.val(), + newText = oldText + + (oldText.length == 0 ? '' : '\n') + + (is_image? '!' : '') + + '[' + r.origin_filename + '](' + r.url + ')'; + textarea.val(newText); + }, + error: function(r) { + alert("上传错误,请确认您上传的文件类型合法"); + } + }); + return false; + }); + + uploader.find('input').change(function () { + uploader.submit(); + }); + }; + + inputExt.enableImageUpload = function (uploader, textarea) { + inputExt.enableFileUpload(uploader,textarea, true); + }; + + inputExt.enableUpload = function(upload_widget,textarea){ + inputExt.enableImageUpload(upload_widget.find(".upload-image-form"),textarea); + inputExt.enableFileUpload(upload_widget.find(".upload-file-form"),textarea); + }; + + return inputExt; + } +); + +/* @source */; + +define('mousetrap', 'lib/mousetrap.js'); +define('tag-it', 'lib/tag-it.js'); + +require( + ['jquery' + , 'mod/input-ext' + , 'jquery-caret' + , 'jquery-atwho' + , 'jquery-timeago' + , 'bootstrap' + , 'mod/watch' + , 'mousetrap' + , 'tag-it'], + function($, inputExt){ + $(function () { + inputExt.enableZenMode('#pull_body'); + inputExt.enableAutoCompleteFollowingAndTeam('#pull_body'); + //previewable-comment-form + $('.previewable-comment-form .js-preview-tabs a.preview-tab').on('show', function(e) { + $('#preview_bucket p').html("Loading preview..."); + }).on('shown', function(e) { + var url = $('#preview_bucket .content-body').data('api-url'); + var text = $('#write_bucket textarea').val(); + $('#preview_bucket .content-body').load(url, {text: text}); + }); + + $('.new-issue form').submit( + function () { + $(this).find('button[type="submit"]').attr('disabled', true).addClass('disabled'); + //Google Analytic Events + ga('send', 'event', 'issue', 'create'); + } + ); + + var uploader = $('#form-file-upload'), + textarea = $('#write_bucket textarea'); + inputExt.enableUpload(uploader, textarea); + + $('#issue-tags').tagit({input_name: 'issue_tags', tag_list: $('.label')}); + + }); + }); diff --git a/dist/js/app/issue/team-issue.js b/dist/js/app/issue/team-issue.js new file mode 100644 index 0000000..22af399 --- /dev/null +++ b/dist/js/app/issue/team-issue.js @@ -0,0 +1,6573 @@ + +require.config({ enable_ozma: true }); + + +/* @source lib/mousetrap.js */; + +/** + * Copyright 2012 Craig Campbell + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Mousetrap is a simple keyboard shortcut library for Javascript with + * no external dependencies + * + * @version 1.2.2 + * @url craig.is/killing/mice + */ +(function() { + + /** + * mapping of special keycodes to their corresponding keys + * + * everything in this dictionary cannot use keypress events + * so it has to be here to map to the correct keycodes for + * keyup/keydown events + * + * @type {Object} + */ + var _MAP = { + 8: 'backspace', + 9: 'tab', + 13: 'enter', + 16: 'shift', + 17: 'ctrl', + 18: 'alt', + 20: 'capslock', + 27: 'esc', + 32: 'space', + 33: 'pageup', + 34: 'pagedown', + 35: 'end', + 36: 'home', + 37: 'left', + 38: 'up', + 39: 'right', + 40: 'down', + 45: 'ins', + 46: 'del', + 91: 'meta', + 93: 'meta', + 224: 'meta' + }, + + /** + * mapping for special characters so they can support + * + * this dictionary is only used incase you want to bind a + * keyup or keydown event to one of these keys + * + * @type {Object} + */ + _KEYCODE_MAP = { + 106: '*', + 107: '+', + 109: '-', + 110: '.', + 111 : '/', + 186: ';', + 187: '=', + 188: ',', + 189: '-', + 190: '.', + 191: '/', + 192: '`', + 219: '[', + 220: '\\', + 221: ']', + 222: '\'' + }, + + /** + * this is a mapping of keys that require shift on a US keypad + * back to the non shift equivelents + * + * this is so you can use keyup events with these keys + * + * note that this will only work reliably on US keyboards + * + * @type {Object} + */ + _SHIFT_MAP = { + '~': '`', + '!': '1', + '@': '2', + '#': '3', + '$': '4', + '%': '5', + '^': '6', + '&': '7', + '*': '8', + '(': '9', + ')': '0', + '_': '-', + '+': '=', + ':': ';', + '\"': '\'', + '<': ',', + '>': '.', + '?': '/', + '|': '\\' + }, + + /** + * this is a list of special strings you can use to map + * to modifier keys when you specify your keyboard shortcuts + * + * @type {Object} + */ + _SPECIAL_ALIASES = { + 'option': 'alt', + 'command': 'meta', + 'return': 'enter', + 'escape': 'esc' + }, + + /** + * variable to store the flipped version of _MAP from above + * needed to check if we should use keypress or not when no action + * is specified + * + * @type {Object|undefined} + */ + _REVERSE_MAP, + + /** + * a list of all the callbacks setup via Mousetrap.bind() + * + * @type {Object} + */ + _callbacks = {}, + + /** + * direct map of string combinations to callbacks used for trigger() + * + * @type {Object} + */ + _direct_map = {}, + + /** + * keeps track of what level each sequence is at since multiple + * sequences can start out with the same sequence + * + * @type {Object} + */ + _sequence_levels = {}, + + /** + * variable to store the setTimeout call + * + * @type {null|number} + */ + _reset_timer, + + /** + * temporary state where we will ignore the next keyup + * + * @type {boolean|string} + */ + _ignore_next_keyup = false, + + /** + * are we currently inside of a sequence? + * type of action ("keyup" or "keydown" or "keypress") or false + * + * @type {boolean|string} + */ + _sequence_type = false; + + /** + * loop through the f keys, f1 to f19 and add them to the map + * programatically + */ + for (var i = 1; i < 20; ++i) { + _MAP[111 + i] = 'f' + i; + } + + /** + * loop through to map numbers on the numeric keypad + */ + for (i = 0; i <= 9; ++i) { + _MAP[i + 96] = i; + } + + /** + * cross browser add event method + * + * @param {Element|HTMLDocument} object + * @param {string} type + * @param {Function} callback + * @returns void + */ + function _addEvent(object, type, callback) { + if (object.addEventListener) { + object.addEventListener(type, callback, false); + return; + } + + object.attachEvent('on' + type, callback); + } + + /** + * takes the event and returns the key character + * + * @param {Event} e + * @return {string} + */ + function _characterFromEvent(e) { + + // for keypress events we should return the character as is + if (e.type == 'keypress') { + return String.fromCharCode(e.which); + } + + // for non keypress events the special maps are needed + if (_MAP[e.which]) { + return _MAP[e.which]; + } + + if (_KEYCODE_MAP[e.which]) { + return _KEYCODE_MAP[e.which]; + } + + // if it is not in the special map + return String.fromCharCode(e.which).toLowerCase(); + } + + /** + * checks if two arrays are equal + * + * @param {Array} modifiers1 + * @param {Array} modifiers2 + * @returns {boolean} + */ + function _modifiersMatch(modifiers1, modifiers2) { + return modifiers1.sort().join(',') === modifiers2.sort().join(','); + } + + /** + * resets all sequence counters except for the ones passed in + * + * @param {Object} do_not_reset + * @returns void + */ + function _resetSequences(do_not_reset, max_level) { + do_not_reset = do_not_reset || {}; + + var active_sequences = false, + key; + + for (key in _sequence_levels) { + if (do_not_reset[key] && _sequence_levels[key] > max_level) { + active_sequences = true; + continue; + } + _sequence_levels[key] = 0; + } + + if (!active_sequences) { + _sequence_type = false; + } + } + + /** + * finds all callbacks that match based on the keycode, modifiers, + * and action + * + * @param {string} character + * @param {Array} modifiers + * @param {Event|Object} e + * @param {boolean=} remove - should we remove any matches + * @param {string=} combination + * @returns {Array} + */ + function _getMatches(character, modifiers, e, remove, combination) { + var i, + callback, + matches = [], + action = e.type; + + // if there are no events related to this keycode + if (!_callbacks[character]) { + return []; + } + + // if a modifier key is coming up on its own we should allow it + if (action == 'keyup' && _isModifier(character)) { + modifiers = [character]; + } + + // loop through all callbacks for the key that was pressed + // and see if any of them match + for (i = 0; i < _callbacks[character].length; ++i) { + callback = _callbacks[character][i]; + + // if this is a sequence but it is not at the right level + // then move onto the next match + if (callback.seq && _sequence_levels[callback.seq] != callback.level) { + continue; + } + + // if the action we are looking for doesn't match the action we got + // then we should keep going + if (action != callback.action) { + continue; + } + + // if this is a keypress event and the meta key and control key + // are not pressed that means that we need to only look at the + // character, otherwise check the modifiers as well + // + // chrome will not fire a keypress if meta or control is down + // safari will fire a keypress if meta or meta+shift is down + // firefox will fire a keypress if meta or control is down + if ((action == 'keypress' && !e.metaKey && !e.ctrlKey) || _modifiersMatch(modifiers, callback.modifiers)) { + + // remove is used so if you change your mind and call bind a + // second time with a new function the first one is overwritten + if (remove && callback.combo == combination) { + _callbacks[character].splice(i, 1); + } + + matches.push(callback); + } + } + + return matches; + } + + /** + * takes a key event and figures out what the modifiers are + * + * @param {Event} e + * @returns {Array} + */ + function _eventModifiers(e) { + var modifiers = []; + + if (e.shiftKey) { + modifiers.push('shift'); + } + + if (e.altKey) { + modifiers.push('alt'); + } + + if (e.ctrlKey) { + modifiers.push('ctrl'); + } + + if (e.metaKey) { + modifiers.push('meta'); + } + + return modifiers; + } + + /** + * actually calls the callback function + * + * if your callback function returns false this will use the jquery + * convention - prevent default and stop propogation on the event + * + * @param {Function} callback + * @param {Event} e + * @returns void + */ + function _fireCallback(callback, e, combo) { + + // if this event should not happen stop here + if (Mousetrap.stopCallback(e, e.target || e.srcElement, combo)) { + return; + } + + if (callback(e, combo) === false) { + if (e.preventDefault) { + e.preventDefault(); + } + + if (e.stopPropagation) { + e.stopPropagation(); + } + + e.returnValue = false; + e.cancelBubble = true; + } + } + + /** + * handles a character key event + * + * @param {string} character + * @param {Event} e + * @returns void + */ + function _handleCharacter(character, e) { + var callbacks = _getMatches(character, _eventModifiers(e), e), + i, + do_not_reset = {}, + max_level = 0, + processed_sequence_callback = false; + + // loop through matching callbacks for this key event + for (i = 0; i < callbacks.length; ++i) { + + // fire for all sequence callbacks + // this is because if for example you have multiple sequences + // bound such as "g i" and "g t" they both need to fire the + // callback for matching g cause otherwise you can only ever + // match the first one + if (callbacks[i].seq) { + processed_sequence_callback = true; + + // as we loop through keep track of the max + // any sequence at a lower level will be discarded + max_level = Math.max(max_level, callbacks[i].level); + + // keep a list of which sequences were matches for later + do_not_reset[callbacks[i].seq] = 1; + _fireCallback(callbacks[i].callback, e, callbacks[i].combo); + continue; + } + + // if there were no sequence matches but we are still here + // that means this is a regular match so we should fire that + if (!processed_sequence_callback && !_sequence_type) { + _fireCallback(callbacks[i].callback, e, callbacks[i].combo); + } + } + + // if you are inside of a sequence and the key you are pressing + // is not a modifier key then we should reset all sequences + // that were not matched by this key event + if (e.type == _sequence_type && !_isModifier(character)) { + _resetSequences(do_not_reset, max_level); + } + } + + /** + * handles a keydown event + * + * @param {Event} e + * @returns void + */ + function _handleKey(e) { + + // normalize e.which for key events + // @see http://stackoverflow.com/questions/4285627/javascript-keycode-vs-charcode-utter-confusion + if (typeof e.which !== 'number') { + e.which = e.keyCode; + } + + var character = _characterFromEvent(e); + + // no character found then stop + if (!character) { + return; + } + + if (e.type == 'keyup' && _ignore_next_keyup == character) { + _ignore_next_keyup = false; + return; + } + + _handleCharacter(character, e); + } + + /** + * determines if the keycode specified is a modifier key or not + * + * @param {string} key + * @returns {boolean} + */ + function _isModifier(key) { + return key == 'shift' || key == 'ctrl' || key == 'alt' || key == 'meta'; + } + + /** + * called to set a 1 second timeout on the specified sequence + * + * this is so after each key press in the sequence you have 1 second + * to press the next key before you have to start over + * + * @returns void + */ + function _resetSequenceTimer() { + clearTimeout(_reset_timer); + _reset_timer = setTimeout(_resetSequences, 1000); + } + + /** + * reverses the map lookup so that we can look for specific keys + * to see what can and can't use keypress + * + * @return {Object} + */ + function _getReverseMap() { + if (!_REVERSE_MAP) { + _REVERSE_MAP = {}; + for (var key in _MAP) { + + // pull out the numeric keypad from here cause keypress should + // be able to detect the keys from the character + if (key > 95 && key < 112) { + continue; + } + + if (_MAP.hasOwnProperty(key)) { + _REVERSE_MAP[_MAP[key]] = key; + } + } + } + return _REVERSE_MAP; + } + + /** + * picks the best action based on the key combination + * + * @param {string} key - character for key + * @param {Array} modifiers + * @param {string=} action passed in + */ + function _pickBestAction(key, modifiers, action) { + + // if no action was picked in we should try to pick the one + // that we think would work best for this key + if (!action) { + action = _getReverseMap()[key] ? 'keydown' : 'keypress'; + } + + // modifier keys don't work as expected with keypress, + // switch to keydown + if (action == 'keypress' && modifiers.length) { + action = 'keydown'; + } + + return action; + } + + /** + * binds a key sequence to an event + * + * @param {string} combo - combo specified in bind call + * @param {Array} keys + * @param {Function} callback + * @param {string=} action + * @returns void + */ + function _bindSequence(combo, keys, callback, action) { + + // start off by adding a sequence level record for this combination + // and setting the level to 0 + _sequence_levels[combo] = 0; + + // if there is no action pick the best one for the first key + // in the sequence + if (!action) { + action = _pickBestAction(keys[0], []); + } + + /** + * callback to increase the sequence level for this sequence and reset + * all other sequences that were active + * + * @param {Event} e + * @returns void + */ + var _increaseSequence = function(e) { + _sequence_type = action; + ++_sequence_levels[combo]; + _resetSequenceTimer(); + }, + + /** + * wraps the specified callback inside of another function in order + * to reset all sequence counters as soon as this sequence is done + * + * @param {Event} e + * @returns void + */ + _callbackAndReset = function(e) { + _fireCallback(callback, e, combo); + + // we should ignore the next key up if the action is key down + // or keypress. this is so if you finish a sequence and + // release the key the final key will not trigger a keyup + if (action !== 'keyup') { + _ignore_next_keyup = _characterFromEvent(e); + } + + // weird race condition if a sequence ends with the key + // another sequence begins with + setTimeout(_resetSequences, 10); + }, + i; + + // loop through keys one at a time and bind the appropriate callback + // function. for any key leading up to the final one it should + // increase the sequence. after the final, it should reset all sequences + for (i = 0; i < keys.length; ++i) { + _bindSingle(keys[i], i < keys.length - 1 ? _increaseSequence : _callbackAndReset, action, combo, i); + } + } + + /** + * binds a single keyboard combination + * + * @param {string} combination + * @param {Function} callback + * @param {string=} action + * @param {string=} sequence_name - name of sequence if part of sequence + * @param {number=} level - what part of the sequence the command is + * @returns void + */ + function _bindSingle(combination, callback, action, sequence_name, level) { + + // make sure multiple spaces in a row become a single space + combination = combination.replace(/\s+/g, ' '); + + var sequence = combination.split(' '), + i, + key, + keys, + modifiers = []; + + // if this pattern is a sequence of keys then run through this method + // to reprocess each pattern one key at a time + if (sequence.length > 1) { + _bindSequence(combination, sequence, callback, action); + return; + } + + // take the keys from this pattern and figure out what the actual + // pattern is all about + keys = combination === '+' ? ['+'] : combination.split('+'); + + for (i = 0; i < keys.length; ++i) { + key = keys[i]; + + // normalize key names + if (_SPECIAL_ALIASES[key]) { + key = _SPECIAL_ALIASES[key]; + } + + // if this is not a keypress event then we should + // be smart about using shift keys + // this will only work for US keyboards however + if (action && action != 'keypress' && _SHIFT_MAP[key]) { + key = _SHIFT_MAP[key]; + modifiers.push('shift'); + } + + // if this key is a modifier then add it to the list of modifiers + if (_isModifier(key)) { + modifiers.push(key); + } + } + + // depending on what the key combination is + // we will try to pick the best event for it + action = _pickBestAction(key, modifiers, action); + + // make sure to initialize array if this is the first time + // a callback is added for this key + if (!_callbacks[key]) { + _callbacks[key] = []; + } + + // remove an existing match if there is one + _getMatches(key, modifiers, {type: action}, !sequence_name, combination); + + // add this call back to the array + // if it is a sequence put it at the beginning + // if not put it at the end + // + // this is important because the way these are processed expects + // the sequence ones to come first + _callbacks[key][sequence_name ? 'unshift' : 'push']({ + callback: callback, + modifiers: modifiers, + action: action, + seq: sequence_name, + level: level, + combo: combination + }); + } + + /** + * binds multiple combinations to the same callback + * + * @param {Array} combinations + * @param {Function} callback + * @param {string|undefined} action + * @returns void + */ + function _bindMultiple(combinations, callback, action) { + for (var i = 0; i < combinations.length; ++i) { + _bindSingle(combinations[i], callback, action); + } + } + + // start! + _addEvent(document, 'keypress', _handleKey); + _addEvent(document, 'keydown', _handleKey); + _addEvent(document, 'keyup', _handleKey); + + var Mousetrap = { + + /** + * binds an event to mousetrap + * + * can be a single key, a combination of keys separated with +, + * an array of keys, or a sequence of keys separated by spaces + * + * be sure to list the modifier keys first to make sure that the + * correct key ends up getting bound (the last key in the pattern) + * + * @param {string|Array} keys + * @param {Function} callback + * @param {string=} action - 'keypress', 'keydown', or 'keyup' + * @returns void + */ + bind: function(keys, callback, action) { + _bindMultiple(keys instanceof Array ? keys : [keys], callback, action); + _direct_map[keys + ':' + action] = callback; + return this; + }, + + /** + * unbinds an event to mousetrap + * + * the unbinding sets the callback function of the specified key combo + * to an empty function and deletes the corresponding key in the + * _direct_map dict. + * + * the keycombo+action has to be exactly the same as + * it was defined in the bind method + * + * TODO: actually remove this from the _callbacks dictionary instead + * of binding an empty function + * + * @param {string|Array} keys + * @param {string} action + * @returns void + */ + unbind: function(keys, action) { + if (_direct_map[keys + ':' + action]) { + delete _direct_map[keys + ':' + action]; + this.bind(keys, function() {}, action); + } + return this; + }, + + /** + * triggers an event that has already been bound + * + * @param {string} keys + * @param {string=} action + * @returns void + */ + trigger: function(keys, action) { + _direct_map[keys + ':' + action](); + return this; + }, + + /** + * resets the library back to its initial state. this is useful + * if you want to clear out the current keyboard shortcuts and bind + * new ones - for example if you switch to another page + * + * @returns void + */ + reset: function() { + _callbacks = {}; + _direct_map = {}; + return this; + }, + + /** + * should we stop this event before firing off callbacks + * + * @param {Event} e + * @param {Element} element + * @return {boolean} + */ + stopCallback: function(e, element, combo) { + + // if the element has the class "mousetrap" then no need to stop + if ((' ' + element.className + ' ').indexOf(' mousetrap ') > -1) { + return false; + } + + // stop for input, select, and textarea + return element.tagName == 'INPUT' || element.tagName == 'SELECT' || element.tagName == 'TEXTAREA' || (element.contentEditable && element.contentEditable == 'true'); + } + }; + + // expose mousetrap to the global object + window.Mousetrap = Mousetrap; + + // expose mousetrap as an AMD module + if (typeof define === 'function' && define.amd) { + define("mousetrap", Mousetrap); + } +}) (); + +/* @source lib/tag-it.js */; + +(function($) { + + $.fn.tagit = function(options) { + + var el = this; + + const BACKSPACE = 8; + const ENTER = 13; + const SPACE = 32; + const COMMA = 44; + + // add the tagit CSS class. + el.addClass("tagit"); + + // create the input field. + var html_input_field = "
  • \n"; + el.html (html_input_field); + + tag_input = el.children(".tagit-new").children(".tagit-input"); + + $(this).click(function(e){ + if (e.target.tagName == 'A') { + // Removes a tag when the little 'x' is clicked. + // Event is binded to the UL, otherwise a new tag (LI > A) wouldn't have this event attached to it. + $(e.target).parent().remove(); + } + else { + // Sets the focus() to the input field, if the user clicks anywhere inside the UL. + // This is needed because the input field needs to be of a small size. + tag_input.focus(); + } + }); + + $(this).delegate('.tagit-choice', 'click', function(){ + // the little 'x' is hard to click =.= + $(this).remove(); + }); + + tag_input.blur(function () { + var unhandlerTag = tag_input.val(); + unhandlerTag = unhandlerTag.replace(/,+$/,""); + unhandlerTag = unhandlerTag.trim(); + if (unhandlerTag !== ''){ + if (is_new (unhandlerTag)) { + create_choice (unhandlerTag); + } + // Cleaning the input. + tag_input.val(""); + } + }); + + if (options) { + if (options.hasOwnProperty('tag_list')) { + options.tag_list.click(function(event){ + + var typed = $(event.target).html(); + typed = typed.replace(/,+$/,""); + typed = typed.trim(); + + if (typed != "") { + if (is_new (typed)) { + create_choice (typed); + } + } + }); + } + if (options.hasOwnProperty('fillup')) { + for (var i in options.fillup) { + create_choice(options.fillup[i]); + } + } + } + tag_input.keypress(function(event){ + if (event.which == BACKSPACE) { + if (tag_input.val() == "") { + // When backspace is pressed, the last tag is deleted. + $(el).children(".tagit-choice:last").remove(); + } + } + // Comma/Space/Enter are all valid delimiters for new tags. + else if (event.which == COMMA || event.which == SPACE || event.which == ENTER) { + event.preventDefault(); + + var typed = tag_input.val(); + typed = typed.replace(/,+$/,""); + typed = typed.trim(); + + if (typed != "") { + if (is_new (typed)) { + create_choice (typed); + } + // Cleaning the input. + tag_input.val(""); + } + } + }); + + function is_new (value){ + var is_new = true; + this.tag_input.parents("ul").children(".tagit-choice").each(function(i){ + n = $(this).children("input").val(); + if (value == n) { + is_new = false; + } + }); + return is_new; + } + function create_choice (value){ + var el = ""; + el = "
  • \n"; + el += value + "\n"; + el += "x\n"; + el += "\n"; + el += "
  • \n"; + var li_search_tags = this.tag_input.parent(); + $(el).insertBefore (li_search_tags); + this.tag_input.val(""); + } + }; + + String.prototype.trim = function() { + return this.replace(/^\s+|\s+$/g,""); + }; + +})(jQuery); + +/* autogeneration */ +define("tag-it", [], function(){}); + +/* @source mod/team_header.js */; + +define('mod/team_header', [ + "jquery" +], function($){ + $(function(){ + var JoinOrLeaveTeam = function (url, onSuccess) { + $.post(url, function (ret) { + if (ret.r === 0) { + onSuccess(); + } + }, 'json'); + }; + $('.join-or-leave-btn').click(function () { + var Btn = $(this), team = Btn.attr('data-team'), _type = Btn.attr('data-type'), + url = '/hub/team/' + team + '/' + _type; + if (_type === "leave") { + JoinOrLeaveTeam(url, function () { + Btn.removeClass('btn-danger'); + Btn.addClass('btn-success'); + Btn.html('Join'); + Btn.attr('data-type', 'join'); + }); + }else{ + JoinOrLeaveTeam(url, function () { + Btn.removeClass('btn-success'); + Btn.addClass('btn-danger'); + Btn.html('Leave'); + Btn.attr('data-type', 'leave'); + }); + } + }); + }); +}); + +/* @source lib/jquery.caret.js */; + + +/* + Implement Twitter/Weibo @ mentions + + Copyright (c) 2012 chord.luo@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +/* +本插件操作 textarea 或者 input 内的插入符 +只实现了获得插入符在文本框中的位置,以及设置 +插入符的位置. +*/ + +(function() { + + (function($) { + var getCaretPos, setCaretPos; + getCaretPos = function(inputor) { + var end, endRange, len, normalizedValue, pos, range, start, textInputRange; + if (document.selection) { + /* + #assume we select "HATE" in the inputor such as textarea -> { }. + * start end-point. + * / + * < I really [HATE] IE > between the brackets is the selection range. + * \ + * end end-point. + */ + range = document.selection.createRange(); + pos = 0; + if (range && range.parentElement() === inputor) { + normalizedValue = inputor.value.replace(/\r\n/g, "\n"); + /* SOMETIME !!! + "/r/n" is counted as two char. + one line is two, two will be four. balalala. + so we have to using the normalized one's length.; + */ + len = normalizedValue.length; + /* + <[ I really HATE IE ]>: + the whole content in the inputor will be the textInputRange. + */ + textInputRange = inputor.createTextRange(); + /* _here must be the position of bookmark. + / + <[ I really [HATE] IE ]> + [---------->[ ] : this is what moveToBookmark do. + < I really [[HATE] IE ]> : here is result. + \ two brackets in should be in line. + */ + textInputRange.moveToBookmark(range.getBookmark()); + endRange = inputor.createTextRange(); + /* [--------------------->[] : if set false all end-point goto end. + < I really [[HATE] IE []]> + */ + endRange.collapse(false); + /* + ___VS____ + / \ + < I really [[HATE] IE []]> + \_endRange end-point. + + " > -1" mean the start end-point will be the same or right to the end end-point + * simplelly, all in the end. + */ + if (textInputRange.compareEndPoints("StartToEnd", endRange) > -1) { + start = end = len; + } else { + /* + I really |HATE] IE ]> + <-| + I really[ [HATE] IE ]> + <-[ + I reall[y [HATE] IE ]> + + will return how many unit have moved. + */ + start = -textInputRange.moveStart("character", -len); + end = -textInputRange.moveEnd("character", -len); + } + } + } else { + start = inputor.selectionStart; + } + return start; + }; + setCaretPos = function(inputor, pos) { + var range; + if (document.selection) { + range = inputor.createTextRange(); + range.move("character", pos); + return range.select(); + } else { + return inputor.setSelectionRange(pos, pos); + } + }; + return $.fn.caretPos = function(pos) { + var inputor; + inputor = this[0]; + inputor.focus(); + if (pos) { + return setCaretPos(inputor, pos); + } else { + return getCaretPos(inputor); + } + }; + })(window.jQuery); + +}).call(this); + +/* autogeneration */ +define("lib/jquery.caret", [], function(){}); + +/* @source mod/quick_emoji.js */; + +define("mod/quick_emoji", [ + "jquery", + "lib/jquery.caret", + "bootstrap" +], + function($) { + var quick_emoji = {}; + quick_emoji.enable = function(textarea_query){ + $('body').delegate('.quick-emoji a', 'click', function(e){ + var emoji = $(this).attr('data-emoji'); + if(emoji){ + textarea = $(textarea_query); + var caretpos = textarea.caretPos(); + var content = textarea.val(); + var result = ""; + if(content) { + result = content.slice(0, caretpos) + ' ' + + emoji + ' ' + content.slice(caretpos); + textarea.val(result); + textarea.caretPos(caretpos + emoji.length + 2); + } + else { + result = emoji; + textarea.val(result); + textarea.caretPos(result.length); + } + } + return false; + }); + + $('body').delegate('.emojis a', 'hover', function(e){ + var $zoomDiv = $('.zoom'); + if (e.type == "mouseenter") { + var $emojiUrl = $(this).find('img').attr('src'); + var $zoomImage = $('.zoom-image'); + var $tabContent = $('.tab-content'); + $zoomImage.attr('src', $emojiUrl); + $zoomDiv.css({'display': 'block'}); + } else { + $zoomDiv.css({'display': 'none'}); + } + }); + } + return quick_emoji; + }); + +/* @source mod/upvote.js */; + +define("mod/upvote", [ + "jquery" +], + function ($) { + var upvote = {}; + upvote.button = function(btn){ + $(btn).click(function(){ + var method = 'PUT'; + var $ts = $(this); + if($ts.hasClass("upvoted")) method = 'DELETE'; + + $.ajax("upvote", + { + type:method, + dataType:'json', + success:function(res){ + console.log(res); + if(res.action>0){ + console.log($ts); + $ts.addClass('btn-danger upvoted'); + $ts.find('i').removeClass('icon-chevron-up').addClass('icon-chevron-down'); + $ts.find('span').text("Unvote"); + } + else if(res.action<0){ + $ts.removeClass('btn-danger upvoted'); + $ts.find('i').removeClass('icon-chevron-down').addClass('icon-chevron-up'); + $ts.find('span').text("Vote"); + } + else{ + alert(res.msg); + return; + } + $('#vote-count').text(res.count); + }, + }); + return false; + }); + + } + return upvote; + }); + +/* @source mod/issue_body.js */; + +define('mod/issue_body', [ + "jquery", + "mod/upvote", + "mod/quick_emoji", + "tag-it" +], function($, upvote, quick_emoji) { + $(function(){ + + // edit issue + $('#issue-content-edit-form').ajaxForm( + {dataType: 'json', + delegation: true, + success: function(r) { + if (r.r == '0') { + var issue = $('#summary'); + issue.find('h2').html(r.title_html); + issue.find('.description .markdown-body').html(r.content_html); + // update ticket content in edit form + var form = $('#issue-content-edit-form'); + form.find('#issue_title').val(r.title); + form.find('#issue_body').val(r.content); + } + $('#summary .content').removeClass('is-comment-editing').find('.form-content').hide(); + }}); + + // close & open + $('#issue').delegate( + '#add-comment-form #close', 'click', function () { + var commentForm = $('#add-comment-form'); + if (commentForm.find('[name=comment_and_close]').length == 0) { + var input = $('').attr('type', 'hidden').attr('name', 'comment_and_close').val('1'); + commentForm.append(input); + } + }); + + $('#issue').delegate( + '#add-comment-form #open', 'click', function () { + var commentForm = $('#add-comment-form'); + if (commentForm.find('[name=comment_and_open]').length == 0) { + var input = $('').attr('type', 'hidden').attr('name', 'comment_and_open').val('1'); + commentForm.append(input); + } + }); + + // delete comment + $('#issue').delegate( + '.delete-pr-note-button', 'click', function (e) { + if (!confirm('Are you sure you want to delete this?')) { + return false; + } + var comment = $(this).parents('.change'); + $.getJSON($(this).attr('href'), + function(r) { + if (r.r == '1'){ + comment.remove(); + } + }); + return false; + }); + + // tabs + $('.write-tab').live( + 'click', + function () { + var form = $(this).closest('.previewable-comment-form'); + $(this).closest('.previewable-comment-form').removeClass('preview-selected').addClass('write-selected'); + form.find('#write_bucket').addClass('active').end().find('#preview_bucket').removeClass('active'); + }); + $('.preview-tab').live( + 'click', + function () { + var form = $(this).closest('.previewable-comment-form'); + form.removeClass('write-selected').addClass('preview-selected'); + form.find('#write_bucket').removeClass('active').end().find('#preview_bucket').addClass('active'); + form.find('#preview_bucket p').html("Loading preview..."); + var url = form.find('#preview_bucket .content-body').data('api-url'), + text = form.find('#write_bucket textarea').val(); + form.find('#preview_bucket .content-body').load(url, {text: text}); + }); + + // join issue + var JoinOrLeaveIssue = function (url, onSuccess) { + $.post(url, function (ret) { + if (ret.r === 0) { + onSuccess(); + if (ret.participants_html) { + $('#participants-block').html(ret.participants_html); + } + } else if (ret.r === 1 && ret.msg) { + alert(ret.msg); + } + }, 'json'); + }; + $('.join-issue-btn').click(function () { + var Btn = $(this), _type = Btn.attr('data-type'), + url = Btn.attr('data-url') + _type; + if (_type === "leave") { + JoinOrLeaveIssue(url, function () { + Btn.removeClass('btn-danger'); + Btn.html('Join'); + Btn.attr('data-type', 'join'); + }); + } else { + JoinOrLeaveIssue(url, function () { + Btn.addClass('btn-danger'); + Btn.html('Leave'); + Btn.attr('data-type', 'leave'); + }); + } + }); + + // edit button + $('#issue').delegate( + '.js-edit-button', 'click', + function () { + var comment_content = $(this).parents('.js-edit-container').addClass('is-comment-editing').children('.content'); + //comment_content.addClass('is-comment-editing'); + comment_content.find('.form-content').show(); + }); + + $('#issue').delegate( + '.js-cancel-button', 'click', + function () { + var comment_content = $(this).parents('.js-edit-container'); + comment_content.removeClass('is-comment-editing'); + comment_content.find('.form-content').hide(); + }); + + $('body').delegate('.js-edit-button', 'click', + function (e) { + var form_content = $(this).parents('.js-edit-container') + .children('.content') + .children('.form-content'); + if(form_content != undefined){ + form_content.show().find('textarea').focus(); + form_content.find('form.js-comment-update').ajaxForm( + { + dataType: 'json', + beforeSend: function() { + form_content.find('button[type="submit"]').attr('disabled', true).addClass('disabled') + .end().find('.loader').show(); + }, + success: function(r) { + if (r.r == 0 && r.html) { + if (form_content.find('textarea').attr('name') === 'pull_request_review_comment'){ + // FIXME: + form_content.parents('.js-comments-holder').append(r.html); + form_content.parents('.comment').remove(); + } else { + var comment = form_content.parents('.change'); + form_content.parents('#changelog').append(r.html); + comment.remove(); + } + } + return true; + } + } + ); + }else{ + return false; + } + } + ); + + $('body').delegate('.form-content .comment-cancel-button', 'click', + function (e) { + var form_content = $(this).parents('.form-content'); + if(form_content != undefined){ + form_content.hide(); + }else{ + return false; + } + } + ); + + // others + quick_emoji.enable('#new_comment_content'); + upvote.button("#upvote"); + + // tag + $('#issue-tags').tagit({input_name: 'tags', tag_list: $('.label'), fillup: JSON.parse($("#json-tags")[0].value)}); + + $('.milestone-menu').delegate('a', 'click', + function (e) { + var $a = $(this); + clear_milestone(); + $a.parent().addClass('active').find('input').attr('checked', true);; + } + ); + $('#milestone_title').on('keypress keyup keydown focus', function () { + var $this = $(this); + var value = $this.val(); + console.log(value); + if (value && value !== "") { + clear_milestone(true); + $("#milestone_new").attr('checked', true); + } else { + clear_milestone(); + } + }); + var clear_milestone = function (hide) { + var $menu = $('.milestone-menu'); + $menu.find('li').each(function () { + $(this).removeClass("active"); + }); + if (hide) { + $menu.hide(); + } else { + $menu.show(); + } + }; + + }); +}) + +/* @source mod/tasklist.js */; + +define('mod/tasklist', [ + "jquery", + "jquery-lazyload" +], function($, _) { + $(function() { + $('body').delegate( + '.tasklist-enabled input[type=checkbox]', 'click', function(){ + var editForm = $(this).parents('.tasklist-enabled').find('.tasklist-form'); + if (editForm && editForm.length) { + var el = editForm.find('#issue_body'), content = el.val(), + p = /- \[[x\s]\]/g, joints = content.match(p), parts = content.split(p), + idx = Number($(this).data('item-index')); + joints[idx] = joints[idx] == '- [x]' ? '- [ ]' : '- [x]', content = ''; + for (var i=0, len=parts.length; i
    ').appendTo('body') + .mouseleave(function () { + $(this).hide(); + $('.team-card').hide(); + }); + } + if (!teamCard) { + teamCard = $('
    ').appendTo('body') + .mouseleave(function () { + $(this).hide(); + $('.user-card').hide(); + }); + } + var pos = $(this).offset(); + pos.left = pos.left - 5; + pos.top = pos.top - 5; + var name = /@?(\w+)/.exec($(this).text())[1], user = users[name]; + + if (!user) { + $.getJSON('/api/card_info', {user: name}, + function (r) { + if (r.team) { + teamCard.css(pos).empty().show(); + teamCard.append($.tmpl($('#templ-team-card'), r.team)); + user_type[name] = 'team'; + users[name] = r.team; + } else { + userCard.css(pos).empty().show(); + userCard.append($.tmpl($('#templ-user-card'), r.user)); + user_type[name] = 'user'; + users[name] = r.user; + } + }); + } else { + if (user_type[name] === 'team') { + teamCard.css(pos).empty().show(); + teamCard.append($.tmpl($('#templ-team-card'), user)); + } else { + userCard.css(pos).empty().show(); + userCard.append($.tmpl($('#templ-user-card'), user)); + } + } + }); + }); +}); + +/* @source mod/watch.js */; + +define('mod/watch', [ + "jquery" +], function($){ + + $(function() { + var watch_btn = $("#watch-btn"); + var countLabel = $('#watched-count'); + var proj_id = watch_btn.attr("proj_id"); + + var updateLabelBy = function (n) { + var count = Number(countLabel.text()) || 0; + if (count === 0 && n <= 0) { return; } + + count += n; + countLabel.text(count.toString()); + }; + + watch_btn.click(function() { + + if(watch_btn.hasClass('watch')) { + $.post("/watch/"+proj_id, function(data) { + if (!data.error) { + watch_btn.text('Unwatch'); + watch_btn.addClass('unwatch'); + watch_btn.removeClass('watch'); + updateLabelBy(1); + } else { + // show error notification to user + show_error("关注失败"); + } + }); + } + else{ + $.ajax("/watch/"+proj_id, { + type: "DELETE", + success: function(data) { + if (!data.error) { + watch_btn.text('Watch'); + watch_btn.addClass('watch'); + watch_btn.removeClass('unwatch'); + updateLabelBy(-1); + } else { + show_error("取消关注失败"); + } + }, + error: function(e) { + show_error("取消关注失败"); + } + }); + } + }); + + function show_success(msg) { + var successDiv = $(".navbar .success"); + if (successDiv.size() === 0 ) { + successDiv= $("
    ").addClass("success").addClass("alert-success"); + $("div.navbar").append(successDiv); + } + successDiv.html(msg); + successDiv.fadeOut(1500, function () { + $(this).remove(); + }); + } + + function show_error(msg) { + var errorDiv = $(".navbar .error"); + if (errorDiv.size() === 0 ) { + errorDiv = $("
    ").addClass("error").addClass("alert-error"); + $("div.navbar").append(errorDiv); + } + errorDiv.html(msg); + } + + }); +}); + +/* @source mod/user_avatar.js */; + +define('mod/user_avatar', [ + "jquery", + "jquery-lazyload" +], function($, _) { + var isRetinaDisplay = window.devicePixelRatio > 1; + + var patchForRetina = function(originalURL) { + var match = /^(.+\Ws=)(\d+)(.*)$/.exec(originalURL); + if (match === null) { + return originalURL; + } + + var oldSize = parseInt(match[2], 10); + var newSize = Math.ceil(window.devicePixelRatio * oldSize); + + return match[1] + newSize.toString(10) + match[3]; + }; + + var checkLoad = function() { + var e = $(this); + if (isRetinaDisplay) { + var dataOriginalURL = e.attr('data-original') || e.attr('src'); + e.attr('data-original', patchForRetina(dataOriginalURL)); + + e.lazyload({effect:"fadeIn", threshold:300}); + } + }; + + var loadAvatar = function () { + // $("img.user-avatar").each(checkLoad); + // $("img.avatar").each(checkLoad); + // $(window).resize(); + }; + return loadAvatar; +}); + +/* @source lib/zen-form.js */; + +/** Zen Forms 1.0.0 | MIT License | git.io/zen-form */ + +(function($) { + + $.fn.zenForm = function(settings) { + + settings = $.extend({ + trigger: '.go-zen', + theme: 'dark' + }, settings); + + /** + * Helper functions + */ + var Utils = { + + watchEmpty: function($form) { + + $form.find('input, textarea').each(function() { + $(this).on('change', function() { + $(this)[ $(this).val() ? 'removeClass' : 'addClass' ]('empty'); + }).trigger('change'); + }); + + } + + }, // Utils + + /** + * Core functionality + */ + App = { + + /** + * Wrapper element + */ + Environment: null, + + /** + * Functions to create and manipulate environment + */ + env: { + + create: function() { + + var theme = settings.theme == 'dark' ? '' : ' light-theme'; + + return $('
    ', {class: 'zen-forms' + theme}).hide().appendTo('body').fadeIn(200); + + }, // create + + /** + * Update orginal inputs with new values and destroy Environment + */ + destroy: function($elements) { + + // Update orginal inputs with new values + $elements.each(function(i) { + + var $el = $('#zen-forms-input' + i); + + if ( $el.length ) + $(this).val($el.val()); + + }).filter('input:text,textarea').eq(0).focus(); + + $('.zen-forms').fadeOut(200, function() { + $(this).remove(); + }); + + }, // destroy + + /** + * Append inputs, textareas to Environment + */ + add: function($elements) { + + $elements.each(function(i) { + + var $this = $(this), + $wrapper = App.env.addObject(App.Environment, 'div', {class: 'zen-forms-input-wrap'}), + + value = $this.val(), + id = $this.attr('id'), + ID = 'zen-forms-input' + i, + label = $("label[for=" + id + "]").text() || $this.attr('placeholder') || ''; + + // Exclude specified elements + if ( $.inArray( $this.attr('type'), ['checkbox', 'radio', 'submit']) == -1) { + + if ( $this.is('input') ) + App.env.addObject($wrapper, 'input', { + id: ID, + value: value, + type: $this.attr('type') + }); + else + App.env.addObject($wrapper, 'textarea', { + id: ID, + text: value + }); + + App.env.addObject($wrapper, 'label', { + for: ID, + text: label + }); + + } + + }); + + }, // add + + /** + * Wrapper for creating jQuery objects + */ + addObject: function($wrapper, type, params, fn, fnMethod) { + + return $('<'+type+'>', params).on(fnMethod || 'click', fn).appendTo($wrapper); + + }, // addObject + + switchTheme: function() { + + App.Environment.toggleClass('light-theme'); + + } // switchTheme + + }, // env + + zen: function($elements) { + + // Create environment + App.Environment = App.env.create(); + + // Add close button + App.env.addObject(App.Environment, 'a', { + class: 'zen-forms-close-button', + html: '×' + }, function() { + App.env.destroy($elements); + }); + + // Add theme switch button + App.env.addObject(App.Environment, 'a', { + class: 'zen-forms-theme-switch', + html: '•' + }, function() { + App.env.switchTheme(); + }); + + // Add inputs and textareas from form + App.env.add($elements); + + App.Environment.keydown(function(e) { + // Esc close + if (e.which == 27) { + App.env.destroy($elements); + } + }).find('input:text, textarea').eq(0).focus(); + + // Watch inputs and add "empty" class if needed + Utils.watchEmpty(App.Environment); + + }, // zen + + }; // App + + return this.each(function() { + + var $this = $(this); + + function zen() { + App.zen( $this.is('form') ? $this.find('input, textarea') : $this ); + } + + if (!settings.trigger) return zen(); + + $(settings.trigger).on('click', function(event) { + event.preventDefault(); + zen(); + }); + + }); + + }; + +})(jQuery); + +/* autogeneration */ +define("lib/zen-form", [], function(){}); + +/* @source lib/store.js */; + +;(function(win){ + var store = {}, + doc = win.document, + localStorageName = 'localStorage', + namespace = '__storejs__', + storage + + store.disabled = false + store.set = function(key, value) {} + store.get = function(key) {} + store.remove = function(key) {} + store.clear = function() {} + store.transact = function(key, defaultVal, transactionFn) { + var val = store.get(key) + if (transactionFn == null) { + transactionFn = defaultVal + defaultVal = null + } + if (typeof val == 'undefined') { val = defaultVal || {} } + transactionFn(val) + store.set(key, val) + } + store.getAll = function() {} + + store.serialize = function(value) { + return JSON.stringify(value) + } + store.deserialize = function(value) { + if (typeof value != 'string') { return undefined } + try { return JSON.parse(value) } + catch(e) { return value || undefined } + } + + // Functions to encapsulate questionable FireFox 3.6.13 behavior + // when about.config::dom.storage.enabled === false + // See https://github.com/marcuswestin/store.js/issues#issue/13 + function isLocalStorageNameSupported() { + try { return (localStorageName in win && win[localStorageName]) } + catch(err) { return false } + } + + if (isLocalStorageNameSupported()) { + storage = win[localStorageName] + store.set = function(key, val) { + if (val === undefined) { return store.remove(key) } + storage.setItem(key, store.serialize(val)) + return val + } + store.get = function(key) { return store.deserialize(storage.getItem(key)) } + store.remove = function(key) { storage.removeItem(key) } + store.clear = function() { storage.clear() } + store.getAll = function() { + var ret = {} + for (var i=0; idocument.w=window') + storageContainer.close() + storageOwner = storageContainer.w.frames[0].document + storage = storageOwner.createElement('div') + } catch(e) { + // somehow ActiveXObject instantiation failed (perhaps some special + // security settings or otherwse), fall back to per-path storage + storage = doc.createElement('div') + storageOwner = doc.body + } + function withIEStorage(storeFunction) { + return function() { + var args = Array.prototype.slice.call(arguments, 0) + args.unshift(storage) + // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx + // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx + storageOwner.appendChild(storage) + storage.addBehavior('#default#userData') + storage.load(localStorageName) + var result = storeFunction.apply(store, args) + storageOwner.removeChild(storage) + return result + } + } + + // In IE7, keys may not contain special chars. See all of https://github.com/marcuswestin/store.js/issues/40 + var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g") + function ieKeyFix(key) { + return key.replace(forbiddenCharsRegex, '___') + } + store.set = withIEStorage(function(storage, key, val) { + key = ieKeyFix(key) + if (val === undefined) { return store.remove(key) } + storage.setAttribute(key, store.serialize(val)) + storage.save(localStorageName) + return val + }) + store.get = withIEStorage(function(storage, key) { + key = ieKeyFix(key) + return store.deserialize(storage.getAttribute(key)) + }) + store.remove = withIEStorage(function(storage, key) { + key = ieKeyFix(key) + storage.removeAttribute(key) + storage.save(localStorageName) + }) + store.clear = withIEStorage(function(storage) { + var attributes = storage.XMLDocument.documentElement.attributes + storage.load(localStorageName) + for (var i=0, attr; attr=attributes[i]; i++) { + storage.removeAttribute(attr.name) + } + storage.save(localStorageName) + }) + store.getAll = withIEStorage(function(storage) { + var attributes = storage.XMLDocument.documentElement.attributes + var ret = {} + for (var i=0, attr; attr=attributes[i]; ++i) { + var key = ieKeyFix(attr.name) + ret[attr.name] = store.deserialize(storage.getAttribute(key)) + } + return ret + }) + } + + try { + store.set(namespace, namespace) + if (store.get(namespace) != namespace) { store.disabled = true } + store.remove(namespace) + } catch(e) { + store.disabled = true + } + store.enabled = !store.disabled + if (typeof module != 'undefined' && module.exports) { module.exports = store } + else if (typeof define === 'function' && define.amd) { define("store", store) } + else { win.store = store } +})(this.window || global); + +/* @source mod/user_following.js */; + +define('store', 'lib/store.js'); +define('mod/user_following', [ + "jquery", + "store" +], function($, store) { + var API_USER_FOLLOWING_PATH = "/api/user/following" + var USER_FOLLOWING_KEY = "user-following"; + var USER_FOLLOWING_UPDATE_KEY= "date:user-following" + var ONE_DAY_IN_SECONDS = 60*60*24; + + var update = function() { + var currentTime = new Date().getTime(); + var lastTime = store.get(USER_FOLLOWING_UPDATE_KEY); + if (lastTime && (currentTime - lastTime) < ONE_DAY_IN_SECONDS ) { + return; + } + + $.ajax( + API_USER_FOLLOWING_PATH + ).done(function(users){ + var following = $.map(users, function(item){ + return item["username"]; + }); + store.set(USER_FOLLOWING_KEY, following); + store.set(USER_FOLLOWING_UPDATE_KEY, currentTime); + }).fail(function(jqxhr, textStatus, error){ + return; + }); + } + + return { + update: update, + val: function(){ + return store.get(USER_FOLLOWING_KEY) || []; + } + }; + +}); + +/* @source mod/input-ext.js */; + +define('mousetrap', 'lib/mousetrap.js'); + +define("mod/input-ext", + [ + "jquery", + "mod/user_following", + "jquery-caret", + "jquery-atwho", + "mousetrap", + "lib/zen-form" +], + function ($, userFollowing) { + var inputExt = {}; + var emojis = [ + 'airplane', 'alien', 'art', 'bear', 'beer', 'bike', 'bomb', 'book', + 'bulb', 'bus', 'cake', 'calling', 'clap', 'cocktail', 'code', 'computer', + 'cool', 'cop', 'email', 'feet', 'fire', 'fish', 'fist', 'gift', 'hammer', + 'heart', 'iphone', 'key', 'leaves', 'lgtm', 'lipstick', 'lock', 'mag', 'mega', + 'memo', 'moneybag', 'new', 'octocat', 'ok', 'palm_tree', 'pencil', 'punch', + 'runner', 'scissors', 'ship', 'shipit', 'ski', 'smile', 'smoking', 'sparkles', + 'star', 'sunny', 'taxi', 'thumbsdown', 'thumbsup', 'tm', 'tophat', 'train', + 'trollface', 'v', 'vs', 'warning', 'wheelchair', 'zap', 'zzz', 'see_no_evil', + 'hear_no_evil', 'speak_no_evil', 'monkey', 'monkey_face', 'manybeers', 'beers', + 'hhkb', 'ruby' + ], emoji_list = $.map(emojis, function(value, i) {return {key: value + ':', name:value};}); + inputExt.enableEmojiInput = function (el) { + el.atwho('(?:^|\\s):', + {data:emoji_list, limit:7, + tpl:'
  • ${name}
  • '}); + return el; + }; + + inputExt.enableAutoCompleteFollowingAndTeam = function (el) { + var teams = JSON.parse($('#all-teams').val() || '[]'); + var users = teams.concat(userFollowing.val()); + + $(el).atwho("@", { + data: users, + limit: 7 + }); + }; + + // 输入#自动提示pr信息 + inputExt.enablePullsInput = function (el) { + var projectName = el.attr('data-project-name'); + if (!projectName) return el; + $.getJSON('/' + projectName + '/pulls/all_data', function (r) { + var pulls = $.map( + r, function(value, i) { + return {key: value.id, name:value.id + ' ' + value.title, title:value.title}; + }); + el.atwho('(?:^|\\s)#', + {data:pulls, limit:7, + tpl:'
  • #${key} ${title}
  • '}); + }); + return el; + }; + + inputExt.shortcut2submit = function (el) { + Mousetrap.bind( + ['command+enter', 'ctrl+enter'], + function (e) { + if (el && (e.srcElement || e.target) == $(el)[0] && !$(el).closest('form').hasClass('submitting')) { + e.preventDefault ? e.preventDefault() : (e.returnValue = false); + $(el).closest('form').addClass('submitting').submit(); + } + }, + 'keydown' + ); + }; + + // 进入全屏模式 + inputExt.enableZenMode = function (el) { + var trigger = '.go-zen'; + el = $(el); + el.zenForm({trigger:trigger, theme:'light'}).dblclick(function(e) { + if (!e.altKey) return; + $(this).zenForm({ trigger: null, theme: 'light' }); + fix(); + }); + + $(trigger).click(fix); + + function fix() { + var textarea = $('.zen-forms-input-wrap textarea'); + if (textarea) { + inputExt.enableEmojiInput(textarea); + textarea.attr({ + 'data-project-name': el.attr('data-project-name'), + 'placeholder': el.attr('placeholder') + }); + + inputExt.enablePullsInput(textarea); + + var participants = $('#participants').val(); + if (participants) { + participants = JSON.parse(participants); + textarea.atwho("@", {data:participants, limit:7}); + } + + // 因为zen-form设置的z-index非常高(99999)所以将at-view调更高 + $('#at-view').css('z-index', 100000); + } + } + }; + + var focusToEnd = function(els) { + return $(els).each(function() { + var v = $(this).val(); + $(this).focus().val("").val(v); + }); + }; + + inputExt.enableQuickQuotes = function (el) { + Mousetrap.bind( + ['r'], + function (e) { + var oldVal = $(el).val(), newVal, selVal = window.getSelection().toString(); + selVal = '> ' + selVal.split('\n').join('\n> '); + newVal = oldVal.concat((oldVal != '') ? '\n\n':'', selVal, '\n\n'); + $("html, body").animate({scrollTop: $(document).height()}, "slow"); + $(el).val(newVal); + focusToEnd(el); + }, + 'keyup' + ); + }; + + inputExt.enableFileUpload = function (uploader, textarea, is_image) { + uploader.submit( + function() { + $(this).ajaxSubmit({ + dataType: 'json', + type: 'POST', + delegation: true, + success: function(r) { + var oldText = textarea.val(), + newText = oldText + + (oldText.length == 0 ? '' : '\n') + + (is_image? '!' : '') + + '[' + r.origin_filename + '](' + r.url + ')'; + textarea.val(newText); + }, + error: function(r) { + alert("上传错误,请确认您上传的文件类型合法"); + } + }); + return false; + }); + + uploader.find('input').change(function () { + uploader.submit(); + }); + }; + + inputExt.enableImageUpload = function (uploader, textarea) { + inputExt.enableFileUpload(uploader,textarea, true); + }; + + inputExt.enableUpload = function(upload_widget,textarea){ + inputExt.enableImageUpload(upload_widget.find(".upload-image-form"),textarea); + inputExt.enableFileUpload(upload_widget.find(".upload-file-form"),textarea); + }; + + return inputExt; + } +); + +/* @source lib/date.extensions.js */; + +/** + * Returns a description of this date in relative terms. + + * Examples, where new Date().toString() == "Mon Nov 23 2009 17:36:51 GMT-0500 (EST)": + * + * new Date().toRelativeTime() + * --> 'Just now' + * + * new Date("Nov 21, 2009").toRelativeTime() + * --> '2 days ago' + * + * new Date("Nov 25, 2009").toRelativeTime() + * --> '2 days from now' + * + * // One second ago + * new Date("Nov 23 2009 17:36:50 GMT-0500 (EST)").toRelativeTime() + * --> '1 second ago' + * + * toRelativeTime() takes an optional argument - a configuration object. + * It can have the following properties: + * - now - Date object that defines "now" for the purpose of conversion. + * By default, current date & time is used (i.e. new Date()) + * - nowThreshold - Threshold in milliseconds which is considered "Just now" + * for times in the past or "Right now" for now or the immediate future + * - smartDays - If enabled, dates within a week of now will use Today/Yesterday/Tomorrow + * or weekdays along with time, e.g. "Thursday at 15:10:34" + * rather than "4 days ago" or "Tomorrow at 20:12:01" + * instead of "1 day from now" + * + * If a single number is given as argument, it is interpreted as nowThreshold: + * + * // One second ago, now setting a now_threshold to 5 seconds + * new Date("Nov 23 2009 17:36:50 GMT-0500 (EST)").toRelativeTime(5000) + * --> 'Just now' + * + * // One second in the future, now setting a now_threshold to 5 seconds + * new Date("Nov 23 2009 17:36:52 GMT-0500 (EST)").toRelativeTime(5000) + * --> 'Right now' + * + */ +var TRANSLATIONS = { + 'Right now':'现在', + 'Just now':'刚刚', + 'from now':'之后', + 'ago':'前', + 'Today':'今天', + 'Yesterday':'昨天', + 'Tomorrow':'明天', + ' at ':'', + 's':'', + ' ':'', + 'millisecond':'毫秒', + 'second':'秒', + 'minute':'分钟', + 'hour':'小时', + 'day':'天', + 'month':'个月', + 'year':'年', + 'Sunday':'星期天', + 'Monday':'星期六', + 'Tuesday':'星期二', + 'Wednesday':'星期三', + 'Thursday':'星期四', + 'Friday':'星期五', + 'Saturday':'星期六' +}, +_t = function (key) {return TRANSLATIONS[key];}; + + Date.prototype.toRelativeTime = (function() { + + var _ = function(options) { + var opts = processOptions(options); + + var now = opts.now || new Date(); + var delta = now - this; + var future = (delta <= 0); + delta = Math.abs(delta); + + // special cases controlled by options + if (delta <= opts.nowThreshold) { + return future ? _t('Right now') : _t('Just now'); + } + if (opts.smartDays && delta <= 6 * MS_IN_DAY) { + return toSmartDays(this, now); + } + + var units = null; + for (var key in CONVERSIONS) { + if (delta < CONVERSIONS[key]) + break; + units = _t(key); // keeps track of the selected key over the iteration + delta = delta / CONVERSIONS[key]; + } + + // pluralize a unit when the difference is greater than 1. + delta = Math.floor(delta); + if (delta !== 1) { units += _t("s"); } + return [delta, units, future ? _t("from now") : _t("ago")].join(_t(" ")); + }; + + var processOptions = function(arg) { + if (!arg) arg = 0; + if (typeof arg === 'string') { + arg = parseInt(arg, 10); + } + if (typeof arg === 'number') { + if (isNaN(arg)) arg = 0; + return {nowThreshold: arg}; + } + return arg; + }; + + var toSmartDays = function(date, now) { + var day; + var weekday = date.getDay(), + dayDiff = weekday - now.getDay(); + if (dayDiff == 0) day = _t('Today'); + else if (dayDiff == -1) day = _t('Yesterday'); + else if (dayDiff == 1 && date > now) day = _t('Tomorrow'); + else day = WEEKDAYS[weekday]; + return day + _t(" at ") + date.toLocaleTimeString(); + }; + + var CONVERSIONS = { + millisecond: 1, // ms -> ms + second: 1000, // ms -> sec + minute: 60, // sec -> min + hour: 60, // min -> hour + day: 24, // hour -> day + month: 30, // day -> month (roughly) + year: 12 // month -> year + }; + var MS_IN_DAY = (CONVERSIONS.millisecond * CONVERSIONS.second * CONVERSIONS.minute * CONVERSIONS.hour * CONVERSIONS.day); + + var WEEKDAYS = [_t('Sunday'), _t('Monday'), _t('Tuesday'), _t('Wednesday'), _t('Thursday'), _t('Friday'), _t('Saturday')]; + + return _; + +})(); + + + +/* + * Wraps up a common pattern used with this plugin whereby you take a String + * representation of a Date, and want back a date object. + */ +Date.fromString = function(str) { + return new Date(Date.parse(str)); +}; + +/* autogeneration */ +define("lib/date.extensions", [], function(){}); + +/* @source mod/relative_date.js */; + +define('mod/relative_date', [ + "jquery", + "lib/date.extensions" +], function($) { + var updateRelativeDate = function () { + $('.js-relative-date').each( + function (i, el) { + var el = $(el); + var t = (el.attr('datetime') || el.attr('data-time')).split(/[- : + T]/); + var d = new Date(t[0], t[1]-1, t[2], t[3], t[4], t[5]); + !isNaN(d.getTime()) && el.html(d.toRelativeTime({nowThreshold:60*1000})); + }); + }; + return updateRelativeDate; + }); + +/* @source lib/socket.io.js */; + +/*! Socket.IO.js build:0.9.16, development. Copyright(c) 2011 LearnBoost MIT Licensed */ + +var io = ('undefined' === typeof module ? {} : module.exports); +(function() { + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, global) { + + /** + * IO namespace. + * + * @namespace + */ + + var io = exports; + + /** + * Socket.IO version + * + * @api public + */ + + io.version = '0.9.16'; + + /** + * Protocol implemented. + * + * @api public + */ + + io.protocol = 1; + + /** + * Available transports, these will be populated with the available transports + * + * @api public + */ + + io.transports = []; + + /** + * Keep track of jsonp callbacks. + * + * @api private + */ + + io.j = []; + + /** + * Keep track of our io.Sockets + * + * @api private + */ + io.sockets = {}; + + + /** + * Manages connections to hosts. + * + * @param {String} uri + * @Param {Boolean} force creation of new socket (defaults to false) + * @api public + */ + + io.connect = function (host, details) { + var uri = io.util.parseUri(host) + , uuri + , socket; + + if (global && global.location) { + uri.protocol = uri.protocol || global.location.protocol.slice(0, -1); + uri.host = uri.host || (global.document + ? global.document.domain : global.location.hostname); + uri.port = uri.port || global.location.port; + } + + uuri = io.util.uniqueUri(uri); + + var options = { + host: uri.host + , secure: 'https' == uri.protocol + , port: uri.port || ('https' == uri.protocol ? 443 : 80) + , query: uri.query || '' + }; + + io.util.merge(options, details); + + if (options['force new connection'] || !io.sockets[uuri]) { + socket = new io.Socket(options); + } + + if (!options['force new connection'] && socket) { + io.sockets[uuri] = socket; + } + + socket = socket || io.sockets[uuri]; + + // if path is different from '' or / + return socket.of(uri.path.length > 1 ? uri.path : ''); + }; + +})('object' === typeof module ? module.exports : (this.io = {}), this); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, global) { + + /** + * Utilities namespace. + * + * @namespace + */ + + var util = exports.util = {}; + + /** + * Parses an URI + * + * @author Steven Levithan (MIT license) + * @api public + */ + + var re = /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/; + + var parts = ['source', 'protocol', 'authority', 'userInfo', 'user', 'password', + 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', + 'anchor']; + + util.parseUri = function (str) { + var m = re.exec(str || '') + , uri = {} + , i = 14; + + while (i--) { + uri[parts[i]] = m[i] || ''; + } + + return uri; + }; + + /** + * Produces a unique url that identifies a Socket.IO connection. + * + * @param {Object} uri + * @api public + */ + + util.uniqueUri = function (uri) { + var protocol = uri.protocol + , host = uri.host + , port = uri.port; + + if ('document' in global) { + host = host || document.domain; + port = port || (protocol == 'https' + && document.location.protocol !== 'https:' ? 443 : document.location.port); + } else { + host = host || 'localhost'; + + if (!port && protocol == 'https') { + port = 443; + } + } + + return (protocol || 'http') + '://' + host + ':' + (port || 80); + }; + + /** + * Mergest 2 query strings in to once unique query string + * + * @param {String} base + * @param {String} addition + * @api public + */ + + util.query = function (base, addition) { + var query = util.chunkQuery(base || '') + , components = []; + + util.merge(query, util.chunkQuery(addition || '')); + for (var part in query) { + if (query.hasOwnProperty(part)) { + components.push(part + '=' + query[part]); + } + } + + return components.length ? '?' + components.join('&') : ''; + }; + + /** + * Transforms a querystring in to an object + * + * @param {String} qs + * @api public + */ + + util.chunkQuery = function (qs) { + var query = {} + , params = qs.split('&') + , i = 0 + , l = params.length + , kv; + + for (; i < l; ++i) { + kv = params[i].split('='); + if (kv[0]) { + query[kv[0]] = kv[1]; + } + } + + return query; + }; + + /** + * Executes the given function when the page is loaded. + * + * io.util.load(function () { console.log('page loaded'); }); + * + * @param {Function} fn + * @api public + */ + + var pageLoaded = false; + + util.load = function (fn) { + if ('document' in global && document.readyState === 'complete' || pageLoaded) { + return fn(); + } + + util.on(global, 'load', fn, false); + }; + + /** + * Adds an event. + * + * @api private + */ + + util.on = function (element, event, fn, capture) { + if (element.attachEvent) { + element.attachEvent('on' + event, fn); + } else if (element.addEventListener) { + element.addEventListener(event, fn, capture); + } + }; + + /** + * Generates the correct `XMLHttpRequest` for regular and cross domain requests. + * + * @param {Boolean} [xdomain] Create a request that can be used cross domain. + * @returns {XMLHttpRequest|false} If we can create a XMLHttpRequest. + * @api private + */ + + util.request = function (xdomain) { + + if (xdomain && 'undefined' != typeof XDomainRequest && !util.ua.hasCORS) { + return new XDomainRequest(); + } + + if ('undefined' != typeof XMLHttpRequest && (!xdomain || util.ua.hasCORS)) { + return new XMLHttpRequest(); + } + + if (!xdomain) { + try { + return new window[(['Active'].concat('Object').join('X'))]('Microsoft.XMLHTTP'); + } catch(e) { } + } + + return null; + }; + + /** + * XHR based transport constructor. + * + * @constructor + * @api public + */ + + /** + * Change the internal pageLoaded value. + */ + + if ('undefined' != typeof window) { + util.load(function () { + pageLoaded = true; + }); + } + + /** + * Defers a function to ensure a spinner is not displayed by the browser + * + * @param {Function} fn + * @api public + */ + + util.defer = function (fn) { + if (!util.ua.webkit || 'undefined' != typeof importScripts) { + return fn(); + } + + util.load(function () { + setTimeout(fn, 100); + }); + }; + + /** + * Merges two objects. + * + * @api public + */ + + util.merge = function merge (target, additional, deep, lastseen) { + var seen = lastseen || [] + , depth = typeof deep == 'undefined' ? 2 : deep + , prop; + + for (prop in additional) { + if (additional.hasOwnProperty(prop) && util.indexOf(seen, prop) < 0) { + if (typeof target[prop] !== 'object' || !depth) { + target[prop] = additional[prop]; + seen.push(additional[prop]); + } else { + util.merge(target[prop], additional[prop], depth - 1, seen); + } + } + } + + return target; + }; + + /** + * Merges prototypes from objects + * + * @api public + */ + + util.mixin = function (ctor, ctor2) { + util.merge(ctor.prototype, ctor2.prototype); + }; + + /** + * Shortcut for prototypical and static inheritance. + * + * @api private + */ + + util.inherit = function (ctor, ctor2) { + function f() {}; + f.prototype = ctor2.prototype; + ctor.prototype = new f; + }; + + /** + * Checks if the given object is an Array. + * + * io.util.isArray([]); // true + * io.util.isArray({}); // false + * + * @param Object obj + * @api public + */ + + util.isArray = Array.isArray || function (obj) { + return Object.prototype.toString.call(obj) === '[object Array]'; + }; + + /** + * Intersects values of two arrays into a third + * + * @api public + */ + + util.intersect = function (arr, arr2) { + var ret = [] + , longest = arr.length > arr2.length ? arr : arr2 + , shortest = arr.length > arr2.length ? arr2 : arr; + + for (var i = 0, l = shortest.length; i < l; i++) { + if (~util.indexOf(longest, shortest[i])) + ret.push(shortest[i]); + } + + return ret; + }; + + /** + * Array indexOf compatibility. + * + * @see bit.ly/a5Dxa2 + * @api public + */ + + util.indexOf = function (arr, o, i) { + + for (var j = arr.length, i = i < 0 ? i + j < 0 ? 0 : i + j : i || 0; + i < j && arr[i] !== o; i++) {} + + return j <= i ? -1 : i; + }; + + /** + * Converts enumerables to array. + * + * @api public + */ + + util.toArray = function (enu) { + var arr = []; + + for (var i = 0, l = enu.length; i < l; i++) + arr.push(enu[i]); + + return arr; + }; + + /** + * UA / engines detection namespace. + * + * @namespace + */ + + util.ua = {}; + + /** + * Whether the UA supports CORS for XHR. + * + * @api public + */ + + util.ua.hasCORS = 'undefined' != typeof XMLHttpRequest && (function () { + try { + var a = new XMLHttpRequest(); + } catch (e) { + return false; + } + + return a.withCredentials != undefined; + })(); + + /** + * Detect webkit. + * + * @api public + */ + + util.ua.webkit = 'undefined' != typeof navigator + && /webkit/i.test(navigator.userAgent); + + /** + * Detect iPad/iPhone/iPod. + * + * @api public + */ + + util.ua.iDevice = 'undefined' != typeof navigator + && /iPad|iPhone|iPod/i.test(navigator.userAgent); + +})('undefined' != typeof io ? io : module.exports, this); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.EventEmitter = EventEmitter; + + /** + * Event emitter constructor. + * + * @api public. + */ + + function EventEmitter () {}; + + /** + * Adds a listener + * + * @api public + */ + + EventEmitter.prototype.on = function (name, fn) { + if (!this.$events) { + this.$events = {}; + } + + if (!this.$events[name]) { + this.$events[name] = fn; + } else if (io.util.isArray(this.$events[name])) { + this.$events[name].push(fn); + } else { + this.$events[name] = [this.$events[name], fn]; + } + + return this; + }; + + EventEmitter.prototype.addListener = EventEmitter.prototype.on; + + /** + * Adds a volatile listener. + * + * @api public + */ + + EventEmitter.prototype.once = function (name, fn) { + var self = this; + + function on () { + self.removeListener(name, on); + fn.apply(this, arguments); + }; + + on.listener = fn; + this.on(name, on); + + return this; + }; + + /** + * Removes a listener. + * + * @api public + */ + + EventEmitter.prototype.removeListener = function (name, fn) { + if (this.$events && this.$events[name]) { + var list = this.$events[name]; + + if (io.util.isArray(list)) { + var pos = -1; + + for (var i = 0, l = list.length; i < l; i++) { + if (list[i] === fn || (list[i].listener && list[i].listener === fn)) { + pos = i; + break; + } + } + + if (pos < 0) { + return this; + } + + list.splice(pos, 1); + + if (!list.length) { + delete this.$events[name]; + } + } else if (list === fn || (list.listener && list.listener === fn)) { + delete this.$events[name]; + } + } + + return this; + }; + + /** + * Removes all listeners for an event. + * + * @api public + */ + + EventEmitter.prototype.removeAllListeners = function (name) { + if (name === undefined) { + this.$events = {}; + return this; + } + + if (this.$events && this.$events[name]) { + this.$events[name] = null; + } + + return this; + }; + + /** + * Gets all listeners for a certain event. + * + * @api publci + */ + + EventEmitter.prototype.listeners = function (name) { + if (!this.$events) { + this.$events = {}; + } + + if (!this.$events[name]) { + this.$events[name] = []; + } + + if (!io.util.isArray(this.$events[name])) { + this.$events[name] = [this.$events[name]]; + } + + return this.$events[name]; + }; + + /** + * Emits an event. + * + * @api public + */ + + EventEmitter.prototype.emit = function (name) { + if (!this.$events) { + return false; + } + + var handler = this.$events[name]; + + if (!handler) { + return false; + } + + var args = Array.prototype.slice.call(arguments, 1); + + if ('function' == typeof handler) { + handler.apply(this, args); + } else if (io.util.isArray(handler)) { + var listeners = handler.slice(); + + for (var i = 0, l = listeners.length; i < l; i++) { + listeners[i].apply(this, args); + } + } else { + return false; + } + + return true; + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +/** + * Based on JSON2 (http://www.JSON.org/js.html). + */ + +(function (exports, nativeJSON) { + "use strict"; + + // use native JSON if it's available + if (nativeJSON && nativeJSON.parse){ + return exports.JSON = { + parse: nativeJSON.parse + , stringify: nativeJSON.stringify + }; + } + + var JSON = exports.JSON = {}; + + function f(n) { + // Format integers to have at least two digits. + return n < 10 ? '0' + n : n; + } + + function date(d, key) { + return isFinite(d.valueOf()) ? + d.getUTCFullYear() + '-' + + f(d.getUTCMonth() + 1) + '-' + + f(d.getUTCDate()) + 'T' + + f(d.getUTCHours()) + ':' + + f(d.getUTCMinutes()) + ':' + + f(d.getUTCSeconds()) + 'Z' : null; + }; + + var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + gap, + indent, + meta = { // table of character substitutions + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '\\': '\\\\' + }, + rep; + + + function quote(string) { + +// If the string contains no control characters, no quote characters, and no +// backslash characters, then we can safely slap some quotes around it. +// Otherwise we must also replace the offending characters with safe escape +// sequences. + + escapable.lastIndex = 0; + return escapable.test(string) ? '"' + string.replace(escapable, function (a) { + var c = meta[a]; + return typeof c === 'string' ? c : + '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }) + '"' : '"' + string + '"'; + } + + + function str(key, holder) { + +// Produce a string from holder[key]. + + var i, // The loop counter. + k, // The member key. + v, // The member value. + length, + mind = gap, + partial, + value = holder[key]; + +// If the value has a toJSON method, call it to obtain a replacement value. + + if (value instanceof Date) { + value = date(key); + } + +// If we were called with a replacer function, then call the replacer to +// obtain a replacement value. + + if (typeof rep === 'function') { + value = rep.call(holder, key, value); + } + +// What happens next depends on the value's type. + + switch (typeof value) { + case 'string': + return quote(value); + + case 'number': + +// JSON numbers must be finite. Encode non-finite numbers as null. + + return isFinite(value) ? String(value) : 'null'; + + case 'boolean': + case 'null': + +// If the value is a boolean or null, convert it to a string. Note: +// typeof null does not produce 'null'. The case is included here in +// the remote chance that this gets fixed someday. + + return String(value); + +// If the type is 'object', we might be dealing with an object or an array or +// null. + + case 'object': + +// Due to a specification blunder in ECMAScript, typeof null is 'object', +// so watch out for that case. + + if (!value) { + return 'null'; + } + +// Make an array to hold the partial results of stringifying this object value. + + gap += indent; + partial = []; + +// Is the value an array? + + if (Object.prototype.toString.apply(value) === '[object Array]') { + +// The value is an array. Stringify every element. Use null as a placeholder +// for non-JSON values. + + length = value.length; + for (i = 0; i < length; i += 1) { + partial[i] = str(i, value) || 'null'; + } + +// Join all of the elements together, separated with commas, and wrap them in +// brackets. + + v = partial.length === 0 ? '[]' : gap ? + '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : + '[' + partial.join(',') + ']'; + gap = mind; + return v; + } + +// If the replacer is an array, use it to select the members to be stringified. + + if (rep && typeof rep === 'object') { + length = rep.length; + for (i = 0; i < length; i += 1) { + if (typeof rep[i] === 'string') { + k = rep[i]; + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } else { + +// Otherwise, iterate through all of the keys in the object. + + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } + +// Join all of the member texts together, separated with commas, +// and wrap them in braces. + + v = partial.length === 0 ? '{}' : gap ? + '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : + '{' + partial.join(',') + '}'; + gap = mind; + return v; + } + } + +// If the JSON object does not yet have a stringify method, give it one. + + JSON.stringify = function (value, replacer, space) { + +// The stringify method takes a value and an optional replacer, and an optional +// space parameter, and returns a JSON text. The replacer can be a function +// that can replace values, or an array of strings that will select the keys. +// A default replacer method can be provided. Use of the space parameter can +// produce text that is more easily readable. + + var i; + gap = ''; + indent = ''; + +// If the space parameter is a number, make an indent string containing that +// many spaces. + + if (typeof space === 'number') { + for (i = 0; i < space; i += 1) { + indent += ' '; + } + +// If the space parameter is a string, it will be used as the indent string. + + } else if (typeof space === 'string') { + indent = space; + } + +// If there is a replacer, it must be a function or an array. +// Otherwise, throw an error. + + rep = replacer; + if (replacer && typeof replacer !== 'function' && + (typeof replacer !== 'object' || + typeof replacer.length !== 'number')) { + throw new Error('JSON.stringify'); + } + +// Make a fake root object containing our value under the key of ''. +// Return the result of stringifying the value. + + return str('', {'': value}); + }; + +// If the JSON object does not yet have a parse method, give it one. + + JSON.parse = function (text, reviver) { + // The parse method takes a text and an optional reviver function, and returns + // a JavaScript value if the text is a valid JSON text. + + var j; + + function walk(holder, key) { + + // The walk method is used to recursively walk the resulting structure so + // that modifications can be made. + + var k, v, value = holder[key]; + if (value && typeof value === 'object') { + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = walk(value, k); + if (v !== undefined) { + value[k] = v; + } else { + delete value[k]; + } + } + } + } + return reviver.call(holder, key, value); + } + + + // Parsing happens in four stages. In the first stage, we replace certain + // Unicode characters with escape sequences. JavaScript handles many characters + // incorrectly, either silently deleting them, or treating them as line endings. + + text = String(text); + cx.lastIndex = 0; + if (cx.test(text)) { + text = text.replace(cx, function (a) { + return '\\u' + + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }); + } + + // In the second stage, we run the text against regular expressions that look + // for non-JSON patterns. We are especially concerned with '()' and 'new' + // because they can cause invocation, and '=' because it can cause mutation. + // But just to be safe, we want to reject all unexpected forms. + + // We split the second stage into 4 regexp operations in order to work around + // crippling inefficiencies in IE's and Safari's regexp engines. First we + // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we + // replace all simple value tokens with ']' characters. Third, we delete all + // open brackets that follow a colon or comma or that begin the text. Finally, + // we look to see that the remaining characters are only whitespace or ']' or + // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. + + if (/^[\],:{}\s]*$/ + .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') + .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') + .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { + + // In the third stage we use the eval function to compile the text into a + // JavaScript structure. The '{' operator is subject to a syntactic ambiguity + // in JavaScript: it can begin a block or an object literal. We wrap the text + // in parens to eliminate the ambiguity. + + j = eval('(' + text + ')'); + + // In the optional fourth stage, we recursively walk the new structure, passing + // each name/value pair to a reviver function for possible transformation. + + return typeof reviver === 'function' ? + walk({'': j}, '') : j; + } + + // If the text is not JSON parseable, then a SyntaxError is thrown. + + throw new SyntaxError('JSON.parse'); + }; + +})( + 'undefined' != typeof io ? io : module.exports + , typeof JSON !== 'undefined' ? JSON : undefined +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Parser namespace. + * + * @namespace + */ + + var parser = exports.parser = {}; + + /** + * Packet types. + */ + + var packets = parser.packets = [ + 'disconnect' + , 'connect' + , 'heartbeat' + , 'message' + , 'json' + , 'event' + , 'ack' + , 'error' + , 'noop' + ]; + + /** + * Errors reasons. + */ + + var reasons = parser.reasons = [ + 'transport not supported' + , 'client not handshaken' + , 'unauthorized' + ]; + + /** + * Errors advice. + */ + + var advice = parser.advice = [ + 'reconnect' + ]; + + /** + * Shortcuts. + */ + + var JSON = io.JSON + , indexOf = io.util.indexOf; + + /** + * Encodes a packet. + * + * @api private + */ + + parser.encodePacket = function (packet) { + var type = indexOf(packets, packet.type) + , id = packet.id || '' + , endpoint = packet.endpoint || '' + , ack = packet.ack + , data = null; + + switch (packet.type) { + case 'error': + var reason = packet.reason ? indexOf(reasons, packet.reason) : '' + , adv = packet.advice ? indexOf(advice, packet.advice) : ''; + + if (reason !== '' || adv !== '') + data = reason + (adv !== '' ? ('+' + adv) : ''); + + break; + + case 'message': + if (packet.data !== '') + data = packet.data; + break; + + case 'event': + var ev = { name: packet.name }; + + if (packet.args && packet.args.length) { + ev.args = packet.args; + } + + data = JSON.stringify(ev); + break; + + case 'json': + data = JSON.stringify(packet.data); + break; + + case 'connect': + if (packet.qs) + data = packet.qs; + break; + + case 'ack': + data = packet.ackId + + (packet.args && packet.args.length + ? '+' + JSON.stringify(packet.args) : ''); + break; + } + + // construct packet with required fragments + var encoded = [ + type + , id + (ack == 'data' ? '+' : '') + , endpoint + ]; + + // data fragment is optional + if (data !== null && data !== undefined) + encoded.push(data); + + return encoded.join(':'); + }; + + /** + * Encodes multiple messages (payload). + * + * @param {Array} messages + * @api private + */ + + parser.encodePayload = function (packets) { + var decoded = ''; + + if (packets.length == 1) + return packets[0]; + + for (var i = 0, l = packets.length; i < l; i++) { + var packet = packets[i]; + decoded += '\ufffd' + packet.length + '\ufffd' + packets[i]; + } + + return decoded; + }; + + /** + * Decodes a packet + * + * @api private + */ + + var regexp = /([^:]+):([0-9]+)?(\+)?:([^:]+)?:?([\s\S]*)?/; + + parser.decodePacket = function (data) { + var pieces = data.match(regexp); + + if (!pieces) return {}; + + var id = pieces[2] || '' + , data = pieces[5] || '' + , packet = { + type: packets[pieces[1]] + , endpoint: pieces[4] || '' + }; + + // whether we need to acknowledge the packet + if (id) { + packet.id = id; + if (pieces[3]) + packet.ack = 'data'; + else + packet.ack = true; + } + + // handle different packet types + switch (packet.type) { + case 'error': + var pieces = data.split('+'); + packet.reason = reasons[pieces[0]] || ''; + packet.advice = advice[pieces[1]] || ''; + break; + + case 'message': + packet.data = data || ''; + break; + + case 'event': + try { + var opts = JSON.parse(data); + packet.name = opts.name; + packet.args = opts.args; + } catch (e) { } + + packet.args = packet.args || []; + break; + + case 'json': + try { + packet.data = JSON.parse(data); + } catch (e) { } + break; + + case 'connect': + packet.qs = data || ''; + break; + + case 'ack': + var pieces = data.match(/^([0-9]+)(\+)?(.*)/); + if (pieces) { + packet.ackId = pieces[1]; + packet.args = []; + + if (pieces[3]) { + try { + packet.args = pieces[3] ? JSON.parse(pieces[3]) : []; + } catch (e) { } + } + } + break; + + case 'disconnect': + case 'heartbeat': + break; + }; + + return packet; + }; + + /** + * Decodes data payload. Detects multiple messages + * + * @return {Array} messages + * @api public + */ + + parser.decodePayload = function (data) { + // IE doesn't like data[i] for unicode chars, charAt works fine + if (data.charAt(0) == '\ufffd') { + var ret = []; + + for (var i = 1, length = ''; i < data.length; i++) { + if (data.charAt(i) == '\ufffd') { + ret.push(parser.decodePacket(data.substr(i + 1).substr(0, length))); + i += Number(length) + 1; + length = ''; + } else { + length += data.charAt(i); + } + } + + return ret; + } else { + return [parser.decodePacket(data)]; + } + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.Transport = Transport; + + /** + * This is the transport template for all supported transport methods. + * + * @constructor + * @api public + */ + + function Transport (socket, sessid) { + this.socket = socket; + this.sessid = sessid; + }; + + /** + * Apply EventEmitter mixin. + */ + + io.util.mixin(Transport, io.EventEmitter); + + + /** + * Indicates whether heartbeats is enabled for this transport + * + * @api private + */ + + Transport.prototype.heartbeats = function () { + return true; + }; + + /** + * Handles the response from the server. When a new response is received + * it will automatically update the timeout, decode the message and + * forwards the response to the onMessage function for further processing. + * + * @param {String} data Response from the server. + * @api private + */ + + Transport.prototype.onData = function (data) { + this.clearCloseTimeout(); + + // If the connection in currently open (or in a reopening state) reset the close + // timeout since we have just received data. This check is necessary so + // that we don't reset the timeout on an explicitly disconnected connection. + if (this.socket.connected || this.socket.connecting || this.socket.reconnecting) { + this.setCloseTimeout(); + } + + if (data !== '') { + // todo: we should only do decodePayload for xhr transports + var msgs = io.parser.decodePayload(data); + + if (msgs && msgs.length) { + for (var i = 0, l = msgs.length; i < l; i++) { + this.onPacket(msgs[i]); + } + } + } + + return this; + }; + + /** + * Handles packets. + * + * @api private + */ + + Transport.prototype.onPacket = function (packet) { + this.socket.setHeartbeatTimeout(); + + if (packet.type == 'heartbeat') { + return this.onHeartbeat(); + } + + if (packet.type == 'connect' && packet.endpoint == '') { + this.onConnect(); + } + + if (packet.type == 'error' && packet.advice == 'reconnect') { + this.isOpen = false; + } + + this.socket.onPacket(packet); + + return this; + }; + + /** + * Sets close timeout + * + * @api private + */ + + Transport.prototype.setCloseTimeout = function () { + if (!this.closeTimeout) { + var self = this; + + this.closeTimeout = setTimeout(function () { + self.onDisconnect(); + }, this.socket.closeTimeout); + } + }; + + /** + * Called when transport disconnects. + * + * @api private + */ + + Transport.prototype.onDisconnect = function () { + if (this.isOpen) this.close(); + this.clearTimeouts(); + this.socket.onDisconnect(); + return this; + }; + + /** + * Called when transport connects + * + * @api private + */ + + Transport.prototype.onConnect = function () { + this.socket.onConnect(); + return this; + }; + + /** + * Clears close timeout + * + * @api private + */ + + Transport.prototype.clearCloseTimeout = function () { + if (this.closeTimeout) { + clearTimeout(this.closeTimeout); + this.closeTimeout = null; + } + }; + + /** + * Clear timeouts + * + * @api private + */ + + Transport.prototype.clearTimeouts = function () { + this.clearCloseTimeout(); + + if (this.reopenTimeout) { + clearTimeout(this.reopenTimeout); + } + }; + + /** + * Sends a packet + * + * @param {Object} packet object. + * @api private + */ + + Transport.prototype.packet = function (packet) { + this.send(io.parser.encodePacket(packet)); + }; + + /** + * Send the received heartbeat message back to server. So the server + * knows we are still connected. + * + * @param {String} heartbeat Heartbeat response from the server. + * @api private + */ + + Transport.prototype.onHeartbeat = function (heartbeat) { + this.packet({ type: 'heartbeat' }); + }; + + /** + * Called when the transport opens. + * + * @api private + */ + + Transport.prototype.onOpen = function () { + this.isOpen = true; + this.clearCloseTimeout(); + this.socket.onOpen(); + }; + + /** + * Notifies the base when the connection with the Socket.IO server + * has been disconnected. + * + * @api private + */ + + Transport.prototype.onClose = function () { + var self = this; + + /* FIXME: reopen delay causing a infinit loop + this.reopenTimeout = setTimeout(function () { + self.open(); + }, this.socket.options['reopen delay']);*/ + + this.isOpen = false; + this.socket.onClose(); + this.onDisconnect(); + }; + + /** + * Generates a connection url based on the Socket.IO URL Protocol. + * See for more details. + * + * @returns {String} Connection url + * @api private + */ + + Transport.prototype.prepareUrl = function () { + var options = this.socket.options; + + return this.scheme() + '://' + + options.host + ':' + options.port + '/' + + options.resource + '/' + io.protocol + + '/' + this.name + '/' + this.sessid; + }; + + /** + * Checks if the transport is ready to start a connection. + * + * @param {Socket} socket The socket instance that needs a transport + * @param {Function} fn The callback + * @api private + */ + + Transport.prototype.ready = function (socket, fn) { + fn.call(this); + }; +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + */ + + exports.Socket = Socket; + + /** + * Create a new `Socket.IO client` which can establish a persistent + * connection with a Socket.IO enabled server. + * + * @api public + */ + + function Socket (options) { + this.options = { + port: 80 + , secure: false + , document: 'document' in global ? document : false + , resource: 'socket.io' + , transports: io.transports + , 'connect timeout': 10000 + , 'try multiple transports': true + , 'reconnect': true + , 'reconnection delay': 500 + , 'reconnection limit': Infinity + , 'reopen delay': 3000 + , 'max reconnection attempts': 10 + , 'sync disconnect on unload': false + , 'auto connect': true + , 'flash policy port': 10843 + , 'manualFlush': false + }; + + io.util.merge(this.options, options); + + this.connected = false; + this.open = false; + this.connecting = false; + this.reconnecting = false; + this.namespaces = {}; + this.buffer = []; + this.doBuffer = false; + + if (this.options['sync disconnect on unload'] && + (!this.isXDomain() || io.util.ua.hasCORS)) { + var self = this; + io.util.on(global, 'beforeunload', function () { + self.disconnectSync(); + }, false); + } + + if (this.options['auto connect']) { + this.connect(); + } +}; + + /** + * Apply EventEmitter mixin. + */ + + io.util.mixin(Socket, io.EventEmitter); + + /** + * Returns a namespace listener/emitter for this socket + * + * @api public + */ + + Socket.prototype.of = function (name) { + if (!this.namespaces[name]) { + this.namespaces[name] = new io.SocketNamespace(this, name); + + if (name !== '') { + this.namespaces[name].packet({ type: 'connect' }); + } + } + + return this.namespaces[name]; + }; + + /** + * Emits the given event to the Socket and all namespaces + * + * @api private + */ + + Socket.prototype.publish = function () { + this.emit.apply(this, arguments); + + var nsp; + + for (var i in this.namespaces) { + if (this.namespaces.hasOwnProperty(i)) { + nsp = this.of(i); + nsp.$emit.apply(nsp, arguments); + } + } + }; + + /** + * Performs the handshake + * + * @api private + */ + + function empty () { }; + + Socket.prototype.handshake = function (fn) { + var self = this + , options = this.options; + + function complete (data) { + if (data instanceof Error) { + self.connecting = false; + self.onError(data.message); + } else { + fn.apply(null, data.split(':')); + } + }; + + var url = [ + 'http' + (options.secure ? 's' : '') + ':/' + , options.host + ':' + options.port + , options.resource + , io.protocol + , io.util.query(this.options.query, 't=' + +new Date) + ].join('/'); + + if (this.isXDomain() && !io.util.ua.hasCORS) { + var insertAt = document.getElementsByTagName('script')[0] + , script = document.createElement('script'); + + script.src = url + '&jsonp=' + io.j.length; + insertAt.parentNode.insertBefore(script, insertAt); + + io.j.push(function (data) { + complete(data); + script.parentNode.removeChild(script); + }); + } else { + var xhr = io.util.request(); + + xhr.open('GET', url, true); + if (this.isXDomain()) { + xhr.withCredentials = true; + } + xhr.onreadystatechange = function () { + if (xhr.readyState == 4) { + xhr.onreadystatechange = empty; + + if (xhr.status == 200) { + complete(xhr.responseText); + } else if (xhr.status == 403) { + self.onError(xhr.responseText); + } else { + self.connecting = false; + !self.reconnecting && self.onError(xhr.responseText); + } + } + }; + xhr.send(null); + } + }; + + /** + * Find an available transport based on the options supplied in the constructor. + * + * @api private + */ + + Socket.prototype.getTransport = function (override) { + var transports = override || this.transports, match; + + for (var i = 0, transport; transport = transports[i]; i++) { + if (io.Transport[transport] + && io.Transport[transport].check(this) + && (!this.isXDomain() || io.Transport[transport].xdomainCheck(this))) { + return new io.Transport[transport](this, this.sessionid); + } + } + + return null; + }; + + /** + * Connects to the server. + * + * @param {Function} [fn] Callback. + * @returns {io.Socket} + * @api public + */ + + Socket.prototype.connect = function (fn) { + if (this.connecting) { + return this; + } + + var self = this; + self.connecting = true; + + this.handshake(function (sid, heartbeat, close, transports) { + self.sessionid = sid; + self.closeTimeout = close * 1000; + self.heartbeatTimeout = heartbeat * 1000; + if(!self.transports) + self.transports = self.origTransports = (transports ? io.util.intersect( + transports.split(',') + , self.options.transports + ) : self.options.transports); + + self.setHeartbeatTimeout(); + + function connect (transports){ + if (self.transport) self.transport.clearTimeouts(); + + self.transport = self.getTransport(transports); + if (!self.transport) return self.publish('connect_failed'); + + // once the transport is ready + self.transport.ready(self, function () { + self.connecting = true; + self.publish('connecting', self.transport.name); + self.transport.open(); + + if (self.options['connect timeout']) { + self.connectTimeoutTimer = setTimeout(function () { + if (!self.connected) { + self.connecting = false; + + if (self.options['try multiple transports']) { + var remaining = self.transports; + + while (remaining.length > 0 && remaining.splice(0,1)[0] != + self.transport.name) {} + + if (remaining.length){ + connect(remaining); + } else { + self.publish('connect_failed'); + } + } + } + }, self.options['connect timeout']); + } + }); + } + + connect(self.transports); + + self.once('connect', function (){ + clearTimeout(self.connectTimeoutTimer); + + fn && typeof fn == 'function' && fn(); + }); + }); + + return this; + }; + + /** + * Clears and sets a new heartbeat timeout using the value given by the + * server during the handshake. + * + * @api private + */ + + Socket.prototype.setHeartbeatTimeout = function () { + clearTimeout(this.heartbeatTimeoutTimer); + if(this.transport && !this.transport.heartbeats()) return; + + var self = this; + this.heartbeatTimeoutTimer = setTimeout(function () { + self.transport.onClose(); + }, this.heartbeatTimeout); + }; + + /** + * Sends a message. + * + * @param {Object} data packet. + * @returns {io.Socket} + * @api public + */ + + Socket.prototype.packet = function (data) { + if (this.connected && !this.doBuffer) { + this.transport.packet(data); + } else { + this.buffer.push(data); + } + + return this; + }; + + /** + * Sets buffer state + * + * @api private + */ + + Socket.prototype.setBuffer = function (v) { + this.doBuffer = v; + + if (!v && this.connected && this.buffer.length) { + if (!this.options['manualFlush']) { + this.flushBuffer(); + } + } + }; + + /** + * Flushes the buffer data over the wire. + * To be invoked manually when 'manualFlush' is set to true. + * + * @api public + */ + + Socket.prototype.flushBuffer = function() { + this.transport.payload(this.buffer); + this.buffer = []; + }; + + + /** + * Disconnect the established connect. + * + * @returns {io.Socket} + * @api public + */ + + Socket.prototype.disconnect = function () { + if (this.connected || this.connecting) { + if (this.open) { + this.of('').packet({ type: 'disconnect' }); + } + + // handle disconnection immediately + this.onDisconnect('booted'); + } + + return this; + }; + + /** + * Disconnects the socket with a sync XHR. + * + * @api private + */ + + Socket.prototype.disconnectSync = function () { + // ensure disconnection + var xhr = io.util.request(); + var uri = [ + 'http' + (this.options.secure ? 's' : '') + ':/' + , this.options.host + ':' + this.options.port + , this.options.resource + , io.protocol + , '' + , this.sessionid + ].join('/') + '/?disconnect=1'; + + xhr.open('GET', uri, false); + xhr.send(null); + + // handle disconnection immediately + this.onDisconnect('booted'); + }; + + /** + * Check if we need to use cross domain enabled transports. Cross domain would + * be a different port or different domain name. + * + * @returns {Boolean} + * @api private + */ + + Socket.prototype.isXDomain = function () { + + var port = global.location.port || + ('https:' == global.location.protocol ? 443 : 80); + + return this.options.host !== global.location.hostname + || this.options.port != port; + }; + + /** + * Called upon handshake. + * + * @api private + */ + + Socket.prototype.onConnect = function () { + if (!this.connected) { + this.connected = true; + this.connecting = false; + if (!this.doBuffer) { + // make sure to flush the buffer + this.setBuffer(false); + } + this.emit('connect'); + } + }; + + /** + * Called when the transport opens + * + * @api private + */ + + Socket.prototype.onOpen = function () { + this.open = true; + }; + + /** + * Called when the transport closes. + * + * @api private + */ + + Socket.prototype.onClose = function () { + this.open = false; + clearTimeout(this.heartbeatTimeoutTimer); + }; + + /** + * Called when the transport first opens a connection + * + * @param text + */ + + Socket.prototype.onPacket = function (packet) { + this.of(packet.endpoint).onPacket(packet); + }; + + /** + * Handles an error. + * + * @api private + */ + + Socket.prototype.onError = function (err) { + if (err && err.advice) { + if (err.advice === 'reconnect' && (this.connected || this.connecting)) { + this.disconnect(); + if (this.options.reconnect) { + this.reconnect(); + } + } + } + + this.publish('error', err && err.reason ? err.reason : err); + }; + + /** + * Called when the transport disconnects. + * + * @api private + */ + + Socket.prototype.onDisconnect = function (reason) { + var wasConnected = this.connected + , wasConnecting = this.connecting; + + this.connected = false; + this.connecting = false; + this.open = false; + + if (wasConnected || wasConnecting) { + this.transport.close(); + this.transport.clearTimeouts(); + if (wasConnected) { + this.publish('disconnect', reason); + + if ('booted' != reason && this.options.reconnect && !this.reconnecting) { + this.reconnect(); + } + } + } + }; + + /** + * Called upon reconnection. + * + * @api private + */ + + Socket.prototype.reconnect = function () { + this.reconnecting = true; + this.reconnectionAttempts = 0; + this.reconnectionDelay = this.options['reconnection delay']; + + var self = this + , maxAttempts = this.options['max reconnection attempts'] + , tryMultiple = this.options['try multiple transports'] + , limit = this.options['reconnection limit']; + + function reset () { + if (self.connected) { + for (var i in self.namespaces) { + if (self.namespaces.hasOwnProperty(i) && '' !== i) { + self.namespaces[i].packet({ type: 'connect' }); + } + } + self.publish('reconnect', self.transport.name, self.reconnectionAttempts); + } + + clearTimeout(self.reconnectionTimer); + + self.removeListener('connect_failed', maybeReconnect); + self.removeListener('connect', maybeReconnect); + + self.reconnecting = false; + + delete self.reconnectionAttempts; + delete self.reconnectionDelay; + delete self.reconnectionTimer; + delete self.redoTransports; + + self.options['try multiple transports'] = tryMultiple; + }; + + function maybeReconnect () { + if (!self.reconnecting) { + return; + } + + if (self.connected) { + return reset(); + }; + + if (self.connecting && self.reconnecting) { + return self.reconnectionTimer = setTimeout(maybeReconnect, 1000); + } + + if (self.reconnectionAttempts++ >= maxAttempts) { + if (!self.redoTransports) { + self.on('connect_failed', maybeReconnect); + self.options['try multiple transports'] = true; + self.transports = self.origTransports; + self.transport = self.getTransport(); + self.redoTransports = true; + self.connect(); + } else { + self.publish('reconnect_failed'); + reset(); + } + } else { + if (self.reconnectionDelay < limit) { + self.reconnectionDelay *= 2; // exponential back off + } + + self.connect(); + self.publish('reconnecting', self.reconnectionDelay, self.reconnectionAttempts); + self.reconnectionTimer = setTimeout(maybeReconnect, self.reconnectionDelay); + } + }; + + this.options['try multiple transports'] = false; + this.reconnectionTimer = setTimeout(maybeReconnect, this.reconnectionDelay); + + this.on('connect', maybeReconnect); + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.SocketNamespace = SocketNamespace; + + /** + * Socket namespace constructor. + * + * @constructor + * @api public + */ + + function SocketNamespace (socket, name) { + this.socket = socket; + this.name = name || ''; + this.flags = {}; + this.json = new Flag(this, 'json'); + this.ackPackets = 0; + this.acks = {}; + }; + + /** + * Apply EventEmitter mixin. + */ + + io.util.mixin(SocketNamespace, io.EventEmitter); + + /** + * Copies emit since we override it + * + * @api private + */ + + SocketNamespace.prototype.$emit = io.EventEmitter.prototype.emit; + + /** + * Creates a new namespace, by proxying the request to the socket. This + * allows us to use the synax as we do on the server. + * + * @api public + */ + + SocketNamespace.prototype.of = function () { + return this.socket.of.apply(this.socket, arguments); + }; + + /** + * Sends a packet. + * + * @api private + */ + + SocketNamespace.prototype.packet = function (packet) { + packet.endpoint = this.name; + this.socket.packet(packet); + this.flags = {}; + return this; + }; + + /** + * Sends a message + * + * @api public + */ + + SocketNamespace.prototype.send = function (data, fn) { + var packet = { + type: this.flags.json ? 'json' : 'message' + , data: data + }; + + if ('function' == typeof fn) { + packet.id = ++this.ackPackets; + packet.ack = true; + this.acks[packet.id] = fn; + } + + return this.packet(packet); + }; + + /** + * Emits an event + * + * @api public + */ + + SocketNamespace.prototype.emit = function (name) { + var args = Array.prototype.slice.call(arguments, 1) + , lastArg = args[args.length - 1] + , packet = { + type: 'event' + , name: name + }; + + if ('function' == typeof lastArg) { + packet.id = ++this.ackPackets; + packet.ack = 'data'; + this.acks[packet.id] = lastArg; + args = args.slice(0, args.length - 1); + } + + packet.args = args; + + return this.packet(packet); + }; + + /** + * Disconnects the namespace + * + * @api private + */ + + SocketNamespace.prototype.disconnect = function () { + if (this.name === '') { + this.socket.disconnect(); + } else { + this.packet({ type: 'disconnect' }); + this.$emit('disconnect'); + } + + return this; + }; + + /** + * Handles a packet + * + * @api private + */ + + SocketNamespace.prototype.onPacket = function (packet) { + var self = this; + + function ack () { + self.packet({ + type: 'ack' + , args: io.util.toArray(arguments) + , ackId: packet.id + }); + }; + + switch (packet.type) { + case 'connect': + this.$emit('connect'); + break; + + case 'disconnect': + if (this.name === '') { + this.socket.onDisconnect(packet.reason || 'booted'); + } else { + this.$emit('disconnect', packet.reason); + } + break; + + case 'message': + case 'json': + var params = ['message', packet.data]; + + if (packet.ack == 'data') { + params.push(ack); + } else if (packet.ack) { + this.packet({ type: 'ack', ackId: packet.id }); + } + + this.$emit.apply(this, params); + break; + + case 'event': + var params = [packet.name].concat(packet.args); + + if (packet.ack == 'data') + params.push(ack); + + this.$emit.apply(this, params); + break; + + case 'ack': + if (this.acks[packet.ackId]) { + this.acks[packet.ackId].apply(this, packet.args); + delete this.acks[packet.ackId]; + } + break; + + case 'error': + if (packet.advice){ + this.socket.onError(packet); + } else { + if (packet.reason == 'unauthorized') { + this.$emit('connect_failed', packet.reason); + } else { + this.$emit('error', packet.reason); + } + } + break; + } + }; + + /** + * Flag interface. + * + * @api private + */ + + function Flag (nsp, name) { + this.namespace = nsp; + this.name = name; + }; + + /** + * Send a message + * + * @api public + */ + + Flag.prototype.send = function () { + this.namespace.flags[this.name] = true; + this.namespace.send.apply(this.namespace, arguments); + }; + + /** + * Emit an event + * + * @api public + */ + + Flag.prototype.emit = function () { + this.namespace.flags[this.name] = true; + this.namespace.emit.apply(this.namespace, arguments); + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + */ + + exports.websocket = WS; + + /** + * The WebSocket transport uses the HTML5 WebSocket API to establish an + * persistent connection with the Socket.IO server. This transport will also + * be inherited by the FlashSocket fallback as it provides a API compatible + * polyfill for the WebSockets. + * + * @constructor + * @extends {io.Transport} + * @api public + */ + + function WS (socket) { + io.Transport.apply(this, arguments); + }; + + /** + * Inherits from Transport. + */ + + io.util.inherit(WS, io.Transport); + + /** + * Transport name + * + * @api public + */ + + WS.prototype.name = 'websocket'; + + /** + * Initializes a new `WebSocket` connection with the Socket.IO server. We attach + * all the appropriate listeners to handle the responses from the server. + * + * @returns {Transport} + * @api public + */ + + WS.prototype.open = function () { + var query = io.util.query(this.socket.options.query) + , self = this + , Socket + + + if (!Socket) { + Socket = global.MozWebSocket || global.WebSocket; + } + + this.websocket = new Socket(this.prepareUrl() + query); + + this.websocket.onopen = function () { + self.onOpen(); + self.socket.setBuffer(false); + }; + this.websocket.onmessage = function (ev) { + self.onData(ev.data); + }; + this.websocket.onclose = function () { + self.onClose(); + self.socket.setBuffer(true); + }; + this.websocket.onerror = function (e) { + self.onError(e); + }; + + return this; + }; + + /** + * Send a message to the Socket.IO server. The message will automatically be + * encoded in the correct message format. + * + * @returns {Transport} + * @api public + */ + + // Do to a bug in the current IDevices browser, we need to wrap the send in a + // setTimeout, when they resume from sleeping the browser will crash if + // we don't allow the browser time to detect the socket has been closed + if (io.util.ua.iDevice) { + WS.prototype.send = function (data) { + var self = this; + setTimeout(function() { + self.websocket.send(data); + },0); + return this; + }; + } else { + WS.prototype.send = function (data) { + this.websocket.send(data); + return this; + }; + } + + /** + * Payload + * + * @api private + */ + + WS.prototype.payload = function (arr) { + for (var i = 0, l = arr.length; i < l; i++) { + this.packet(arr[i]); + } + return this; + }; + + /** + * Disconnect the established `WebSocket` connection. + * + * @returns {Transport} + * @api public + */ + + WS.prototype.close = function () { + this.websocket.close(); + return this; + }; + + /** + * Handle the errors that `WebSocket` might be giving when we + * are attempting to connect or send messages. + * + * @param {Error} e The error. + * @api private + */ + + WS.prototype.onError = function (e) { + this.socket.onError(e); + }; + + /** + * Returns the appropriate scheme for the URI generation. + * + * @api private + */ + WS.prototype.scheme = function () { + return this.socket.options.secure ? 'wss' : 'ws'; + }; + + /** + * Checks if the browser has support for native `WebSockets` and that + * it's not the polyfill created for the FlashSocket transport. + * + * @return {Boolean} + * @api public + */ + + WS.check = function () { + return ('WebSocket' in global && !('__addTask' in WebSocket)) + || 'MozWebSocket' in global; + }; + + /** + * Check if the `WebSocket` transport support cross domain communications. + * + * @returns {Boolean} + * @api public + */ + + WS.xdomainCheck = function () { + return true; + }; + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('websocket'); + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.flashsocket = Flashsocket; + + /** + * The FlashSocket transport. This is a API wrapper for the HTML5 WebSocket + * specification. It uses a .swf file to communicate with the server. If you want + * to serve the .swf file from a other server than where the Socket.IO script is + * coming from you need to use the insecure version of the .swf. More information + * about this can be found on the github page. + * + * @constructor + * @extends {io.Transport.websocket} + * @api public + */ + + function Flashsocket () { + io.Transport.websocket.apply(this, arguments); + }; + + /** + * Inherits from Transport. + */ + + io.util.inherit(Flashsocket, io.Transport.websocket); + + /** + * Transport name + * + * @api public + */ + + Flashsocket.prototype.name = 'flashsocket'; + + /** + * Disconnect the established `FlashSocket` connection. This is done by adding a + * new task to the FlashSocket. The rest will be handled off by the `WebSocket` + * transport. + * + * @returns {Transport} + * @api public + */ + + Flashsocket.prototype.open = function () { + var self = this + , args = arguments; + + WebSocket.__addTask(function () { + io.Transport.websocket.prototype.open.apply(self, args); + }); + return this; + }; + + /** + * Sends a message to the Socket.IO server. This is done by adding a new + * task to the FlashSocket. The rest will be handled off by the `WebSocket` + * transport. + * + * @returns {Transport} + * @api public + */ + + Flashsocket.prototype.send = function () { + var self = this, args = arguments; + WebSocket.__addTask(function () { + io.Transport.websocket.prototype.send.apply(self, args); + }); + return this; + }; + + /** + * Disconnects the established `FlashSocket` connection. + * + * @returns {Transport} + * @api public + */ + + Flashsocket.prototype.close = function () { + WebSocket.__tasks.length = 0; + io.Transport.websocket.prototype.close.call(this); + return this; + }; + + /** + * The WebSocket fall back needs to append the flash container to the body + * element, so we need to make sure we have access to it. Or defer the call + * until we are sure there is a body element. + * + * @param {Socket} socket The socket instance that needs a transport + * @param {Function} fn The callback + * @api private + */ + + Flashsocket.prototype.ready = function (socket, fn) { + function init () { + var options = socket.options + , port = options['flash policy port'] + , path = [ + 'http' + (options.secure ? 's' : '') + ':/' + , options.host + ':' + options.port + , options.resource + , 'static/flashsocket' + , 'WebSocketMain' + (socket.isXDomain() ? 'Insecure' : '') + '.swf' + ]; + + // Only start downloading the swf file when the checked that this browser + // actually supports it + if (!Flashsocket.loaded) { + if (typeof WEB_SOCKET_SWF_LOCATION === 'undefined') { + // Set the correct file based on the XDomain settings + WEB_SOCKET_SWF_LOCATION = path.join('/'); + } + + if (port !== 843) { + WebSocket.loadFlashPolicyFile('xmlsocket://' + options.host + ':' + port); + } + + WebSocket.__initialize(); + Flashsocket.loaded = true; + } + + fn.call(self); + } + + var self = this; + if (document.body) return init(); + + io.util.load(init); + }; + + /** + * Check if the FlashSocket transport is supported as it requires that the Adobe + * Flash Player plug-in version `10.0.0` or greater is installed. And also check if + * the polyfill is correctly loaded. + * + * @returns {Boolean} + * @api public + */ + + Flashsocket.check = function () { + if ( + typeof WebSocket == 'undefined' + || !('__initialize' in WebSocket) || !swfobject + ) return false; + + return swfobject.getFlashPlayerVersion().major >= 10; + }; + + /** + * Check if the FlashSocket transport can be used as cross domain / cross origin + * transport. Because we can't see which type (secure or insecure) of .swf is used + * we will just return true. + * + * @returns {Boolean} + * @api public + */ + + Flashsocket.xdomainCheck = function () { + return true; + }; + + /** + * Disable AUTO_INITIALIZATION + */ + + if (typeof window != 'undefined') { + WEB_SOCKET_DISABLE_AUTO_INITIALIZATION = true; + } + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('flashsocket'); +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); +/* SWFObject v2.2 + is released under the MIT License +*/ +if ('undefined' != typeof window) { +var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O[(['Active'].concat('Object').join('X'))]!=D){try{var ad=new window[(['Active'].concat('Object').join('X'))](W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y0){for(var af=0;af0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad'}}aa.outerHTML='"+af+"";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab +// License: New BSD License +// Reference: http://dev.w3.org/html5/websockets/ +// Reference: http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol + +(function() { + + if ('undefined' == typeof window || window.WebSocket) return; + + var console = window.console; + if (!console || !console.log || !console.error) { + console = {log: function(){ }, error: function(){ }}; + } + + if (!swfobject.hasFlashPlayerVersion("10.0.0")) { + console.error("Flash Player >= 10.0.0 is required."); + return; + } + if (location.protocol == "file:") { + console.error( + "WARNING: web-socket-js doesn't work in file:///... URL " + + "unless you set Flash Security Settings properly. " + + "Open the page via Web server i.e. http://..."); + } + + /** + * This class represents a faux web socket. + * @param {string} url + * @param {array or string} protocols + * @param {string} proxyHost + * @param {int} proxyPort + * @param {string} headers + */ + WebSocket = function(url, protocols, proxyHost, proxyPort, headers) { + var self = this; + self.__id = WebSocket.__nextId++; + WebSocket.__instances[self.__id] = self; + self.readyState = WebSocket.CONNECTING; + self.bufferedAmount = 0; + self.__events = {}; + if (!protocols) { + protocols = []; + } else if (typeof protocols == "string") { + protocols = [protocols]; + } + // Uses setTimeout() to make sure __createFlash() runs after the caller sets ws.onopen etc. + // Otherwise, when onopen fires immediately, onopen is called before it is set. + setTimeout(function() { + WebSocket.__addTask(function() { + WebSocket.__flash.create( + self.__id, url, protocols, proxyHost || null, proxyPort || 0, headers || null); + }); + }, 0); + }; + + /** + * Send data to the web socket. + * @param {string} data The data to send to the socket. + * @return {boolean} True for success, false for failure. + */ + WebSocket.prototype.send = function(data) { + if (this.readyState == WebSocket.CONNECTING) { + throw "INVALID_STATE_ERR: Web Socket connection has not been established"; + } + // We use encodeURIComponent() here, because FABridge doesn't work if + // the argument includes some characters. We don't use escape() here + // because of this: + // https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Functions#escape_and_unescape_Functions + // But it looks decodeURIComponent(encodeURIComponent(s)) doesn't + // preserve all Unicode characters either e.g. "\uffff" in Firefox. + // Note by wtritch: Hopefully this will not be necessary using ExternalInterface. Will require + // additional testing. + var result = WebSocket.__flash.send(this.__id, encodeURIComponent(data)); + if (result < 0) { // success + return true; + } else { + this.bufferedAmount += result; + return false; + } + }; + + /** + * Close this web socket gracefully. + */ + WebSocket.prototype.close = function() { + if (this.readyState == WebSocket.CLOSED || this.readyState == WebSocket.CLOSING) { + return; + } + this.readyState = WebSocket.CLOSING; + WebSocket.__flash.close(this.__id); + }; + + /** + * Implementation of {@link DOM 2 EventTarget Interface} + * + * @param {string} type + * @param {function} listener + * @param {boolean} useCapture + * @return void + */ + WebSocket.prototype.addEventListener = function(type, listener, useCapture) { + if (!(type in this.__events)) { + this.__events[type] = []; + } + this.__events[type].push(listener); + }; + + /** + * Implementation of {@link DOM 2 EventTarget Interface} + * + * @param {string} type + * @param {function} listener + * @param {boolean} useCapture + * @return void + */ + WebSocket.prototype.removeEventListener = function(type, listener, useCapture) { + if (!(type in this.__events)) return; + var events = this.__events[type]; + for (var i = events.length - 1; i >= 0; --i) { + if (events[i] === listener) { + events.splice(i, 1); + break; + } + } + }; + + /** + * Implementation of {@link DOM 2 EventTarget Interface} + * + * @param {Event} event + * @return void + */ + WebSocket.prototype.dispatchEvent = function(event) { + var events = this.__events[event.type] || []; + for (var i = 0; i < events.length; ++i) { + events[i](event); + } + var handler = this["on" + event.type]; + if (handler) handler(event); + }; + + /** + * Handles an event from Flash. + * @param {Object} flashEvent + */ + WebSocket.prototype.__handleEvent = function(flashEvent) { + if ("readyState" in flashEvent) { + this.readyState = flashEvent.readyState; + } + if ("protocol" in flashEvent) { + this.protocol = flashEvent.protocol; + } + + var jsEvent; + if (flashEvent.type == "open" || flashEvent.type == "error") { + jsEvent = this.__createSimpleEvent(flashEvent.type); + } else if (flashEvent.type == "close") { + // TODO implement jsEvent.wasClean + jsEvent = this.__createSimpleEvent("close"); + } else if (flashEvent.type == "message") { + var data = decodeURIComponent(flashEvent.message); + jsEvent = this.__createMessageEvent("message", data); + } else { + throw "unknown event type: " + flashEvent.type; + } + + this.dispatchEvent(jsEvent); + }; + + WebSocket.prototype.__createSimpleEvent = function(type) { + if (document.createEvent && window.Event) { + var event = document.createEvent("Event"); + event.initEvent(type, false, false); + return event; + } else { + return {type: type, bubbles: false, cancelable: false}; + } + }; + + WebSocket.prototype.__createMessageEvent = function(type, data) { + if (document.createEvent && window.MessageEvent && !window.opera) { + var event = document.createEvent("MessageEvent"); + event.initMessageEvent("message", false, false, data, null, null, window, null); + return event; + } else { + // IE and Opera, the latter one truncates the data parameter after any 0x00 bytes. + return {type: type, data: data, bubbles: false, cancelable: false}; + } + }; + + /** + * Define the WebSocket readyState enumeration. + */ + WebSocket.CONNECTING = 0; + WebSocket.OPEN = 1; + WebSocket.CLOSING = 2; + WebSocket.CLOSED = 3; + + WebSocket.__flash = null; + WebSocket.__instances = {}; + WebSocket.__tasks = []; + WebSocket.__nextId = 0; + + /** + * Load a new flash security policy file. + * @param {string} url + */ + WebSocket.loadFlashPolicyFile = function(url){ + WebSocket.__addTask(function() { + WebSocket.__flash.loadManualPolicyFile(url); + }); + }; + + /** + * Loads WebSocketMain.swf and creates WebSocketMain object in Flash. + */ + WebSocket.__initialize = function() { + if (WebSocket.__flash) return; + + if (WebSocket.__swfLocation) { + // For backword compatibility. + window.WEB_SOCKET_SWF_LOCATION = WebSocket.__swfLocation; + } + if (!window.WEB_SOCKET_SWF_LOCATION) { + console.error("[WebSocket] set WEB_SOCKET_SWF_LOCATION to location of WebSocketMain.swf"); + return; + } + var container = document.createElement("div"); + container.id = "webSocketContainer"; + // Hides Flash box. We cannot use display: none or visibility: hidden because it prevents + // Flash from loading at least in IE. So we move it out of the screen at (-100, -100). + // But this even doesn't work with Flash Lite (e.g. in Droid Incredible). So with Flash + // Lite, we put it at (0, 0). This shows 1x1 box visible at left-top corner but this is + // the best we can do as far as we know now. + container.style.position = "absolute"; + if (WebSocket.__isFlashLite()) { + container.style.left = "0px"; + container.style.top = "0px"; + } else { + container.style.left = "-100px"; + container.style.top = "-100px"; + } + var holder = document.createElement("div"); + holder.id = "webSocketFlash"; + container.appendChild(holder); + document.body.appendChild(container); + // See this article for hasPriority: + // http://help.adobe.com/en_US/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-7ffd.html + swfobject.embedSWF( + WEB_SOCKET_SWF_LOCATION, + "webSocketFlash", + "1" /* width */, + "1" /* height */, + "10.0.0" /* SWF version */, + null, + null, + {hasPriority: true, swliveconnect : true, allowScriptAccess: "always"}, + null, + function(e) { + if (!e.success) { + console.error("[WebSocket] swfobject.embedSWF failed"); + } + }); + }; + + /** + * Called by Flash to notify JS that it's fully loaded and ready + * for communication. + */ + WebSocket.__onFlashInitialized = function() { + // We need to set a timeout here to avoid round-trip calls + // to flash during the initialization process. + setTimeout(function() { + WebSocket.__flash = document.getElementById("webSocketFlash"); + WebSocket.__flash.setCallerUrl(location.href); + WebSocket.__flash.setDebug(!!window.WEB_SOCKET_DEBUG); + for (var i = 0; i < WebSocket.__tasks.length; ++i) { + WebSocket.__tasks[i](); + } + WebSocket.__tasks = []; + }, 0); + }; + + /** + * Called by Flash to notify WebSockets events are fired. + */ + WebSocket.__onFlashEvent = function() { + setTimeout(function() { + try { + // Gets events using receiveEvents() instead of getting it from event object + // of Flash event. This is to make sure to keep message order. + // It seems sometimes Flash events don't arrive in the same order as they are sent. + var events = WebSocket.__flash.receiveEvents(); + for (var i = 0; i < events.length; ++i) { + WebSocket.__instances[events[i].webSocketId].__handleEvent(events[i]); + } + } catch (e) { + console.error(e); + } + }, 0); + return true; + }; + + // Called by Flash. + WebSocket.__log = function(message) { + console.log(decodeURIComponent(message)); + }; + + // Called by Flash. + WebSocket.__error = function(message) { + console.error(decodeURIComponent(message)); + }; + + WebSocket.__addTask = function(task) { + if (WebSocket.__flash) { + task(); + } else { + WebSocket.__tasks.push(task); + } + }; + + /** + * Test if the browser is running flash lite. + * @return {boolean} True if flash lite is running, false otherwise. + */ + WebSocket.__isFlashLite = function() { + if (!window.navigator || !window.navigator.mimeTypes) { + return false; + } + var mimeType = window.navigator.mimeTypes["application/x-shockwave-flash"]; + if (!mimeType || !mimeType.enabledPlugin || !mimeType.enabledPlugin.filename) { + return false; + } + return mimeType.enabledPlugin.filename.match(/flashlite/i) ? true : false; + }; + + if (!window.WEB_SOCKET_DISABLE_AUTO_INITIALIZATION) { + if (window.addEventListener) { + window.addEventListener("load", function(){ + WebSocket.__initialize(); + }, false); + } else { + window.attachEvent("onload", function(){ + WebSocket.__initialize(); + }); + } + } + +})(); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + * + * @api public + */ + + exports.XHR = XHR; + + /** + * XHR constructor + * + * @costructor + * @api public + */ + + function XHR (socket) { + if (!socket) return; + + io.Transport.apply(this, arguments); + this.sendBuffer = []; + }; + + /** + * Inherits from Transport. + */ + + io.util.inherit(XHR, io.Transport); + + /** + * Establish a connection + * + * @returns {Transport} + * @api public + */ + + XHR.prototype.open = function () { + this.socket.setBuffer(false); + this.onOpen(); + this.get(); + + // we need to make sure the request succeeds since we have no indication + // whether the request opened or not until it succeeded. + this.setCloseTimeout(); + + return this; + }; + + /** + * Check if we need to send data to the Socket.IO server, if we have data in our + * buffer we encode it and forward it to the `post` method. + * + * @api private + */ + + XHR.prototype.payload = function (payload) { + var msgs = []; + + for (var i = 0, l = payload.length; i < l; i++) { + msgs.push(io.parser.encodePacket(payload[i])); + } + + this.send(io.parser.encodePayload(msgs)); + }; + + /** + * Send data to the Socket.IO server. + * + * @param data The message + * @returns {Transport} + * @api public + */ + + XHR.prototype.send = function (data) { + this.post(data); + return this; + }; + + /** + * Posts a encoded message to the Socket.IO server. + * + * @param {String} data A encoded message. + * @api private + */ + + function empty () { }; + + XHR.prototype.post = function (data) { + var self = this; + this.socket.setBuffer(true); + + function stateChange () { + if (this.readyState == 4) { + this.onreadystatechange = empty; + self.posting = false; + + if (this.status == 200){ + self.socket.setBuffer(false); + } else { + self.onClose(); + } + } + } + + function onload () { + this.onload = empty; + self.socket.setBuffer(false); + }; + + this.sendXHR = this.request('POST'); + + if (global.XDomainRequest && this.sendXHR instanceof XDomainRequest) { + this.sendXHR.onload = this.sendXHR.onerror = onload; + } else { + this.sendXHR.onreadystatechange = stateChange; + } + + this.sendXHR.send(data); + }; + + /** + * Disconnects the established `XHR` connection. + * + * @returns {Transport} + * @api public + */ + + XHR.prototype.close = function () { + this.onClose(); + return this; + }; + + /** + * Generates a configured XHR request + * + * @param {String} url The url that needs to be requested. + * @param {String} method The method the request should use. + * @returns {XMLHttpRequest} + * @api private + */ + + XHR.prototype.request = function (method) { + var req = io.util.request(this.socket.isXDomain()) + , query = io.util.query(this.socket.options.query, 't=' + +new Date); + + req.open(method || 'GET', this.prepareUrl() + query, true); + + if (method == 'POST') { + try { + if (req.setRequestHeader) { + req.setRequestHeader('Content-type', 'text/plain;charset=UTF-8'); + } else { + // XDomainRequest + req.contentType = 'text/plain'; + } + } catch (e) {} + } + + return req; + }; + + /** + * Returns the scheme to use for the transport URLs. + * + * @api private + */ + + XHR.prototype.scheme = function () { + return this.socket.options.secure ? 'https' : 'http'; + }; + + /** + * Check if the XHR transports are supported + * + * @param {Boolean} xdomain Check if we support cross domain requests. + * @returns {Boolean} + * @api public + */ + + XHR.check = function (socket, xdomain) { + try { + var request = io.util.request(xdomain), + usesXDomReq = (global.XDomainRequest && request instanceof XDomainRequest), + socketProtocol = (socket && socket.options && socket.options.secure ? 'https:' : 'http:'), + isXProtocol = (global.location && socketProtocol != global.location.protocol); + if (request && !(usesXDomReq && isXProtocol)) { + return true; + } + } catch(e) {} + + return false; + }; + + /** + * Check if the XHR transport supports cross domain requests. + * + * @returns {Boolean} + * @api public + */ + + XHR.xdomainCheck = function (socket) { + return XHR.check(socket, true); + }; + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.htmlfile = HTMLFile; + + /** + * The HTMLFile transport creates a `forever iframe` based transport + * for Internet Explorer. Regular forever iframe implementations will + * continuously trigger the browsers buzy indicators. If the forever iframe + * is created inside a `htmlfile` these indicators will not be trigged. + * + * @constructor + * @extends {io.Transport.XHR} + * @api public + */ + + function HTMLFile (socket) { + io.Transport.XHR.apply(this, arguments); + }; + + /** + * Inherits from XHR transport. + */ + + io.util.inherit(HTMLFile, io.Transport.XHR); + + /** + * Transport name + * + * @api public + */ + + HTMLFile.prototype.name = 'htmlfile'; + + /** + * Creates a new Ac...eX `htmlfile` with a forever loading iframe + * that can be used to listen to messages. Inside the generated + * `htmlfile` a reference will be made to the HTMLFile transport. + * + * @api private + */ + + HTMLFile.prototype.get = function () { + this.doc = new window[(['Active'].concat('Object').join('X'))]('htmlfile'); + this.doc.open(); + this.doc.write(''); + this.doc.close(); + this.doc.parentWindow.s = this; + + var iframeC = this.doc.createElement('div'); + iframeC.className = 'socketio'; + + this.doc.body.appendChild(iframeC); + this.iframe = this.doc.createElement('iframe'); + + iframeC.appendChild(this.iframe); + + var self = this + , query = io.util.query(this.socket.options.query, 't='+ +new Date); + + this.iframe.src = this.prepareUrl() + query; + + io.util.on(window, 'unload', function () { + self.destroy(); + }); + }; + + /** + * The Socket.IO server will write script tags inside the forever + * iframe, this function will be used as callback for the incoming + * information. + * + * @param {String} data The message + * @param {document} doc Reference to the context + * @api private + */ + + HTMLFile.prototype._ = function (data, doc) { + // unescape all forward slashes. see GH-1251 + data = data.replace(/\\\//g, '/'); + this.onData(data); + try { + var script = doc.getElementsByTagName('script')[0]; + script.parentNode.removeChild(script); + } catch (e) { } + }; + + /** + * Destroy the established connection, iframe and `htmlfile`. + * And calls the `CollectGarbage` function of Internet Explorer + * to release the memory. + * + * @api private + */ + + HTMLFile.prototype.destroy = function () { + if (this.iframe){ + try { + this.iframe.src = 'about:blank'; + } catch(e){} + + this.doc = null; + this.iframe.parentNode.removeChild(this.iframe); + this.iframe = null; + + CollectGarbage(); + } + }; + + /** + * Disconnects the established connection. + * + * @returns {Transport} Chaining. + * @api public + */ + + HTMLFile.prototype.close = function () { + this.destroy(); + return io.Transport.XHR.prototype.close.call(this); + }; + + /** + * Checks if the browser supports this transport. The browser + * must have an `Ac...eXObject` implementation. + * + * @return {Boolean} + * @api public + */ + + HTMLFile.check = function (socket) { + if (typeof window != "undefined" && (['Active'].concat('Object').join('X')) in window){ + try { + var a = new window[(['Active'].concat('Object').join('X'))]('htmlfile'); + return a && io.Transport.XHR.check(socket); + } catch(e){} + } + return false; + }; + + /** + * Check if cross domain requests are supported. + * + * @returns {Boolean} + * @api public + */ + + HTMLFile.xdomainCheck = function () { + // we can probably do handling for sub-domains, we should + // test that it's cross domain but a subdomain here + return false; + }; + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('htmlfile'); + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + */ + + exports['xhr-polling'] = XHRPolling; + + /** + * The XHR-polling transport uses long polling XHR requests to create a + * "persistent" connection with the server. + * + * @constructor + * @api public + */ + + function XHRPolling () { + io.Transport.XHR.apply(this, arguments); + }; + + /** + * Inherits from XHR transport. + */ + + io.util.inherit(XHRPolling, io.Transport.XHR); + + /** + * Merge the properties from XHR transport + */ + + io.util.merge(XHRPolling, io.Transport.XHR); + + /** + * Transport name + * + * @api public + */ + + XHRPolling.prototype.name = 'xhr-polling'; + + /** + * Indicates whether heartbeats is enabled for this transport + * + * @api private + */ + + XHRPolling.prototype.heartbeats = function () { + return false; + }; + + /** + * Establish a connection, for iPhone and Android this will be done once the page + * is loaded. + * + * @returns {Transport} Chaining. + * @api public + */ + + XHRPolling.prototype.open = function () { + var self = this; + + io.Transport.XHR.prototype.open.call(self); + return false; + }; + + /** + * Starts a XHR request to wait for incoming messages. + * + * @api private + */ + + function empty () {}; + + XHRPolling.prototype.get = function () { + if (!this.isOpen) return; + + var self = this; + + function stateChange () { + if (this.readyState == 4) { + this.onreadystatechange = empty; + + if (this.status == 200) { + self.onData(this.responseText); + self.get(); + } else { + self.onClose(); + } + } + }; + + function onload () { + this.onload = empty; + this.onerror = empty; + self.retryCounter = 1; + self.onData(this.responseText); + self.get(); + }; + + function onerror () { + self.retryCounter ++; + if(!self.retryCounter || self.retryCounter > 3) { + self.onClose(); + } else { + self.get(); + } + }; + + this.xhr = this.request(); + + if (global.XDomainRequest && this.xhr instanceof XDomainRequest) { + this.xhr.onload = onload; + this.xhr.onerror = onerror; + } else { + this.xhr.onreadystatechange = stateChange; + } + + this.xhr.send(null); + }; + + /** + * Handle the unclean close behavior. + * + * @api private + */ + + XHRPolling.prototype.onClose = function () { + io.Transport.XHR.prototype.onClose.call(this); + + if (this.xhr) { + this.xhr.onreadystatechange = this.xhr.onload = this.xhr.onerror = empty; + try { + this.xhr.abort(); + } catch(e){} + this.xhr = null; + } + }; + + /** + * Webkit based browsers show a infinit spinner when you start a XHR request + * before the browsers onload event is called so we need to defer opening of + * the transport until the onload event is called. Wrapping the cb in our + * defer method solve this. + * + * @param {Socket} socket The socket instance that needs a transport + * @param {Function} fn The callback + * @api private + */ + + XHRPolling.prototype.ready = function (socket, fn) { + var self = this; + + io.util.defer(function () { + fn.call(self); + }); + }; + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('xhr-polling'); + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io, global) { + /** + * There is a way to hide the loading indicator in Firefox. If you create and + * remove a iframe it will stop showing the current loading indicator. + * Unfortunately we can't feature detect that and UA sniffing is evil. + * + * @api private + */ + + var indicator = global.document && "MozAppearance" in + global.document.documentElement.style; + + /** + * Expose constructor. + */ + + exports['jsonp-polling'] = JSONPPolling; + + /** + * The JSONP transport creates an persistent connection by dynamically + * inserting a script tag in the page. This script tag will receive the + * information of the Socket.IO server. When new information is received + * it creates a new script tag for the new data stream. + * + * @constructor + * @extends {io.Transport.xhr-polling} + * @api public + */ + + function JSONPPolling (socket) { + io.Transport['xhr-polling'].apply(this, arguments); + + this.index = io.j.length; + + var self = this; + + io.j.push(function (msg) { + self._(msg); + }); + }; + + /** + * Inherits from XHR polling transport. + */ + + io.util.inherit(JSONPPolling, io.Transport['xhr-polling']); + + /** + * Transport name + * + * @api public + */ + + JSONPPolling.prototype.name = 'jsonp-polling'; + + /** + * Posts a encoded message to the Socket.IO server using an iframe. + * The iframe is used because script tags can create POST based requests. + * The iframe is positioned outside of the view so the user does not + * notice it's existence. + * + * @param {String} data A encoded message. + * @api private + */ + + JSONPPolling.prototype.post = function (data) { + var self = this + , query = io.util.query( + this.socket.options.query + , 't='+ (+new Date) + '&i=' + this.index + ); + + if (!this.form) { + var form = document.createElement('form') + , area = document.createElement('textarea') + , id = this.iframeId = 'socketio_iframe_' + this.index + , iframe; + + form.className = 'socketio'; + form.style.position = 'absolute'; + form.style.top = '0px'; + form.style.left = '0px'; + form.style.display = 'none'; + form.target = id; + form.method = 'POST'; + form.setAttribute('accept-charset', 'utf-8'); + area.name = 'd'; + form.appendChild(area); + document.body.appendChild(form); + + this.form = form; + this.area = area; + } + + this.form.action = this.prepareUrl() + query; + + function complete () { + initIframe(); + self.socket.setBuffer(false); + }; + + function initIframe () { + if (self.iframe) { + self.form.removeChild(self.iframe); + } + + try { + // ie6 dynamic iframes with target="" support (thanks Chris Lambacher) + iframe = document.createElement('') + storageContainer.close() + storageOwner = storageContainer.w.frames[0].document + storage = storageOwner.createElement('div') + } catch(e) { + // somehow ActiveXObject instantiation failed (perhaps some special + // security settings or otherwse), fall back to per-path storage + storage = doc.createElement('div') + storageOwner = doc.body + } + function withIEStorage(storeFunction) { + return function() { + var args = Array.prototype.slice.call(arguments, 0) + args.unshift(storage) + // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx + // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx + storageOwner.appendChild(storage) + storage.addBehavior('#default#userData') + storage.load(localStorageName) + var result = storeFunction.apply(store, args) + storageOwner.removeChild(storage) + return result + } + } + + // In IE7, keys may not contain special chars. See all of https://github.com/marcuswestin/store.js/issues/40 + var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g") + function ieKeyFix(key) { + return key.replace(forbiddenCharsRegex, '___') + } + store.set = withIEStorage(function(storage, key, val) { + key = ieKeyFix(key) + if (val === undefined) { return store.remove(key) } + storage.setAttribute(key, store.serialize(val)) + storage.save(localStorageName) + return val + }) + store.get = withIEStorage(function(storage, key) { + key = ieKeyFix(key) + return store.deserialize(storage.getAttribute(key)) + }) + store.remove = withIEStorage(function(storage, key) { + key = ieKeyFix(key) + storage.removeAttribute(key) + storage.save(localStorageName) + }) + store.clear = withIEStorage(function(storage) { + var attributes = storage.XMLDocument.documentElement.attributes + storage.load(localStorageName) + for (var i=0, attr; attr=attributes[i]; i++) { + storage.removeAttribute(attr.name) + } + storage.save(localStorageName) + }) + store.getAll = withIEStorage(function(storage) { + var attributes = storage.XMLDocument.documentElement.attributes + var ret = {} + for (var i=0, attr; attr=attributes[i]; ++i) { + var key = ieKeyFix(attr.name) + ret[attr.name] = store.deserialize(storage.getAttribute(key)) + } + return ret + }) + } + + try { + store.set(namespace, namespace) + if (store.get(namespace) != namespace) { store.disabled = true } + store.remove(namespace) + } catch(e) { + store.disabled = true + } + store.enabled = !store.disabled + if (typeof module != 'undefined' && module.exports) { module.exports = store } + else if (typeof define === 'function' && define.amd) { define("store", store) } + else { win.store = store } +})(this.window || global); + +/* @source mod/user_following.js */; + +define('store', 'lib/store.js'); +define('mod/user_following', [ + "jquery", + "store" +], function($, store) { + var API_USER_FOLLOWING_PATH = "/api/user/following" + var USER_FOLLOWING_KEY = "user-following"; + var USER_FOLLOWING_UPDATE_KEY= "date:user-following" + var ONE_DAY_IN_SECONDS = 60*60*24; + + var update = function() { + var currentTime = new Date().getTime(); + var lastTime = store.get(USER_FOLLOWING_UPDATE_KEY); + if (lastTime && (currentTime - lastTime) < ONE_DAY_IN_SECONDS ) { + return; + } + + $.ajax( + API_USER_FOLLOWING_PATH + ).done(function(users){ + var following = $.map(users, function(item){ + return item["username"]; + }); + store.set(USER_FOLLOWING_KEY, following); + store.set(USER_FOLLOWING_UPDATE_KEY, currentTime); + }).fail(function(jqxhr, textStatus, error){ + return; + }); + } + + return { + update: update, + val: function(){ + return store.get(USER_FOLLOWING_KEY) || []; + } + }; + +}); + +/* @source mod/input-ext.js */; + +define('mousetrap', 'lib/mousetrap.js'); + +define("mod/input-ext", + [ + "jquery", + "mod/user_following", + "jquery-caret", + "jquery-atwho", + "mousetrap", + "lib/zen-form" +], + function ($, userFollowing) { + var inputExt = {}; + var emojis = [ + 'airplane', 'alien', 'art', 'bear', 'beer', 'bike', 'bomb', 'book', + 'bulb', 'bus', 'cake', 'calling', 'clap', 'cocktail', 'code', 'computer', + 'cool', 'cop', 'email', 'feet', 'fire', 'fish', 'fist', 'gift', 'hammer', + 'heart', 'iphone', 'key', 'leaves', 'lgtm', 'lipstick', 'lock', 'mag', 'mega', + 'memo', 'moneybag', 'new', 'octocat', 'ok', 'palm_tree', 'pencil', 'punch', + 'runner', 'scissors', 'ship', 'shipit', 'ski', 'smile', 'smoking', 'sparkles', + 'star', 'sunny', 'taxi', 'thumbsdown', 'thumbsup', 'tm', 'tophat', 'train', + 'trollface', 'v', 'vs', 'warning', 'wheelchair', 'zap', 'zzz', 'see_no_evil', + 'hear_no_evil', 'speak_no_evil', 'monkey', 'monkey_face', 'manybeers', 'beers', + 'hhkb', 'ruby' + ], emoji_list = $.map(emojis, function(value, i) {return {key: value + ':', name:value};}); + inputExt.enableEmojiInput = function (el) { + el.atwho('(?:^|\\s):', + {data:emoji_list, limit:7, + tpl:'
  • ${name}
  • '}); + return el; + }; + + inputExt.enableAutoCompleteFollowingAndTeam = function (el) { + var teams = JSON.parse($('#all-teams').val() || '[]'); + var users = teams.concat(userFollowing.val()); + + $(el).atwho("@", { + data: users, + limit: 7 + }); + }; + + // 输入#自动提示pr信息 + inputExt.enablePullsInput = function (el) { + var projectName = el.attr('data-project-name'); + if (!projectName) return el; + $.getJSON('/' + projectName + '/pulls/all_data', function (r) { + var pulls = $.map( + r, function(value, i) { + return {key: value.id, name:value.id + ' ' + value.title, title:value.title}; + }); + el.atwho('(?:^|\\s)#', + {data:pulls, limit:7, + tpl:'
  • #${key} ${title}
  • '}); + }); + return el; + }; + + inputExt.shortcut2submit = function (el) { + Mousetrap.bind( + ['command+enter', 'ctrl+enter'], + function (e) { + if (el && (e.srcElement || e.target) == $(el)[0] && !$(el).closest('form').hasClass('submitting')) { + e.preventDefault ? e.preventDefault() : (e.returnValue = false); + $(el).closest('form').addClass('submitting').submit(); + } + }, + 'keydown' + ); + }; + + // 进入全屏模式 + inputExt.enableZenMode = function (el) { + var trigger = '.go-zen'; + el = $(el); + el.zenForm({trigger:trigger, theme:'light'}).dblclick(function(e) { + if (!e.altKey) return; + $(this).zenForm({ trigger: null, theme: 'light' }); + fix(); + }); + + $(trigger).click(fix); + + function fix() { + var textarea = $('.zen-forms-input-wrap textarea'); + if (textarea) { + inputExt.enableEmojiInput(textarea); + textarea.attr({ + 'data-project-name': el.attr('data-project-name'), + 'placeholder': el.attr('placeholder') + }); + + inputExt.enablePullsInput(textarea); + + var participants = $('#participants').val(); + if (participants) { + participants = JSON.parse(participants); + textarea.atwho("@", {data:participants, limit:7}); + } + + // 因为zen-form设置的z-index非常高(99999)所以将at-view调更高 + $('#at-view').css('z-index', 100000); + } + } + }; + + var focusToEnd = function(els) { + return $(els).each(function() { + var v = $(this).val(); + $(this).focus().val("").val(v); + }); + }; + + inputExt.enableQuickQuotes = function (el) { + Mousetrap.bind( + ['r'], + function (e) { + var oldVal = $(el).val(), newVal, selVal = window.getSelection().toString(); + selVal = '> ' + selVal.split('\n').join('\n> '); + newVal = oldVal.concat((oldVal != '') ? '\n\n':'', selVal, '\n\n'); + $("html, body").animate({scrollTop: $(document).height()}, "slow"); + $(el).val(newVal); + focusToEnd(el); + }, + 'keyup' + ); + }; + + inputExt.enableFileUpload = function (uploader, textarea, is_image) { + uploader.submit( + function() { + $(this).ajaxSubmit({ + dataType: 'json', + type: 'POST', + delegation: true, + success: function(r) { + var oldText = textarea.val(), + newText = oldText + + (oldText.length == 0 ? '' : '\n') + + (is_image? '!' : '') + + '[' + r.origin_filename + '](' + r.url + ')'; + textarea.val(newText); + }, + error: function(r) { + alert("上传错误,请确认您上传的文件类型合法"); + } + }); + return false; + }); + + uploader.find('input').change(function () { + uploader.submit(); + }); + }; + + inputExt.enableImageUpload = function (uploader, textarea) { + inputExt.enableFileUpload(uploader,textarea, true); + }; + + inputExt.enableUpload = function(upload_widget,textarea){ + inputExt.enableImageUpload(upload_widget.find(".upload-image-form"),textarea); + inputExt.enableFileUpload(upload_widget.find(".upload-file-form"),textarea); + }; + + return inputExt; + } +); + +/* @source mod/diff.js */; + +define('mod/diff', [ + "jquery", + "mod/input-ext", + "mod/liveupdate", + "mod/colorcube" +], function ($, inputExt, live, colorcube) { + + //////////////////// linecomment + + // comment form + var hideCommentForm = function () { + $('.inline-comment-form').hide().closest('tr').removeClass('show-inline-comment-form'); + $('.inline-comment-form').each( + function (idx, el) { + if (!$(el).siblings('.comment-holder').children('.comment').length) { + $(el).parents('tr').hide(); + } + } + ); + }; + var openCommentForm = function (curRow) { + hideCommentForm(); + var nextRow = curRow.next('tr'); + // if no comments on curRow yet + if (!nextRow.length || !nextRow.hasClass('inline-comments')) { + nextRow = $.tmpl($('#templ-inline-comments-row'), {}).insertAfter(curRow); + } + // if side by side... plz refactor this + var file = curRow.parents('.file'); + if ((file.children('.side')).length != 0 && file.children('.side').css('display') != 'none') { + $(nextRow.children()[0]).attr('colspan', 1); + } + nextRow.show().addClass('show-inline-comment-form'); + var commentsBlock = nextRow.children('.line-comments'), + commentForm = commentsBlock.find('.inline-comment-form'); + // if no commentForm on nextRow yet + if (!commentForm.length) { + // get form-data + var patch_data = file.children('.meta').find('.patch-data'); + var line_data = curRow.find('.line-data'); + var data = { + from_sha: patch_data.attr('data-from-sha'), + old_path: patch_data.attr('data-old-path'), + new_path: patch_data.attr('data-new-path'), + from_oid: patch_data.attr('data-from-oid'), + to_oid: patch_data.attr('data-to-oid'), + old_no: line_data.attr('data-old'), + new_no: line_data.attr('data-new'), + }; + commentForm = $.tmpl($('#templ-inline-comment-form'), data).appendTo(commentsBlock); + commentForm.find('.js-hide-inline-comment-form').click( + function () { + hideCommentForm(); + } + ).end().find('form').submit( + function () { + $(this).find('button[type="submit"]').attr('disabled', true).addClass('disabled'); + return true; + } + ); + var commentTexarea = commentForm.find('textarea'); + inputExt.enableEmojiInput(commentTexarea); + inputExt.shortcut2submit(commentTexarea); + } + commentForm.show().find('textarea').focus(); + // codelive channel + var linecomment_channel_id; + if ($('.discussion-tab-link').length > 0) { + linecomment_channel_id = "code_pr_"+$('.discussion-tab-link').attr('data-url') + 'linecomment'; + } + // `comment on this line` + commentForm.find('form.js-inline-comment-form').ajaxForm({ + dataType: 'json', + beforeSend: function () { + commentForm.find('button[type="submit"]').attr('disabled', true).addClass('disabled') + .end().find('.loader').show(); + }, + success: function(r) { + if (r.r == 0 && r.html) { + commentForm.siblings('.js-comments-holder').append(r.html); + commentForm.find('textarea').val('').blur(); + hideCommentForm(); + live && linecomment_channel_id && + live.emit('ready', {channel: linecomment_channel_id, msg:r.html_with_diff}); + } else if (r.error){ + alert(r.error); + } + commentForm.find('button[type="submit"]').attr('disabled', false).removeClass('disabled'); + commentForm.find('form.js-inline-comment-form').removeClass('submitting') + .end().find('.loader').hide(); + return true; + }, + error: function () {} + }); + }; + + // add-bubble... + $('body').delegate('.add-bubble', 'click', function () { + var curRow = $(this).parents('tr'); + var nextRow = curRow.next('tr'); + if (nextRow.hasClass('inline-comments') && nextRow.css('display') != 'none') { + nextRow.hide(); + } else { + openCommentForm(curRow); + } + }); + + // `add a line note` + $('body').delegate( + '.js-show-inline-comment-form', 'click', function () { + var curRow = $(this).parents('tr').prev('tr'); + openCommentForm(curRow); + }); + + // linecomment delete + $('body').delegate('.inline-comments .delete-button', 'click', function (e) { + if (!confirm('Are you sure you want to delete this?')) { + return false; + } + var comment = $(this).parents('.comment'); + $.getJSON( + $(this).attr('href'), + function(r) { + // FIXME: global row? + if (r.r == '1') + var row = comment.parents('tr'); + if (comment.siblings('.comment').length || + row.find('.inline-comment-form').length) { + comment.remove(); + } else { + row.remove(); + } + } + ); + return false; + }); + + // comment & linecomment edit + $('body').delegate('.js-comment-edit-button', 'click', function (e) { + var form_content = $(this).parents('.comment-header') + .next('.comment-content') + .children('.form-content'); + if (form_content != undefined) { + form_content.show().find('textarea').focus(); + form_content.find('form.js-comment-update').ajaxForm({ + dataType: 'json', + beforeSend: function() { + form_content.find('button[type="submit"]').attr('disabled', true).addClass('disabled') + .end().find('.loader').show(); + }, + success: function(r) { + if (r.r == 0 && r.html) { + if (form_content.find('textarea').attr('name') === 'pull_request_review_comment'){ + form_content.parents('.js-comments-holder').append(r.html); + form_content.parents('.comment').remove(); + } else { + var comment = form_content.parents('.change'); + var avatar = comment.prev('.side-avatar'); + form_content.parents('#changelog').append(r.html); + comment.remove(); + avatar.remove(); + } + } + return true; + } + }); + } else { + return false; + } + }); + + // show linecomments toggle + $('body').delegate('.file .js-show-inline-comments-toggle', 'change', function () { + var comments = $(this).parents('.file').find('.inline-comments'); + if ($(this).is(':checked')) { + comments.show(); + } else { + comments.hide(); + } + }); + + // generated file toggle + $('body').delegate('.file a.generated', 'click', function() { + var file = $(this).parents('.file'); + var inline = file.children('.inline').show(); + $(this).hide(); + }); + + // patch side diff toggle + $('body').delegate('.file .js-side-diff', 'click', function () { + var file = $(this).parents('.file'); + file.find('a.generated').hide(); + if (file.children('.side').css('display') === 'none' && + file.children('.inline').css('display') === 'none'){ + file.children('.inline').show(); + }else { + var inline = file.children('.inline').toggle(); + var side = file.children('.side').toggle(); + var checkbox = file.find('.js-show-inline-comments-toggle'); + if (file.children('.side').css('display') != 'none') { + checkbox.attr('checked', false); + side.find('.inline-comments').hide(); + } + else { + checkbox.attr('checked', true); + } + } + }); + + // diff patch fullscreen toggle + $('body').delegate('.file .js-fullscreen', 'click', function () { + var fullscreenStage = $('#fullscreen-stage'); + if (fullscreenStage.length == 0) { + var files = $(this).parents('#files'); + fullscreenStage = $('
    ').appendTo(files); + } + if (fullscreenStage.is(":visible")) { + fullscreenStage.hide(); + $('body').removeClass('fullscreen-mode'); + } else { + var file = $(this).parents('.file'); + fullscreenStage.html(file.clone()).show(); + $('body').addClass('fullscreen-mode'); + fullscreenStage.find('.file .js-fullscreen').text('Exit Full Screen'); + } + }); + + // dblclick open linecomment form + var clearSelection = function () { + if (window.getSelection) { + if (window.getSelection().empty) { // Chrome + window.getSelection().empty(); + } else if (window.getSelection().removeAllRanges) { // Firefox + window.getSelection().removeAllRanges(); + } + } else if (document.selection) { // IE? + document.selection.empty(); + } + } + $('body').delegate('.js-open-comment-form.dblclick-comment', 'dblclick', function () { + clearSelection(); + var curRow = $(this).parents('tr'); + openCommentForm(curRow); + }); + + //////////////////// moreline get_contexts + + // moreline + $('body').delegate('pre.skipped a', 'click', function() { + var curRow = $(this).parents('tr'); + var patch_data = curRow.parents('.file').children('.meta').find('.patch-data'); + var data = curRow.find('.expand-data'); + var url = patch_data.attr('data-context-url'); + $.get( + url, + { + old_sha : patch_data.attr('data-old-sha'), + old_path : patch_data.attr('data-old-path'), + old_start : data.attr('data-old-start'), + new_start : data.attr('data-new-start'), + old_end : data.attr('data-old-end'), + new_end : data.attr('data-new-end'), + type : $(this).attr('data-type'), + }, + function (r) { + curRow.after(r.html); + if (r.html.trim()) { + curRow.remove(); + } + } + ); + }); + + // full diff + $('body').delegate('.ellipsis', 'click', function() { + var $this = $(this); + var fpath = $this.attr('data-path'); + var new_fpath = $this.attr('data-new-path'); + + // for pull/new + var from_proj = $('.new-pull-request form input[name="from_proj"]').attr('value'); + var from_ref = $('.new-pull-request form input[name="from_ref"]').attr('value'); + var to_ref = $('.new-pull-request form input[name="to_ref"]').attr('value'); + var to_proj = $('.new-pull-request form input[name="to_proj"]').attr('value'); + + var url = $this.attr('data-url'); + var table = $this.parents('.data').find('.diff-table'); + $.get(url, + { + filepath: fpath, + new_filepath: new_fpath, + from_proj: from_proj, + from_ref: from_ref, + to_ref: to_ref, + to_proj: to_proj + }, + function(r){ + table.find('tbody').html(r.html); + }); + }); + + // TODO: modify this, after refactor diff api + // toggle whitespace diff + $('body').delegate('.toggle_whitespace', 'click', function() { + var $this = $(this); + var fpath = $this.attr('data-path'); + var new_fpath = $this.attr('data-new-path'); + + // for pull/new + var from_proj = $('.new-pull-request form input[name="from_proj"]').attr('value'); + var from_ref = $('.new-pull-request form input[name="from_ref"]').attr('value'); + var to_ref = $('.new-pull-request form input[name="to_ref"]').attr('value'); + var to_proj = $('.new-pull-request form input[name="to_proj"]').attr('value'); + + var url = $this.attr('data-url'); + var table = $this.parents('.data').find('.diff-table'); + var whitespace = $this.attr('data-w'); + + $.get(url, + { + filepath: fpath, + new_filepath: new_fpath, + from_proj: from_proj, + from_ref: from_ref, + to_ref: to_ref, + to_proj: to_proj, + w: whitespace + }, + function(r){ + table.find('tbody').html(r.html); + $this.attr('data-w', (1 - parseInt(whitespace)).toString()); + }); + }); + + //////////////////// no use ?? + function convertDiff(name, table, pre) { + var inline = $(table).hasClass('inline'); + var ths = table.tHead.rows[0].cells; + var afile, bfile; + if ( inline ) { + afile = ths[0].title; + bfile = ths[1].title; + } else { + afile = $(ths[0]).find('a').text(); + bfile = $(ths[1]).find('a').text(); + } + if ( afile.match(/^Revision /) ) { + afile = 'a/' + name; + bfile = 'b/' + name; + } + var lines = [ + "Index: " + name, + "===================================================================", + "--- " + afile.replace(/File /, ''), + "+++ " + bfile.replace(/File /, ''), + ]; + var sepIndex = 0; + var oldOffset = 0, oldLength = 0, newOffset = 0, newLength = 0; + var title = ""; + if (inline) + title = $(ths[2]).text(); + for (var i = 0; i < table.tBodies.length; i++) { + var tBody = table.tBodies[i]; + if (i == 0 || tBody.className == "skipped") { + if (i > 0) { + if (!oldOffset && oldLength) oldOffset = 1 + if (!newOffset && newLength) newOffset = 1 + lines[sepIndex] = lines[sepIndex] + .replace("{1}", oldOffset).replace("{2}", oldLength) + .replace("{3}", newOffset).replace("{4}", newLength) + .replace("{5}", title); + } + sepIndex = lines.length; + lines.push("@@ -{1},{2} +{3},{4} @@{5}"); + oldOffset = 0, oldLength = 0, newOffset = 0, newLength = 0; + if (tBody.className == "skipped") { + if (inline) + title = $(tBody.rows[0].cells[2]).text(); + continue; + } + } + var tmpLines = []; + for (var j = 0; j < tBody.rows.length; j++) { + var cells = tBody.rows[j].cells; + var oldLineNo = parseInt($(cells[0]).text()); + var newLineNo = parseInt($(cells[inline ? 1 : 2]).text()); + if (tBody.className == 'unmod') { + lines.push(" " + $(cells[inline ? 2 : 1]).text()); + oldLength += 1; + newLength += 1; + if (!oldOffset) oldOffset = oldLineNo; + if (!newOffset) newOffset = newLineNo; + } else { + var oldLine; + var newLine; + var oldTag = "-"; + var newTag = "+"; + if (inline) { + oldLine = newLine = $(cells[2]).text(); + if ($('em', cells[2]).length) oldTag = newTag = "\\"; + } else { + oldLine = $(cells[1]).text(); + if ($('em', cells[1]).length) oldTag = "\\"; + newLine = $(cells[3]).text(); + if ($('em', cells[3]).length) newTag = "\\"; + } + if (!isNaN(oldLineNo)) { + lines.push(oldTag + oldLine); + oldLength += 1; + } + if (!isNaN(newLineNo)) { + tmpLines.push(newTag + newLine); + newLength += 1; + } + } + } + if (tmpLines.length > 0) { + lines = lines.concat(tmpLines); + } + } + if (!oldOffset && oldLength) oldOffset = 1; + if (!newOffset && newLength) newOffset = 1; + lines[sepIndex] = lines[sepIndex] + .replace("{1}", oldOffset).replace("{2}", oldLength) + .replace("{3}", newOffset).replace("{4}", newLength) + .replace("{5}", title); + /* remove trailing   and join lines (with CR for IExplorer) */ + var sep = $.browser.msie ? "\r" : "\n"; + for ( var i = 0; i < lines.length; i++ ) + if ( lines[i] ) + { + var line = lines[i].replace(/\xa0$/, '') + sep; + if ( lines[i][0] == '+' ) + pre.append($('').text(line)); + else if ( lines[i][0] == '-' ) + pre.append($('').text(line)); + else + pre.append($('').text(line)); + } + } + // no use ?? + $("div.diff h2").each(function() { + console.log('call div.diff h2 !!!'); + var switcher = $("").prependTo(this); + var name = $.trim($(this).text()); + var table = $(this).siblings("table").get(0); + if (! table) return; + var pre = $('
    ').hide().insertAfter(table);
    +          $("" + _("Tabular") + "").click(function() {
    +            $(pre).hide();
    +            $(table).show();
    +            $(this).addClass("active").siblings("span").removeClass("active");
    +            return false;
    +          }).addClass("active").appendTo(switcher);
    +          $("" + _("Unified") + "").click(function() {
    +            $(table).hide();
    +            if (!pre.get(0).firstChild) convertDiff(name, table, pre);
    +            $(pre).fadeIn("fast")
    +            $(this).addClass("active").siblings("span").removeClass("active");
    +            return false;
    +          }).appendTo(switcher);
    +        });
    +
    +
    +        colorcube.init({target:'body'});
    +});
    +
    +/* @source mod/watch.js */;
    +
    +define('mod/watch', [
    +  "jquery"
    +], function($){
    +
    +  $(function() {
    +    var watch_btn = $("#watch-btn");
    +    var countLabel = $('#watched-count');
    +    var proj_id = watch_btn.attr("proj_id");
    +
    +    var updateLabelBy = function (n) {
    +        var count = Number(countLabel.text()) || 0;
    +        if (count === 0 && n <= 0) { return; }
    +
    +        count += n;
    +        countLabel.text(count.toString());
    +    };
    +
    +    watch_btn.click(function() {
    +
    +      if(watch_btn.hasClass('watch')) {
    +        $.post("/watch/"+proj_id, function(data) {
    +          if (!data.error) {
    +            watch_btn.text('Unwatch');
    +            watch_btn.addClass('unwatch');
    +            watch_btn.removeClass('watch');
    +            updateLabelBy(1);
    +          } else {
    +            // show error notification to user
    +            show_error("关注失败");
    +          }
    +        });
    +      }
    +      else{
    +        $.ajax("/watch/"+proj_id, {
    +          type: "DELETE",
    +          success: function(data) {
    +            if (!data.error) {
    +              watch_btn.text('Watch');
    +              watch_btn.addClass('watch');
    +              watch_btn.removeClass('unwatch');
    +              updateLabelBy(-1);
    +            } else {
    +              show_error("取消关注失败");
    +            }
    +          },
    +          error: function(e) {
    +            show_error("取消关注失败");
    +          }
    +        });
    +      }
    +    });
    +
    +    function show_success(msg) {
    +        var successDiv = $(".navbar .success");
    +        if (successDiv.size() === 0 ) {
    +            successDiv= $("
    ").addClass("success").addClass("alert-success"); + $("div.navbar").append(successDiv); + } + successDiv.html(msg); + successDiv.fadeOut(1500, function () { + $(this).remove(); + }); + } + + function show_error(msg) { + var errorDiv = $(".navbar .error"); + if (errorDiv.size() === 0 ) { + errorDiv = $("
    ").addClass("error").addClass("alert-error"); + $("div.navbar").append(errorDiv); + } + errorDiv.html(msg); + } + + }); +}); + +/* @source lib/jquery.caret.js */; + + +/* + Implement Twitter/Weibo @ mentions + + Copyright (c) 2012 chord.luo@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +/* +本插件操作 textarea 或者 input 内的插入符 +只实现了获得插入符在文本框中的位置,以及设置 +插入符的位置. +*/ + +(function() { + + (function($) { + var getCaretPos, setCaretPos; + getCaretPos = function(inputor) { + var end, endRange, len, normalizedValue, pos, range, start, textInputRange; + if (document.selection) { + /* + #assume we select "HATE" in the inputor such as textarea -> { }. + * start end-point. + * / + * < I really [HATE] IE > between the brackets is the selection range. + * \ + * end end-point. + */ + range = document.selection.createRange(); + pos = 0; + if (range && range.parentElement() === inputor) { + normalizedValue = inputor.value.replace(/\r\n/g, "\n"); + /* SOMETIME !!! + "/r/n" is counted as two char. + one line is two, two will be four. balalala. + so we have to using the normalized one's length.; + */ + len = normalizedValue.length; + /* + <[ I really HATE IE ]>: + the whole content in the inputor will be the textInputRange. + */ + textInputRange = inputor.createTextRange(); + /* _here must be the position of bookmark. + / + <[ I really [HATE] IE ]> + [---------->[ ] : this is what moveToBookmark do. + < I really [[HATE] IE ]> : here is result. + \ two brackets in should be in line. + */ + textInputRange.moveToBookmark(range.getBookmark()); + endRange = inputor.createTextRange(); + /* [--------------------->[] : if set false all end-point goto end. + < I really [[HATE] IE []]> + */ + endRange.collapse(false); + /* + ___VS____ + / \ + < I really [[HATE] IE []]> + \_endRange end-point. + + " > -1" mean the start end-point will be the same or right to the end end-point + * simplelly, all in the end. + */ + if (textInputRange.compareEndPoints("StartToEnd", endRange) > -1) { + start = end = len; + } else { + /* + I really |HATE] IE ]> + <-| + I really[ [HATE] IE ]> + <-[ + I reall[y [HATE] IE ]> + + will return how many unit have moved. + */ + start = -textInputRange.moveStart("character", -len); + end = -textInputRange.moveEnd("character", -len); + } + } + } else { + start = inputor.selectionStart; + } + return start; + }; + setCaretPos = function(inputor, pos) { + var range; + if (document.selection) { + range = inputor.createTextRange(); + range.move("character", pos); + return range.select(); + } else { + return inputor.setSelectionRange(pos, pos); + } + }; + return $.fn.caretPos = function(pos) { + var inputor; + inputor = this[0]; + inputor.focus(); + if (pos) { + return setCaretPos(inputor, pos); + } else { + return getCaretPos(inputor); + } + }; + })(window.jQuery); + +}).call(this); + +/* autogeneration */ +define("lib/jquery.caret", [], function(){}); + +/* @source mod/quick_emoji.js */; + +define("mod/quick_emoji", [ + "jquery", + "lib/jquery.caret", + "bootstrap" +], + function($) { + var quick_emoji = {}; + quick_emoji.enable = function(textarea_query){ + $('body').delegate('.quick-emoji a', 'click', function(e){ + var emoji = $(this).attr('data-emoji'); + if(emoji){ + textarea = $(textarea_query); + var caretpos = textarea.caretPos(); + var content = textarea.val(); + var result = ""; + if(content) { + result = content.slice(0, caretpos) + ' ' + + emoji + ' ' + content.slice(caretpos); + textarea.val(result); + textarea.caretPos(caretpos + emoji.length + 2); + } + else { + result = emoji; + textarea.val(result); + textarea.caretPos(result.length); + } + } + return false; + }); + + $('body').delegate('.emojis a', 'hover', function(e){ + var $zoomDiv = $('.zoom'); + if (e.type == "mouseenter") { + var $emojiUrl = $(this).find('img').attr('src'); + var $zoomImage = $('.zoom-image'); + var $tabContent = $('.tab-content'); + $zoomImage.attr('src', $emojiUrl); + $zoomDiv.css({'display': 'block'}); + } else { + $zoomDiv.css({'display': 'none'}); + } + }); + } + return quick_emoji; + }); + +/* @source lib/pixastic.custom.js */; + +/* + * Pixastic - JavaScript Image Processing Library + * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ + * MIT License [http://www.pixastic.com/lib/license.txt] + */ + + +var Pixastic=(function(){function addEvent(el,event,handler){if(el.addEventListener) +el.addEventListener(event,handler,false);else if(el.attachEvent) +el.attachEvent("on"+event,handler);} +function onready(handler){var handlerDone=false;var execHandler=function(){if(!handlerDone){handlerDone=true;handler();}} +document.write("<"+"script defer src=\"//:\" id=\"__onload_ie_pixastic__\">");var script=document.getElementById("__onload_ie_pixastic__");script.onreadystatechange=function(){if(script.readyState=="complete"){script.parentNode.removeChild(script);execHandler();}} +if(document.addEventListener) +document.addEventListener("DOMContentLoaded",execHandler,false);addEvent(window,"load",execHandler);} +function init(){var imgEls=getElementsByClass("pixastic",null,"img");var canvasEls=getElementsByClass("pixastic",null,"canvas");var elements=imgEls.concat(canvasEls);for(var i=0;i-1){var tmp=actionName;actionName=tmp.substr(0,tmp.indexOf("("));var arg=tmp.match(/\((.*?)\)/);if(arg[1]){arg=arg[1].split(";");for(var a=0;adata2[pix]) +data2[pix]=r1;if((g1=data[pix1=pix+1])>data2[pix1]) +data2[pix1]=g1;if((b1=data[pix2=pix+2])>data2[pix2]) +data2[pix2]=b1;} +dataChanged=true;break;case"darken":while(p--){if((r1=data[pix-=4])(data2[pix]*0.3+data2[pix1]*0.59+data2[pix2]*0.11)){data2[pix]=r1;data2[pix1]=g1;data2[pix2]=b1;}} +dataChanged=true;break;case"lineardodge":while(p--){if((r3=data[pix-=4]+data2[pix])>255) +data2[pix]=255;else +data2[pix]=r3;if((g3=data[pix1=pix+1]+data2[pix1])>255) +data2[pix1]=255;else +data2[pix1]=g3;if((b3=data[pix2=pix+2]+data2[pix2])>255) +data2[pix2]=255;else +data2[pix2]=b3;} +dataChanged=true;break;case"linearburn":while(p--){if((r3=data[pix-=4]+data2[pix])<255) +data2[pix]=0;else +data2[pix]=(r3-255);if((g3=data[pix1=pix+1]+data2[pix1])<255) +data2[pix1]=0;else +data2[pix1]=(g3-255);if((b3=data[pix2=pix+2]+data2[pix2])<255) +data2[pix2]=0;else +data2[pix2]=(b3-255);} +dataChanged=true;break;case"difference":while(p--){if((r3=data[pix-=4]-data2[pix])<0) +data2[pix]=-r3;else +data2[pix]=r3;if((g3=data[pix1=pix+1]-data2[pix1])<0) +data2[pix1]=-g3;else +data2[pix1]=g3;if((b3=data[pix2=pix+2]-data2[pix2])<0) +data2[pix2]=-b3;else +data2[pix2]=b3;} +dataChanged=true;break;case"screen":while(p--){data2[pix-=4]=(255-(((255-data2[pix])*(255-data[pix]))>>8));data2[pix1=pix+1]=(255-(((255-data2[pix1])*(255-data[pix1]))>>8));data2[pix2=pix+2]=(255-(((255-data2[pix2])*(255-data[pix2]))>>8));} +dataChanged=true;break;case"exclusion":var div_2_255=2/255;while(p--){data2[pix-=4]=(r1=data[pix])-(r1*div_2_255-1)*data2[pix];data2[pix1=pix+1]=(g1=data[pix1])-(g1*div_2_255-1)*data2[pix1];data2[pix2=pix+2]=(b1=data[pix2])-(b1*div_2_255-1)*data2[pix2];} +dataChanged=true;break;case"overlay":var div_2_255=2/255;while(p--){if((r1=data[pix-=4])<128) +data2[pix]=data2[pix]*r1*div_2_255;else +data2[pix]=255-(255-data2[pix])*(255-r1)*div_2_255;if((g1=data[pix1=pix+1])<128) +data2[pix1]=data2[pix1]*g1*div_2_255;else +data2[pix1]=255-(255-data2[pix1])*(255-g1)*div_2_255;if((b1=data[pix2=pix+2])<128) +data2[pix2]=data2[pix2]*b1*div_2_255;else +data2[pix2]=255-(255-data2[pix2])*(255-b1)*div_2_255;} +dataChanged=true;break;case"softlight":var div_2_255=2/255;while(p--){if((r1=data[pix-=4])<128) +data2[pix]=((data2[pix]>>1)+64)*r1*div_2_255;else +data2[pix]=255-(191-(data2[pix]>>1))*(255-r1)*div_2_255;if((g1=data[pix1=pix+1])<128) +data2[pix1]=((data2[pix1]>>1)+64)*g1*div_2_255;else +data2[pix1]=255-(191-(data2[pix1]>>1))*(255-g1)*div_2_255;if((b1=data[pix2=pix+2])<128) +data2[pix2]=((data2[pix2]>>1)+64)*b1*div_2_255;else +data2[pix2]=255-(191-(data2[pix2]>>1))*(255-b1)*div_2_255;} +dataChanged=true;break;case"hardlight":var div_2_255=2/255;while(p--){if((r2=data2[pix-=4])<128) +data2[pix]=data[pix]*r2*div_2_255;else +data2[pix]=255-(255-data[pix])*(255-r2)*div_2_255;if((g2=data2[pix1=pix+1])<128) +data2[pix1]=data[pix1]*g2*div_2_255;else +data2[pix1]=255-(255-data[pix1])*(255-g2)*div_2_255;if((b2=data2[pix2=pix+2])<128) +data2[pix2]=data[pix2]*b2*div_2_255;else +data2[pix2]=255-(255-data[pix2])*(255-b2)*div_2_255;} +dataChanged=true;break;case"colordodge":while(p--){if((r3=(data[pix-=4]<<8)/(255-(r2=data2[pix])))>255||r2==255) +data2[pix]=255;else +data2[pix]=r3;if((g3=(data[pix1=pix+1]<<8)/(255-(g2=data2[pix1])))>255||g2==255) +data2[pix1]=255;else +data2[pix1]=g3;if((b3=(data[pix2=pix+2]<<8)/(255-(b2=data2[pix2])))>255||b2==255) +data2[pix2]=255;else +data2[pix2]=b3;} +dataChanged=true;break;case"colorburn":while(p--){if((r3=255-((255-data[pix-=4])<<8)/data2[pix])<0||data2[pix]==0) +data2[pix]=0;else +data2[pix]=r3;if((g3=255-((255-data[pix1=pix+1])<<8)/data2[pix1])<0||data2[pix1]==0) +data2[pix1]=0;else +data2[pix1]=g3;if((b3=255-((255-data[pix2=pix+2])<<8)/data2[pix2])<0||data2[pix2]==0) +data2[pix2]=0;else +data2[pix2]=b3;} +dataChanged=true;break;case"linearlight":while(p--){if(((r3=2*(r2=data2[pix-=4])+data[pix]-256)<0)||(r2<128&&r3<0)){data2[pix]=0}else{if(r3>255) +data2[pix]=255;else +data2[pix]=r3;} +if(((g3=2*(g2=data2[pix1=pix+1])+data[pix1]-256)<0)||(g2<128&&g3<0)){data2[pix1]=0}else{if(g3>255) +data2[pix1]=255;else +data2[pix1]=g3;} +if(((b3=2*(b2=data2[pix2=pix+2])+data[pix2]-256)<0)||(b2<128&&b3<0)){data2[pix2]=0}else{if(b3>255) +data2[pix2]=255;else +data2[pix2]=b3;}} +dataChanged=true;break;case"vividlight":while(p--){if((r2=data2[pix-=4])<128){if(r2){if((r3=255-((255-data[pix])<<8)/(2*r2))<0) +data2[pix]=0;else +data2[pix]=r3}else{data2[pix]=0;}}else if((r3=(r4=2*r2-256))<255){if((r3=(data[pix]<<8)/(255-r4))>255) +data2[pix]=255;else +data2[pix]=r3;}else{if(r3<0) +data2[pix]=0;else +data2[pix]=r3} +if((g2=data2[pix1=pix+1])<128){if(g2){if((g3=255-((255-data[pix1])<<8)/(2*g2))<0) +data2[pix1]=0;else +data2[pix1]=g3;}else{data2[pix1]=0;}}else if((g3=(g4=2*g2-256))<255){if((g3=(data[pix1]<<8)/(255-g4))>255) +data2[pix1]=255;else +data2[pix1]=g3;}else{if(g3<0) +data2[pix1]=0;else +data2[pix1]=g3;} +if((b2=data2[pix2=pix+2])<128){if(b2){if((b3=255-((255-data[pix2])<<8)/(2*b2))<0) +data2[pix2]=0;else +data2[pix2]=b3;}else{data2[pix2]=0;}}else if((b3=(b4=2*b2-256))<255){if((b3=(data[pix2]<<8)/(255-b4))>255) +data2[pix2]=255;else +data2[pix2]=b3;}else{if(b3<0) +data2[pix2]=0;else +data2[pix2]=b3;}} +dataChanged=true;break;case"pinlight":while(p--){if((r2=data2[pix-=4])<128) +if((r1=data[pix])<(r4=2*r2)) +data2[pix]=r1;else +data2[pix]=r4;else +if((r1=data[pix])>(r4=2*r2-256)) +data2[pix]=r1;else +data2[pix]=r4;if((g2=data2[pix1=pix+1])<128) +if((g1=data[pix1])<(g4=2*g2)) +data2[pix1]=g1;else +data2[pix1]=g4;else +if((g1=data[pix1])>(g4=2*g2-256)) +data2[pix1]=g1;else +data2[pix1]=g4;if((r2=data2[pix2=pix+2])<128) +if((r1=data[pix2])<(r4=2*r2)) +data2[pix2]=r1;else +data2[pix2]=r4;else +if((r1=data[pix2])>(r4=2*r2-256)) +data2[pix2]=r1;else +data2[pix2]=r4;} +dataChanged=true;break;case"hardmix":while(p--){if((r2=data2[pix-=4])<128) +if(255-((255-data[pix])<<8)/(2*r2)<128||r2==0) +data2[pix]=0;else +data2[pix]=255;else if((r4=2*r2-256)<255&&(data[pix]<<8)/(255-r4)<128) +data2[pix]=0;else +data2[pix]=255;if((g2=data2[pix1=pix+1])<128) +if(255-((255-data[pix1])<<8)/(2*g2)<128||g2==0) +data2[pix1]=0;else +data2[pix1]=255;else if((g4=2*g2-256)<255&&(data[pix1]<<8)/(255-g4)<128) +data2[pix1]=0;else +data2[pix1]=255;if((b2=data2[pix2=pix+2])<128) +if(255-((255-data[pix2])<<8)/(2*b2)<128||b2==0) +data2[pix2]=0;else +data2[pix2]=255;else if((b4=2*b2-256)<255&&(data[pix2]<<8)/(255-b4)<128) +data2[pix2]=0;else +data2[pix2]=255;} +dataChanged=true;break;} +if(dataChanged) +otherCtx.putImageData(dataDesc2,0,0);if(amount!=1&&!Pixastic.Client.hasGlobalAlpha()){var p=w*h;var amount2=amount;var amount1=1-amount;while(p--){var pix=p*4;var r=(data[pix]*amount1+data2[pix]*amount2)>>0;var g=(data[pix+1]*amount1+data2[pix+1]*amount2)>>0;var b=(data[pix+2]*amount1+data2[pix+2]*amount2)>>0;data[pix]=r;data[pix+1]=g;data[pix+2]=b;} +params.useData=true;}else{var ctx=params.canvas.getContext("2d");ctx.save();ctx.globalAlpha=amount;ctx.drawImage(otherCanvas,0,0,rect.width,rect.height,rect.left,rect.top,rect.width,rect.height);ctx.globalAlpha=1;ctx.restore();} +return true;}},checkSupport:function(){return Pixastic.Client.hasCanvasImageData();}} +/* autogeneration */ +define("lib/pixastic.custom", [], function(){}); + +/* @source */; + +define('mousetrap', 'lib/mousetrap.js'); + +require([ + 'jquery', + 'jquery-caret', + 'jquery-atwho', + 'jquery-forms', + 'bootstrap', + 'lib/pixastic.custom', + 'mod/liveupdate', + 'mod/input-ext', + 'mod/quick_emoji', + 'mod/user_following', + 'mod/watch', + //'mod/commit', // delegate of .js-comment-edit-button // plz refac... + 'mod/diff', // diff js + 'mod/user_profile_card', + 'mod/tasklist', + 'mod/mute', + 'mousetrap', + 'mod/pull_key', + ], + function ($, _, _, _, _, _, live, inputExt, quick_emoji, userFollowing) { + $(function () { + var channel_id = "code_pr_"+$('.discussion-tab-link').attr('data-url'); + var linecomment_channel_id = channel_id + 'linecomment'; + live.emit('ready', {channel: channel_id, msg: ''}); + $('textarea#new_comment_content').live( + 'keypress', + (function (e) { + var username = $('textarea#new_comment_content').data('current-user'); + live.emit('ready', {channel: channel_id, type: 'typing', username: username}); + }) + ); + + // pull-nav + var getAnchor = function (url) { + var index = url.indexOf('#'); + if (index != -1) { + return url.substring(index + 1); + } + return ''; + }; + var loadTabContent = function (tab, isFirstLoad) { + var container = $('#' + $(tab).attr('data-tab-container')), + url = $(tab).attr('data-j-url'); + + if (container && container.children().length == 0) { + $('.loader').show(); + container.load(url, {}, function () { + $('.loader').hide(); + if (container.is('#discussion-pane') || container.is('#files-pane') || container.is("#commits-pane")) { + loadMergeGuide(container, function(st){ + window.initState = st; + }); + + loadCommentInputExt(); + + $('#watch-ci').on('click', function(){ + if ($(this).attr('checked')) { + CINotification.init(); + window.ciWatcher = window.setInterval(function(){ + loadMergeGuide(container, function(st){ + var msg, prName = $('h2').text(); + if (st !== window.initState) { + if (st === 'clean') { + msg = 'PR "'+ prName +'" can merge now'; + clearTimeout(window.ciWatcher); + } else if (st === 'error') { + msg = 'PR "'+ prName +'" occurred an error'; + window.initState = 'error'; + } else if (st === 'dirty') { + msg = 'PR "'+ prName +'" got a qaci'; + window.initState = 'dirty'; + } else { + msg = 'Something wrong... ping xutao!' + } + CINotification.create('Code need your Attention!', msg); + } + }); + }, 5000); + } else { + clearTimeout(window.ciWatcher); + } + }); + + } + if (isFirstLoad) { + var anchor = getAnchor(location.href); + if (anchor !== '') { + var anchorEl = $(document.getElementById(anchor)); + if (anchorEl.length > 0) { + $('html, body').animate({scrollTop:anchorEl.offset().top}, 500); + } + } + } + }); + } + }; + + /* notification */ + var CINotification = { + init: function () { + var webkitNotify = window.webkitNotifications, + notify = window.Notification; + + if (webkitNotify) { + var st = webkitNotify.checkPermission(); + if (st === 1) { + webkitNotify.requestPermission(); + } else if (st === 2) { + alert('你拒绝了通知授权,请在通知设置里打开。') + } + } else if (notify && notify.permission !== "granted") { + notify.requestPermission(function (status) { + if (notify.permission !== status) { + notify.permission = status; + } + }); + } + }, + + create: function(title,msg) { + var webkitNotify = window.webkitNotifications, + notify = window.Notification, + icon = '/static/img/code_lover.png'; + + if (webkitNotify) { + if (webkitNotify.checkPermission() != 0) { + message.init(); + } else { + var n = webkitNotify.createNotification(icon,title, msg); + n.show(); + /* + n.ondisplay = function() { }; + n.onclose = function() { }; + setTimeout(function(){n.cancle}, 5000); + */ + } + } else if (notify) { + if (notify.permission == "granted") { + var n = new notify(title, { icon: icon, body: msg }); + } else { + message.init(); + } + } + } + } + + $('.pull-nav a[data-toggle="tab"]').on('show', function (e) { + window.history.pushState('', '', $(e.target).attr('data-url')); + loadTabContent($(e.target), false); + }); + loadTabContent($('.pull-nav .active a'), true); + var tabUrls = [], tabs = {}; + $('.pull-nav a[data-toggle="tab"]').each( + function (i, t) { + var url = $(t).attr('data-url'); + tabUrls.push(url); + tabs[url] = $(t); + }); + $(window).bind( + "popstate", function(e) { + var location = e.target.location, + path = location.href.split(location.protocol + '//' + location.host)[1], + anchorIndex = path.indexOf('#'); + if (anchorIndex !== -1) { + path = path.substring(0, anchorIndex); + } + if (path) { + for (var i=0, l=tabUrls.length; i 0){ + var inline = $(this).siblings('div .inline'); + var side = $(this).siblings('div .side'); + if (inline.css('display') === 'none' && side.css('display') === 'none'){ + inline.show(); + side.hide(); + }else{ + inline.hide(); + side.hide(); + } + } + }); + + // merge guide + var loadMergeGuide = function (container, cb) { + if (!container) + return; + var mergeGuide = container.find('#merge-guide'); + if (mergeGuide.length) { + var url = mergeGuide.attr('data-url'); + mergeGuide.load( + url, + function () { + var mergeForm = mergeGuide.find('.merge-form'), + cancelBtn = mergeGuide.find('#merge-pr-cancel-btn'); + mergeGuide.find('#merge-pr-confirm-btn').click(function () { + $(this).closest('.mergeable.clean').hide(); + mergeForm.show(); + }); + cancelBtn.click(function () { + if (!$(this).hasClass('disabled')) { + mergeForm.hide(); + mergeGuide.find('.mergeable.clean').show(); + } + }); + mergeForm.submit(function () { + $(this).find('button[type="submit"]').attr('disabled', true).addClass('disabled'); + cancelBtn.addClass('disabled'); + var username = $('textarea#new_comment_content').data('current-user'); + live.emit('ready', {channel: channel_id, type: 'merge', username: username}); + return true; + }); + + cb(container.find('.merge-branch').data('mst')); + } + ); + } + }; + + $('#discussion-pane').delegate('#add-comment-form #close', 'click', function () { + var commentForm = $('#add-comment-form'); + if (commentForm.find('[name=comment_and_close]').length == 0) { + var input = $('').attr('type', 'hidden').attr('name', 'comment_and_close').val('1'); + commentForm.append(input); + } + }); + + $('#discussion-pane').delegate('#add-comment-form #reopen', 'click', function () { + var commentForm = $('#add-comment-form'); + if (commentForm.find('[name=comment_and_reopen]').length == 0) { + var input = $('').attr('type', 'hidden').attr('name', 'comment_and_reopen').val('1'); + commentForm.append(input); + } + }); + + $('#discussion-pane').delegate('.outdated_mark', 'click', function () { + $(this).toggle(); + $(this).next().toggle(); + }); + + // delete pr comment + $('#discussion-pane').delegate('.change-header .delete-pr-note-button', 'click', function (e) { + if (!confirm('Are you sure you want to delete this?')) { + return false; + } + var comment = $(this).parents('.change'); + var avatar = comment.prev('.side-avatar'); + $.getJSON( + $(this).attr('href'), + function(r) { + if (r.r == '1'){ + comment.remove(); + avatar.remove(); + } + } + ); + return false; + }); + + $('#add-comment-form').ajaxForm({ + dataType: 'json', + delegation: true, + beforeSend: function () { + var commentForm = $('#add-comment-form'); + commentForm.find('button[type="submit"]').attr('disabled', true).addClass('disabled') + .end().find('.loader').show(); + }, + success: function(r) { + var commentForm = $('#add-comment-form'); + if (r.r == 0) { + if (r.reload && r.redirect_to) { + window.location.href = r.redirect_to; + return true; + } else if (r.html) { + commentForm.find('textarea').val(''); + $('#changelog').append(r.html); + live.emit('ready', {channel: channel_id, msg:r.html}); + } + } else if(r.error){ + alert(r.error); + } + commentForm.removeClass('submitting').find('button[type="submit"]').attr('disabled', false) + .removeClass('disabled').end().find('.loader').hide(); + return true; + } + }); + + $('.tabnav-tabs a').live('click', function () { + $(this).closest('.tabnav-tabs').find('a').removeClass('selected'); + $(this).addClass('selected'); + }); + + $('.write-tab').live('click', function () { + var form = $(this).closest('.previewable-comment-form'); + $(this).closest('.previewable-comment-form').removeClass('preview-selected').addClass('write-selected'); + form.find('#write_bucket').addClass('active').end().find('#preview_bucket').removeClass('active'); + }); + $('.preview-tab').live('click', function () { + var form = $(this).closest('.previewable-comment-form'); + form.removeClass('write-selected').addClass('preview-selected'); + form.find('#write_bucket').removeClass('active').end().find('#preview_bucket').addClass('active'); + form.find('#preview_bucket p').html("Loading preview..."); + var url = form.find('#preview_bucket .content-body').data('api-url'), + text = form.find('#write_bucket textarea').val(); + form.find('#preview_bucket .content-body').load(url, {text: text}); + }); + + var loadCommentInputExt = function () { + if ($('#participants').length > 0) { + var participants = JSON.parse($('#participants').val()); + var teams = JSON.parse($('#all-teams').val() || '[]'); + var following = userFollowing.val(); + var users = $.unique( + participants.concat(following, teams) + ); + $('textarea#new_comment_content, textarea#issue_body') + .atwho("@", {data:users, limit:7}); + } + var newCommentInput = $('textarea#new_comment_content'); + inputExt.enableEmojiInput(newCommentInput); + inputExt.enablePullsInput(newCommentInput); + inputExt.shortcut2submit(newCommentInput); + inputExt.enableZenMode(newCommentInput); + inputExt.enableQuickQuotes(newCommentInput); + + var uploader = $('#form-file-upload'), + textarea = $('#add-comment-form').find('textarea'); + inputExt.enableUpload(uploader, textarea); + + $('#add-comment-form button[type="submit"]').tooltip(); + }; + loadCommentInputExt(); + + }); + + quick_emoji.enable('#new_comment_content'); + } +); diff --git a/dist/js/app/pull/new.js b/dist/js/app/pull/new.js new file mode 100644 index 0000000..6484229 --- /dev/null +++ b/dist/js/app/pull/new.js @@ -0,0 +1,5977 @@ + +require.config({ enable_ozma: true }); + + +/* @source lib/mousetrap.js */; + +/** + * Copyright 2012 Craig Campbell + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Mousetrap is a simple keyboard shortcut library for Javascript with + * no external dependencies + * + * @version 1.2.2 + * @url craig.is/killing/mice + */ +(function() { + + /** + * mapping of special keycodes to their corresponding keys + * + * everything in this dictionary cannot use keypress events + * so it has to be here to map to the correct keycodes for + * keyup/keydown events + * + * @type {Object} + */ + var _MAP = { + 8: 'backspace', + 9: 'tab', + 13: 'enter', + 16: 'shift', + 17: 'ctrl', + 18: 'alt', + 20: 'capslock', + 27: 'esc', + 32: 'space', + 33: 'pageup', + 34: 'pagedown', + 35: 'end', + 36: 'home', + 37: 'left', + 38: 'up', + 39: 'right', + 40: 'down', + 45: 'ins', + 46: 'del', + 91: 'meta', + 93: 'meta', + 224: 'meta' + }, + + /** + * mapping for special characters so they can support + * + * this dictionary is only used incase you want to bind a + * keyup or keydown event to one of these keys + * + * @type {Object} + */ + _KEYCODE_MAP = { + 106: '*', + 107: '+', + 109: '-', + 110: '.', + 111 : '/', + 186: ';', + 187: '=', + 188: ',', + 189: '-', + 190: '.', + 191: '/', + 192: '`', + 219: '[', + 220: '\\', + 221: ']', + 222: '\'' + }, + + /** + * this is a mapping of keys that require shift on a US keypad + * back to the non shift equivelents + * + * this is so you can use keyup events with these keys + * + * note that this will only work reliably on US keyboards + * + * @type {Object} + */ + _SHIFT_MAP = { + '~': '`', + '!': '1', + '@': '2', + '#': '3', + '$': '4', + '%': '5', + '^': '6', + '&': '7', + '*': '8', + '(': '9', + ')': '0', + '_': '-', + '+': '=', + ':': ';', + '\"': '\'', + '<': ',', + '>': '.', + '?': '/', + '|': '\\' + }, + + /** + * this is a list of special strings you can use to map + * to modifier keys when you specify your keyboard shortcuts + * + * @type {Object} + */ + _SPECIAL_ALIASES = { + 'option': 'alt', + 'command': 'meta', + 'return': 'enter', + 'escape': 'esc' + }, + + /** + * variable to store the flipped version of _MAP from above + * needed to check if we should use keypress or not when no action + * is specified + * + * @type {Object|undefined} + */ + _REVERSE_MAP, + + /** + * a list of all the callbacks setup via Mousetrap.bind() + * + * @type {Object} + */ + _callbacks = {}, + + /** + * direct map of string combinations to callbacks used for trigger() + * + * @type {Object} + */ + _direct_map = {}, + + /** + * keeps track of what level each sequence is at since multiple + * sequences can start out with the same sequence + * + * @type {Object} + */ + _sequence_levels = {}, + + /** + * variable to store the setTimeout call + * + * @type {null|number} + */ + _reset_timer, + + /** + * temporary state where we will ignore the next keyup + * + * @type {boolean|string} + */ + _ignore_next_keyup = false, + + /** + * are we currently inside of a sequence? + * type of action ("keyup" or "keydown" or "keypress") or false + * + * @type {boolean|string} + */ + _sequence_type = false; + + /** + * loop through the f keys, f1 to f19 and add them to the map + * programatically + */ + for (var i = 1; i < 20; ++i) { + _MAP[111 + i] = 'f' + i; + } + + /** + * loop through to map numbers on the numeric keypad + */ + for (i = 0; i <= 9; ++i) { + _MAP[i + 96] = i; + } + + /** + * cross browser add event method + * + * @param {Element|HTMLDocument} object + * @param {string} type + * @param {Function} callback + * @returns void + */ + function _addEvent(object, type, callback) { + if (object.addEventListener) { + object.addEventListener(type, callback, false); + return; + } + + object.attachEvent('on' + type, callback); + } + + /** + * takes the event and returns the key character + * + * @param {Event} e + * @return {string} + */ + function _characterFromEvent(e) { + + // for keypress events we should return the character as is + if (e.type == 'keypress') { + return String.fromCharCode(e.which); + } + + // for non keypress events the special maps are needed + if (_MAP[e.which]) { + return _MAP[e.which]; + } + + if (_KEYCODE_MAP[e.which]) { + return _KEYCODE_MAP[e.which]; + } + + // if it is not in the special map + return String.fromCharCode(e.which).toLowerCase(); + } + + /** + * checks if two arrays are equal + * + * @param {Array} modifiers1 + * @param {Array} modifiers2 + * @returns {boolean} + */ + function _modifiersMatch(modifiers1, modifiers2) { + return modifiers1.sort().join(',') === modifiers2.sort().join(','); + } + + /** + * resets all sequence counters except for the ones passed in + * + * @param {Object} do_not_reset + * @returns void + */ + function _resetSequences(do_not_reset, max_level) { + do_not_reset = do_not_reset || {}; + + var active_sequences = false, + key; + + for (key in _sequence_levels) { + if (do_not_reset[key] && _sequence_levels[key] > max_level) { + active_sequences = true; + continue; + } + _sequence_levels[key] = 0; + } + + if (!active_sequences) { + _sequence_type = false; + } + } + + /** + * finds all callbacks that match based on the keycode, modifiers, + * and action + * + * @param {string} character + * @param {Array} modifiers + * @param {Event|Object} e + * @param {boolean=} remove - should we remove any matches + * @param {string=} combination + * @returns {Array} + */ + function _getMatches(character, modifiers, e, remove, combination) { + var i, + callback, + matches = [], + action = e.type; + + // if there are no events related to this keycode + if (!_callbacks[character]) { + return []; + } + + // if a modifier key is coming up on its own we should allow it + if (action == 'keyup' && _isModifier(character)) { + modifiers = [character]; + } + + // loop through all callbacks for the key that was pressed + // and see if any of them match + for (i = 0; i < _callbacks[character].length; ++i) { + callback = _callbacks[character][i]; + + // if this is a sequence but it is not at the right level + // then move onto the next match + if (callback.seq && _sequence_levels[callback.seq] != callback.level) { + continue; + } + + // if the action we are looking for doesn't match the action we got + // then we should keep going + if (action != callback.action) { + continue; + } + + // if this is a keypress event and the meta key and control key + // are not pressed that means that we need to only look at the + // character, otherwise check the modifiers as well + // + // chrome will not fire a keypress if meta or control is down + // safari will fire a keypress if meta or meta+shift is down + // firefox will fire a keypress if meta or control is down + if ((action == 'keypress' && !e.metaKey && !e.ctrlKey) || _modifiersMatch(modifiers, callback.modifiers)) { + + // remove is used so if you change your mind and call bind a + // second time with a new function the first one is overwritten + if (remove && callback.combo == combination) { + _callbacks[character].splice(i, 1); + } + + matches.push(callback); + } + } + + return matches; + } + + /** + * takes a key event and figures out what the modifiers are + * + * @param {Event} e + * @returns {Array} + */ + function _eventModifiers(e) { + var modifiers = []; + + if (e.shiftKey) { + modifiers.push('shift'); + } + + if (e.altKey) { + modifiers.push('alt'); + } + + if (e.ctrlKey) { + modifiers.push('ctrl'); + } + + if (e.metaKey) { + modifiers.push('meta'); + } + + return modifiers; + } + + /** + * actually calls the callback function + * + * if your callback function returns false this will use the jquery + * convention - prevent default and stop propogation on the event + * + * @param {Function} callback + * @param {Event} e + * @returns void + */ + function _fireCallback(callback, e, combo) { + + // if this event should not happen stop here + if (Mousetrap.stopCallback(e, e.target || e.srcElement, combo)) { + return; + } + + if (callback(e, combo) === false) { + if (e.preventDefault) { + e.preventDefault(); + } + + if (e.stopPropagation) { + e.stopPropagation(); + } + + e.returnValue = false; + e.cancelBubble = true; + } + } + + /** + * handles a character key event + * + * @param {string} character + * @param {Event} e + * @returns void + */ + function _handleCharacter(character, e) { + var callbacks = _getMatches(character, _eventModifiers(e), e), + i, + do_not_reset = {}, + max_level = 0, + processed_sequence_callback = false; + + // loop through matching callbacks for this key event + for (i = 0; i < callbacks.length; ++i) { + + // fire for all sequence callbacks + // this is because if for example you have multiple sequences + // bound such as "g i" and "g t" they both need to fire the + // callback for matching g cause otherwise you can only ever + // match the first one + if (callbacks[i].seq) { + processed_sequence_callback = true; + + // as we loop through keep track of the max + // any sequence at a lower level will be discarded + max_level = Math.max(max_level, callbacks[i].level); + + // keep a list of which sequences were matches for later + do_not_reset[callbacks[i].seq] = 1; + _fireCallback(callbacks[i].callback, e, callbacks[i].combo); + continue; + } + + // if there were no sequence matches but we are still here + // that means this is a regular match so we should fire that + if (!processed_sequence_callback && !_sequence_type) { + _fireCallback(callbacks[i].callback, e, callbacks[i].combo); + } + } + + // if you are inside of a sequence and the key you are pressing + // is not a modifier key then we should reset all sequences + // that were not matched by this key event + if (e.type == _sequence_type && !_isModifier(character)) { + _resetSequences(do_not_reset, max_level); + } + } + + /** + * handles a keydown event + * + * @param {Event} e + * @returns void + */ + function _handleKey(e) { + + // normalize e.which for key events + // @see http://stackoverflow.com/questions/4285627/javascript-keycode-vs-charcode-utter-confusion + if (typeof e.which !== 'number') { + e.which = e.keyCode; + } + + var character = _characterFromEvent(e); + + // no character found then stop + if (!character) { + return; + } + + if (e.type == 'keyup' && _ignore_next_keyup == character) { + _ignore_next_keyup = false; + return; + } + + _handleCharacter(character, e); + } + + /** + * determines if the keycode specified is a modifier key or not + * + * @param {string} key + * @returns {boolean} + */ + function _isModifier(key) { + return key == 'shift' || key == 'ctrl' || key == 'alt' || key == 'meta'; + } + + /** + * called to set a 1 second timeout on the specified sequence + * + * this is so after each key press in the sequence you have 1 second + * to press the next key before you have to start over + * + * @returns void + */ + function _resetSequenceTimer() { + clearTimeout(_reset_timer); + _reset_timer = setTimeout(_resetSequences, 1000); + } + + /** + * reverses the map lookup so that we can look for specific keys + * to see what can and can't use keypress + * + * @return {Object} + */ + function _getReverseMap() { + if (!_REVERSE_MAP) { + _REVERSE_MAP = {}; + for (var key in _MAP) { + + // pull out the numeric keypad from here cause keypress should + // be able to detect the keys from the character + if (key > 95 && key < 112) { + continue; + } + + if (_MAP.hasOwnProperty(key)) { + _REVERSE_MAP[_MAP[key]] = key; + } + } + } + return _REVERSE_MAP; + } + + /** + * picks the best action based on the key combination + * + * @param {string} key - character for key + * @param {Array} modifiers + * @param {string=} action passed in + */ + function _pickBestAction(key, modifiers, action) { + + // if no action was picked in we should try to pick the one + // that we think would work best for this key + if (!action) { + action = _getReverseMap()[key] ? 'keydown' : 'keypress'; + } + + // modifier keys don't work as expected with keypress, + // switch to keydown + if (action == 'keypress' && modifiers.length) { + action = 'keydown'; + } + + return action; + } + + /** + * binds a key sequence to an event + * + * @param {string} combo - combo specified in bind call + * @param {Array} keys + * @param {Function} callback + * @param {string=} action + * @returns void + */ + function _bindSequence(combo, keys, callback, action) { + + // start off by adding a sequence level record for this combination + // and setting the level to 0 + _sequence_levels[combo] = 0; + + // if there is no action pick the best one for the first key + // in the sequence + if (!action) { + action = _pickBestAction(keys[0], []); + } + + /** + * callback to increase the sequence level for this sequence and reset + * all other sequences that were active + * + * @param {Event} e + * @returns void + */ + var _increaseSequence = function(e) { + _sequence_type = action; + ++_sequence_levels[combo]; + _resetSequenceTimer(); + }, + + /** + * wraps the specified callback inside of another function in order + * to reset all sequence counters as soon as this sequence is done + * + * @param {Event} e + * @returns void + */ + _callbackAndReset = function(e) { + _fireCallback(callback, e, combo); + + // we should ignore the next key up if the action is key down + // or keypress. this is so if you finish a sequence and + // release the key the final key will not trigger a keyup + if (action !== 'keyup') { + _ignore_next_keyup = _characterFromEvent(e); + } + + // weird race condition if a sequence ends with the key + // another sequence begins with + setTimeout(_resetSequences, 10); + }, + i; + + // loop through keys one at a time and bind the appropriate callback + // function. for any key leading up to the final one it should + // increase the sequence. after the final, it should reset all sequences + for (i = 0; i < keys.length; ++i) { + _bindSingle(keys[i], i < keys.length - 1 ? _increaseSequence : _callbackAndReset, action, combo, i); + } + } + + /** + * binds a single keyboard combination + * + * @param {string} combination + * @param {Function} callback + * @param {string=} action + * @param {string=} sequence_name - name of sequence if part of sequence + * @param {number=} level - what part of the sequence the command is + * @returns void + */ + function _bindSingle(combination, callback, action, sequence_name, level) { + + // make sure multiple spaces in a row become a single space + combination = combination.replace(/\s+/g, ' '); + + var sequence = combination.split(' '), + i, + key, + keys, + modifiers = []; + + // if this pattern is a sequence of keys then run through this method + // to reprocess each pattern one key at a time + if (sequence.length > 1) { + _bindSequence(combination, sequence, callback, action); + return; + } + + // take the keys from this pattern and figure out what the actual + // pattern is all about + keys = combination === '+' ? ['+'] : combination.split('+'); + + for (i = 0; i < keys.length; ++i) { + key = keys[i]; + + // normalize key names + if (_SPECIAL_ALIASES[key]) { + key = _SPECIAL_ALIASES[key]; + } + + // if this is not a keypress event then we should + // be smart about using shift keys + // this will only work for US keyboards however + if (action && action != 'keypress' && _SHIFT_MAP[key]) { + key = _SHIFT_MAP[key]; + modifiers.push('shift'); + } + + // if this key is a modifier then add it to the list of modifiers + if (_isModifier(key)) { + modifiers.push(key); + } + } + + // depending on what the key combination is + // we will try to pick the best event for it + action = _pickBestAction(key, modifiers, action); + + // make sure to initialize array if this is the first time + // a callback is added for this key + if (!_callbacks[key]) { + _callbacks[key] = []; + } + + // remove an existing match if there is one + _getMatches(key, modifiers, {type: action}, !sequence_name, combination); + + // add this call back to the array + // if it is a sequence put it at the beginning + // if not put it at the end + // + // this is important because the way these are processed expects + // the sequence ones to come first + _callbacks[key][sequence_name ? 'unshift' : 'push']({ + callback: callback, + modifiers: modifiers, + action: action, + seq: sequence_name, + level: level, + combo: combination + }); + } + + /** + * binds multiple combinations to the same callback + * + * @param {Array} combinations + * @param {Function} callback + * @param {string|undefined} action + * @returns void + */ + function _bindMultiple(combinations, callback, action) { + for (var i = 0; i < combinations.length; ++i) { + _bindSingle(combinations[i], callback, action); + } + } + + // start! + _addEvent(document, 'keypress', _handleKey); + _addEvent(document, 'keydown', _handleKey); + _addEvent(document, 'keyup', _handleKey); + + var Mousetrap = { + + /** + * binds an event to mousetrap + * + * can be a single key, a combination of keys separated with +, + * an array of keys, or a sequence of keys separated by spaces + * + * be sure to list the modifier keys first to make sure that the + * correct key ends up getting bound (the last key in the pattern) + * + * @param {string|Array} keys + * @param {Function} callback + * @param {string=} action - 'keypress', 'keydown', or 'keyup' + * @returns void + */ + bind: function(keys, callback, action) { + _bindMultiple(keys instanceof Array ? keys : [keys], callback, action); + _direct_map[keys + ':' + action] = callback; + return this; + }, + + /** + * unbinds an event to mousetrap + * + * the unbinding sets the callback function of the specified key combo + * to an empty function and deletes the corresponding key in the + * _direct_map dict. + * + * the keycombo+action has to be exactly the same as + * it was defined in the bind method + * + * TODO: actually remove this from the _callbacks dictionary instead + * of binding an empty function + * + * @param {string|Array} keys + * @param {string} action + * @returns void + */ + unbind: function(keys, action) { + if (_direct_map[keys + ':' + action]) { + delete _direct_map[keys + ':' + action]; + this.bind(keys, function() {}, action); + } + return this; + }, + + /** + * triggers an event that has already been bound + * + * @param {string} keys + * @param {string=} action + * @returns void + */ + trigger: function(keys, action) { + _direct_map[keys + ':' + action](); + return this; + }, + + /** + * resets the library back to its initial state. this is useful + * if you want to clear out the current keyboard shortcuts and bind + * new ones - for example if you switch to another page + * + * @returns void + */ + reset: function() { + _callbacks = {}; + _direct_map = {}; + return this; + }, + + /** + * should we stop this event before firing off callbacks + * + * @param {Event} e + * @param {Element} element + * @return {boolean} + */ + stopCallback: function(e, element, combo) { + + // if the element has the class "mousetrap" then no need to stop + if ((' ' + element.className + ' ').indexOf(' mousetrap ') > -1) { + return false; + } + + // stop for input, select, and textarea + return element.tagName == 'INPUT' || element.tagName == 'SELECT' || element.tagName == 'TEXTAREA' || (element.contentEditable && element.contentEditable == 'true'); + } + }; + + // expose mousetrap to the global object + window.Mousetrap = Mousetrap; + + // expose mousetrap as an AMD module + if (typeof define === 'function' && define.amd) { + define("mousetrap", Mousetrap); + } +}) (); + +/* @source mod/colorcube.js */; + +define("mod/colorcube", + [ + "jquery" +], + function ($) { + var colorcube = {}, cubeWnd; + var showCubeWnd = function (el) { + el = $(el); + if (!cubeWnd) { + cubeWnd = $('
    ').appendTo('body'); + } + var pos = el.offset(); + pos = {top:pos.top - 40, left:pos.left + el.width()/2 -15}; + cubeWnd.show().offset(pos).css({'background-color':el.data('color')}); + }; + colorcube.init = function (opts) { + if (opts.target) { + $(opts.target).delegate( + '.line .color', 'mouseenter mouseleave', function (e) { + if (e.type === 'mouseenter') { + showCubeWnd(this); + } else { + cubeWnd.hide(); + } + }); + } + }; + return colorcube; + } +); + +/* @source lib/socket.io.js */; + +/*! Socket.IO.js build:0.9.16, development. Copyright(c) 2011 LearnBoost MIT Licensed */ + +var io = ('undefined' === typeof module ? {} : module.exports); +(function() { + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, global) { + + /** + * IO namespace. + * + * @namespace + */ + + var io = exports; + + /** + * Socket.IO version + * + * @api public + */ + + io.version = '0.9.16'; + + /** + * Protocol implemented. + * + * @api public + */ + + io.protocol = 1; + + /** + * Available transports, these will be populated with the available transports + * + * @api public + */ + + io.transports = []; + + /** + * Keep track of jsonp callbacks. + * + * @api private + */ + + io.j = []; + + /** + * Keep track of our io.Sockets + * + * @api private + */ + io.sockets = {}; + + + /** + * Manages connections to hosts. + * + * @param {String} uri + * @Param {Boolean} force creation of new socket (defaults to false) + * @api public + */ + + io.connect = function (host, details) { + var uri = io.util.parseUri(host) + , uuri + , socket; + + if (global && global.location) { + uri.protocol = uri.protocol || global.location.protocol.slice(0, -1); + uri.host = uri.host || (global.document + ? global.document.domain : global.location.hostname); + uri.port = uri.port || global.location.port; + } + + uuri = io.util.uniqueUri(uri); + + var options = { + host: uri.host + , secure: 'https' == uri.protocol + , port: uri.port || ('https' == uri.protocol ? 443 : 80) + , query: uri.query || '' + }; + + io.util.merge(options, details); + + if (options['force new connection'] || !io.sockets[uuri]) { + socket = new io.Socket(options); + } + + if (!options['force new connection'] && socket) { + io.sockets[uuri] = socket; + } + + socket = socket || io.sockets[uuri]; + + // if path is different from '' or / + return socket.of(uri.path.length > 1 ? uri.path : ''); + }; + +})('object' === typeof module ? module.exports : (this.io = {}), this); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, global) { + + /** + * Utilities namespace. + * + * @namespace + */ + + var util = exports.util = {}; + + /** + * Parses an URI + * + * @author Steven Levithan (MIT license) + * @api public + */ + + var re = /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/; + + var parts = ['source', 'protocol', 'authority', 'userInfo', 'user', 'password', + 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', + 'anchor']; + + util.parseUri = function (str) { + var m = re.exec(str || '') + , uri = {} + , i = 14; + + while (i--) { + uri[parts[i]] = m[i] || ''; + } + + return uri; + }; + + /** + * Produces a unique url that identifies a Socket.IO connection. + * + * @param {Object} uri + * @api public + */ + + util.uniqueUri = function (uri) { + var protocol = uri.protocol + , host = uri.host + , port = uri.port; + + if ('document' in global) { + host = host || document.domain; + port = port || (protocol == 'https' + && document.location.protocol !== 'https:' ? 443 : document.location.port); + } else { + host = host || 'localhost'; + + if (!port && protocol == 'https') { + port = 443; + } + } + + return (protocol || 'http') + '://' + host + ':' + (port || 80); + }; + + /** + * Mergest 2 query strings in to once unique query string + * + * @param {String} base + * @param {String} addition + * @api public + */ + + util.query = function (base, addition) { + var query = util.chunkQuery(base || '') + , components = []; + + util.merge(query, util.chunkQuery(addition || '')); + for (var part in query) { + if (query.hasOwnProperty(part)) { + components.push(part + '=' + query[part]); + } + } + + return components.length ? '?' + components.join('&') : ''; + }; + + /** + * Transforms a querystring in to an object + * + * @param {String} qs + * @api public + */ + + util.chunkQuery = function (qs) { + var query = {} + , params = qs.split('&') + , i = 0 + , l = params.length + , kv; + + for (; i < l; ++i) { + kv = params[i].split('='); + if (kv[0]) { + query[kv[0]] = kv[1]; + } + } + + return query; + }; + + /** + * Executes the given function when the page is loaded. + * + * io.util.load(function () { console.log('page loaded'); }); + * + * @param {Function} fn + * @api public + */ + + var pageLoaded = false; + + util.load = function (fn) { + if ('document' in global && document.readyState === 'complete' || pageLoaded) { + return fn(); + } + + util.on(global, 'load', fn, false); + }; + + /** + * Adds an event. + * + * @api private + */ + + util.on = function (element, event, fn, capture) { + if (element.attachEvent) { + element.attachEvent('on' + event, fn); + } else if (element.addEventListener) { + element.addEventListener(event, fn, capture); + } + }; + + /** + * Generates the correct `XMLHttpRequest` for regular and cross domain requests. + * + * @param {Boolean} [xdomain] Create a request that can be used cross domain. + * @returns {XMLHttpRequest|false} If we can create a XMLHttpRequest. + * @api private + */ + + util.request = function (xdomain) { + + if (xdomain && 'undefined' != typeof XDomainRequest && !util.ua.hasCORS) { + return new XDomainRequest(); + } + + if ('undefined' != typeof XMLHttpRequest && (!xdomain || util.ua.hasCORS)) { + return new XMLHttpRequest(); + } + + if (!xdomain) { + try { + return new window[(['Active'].concat('Object').join('X'))]('Microsoft.XMLHTTP'); + } catch(e) { } + } + + return null; + }; + + /** + * XHR based transport constructor. + * + * @constructor + * @api public + */ + + /** + * Change the internal pageLoaded value. + */ + + if ('undefined' != typeof window) { + util.load(function () { + pageLoaded = true; + }); + } + + /** + * Defers a function to ensure a spinner is not displayed by the browser + * + * @param {Function} fn + * @api public + */ + + util.defer = function (fn) { + if (!util.ua.webkit || 'undefined' != typeof importScripts) { + return fn(); + } + + util.load(function () { + setTimeout(fn, 100); + }); + }; + + /** + * Merges two objects. + * + * @api public + */ + + util.merge = function merge (target, additional, deep, lastseen) { + var seen = lastseen || [] + , depth = typeof deep == 'undefined' ? 2 : deep + , prop; + + for (prop in additional) { + if (additional.hasOwnProperty(prop) && util.indexOf(seen, prop) < 0) { + if (typeof target[prop] !== 'object' || !depth) { + target[prop] = additional[prop]; + seen.push(additional[prop]); + } else { + util.merge(target[prop], additional[prop], depth - 1, seen); + } + } + } + + return target; + }; + + /** + * Merges prototypes from objects + * + * @api public + */ + + util.mixin = function (ctor, ctor2) { + util.merge(ctor.prototype, ctor2.prototype); + }; + + /** + * Shortcut for prototypical and static inheritance. + * + * @api private + */ + + util.inherit = function (ctor, ctor2) { + function f() {}; + f.prototype = ctor2.prototype; + ctor.prototype = new f; + }; + + /** + * Checks if the given object is an Array. + * + * io.util.isArray([]); // true + * io.util.isArray({}); // false + * + * @param Object obj + * @api public + */ + + util.isArray = Array.isArray || function (obj) { + return Object.prototype.toString.call(obj) === '[object Array]'; + }; + + /** + * Intersects values of two arrays into a third + * + * @api public + */ + + util.intersect = function (arr, arr2) { + var ret = [] + , longest = arr.length > arr2.length ? arr : arr2 + , shortest = arr.length > arr2.length ? arr2 : arr; + + for (var i = 0, l = shortest.length; i < l; i++) { + if (~util.indexOf(longest, shortest[i])) + ret.push(shortest[i]); + } + + return ret; + }; + + /** + * Array indexOf compatibility. + * + * @see bit.ly/a5Dxa2 + * @api public + */ + + util.indexOf = function (arr, o, i) { + + for (var j = arr.length, i = i < 0 ? i + j < 0 ? 0 : i + j : i || 0; + i < j && arr[i] !== o; i++) {} + + return j <= i ? -1 : i; + }; + + /** + * Converts enumerables to array. + * + * @api public + */ + + util.toArray = function (enu) { + var arr = []; + + for (var i = 0, l = enu.length; i < l; i++) + arr.push(enu[i]); + + return arr; + }; + + /** + * UA / engines detection namespace. + * + * @namespace + */ + + util.ua = {}; + + /** + * Whether the UA supports CORS for XHR. + * + * @api public + */ + + util.ua.hasCORS = 'undefined' != typeof XMLHttpRequest && (function () { + try { + var a = new XMLHttpRequest(); + } catch (e) { + return false; + } + + return a.withCredentials != undefined; + })(); + + /** + * Detect webkit. + * + * @api public + */ + + util.ua.webkit = 'undefined' != typeof navigator + && /webkit/i.test(navigator.userAgent); + + /** + * Detect iPad/iPhone/iPod. + * + * @api public + */ + + util.ua.iDevice = 'undefined' != typeof navigator + && /iPad|iPhone|iPod/i.test(navigator.userAgent); + +})('undefined' != typeof io ? io : module.exports, this); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.EventEmitter = EventEmitter; + + /** + * Event emitter constructor. + * + * @api public. + */ + + function EventEmitter () {}; + + /** + * Adds a listener + * + * @api public + */ + + EventEmitter.prototype.on = function (name, fn) { + if (!this.$events) { + this.$events = {}; + } + + if (!this.$events[name]) { + this.$events[name] = fn; + } else if (io.util.isArray(this.$events[name])) { + this.$events[name].push(fn); + } else { + this.$events[name] = [this.$events[name], fn]; + } + + return this; + }; + + EventEmitter.prototype.addListener = EventEmitter.prototype.on; + + /** + * Adds a volatile listener. + * + * @api public + */ + + EventEmitter.prototype.once = function (name, fn) { + var self = this; + + function on () { + self.removeListener(name, on); + fn.apply(this, arguments); + }; + + on.listener = fn; + this.on(name, on); + + return this; + }; + + /** + * Removes a listener. + * + * @api public + */ + + EventEmitter.prototype.removeListener = function (name, fn) { + if (this.$events && this.$events[name]) { + var list = this.$events[name]; + + if (io.util.isArray(list)) { + var pos = -1; + + for (var i = 0, l = list.length; i < l; i++) { + if (list[i] === fn || (list[i].listener && list[i].listener === fn)) { + pos = i; + break; + } + } + + if (pos < 0) { + return this; + } + + list.splice(pos, 1); + + if (!list.length) { + delete this.$events[name]; + } + } else if (list === fn || (list.listener && list.listener === fn)) { + delete this.$events[name]; + } + } + + return this; + }; + + /** + * Removes all listeners for an event. + * + * @api public + */ + + EventEmitter.prototype.removeAllListeners = function (name) { + if (name === undefined) { + this.$events = {}; + return this; + } + + if (this.$events && this.$events[name]) { + this.$events[name] = null; + } + + return this; + }; + + /** + * Gets all listeners for a certain event. + * + * @api publci + */ + + EventEmitter.prototype.listeners = function (name) { + if (!this.$events) { + this.$events = {}; + } + + if (!this.$events[name]) { + this.$events[name] = []; + } + + if (!io.util.isArray(this.$events[name])) { + this.$events[name] = [this.$events[name]]; + } + + return this.$events[name]; + }; + + /** + * Emits an event. + * + * @api public + */ + + EventEmitter.prototype.emit = function (name) { + if (!this.$events) { + return false; + } + + var handler = this.$events[name]; + + if (!handler) { + return false; + } + + var args = Array.prototype.slice.call(arguments, 1); + + if ('function' == typeof handler) { + handler.apply(this, args); + } else if (io.util.isArray(handler)) { + var listeners = handler.slice(); + + for (var i = 0, l = listeners.length; i < l; i++) { + listeners[i].apply(this, args); + } + } else { + return false; + } + + return true; + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +/** + * Based on JSON2 (http://www.JSON.org/js.html). + */ + +(function (exports, nativeJSON) { + "use strict"; + + // use native JSON if it's available + if (nativeJSON && nativeJSON.parse){ + return exports.JSON = { + parse: nativeJSON.parse + , stringify: nativeJSON.stringify + }; + } + + var JSON = exports.JSON = {}; + + function f(n) { + // Format integers to have at least two digits. + return n < 10 ? '0' + n : n; + } + + function date(d, key) { + return isFinite(d.valueOf()) ? + d.getUTCFullYear() + '-' + + f(d.getUTCMonth() + 1) + '-' + + f(d.getUTCDate()) + 'T' + + f(d.getUTCHours()) + ':' + + f(d.getUTCMinutes()) + ':' + + f(d.getUTCSeconds()) + 'Z' : null; + }; + + var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + gap, + indent, + meta = { // table of character substitutions + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '\\': '\\\\' + }, + rep; + + + function quote(string) { + +// If the string contains no control characters, no quote characters, and no +// backslash characters, then we can safely slap some quotes around it. +// Otherwise we must also replace the offending characters with safe escape +// sequences. + + escapable.lastIndex = 0; + return escapable.test(string) ? '"' + string.replace(escapable, function (a) { + var c = meta[a]; + return typeof c === 'string' ? c : + '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }) + '"' : '"' + string + '"'; + } + + + function str(key, holder) { + +// Produce a string from holder[key]. + + var i, // The loop counter. + k, // The member key. + v, // The member value. + length, + mind = gap, + partial, + value = holder[key]; + +// If the value has a toJSON method, call it to obtain a replacement value. + + if (value instanceof Date) { + value = date(key); + } + +// If we were called with a replacer function, then call the replacer to +// obtain a replacement value. + + if (typeof rep === 'function') { + value = rep.call(holder, key, value); + } + +// What happens next depends on the value's type. + + switch (typeof value) { + case 'string': + return quote(value); + + case 'number': + +// JSON numbers must be finite. Encode non-finite numbers as null. + + return isFinite(value) ? String(value) : 'null'; + + case 'boolean': + case 'null': + +// If the value is a boolean or null, convert it to a string. Note: +// typeof null does not produce 'null'. The case is included here in +// the remote chance that this gets fixed someday. + + return String(value); + +// If the type is 'object', we might be dealing with an object or an array or +// null. + + case 'object': + +// Due to a specification blunder in ECMAScript, typeof null is 'object', +// so watch out for that case. + + if (!value) { + return 'null'; + } + +// Make an array to hold the partial results of stringifying this object value. + + gap += indent; + partial = []; + +// Is the value an array? + + if (Object.prototype.toString.apply(value) === '[object Array]') { + +// The value is an array. Stringify every element. Use null as a placeholder +// for non-JSON values. + + length = value.length; + for (i = 0; i < length; i += 1) { + partial[i] = str(i, value) || 'null'; + } + +// Join all of the elements together, separated with commas, and wrap them in +// brackets. + + v = partial.length === 0 ? '[]' : gap ? + '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : + '[' + partial.join(',') + ']'; + gap = mind; + return v; + } + +// If the replacer is an array, use it to select the members to be stringified. + + if (rep && typeof rep === 'object') { + length = rep.length; + for (i = 0; i < length; i += 1) { + if (typeof rep[i] === 'string') { + k = rep[i]; + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } else { + +// Otherwise, iterate through all of the keys in the object. + + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } + +// Join all of the member texts together, separated with commas, +// and wrap them in braces. + + v = partial.length === 0 ? '{}' : gap ? + '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : + '{' + partial.join(',') + '}'; + gap = mind; + return v; + } + } + +// If the JSON object does not yet have a stringify method, give it one. + + JSON.stringify = function (value, replacer, space) { + +// The stringify method takes a value and an optional replacer, and an optional +// space parameter, and returns a JSON text. The replacer can be a function +// that can replace values, or an array of strings that will select the keys. +// A default replacer method can be provided. Use of the space parameter can +// produce text that is more easily readable. + + var i; + gap = ''; + indent = ''; + +// If the space parameter is a number, make an indent string containing that +// many spaces. + + if (typeof space === 'number') { + for (i = 0; i < space; i += 1) { + indent += ' '; + } + +// If the space parameter is a string, it will be used as the indent string. + + } else if (typeof space === 'string') { + indent = space; + } + +// If there is a replacer, it must be a function or an array. +// Otherwise, throw an error. + + rep = replacer; + if (replacer && typeof replacer !== 'function' && + (typeof replacer !== 'object' || + typeof replacer.length !== 'number')) { + throw new Error('JSON.stringify'); + } + +// Make a fake root object containing our value under the key of ''. +// Return the result of stringifying the value. + + return str('', {'': value}); + }; + +// If the JSON object does not yet have a parse method, give it one. + + JSON.parse = function (text, reviver) { + // The parse method takes a text and an optional reviver function, and returns + // a JavaScript value if the text is a valid JSON text. + + var j; + + function walk(holder, key) { + + // The walk method is used to recursively walk the resulting structure so + // that modifications can be made. + + var k, v, value = holder[key]; + if (value && typeof value === 'object') { + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = walk(value, k); + if (v !== undefined) { + value[k] = v; + } else { + delete value[k]; + } + } + } + } + return reviver.call(holder, key, value); + } + + + // Parsing happens in four stages. In the first stage, we replace certain + // Unicode characters with escape sequences. JavaScript handles many characters + // incorrectly, either silently deleting them, or treating them as line endings. + + text = String(text); + cx.lastIndex = 0; + if (cx.test(text)) { + text = text.replace(cx, function (a) { + return '\\u' + + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }); + } + + // In the second stage, we run the text against regular expressions that look + // for non-JSON patterns. We are especially concerned with '()' and 'new' + // because they can cause invocation, and '=' because it can cause mutation. + // But just to be safe, we want to reject all unexpected forms. + + // We split the second stage into 4 regexp operations in order to work around + // crippling inefficiencies in IE's and Safari's regexp engines. First we + // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we + // replace all simple value tokens with ']' characters. Third, we delete all + // open brackets that follow a colon or comma or that begin the text. Finally, + // we look to see that the remaining characters are only whitespace or ']' or + // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. + + if (/^[\],:{}\s]*$/ + .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') + .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') + .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { + + // In the third stage we use the eval function to compile the text into a + // JavaScript structure. The '{' operator is subject to a syntactic ambiguity + // in JavaScript: it can begin a block or an object literal. We wrap the text + // in parens to eliminate the ambiguity. + + j = eval('(' + text + ')'); + + // In the optional fourth stage, we recursively walk the new structure, passing + // each name/value pair to a reviver function for possible transformation. + + return typeof reviver === 'function' ? + walk({'': j}, '') : j; + } + + // If the text is not JSON parseable, then a SyntaxError is thrown. + + throw new SyntaxError('JSON.parse'); + }; + +})( + 'undefined' != typeof io ? io : module.exports + , typeof JSON !== 'undefined' ? JSON : undefined +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Parser namespace. + * + * @namespace + */ + + var parser = exports.parser = {}; + + /** + * Packet types. + */ + + var packets = parser.packets = [ + 'disconnect' + , 'connect' + , 'heartbeat' + , 'message' + , 'json' + , 'event' + , 'ack' + , 'error' + , 'noop' + ]; + + /** + * Errors reasons. + */ + + var reasons = parser.reasons = [ + 'transport not supported' + , 'client not handshaken' + , 'unauthorized' + ]; + + /** + * Errors advice. + */ + + var advice = parser.advice = [ + 'reconnect' + ]; + + /** + * Shortcuts. + */ + + var JSON = io.JSON + , indexOf = io.util.indexOf; + + /** + * Encodes a packet. + * + * @api private + */ + + parser.encodePacket = function (packet) { + var type = indexOf(packets, packet.type) + , id = packet.id || '' + , endpoint = packet.endpoint || '' + , ack = packet.ack + , data = null; + + switch (packet.type) { + case 'error': + var reason = packet.reason ? indexOf(reasons, packet.reason) : '' + , adv = packet.advice ? indexOf(advice, packet.advice) : ''; + + if (reason !== '' || adv !== '') + data = reason + (adv !== '' ? ('+' + adv) : ''); + + break; + + case 'message': + if (packet.data !== '') + data = packet.data; + break; + + case 'event': + var ev = { name: packet.name }; + + if (packet.args && packet.args.length) { + ev.args = packet.args; + } + + data = JSON.stringify(ev); + break; + + case 'json': + data = JSON.stringify(packet.data); + break; + + case 'connect': + if (packet.qs) + data = packet.qs; + break; + + case 'ack': + data = packet.ackId + + (packet.args && packet.args.length + ? '+' + JSON.stringify(packet.args) : ''); + break; + } + + // construct packet with required fragments + var encoded = [ + type + , id + (ack == 'data' ? '+' : '') + , endpoint + ]; + + // data fragment is optional + if (data !== null && data !== undefined) + encoded.push(data); + + return encoded.join(':'); + }; + + /** + * Encodes multiple messages (payload). + * + * @param {Array} messages + * @api private + */ + + parser.encodePayload = function (packets) { + var decoded = ''; + + if (packets.length == 1) + return packets[0]; + + for (var i = 0, l = packets.length; i < l; i++) { + var packet = packets[i]; + decoded += '\ufffd' + packet.length + '\ufffd' + packets[i]; + } + + return decoded; + }; + + /** + * Decodes a packet + * + * @api private + */ + + var regexp = /([^:]+):([0-9]+)?(\+)?:([^:]+)?:?([\s\S]*)?/; + + parser.decodePacket = function (data) { + var pieces = data.match(regexp); + + if (!pieces) return {}; + + var id = pieces[2] || '' + , data = pieces[5] || '' + , packet = { + type: packets[pieces[1]] + , endpoint: pieces[4] || '' + }; + + // whether we need to acknowledge the packet + if (id) { + packet.id = id; + if (pieces[3]) + packet.ack = 'data'; + else + packet.ack = true; + } + + // handle different packet types + switch (packet.type) { + case 'error': + var pieces = data.split('+'); + packet.reason = reasons[pieces[0]] || ''; + packet.advice = advice[pieces[1]] || ''; + break; + + case 'message': + packet.data = data || ''; + break; + + case 'event': + try { + var opts = JSON.parse(data); + packet.name = opts.name; + packet.args = opts.args; + } catch (e) { } + + packet.args = packet.args || []; + break; + + case 'json': + try { + packet.data = JSON.parse(data); + } catch (e) { } + break; + + case 'connect': + packet.qs = data || ''; + break; + + case 'ack': + var pieces = data.match(/^([0-9]+)(\+)?(.*)/); + if (pieces) { + packet.ackId = pieces[1]; + packet.args = []; + + if (pieces[3]) { + try { + packet.args = pieces[3] ? JSON.parse(pieces[3]) : []; + } catch (e) { } + } + } + break; + + case 'disconnect': + case 'heartbeat': + break; + }; + + return packet; + }; + + /** + * Decodes data payload. Detects multiple messages + * + * @return {Array} messages + * @api public + */ + + parser.decodePayload = function (data) { + // IE doesn't like data[i] for unicode chars, charAt works fine + if (data.charAt(0) == '\ufffd') { + var ret = []; + + for (var i = 1, length = ''; i < data.length; i++) { + if (data.charAt(i) == '\ufffd') { + ret.push(parser.decodePacket(data.substr(i + 1).substr(0, length))); + i += Number(length) + 1; + length = ''; + } else { + length += data.charAt(i); + } + } + + return ret; + } else { + return [parser.decodePacket(data)]; + } + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.Transport = Transport; + + /** + * This is the transport template for all supported transport methods. + * + * @constructor + * @api public + */ + + function Transport (socket, sessid) { + this.socket = socket; + this.sessid = sessid; + }; + + /** + * Apply EventEmitter mixin. + */ + + io.util.mixin(Transport, io.EventEmitter); + + + /** + * Indicates whether heartbeats is enabled for this transport + * + * @api private + */ + + Transport.prototype.heartbeats = function () { + return true; + }; + + /** + * Handles the response from the server. When a new response is received + * it will automatically update the timeout, decode the message and + * forwards the response to the onMessage function for further processing. + * + * @param {String} data Response from the server. + * @api private + */ + + Transport.prototype.onData = function (data) { + this.clearCloseTimeout(); + + // If the connection in currently open (or in a reopening state) reset the close + // timeout since we have just received data. This check is necessary so + // that we don't reset the timeout on an explicitly disconnected connection. + if (this.socket.connected || this.socket.connecting || this.socket.reconnecting) { + this.setCloseTimeout(); + } + + if (data !== '') { + // todo: we should only do decodePayload for xhr transports + var msgs = io.parser.decodePayload(data); + + if (msgs && msgs.length) { + for (var i = 0, l = msgs.length; i < l; i++) { + this.onPacket(msgs[i]); + } + } + } + + return this; + }; + + /** + * Handles packets. + * + * @api private + */ + + Transport.prototype.onPacket = function (packet) { + this.socket.setHeartbeatTimeout(); + + if (packet.type == 'heartbeat') { + return this.onHeartbeat(); + } + + if (packet.type == 'connect' && packet.endpoint == '') { + this.onConnect(); + } + + if (packet.type == 'error' && packet.advice == 'reconnect') { + this.isOpen = false; + } + + this.socket.onPacket(packet); + + return this; + }; + + /** + * Sets close timeout + * + * @api private + */ + + Transport.prototype.setCloseTimeout = function () { + if (!this.closeTimeout) { + var self = this; + + this.closeTimeout = setTimeout(function () { + self.onDisconnect(); + }, this.socket.closeTimeout); + } + }; + + /** + * Called when transport disconnects. + * + * @api private + */ + + Transport.prototype.onDisconnect = function () { + if (this.isOpen) this.close(); + this.clearTimeouts(); + this.socket.onDisconnect(); + return this; + }; + + /** + * Called when transport connects + * + * @api private + */ + + Transport.prototype.onConnect = function () { + this.socket.onConnect(); + return this; + }; + + /** + * Clears close timeout + * + * @api private + */ + + Transport.prototype.clearCloseTimeout = function () { + if (this.closeTimeout) { + clearTimeout(this.closeTimeout); + this.closeTimeout = null; + } + }; + + /** + * Clear timeouts + * + * @api private + */ + + Transport.prototype.clearTimeouts = function () { + this.clearCloseTimeout(); + + if (this.reopenTimeout) { + clearTimeout(this.reopenTimeout); + } + }; + + /** + * Sends a packet + * + * @param {Object} packet object. + * @api private + */ + + Transport.prototype.packet = function (packet) { + this.send(io.parser.encodePacket(packet)); + }; + + /** + * Send the received heartbeat message back to server. So the server + * knows we are still connected. + * + * @param {String} heartbeat Heartbeat response from the server. + * @api private + */ + + Transport.prototype.onHeartbeat = function (heartbeat) { + this.packet({ type: 'heartbeat' }); + }; + + /** + * Called when the transport opens. + * + * @api private + */ + + Transport.prototype.onOpen = function () { + this.isOpen = true; + this.clearCloseTimeout(); + this.socket.onOpen(); + }; + + /** + * Notifies the base when the connection with the Socket.IO server + * has been disconnected. + * + * @api private + */ + + Transport.prototype.onClose = function () { + var self = this; + + /* FIXME: reopen delay causing a infinit loop + this.reopenTimeout = setTimeout(function () { + self.open(); + }, this.socket.options['reopen delay']);*/ + + this.isOpen = false; + this.socket.onClose(); + this.onDisconnect(); + }; + + /** + * Generates a connection url based on the Socket.IO URL Protocol. + * See for more details. + * + * @returns {String} Connection url + * @api private + */ + + Transport.prototype.prepareUrl = function () { + var options = this.socket.options; + + return this.scheme() + '://' + + options.host + ':' + options.port + '/' + + options.resource + '/' + io.protocol + + '/' + this.name + '/' + this.sessid; + }; + + /** + * Checks if the transport is ready to start a connection. + * + * @param {Socket} socket The socket instance that needs a transport + * @param {Function} fn The callback + * @api private + */ + + Transport.prototype.ready = function (socket, fn) { + fn.call(this); + }; +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + */ + + exports.Socket = Socket; + + /** + * Create a new `Socket.IO client` which can establish a persistent + * connection with a Socket.IO enabled server. + * + * @api public + */ + + function Socket (options) { + this.options = { + port: 80 + , secure: false + , document: 'document' in global ? document : false + , resource: 'socket.io' + , transports: io.transports + , 'connect timeout': 10000 + , 'try multiple transports': true + , 'reconnect': true + , 'reconnection delay': 500 + , 'reconnection limit': Infinity + , 'reopen delay': 3000 + , 'max reconnection attempts': 10 + , 'sync disconnect on unload': false + , 'auto connect': true + , 'flash policy port': 10843 + , 'manualFlush': false + }; + + io.util.merge(this.options, options); + + this.connected = false; + this.open = false; + this.connecting = false; + this.reconnecting = false; + this.namespaces = {}; + this.buffer = []; + this.doBuffer = false; + + if (this.options['sync disconnect on unload'] && + (!this.isXDomain() || io.util.ua.hasCORS)) { + var self = this; + io.util.on(global, 'beforeunload', function () { + self.disconnectSync(); + }, false); + } + + if (this.options['auto connect']) { + this.connect(); + } +}; + + /** + * Apply EventEmitter mixin. + */ + + io.util.mixin(Socket, io.EventEmitter); + + /** + * Returns a namespace listener/emitter for this socket + * + * @api public + */ + + Socket.prototype.of = function (name) { + if (!this.namespaces[name]) { + this.namespaces[name] = new io.SocketNamespace(this, name); + + if (name !== '') { + this.namespaces[name].packet({ type: 'connect' }); + } + } + + return this.namespaces[name]; + }; + + /** + * Emits the given event to the Socket and all namespaces + * + * @api private + */ + + Socket.prototype.publish = function () { + this.emit.apply(this, arguments); + + var nsp; + + for (var i in this.namespaces) { + if (this.namespaces.hasOwnProperty(i)) { + nsp = this.of(i); + nsp.$emit.apply(nsp, arguments); + } + } + }; + + /** + * Performs the handshake + * + * @api private + */ + + function empty () { }; + + Socket.prototype.handshake = function (fn) { + var self = this + , options = this.options; + + function complete (data) { + if (data instanceof Error) { + self.connecting = false; + self.onError(data.message); + } else { + fn.apply(null, data.split(':')); + } + }; + + var url = [ + 'http' + (options.secure ? 's' : '') + ':/' + , options.host + ':' + options.port + , options.resource + , io.protocol + , io.util.query(this.options.query, 't=' + +new Date) + ].join('/'); + + if (this.isXDomain() && !io.util.ua.hasCORS) { + var insertAt = document.getElementsByTagName('script')[0] + , script = document.createElement('script'); + + script.src = url + '&jsonp=' + io.j.length; + insertAt.parentNode.insertBefore(script, insertAt); + + io.j.push(function (data) { + complete(data); + script.parentNode.removeChild(script); + }); + } else { + var xhr = io.util.request(); + + xhr.open('GET', url, true); + if (this.isXDomain()) { + xhr.withCredentials = true; + } + xhr.onreadystatechange = function () { + if (xhr.readyState == 4) { + xhr.onreadystatechange = empty; + + if (xhr.status == 200) { + complete(xhr.responseText); + } else if (xhr.status == 403) { + self.onError(xhr.responseText); + } else { + self.connecting = false; + !self.reconnecting && self.onError(xhr.responseText); + } + } + }; + xhr.send(null); + } + }; + + /** + * Find an available transport based on the options supplied in the constructor. + * + * @api private + */ + + Socket.prototype.getTransport = function (override) { + var transports = override || this.transports, match; + + for (var i = 0, transport; transport = transports[i]; i++) { + if (io.Transport[transport] + && io.Transport[transport].check(this) + && (!this.isXDomain() || io.Transport[transport].xdomainCheck(this))) { + return new io.Transport[transport](this, this.sessionid); + } + } + + return null; + }; + + /** + * Connects to the server. + * + * @param {Function} [fn] Callback. + * @returns {io.Socket} + * @api public + */ + + Socket.prototype.connect = function (fn) { + if (this.connecting) { + return this; + } + + var self = this; + self.connecting = true; + + this.handshake(function (sid, heartbeat, close, transports) { + self.sessionid = sid; + self.closeTimeout = close * 1000; + self.heartbeatTimeout = heartbeat * 1000; + if(!self.transports) + self.transports = self.origTransports = (transports ? io.util.intersect( + transports.split(',') + , self.options.transports + ) : self.options.transports); + + self.setHeartbeatTimeout(); + + function connect (transports){ + if (self.transport) self.transport.clearTimeouts(); + + self.transport = self.getTransport(transports); + if (!self.transport) return self.publish('connect_failed'); + + // once the transport is ready + self.transport.ready(self, function () { + self.connecting = true; + self.publish('connecting', self.transport.name); + self.transport.open(); + + if (self.options['connect timeout']) { + self.connectTimeoutTimer = setTimeout(function () { + if (!self.connected) { + self.connecting = false; + + if (self.options['try multiple transports']) { + var remaining = self.transports; + + while (remaining.length > 0 && remaining.splice(0,1)[0] != + self.transport.name) {} + + if (remaining.length){ + connect(remaining); + } else { + self.publish('connect_failed'); + } + } + } + }, self.options['connect timeout']); + } + }); + } + + connect(self.transports); + + self.once('connect', function (){ + clearTimeout(self.connectTimeoutTimer); + + fn && typeof fn == 'function' && fn(); + }); + }); + + return this; + }; + + /** + * Clears and sets a new heartbeat timeout using the value given by the + * server during the handshake. + * + * @api private + */ + + Socket.prototype.setHeartbeatTimeout = function () { + clearTimeout(this.heartbeatTimeoutTimer); + if(this.transport && !this.transport.heartbeats()) return; + + var self = this; + this.heartbeatTimeoutTimer = setTimeout(function () { + self.transport.onClose(); + }, this.heartbeatTimeout); + }; + + /** + * Sends a message. + * + * @param {Object} data packet. + * @returns {io.Socket} + * @api public + */ + + Socket.prototype.packet = function (data) { + if (this.connected && !this.doBuffer) { + this.transport.packet(data); + } else { + this.buffer.push(data); + } + + return this; + }; + + /** + * Sets buffer state + * + * @api private + */ + + Socket.prototype.setBuffer = function (v) { + this.doBuffer = v; + + if (!v && this.connected && this.buffer.length) { + if (!this.options['manualFlush']) { + this.flushBuffer(); + } + } + }; + + /** + * Flushes the buffer data over the wire. + * To be invoked manually when 'manualFlush' is set to true. + * + * @api public + */ + + Socket.prototype.flushBuffer = function() { + this.transport.payload(this.buffer); + this.buffer = []; + }; + + + /** + * Disconnect the established connect. + * + * @returns {io.Socket} + * @api public + */ + + Socket.prototype.disconnect = function () { + if (this.connected || this.connecting) { + if (this.open) { + this.of('').packet({ type: 'disconnect' }); + } + + // handle disconnection immediately + this.onDisconnect('booted'); + } + + return this; + }; + + /** + * Disconnects the socket with a sync XHR. + * + * @api private + */ + + Socket.prototype.disconnectSync = function () { + // ensure disconnection + var xhr = io.util.request(); + var uri = [ + 'http' + (this.options.secure ? 's' : '') + ':/' + , this.options.host + ':' + this.options.port + , this.options.resource + , io.protocol + , '' + , this.sessionid + ].join('/') + '/?disconnect=1'; + + xhr.open('GET', uri, false); + xhr.send(null); + + // handle disconnection immediately + this.onDisconnect('booted'); + }; + + /** + * Check if we need to use cross domain enabled transports. Cross domain would + * be a different port or different domain name. + * + * @returns {Boolean} + * @api private + */ + + Socket.prototype.isXDomain = function () { + + var port = global.location.port || + ('https:' == global.location.protocol ? 443 : 80); + + return this.options.host !== global.location.hostname + || this.options.port != port; + }; + + /** + * Called upon handshake. + * + * @api private + */ + + Socket.prototype.onConnect = function () { + if (!this.connected) { + this.connected = true; + this.connecting = false; + if (!this.doBuffer) { + // make sure to flush the buffer + this.setBuffer(false); + } + this.emit('connect'); + } + }; + + /** + * Called when the transport opens + * + * @api private + */ + + Socket.prototype.onOpen = function () { + this.open = true; + }; + + /** + * Called when the transport closes. + * + * @api private + */ + + Socket.prototype.onClose = function () { + this.open = false; + clearTimeout(this.heartbeatTimeoutTimer); + }; + + /** + * Called when the transport first opens a connection + * + * @param text + */ + + Socket.prototype.onPacket = function (packet) { + this.of(packet.endpoint).onPacket(packet); + }; + + /** + * Handles an error. + * + * @api private + */ + + Socket.prototype.onError = function (err) { + if (err && err.advice) { + if (err.advice === 'reconnect' && (this.connected || this.connecting)) { + this.disconnect(); + if (this.options.reconnect) { + this.reconnect(); + } + } + } + + this.publish('error', err && err.reason ? err.reason : err); + }; + + /** + * Called when the transport disconnects. + * + * @api private + */ + + Socket.prototype.onDisconnect = function (reason) { + var wasConnected = this.connected + , wasConnecting = this.connecting; + + this.connected = false; + this.connecting = false; + this.open = false; + + if (wasConnected || wasConnecting) { + this.transport.close(); + this.transport.clearTimeouts(); + if (wasConnected) { + this.publish('disconnect', reason); + + if ('booted' != reason && this.options.reconnect && !this.reconnecting) { + this.reconnect(); + } + } + } + }; + + /** + * Called upon reconnection. + * + * @api private + */ + + Socket.prototype.reconnect = function () { + this.reconnecting = true; + this.reconnectionAttempts = 0; + this.reconnectionDelay = this.options['reconnection delay']; + + var self = this + , maxAttempts = this.options['max reconnection attempts'] + , tryMultiple = this.options['try multiple transports'] + , limit = this.options['reconnection limit']; + + function reset () { + if (self.connected) { + for (var i in self.namespaces) { + if (self.namespaces.hasOwnProperty(i) && '' !== i) { + self.namespaces[i].packet({ type: 'connect' }); + } + } + self.publish('reconnect', self.transport.name, self.reconnectionAttempts); + } + + clearTimeout(self.reconnectionTimer); + + self.removeListener('connect_failed', maybeReconnect); + self.removeListener('connect', maybeReconnect); + + self.reconnecting = false; + + delete self.reconnectionAttempts; + delete self.reconnectionDelay; + delete self.reconnectionTimer; + delete self.redoTransports; + + self.options['try multiple transports'] = tryMultiple; + }; + + function maybeReconnect () { + if (!self.reconnecting) { + return; + } + + if (self.connected) { + return reset(); + }; + + if (self.connecting && self.reconnecting) { + return self.reconnectionTimer = setTimeout(maybeReconnect, 1000); + } + + if (self.reconnectionAttempts++ >= maxAttempts) { + if (!self.redoTransports) { + self.on('connect_failed', maybeReconnect); + self.options['try multiple transports'] = true; + self.transports = self.origTransports; + self.transport = self.getTransport(); + self.redoTransports = true; + self.connect(); + } else { + self.publish('reconnect_failed'); + reset(); + } + } else { + if (self.reconnectionDelay < limit) { + self.reconnectionDelay *= 2; // exponential back off + } + + self.connect(); + self.publish('reconnecting', self.reconnectionDelay, self.reconnectionAttempts); + self.reconnectionTimer = setTimeout(maybeReconnect, self.reconnectionDelay); + } + }; + + this.options['try multiple transports'] = false; + this.reconnectionTimer = setTimeout(maybeReconnect, this.reconnectionDelay); + + this.on('connect', maybeReconnect); + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.SocketNamespace = SocketNamespace; + + /** + * Socket namespace constructor. + * + * @constructor + * @api public + */ + + function SocketNamespace (socket, name) { + this.socket = socket; + this.name = name || ''; + this.flags = {}; + this.json = new Flag(this, 'json'); + this.ackPackets = 0; + this.acks = {}; + }; + + /** + * Apply EventEmitter mixin. + */ + + io.util.mixin(SocketNamespace, io.EventEmitter); + + /** + * Copies emit since we override it + * + * @api private + */ + + SocketNamespace.prototype.$emit = io.EventEmitter.prototype.emit; + + /** + * Creates a new namespace, by proxying the request to the socket. This + * allows us to use the synax as we do on the server. + * + * @api public + */ + + SocketNamespace.prototype.of = function () { + return this.socket.of.apply(this.socket, arguments); + }; + + /** + * Sends a packet. + * + * @api private + */ + + SocketNamespace.prototype.packet = function (packet) { + packet.endpoint = this.name; + this.socket.packet(packet); + this.flags = {}; + return this; + }; + + /** + * Sends a message + * + * @api public + */ + + SocketNamespace.prototype.send = function (data, fn) { + var packet = { + type: this.flags.json ? 'json' : 'message' + , data: data + }; + + if ('function' == typeof fn) { + packet.id = ++this.ackPackets; + packet.ack = true; + this.acks[packet.id] = fn; + } + + return this.packet(packet); + }; + + /** + * Emits an event + * + * @api public + */ + + SocketNamespace.prototype.emit = function (name) { + var args = Array.prototype.slice.call(arguments, 1) + , lastArg = args[args.length - 1] + , packet = { + type: 'event' + , name: name + }; + + if ('function' == typeof lastArg) { + packet.id = ++this.ackPackets; + packet.ack = 'data'; + this.acks[packet.id] = lastArg; + args = args.slice(0, args.length - 1); + } + + packet.args = args; + + return this.packet(packet); + }; + + /** + * Disconnects the namespace + * + * @api private + */ + + SocketNamespace.prototype.disconnect = function () { + if (this.name === '') { + this.socket.disconnect(); + } else { + this.packet({ type: 'disconnect' }); + this.$emit('disconnect'); + } + + return this; + }; + + /** + * Handles a packet + * + * @api private + */ + + SocketNamespace.prototype.onPacket = function (packet) { + var self = this; + + function ack () { + self.packet({ + type: 'ack' + , args: io.util.toArray(arguments) + , ackId: packet.id + }); + }; + + switch (packet.type) { + case 'connect': + this.$emit('connect'); + break; + + case 'disconnect': + if (this.name === '') { + this.socket.onDisconnect(packet.reason || 'booted'); + } else { + this.$emit('disconnect', packet.reason); + } + break; + + case 'message': + case 'json': + var params = ['message', packet.data]; + + if (packet.ack == 'data') { + params.push(ack); + } else if (packet.ack) { + this.packet({ type: 'ack', ackId: packet.id }); + } + + this.$emit.apply(this, params); + break; + + case 'event': + var params = [packet.name].concat(packet.args); + + if (packet.ack == 'data') + params.push(ack); + + this.$emit.apply(this, params); + break; + + case 'ack': + if (this.acks[packet.ackId]) { + this.acks[packet.ackId].apply(this, packet.args); + delete this.acks[packet.ackId]; + } + break; + + case 'error': + if (packet.advice){ + this.socket.onError(packet); + } else { + if (packet.reason == 'unauthorized') { + this.$emit('connect_failed', packet.reason); + } else { + this.$emit('error', packet.reason); + } + } + break; + } + }; + + /** + * Flag interface. + * + * @api private + */ + + function Flag (nsp, name) { + this.namespace = nsp; + this.name = name; + }; + + /** + * Send a message + * + * @api public + */ + + Flag.prototype.send = function () { + this.namespace.flags[this.name] = true; + this.namespace.send.apply(this.namespace, arguments); + }; + + /** + * Emit an event + * + * @api public + */ + + Flag.prototype.emit = function () { + this.namespace.flags[this.name] = true; + this.namespace.emit.apply(this.namespace, arguments); + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + */ + + exports.websocket = WS; + + /** + * The WebSocket transport uses the HTML5 WebSocket API to establish an + * persistent connection with the Socket.IO server. This transport will also + * be inherited by the FlashSocket fallback as it provides a API compatible + * polyfill for the WebSockets. + * + * @constructor + * @extends {io.Transport} + * @api public + */ + + function WS (socket) { + io.Transport.apply(this, arguments); + }; + + /** + * Inherits from Transport. + */ + + io.util.inherit(WS, io.Transport); + + /** + * Transport name + * + * @api public + */ + + WS.prototype.name = 'websocket'; + + /** + * Initializes a new `WebSocket` connection with the Socket.IO server. We attach + * all the appropriate listeners to handle the responses from the server. + * + * @returns {Transport} + * @api public + */ + + WS.prototype.open = function () { + var query = io.util.query(this.socket.options.query) + , self = this + , Socket + + + if (!Socket) { + Socket = global.MozWebSocket || global.WebSocket; + } + + this.websocket = new Socket(this.prepareUrl() + query); + + this.websocket.onopen = function () { + self.onOpen(); + self.socket.setBuffer(false); + }; + this.websocket.onmessage = function (ev) { + self.onData(ev.data); + }; + this.websocket.onclose = function () { + self.onClose(); + self.socket.setBuffer(true); + }; + this.websocket.onerror = function (e) { + self.onError(e); + }; + + return this; + }; + + /** + * Send a message to the Socket.IO server. The message will automatically be + * encoded in the correct message format. + * + * @returns {Transport} + * @api public + */ + + // Do to a bug in the current IDevices browser, we need to wrap the send in a + // setTimeout, when they resume from sleeping the browser will crash if + // we don't allow the browser time to detect the socket has been closed + if (io.util.ua.iDevice) { + WS.prototype.send = function (data) { + var self = this; + setTimeout(function() { + self.websocket.send(data); + },0); + return this; + }; + } else { + WS.prototype.send = function (data) { + this.websocket.send(data); + return this; + }; + } + + /** + * Payload + * + * @api private + */ + + WS.prototype.payload = function (arr) { + for (var i = 0, l = arr.length; i < l; i++) { + this.packet(arr[i]); + } + return this; + }; + + /** + * Disconnect the established `WebSocket` connection. + * + * @returns {Transport} + * @api public + */ + + WS.prototype.close = function () { + this.websocket.close(); + return this; + }; + + /** + * Handle the errors that `WebSocket` might be giving when we + * are attempting to connect or send messages. + * + * @param {Error} e The error. + * @api private + */ + + WS.prototype.onError = function (e) { + this.socket.onError(e); + }; + + /** + * Returns the appropriate scheme for the URI generation. + * + * @api private + */ + WS.prototype.scheme = function () { + return this.socket.options.secure ? 'wss' : 'ws'; + }; + + /** + * Checks if the browser has support for native `WebSockets` and that + * it's not the polyfill created for the FlashSocket transport. + * + * @return {Boolean} + * @api public + */ + + WS.check = function () { + return ('WebSocket' in global && !('__addTask' in WebSocket)) + || 'MozWebSocket' in global; + }; + + /** + * Check if the `WebSocket` transport support cross domain communications. + * + * @returns {Boolean} + * @api public + */ + + WS.xdomainCheck = function () { + return true; + }; + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('websocket'); + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.flashsocket = Flashsocket; + + /** + * The FlashSocket transport. This is a API wrapper for the HTML5 WebSocket + * specification. It uses a .swf file to communicate with the server. If you want + * to serve the .swf file from a other server than where the Socket.IO script is + * coming from you need to use the insecure version of the .swf. More information + * about this can be found on the github page. + * + * @constructor + * @extends {io.Transport.websocket} + * @api public + */ + + function Flashsocket () { + io.Transport.websocket.apply(this, arguments); + }; + + /** + * Inherits from Transport. + */ + + io.util.inherit(Flashsocket, io.Transport.websocket); + + /** + * Transport name + * + * @api public + */ + + Flashsocket.prototype.name = 'flashsocket'; + + /** + * Disconnect the established `FlashSocket` connection. This is done by adding a + * new task to the FlashSocket. The rest will be handled off by the `WebSocket` + * transport. + * + * @returns {Transport} + * @api public + */ + + Flashsocket.prototype.open = function () { + var self = this + , args = arguments; + + WebSocket.__addTask(function () { + io.Transport.websocket.prototype.open.apply(self, args); + }); + return this; + }; + + /** + * Sends a message to the Socket.IO server. This is done by adding a new + * task to the FlashSocket. The rest will be handled off by the `WebSocket` + * transport. + * + * @returns {Transport} + * @api public + */ + + Flashsocket.prototype.send = function () { + var self = this, args = arguments; + WebSocket.__addTask(function () { + io.Transport.websocket.prototype.send.apply(self, args); + }); + return this; + }; + + /** + * Disconnects the established `FlashSocket` connection. + * + * @returns {Transport} + * @api public + */ + + Flashsocket.prototype.close = function () { + WebSocket.__tasks.length = 0; + io.Transport.websocket.prototype.close.call(this); + return this; + }; + + /** + * The WebSocket fall back needs to append the flash container to the body + * element, so we need to make sure we have access to it. Or defer the call + * until we are sure there is a body element. + * + * @param {Socket} socket The socket instance that needs a transport + * @param {Function} fn The callback + * @api private + */ + + Flashsocket.prototype.ready = function (socket, fn) { + function init () { + var options = socket.options + , port = options['flash policy port'] + , path = [ + 'http' + (options.secure ? 's' : '') + ':/' + , options.host + ':' + options.port + , options.resource + , 'static/flashsocket' + , 'WebSocketMain' + (socket.isXDomain() ? 'Insecure' : '') + '.swf' + ]; + + // Only start downloading the swf file when the checked that this browser + // actually supports it + if (!Flashsocket.loaded) { + if (typeof WEB_SOCKET_SWF_LOCATION === 'undefined') { + // Set the correct file based on the XDomain settings + WEB_SOCKET_SWF_LOCATION = path.join('/'); + } + + if (port !== 843) { + WebSocket.loadFlashPolicyFile('xmlsocket://' + options.host + ':' + port); + } + + WebSocket.__initialize(); + Flashsocket.loaded = true; + } + + fn.call(self); + } + + var self = this; + if (document.body) return init(); + + io.util.load(init); + }; + + /** + * Check if the FlashSocket transport is supported as it requires that the Adobe + * Flash Player plug-in version `10.0.0` or greater is installed. And also check if + * the polyfill is correctly loaded. + * + * @returns {Boolean} + * @api public + */ + + Flashsocket.check = function () { + if ( + typeof WebSocket == 'undefined' + || !('__initialize' in WebSocket) || !swfobject + ) return false; + + return swfobject.getFlashPlayerVersion().major >= 10; + }; + + /** + * Check if the FlashSocket transport can be used as cross domain / cross origin + * transport. Because we can't see which type (secure or insecure) of .swf is used + * we will just return true. + * + * @returns {Boolean} + * @api public + */ + + Flashsocket.xdomainCheck = function () { + return true; + }; + + /** + * Disable AUTO_INITIALIZATION + */ + + if (typeof window != 'undefined') { + WEB_SOCKET_DISABLE_AUTO_INITIALIZATION = true; + } + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('flashsocket'); +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); +/* SWFObject v2.2 + is released under the MIT License +*/ +if ('undefined' != typeof window) { +var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O[(['Active'].concat('Object').join('X'))]!=D){try{var ad=new window[(['Active'].concat('Object').join('X'))](W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y0){for(var af=0;af0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad'}}aa.outerHTML='"+af+"";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab +// License: New BSD License +// Reference: http://dev.w3.org/html5/websockets/ +// Reference: http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol + +(function() { + + if ('undefined' == typeof window || window.WebSocket) return; + + var console = window.console; + if (!console || !console.log || !console.error) { + console = {log: function(){ }, error: function(){ }}; + } + + if (!swfobject.hasFlashPlayerVersion("10.0.0")) { + console.error("Flash Player >= 10.0.0 is required."); + return; + } + if (location.protocol == "file:") { + console.error( + "WARNING: web-socket-js doesn't work in file:///... URL " + + "unless you set Flash Security Settings properly. " + + "Open the page via Web server i.e. http://..."); + } + + /** + * This class represents a faux web socket. + * @param {string} url + * @param {array or string} protocols + * @param {string} proxyHost + * @param {int} proxyPort + * @param {string} headers + */ + WebSocket = function(url, protocols, proxyHost, proxyPort, headers) { + var self = this; + self.__id = WebSocket.__nextId++; + WebSocket.__instances[self.__id] = self; + self.readyState = WebSocket.CONNECTING; + self.bufferedAmount = 0; + self.__events = {}; + if (!protocols) { + protocols = []; + } else if (typeof protocols == "string") { + protocols = [protocols]; + } + // Uses setTimeout() to make sure __createFlash() runs after the caller sets ws.onopen etc. + // Otherwise, when onopen fires immediately, onopen is called before it is set. + setTimeout(function() { + WebSocket.__addTask(function() { + WebSocket.__flash.create( + self.__id, url, protocols, proxyHost || null, proxyPort || 0, headers || null); + }); + }, 0); + }; + + /** + * Send data to the web socket. + * @param {string} data The data to send to the socket. + * @return {boolean} True for success, false for failure. + */ + WebSocket.prototype.send = function(data) { + if (this.readyState == WebSocket.CONNECTING) { + throw "INVALID_STATE_ERR: Web Socket connection has not been established"; + } + // We use encodeURIComponent() here, because FABridge doesn't work if + // the argument includes some characters. We don't use escape() here + // because of this: + // https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Functions#escape_and_unescape_Functions + // But it looks decodeURIComponent(encodeURIComponent(s)) doesn't + // preserve all Unicode characters either e.g. "\uffff" in Firefox. + // Note by wtritch: Hopefully this will not be necessary using ExternalInterface. Will require + // additional testing. + var result = WebSocket.__flash.send(this.__id, encodeURIComponent(data)); + if (result < 0) { // success + return true; + } else { + this.bufferedAmount += result; + return false; + } + }; + + /** + * Close this web socket gracefully. + */ + WebSocket.prototype.close = function() { + if (this.readyState == WebSocket.CLOSED || this.readyState == WebSocket.CLOSING) { + return; + } + this.readyState = WebSocket.CLOSING; + WebSocket.__flash.close(this.__id); + }; + + /** + * Implementation of {@link DOM 2 EventTarget Interface} + * + * @param {string} type + * @param {function} listener + * @param {boolean} useCapture + * @return void + */ + WebSocket.prototype.addEventListener = function(type, listener, useCapture) { + if (!(type in this.__events)) { + this.__events[type] = []; + } + this.__events[type].push(listener); + }; + + /** + * Implementation of {@link DOM 2 EventTarget Interface} + * + * @param {string} type + * @param {function} listener + * @param {boolean} useCapture + * @return void + */ + WebSocket.prototype.removeEventListener = function(type, listener, useCapture) { + if (!(type in this.__events)) return; + var events = this.__events[type]; + for (var i = events.length - 1; i >= 0; --i) { + if (events[i] === listener) { + events.splice(i, 1); + break; + } + } + }; + + /** + * Implementation of {@link DOM 2 EventTarget Interface} + * + * @param {Event} event + * @return void + */ + WebSocket.prototype.dispatchEvent = function(event) { + var events = this.__events[event.type] || []; + for (var i = 0; i < events.length; ++i) { + events[i](event); + } + var handler = this["on" + event.type]; + if (handler) handler(event); + }; + + /** + * Handles an event from Flash. + * @param {Object} flashEvent + */ + WebSocket.prototype.__handleEvent = function(flashEvent) { + if ("readyState" in flashEvent) { + this.readyState = flashEvent.readyState; + } + if ("protocol" in flashEvent) { + this.protocol = flashEvent.protocol; + } + + var jsEvent; + if (flashEvent.type == "open" || flashEvent.type == "error") { + jsEvent = this.__createSimpleEvent(flashEvent.type); + } else if (flashEvent.type == "close") { + // TODO implement jsEvent.wasClean + jsEvent = this.__createSimpleEvent("close"); + } else if (flashEvent.type == "message") { + var data = decodeURIComponent(flashEvent.message); + jsEvent = this.__createMessageEvent("message", data); + } else { + throw "unknown event type: " + flashEvent.type; + } + + this.dispatchEvent(jsEvent); + }; + + WebSocket.prototype.__createSimpleEvent = function(type) { + if (document.createEvent && window.Event) { + var event = document.createEvent("Event"); + event.initEvent(type, false, false); + return event; + } else { + return {type: type, bubbles: false, cancelable: false}; + } + }; + + WebSocket.prototype.__createMessageEvent = function(type, data) { + if (document.createEvent && window.MessageEvent && !window.opera) { + var event = document.createEvent("MessageEvent"); + event.initMessageEvent("message", false, false, data, null, null, window, null); + return event; + } else { + // IE and Opera, the latter one truncates the data parameter after any 0x00 bytes. + return {type: type, data: data, bubbles: false, cancelable: false}; + } + }; + + /** + * Define the WebSocket readyState enumeration. + */ + WebSocket.CONNECTING = 0; + WebSocket.OPEN = 1; + WebSocket.CLOSING = 2; + WebSocket.CLOSED = 3; + + WebSocket.__flash = null; + WebSocket.__instances = {}; + WebSocket.__tasks = []; + WebSocket.__nextId = 0; + + /** + * Load a new flash security policy file. + * @param {string} url + */ + WebSocket.loadFlashPolicyFile = function(url){ + WebSocket.__addTask(function() { + WebSocket.__flash.loadManualPolicyFile(url); + }); + }; + + /** + * Loads WebSocketMain.swf and creates WebSocketMain object in Flash. + */ + WebSocket.__initialize = function() { + if (WebSocket.__flash) return; + + if (WebSocket.__swfLocation) { + // For backword compatibility. + window.WEB_SOCKET_SWF_LOCATION = WebSocket.__swfLocation; + } + if (!window.WEB_SOCKET_SWF_LOCATION) { + console.error("[WebSocket] set WEB_SOCKET_SWF_LOCATION to location of WebSocketMain.swf"); + return; + } + var container = document.createElement("div"); + container.id = "webSocketContainer"; + // Hides Flash box. We cannot use display: none or visibility: hidden because it prevents + // Flash from loading at least in IE. So we move it out of the screen at (-100, -100). + // But this even doesn't work with Flash Lite (e.g. in Droid Incredible). So with Flash + // Lite, we put it at (0, 0). This shows 1x1 box visible at left-top corner but this is + // the best we can do as far as we know now. + container.style.position = "absolute"; + if (WebSocket.__isFlashLite()) { + container.style.left = "0px"; + container.style.top = "0px"; + } else { + container.style.left = "-100px"; + container.style.top = "-100px"; + } + var holder = document.createElement("div"); + holder.id = "webSocketFlash"; + container.appendChild(holder); + document.body.appendChild(container); + // See this article for hasPriority: + // http://help.adobe.com/en_US/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-7ffd.html + swfobject.embedSWF( + WEB_SOCKET_SWF_LOCATION, + "webSocketFlash", + "1" /* width */, + "1" /* height */, + "10.0.0" /* SWF version */, + null, + null, + {hasPriority: true, swliveconnect : true, allowScriptAccess: "always"}, + null, + function(e) { + if (!e.success) { + console.error("[WebSocket] swfobject.embedSWF failed"); + } + }); + }; + + /** + * Called by Flash to notify JS that it's fully loaded and ready + * for communication. + */ + WebSocket.__onFlashInitialized = function() { + // We need to set a timeout here to avoid round-trip calls + // to flash during the initialization process. + setTimeout(function() { + WebSocket.__flash = document.getElementById("webSocketFlash"); + WebSocket.__flash.setCallerUrl(location.href); + WebSocket.__flash.setDebug(!!window.WEB_SOCKET_DEBUG); + for (var i = 0; i < WebSocket.__tasks.length; ++i) { + WebSocket.__tasks[i](); + } + WebSocket.__tasks = []; + }, 0); + }; + + /** + * Called by Flash to notify WebSockets events are fired. + */ + WebSocket.__onFlashEvent = function() { + setTimeout(function() { + try { + // Gets events using receiveEvents() instead of getting it from event object + // of Flash event. This is to make sure to keep message order. + // It seems sometimes Flash events don't arrive in the same order as they are sent. + var events = WebSocket.__flash.receiveEvents(); + for (var i = 0; i < events.length; ++i) { + WebSocket.__instances[events[i].webSocketId].__handleEvent(events[i]); + } + } catch (e) { + console.error(e); + } + }, 0); + return true; + }; + + // Called by Flash. + WebSocket.__log = function(message) { + console.log(decodeURIComponent(message)); + }; + + // Called by Flash. + WebSocket.__error = function(message) { + console.error(decodeURIComponent(message)); + }; + + WebSocket.__addTask = function(task) { + if (WebSocket.__flash) { + task(); + } else { + WebSocket.__tasks.push(task); + } + }; + + /** + * Test if the browser is running flash lite. + * @return {boolean} True if flash lite is running, false otherwise. + */ + WebSocket.__isFlashLite = function() { + if (!window.navigator || !window.navigator.mimeTypes) { + return false; + } + var mimeType = window.navigator.mimeTypes["application/x-shockwave-flash"]; + if (!mimeType || !mimeType.enabledPlugin || !mimeType.enabledPlugin.filename) { + return false; + } + return mimeType.enabledPlugin.filename.match(/flashlite/i) ? true : false; + }; + + if (!window.WEB_SOCKET_DISABLE_AUTO_INITIALIZATION) { + if (window.addEventListener) { + window.addEventListener("load", function(){ + WebSocket.__initialize(); + }, false); + } else { + window.attachEvent("onload", function(){ + WebSocket.__initialize(); + }); + } + } + +})(); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + * + * @api public + */ + + exports.XHR = XHR; + + /** + * XHR constructor + * + * @costructor + * @api public + */ + + function XHR (socket) { + if (!socket) return; + + io.Transport.apply(this, arguments); + this.sendBuffer = []; + }; + + /** + * Inherits from Transport. + */ + + io.util.inherit(XHR, io.Transport); + + /** + * Establish a connection + * + * @returns {Transport} + * @api public + */ + + XHR.prototype.open = function () { + this.socket.setBuffer(false); + this.onOpen(); + this.get(); + + // we need to make sure the request succeeds since we have no indication + // whether the request opened or not until it succeeded. + this.setCloseTimeout(); + + return this; + }; + + /** + * Check if we need to send data to the Socket.IO server, if we have data in our + * buffer we encode it and forward it to the `post` method. + * + * @api private + */ + + XHR.prototype.payload = function (payload) { + var msgs = []; + + for (var i = 0, l = payload.length; i < l; i++) { + msgs.push(io.parser.encodePacket(payload[i])); + } + + this.send(io.parser.encodePayload(msgs)); + }; + + /** + * Send data to the Socket.IO server. + * + * @param data The message + * @returns {Transport} + * @api public + */ + + XHR.prototype.send = function (data) { + this.post(data); + return this; + }; + + /** + * Posts a encoded message to the Socket.IO server. + * + * @param {String} data A encoded message. + * @api private + */ + + function empty () { }; + + XHR.prototype.post = function (data) { + var self = this; + this.socket.setBuffer(true); + + function stateChange () { + if (this.readyState == 4) { + this.onreadystatechange = empty; + self.posting = false; + + if (this.status == 200){ + self.socket.setBuffer(false); + } else { + self.onClose(); + } + } + } + + function onload () { + this.onload = empty; + self.socket.setBuffer(false); + }; + + this.sendXHR = this.request('POST'); + + if (global.XDomainRequest && this.sendXHR instanceof XDomainRequest) { + this.sendXHR.onload = this.sendXHR.onerror = onload; + } else { + this.sendXHR.onreadystatechange = stateChange; + } + + this.sendXHR.send(data); + }; + + /** + * Disconnects the established `XHR` connection. + * + * @returns {Transport} + * @api public + */ + + XHR.prototype.close = function () { + this.onClose(); + return this; + }; + + /** + * Generates a configured XHR request + * + * @param {String} url The url that needs to be requested. + * @param {String} method The method the request should use. + * @returns {XMLHttpRequest} + * @api private + */ + + XHR.prototype.request = function (method) { + var req = io.util.request(this.socket.isXDomain()) + , query = io.util.query(this.socket.options.query, 't=' + +new Date); + + req.open(method || 'GET', this.prepareUrl() + query, true); + + if (method == 'POST') { + try { + if (req.setRequestHeader) { + req.setRequestHeader('Content-type', 'text/plain;charset=UTF-8'); + } else { + // XDomainRequest + req.contentType = 'text/plain'; + } + } catch (e) {} + } + + return req; + }; + + /** + * Returns the scheme to use for the transport URLs. + * + * @api private + */ + + XHR.prototype.scheme = function () { + return this.socket.options.secure ? 'https' : 'http'; + }; + + /** + * Check if the XHR transports are supported + * + * @param {Boolean} xdomain Check if we support cross domain requests. + * @returns {Boolean} + * @api public + */ + + XHR.check = function (socket, xdomain) { + try { + var request = io.util.request(xdomain), + usesXDomReq = (global.XDomainRequest && request instanceof XDomainRequest), + socketProtocol = (socket && socket.options && socket.options.secure ? 'https:' : 'http:'), + isXProtocol = (global.location && socketProtocol != global.location.protocol); + if (request && !(usesXDomReq && isXProtocol)) { + return true; + } + } catch(e) {} + + return false; + }; + + /** + * Check if the XHR transport supports cross domain requests. + * + * @returns {Boolean} + * @api public + */ + + XHR.xdomainCheck = function (socket) { + return XHR.check(socket, true); + }; + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.htmlfile = HTMLFile; + + /** + * The HTMLFile transport creates a `forever iframe` based transport + * for Internet Explorer. Regular forever iframe implementations will + * continuously trigger the browsers buzy indicators. If the forever iframe + * is created inside a `htmlfile` these indicators will not be trigged. + * + * @constructor + * @extends {io.Transport.XHR} + * @api public + */ + + function HTMLFile (socket) { + io.Transport.XHR.apply(this, arguments); + }; + + /** + * Inherits from XHR transport. + */ + + io.util.inherit(HTMLFile, io.Transport.XHR); + + /** + * Transport name + * + * @api public + */ + + HTMLFile.prototype.name = 'htmlfile'; + + /** + * Creates a new Ac...eX `htmlfile` with a forever loading iframe + * that can be used to listen to messages. Inside the generated + * `htmlfile` a reference will be made to the HTMLFile transport. + * + * @api private + */ + + HTMLFile.prototype.get = function () { + this.doc = new window[(['Active'].concat('Object').join('X'))]('htmlfile'); + this.doc.open(); + this.doc.write(''); + this.doc.close(); + this.doc.parentWindow.s = this; + + var iframeC = this.doc.createElement('div'); + iframeC.className = 'socketio'; + + this.doc.body.appendChild(iframeC); + this.iframe = this.doc.createElement('iframe'); + + iframeC.appendChild(this.iframe); + + var self = this + , query = io.util.query(this.socket.options.query, 't='+ +new Date); + + this.iframe.src = this.prepareUrl() + query; + + io.util.on(window, 'unload', function () { + self.destroy(); + }); + }; + + /** + * The Socket.IO server will write script tags inside the forever + * iframe, this function will be used as callback for the incoming + * information. + * + * @param {String} data The message + * @param {document} doc Reference to the context + * @api private + */ + + HTMLFile.prototype._ = function (data, doc) { + // unescape all forward slashes. see GH-1251 + data = data.replace(/\\\//g, '/'); + this.onData(data); + try { + var script = doc.getElementsByTagName('script')[0]; + script.parentNode.removeChild(script); + } catch (e) { } + }; + + /** + * Destroy the established connection, iframe and `htmlfile`. + * And calls the `CollectGarbage` function of Internet Explorer + * to release the memory. + * + * @api private + */ + + HTMLFile.prototype.destroy = function () { + if (this.iframe){ + try { + this.iframe.src = 'about:blank'; + } catch(e){} + + this.doc = null; + this.iframe.parentNode.removeChild(this.iframe); + this.iframe = null; + + CollectGarbage(); + } + }; + + /** + * Disconnects the established connection. + * + * @returns {Transport} Chaining. + * @api public + */ + + HTMLFile.prototype.close = function () { + this.destroy(); + return io.Transport.XHR.prototype.close.call(this); + }; + + /** + * Checks if the browser supports this transport. The browser + * must have an `Ac...eXObject` implementation. + * + * @return {Boolean} + * @api public + */ + + HTMLFile.check = function (socket) { + if (typeof window != "undefined" && (['Active'].concat('Object').join('X')) in window){ + try { + var a = new window[(['Active'].concat('Object').join('X'))]('htmlfile'); + return a && io.Transport.XHR.check(socket); + } catch(e){} + } + return false; + }; + + /** + * Check if cross domain requests are supported. + * + * @returns {Boolean} + * @api public + */ + + HTMLFile.xdomainCheck = function () { + // we can probably do handling for sub-domains, we should + // test that it's cross domain but a subdomain here + return false; + }; + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('htmlfile'); + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + */ + + exports['xhr-polling'] = XHRPolling; + + /** + * The XHR-polling transport uses long polling XHR requests to create a + * "persistent" connection with the server. + * + * @constructor + * @api public + */ + + function XHRPolling () { + io.Transport.XHR.apply(this, arguments); + }; + + /** + * Inherits from XHR transport. + */ + + io.util.inherit(XHRPolling, io.Transport.XHR); + + /** + * Merge the properties from XHR transport + */ + + io.util.merge(XHRPolling, io.Transport.XHR); + + /** + * Transport name + * + * @api public + */ + + XHRPolling.prototype.name = 'xhr-polling'; + + /** + * Indicates whether heartbeats is enabled for this transport + * + * @api private + */ + + XHRPolling.prototype.heartbeats = function () { + return false; + }; + + /** + * Establish a connection, for iPhone and Android this will be done once the page + * is loaded. + * + * @returns {Transport} Chaining. + * @api public + */ + + XHRPolling.prototype.open = function () { + var self = this; + + io.Transport.XHR.prototype.open.call(self); + return false; + }; + + /** + * Starts a XHR request to wait for incoming messages. + * + * @api private + */ + + function empty () {}; + + XHRPolling.prototype.get = function () { + if (!this.isOpen) return; + + var self = this; + + function stateChange () { + if (this.readyState == 4) { + this.onreadystatechange = empty; + + if (this.status == 200) { + self.onData(this.responseText); + self.get(); + } else { + self.onClose(); + } + } + }; + + function onload () { + this.onload = empty; + this.onerror = empty; + self.retryCounter = 1; + self.onData(this.responseText); + self.get(); + }; + + function onerror () { + self.retryCounter ++; + if(!self.retryCounter || self.retryCounter > 3) { + self.onClose(); + } else { + self.get(); + } + }; + + this.xhr = this.request(); + + if (global.XDomainRequest && this.xhr instanceof XDomainRequest) { + this.xhr.onload = onload; + this.xhr.onerror = onerror; + } else { + this.xhr.onreadystatechange = stateChange; + } + + this.xhr.send(null); + }; + + /** + * Handle the unclean close behavior. + * + * @api private + */ + + XHRPolling.prototype.onClose = function () { + io.Transport.XHR.prototype.onClose.call(this); + + if (this.xhr) { + this.xhr.onreadystatechange = this.xhr.onload = this.xhr.onerror = empty; + try { + this.xhr.abort(); + } catch(e){} + this.xhr = null; + } + }; + + /** + * Webkit based browsers show a infinit spinner when you start a XHR request + * before the browsers onload event is called so we need to defer opening of + * the transport until the onload event is called. Wrapping the cb in our + * defer method solve this. + * + * @param {Socket} socket The socket instance that needs a transport + * @param {Function} fn The callback + * @api private + */ + + XHRPolling.prototype.ready = function (socket, fn) { + var self = this; + + io.util.defer(function () { + fn.call(self); + }); + }; + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('xhr-polling'); + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io, global) { + /** + * There is a way to hide the loading indicator in Firefox. If you create and + * remove a iframe it will stop showing the current loading indicator. + * Unfortunately we can't feature detect that and UA sniffing is evil. + * + * @api private + */ + + var indicator = global.document && "MozAppearance" in + global.document.documentElement.style; + + /** + * Expose constructor. + */ + + exports['jsonp-polling'] = JSONPPolling; + + /** + * The JSONP transport creates an persistent connection by dynamically + * inserting a script tag in the page. This script tag will receive the + * information of the Socket.IO server. When new information is received + * it creates a new script tag for the new data stream. + * + * @constructor + * @extends {io.Transport.xhr-polling} + * @api public + */ + + function JSONPPolling (socket) { + io.Transport['xhr-polling'].apply(this, arguments); + + this.index = io.j.length; + + var self = this; + + io.j.push(function (msg) { + self._(msg); + }); + }; + + /** + * Inherits from XHR polling transport. + */ + + io.util.inherit(JSONPPolling, io.Transport['xhr-polling']); + + /** + * Transport name + * + * @api public + */ + + JSONPPolling.prototype.name = 'jsonp-polling'; + + /** + * Posts a encoded message to the Socket.IO server using an iframe. + * The iframe is used because script tags can create POST based requests. + * The iframe is positioned outside of the view so the user does not + * notice it's existence. + * + * @param {String} data A encoded message. + * @api private + */ + + JSONPPolling.prototype.post = function (data) { + var self = this + , query = io.util.query( + this.socket.options.query + , 't='+ (+new Date) + '&i=' + this.index + ); + + if (!this.form) { + var form = document.createElement('form') + , area = document.createElement('textarea') + , id = this.iframeId = 'socketio_iframe_' + this.index + , iframe; + + form.className = 'socketio'; + form.style.position = 'absolute'; + form.style.top = '0px'; + form.style.left = '0px'; + form.style.display = 'none'; + form.target = id; + form.method = 'POST'; + form.setAttribute('accept-charset', 'utf-8'); + area.name = 'd'; + form.appendChild(area); + document.body.appendChild(form); + + this.form = form; + this.area = area; + } + + this.form.action = this.prepareUrl() + query; + + function complete () { + initIframe(); + self.socket.setBuffer(false); + }; + + function initIframe () { + if (self.iframe) { + self.form.removeChild(self.iframe); + } + + try { + // ie6 dynamic iframes with target="" support (thanks Chris Lambacher) + iframe = document.createElement('') + storageContainer.close() + storageOwner = storageContainer.w.frames[0].document + storage = storageOwner.createElement('div') + } catch(e) { + // somehow ActiveXObject instantiation failed (perhaps some special + // security settings or otherwse), fall back to per-path storage + storage = doc.createElement('div') + storageOwner = doc.body + } + function withIEStorage(storeFunction) { + return function() { + var args = Array.prototype.slice.call(arguments, 0) + args.unshift(storage) + // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx + // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx + storageOwner.appendChild(storage) + storage.addBehavior('#default#userData') + storage.load(localStorageName) + var result = storeFunction.apply(store, args) + storageOwner.removeChild(storage) + return result + } + } + + // In IE7, keys may not contain special chars. See all of https://github.com/marcuswestin/store.js/issues/40 + var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g") + function ieKeyFix(key) { + return key.replace(forbiddenCharsRegex, '___') + } + store.set = withIEStorage(function(storage, key, val) { + key = ieKeyFix(key) + if (val === undefined) { return store.remove(key) } + storage.setAttribute(key, store.serialize(val)) + storage.save(localStorageName) + return val + }) + store.get = withIEStorage(function(storage, key) { + key = ieKeyFix(key) + return store.deserialize(storage.getAttribute(key)) + }) + store.remove = withIEStorage(function(storage, key) { + key = ieKeyFix(key) + storage.removeAttribute(key) + storage.save(localStorageName) + }) + store.clear = withIEStorage(function(storage) { + var attributes = storage.XMLDocument.documentElement.attributes + storage.load(localStorageName) + for (var i=0, attr; attr=attributes[i]; i++) { + storage.removeAttribute(attr.name) + } + storage.save(localStorageName) + }) + store.getAll = withIEStorage(function(storage) { + var attributes = storage.XMLDocument.documentElement.attributes + var ret = {} + for (var i=0, attr; attr=attributes[i]; ++i) { + var key = ieKeyFix(attr.name) + ret[attr.name] = store.deserialize(storage.getAttribute(key)) + } + return ret + }) + } + + try { + store.set(namespace, namespace) + if (store.get(namespace) != namespace) { store.disabled = true } + store.remove(namespace) + } catch(e) { + store.disabled = true + } + store.enabled = !store.disabled + if (typeof module != 'undefined' && module.exports) { module.exports = store } + else if (typeof define === 'function' && define.amd) { define("store", store) } + else { win.store = store } +})(this.window || global); + +/* @source mod/user_following.js */; + +define('store', 'lib/store.js'); +define('mod/user_following', [ + "jquery", + "store" +], function($, store) { + var API_USER_FOLLOWING_PATH = "/api/user/following" + var USER_FOLLOWING_KEY = "user-following"; + var USER_FOLLOWING_UPDATE_KEY= "date:user-following" + var ONE_DAY_IN_SECONDS = 60*60*24; + + var update = function() { + var currentTime = new Date().getTime(); + var lastTime = store.get(USER_FOLLOWING_UPDATE_KEY); + if (lastTime && (currentTime - lastTime) < ONE_DAY_IN_SECONDS ) { + return; + } + + $.ajax( + API_USER_FOLLOWING_PATH + ).done(function(users){ + var following = $.map(users, function(item){ + return item["username"]; + }); + store.set(USER_FOLLOWING_KEY, following); + store.set(USER_FOLLOWING_UPDATE_KEY, currentTime); + }).fail(function(jqxhr, textStatus, error){ + return; + }); + } + + return { + update: update, + val: function(){ + return store.get(USER_FOLLOWING_KEY) || []; + } + }; + +}); + +/* @source mod/input-ext.js */; + +define('mousetrap', 'lib/mousetrap.js'); + +define("mod/input-ext", + [ + "jquery", + "mod/user_following", + "jquery-caret", + "jquery-atwho", + "mousetrap", + "lib/zen-form" +], + function ($, userFollowing) { + var inputExt = {}; + var emojis = [ + 'airplane', 'alien', 'art', 'bear', 'beer', 'bike', 'bomb', 'book', + 'bulb', 'bus', 'cake', 'calling', 'clap', 'cocktail', 'code', 'computer', + 'cool', 'cop', 'email', 'feet', 'fire', 'fish', 'fist', 'gift', 'hammer', + 'heart', 'iphone', 'key', 'leaves', 'lgtm', 'lipstick', 'lock', 'mag', 'mega', + 'memo', 'moneybag', 'new', 'octocat', 'ok', 'palm_tree', 'pencil', 'punch', + 'runner', 'scissors', 'ship', 'shipit', 'ski', 'smile', 'smoking', 'sparkles', + 'star', 'sunny', 'taxi', 'thumbsdown', 'thumbsup', 'tm', 'tophat', 'train', + 'trollface', 'v', 'vs', 'warning', 'wheelchair', 'zap', 'zzz', 'see_no_evil', + 'hear_no_evil', 'speak_no_evil', 'monkey', 'monkey_face', 'manybeers', 'beers', + 'hhkb', 'ruby' + ], emoji_list = $.map(emojis, function(value, i) {return {key: value + ':', name:value};}); + inputExt.enableEmojiInput = function (el) { + el.atwho('(?:^|\\s):', + {data:emoji_list, limit:7, + tpl:'
  • ${name}
  • '}); + return el; + }; + + inputExt.enableAutoCompleteFollowingAndTeam = function (el) { + var teams = JSON.parse($('#all-teams').val() || '[]'); + var users = teams.concat(userFollowing.val()); + + $(el).atwho("@", { + data: users, + limit: 7 + }); + }; + + // 输入#自动提示pr信息 + inputExt.enablePullsInput = function (el) { + var projectName = el.attr('data-project-name'); + if (!projectName) return el; + $.getJSON('/' + projectName + '/pulls/all_data', function (r) { + var pulls = $.map( + r, function(value, i) { + return {key: value.id, name:value.id + ' ' + value.title, title:value.title}; + }); + el.atwho('(?:^|\\s)#', + {data:pulls, limit:7, + tpl:'
  • #${key} ${title}
  • '}); + }); + return el; + }; + + inputExt.shortcut2submit = function (el) { + Mousetrap.bind( + ['command+enter', 'ctrl+enter'], + function (e) { + if (el && (e.srcElement || e.target) == $(el)[0] && !$(el).closest('form').hasClass('submitting')) { + e.preventDefault ? e.preventDefault() : (e.returnValue = false); + $(el).closest('form').addClass('submitting').submit(); + } + }, + 'keydown' + ); + }; + + // 进入全屏模式 + inputExt.enableZenMode = function (el) { + var trigger = '.go-zen'; + el = $(el); + el.zenForm({trigger:trigger, theme:'light'}).dblclick(function(e) { + if (!e.altKey) return; + $(this).zenForm({ trigger: null, theme: 'light' }); + fix(); + }); + + $(trigger).click(fix); + + function fix() { + var textarea = $('.zen-forms-input-wrap textarea'); + if (textarea) { + inputExt.enableEmojiInput(textarea); + textarea.attr({ + 'data-project-name': el.attr('data-project-name'), + 'placeholder': el.attr('placeholder') + }); + + inputExt.enablePullsInput(textarea); + + var participants = $('#participants').val(); + if (participants) { + participants = JSON.parse(participants); + textarea.atwho("@", {data:participants, limit:7}); + } + + // 因为zen-form设置的z-index非常高(99999)所以将at-view调更高 + $('#at-view').css('z-index', 100000); + } + } + }; + + var focusToEnd = function(els) { + return $(els).each(function() { + var v = $(this).val(); + $(this).focus().val("").val(v); + }); + }; + + inputExt.enableQuickQuotes = function (el) { + Mousetrap.bind( + ['r'], + function (e) { + var oldVal = $(el).val(), newVal, selVal = window.getSelection().toString(); + selVal = '> ' + selVal.split('\n').join('\n> '); + newVal = oldVal.concat((oldVal != '') ? '\n\n':'', selVal, '\n\n'); + $("html, body").animate({scrollTop: $(document).height()}, "slow"); + $(el).val(newVal); + focusToEnd(el); + }, + 'keyup' + ); + }; + + inputExt.enableFileUpload = function (uploader, textarea, is_image) { + uploader.submit( + function() { + $(this).ajaxSubmit({ + dataType: 'json', + type: 'POST', + delegation: true, + success: function(r) { + var oldText = textarea.val(), + newText = oldText + + (oldText.length == 0 ? '' : '\n') + + (is_image? '!' : '') + + '[' + r.origin_filename + '](' + r.url + ')'; + textarea.val(newText); + }, + error: function(r) { + alert("上传错误,请确认您上传的文件类型合法"); + } + }); + return false; + }); + + uploader.find('input').change(function () { + uploader.submit(); + }); + }; + + inputExt.enableImageUpload = function (uploader, textarea) { + inputExt.enableFileUpload(uploader,textarea, true); + }; + + inputExt.enableUpload = function(upload_widget,textarea){ + inputExt.enableImageUpload(upload_widget.find(".upload-image-form"),textarea); + inputExt.enableFileUpload(upload_widget.find(".upload-file-form"),textarea); + }; + + return inputExt; + } +); + +/* @source mod/diff.js */; + +define('mod/diff', [ + "jquery", + "mod/input-ext", + "mod/liveupdate", + "mod/colorcube" +], function ($, inputExt, live, colorcube) { + + //////////////////// linecomment + + // comment form + var hideCommentForm = function () { + $('.inline-comment-form').hide().closest('tr').removeClass('show-inline-comment-form'); + $('.inline-comment-form').each( + function (idx, el) { + if (!$(el).siblings('.comment-holder').children('.comment').length) { + $(el).parents('tr').hide(); + } + } + ); + }; + var openCommentForm = function (curRow) { + hideCommentForm(); + var nextRow = curRow.next('tr'); + // if no comments on curRow yet + if (!nextRow.length || !nextRow.hasClass('inline-comments')) { + nextRow = $.tmpl($('#templ-inline-comments-row'), {}).insertAfter(curRow); + } + // if side by side... plz refactor this + var file = curRow.parents('.file'); + if ((file.children('.side')).length != 0 && file.children('.side').css('display') != 'none') { + $(nextRow.children()[0]).attr('colspan', 1); + } + nextRow.show().addClass('show-inline-comment-form'); + var commentsBlock = nextRow.children('.line-comments'), + commentForm = commentsBlock.find('.inline-comment-form'); + // if no commentForm on nextRow yet + if (!commentForm.length) { + // get form-data + var patch_data = file.children('.meta').find('.patch-data'); + var line_data = curRow.find('.line-data'); + var data = { + from_sha: patch_data.attr('data-from-sha'), + old_path: patch_data.attr('data-old-path'), + new_path: patch_data.attr('data-new-path'), + from_oid: patch_data.attr('data-from-oid'), + to_oid: patch_data.attr('data-to-oid'), + old_no: line_data.attr('data-old'), + new_no: line_data.attr('data-new'), + }; + commentForm = $.tmpl($('#templ-inline-comment-form'), data).appendTo(commentsBlock); + commentForm.find('.js-hide-inline-comment-form').click( + function () { + hideCommentForm(); + } + ).end().find('form').submit( + function () { + $(this).find('button[type="submit"]').attr('disabled', true).addClass('disabled'); + return true; + } + ); + var commentTexarea = commentForm.find('textarea'); + inputExt.enableEmojiInput(commentTexarea); + inputExt.shortcut2submit(commentTexarea); + } + commentForm.show().find('textarea').focus(); + // codelive channel + var linecomment_channel_id; + if ($('.discussion-tab-link').length > 0) { + linecomment_channel_id = "code_pr_"+$('.discussion-tab-link').attr('data-url') + 'linecomment'; + } + // `comment on this line` + commentForm.find('form.js-inline-comment-form').ajaxForm({ + dataType: 'json', + beforeSend: function () { + commentForm.find('button[type="submit"]').attr('disabled', true).addClass('disabled') + .end().find('.loader').show(); + }, + success: function(r) { + if (r.r == 0 && r.html) { + commentForm.siblings('.js-comments-holder').append(r.html); + commentForm.find('textarea').val('').blur(); + hideCommentForm(); + live && linecomment_channel_id && + live.emit('ready', {channel: linecomment_channel_id, msg:r.html_with_diff}); + } else if (r.error){ + alert(r.error); + } + commentForm.find('button[type="submit"]').attr('disabled', false).removeClass('disabled'); + commentForm.find('form.js-inline-comment-form').removeClass('submitting') + .end().find('.loader').hide(); + return true; + }, + error: function () {} + }); + }; + + // add-bubble... + $('body').delegate('.add-bubble', 'click', function () { + var curRow = $(this).parents('tr'); + var nextRow = curRow.next('tr'); + if (nextRow.hasClass('inline-comments') && nextRow.css('display') != 'none') { + nextRow.hide(); + } else { + openCommentForm(curRow); + } + }); + + // `add a line note` + $('body').delegate( + '.js-show-inline-comment-form', 'click', function () { + var curRow = $(this).parents('tr').prev('tr'); + openCommentForm(curRow); + }); + + // linecomment delete + $('body').delegate('.inline-comments .delete-button', 'click', function (e) { + if (!confirm('Are you sure you want to delete this?')) { + return false; + } + var comment = $(this).parents('.comment'); + $.getJSON( + $(this).attr('href'), + function(r) { + // FIXME: global row? + if (r.r == '1') + var row = comment.parents('tr'); + if (comment.siblings('.comment').length || + row.find('.inline-comment-form').length) { + comment.remove(); + } else { + row.remove(); + } + } + ); + return false; + }); + + // comment & linecomment edit + $('body').delegate('.js-comment-edit-button', 'click', function (e) { + var form_content = $(this).parents('.comment-header') + .next('.comment-content') + .children('.form-content'); + if (form_content != undefined) { + form_content.show().find('textarea').focus(); + form_content.find('form.js-comment-update').ajaxForm({ + dataType: 'json', + beforeSend: function() { + form_content.find('button[type="submit"]').attr('disabled', true).addClass('disabled') + .end().find('.loader').show(); + }, + success: function(r) { + if (r.r == 0 && r.html) { + if (form_content.find('textarea').attr('name') === 'pull_request_review_comment'){ + form_content.parents('.js-comments-holder').append(r.html); + form_content.parents('.comment').remove(); + } else { + var comment = form_content.parents('.change'); + var avatar = comment.prev('.side-avatar'); + form_content.parents('#changelog').append(r.html); + comment.remove(); + avatar.remove(); + } + } + return true; + } + }); + } else { + return false; + } + }); + + // show linecomments toggle + $('body').delegate('.file .js-show-inline-comments-toggle', 'change', function () { + var comments = $(this).parents('.file').find('.inline-comments'); + if ($(this).is(':checked')) { + comments.show(); + } else { + comments.hide(); + } + }); + + // generated file toggle + $('body').delegate('.file a.generated', 'click', function() { + var file = $(this).parents('.file'); + var inline = file.children('.inline').show(); + $(this).hide(); + }); + + // patch side diff toggle + $('body').delegate('.file .js-side-diff', 'click', function () { + var file = $(this).parents('.file'); + file.find('a.generated').hide(); + if (file.children('.side').css('display') === 'none' && + file.children('.inline').css('display') === 'none'){ + file.children('.inline').show(); + }else { + var inline = file.children('.inline').toggle(); + var side = file.children('.side').toggle(); + var checkbox = file.find('.js-show-inline-comments-toggle'); + if (file.children('.side').css('display') != 'none') { + checkbox.attr('checked', false); + side.find('.inline-comments').hide(); + } + else { + checkbox.attr('checked', true); + } + } + }); + + // diff patch fullscreen toggle + $('body').delegate('.file .js-fullscreen', 'click', function () { + var fullscreenStage = $('#fullscreen-stage'); + if (fullscreenStage.length == 0) { + var files = $(this).parents('#files'); + fullscreenStage = $('
    ').appendTo(files); + } + if (fullscreenStage.is(":visible")) { + fullscreenStage.hide(); + $('body').removeClass('fullscreen-mode'); + } else { + var file = $(this).parents('.file'); + fullscreenStage.html(file.clone()).show(); + $('body').addClass('fullscreen-mode'); + fullscreenStage.find('.file .js-fullscreen').text('Exit Full Screen'); + } + }); + + // dblclick open linecomment form + var clearSelection = function () { + if (window.getSelection) { + if (window.getSelection().empty) { // Chrome + window.getSelection().empty(); + } else if (window.getSelection().removeAllRanges) { // Firefox + window.getSelection().removeAllRanges(); + } + } else if (document.selection) { // IE? + document.selection.empty(); + } + } + $('body').delegate('.js-open-comment-form.dblclick-comment', 'dblclick', function () { + clearSelection(); + var curRow = $(this).parents('tr'); + openCommentForm(curRow); + }); + + //////////////////// moreline get_contexts + + // moreline + $('body').delegate('pre.skipped a', 'click', function() { + var curRow = $(this).parents('tr'); + var patch_data = curRow.parents('.file').children('.meta').find('.patch-data'); + var data = curRow.find('.expand-data'); + var url = patch_data.attr('data-context-url'); + $.get( + url, + { + old_sha : patch_data.attr('data-old-sha'), + old_path : patch_data.attr('data-old-path'), + old_start : data.attr('data-old-start'), + new_start : data.attr('data-new-start'), + old_end : data.attr('data-old-end'), + new_end : data.attr('data-new-end'), + type : $(this).attr('data-type'), + }, + function (r) { + curRow.after(r.html); + if (r.html.trim()) { + curRow.remove(); + } + } + ); + }); + + // full diff + $('body').delegate('.ellipsis', 'click', function() { + var $this = $(this); + var fpath = $this.attr('data-path'); + var new_fpath = $this.attr('data-new-path'); + + // for pull/new + var from_proj = $('.new-pull-request form input[name="from_proj"]').attr('value'); + var from_ref = $('.new-pull-request form input[name="from_ref"]').attr('value'); + var to_ref = $('.new-pull-request form input[name="to_ref"]').attr('value'); + var to_proj = $('.new-pull-request form input[name="to_proj"]').attr('value'); + + var url = $this.attr('data-url'); + var table = $this.parents('.data').find('.diff-table'); + $.get(url, + { + filepath: fpath, + new_filepath: new_fpath, + from_proj: from_proj, + from_ref: from_ref, + to_ref: to_ref, + to_proj: to_proj + }, + function(r){ + table.find('tbody').html(r.html); + }); + }); + + // TODO: modify this, after refactor diff api + // toggle whitespace diff + $('body').delegate('.toggle_whitespace', 'click', function() { + var $this = $(this); + var fpath = $this.attr('data-path'); + var new_fpath = $this.attr('data-new-path'); + + // for pull/new + var from_proj = $('.new-pull-request form input[name="from_proj"]').attr('value'); + var from_ref = $('.new-pull-request form input[name="from_ref"]').attr('value'); + var to_ref = $('.new-pull-request form input[name="to_ref"]').attr('value'); + var to_proj = $('.new-pull-request form input[name="to_proj"]').attr('value'); + + var url = $this.attr('data-url'); + var table = $this.parents('.data').find('.diff-table'); + var whitespace = $this.attr('data-w'); + + $.get(url, + { + filepath: fpath, + new_filepath: new_fpath, + from_proj: from_proj, + from_ref: from_ref, + to_ref: to_ref, + to_proj: to_proj, + w: whitespace + }, + function(r){ + table.find('tbody').html(r.html); + $this.attr('data-w', (1 - parseInt(whitespace)).toString()); + }); + }); + + //////////////////// no use ?? + function convertDiff(name, table, pre) { + var inline = $(table).hasClass('inline'); + var ths = table.tHead.rows[0].cells; + var afile, bfile; + if ( inline ) { + afile = ths[0].title; + bfile = ths[1].title; + } else { + afile = $(ths[0]).find('a').text(); + bfile = $(ths[1]).find('a').text(); + } + if ( afile.match(/^Revision /) ) { + afile = 'a/' + name; + bfile = 'b/' + name; + } + var lines = [ + "Index: " + name, + "===================================================================", + "--- " + afile.replace(/File /, ''), + "+++ " + bfile.replace(/File /, ''), + ]; + var sepIndex = 0; + var oldOffset = 0, oldLength = 0, newOffset = 0, newLength = 0; + var title = ""; + if (inline) + title = $(ths[2]).text(); + for (var i = 0; i < table.tBodies.length; i++) { + var tBody = table.tBodies[i]; + if (i == 0 || tBody.className == "skipped") { + if (i > 0) { + if (!oldOffset && oldLength) oldOffset = 1 + if (!newOffset && newLength) newOffset = 1 + lines[sepIndex] = lines[sepIndex] + .replace("{1}", oldOffset).replace("{2}", oldLength) + .replace("{3}", newOffset).replace("{4}", newLength) + .replace("{5}", title); + } + sepIndex = lines.length; + lines.push("@@ -{1},{2} +{3},{4} @@{5}"); + oldOffset = 0, oldLength = 0, newOffset = 0, newLength = 0; + if (tBody.className == "skipped") { + if (inline) + title = $(tBody.rows[0].cells[2]).text(); + continue; + } + } + var tmpLines = []; + for (var j = 0; j < tBody.rows.length; j++) { + var cells = tBody.rows[j].cells; + var oldLineNo = parseInt($(cells[0]).text()); + var newLineNo = parseInt($(cells[inline ? 1 : 2]).text()); + if (tBody.className == 'unmod') { + lines.push(" " + $(cells[inline ? 2 : 1]).text()); + oldLength += 1; + newLength += 1; + if (!oldOffset) oldOffset = oldLineNo; + if (!newOffset) newOffset = newLineNo; + } else { + var oldLine; + var newLine; + var oldTag = "-"; + var newTag = "+"; + if (inline) { + oldLine = newLine = $(cells[2]).text(); + if ($('em', cells[2]).length) oldTag = newTag = "\\"; + } else { + oldLine = $(cells[1]).text(); + if ($('em', cells[1]).length) oldTag = "\\"; + newLine = $(cells[3]).text(); + if ($('em', cells[3]).length) newTag = "\\"; + } + if (!isNaN(oldLineNo)) { + lines.push(oldTag + oldLine); + oldLength += 1; + } + if (!isNaN(newLineNo)) { + tmpLines.push(newTag + newLine); + newLength += 1; + } + } + } + if (tmpLines.length > 0) { + lines = lines.concat(tmpLines); + } + } + if (!oldOffset && oldLength) oldOffset = 1; + if (!newOffset && newLength) newOffset = 1; + lines[sepIndex] = lines[sepIndex] + .replace("{1}", oldOffset).replace("{2}", oldLength) + .replace("{3}", newOffset).replace("{4}", newLength) + .replace("{5}", title); + /* remove trailing   and join lines (with CR for IExplorer) */ + var sep = $.browser.msie ? "\r" : "\n"; + for ( var i = 0; i < lines.length; i++ ) + if ( lines[i] ) + { + var line = lines[i].replace(/\xa0$/, '') + sep; + if ( lines[i][0] == '+' ) + pre.append($('').text(line)); + else if ( lines[i][0] == '-' ) + pre.append($('').text(line)); + else + pre.append($('').text(line)); + } + } + // no use ?? + $("div.diff h2").each(function() { + console.log('call div.diff h2 !!!'); + var switcher = $("").prependTo(this); + var name = $.trim($(this).text()); + var table = $(this).siblings("table").get(0); + if (! table) return; + var pre = $('
    ').hide().insertAfter(table);
    +          $("" + _("Tabular") + "").click(function() {
    +            $(pre).hide();
    +            $(table).show();
    +            $(this).addClass("active").siblings("span").removeClass("active");
    +            return false;
    +          }).addClass("active").appendTo(switcher);
    +          $("" + _("Unified") + "").click(function() {
    +            $(table).hide();
    +            if (!pre.get(0).firstChild) convertDiff(name, table, pre);
    +            $(pre).fadeIn("fast")
    +            $(this).addClass("active").siblings("span").removeClass("active");
    +            return false;
    +          }).appendTo(switcher);
    +        });
    +
    +
    +        colorcube.init({target:'body'});
    +});
    +
    +/* @source mod/watch.js */;
    +
    +define('mod/watch', [
    +  "jquery"
    +], function($){
    +
    +  $(function() {
    +    var watch_btn = $("#watch-btn");
    +    var countLabel = $('#watched-count');
    +    var proj_id = watch_btn.attr("proj_id");
    +
    +    var updateLabelBy = function (n) {
    +        var count = Number(countLabel.text()) || 0;
    +        if (count === 0 && n <= 0) { return; }
    +
    +        count += n;
    +        countLabel.text(count.toString());
    +    };
    +
    +    watch_btn.click(function() {
    +
    +      if(watch_btn.hasClass('watch')) {
    +        $.post("/watch/"+proj_id, function(data) {
    +          if (!data.error) {
    +            watch_btn.text('Unwatch');
    +            watch_btn.addClass('unwatch');
    +            watch_btn.removeClass('watch');
    +            updateLabelBy(1);
    +          } else {
    +            // show error notification to user
    +            show_error("关注失败");
    +          }
    +        });
    +      }
    +      else{
    +        $.ajax("/watch/"+proj_id, {
    +          type: "DELETE",
    +          success: function(data) {
    +            if (!data.error) {
    +              watch_btn.text('Watch');
    +              watch_btn.addClass('watch');
    +              watch_btn.removeClass('unwatch');
    +              updateLabelBy(-1);
    +            } else {
    +              show_error("取消关注失败");
    +            }
    +          },
    +          error: function(e) {
    +            show_error("取消关注失败");
    +          }
    +        });
    +      }
    +    });
    +
    +    function show_success(msg) {
    +        var successDiv = $(".navbar .success");
    +        if (successDiv.size() === 0 ) {
    +            successDiv= $("
    ").addClass("success").addClass("alert-success"); + $("div.navbar").append(successDiv); + } + successDiv.html(msg); + successDiv.fadeOut(1500, function () { + $(this).remove(); + }); + } + + function show_error(msg) { + var errorDiv = $(".navbar .error"); + if (errorDiv.size() === 0 ) { + errorDiv = $("
    ").addClass("error").addClass("alert-error"); + $("div.navbar").append(errorDiv); + } + errorDiv.html(msg); + } + + }); +}); + +/* @source */; + +define('mousetrap', 'lib/mousetrap.js'); + +require( + ['jquery' + , 'mod/input-ext' + , 'jquery-caret' + , 'jquery-atwho' + , 'jquery-timeago' + , 'bootstrap' + , 'mod/watch' + //, 'mod/commit' + , 'mod/diff' // diff js + , 'mousetrap'], + function($, inputExt){ + $(function () { + inputExt.enableZenMode('#pull_body'); + inputExt.enableAutoCompleteFollowingAndTeam('#pull_body'); + + //pull.js + $('.editor-expander').click( + function() { + var $editor = $('.range-editor'); + $('.pull-tabs').css('opacity', $editor.css('display') == 'none' ? 0.45 : 1); + $editor.slideToggle('fast'); + return false; + }); + + var update_preview = function($box) { + var proj_name = $box.find('select').val(); + var url = '/api/' + proj_name + '/git/branches'; + + $.getJSON(url, function(branches){ + $box.find('.typeahead').data('source', branches); + }); + + url = $box.data('preview-url-base') + proj_name + ':' + $box.find('input.js-ref').val(); + $box.find('.commit-preview').load(url); + }; + + $('.range-editor select[name=base_repo]').change( + function() { + var $box = $(this).parents('.chooser-box'); + update_preview($box); + }); + + $('.range-editor input[type=text]').change( + function() { + var $box = $(this).parents('.chooser-box'); + update_preview($box); + }); + + $('#update_commit_range').click( + function() { + var $form = $(this).parents('form'); + $form.attr('action', $(this).data('url')).submit(); + }); + //previewable-comment-form + $('.previewable-comment-form .js-preview-tabs a.preview-tab').on( + 'show', function(e) { + $('#preview_bucket p').html("Loading preview..."); + }).on('shown', function(e) { + var url = $('#preview_bucket .content-body').data('api-url'); + var text = $('#write_bucket textarea').val(); + $('#preview_bucket .content-body').load(url, {text: text}); + }); + + $('.new-pull-request form').submit( + function () { + $(this).find('button[type="submit"]').attr('disabled', true).addClass('disabled'); + //Google Analytic Events + ga('send', 'event', 'pullrequest', 'create'); + }); + + var uploader = $('#form-file-upload'), + textarea = $('#write_bucket textarea'); + inputExt.enableUpload(uploader, textarea); + + $('a[data-toggle="tab"]').on( + 'shown', function (e) { + if ($(e.target).hasClass('preview-discussion-tab')) { + $('#form-file-upload').show(); + } else { + $('#form-file-upload').hide(); + } + }); + }); + }); diff --git a/dist/js/app/pull/pulls.js b/dist/js/app/pull/pulls.js new file mode 100644 index 0000000..11d2381 --- /dev/null +++ b/dist/js/app/pull/pulls.js @@ -0,0 +1,88 @@ + +require.config({ enable_ozma: true }); + + +/* @source mod/watch.js */; + +define('mod/watch', [ + "jquery" +], function($){ + + $(function() { + var watch_btn = $("#watch-btn"); + var countLabel = $('#watched-count'); + var proj_id = watch_btn.attr("proj_id"); + + var updateLabelBy = function (n) { + var count = Number(countLabel.text()) || 0; + if (count === 0 && n <= 0) { return; } + + count += n; + countLabel.text(count.toString()); + }; + + watch_btn.click(function() { + + if(watch_btn.hasClass('watch')) { + $.post("/watch/"+proj_id, function(data) { + if (!data.error) { + watch_btn.text('Unwatch'); + watch_btn.addClass('unwatch'); + watch_btn.removeClass('watch'); + updateLabelBy(1); + } else { + // show error notification to user + show_error("关注失败"); + } + }); + } + else{ + $.ajax("/watch/"+proj_id, { + type: "DELETE", + success: function(data) { + if (!data.error) { + watch_btn.text('Watch'); + watch_btn.addClass('watch'); + watch_btn.removeClass('unwatch'); + updateLabelBy(-1); + } else { + show_error("取消关注失败"); + } + }, + error: function(e) { + show_error("取消关注失败"); + } + }); + } + }); + + function show_success(msg) { + var successDiv = $(".navbar .success"); + if (successDiv.size() === 0 ) { + successDiv= $("
    ").addClass("success").addClass("alert-success"); + $("div.navbar").append(successDiv); + } + successDiv.html(msg); + successDiv.fadeOut(1500, function () { + $(this).remove(); + }); + } + + function show_error(msg) { + var errorDiv = $(".navbar .error"); + if (errorDiv.size() === 0 ) { + errorDiv = $("
    ").addClass("error").addClass("alert-error"); + $("div.navbar").append(errorDiv); + } + errorDiv.html(msg); + } + + }); +}); + +/* @source */; + +require(['jquery' +, 'mod/watch'], function($){ + //put your home code here. +}); diff --git a/dist/js/app/search/search.js b/dist/js/app/search/search.js new file mode 100644 index 0000000..a371902 --- /dev/null +++ b/dist/js/app/search/search.js @@ -0,0 +1,44 @@ + +require.config({ enable_ozma: true }); + + +/* @source */; + +require(['jquery', 'jquery-timeago'], function($, Spinner) { + var fetch = function(data) { + $.post('count', data, function(ret) { + ret = $.parseJSON(ret); + $('.mini-icon-public-repo + .counter').text(ret.repos); + $('.mini-icon-code + .counter').text(ret.codes); + $('.mini-icon-person + .counter').text(ret.users); + $('.mini-icon-doc + .counter').text(ret.docs); + $('.mini-icon-pull + .counter').text(ret.pulls); + $('.mini-icon-issue + .counter').text(ret.issues); + }); + } + $(function() { + var q = $("#command-bar").val(); + var language = $("input[name='language']").val(); + var state = $("input[name='state']").val(); + var doctype = $("input[name='doctype']").val(); + var data = {q:q, language:language, state:state, doctype:doctype}; + fetch(data); + }); + + $('select[name="s"]').change(function() { + $(this).parent().submit(); + }); + + $('#tip').click(function() { + $('#tip-content').toggle(); + }); + + $('a.path-url').each(function (){ + var url = $(this).attr('href'); + $(this).parents('.public').find('.linenodiv a').each(function (){ + var href = $(this).attr('href'); + $(this).attr('href', url + href); + }); + }); +}); + diff --git a/dist/js/app/settings/codereview.js b/dist/js/app/settings/codereview.js new file mode 100644 index 0000000..c0f1b1a --- /dev/null +++ b/dist/js/app/settings/codereview.js @@ -0,0 +1,58 @@ + +require.config({ enable_ozma: true }); + + +/* @source */; + +require(['jquery'], function(){ + var is_enable = 1; + var field = [ + 'dblclick_comment', + ]; + + for(var i = 0; i < field.length; i++){ + $('#' + field[i]).click(function() { + var checkbox = $(this); + if(checkbox.attr("checked") == "checked"){ + is_enable = 1; + }else{ + is_enable = 0; + } + + $.ajax({ + type: 'POST', + data: { + 'field': checkbox.val(), + 'is_enable': is_enable + }, + url: '/settings/codereview/setting', + dataType: 'json', + success: function (ret) { + if(ret.result == 'fail'){ + checkbox.prop("checked", "checked"); + } + } + }); + }); + } + + $('#text_font').on('change', function() { + var select = $(this); + $.ajax({ + type: 'POST', + data: { + 'field': 'text_font', + 'is_enable': select.val() + }, + url: '/settings/codereview/setting', + dataType: 'json', + success: function (ret) { + if(ret.result == 'fail'){ + select.find('option:selected').removeAttr('selected'); + select.find('option[value="' + ret.origin + '"]').attr("selected",true); + } + } + }); + }); +}); + diff --git a/dist/js/app/settings/notification.js b/dist/js/app/settings/notification.js new file mode 100644 index 0000000..9572e43 --- /dev/null +++ b/dist/js/app/settings/notification.js @@ -0,0 +1,42 @@ + +require.config({ enable_ozma: true }); + + +/* @source */; + +require(['jquery'], function(){ + var is_on = 1; + var notifications_meta = ['participating_email', + 'participating_irc', + 'participating_web', + 'watching_email', + 'watching_irc', + 'watching_web']; + + for(var i = 0; i < notifications_meta.length; i++){ + $('#' + notifications_meta[i]).click(function() { + var checkbox = $(this); + if(checkbox.attr("checked") == "checked"){ + is_on = 1; + }else{ + is_on = 0; + } + + $.ajax({ + type: 'POST', + data: { + 'notifications_meta': checkbox.val(), + 'is_on': is_on + }, + url: '/settings/notification/setting', + dataType: 'json', + success: function (ret) { + if(ret.result == 'fail'){ + checkbox.prop("checked", "checked"); + } + } + }); + }); + } +}); + diff --git a/dist/js/app/src/commit.js b/dist/js/app/src/commit.js new file mode 100644 index 0000000..7bceb9c --- /dev/null +++ b/dist/js/app/src/commit.js @@ -0,0 +1,6147 @@ + +require.config({ enable_ozma: true }); + + +/* @source mod/zclip.js */; + +define('mod/zclip', [ + "jquery", + "jquery-zclip" +], function($, _) { + $(function () { + $('input.git-url').focus(function(e) { + var elem = this; + setTimeout(function() { + elem.select(); + }, 0); + }); + $('.copy-git-url').zclip({ + path: '/static/js/lib/ZeroClipboard.swf', + copy: function() { + return $('.copy-git-url').attr('data-clipboard-text'); + }, + afterCopy: function() {} + }); + }); +}); + +/* @source mod/colorcube.js */; + +define("mod/colorcube", + [ + "jquery" +], + function ($) { + var colorcube = {}, cubeWnd; + var showCubeWnd = function (el) { + el = $(el); + if (!cubeWnd) { + cubeWnd = $('
    ').appendTo('body'); + } + var pos = el.offset(); + pos = {top:pos.top - 40, left:pos.left + el.width()/2 -15}; + cubeWnd.show().offset(pos).css({'background-color':el.data('color')}); + }; + colorcube.init = function (opts) { + if (opts.target) { + $(opts.target).delegate( + '.line .color', 'mouseenter mouseleave', function (e) { + if (e.type === 'mouseenter') { + showCubeWnd(this); + } else { + cubeWnd.hide(); + } + }); + } + }; + return colorcube; + } +); + +/* @source lib/socket.io.js */; + +/*! Socket.IO.js build:0.9.16, development. Copyright(c) 2011 LearnBoost MIT Licensed */ + +var io = ('undefined' === typeof module ? {} : module.exports); +(function() { + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, global) { + + /** + * IO namespace. + * + * @namespace + */ + + var io = exports; + + /** + * Socket.IO version + * + * @api public + */ + + io.version = '0.9.16'; + + /** + * Protocol implemented. + * + * @api public + */ + + io.protocol = 1; + + /** + * Available transports, these will be populated with the available transports + * + * @api public + */ + + io.transports = []; + + /** + * Keep track of jsonp callbacks. + * + * @api private + */ + + io.j = []; + + /** + * Keep track of our io.Sockets + * + * @api private + */ + io.sockets = {}; + + + /** + * Manages connections to hosts. + * + * @param {String} uri + * @Param {Boolean} force creation of new socket (defaults to false) + * @api public + */ + + io.connect = function (host, details) { + var uri = io.util.parseUri(host) + , uuri + , socket; + + if (global && global.location) { + uri.protocol = uri.protocol || global.location.protocol.slice(0, -1); + uri.host = uri.host || (global.document + ? global.document.domain : global.location.hostname); + uri.port = uri.port || global.location.port; + } + + uuri = io.util.uniqueUri(uri); + + var options = { + host: uri.host + , secure: 'https' == uri.protocol + , port: uri.port || ('https' == uri.protocol ? 443 : 80) + , query: uri.query || '' + }; + + io.util.merge(options, details); + + if (options['force new connection'] || !io.sockets[uuri]) { + socket = new io.Socket(options); + } + + if (!options['force new connection'] && socket) { + io.sockets[uuri] = socket; + } + + socket = socket || io.sockets[uuri]; + + // if path is different from '' or / + return socket.of(uri.path.length > 1 ? uri.path : ''); + }; + +})('object' === typeof module ? module.exports : (this.io = {}), this); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, global) { + + /** + * Utilities namespace. + * + * @namespace + */ + + var util = exports.util = {}; + + /** + * Parses an URI + * + * @author Steven Levithan (MIT license) + * @api public + */ + + var re = /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/; + + var parts = ['source', 'protocol', 'authority', 'userInfo', 'user', 'password', + 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', + 'anchor']; + + util.parseUri = function (str) { + var m = re.exec(str || '') + , uri = {} + , i = 14; + + while (i--) { + uri[parts[i]] = m[i] || ''; + } + + return uri; + }; + + /** + * Produces a unique url that identifies a Socket.IO connection. + * + * @param {Object} uri + * @api public + */ + + util.uniqueUri = function (uri) { + var protocol = uri.protocol + , host = uri.host + , port = uri.port; + + if ('document' in global) { + host = host || document.domain; + port = port || (protocol == 'https' + && document.location.protocol !== 'https:' ? 443 : document.location.port); + } else { + host = host || 'localhost'; + + if (!port && protocol == 'https') { + port = 443; + } + } + + return (protocol || 'http') + '://' + host + ':' + (port || 80); + }; + + /** + * Mergest 2 query strings in to once unique query string + * + * @param {String} base + * @param {String} addition + * @api public + */ + + util.query = function (base, addition) { + var query = util.chunkQuery(base || '') + , components = []; + + util.merge(query, util.chunkQuery(addition || '')); + for (var part in query) { + if (query.hasOwnProperty(part)) { + components.push(part + '=' + query[part]); + } + } + + return components.length ? '?' + components.join('&') : ''; + }; + + /** + * Transforms a querystring in to an object + * + * @param {String} qs + * @api public + */ + + util.chunkQuery = function (qs) { + var query = {} + , params = qs.split('&') + , i = 0 + , l = params.length + , kv; + + for (; i < l; ++i) { + kv = params[i].split('='); + if (kv[0]) { + query[kv[0]] = kv[1]; + } + } + + return query; + }; + + /** + * Executes the given function when the page is loaded. + * + * io.util.load(function () { console.log('page loaded'); }); + * + * @param {Function} fn + * @api public + */ + + var pageLoaded = false; + + util.load = function (fn) { + if ('document' in global && document.readyState === 'complete' || pageLoaded) { + return fn(); + } + + util.on(global, 'load', fn, false); + }; + + /** + * Adds an event. + * + * @api private + */ + + util.on = function (element, event, fn, capture) { + if (element.attachEvent) { + element.attachEvent('on' + event, fn); + } else if (element.addEventListener) { + element.addEventListener(event, fn, capture); + } + }; + + /** + * Generates the correct `XMLHttpRequest` for regular and cross domain requests. + * + * @param {Boolean} [xdomain] Create a request that can be used cross domain. + * @returns {XMLHttpRequest|false} If we can create a XMLHttpRequest. + * @api private + */ + + util.request = function (xdomain) { + + if (xdomain && 'undefined' != typeof XDomainRequest && !util.ua.hasCORS) { + return new XDomainRequest(); + } + + if ('undefined' != typeof XMLHttpRequest && (!xdomain || util.ua.hasCORS)) { + return new XMLHttpRequest(); + } + + if (!xdomain) { + try { + return new window[(['Active'].concat('Object').join('X'))]('Microsoft.XMLHTTP'); + } catch(e) { } + } + + return null; + }; + + /** + * XHR based transport constructor. + * + * @constructor + * @api public + */ + + /** + * Change the internal pageLoaded value. + */ + + if ('undefined' != typeof window) { + util.load(function () { + pageLoaded = true; + }); + } + + /** + * Defers a function to ensure a spinner is not displayed by the browser + * + * @param {Function} fn + * @api public + */ + + util.defer = function (fn) { + if (!util.ua.webkit || 'undefined' != typeof importScripts) { + return fn(); + } + + util.load(function () { + setTimeout(fn, 100); + }); + }; + + /** + * Merges two objects. + * + * @api public + */ + + util.merge = function merge (target, additional, deep, lastseen) { + var seen = lastseen || [] + , depth = typeof deep == 'undefined' ? 2 : deep + , prop; + + for (prop in additional) { + if (additional.hasOwnProperty(prop) && util.indexOf(seen, prop) < 0) { + if (typeof target[prop] !== 'object' || !depth) { + target[prop] = additional[prop]; + seen.push(additional[prop]); + } else { + util.merge(target[prop], additional[prop], depth - 1, seen); + } + } + } + + return target; + }; + + /** + * Merges prototypes from objects + * + * @api public + */ + + util.mixin = function (ctor, ctor2) { + util.merge(ctor.prototype, ctor2.prototype); + }; + + /** + * Shortcut for prototypical and static inheritance. + * + * @api private + */ + + util.inherit = function (ctor, ctor2) { + function f() {}; + f.prototype = ctor2.prototype; + ctor.prototype = new f; + }; + + /** + * Checks if the given object is an Array. + * + * io.util.isArray([]); // true + * io.util.isArray({}); // false + * + * @param Object obj + * @api public + */ + + util.isArray = Array.isArray || function (obj) { + return Object.prototype.toString.call(obj) === '[object Array]'; + }; + + /** + * Intersects values of two arrays into a third + * + * @api public + */ + + util.intersect = function (arr, arr2) { + var ret = [] + , longest = arr.length > arr2.length ? arr : arr2 + , shortest = arr.length > arr2.length ? arr2 : arr; + + for (var i = 0, l = shortest.length; i < l; i++) { + if (~util.indexOf(longest, shortest[i])) + ret.push(shortest[i]); + } + + return ret; + }; + + /** + * Array indexOf compatibility. + * + * @see bit.ly/a5Dxa2 + * @api public + */ + + util.indexOf = function (arr, o, i) { + + for (var j = arr.length, i = i < 0 ? i + j < 0 ? 0 : i + j : i || 0; + i < j && arr[i] !== o; i++) {} + + return j <= i ? -1 : i; + }; + + /** + * Converts enumerables to array. + * + * @api public + */ + + util.toArray = function (enu) { + var arr = []; + + for (var i = 0, l = enu.length; i < l; i++) + arr.push(enu[i]); + + return arr; + }; + + /** + * UA / engines detection namespace. + * + * @namespace + */ + + util.ua = {}; + + /** + * Whether the UA supports CORS for XHR. + * + * @api public + */ + + util.ua.hasCORS = 'undefined' != typeof XMLHttpRequest && (function () { + try { + var a = new XMLHttpRequest(); + } catch (e) { + return false; + } + + return a.withCredentials != undefined; + })(); + + /** + * Detect webkit. + * + * @api public + */ + + util.ua.webkit = 'undefined' != typeof navigator + && /webkit/i.test(navigator.userAgent); + + /** + * Detect iPad/iPhone/iPod. + * + * @api public + */ + + util.ua.iDevice = 'undefined' != typeof navigator + && /iPad|iPhone|iPod/i.test(navigator.userAgent); + +})('undefined' != typeof io ? io : module.exports, this); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.EventEmitter = EventEmitter; + + /** + * Event emitter constructor. + * + * @api public. + */ + + function EventEmitter () {}; + + /** + * Adds a listener + * + * @api public + */ + + EventEmitter.prototype.on = function (name, fn) { + if (!this.$events) { + this.$events = {}; + } + + if (!this.$events[name]) { + this.$events[name] = fn; + } else if (io.util.isArray(this.$events[name])) { + this.$events[name].push(fn); + } else { + this.$events[name] = [this.$events[name], fn]; + } + + return this; + }; + + EventEmitter.prototype.addListener = EventEmitter.prototype.on; + + /** + * Adds a volatile listener. + * + * @api public + */ + + EventEmitter.prototype.once = function (name, fn) { + var self = this; + + function on () { + self.removeListener(name, on); + fn.apply(this, arguments); + }; + + on.listener = fn; + this.on(name, on); + + return this; + }; + + /** + * Removes a listener. + * + * @api public + */ + + EventEmitter.prototype.removeListener = function (name, fn) { + if (this.$events && this.$events[name]) { + var list = this.$events[name]; + + if (io.util.isArray(list)) { + var pos = -1; + + for (var i = 0, l = list.length; i < l; i++) { + if (list[i] === fn || (list[i].listener && list[i].listener === fn)) { + pos = i; + break; + } + } + + if (pos < 0) { + return this; + } + + list.splice(pos, 1); + + if (!list.length) { + delete this.$events[name]; + } + } else if (list === fn || (list.listener && list.listener === fn)) { + delete this.$events[name]; + } + } + + return this; + }; + + /** + * Removes all listeners for an event. + * + * @api public + */ + + EventEmitter.prototype.removeAllListeners = function (name) { + if (name === undefined) { + this.$events = {}; + return this; + } + + if (this.$events && this.$events[name]) { + this.$events[name] = null; + } + + return this; + }; + + /** + * Gets all listeners for a certain event. + * + * @api publci + */ + + EventEmitter.prototype.listeners = function (name) { + if (!this.$events) { + this.$events = {}; + } + + if (!this.$events[name]) { + this.$events[name] = []; + } + + if (!io.util.isArray(this.$events[name])) { + this.$events[name] = [this.$events[name]]; + } + + return this.$events[name]; + }; + + /** + * Emits an event. + * + * @api public + */ + + EventEmitter.prototype.emit = function (name) { + if (!this.$events) { + return false; + } + + var handler = this.$events[name]; + + if (!handler) { + return false; + } + + var args = Array.prototype.slice.call(arguments, 1); + + if ('function' == typeof handler) { + handler.apply(this, args); + } else if (io.util.isArray(handler)) { + var listeners = handler.slice(); + + for (var i = 0, l = listeners.length; i < l; i++) { + listeners[i].apply(this, args); + } + } else { + return false; + } + + return true; + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +/** + * Based on JSON2 (http://www.JSON.org/js.html). + */ + +(function (exports, nativeJSON) { + "use strict"; + + // use native JSON if it's available + if (nativeJSON && nativeJSON.parse){ + return exports.JSON = { + parse: nativeJSON.parse + , stringify: nativeJSON.stringify + }; + } + + var JSON = exports.JSON = {}; + + function f(n) { + // Format integers to have at least two digits. + return n < 10 ? '0' + n : n; + } + + function date(d, key) { + return isFinite(d.valueOf()) ? + d.getUTCFullYear() + '-' + + f(d.getUTCMonth() + 1) + '-' + + f(d.getUTCDate()) + 'T' + + f(d.getUTCHours()) + ':' + + f(d.getUTCMinutes()) + ':' + + f(d.getUTCSeconds()) + 'Z' : null; + }; + + var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + gap, + indent, + meta = { // table of character substitutions + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '\\': '\\\\' + }, + rep; + + + function quote(string) { + +// If the string contains no control characters, no quote characters, and no +// backslash characters, then we can safely slap some quotes around it. +// Otherwise we must also replace the offending characters with safe escape +// sequences. + + escapable.lastIndex = 0; + return escapable.test(string) ? '"' + string.replace(escapable, function (a) { + var c = meta[a]; + return typeof c === 'string' ? c : + '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }) + '"' : '"' + string + '"'; + } + + + function str(key, holder) { + +// Produce a string from holder[key]. + + var i, // The loop counter. + k, // The member key. + v, // The member value. + length, + mind = gap, + partial, + value = holder[key]; + +// If the value has a toJSON method, call it to obtain a replacement value. + + if (value instanceof Date) { + value = date(key); + } + +// If we were called with a replacer function, then call the replacer to +// obtain a replacement value. + + if (typeof rep === 'function') { + value = rep.call(holder, key, value); + } + +// What happens next depends on the value's type. + + switch (typeof value) { + case 'string': + return quote(value); + + case 'number': + +// JSON numbers must be finite. Encode non-finite numbers as null. + + return isFinite(value) ? String(value) : 'null'; + + case 'boolean': + case 'null': + +// If the value is a boolean or null, convert it to a string. Note: +// typeof null does not produce 'null'. The case is included here in +// the remote chance that this gets fixed someday. + + return String(value); + +// If the type is 'object', we might be dealing with an object or an array or +// null. + + case 'object': + +// Due to a specification blunder in ECMAScript, typeof null is 'object', +// so watch out for that case. + + if (!value) { + return 'null'; + } + +// Make an array to hold the partial results of stringifying this object value. + + gap += indent; + partial = []; + +// Is the value an array? + + if (Object.prototype.toString.apply(value) === '[object Array]') { + +// The value is an array. Stringify every element. Use null as a placeholder +// for non-JSON values. + + length = value.length; + for (i = 0; i < length; i += 1) { + partial[i] = str(i, value) || 'null'; + } + +// Join all of the elements together, separated with commas, and wrap them in +// brackets. + + v = partial.length === 0 ? '[]' : gap ? + '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : + '[' + partial.join(',') + ']'; + gap = mind; + return v; + } + +// If the replacer is an array, use it to select the members to be stringified. + + if (rep && typeof rep === 'object') { + length = rep.length; + for (i = 0; i < length; i += 1) { + if (typeof rep[i] === 'string') { + k = rep[i]; + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } else { + +// Otherwise, iterate through all of the keys in the object. + + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } + +// Join all of the member texts together, separated with commas, +// and wrap them in braces. + + v = partial.length === 0 ? '{}' : gap ? + '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : + '{' + partial.join(',') + '}'; + gap = mind; + return v; + } + } + +// If the JSON object does not yet have a stringify method, give it one. + + JSON.stringify = function (value, replacer, space) { + +// The stringify method takes a value and an optional replacer, and an optional +// space parameter, and returns a JSON text. The replacer can be a function +// that can replace values, or an array of strings that will select the keys. +// A default replacer method can be provided. Use of the space parameter can +// produce text that is more easily readable. + + var i; + gap = ''; + indent = ''; + +// If the space parameter is a number, make an indent string containing that +// many spaces. + + if (typeof space === 'number') { + for (i = 0; i < space; i += 1) { + indent += ' '; + } + +// If the space parameter is a string, it will be used as the indent string. + + } else if (typeof space === 'string') { + indent = space; + } + +// If there is a replacer, it must be a function or an array. +// Otherwise, throw an error. + + rep = replacer; + if (replacer && typeof replacer !== 'function' && + (typeof replacer !== 'object' || + typeof replacer.length !== 'number')) { + throw new Error('JSON.stringify'); + } + +// Make a fake root object containing our value under the key of ''. +// Return the result of stringifying the value. + + return str('', {'': value}); + }; + +// If the JSON object does not yet have a parse method, give it one. + + JSON.parse = function (text, reviver) { + // The parse method takes a text and an optional reviver function, and returns + // a JavaScript value if the text is a valid JSON text. + + var j; + + function walk(holder, key) { + + // The walk method is used to recursively walk the resulting structure so + // that modifications can be made. + + var k, v, value = holder[key]; + if (value && typeof value === 'object') { + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = walk(value, k); + if (v !== undefined) { + value[k] = v; + } else { + delete value[k]; + } + } + } + } + return reviver.call(holder, key, value); + } + + + // Parsing happens in four stages. In the first stage, we replace certain + // Unicode characters with escape sequences. JavaScript handles many characters + // incorrectly, either silently deleting them, or treating them as line endings. + + text = String(text); + cx.lastIndex = 0; + if (cx.test(text)) { + text = text.replace(cx, function (a) { + return '\\u' + + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }); + } + + // In the second stage, we run the text against regular expressions that look + // for non-JSON patterns. We are especially concerned with '()' and 'new' + // because they can cause invocation, and '=' because it can cause mutation. + // But just to be safe, we want to reject all unexpected forms. + + // We split the second stage into 4 regexp operations in order to work around + // crippling inefficiencies in IE's and Safari's regexp engines. First we + // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we + // replace all simple value tokens with ']' characters. Third, we delete all + // open brackets that follow a colon or comma or that begin the text. Finally, + // we look to see that the remaining characters are only whitespace or ']' or + // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. + + if (/^[\],:{}\s]*$/ + .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') + .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') + .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { + + // In the third stage we use the eval function to compile the text into a + // JavaScript structure. The '{' operator is subject to a syntactic ambiguity + // in JavaScript: it can begin a block or an object literal. We wrap the text + // in parens to eliminate the ambiguity. + + j = eval('(' + text + ')'); + + // In the optional fourth stage, we recursively walk the new structure, passing + // each name/value pair to a reviver function for possible transformation. + + return typeof reviver === 'function' ? + walk({'': j}, '') : j; + } + + // If the text is not JSON parseable, then a SyntaxError is thrown. + + throw new SyntaxError('JSON.parse'); + }; + +})( + 'undefined' != typeof io ? io : module.exports + , typeof JSON !== 'undefined' ? JSON : undefined +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Parser namespace. + * + * @namespace + */ + + var parser = exports.parser = {}; + + /** + * Packet types. + */ + + var packets = parser.packets = [ + 'disconnect' + , 'connect' + , 'heartbeat' + , 'message' + , 'json' + , 'event' + , 'ack' + , 'error' + , 'noop' + ]; + + /** + * Errors reasons. + */ + + var reasons = parser.reasons = [ + 'transport not supported' + , 'client not handshaken' + , 'unauthorized' + ]; + + /** + * Errors advice. + */ + + var advice = parser.advice = [ + 'reconnect' + ]; + + /** + * Shortcuts. + */ + + var JSON = io.JSON + , indexOf = io.util.indexOf; + + /** + * Encodes a packet. + * + * @api private + */ + + parser.encodePacket = function (packet) { + var type = indexOf(packets, packet.type) + , id = packet.id || '' + , endpoint = packet.endpoint || '' + , ack = packet.ack + , data = null; + + switch (packet.type) { + case 'error': + var reason = packet.reason ? indexOf(reasons, packet.reason) : '' + , adv = packet.advice ? indexOf(advice, packet.advice) : ''; + + if (reason !== '' || adv !== '') + data = reason + (adv !== '' ? ('+' + adv) : ''); + + break; + + case 'message': + if (packet.data !== '') + data = packet.data; + break; + + case 'event': + var ev = { name: packet.name }; + + if (packet.args && packet.args.length) { + ev.args = packet.args; + } + + data = JSON.stringify(ev); + break; + + case 'json': + data = JSON.stringify(packet.data); + break; + + case 'connect': + if (packet.qs) + data = packet.qs; + break; + + case 'ack': + data = packet.ackId + + (packet.args && packet.args.length + ? '+' + JSON.stringify(packet.args) : ''); + break; + } + + // construct packet with required fragments + var encoded = [ + type + , id + (ack == 'data' ? '+' : '') + , endpoint + ]; + + // data fragment is optional + if (data !== null && data !== undefined) + encoded.push(data); + + return encoded.join(':'); + }; + + /** + * Encodes multiple messages (payload). + * + * @param {Array} messages + * @api private + */ + + parser.encodePayload = function (packets) { + var decoded = ''; + + if (packets.length == 1) + return packets[0]; + + for (var i = 0, l = packets.length; i < l; i++) { + var packet = packets[i]; + decoded += '\ufffd' + packet.length + '\ufffd' + packets[i]; + } + + return decoded; + }; + + /** + * Decodes a packet + * + * @api private + */ + + var regexp = /([^:]+):([0-9]+)?(\+)?:([^:]+)?:?([\s\S]*)?/; + + parser.decodePacket = function (data) { + var pieces = data.match(regexp); + + if (!pieces) return {}; + + var id = pieces[2] || '' + , data = pieces[5] || '' + , packet = { + type: packets[pieces[1]] + , endpoint: pieces[4] || '' + }; + + // whether we need to acknowledge the packet + if (id) { + packet.id = id; + if (pieces[3]) + packet.ack = 'data'; + else + packet.ack = true; + } + + // handle different packet types + switch (packet.type) { + case 'error': + var pieces = data.split('+'); + packet.reason = reasons[pieces[0]] || ''; + packet.advice = advice[pieces[1]] || ''; + break; + + case 'message': + packet.data = data || ''; + break; + + case 'event': + try { + var opts = JSON.parse(data); + packet.name = opts.name; + packet.args = opts.args; + } catch (e) { } + + packet.args = packet.args || []; + break; + + case 'json': + try { + packet.data = JSON.parse(data); + } catch (e) { } + break; + + case 'connect': + packet.qs = data || ''; + break; + + case 'ack': + var pieces = data.match(/^([0-9]+)(\+)?(.*)/); + if (pieces) { + packet.ackId = pieces[1]; + packet.args = []; + + if (pieces[3]) { + try { + packet.args = pieces[3] ? JSON.parse(pieces[3]) : []; + } catch (e) { } + } + } + break; + + case 'disconnect': + case 'heartbeat': + break; + }; + + return packet; + }; + + /** + * Decodes data payload. Detects multiple messages + * + * @return {Array} messages + * @api public + */ + + parser.decodePayload = function (data) { + // IE doesn't like data[i] for unicode chars, charAt works fine + if (data.charAt(0) == '\ufffd') { + var ret = []; + + for (var i = 1, length = ''; i < data.length; i++) { + if (data.charAt(i) == '\ufffd') { + ret.push(parser.decodePacket(data.substr(i + 1).substr(0, length))); + i += Number(length) + 1; + length = ''; + } else { + length += data.charAt(i); + } + } + + return ret; + } else { + return [parser.decodePacket(data)]; + } + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.Transport = Transport; + + /** + * This is the transport template for all supported transport methods. + * + * @constructor + * @api public + */ + + function Transport (socket, sessid) { + this.socket = socket; + this.sessid = sessid; + }; + + /** + * Apply EventEmitter mixin. + */ + + io.util.mixin(Transport, io.EventEmitter); + + + /** + * Indicates whether heartbeats is enabled for this transport + * + * @api private + */ + + Transport.prototype.heartbeats = function () { + return true; + }; + + /** + * Handles the response from the server. When a new response is received + * it will automatically update the timeout, decode the message and + * forwards the response to the onMessage function for further processing. + * + * @param {String} data Response from the server. + * @api private + */ + + Transport.prototype.onData = function (data) { + this.clearCloseTimeout(); + + // If the connection in currently open (or in a reopening state) reset the close + // timeout since we have just received data. This check is necessary so + // that we don't reset the timeout on an explicitly disconnected connection. + if (this.socket.connected || this.socket.connecting || this.socket.reconnecting) { + this.setCloseTimeout(); + } + + if (data !== '') { + // todo: we should only do decodePayload for xhr transports + var msgs = io.parser.decodePayload(data); + + if (msgs && msgs.length) { + for (var i = 0, l = msgs.length; i < l; i++) { + this.onPacket(msgs[i]); + } + } + } + + return this; + }; + + /** + * Handles packets. + * + * @api private + */ + + Transport.prototype.onPacket = function (packet) { + this.socket.setHeartbeatTimeout(); + + if (packet.type == 'heartbeat') { + return this.onHeartbeat(); + } + + if (packet.type == 'connect' && packet.endpoint == '') { + this.onConnect(); + } + + if (packet.type == 'error' && packet.advice == 'reconnect') { + this.isOpen = false; + } + + this.socket.onPacket(packet); + + return this; + }; + + /** + * Sets close timeout + * + * @api private + */ + + Transport.prototype.setCloseTimeout = function () { + if (!this.closeTimeout) { + var self = this; + + this.closeTimeout = setTimeout(function () { + self.onDisconnect(); + }, this.socket.closeTimeout); + } + }; + + /** + * Called when transport disconnects. + * + * @api private + */ + + Transport.prototype.onDisconnect = function () { + if (this.isOpen) this.close(); + this.clearTimeouts(); + this.socket.onDisconnect(); + return this; + }; + + /** + * Called when transport connects + * + * @api private + */ + + Transport.prototype.onConnect = function () { + this.socket.onConnect(); + return this; + }; + + /** + * Clears close timeout + * + * @api private + */ + + Transport.prototype.clearCloseTimeout = function () { + if (this.closeTimeout) { + clearTimeout(this.closeTimeout); + this.closeTimeout = null; + } + }; + + /** + * Clear timeouts + * + * @api private + */ + + Transport.prototype.clearTimeouts = function () { + this.clearCloseTimeout(); + + if (this.reopenTimeout) { + clearTimeout(this.reopenTimeout); + } + }; + + /** + * Sends a packet + * + * @param {Object} packet object. + * @api private + */ + + Transport.prototype.packet = function (packet) { + this.send(io.parser.encodePacket(packet)); + }; + + /** + * Send the received heartbeat message back to server. So the server + * knows we are still connected. + * + * @param {String} heartbeat Heartbeat response from the server. + * @api private + */ + + Transport.prototype.onHeartbeat = function (heartbeat) { + this.packet({ type: 'heartbeat' }); + }; + + /** + * Called when the transport opens. + * + * @api private + */ + + Transport.prototype.onOpen = function () { + this.isOpen = true; + this.clearCloseTimeout(); + this.socket.onOpen(); + }; + + /** + * Notifies the base when the connection with the Socket.IO server + * has been disconnected. + * + * @api private + */ + + Transport.prototype.onClose = function () { + var self = this; + + /* FIXME: reopen delay causing a infinit loop + this.reopenTimeout = setTimeout(function () { + self.open(); + }, this.socket.options['reopen delay']);*/ + + this.isOpen = false; + this.socket.onClose(); + this.onDisconnect(); + }; + + /** + * Generates a connection url based on the Socket.IO URL Protocol. + * See for more details. + * + * @returns {String} Connection url + * @api private + */ + + Transport.prototype.prepareUrl = function () { + var options = this.socket.options; + + return this.scheme() + '://' + + options.host + ':' + options.port + '/' + + options.resource + '/' + io.protocol + + '/' + this.name + '/' + this.sessid; + }; + + /** + * Checks if the transport is ready to start a connection. + * + * @param {Socket} socket The socket instance that needs a transport + * @param {Function} fn The callback + * @api private + */ + + Transport.prototype.ready = function (socket, fn) { + fn.call(this); + }; +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + */ + + exports.Socket = Socket; + + /** + * Create a new `Socket.IO client` which can establish a persistent + * connection with a Socket.IO enabled server. + * + * @api public + */ + + function Socket (options) { + this.options = { + port: 80 + , secure: false + , document: 'document' in global ? document : false + , resource: 'socket.io' + , transports: io.transports + , 'connect timeout': 10000 + , 'try multiple transports': true + , 'reconnect': true + , 'reconnection delay': 500 + , 'reconnection limit': Infinity + , 'reopen delay': 3000 + , 'max reconnection attempts': 10 + , 'sync disconnect on unload': false + , 'auto connect': true + , 'flash policy port': 10843 + , 'manualFlush': false + }; + + io.util.merge(this.options, options); + + this.connected = false; + this.open = false; + this.connecting = false; + this.reconnecting = false; + this.namespaces = {}; + this.buffer = []; + this.doBuffer = false; + + if (this.options['sync disconnect on unload'] && + (!this.isXDomain() || io.util.ua.hasCORS)) { + var self = this; + io.util.on(global, 'beforeunload', function () { + self.disconnectSync(); + }, false); + } + + if (this.options['auto connect']) { + this.connect(); + } +}; + + /** + * Apply EventEmitter mixin. + */ + + io.util.mixin(Socket, io.EventEmitter); + + /** + * Returns a namespace listener/emitter for this socket + * + * @api public + */ + + Socket.prototype.of = function (name) { + if (!this.namespaces[name]) { + this.namespaces[name] = new io.SocketNamespace(this, name); + + if (name !== '') { + this.namespaces[name].packet({ type: 'connect' }); + } + } + + return this.namespaces[name]; + }; + + /** + * Emits the given event to the Socket and all namespaces + * + * @api private + */ + + Socket.prototype.publish = function () { + this.emit.apply(this, arguments); + + var nsp; + + for (var i in this.namespaces) { + if (this.namespaces.hasOwnProperty(i)) { + nsp = this.of(i); + nsp.$emit.apply(nsp, arguments); + } + } + }; + + /** + * Performs the handshake + * + * @api private + */ + + function empty () { }; + + Socket.prototype.handshake = function (fn) { + var self = this + , options = this.options; + + function complete (data) { + if (data instanceof Error) { + self.connecting = false; + self.onError(data.message); + } else { + fn.apply(null, data.split(':')); + } + }; + + var url = [ + 'http' + (options.secure ? 's' : '') + ':/' + , options.host + ':' + options.port + , options.resource + , io.protocol + , io.util.query(this.options.query, 't=' + +new Date) + ].join('/'); + + if (this.isXDomain() && !io.util.ua.hasCORS) { + var insertAt = document.getElementsByTagName('script')[0] + , script = document.createElement('script'); + + script.src = url + '&jsonp=' + io.j.length; + insertAt.parentNode.insertBefore(script, insertAt); + + io.j.push(function (data) { + complete(data); + script.parentNode.removeChild(script); + }); + } else { + var xhr = io.util.request(); + + xhr.open('GET', url, true); + if (this.isXDomain()) { + xhr.withCredentials = true; + } + xhr.onreadystatechange = function () { + if (xhr.readyState == 4) { + xhr.onreadystatechange = empty; + + if (xhr.status == 200) { + complete(xhr.responseText); + } else if (xhr.status == 403) { + self.onError(xhr.responseText); + } else { + self.connecting = false; + !self.reconnecting && self.onError(xhr.responseText); + } + } + }; + xhr.send(null); + } + }; + + /** + * Find an available transport based on the options supplied in the constructor. + * + * @api private + */ + + Socket.prototype.getTransport = function (override) { + var transports = override || this.transports, match; + + for (var i = 0, transport; transport = transports[i]; i++) { + if (io.Transport[transport] + && io.Transport[transport].check(this) + && (!this.isXDomain() || io.Transport[transport].xdomainCheck(this))) { + return new io.Transport[transport](this, this.sessionid); + } + } + + return null; + }; + + /** + * Connects to the server. + * + * @param {Function} [fn] Callback. + * @returns {io.Socket} + * @api public + */ + + Socket.prototype.connect = function (fn) { + if (this.connecting) { + return this; + } + + var self = this; + self.connecting = true; + + this.handshake(function (sid, heartbeat, close, transports) { + self.sessionid = sid; + self.closeTimeout = close * 1000; + self.heartbeatTimeout = heartbeat * 1000; + if(!self.transports) + self.transports = self.origTransports = (transports ? io.util.intersect( + transports.split(',') + , self.options.transports + ) : self.options.transports); + + self.setHeartbeatTimeout(); + + function connect (transports){ + if (self.transport) self.transport.clearTimeouts(); + + self.transport = self.getTransport(transports); + if (!self.transport) return self.publish('connect_failed'); + + // once the transport is ready + self.transport.ready(self, function () { + self.connecting = true; + self.publish('connecting', self.transport.name); + self.transport.open(); + + if (self.options['connect timeout']) { + self.connectTimeoutTimer = setTimeout(function () { + if (!self.connected) { + self.connecting = false; + + if (self.options['try multiple transports']) { + var remaining = self.transports; + + while (remaining.length > 0 && remaining.splice(0,1)[0] != + self.transport.name) {} + + if (remaining.length){ + connect(remaining); + } else { + self.publish('connect_failed'); + } + } + } + }, self.options['connect timeout']); + } + }); + } + + connect(self.transports); + + self.once('connect', function (){ + clearTimeout(self.connectTimeoutTimer); + + fn && typeof fn == 'function' && fn(); + }); + }); + + return this; + }; + + /** + * Clears and sets a new heartbeat timeout using the value given by the + * server during the handshake. + * + * @api private + */ + + Socket.prototype.setHeartbeatTimeout = function () { + clearTimeout(this.heartbeatTimeoutTimer); + if(this.transport && !this.transport.heartbeats()) return; + + var self = this; + this.heartbeatTimeoutTimer = setTimeout(function () { + self.transport.onClose(); + }, this.heartbeatTimeout); + }; + + /** + * Sends a message. + * + * @param {Object} data packet. + * @returns {io.Socket} + * @api public + */ + + Socket.prototype.packet = function (data) { + if (this.connected && !this.doBuffer) { + this.transport.packet(data); + } else { + this.buffer.push(data); + } + + return this; + }; + + /** + * Sets buffer state + * + * @api private + */ + + Socket.prototype.setBuffer = function (v) { + this.doBuffer = v; + + if (!v && this.connected && this.buffer.length) { + if (!this.options['manualFlush']) { + this.flushBuffer(); + } + } + }; + + /** + * Flushes the buffer data over the wire. + * To be invoked manually when 'manualFlush' is set to true. + * + * @api public + */ + + Socket.prototype.flushBuffer = function() { + this.transport.payload(this.buffer); + this.buffer = []; + }; + + + /** + * Disconnect the established connect. + * + * @returns {io.Socket} + * @api public + */ + + Socket.prototype.disconnect = function () { + if (this.connected || this.connecting) { + if (this.open) { + this.of('').packet({ type: 'disconnect' }); + } + + // handle disconnection immediately + this.onDisconnect('booted'); + } + + return this; + }; + + /** + * Disconnects the socket with a sync XHR. + * + * @api private + */ + + Socket.prototype.disconnectSync = function () { + // ensure disconnection + var xhr = io.util.request(); + var uri = [ + 'http' + (this.options.secure ? 's' : '') + ':/' + , this.options.host + ':' + this.options.port + , this.options.resource + , io.protocol + , '' + , this.sessionid + ].join('/') + '/?disconnect=1'; + + xhr.open('GET', uri, false); + xhr.send(null); + + // handle disconnection immediately + this.onDisconnect('booted'); + }; + + /** + * Check if we need to use cross domain enabled transports. Cross domain would + * be a different port or different domain name. + * + * @returns {Boolean} + * @api private + */ + + Socket.prototype.isXDomain = function () { + + var port = global.location.port || + ('https:' == global.location.protocol ? 443 : 80); + + return this.options.host !== global.location.hostname + || this.options.port != port; + }; + + /** + * Called upon handshake. + * + * @api private + */ + + Socket.prototype.onConnect = function () { + if (!this.connected) { + this.connected = true; + this.connecting = false; + if (!this.doBuffer) { + // make sure to flush the buffer + this.setBuffer(false); + } + this.emit('connect'); + } + }; + + /** + * Called when the transport opens + * + * @api private + */ + + Socket.prototype.onOpen = function () { + this.open = true; + }; + + /** + * Called when the transport closes. + * + * @api private + */ + + Socket.prototype.onClose = function () { + this.open = false; + clearTimeout(this.heartbeatTimeoutTimer); + }; + + /** + * Called when the transport first opens a connection + * + * @param text + */ + + Socket.prototype.onPacket = function (packet) { + this.of(packet.endpoint).onPacket(packet); + }; + + /** + * Handles an error. + * + * @api private + */ + + Socket.prototype.onError = function (err) { + if (err && err.advice) { + if (err.advice === 'reconnect' && (this.connected || this.connecting)) { + this.disconnect(); + if (this.options.reconnect) { + this.reconnect(); + } + } + } + + this.publish('error', err && err.reason ? err.reason : err); + }; + + /** + * Called when the transport disconnects. + * + * @api private + */ + + Socket.prototype.onDisconnect = function (reason) { + var wasConnected = this.connected + , wasConnecting = this.connecting; + + this.connected = false; + this.connecting = false; + this.open = false; + + if (wasConnected || wasConnecting) { + this.transport.close(); + this.transport.clearTimeouts(); + if (wasConnected) { + this.publish('disconnect', reason); + + if ('booted' != reason && this.options.reconnect && !this.reconnecting) { + this.reconnect(); + } + } + } + }; + + /** + * Called upon reconnection. + * + * @api private + */ + + Socket.prototype.reconnect = function () { + this.reconnecting = true; + this.reconnectionAttempts = 0; + this.reconnectionDelay = this.options['reconnection delay']; + + var self = this + , maxAttempts = this.options['max reconnection attempts'] + , tryMultiple = this.options['try multiple transports'] + , limit = this.options['reconnection limit']; + + function reset () { + if (self.connected) { + for (var i in self.namespaces) { + if (self.namespaces.hasOwnProperty(i) && '' !== i) { + self.namespaces[i].packet({ type: 'connect' }); + } + } + self.publish('reconnect', self.transport.name, self.reconnectionAttempts); + } + + clearTimeout(self.reconnectionTimer); + + self.removeListener('connect_failed', maybeReconnect); + self.removeListener('connect', maybeReconnect); + + self.reconnecting = false; + + delete self.reconnectionAttempts; + delete self.reconnectionDelay; + delete self.reconnectionTimer; + delete self.redoTransports; + + self.options['try multiple transports'] = tryMultiple; + }; + + function maybeReconnect () { + if (!self.reconnecting) { + return; + } + + if (self.connected) { + return reset(); + }; + + if (self.connecting && self.reconnecting) { + return self.reconnectionTimer = setTimeout(maybeReconnect, 1000); + } + + if (self.reconnectionAttempts++ >= maxAttempts) { + if (!self.redoTransports) { + self.on('connect_failed', maybeReconnect); + self.options['try multiple transports'] = true; + self.transports = self.origTransports; + self.transport = self.getTransport(); + self.redoTransports = true; + self.connect(); + } else { + self.publish('reconnect_failed'); + reset(); + } + } else { + if (self.reconnectionDelay < limit) { + self.reconnectionDelay *= 2; // exponential back off + } + + self.connect(); + self.publish('reconnecting', self.reconnectionDelay, self.reconnectionAttempts); + self.reconnectionTimer = setTimeout(maybeReconnect, self.reconnectionDelay); + } + }; + + this.options['try multiple transports'] = false; + this.reconnectionTimer = setTimeout(maybeReconnect, this.reconnectionDelay); + + this.on('connect', maybeReconnect); + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.SocketNamespace = SocketNamespace; + + /** + * Socket namespace constructor. + * + * @constructor + * @api public + */ + + function SocketNamespace (socket, name) { + this.socket = socket; + this.name = name || ''; + this.flags = {}; + this.json = new Flag(this, 'json'); + this.ackPackets = 0; + this.acks = {}; + }; + + /** + * Apply EventEmitter mixin. + */ + + io.util.mixin(SocketNamespace, io.EventEmitter); + + /** + * Copies emit since we override it + * + * @api private + */ + + SocketNamespace.prototype.$emit = io.EventEmitter.prototype.emit; + + /** + * Creates a new namespace, by proxying the request to the socket. This + * allows us to use the synax as we do on the server. + * + * @api public + */ + + SocketNamespace.prototype.of = function () { + return this.socket.of.apply(this.socket, arguments); + }; + + /** + * Sends a packet. + * + * @api private + */ + + SocketNamespace.prototype.packet = function (packet) { + packet.endpoint = this.name; + this.socket.packet(packet); + this.flags = {}; + return this; + }; + + /** + * Sends a message + * + * @api public + */ + + SocketNamespace.prototype.send = function (data, fn) { + var packet = { + type: this.flags.json ? 'json' : 'message' + , data: data + }; + + if ('function' == typeof fn) { + packet.id = ++this.ackPackets; + packet.ack = true; + this.acks[packet.id] = fn; + } + + return this.packet(packet); + }; + + /** + * Emits an event + * + * @api public + */ + + SocketNamespace.prototype.emit = function (name) { + var args = Array.prototype.slice.call(arguments, 1) + , lastArg = args[args.length - 1] + , packet = { + type: 'event' + , name: name + }; + + if ('function' == typeof lastArg) { + packet.id = ++this.ackPackets; + packet.ack = 'data'; + this.acks[packet.id] = lastArg; + args = args.slice(0, args.length - 1); + } + + packet.args = args; + + return this.packet(packet); + }; + + /** + * Disconnects the namespace + * + * @api private + */ + + SocketNamespace.prototype.disconnect = function () { + if (this.name === '') { + this.socket.disconnect(); + } else { + this.packet({ type: 'disconnect' }); + this.$emit('disconnect'); + } + + return this; + }; + + /** + * Handles a packet + * + * @api private + */ + + SocketNamespace.prototype.onPacket = function (packet) { + var self = this; + + function ack () { + self.packet({ + type: 'ack' + , args: io.util.toArray(arguments) + , ackId: packet.id + }); + }; + + switch (packet.type) { + case 'connect': + this.$emit('connect'); + break; + + case 'disconnect': + if (this.name === '') { + this.socket.onDisconnect(packet.reason || 'booted'); + } else { + this.$emit('disconnect', packet.reason); + } + break; + + case 'message': + case 'json': + var params = ['message', packet.data]; + + if (packet.ack == 'data') { + params.push(ack); + } else if (packet.ack) { + this.packet({ type: 'ack', ackId: packet.id }); + } + + this.$emit.apply(this, params); + break; + + case 'event': + var params = [packet.name].concat(packet.args); + + if (packet.ack == 'data') + params.push(ack); + + this.$emit.apply(this, params); + break; + + case 'ack': + if (this.acks[packet.ackId]) { + this.acks[packet.ackId].apply(this, packet.args); + delete this.acks[packet.ackId]; + } + break; + + case 'error': + if (packet.advice){ + this.socket.onError(packet); + } else { + if (packet.reason == 'unauthorized') { + this.$emit('connect_failed', packet.reason); + } else { + this.$emit('error', packet.reason); + } + } + break; + } + }; + + /** + * Flag interface. + * + * @api private + */ + + function Flag (nsp, name) { + this.namespace = nsp; + this.name = name; + }; + + /** + * Send a message + * + * @api public + */ + + Flag.prototype.send = function () { + this.namespace.flags[this.name] = true; + this.namespace.send.apply(this.namespace, arguments); + }; + + /** + * Emit an event + * + * @api public + */ + + Flag.prototype.emit = function () { + this.namespace.flags[this.name] = true; + this.namespace.emit.apply(this.namespace, arguments); + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + */ + + exports.websocket = WS; + + /** + * The WebSocket transport uses the HTML5 WebSocket API to establish an + * persistent connection with the Socket.IO server. This transport will also + * be inherited by the FlashSocket fallback as it provides a API compatible + * polyfill for the WebSockets. + * + * @constructor + * @extends {io.Transport} + * @api public + */ + + function WS (socket) { + io.Transport.apply(this, arguments); + }; + + /** + * Inherits from Transport. + */ + + io.util.inherit(WS, io.Transport); + + /** + * Transport name + * + * @api public + */ + + WS.prototype.name = 'websocket'; + + /** + * Initializes a new `WebSocket` connection with the Socket.IO server. We attach + * all the appropriate listeners to handle the responses from the server. + * + * @returns {Transport} + * @api public + */ + + WS.prototype.open = function () { + var query = io.util.query(this.socket.options.query) + , self = this + , Socket + + + if (!Socket) { + Socket = global.MozWebSocket || global.WebSocket; + } + + this.websocket = new Socket(this.prepareUrl() + query); + + this.websocket.onopen = function () { + self.onOpen(); + self.socket.setBuffer(false); + }; + this.websocket.onmessage = function (ev) { + self.onData(ev.data); + }; + this.websocket.onclose = function () { + self.onClose(); + self.socket.setBuffer(true); + }; + this.websocket.onerror = function (e) { + self.onError(e); + }; + + return this; + }; + + /** + * Send a message to the Socket.IO server. The message will automatically be + * encoded in the correct message format. + * + * @returns {Transport} + * @api public + */ + + // Do to a bug in the current IDevices browser, we need to wrap the send in a + // setTimeout, when they resume from sleeping the browser will crash if + // we don't allow the browser time to detect the socket has been closed + if (io.util.ua.iDevice) { + WS.prototype.send = function (data) { + var self = this; + setTimeout(function() { + self.websocket.send(data); + },0); + return this; + }; + } else { + WS.prototype.send = function (data) { + this.websocket.send(data); + return this; + }; + } + + /** + * Payload + * + * @api private + */ + + WS.prototype.payload = function (arr) { + for (var i = 0, l = arr.length; i < l; i++) { + this.packet(arr[i]); + } + return this; + }; + + /** + * Disconnect the established `WebSocket` connection. + * + * @returns {Transport} + * @api public + */ + + WS.prototype.close = function () { + this.websocket.close(); + return this; + }; + + /** + * Handle the errors that `WebSocket` might be giving when we + * are attempting to connect or send messages. + * + * @param {Error} e The error. + * @api private + */ + + WS.prototype.onError = function (e) { + this.socket.onError(e); + }; + + /** + * Returns the appropriate scheme for the URI generation. + * + * @api private + */ + WS.prototype.scheme = function () { + return this.socket.options.secure ? 'wss' : 'ws'; + }; + + /** + * Checks if the browser has support for native `WebSockets` and that + * it's not the polyfill created for the FlashSocket transport. + * + * @return {Boolean} + * @api public + */ + + WS.check = function () { + return ('WebSocket' in global && !('__addTask' in WebSocket)) + || 'MozWebSocket' in global; + }; + + /** + * Check if the `WebSocket` transport support cross domain communications. + * + * @returns {Boolean} + * @api public + */ + + WS.xdomainCheck = function () { + return true; + }; + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('websocket'); + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.flashsocket = Flashsocket; + + /** + * The FlashSocket transport. This is a API wrapper for the HTML5 WebSocket + * specification. It uses a .swf file to communicate with the server. If you want + * to serve the .swf file from a other server than where the Socket.IO script is + * coming from you need to use the insecure version of the .swf. More information + * about this can be found on the github page. + * + * @constructor + * @extends {io.Transport.websocket} + * @api public + */ + + function Flashsocket () { + io.Transport.websocket.apply(this, arguments); + }; + + /** + * Inherits from Transport. + */ + + io.util.inherit(Flashsocket, io.Transport.websocket); + + /** + * Transport name + * + * @api public + */ + + Flashsocket.prototype.name = 'flashsocket'; + + /** + * Disconnect the established `FlashSocket` connection. This is done by adding a + * new task to the FlashSocket. The rest will be handled off by the `WebSocket` + * transport. + * + * @returns {Transport} + * @api public + */ + + Flashsocket.prototype.open = function () { + var self = this + , args = arguments; + + WebSocket.__addTask(function () { + io.Transport.websocket.prototype.open.apply(self, args); + }); + return this; + }; + + /** + * Sends a message to the Socket.IO server. This is done by adding a new + * task to the FlashSocket. The rest will be handled off by the `WebSocket` + * transport. + * + * @returns {Transport} + * @api public + */ + + Flashsocket.prototype.send = function () { + var self = this, args = arguments; + WebSocket.__addTask(function () { + io.Transport.websocket.prototype.send.apply(self, args); + }); + return this; + }; + + /** + * Disconnects the established `FlashSocket` connection. + * + * @returns {Transport} + * @api public + */ + + Flashsocket.prototype.close = function () { + WebSocket.__tasks.length = 0; + io.Transport.websocket.prototype.close.call(this); + return this; + }; + + /** + * The WebSocket fall back needs to append the flash container to the body + * element, so we need to make sure we have access to it. Or defer the call + * until we are sure there is a body element. + * + * @param {Socket} socket The socket instance that needs a transport + * @param {Function} fn The callback + * @api private + */ + + Flashsocket.prototype.ready = function (socket, fn) { + function init () { + var options = socket.options + , port = options['flash policy port'] + , path = [ + 'http' + (options.secure ? 's' : '') + ':/' + , options.host + ':' + options.port + , options.resource + , 'static/flashsocket' + , 'WebSocketMain' + (socket.isXDomain() ? 'Insecure' : '') + '.swf' + ]; + + // Only start downloading the swf file when the checked that this browser + // actually supports it + if (!Flashsocket.loaded) { + if (typeof WEB_SOCKET_SWF_LOCATION === 'undefined') { + // Set the correct file based on the XDomain settings + WEB_SOCKET_SWF_LOCATION = path.join('/'); + } + + if (port !== 843) { + WebSocket.loadFlashPolicyFile('xmlsocket://' + options.host + ':' + port); + } + + WebSocket.__initialize(); + Flashsocket.loaded = true; + } + + fn.call(self); + } + + var self = this; + if (document.body) return init(); + + io.util.load(init); + }; + + /** + * Check if the FlashSocket transport is supported as it requires that the Adobe + * Flash Player plug-in version `10.0.0` or greater is installed. And also check if + * the polyfill is correctly loaded. + * + * @returns {Boolean} + * @api public + */ + + Flashsocket.check = function () { + if ( + typeof WebSocket == 'undefined' + || !('__initialize' in WebSocket) || !swfobject + ) return false; + + return swfobject.getFlashPlayerVersion().major >= 10; + }; + + /** + * Check if the FlashSocket transport can be used as cross domain / cross origin + * transport. Because we can't see which type (secure or insecure) of .swf is used + * we will just return true. + * + * @returns {Boolean} + * @api public + */ + + Flashsocket.xdomainCheck = function () { + return true; + }; + + /** + * Disable AUTO_INITIALIZATION + */ + + if (typeof window != 'undefined') { + WEB_SOCKET_DISABLE_AUTO_INITIALIZATION = true; + } + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('flashsocket'); +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); +/* SWFObject v2.2 + is released under the MIT License +*/ +if ('undefined' != typeof window) { +var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O[(['Active'].concat('Object').join('X'))]!=D){try{var ad=new window[(['Active'].concat('Object').join('X'))](W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y0){for(var af=0;af0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad'}}aa.outerHTML='"+af+"";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab +// License: New BSD License +// Reference: http://dev.w3.org/html5/websockets/ +// Reference: http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol + +(function() { + + if ('undefined' == typeof window || window.WebSocket) return; + + var console = window.console; + if (!console || !console.log || !console.error) { + console = {log: function(){ }, error: function(){ }}; + } + + if (!swfobject.hasFlashPlayerVersion("10.0.0")) { + console.error("Flash Player >= 10.0.0 is required."); + return; + } + if (location.protocol == "file:") { + console.error( + "WARNING: web-socket-js doesn't work in file:///... URL " + + "unless you set Flash Security Settings properly. " + + "Open the page via Web server i.e. http://..."); + } + + /** + * This class represents a faux web socket. + * @param {string} url + * @param {array or string} protocols + * @param {string} proxyHost + * @param {int} proxyPort + * @param {string} headers + */ + WebSocket = function(url, protocols, proxyHost, proxyPort, headers) { + var self = this; + self.__id = WebSocket.__nextId++; + WebSocket.__instances[self.__id] = self; + self.readyState = WebSocket.CONNECTING; + self.bufferedAmount = 0; + self.__events = {}; + if (!protocols) { + protocols = []; + } else if (typeof protocols == "string") { + protocols = [protocols]; + } + // Uses setTimeout() to make sure __createFlash() runs after the caller sets ws.onopen etc. + // Otherwise, when onopen fires immediately, onopen is called before it is set. + setTimeout(function() { + WebSocket.__addTask(function() { + WebSocket.__flash.create( + self.__id, url, protocols, proxyHost || null, proxyPort || 0, headers || null); + }); + }, 0); + }; + + /** + * Send data to the web socket. + * @param {string} data The data to send to the socket. + * @return {boolean} True for success, false for failure. + */ + WebSocket.prototype.send = function(data) { + if (this.readyState == WebSocket.CONNECTING) { + throw "INVALID_STATE_ERR: Web Socket connection has not been established"; + } + // We use encodeURIComponent() here, because FABridge doesn't work if + // the argument includes some characters. We don't use escape() here + // because of this: + // https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Functions#escape_and_unescape_Functions + // But it looks decodeURIComponent(encodeURIComponent(s)) doesn't + // preserve all Unicode characters either e.g. "\uffff" in Firefox. + // Note by wtritch: Hopefully this will not be necessary using ExternalInterface. Will require + // additional testing. + var result = WebSocket.__flash.send(this.__id, encodeURIComponent(data)); + if (result < 0) { // success + return true; + } else { + this.bufferedAmount += result; + return false; + } + }; + + /** + * Close this web socket gracefully. + */ + WebSocket.prototype.close = function() { + if (this.readyState == WebSocket.CLOSED || this.readyState == WebSocket.CLOSING) { + return; + } + this.readyState = WebSocket.CLOSING; + WebSocket.__flash.close(this.__id); + }; + + /** + * Implementation of {@link DOM 2 EventTarget Interface} + * + * @param {string} type + * @param {function} listener + * @param {boolean} useCapture + * @return void + */ + WebSocket.prototype.addEventListener = function(type, listener, useCapture) { + if (!(type in this.__events)) { + this.__events[type] = []; + } + this.__events[type].push(listener); + }; + + /** + * Implementation of {@link DOM 2 EventTarget Interface} + * + * @param {string} type + * @param {function} listener + * @param {boolean} useCapture + * @return void + */ + WebSocket.prototype.removeEventListener = function(type, listener, useCapture) { + if (!(type in this.__events)) return; + var events = this.__events[type]; + for (var i = events.length - 1; i >= 0; --i) { + if (events[i] === listener) { + events.splice(i, 1); + break; + } + } + }; + + /** + * Implementation of {@link DOM 2 EventTarget Interface} + * + * @param {Event} event + * @return void + */ + WebSocket.prototype.dispatchEvent = function(event) { + var events = this.__events[event.type] || []; + for (var i = 0; i < events.length; ++i) { + events[i](event); + } + var handler = this["on" + event.type]; + if (handler) handler(event); + }; + + /** + * Handles an event from Flash. + * @param {Object} flashEvent + */ + WebSocket.prototype.__handleEvent = function(flashEvent) { + if ("readyState" in flashEvent) { + this.readyState = flashEvent.readyState; + } + if ("protocol" in flashEvent) { + this.protocol = flashEvent.protocol; + } + + var jsEvent; + if (flashEvent.type == "open" || flashEvent.type == "error") { + jsEvent = this.__createSimpleEvent(flashEvent.type); + } else if (flashEvent.type == "close") { + // TODO implement jsEvent.wasClean + jsEvent = this.__createSimpleEvent("close"); + } else if (flashEvent.type == "message") { + var data = decodeURIComponent(flashEvent.message); + jsEvent = this.__createMessageEvent("message", data); + } else { + throw "unknown event type: " + flashEvent.type; + } + + this.dispatchEvent(jsEvent); + }; + + WebSocket.prototype.__createSimpleEvent = function(type) { + if (document.createEvent && window.Event) { + var event = document.createEvent("Event"); + event.initEvent(type, false, false); + return event; + } else { + return {type: type, bubbles: false, cancelable: false}; + } + }; + + WebSocket.prototype.__createMessageEvent = function(type, data) { + if (document.createEvent && window.MessageEvent && !window.opera) { + var event = document.createEvent("MessageEvent"); + event.initMessageEvent("message", false, false, data, null, null, window, null); + return event; + } else { + // IE and Opera, the latter one truncates the data parameter after any 0x00 bytes. + return {type: type, data: data, bubbles: false, cancelable: false}; + } + }; + + /** + * Define the WebSocket readyState enumeration. + */ + WebSocket.CONNECTING = 0; + WebSocket.OPEN = 1; + WebSocket.CLOSING = 2; + WebSocket.CLOSED = 3; + + WebSocket.__flash = null; + WebSocket.__instances = {}; + WebSocket.__tasks = []; + WebSocket.__nextId = 0; + + /** + * Load a new flash security policy file. + * @param {string} url + */ + WebSocket.loadFlashPolicyFile = function(url){ + WebSocket.__addTask(function() { + WebSocket.__flash.loadManualPolicyFile(url); + }); + }; + + /** + * Loads WebSocketMain.swf and creates WebSocketMain object in Flash. + */ + WebSocket.__initialize = function() { + if (WebSocket.__flash) return; + + if (WebSocket.__swfLocation) { + // For backword compatibility. + window.WEB_SOCKET_SWF_LOCATION = WebSocket.__swfLocation; + } + if (!window.WEB_SOCKET_SWF_LOCATION) { + console.error("[WebSocket] set WEB_SOCKET_SWF_LOCATION to location of WebSocketMain.swf"); + return; + } + var container = document.createElement("div"); + container.id = "webSocketContainer"; + // Hides Flash box. We cannot use display: none or visibility: hidden because it prevents + // Flash from loading at least in IE. So we move it out of the screen at (-100, -100). + // But this even doesn't work with Flash Lite (e.g. in Droid Incredible). So with Flash + // Lite, we put it at (0, 0). This shows 1x1 box visible at left-top corner but this is + // the best we can do as far as we know now. + container.style.position = "absolute"; + if (WebSocket.__isFlashLite()) { + container.style.left = "0px"; + container.style.top = "0px"; + } else { + container.style.left = "-100px"; + container.style.top = "-100px"; + } + var holder = document.createElement("div"); + holder.id = "webSocketFlash"; + container.appendChild(holder); + document.body.appendChild(container); + // See this article for hasPriority: + // http://help.adobe.com/en_US/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-7ffd.html + swfobject.embedSWF( + WEB_SOCKET_SWF_LOCATION, + "webSocketFlash", + "1" /* width */, + "1" /* height */, + "10.0.0" /* SWF version */, + null, + null, + {hasPriority: true, swliveconnect : true, allowScriptAccess: "always"}, + null, + function(e) { + if (!e.success) { + console.error("[WebSocket] swfobject.embedSWF failed"); + } + }); + }; + + /** + * Called by Flash to notify JS that it's fully loaded and ready + * for communication. + */ + WebSocket.__onFlashInitialized = function() { + // We need to set a timeout here to avoid round-trip calls + // to flash during the initialization process. + setTimeout(function() { + WebSocket.__flash = document.getElementById("webSocketFlash"); + WebSocket.__flash.setCallerUrl(location.href); + WebSocket.__flash.setDebug(!!window.WEB_SOCKET_DEBUG); + for (var i = 0; i < WebSocket.__tasks.length; ++i) { + WebSocket.__tasks[i](); + } + WebSocket.__tasks = []; + }, 0); + }; + + /** + * Called by Flash to notify WebSockets events are fired. + */ + WebSocket.__onFlashEvent = function() { + setTimeout(function() { + try { + // Gets events using receiveEvents() instead of getting it from event object + // of Flash event. This is to make sure to keep message order. + // It seems sometimes Flash events don't arrive in the same order as they are sent. + var events = WebSocket.__flash.receiveEvents(); + for (var i = 0; i < events.length; ++i) { + WebSocket.__instances[events[i].webSocketId].__handleEvent(events[i]); + } + } catch (e) { + console.error(e); + } + }, 0); + return true; + }; + + // Called by Flash. + WebSocket.__log = function(message) { + console.log(decodeURIComponent(message)); + }; + + // Called by Flash. + WebSocket.__error = function(message) { + console.error(decodeURIComponent(message)); + }; + + WebSocket.__addTask = function(task) { + if (WebSocket.__flash) { + task(); + } else { + WebSocket.__tasks.push(task); + } + }; + + /** + * Test if the browser is running flash lite. + * @return {boolean} True if flash lite is running, false otherwise. + */ + WebSocket.__isFlashLite = function() { + if (!window.navigator || !window.navigator.mimeTypes) { + return false; + } + var mimeType = window.navigator.mimeTypes["application/x-shockwave-flash"]; + if (!mimeType || !mimeType.enabledPlugin || !mimeType.enabledPlugin.filename) { + return false; + } + return mimeType.enabledPlugin.filename.match(/flashlite/i) ? true : false; + }; + + if (!window.WEB_SOCKET_DISABLE_AUTO_INITIALIZATION) { + if (window.addEventListener) { + window.addEventListener("load", function(){ + WebSocket.__initialize(); + }, false); + } else { + window.attachEvent("onload", function(){ + WebSocket.__initialize(); + }); + } + } + +})(); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + * + * @api public + */ + + exports.XHR = XHR; + + /** + * XHR constructor + * + * @costructor + * @api public + */ + + function XHR (socket) { + if (!socket) return; + + io.Transport.apply(this, arguments); + this.sendBuffer = []; + }; + + /** + * Inherits from Transport. + */ + + io.util.inherit(XHR, io.Transport); + + /** + * Establish a connection + * + * @returns {Transport} + * @api public + */ + + XHR.prototype.open = function () { + this.socket.setBuffer(false); + this.onOpen(); + this.get(); + + // we need to make sure the request succeeds since we have no indication + // whether the request opened or not until it succeeded. + this.setCloseTimeout(); + + return this; + }; + + /** + * Check if we need to send data to the Socket.IO server, if we have data in our + * buffer we encode it and forward it to the `post` method. + * + * @api private + */ + + XHR.prototype.payload = function (payload) { + var msgs = []; + + for (var i = 0, l = payload.length; i < l; i++) { + msgs.push(io.parser.encodePacket(payload[i])); + } + + this.send(io.parser.encodePayload(msgs)); + }; + + /** + * Send data to the Socket.IO server. + * + * @param data The message + * @returns {Transport} + * @api public + */ + + XHR.prototype.send = function (data) { + this.post(data); + return this; + }; + + /** + * Posts a encoded message to the Socket.IO server. + * + * @param {String} data A encoded message. + * @api private + */ + + function empty () { }; + + XHR.prototype.post = function (data) { + var self = this; + this.socket.setBuffer(true); + + function stateChange () { + if (this.readyState == 4) { + this.onreadystatechange = empty; + self.posting = false; + + if (this.status == 200){ + self.socket.setBuffer(false); + } else { + self.onClose(); + } + } + } + + function onload () { + this.onload = empty; + self.socket.setBuffer(false); + }; + + this.sendXHR = this.request('POST'); + + if (global.XDomainRequest && this.sendXHR instanceof XDomainRequest) { + this.sendXHR.onload = this.sendXHR.onerror = onload; + } else { + this.sendXHR.onreadystatechange = stateChange; + } + + this.sendXHR.send(data); + }; + + /** + * Disconnects the established `XHR` connection. + * + * @returns {Transport} + * @api public + */ + + XHR.prototype.close = function () { + this.onClose(); + return this; + }; + + /** + * Generates a configured XHR request + * + * @param {String} url The url that needs to be requested. + * @param {String} method The method the request should use. + * @returns {XMLHttpRequest} + * @api private + */ + + XHR.prototype.request = function (method) { + var req = io.util.request(this.socket.isXDomain()) + , query = io.util.query(this.socket.options.query, 't=' + +new Date); + + req.open(method || 'GET', this.prepareUrl() + query, true); + + if (method == 'POST') { + try { + if (req.setRequestHeader) { + req.setRequestHeader('Content-type', 'text/plain;charset=UTF-8'); + } else { + // XDomainRequest + req.contentType = 'text/plain'; + } + } catch (e) {} + } + + return req; + }; + + /** + * Returns the scheme to use for the transport URLs. + * + * @api private + */ + + XHR.prototype.scheme = function () { + return this.socket.options.secure ? 'https' : 'http'; + }; + + /** + * Check if the XHR transports are supported + * + * @param {Boolean} xdomain Check if we support cross domain requests. + * @returns {Boolean} + * @api public + */ + + XHR.check = function (socket, xdomain) { + try { + var request = io.util.request(xdomain), + usesXDomReq = (global.XDomainRequest && request instanceof XDomainRequest), + socketProtocol = (socket && socket.options && socket.options.secure ? 'https:' : 'http:'), + isXProtocol = (global.location && socketProtocol != global.location.protocol); + if (request && !(usesXDomReq && isXProtocol)) { + return true; + } + } catch(e) {} + + return false; + }; + + /** + * Check if the XHR transport supports cross domain requests. + * + * @returns {Boolean} + * @api public + */ + + XHR.xdomainCheck = function (socket) { + return XHR.check(socket, true); + }; + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.htmlfile = HTMLFile; + + /** + * The HTMLFile transport creates a `forever iframe` based transport + * for Internet Explorer. Regular forever iframe implementations will + * continuously trigger the browsers buzy indicators. If the forever iframe + * is created inside a `htmlfile` these indicators will not be trigged. + * + * @constructor + * @extends {io.Transport.XHR} + * @api public + */ + + function HTMLFile (socket) { + io.Transport.XHR.apply(this, arguments); + }; + + /** + * Inherits from XHR transport. + */ + + io.util.inherit(HTMLFile, io.Transport.XHR); + + /** + * Transport name + * + * @api public + */ + + HTMLFile.prototype.name = 'htmlfile'; + + /** + * Creates a new Ac...eX `htmlfile` with a forever loading iframe + * that can be used to listen to messages. Inside the generated + * `htmlfile` a reference will be made to the HTMLFile transport. + * + * @api private + */ + + HTMLFile.prototype.get = function () { + this.doc = new window[(['Active'].concat('Object').join('X'))]('htmlfile'); + this.doc.open(); + this.doc.write(''); + this.doc.close(); + this.doc.parentWindow.s = this; + + var iframeC = this.doc.createElement('div'); + iframeC.className = 'socketio'; + + this.doc.body.appendChild(iframeC); + this.iframe = this.doc.createElement('iframe'); + + iframeC.appendChild(this.iframe); + + var self = this + , query = io.util.query(this.socket.options.query, 't='+ +new Date); + + this.iframe.src = this.prepareUrl() + query; + + io.util.on(window, 'unload', function () { + self.destroy(); + }); + }; + + /** + * The Socket.IO server will write script tags inside the forever + * iframe, this function will be used as callback for the incoming + * information. + * + * @param {String} data The message + * @param {document} doc Reference to the context + * @api private + */ + + HTMLFile.prototype._ = function (data, doc) { + // unescape all forward slashes. see GH-1251 + data = data.replace(/\\\//g, '/'); + this.onData(data); + try { + var script = doc.getElementsByTagName('script')[0]; + script.parentNode.removeChild(script); + } catch (e) { } + }; + + /** + * Destroy the established connection, iframe and `htmlfile`. + * And calls the `CollectGarbage` function of Internet Explorer + * to release the memory. + * + * @api private + */ + + HTMLFile.prototype.destroy = function () { + if (this.iframe){ + try { + this.iframe.src = 'about:blank'; + } catch(e){} + + this.doc = null; + this.iframe.parentNode.removeChild(this.iframe); + this.iframe = null; + + CollectGarbage(); + } + }; + + /** + * Disconnects the established connection. + * + * @returns {Transport} Chaining. + * @api public + */ + + HTMLFile.prototype.close = function () { + this.destroy(); + return io.Transport.XHR.prototype.close.call(this); + }; + + /** + * Checks if the browser supports this transport. The browser + * must have an `Ac...eXObject` implementation. + * + * @return {Boolean} + * @api public + */ + + HTMLFile.check = function (socket) { + if (typeof window != "undefined" && (['Active'].concat('Object').join('X')) in window){ + try { + var a = new window[(['Active'].concat('Object').join('X'))]('htmlfile'); + return a && io.Transport.XHR.check(socket); + } catch(e){} + } + return false; + }; + + /** + * Check if cross domain requests are supported. + * + * @returns {Boolean} + * @api public + */ + + HTMLFile.xdomainCheck = function () { + // we can probably do handling for sub-domains, we should + // test that it's cross domain but a subdomain here + return false; + }; + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('htmlfile'); + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + */ + + exports['xhr-polling'] = XHRPolling; + + /** + * The XHR-polling transport uses long polling XHR requests to create a + * "persistent" connection with the server. + * + * @constructor + * @api public + */ + + function XHRPolling () { + io.Transport.XHR.apply(this, arguments); + }; + + /** + * Inherits from XHR transport. + */ + + io.util.inherit(XHRPolling, io.Transport.XHR); + + /** + * Merge the properties from XHR transport + */ + + io.util.merge(XHRPolling, io.Transport.XHR); + + /** + * Transport name + * + * @api public + */ + + XHRPolling.prototype.name = 'xhr-polling'; + + /** + * Indicates whether heartbeats is enabled for this transport + * + * @api private + */ + + XHRPolling.prototype.heartbeats = function () { + return false; + }; + + /** + * Establish a connection, for iPhone and Android this will be done once the page + * is loaded. + * + * @returns {Transport} Chaining. + * @api public + */ + + XHRPolling.prototype.open = function () { + var self = this; + + io.Transport.XHR.prototype.open.call(self); + return false; + }; + + /** + * Starts a XHR request to wait for incoming messages. + * + * @api private + */ + + function empty () {}; + + XHRPolling.prototype.get = function () { + if (!this.isOpen) return; + + var self = this; + + function stateChange () { + if (this.readyState == 4) { + this.onreadystatechange = empty; + + if (this.status == 200) { + self.onData(this.responseText); + self.get(); + } else { + self.onClose(); + } + } + }; + + function onload () { + this.onload = empty; + this.onerror = empty; + self.retryCounter = 1; + self.onData(this.responseText); + self.get(); + }; + + function onerror () { + self.retryCounter ++; + if(!self.retryCounter || self.retryCounter > 3) { + self.onClose(); + } else { + self.get(); + } + }; + + this.xhr = this.request(); + + if (global.XDomainRequest && this.xhr instanceof XDomainRequest) { + this.xhr.onload = onload; + this.xhr.onerror = onerror; + } else { + this.xhr.onreadystatechange = stateChange; + } + + this.xhr.send(null); + }; + + /** + * Handle the unclean close behavior. + * + * @api private + */ + + XHRPolling.prototype.onClose = function () { + io.Transport.XHR.prototype.onClose.call(this); + + if (this.xhr) { + this.xhr.onreadystatechange = this.xhr.onload = this.xhr.onerror = empty; + try { + this.xhr.abort(); + } catch(e){} + this.xhr = null; + } + }; + + /** + * Webkit based browsers show a infinit spinner when you start a XHR request + * before the browsers onload event is called so we need to defer opening of + * the transport until the onload event is called. Wrapping the cb in our + * defer method solve this. + * + * @param {Socket} socket The socket instance that needs a transport + * @param {Function} fn The callback + * @api private + */ + + XHRPolling.prototype.ready = function (socket, fn) { + var self = this; + + io.util.defer(function () { + fn.call(self); + }); + }; + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('xhr-polling'); + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io, global) { + /** + * There is a way to hide the loading indicator in Firefox. If you create and + * remove a iframe it will stop showing the current loading indicator. + * Unfortunately we can't feature detect that and UA sniffing is evil. + * + * @api private + */ + + var indicator = global.document && "MozAppearance" in + global.document.documentElement.style; + + /** + * Expose constructor. + */ + + exports['jsonp-polling'] = JSONPPolling; + + /** + * The JSONP transport creates an persistent connection by dynamically + * inserting a script tag in the page. This script tag will receive the + * information of the Socket.IO server. When new information is received + * it creates a new script tag for the new data stream. + * + * @constructor + * @extends {io.Transport.xhr-polling} + * @api public + */ + + function JSONPPolling (socket) { + io.Transport['xhr-polling'].apply(this, arguments); + + this.index = io.j.length; + + var self = this; + + io.j.push(function (msg) { + self._(msg); + }); + }; + + /** + * Inherits from XHR polling transport. + */ + + io.util.inherit(JSONPPolling, io.Transport['xhr-polling']); + + /** + * Transport name + * + * @api public + */ + + JSONPPolling.prototype.name = 'jsonp-polling'; + + /** + * Posts a encoded message to the Socket.IO server using an iframe. + * The iframe is used because script tags can create POST based requests. + * The iframe is positioned outside of the view so the user does not + * notice it's existence. + * + * @param {String} data A encoded message. + * @api private + */ + + JSONPPolling.prototype.post = function (data) { + var self = this + , query = io.util.query( + this.socket.options.query + , 't='+ (+new Date) + '&i=' + this.index + ); + + if (!this.form) { + var form = document.createElement('form') + , area = document.createElement('textarea') + , id = this.iframeId = 'socketio_iframe_' + this.index + , iframe; + + form.className = 'socketio'; + form.style.position = 'absolute'; + form.style.top = '0px'; + form.style.left = '0px'; + form.style.display = 'none'; + form.target = id; + form.method = 'POST'; + form.setAttribute('accept-charset', 'utf-8'); + area.name = 'd'; + form.appendChild(area); + document.body.appendChild(form); + + this.form = form; + this.area = area; + } + + this.form.action = this.prepareUrl() + query; + + function complete () { + initIframe(); + self.socket.setBuffer(false); + }; + + function initIframe () { + if (self.iframe) { + self.form.removeChild(self.iframe); + } + + try { + // ie6 dynamic iframes with target="" support (thanks Chris Lambacher) + iframe = document.createElement('') + storageContainer.close() + storageOwner = storageContainer.w.frames[0].document + storage = storageOwner.createElement('div') + } catch(e) { + // somehow ActiveXObject instantiation failed (perhaps some special + // security settings or otherwse), fall back to per-path storage + storage = doc.createElement('div') + storageOwner = doc.body + } + function withIEStorage(storeFunction) { + return function() { + var args = Array.prototype.slice.call(arguments, 0) + args.unshift(storage) + // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx + // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx + storageOwner.appendChild(storage) + storage.addBehavior('#default#userData') + storage.load(localStorageName) + var result = storeFunction.apply(store, args) + storageOwner.removeChild(storage) + return result + } + } + + // In IE7, keys may not contain special chars. See all of https://github.com/marcuswestin/store.js/issues/40 + var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g") + function ieKeyFix(key) { + return key.replace(forbiddenCharsRegex, '___') + } + store.set = withIEStorage(function(storage, key, val) { + key = ieKeyFix(key) + if (val === undefined) { return store.remove(key) } + storage.setAttribute(key, store.serialize(val)) + storage.save(localStorageName) + return val + }) + store.get = withIEStorage(function(storage, key) { + key = ieKeyFix(key) + return store.deserialize(storage.getAttribute(key)) + }) + store.remove = withIEStorage(function(storage, key) { + key = ieKeyFix(key) + storage.removeAttribute(key) + storage.save(localStorageName) + }) + store.clear = withIEStorage(function(storage) { + var attributes = storage.XMLDocument.documentElement.attributes + storage.load(localStorageName) + for (var i=0, attr; attr=attributes[i]; i++) { + storage.removeAttribute(attr.name) + } + storage.save(localStorageName) + }) + store.getAll = withIEStorage(function(storage) { + var attributes = storage.XMLDocument.documentElement.attributes + var ret = {} + for (var i=0, attr; attr=attributes[i]; ++i) { + var key = ieKeyFix(attr.name) + ret[attr.name] = store.deserialize(storage.getAttribute(key)) + } + return ret + }) + } + + try { + store.set(namespace, namespace) + if (store.get(namespace) != namespace) { store.disabled = true } + store.remove(namespace) + } catch(e) { + store.disabled = true + } + store.enabled = !store.disabled + if (typeof module != 'undefined' && module.exports) { module.exports = store } + else if (typeof define === 'function' && define.amd) { define("store", store) } + else { win.store = store } +})(this.window || global); + +/* @source mod/user_following.js */; + +define('store', 'lib/store.js'); +define('mod/user_following', [ + "jquery", + "store" +], function($, store) { + var API_USER_FOLLOWING_PATH = "/api/user/following" + var USER_FOLLOWING_KEY = "user-following"; + var USER_FOLLOWING_UPDATE_KEY= "date:user-following" + var ONE_DAY_IN_SECONDS = 60*60*24; + + var update = function() { + var currentTime = new Date().getTime(); + var lastTime = store.get(USER_FOLLOWING_UPDATE_KEY); + if (lastTime && (currentTime - lastTime) < ONE_DAY_IN_SECONDS ) { + return; + } + + $.ajax( + API_USER_FOLLOWING_PATH + ).done(function(users){ + var following = $.map(users, function(item){ + return item["username"]; + }); + store.set(USER_FOLLOWING_KEY, following); + store.set(USER_FOLLOWING_UPDATE_KEY, currentTime); + }).fail(function(jqxhr, textStatus, error){ + return; + }); + } + + return { + update: update, + val: function(){ + return store.get(USER_FOLLOWING_KEY) || []; + } + }; + +}); + +/* @source mod/input-ext.js */; + +define('mousetrap', 'lib/mousetrap.js'); + +define("mod/input-ext", + [ + "jquery", + "mod/user_following", + "jquery-caret", + "jquery-atwho", + "mousetrap", + "lib/zen-form" +], + function ($, userFollowing) { + var inputExt = {}; + var emojis = [ + 'airplane', 'alien', 'art', 'bear', 'beer', 'bike', 'bomb', 'book', + 'bulb', 'bus', 'cake', 'calling', 'clap', 'cocktail', 'code', 'computer', + 'cool', 'cop', 'email', 'feet', 'fire', 'fish', 'fist', 'gift', 'hammer', + 'heart', 'iphone', 'key', 'leaves', 'lgtm', 'lipstick', 'lock', 'mag', 'mega', + 'memo', 'moneybag', 'new', 'octocat', 'ok', 'palm_tree', 'pencil', 'punch', + 'runner', 'scissors', 'ship', 'shipit', 'ski', 'smile', 'smoking', 'sparkles', + 'star', 'sunny', 'taxi', 'thumbsdown', 'thumbsup', 'tm', 'tophat', 'train', + 'trollface', 'v', 'vs', 'warning', 'wheelchair', 'zap', 'zzz', 'see_no_evil', + 'hear_no_evil', 'speak_no_evil', 'monkey', 'monkey_face', 'manybeers', 'beers', + 'hhkb', 'ruby' + ], emoji_list = $.map(emojis, function(value, i) {return {key: value + ':', name:value};}); + inputExt.enableEmojiInput = function (el) { + el.atwho('(?:^|\\s):', + {data:emoji_list, limit:7, + tpl:'
  • ${name}
  • '}); + return el; + }; + + inputExt.enableAutoCompleteFollowingAndTeam = function (el) { + var teams = JSON.parse($('#all-teams').val() || '[]'); + var users = teams.concat(userFollowing.val()); + + $(el).atwho("@", { + data: users, + limit: 7 + }); + }; + + // 输入#自动提示pr信息 + inputExt.enablePullsInput = function (el) { + var projectName = el.attr('data-project-name'); + if (!projectName) return el; + $.getJSON('/' + projectName + '/pulls/all_data', function (r) { + var pulls = $.map( + r, function(value, i) { + return {key: value.id, name:value.id + ' ' + value.title, title:value.title}; + }); + el.atwho('(?:^|\\s)#', + {data:pulls, limit:7, + tpl:'
  • #${key} ${title}
  • '}); + }); + return el; + }; + + inputExt.shortcut2submit = function (el) { + Mousetrap.bind( + ['command+enter', 'ctrl+enter'], + function (e) { + if (el && (e.srcElement || e.target) == $(el)[0] && !$(el).closest('form').hasClass('submitting')) { + e.preventDefault ? e.preventDefault() : (e.returnValue = false); + $(el).closest('form').addClass('submitting').submit(); + } + }, + 'keydown' + ); + }; + + // 进入全屏模式 + inputExt.enableZenMode = function (el) { + var trigger = '.go-zen'; + el = $(el); + el.zenForm({trigger:trigger, theme:'light'}).dblclick(function(e) { + if (!e.altKey) return; + $(this).zenForm({ trigger: null, theme: 'light' }); + fix(); + }); + + $(trigger).click(fix); + + function fix() { + var textarea = $('.zen-forms-input-wrap textarea'); + if (textarea) { + inputExt.enableEmojiInput(textarea); + textarea.attr({ + 'data-project-name': el.attr('data-project-name'), + 'placeholder': el.attr('placeholder') + }); + + inputExt.enablePullsInput(textarea); + + var participants = $('#participants').val(); + if (participants) { + participants = JSON.parse(participants); + textarea.atwho("@", {data:participants, limit:7}); + } + + // 因为zen-form设置的z-index非常高(99999)所以将at-view调更高 + $('#at-view').css('z-index', 100000); + } + } + }; + + var focusToEnd = function(els) { + return $(els).each(function() { + var v = $(this).val(); + $(this).focus().val("").val(v); + }); + }; + + inputExt.enableQuickQuotes = function (el) { + Mousetrap.bind( + ['r'], + function (e) { + var oldVal = $(el).val(), newVal, selVal = window.getSelection().toString(); + selVal = '> ' + selVal.split('\n').join('\n> '); + newVal = oldVal.concat((oldVal != '') ? '\n\n':'', selVal, '\n\n'); + $("html, body").animate({scrollTop: $(document).height()}, "slow"); + $(el).val(newVal); + focusToEnd(el); + }, + 'keyup' + ); + }; + + inputExt.enableFileUpload = function (uploader, textarea, is_image) { + uploader.submit( + function() { + $(this).ajaxSubmit({ + dataType: 'json', + type: 'POST', + delegation: true, + success: function(r) { + var oldText = textarea.val(), + newText = oldText + + (oldText.length == 0 ? '' : '\n') + + (is_image? '!' : '') + + '[' + r.origin_filename + '](' + r.url + ')'; + textarea.val(newText); + }, + error: function(r) { + alert("上传错误,请确认您上传的文件类型合法"); + } + }); + return false; + }); + + uploader.find('input').change(function () { + uploader.submit(); + }); + }; + + inputExt.enableImageUpload = function (uploader, textarea) { + inputExt.enableFileUpload(uploader,textarea, true); + }; + + inputExt.enableUpload = function(upload_widget,textarea){ + inputExt.enableImageUpload(upload_widget.find(".upload-image-form"),textarea); + inputExt.enableFileUpload(upload_widget.find(".upload-file-form"),textarea); + }; + + return inputExt; + } +); + +/* @source mod/diff.js */; + +define('mod/diff', [ + "jquery", + "mod/input-ext", + "mod/liveupdate", + "mod/colorcube" +], function ($, inputExt, live, colorcube) { + + //////////////////// linecomment + + // comment form + var hideCommentForm = function () { + $('.inline-comment-form').hide().closest('tr').removeClass('show-inline-comment-form'); + $('.inline-comment-form').each( + function (idx, el) { + if (!$(el).siblings('.comment-holder').children('.comment').length) { + $(el).parents('tr').hide(); + } + } + ); + }; + var openCommentForm = function (curRow) { + hideCommentForm(); + var nextRow = curRow.next('tr'); + // if no comments on curRow yet + if (!nextRow.length || !nextRow.hasClass('inline-comments')) { + nextRow = $.tmpl($('#templ-inline-comments-row'), {}).insertAfter(curRow); + } + // if side by side... plz refactor this + var file = curRow.parents('.file'); + if ((file.children('.side')).length != 0 && file.children('.side').css('display') != 'none') { + $(nextRow.children()[0]).attr('colspan', 1); + } + nextRow.show().addClass('show-inline-comment-form'); + var commentsBlock = nextRow.children('.line-comments'), + commentForm = commentsBlock.find('.inline-comment-form'); + // if no commentForm on nextRow yet + if (!commentForm.length) { + // get form-data + var patch_data = file.children('.meta').find('.patch-data'); + var line_data = curRow.find('.line-data'); + var data = { + from_sha: patch_data.attr('data-from-sha'), + old_path: patch_data.attr('data-old-path'), + new_path: patch_data.attr('data-new-path'), + from_oid: patch_data.attr('data-from-oid'), + to_oid: patch_data.attr('data-to-oid'), + old_no: line_data.attr('data-old'), + new_no: line_data.attr('data-new'), + }; + commentForm = $.tmpl($('#templ-inline-comment-form'), data).appendTo(commentsBlock); + commentForm.find('.js-hide-inline-comment-form').click( + function () { + hideCommentForm(); + } + ).end().find('form').submit( + function () { + $(this).find('button[type="submit"]').attr('disabled', true).addClass('disabled'); + return true; + } + ); + var commentTexarea = commentForm.find('textarea'); + inputExt.enableEmojiInput(commentTexarea); + inputExt.shortcut2submit(commentTexarea); + } + commentForm.show().find('textarea').focus(); + // codelive channel + var linecomment_channel_id; + if ($('.discussion-tab-link').length > 0) { + linecomment_channel_id = "code_pr_"+$('.discussion-tab-link').attr('data-url') + 'linecomment'; + } + // `comment on this line` + commentForm.find('form.js-inline-comment-form').ajaxForm({ + dataType: 'json', + beforeSend: function () { + commentForm.find('button[type="submit"]').attr('disabled', true).addClass('disabled') + .end().find('.loader').show(); + }, + success: function(r) { + if (r.r == 0 && r.html) { + commentForm.siblings('.js-comments-holder').append(r.html); + commentForm.find('textarea').val('').blur(); + hideCommentForm(); + live && linecomment_channel_id && + live.emit('ready', {channel: linecomment_channel_id, msg:r.html_with_diff}); + } else if (r.error){ + alert(r.error); + } + commentForm.find('button[type="submit"]').attr('disabled', false).removeClass('disabled'); + commentForm.find('form.js-inline-comment-form').removeClass('submitting') + .end().find('.loader').hide(); + return true; + }, + error: function () {} + }); + }; + + // add-bubble... + $('body').delegate('.add-bubble', 'click', function () { + var curRow = $(this).parents('tr'); + var nextRow = curRow.next('tr'); + if (nextRow.hasClass('inline-comments') && nextRow.css('display') != 'none') { + nextRow.hide(); + } else { + openCommentForm(curRow); + } + }); + + // `add a line note` + $('body').delegate( + '.js-show-inline-comment-form', 'click', function () { + var curRow = $(this).parents('tr').prev('tr'); + openCommentForm(curRow); + }); + + // linecomment delete + $('body').delegate('.inline-comments .delete-button', 'click', function (e) { + if (!confirm('Are you sure you want to delete this?')) { + return false; + } + var comment = $(this).parents('.comment'); + $.getJSON( + $(this).attr('href'), + function(r) { + // FIXME: global row? + if (r.r == '1') + var row = comment.parents('tr'); + if (comment.siblings('.comment').length || + row.find('.inline-comment-form').length) { + comment.remove(); + } else { + row.remove(); + } + } + ); + return false; + }); + + // comment & linecomment edit + $('body').delegate('.js-comment-edit-button', 'click', function (e) { + var form_content = $(this).parents('.comment-header') + .next('.comment-content') + .children('.form-content'); + if (form_content != undefined) { + form_content.show().find('textarea').focus(); + form_content.find('form.js-comment-update').ajaxForm({ + dataType: 'json', + beforeSend: function() { + form_content.find('button[type="submit"]').attr('disabled', true).addClass('disabled') + .end().find('.loader').show(); + }, + success: function(r) { + if (r.r == 0 && r.html) { + if (form_content.find('textarea').attr('name') === 'pull_request_review_comment'){ + form_content.parents('.js-comments-holder').append(r.html); + form_content.parents('.comment').remove(); + } else { + var comment = form_content.parents('.change'); + var avatar = comment.prev('.side-avatar'); + form_content.parents('#changelog').append(r.html); + comment.remove(); + avatar.remove(); + } + } + return true; + } + }); + } else { + return false; + } + }); + + // show linecomments toggle + $('body').delegate('.file .js-show-inline-comments-toggle', 'change', function () { + var comments = $(this).parents('.file').find('.inline-comments'); + if ($(this).is(':checked')) { + comments.show(); + } else { + comments.hide(); + } + }); + + // generated file toggle + $('body').delegate('.file a.generated', 'click', function() { + var file = $(this).parents('.file'); + var inline = file.children('.inline').show(); + $(this).hide(); + }); + + // patch side diff toggle + $('body').delegate('.file .js-side-diff', 'click', function () { + var file = $(this).parents('.file'); + file.find('a.generated').hide(); + if (file.children('.side').css('display') === 'none' && + file.children('.inline').css('display') === 'none'){ + file.children('.inline').show(); + }else { + var inline = file.children('.inline').toggle(); + var side = file.children('.side').toggle(); + var checkbox = file.find('.js-show-inline-comments-toggle'); + if (file.children('.side').css('display') != 'none') { + checkbox.attr('checked', false); + side.find('.inline-comments').hide(); + } + else { + checkbox.attr('checked', true); + } + } + }); + + // diff patch fullscreen toggle + $('body').delegate('.file .js-fullscreen', 'click', function () { + var fullscreenStage = $('#fullscreen-stage'); + if (fullscreenStage.length == 0) { + var files = $(this).parents('#files'); + fullscreenStage = $('
    ').appendTo(files); + } + if (fullscreenStage.is(":visible")) { + fullscreenStage.hide(); + $('body').removeClass('fullscreen-mode'); + } else { + var file = $(this).parents('.file'); + fullscreenStage.html(file.clone()).show(); + $('body').addClass('fullscreen-mode'); + fullscreenStage.find('.file .js-fullscreen').text('Exit Full Screen'); + } + }); + + // dblclick open linecomment form + var clearSelection = function () { + if (window.getSelection) { + if (window.getSelection().empty) { // Chrome + window.getSelection().empty(); + } else if (window.getSelection().removeAllRanges) { // Firefox + window.getSelection().removeAllRanges(); + } + } else if (document.selection) { // IE? + document.selection.empty(); + } + } + $('body').delegate('.js-open-comment-form.dblclick-comment', 'dblclick', function () { + clearSelection(); + var curRow = $(this).parents('tr'); + openCommentForm(curRow); + }); + + //////////////////// moreline get_contexts + + // moreline + $('body').delegate('pre.skipped a', 'click', function() { + var curRow = $(this).parents('tr'); + var patch_data = curRow.parents('.file').children('.meta').find('.patch-data'); + var data = curRow.find('.expand-data'); + var url = patch_data.attr('data-context-url'); + $.get( + url, + { + old_sha : patch_data.attr('data-old-sha'), + old_path : patch_data.attr('data-old-path'), + old_start : data.attr('data-old-start'), + new_start : data.attr('data-new-start'), + old_end : data.attr('data-old-end'), + new_end : data.attr('data-new-end'), + type : $(this).attr('data-type'), + }, + function (r) { + curRow.after(r.html); + if (r.html.trim()) { + curRow.remove(); + } + } + ); + }); + + // full diff + $('body').delegate('.ellipsis', 'click', function() { + var $this = $(this); + var fpath = $this.attr('data-path'); + var new_fpath = $this.attr('data-new-path'); + + // for pull/new + var from_proj = $('.new-pull-request form input[name="from_proj"]').attr('value'); + var from_ref = $('.new-pull-request form input[name="from_ref"]').attr('value'); + var to_ref = $('.new-pull-request form input[name="to_ref"]').attr('value'); + var to_proj = $('.new-pull-request form input[name="to_proj"]').attr('value'); + + var url = $this.attr('data-url'); + var table = $this.parents('.data').find('.diff-table'); + $.get(url, + { + filepath: fpath, + new_filepath: new_fpath, + from_proj: from_proj, + from_ref: from_ref, + to_ref: to_ref, + to_proj: to_proj + }, + function(r){ + table.find('tbody').html(r.html); + }); + }); + + // TODO: modify this, after refactor diff api + // toggle whitespace diff + $('body').delegate('.toggle_whitespace', 'click', function() { + var $this = $(this); + var fpath = $this.attr('data-path'); + var new_fpath = $this.attr('data-new-path'); + + // for pull/new + var from_proj = $('.new-pull-request form input[name="from_proj"]').attr('value'); + var from_ref = $('.new-pull-request form input[name="from_ref"]').attr('value'); + var to_ref = $('.new-pull-request form input[name="to_ref"]').attr('value'); + var to_proj = $('.new-pull-request form input[name="to_proj"]').attr('value'); + + var url = $this.attr('data-url'); + var table = $this.parents('.data').find('.diff-table'); + var whitespace = $this.attr('data-w'); + + $.get(url, + { + filepath: fpath, + new_filepath: new_fpath, + from_proj: from_proj, + from_ref: from_ref, + to_ref: to_ref, + to_proj: to_proj, + w: whitespace + }, + function(r){ + table.find('tbody').html(r.html); + $this.attr('data-w', (1 - parseInt(whitespace)).toString()); + }); + }); + + //////////////////// no use ?? + function convertDiff(name, table, pre) { + var inline = $(table).hasClass('inline'); + var ths = table.tHead.rows[0].cells; + var afile, bfile; + if ( inline ) { + afile = ths[0].title; + bfile = ths[1].title; + } else { + afile = $(ths[0]).find('a').text(); + bfile = $(ths[1]).find('a').text(); + } + if ( afile.match(/^Revision /) ) { + afile = 'a/' + name; + bfile = 'b/' + name; + } + var lines = [ + "Index: " + name, + "===================================================================", + "--- " + afile.replace(/File /, ''), + "+++ " + bfile.replace(/File /, ''), + ]; + var sepIndex = 0; + var oldOffset = 0, oldLength = 0, newOffset = 0, newLength = 0; + var title = ""; + if (inline) + title = $(ths[2]).text(); + for (var i = 0; i < table.tBodies.length; i++) { + var tBody = table.tBodies[i]; + if (i == 0 || tBody.className == "skipped") { + if (i > 0) { + if (!oldOffset && oldLength) oldOffset = 1 + if (!newOffset && newLength) newOffset = 1 + lines[sepIndex] = lines[sepIndex] + .replace("{1}", oldOffset).replace("{2}", oldLength) + .replace("{3}", newOffset).replace("{4}", newLength) + .replace("{5}", title); + } + sepIndex = lines.length; + lines.push("@@ -{1},{2} +{3},{4} @@{5}"); + oldOffset = 0, oldLength = 0, newOffset = 0, newLength = 0; + if (tBody.className == "skipped") { + if (inline) + title = $(tBody.rows[0].cells[2]).text(); + continue; + } + } + var tmpLines = []; + for (var j = 0; j < tBody.rows.length; j++) { + var cells = tBody.rows[j].cells; + var oldLineNo = parseInt($(cells[0]).text()); + var newLineNo = parseInt($(cells[inline ? 1 : 2]).text()); + if (tBody.className == 'unmod') { + lines.push(" " + $(cells[inline ? 2 : 1]).text()); + oldLength += 1; + newLength += 1; + if (!oldOffset) oldOffset = oldLineNo; + if (!newOffset) newOffset = newLineNo; + } else { + var oldLine; + var newLine; + var oldTag = "-"; + var newTag = "+"; + if (inline) { + oldLine = newLine = $(cells[2]).text(); + if ($('em', cells[2]).length) oldTag = newTag = "\\"; + } else { + oldLine = $(cells[1]).text(); + if ($('em', cells[1]).length) oldTag = "\\"; + newLine = $(cells[3]).text(); + if ($('em', cells[3]).length) newTag = "\\"; + } + if (!isNaN(oldLineNo)) { + lines.push(oldTag + oldLine); + oldLength += 1; + } + if (!isNaN(newLineNo)) { + tmpLines.push(newTag + newLine); + newLength += 1; + } + } + } + if (tmpLines.length > 0) { + lines = lines.concat(tmpLines); + } + } + if (!oldOffset && oldLength) oldOffset = 1; + if (!newOffset && newLength) newOffset = 1; + lines[sepIndex] = lines[sepIndex] + .replace("{1}", oldOffset).replace("{2}", oldLength) + .replace("{3}", newOffset).replace("{4}", newLength) + .replace("{5}", title); + /* remove trailing   and join lines (with CR for IExplorer) */ + var sep = $.browser.msie ? "\r" : "\n"; + for ( var i = 0; i < lines.length; i++ ) + if ( lines[i] ) + { + var line = lines[i].replace(/\xa0$/, '') + sep; + if ( lines[i][0] == '+' ) + pre.append($('').text(line)); + else if ( lines[i][0] == '-' ) + pre.append($('').text(line)); + else + pre.append($('').text(line)); + } + } + // no use ?? + $("div.diff h2").each(function() { + console.log('call div.diff h2 !!!'); + var switcher = $("").prependTo(this); + var name = $.trim($(this).text()); + var table = $(this).siblings("table").get(0); + if (! table) return; + var pre = $('
    ').hide().insertAfter(table);
    +          $("" + _("Tabular") + "").click(function() {
    +            $(pre).hide();
    +            $(table).show();
    +            $(this).addClass("active").siblings("span").removeClass("active");
    +            return false;
    +          }).addClass("active").appendTo(switcher);
    +          $("" + _("Unified") + "").click(function() {
    +            $(table).hide();
    +            if (!pre.get(0).firstChild) convertDiff(name, table, pre);
    +            $(pre).fadeIn("fast")
    +            $(this).addClass("active").siblings("span").removeClass("active");
    +            return false;
    +          }).appendTo(switcher);
    +        });
    +
    +
    +        colorcube.init({target:'body'});
    +});
    +
    +/* @source mod/commit.js */;
    +
    +define('mod/commit', [
    +  "jquery",
    +  "jquery-tmpl",
    +  "jquery-caret",
    +  "jquery-atwho",
    +  "jquery-forms",
    +  "bootstrap",
    +  "mod/input-ext",
    +  "mod/liveupdate"
    +], function ($, _, _, _, _, _, inputExt, live) {
    +    $(function () {
    +
    +        // comment & linecomment edit
    +        $('body').delegate('.js-comment-edit-button', 'click', function (e) {
    +            var form_content = $(this).parents('.comment-header')
    +            .next('.comment-content')
    +            .children('.form-content');
    +            if (form_content != undefined) {
    +                form_content.show().find('textarea').focus();
    +                form_content.find('form.js-comment-update').ajaxForm({
    +                    dataType: 'json',
    +                    beforeSend: function() {
    +                        form_content.find('button[type="submit"]').attr('disabled', true).addClass('disabled')
    +                        .end().find('.loader').show();
    +                    },
    +                    success: function(r) {
    +                        if (r.r == 0 && r.html) {
    +                            if (form_content.find('textarea').attr('name') === 'pull_request_review_comment'){
    +                                form_content.parents('.js-comments-holder').append(r.html);
    +                                form_content.parents('.comment').remove();
    +                            } else {
    +                                var comment = form_content.parents('.change');
    +                                var avatar = comment.prev('.side-avatar');
    +                                form_content.parents('#changelog').append(r.html);
    +                                comment.remove();
    +                                avatar.remove();
    +                            }
    +                        }
    +                        return true;
    +                    }
    +                });
    +            } else {
    +                return false;
    +            }
    +        });
    +
    +        $('body').delegate('.form-content .comment-cancel-button', 'click', function (e) {
    +            var form_content = $(this).parents('.form-content');
    +            if (form_content != undefined) {
    +                form_content.hide();
    +            } else {
    +                return false;
    +            }
    +        });
    +
    +        inputExt.enableEmojiInput($('#new_comment_content'));
    +        inputExt.shortcut2submit($('#new_comment_content'));
    +
    +        $('.tabnav-tabs a').live('click', function () {
    +            $(this).closest('.tabnav-tabs').find('a').removeClass('selected');
    +            $(this).addClass('selected');
    +        });
    +
    +        $('.write-tab').live('click', function () {
    +            var form = $(this).closest('.previewable-comment-form');
    +            $(this).closest('.previewable-comment-form').removeClass('preview-selected').addClass('write-selected');
    +            form.find('#write_bucket').addClass('active').end().find('#preview_bucket').removeClass('active');
    +        });
    +        $('.preview-tab').live('click', function () {
    +            var form = $(this).closest('.previewable-comment-form');
    +            form.removeClass('write-selected').addClass('preview-selected');
    +            form.find('#write_bucket').removeClass('active').end().find('#preview_bucket').addClass('active');
    +            form.find('#preview_bucket p').html("Loading preview...");
    +            var url = form.find('#preview_bucket .content-body').data('api-url'),
    +            text = form.find('#write_bucket textarea').val();
    +            form.find('#preview_bucket .content-body').load(url, {text: text});
    +        });
    +
    +        $('#all-comments .delete-btn').click(function(e) {
    +            e.preventDefault();
    +            if (!confirm("Are you sure you want to delete this comment?")) {
    +                return;
    +            }
    +            // FIXME: global orig?
    +            orig = this;
    +            $.ajax({
    +                url: this.href,
    +                type: 'delete',
    +                dataType: 'json',
    +                success: function(resp) {
    +                    $(orig).parents('.comment-row').slideUp('fast');
    +                },
    +                error: function(resp) {
    +                    alert("Unable to delete comment");
    +                    console.log(resp);
    +                }
    +            });
    +        });
    +        $(".give_beer").click(function(e) {
    +            if (!$("#new_comment_content")[0].value) {
    +                $("#new_comment_content")[0].value = ":beer:";
    +            }
    +            $("#new_comment_content").focus();
    +        });
    +        $(document).delegate('#toc .minibutton', 'click', function() {
    +            $('#toc .content').toggle();
    +        });
    +        $(".comment-popover").popover({placement:'left'});
    +
    +
    +        var cform = $('#new_comment');
    +        cform.submit(function () {
    +            $(this).find('button[type="submit"]').attr('disabled', true).addClass('disabled');
    +            return true;
    +        });
    +
    +    });
    +});
    +
    +/* @source lib/jquery.caret.js */;
    +
    +
    +/*
    +   Implement Twitter/Weibo @ mentions
    +
    +   Copyright (c) 2012 chord.luo@gmail.com
    +
    +   Permission is hereby granted, free of charge, to any person obtaining
    +   a copy of this software and associated documentation files (the
    +   "Software"), to deal in the Software without restriction, including
    +   without limitation the rights to use, copy, modify, merge, publish,
    +   distribute, sublicense, and/or sell copies of the Software, and to
    +   permit persons to whom the Software is furnished to do so, subject to
    +   the following conditions:
    +
    +   The above copyright notice and this permission notice shall be
    +   included in all copies or substantial portions of the Software.
    +
    +   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
    +   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    +   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
    +   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
    +   LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
    +   OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
    +   WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    +*/
    +
    +/*
    +本插件操作 textarea 或者 input 内的插入符
    +只实现了获得插入符在文本框中的位置,以及设置
    +插入符的位置.
    +*/
    +
    +(function() {
    +
    +  (function($) {
    +    var getCaretPos, setCaretPos;
    +    getCaretPos = function(inputor) {
    +      var end, endRange, len, normalizedValue, pos, range, start, textInputRange;
    +      if (document.selection) {
    +        /*
    +                    #assume we select "HATE" in the inputor such as textarea -> { }.
    +                     *               start end-point.
    +                     *              /
    +                     * <  I really [HATE] IE   > between the brackets is the selection range.
    +                     *                   \
    +                     *                    end end-point.
    +        */
    +        range = document.selection.createRange();
    +        pos = 0;
    +        if (range && range.parentElement() === inputor) {
    +          normalizedValue = inputor.value.replace(/\r\n/g, "\n");
    +          /* SOMETIME !!! 
    +           "/r/n" is counted as two char.
    +            one line is two, two will be four. balalala.
    +            so we have to using the normalized one's length.;
    +          */
    +          len = normalizedValue.length;
    +          /*
    +                             <[  I really HATE IE   ]>:
    +                              the whole content in the inputor will be the textInputRange.
    +          */
    +          textInputRange = inputor.createTextRange();
    +          /*                 _here must be the position of bookmark.
    +                           /
    +             <[  I really [HATE] IE   ]>
    +              [---------->[           ] : this is what moveToBookmark do.
    +             <   I really [[HATE] IE   ]> : here is result.
    +                            \ two brackets in should be in line.
    +          */
    +          textInputRange.moveToBookmark(range.getBookmark());
    +          endRange = inputor.createTextRange();
    +          /*  [--------------------->[] : if set false all end-point goto end.
    +            <  I really [[HATE] IE  []]>
    +          */
    +          endRange.collapse(false);
    +          /*
    +                                          ___VS____
    +                                         /         \
    +                           <   I really [[HATE] IE []]>
    +                                                    \_endRange end-point.
    +                          
    +                          " > -1" mean the start end-point will be the same or right to the end end-point
    +                         * simplelly, all in the end.
    +          */
    +          if (textInputRange.compareEndPoints("StartToEnd", endRange) > -1) {
    +            start = end = len;
    +          } else {
    +            /*
    +                                        I really |HATE] IE   ]> 
    +                                               <-|
    +                                      I really[ [HATE] IE   ]>
    +                                            <-[
    +                                    I reall[y  [HATE] IE   ]>
    +                                 
    +                                  will return how many unit have moved.
    +            */
    +            start = -textInputRange.moveStart("character", -len);
    +            end = -textInputRange.moveEnd("character", -len);
    +          }
    +        }
    +      } else {
    +        start = inputor.selectionStart;
    +      }
    +      return start;
    +    };
    +    setCaretPos = function(inputor, pos) {
    +      var range;
    +      if (document.selection) {
    +        range = inputor.createTextRange();
    +        range.move("character", pos);
    +        return range.select();
    +      } else {
    +        return inputor.setSelectionRange(pos, pos);
    +      }
    +    };
    +    return $.fn.caretPos = function(pos) {
    +      var inputor;
    +      inputor = this[0];
    +      inputor.focus();
    +      if (pos) {
    +        return setCaretPos(inputor, pos);
    +      } else {
    +        return getCaretPos(inputor);
    +      }
    +    };
    +  })(window.jQuery);
    +
    +}).call(this);
    +
    +/* autogeneration */
    +define("lib/jquery.caret", [], function(){});
    +
    +/* @source mod/quick_emoji.js */;
    +
    +define("mod/quick_emoji", [
    +  "jquery",
    +  "lib/jquery.caret",
    +  "bootstrap"
    +],
    +        function($) {
    +            var quick_emoji = {};
    +            quick_emoji.enable = function(textarea_query){
    +                $('body').delegate('.quick-emoji a', 'click', function(e){
    +                    var emoji = $(this).attr('data-emoji');
    +                    if(emoji){
    +                        textarea = $(textarea_query);
    +                        var caretpos = textarea.caretPos();
    +                        var content = textarea.val();
    +                        var result = "";
    +                        if(content) {
    +                            result = content.slice(0, caretpos) + ' ' +
    +                                emoji + ' ' + content.slice(caretpos);
    +                            textarea.val(result);
    +                            textarea.caretPos(caretpos + emoji.length + 2);
    +                        }
    +                        else {
    +                            result = emoji;
    +                            textarea.val(result);
    +                            textarea.caretPos(result.length);
    +                        }
    +                    }
    +                    return false;
    +                });
    +
    +                $('body').delegate('.emojis a', 'hover', function(e){
    +                    var $zoomDiv = $('.zoom');
    +                    if (e.type == "mouseenter") {
    +                        var $emojiUrl = $(this).find('img').attr('src');
    +                        var $zoomImage = $('.zoom-image');
    +                        var $tabContent = $('.tab-content');
    +                        $zoomImage.attr('src', $emojiUrl);
    +                        $zoomDiv.css({'display': 'block'});
    +                    } else {
    +                        $zoomDiv.css({'display': 'none'});
    +                    }
    +                });
    +            }
    +                return quick_emoji;
    +            });
    +
    +/* @source  */;
    +
    +define('mousetrap', 'lib/mousetrap.js');
    +
    +require(['mod/quick_emoji'
    +, 'mousetrap'
    +, 'mod/commit'
    +, 'mod/diff'  // diff js
    +, 'mod/zclip' ], function(quick_emoji){
    +    quick_emoji.enable("#new_comment_content");
    +});
    diff --git a/dist/js/app/src/compare.js b/dist/js/app/src/compare.js
    new file mode 100644
    index 0000000..137e825
    --- /dev/null
    +++ b/dist/js/app/src/compare.js
    @@ -0,0 +1,5928 @@
    +
    +require.config({ enable_ozma: true });
    +
    +
    +/* @source mod/colorcube.js */;
    +
    +define("mod/colorcube", 
    +    [
    +  "jquery"
    +],
    +    function ($) {
    +        var colorcube = {}, cubeWnd;
    +        var showCubeWnd = function (el) {
    +            el = $(el);
    +            if (!cubeWnd) {
    +                cubeWnd = $('
    ').appendTo('body'); + } + var pos = el.offset(); + pos = {top:pos.top - 40, left:pos.left + el.width()/2 -15}; + cubeWnd.show().offset(pos).css({'background-color':el.data('color')}); + }; + colorcube.init = function (opts) { + if (opts.target) { + $(opts.target).delegate( + '.line .color', 'mouseenter mouseleave', function (e) { + if (e.type === 'mouseenter') { + showCubeWnd(this); + } else { + cubeWnd.hide(); + } + }); + } + }; + return colorcube; + } +); + +/* @source lib/socket.io.js */; + +/*! Socket.IO.js build:0.9.16, development. Copyright(c) 2011 LearnBoost MIT Licensed */ + +var io = ('undefined' === typeof module ? {} : module.exports); +(function() { + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, global) { + + /** + * IO namespace. + * + * @namespace + */ + + var io = exports; + + /** + * Socket.IO version + * + * @api public + */ + + io.version = '0.9.16'; + + /** + * Protocol implemented. + * + * @api public + */ + + io.protocol = 1; + + /** + * Available transports, these will be populated with the available transports + * + * @api public + */ + + io.transports = []; + + /** + * Keep track of jsonp callbacks. + * + * @api private + */ + + io.j = []; + + /** + * Keep track of our io.Sockets + * + * @api private + */ + io.sockets = {}; + + + /** + * Manages connections to hosts. + * + * @param {String} uri + * @Param {Boolean} force creation of new socket (defaults to false) + * @api public + */ + + io.connect = function (host, details) { + var uri = io.util.parseUri(host) + , uuri + , socket; + + if (global && global.location) { + uri.protocol = uri.protocol || global.location.protocol.slice(0, -1); + uri.host = uri.host || (global.document + ? global.document.domain : global.location.hostname); + uri.port = uri.port || global.location.port; + } + + uuri = io.util.uniqueUri(uri); + + var options = { + host: uri.host + , secure: 'https' == uri.protocol + , port: uri.port || ('https' == uri.protocol ? 443 : 80) + , query: uri.query || '' + }; + + io.util.merge(options, details); + + if (options['force new connection'] || !io.sockets[uuri]) { + socket = new io.Socket(options); + } + + if (!options['force new connection'] && socket) { + io.sockets[uuri] = socket; + } + + socket = socket || io.sockets[uuri]; + + // if path is different from '' or / + return socket.of(uri.path.length > 1 ? uri.path : ''); + }; + +})('object' === typeof module ? module.exports : (this.io = {}), this); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, global) { + + /** + * Utilities namespace. + * + * @namespace + */ + + var util = exports.util = {}; + + /** + * Parses an URI + * + * @author Steven Levithan (MIT license) + * @api public + */ + + var re = /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/; + + var parts = ['source', 'protocol', 'authority', 'userInfo', 'user', 'password', + 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', + 'anchor']; + + util.parseUri = function (str) { + var m = re.exec(str || '') + , uri = {} + , i = 14; + + while (i--) { + uri[parts[i]] = m[i] || ''; + } + + return uri; + }; + + /** + * Produces a unique url that identifies a Socket.IO connection. + * + * @param {Object} uri + * @api public + */ + + util.uniqueUri = function (uri) { + var protocol = uri.protocol + , host = uri.host + , port = uri.port; + + if ('document' in global) { + host = host || document.domain; + port = port || (protocol == 'https' + && document.location.protocol !== 'https:' ? 443 : document.location.port); + } else { + host = host || 'localhost'; + + if (!port && protocol == 'https') { + port = 443; + } + } + + return (protocol || 'http') + '://' + host + ':' + (port || 80); + }; + + /** + * Mergest 2 query strings in to once unique query string + * + * @param {String} base + * @param {String} addition + * @api public + */ + + util.query = function (base, addition) { + var query = util.chunkQuery(base || '') + , components = []; + + util.merge(query, util.chunkQuery(addition || '')); + for (var part in query) { + if (query.hasOwnProperty(part)) { + components.push(part + '=' + query[part]); + } + } + + return components.length ? '?' + components.join('&') : ''; + }; + + /** + * Transforms a querystring in to an object + * + * @param {String} qs + * @api public + */ + + util.chunkQuery = function (qs) { + var query = {} + , params = qs.split('&') + , i = 0 + , l = params.length + , kv; + + for (; i < l; ++i) { + kv = params[i].split('='); + if (kv[0]) { + query[kv[0]] = kv[1]; + } + } + + return query; + }; + + /** + * Executes the given function when the page is loaded. + * + * io.util.load(function () { console.log('page loaded'); }); + * + * @param {Function} fn + * @api public + */ + + var pageLoaded = false; + + util.load = function (fn) { + if ('document' in global && document.readyState === 'complete' || pageLoaded) { + return fn(); + } + + util.on(global, 'load', fn, false); + }; + + /** + * Adds an event. + * + * @api private + */ + + util.on = function (element, event, fn, capture) { + if (element.attachEvent) { + element.attachEvent('on' + event, fn); + } else if (element.addEventListener) { + element.addEventListener(event, fn, capture); + } + }; + + /** + * Generates the correct `XMLHttpRequest` for regular and cross domain requests. + * + * @param {Boolean} [xdomain] Create a request that can be used cross domain. + * @returns {XMLHttpRequest|false} If we can create a XMLHttpRequest. + * @api private + */ + + util.request = function (xdomain) { + + if (xdomain && 'undefined' != typeof XDomainRequest && !util.ua.hasCORS) { + return new XDomainRequest(); + } + + if ('undefined' != typeof XMLHttpRequest && (!xdomain || util.ua.hasCORS)) { + return new XMLHttpRequest(); + } + + if (!xdomain) { + try { + return new window[(['Active'].concat('Object').join('X'))]('Microsoft.XMLHTTP'); + } catch(e) { } + } + + return null; + }; + + /** + * XHR based transport constructor. + * + * @constructor + * @api public + */ + + /** + * Change the internal pageLoaded value. + */ + + if ('undefined' != typeof window) { + util.load(function () { + pageLoaded = true; + }); + } + + /** + * Defers a function to ensure a spinner is not displayed by the browser + * + * @param {Function} fn + * @api public + */ + + util.defer = function (fn) { + if (!util.ua.webkit || 'undefined' != typeof importScripts) { + return fn(); + } + + util.load(function () { + setTimeout(fn, 100); + }); + }; + + /** + * Merges two objects. + * + * @api public + */ + + util.merge = function merge (target, additional, deep, lastseen) { + var seen = lastseen || [] + , depth = typeof deep == 'undefined' ? 2 : deep + , prop; + + for (prop in additional) { + if (additional.hasOwnProperty(prop) && util.indexOf(seen, prop) < 0) { + if (typeof target[prop] !== 'object' || !depth) { + target[prop] = additional[prop]; + seen.push(additional[prop]); + } else { + util.merge(target[prop], additional[prop], depth - 1, seen); + } + } + } + + return target; + }; + + /** + * Merges prototypes from objects + * + * @api public + */ + + util.mixin = function (ctor, ctor2) { + util.merge(ctor.prototype, ctor2.prototype); + }; + + /** + * Shortcut for prototypical and static inheritance. + * + * @api private + */ + + util.inherit = function (ctor, ctor2) { + function f() {}; + f.prototype = ctor2.prototype; + ctor.prototype = new f; + }; + + /** + * Checks if the given object is an Array. + * + * io.util.isArray([]); // true + * io.util.isArray({}); // false + * + * @param Object obj + * @api public + */ + + util.isArray = Array.isArray || function (obj) { + return Object.prototype.toString.call(obj) === '[object Array]'; + }; + + /** + * Intersects values of two arrays into a third + * + * @api public + */ + + util.intersect = function (arr, arr2) { + var ret = [] + , longest = arr.length > arr2.length ? arr : arr2 + , shortest = arr.length > arr2.length ? arr2 : arr; + + for (var i = 0, l = shortest.length; i < l; i++) { + if (~util.indexOf(longest, shortest[i])) + ret.push(shortest[i]); + } + + return ret; + }; + + /** + * Array indexOf compatibility. + * + * @see bit.ly/a5Dxa2 + * @api public + */ + + util.indexOf = function (arr, o, i) { + + for (var j = arr.length, i = i < 0 ? i + j < 0 ? 0 : i + j : i || 0; + i < j && arr[i] !== o; i++) {} + + return j <= i ? -1 : i; + }; + + /** + * Converts enumerables to array. + * + * @api public + */ + + util.toArray = function (enu) { + var arr = []; + + for (var i = 0, l = enu.length; i < l; i++) + arr.push(enu[i]); + + return arr; + }; + + /** + * UA / engines detection namespace. + * + * @namespace + */ + + util.ua = {}; + + /** + * Whether the UA supports CORS for XHR. + * + * @api public + */ + + util.ua.hasCORS = 'undefined' != typeof XMLHttpRequest && (function () { + try { + var a = new XMLHttpRequest(); + } catch (e) { + return false; + } + + return a.withCredentials != undefined; + })(); + + /** + * Detect webkit. + * + * @api public + */ + + util.ua.webkit = 'undefined' != typeof navigator + && /webkit/i.test(navigator.userAgent); + + /** + * Detect iPad/iPhone/iPod. + * + * @api public + */ + + util.ua.iDevice = 'undefined' != typeof navigator + && /iPad|iPhone|iPod/i.test(navigator.userAgent); + +})('undefined' != typeof io ? io : module.exports, this); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.EventEmitter = EventEmitter; + + /** + * Event emitter constructor. + * + * @api public. + */ + + function EventEmitter () {}; + + /** + * Adds a listener + * + * @api public + */ + + EventEmitter.prototype.on = function (name, fn) { + if (!this.$events) { + this.$events = {}; + } + + if (!this.$events[name]) { + this.$events[name] = fn; + } else if (io.util.isArray(this.$events[name])) { + this.$events[name].push(fn); + } else { + this.$events[name] = [this.$events[name], fn]; + } + + return this; + }; + + EventEmitter.prototype.addListener = EventEmitter.prototype.on; + + /** + * Adds a volatile listener. + * + * @api public + */ + + EventEmitter.prototype.once = function (name, fn) { + var self = this; + + function on () { + self.removeListener(name, on); + fn.apply(this, arguments); + }; + + on.listener = fn; + this.on(name, on); + + return this; + }; + + /** + * Removes a listener. + * + * @api public + */ + + EventEmitter.prototype.removeListener = function (name, fn) { + if (this.$events && this.$events[name]) { + var list = this.$events[name]; + + if (io.util.isArray(list)) { + var pos = -1; + + for (var i = 0, l = list.length; i < l; i++) { + if (list[i] === fn || (list[i].listener && list[i].listener === fn)) { + pos = i; + break; + } + } + + if (pos < 0) { + return this; + } + + list.splice(pos, 1); + + if (!list.length) { + delete this.$events[name]; + } + } else if (list === fn || (list.listener && list.listener === fn)) { + delete this.$events[name]; + } + } + + return this; + }; + + /** + * Removes all listeners for an event. + * + * @api public + */ + + EventEmitter.prototype.removeAllListeners = function (name) { + if (name === undefined) { + this.$events = {}; + return this; + } + + if (this.$events && this.$events[name]) { + this.$events[name] = null; + } + + return this; + }; + + /** + * Gets all listeners for a certain event. + * + * @api publci + */ + + EventEmitter.prototype.listeners = function (name) { + if (!this.$events) { + this.$events = {}; + } + + if (!this.$events[name]) { + this.$events[name] = []; + } + + if (!io.util.isArray(this.$events[name])) { + this.$events[name] = [this.$events[name]]; + } + + return this.$events[name]; + }; + + /** + * Emits an event. + * + * @api public + */ + + EventEmitter.prototype.emit = function (name) { + if (!this.$events) { + return false; + } + + var handler = this.$events[name]; + + if (!handler) { + return false; + } + + var args = Array.prototype.slice.call(arguments, 1); + + if ('function' == typeof handler) { + handler.apply(this, args); + } else if (io.util.isArray(handler)) { + var listeners = handler.slice(); + + for (var i = 0, l = listeners.length; i < l; i++) { + listeners[i].apply(this, args); + } + } else { + return false; + } + + return true; + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +/** + * Based on JSON2 (http://www.JSON.org/js.html). + */ + +(function (exports, nativeJSON) { + "use strict"; + + // use native JSON if it's available + if (nativeJSON && nativeJSON.parse){ + return exports.JSON = { + parse: nativeJSON.parse + , stringify: nativeJSON.stringify + }; + } + + var JSON = exports.JSON = {}; + + function f(n) { + // Format integers to have at least two digits. + return n < 10 ? '0' + n : n; + } + + function date(d, key) { + return isFinite(d.valueOf()) ? + d.getUTCFullYear() + '-' + + f(d.getUTCMonth() + 1) + '-' + + f(d.getUTCDate()) + 'T' + + f(d.getUTCHours()) + ':' + + f(d.getUTCMinutes()) + ':' + + f(d.getUTCSeconds()) + 'Z' : null; + }; + + var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + gap, + indent, + meta = { // table of character substitutions + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '\\': '\\\\' + }, + rep; + + + function quote(string) { + +// If the string contains no control characters, no quote characters, and no +// backslash characters, then we can safely slap some quotes around it. +// Otherwise we must also replace the offending characters with safe escape +// sequences. + + escapable.lastIndex = 0; + return escapable.test(string) ? '"' + string.replace(escapable, function (a) { + var c = meta[a]; + return typeof c === 'string' ? c : + '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }) + '"' : '"' + string + '"'; + } + + + function str(key, holder) { + +// Produce a string from holder[key]. + + var i, // The loop counter. + k, // The member key. + v, // The member value. + length, + mind = gap, + partial, + value = holder[key]; + +// If the value has a toJSON method, call it to obtain a replacement value. + + if (value instanceof Date) { + value = date(key); + } + +// If we were called with a replacer function, then call the replacer to +// obtain a replacement value. + + if (typeof rep === 'function') { + value = rep.call(holder, key, value); + } + +// What happens next depends on the value's type. + + switch (typeof value) { + case 'string': + return quote(value); + + case 'number': + +// JSON numbers must be finite. Encode non-finite numbers as null. + + return isFinite(value) ? String(value) : 'null'; + + case 'boolean': + case 'null': + +// If the value is a boolean or null, convert it to a string. Note: +// typeof null does not produce 'null'. The case is included here in +// the remote chance that this gets fixed someday. + + return String(value); + +// If the type is 'object', we might be dealing with an object or an array or +// null. + + case 'object': + +// Due to a specification blunder in ECMAScript, typeof null is 'object', +// so watch out for that case. + + if (!value) { + return 'null'; + } + +// Make an array to hold the partial results of stringifying this object value. + + gap += indent; + partial = []; + +// Is the value an array? + + if (Object.prototype.toString.apply(value) === '[object Array]') { + +// The value is an array. Stringify every element. Use null as a placeholder +// for non-JSON values. + + length = value.length; + for (i = 0; i < length; i += 1) { + partial[i] = str(i, value) || 'null'; + } + +// Join all of the elements together, separated with commas, and wrap them in +// brackets. + + v = partial.length === 0 ? '[]' : gap ? + '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : + '[' + partial.join(',') + ']'; + gap = mind; + return v; + } + +// If the replacer is an array, use it to select the members to be stringified. + + if (rep && typeof rep === 'object') { + length = rep.length; + for (i = 0; i < length; i += 1) { + if (typeof rep[i] === 'string') { + k = rep[i]; + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } else { + +// Otherwise, iterate through all of the keys in the object. + + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } + +// Join all of the member texts together, separated with commas, +// and wrap them in braces. + + v = partial.length === 0 ? '{}' : gap ? + '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : + '{' + partial.join(',') + '}'; + gap = mind; + return v; + } + } + +// If the JSON object does not yet have a stringify method, give it one. + + JSON.stringify = function (value, replacer, space) { + +// The stringify method takes a value and an optional replacer, and an optional +// space parameter, and returns a JSON text. The replacer can be a function +// that can replace values, or an array of strings that will select the keys. +// A default replacer method can be provided. Use of the space parameter can +// produce text that is more easily readable. + + var i; + gap = ''; + indent = ''; + +// If the space parameter is a number, make an indent string containing that +// many spaces. + + if (typeof space === 'number') { + for (i = 0; i < space; i += 1) { + indent += ' '; + } + +// If the space parameter is a string, it will be used as the indent string. + + } else if (typeof space === 'string') { + indent = space; + } + +// If there is a replacer, it must be a function or an array. +// Otherwise, throw an error. + + rep = replacer; + if (replacer && typeof replacer !== 'function' && + (typeof replacer !== 'object' || + typeof replacer.length !== 'number')) { + throw new Error('JSON.stringify'); + } + +// Make a fake root object containing our value under the key of ''. +// Return the result of stringifying the value. + + return str('', {'': value}); + }; + +// If the JSON object does not yet have a parse method, give it one. + + JSON.parse = function (text, reviver) { + // The parse method takes a text and an optional reviver function, and returns + // a JavaScript value if the text is a valid JSON text. + + var j; + + function walk(holder, key) { + + // The walk method is used to recursively walk the resulting structure so + // that modifications can be made. + + var k, v, value = holder[key]; + if (value && typeof value === 'object') { + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = walk(value, k); + if (v !== undefined) { + value[k] = v; + } else { + delete value[k]; + } + } + } + } + return reviver.call(holder, key, value); + } + + + // Parsing happens in four stages. In the first stage, we replace certain + // Unicode characters with escape sequences. JavaScript handles many characters + // incorrectly, either silently deleting them, or treating them as line endings. + + text = String(text); + cx.lastIndex = 0; + if (cx.test(text)) { + text = text.replace(cx, function (a) { + return '\\u' + + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }); + } + + // In the second stage, we run the text against regular expressions that look + // for non-JSON patterns. We are especially concerned with '()' and 'new' + // because they can cause invocation, and '=' because it can cause mutation. + // But just to be safe, we want to reject all unexpected forms. + + // We split the second stage into 4 regexp operations in order to work around + // crippling inefficiencies in IE's and Safari's regexp engines. First we + // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we + // replace all simple value tokens with ']' characters. Third, we delete all + // open brackets that follow a colon or comma or that begin the text. Finally, + // we look to see that the remaining characters are only whitespace or ']' or + // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. + + if (/^[\],:{}\s]*$/ + .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') + .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') + .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { + + // In the third stage we use the eval function to compile the text into a + // JavaScript structure. The '{' operator is subject to a syntactic ambiguity + // in JavaScript: it can begin a block or an object literal. We wrap the text + // in parens to eliminate the ambiguity. + + j = eval('(' + text + ')'); + + // In the optional fourth stage, we recursively walk the new structure, passing + // each name/value pair to a reviver function for possible transformation. + + return typeof reviver === 'function' ? + walk({'': j}, '') : j; + } + + // If the text is not JSON parseable, then a SyntaxError is thrown. + + throw new SyntaxError('JSON.parse'); + }; + +})( + 'undefined' != typeof io ? io : module.exports + , typeof JSON !== 'undefined' ? JSON : undefined +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Parser namespace. + * + * @namespace + */ + + var parser = exports.parser = {}; + + /** + * Packet types. + */ + + var packets = parser.packets = [ + 'disconnect' + , 'connect' + , 'heartbeat' + , 'message' + , 'json' + , 'event' + , 'ack' + , 'error' + , 'noop' + ]; + + /** + * Errors reasons. + */ + + var reasons = parser.reasons = [ + 'transport not supported' + , 'client not handshaken' + , 'unauthorized' + ]; + + /** + * Errors advice. + */ + + var advice = parser.advice = [ + 'reconnect' + ]; + + /** + * Shortcuts. + */ + + var JSON = io.JSON + , indexOf = io.util.indexOf; + + /** + * Encodes a packet. + * + * @api private + */ + + parser.encodePacket = function (packet) { + var type = indexOf(packets, packet.type) + , id = packet.id || '' + , endpoint = packet.endpoint || '' + , ack = packet.ack + , data = null; + + switch (packet.type) { + case 'error': + var reason = packet.reason ? indexOf(reasons, packet.reason) : '' + , adv = packet.advice ? indexOf(advice, packet.advice) : ''; + + if (reason !== '' || adv !== '') + data = reason + (adv !== '' ? ('+' + adv) : ''); + + break; + + case 'message': + if (packet.data !== '') + data = packet.data; + break; + + case 'event': + var ev = { name: packet.name }; + + if (packet.args && packet.args.length) { + ev.args = packet.args; + } + + data = JSON.stringify(ev); + break; + + case 'json': + data = JSON.stringify(packet.data); + break; + + case 'connect': + if (packet.qs) + data = packet.qs; + break; + + case 'ack': + data = packet.ackId + + (packet.args && packet.args.length + ? '+' + JSON.stringify(packet.args) : ''); + break; + } + + // construct packet with required fragments + var encoded = [ + type + , id + (ack == 'data' ? '+' : '') + , endpoint + ]; + + // data fragment is optional + if (data !== null && data !== undefined) + encoded.push(data); + + return encoded.join(':'); + }; + + /** + * Encodes multiple messages (payload). + * + * @param {Array} messages + * @api private + */ + + parser.encodePayload = function (packets) { + var decoded = ''; + + if (packets.length == 1) + return packets[0]; + + for (var i = 0, l = packets.length; i < l; i++) { + var packet = packets[i]; + decoded += '\ufffd' + packet.length + '\ufffd' + packets[i]; + } + + return decoded; + }; + + /** + * Decodes a packet + * + * @api private + */ + + var regexp = /([^:]+):([0-9]+)?(\+)?:([^:]+)?:?([\s\S]*)?/; + + parser.decodePacket = function (data) { + var pieces = data.match(regexp); + + if (!pieces) return {}; + + var id = pieces[2] || '' + , data = pieces[5] || '' + , packet = { + type: packets[pieces[1]] + , endpoint: pieces[4] || '' + }; + + // whether we need to acknowledge the packet + if (id) { + packet.id = id; + if (pieces[3]) + packet.ack = 'data'; + else + packet.ack = true; + } + + // handle different packet types + switch (packet.type) { + case 'error': + var pieces = data.split('+'); + packet.reason = reasons[pieces[0]] || ''; + packet.advice = advice[pieces[1]] || ''; + break; + + case 'message': + packet.data = data || ''; + break; + + case 'event': + try { + var opts = JSON.parse(data); + packet.name = opts.name; + packet.args = opts.args; + } catch (e) { } + + packet.args = packet.args || []; + break; + + case 'json': + try { + packet.data = JSON.parse(data); + } catch (e) { } + break; + + case 'connect': + packet.qs = data || ''; + break; + + case 'ack': + var pieces = data.match(/^([0-9]+)(\+)?(.*)/); + if (pieces) { + packet.ackId = pieces[1]; + packet.args = []; + + if (pieces[3]) { + try { + packet.args = pieces[3] ? JSON.parse(pieces[3]) : []; + } catch (e) { } + } + } + break; + + case 'disconnect': + case 'heartbeat': + break; + }; + + return packet; + }; + + /** + * Decodes data payload. Detects multiple messages + * + * @return {Array} messages + * @api public + */ + + parser.decodePayload = function (data) { + // IE doesn't like data[i] for unicode chars, charAt works fine + if (data.charAt(0) == '\ufffd') { + var ret = []; + + for (var i = 1, length = ''; i < data.length; i++) { + if (data.charAt(i) == '\ufffd') { + ret.push(parser.decodePacket(data.substr(i + 1).substr(0, length))); + i += Number(length) + 1; + length = ''; + } else { + length += data.charAt(i); + } + } + + return ret; + } else { + return [parser.decodePacket(data)]; + } + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.Transport = Transport; + + /** + * This is the transport template for all supported transport methods. + * + * @constructor + * @api public + */ + + function Transport (socket, sessid) { + this.socket = socket; + this.sessid = sessid; + }; + + /** + * Apply EventEmitter mixin. + */ + + io.util.mixin(Transport, io.EventEmitter); + + + /** + * Indicates whether heartbeats is enabled for this transport + * + * @api private + */ + + Transport.prototype.heartbeats = function () { + return true; + }; + + /** + * Handles the response from the server. When a new response is received + * it will automatically update the timeout, decode the message and + * forwards the response to the onMessage function for further processing. + * + * @param {String} data Response from the server. + * @api private + */ + + Transport.prototype.onData = function (data) { + this.clearCloseTimeout(); + + // If the connection in currently open (or in a reopening state) reset the close + // timeout since we have just received data. This check is necessary so + // that we don't reset the timeout on an explicitly disconnected connection. + if (this.socket.connected || this.socket.connecting || this.socket.reconnecting) { + this.setCloseTimeout(); + } + + if (data !== '') { + // todo: we should only do decodePayload for xhr transports + var msgs = io.parser.decodePayload(data); + + if (msgs && msgs.length) { + for (var i = 0, l = msgs.length; i < l; i++) { + this.onPacket(msgs[i]); + } + } + } + + return this; + }; + + /** + * Handles packets. + * + * @api private + */ + + Transport.prototype.onPacket = function (packet) { + this.socket.setHeartbeatTimeout(); + + if (packet.type == 'heartbeat') { + return this.onHeartbeat(); + } + + if (packet.type == 'connect' && packet.endpoint == '') { + this.onConnect(); + } + + if (packet.type == 'error' && packet.advice == 'reconnect') { + this.isOpen = false; + } + + this.socket.onPacket(packet); + + return this; + }; + + /** + * Sets close timeout + * + * @api private + */ + + Transport.prototype.setCloseTimeout = function () { + if (!this.closeTimeout) { + var self = this; + + this.closeTimeout = setTimeout(function () { + self.onDisconnect(); + }, this.socket.closeTimeout); + } + }; + + /** + * Called when transport disconnects. + * + * @api private + */ + + Transport.prototype.onDisconnect = function () { + if (this.isOpen) this.close(); + this.clearTimeouts(); + this.socket.onDisconnect(); + return this; + }; + + /** + * Called when transport connects + * + * @api private + */ + + Transport.prototype.onConnect = function () { + this.socket.onConnect(); + return this; + }; + + /** + * Clears close timeout + * + * @api private + */ + + Transport.prototype.clearCloseTimeout = function () { + if (this.closeTimeout) { + clearTimeout(this.closeTimeout); + this.closeTimeout = null; + } + }; + + /** + * Clear timeouts + * + * @api private + */ + + Transport.prototype.clearTimeouts = function () { + this.clearCloseTimeout(); + + if (this.reopenTimeout) { + clearTimeout(this.reopenTimeout); + } + }; + + /** + * Sends a packet + * + * @param {Object} packet object. + * @api private + */ + + Transport.prototype.packet = function (packet) { + this.send(io.parser.encodePacket(packet)); + }; + + /** + * Send the received heartbeat message back to server. So the server + * knows we are still connected. + * + * @param {String} heartbeat Heartbeat response from the server. + * @api private + */ + + Transport.prototype.onHeartbeat = function (heartbeat) { + this.packet({ type: 'heartbeat' }); + }; + + /** + * Called when the transport opens. + * + * @api private + */ + + Transport.prototype.onOpen = function () { + this.isOpen = true; + this.clearCloseTimeout(); + this.socket.onOpen(); + }; + + /** + * Notifies the base when the connection with the Socket.IO server + * has been disconnected. + * + * @api private + */ + + Transport.prototype.onClose = function () { + var self = this; + + /* FIXME: reopen delay causing a infinit loop + this.reopenTimeout = setTimeout(function () { + self.open(); + }, this.socket.options['reopen delay']);*/ + + this.isOpen = false; + this.socket.onClose(); + this.onDisconnect(); + }; + + /** + * Generates a connection url based on the Socket.IO URL Protocol. + * See for more details. + * + * @returns {String} Connection url + * @api private + */ + + Transport.prototype.prepareUrl = function () { + var options = this.socket.options; + + return this.scheme() + '://' + + options.host + ':' + options.port + '/' + + options.resource + '/' + io.protocol + + '/' + this.name + '/' + this.sessid; + }; + + /** + * Checks if the transport is ready to start a connection. + * + * @param {Socket} socket The socket instance that needs a transport + * @param {Function} fn The callback + * @api private + */ + + Transport.prototype.ready = function (socket, fn) { + fn.call(this); + }; +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + */ + + exports.Socket = Socket; + + /** + * Create a new `Socket.IO client` which can establish a persistent + * connection with a Socket.IO enabled server. + * + * @api public + */ + + function Socket (options) { + this.options = { + port: 80 + , secure: false + , document: 'document' in global ? document : false + , resource: 'socket.io' + , transports: io.transports + , 'connect timeout': 10000 + , 'try multiple transports': true + , 'reconnect': true + , 'reconnection delay': 500 + , 'reconnection limit': Infinity + , 'reopen delay': 3000 + , 'max reconnection attempts': 10 + , 'sync disconnect on unload': false + , 'auto connect': true + , 'flash policy port': 10843 + , 'manualFlush': false + }; + + io.util.merge(this.options, options); + + this.connected = false; + this.open = false; + this.connecting = false; + this.reconnecting = false; + this.namespaces = {}; + this.buffer = []; + this.doBuffer = false; + + if (this.options['sync disconnect on unload'] && + (!this.isXDomain() || io.util.ua.hasCORS)) { + var self = this; + io.util.on(global, 'beforeunload', function () { + self.disconnectSync(); + }, false); + } + + if (this.options['auto connect']) { + this.connect(); + } +}; + + /** + * Apply EventEmitter mixin. + */ + + io.util.mixin(Socket, io.EventEmitter); + + /** + * Returns a namespace listener/emitter for this socket + * + * @api public + */ + + Socket.prototype.of = function (name) { + if (!this.namespaces[name]) { + this.namespaces[name] = new io.SocketNamespace(this, name); + + if (name !== '') { + this.namespaces[name].packet({ type: 'connect' }); + } + } + + return this.namespaces[name]; + }; + + /** + * Emits the given event to the Socket and all namespaces + * + * @api private + */ + + Socket.prototype.publish = function () { + this.emit.apply(this, arguments); + + var nsp; + + for (var i in this.namespaces) { + if (this.namespaces.hasOwnProperty(i)) { + nsp = this.of(i); + nsp.$emit.apply(nsp, arguments); + } + } + }; + + /** + * Performs the handshake + * + * @api private + */ + + function empty () { }; + + Socket.prototype.handshake = function (fn) { + var self = this + , options = this.options; + + function complete (data) { + if (data instanceof Error) { + self.connecting = false; + self.onError(data.message); + } else { + fn.apply(null, data.split(':')); + } + }; + + var url = [ + 'http' + (options.secure ? 's' : '') + ':/' + , options.host + ':' + options.port + , options.resource + , io.protocol + , io.util.query(this.options.query, 't=' + +new Date) + ].join('/'); + + if (this.isXDomain() && !io.util.ua.hasCORS) { + var insertAt = document.getElementsByTagName('script')[0] + , script = document.createElement('script'); + + script.src = url + '&jsonp=' + io.j.length; + insertAt.parentNode.insertBefore(script, insertAt); + + io.j.push(function (data) { + complete(data); + script.parentNode.removeChild(script); + }); + } else { + var xhr = io.util.request(); + + xhr.open('GET', url, true); + if (this.isXDomain()) { + xhr.withCredentials = true; + } + xhr.onreadystatechange = function () { + if (xhr.readyState == 4) { + xhr.onreadystatechange = empty; + + if (xhr.status == 200) { + complete(xhr.responseText); + } else if (xhr.status == 403) { + self.onError(xhr.responseText); + } else { + self.connecting = false; + !self.reconnecting && self.onError(xhr.responseText); + } + } + }; + xhr.send(null); + } + }; + + /** + * Find an available transport based on the options supplied in the constructor. + * + * @api private + */ + + Socket.prototype.getTransport = function (override) { + var transports = override || this.transports, match; + + for (var i = 0, transport; transport = transports[i]; i++) { + if (io.Transport[transport] + && io.Transport[transport].check(this) + && (!this.isXDomain() || io.Transport[transport].xdomainCheck(this))) { + return new io.Transport[transport](this, this.sessionid); + } + } + + return null; + }; + + /** + * Connects to the server. + * + * @param {Function} [fn] Callback. + * @returns {io.Socket} + * @api public + */ + + Socket.prototype.connect = function (fn) { + if (this.connecting) { + return this; + } + + var self = this; + self.connecting = true; + + this.handshake(function (sid, heartbeat, close, transports) { + self.sessionid = sid; + self.closeTimeout = close * 1000; + self.heartbeatTimeout = heartbeat * 1000; + if(!self.transports) + self.transports = self.origTransports = (transports ? io.util.intersect( + transports.split(',') + , self.options.transports + ) : self.options.transports); + + self.setHeartbeatTimeout(); + + function connect (transports){ + if (self.transport) self.transport.clearTimeouts(); + + self.transport = self.getTransport(transports); + if (!self.transport) return self.publish('connect_failed'); + + // once the transport is ready + self.transport.ready(self, function () { + self.connecting = true; + self.publish('connecting', self.transport.name); + self.transport.open(); + + if (self.options['connect timeout']) { + self.connectTimeoutTimer = setTimeout(function () { + if (!self.connected) { + self.connecting = false; + + if (self.options['try multiple transports']) { + var remaining = self.transports; + + while (remaining.length > 0 && remaining.splice(0,1)[0] != + self.transport.name) {} + + if (remaining.length){ + connect(remaining); + } else { + self.publish('connect_failed'); + } + } + } + }, self.options['connect timeout']); + } + }); + } + + connect(self.transports); + + self.once('connect', function (){ + clearTimeout(self.connectTimeoutTimer); + + fn && typeof fn == 'function' && fn(); + }); + }); + + return this; + }; + + /** + * Clears and sets a new heartbeat timeout using the value given by the + * server during the handshake. + * + * @api private + */ + + Socket.prototype.setHeartbeatTimeout = function () { + clearTimeout(this.heartbeatTimeoutTimer); + if(this.transport && !this.transport.heartbeats()) return; + + var self = this; + this.heartbeatTimeoutTimer = setTimeout(function () { + self.transport.onClose(); + }, this.heartbeatTimeout); + }; + + /** + * Sends a message. + * + * @param {Object} data packet. + * @returns {io.Socket} + * @api public + */ + + Socket.prototype.packet = function (data) { + if (this.connected && !this.doBuffer) { + this.transport.packet(data); + } else { + this.buffer.push(data); + } + + return this; + }; + + /** + * Sets buffer state + * + * @api private + */ + + Socket.prototype.setBuffer = function (v) { + this.doBuffer = v; + + if (!v && this.connected && this.buffer.length) { + if (!this.options['manualFlush']) { + this.flushBuffer(); + } + } + }; + + /** + * Flushes the buffer data over the wire. + * To be invoked manually when 'manualFlush' is set to true. + * + * @api public + */ + + Socket.prototype.flushBuffer = function() { + this.transport.payload(this.buffer); + this.buffer = []; + }; + + + /** + * Disconnect the established connect. + * + * @returns {io.Socket} + * @api public + */ + + Socket.prototype.disconnect = function () { + if (this.connected || this.connecting) { + if (this.open) { + this.of('').packet({ type: 'disconnect' }); + } + + // handle disconnection immediately + this.onDisconnect('booted'); + } + + return this; + }; + + /** + * Disconnects the socket with a sync XHR. + * + * @api private + */ + + Socket.prototype.disconnectSync = function () { + // ensure disconnection + var xhr = io.util.request(); + var uri = [ + 'http' + (this.options.secure ? 's' : '') + ':/' + , this.options.host + ':' + this.options.port + , this.options.resource + , io.protocol + , '' + , this.sessionid + ].join('/') + '/?disconnect=1'; + + xhr.open('GET', uri, false); + xhr.send(null); + + // handle disconnection immediately + this.onDisconnect('booted'); + }; + + /** + * Check if we need to use cross domain enabled transports. Cross domain would + * be a different port or different domain name. + * + * @returns {Boolean} + * @api private + */ + + Socket.prototype.isXDomain = function () { + + var port = global.location.port || + ('https:' == global.location.protocol ? 443 : 80); + + return this.options.host !== global.location.hostname + || this.options.port != port; + }; + + /** + * Called upon handshake. + * + * @api private + */ + + Socket.prototype.onConnect = function () { + if (!this.connected) { + this.connected = true; + this.connecting = false; + if (!this.doBuffer) { + // make sure to flush the buffer + this.setBuffer(false); + } + this.emit('connect'); + } + }; + + /** + * Called when the transport opens + * + * @api private + */ + + Socket.prototype.onOpen = function () { + this.open = true; + }; + + /** + * Called when the transport closes. + * + * @api private + */ + + Socket.prototype.onClose = function () { + this.open = false; + clearTimeout(this.heartbeatTimeoutTimer); + }; + + /** + * Called when the transport first opens a connection + * + * @param text + */ + + Socket.prototype.onPacket = function (packet) { + this.of(packet.endpoint).onPacket(packet); + }; + + /** + * Handles an error. + * + * @api private + */ + + Socket.prototype.onError = function (err) { + if (err && err.advice) { + if (err.advice === 'reconnect' && (this.connected || this.connecting)) { + this.disconnect(); + if (this.options.reconnect) { + this.reconnect(); + } + } + } + + this.publish('error', err && err.reason ? err.reason : err); + }; + + /** + * Called when the transport disconnects. + * + * @api private + */ + + Socket.prototype.onDisconnect = function (reason) { + var wasConnected = this.connected + , wasConnecting = this.connecting; + + this.connected = false; + this.connecting = false; + this.open = false; + + if (wasConnected || wasConnecting) { + this.transport.close(); + this.transport.clearTimeouts(); + if (wasConnected) { + this.publish('disconnect', reason); + + if ('booted' != reason && this.options.reconnect && !this.reconnecting) { + this.reconnect(); + } + } + } + }; + + /** + * Called upon reconnection. + * + * @api private + */ + + Socket.prototype.reconnect = function () { + this.reconnecting = true; + this.reconnectionAttempts = 0; + this.reconnectionDelay = this.options['reconnection delay']; + + var self = this + , maxAttempts = this.options['max reconnection attempts'] + , tryMultiple = this.options['try multiple transports'] + , limit = this.options['reconnection limit']; + + function reset () { + if (self.connected) { + for (var i in self.namespaces) { + if (self.namespaces.hasOwnProperty(i) && '' !== i) { + self.namespaces[i].packet({ type: 'connect' }); + } + } + self.publish('reconnect', self.transport.name, self.reconnectionAttempts); + } + + clearTimeout(self.reconnectionTimer); + + self.removeListener('connect_failed', maybeReconnect); + self.removeListener('connect', maybeReconnect); + + self.reconnecting = false; + + delete self.reconnectionAttempts; + delete self.reconnectionDelay; + delete self.reconnectionTimer; + delete self.redoTransports; + + self.options['try multiple transports'] = tryMultiple; + }; + + function maybeReconnect () { + if (!self.reconnecting) { + return; + } + + if (self.connected) { + return reset(); + }; + + if (self.connecting && self.reconnecting) { + return self.reconnectionTimer = setTimeout(maybeReconnect, 1000); + } + + if (self.reconnectionAttempts++ >= maxAttempts) { + if (!self.redoTransports) { + self.on('connect_failed', maybeReconnect); + self.options['try multiple transports'] = true; + self.transports = self.origTransports; + self.transport = self.getTransport(); + self.redoTransports = true; + self.connect(); + } else { + self.publish('reconnect_failed'); + reset(); + } + } else { + if (self.reconnectionDelay < limit) { + self.reconnectionDelay *= 2; // exponential back off + } + + self.connect(); + self.publish('reconnecting', self.reconnectionDelay, self.reconnectionAttempts); + self.reconnectionTimer = setTimeout(maybeReconnect, self.reconnectionDelay); + } + }; + + this.options['try multiple transports'] = false; + this.reconnectionTimer = setTimeout(maybeReconnect, this.reconnectionDelay); + + this.on('connect', maybeReconnect); + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.SocketNamespace = SocketNamespace; + + /** + * Socket namespace constructor. + * + * @constructor + * @api public + */ + + function SocketNamespace (socket, name) { + this.socket = socket; + this.name = name || ''; + this.flags = {}; + this.json = new Flag(this, 'json'); + this.ackPackets = 0; + this.acks = {}; + }; + + /** + * Apply EventEmitter mixin. + */ + + io.util.mixin(SocketNamespace, io.EventEmitter); + + /** + * Copies emit since we override it + * + * @api private + */ + + SocketNamespace.prototype.$emit = io.EventEmitter.prototype.emit; + + /** + * Creates a new namespace, by proxying the request to the socket. This + * allows us to use the synax as we do on the server. + * + * @api public + */ + + SocketNamespace.prototype.of = function () { + return this.socket.of.apply(this.socket, arguments); + }; + + /** + * Sends a packet. + * + * @api private + */ + + SocketNamespace.prototype.packet = function (packet) { + packet.endpoint = this.name; + this.socket.packet(packet); + this.flags = {}; + return this; + }; + + /** + * Sends a message + * + * @api public + */ + + SocketNamespace.prototype.send = function (data, fn) { + var packet = { + type: this.flags.json ? 'json' : 'message' + , data: data + }; + + if ('function' == typeof fn) { + packet.id = ++this.ackPackets; + packet.ack = true; + this.acks[packet.id] = fn; + } + + return this.packet(packet); + }; + + /** + * Emits an event + * + * @api public + */ + + SocketNamespace.prototype.emit = function (name) { + var args = Array.prototype.slice.call(arguments, 1) + , lastArg = args[args.length - 1] + , packet = { + type: 'event' + , name: name + }; + + if ('function' == typeof lastArg) { + packet.id = ++this.ackPackets; + packet.ack = 'data'; + this.acks[packet.id] = lastArg; + args = args.slice(0, args.length - 1); + } + + packet.args = args; + + return this.packet(packet); + }; + + /** + * Disconnects the namespace + * + * @api private + */ + + SocketNamespace.prototype.disconnect = function () { + if (this.name === '') { + this.socket.disconnect(); + } else { + this.packet({ type: 'disconnect' }); + this.$emit('disconnect'); + } + + return this; + }; + + /** + * Handles a packet + * + * @api private + */ + + SocketNamespace.prototype.onPacket = function (packet) { + var self = this; + + function ack () { + self.packet({ + type: 'ack' + , args: io.util.toArray(arguments) + , ackId: packet.id + }); + }; + + switch (packet.type) { + case 'connect': + this.$emit('connect'); + break; + + case 'disconnect': + if (this.name === '') { + this.socket.onDisconnect(packet.reason || 'booted'); + } else { + this.$emit('disconnect', packet.reason); + } + break; + + case 'message': + case 'json': + var params = ['message', packet.data]; + + if (packet.ack == 'data') { + params.push(ack); + } else if (packet.ack) { + this.packet({ type: 'ack', ackId: packet.id }); + } + + this.$emit.apply(this, params); + break; + + case 'event': + var params = [packet.name].concat(packet.args); + + if (packet.ack == 'data') + params.push(ack); + + this.$emit.apply(this, params); + break; + + case 'ack': + if (this.acks[packet.ackId]) { + this.acks[packet.ackId].apply(this, packet.args); + delete this.acks[packet.ackId]; + } + break; + + case 'error': + if (packet.advice){ + this.socket.onError(packet); + } else { + if (packet.reason == 'unauthorized') { + this.$emit('connect_failed', packet.reason); + } else { + this.$emit('error', packet.reason); + } + } + break; + } + }; + + /** + * Flag interface. + * + * @api private + */ + + function Flag (nsp, name) { + this.namespace = nsp; + this.name = name; + }; + + /** + * Send a message + * + * @api public + */ + + Flag.prototype.send = function () { + this.namespace.flags[this.name] = true; + this.namespace.send.apply(this.namespace, arguments); + }; + + /** + * Emit an event + * + * @api public + */ + + Flag.prototype.emit = function () { + this.namespace.flags[this.name] = true; + this.namespace.emit.apply(this.namespace, arguments); + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + */ + + exports.websocket = WS; + + /** + * The WebSocket transport uses the HTML5 WebSocket API to establish an + * persistent connection with the Socket.IO server. This transport will also + * be inherited by the FlashSocket fallback as it provides a API compatible + * polyfill for the WebSockets. + * + * @constructor + * @extends {io.Transport} + * @api public + */ + + function WS (socket) { + io.Transport.apply(this, arguments); + }; + + /** + * Inherits from Transport. + */ + + io.util.inherit(WS, io.Transport); + + /** + * Transport name + * + * @api public + */ + + WS.prototype.name = 'websocket'; + + /** + * Initializes a new `WebSocket` connection with the Socket.IO server. We attach + * all the appropriate listeners to handle the responses from the server. + * + * @returns {Transport} + * @api public + */ + + WS.prototype.open = function () { + var query = io.util.query(this.socket.options.query) + , self = this + , Socket + + + if (!Socket) { + Socket = global.MozWebSocket || global.WebSocket; + } + + this.websocket = new Socket(this.prepareUrl() + query); + + this.websocket.onopen = function () { + self.onOpen(); + self.socket.setBuffer(false); + }; + this.websocket.onmessage = function (ev) { + self.onData(ev.data); + }; + this.websocket.onclose = function () { + self.onClose(); + self.socket.setBuffer(true); + }; + this.websocket.onerror = function (e) { + self.onError(e); + }; + + return this; + }; + + /** + * Send a message to the Socket.IO server. The message will automatically be + * encoded in the correct message format. + * + * @returns {Transport} + * @api public + */ + + // Do to a bug in the current IDevices browser, we need to wrap the send in a + // setTimeout, when they resume from sleeping the browser will crash if + // we don't allow the browser time to detect the socket has been closed + if (io.util.ua.iDevice) { + WS.prototype.send = function (data) { + var self = this; + setTimeout(function() { + self.websocket.send(data); + },0); + return this; + }; + } else { + WS.prototype.send = function (data) { + this.websocket.send(data); + return this; + }; + } + + /** + * Payload + * + * @api private + */ + + WS.prototype.payload = function (arr) { + for (var i = 0, l = arr.length; i < l; i++) { + this.packet(arr[i]); + } + return this; + }; + + /** + * Disconnect the established `WebSocket` connection. + * + * @returns {Transport} + * @api public + */ + + WS.prototype.close = function () { + this.websocket.close(); + return this; + }; + + /** + * Handle the errors that `WebSocket` might be giving when we + * are attempting to connect or send messages. + * + * @param {Error} e The error. + * @api private + */ + + WS.prototype.onError = function (e) { + this.socket.onError(e); + }; + + /** + * Returns the appropriate scheme for the URI generation. + * + * @api private + */ + WS.prototype.scheme = function () { + return this.socket.options.secure ? 'wss' : 'ws'; + }; + + /** + * Checks if the browser has support for native `WebSockets` and that + * it's not the polyfill created for the FlashSocket transport. + * + * @return {Boolean} + * @api public + */ + + WS.check = function () { + return ('WebSocket' in global && !('__addTask' in WebSocket)) + || 'MozWebSocket' in global; + }; + + /** + * Check if the `WebSocket` transport support cross domain communications. + * + * @returns {Boolean} + * @api public + */ + + WS.xdomainCheck = function () { + return true; + }; + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('websocket'); + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.flashsocket = Flashsocket; + + /** + * The FlashSocket transport. This is a API wrapper for the HTML5 WebSocket + * specification. It uses a .swf file to communicate with the server. If you want + * to serve the .swf file from a other server than where the Socket.IO script is + * coming from you need to use the insecure version of the .swf. More information + * about this can be found on the github page. + * + * @constructor + * @extends {io.Transport.websocket} + * @api public + */ + + function Flashsocket () { + io.Transport.websocket.apply(this, arguments); + }; + + /** + * Inherits from Transport. + */ + + io.util.inherit(Flashsocket, io.Transport.websocket); + + /** + * Transport name + * + * @api public + */ + + Flashsocket.prototype.name = 'flashsocket'; + + /** + * Disconnect the established `FlashSocket` connection. This is done by adding a + * new task to the FlashSocket. The rest will be handled off by the `WebSocket` + * transport. + * + * @returns {Transport} + * @api public + */ + + Flashsocket.prototype.open = function () { + var self = this + , args = arguments; + + WebSocket.__addTask(function () { + io.Transport.websocket.prototype.open.apply(self, args); + }); + return this; + }; + + /** + * Sends a message to the Socket.IO server. This is done by adding a new + * task to the FlashSocket. The rest will be handled off by the `WebSocket` + * transport. + * + * @returns {Transport} + * @api public + */ + + Flashsocket.prototype.send = function () { + var self = this, args = arguments; + WebSocket.__addTask(function () { + io.Transport.websocket.prototype.send.apply(self, args); + }); + return this; + }; + + /** + * Disconnects the established `FlashSocket` connection. + * + * @returns {Transport} + * @api public + */ + + Flashsocket.prototype.close = function () { + WebSocket.__tasks.length = 0; + io.Transport.websocket.prototype.close.call(this); + return this; + }; + + /** + * The WebSocket fall back needs to append the flash container to the body + * element, so we need to make sure we have access to it. Or defer the call + * until we are sure there is a body element. + * + * @param {Socket} socket The socket instance that needs a transport + * @param {Function} fn The callback + * @api private + */ + + Flashsocket.prototype.ready = function (socket, fn) { + function init () { + var options = socket.options + , port = options['flash policy port'] + , path = [ + 'http' + (options.secure ? 's' : '') + ':/' + , options.host + ':' + options.port + , options.resource + , 'static/flashsocket' + , 'WebSocketMain' + (socket.isXDomain() ? 'Insecure' : '') + '.swf' + ]; + + // Only start downloading the swf file when the checked that this browser + // actually supports it + if (!Flashsocket.loaded) { + if (typeof WEB_SOCKET_SWF_LOCATION === 'undefined') { + // Set the correct file based on the XDomain settings + WEB_SOCKET_SWF_LOCATION = path.join('/'); + } + + if (port !== 843) { + WebSocket.loadFlashPolicyFile('xmlsocket://' + options.host + ':' + port); + } + + WebSocket.__initialize(); + Flashsocket.loaded = true; + } + + fn.call(self); + } + + var self = this; + if (document.body) return init(); + + io.util.load(init); + }; + + /** + * Check if the FlashSocket transport is supported as it requires that the Adobe + * Flash Player plug-in version `10.0.0` or greater is installed. And also check if + * the polyfill is correctly loaded. + * + * @returns {Boolean} + * @api public + */ + + Flashsocket.check = function () { + if ( + typeof WebSocket == 'undefined' + || !('__initialize' in WebSocket) || !swfobject + ) return false; + + return swfobject.getFlashPlayerVersion().major >= 10; + }; + + /** + * Check if the FlashSocket transport can be used as cross domain / cross origin + * transport. Because we can't see which type (secure or insecure) of .swf is used + * we will just return true. + * + * @returns {Boolean} + * @api public + */ + + Flashsocket.xdomainCheck = function () { + return true; + }; + + /** + * Disable AUTO_INITIALIZATION + */ + + if (typeof window != 'undefined') { + WEB_SOCKET_DISABLE_AUTO_INITIALIZATION = true; + } + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('flashsocket'); +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); +/* SWFObject v2.2 + is released under the MIT License +*/ +if ('undefined' != typeof window) { +var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O[(['Active'].concat('Object').join('X'))]!=D){try{var ad=new window[(['Active'].concat('Object').join('X'))](W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y0){for(var af=0;af0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad'}}aa.outerHTML='"+af+"";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab +// License: New BSD License +// Reference: http://dev.w3.org/html5/websockets/ +// Reference: http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol + +(function() { + + if ('undefined' == typeof window || window.WebSocket) return; + + var console = window.console; + if (!console || !console.log || !console.error) { + console = {log: function(){ }, error: function(){ }}; + } + + if (!swfobject.hasFlashPlayerVersion("10.0.0")) { + console.error("Flash Player >= 10.0.0 is required."); + return; + } + if (location.protocol == "file:") { + console.error( + "WARNING: web-socket-js doesn't work in file:///... URL " + + "unless you set Flash Security Settings properly. " + + "Open the page via Web server i.e. http://..."); + } + + /** + * This class represents a faux web socket. + * @param {string} url + * @param {array or string} protocols + * @param {string} proxyHost + * @param {int} proxyPort + * @param {string} headers + */ + WebSocket = function(url, protocols, proxyHost, proxyPort, headers) { + var self = this; + self.__id = WebSocket.__nextId++; + WebSocket.__instances[self.__id] = self; + self.readyState = WebSocket.CONNECTING; + self.bufferedAmount = 0; + self.__events = {}; + if (!protocols) { + protocols = []; + } else if (typeof protocols == "string") { + protocols = [protocols]; + } + // Uses setTimeout() to make sure __createFlash() runs after the caller sets ws.onopen etc. + // Otherwise, when onopen fires immediately, onopen is called before it is set. + setTimeout(function() { + WebSocket.__addTask(function() { + WebSocket.__flash.create( + self.__id, url, protocols, proxyHost || null, proxyPort || 0, headers || null); + }); + }, 0); + }; + + /** + * Send data to the web socket. + * @param {string} data The data to send to the socket. + * @return {boolean} True for success, false for failure. + */ + WebSocket.prototype.send = function(data) { + if (this.readyState == WebSocket.CONNECTING) { + throw "INVALID_STATE_ERR: Web Socket connection has not been established"; + } + // We use encodeURIComponent() here, because FABridge doesn't work if + // the argument includes some characters. We don't use escape() here + // because of this: + // https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Functions#escape_and_unescape_Functions + // But it looks decodeURIComponent(encodeURIComponent(s)) doesn't + // preserve all Unicode characters either e.g. "\uffff" in Firefox. + // Note by wtritch: Hopefully this will not be necessary using ExternalInterface. Will require + // additional testing. + var result = WebSocket.__flash.send(this.__id, encodeURIComponent(data)); + if (result < 0) { // success + return true; + } else { + this.bufferedAmount += result; + return false; + } + }; + + /** + * Close this web socket gracefully. + */ + WebSocket.prototype.close = function() { + if (this.readyState == WebSocket.CLOSED || this.readyState == WebSocket.CLOSING) { + return; + } + this.readyState = WebSocket.CLOSING; + WebSocket.__flash.close(this.__id); + }; + + /** + * Implementation of {@link DOM 2 EventTarget Interface} + * + * @param {string} type + * @param {function} listener + * @param {boolean} useCapture + * @return void + */ + WebSocket.prototype.addEventListener = function(type, listener, useCapture) { + if (!(type in this.__events)) { + this.__events[type] = []; + } + this.__events[type].push(listener); + }; + + /** + * Implementation of {@link DOM 2 EventTarget Interface} + * + * @param {string} type + * @param {function} listener + * @param {boolean} useCapture + * @return void + */ + WebSocket.prototype.removeEventListener = function(type, listener, useCapture) { + if (!(type in this.__events)) return; + var events = this.__events[type]; + for (var i = events.length - 1; i >= 0; --i) { + if (events[i] === listener) { + events.splice(i, 1); + break; + } + } + }; + + /** + * Implementation of {@link DOM 2 EventTarget Interface} + * + * @param {Event} event + * @return void + */ + WebSocket.prototype.dispatchEvent = function(event) { + var events = this.__events[event.type] || []; + for (var i = 0; i < events.length; ++i) { + events[i](event); + } + var handler = this["on" + event.type]; + if (handler) handler(event); + }; + + /** + * Handles an event from Flash. + * @param {Object} flashEvent + */ + WebSocket.prototype.__handleEvent = function(flashEvent) { + if ("readyState" in flashEvent) { + this.readyState = flashEvent.readyState; + } + if ("protocol" in flashEvent) { + this.protocol = flashEvent.protocol; + } + + var jsEvent; + if (flashEvent.type == "open" || flashEvent.type == "error") { + jsEvent = this.__createSimpleEvent(flashEvent.type); + } else if (flashEvent.type == "close") { + // TODO implement jsEvent.wasClean + jsEvent = this.__createSimpleEvent("close"); + } else if (flashEvent.type == "message") { + var data = decodeURIComponent(flashEvent.message); + jsEvent = this.__createMessageEvent("message", data); + } else { + throw "unknown event type: " + flashEvent.type; + } + + this.dispatchEvent(jsEvent); + }; + + WebSocket.prototype.__createSimpleEvent = function(type) { + if (document.createEvent && window.Event) { + var event = document.createEvent("Event"); + event.initEvent(type, false, false); + return event; + } else { + return {type: type, bubbles: false, cancelable: false}; + } + }; + + WebSocket.prototype.__createMessageEvent = function(type, data) { + if (document.createEvent && window.MessageEvent && !window.opera) { + var event = document.createEvent("MessageEvent"); + event.initMessageEvent("message", false, false, data, null, null, window, null); + return event; + } else { + // IE and Opera, the latter one truncates the data parameter after any 0x00 bytes. + return {type: type, data: data, bubbles: false, cancelable: false}; + } + }; + + /** + * Define the WebSocket readyState enumeration. + */ + WebSocket.CONNECTING = 0; + WebSocket.OPEN = 1; + WebSocket.CLOSING = 2; + WebSocket.CLOSED = 3; + + WebSocket.__flash = null; + WebSocket.__instances = {}; + WebSocket.__tasks = []; + WebSocket.__nextId = 0; + + /** + * Load a new flash security policy file. + * @param {string} url + */ + WebSocket.loadFlashPolicyFile = function(url){ + WebSocket.__addTask(function() { + WebSocket.__flash.loadManualPolicyFile(url); + }); + }; + + /** + * Loads WebSocketMain.swf and creates WebSocketMain object in Flash. + */ + WebSocket.__initialize = function() { + if (WebSocket.__flash) return; + + if (WebSocket.__swfLocation) { + // For backword compatibility. + window.WEB_SOCKET_SWF_LOCATION = WebSocket.__swfLocation; + } + if (!window.WEB_SOCKET_SWF_LOCATION) { + console.error("[WebSocket] set WEB_SOCKET_SWF_LOCATION to location of WebSocketMain.swf"); + return; + } + var container = document.createElement("div"); + container.id = "webSocketContainer"; + // Hides Flash box. We cannot use display: none or visibility: hidden because it prevents + // Flash from loading at least in IE. So we move it out of the screen at (-100, -100). + // But this even doesn't work with Flash Lite (e.g. in Droid Incredible). So with Flash + // Lite, we put it at (0, 0). This shows 1x1 box visible at left-top corner but this is + // the best we can do as far as we know now. + container.style.position = "absolute"; + if (WebSocket.__isFlashLite()) { + container.style.left = "0px"; + container.style.top = "0px"; + } else { + container.style.left = "-100px"; + container.style.top = "-100px"; + } + var holder = document.createElement("div"); + holder.id = "webSocketFlash"; + container.appendChild(holder); + document.body.appendChild(container); + // See this article for hasPriority: + // http://help.adobe.com/en_US/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-7ffd.html + swfobject.embedSWF( + WEB_SOCKET_SWF_LOCATION, + "webSocketFlash", + "1" /* width */, + "1" /* height */, + "10.0.0" /* SWF version */, + null, + null, + {hasPriority: true, swliveconnect : true, allowScriptAccess: "always"}, + null, + function(e) { + if (!e.success) { + console.error("[WebSocket] swfobject.embedSWF failed"); + } + }); + }; + + /** + * Called by Flash to notify JS that it's fully loaded and ready + * for communication. + */ + WebSocket.__onFlashInitialized = function() { + // We need to set a timeout here to avoid round-trip calls + // to flash during the initialization process. + setTimeout(function() { + WebSocket.__flash = document.getElementById("webSocketFlash"); + WebSocket.__flash.setCallerUrl(location.href); + WebSocket.__flash.setDebug(!!window.WEB_SOCKET_DEBUG); + for (var i = 0; i < WebSocket.__tasks.length; ++i) { + WebSocket.__tasks[i](); + } + WebSocket.__tasks = []; + }, 0); + }; + + /** + * Called by Flash to notify WebSockets events are fired. + */ + WebSocket.__onFlashEvent = function() { + setTimeout(function() { + try { + // Gets events using receiveEvents() instead of getting it from event object + // of Flash event. This is to make sure to keep message order. + // It seems sometimes Flash events don't arrive in the same order as they are sent. + var events = WebSocket.__flash.receiveEvents(); + for (var i = 0; i < events.length; ++i) { + WebSocket.__instances[events[i].webSocketId].__handleEvent(events[i]); + } + } catch (e) { + console.error(e); + } + }, 0); + return true; + }; + + // Called by Flash. + WebSocket.__log = function(message) { + console.log(decodeURIComponent(message)); + }; + + // Called by Flash. + WebSocket.__error = function(message) { + console.error(decodeURIComponent(message)); + }; + + WebSocket.__addTask = function(task) { + if (WebSocket.__flash) { + task(); + } else { + WebSocket.__tasks.push(task); + } + }; + + /** + * Test if the browser is running flash lite. + * @return {boolean} True if flash lite is running, false otherwise. + */ + WebSocket.__isFlashLite = function() { + if (!window.navigator || !window.navigator.mimeTypes) { + return false; + } + var mimeType = window.navigator.mimeTypes["application/x-shockwave-flash"]; + if (!mimeType || !mimeType.enabledPlugin || !mimeType.enabledPlugin.filename) { + return false; + } + return mimeType.enabledPlugin.filename.match(/flashlite/i) ? true : false; + }; + + if (!window.WEB_SOCKET_DISABLE_AUTO_INITIALIZATION) { + if (window.addEventListener) { + window.addEventListener("load", function(){ + WebSocket.__initialize(); + }, false); + } else { + window.attachEvent("onload", function(){ + WebSocket.__initialize(); + }); + } + } + +})(); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + * + * @api public + */ + + exports.XHR = XHR; + + /** + * XHR constructor + * + * @costructor + * @api public + */ + + function XHR (socket) { + if (!socket) return; + + io.Transport.apply(this, arguments); + this.sendBuffer = []; + }; + + /** + * Inherits from Transport. + */ + + io.util.inherit(XHR, io.Transport); + + /** + * Establish a connection + * + * @returns {Transport} + * @api public + */ + + XHR.prototype.open = function () { + this.socket.setBuffer(false); + this.onOpen(); + this.get(); + + // we need to make sure the request succeeds since we have no indication + // whether the request opened or not until it succeeded. + this.setCloseTimeout(); + + return this; + }; + + /** + * Check if we need to send data to the Socket.IO server, if we have data in our + * buffer we encode it and forward it to the `post` method. + * + * @api private + */ + + XHR.prototype.payload = function (payload) { + var msgs = []; + + for (var i = 0, l = payload.length; i < l; i++) { + msgs.push(io.parser.encodePacket(payload[i])); + } + + this.send(io.parser.encodePayload(msgs)); + }; + + /** + * Send data to the Socket.IO server. + * + * @param data The message + * @returns {Transport} + * @api public + */ + + XHR.prototype.send = function (data) { + this.post(data); + return this; + }; + + /** + * Posts a encoded message to the Socket.IO server. + * + * @param {String} data A encoded message. + * @api private + */ + + function empty () { }; + + XHR.prototype.post = function (data) { + var self = this; + this.socket.setBuffer(true); + + function stateChange () { + if (this.readyState == 4) { + this.onreadystatechange = empty; + self.posting = false; + + if (this.status == 200){ + self.socket.setBuffer(false); + } else { + self.onClose(); + } + } + } + + function onload () { + this.onload = empty; + self.socket.setBuffer(false); + }; + + this.sendXHR = this.request('POST'); + + if (global.XDomainRequest && this.sendXHR instanceof XDomainRequest) { + this.sendXHR.onload = this.sendXHR.onerror = onload; + } else { + this.sendXHR.onreadystatechange = stateChange; + } + + this.sendXHR.send(data); + }; + + /** + * Disconnects the established `XHR` connection. + * + * @returns {Transport} + * @api public + */ + + XHR.prototype.close = function () { + this.onClose(); + return this; + }; + + /** + * Generates a configured XHR request + * + * @param {String} url The url that needs to be requested. + * @param {String} method The method the request should use. + * @returns {XMLHttpRequest} + * @api private + */ + + XHR.prototype.request = function (method) { + var req = io.util.request(this.socket.isXDomain()) + , query = io.util.query(this.socket.options.query, 't=' + +new Date); + + req.open(method || 'GET', this.prepareUrl() + query, true); + + if (method == 'POST') { + try { + if (req.setRequestHeader) { + req.setRequestHeader('Content-type', 'text/plain;charset=UTF-8'); + } else { + // XDomainRequest + req.contentType = 'text/plain'; + } + } catch (e) {} + } + + return req; + }; + + /** + * Returns the scheme to use for the transport URLs. + * + * @api private + */ + + XHR.prototype.scheme = function () { + return this.socket.options.secure ? 'https' : 'http'; + }; + + /** + * Check if the XHR transports are supported + * + * @param {Boolean} xdomain Check if we support cross domain requests. + * @returns {Boolean} + * @api public + */ + + XHR.check = function (socket, xdomain) { + try { + var request = io.util.request(xdomain), + usesXDomReq = (global.XDomainRequest && request instanceof XDomainRequest), + socketProtocol = (socket && socket.options && socket.options.secure ? 'https:' : 'http:'), + isXProtocol = (global.location && socketProtocol != global.location.protocol); + if (request && !(usesXDomReq && isXProtocol)) { + return true; + } + } catch(e) {} + + return false; + }; + + /** + * Check if the XHR transport supports cross domain requests. + * + * @returns {Boolean} + * @api public + */ + + XHR.xdomainCheck = function (socket) { + return XHR.check(socket, true); + }; + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.htmlfile = HTMLFile; + + /** + * The HTMLFile transport creates a `forever iframe` based transport + * for Internet Explorer. Regular forever iframe implementations will + * continuously trigger the browsers buzy indicators. If the forever iframe + * is created inside a `htmlfile` these indicators will not be trigged. + * + * @constructor + * @extends {io.Transport.XHR} + * @api public + */ + + function HTMLFile (socket) { + io.Transport.XHR.apply(this, arguments); + }; + + /** + * Inherits from XHR transport. + */ + + io.util.inherit(HTMLFile, io.Transport.XHR); + + /** + * Transport name + * + * @api public + */ + + HTMLFile.prototype.name = 'htmlfile'; + + /** + * Creates a new Ac...eX `htmlfile` with a forever loading iframe + * that can be used to listen to messages. Inside the generated + * `htmlfile` a reference will be made to the HTMLFile transport. + * + * @api private + */ + + HTMLFile.prototype.get = function () { + this.doc = new window[(['Active'].concat('Object').join('X'))]('htmlfile'); + this.doc.open(); + this.doc.write(''); + this.doc.close(); + this.doc.parentWindow.s = this; + + var iframeC = this.doc.createElement('div'); + iframeC.className = 'socketio'; + + this.doc.body.appendChild(iframeC); + this.iframe = this.doc.createElement('iframe'); + + iframeC.appendChild(this.iframe); + + var self = this + , query = io.util.query(this.socket.options.query, 't='+ +new Date); + + this.iframe.src = this.prepareUrl() + query; + + io.util.on(window, 'unload', function () { + self.destroy(); + }); + }; + + /** + * The Socket.IO server will write script tags inside the forever + * iframe, this function will be used as callback for the incoming + * information. + * + * @param {String} data The message + * @param {document} doc Reference to the context + * @api private + */ + + HTMLFile.prototype._ = function (data, doc) { + // unescape all forward slashes. see GH-1251 + data = data.replace(/\\\//g, '/'); + this.onData(data); + try { + var script = doc.getElementsByTagName('script')[0]; + script.parentNode.removeChild(script); + } catch (e) { } + }; + + /** + * Destroy the established connection, iframe and `htmlfile`. + * And calls the `CollectGarbage` function of Internet Explorer + * to release the memory. + * + * @api private + */ + + HTMLFile.prototype.destroy = function () { + if (this.iframe){ + try { + this.iframe.src = 'about:blank'; + } catch(e){} + + this.doc = null; + this.iframe.parentNode.removeChild(this.iframe); + this.iframe = null; + + CollectGarbage(); + } + }; + + /** + * Disconnects the established connection. + * + * @returns {Transport} Chaining. + * @api public + */ + + HTMLFile.prototype.close = function () { + this.destroy(); + return io.Transport.XHR.prototype.close.call(this); + }; + + /** + * Checks if the browser supports this transport. The browser + * must have an `Ac...eXObject` implementation. + * + * @return {Boolean} + * @api public + */ + + HTMLFile.check = function (socket) { + if (typeof window != "undefined" && (['Active'].concat('Object').join('X')) in window){ + try { + var a = new window[(['Active'].concat('Object').join('X'))]('htmlfile'); + return a && io.Transport.XHR.check(socket); + } catch(e){} + } + return false; + }; + + /** + * Check if cross domain requests are supported. + * + * @returns {Boolean} + * @api public + */ + + HTMLFile.xdomainCheck = function () { + // we can probably do handling for sub-domains, we should + // test that it's cross domain but a subdomain here + return false; + }; + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('htmlfile'); + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + */ + + exports['xhr-polling'] = XHRPolling; + + /** + * The XHR-polling transport uses long polling XHR requests to create a + * "persistent" connection with the server. + * + * @constructor + * @api public + */ + + function XHRPolling () { + io.Transport.XHR.apply(this, arguments); + }; + + /** + * Inherits from XHR transport. + */ + + io.util.inherit(XHRPolling, io.Transport.XHR); + + /** + * Merge the properties from XHR transport + */ + + io.util.merge(XHRPolling, io.Transport.XHR); + + /** + * Transport name + * + * @api public + */ + + XHRPolling.prototype.name = 'xhr-polling'; + + /** + * Indicates whether heartbeats is enabled for this transport + * + * @api private + */ + + XHRPolling.prototype.heartbeats = function () { + return false; + }; + + /** + * Establish a connection, for iPhone and Android this will be done once the page + * is loaded. + * + * @returns {Transport} Chaining. + * @api public + */ + + XHRPolling.prototype.open = function () { + var self = this; + + io.Transport.XHR.prototype.open.call(self); + return false; + }; + + /** + * Starts a XHR request to wait for incoming messages. + * + * @api private + */ + + function empty () {}; + + XHRPolling.prototype.get = function () { + if (!this.isOpen) return; + + var self = this; + + function stateChange () { + if (this.readyState == 4) { + this.onreadystatechange = empty; + + if (this.status == 200) { + self.onData(this.responseText); + self.get(); + } else { + self.onClose(); + } + } + }; + + function onload () { + this.onload = empty; + this.onerror = empty; + self.retryCounter = 1; + self.onData(this.responseText); + self.get(); + }; + + function onerror () { + self.retryCounter ++; + if(!self.retryCounter || self.retryCounter > 3) { + self.onClose(); + } else { + self.get(); + } + }; + + this.xhr = this.request(); + + if (global.XDomainRequest && this.xhr instanceof XDomainRequest) { + this.xhr.onload = onload; + this.xhr.onerror = onerror; + } else { + this.xhr.onreadystatechange = stateChange; + } + + this.xhr.send(null); + }; + + /** + * Handle the unclean close behavior. + * + * @api private + */ + + XHRPolling.prototype.onClose = function () { + io.Transport.XHR.prototype.onClose.call(this); + + if (this.xhr) { + this.xhr.onreadystatechange = this.xhr.onload = this.xhr.onerror = empty; + try { + this.xhr.abort(); + } catch(e){} + this.xhr = null; + } + }; + + /** + * Webkit based browsers show a infinit spinner when you start a XHR request + * before the browsers onload event is called so we need to defer opening of + * the transport until the onload event is called. Wrapping the cb in our + * defer method solve this. + * + * @param {Socket} socket The socket instance that needs a transport + * @param {Function} fn The callback + * @api private + */ + + XHRPolling.prototype.ready = function (socket, fn) { + var self = this; + + io.util.defer(function () { + fn.call(self); + }); + }; + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('xhr-polling'); + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost + * MIT Licensed + */ + +(function (exports, io, global) { + /** + * There is a way to hide the loading indicator in Firefox. If you create and + * remove a iframe it will stop showing the current loading indicator. + * Unfortunately we can't feature detect that and UA sniffing is evil. + * + * @api private + */ + + var indicator = global.document && "MozAppearance" in + global.document.documentElement.style; + + /** + * Expose constructor. + */ + + exports['jsonp-polling'] = JSONPPolling; + + /** + * The JSONP transport creates an persistent connection by dynamically + * inserting a script tag in the page. This script tag will receive the + * information of the Socket.IO server. When new information is received + * it creates a new script tag for the new data stream. + * + * @constructor + * @extends {io.Transport.xhr-polling} + * @api public + */ + + function JSONPPolling (socket) { + io.Transport['xhr-polling'].apply(this, arguments); + + this.index = io.j.length; + + var self = this; + + io.j.push(function (msg) { + self._(msg); + }); + }; + + /** + * Inherits from XHR polling transport. + */ + + io.util.inherit(JSONPPolling, io.Transport['xhr-polling']); + + /** + * Transport name + * + * @api public + */ + + JSONPPolling.prototype.name = 'jsonp-polling'; + + /** + * Posts a encoded message to the Socket.IO server using an iframe. + * The iframe is used because script tags can create POST based requests. + * The iframe is positioned outside of the view so the user does not + * notice it's existence. + * + * @param {String} data A encoded message. + * @api private + */ + + JSONPPolling.prototype.post = function (data) { + var self = this + , query = io.util.query( + this.socket.options.query + , 't='+ (+new Date) + '&i=' + this.index + ); + + if (!this.form) { + var form = document.createElement('form') + , area = document.createElement('textarea') + , id = this.iframeId = 'socketio_iframe_' + this.index + , iframe; + + form.className = 'socketio'; + form.style.position = 'absolute'; + form.style.top = '0px'; + form.style.left = '0px'; + form.style.display = 'none'; + form.target = id; + form.method = 'POST'; + form.setAttribute('accept-charset', 'utf-8'); + area.name = 'd'; + form.appendChild(area); + document.body.appendChild(form); + + this.form = form; + this.area = area; + } + + this.form.action = this.prepareUrl() + query; + + function complete () { + initIframe(); + self.socket.setBuffer(false); + }; + + function initIframe () { + if (self.iframe) { + self.form.removeChild(self.iframe); + } + + try { + // ie6 dynamic iframes with target="" support (thanks Chris Lambacher) + iframe = document.createElement('') + storageContainer.close() + storageOwner = storageContainer.w.frames[0].document + storage = storageOwner.createElement('div') + } catch(e) { + // somehow ActiveXObject instantiation failed (perhaps some special + // security settings or otherwse), fall back to per-path storage + storage = doc.createElement('div') + storageOwner = doc.body + } + function withIEStorage(storeFunction) { + return function() { + var args = Array.prototype.slice.call(arguments, 0) + args.unshift(storage) + // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx + // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx + storageOwner.appendChild(storage) + storage.addBehavior('#default#userData') + storage.load(localStorageName) + var result = storeFunction.apply(store, args) + storageOwner.removeChild(storage) + return result + } + } + + // In IE7, keys may not contain special chars. See all of https://github.com/marcuswestin/store.js/issues/40 + var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g") + function ieKeyFix(key) { + return key.replace(forbiddenCharsRegex, '___') + } + store.set = withIEStorage(function(storage, key, val) { + key = ieKeyFix(key) + if (val === undefined) { return store.remove(key) } + storage.setAttribute(key, store.serialize(val)) + storage.save(localStorageName) + return val + }) + store.get = withIEStorage(function(storage, key) { + key = ieKeyFix(key) + return store.deserialize(storage.getAttribute(key)) + }) + store.remove = withIEStorage(function(storage, key) { + key = ieKeyFix(key) + storage.removeAttribute(key) + storage.save(localStorageName) + }) + store.clear = withIEStorage(function(storage) { + var attributes = storage.XMLDocument.documentElement.attributes + storage.load(localStorageName) + for (var i=0, attr; attr=attributes[i]; i++) { + storage.removeAttribute(attr.name) + } + storage.save(localStorageName) + }) + store.getAll = withIEStorage(function(storage) { + var attributes = storage.XMLDocument.documentElement.attributes + var ret = {} + for (var i=0, attr; attr=attributes[i]; ++i) { + var key = ieKeyFix(attr.name) + ret[attr.name] = store.deserialize(storage.getAttribute(key)) + } + return ret + }) + } + + try { + store.set(namespace, namespace) + if (store.get(namespace) != namespace) { store.disabled = true } + store.remove(namespace) + } catch(e) { + store.disabled = true + } + store.enabled = !store.disabled + if (typeof module != 'undefined' && module.exports) { module.exports = store } + else if (typeof define === 'function' && define.amd) { define("store", store) } + else { win.store = store } +})(this.window || global); + +/* @source mod/user_following.js */; + +define('store', 'lib/store.js'); +define('mod/user_following', [ + "jquery", + "store" +], function($, store) { + var API_USER_FOLLOWING_PATH = "/api/user/following" + var USER_FOLLOWING_KEY = "user-following"; + var USER_FOLLOWING_UPDATE_KEY= "date:user-following" + var ONE_DAY_IN_SECONDS = 60*60*24; + + var update = function() { + var currentTime = new Date().getTime(); + var lastTime = store.get(USER_FOLLOWING_UPDATE_KEY); + if (lastTime && (currentTime - lastTime) < ONE_DAY_IN_SECONDS ) { + return; + } + + $.ajax( + API_USER_FOLLOWING_PATH + ).done(function(users){ + var following = $.map(users, function(item){ + return item["username"]; + }); + store.set(USER_FOLLOWING_KEY, following); + store.set(USER_FOLLOWING_UPDATE_KEY, currentTime); + }).fail(function(jqxhr, textStatus, error){ + return; + }); + } + + return { + update: update, + val: function(){ + return store.get(USER_FOLLOWING_KEY) || []; + } + }; + +}); + +/* @source mod/input-ext.js */; + +define('mousetrap', 'lib/mousetrap.js'); + +define("mod/input-ext", + [ + "jquery", + "mod/user_following", + "jquery-caret", + "jquery-atwho", + "mousetrap", + "lib/zen-form" +], + function ($, userFollowing) { + var inputExt = {}; + var emojis = [ + 'airplane', 'alien', 'art', 'bear', 'beer', 'bike', 'bomb', 'book', + 'bulb', 'bus', 'cake', 'calling', 'clap', 'cocktail', 'code', 'computer', + 'cool', 'cop', 'email', 'feet', 'fire', 'fish', 'fist', 'gift', 'hammer', + 'heart', 'iphone', 'key', 'leaves', 'lgtm', 'lipstick', 'lock', 'mag', 'mega', + 'memo', 'moneybag', 'new', 'octocat', 'ok', 'palm_tree', 'pencil', 'punch', + 'runner', 'scissors', 'ship', 'shipit', 'ski', 'smile', 'smoking', 'sparkles', + 'star', 'sunny', 'taxi', 'thumbsdown', 'thumbsup', 'tm', 'tophat', 'train', + 'trollface', 'v', 'vs', 'warning', 'wheelchair', 'zap', 'zzz', 'see_no_evil', + 'hear_no_evil', 'speak_no_evil', 'monkey', 'monkey_face', 'manybeers', 'beers', + 'hhkb', 'ruby' + ], emoji_list = $.map(emojis, function(value, i) {return {key: value + ':', name:value};}); + inputExt.enableEmojiInput = function (el) { + el.atwho('(?:^|\\s):', + {data:emoji_list, limit:7, + tpl:'
  • ${name}
  • '}); + return el; + }; + + inputExt.enableAutoCompleteFollowingAndTeam = function (el) { + var teams = JSON.parse($('#all-teams').val() || '[]'); + var users = teams.concat(userFollowing.val()); + + $(el).atwho("@", { + data: users, + limit: 7 + }); + }; + + // 输入#自动提示pr信息 + inputExt.enablePullsInput = function (el) { + var projectName = el.attr('data-project-name'); + if (!projectName) return el; + $.getJSON('/' + projectName + '/pulls/all_data', function (r) { + var pulls = $.map( + r, function(value, i) { + return {key: value.id, name:value.id + ' ' + value.title, title:value.title}; + }); + el.atwho('(?:^|\\s)#', + {data:pulls, limit:7, + tpl:'
  • #${key} ${title}
  • '}); + }); + return el; + }; + + inputExt.shortcut2submit = function (el) { + Mousetrap.bind( + ['command+enter', 'ctrl+enter'], + function (e) { + if (el && (e.srcElement || e.target) == $(el)[0] && !$(el).closest('form').hasClass('submitting')) { + e.preventDefault ? e.preventDefault() : (e.returnValue = false); + $(el).closest('form').addClass('submitting').submit(); + } + }, + 'keydown' + ); + }; + + // 进入全屏模式 + inputExt.enableZenMode = function (el) { + var trigger = '.go-zen'; + el = $(el); + el.zenForm({trigger:trigger, theme:'light'}).dblclick(function(e) { + if (!e.altKey) return; + $(this).zenForm({ trigger: null, theme: 'light' }); + fix(); + }); + + $(trigger).click(fix); + + function fix() { + var textarea = $('.zen-forms-input-wrap textarea'); + if (textarea) { + inputExt.enableEmojiInput(textarea); + textarea.attr({ + 'data-project-name': el.attr('data-project-name'), + 'placeholder': el.attr('placeholder') + }); + + inputExt.enablePullsInput(textarea); + + var participants = $('#participants').val(); + if (participants) { + participants = JSON.parse(participants); + textarea.atwho("@", {data:participants, limit:7}); + } + + // 因为zen-form设置的z-index非常高(99999)所以将at-view调更高 + $('#at-view').css('z-index', 100000); + } + } + }; + + var focusToEnd = function(els) { + return $(els).each(function() { + var v = $(this).val(); + $(this).focus().val("").val(v); + }); + }; + + inputExt.enableQuickQuotes = function (el) { + Mousetrap.bind( + ['r'], + function (e) { + var oldVal = $(el).val(), newVal, selVal = window.getSelection().toString(); + selVal = '> ' + selVal.split('\n').join('\n> '); + newVal = oldVal.concat((oldVal != '') ? '\n\n':'', selVal, '\n\n'); + $("html, body").animate({scrollTop: $(document).height()}, "slow"); + $(el).val(newVal); + focusToEnd(el); + }, + 'keyup' + ); + }; + + inputExt.enableFileUpload = function (uploader, textarea, is_image) { + uploader.submit( + function() { + $(this).ajaxSubmit({ + dataType: 'json', + type: 'POST', + delegation: true, + success: function(r) { + var oldText = textarea.val(), + newText = oldText + + (oldText.length == 0 ? '' : '\n') + + (is_image? '!' : '') + + '[' + r.origin_filename + '](' + r.url + ')'; + textarea.val(newText); + }, + error: function(r) { + alert("上传错误,请确认您上传的文件类型合法"); + } + }); + return false; + }); + + uploader.find('input').change(function () { + uploader.submit(); + }); + }; + + inputExt.enableImageUpload = function (uploader, textarea) { + inputExt.enableFileUpload(uploader,textarea, true); + }; + + inputExt.enableUpload = function(upload_widget,textarea){ + inputExt.enableImageUpload(upload_widget.find(".upload-image-form"),textarea); + inputExt.enableFileUpload(upload_widget.find(".upload-file-form"),textarea); + }; + + return inputExt; + } +); + +/* @source mod/diff.js */; + +define('mod/diff', [ + "jquery", + "mod/input-ext", + "mod/liveupdate", + "mod/colorcube" +], function ($, inputExt, live, colorcube) { + + //////////////////// linecomment + + // comment form + var hideCommentForm = function () { + $('.inline-comment-form').hide().closest('tr').removeClass('show-inline-comment-form'); + $('.inline-comment-form').each( + function (idx, el) { + if (!$(el).siblings('.comment-holder').children('.comment').length) { + $(el).parents('tr').hide(); + } + } + ); + }; + var openCommentForm = function (curRow) { + hideCommentForm(); + var nextRow = curRow.next('tr'); + // if no comments on curRow yet + if (!nextRow.length || !nextRow.hasClass('inline-comments')) { + nextRow = $.tmpl($('#templ-inline-comments-row'), {}).insertAfter(curRow); + } + // if side by side... plz refactor this + var file = curRow.parents('.file'); + if ((file.children('.side')).length != 0 && file.children('.side').css('display') != 'none') { + $(nextRow.children()[0]).attr('colspan', 1); + } + nextRow.show().addClass('show-inline-comment-form'); + var commentsBlock = nextRow.children('.line-comments'), + commentForm = commentsBlock.find('.inline-comment-form'); + // if no commentForm on nextRow yet + if (!commentForm.length) { + // get form-data + var patch_data = file.children('.meta').find('.patch-data'); + var line_data = curRow.find('.line-data'); + var data = { + from_sha: patch_data.attr('data-from-sha'), + old_path: patch_data.attr('data-old-path'), + new_path: patch_data.attr('data-new-path'), + from_oid: patch_data.attr('data-from-oid'), + to_oid: patch_data.attr('data-to-oid'), + old_no: line_data.attr('data-old'), + new_no: line_data.attr('data-new'), + }; + commentForm = $.tmpl($('#templ-inline-comment-form'), data).appendTo(commentsBlock); + commentForm.find('.js-hide-inline-comment-form').click( + function () { + hideCommentForm(); + } + ).end().find('form').submit( + function () { + $(this).find('button[type="submit"]').attr('disabled', true).addClass('disabled'); + return true; + } + ); + var commentTexarea = commentForm.find('textarea'); + inputExt.enableEmojiInput(commentTexarea); + inputExt.shortcut2submit(commentTexarea); + } + commentForm.show().find('textarea').focus(); + // codelive channel + var linecomment_channel_id; + if ($('.discussion-tab-link').length > 0) { + linecomment_channel_id = "code_pr_"+$('.discussion-tab-link').attr('data-url') + 'linecomment'; + } + // `comment on this line` + commentForm.find('form.js-inline-comment-form').ajaxForm({ + dataType: 'json', + beforeSend: function () { + commentForm.find('button[type="submit"]').attr('disabled', true).addClass('disabled') + .end().find('.loader').show(); + }, + success: function(r) { + if (r.r == 0 && r.html) { + commentForm.siblings('.js-comments-holder').append(r.html); + commentForm.find('textarea').val('').blur(); + hideCommentForm(); + live && linecomment_channel_id && + live.emit('ready', {channel: linecomment_channel_id, msg:r.html_with_diff}); + } else if (r.error){ + alert(r.error); + } + commentForm.find('button[type="submit"]').attr('disabled', false).removeClass('disabled'); + commentForm.find('form.js-inline-comment-form').removeClass('submitting') + .end().find('.loader').hide(); + return true; + }, + error: function () {} + }); + }; + + // add-bubble... + $('body').delegate('.add-bubble', 'click', function () { + var curRow = $(this).parents('tr'); + var nextRow = curRow.next('tr'); + if (nextRow.hasClass('inline-comments') && nextRow.css('display') != 'none') { + nextRow.hide(); + } else { + openCommentForm(curRow); + } + }); + + // `add a line note` + $('body').delegate( + '.js-show-inline-comment-form', 'click', function () { + var curRow = $(this).parents('tr').prev('tr'); + openCommentForm(curRow); + }); + + // linecomment delete + $('body').delegate('.inline-comments .delete-button', 'click', function (e) { + if (!confirm('Are you sure you want to delete this?')) { + return false; + } + var comment = $(this).parents('.comment'); + $.getJSON( + $(this).attr('href'), + function(r) { + // FIXME: global row? + if (r.r == '1') + var row = comment.parents('tr'); + if (comment.siblings('.comment').length || + row.find('.inline-comment-form').length) { + comment.remove(); + } else { + row.remove(); + } + } + ); + return false; + }); + + // comment & linecomment edit + $('body').delegate('.js-comment-edit-button', 'click', function (e) { + var form_content = $(this).parents('.comment-header') + .next('.comment-content') + .children('.form-content'); + if (form_content != undefined) { + form_content.show().find('textarea').focus(); + form_content.find('form.js-comment-update').ajaxForm({ + dataType: 'json', + beforeSend: function() { + form_content.find('button[type="submit"]').attr('disabled', true).addClass('disabled') + .end().find('.loader').show(); + }, + success: function(r) { + if (r.r == 0 && r.html) { + if (form_content.find('textarea').attr('name') === 'pull_request_review_comment'){ + form_content.parents('.js-comments-holder').append(r.html); + form_content.parents('.comment').remove(); + } else { + var comment = form_content.parents('.change'); + var avatar = comment.prev('.side-avatar'); + form_content.parents('#changelog').append(r.html); + comment.remove(); + avatar.remove(); + } + } + return true; + } + }); + } else { + return false; + } + }); + + // show linecomments toggle + $('body').delegate('.file .js-show-inline-comments-toggle', 'change', function () { + var comments = $(this).parents('.file').find('.inline-comments'); + if ($(this).is(':checked')) { + comments.show(); + } else { + comments.hide(); + } + }); + + // generated file toggle + $('body').delegate('.file a.generated', 'click', function() { + var file = $(this).parents('.file'); + var inline = file.children('.inline').show(); + $(this).hide(); + }); + + // patch side diff toggle + $('body').delegate('.file .js-side-diff', 'click', function () { + var file = $(this).parents('.file'); + file.find('a.generated').hide(); + if (file.children('.side').css('display') === 'none' && + file.children('.inline').css('display') === 'none'){ + file.children('.inline').show(); + }else { + var inline = file.children('.inline').toggle(); + var side = file.children('.side').toggle(); + var checkbox = file.find('.js-show-inline-comments-toggle'); + if (file.children('.side').css('display') != 'none') { + checkbox.attr('checked', false); + side.find('.inline-comments').hide(); + } + else { + checkbox.attr('checked', true); + } + } + }); + + // diff patch fullscreen toggle + $('body').delegate('.file .js-fullscreen', 'click', function () { + var fullscreenStage = $('#fullscreen-stage'); + if (fullscreenStage.length == 0) { + var files = $(this).parents('#files'); + fullscreenStage = $('
    ').appendTo(files); + } + if (fullscreenStage.is(":visible")) { + fullscreenStage.hide(); + $('body').removeClass('fullscreen-mode'); + } else { + var file = $(this).parents('.file'); + fullscreenStage.html(file.clone()).show(); + $('body').addClass('fullscreen-mode'); + fullscreenStage.find('.file .js-fullscreen').text('Exit Full Screen'); + } + }); + + // dblclick open linecomment form + var clearSelection = function () { + if (window.getSelection) { + if (window.getSelection().empty) { // Chrome + window.getSelection().empty(); + } else if (window.getSelection().removeAllRanges) { // Firefox + window.getSelection().removeAllRanges(); + } + } else if (document.selection) { // IE? + document.selection.empty(); + } + } + $('body').delegate('.js-open-comment-form.dblclick-comment', 'dblclick', function () { + clearSelection(); + var curRow = $(this).parents('tr'); + openCommentForm(curRow); + }); + + //////////////////// moreline get_contexts + + // moreline + $('body').delegate('pre.skipped a', 'click', function() { + var curRow = $(this).parents('tr'); + var patch_data = curRow.parents('.file').children('.meta').find('.patch-data'); + var data = curRow.find('.expand-data'); + var url = patch_data.attr('data-context-url'); + $.get( + url, + { + old_sha : patch_data.attr('data-old-sha'), + old_path : patch_data.attr('data-old-path'), + old_start : data.attr('data-old-start'), + new_start : data.attr('data-new-start'), + old_end : data.attr('data-old-end'), + new_end : data.attr('data-new-end'), + type : $(this).attr('data-type'), + }, + function (r) { + curRow.after(r.html); + if (r.html.trim()) { + curRow.remove(); + } + } + ); + }); + + // full diff + $('body').delegate('.ellipsis', 'click', function() { + var $this = $(this); + var fpath = $this.attr('data-path'); + var new_fpath = $this.attr('data-new-path'); + + // for pull/new + var from_proj = $('.new-pull-request form input[name="from_proj"]').attr('value'); + var from_ref = $('.new-pull-request form input[name="from_ref"]').attr('value'); + var to_ref = $('.new-pull-request form input[name="to_ref"]').attr('value'); + var to_proj = $('.new-pull-request form input[name="to_proj"]').attr('value'); + + var url = $this.attr('data-url'); + var table = $this.parents('.data').find('.diff-table'); + $.get(url, + { + filepath: fpath, + new_filepath: new_fpath, + from_proj: from_proj, + from_ref: from_ref, + to_ref: to_ref, + to_proj: to_proj + }, + function(r){ + table.find('tbody').html(r.html); + }); + }); + + // TODO: modify this, after refactor diff api + // toggle whitespace diff + $('body').delegate('.toggle_whitespace', 'click', function() { + var $this = $(this); + var fpath = $this.attr('data-path'); + var new_fpath = $this.attr('data-new-path'); + + // for pull/new + var from_proj = $('.new-pull-request form input[name="from_proj"]').attr('value'); + var from_ref = $('.new-pull-request form input[name="from_ref"]').attr('value'); + var to_ref = $('.new-pull-request form input[name="to_ref"]').attr('value'); + var to_proj = $('.new-pull-request form input[name="to_proj"]').attr('value'); + + var url = $this.attr('data-url'); + var table = $this.parents('.data').find('.diff-table'); + var whitespace = $this.attr('data-w'); + + $.get(url, + { + filepath: fpath, + new_filepath: new_fpath, + from_proj: from_proj, + from_ref: from_ref, + to_ref: to_ref, + to_proj: to_proj, + w: whitespace + }, + function(r){ + table.find('tbody').html(r.html); + $this.attr('data-w', (1 - parseInt(whitespace)).toString()); + }); + }); + + //////////////////// no use ?? + function convertDiff(name, table, pre) { + var inline = $(table).hasClass('inline'); + var ths = table.tHead.rows[0].cells; + var afile, bfile; + if ( inline ) { + afile = ths[0].title; + bfile = ths[1].title; + } else { + afile = $(ths[0]).find('a').text(); + bfile = $(ths[1]).find('a').text(); + } + if ( afile.match(/^Revision /) ) { + afile = 'a/' + name; + bfile = 'b/' + name; + } + var lines = [ + "Index: " + name, + "===================================================================", + "--- " + afile.replace(/File /, ''), + "+++ " + bfile.replace(/File /, ''), + ]; + var sepIndex = 0; + var oldOffset = 0, oldLength = 0, newOffset = 0, newLength = 0; + var title = ""; + if (inline) + title = $(ths[2]).text(); + for (var i = 0; i < table.tBodies.length; i++) { + var tBody = table.tBodies[i]; + if (i == 0 || tBody.className == "skipped") { + if (i > 0) { + if (!oldOffset && oldLength) oldOffset = 1 + if (!newOffset && newLength) newOffset = 1 + lines[sepIndex] = lines[sepIndex] + .replace("{1}", oldOffset).replace("{2}", oldLength) + .replace("{3}", newOffset).replace("{4}", newLength) + .replace("{5}", title); + } + sepIndex = lines.length; + lines.push("@@ -{1},{2} +{3},{4} @@{5}"); + oldOffset = 0, oldLength = 0, newOffset = 0, newLength = 0; + if (tBody.className == "skipped") { + if (inline) + title = $(tBody.rows[0].cells[2]).text(); + continue; + } + } + var tmpLines = []; + for (var j = 0; j < tBody.rows.length; j++) { + var cells = tBody.rows[j].cells; + var oldLineNo = parseInt($(cells[0]).text()); + var newLineNo = parseInt($(cells[inline ? 1 : 2]).text()); + if (tBody.className == 'unmod') { + lines.push(" " + $(cells[inline ? 2 : 1]).text()); + oldLength += 1; + newLength += 1; + if (!oldOffset) oldOffset = oldLineNo; + if (!newOffset) newOffset = newLineNo; + } else { + var oldLine; + var newLine; + var oldTag = "-"; + var newTag = "+"; + if (inline) { + oldLine = newLine = $(cells[2]).text(); + if ($('em', cells[2]).length) oldTag = newTag = "\\"; + } else { + oldLine = $(cells[1]).text(); + if ($('em', cells[1]).length) oldTag = "\\"; + newLine = $(cells[3]).text(); + if ($('em', cells[3]).length) newTag = "\\"; + } + if (!isNaN(oldLineNo)) { + lines.push(oldTag + oldLine); + oldLength += 1; + } + if (!isNaN(newLineNo)) { + tmpLines.push(newTag + newLine); + newLength += 1; + } + } + } + if (tmpLines.length > 0) { + lines = lines.concat(tmpLines); + } + } + if (!oldOffset && oldLength) oldOffset = 1; + if (!newOffset && newLength) newOffset = 1; + lines[sepIndex] = lines[sepIndex] + .replace("{1}", oldOffset).replace("{2}", oldLength) + .replace("{3}", newOffset).replace("{4}", newLength) + .replace("{5}", title); + /* remove trailing   and join lines (with CR for IExplorer) */ + var sep = $.browser.msie ? "\r" : "\n"; + for ( var i = 0; i < lines.length; i++ ) + if ( lines[i] ) + { + var line = lines[i].replace(/\xa0$/, '') + sep; + if ( lines[i][0] == '+' ) + pre.append($('').text(line)); + else if ( lines[i][0] == '-' ) + pre.append($('').text(line)); + else + pre.append($('').text(line)); + } + } + // no use ?? + $("div.diff h2").each(function() { + console.log('call div.diff h2 !!!'); + var switcher = $("").prependTo(this); + var name = $.trim($(this).text()); + var table = $(this).siblings("table").get(0); + if (! table) return; + var pre = $('
    ').hide().insertAfter(table);
    +          $("" + _("Tabular") + "").click(function() {
    +            $(pre).hide();
    +            $(table).show();
    +            $(this).addClass("active").siblings("span").removeClass("active");
    +            return false;
    +          }).addClass("active").appendTo(switcher);
    +          $("" + _("Unified") + "").click(function() {
    +            $(table).hide();
    +            if (!pre.get(0).firstChild) convertDiff(name, table, pre);
    +            $(pre).fadeIn("fast")
    +            $(this).addClass("active").siblings("span").removeClass("active");
    +            return false;
    +          }).appendTo(switcher);
    +        });
    +
    +
    +        colorcube.init({target:'body'});
    +});
    +
    +/* @source mod/zclip.js */;
    +
    +define('mod/zclip', [
    +  "jquery",
    +  "jquery-zclip"
    +], function($, _) {
    +  $(function () {
    +    $('input.git-url').focus(function(e) {
    +      var elem = this;
    +      setTimeout(function() {
    +        elem.select();
    +      }, 0);
    +    });
    +    $('.copy-git-url').zclip({
    +      path: '/static/js/lib/ZeroClipboard.swf',
    +      copy: function() {
    +        return $('.copy-git-url').attr('data-clipboard-text');
    +      },
    +      afterCopy: function() {}
    +    });
    +  });
    +});
    +
    +/* @source mod/compare.js */;
    +
    +define('mod/compare', [
    +  "jquery",
    +  "jquery-tmpl"
    +], function($){
    +
    +    var popup;
    +    var project_name = $('.history a').text();
    +    $('.compare-button').click(function (e) {
    +        var curRef = $(this).attr('data-ref'), allRef = [], curIdx = 0;
    +        $('.compare-button').each(function (i, el){
    +              var ref = $(el).attr('data-ref');
    +              allRef.push(ref);
    +              (ref == curRef) && (curIdx = i);
    +        });
    +        select_ref = allRef.slice(0, curIdx);
    +        e.preventDefault();
    +        var start_ref = $(this).attr('data-ref');
    +        if (!popup) {
    +            popup = $('
    ').appendTo('body'); + popup.delegate('.close', 'click', function () {popup.hide();}); + popup.delegate('#start-submit', 'click', function () { + var ref = popup.find('.ref-autocompleter').val(); + var link = ''; + location.href = link; + }) + .delegate('#end-submit', 'click', function () { + var ref = popup.find('.ref-autocompleter').val(); + if (ref == "" || ref == undefined || ref != null ||!ref.match('/^[0-9a-bA-B]+$/')){ + var link = '/' + project_name + '/compare/'+start_ref+'...'+ref; + location.href = link; + } else { + popup.remove(); + alert('wrong revision'); + } + }); + } + var data = {}; + if ($(this).hasClass('from')) { + data.mode = 'start'; + } else { + data.mode = 'end'; + } + data.rev = $($('.sha')[0]).text(); + data.revisions = JSON.stringify(select_ref); + popup.empty().append($.tmpl($('#templ-compare-chooser'), data)).show(); + scrollTo(0, 0); + // load commit_preview when sha given + $('.ref-autocompleter').change(function (){ + var ref = $(this).val(); + $('.place_preview').empty(); + var url = '/' + project_name +'/pull/commit_preview/' + project_name+':'+ref; + $.get(url, function(data){ + $('.place_preview').html(data); + }); + }); + }); + + popup = null; + $('.commit-ref').click(function () { + if (!popup) { + popup = $('
    ').appendTo('body'); + popup.delegate('.close', 'click', function () {popup.hide();}); + popup.delegate('#start-submit', 'click', function () { + var ref = popup.find('.ref-autocompleter').val(); + var link = '/' + project_name + '/compare/'+ref+'...' + '${sha2}'; + location.href = link; + + }) + .delegate('#end-submit', 'click', function () { + var ref = popup.find('.ref-autocompleter').val(); + var link = '/' + project_name + '/compare/'+'${sha1}'+'...' + ref; + location.href = link; + }); + } + var data = {}; + if ($(this).hasClass('from')) { + data.mode = 'start'; + } else { + data.mode = 'end'; + } + popup.empty().append($.tmpl($('#templ-compare-chooser'), data)).show(); + }); + +}); + +/* @source */; + +require(['mod/compare' +, 'mod/zclip' +, 'mod/diff' // no use yet +], function(){ + //do any thing? +}); diff --git a/dist/js/app/src/editor.js b/dist/js/app/src/editor.js new file mode 100644 index 0000000..d0ca264 --- /dev/null +++ b/dist/js/app/src/editor.js @@ -0,0 +1,4744 @@ + +require.config({ enable_ozma: true }); + + +/* @source mod/zclip.js */; + +define('mod/zclip', [ + "jquery", + "jquery-zclip" +], function($, _) { + $(function () { + $('input.git-url').focus(function(e) { + var elem = this; + setTimeout(function() { + elem.select(); + }, 0); + }); + $('.copy-git-url').zclip({ + path: '/static/js/lib/ZeroClipboard.swf', + copy: function() { + return $('.copy-git-url').attr('data-clipboard-text'); + }, + afterCopy: function() {} + }); + }); +}); + +/* @source lib/codemirror.js */; + +// CodeMirror version 3.0 +// +// CodeMirror is the only global var we claim +window.CodeMirror = (function() { + "use strict"; + + // BROWSER SNIFFING + + // Crude, but necessary to handle a number of hard-to-feature-detect + // bugs and behavior differences. + var gecko = /gecko\/\d/i.test(navigator.userAgent); + var ie = /MSIE \d/.test(navigator.userAgent); + var ie_lt8 = /MSIE [1-7]\b/.test(navigator.userAgent); + var ie_lt9 = /MSIE [1-8]\b/.test(navigator.userAgent); + var webkit = /WebKit\//.test(navigator.userAgent); + var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(navigator.userAgent); + var chrome = /Chrome\//.test(navigator.userAgent); + var opera = /Opera\//.test(navigator.userAgent); + var safari = /Apple Computer/.test(navigator.vendor); + var khtml = /KHTML\//.test(navigator.userAgent); + var mac_geLion = /Mac OS X 1\d\D([7-9]|\d\d)\D/.test(navigator.userAgent); + var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent); + var phantom = /PhantomJS/.test(navigator.userAgent); + + var ios = /AppleWebKit/.test(navigator.userAgent) && /Mobile\/\w+/.test(navigator.userAgent); + // This is woefully incomplete. Suggestions for alternative methods welcome. + var mobile = ios || /Android|webOS|BlackBerry|Opera Mini|IEMobile/i.test(navigator.userAgent); + var mac = ios || /Mac/.test(navigator.platform); + + // Optimize some code when these features are not used + var sawReadOnlySpans = false, sawCollapsedSpans = false; + + // CONSTRUCTOR + + function CodeMirror(place, options) { + if (!(this instanceof CodeMirror)) return new CodeMirror(place, options); + + this.options = options = options || {}; + // Determine effective options based on given values and defaults. + for (var opt in defaults) if (!options.hasOwnProperty(opt) && defaults.hasOwnProperty(opt)) + options[opt] = defaults[opt]; + setGuttersForLineNumbers(options); + + var display = this.display = makeDisplay(place); + display.wrapper.CodeMirror = this; + updateGutters(this); + if (options.autofocus && !mobile) focusInput(this); + + this.view = makeView(new BranchChunk([new LeafChunk([makeLine("", null, textHeight(display))])])); + this.nextOpId = 0; + loadMode(this); + themeChanged(this); + if (options.lineWrapping) + this.display.wrapper.className += " CodeMirror-wrap"; + + // Initialize the content. + this.setValue(options.value || ""); + // Override magic textarea content restore that IE sometimes does + // on our hidden textarea on reload + if (ie) setTimeout(bind(resetInput, this, true), 20); + this.view.history = makeHistory(); + + registerEventHandlers(this); + // IE throws unspecified error in certain cases, when + // trying to access activeElement before onload + var hasFocus; try { hasFocus = (document.activeElement == display.input); } catch(e) { } + if (hasFocus || (options.autofocus && !mobile)) setTimeout(bind(onFocus, this), 20); + else onBlur(this); + + operation(this, function() { + for (var opt in optionHandlers) + if (optionHandlers.propertyIsEnumerable(opt)) + optionHandlers[opt](this, options[opt], Init); + for (var i = 0; i < initHooks.length; ++i) initHooks[i](this); + })(); + } + + // DISPLAY CONSTRUCTOR + + function makeDisplay(place) { + var d = {}; + var input = d.input = elt("textarea", null, null, "position: absolute; padding: 0; width: 1px; height: 1em; outline: none;"); + input.setAttribute("wrap", "off"); input.setAttribute("autocorrect", "off"); input.setAttribute("autocapitalize", "off"); + // Wraps and hides input textarea + d.inputDiv = elt("div", [input], null, "overflow: hidden; position: relative; width: 3px; height: 0px;"); + // The actual fake scrollbars. + d.scrollbarH = elt("div", [elt("div", null, null, "height: 1px")], "CodeMirror-hscrollbar"); + d.scrollbarV = elt("div", [elt("div", null, null, "width: 1px")], "CodeMirror-vscrollbar"); + d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler"); + // DIVs containing the selection and the actual code + d.lineDiv = elt("div"); + d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1"); + // Blinky cursor, and element used to ensure cursor fits at the end of a line + d.cursor = elt("pre", "\u00a0", "CodeMirror-cursor"); + // Secondary cursor, shown when on a 'jump' in bi-directional text + d.otherCursor = elt("pre", "\u00a0", "CodeMirror-cursor CodeMirror-secondarycursor"); + // Used to measure text size + d.measure = elt("div", null, "CodeMirror-measure"); + // Wraps everything that needs to exist inside the vertically-padded coordinate system + d.lineSpace = elt("div", [d.measure, d.selectionDiv, d.lineDiv, d.cursor, d.otherCursor], + null, "position: relative; outline: none"); + // Moved around its parent to cover visible view + d.mover = elt("div", [elt("div", [d.lineSpace], "CodeMirror-lines")], null, "position: relative"); + // Set to the height of the text, causes scrolling + d.sizer = elt("div", [d.mover], "CodeMirror-sizer"); + // D is needed because behavior of elts with overflow: auto and padding is inconsistent across browsers + d.heightForcer = elt("div", "\u00a0", null, "position: absolute; height: " + scrollerCutOff + "px"); + // Will contain the gutters, if any + d.gutters = elt("div", null, "CodeMirror-gutters"); + d.lineGutter = null; + // Helper element to properly size the gutter backgrounds + var scrollerInner = elt("div", [d.sizer, d.heightForcer, d.gutters], null, "position: relative; min-height: 100%"); + // Provides scrolling + d.scroller = elt("div", [scrollerInner], "CodeMirror-scroll"); + d.scroller.setAttribute("tabIndex", "-1"); + // The element in which the editor lives. + d.wrapper = elt("div", [d.inputDiv, d.scrollbarH, d.scrollbarV, + d.scrollbarFiller, d.scroller], "CodeMirror"); + // Work around IE7 z-index bug + if (ie_lt8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; } + if (place.appendChild) place.appendChild(d.wrapper); else place(d.wrapper); + + // Needed to hide big blue blinking cursor on Mobile Safari + if (ios) input.style.width = "0px"; + if (!webkit) d.scroller.draggable = true; + // Needed to handle Tab key in KHTML + if (khtml) { d.inputDiv.style.height = "1px"; d.inputDiv.style.position = "absolute"; } + // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8). + else if (ie_lt8) d.scrollbarH.style.minWidth = d.scrollbarV.style.minWidth = "18px"; + + // Current visible range (may be bigger than the view window). + d.viewOffset = d.showingFrom = d.showingTo = d.lastSizeC = 0; + + // Used to only resize the line number gutter when necessary (when + // the amount of lines crosses a boundary that makes its width change) + d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null; + // See readInput and resetInput + d.prevInput = ""; + // Set to true when a non-horizontal-scrolling widget is added. As + // an optimization, widget aligning is skipped when d is false. + d.alignWidgets = false; + // Flag that indicates whether we currently expect input to appear + // (after some event like 'keypress' or 'input') and are polling + // intensively. + d.pollingFast = false; + // Self-resetting timeout for the poller + d.poll = new Delayed(); + // True when a drag from the editor is active + d.draggingText = false; + + d.cachedCharWidth = d.cachedTextHeight = null; + d.measureLineCache = []; + d.measureLineCachePos = 0; + + // Tracks when resetInput has punted to just putting a short + // string instead of the (large) selection. + d.inaccurateSelection = false; + + // Used to adjust overwrite behaviour when a paste has been + // detected + d.pasteIncoming = false; + + return d; + } + + // VIEW CONSTRUCTOR + + function makeView(doc) { + var selPos = {line: 0, ch: 0}; + return { + doc: doc, + // frontier is the point up to which the content has been parsed, + frontier: 0, highlight: new Delayed(), + sel: {from: selPos, to: selPos, head: selPos, anchor: selPos, shift: false, extend: false}, + scrollTop: 0, scrollLeft: 0, + overwrite: false, focused: false, + // Tracks the maximum line length so that + // the horizontal scrollbar can be kept + // static when scrolling. + maxLine: getLine(doc, 0), + maxLineLength: 0, + maxLineChanged: false, + suppressEdits: false, + goalColumn: null, + cantEdit: false, + keyMaps: [] + }; + } + + // STATE UPDATES + + // Used to get the editor into a consistent state again when options change. + + function loadMode(cm) { + var doc = cm.view.doc; + cm.view.mode = CodeMirror.getMode(cm.options, cm.options.mode); + doc.iter(0, doc.size, function(line) { line.stateAfter = null; }); + cm.view.frontier = 0; + startWorker(cm, 100); + } + + function wrappingChanged(cm) { + var doc = cm.view.doc, th = textHeight(cm.display); + if (cm.options.lineWrapping) { + cm.display.wrapper.className += " CodeMirror-wrap"; + var perLine = cm.display.scroller.clientWidth / charWidth(cm.display) - 3; + doc.iter(0, doc.size, function(line) { + if (line.height == 0) return; + var guess = Math.ceil(line.text.length / perLine) || 1; + if (guess != 1) updateLineHeight(line, guess * th); + }); + cm.display.sizer.style.minWidth = ""; + } else { + cm.display.wrapper.className = cm.display.wrapper.className.replace(" CodeMirror-wrap", ""); + computeMaxLength(cm.view); + doc.iter(0, doc.size, function(line) { + if (line.height != 0) updateLineHeight(line, th); + }); + } + regChange(cm, 0, doc.size); + clearCaches(cm); + setTimeout(function(){updateScrollbars(cm.display, cm.view.doc.height);}, 100); + } + + function keyMapChanged(cm) { + var style = keyMap[cm.options.keyMap].style; + cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-keymap-\S+/g, "") + + (style ? " cm-keymap-" + style : ""); + } + + function themeChanged(cm) { + cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") + + cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-"); + clearCaches(cm); + } + + function guttersChanged(cm) { + updateGutters(cm); + updateDisplay(cm, true); + } + + function updateGutters(cm) { + var gutters = cm.display.gutters, specs = cm.options.gutters; + removeChildren(gutters); + for (var i = 0; i < specs.length; ++i) { + var gutterClass = specs[i]; + var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + gutterClass)); + if (gutterClass == "CodeMirror-linenumbers") { + cm.display.lineGutter = gElt; + gElt.style.width = (cm.display.lineNumWidth || 1) + "px"; + } + } + gutters.style.display = i ? "" : "none"; + } + + function lineLength(doc, line) { + if (line.height == 0) return 0; + var len = line.text.length, merged, cur = line; + while (merged = collapsedSpanAtStart(cur)) { + var found = merged.find(); + cur = getLine(doc, found.from.line); + len += found.from.ch - found.to.ch; + } + cur = line; + while (merged = collapsedSpanAtEnd(cur)) { + var found = merged.find(); + len -= cur.text.length - found.from.ch; + cur = getLine(doc, found.to.line); + len += cur.text.length - found.to.ch; + } + return len; + } + + function computeMaxLength(view) { + view.maxLine = getLine(view.doc, 0); + view.maxLineLength = lineLength(view.doc, view.maxLine); + view.maxLineChanged = true; + view.doc.iter(1, view.doc.size, function(line) { + var len = lineLength(view.doc, line); + if (len > view.maxLineLength) { + view.maxLineLength = len; + view.maxLine = line; + } + }); + } + + // Make sure the gutters options contains the element + // "CodeMirror-linenumbers" when the lineNumbers option is true. + function setGuttersForLineNumbers(options) { + var found = false; + for (var i = 0; i < options.gutters.length; ++i) { + if (options.gutters[i] == "CodeMirror-linenumbers") { + if (options.lineNumbers) found = true; + else options.gutters.splice(i--, 1); + } + } + if (!found && options.lineNumbers) + options.gutters.push("CodeMirror-linenumbers"); + } + + // SCROLLBARS + + // Re-synchronize the fake scrollbars with the actual size of the + // content. Optionally force a scrollTop. + function updateScrollbars(d /* display */, docHeight) { + var totalHeight = docHeight + 2 * paddingTop(d); + d.sizer.style.minHeight = d.heightForcer.style.top = totalHeight + "px"; + var scrollHeight = Math.max(totalHeight, d.scroller.scrollHeight); + var needsH = d.scroller.scrollWidth > d.scroller.clientWidth; + var needsV = scrollHeight > d.scroller.clientHeight; + if (needsV) { + d.scrollbarV.style.display = "block"; + d.scrollbarV.style.bottom = needsH ? scrollbarWidth(d.measure) + "px" : "0"; + d.scrollbarV.firstChild.style.height = + (scrollHeight - d.scroller.clientHeight + d.scrollbarV.clientHeight) + "px"; + } else d.scrollbarV.style.display = ""; + if (needsH) { + d.scrollbarH.style.display = "block"; + d.scrollbarH.style.right = needsV ? scrollbarWidth(d.measure) + "px" : "0"; + d.scrollbarH.firstChild.style.width = + (d.scroller.scrollWidth - d.scroller.clientWidth + d.scrollbarH.clientWidth) + "px"; + } else d.scrollbarH.style.display = ""; + if (needsH && needsV) { + d.scrollbarFiller.style.display = "block"; + d.scrollbarFiller.style.height = d.scrollbarFiller.style.width = scrollbarWidth(d.measure) + "px"; + } else d.scrollbarFiller.style.display = ""; + + if (mac_geLion && scrollbarWidth(d.measure) === 0) + d.scrollbarV.style.minWidth = d.scrollbarH.style.minHeight = mac_geMountainLion ? "18px" : "12px"; + } + + function visibleLines(display, doc, viewPort) { + var top = display.scroller.scrollTop, height = display.wrapper.clientHeight; + if (typeof viewPort == "number") top = viewPort; + else if (viewPort) {top = viewPort.top; height = viewPort.bottom - viewPort.top;} + top = Math.floor(top - paddingTop(display)); + var bottom = Math.ceil(top + height); + return {from: lineAtHeight(doc, top), to: lineAtHeight(doc, bottom)}; + } + + // LINE NUMBERS + + function alignHorizontally(cm) { + var display = cm.display; + if (!display.alignWidgets && !display.gutters.firstChild) return; + var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.view.scrollLeft; + var gutterW = display.gutters.offsetWidth, l = comp + "px"; + for (var n = display.lineDiv.firstChild; n; n = n.nextSibling) if (n.alignable) { + for (var i = 0, a = n.alignable; i < a.length; ++i) a[i].style.left = l; + } + display.gutters.style.left = (comp + gutterW) + "px"; + } + + function maybeUpdateLineNumberWidth(cm) { + if (!cm.options.lineNumbers) return false; + var doc = cm.view.doc, last = lineNumberFor(cm.options, doc.size - 1), display = cm.display; + if (last.length != display.lineNumChars) { + var test = display.measure.appendChild(elt("div", [elt("div", last)], + "CodeMirror-linenumber CodeMirror-gutter-elt")); + var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW; + display.lineGutter.style.width = ""; + display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding); + display.lineNumWidth = display.lineNumInnerWidth + padding; + display.lineNumChars = display.lineNumInnerWidth ? last.length : -1; + display.lineGutter.style.width = display.lineNumWidth + "px"; + return true; + } + return false; + } + + function lineNumberFor(options, i) { + return String(options.lineNumberFormatter(i + options.firstLineNumber)); + } + function compensateForHScroll(display) { + return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left; + } + + // DISPLAY DRAWING + + function updateDisplay(cm, changes, viewPort) { + var oldFrom = cm.display.showingFrom, oldTo = cm.display.showingTo; + var updated = updateDisplayInner(cm, changes, viewPort); + if (updated) { + signalLater(cm, cm, "update", cm); + if (cm.display.showingFrom != oldFrom || cm.display.showingTo != oldTo) + signalLater(cm, cm, "viewportChange", cm, cm.display.showingFrom, cm.display.showingTo); + } + updateSelection(cm); + updateScrollbars(cm.display, cm.view.doc.height); + + return updated; + } + + // Uses a set of changes plus the current scroll position to + // determine which DOM updates have to be made, and makes the + // updates. + function updateDisplayInner(cm, changes, viewPort) { + var display = cm.display, doc = cm.view.doc; + if (!display.wrapper.clientWidth) { + display.showingFrom = display.showingTo = display.viewOffset = 0; + return; + } + + // Compute the new visible window + // If scrollTop is specified, use that to determine which lines + // to render instead of the current scrollbar position. + var visible = visibleLines(display, doc, viewPort); + // Bail out if the visible area is already rendered and nothing changed. + if (changes !== true && changes.length == 0 && + visible.from > display.showingFrom && visible.to < display.showingTo) + return; + + if (changes && maybeUpdateLineNumberWidth(cm)) + changes = true; + display.sizer.style.marginLeft = display.scrollbarH.style.left = display.gutters.offsetWidth + "px"; + + // When merged lines are present, the line that needs to be + // redrawn might not be the one that was changed. + if (changes !== true && sawCollapsedSpans) + for (var i = 0; i < changes.length; ++i) { + var ch = changes[i], merged; + while (merged = collapsedSpanAtStart(getLine(doc, ch.from))) { + var from = merged.find().from.line; + if (ch.diff) ch.diff -= ch.from - from; + ch.from = from; + } + } + + // Used to determine which lines need their line numbers updated + var positionsChangedFrom = changes === true ? 0 : Infinity; + if (cm.options.lineNumbers && changes && changes !== true) + for (var i = 0; i < changes.length; ++i) + if (changes[i].diff) { positionsChangedFrom = changes[i].from; break; } + + var from = Math.max(visible.from - cm.options.viewportMargin, 0); + var to = Math.min(doc.size, visible.to + cm.options.viewportMargin); + if (display.showingFrom < from && from - display.showingFrom < 20) from = display.showingFrom; + if (display.showingTo > to && display.showingTo - to < 20) to = Math.min(doc.size, display.showingTo); + if (sawCollapsedSpans) { + from = lineNo(visualLine(doc, getLine(doc, from))); + while (to < doc.size && lineIsHidden(getLine(doc, to))) ++to; + } + + // Create a range of theoretically intact lines, and punch holes + // in that using the change info. + var intact = changes === true ? [] : + computeIntact([{from: display.showingFrom, to: display.showingTo}], changes); + // Clip off the parts that won't be visible + var intactLines = 0; + for (var i = 0; i < intact.length; ++i) { + var range = intact[i]; + if (range.from < from) range.from = from; + if (range.to > to) range.to = to; + if (range.from >= range.to) intact.splice(i--, 1); + else intactLines += range.to - range.from; + } + if (intactLines == to - from && from == display.showingFrom && to == display.showingTo) + return; + intact.sort(function(a, b) {return a.from - b.from;}); + + if (intactLines < (to - from) * .7) display.lineDiv.style.display = "none"; + patchDisplay(cm, from, to, intact, positionsChangedFrom); + display.lineDiv.style.display = ""; + + var different = from != display.showingFrom || to != display.showingTo || + display.lastSizeC != display.wrapper.clientHeight; + // This is just a bogus formula that detects when the editor is + // resized or the font size changes. + if (different) display.lastSizeC = display.wrapper.clientHeight; + display.showingFrom = from; display.showingTo = to; + startWorker(cm, 100); + + var prevBottom = display.lineDiv.offsetTop; + for (var node = display.lineDiv.firstChild, height; node; node = node.nextSibling) if (node.lineObj) { + if (ie_lt8) { + var bot = node.offsetTop + node.offsetHeight; + height = bot - prevBottom; + prevBottom = bot; + } else { + var box = node.getBoundingClientRect(); + height = box.bottom - box.top; + } + var diff = node.lineObj.height - height; + if (height < 2) height = textHeight(display); + if (diff > .001 || diff < -.001) + updateLineHeight(node.lineObj, height); + } + display.viewOffset = heightAtLine(cm, getLine(doc, from)); + // Position the mover div to align with the current virtual scroll position + display.mover.style.top = display.viewOffset + "px"; + return true; + } + + function computeIntact(intact, changes) { + for (var i = 0, l = changes.length || 0; i < l; ++i) { + var change = changes[i], intact2 = [], diff = change.diff || 0; + for (var j = 0, l2 = intact.length; j < l2; ++j) { + var range = intact[j]; + if (change.to <= range.from && change.diff) { + intact2.push({from: range.from + diff, to: range.to + diff}); + } else if (change.to <= range.from || change.from >= range.to) { + intact2.push(range); + } else { + if (change.from > range.from) + intact2.push({from: range.from, to: change.from}); + if (change.to < range.to) + intact2.push({from: change.to + diff, to: range.to + diff}); + } + } + intact = intact2; + } + return intact; + } + + function getDimensions(cm) { + var d = cm.display, left = {}, width = {}; + for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) { + left[cm.options.gutters[i]] = n.offsetLeft; + width[cm.options.gutters[i]] = n.offsetWidth; + } + return {fixedPos: compensateForHScroll(d), + gutterTotalWidth: d.gutters.offsetWidth, + gutterLeft: left, + gutterWidth: width, + wrapperWidth: d.wrapper.clientWidth}; + } + + function patchDisplay(cm, from, to, intact, updateNumbersFrom) { + var dims = getDimensions(cm); + var display = cm.display, lineNumbers = cm.options.lineNumbers; + // IE does bad things to nodes when .innerHTML = "" is used on a parent + // we still need widgets and markers intact to add back to the new content later + if (!intact.length && !ie && (!webkit || !cm.display.currentWheelTarget)) + removeChildren(display.lineDiv); + var container = display.lineDiv, cur = container.firstChild; + + function rm(node) { + var next = node.nextSibling; + if (webkit && mac && cm.display.currentWheelTarget == node) { + node.style.display = "none"; + node.lineObj = null; + } else { + container.removeChild(node); + } + return next; + } + + var nextIntact = intact.shift(), lineNo = from; + cm.view.doc.iter(from, to, function(line) { + if (nextIntact && nextIntact.to == lineNo) nextIntact = intact.shift(); + if (lineIsHidden(line)) { + if (line.height != 0) updateLineHeight(line, 0); + } else if (nextIntact && nextIntact.from <= lineNo && nextIntact.to > lineNo) { + // This line is intact. Skip to the actual node. Update its + // line number if needed. + while (cur.lineObj != line) cur = rm(cur); + if (lineNumbers && updateNumbersFrom <= lineNo && cur.lineNumber) + setTextContent(cur.lineNumber, lineNumberFor(cm.options, lineNo)); + cur = cur.nextSibling; + } else { + // This line needs to be generated. + var lineNode = buildLineElement(cm, line, lineNo, dims); + container.insertBefore(lineNode, cur); + lineNode.lineObj = line; + } + ++lineNo; + }); + while (cur) cur = rm(cur); + } + + function buildLineElement(cm, line, lineNo, dims) { + var lineElement = lineContent(cm, line); + var markers = line.gutterMarkers, display = cm.display; + + if (!cm.options.lineNumbers && !markers && !line.bgClass && !line.wrapClass && + (!line.widgets || !line.widgets.length)) return lineElement; + + // Lines with gutter elements or a background class need + // to be wrapped again, and have the extra elements added + // to the wrapper div + + var wrap = elt("div", null, line.wrapClass, "position: relative"); + if (cm.options.lineNumbers || markers) { + var gutterWrap = wrap.appendChild(elt("div", null, null, "position: absolute; left: " + + dims.fixedPos + "px")); + wrap.alignable = [gutterWrap]; + if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"])) + wrap.lineNumber = gutterWrap.appendChild( + elt("div", lineNumberFor(cm.options, lineNo), + "CodeMirror-linenumber CodeMirror-gutter-elt", + "left: " + dims.gutterLeft["CodeMirror-linenumbers"] + "px; width: " + + display.lineNumInnerWidth + "px")); + if (markers) + for (var k = 0; k < cm.options.gutters.length; ++k) { + var id = cm.options.gutters[k], found = markers.hasOwnProperty(id) && markers[id]; + if (found) + gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt", "left: " + + dims.gutterLeft[id] + "px; width: " + dims.gutterWidth[id] + "px")); + } + } + // Kludge to make sure the styled element lies behind the selection (by z-index) + if (line.bgClass) + wrap.appendChild(elt("div", "\u00a0", line.bgClass + " CodeMirror-linebackground")); + wrap.appendChild(lineElement); + if (line.widgets) + for (var i = 0, ws = line.widgets; i < ws.length; ++i) { + var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget"); + node.widget = widget; + if (widget.noHScroll) { + (wrap.alignable || (wrap.alignable = [])).push(node); + var width = dims.wrapperWidth; + node.style.left = dims.fixedPos + "px"; + if (!widget.coverGutter) { + width -= dims.gutterTotalWidth; + node.style.paddingLeft = dims.gutterTotalWidth + "px"; + } + node.style.width = width + "px"; + } + if (widget.coverGutter) { + node.style.zIndex = 5; + node.style.position = "relative"; + if (!widget.noHScroll) node.style.marginLeft = -dims.gutterTotalWidth + "px"; + } + if (widget.above) + wrap.insertBefore(node, cm.options.lineNumbers && line.height != 0 ? gutterWrap : lineElement); + else + wrap.appendChild(node); + } + + if (ie_lt8) wrap.style.zIndex = 2; + return wrap; + } + + // SELECTION / CURSOR + + function updateSelection(cm) { + var display = cm.display; + var collapsed = posEq(cm.view.sel.from, cm.view.sel.to); + if (collapsed || cm.options.showCursorWhenSelecting) + updateSelectionCursor(cm); + else + display.cursor.style.display = display.otherCursor.style.display = "none"; + if (!collapsed) + updateSelectionRange(cm); + else + display.selectionDiv.style.display = "none"; + + // Move the hidden textarea near the cursor to prevent scrolling artifacts + var headPos = cursorCoords(cm, cm.view.sel.head, "div"); + var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect(); + display.inputDiv.style.top = Math.max(0, Math.min(display.wrapper.clientHeight - 10, + headPos.top + lineOff.top - wrapOff.top)) + "px"; + display.inputDiv.style.left = Math.max(0, Math.min(display.wrapper.clientWidth - 10, + headPos.left + lineOff.left - wrapOff.left)) + "px"; + } + + // No selection, plain cursor + function updateSelectionCursor(cm) { + var display = cm.display, pos = cursorCoords(cm, cm.view.sel.head, "div"); + display.cursor.style.left = pos.left + "px"; + display.cursor.style.top = pos.top + "px"; + display.cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px"; + display.cursor.style.display = ""; + + if (pos.other) { + display.otherCursor.style.display = ""; + display.otherCursor.style.left = pos.other.left + "px"; + display.otherCursor.style.top = pos.other.top + "px"; + display.otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + "px"; + } else { display.otherCursor.style.display = "none"; } + } + + // Highlight selection + function updateSelectionRange(cm) { + var display = cm.display, doc = cm.view.doc, sel = cm.view.sel; + var fragment = document.createDocumentFragment(); + var clientWidth = display.lineSpace.offsetWidth, pl = paddingLeft(cm.display); + + function add(left, top, width, bottom) { + if (top < 0) top = 0; + fragment.appendChild(elt("div", null, "CodeMirror-selected", "position: absolute; left: " + left + + "px; top: " + top + "px; width: " + (width == null ? clientWidth - left : width) + + "px; height: " + (bottom - top) + "px")); + } + + function drawForLine(line, fromArg, toArg, retTop) { + var lineObj = getLine(doc, line); + var lineLen = lineObj.text.length, rVal = retTop ? Infinity : -Infinity; + function coords(ch) { + return charCoords(cm, {line: line, ch: ch}, "div", lineObj); + } + + iterateBidiSections(getOrder(lineObj), fromArg || 0, toArg == null ? lineLen : toArg, function(from, to, dir) { + var leftPos = coords(dir == "rtl" ? to - 1 : from); + var rightPos = coords(dir == "rtl" ? from : to - 1); + var left = leftPos.left, right = rightPos.right; + if (rightPos.top - leftPos.top > 3) { // Different lines, draw top part + add(left, leftPos.top, null, leftPos.bottom); + left = pl; + if (leftPos.bottom < rightPos.top) add(left, leftPos.bottom, null, rightPos.top); + } + if (toArg == null && to == lineLen) right = clientWidth; + if (fromArg == null && from == 0) left = pl; + rVal = retTop ? Math.min(rightPos.top, rVal) : Math.max(rightPos.bottom, rVal); + if (left < pl + 1) left = pl; + add(left, rightPos.top, right - left, rightPos.bottom); + }); + return rVal; + } + + if (sel.from.line == sel.to.line) { + drawForLine(sel.from.line, sel.from.ch, sel.to.ch); + } else { + var fromObj = getLine(doc, sel.from.line); + var cur = fromObj, merged, path = [sel.from.line, sel.from.ch], singleLine; + while (merged = collapsedSpanAtEnd(cur)) { + var found = merged.find(); + path.push(found.from.ch, found.to.line, found.to.ch); + if (found.to.line == sel.to.line) { + path.push(sel.to.ch); + singleLine = true; + break; + } + cur = getLine(doc, found.to.line); + } + + // This is a single, merged line + if (singleLine) { + for (var i = 0; i < path.length; i += 3) + drawForLine(path[i], path[i+1], path[i+2]); + } else { + var middleTop, middleBot, toObj = getLine(doc, sel.to.line); + if (sel.from.ch) + // Draw the first line of selection. + middleTop = drawForLine(sel.from.line, sel.from.ch, null, false); + else + // Simply include it in the middle block. + middleTop = heightAtLine(cm, fromObj) - display.viewOffset; + + if (!sel.to.ch) + middleBot = heightAtLine(cm, toObj) - display.viewOffset; + else + middleBot = drawForLine(sel.to.line, collapsedSpanAtStart(toObj) ? null : 0, sel.to.ch, true); + + if (middleTop < middleBot) add(pl, middleTop, null, middleBot); + } + } + + removeChildrenAndAdd(display.selectionDiv, fragment); + display.selectionDiv.style.display = ""; + } + + // Cursor-blinking + function restartBlink(cm) { + var display = cm.display; + clearInterval(display.blinker); + var on = true; + display.cursor.style.visibility = display.otherCursor.style.visibility = ""; + display.blinker = setInterval(function() { + if (!display.cursor.offsetHeight) return; + display.cursor.style.visibility = display.otherCursor.style.visibility = (on = !on) ? "" : "hidden"; + }, cm.options.cursorBlinkRate); + } + + // HIGHLIGHT WORKER + + function startWorker(cm, time) { + if (cm.view.frontier < cm.display.showingTo) + cm.view.highlight.set(time, bind(highlightWorker, cm)); + } + + function highlightWorker(cm) { + var view = cm.view, doc = view.doc; + if (view.frontier >= cm.display.showingTo) return; + var end = +new Date + cm.options.workTime; + var state = copyState(view.mode, getStateBefore(cm, view.frontier)); + var changed = [], prevChange; + doc.iter(view.frontier, Math.min(doc.size, cm.display.showingTo + 500), function(line) { + if (view.frontier >= cm.display.showingFrom) { // Visible + if (highlightLine(cm, line, state) && view.frontier >= cm.display.showingFrom) { + if (prevChange && prevChange.end == view.frontier) prevChange.end++; + else changed.push(prevChange = {start: view.frontier, end: view.frontier + 1}); + } + line.stateAfter = copyState(view.mode, state); + } else { + processLine(cm, line, state); + line.stateAfter = view.frontier % 5 == 0 ? copyState(view.mode, state) : null; + } + ++view.frontier; + if (+new Date > end) { + startWorker(cm, cm.options.workDelay); + return true; + } + }); + if (changed.length) + operation(cm, function() { + for (var i = 0; i < changed.length; ++i) + regChange(this, changed[i].start, changed[i].end); + })(); + } + + // Finds the line to start with when starting a parse. Tries to + // find a line with a stateAfter, so that it can start with a + // valid state. If that fails, it returns the line with the + // smallest indentation, which tends to need the least context to + // parse correctly. + function findStartLine(cm, n) { + var minindent, minline, doc = cm.view.doc; + for (var search = n, lim = n - 100; search > lim; --search) { + if (search == 0) return 0; + var line = getLine(doc, search-1); + if (line.stateAfter) return search; + var indented = countColumn(line.text, null, cm.options.tabSize); + if (minline == null || minindent > indented) { + minline = search - 1; + minindent = indented; + } + } + return minline; + } + + function getStateBefore(cm, n) { + var view = cm.view; + var pos = findStartLine(cm, n), state = pos && getLine(view.doc, pos-1).stateAfter; + if (!state) state = startState(view.mode); + else state = copyState(view.mode, state); + view.doc.iter(pos, n, function(line) { + processLine(cm, line, state); + var save = pos == n - 1 || pos % 5 == 0 || pos >= view.showingFrom && pos < view.showingTo; + line.stateAfter = save ? copyState(view.mode, state) : null; + ++pos; + }); + return state; + } + + // POSITION MEASUREMENT + + function paddingTop(display) {return display.lineSpace.offsetTop;} + function paddingLeft(display) { + var e = removeChildrenAndAdd(display.measure, elt("pre")).appendChild(elt("span", "x")); + return e.offsetLeft; + } + + function measureChar(cm, line, ch, data) { + var data = data || measureLine(cm, line), dir = -1; + for (var pos = ch;; pos += dir) { + var r = data[pos]; + if (r) break; + if (dir < 0 && pos == 0) dir = 1; + } + return {left: pos < ch ? r.right : r.left, + right: pos > ch ? r.left : r.right, + top: r.top, bottom: r.bottom}; + } + + function measureLine(cm, line) { + // First look in the cache + var display = cm.display, cache = cm.display.measureLineCache; + for (var i = 0; i < cache.length; ++i) { + var memo = cache[i]; + if (memo.text == line.text && memo.markedSpans == line.markedSpans && + display.scroller.clientWidth == memo.width) + return memo.measure; + } + + var measure = measureLineInner(cm, line); + // Store result in the cache + var memo = {text: line.text, width: display.scroller.clientWidth, + markedSpans: line.markedSpans, measure: measure}; + if (cache.length == 16) cache[++display.measureLineCachePos % 16] = memo; + else cache.push(memo); + return measure; + } + + function measureLineInner(cm, line) { + var display = cm.display, measure = emptyArray(line.text.length); + var pre = lineContent(cm, line, measure); + + // IE does not cache element positions of inline elements between + // calls to getBoundingClientRect. This makes the loop below, + // which gathers the positions of all the characters on the line, + // do an amount of layout work quadratic to the number of + // characters. When line wrapping is off, we try to improve things + // by first subdividing the line into a bunch of inline blocks, so + // that IE can reuse most of the layout information from caches + // for those blocks. This does interfere with line wrapping, so it + // doesn't work when wrapping is on, but in that case the + // situation is slightly better, since IE does cache line-wrapping + // information and only recomputes per-line. + if (ie && !ie_lt8 && !cm.options.lineWrapping && pre.childNodes.length > 100) { + var fragment = document.createDocumentFragment(); + var chunk = 10, n = pre.childNodes.length; + for (var i = 0, chunks = Math.ceil(n / chunk); i < chunks; ++i) { + var wrap = elt("div", null, null, "display: inline-block"); + for (var j = 0; j < chunk && n; ++j) { + wrap.appendChild(pre.firstChild); + --n; + } + fragment.appendChild(wrap); + } + pre.appendChild(fragment); + } + + removeChildrenAndAdd(display.measure, pre); + + var outer = display.lineDiv.getBoundingClientRect(); + var vranges = [], data = emptyArray(line.text.length), maxBot = pre.offsetHeight; + for (var i = 0, cur; i < measure.length; ++i) if (cur = measure[i]) { + var size = cur.getBoundingClientRect(); + var top = Math.max(0, size.top - outer.top), bot = Math.min(size.bottom - outer.top, maxBot); + for (var j = 0; j < vranges.length; j += 2) { + var rtop = vranges[j], rbot = vranges[j+1]; + if (rtop > bot || rbot < top) continue; + if (rtop <= top && rbot >= bot || + top <= rtop && bot >= rbot || + Math.min(bot, rbot) - Math.max(top, rtop) >= (bot - top) >> 1) { + vranges[j] = Math.min(top, rtop); + vranges[j+1] = Math.max(bot, rbot); + break; + } + } + if (j == vranges.length) vranges.push(top, bot); + data[i] = {left: size.left - outer.left, right: size.right - outer.left, top: j}; + } + for (var i = 0, cur; i < data.length; ++i) if (cur = data[i]) { + var vr = cur.top; + cur.top = vranges[vr]; cur.bottom = vranges[vr+1]; + } + return data; + } + + function clearCaches(cm) { + cm.display.measureLineCache.length = cm.display.measureLineCachePos = 0; + cm.display.cachedCharWidth = cm.display.cachedTextHeight = null; + cm.view.maxLineChanged = true; + } + + // Context is one of "line", "div" (display.lineDiv), "local"/null (editor), or "page" + function intoCoordSystem(cm, lineObj, rect, context) { + if (lineObj.widgets) for (var i = 0; i < lineObj.widgets.length; ++i) if (lineObj.widgets[i].above) { + var size = lineObj.widgets[i].node.offsetHeight; + rect.top += size; rect.bottom += size; + } + if (context == "line") return rect; + if (!context) context = "local"; + var yOff = heightAtLine(cm, lineObj); + if (context != "local") yOff -= cm.display.viewOffset; + if (context == "page") { + var lOff = cm.display.lineSpace.getBoundingClientRect(); + yOff += lOff.top + (window.pageYOffset || (document.documentElement || document.body).scrollTop); + var xOff = lOff.left + (window.pageXOffset || (document.documentElement || document.body).scrollLeft); + rect.left += xOff; rect.right += xOff; + } + rect.top += yOff; rect.bottom += yOff; + return rect; + } + + function charCoords(cm, pos, context, lineObj) { + if (!lineObj) lineObj = getLine(cm.view.doc, pos.line); + return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch), context); + } + + function cursorCoords(cm, pos, context, lineObj, measurement) { + lineObj = lineObj || getLine(cm.view.doc, pos.line); + if (!measurement) measurement = measureLine(cm, lineObj); + function get(ch, right) { + var m = measureChar(cm, lineObj, ch, measurement); + if (right) m.left = m.right; else m.right = m.left; + return intoCoordSystem(cm, lineObj, m, context); + } + var order = getOrder(lineObj), ch = pos.ch; + if (!order) return get(ch); + var main, other, linedir = order[0].level; + for (var i = 0; i < order.length; ++i) { + var part = order[i], rtl = part.level % 2, nb, here; + if (part.from < ch && part.to > ch) return get(ch, rtl); + var left = rtl ? part.to : part.from, right = rtl ? part.from : part.to; + if (left == ch) { + // Opera and IE return bogus offsets and widths for edges + // where the direction flips, but only for the side with the + // lower level. So we try to use the side with the higher + // level. + if (i && part.level < (nb = order[i-1]).level) here = get(nb.level % 2 ? nb.from : nb.to - 1, true); + else here = get(rtl && part.from != part.to ? ch - 1 : ch); + if (rtl == linedir) main = here; else other = here; + } else if (right == ch) { + var nb = i < order.length - 1 && order[i+1]; + if (!rtl && nb && nb.from == nb.to) continue; + if (nb && part.level < nb.level) here = get(nb.level % 2 ? nb.to - 1 : nb.from); + else here = get(rtl ? ch : ch - 1, true); + if (rtl == linedir) main = here; else other = here; + } + } + if (linedir && !ch) other = get(order[0].to - 1); + if (!main) return other; + if (other) main.other = other; + return main; + } + + // Coords must be lineSpace-local + function coordsChar(cm, x, y) { + var doc = cm.view.doc; + y += cm.display.viewOffset; + if (y < 0) return {line: 0, ch: 0, outside: true}; + var lineNo = lineAtHeight(doc, y); + if (lineNo >= doc.size) return {line: doc.size - 1, ch: getLine(doc, doc.size - 1).text.length}; + if (x < 0) x = 0; + + for (;;) { + var lineObj = getLine(doc, lineNo); + var found = coordsCharInner(cm, lineObj, lineNo, x, y); + var merged = collapsedSpanAtEnd(lineObj); + if (merged && found.ch == lineRight(lineObj)) + lineNo = merged.find().to.line; + else + return found; + } + } + + function coordsCharInner(cm, lineObj, lineNo, x, y) { + var innerOff = y - heightAtLine(cm, lineObj); + var wrongLine = false, cWidth = cm.display.wrapper.clientWidth; + var measurement = measureLine(cm, lineObj); + + function getX(ch) { + var sp = cursorCoords(cm, {line: lineNo, ch: ch}, "line", + lineObj, measurement); + wrongLine = true; + if (innerOff > sp.bottom) return Math.max(0, sp.left - cWidth); + else if (innerOff < sp.top) return sp.left + cWidth; + else wrongLine = false; + return sp.left; + } + + var bidi = getOrder(lineObj), dist = lineObj.text.length; + var from = lineLeft(lineObj), to = lineRight(lineObj); + var fromX = paddingLeft(cm.display), toX = getX(to); + + if (x > toX) return {line: lineNo, ch: to, outside: wrongLine}; + // Do a binary search between these bounds. + for (;;) { + if (bidi ? to == from || to == moveVisually(lineObj, from, 1) : to - from <= 1) { + var after = x - fromX < toX - x, ch = after ? from : to; + while (isExtendingChar.test(lineObj.text.charAt(ch))) ++ch; + return {line: lineNo, ch: ch, after: after, outside: wrongLine}; + } + var step = Math.ceil(dist / 2), middle = from + step; + if (bidi) { + middle = from; + for (var i = 0; i < step; ++i) middle = moveVisually(lineObj, middle, 1); + } + var middleX = getX(middle); + if (middleX > x) {to = middle; toX = middleX; if (wrongLine) toX += 1000; dist -= step;} + else {from = middle; fromX = middleX; dist = step;} + } + } + + var measureText; + function textHeight(display) { + if (display.cachedTextHeight != null) return display.cachedTextHeight; + if (measureText == null) { + measureText = elt("pre"); + // Measure a bunch of lines, for browsers that compute + // fractional heights. + for (var i = 0; i < 49; ++i) { + measureText.appendChild(document.createTextNode("x")); + measureText.appendChild(elt("br")); + } + measureText.appendChild(document.createTextNode("x")); + } + removeChildrenAndAdd(display.measure, measureText); + var height = measureText.offsetHeight / 50; + if (height > 3) display.cachedTextHeight = height; + removeChildren(display.measure); + return height || 1; + } + + function charWidth(display) { + if (display.cachedCharWidth != null) return display.cachedCharWidth; + var anchor = elt("span", "x"); + var pre = elt("pre", [anchor]); + removeChildrenAndAdd(display.measure, pre); + var width = anchor.offsetWidth; + if (width > 2) display.cachedCharWidth = width; + return width || 10; + } + + // OPERATIONS + + // Operations are used to wrap changes in such a way that each + // change won't have to update the cursor and display (which would + // be awkward, slow, and error-prone), but instead updates are + // batched and then all combined and executed at once. + + function startOperation(cm) { + if (cm.curOp) ++cm.curOp.depth; + else cm.curOp = { + // Nested operations delay update until the outermost one + // finishes. + depth: 1, + // An array of ranges of lines that have to be updated. See + // updateDisplay. + changes: [], + delayedCallbacks: [], + updateInput: null, + userSelChange: null, + textChanged: null, + selectionChanged: false, + updateMaxLine: false, + id: ++cm.nextOpId + }; + } + + function endOperation(cm) { + var op = cm.curOp; + if (--op.depth) return; + cm.curOp = null; + var view = cm.view, display = cm.display; + if (op.updateMaxLine) computeMaxLength(view); + if (view.maxLineChanged && !cm.options.lineWrapping) { + var width = measureChar(cm, view.maxLine, view.maxLine.text.length).right; + display.sizer.style.minWidth = (width + 3 + scrollerCutOff) + "px"; + view.maxLineChanged = false; + } + var newScrollPos, updated; + if (op.selectionChanged) { + var coords = cursorCoords(cm, view.sel.head); + newScrollPos = calculateScrollPos(cm, coords.left, coords.top, coords.left, coords.bottom); + } + if (op.changes.length || newScrollPos && newScrollPos.scrollTop != null) + updated = updateDisplay(cm, op.changes, newScrollPos && newScrollPos.scrollTop); + if (!updated && op.selectionChanged) updateSelection(cm); + if (newScrollPos) scrollCursorIntoView(cm); + if (op.selectionChanged) restartBlink(cm); + + if (view.focused && op.updateInput) + resetInput(cm, op.userSelChange); + + if (op.textChanged) + signal(cm, "change", cm, op.textChanged); + if (op.selectionChanged) signal(cm, "cursorActivity", cm); + for (var i = 0; i < op.delayedCallbacks.length; ++i) op.delayedCallbacks[i](cm); + } + + // Wraps a function in an operation. Returns the wrapped function. + function operation(cm1, f) { + return function() { + var cm = cm1 || this; + startOperation(cm); + try {var result = f.apply(cm, arguments);} + finally {endOperation(cm);} + return result; + }; + } + + function regChange(cm, from, to, lendiff) { + cm.curOp.changes.push({from: from, to: to, diff: lendiff}); + } + + // INPUT HANDLING + + function slowPoll(cm) { + if (cm.view.pollingFast) return; + cm.display.poll.set(cm.options.pollInterval, function() { + readInput(cm); + if (cm.view.focused) slowPoll(cm); + }); + } + + function fastPoll(cm) { + var missed = false; + cm.display.pollingFast = true; + function p() { + var changed = readInput(cm); + if (!changed && !missed) {missed = true; cm.display.poll.set(60, p);} + else {cm.display.pollingFast = false; slowPoll(cm);} + } + cm.display.poll.set(20, p); + } + + // prevInput is a hack to work with IME. If we reset the textarea + // on every change, that breaks IME. So we look for changes + // compared to the previous content instead. (Modern browsers have + // events that indicate IME taking place, but these are not widely + // supported or compatible enough yet to rely on.) + function readInput(cm) { + var input = cm.display.input, prevInput = cm.display.prevInput, view = cm.view, sel = view.sel; + if (!view.focused || hasSelection(input) || isReadOnly(cm)) return false; + var text = input.value; + if (text == prevInput && posEq(sel.from, sel.to)) return false; + startOperation(cm); + view.sel.shift = false; + var same = 0, l = Math.min(prevInput.length, text.length); + while (same < l && prevInput[same] == text[same]) ++same; + var from = sel.from, to = sel.to; + if (same < prevInput.length) + from = {line: from.line, ch: from.ch - (prevInput.length - same)}; + else if (view.overwrite && posEq(from, to) && !cm.display.pasteIncoming) + to = {line: to.line, ch: Math.min(getLine(cm.view.doc, to.line).text.length, to.ch + (text.length - same))}; + var updateInput = cm.curOp.updateInput; + updateDoc(cm, from, to, splitLines(text.slice(same)), "end", + cm.display.pasteIncoming ? "paste" : "input", {from: from, to: to}); + cm.curOp.updateInput = updateInput; + if (text.length > 1000) input.value = cm.display.prevInput = ""; + else cm.display.prevInput = text; + endOperation(cm); + cm.display.pasteIncoming = false; + return true; + } + + function resetInput(cm, user) { + var view = cm.view, minimal, selected; + if (!posEq(view.sel.from, view.sel.to)) { + cm.display.prevInput = ""; + minimal = hasCopyEvent && + (view.sel.to.line - view.sel.from.line > 100 || (selected = cm.getSelection()).length > 1000); + if (minimal) cm.display.input.value = "-"; + else cm.display.input.value = selected || cm.getSelection(); + if (view.focused) selectInput(cm.display.input); + } else if (user) cm.display.prevInput = cm.display.input.value = ""; + cm.display.inaccurateSelection = minimal; + } + + function focusInput(cm) { + if (cm.options.readOnly != "nocursor" && (ie || document.activeElement != cm.display.input)) + cm.display.input.focus(); + } + + function isReadOnly(cm) { + return cm.options.readOnly || cm.view.cantEdit; + } + + // EVENT HANDLERS + + function registerEventHandlers(cm) { + var d = cm.display; + on(d.scroller, "mousedown", operation(cm, onMouseDown)); + on(d.scroller, "dblclick", operation(cm, e_preventDefault)); + on(d.lineSpace, "selectstart", function(e) { + if (!mouseEventInWidget(d, e)) e_preventDefault(e); + }); + // Gecko browsers fire contextmenu *after* opening the menu, at + // which point we can't mess with it anymore. Context menu is + // handled in onMouseDown for Gecko. + if (!gecko) on(d.scroller, "contextmenu", function(e) {onContextMenu(cm, e);}); + + on(d.scroller, "scroll", function() { + setScrollTop(cm, d.scroller.scrollTop); + setScrollLeft(cm, d.scroller.scrollLeft, true); + signal(cm, "scroll", cm); + }); + on(d.scrollbarV, "scroll", function() { + setScrollTop(cm, d.scrollbarV.scrollTop); + }); + on(d.scrollbarH, "scroll", function() { + setScrollLeft(cm, d.scrollbarH.scrollLeft); + }); + + on(d.scroller, "mousewheel", function(e){onScrollWheel(cm, e);}); + on(d.scroller, "DOMMouseScroll", function(e){onScrollWheel(cm, e);}); + + function reFocus() { if (cm.view.focused) setTimeout(bind(focusInput, cm), 0); } + on(d.scrollbarH, "mousedown", reFocus); + on(d.scrollbarV, "mousedown", reFocus); + // Prevent wrapper from ever scrolling + on(d.wrapper, "scroll", function() { d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; }); + on(window, "resize", function resizeHandler() { + // Might be a text scaling operation, clear size caches. + d.cachedCharWidth = d.cachedTextHeight = null; + clearCaches(cm); + if (d.wrapper.parentNode) updateDisplay(cm, true); + else off(window, "resize", resizeHandler); + }); + + on(d.input, "keyup", operation(cm, function(e) { + if (cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return; + if (e_prop(e, "keyCode") == 16) cm.view.sel.shift = false; + })); + on(d.input, "input", bind(fastPoll, cm)); + on(d.input, "keydown", operation(cm, onKeyDown)); + on(d.input, "keypress", operation(cm, onKeyPress)); + on(d.input, "focus", bind(onFocus, cm)); + on(d.input, "blur", bind(onBlur, cm)); + + function drag_(e) { + if (cm.options.onDragEvent && cm.options.onDragEvent(cm, addStop(e))) return; + e_stop(e); + } + if (cm.options.dragDrop) { + on(d.scroller, "dragstart", function(e){onDragStart(cm, e);}); + on(d.scroller, "dragenter", drag_); + on(d.scroller, "dragover", drag_); + on(d.scroller, "drop", operation(cm, onDrop)); + } + on(d.scroller, "paste", function(){focusInput(cm); fastPoll(cm);}); + on(d.input, "paste", function() { + d.pasteIncoming = true; + fastPoll(cm); + }); + + function prepareCopy() { + if (d.inaccurateSelection) { + d.prevInput = ""; + d.inaccurateSelection = false; + d.input.value = cm.getSelection(); + selectInput(d.input); + } + } + on(d.input, "cut", prepareCopy); + on(d.input, "copy", prepareCopy); + + // Needed to handle Tab key in KHTML + if (khtml) on(d.sizer, "mouseup", function() { + if (document.activeElement == d.input) d.input.blur(); + focusInput(cm); + }); + } + + function mouseEventInWidget(display, e) { + for (var n = e_target(e); n != display.wrapper; n = n.parentNode) + if (/\bCodeMirror-(?:line)?widget\b/.test(n.className) || + n.parentNode == display.sizer && n != display.mover) return true; + } + + function posFromMouse(cm, e, liberal) { + var display = cm.display; + if (!liberal) { + var target = e_target(e); + if (target == display.scrollbarH || target == display.scrollbarH.firstChild || + target == display.scrollbarV || target == display.scrollbarV.firstChild || + target == display.scrollbarFiller) return null; + } + var x, y, space = display.lineSpace.getBoundingClientRect(); + // Fails unpredictably on IE[67] when mouse is dragged around quickly. + try { x = e.clientX; y = e.clientY; } catch (e) { return null; } + return coordsChar(cm, x - space.left, y - space.top); + } + + var lastClick, lastDoubleClick; + function onMouseDown(e) { + var cm = this, display = cm.display, view = cm.view, sel = view.sel, doc = view.doc; + sel.shift = e_prop(e, "shiftKey"); + + if (mouseEventInWidget(display, e)) { + if (!webkit) { + display.scroller.draggable = false; + setTimeout(function(){display.scroller.draggable = true;}, 100); + } + return; + } + if (clickInGutter(cm, e)) return; + var start = posFromMouse(cm, e); + + switch (e_button(e)) { + case 3: + if (gecko) onContextMenu.call(cm, cm, e); + return; + case 2: + if (start) extendSelection(cm, start); + setTimeout(bind(focusInput, cm), 20); + e_preventDefault(e); + return; + } + // For button 1, if it was clicked inside the editor + // (posFromMouse returning non-null), we have to adjust the + // selection. + if (!start) {if (e_target(e) == display.scroller) e_preventDefault(e); return;} + + if (!view.focused) onFocus(cm); + + var now = +new Date, type = "single"; + if (lastDoubleClick && lastDoubleClick.time > now - 400 && posEq(lastDoubleClick.pos, start)) { + type = "triple"; + e_preventDefault(e); + setTimeout(bind(focusInput, cm), 20); + selectLine(cm, start.line); + } else if (lastClick && lastClick.time > now - 400 && posEq(lastClick.pos, start)) { + type = "double"; + lastDoubleClick = {time: now, pos: start}; + e_preventDefault(e); + var word = findWordAt(getLine(doc, start.line).text, start); + extendSelection(cm, word.from, word.to); + } else { lastClick = {time: now, pos: start}; } + + var last = start; + if (cm.options.dragDrop && dragAndDrop && !isReadOnly(cm) && !posEq(sel.from, sel.to) && + !posLess(start, sel.from) && !posLess(sel.to, start) && type == "single") { + var dragEnd = operation(cm, function(e2) { + if (webkit) display.scroller.draggable = false; + view.draggingText = false; + off(document, "mouseup", dragEnd); + off(display.scroller, "drop", dragEnd); + if (Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) < 10) { + e_preventDefault(e2); + extendSelection(cm, start); + focusInput(cm); + } + }); + // Let the drag handler handle this. + if (webkit) display.scroller.draggable = true; + view.draggingText = dragEnd; + // IE's approach to draggable + if (display.scroller.dragDrop) display.scroller.dragDrop(); + on(document, "mouseup", dragEnd); + on(display.scroller, "drop", dragEnd); + return; + } + e_preventDefault(e); + if (type == "single") extendSelection(cm, clipPos(doc, start)); + + var startstart = sel.from, startend = sel.to; + + function doSelect(cur) { + if (type == "single") { + extendSelection(cm, clipPos(doc, start), cur); + return; + } + + startstart = clipPos(doc, startstart); + startend = clipPos(doc, startend); + if (type == "double") { + var word = findWordAt(getLine(doc, cur.line).text, cur); + if (posLess(cur, startstart)) extendSelection(cm, word.from, startend); + else extendSelection(cm, startstart, word.to); + } else if (type == "triple") { + if (posLess(cur, startstart)) extendSelection(cm, startend, clipPos(doc, {line: cur.line, ch: 0})); + else extendSelection(cm, startstart, clipPos(doc, {line: cur.line + 1, ch: 0})); + } + } + + var editorSize = display.wrapper.getBoundingClientRect(); + // Used to ensure timeout re-tries don't fire when another extend + // happened in the meantime (clearTimeout isn't reliable -- at + // least on Chrome, the timeouts still happen even when cleared, + // if the clear happens after their scheduled firing time). + var counter = 0; + + function extend(e) { + var curCount = ++counter; + var cur = posFromMouse(cm, e, true); + if (!cur) return; + if (!posEq(cur, last)) { + if (!view.focused) onFocus(cm); + last = cur; + doSelect(cur); + var visible = visibleLines(display, doc); + if (cur.line >= visible.to || cur.line < visible.from) + setTimeout(operation(cm, function(){if (counter == curCount) extend(e);}), 150); + } else { + var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0; + if (outside) setTimeout(operation(cm, function() { + if (counter != curCount) return; + display.scroller.scrollTop += outside; + extend(e); + }), 50); + } + } + + function done(e) { + counter = Infinity; + var cur = posFromMouse(cm, e); + if (cur) doSelect(cur); + e_preventDefault(e); + focusInput(cm); + off(document, "mousemove", move); + off(document, "mouseup", up); + } + + var move = operation(cm, function(e) { + if (!ie && !e_button(e)) done(e); + else extend(e); + }); + var up = operation(cm, done); + on(document, "mousemove", move); + on(document, "mouseup", up); + } + + function onDrop(e) { + var cm = this; + if (cm.options.onDragEvent && cm.options.onDragEvent(cm, addStop(e))) return; + e_preventDefault(e); + var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files; + if (!pos || isReadOnly(cm)) return; + if (files && files.length && window.FileReader && window.File) { + var n = files.length, text = Array(n), read = 0; + var loadFile = function(file, i) { + var reader = new FileReader; + reader.onload = function() { + text[i] = reader.result; + if (++read == n) { + pos = clipPos(cm.view.doc, pos); + operation(cm, function() { + var end = replaceRange(cm, text.join(""), pos, pos, "paste"); + setSelection(cm, pos, end); + })(); + } + }; + reader.readAsText(file); + }; + for (var i = 0; i < n; ++i) loadFile(files[i], i); + } else { + // Don't do a replace if the drop happened inside of the selected text. + if (cm.view.draggingText && !(posLess(pos, cm.view.sel.from) || posLess(cm.view.sel.to, pos))) { + cm.view.draggingText(e); + if (ie) setTimeout(bind(focusInput, cm), 50); + return; + } + try { + var text = e.dataTransfer.getData("Text"); + if (text) { + var curFrom = cm.view.sel.from, curTo = cm.view.sel.to; + setSelection(cm, pos, pos); + if (cm.view.draggingText) replaceRange(cm, "", curFrom, curTo, "paste"); + cm.replaceSelection(text, null, "paste"); + focusInput(cm); + onFocus(cm); + } + } + catch(e){} + } + } + + function clickInGutter(cm, e) { + var display = cm.display; + try { var mX = e.clientX, mY = e.clientY; } + catch(e) { return false; } + + if (mX >= Math.floor(display.gutters.getBoundingClientRect().right)) return false; + e_preventDefault(e); + if (!hasHandler(cm, "gutterClick")) return true; + + var lineBox = display.lineDiv.getBoundingClientRect(); + if (mY > lineBox.bottom) return true; + mY -= lineBox.top - display.viewOffset; + + for (var i = 0; i < cm.options.gutters.length; ++i) { + var g = display.gutters.childNodes[i]; + if (g && g.getBoundingClientRect().right >= mX) { + var line = lineAtHeight(cm.view.doc, mY); + var gutter = cm.options.gutters[i]; + signalLater(cm, cm, "gutterClick", cm, line, gutter, e); + break; + } + } + return true; + } + + function onDragStart(cm, e) { + var txt = cm.getSelection(); + e.dataTransfer.setData("Text", txt); + + // Use dummy image instead of default browsers image. + // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there. + if (e.dataTransfer.setDragImage && !safari) + e.dataTransfer.setDragImage(elt('img'), 0, 0); + } + + function setScrollTop(cm, val) { + if (Math.abs(cm.view.scrollTop - val) < 2) return; + cm.view.scrollTop = val; + if (!gecko) updateDisplay(cm, [], val); + if (cm.display.scroller.scrollTop != val) cm.display.scroller.scrollTop = val; + if (cm.display.scrollbarV.scrollTop != val) cm.display.scrollbarV.scrollTop = val; + if (gecko) updateDisplay(cm, []); + } + function setScrollLeft(cm, val, isScroller) { + if (isScroller ? val == cm.view.scrollLeft : Math.abs(cm.view.scrollLeft - val) < 2) return; + cm.view.scrollLeft = val; + alignHorizontally(cm); + if (cm.display.scroller.scrollLeft != val) cm.display.scroller.scrollLeft = val; + if (cm.display.scrollbarH.scrollLeft != val) cm.display.scrollbarH.scrollLeft = val; + } + + // Since the delta values reported on mouse wheel events are + // unstandardized between browsers and even browser versions, and + // generally horribly unpredictable, this code starts by measuring + // the scroll effect that the first few mouse wheel events have, + // and, from that, detects the way it can convert deltas to pixel + // offsets afterwards. + // + // The reason we want to know the amount a wheel event will scroll + // is that it gives us a chance to update the display before the + // actual scrolling happens, reducing flickering. + + var wheelSamples = 0, wheelDX, wheelDY, wheelStartX, wheelStartY, wheelPixelsPerUnit = null; + // Fill in a browser-detected starting value on browsers where we + // know one. These don't have to be accurate -- the result of them + // being wrong would just be a slight flicker on the first wheel + // scroll (if it is large enough). + if (ie) wheelPixelsPerUnit = -.53; + else if (gecko) wheelPixelsPerUnit = 15; + else if (chrome) wheelPixelsPerUnit = -.7; + else if (safari) wheelPixelsPerUnit = -1/3; + + function onScrollWheel(cm, e) { + var dx = e.wheelDeltaX, dy = e.wheelDeltaY; + if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) dx = e.detail; + if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) dy = e.detail; + else if (dy == null) dy = e.wheelDelta; + + // Webkit browsers on OS X abort momentum scrolls when the target + // of the scroll event is removed from the scrollable element. + // This hack (see related code in patchDisplay) makes sure the + // element is kept around. + if (dy && mac && webkit) { + for (var cur = e.target; cur != scroll; cur = cur.parentNode) { + if (cur.lineObj) { + cm.display.currentWheelTarget = cur; + break; + } + } + } + + var scroll = cm.display.scroller; + // On some browsers, horizontal scrolling will cause redraws to + // happen before the gutter has been realigned, causing it to + // wriggle around in a most unseemly way. When we have an + // estimated pixels/delta value, we just handle horizontal + // scrolling entirely here. It'll be slightly off from native, but + // better than glitching out. + if (dx && !gecko && !opera && wheelPixelsPerUnit != null) { + if (dy) + setScrollTop(cm, Math.max(0, Math.min(scroll.scrollTop + dy * wheelPixelsPerUnit, scroll.scrollHeight - scroll.clientHeight))); + setScrollLeft(cm, Math.max(0, Math.min(scroll.scrollLeft + dx * wheelPixelsPerUnit, scroll.scrollWidth - scroll.clientWidth))); + e_preventDefault(e); + wheelStartX = null; // Abort measurement, if in progress + return; + } + + if (dy && wheelPixelsPerUnit != null) { + var pixels = dy * wheelPixelsPerUnit; + var top = cm.view.scrollTop, bot = top + cm.display.wrapper.clientHeight; + if (pixels < 0) top = Math.max(0, top + pixels - 50); + else bot = Math.min(cm.view.doc.height, bot + pixels + 50); + updateDisplay(cm, [], {top: top, bottom: bot}); + } + + if (wheelSamples < 20) { + if (wheelStartX == null) { + wheelStartX = scroll.scrollLeft; wheelStartY = scroll.scrollTop; + wheelDX = dx; wheelDY = dy; + setTimeout(function() { + if (wheelStartX == null) return; + var movedX = scroll.scrollLeft - wheelStartX; + var movedY = scroll.scrollTop - wheelStartY; + var sample = (movedY && wheelDY && movedY / wheelDY) || + (movedX && wheelDX && movedX / wheelDX); + wheelStartX = wheelStartY = null; + if (!sample) return; + wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1); + ++wheelSamples; + }, 200); + } else { + wheelDX += dx; wheelDY += dy; + } + } + } + + function doHandleBinding(cm, bound, dropShift) { + if (typeof bound == "string") { + bound = commands[bound]; + if (!bound) return false; + } + // Ensure previous input has been read, so that the handler sees a + // consistent view of the document + if (cm.display.pollingFast && readInput(cm)) cm.display.pollingFast = false; + var view = cm.view, prevShift = view.sel.shift; + try { + if (isReadOnly(cm)) view.suppressEdits = true; + if (dropShift) view.sel.shift = false; + bound(cm); + } catch(e) { + if (e != Pass) throw e; + return false; + } finally { + view.sel.shift = prevShift; + view.suppressEdits = false; + } + return true; + } + + function allKeyMaps(cm) { + var maps = cm.view.keyMaps.slice(0); + maps.push(cm.options.keyMap); + if (cm.options.extraKeys) maps.unshift(cm.options.extraKeys); + return maps; + } + + var maybeTransition; + function handleKeyBinding(cm, e) { + // Handle auto keymap transitions + var startMap = getKeyMap(cm.options.keyMap), next = startMap.auto; + clearTimeout(maybeTransition); + if (next && !isModifierKey(e)) maybeTransition = setTimeout(function() { + if (getKeyMap(cm.options.keyMap) == startMap) + cm.options.keyMap = (next.call ? next.call(null, cm) : next); + }, 50); + + var name = keyNames[e_prop(e, "keyCode")], handled = false; + var flipCtrlCmd = mac && (opera || qtwebkit); + if (name == null || e.altGraphKey) return false; + if (e_prop(e, "altKey")) name = "Alt-" + name; + if (e_prop(e, flipCtrlCmd ? "metaKey" : "ctrlKey")) name = "Ctrl-" + name; + if (e_prop(e, flipCtrlCmd ? "ctrlKey" : "metaKey")) name = "Cmd-" + name; + + var stopped = false; + function stop() { stopped = true; } + var keymaps = allKeyMaps(cm); + + if (e_prop(e, "shiftKey")) { + handled = lookupKey("Shift-" + name, keymaps, + function(b) {return doHandleBinding(cm, b, true);}, stop) + || lookupKey(name, keymaps, function(b) { + if (typeof b == "string" && /^go[A-Z]/.test(b)) return doHandleBinding(cm, b); + }, stop); + } else { + handled = lookupKey(name, keymaps, + function(b) { return doHandleBinding(cm, b); }, stop); + } + if (stopped) handled = false; + if (handled) { + e_preventDefault(e); + restartBlink(cm); + if (ie_lt9) { e.oldKeyCode = e.keyCode; e.keyCode = 0; } + } + return handled; + } + + function handleCharBinding(cm, e, ch) { + var handled = lookupKey("'" + ch + "'", allKeyMaps(cm), + function(b) { return doHandleBinding(cm, b, true); }); + if (handled) { + e_preventDefault(e); + restartBlink(cm); + } + return handled; + } + + var lastStoppedKey = null; + function onKeyDown(e) { + var cm = this; + if (!cm.view.focused) onFocus(cm); + if (ie && e.keyCode == 27) { e.returnValue = false; } + if (cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return; + var code = e_prop(e, "keyCode"); + // IE does strange things with escape. + cm.view.sel.shift = code == 16 || e_prop(e, "shiftKey"); + // First give onKeyEvent option a chance to handle this. + var handled = handleKeyBinding(cm, e); + if (opera) { + lastStoppedKey = handled ? code : null; + // Opera has no cut event... we try to at least catch the key combo + if (!handled && code == 88 && !hasCopyEvent && e_prop(e, mac ? "metaKey" : "ctrlKey")) + cm.replaceSelection(""); + } + } + + function onKeyPress(e) { + var cm = this; + if (cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return; + var keyCode = e_prop(e, "keyCode"), charCode = e_prop(e, "charCode"); + if (opera && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return;} + if (((opera && (!e.which || e.which < 10)) || khtml) && handleKeyBinding(cm, e)) return; + var ch = String.fromCharCode(charCode == null ? keyCode : charCode); + if (this.options.electricChars && this.view.mode.electricChars && + this.options.smartIndent && !isReadOnly(this) && + this.view.mode.electricChars.indexOf(ch) > -1) + setTimeout(operation(cm, function() {indentLine(cm, cm.view.sel.to.line, "smart");}), 75); + if (handleCharBinding(cm, e, ch)) return; + fastPoll(cm); + } + + function onFocus(cm) { + if (cm.options.readOnly == "nocursor") return; + if (!cm.view.focused) { + signal(cm, "focus", cm); + cm.view.focused = true; + if (cm.display.scroller.className.search(/\bCodeMirror-focused\b/) == -1) + cm.display.scroller.className += " CodeMirror-focused"; + resetInput(cm, true); + } + slowPoll(cm); + restartBlink(cm); + } + function onBlur(cm) { + if (cm.view.focused) { + signal(cm, "blur", cm); + cm.view.focused = false; + cm.display.scroller.className = cm.display.scroller.className.replace(" CodeMirror-focused", ""); + } + clearInterval(cm.display.blinker); + setTimeout(function() {if (!cm.view.focused) cm.view.sel.shift = false;}, 150); + } + + var detectingSelectAll; + function onContextMenu(cm, e) { + var display = cm.display, sel = cm.view.sel; + var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop; + if (!pos || opera) return; // Opera is difficult. + if (posEq(sel.from, sel.to) || posLess(pos, sel.from) || !posLess(pos, sel.to)) + operation(cm, setSelection)(cm, pos, pos); + + var oldCSS = display.input.style.cssText; + display.inputDiv.style.position = "absolute"; + display.input.style.cssText = "position: fixed; width: 30px; height: 30px; top: " + (e.clientY - 5) + + "px; left: " + (e.clientX - 5) + "px; z-index: 1000; background: white; outline: none;" + + "border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);"; + focusInput(cm); + resetInput(cm, true); + // Adds "Select all" to context menu in FF + if (posEq(sel.from, sel.to)) display.input.value = display.prevInput = " "; + + function rehide() { + display.inputDiv.style.position = "relative"; + display.input.style.cssText = oldCSS; + if (ie_lt9) display.scrollbarV.scrollTop = display.scroller.scrollTop = scrollPos; + slowPoll(cm); + + // Try to detect the user choosing select-all + if (display.input.selectionStart != null) { + clearTimeout(detectingSelectAll); + var extval = display.input.value = " " + (posEq(sel.from, sel.to) ? "" : display.input.value), i = 0; + display.prevInput = " "; + display.input.selectionStart = 1; display.input.selectionEnd = extval.length; + detectingSelectAll = setTimeout(function poll(){ + if (display.prevInput == " " && display.input.selectionStart == 0) + operation(cm, commands.selectAll)(cm); + else if (i++ < 10) detectingSelectAll = setTimeout(poll, 500); + else resetInput(cm); + }, 200); + } + } + + if (gecko) { + e_stop(e); + on(window, "mouseup", function mouseup() { + off(window, "mouseup", mouseup); + setTimeout(rehide, 20); + }); + } else { + setTimeout(rehide, 50); + } + } + + // UPDATING + + // Replace the range from from to to by the strings in newText. + // Afterwards, set the selection to selFrom, selTo. + function updateDoc(cm, from, to, newText, selUpdate, origin) { + // Possibly split or suppress the update based on the presence + // of read-only spans in its range. + var split = sawReadOnlySpans && + removeReadOnlyRanges(cm.view.doc, from, to); + if (split) { + for (var i = split.length - 1; i >= 1; --i) + updateDocInner(cm, split[i].from, split[i].to, [""], origin); + if (split.length) + return updateDocInner(cm, split[0].from, split[0].to, newText, selUpdate, origin); + } else { + return updateDocInner(cm, from, to, newText, selUpdate, origin); + } + } + + function updateDocInner(cm, from, to, newText, selUpdate, origin) { + if (cm.view.suppressEdits) return; + + var view = cm.view, doc = view.doc, old = []; + doc.iter(from.line, to.line + 1, function(line) { + old.push(newHL(line.text, line.markedSpans)); + }); + var startSelFrom = view.sel.from, startSelTo = view.sel.to; + var lines = updateMarkedSpans(hlSpans(old[0]), hlSpans(lst(old)), from.ch, to.ch, newText); + var retval = updateDocNoUndo(cm, from, to, lines, selUpdate, origin); + if (view.history) addChange(cm, from.line, newText.length, old, origin, + startSelFrom, startSelTo, view.sel.from, view.sel.to); + return retval; + } + + function unredoHelper(cm, type) { + var doc = cm.view.doc, hist = cm.view.history; + var set = (type == "undo" ? hist.done : hist.undone).pop(); + if (!set) return; + var anti = {events: [], fromBefore: set.fromAfter, toBefore: set.toAfter, + fromAfter: set.fromBefore, toAfter: set.toBefore}; + for (var i = set.events.length - 1; i >= 0; i -= 1) { + hist.dirtyCounter += type == "undo" ? -1 : 1; + var change = set.events[i]; + var replaced = [], end = change.start + change.added; + doc.iter(change.start, end, function(line) { replaced.push(newHL(line.text, line.markedSpans)); }); + anti.events.push({start: change.start, added: change.old.length, old: replaced}); + var selPos = i ? null : {from: set.fromBefore, to: set.toBefore}; + updateDocNoUndo(cm, {line: change.start, ch: 0}, {line: end - 1, ch: getLine(doc, end-1).text.length}, + change.old, selPos, type); + } + (type == "undo" ? hist.undone : hist.done).push(anti); + } + + function updateDocNoUndo(cm, from, to, lines, selUpdate, origin) { + var view = cm.view, doc = view.doc, display = cm.display; + if (view.suppressEdits) return; + + var nlines = to.line - from.line, firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line); + var recomputeMaxLength = false, checkWidthStart = from.line; + if (!cm.options.lineWrapping) { + checkWidthStart = lineNo(visualLine(doc, firstLine)); + doc.iter(checkWidthStart, to.line + 1, function(line) { + if (lineLength(doc, line) == view.maxLineLength) { + recomputeMaxLength = true; + return true; + } + }); + } + + var lastHL = lst(lines), th = textHeight(display); + + // First adjust the line structure + if (from.ch == 0 && to.ch == 0 && hlText(lastHL) == "") { + // This is a whole-line replace. Treated specially to make + // sure line objects move the way they are supposed to. + var added = []; + for (var i = 0, e = lines.length - 1; i < e; ++i) + added.push(makeLine(hlText(lines[i]), hlSpans(lines[i]), th)); + updateLine(cm, lastLine, lastLine.text, hlSpans(lastHL)); + if (nlines) doc.remove(from.line, nlines, cm); + if (added.length) doc.insert(from.line, added); + } else if (firstLine == lastLine) { + if (lines.length == 1) { + updateLine(cm, firstLine, firstLine.text.slice(0, from.ch) + hlText(lines[0]) + + firstLine.text.slice(to.ch), hlSpans(lines[0])); + } else { + for (var added = [], i = 1, e = lines.length - 1; i < e; ++i) + added.push(makeLine(hlText(lines[i]), hlSpans(lines[i]), th)); + added.push(makeLine(hlText(lastHL) + firstLine.text.slice(to.ch), hlSpans(lastHL), th)); + updateLine(cm, firstLine, firstLine.text.slice(0, from.ch) + hlText(lines[0]), hlSpans(lines[0])); + doc.insert(from.line + 1, added); + } + } else if (lines.length == 1) { + updateLine(cm, firstLine, firstLine.text.slice(0, from.ch) + hlText(lines[0]) + + lastLine.text.slice(to.ch), hlSpans(lines[0])); + doc.remove(from.line + 1, nlines, cm); + } else { + var added = []; + updateLine(cm, firstLine, firstLine.text.slice(0, from.ch) + hlText(lines[0]), hlSpans(lines[0])); + updateLine(cm, lastLine, hlText(lastHL) + lastLine.text.slice(to.ch), hlSpans(lastHL)); + for (var i = 1, e = lines.length - 1; i < e; ++i) + added.push(makeLine(hlText(lines[i]), hlSpans(lines[i]), th)); + if (nlines > 1) doc.remove(from.line + 1, nlines - 1, cm); + doc.insert(from.line + 1, added); + } + + if (cm.options.lineWrapping) { + var perLine = Math.max(5, display.scroller.clientWidth / charWidth(display) - 3); + doc.iter(from.line, from.line + lines.length, function(line) { + if (line.height == 0) return; + var guess = (Math.ceil(line.text.length / perLine) || 1) * th; + if (guess != line.height) updateLineHeight(line, guess); + }); + } else { + doc.iter(checkWidthStart, from.line + lines.length, function(line) { + var len = lineLength(doc, line); + if (len > view.maxLineLength) { + view.maxLine = line; + view.maxLineLength = len; + view.maxLineChanged = true; + recomputeMaxLength = false; + } + }); + if (recomputeMaxLength) cm.curOp.updateMaxLine = true; + } + + // Adjust frontier, schedule worker + view.frontier = Math.min(view.frontier, from.line); + startWorker(cm, 400); + + var lendiff = lines.length - nlines - 1; + // Remember that these lines changed, for updating the display + regChange(cm, from.line, to.line + 1, lendiff); + if (hasHandler(cm, "change")) { + // Normalize lines to contain only strings, since that's what + // the change event handler expects + for (var i = 0; i < lines.length; ++i) + if (typeof lines[i] != "string") lines[i] = lines[i].text; + var changeObj = {from: from, to: to, text: lines, origin: origin}; + if (cm.curOp.textChanged) { + for (var cur = cm.curOp.textChanged; cur.next; cur = cur.next) {} + cur.next = changeObj; + } else cm.curOp.textChanged = changeObj; + } + + // Update the selection + var newSelFrom, newSelTo, end = {line: from.line + lines.length - 1, + ch: hlText(lastHL).length + (lines.length == 1 ? from.ch : 0)}; + if (selUpdate && typeof selUpdate != "string") { + if (selUpdate.from) { newSelFrom = selUpdate.from; newSelTo = selUpdate.to; } + else newSelFrom = newSelTo = selUpdate; + } else if (selUpdate == "end") { + newSelFrom = newSelTo = end; + } else if (selUpdate == "start") { + newSelFrom = newSelTo = from; + } else if (selUpdate == "around") { + newSelFrom = from; newSelTo = end; + } else { + var adjustPos = function(pos) { + if (posLess(pos, from)) return pos; + if (!posLess(to, pos)) return end; + var line = pos.line + lendiff; + var ch = pos.ch; + if (pos.line == to.line) + ch += hlText(lastHL).length - (to.ch - (to.line == from.line ? from.ch : 0)); + return {line: line, ch: ch}; + }; + newSelFrom = adjustPos(view.sel.from); + newSelTo = adjustPos(view.sel.to); + } + setSelection(cm, newSelFrom, newSelTo, null, true); + return end; + } + + function replaceRange(cm, code, from, to, origin) { + if (!to) to = from; + if (posLess(to, from)) { var tmp = to; to = from; from = tmp; } + return updateDoc(cm, from, to, splitLines(code), null, origin); + } + + // SELECTION + + function posEq(a, b) {return a.line == b.line && a.ch == b.ch;} + function posLess(a, b) {return a.line < b.line || (a.line == b.line && a.ch < b.ch);} + function copyPos(x) {return {line: x.line, ch: x.ch};} + + function clipLine(doc, n) {return Math.max(0, Math.min(n, doc.size-1));} + function clipPos(doc, pos) { + if (pos.line < 0) return {line: 0, ch: 0}; + if (pos.line >= doc.size) return {line: doc.size-1, ch: getLine(doc, doc.size-1).text.length}; + var ch = pos.ch, linelen = getLine(doc, pos.line).text.length; + if (ch == null || ch > linelen) return {line: pos.line, ch: linelen}; + else if (ch < 0) return {line: pos.line, ch: 0}; + else return pos; + } + function isLine(doc, l) {return l >= 0 && l < doc.size;} + + // If shift is held, this will move the selection anchor. Otherwise, + // it'll set the whole selection. + function extendSelection(cm, pos, other, bias) { + var sel = cm.view.sel; + if (sel.shift || sel.extend) { + var anchor = sel.anchor; + if (other) { + var posBefore = posLess(pos, anchor); + if (posBefore != posLess(other, anchor)) { + anchor = pos; + pos = other; + } else if (posBefore != posLess(pos, other)) { + pos = other; + } + } + setSelection(cm, anchor, pos, bias); + } else { + setSelection(cm, pos, other || pos, bias); + } + cm.curOp.userSelChange = true; + } + + // Update the selection. Last two args are only used by + // updateDoc, since they have to be expressed in the line + // numbers before the update. + function setSelection(cm, anchor, head, bias, checkAtomic) { + cm.view.goalColumn = null; + var sel = cm.view.sel; + // Skip over atomic spans. + if (checkAtomic || !posEq(anchor, sel.anchor)) + anchor = skipAtomic(cm, anchor, bias, checkAtomic != "push"); + if (checkAtomic || !posEq(head, sel.head)) + head = skipAtomic(cm, head, bias, checkAtomic != "push"); + + if (posEq(sel.anchor, anchor) && posEq(sel.head, head)) return; + + sel.anchor = anchor; sel.head = head; + var inv = posLess(head, anchor); + sel.from = inv ? head : anchor; + sel.to = inv ? anchor : head; + + cm.curOp.updateInput = true; + cm.curOp.selectionChanged = true; + } + + function reCheckSelection(cm) { + setSelection(cm, cm.view.sel.from, cm.view.sel.to, null, "push"); + } + + function skipAtomic(cm, pos, bias, mayClear) { + var doc = cm.view.doc, flipped = false, curPos = pos; + var dir = bias || 1; + cm.view.cantEdit = false; + search: for (;;) { + var line = getLine(doc, curPos.line), toClear; + if (line.markedSpans) { + for (var i = 0; i < line.markedSpans.length; ++i) { + var sp = line.markedSpans[i], m = sp.marker; + if ((sp.from == null || (m.inclusiveLeft ? sp.from <= curPos.ch : sp.from < curPos.ch)) && + (sp.to == null || (m.inclusiveRight ? sp.to >= curPos.ch : sp.to > curPos.ch))) { + if (mayClear && m.clearOnEnter) { + (toClear || (toClear = [])).push(m); + continue; + } else if (!m.atomic) continue; + var newPos = m.find()[dir < 0 ? "from" : "to"]; + if (posEq(newPos, curPos)) { + newPos.ch += dir; + if (newPos.ch < 0) { + if (newPos.line) newPos = clipPos(doc, {line: newPos.line - 1}); + else newPos = null; + } else if (newPos.ch > line.text.length) { + if (newPos.line < doc.size - 1) newPos = {line: newPos.line + 1, ch: 0}; + else newPos = null; + } + if (!newPos) { + if (flipped) { + // Driven in a corner -- no valid cursor position found at all + // -- try again *with* clearing, if we didn't already + if (!mayClear) return skipAtomic(cm, pos, bias, true); + // Otherwise, turn off editing until further notice, and return the start of the doc + cm.view.cantEdit = true; + return {line: 0, ch: 0}; + } + flipped = true; newPos = pos; dir = -dir; + } + } + curPos = newPos; + continue search; + } + } + if (toClear) for (var i = 0; i < toClear.length; ++i) toClear[i].clear(); + } + return curPos; + } + } + + // SCROLLING + + function scrollCursorIntoView(cm) { + var view = cm.view; + var coords = scrollPosIntoView(cm, view.sel.head); + if (!view.focused) return; + var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null; + if (coords.top + box.top < 0) doScroll = true; + else if (coords.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) doScroll = false; + if (doScroll != null && !phantom) { + var hidden = display.cursor.style.display == "none"; + if (hidden) { + display.cursor.style.display = ""; + display.cursor.style.left = coords.left + "px"; + display.cursor.style.top = (coords.top - display.viewOffset) + "px"; + } + display.cursor.scrollIntoView(doScroll); + if (hidden) display.cursor.style.display = "none"; + } + } + + function scrollPosIntoView(cm, pos) { + for (;;) { + var changed = false, coords = cursorCoords(cm, pos); + var scrollPos = calculateScrollPos(cm, coords.left, coords.top, coords.left, coords.bottom); + var startTop = cm.view.scrollTop, startLeft = cm.view.scrollLeft; + if (scrollPos.scrollTop != null) { + setScrollTop(cm, scrollPos.scrollTop); + if (Math.abs(cm.view.scrollTop - startTop) > 1) changed = true; + } + if (scrollPos.scrollLeft != null) { + setScrollLeft(cm, scrollPos.scrollLeft); + if (Math.abs(cm.view.scrollLeft - startLeft) > 1) changed = true; + } + if (!changed) return coords; + } + } + + function scrollIntoView(cm, x1, y1, x2, y2) { + var scrollPos = calculateScrollPos(cm, x1, y1, x2, y2); + if (scrollPos.scrollTop != null) setScrollTop(cm, scrollPos.scrollTop); + if (scrollPos.scrollLeft != null) setScrollLeft(cm, scrollPos.scrollLeft); + } + + function calculateScrollPos(cm, x1, y1, x2, y2) { + var display = cm.display, pt = paddingTop(display); + y1 += pt; y2 += pt; + var screen = display.scroller.clientHeight - scrollerCutOff, screentop = display.scroller.scrollTop, result = {}; + var docBottom = cm.view.doc.height + 2 * pt; + var atTop = y1 < pt + 10, atBottom = y2 + pt > docBottom - 10; + if (y1 < screentop) result.scrollTop = atTop ? 0 : Math.max(0, y1); + else if (y2 > screentop + screen) result.scrollTop = (atBottom ? docBottom : y2) - screen; + + var screenw = display.scroller.clientWidth - scrollerCutOff, screenleft = display.scroller.scrollLeft; + x1 += display.gutters.offsetWidth; x2 += display.gutters.offsetWidth; + var gutterw = display.gutters.offsetWidth; + var atLeft = x1 < gutterw + 10; + if (x1 < screenleft + gutterw || atLeft) { + if (atLeft) x1 = 0; + result.scrollLeft = Math.max(0, x1 - 10 - gutterw); + } else if (x2 > screenw + screenleft - 3) { + result.scrollLeft = x2 + 10 - screenw; + } + return result; + } + + // API UTILITIES + + function indentLine(cm, n, how, aggressive) { + var doc = cm.view.doc; + if (!how) how = "add"; + if (how == "smart") { + if (!cm.view.mode.indent) how = "prev"; + else var state = getStateBefore(cm, n); + } + + var tabSize = cm.options.tabSize; + var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize); + var curSpaceString = line.text.match(/^\s*/)[0], indentation; + if (how == "smart") { + indentation = cm.view.mode.indent(state, line.text.slice(curSpaceString.length), line.text); + if (indentation == Pass) { + if (!aggressive) return; + how = "prev"; + } + } + if (how == "prev") { + if (n) indentation = countColumn(getLine(doc, n-1).text, null, tabSize); + else indentation = 0; + } + else if (how == "add") indentation = curSpace + cm.options.indentUnit; + else if (how == "subtract") indentation = curSpace - cm.options.indentUnit; + indentation = Math.max(0, indentation); + + var indentString = "", pos = 0; + if (cm.options.indentWithTabs) + for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += "\t";} + if (pos < indentation) indentString += spaceStr(indentation - pos); + + if (indentString != curSpaceString) + replaceRange(cm, indentString, {line: n, ch: 0}, {line: n, ch: curSpaceString.length}, "input"); + line.stateAfter = null; + } + + function changeLine(cm, handle, op) { + var no = handle, line = handle, doc = cm.view.doc; + if (typeof handle == "number") line = getLine(doc, clipLine(doc, handle)); + else no = lineNo(handle); + if (no == null) return null; + if (op(line, no)) regChange(cm, no, no + 1); + else return null; + return line; + } + + function findPosH(cm, dir, unit, visually) { + var doc = cm.view.doc, end = cm.view.sel.head, line = end.line, ch = end.ch; + var lineObj = getLine(doc, line); + function findNextLine() { + var l = line + dir; + if (l < 0 || l == doc.size) return false; + line = l; + return lineObj = getLine(doc, l); + } + function moveOnce(boundToLine) { + var next = (visually ? moveVisually : moveLogically)(lineObj, ch, dir, true); + if (next == null) { + if (!boundToLine && findNextLine()) { + if (visually) ch = (dir < 0 ? lineRight : lineLeft)(lineObj); + else ch = dir < 0 ? lineObj.text.length : 0; + } else return false; + } else ch = next; + return true; + } + if (unit == "char") moveOnce(); + else if (unit == "column") moveOnce(true); + else if (unit == "word") { + var sawWord = false; + for (;;) { + if (dir < 0) if (!moveOnce()) break; + if (isWordChar(lineObj.text.charAt(ch))) sawWord = true; + else if (sawWord) {if (dir < 0) {dir = 1; moveOnce();} break;} + if (dir > 0) if (!moveOnce()) break; + } + } + return skipAtomic(cm, {line: line, ch: ch}, dir, true); + } + + function findWordAt(line, pos) { + var start = pos.ch, end = pos.ch; + if (line) { + if (pos.after === false || end == line.length) --start; else ++end; + var startChar = line.charAt(start); + var check = isWordChar(startChar) ? isWordChar : + /\s/.test(startChar) ? function(ch) {return /\s/.test(ch);} : + function(ch) {return !/\s/.test(ch) && !isWordChar(ch);}; + while (start > 0 && check(line.charAt(start - 1))) --start; + while (end < line.length && check(line.charAt(end))) ++end; + } + return {from: {line: pos.line, ch: start}, to: {line: pos.line, ch: end}}; + } + + function selectLine(cm, line) { + extendSelection(cm, {line: line, ch: 0}, clipPos(cm.view.doc, {line: line + 1, ch: 0})); + } + + // PROTOTYPE + + // The publicly visible API. Note that operation(null, f) means + // 'wrap f in an operation, performed on its `this` parameter' + + CodeMirror.prototype = { + getValue: function(lineSep) { + var text = [], doc = this.view.doc; + doc.iter(0, doc.size, function(line) { text.push(line.text); }); + return text.join(lineSep || "\n"); + }, + + setValue: operation(null, function(code) { + var doc = this.view.doc, top = {line: 0, ch: 0}, lastLen = getLine(doc, doc.size-1).text.length; + updateDocInner(this, top, {line: doc.size - 1, ch: lastLen}, splitLines(code), top, top, "setValue"); + }), + + getSelection: function(lineSep) { return this.getRange(this.view.sel.from, this.view.sel.to, lineSep); }, + + replaceSelection: operation(null, function(code, collapse, origin) { + var sel = this.view.sel; + updateDoc(this, sel.from, sel.to, splitLines(code), collapse || "around", origin); + }), + + focus: function(){window.focus(); focusInput(this); onFocus(this); fastPoll(this);}, + + setOption: function(option, value) { + var options = this.options, old = options[option]; + if (options[option] == value && option != "mode") return; + options[option] = value; + if (optionHandlers.hasOwnProperty(option)) + operation(this, optionHandlers[option])(this, value, old); + }, + + getOption: function(option) {return this.options[option];}, + + getMode: function() {return this.view.mode;}, + + addKeyMap: function(map) { + this.view.keyMaps.push(map); + }, + + removeKeyMap: function(map) { + var maps = this.view.keyMaps; + for (var i = 0; i < maps.length; ++i) + if ((typeof map == "string" ? maps[i].name : maps[i]) == map) { + maps.splice(i, 1); + return true; + } + }, + + undo: operation(null, function() {unredoHelper(this, "undo");}), + redo: operation(null, function() {unredoHelper(this, "redo");}), + + indentLine: operation(null, function(n, dir, aggressive) { + if (typeof dir != "string") { + if (dir == null) dir = this.options.smartIndent ? "smart" : "prev"; + else dir = dir ? "add" : "subtract"; + } + if (isLine(this.view.doc, n)) indentLine(this, n, dir, aggressive); + }), + + indentSelection: operation(null, function(how) { + var sel = this.view.sel; + if (posEq(sel.from, sel.to)) return indentLine(this, sel.from.line, how); + var e = sel.to.line - (sel.to.ch ? 0 : 1); + for (var i = sel.from.line; i <= e; ++i) indentLine(this, i, how); + }), + + historySize: function() { + var hist = this.view.history; + return {undo: hist.done.length, redo: hist.undone.length}; + }, + + clearHistory: function() {this.view.history = makeHistory();}, + + markClean: function() { + this.view.history.dirtyCounter = 0; + this.view.history.lastOp = this.view.history.lastOrigin = null; + }, + + isClean: function () {return this.view.history.dirtyCounter == 0;}, + + getHistory: function() { + var hist = this.view.history; + function cp(arr) { + for (var i = 0, nw = [], nwelt; i < arr.length; ++i) { + var set = arr[i]; + nw.push({events: nwelt = [], fromBefore: set.fromBefore, toBefore: set.toBefore, + fromAfter: set.fromAfter, toAfter: set.toAfter}); + for (var j = 0, elt = set.events; j < elt.length; ++j) { + var old = [], cur = elt[j]; + nwelt.push({start: cur.start, added: cur.added, old: old}); + for (var k = 0; k < cur.old.length; ++k) old.push(hlText(cur.old[k])); + } + } + return nw; + } + return {done: cp(hist.done), undone: cp(hist.undone)}; + }, + + setHistory: function(histData) { + var hist = this.view.history = makeHistory(); + hist.done = histData.done; + hist.undone = histData.undone; + }, + + // Fetch the parser token for a given character. Useful for hacks + // that want to inspect the mode state (say, for completion). + getTokenAt: function(pos) { + var doc = this.view.doc; + pos = clipPos(doc, pos); + var state = getStateBefore(this, pos.line), mode = this.view.mode; + var line = getLine(doc, pos.line); + var stream = new StringStream(line.text, this.options.tabSize); + while (stream.pos < pos.ch && !stream.eol()) { + stream.start = stream.pos; + var style = mode.token(stream, state); + } + return {start: stream.start, + end: stream.pos, + string: stream.current(), + className: style || null, // Deprecated, use 'type' instead + type: style || null, + state: state}; + }, + + getStateAfter: function(line) { + var doc = this.view.doc; + line = clipLine(doc, line == null ? doc.size - 1: line); + return getStateBefore(this, line + 1); + }, + + cursorCoords: function(start, mode) { + var pos, sel = this.view.sel; + if (start == null) pos = sel.head; + else if (typeof start == "object") pos = clipPos(this.view.doc, start); + else pos = start ? sel.from : sel.to; + return cursorCoords(this, pos, mode || "page"); + }, + + charCoords: function(pos, mode) { + return charCoords(this, clipPos(this.view.doc, pos), mode || "page"); + }, + + coordsChar: function(coords) { + var off = this.display.lineSpace.getBoundingClientRect(); + return coordsChar(this, coords.left - off.left, coords.top - off.top); + }, + + defaultTextHeight: function() { return textHeight(this.display); }, + + markText: operation(null, function(from, to, options) { + return markText(this, clipPos(this.view.doc, from), clipPos(this.view.doc, to), + options, "range"); + }), + + setBookmark: operation(null, function(pos, widget) { + pos = clipPos(this.view.doc, pos); + return markText(this, pos, pos, widget ? {replacedWith: widget} : {}, "bookmark"); + }), + + findMarksAt: function(pos) { + var doc = this.view.doc; + pos = clipPos(doc, pos); + var markers = [], spans = getLine(doc, pos.line).markedSpans; + if (spans) for (var i = 0; i < spans.length; ++i) { + var span = spans[i]; + if ((span.from == null || span.from <= pos.ch) && + (span.to == null || span.to >= pos.ch)) + markers.push(span.marker); + } + return markers; + }, + + setGutterMarker: operation(null, function(line, gutterID, value) { + return changeLine(this, line, function(line) { + var markers = line.gutterMarkers || (line.gutterMarkers = {}); + markers[gutterID] = value; + if (!value && isEmpty(markers)) line.gutterMarkers = null; + return true; + }); + }), + + clearGutter: operation(null, function(gutterID) { + var i = 0, cm = this, doc = cm.view.doc; + doc.iter(0, doc.size, function(line) { + if (line.gutterMarkers && line.gutterMarkers[gutterID]) { + line.gutterMarkers[gutterID] = null; + regChange(cm, i, i + 1); + if (isEmpty(line.gutterMarkers)) line.gutterMarkers = null; + } + ++i; + }); + }), + + addLineClass: operation(null, function(handle, where, cls) { + return changeLine(this, handle, function(line) { + var prop = where == "text" ? "textClass" : where == "background" ? "bgClass" : "wrapClass"; + if (!line[prop]) line[prop] = cls; + else if (new RegExp("\\b" + cls + "\\b").test(line[prop])) return false; + else line[prop] += " " + cls; + return true; + }); + }), + + removeLineClass: operation(null, function(handle, where, cls) { + return changeLine(this, handle, function(line) { + var prop = where == "text" ? "textClass" : where == "background" ? "bgClass" : "wrapClass"; + var cur = line[prop]; + if (!cur) return false; + else if (cls == null) line[prop] = null; + else { + var upd = cur.replace(new RegExp("^" + cls + "\\b\\s*|\\s*\\b" + cls + "\\b"), ""); + if (upd == cur) return false; + line[prop] = upd || null; + } + return true; + }); + }), + + addLineWidget: operation(null, function(handle, node, options) { + var widget = options || {}; + widget.node = node; + if (widget.noHScroll) this.display.alignWidgets = true; + changeLine(this, handle, function(line) { + (line.widgets || (line.widgets = [])).push(widget); + widget.line = line; + return true; + }); + return widget; + }), + + removeLineWidget: operation(null, function(widget) { + var ws = widget.line.widgets, no = lineNo(widget.line); + if (no == null) return; + for (var i = 0; i < ws.length; ++i) if (ws[i] == widget) ws.splice(i--, 1); + regChange(this, no, no + 1); + }), + + lineInfo: function(line) { + if (typeof line == "number") { + if (!isLine(this.view.doc, line)) return null; + var n = line; + line = getLine(this.view.doc, line); + if (!line) return null; + } else { + var n = lineNo(line); + if (n == null) return null; + } + return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers, + textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass, + widgets: line.widgets}; + }, + + getViewport: function() { return {from: this.display.showingFrom, to: this.display.showingTo};}, + + addWidget: function(pos, node, scroll, vert, horiz) { + var display = this.display; + pos = cursorCoords(this, clipPos(this.view.doc, pos)); + var top = pos.top, left = pos.left; + node.style.position = "absolute"; + display.sizer.appendChild(node); + if (vert == "over") top = pos.top; + else if (vert == "near") { + var vspace = Math.max(display.wrapper.clientHeight, this.view.doc.height), + hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth); + if (pos.bottom + node.offsetHeight > vspace && pos.top > node.offsetHeight) + top = pos.top - node.offsetHeight; + if (left + node.offsetWidth > hspace) + left = hspace - node.offsetWidth; + } + node.style.top = (top + paddingTop(display)) + "px"; + node.style.left = node.style.right = ""; + if (horiz == "right") { + left = display.sizer.clientWidth - node.offsetWidth; + node.style.right = "0px"; + } else { + if (horiz == "left") left = 0; + else if (horiz == "middle") left = (display.sizer.clientWidth - node.offsetWidth) / 2; + node.style.left = left + "px"; + } + if (scroll) + scrollIntoView(this, left, top, left + node.offsetWidth, top + node.offsetHeight); + }, + + lineCount: function() {return this.view.doc.size;}, + + clipPos: function(pos) {return clipPos(this.view.doc, pos);}, + + getCursor: function(start) { + var sel = this.view.sel, pos; + if (start == null || start == "head") pos = sel.head; + else if (start == "anchor") pos = sel.anchor; + else if (start == "end" || start === false) pos = sel.to; + else pos = sel.from; + return copyPos(pos); + }, + + somethingSelected: function() {return !posEq(this.view.sel.from, this.view.sel.to);}, + + setCursor: operation(null, function(line, ch, extend) { + var pos = clipPos(this.view.doc, typeof line == "number" ? {line: line, ch: ch || 0} : line); + if (extend) extendSelection(this, pos); + else setSelection(this, pos, pos); + }), + + setSelection: operation(null, function(anchor, head) { + var doc = this.view.doc; + setSelection(this, clipPos(doc, anchor), clipPos(doc, head || anchor)); + }), + + extendSelection: operation(null, function(from, to) { + var doc = this.view.doc; + extendSelection(this, clipPos(doc, from), to && clipPos(doc, to)); + }), + + setExtending: function(val) {this.view.sel.extend = val;}, + + getLine: function(line) {var l = this.getLineHandle(line); return l && l.text;}, + + getLineHandle: function(line) { + var doc = this.view.doc; + if (isLine(doc, line)) return getLine(doc, line); + }, + + getLineNumber: function(line) {return lineNo(line);}, + + setLine: operation(null, function(line, text) { + if (isLine(this.view.doc, line)) + replaceRange(this, text, {line: line, ch: 0}, {line: line, ch: getLine(this.view.doc, line).text.length}); + }), + + removeLine: operation(null, function(line) { + if (isLine(this.view.doc, line)) + replaceRange(this, "", {line: line, ch: 0}, clipPos(this.view.doc, {line: line+1, ch: 0})); + }), + + replaceRange: operation(null, function(code, from, to) { + var doc = this.view.doc; + from = clipPos(doc, from); + to = to ? clipPos(doc, to) : from; + return replaceRange(this, code, from, to); + }), + + getRange: function(from, to, lineSep) { + var doc = this.view.doc; + from = clipPos(doc, from); to = clipPos(doc, to); + var l1 = from.line, l2 = to.line; + if (l1 == l2) return getLine(doc, l1).text.slice(from.ch, to.ch); + var code = [getLine(doc, l1).text.slice(from.ch)]; + doc.iter(l1 + 1, l2, function(line) { code.push(line.text); }); + code.push(getLine(doc, l2).text.slice(0, to.ch)); + return code.join(lineSep || "\n"); + }, + + triggerOnKeyDown: operation(null, onKeyDown), + + execCommand: function(cmd) {return commands[cmd](this);}, + + // Stuff used by commands, probably not much use to outside code. + moveH: operation(null, function(dir, unit) { + var sel = this.view.sel, pos = dir < 0 ? sel.from : sel.to; + if (sel.shift || sel.extend || posEq(sel.from, sel.to)) pos = findPosH(this, dir, unit, true); + extendSelection(this, pos, pos, dir); + }), + + deleteH: operation(null, function(dir, unit) { + var sel = this.view.sel; + if (!posEq(sel.from, sel.to)) replaceRange(this, "", sel.from, sel.to, "delete"); + else replaceRange(this, "", sel.from, findPosH(this, dir, unit, false), "delete"); + this.curOp.userSelChange = true; + }), + + moveV: operation(null, function(dir, unit) { + var view = this.view, doc = view.doc, display = this.display; + var cur = view.sel.head, pos = cursorCoords(this, cur, "div"); + var x = pos.left, y; + if (view.goalColumn != null) x = view.goalColumn; + if (unit == "page") { + var pageSize = Math.min(display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight); + y = pos.top + dir * pageSize; + } else if (unit == "line") { + y = dir > 0 ? pos.bottom + 3 : pos.top - 3; + } + do { + var target = coordsChar(this, x, y); + y += dir * 5; + } while (target.outside && (dir < 0 ? y > 0 : y < doc.height)); + + if (unit == "page") display.scrollbarV.scrollTop += charCoords(this, target, "div").top - pos.top; + extendSelection(this, target, target, dir); + view.goalColumn = x; + }), + + toggleOverwrite: function() { + if (this.view.overwrite = !this.view.overwrite) + this.display.cursor.className += " CodeMirror-overwrite"; + else + this.display.cursor.className = this.display.cursor.className.replace(" CodeMirror-overwrite", ""); + }, + + posFromIndex: function(off) { + var lineNo = 0, ch, doc = this.view.doc; + doc.iter(0, doc.size, function(line) { + var sz = line.text.length + 1; + if (sz > off) { ch = off; return true; } + off -= sz; + ++lineNo; + }); + return clipPos(doc, {line: lineNo, ch: ch}); + }, + indexFromPos: function (coords) { + if (coords.line < 0 || coords.ch < 0) return 0; + var index = coords.ch; + this.view.doc.iter(0, coords.line, function (line) { + index += line.text.length + 1; + }); + return index; + }, + + scrollTo: function(x, y) { + if (x != null) this.display.scrollbarH.scrollLeft = this.display.scroller.scrollLeft = x; + if (y != null) this.display.scrollbarV.scrollTop = this.display.scroller.scrollTop = y; + updateDisplay(this, []); + }, + getScrollInfo: function() { + var scroller = this.display.scroller, co = scrollerCutOff; + return {left: scroller.scrollLeft, top: scroller.scrollTop, + height: scroller.scrollHeight - co, width: scroller.scrollWidth - co, + clientHeight: scroller.clientHeight - co, clientWidth: scroller.clientWidth - co}; + }, + + scrollIntoView: function(pos) { + if (typeof pos == "number") pos = {line: pos, ch: 0}; + pos = pos ? clipPos(this.view.doc, pos) : this.view.sel.head; + scrollPosIntoView(this, pos); + }, + + setSize: function(width, height) { + function interpret(val) { + return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val; + } + if (width != null) this.display.wrapper.style.width = interpret(width); + if (height != null) this.display.wrapper.style.height = interpret(height); + this.refresh(); + }, + + on: function(type, f) {on(this, type, f);}, + off: function(type, f) {off(this, type, f);}, + + operation: function(f){return operation(this, f)();}, + + refresh: function() { + clearCaches(this); + if (this.display.scroller.scrollHeight > this.view.scrollTop) + this.display.scrollbarV.scrollTop = this.display.scroller.scrollTop = this.view.scrollTop; + updateDisplay(this, true); + }, + + getInputField: function(){return this.display.input;}, + getWrapperElement: function(){return this.display.wrapper;}, + getScrollerElement: function(){return this.display.scroller;}, + getGutterElement: function(){return this.display.gutters;} + }; + + // OPTION DEFAULTS + + var optionHandlers = CodeMirror.optionHandlers = {}; + + // The default configuration options. + var defaults = CodeMirror.defaults = {}; + + function option(name, deflt, handle, notOnInit) { + CodeMirror.defaults[name] = deflt; + if (handle) optionHandlers[name] = + notOnInit ? function(cm, val, old) {if (old != Init) handle(cm, val, old);} : handle; + } + + var Init = CodeMirror.Init = {toString: function(){return "CodeMirror.Init";}}; + + // These two are, on init, called from the constructor because they + // have to be initialized before the editor can start at all. + option("value", "", function(cm, val) {cm.setValue(val);}, true); + option("mode", null, loadMode, true); + + option("indentUnit", 2, loadMode, true); + option("indentWithTabs", false); + option("smartIndent", true); + option("tabSize", 4, function(cm) { + loadMode(cm); + clearCaches(cm); + updateDisplay(cm, true); + }, true); + option("electricChars", true); + + option("theme", "default", function(cm) { + themeChanged(cm); + guttersChanged(cm); + }, true); + option("keyMap", "default", keyMapChanged); + option("extraKeys", null); + + option("onKeyEvent", null); + option("onDragEvent", null); + + option("lineWrapping", false, wrappingChanged, true); + option("gutters", [], function(cm) { + setGuttersForLineNumbers(cm.options); + guttersChanged(cm); + }, true); + option("lineNumbers", false, function(cm) { + setGuttersForLineNumbers(cm.options); + guttersChanged(cm); + }, true); + option("firstLineNumber", 1, guttersChanged, true); + option("lineNumberFormatter", function(integer) {return integer;}, guttersChanged, true); + option("showCursorWhenSelecting", false, updateSelection, true); + + option("readOnly", false, function(cm, val) { + if (val == "nocursor") {onBlur(cm); cm.display.input.blur();} + else if (!val) resetInput(cm, true); + }); + option("dragDrop", true); + + option("cursorBlinkRate", 530); + option("cursorHeight", 1); + option("workTime", 100); + option("workDelay", 100); + option("flattenSpans", true); + option("pollInterval", 100); + option("undoDepth", 40); + option("viewportMargin", 10, function(cm){cm.refresh();}, true); + + option("tabindex", null, function(cm, val) { + cm.display.input.tabIndex = val || ""; + }); + option("autofocus", null); + + // MODE DEFINITION AND QUERYING + + // Known modes, by name and by MIME + var modes = CodeMirror.modes = {}, mimeModes = CodeMirror.mimeModes = {}; + + CodeMirror.defineMode = function(name, mode) { + if (!CodeMirror.defaults.mode && name != "null") CodeMirror.defaults.mode = name; + if (arguments.length > 2) { + mode.dependencies = []; + for (var i = 2; i < arguments.length; ++i) mode.dependencies.push(arguments[i]); + } + modes[name] = mode; + }; + + CodeMirror.defineMIME = function(mime, spec) { + mimeModes[mime] = spec; + }; + + CodeMirror.resolveMode = function(spec) { + if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) + spec = mimeModes[spec]; + else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) + return CodeMirror.resolveMode("application/xml"); + if (typeof spec == "string") return {name: spec}; + else return spec || {name: "null"}; + }; + + CodeMirror.getMode = function(options, spec) { + var spec = CodeMirror.resolveMode(spec); + var mfactory = modes[spec.name]; + if (!mfactory) return CodeMirror.getMode(options, "text/plain"); + var modeObj = mfactory(options, spec); + if (modeExtensions.hasOwnProperty(spec.name)) { + var exts = modeExtensions[spec.name]; + for (var prop in exts) { + if (!exts.hasOwnProperty(prop)) continue; + if (modeObj.hasOwnProperty(prop)) modeObj["_" + prop] = modeObj[prop]; + modeObj[prop] = exts[prop]; + } + } + modeObj.name = spec.name; + return modeObj; + }; + + CodeMirror.defineMode("null", function() { + return {token: function(stream) {stream.skipToEnd();}}; + }); + CodeMirror.defineMIME("text/plain", "null"); + + var modeExtensions = CodeMirror.modeExtensions = {}; + CodeMirror.extendMode = function(mode, properties) { + var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {}); + for (var prop in properties) if (properties.hasOwnProperty(prop)) + exts[prop] = properties[prop]; + }; + + // EXTENSIONS + + CodeMirror.defineExtension = function(name, func) { + CodeMirror.prototype[name] = func; + }; + + CodeMirror.defineOption = option; + + var initHooks = []; + CodeMirror.defineInitHook = function(f) {initHooks.push(f);}; + + // MODE STATE HANDLING + + // Utility functions for working with state. Exported because modes + // sometimes need to do this. + function copyState(mode, state) { + if (state === true) return state; + if (mode.copyState) return mode.copyState(state); + var nstate = {}; + for (var n in state) { + var val = state[n]; + if (val instanceof Array) val = val.concat([]); + nstate[n] = val; + } + return nstate; + } + CodeMirror.copyState = copyState; + + function startState(mode, a1, a2) { + return mode.startState ? mode.startState(a1, a2) : true; + } + CodeMirror.startState = startState; + + CodeMirror.innerMode = function(mode, state) { + while (mode.innerMode) { + var info = mode.innerMode(state); + state = info.state; + mode = info.mode; + } + return info || {mode: mode, state: state}; + }; + + // STANDARD COMMANDS + + var commands = CodeMirror.commands = { + selectAll: function(cm) {cm.setSelection({line: 0, ch: 0}, {line: cm.lineCount() - 1});}, + killLine: function(cm) { + var from = cm.getCursor(true), to = cm.getCursor(false), sel = !posEq(from, to); + if (!sel && cm.getLine(from.line).length == from.ch) + cm.replaceRange("", from, {line: from.line + 1, ch: 0}, "delete"); + else cm.replaceRange("", from, sel ? to : {line: from.line}, "delete"); + }, + deleteLine: function(cm) { + var l = cm.getCursor().line; + cm.replaceRange("", {line: l, ch: 0}, {line: l}, "delete"); + }, + undo: function(cm) {cm.undo();}, + redo: function(cm) {cm.redo();}, + goDocStart: function(cm) {cm.extendSelection({line: 0, ch: 0});}, + goDocEnd: function(cm) {cm.extendSelection({line: cm.lineCount() - 1});}, + goLineStart: function(cm) { + cm.extendSelection(lineStart(cm, cm.getCursor().line)); + }, + goLineStartSmart: function(cm) { + var cur = cm.getCursor(), start = lineStart(cm, cur.line); + var line = cm.getLineHandle(start.line); + var order = getOrder(line); + if (!order || order[0].level == 0) { + var firstNonWS = Math.max(0, line.text.search(/\S/)); + var inWS = cur.line == start.line && cur.ch <= firstNonWS && cur.ch; + cm.extendSelection({line: start.line, ch: inWS ? 0 : firstNonWS}); + } else cm.extendSelection(start); + }, + goLineEnd: function(cm) { + cm.extendSelection(lineEnd(cm, cm.getCursor().line)); + }, + goLineUp: function(cm) {cm.moveV(-1, "line");}, + goLineDown: function(cm) {cm.moveV(1, "line");}, + goPageUp: function(cm) {cm.moveV(-1, "page");}, + goPageDown: function(cm) {cm.moveV(1, "page");}, + goCharLeft: function(cm) {cm.moveH(-1, "char");}, + goCharRight: function(cm) {cm.moveH(1, "char");}, + goColumnLeft: function(cm) {cm.moveH(-1, "column");}, + goColumnRight: function(cm) {cm.moveH(1, "column");}, + goWordLeft: function(cm) {cm.moveH(-1, "word");}, + goWordRight: function(cm) {cm.moveH(1, "word");}, + delCharBefore: function(cm) {cm.deleteH(-1, "char");}, + delCharAfter: function(cm) {cm.deleteH(1, "char");}, + delWordBefore: function(cm) {cm.deleteH(-1, "word");}, + delWordAfter: function(cm) {cm.deleteH(1, "word");}, + indentAuto: function(cm) {cm.indentSelection("smart");}, + indentMore: function(cm) {cm.indentSelection("add");}, + indentLess: function(cm) {cm.indentSelection("subtract");}, + insertTab: function(cm) {cm.replaceSelection("\t", "end", "input");}, + defaultTab: function(cm) { + if (cm.somethingSelected()) cm.indentSelection("add"); + else cm.replaceSelection("\t", "end", "input"); + }, + transposeChars: function(cm) { + var cur = cm.getCursor(), line = cm.getLine(cur.line); + if (cur.ch > 0 && cur.ch < line.length - 1) + cm.replaceRange(line.charAt(cur.ch) + line.charAt(cur.ch - 1), + {line: cur.line, ch: cur.ch - 1}, {line: cur.line, ch: cur.ch + 1}); + }, + newlineAndIndent: function(cm) { + operation(cm, function() { + cm.replaceSelection("\n", "end", "input"); + cm.indentLine(cm.getCursor().line, null, true); + })(); + }, + toggleOverwrite: function(cm) {cm.toggleOverwrite();} + }; + + // STANDARD KEYMAPS + + var keyMap = CodeMirror.keyMap = {}; + keyMap.basic = { + "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown", + "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown", + "Delete": "delCharAfter", "Backspace": "delCharBefore", "Tab": "defaultTab", "Shift-Tab": "indentAuto", + "Enter": "newlineAndIndent", "Insert": "toggleOverwrite" + }; + // Note that the save and find-related commands aren't defined by + // default. Unknown commands are simply ignored. + keyMap.pcDefault = { + "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo", + "Ctrl-Home": "goDocStart", "Alt-Up": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Down": "goDocEnd", + "Ctrl-Left": "goWordLeft", "Ctrl-Right": "goWordRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd", + "Ctrl-Backspace": "delWordBefore", "Ctrl-Delete": "delWordAfter", "Ctrl-S": "save", "Ctrl-F": "find", + "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll", + "Ctrl-[": "indentLess", "Ctrl-]": "indentMore", + fallthrough: "basic" + }; + keyMap.macDefault = { + "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo", + "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goWordLeft", + "Alt-Right": "goWordRight", "Cmd-Left": "goLineStart", "Cmd-Right": "goLineEnd", "Alt-Backspace": "delWordBefore", + "Ctrl-Alt-Backspace": "delWordAfter", "Alt-Delete": "delWordAfter", "Cmd-S": "save", "Cmd-F": "find", + "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll", + "Cmd-[": "indentLess", "Cmd-]": "indentMore", + fallthrough: ["basic", "emacsy"] + }; + keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault; + keyMap.emacsy = { + "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown", + "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd", + "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp", "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore", + "Alt-D": "delWordAfter", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars" + }; + + // KEYMAP DISPATCH + + function getKeyMap(val) { + if (typeof val == "string") return keyMap[val]; + else return val; + } + + function lookupKey(name, maps, handle, stop) { + function lookup(map) { + map = getKeyMap(map); + var found = map[name]; + if (found === false) { + if (stop) stop(); + return true; + } + if (found != null && handle(found)) return true; + if (map.nofallthrough) { + if (stop) stop(); + return true; + } + var fallthrough = map.fallthrough; + if (fallthrough == null) return false; + if (Object.prototype.toString.call(fallthrough) != "[object Array]") + return lookup(fallthrough); + for (var i = 0, e = fallthrough.length; i < e; ++i) { + if (lookup(fallthrough[i])) return true; + } + return false; + } + + for (var i = 0; i < maps.length; ++i) + if (lookup(maps[i])) return true; + } + function isModifierKey(event) { + var name = keyNames[e_prop(event, "keyCode")]; + return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod"; + } + CodeMirror.isModifierKey = isModifierKey; + + // FROMTEXTAREA + + CodeMirror.fromTextArea = function(textarea, options) { + if (!options) options = {}; + options.value = textarea.value; + if (!options.tabindex && textarea.tabindex) + options.tabindex = textarea.tabindex; + // Set autofocus to true if this textarea is focused, or if it has + // autofocus and no other element is focused. + if (options.autofocus == null) { + var hasFocus = document.body; + // doc.activeElement occasionally throws on IE + try { hasFocus = document.activeElement; } catch(e) {} + options.autofocus = hasFocus == textarea || + textarea.getAttribute("autofocus") != null && hasFocus == document.body; + } + + function save() {textarea.value = cm.getValue();} + if (textarea.form) { + // Deplorable hack to make the submit method do the right thing. + on(textarea.form, "submit", save); + var form = textarea.form, realSubmit = form.submit; + try { + form.submit = function wrappedSubmit() { + save(); + form.submit = realSubmit; + form.submit(); + form.submit = wrappedSubmit; + }; + } catch(e) {} + } + + textarea.style.display = "none"; + var cm = CodeMirror(function(node) { + textarea.parentNode.insertBefore(node, textarea.nextSibling); + }, options); + cm.save = save; + cm.getTextArea = function() { return textarea; }; + cm.toTextArea = function() { + save(); + textarea.parentNode.removeChild(cm.getWrapperElement()); + textarea.style.display = ""; + if (textarea.form) { + off(textarea.form, "submit", save); + if (typeof textarea.form.submit == "function") + textarea.form.submit = realSubmit; + } + }; + return cm; + }; + + // STRING STREAM + + // Fed to the mode parsers, provides helper functions to make + // parsers more succinct. + + // The character stream used by a mode's parser. + function StringStream(string, tabSize) { + this.pos = this.start = 0; + this.string = string; + this.tabSize = tabSize || 8; + } + + StringStream.prototype = { + eol: function() {return this.pos >= this.string.length;}, + sol: function() {return this.pos == 0;}, + peek: function() {return this.string.charAt(this.pos) || undefined;}, + next: function() { + if (this.pos < this.string.length) + return this.string.charAt(this.pos++); + }, + eat: function(match) { + var ch = this.string.charAt(this.pos); + if (typeof match == "string") var ok = ch == match; + else var ok = ch && (match.test ? match.test(ch) : match(ch)); + if (ok) {++this.pos; return ch;} + }, + eatWhile: function(match) { + var start = this.pos; + while (this.eat(match)){} + return this.pos > start; + }, + eatSpace: function() { + var start = this.pos; + while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos; + return this.pos > start; + }, + skipToEnd: function() {this.pos = this.string.length;}, + skipTo: function(ch) { + var found = this.string.indexOf(ch, this.pos); + if (found > -1) {this.pos = found; return true;} + }, + backUp: function(n) {this.pos -= n;}, + column: function() {return countColumn(this.string, this.start, this.tabSize);}, + indentation: function() {return countColumn(this.string, null, this.tabSize);}, + match: function(pattern, consume, caseInsensitive) { + if (typeof pattern == "string") { + var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;}; + if (cased(this.string).indexOf(cased(pattern), this.pos) == this.pos) { + if (consume !== false) this.pos += pattern.length; + return true; + } + } else { + var match = this.string.slice(this.pos).match(pattern); + if (match && match.index > 0) return null; + if (match && consume !== false) this.pos += match[0].length; + return match; + } + }, + current: function(){return this.string.slice(this.start, this.pos);} + }; + CodeMirror.StringStream = StringStream; + + // TEXTMARKERS + + function TextMarker(cm, type) { + this.lines = []; + this.type = type; + this.cm = cm; + } + + TextMarker.prototype.clear = function() { + if (this.explicitlyCleared) return; + startOperation(this.cm); + var min = null, max = null; + for (var i = 0; i < this.lines.length; ++i) { + var line = this.lines[i]; + var span = getMarkedSpanFor(line.markedSpans, this); + if (span.to != null) max = lineNo(line); + line.markedSpans = removeMarkedSpan(line.markedSpans, span); + if (span.from != null) + min = lineNo(line); + else if (this.collapsed && !lineIsHidden(line)) + updateLineHeight(line, textHeight(this.cm.display)); + } + if (min != null) regChange(this.cm, min, max + 1); + this.lines.length = 0; + this.explicitlyCleared = true; + if (this.collapsed && this.cm.view.cantEdit) { + this.cm.view.cantEdit = false; + reCheckSelection(this.cm); + } + endOperation(this.cm); + signalLater(this.cm, this, "clear"); + }; + + TextMarker.prototype.find = function() { + var from, to; + for (var i = 0; i < this.lines.length; ++i) { + var line = this.lines[i]; + var span = getMarkedSpanFor(line.markedSpans, this); + if (span.from != null || span.to != null) { + var found = lineNo(line); + if (span.from != null) from = {line: found, ch: span.from}; + if (span.to != null) to = {line: found, ch: span.to}; + } + } + if (this.type == "bookmark") return from; + return from && {from: from, to: to}; + }; + + function markText(cm, from, to, options, type) { + var doc = cm.view.doc; + var marker = new TextMarker(cm, type); + if (type == "range" && !posLess(from, to)) return marker; + if (options) for (var opt in options) if (options.hasOwnProperty(opt)) + marker[opt] = options[opt]; + if (marker.replacedWith) { + marker.collapsed = true; + marker.replacedWith = elt("span", [marker.replacedWith], "CodeMirror-widget"); + } + if (marker.collapsed) sawCollapsedSpans = true; + + var curLine = from.line, size = 0, collapsedAtStart, collapsedAtEnd; + doc.iter(curLine, to.line + 1, function(line) { + var span = {from: null, to: null, marker: marker}; + size += line.text.length; + if (curLine == from.line) {span.from = from.ch; size -= from.ch;} + if (curLine == to.line) {span.to = to.ch; size -= line.text.length - to.ch;} + if (marker.collapsed) { + if (curLine == to.line) collapsedAtEnd = collapsedSpanAt(line, to.ch); + if (curLine == from.line) collapsedAtStart = collapsedSpanAt(line, from.ch); + else updateLineHeight(line, 0); + } + addMarkedSpan(line, span); + if (marker.collapsed && curLine == from.line && lineIsHidden(line)) + updateLineHeight(line, 0); + ++curLine; + }); + + if (marker.readOnly) { + sawReadOnlySpans = true; + if (cm.view.history.done.length || cm.view.history.undone.length) + cm.clearHistory(); + } + if (marker.collapsed) { + if (collapsedAtStart != collapsedAtEnd) + throw new Error("Inserting collapsed marker overlapping an existing one"); + marker.size = size; + marker.atomic = true; + } + if (marker.className || marker.startStyle || marker.endStyle || marker.collapsed) + regChange(cm, from.line, to.line + 1); + if (marker.atomic) reCheckSelection(cm); + return marker; + } + + // TEXTMARKER SPANS + + function getMarkedSpanFor(spans, marker) { + if (spans) for (var i = 0; i < spans.length; ++i) { + var span = spans[i]; + if (span.marker == marker) return span; + } + } + function removeMarkedSpan(spans, span) { + for (var r, i = 0; i < spans.length; ++i) + if (spans[i] != span) (r || (r = [])).push(spans[i]); + return r; + } + function addMarkedSpan(line, span) { + line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span]; + span.marker.lines.push(line); + } + + function markedSpansBefore(old, startCh) { + if (old) for (var i = 0, nw; i < old.length; ++i) { + var span = old[i], marker = span.marker; + var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh); + if (startsBefore || marker.type == "bookmark" && span.from == startCh) { + var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh); + (nw || (nw = [])).push({from: span.from, + to: endsAfter ? null : span.to, + marker: marker}); + } + } + return nw; + } + + function markedSpansAfter(old, startCh, endCh) { + if (old) for (var i = 0, nw; i < old.length; ++i) { + var span = old[i], marker = span.marker; + var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh); + if (endsAfter || marker.type == "bookmark" && span.from == endCh && span.from != startCh) { + var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh); + (nw || (nw = [])).push({from: startsBefore ? null : span.from - endCh, + to: span.to == null ? null : span.to - endCh, + marker: marker}); + } + } + return nw; + } + + function updateMarkedSpans(oldFirst, oldLast, startCh, endCh, newText) { + if (!oldFirst && !oldLast) return newText; + // Get the spans that 'stick out' on both sides + var first = markedSpansBefore(oldFirst, startCh); + var last = markedSpansAfter(oldLast, startCh, endCh); + + // Next, merge those two ends + var sameLine = newText.length == 1, offset = lst(newText).length + (sameLine ? startCh : 0); + if (first) { + // Fix up .to properties of first + for (var i = 0; i < first.length; ++i) { + var span = first[i]; + if (span.to == null) { + var found = getMarkedSpanFor(last, span.marker); + if (!found) span.to = startCh; + else if (sameLine) span.to = found.to == null ? null : found.to + offset; + } + } + } + if (last) { + // Fix up .from in last (or move them into first in case of sameLine) + for (var i = 0; i < last.length; ++i) { + var span = last[i]; + if (span.to != null) span.to += offset; + if (span.from == null) { + var found = getMarkedSpanFor(first, span.marker); + if (!found) { + span.from = offset; + if (sameLine) (first || (first = [])).push(span); + } + } else { + span.from += offset; + if (sameLine) (first || (first = [])).push(span); + } + } + } + + var newMarkers = [newHL(newText[0], first)]; + if (!sameLine) { + // Fill gap with whole-line-spans + var gap = newText.length - 2, gapMarkers; + if (gap > 0 && first) + for (var i = 0; i < first.length; ++i) + if (first[i].to == null) + (gapMarkers || (gapMarkers = [])).push({from: null, to: null, marker: first[i].marker}); + for (var i = 0; i < gap; ++i) + newMarkers.push(newHL(newText[i+1], gapMarkers)); + newMarkers.push(newHL(lst(newText), last)); + } + return newMarkers; + } + + function removeReadOnlyRanges(doc, from, to) { + var markers = null; + doc.iter(from.line, to.line + 1, function(line) { + if (line.markedSpans) for (var i = 0; i < line.markedSpans.length; ++i) { + var mark = line.markedSpans[i].marker; + if (mark.readOnly && (!markers || indexOf(markers, mark) == -1)) + (markers || (markers = [])).push(mark); + } + }); + if (!markers) return null; + var parts = [{from: from, to: to}]; + for (var i = 0; i < markers.length; ++i) { + var m = markers[i].find(); + for (var j = 0; j < parts.length; ++j) { + var p = parts[j]; + if (!posLess(m.from, p.to) || posLess(m.to, p.from)) continue; + var newParts = [j, 1]; + if (posLess(p.from, m.from)) newParts.push({from: p.from, to: m.from}); + if (posLess(m.to, p.to)) newParts.push({from: m.to, to: p.to}); + parts.splice.apply(parts, newParts); + j += newParts.length - 1; + } + } + return parts; + } + + function collapsedSpanAt(line, ch) { + var sps = sawCollapsedSpans && line.markedSpans, found; + if (sps) for (var sp, i = 0; i < sps.length; ++i) { + sp = sps[i]; + if (!sp.marker.collapsed) continue; + if ((sp.from == null || sp.from < ch) && + (sp.to == null || sp.to > ch) && + (!found || found.width < sp.marker.width)) + found = sp.marker; + } + return found; + } + function collapsedSpanAtStart(line) { return collapsedSpanAt(line, -1); } + function collapsedSpanAtEnd(line) { return collapsedSpanAt(line, line.text.length + 1); } + + function visualLine(doc, line) { + var merged; + while (merged = collapsedSpanAtStart(line)) + line = getLine(doc, merged.find().from.line); + return line; + } + + function lineIsHidden(line) { + var sps = sawCollapsedSpans && line.markedSpans; + if (sps) for (var sp, i = 0; i < sps.length; ++i) { + sp = sps[i]; + if (!sp.marker.collapsed) continue; + if (sp.from == null) return true; + if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(line, sp)) + return true; + } + } + window.lineIsHidden = lineIsHidden; + function lineIsHiddenInner(line, span) { + if (span.to == null || span.marker.inclusiveRight && span.to == line.text.length) + return true; + for (var sp, i = 0; i < line.markedSpans.length; ++i) { + sp = line.markedSpans[i]; + if (sp.marker.collapsed && sp.from == span.to && + (sp.marker.inclusiveLeft || span.marker.inclusiveRight) && + lineIsHiddenInner(line, sp)) return true; + } + } + + // hl stands for history-line, a data structure that can be either a + // string (line without markers) or a {text, markedSpans} object. + function hlText(val) { return typeof val == "string" ? val : val.text; } + function hlSpans(val) { + if (typeof val == "string") return null; + var spans = val.markedSpans, out = null; + for (var i = 0; i < spans.length; ++i) { + if (spans[i].marker.explicitlyCleared) { if (!out) out = spans.slice(0, i); } + else if (out) out.push(spans[i]); + } + return !out ? spans : out.length ? out : null; + } + function newHL(text, spans) { return spans ? {text: text, markedSpans: spans} : text; } + + function detachMarkedSpans(line) { + var spans = line.markedSpans; + if (!spans) return; + for (var i = 0; i < spans.length; ++i) { + var lines = spans[i].marker.lines; + var ix = indexOf(lines, line); + lines.splice(ix, 1); + } + line.markedSpans = null; + } + + function attachMarkedSpans(line, spans) { + if (!spans) return; + for (var i = 0; i < spans.length; ++i) + spans[i].marker.lines.push(line); + line.markedSpans = spans; + } + + // LINE DATA STRUCTURE + + // Line objects. These hold state related to a line, including + // highlighting info (the styles array). + function makeLine(text, markedSpans, height) { + var line = {text: text, height: height}; + attachMarkedSpans(line, markedSpans); + if (lineIsHidden(line)) line.height = 0; + return line; + } + + function updateLine(cm, line, text, markedSpans) { + line.text = text; + line.stateAfter = line.styles = null; + if (line.order != null) line.order = null; + detachMarkedSpans(line); + attachMarkedSpans(line, markedSpans); + if (lineIsHidden(line)) line.height = 0; + else if (!line.height) line.height = textHeight(cm.display); + signalLater(cm, line, "change"); + } + + function cleanUpLine(line) { + line.parent = null; + detachMarkedSpans(line); + } + + // Run the given mode's parser over a line, update the styles + // array, which contains alternating fragments of text and CSS + // classes. + function highlightLine(cm, line, state) { + var mode = cm.view.mode, flattenSpans = cm.options.flattenSpans; + var changed = !line.styles, pos = 0, curText = "", curStyle = null; + var stream = new StringStream(line.text, cm.options.tabSize), st = line.styles || (line.styles = []); + if (line.text == "" && mode.blankLine) mode.blankLine(state); + while (!stream.eol()) { + var style = mode.token(stream, state), substr = stream.current(); + stream.start = stream.pos; + if (!flattenSpans || curStyle != style) { + if (curText) { + changed = changed || pos >= st.length || curText != st[pos] || curStyle != st[pos+1]; + st[pos++] = curText; st[pos++] = curStyle; + } + curText = substr; curStyle = style; + } else curText = curText + substr; + // Give up when line is ridiculously long + if (stream.pos > 5000) break; + } + if (curText) { + changed = changed || pos >= st.length || curText != st[pos] || curStyle != st[pos+1]; + st[pos++] = curText; st[pos++] = curStyle; + } + if (stream.pos > 5000) { st[pos++] = line.text.slice(stream.pos); st[pos++] = null; } + if (pos != st.length) { st.length = pos; changed = true; } + return changed; + } + + // Lightweight form of highlight -- proceed over this line and + // update state, but don't save a style array. + function processLine(cm, line, state) { + var mode = cm.view.mode; + var stream = new StringStream(line.text, cm.options.tabSize); + if (line.text == "" && mode.blankLine) mode.blankLine(state); + while (!stream.eol() && stream.pos <= 5000) { + mode.token(stream, state); + stream.start = stream.pos; + } + } + + var styleToClassCache = {}; + function styleToClass(style) { + if (!style) return null; + return styleToClassCache[style] || + (styleToClassCache[style] = "cm-" + style.replace(/ +/g, " cm-")); + } + + function lineContent(cm, realLine, measure) { + var merged, line = realLine, lineBefore, sawBefore, simple = true; + while (merged = collapsedSpanAtStart(line)) { + simple = false; + line = getLine(cm.view.doc, merged.find().from.line); + if (!lineBefore) lineBefore = line; + } + + var builder = {pre: elt("pre"), col: 0, pos: 0, display: !measure, + measure: null, addedOne: false, cm: cm}; + if (line.textClass) builder.pre.className = line.textClass; + + do { + if (!line.styles) + highlightLine(cm, line, line.stateAfter = getStateBefore(cm, lineNo(line))); + builder.measure = line == realLine && measure; + builder.pos = 0; + builder.addToken = builder.measure ? buildTokenMeasure : buildToken; + if (measure && sawBefore && line != realLine && !builder.addedOne) { + measure[0] = builder.pre.appendChild(zeroWidthElement(cm.display.measure)); + builder.addedOne = true; + } + var next = insertLineContent(line, builder); + sawBefore = line == lineBefore; + if (next) { + line = getLine(cm.view.doc, next.to.line); + simple = false; + } + } while (next); + + if (measure && !builder.addedOne) + measure[0] = builder.pre.appendChild(simple ? elt("span", "\u00a0") : zeroWidthElement(cm.display.measure)); + if (!builder.pre.firstChild && !lineIsHidden(realLine)) + builder.pre.appendChild(document.createTextNode("\u00a0")); + + return builder.pre; + } + + var tokenSpecialChars = /[\t\u0000-\u0019\u200b\u2028\u2029\uFEFF]/g; + function buildToken(builder, text, style, startStyle, endStyle) { + if (!text) return; + if (!tokenSpecialChars.test(text)) { + builder.col += text.length; + var content = document.createTextNode(text); + } else { + var content = document.createDocumentFragment(), pos = 0; + while (true) { + tokenSpecialChars.lastIndex = pos; + var m = tokenSpecialChars.exec(text); + var skipped = m ? m.index - pos : text.length - pos; + if (skipped) { + content.appendChild(document.createTextNode(text.slice(pos, pos + skipped))); + builder.col += skipped; + } + if (!m) break; + pos += skipped + 1; + if (m[0] == "\t") { + var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize; + content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab")); + builder.col += tabWidth; + } else { + var token = elt("span", "\u2022", "cm-invalidchar"); + token.title = "\\u" + m[0].charCodeAt(0).toString(16); + content.appendChild(token); + builder.col += 1; + } + } + } + if (style || startStyle || endStyle || builder.measure) { + var fullStyle = style || ""; + if (startStyle) fullStyle += startStyle; + if (endStyle) fullStyle += endStyle; + return builder.pre.appendChild(elt("span", [content], fullStyle)); + } + builder.pre.appendChild(content); + } + + function buildTokenMeasure(builder, text, style, startStyle, endStyle) { + for (var i = 0; i < text.length; ++i) { + if (i && i < text.length - 1 && + builder.cm.options.lineWrapping && + spanAffectsWrapping.test(text.slice(i - 1, i + 1))) + builder.pre.appendChild(elt("wbr")); + builder.measure[builder.pos++] = + buildToken(builder, text.charAt(i), style, + i == 0 && startStyle, i == text.length - 1 && endStyle); + } + if (text.length) builder.addedOne = true; + } + + function buildCollapsedSpan(builder, size, widget) { + if (widget) { + if (!builder.display) widget = widget.cloneNode(true); + builder.pre.appendChild(widget); + if (builder.measure && size) { + builder.measure[builder.pos] = widget; + builder.addedOne = true; + } + } + builder.pos += size; + } + + // Outputs a number of spans to make up a line, taking highlighting + // and marked text into account. + function insertLineContent(line, builder) { + var st = line.styles, spans = line.markedSpans; + if (!spans) { + for (var i = 0; i < st.length; i+=2) + builder.addToken(builder, st[i], styleToClass(st[i+1])); + return; + } + + var allText = line.text, len = allText.length; + var pos = 0, i = 0, text = "", style; + var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, collapsed; + for (;;) { + if (nextChange == pos) { // Update current marker set + spanStyle = spanEndStyle = spanStartStyle = ""; + collapsed = null; nextChange = Infinity; + var foundBookmark = null; + for (var j = 0; j < spans.length; ++j) { + var sp = spans[j], m = sp.marker; + if (sp.from <= pos && (sp.to == null || sp.to > pos)) { + if (sp.to != null && nextChange > sp.to) { nextChange = sp.to; spanEndStyle = ""; } + if (m.className) spanStyle += " " + m.className; + if (m.startStyle && sp.from == pos) spanStartStyle += " " + m.startStyle; + if (m.endStyle && sp.to == nextChange) spanEndStyle += " " + m.endStyle; + if (m.collapsed && (!collapsed || collapsed.marker.width < m.width)) + collapsed = sp; + } else if (sp.from > pos && nextChange > sp.from) { + nextChange = sp.from; + } + if (m.type == "bookmark" && sp.from == pos && m.replacedWith) + foundBookmark = m.replacedWith; + } + if (collapsed && (collapsed.from || 0) == pos) { + buildCollapsedSpan(builder, (collapsed.to == null ? len : collapsed.to) - pos, + collapsed.from != null && collapsed.marker.replacedWith); + if (collapsed.to == null) return collapsed.marker.find(); + } + if (foundBookmark && !collapsed) buildCollapsedSpan(builder, 0, foundBookmark); + } + if (pos >= len) break; + + var upto = Math.min(len, nextChange); + while (true) { + if (text) { + var end = pos + text.length; + if (!collapsed) { + var tokenText = end > upto ? text.slice(0, upto - pos) : text; + builder.addToken(builder, tokenText, style + spanStyle, + spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : ""); + } + if (end >= upto) {text = text.slice(upto - pos); pos = upto; break;} + pos = end; + spanStartStyle = ""; + } + text = st[i++]; style = styleToClass(st[i++]); + } + } + } + + // DOCUMENT DATA STRUCTURE + + function LeafChunk(lines) { + this.lines = lines; + this.parent = null; + for (var i = 0, e = lines.length, height = 0; i < e; ++i) { + lines[i].parent = this; + height += lines[i].height; + } + this.height = height; + } + + LeafChunk.prototype = { + chunkSize: function() { return this.lines.length; }, + remove: function(at, n, cm) { + for (var i = at, e = at + n; i < e; ++i) { + var line = this.lines[i]; + this.height -= line.height; + cleanUpLine(line); + signalLater(cm, line, "delete"); + } + this.lines.splice(at, n); + }, + collapse: function(lines) { + lines.splice.apply(lines, [lines.length, 0].concat(this.lines)); + }, + insertHeight: function(at, lines, height) { + this.height += height; + this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at)); + for (var i = 0, e = lines.length; i < e; ++i) lines[i].parent = this; + }, + iterN: function(at, n, op) { + for (var e = at + n; at < e; ++at) + if (op(this.lines[at])) return true; + } + }; + + function BranchChunk(children) { + this.children = children; + var size = 0, height = 0; + for (var i = 0, e = children.length; i < e; ++i) { + var ch = children[i]; + size += ch.chunkSize(); height += ch.height; + ch.parent = this; + } + this.size = size; + this.height = height; + this.parent = null; + } + + BranchChunk.prototype = { + chunkSize: function() { return this.size; }, + remove: function(at, n, callbacks) { + this.size -= n; + for (var i = 0; i < this.children.length; ++i) { + var child = this.children[i], sz = child.chunkSize(); + if (at < sz) { + var rm = Math.min(n, sz - at), oldHeight = child.height; + child.remove(at, rm, callbacks); + this.height -= oldHeight - child.height; + if (sz == rm) { this.children.splice(i--, 1); child.parent = null; } + if ((n -= rm) == 0) break; + at = 0; + } else at -= sz; + } + if (this.size - n < 25) { + var lines = []; + this.collapse(lines); + this.children = [new LeafChunk(lines)]; + this.children[0].parent = this; + } + }, + collapse: function(lines) { + for (var i = 0, e = this.children.length; i < e; ++i) this.children[i].collapse(lines); + }, + insert: function(at, lines) { + var height = 0; + for (var i = 0, e = lines.length; i < e; ++i) height += lines[i].height; + this.insertHeight(at, lines, height); + }, + insertHeight: function(at, lines, height) { + this.size += lines.length; + this.height += height; + for (var i = 0, e = this.children.length; i < e; ++i) { + var child = this.children[i], sz = child.chunkSize(); + if (at <= sz) { + child.insertHeight(at, lines, height); + if (child.lines && child.lines.length > 50) { + while (child.lines.length > 50) { + var spilled = child.lines.splice(child.lines.length - 25, 25); + var newleaf = new LeafChunk(spilled); + child.height -= newleaf.height; + this.children.splice(i + 1, 0, newleaf); + newleaf.parent = this; + } + this.maybeSpill(); + } + break; + } + at -= sz; + } + }, + maybeSpill: function() { + if (this.children.length <= 10) return; + var me = this; + do { + var spilled = me.children.splice(me.children.length - 5, 5); + var sibling = new BranchChunk(spilled); + if (!me.parent) { // Become the parent node + var copy = new BranchChunk(me.children); + copy.parent = me; + me.children = [copy, sibling]; + me = copy; + } else { + me.size -= sibling.size; + me.height -= sibling.height; + var myIndex = indexOf(me.parent.children, me); + me.parent.children.splice(myIndex + 1, 0, sibling); + } + sibling.parent = me.parent; + } while (me.children.length > 10); + me.parent.maybeSpill(); + }, + iter: function(from, to, op) { this.iterN(from, to - from, op); }, + iterN: function(at, n, op) { + for (var i = 0, e = this.children.length; i < e; ++i) { + var child = this.children[i], sz = child.chunkSize(); + if (at < sz) { + var used = Math.min(n, sz - at); + if (child.iterN(at, used, op)) return true; + if ((n -= used) == 0) break; + at = 0; + } else at -= sz; + } + } + }; + + // LINE UTILITIES + + function getLine(chunk, n) { + while (!chunk.lines) { + for (var i = 0;; ++i) { + var child = chunk.children[i], sz = child.chunkSize(); + if (n < sz) { chunk = child; break; } + n -= sz; + } + } + return chunk.lines[n]; + } + + function updateLineHeight(line, height) { + var diff = height - line.height; + for (var n = line; n; n = n.parent) n.height += diff; + } + + function lineNo(line) { + if (line.parent == null) return null; + var cur = line.parent, no = indexOf(cur.lines, line); + for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) { + for (var i = 0;; ++i) { + if (chunk.children[i] == cur) break; + no += chunk.children[i].chunkSize(); + } + } + return no; + } + + function lineAtHeight(chunk, h) { + var n = 0; + outer: do { + for (var i = 0, e = chunk.children.length; i < e; ++i) { + var child = chunk.children[i], ch = child.height; + if (h < ch) { chunk = child; continue outer; } + h -= ch; + n += child.chunkSize(); + } + return n; + } while (!chunk.lines); + for (var i = 0, e = chunk.lines.length; i < e; ++i) { + var line = chunk.lines[i], lh = line.height; + if (h < lh) break; + h -= lh; + } + return n + i; + } + + function heightAtLine(cm, lineObj) { + lineObj = visualLine(cm.view.doc, lineObj); + + var h = 0, chunk = lineObj.parent; + for (var i = 0; i < chunk.lines.length; ++i) { + var line = chunk.lines[i]; + if (line == lineObj) break; + else h += line.height; + } + for (var p = chunk.parent; p; chunk = p, p = chunk.parent) { + for (var i = 0; i < p.children.length; ++i) { + var cur = p.children[i]; + if (cur == chunk) break; + else h += cur.height; + } + } + return h; + } + + function getOrder(line) { + var order = line.order; + if (order == null) order = line.order = bidiOrdering(line.text); + return order; + } + + // HISTORY + + function makeHistory() { + return { + // Arrays of history events. Doing something adds an event to + // done and clears undo. Undoing moves events from done to + // undone, redoing moves them in the other direction. + done: [], undone: [], + // Used to track when changes can be merged into a single undo + // event + lastTime: 0, lastOp: null, lastOrigin: null, + // Used by the isClean() method + dirtyCounter: 0 + }; + } + + function addChange(cm, start, added, old, origin, fromBefore, toBefore, fromAfter, toAfter) { + var history = cm.view.history; + history.undone.length = 0; + var time = +new Date, cur = lst(history.done); + + if (cur && + (history.lastOp == cm.curOp.id || + history.lastOrigin == origin && (origin == "input" || origin == "delete") && + history.lastTime > time - 600)) { + // Merge this change into the last event + var last = lst(cur.events); + if (last.start > start + old.length || last.start + last.added < start) { + // Doesn't intersect with last sub-event, add new sub-event + cur.events.push({start: start, added: added, old: old}); + } else { + // Patch up the last sub-event + var startBefore = Math.max(0, last.start - start), + endAfter = Math.max(0, (start + old.length) - (last.start + last.added)); + for (var i = startBefore; i > 0; --i) last.old.unshift(old[i - 1]); + for (var i = endAfter; i > 0; --i) last.old.push(old[old.length - i]); + if (startBefore) last.start = start; + last.added += added - (old.length - startBefore - endAfter); + } + cur.fromAfter = fromAfter; cur.toAfter = toAfter; + } else { + // Can not be merged, start a new event. + cur = {events: [{start: start, added: added, old: old}], + fromBefore: fromBefore, toBefore: toBefore, fromAfter: fromAfter, toAfter: toAfter}; + history.done.push(cur); + while (history.done.length > cm.options.undoDepth) + history.done.shift(); + if (history.dirtyCounter < 0) + // The user has made a change after undoing past the last clean state. + // We can never get back to a clean state now until markClean() is called. + history.dirtyCounter = NaN; + else + history.dirtyCounter++; + } + history.lastTime = time; + history.lastOp = cm.curOp.id; + history.lastOrigin = origin; + } + + // EVENT OPERATORS + + function stopMethod() {e_stop(this);} + // Ensure an event has a stop method. + function addStop(event) { + if (!event.stop) event.stop = stopMethod; + return event; + } + + function e_preventDefault(e) { + if (e.preventDefault) e.preventDefault(); + else e.returnValue = false; + } + function e_stopPropagation(e) { + if (e.stopPropagation) e.stopPropagation(); + else e.cancelBubble = true; + } + function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);} + CodeMirror.e_stop = e_stop; + CodeMirror.e_preventDefault = e_preventDefault; + CodeMirror.e_stopPropagation = e_stopPropagation; + + function e_target(e) {return e.target || e.srcElement;} + function e_button(e) { + var b = e.which; + if (b == null) { + if (e.button & 1) b = 1; + else if (e.button & 2) b = 3; + else if (e.button & 4) b = 2; + } + if (mac && e.ctrlKey && b == 1) b = 3; + return b; + } + + // Allow 3rd-party code to override event properties by adding an override + // object to an event object. + function e_prop(e, prop) { + var overridden = e.override && e.override.hasOwnProperty(prop); + return overridden ? e.override[prop] : e[prop]; + } + + // EVENT HANDLING + + function on(emitter, type, f) { + if (emitter.addEventListener) + emitter.addEventListener(type, f, false); + else if (emitter.attachEvent) + emitter.attachEvent("on" + type, f); + else { + var map = emitter._handlers || (emitter._handlers = {}); + var arr = map[type] || (map[type] = []); + arr.push(f); + } + } + + function off(emitter, type, f) { + if (emitter.removeEventListener) + emitter.removeEventListener(type, f, false); + else if (emitter.detachEvent) + emitter.detachEvent("on" + type, f); + else { + var arr = emitter._handlers && emitter._handlers[type]; + if (!arr) return; + for (var i = 0; i < arr.length; ++i) + if (arr[i] == f) { arr.splice(i, 1); break; } + } + } + + function signal(emitter, type /*, values...*/) { + var arr = emitter._handlers && emitter._handlers[type]; + if (!arr) return; + var args = Array.prototype.slice.call(arguments, 2); + for (var i = 0; i < arr.length; ++i) arr[i].apply(null, args); + } + + function signalLater(cm, emitter, type /*, values...*/) { + var arr = emitter._handlers && emitter._handlers[type]; + if (!arr) return; + var args = Array.prototype.slice.call(arguments, 3), flist = cm.curOp && cm.curOp.delayedCallbacks; + function bnd(f) {return function(){f.apply(null, args);};}; + for (var i = 0; i < arr.length; ++i) + if (flist) flist.push(bnd(arr[i])); + else arr[i].apply(null, args); + } + + function hasHandler(emitter, type) { + var arr = emitter._handlers && emitter._handlers[type]; + return arr && arr.length > 0; + } + + CodeMirror.on = on; CodeMirror.off = off; CodeMirror.signal = signal; + + // MISC UTILITIES + + // Number of pixels added to scroller and sizer to hide scrollbar + var scrollerCutOff = 30; + + // Returned or thrown by various protocols to signal 'I'm not + // handling this'. + var Pass = CodeMirror.Pass = {toString: function(){return "CodeMirror.Pass";}}; + + function Delayed() {this.id = null;} + Delayed.prototype = {set: function(ms, f) {clearTimeout(this.id); this.id = setTimeout(f, ms);}}; + + // Counts the column offset in a string, taking tabs into account. + // Used mostly to find indentation. + function countColumn(string, end, tabSize) { + if (end == null) { + end = string.search(/[^\s\u00a0]/); + if (end == -1) end = string.length; + } + for (var i = 0, n = 0; i < end; ++i) { + if (string.charAt(i) == "\t") n += tabSize - (n % tabSize); + else ++n; + } + return n; + } + CodeMirror.countColumn = countColumn; + + var spaceStrs = [""]; + function spaceStr(n) { + while (spaceStrs.length <= n) + spaceStrs.push(lst(spaceStrs) + " "); + return spaceStrs[n]; + } + + function lst(arr) { return arr[arr.length-1]; } + + function selectInput(node) { + if (ios) { // Mobile Safari apparently has a bug where select() is broken. + node.selectionStart = 0; + node.selectionEnd = node.value.length; + } else node.select(); + } + + function indexOf(collection, elt) { + if (collection.indexOf) return collection.indexOf(elt); + for (var i = 0, e = collection.length; i < e; ++i) + if (collection[i] == elt) return i; + return -1; + } + + function emptyArray(size) { + for (var a = [], i = 0; i < size; ++i) a.push(undefined); + return a; + } + + function bind(f) { + var args = Array.prototype.slice.call(arguments, 1); + return function(){return f.apply(null, args);}; + } + + var nonASCIISingleCaseWordChar = /[\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc]/; + function isWordChar(ch) { + return /\w/.test(ch) || ch > "\x80" && + (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch)); + } + + function isEmpty(obj) { + var c = 0; + for (var n in obj) if (obj.hasOwnProperty(n) && obj[n]) ++c; + return !c; + } + + var isExtendingChar = /[\u0300-\u036F\u0483-\u0487\u0488-\u0489\u0591-\u05BD\u05BF\u05C1-\u05C2\u05C4-\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7-\u06E8\u06EA-\u06ED\uA66F\uA670-\uA672\uA674-\uA67D\uA69F]/; + + // DOM UTILITIES + + function elt(tag, content, className, style) { + var e = document.createElement(tag); + if (className) e.className = className; + if (style) e.style.cssText = style; + if (typeof content == "string") setTextContent(e, content); + else if (content) for (var i = 0; i < content.length; ++i) e.appendChild(content[i]); + return e; + } + + function removeChildren(e) { + e.innerHTML = ""; + return e; + } + + function removeChildrenAndAdd(parent, e) { + return removeChildren(parent).appendChild(e); + } + + function setTextContent(e, str) { + if (ie_lt9) { + e.innerHTML = ""; + e.appendChild(document.createTextNode(str)); + } else e.textContent = str; + } + + // FEATURE DETECTION + + // Detect drag-and-drop + var dragAndDrop = function() { + // There is *some* kind of drag-and-drop support in IE6-8, but I + // couldn't get it to work yet. + if (ie_lt9) return false; + var div = elt('div'); + return "draggable" in div || "dragDrop" in div; + }(); + + // For a reason I have yet to figure out, some browsers disallow + // word wrapping between certain characters *only* if a new inline + // element is started between them. This makes it hard to reliably + // measure the position of things, since that requires inserting an + // extra span. This terribly fragile set of regexps matches the + // character combinations that suffer from this phenomenon on the + // various browsers. + var spanAffectsWrapping = /^$/; // Won't match any two-character string + if (gecko) spanAffectsWrapping = /$'/; + else if (safari) spanAffectsWrapping = /\-[^ \-?]|\?[^ !'\"\),.\-\/:;\?\]\}]/; + else if (chrome) spanAffectsWrapping = /\-[^ \-\.?]|\?[^ \-\.?\]\}:;!'\"\),\/]|[\.!\"#&%\)*+,:;=>\]|\}~][\(\{\[<]|\$'/; + + var knownScrollbarWidth; + function scrollbarWidth(measure) { + if (knownScrollbarWidth != null) return knownScrollbarWidth; + var test = elt("div", null, null, "width: 50px; height: 50px; overflow-x: scroll"); + removeChildrenAndAdd(measure, test); + if (test.offsetWidth) + knownScrollbarWidth = test.offsetHeight - test.clientHeight; + return knownScrollbarWidth || 0; + } + + var zwspSupported; + function zeroWidthElement(measure) { + if (zwspSupported == null) { + var test = elt("span", "\u200b"); + removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")])); + if (measure.firstChild.offsetHeight != 0) + zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !ie_lt8; + } + if (zwspSupported) return elt("span", "\u200b"); + else return elt("span", "\u00a0", null, "display: inline-block; width: 1px; margin-right: -1px"); + } + + // See if "".split is the broken IE version, if so, provide an + // alternative way to split lines. + var splitLines = "\n\nb".split(/\n/).length != 3 ? function(string) { + var pos = 0, result = [], l = string.length; + while (pos <= l) { + var nl = string.indexOf("\n", pos); + if (nl == -1) nl = string.length; + var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl); + var rt = line.indexOf("\r"); + if (rt != -1) { + result.push(line.slice(0, rt)); + pos += rt + 1; + } else { + result.push(line); + pos = nl + 1; + } + } + return result; + } : function(string){return string.split(/\r\n?|\n/);}; + CodeMirror.splitLines = splitLines; + + var hasSelection = window.getSelection ? function(te) { + try { return te.selectionStart != te.selectionEnd; } + catch(e) { return false; } + } : function(te) { + try {var range = te.ownerDocument.selection.createRange();} + catch(e) {} + if (!range || range.parentElement() != te) return false; + return range.compareEndPoints("StartToEnd", range) != 0; + }; + + var hasCopyEvent = (function() { + var e = elt("div"); + if ("oncopy" in e) return true; + e.setAttribute("oncopy", "return;"); + return typeof e.oncopy == 'function'; + })(); + + // KEY NAMING + + var keyNames = {3: "Enter", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt", + 19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End", + 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert", + 46: "Delete", 59: ";", 91: "Mod", 92: "Mod", 93: "Mod", 109: "-", 107: "=", 127: "Delete", + 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\", + 221: "]", 222: "'", 63276: "PageUp", 63277: "PageDown", 63275: "End", 63273: "Home", + 63234: "Left", 63232: "Up", 63235: "Right", 63233: "Down", 63302: "Insert", 63272: "Delete"}; + CodeMirror.keyNames = keyNames; + (function() { + // Number keys + for (var i = 0; i < 10; i++) keyNames[i + 48] = String(i); + // Alphabetic keys + for (var i = 65; i <= 90; i++) keyNames[i] = String.fromCharCode(i); + // Function keys + for (var i = 1; i <= 12; i++) keyNames[i + 111] = keyNames[i + 63235] = "F" + i; + })(); + + // BIDI HELPERS + + function iterateBidiSections(order, from, to, f) { + if (!order) return f(from, to, "ltr"); + for (var i = 0; i < order.length; ++i) { + var part = order[i]; + if (part.from < to && part.to > from) + f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr"); + } + } + + function bidiLeft(part) { return part.level % 2 ? part.to : part.from; } + function bidiRight(part) { return part.level % 2 ? part.from : part.to; } + + function lineLeft(line) { var order = getOrder(line); return order ? bidiLeft(order[0]) : 0; } + function lineRight(line) { + var order = getOrder(line); + if (!order) return line.text.length; + return bidiRight(lst(order)); + } + + function lineStart(cm, lineN) { + var line = getLine(cm.view.doc, lineN); + var visual = visualLine(cm.view.doc, line); + if (visual != line) lineN = lineNo(visual); + var order = getOrder(visual); + var ch = !order ? 0 : order[0].level % 2 ? lineRight(visual) : lineLeft(visual); + return {line: lineN, ch: ch}; + } + function lineEnd(cm, lineNo) { + var merged, line; + while (merged = collapsedSpanAtEnd(line = getLine(cm.view.doc, lineNo))) + lineNo = merged.find().to.line; + var order = getOrder(line); + var ch = !order ? line.text.length : order[0].level % 2 ? lineLeft(line) : lineRight(line); + return {line: lineNo, ch: ch}; + } + + // This is somewhat involved. It is needed in order to move + // 'visually' through bi-directional text -- i.e., pressing left + // should make the cursor go left, even when in RTL text. The + // tricky part is the 'jumps', where RTL and LTR text touch each + // other. This often requires the cursor offset to move more than + // one unit, in order to visually move one unit. + function moveVisually(line, start, dir, byUnit) { + var bidi = getOrder(line); + if (!bidi) return moveLogically(line, start, dir, byUnit); + var moveOneUnit = byUnit ? function(pos, dir) { + do pos += dir; + while (pos > 0 && isExtendingChar.test(line.text.charAt(pos))); + return pos; + } : function(pos, dir) { return pos + dir; }; + var linedir = bidi[0].level; + for (var i = 0; i < bidi.length; ++i) { + var part = bidi[i], sticky = part.level % 2 == linedir; + if ((part.from < start && part.to > start) || + (sticky && (part.from == start || part.to == start))) break; + } + var target = moveOneUnit(start, part.level % 2 ? -dir : dir); + + while (target != null) { + if (part.level % 2 == linedir) { + if (target < part.from || target > part.to) { + part = bidi[i += dir]; + target = part && (dir > 0 == part.level % 2 ? moveOneUnit(part.to, -1) : moveOneUnit(part.from, 1)); + } else break; + } else { + if (target == bidiLeft(part)) { + part = bidi[--i]; + target = part && bidiRight(part); + } else if (target == bidiRight(part)) { + part = bidi[++i]; + target = part && bidiLeft(part); + } else break; + } + } + + return target < 0 || target > line.text.length ? null : target; + } + + function moveLogically(line, start, dir, byUnit) { + var target = start + dir; + if (byUnit) while (target > 0 && isExtendingChar.test(line.text.charAt(target))) target += dir; + return target < 0 || target > line.text.length ? null : target; + } + + // Bidirectional ordering algorithm + // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm + // that this (partially) implements. + + // One-char codes used for character types: + // L (L): Left-to-Right + // R (R): Right-to-Left + // r (AL): Right-to-Left Arabic + // 1 (EN): European Number + // + (ES): European Number Separator + // % (ET): European Number Terminator + // n (AN): Arabic Number + // , (CS): Common Number Separator + // m (NSM): Non-Spacing Mark + // b (BN): Boundary Neutral + // s (B): Paragraph Separator + // t (S): Segment Separator + // w (WS): Whitespace + // N (ON): Other Neutrals + + // Returns null if characters are ordered as they appear + // (left-to-right), or an array of sections ({from, to, level} + // objects) in the order in which they occur visually. + var bidiOrdering = (function() { + // Character types for codepoints 0 to 0xff + var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLL"; + // Character types for codepoints 0x600 to 0x6ff + var arabicTypes = "rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmmrrrrrrrrrrrrrrrrrr"; + function charType(code) { + if (code <= 0xff) return lowTypes.charAt(code); + else if (0x590 <= code && code <= 0x5f4) return "R"; + else if (0x600 <= code && code <= 0x6ff) return arabicTypes.charAt(code - 0x600); + else if (0x700 <= code && code <= 0x8ac) return "r"; + else return "L"; + } + + var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/; + var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/; + + return function charOrdering(str) { + if (!bidiRE.test(str)) return false; + var len = str.length, types = [], startType = null; + for (var i = 0, type; i < len; ++i) { + types.push(type = charType(str.charCodeAt(i))); + if (startType == null) { + if (type == "L") startType = "L"; + else if (type == "R" || type == "r") startType = "R"; + } + } + if (startType == null) startType = "L"; + + // W1. Examine each non-spacing mark (NSM) in the level run, and + // change the type of the NSM to the type of the previous + // character. If the NSM is at the start of the level run, it will + // get the type of sor. + for (var i = 0, prev = startType; i < len; ++i) { + var type = types[i]; + if (type == "m") types[i] = prev; + else prev = type; + } + + // W2. Search backwards from each instance of a European number + // until the first strong type (R, L, AL, or sor) is found. If an + // AL is found, change the type of the European number to Arabic + // number. + // W3. Change all ALs to R. + for (var i = 0, cur = startType; i < len; ++i) { + var type = types[i]; + if (type == "1" && cur == "r") types[i] = "n"; + else if (isStrong.test(type)) { cur = type; if (type == "r") types[i] = "R"; } + } + + // W4. A single European separator between two European numbers + // changes to a European number. A single common separator between + // two numbers of the same type changes to that type. + for (var i = 1, prev = types[0]; i < len - 1; ++i) { + var type = types[i]; + if (type == "+" && prev == "1" && types[i+1] == "1") types[i] = "1"; + else if (type == "," && prev == types[i+1] && + (prev == "1" || prev == "n")) types[i] = prev; + prev = type; + } + + // W5. A sequence of European terminators adjacent to European + // numbers changes to all European numbers. + // W6. Otherwise, separators and terminators change to Other + // Neutral. + for (var i = 0; i < len; ++i) { + var type = types[i]; + if (type == ",") types[i] = "N"; + else if (type == "%") { + for (var end = i + 1; end < len && types[end] == "%"; ++end) {} + var replace = (i && types[i-1] == "!") || (end < len - 1 && types[end] == "1") ? "1" : "N"; + for (var j = i; j < end; ++j) types[j] = replace; + i = end - 1; + } + } + + // W7. Search backwards from each instance of a European number + // until the first strong type (R, L, or sor) is found. If an L is + // found, then change the type of the European number to L. + for (var i = 0, cur = startType; i < len; ++i) { + var type = types[i]; + if (cur == "L" && type == "1") types[i] = "L"; + else if (isStrong.test(type)) cur = type; + } + + // N1. A sequence of neutrals takes the direction of the + // surrounding strong text if the text on both sides has the same + // direction. European and Arabic numbers act as if they were R in + // terms of their influence on neutrals. Start-of-level-run (sor) + // and end-of-level-run (eor) are used at level run boundaries. + // N2. Any remaining neutrals take the embedding direction. + for (var i = 0; i < len; ++i) { + if (isNeutral.test(types[i])) { + for (var end = i + 1; end < len && isNeutral.test(types[end]); ++end) {} + var before = (i ? types[i-1] : startType) == "L"; + var after = (end < len - 1 ? types[end] : startType) == "L"; + var replace = before || after ? "L" : "R"; + for (var j = i; j < end; ++j) types[j] = replace; + i = end - 1; + } + } + + // Here we depart from the documented algorithm, in order to avoid + // building up an actual levels array. Since there are only three + // levels (0, 1, 2) in an implementation that doesn't take + // explicit embedding into account, we can build up the order on + // the fly, without following the level-based algorithm. + var order = [], m; + for (var i = 0; i < len;) { + if (countsAsLeft.test(types[i])) { + var start = i; + for (++i; i < len && countsAsLeft.test(types[i]); ++i) {} + order.push({from: start, to: i, level: 0}); + } else { + var pos = i, at = order.length; + for (++i; i < len && types[i] != "L"; ++i) {} + for (var j = pos; j < i;) { + if (countsAsNum.test(types[j])) { + if (pos < j) order.splice(at, 0, {from: pos, to: j, level: 1}); + var nstart = j; + for (++j; j < i && countsAsNum.test(types[j]); ++j) {} + order.splice(at, 0, {from: nstart, to: j, level: 2}); + pos = j; + } else ++j; + } + if (pos < i) order.splice(at, 0, {from: pos, to: i, level: 1}); + } + } + if (order[0].level == 1 && (m = str.match(/^\s+/))) { + order[0].from = m[0].length; + order.unshift({from: 0, to: m[0].length, level: 0}); + } + if (lst(order).level == 1 && (m = str.match(/\s+$/))) { + lst(order).to -= m[0].length; + order.push({from: len - m[0].length, to: len, level: 0}); + } + if (order[0].level != lst(order).level) + order.push({from: len, to: len, level: order[0].level}); + + return order; + }; + })(); + + // THE END + + CodeMirror.version = "3.0"; + + return CodeMirror; +})(); + +/* autogeneration */ +define("lib/codemirror.js", [], function(){}); + +/* @source mod/overlay.js */; + +// Utility function that allows modes to be combined. The mode given +// as the base argument takes care of most of the normal mode +// functionality, but a second (typically simple) mode is used, which +// can override the style of text. Both modes get to parse all of the +// text, but when both assign a non-null style to a piece of code, the +// overlay wins, unless the combine argument was true, in which case +// the styles are combined. + +// overlayParser is the old, deprecated name +define('mod/overlay', [ + "codemirror" +], function(CodeMirror){ +CodeMirror.overlayMode = CodeMirror.overlayParser = function(base, overlay, combine) { + return { + startState: function() { + return { + base: CodeMirror.startState(base), + overlay: CodeMirror.startState(overlay), + basePos: 0, baseCur: null, + overlayPos: 0, overlayCur: null + }; + }, + copyState: function(state) { + return { + base: CodeMirror.copyState(base, state.base), + overlay: CodeMirror.copyState(overlay, state.overlay), + basePos: state.basePos, baseCur: null, + overlayPos: state.overlayPos, overlayCur: null + }; + }, + + token: function(stream, state) { + if (stream.start == state.basePos) { + state.baseCur = base.token(stream, state.base); + state.basePos = stream.pos; + } + if (stream.start == state.overlayPos) { + stream.pos = stream.start; + state.overlayCur = overlay.token(stream, state.overlay); + state.overlayPos = stream.pos; + } + stream.pos = Math.min(state.basePos, state.overlayPos); + if (stream.eol()) state.basePos = state.overlayPos = 0; + + if (state.overlayCur == null) return state.baseCur; + if (state.baseCur != null && combine) return state.baseCur + " " + state.overlayCur; + else return state.overlayCur; + }, + + indent: base.indent && function(state, textAfter) { + return base.indent(state.base, textAfter); + }, + electricChars: base.electricChars, + + innerMode: function(state) { return {state: state.base, mode: base}; }, + + blankLine: function(state) { + if (base.blankLine) base.blankLine(state.base); + if (overlay.blankLine) overlay.blankLine(state.overlay); + } + }; +}; +}); + +/* @source mod/loadmode.js */; + +define('mod/loadmode', [ + "codemirror" +], function(CodeMirror){ +(function() { + if (!CodeMirror.modeURL) CodeMirror.modeURL = "/static/js/lib/mode/%N.js"; + + var loading = {}; + function splitCallback(cont, n) { + var countDown = n; + return function() { if (--countDown == 0) cont(); }; + } + function ensureDeps(mode, cont) { + var deps = CodeMirror.modes[mode].dependencies; + if (!deps) return cont(); + var missing = []; + for (var i = 0; i < deps.length; ++i) { + if (!CodeMirror.modes.hasOwnProperty(deps[i])) + missing.push(deps[i]); + } + if (!missing.length) return cont(); + var split = splitCallback(cont, missing.length); + for (var i = 0; i < missing.length; ++i) + CodeMirror.requireMode(missing[i], split); + } + + CodeMirror.requireMode = function(mode, cont) { + if (typeof mode != "string") mode = mode.name; + if (CodeMirror.modes.hasOwnProperty(mode)) return ensureDeps(mode, cont); + if (loading.hasOwnProperty(mode)) return loading[mode].push(cont); + + var script = document.createElement("script"); + script.src = CodeMirror.modeURL.replace(/%N/g, mode); + var others = document.getElementsByTagName("script")[0]; + others.parentNode.insertBefore(script, others); + var list = loading[mode] = [cont]; + var count = 0, poll = setInterval(function() { + if (++count > 100) return clearInterval(poll); + if (CodeMirror.modes.hasOwnProperty(mode)) { + clearInterval(poll); + loading[mode] = null; + ensureDeps(mode, function() { + for (var i = 0; i < list.length; ++i) list[i](); + }); + } + }, 200); + }; + + CodeMirror.autoLoadMode = function(instance, mode) { + if (!CodeMirror.modes.hasOwnProperty(mode)) + CodeMirror.requireMode(mode, function() { + //instance.setOption("mode", instance.getOption("mode")); + instance.setOption("mode", mode); + }); + }; +}()); + +}); + +/* @source mod/editor.js */; + +define('mod/editor', [ + "jquery", + "codemirror", + "mod/loadmode", + "mod/overlay" +], function ($, CodeMirror) { + + $(function(){ + var editor = CodeMirror.fromTextArea($('.commit_form textarea[name="code"]')[0], { + mode: {name: "python", version: 2, singleLineStringErrors: false}, + lineNumbers: true, + indentUnit: 4, + tabMode: "shift", + matchBrackets: true + }); + CodeMirror.autoLoadMode(editor, 'python'); + + return editor + }); +}); + +/* @source */; + +define('codemirror', ['lib/codemirror.js'], function(none){ + return CodeMirror; +}); + +require(['codemirror', 'mod/editor', 'mod/zclip'], function(){ + //do any thing? +}); diff --git a/dist/js/app/src/src.js b/dist/js/app/src/src.js new file mode 100644 index 0000000..db733c0 --- /dev/null +++ b/dist/js/app/src/src.js @@ -0,0 +1,2582 @@ + +require.config({ enable_ozma: true }); + + +/* @source lib/jquery.commits-graph.js */; + +/* + * jQuery Commits Graph - v0.1.3 + * A jQuery plugin to display git commits graph using HTML5/Canvas. + * https://github.com/tclh123/commits-graph + * + * Copyright (c) 2014 + * MIT License + */ + +// -- Route -------------------------------------------------------- + +function Route( commit, data, options ) { + var self = this; + + self._data = data; + self.commit = commit; + self.options = options; + self.from = data[0]; + self.to = data[1]; + self.branch = data[2]; +} + +Route.prototype.drawRoute = function ( ctx ) { + var self = this; + + var from_x = self.options.width * self.options.scaleFactor - (self.from + 1) * self.options.x_step * self.options.scaleFactor; + var from_y = (self.commit.idx + 0.5) * self.options.y_step * self.options.scaleFactor; + + var to_x = self.options.width * self.options.scaleFactor - (self.to + 1) * self.options.x_step * self.options.scaleFactor; + var to_y = (self.commit.idx + 0.5 + 1) * self.options.y_step * self.options.scaleFactor; + + + ctx.strokeStyle = self.commit.graph.get_color(self.branch); + ctx.beginPath(); + ctx.moveTo(from_x, from_y); + if (from_x == to_x) { + ctx.lineTo(to_x, to_y); + } else { + ctx.bezierCurveTo(from_x - self.options.x_step * self.options.scaleFactor / 4, + from_y + self.options.y_step * self.options.scaleFactor / 3 * 2, + to_x + self.options.x_step * self.options.scaleFactor / 4, + to_y - self.options.y_step * self.options.scaleFactor / 3 * 2, + to_x, to_y); + } + ctx.stroke(); +} + +// -- Commit Node -------------------------------------------------------- + +function Commit(graph, idx, data, options ) { + var self = this; + + self._data = data; + self.graph = graph; + self.idx = idx; + self.options = options; + self.sha = data[0]; + self.dot = data[1]; + self.dot_offset = self.dot[0]; + self.dot_branch = self.dot[1]; + self.routes = $.map(data[2], function(e) { return new Route(self, e, options) }); +} + +Commit.prototype.drawDot = function ( ctx ) { + var self = this; + + var x = self.options.width * self.options.scaleFactor - (self.dot_offset + 1) * self.options.x_step * self.options.scaleFactor; + var y = (self.idx + 0.5) * self.options.y_step * self.options.scaleFactor; + + // ctx.strokeStyle = self.graph.get_color(self.dot_branch); + ctx.fillStyle = self.graph.get_color(self.dot_branch); + ctx.beginPath(); + var radius = 3; + ctx.arc(x, y, radius * self.options.scaleFactor, 0, 2 * Math.PI, true); + // ctx.stroke(); + ctx.fill(); +} + +// -- Graph Canvas -------------------------------------------------------- + +function backingScale() { + if ('devicePixelRatio' in window) { + if (window.devicePixelRatio > 1) { + return window.devicePixelRatio; + } + } + return 1; +} + +function GraphCanvas( data, options ) { + var self = this; + + self.data = data; + self.options = options; + self.canvas = document.createElement("canvas"); + self.canvas.style.height = options.height + "px"; + self.canvas.style.width = options.width + "px"; + self.canvas.height = options.height; + self.canvas.width = options.width; + + var scaleFactor = backingScale(); + if (scaleFactor > 1) { + self.canvas.width = self.canvas.width * scaleFactor; + self.canvas.height = self.canvas.height * scaleFactor; + } + self.options.scaleFactor = scaleFactor + + // or use context.scale(2,2) // not tested + + self.colors = [ + "#e11d21" + //, "#eb6420" + , "#fbca04" + , "#009800" + , "#006b75" + , "#207de5" + , "#0052cc" + , "#5319e7" + , "#f7c6c7" + , "#fad8c7" + , "#fef2c0" + , "#bfe5bf" + , "#c7def8" + , "#bfdadc" + , "#bfd4f2" + , "#d4c5f9" + , "#cccccc" + , "#84b6eb" + , "#e6e6e6" + , "#ffffff" + , "#cc317c" + ] + // self.branch_color = {}; +} + +GraphCanvas.prototype.toHTML = function () { + var self = this; + + self.draw(); + + return $(self.canvas); +}; + +GraphCanvas.prototype.get_color = function (branch) { + var self = this; + + var n = self.colors.length; + return self.colors[branch % n]; +}; + +/* + +[ + sha, + [offset, branch], //dot + [ + [from, to, branch], // route1 + [from, to, branch], // route2 + [from, to, branch], + ] // routes +], + +*/ +// draw +GraphCanvas.prototype.draw = function () { + var self = this, + ctx = self.canvas.getContext("2d"); + + ctx.lineWidth = 2; + console.log(self.data); + + var n_commits = self.data.length; + for (var i=0; i
    ').append(this); + $div.data('media.origHTML', $temp.html()); // store original markup + } + + // post-conversion callback, passes original element, new div element and fully populated options + if (typeof f2 == 'function') f2(this, $div[0], o, player.name); + break; + } + }); +}; + +/** + * Non-chainable method for adding or changing file format / player mapping + * @name mapFormat + * @param String format File format extension (ie: mov, wav, mp3) + * @param String player Player name to use for the format (one of: flash, quicktime, realplayer, winmedia, silverlight or iframe + */ +$.fn.media.mapFormat = function(format, player) { + if (!format || !player || !$.fn.media.defaults.players[player]) return; // invalid + format = format.toLowerCase(); + if (isDigit(format[0])) format = 'fn' + format; + $.fn.media[format] = $.fn.media[player]; + $.fn.media[format+'_player'] = $.fn.media.defaults.players[player]; +}; + +// global defautls; override as needed +$.fn.media.defaults = { + standards: true, // use object tags only (no embeds for non-IE browsers) + canUndo: true, // tells plugin to store the original markup so it can be reverted via: $(sel).mediaUndo() + width: 400, + height: 400, + autoplay: 0, // normalized cross-player setting + bgColor: '#ffffff', // background color + params: { wmode: 'transparent'}, // added to object element as param elements; added to embed element as attrs + attrs: {}, // added to object and embed elements as attrs + flvKeyName: 'file', // key used for object src param (thanks to Andrea Ercolino) + flashvars: {}, // added to flash content as flashvars param/attr + flashVersion: '7', // required flash version + expressInstaller: null, // src for express installer + + // default flash video and mp3 player (@see: http://jeroenwijering.com/?item=Flash_Media_Player) + flvPlayer: 'mediaplayer.swf', + mp3Player: 'mediaplayer.swf', + + // @see http://msdn2.microsoft.com/en-us/library/bb412401.aspx + silverlight: { + inplaceInstallPrompt: 'true', // display in-place install prompt? + isWindowless: 'true', // windowless mode (false for wrapping markup) + framerate: '24', // maximum framerate + version: '0.9', // Silverlight version + onError: null, // onError callback + onLoad: null, // onLoad callback + initParams: null, // object init params + userContext: null // callback arg passed to the load callback + } +}; + +// Media Players; think twice before overriding +$.fn.media.defaults.players = { + flash: { + name: 'flash', + title: 'Flash', + types: 'flv,mp3,swf', + mimetype: 'application/x-shockwave-flash', + pluginspage: 'http://www.adobe.com/go/getflashplayer', + ieAttrs: { + classid: 'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000', + type: 'application/x-oleobject', + codebase: 'http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=' + $.fn.media.defaults.flashVersion + } + }, + quicktime: { + name: 'quicktime', + title: 'QuickTime', + mimetype: 'video/quicktime', + pluginspage: 'http://www.apple.com/quicktime/download/', + types: 'aif,aiff,aac,au,bmp,gsm,mov,mid,midi,mpg,mpeg,mp4,m4a,psd,qt,qtif,qif,qti,snd,tif,tiff,wav,3g2,3gp', + ieAttrs: { + classid: 'clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B', + codebase: 'http://www.apple.com/qtactivex/qtplugin.cab' + } + }, + realplayer: { + name: 'real', + title: 'RealPlayer', + types: 'ra,ram,rm,rpm,rv,smi,smil', + mimetype: 'audio/x-pn-realaudio-plugin', + pluginspage: 'http://www.real.com/player/', + autoplayAttr: 'autostart', + ieAttrs: { + classid: 'clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA' + } + }, + winmedia: { + name: 'winmedia', + title: 'Windows Media', + types: 'asx,asf,avi,wma,wmv', + mimetype: isFirefoxWMPPluginInstalled() ? 'application/x-ms-wmp' : 'application/x-mplayer2', + pluginspage: 'http://www.microsoft.com/Windows/MediaPlayer/', + autoplayAttr: 'autostart', + oUrl: 'url', + ieAttrs: { + classid: 'clsid:6BF52A52-394A-11d3-B153-00C04F79FAA6', + type: 'application/x-oleobject' + } + }, + // special cases + img: { + name: 'img', + title: 'Image', + types: 'gif,png,jpg' + }, + iframe: { + name: 'iframe', + types: 'html,pdf' + }, + silverlight: { + name: 'silverlight', + types: 'xaml' + } +}; + +// +// everything below here is private +// + + +// detection script for FF WMP plugin (http://www.therossman.org/experiments/wmp_play.html) +// (hat tip to Mark Ross for this script) +function isFirefoxWMPPluginInstalled() { + var plugs = navigator.plugins || []; + for (var i = 0; i < plugs.length; i++) { + var plugin = plugs[i]; + if (plugin['filename'] == 'np-mswmp.dll') + return true; + } + return false; +} + +var counter = 1; + +for (var player in $.fn.media.defaults.players) { + var types = $.fn.media.defaults.players[player].types; + $.each(types.split(','), function(i,o) { + if (isDigit(o[0])) o = 'fn' + o; + $.fn.media[o] = $.fn.media[player] = getGenerator(player); + $.fn.media[o+'_player'] = $.fn.media.defaults.players[player]; + }); +}; + +function getTypesRegExp() { + var types = ''; + for (var player in $.fn.media.defaults.players) { + if (types.length) types += ','; + types += $.fn.media.defaults.players[player].types; + }; + return new RegExp('\\.(' + types.replace(/,/ig,'|') + ')\\b'); +}; + +function getGenerator(player) { + return function(el, options) { + return generate(el, options, player); + }; +}; + +function isDigit(c) { + return '0123456789'.indexOf(c) > -1; +}; + +// flatten all possible options: global defaults, meta, option obj +function getSettings(el, options) { + options = options || {}; + var $el = $(el); + var cls = el.className || ''; + // support metadata plugin (v1.0 and v2.0) + var meta = $.metadata ? $el.metadata() : $.meta ? $el.data() : {}; + meta = meta || {}; + var w = meta.width || parseInt(((cls.match(/\bw:(\d+)/)||[])[1]||0)) || parseInt(((cls.match(/\bwidth:(\d+)/)||[])[1]||0)); + var h = meta.height || parseInt(((cls.match(/\bh:(\d+)/)||[])[1]||0)) || parseInt(((cls.match(/\bheight:(\d+)/)||[])[1]||0)) + + if (w) meta.width = w; + if (h) meta.height = h; + if (cls) meta.cls = cls; + + // crank html5 style data attributes + var dataName = 'data-'; + for (var i=0; i < el.attributes.length; i++) { + var a = el.attributes[i], n = $.trim(a.name); + var index = n.indexOf(dataName); + if (index === 0) { + n = n.substring(dataName.length); + meta[n] = a.value; + } + } + + var a = $.fn.media.defaults; + var b = options; + var c = meta; + + var p = { params: { bgColor: options.bgColor || $.fn.media.defaults.bgColor } }; + var opts = $.extend({}, a, b, c); + $.each(['attrs','params','flashvars','silverlight'], function(i,o) { + opts[o] = $.extend({}, p[o] || {}, a[o] || {}, b[o] || {}, c[o] || {}); + }); + + if (typeof opts.caption == 'undefined') opts.caption = $el.text(); + + // make sure we have a source! + opts.src = opts.src || $el.attr('href') || $el.attr('src') || 'unknown'; + return opts; +}; + +// +// Flash Player +// + +// generate flash using SWFObject library if possible +$.fn.media.swf = function(el, opts) { + if (!window.SWFObject && !window.swfobject) { + // roll our own + if (opts.flashvars) { + var a = []; + for (var f in opts.flashvars) + a.push(f + '=' + opts.flashvars[f]); + if (!opts.params) opts.params = {}; + opts.params.flashvars = a.join('&'); + } + return generate(el, opts, 'flash'); + } + + var id = el.id ? (' id="'+el.id+'"') : ''; + var cls = opts.cls ? (' class="' + opts.cls + '"') : ''; + var $div = $(''); + + // swfobject v2+ + if (window.swfobject) { + $(el).after($div).appendTo($div); + if (!el.id) el.id = 'movie_player_' + counter++; + + // replace el with swfobject content + swfobject.embedSWF(opts.src, el.id, opts.width, opts.height, opts.flashVersion, + opts.expressInstaller, opts.flashvars, opts.params, opts.attrs); + } + // swfobject < v2 + else { + $(el).after($div).remove(); + var so = new SWFObject(opts.src, 'movie_player_' + counter++, opts.width, opts.height, opts.flashVersion, opts.bgColor); + if (opts.expressInstaller) so.useExpressInstall(opts.expressInstaller); + + for (var p in opts.params) + if (p != 'bgColor') so.addParam(p, opts.params[p]); + for (var f in opts.flashvars) + so.addVariable(f, opts.flashvars[f]); + so.write($div[0]); + } + + if (opts.caption) $('
    ').appendTo($div).html(opts.caption); + return $div; +}; + +// map flv and mp3 files to the swf player by default +$.fn.media.flv = $.fn.media.mp3 = function(el, opts) { + var src = opts.src; + var player = /\.mp3\b/i.test(src) ? opts.mp3Player : opts.flvPlayer; + var key = opts.flvKeyName; + src = encodeURIComponent(src); + opts.src = player; + opts.src = opts.src + '?'+key+'=' + (src); + var srcObj = {}; + srcObj[key] = src; + opts.flashvars = $.extend({}, srcObj, opts.flashvars ); + return $.fn.media.swf(el, opts); +}; + +// +// Silverlight +// +$.fn.media.xaml = function(el, opts) { + if (!window.Sys || !window.Sys.Silverlight) { + if ($.fn.media.xaml.warning) return; + $.fn.media.xaml.warning = 1; + alert('You must include the Silverlight.js script.'); + return; + } + + var props = { + width: opts.width, + height: opts.height, + background: opts.bgColor, + inplaceInstallPrompt: opts.silverlight.inplaceInstallPrompt, + isWindowless: opts.silverlight.isWindowless, + framerate: opts.silverlight.framerate, + version: opts.silverlight.version + }; + var events = { + onError: opts.silverlight.onError, + onLoad: opts.silverlight.onLoad + }; + + var id1 = el.id ? (' id="'+el.id+'"') : ''; + var id2 = opts.id || 'AG' + counter++; + // convert element to div + var cls = opts.cls ? (' class="' + opts.cls + '"') : ''; + var $div = $(''); + $(el).after($div).remove(); + + Sys.Silverlight.createObjectEx({ + source: opts.src, + initParams: opts.silverlight.initParams, + userContext: opts.silverlight.userContext, + id: id2, + parentElement: $div[0], + properties: props, + events: events + }); + + if (opts.caption) $('
    ').appendTo($div).html(opts.caption); + return $div; +}; + +// +// generate object/embed markup +// +function generate(el, opts, player) { + var $el = $(el); + var o = $.fn.media.defaults.players[player]; + + if (player == 'iframe') { + o = $(''); + o.attr('src', opts.src); + o.css('backgroundColor', o.bgColor); + } + else if (player == 'img') { + o = $(''); + o.attr('src', opts.src); + opts.width && o.attr('width', opts.width); + opts.height && o.attr('height', opts.height); + o.css('backgroundColor', o.bgColor); + } + else if (lameIE) { + var a = [''); + var p = ['']; + for (var key in opts.params) + p.push(''); + var o = document.createElement(a.join('')); + for (var i=0; i < p.length; i++) + o.appendChild(document.createElement(p[i])); + } + else if (opts.standards) { + // Rewritten to be standards compliant by Richard Connamacher + var a = [''); + a.push(''); + for (var key in opts.params) { + if (key == 'wmode' && player != 'flash') // FF3/Quicktime borks on wmode + continue; + a.push(''); + } + // Alternate HTML + a.push('

    '+o.title+' Required

    '+o.title+' is required to view this media. Download Here.

    '); + a.push(''); + } + else { + var a = [''); + } + // convert element to div + var id = el.id ? (' id="'+el.id+'"') : ''; + var cls = opts.cls ? (' class="' + opts.cls + '"') : ''; + var $div = $(''); + $el.after($div).remove(); + (lameIE || player == 'iframe' || player == 'img') ? $div.append(o) : $div.html(a.join('')); + if (opts.caption) $('
    ').appendTo($div).html(opts.caption); + return $div; +}; + + +})(jQuery); + +/* autogeneration */ +define("jquery-media", [], function(){}); + +/* @source lib/jquery.pjax.js */; + +// jquery.pjax.js +// copyright chris wanstrath +// https://github.com/defunkt/jquery-pjax + +(function($){ + +// When called on a container with a selector, fetches the href with +// ajax into the container or with the data-pjax attribute on the link +// itself. +// +// Tries to make sure the back button and ctrl+click work the way +// you'd expect. +// +// Exported as $.fn.pjax +// +// Accepts a jQuery ajax options object that may include these +// pjax specific options: +// +// +// container - Where to stick the response body. Usually a String selector. +// $(container).html(xhr.responseBody) +// (default: current jquery context) +// push - Whether to pushState the URL. Defaults to true (of course). +// replace - Want to use replaceState instead? That's cool. +// +// For convenience the second parameter can be either the container or +// the options object. +// +// Returns the jQuery object +function fnPjax(selector, container, options) { + var context = this + return this.on('click.pjax', selector, function(event) { + var opts = $.extend({}, optionsFor(container, options)) + if (!opts.container) + opts.container = $(this).attr('data-pjax') || context + handleClick(event, opts) + }) +} + +// Public: pjax on click handler +// +// Exported as $.pjax.click. +// +// event - "click" jQuery.Event +// options - pjax options +// +// Examples +// +// $(document).on('click', 'a', $.pjax.click) +// // is the same as +// $(document).pjax('a') +// +// $(document).on('click', 'a', function(event) { +// var container = $(this).closest('[data-pjax-container]') +// $.pjax.click(event, container) +// }) +// +// Returns nothing. +function handleClick(event, container, options) { + options = optionsFor(container, options) + + var link = event.currentTarget + + if (link.tagName.toUpperCase() !== 'A') + throw "$.fn.pjax or $.pjax.click requires an anchor element" + + // Middle click, cmd click, and ctrl click should open + // links in a new tab as normal. + if ( event.which > 1 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey ) + return + + // Ignore cross origin links + if ( location.protocol !== link.protocol || location.hostname !== link.hostname ) + return + + // Ignore anchors on the same page + if (link.hash && link.href.replace(link.hash, '') === + location.href.replace(location.hash, '')) + return + + // Ignore empty anchor "foo.html#" + if (link.href === location.href + '#') + return + + // Ignore event with default prevented + if (event.isDefaultPrevented()) + return + + var defaults = { + url: link.href, + container: $(link).attr('data-pjax'), + target: link + } + + var opts = $.extend({}, defaults, options) + var clickEvent = $.Event('pjax:click') + $(link).trigger(clickEvent, [opts]) + + if (!clickEvent.isDefaultPrevented()) { + pjax(opts) + event.preventDefault() + $(link).trigger('pjax:clicked', [opts]) + } +} + +// Public: pjax on form submit handler +// +// Exported as $.pjax.submit +// +// event - "click" jQuery.Event +// options - pjax options +// +// Examples +// +// $(document).on('submit', 'form', function(event) { +// var container = $(this).closest('[data-pjax-container]') +// $.pjax.submit(event, container) +// }) +// +// Returns nothing. +function handleSubmit(event, container, options) { + options = optionsFor(container, options) + + var form = event.currentTarget + + if (form.tagName.toUpperCase() !== 'FORM') + throw "$.pjax.submit requires a form element" + + var defaults = { + type: form.method.toUpperCase(), + url: form.action, + data: $(form).serializeArray(), + container: $(form).attr('data-pjax'), + target: form + } + + pjax($.extend({}, defaults, options)) + + event.preventDefault() +} + +// Loads a URL with ajax, puts the response body inside a container, +// then pushState()'s the loaded URL. +// +// Works just like $.ajax in that it accepts a jQuery ajax +// settings object (with keys like url, type, data, etc). +// +// Accepts these extra keys: +// +// container - Where to stick the response body. +// $(container).html(xhr.responseBody) +// push - Whether to pushState the URL. Defaults to true (of course). +// replace - Want to use replaceState instead? That's cool. +// +// Use it just like $.ajax: +// +// var xhr = $.pjax({ url: this.href, container: '#main' }) +// console.log( xhr.readyState ) +// +// Returns whatever $.ajax returns. +function pjax(options) { + options = $.extend(true, {}, $.ajaxSettings, pjax.defaults, options) + + if ($.isFunction(options.url)) { + options.url = options.url() + } + + var target = options.target + + var hash = parseURL(options.url).hash + + var context = options.context = findContainerFor(options.container) + + // We want the browser to maintain two separate internal caches: one + // for pjax'd partial page loads and one for normal page loads. + // Without adding this secret parameter, some browsers will often + // confuse the two. + if (!options.data) options.data = {} + options.data._pjax = context.selector + + function fire(type, args, props) { + if (!props) props = {} + props.relatedTarget = target + var event = $.Event(type, props) + context.trigger(event, args) + return !event.isDefaultPrevented() + } + + var timeoutTimer + + options.beforeSend = function(xhr, settings) { + // No timeout for non-GET requests + // Its not safe to request the resource again with a fallback method. + if (settings.type !== 'GET') { + settings.timeout = 0 + } + + xhr.setRequestHeader('X-PJAX', 'true') + xhr.setRequestHeader('X-PJAX-Container', context.selector) + + if (!fire('pjax:beforeSend', [xhr, settings])) + return false + + if (settings.timeout > 0) { + timeoutTimer = setTimeout(function() { + if (fire('pjax:timeout', [xhr, options])) + xhr.abort('timeout') + }, settings.timeout) + + // Clear timeout setting so jquerys internal timeout isn't invoked + settings.timeout = 0 + } + + options.requestUrl = parseURL(settings.url).href + } + + options.complete = function(xhr, textStatus) { + if (timeoutTimer) + clearTimeout(timeoutTimer) + + fire('pjax:complete', [xhr, textStatus, options]) + + fire('pjax:end', [xhr, options]) + } + + options.error = function(xhr, textStatus, errorThrown) { + var container = extractContainer("", xhr, options) + + var allowed = fire('pjax:error', [xhr, textStatus, errorThrown, options]) + if (options.type == 'GET' && textStatus !== 'abort' && allowed) { + locationReplace(container.url) + } + } + + options.success = function(data, status, xhr) { + var previousState = pjax.state; + + // If $.pjax.defaults.version is a function, invoke it first. + // Otherwise it can be a static string. + var currentVersion = (typeof $.pjax.defaults.version === 'function') ? + $.pjax.defaults.version() : + $.pjax.defaults.version + + var latestVersion = xhr.getResponseHeader('X-PJAX-Version') + + var container = extractContainer(data, xhr, options) + + // If there is a layout version mismatch, hard load the new url + if (currentVersion && latestVersion && currentVersion !== latestVersion) { + locationReplace(container.url) + return + } + + // If the new response is missing a body, hard load the page + if (!container.contents) { + locationReplace(container.url) + return + } + + pjax.state = { + id: options.id || uniqueId(), + url: container.url, + title: container.title, + container: context.selector, + fragment: options.fragment, + timeout: options.timeout + } + + if (options.push || options.replace) { + window.history.replaceState(pjax.state, container.title, container.url) + } + + // Clear out any focused controls before inserting new page contents. + try { + document.activeElement.blur() + } catch (e) { } + + if (container.title) document.title = container.title + + fire('pjax:beforeReplace', [container.contents, options], { + state: pjax.state, + previousState: previousState + }) + context.html(container.contents) + + // FF bug: Won't autofocus fields that are inserted via JS. + // This behavior is incorrect. So if theres no current focus, autofocus + // the last field. + // + // http://www.w3.org/html/wg/drafts/html/master/forms.html + var autofocusEl = context.find('input[autofocus], textarea[autofocus]').last()[0] + if (autofocusEl && document.activeElement !== autofocusEl) { + autofocusEl.focus(); + } + + executeScriptTags(container.scripts) + + // Scroll to top by default + if (typeof options.scrollTo === 'number') + $(window).scrollTop(options.scrollTo) + + // If the URL has a hash in it, make sure the browser + // knows to navigate to the hash. + if ( hash !== '' ) { + // Avoid using simple hash set here. Will add another history + // entry. Replace the url with replaceState and scroll to target + // by hand. + // + // window.location.hash = hash + var url = parseURL(container.url) + url.hash = hash + + pjax.state.url = url.href + window.history.replaceState(pjax.state, container.title, url.href) + + var target = $(url.hash) + if (target.length) $(window).scrollTop(target.offset().top) + } + + fire('pjax:success', [data, status, xhr, options]) + } + + + // Initialize pjax.state for the initial page load. Assume we're + // using the container and options of the link we're loading for the + // back button to the initial page. This ensures good back button + // behavior. + if (!pjax.state) { + pjax.state = { + id: uniqueId(), + url: window.location.href, + title: document.title, + container: context.selector, + fragment: options.fragment, + timeout: options.timeout + } + window.history.replaceState(pjax.state, document.title) + } + + // Cancel the current request if we're already pjaxing + var xhr = pjax.xhr + if ( xhr && xhr.readyState < 4) { + xhr.onreadystatechange = $.noop + xhr.abort() + } + + pjax.options = options + var xhr = pjax.xhr = $.ajax(options) + + if (xhr.readyState > 0) { + if (options.push && !options.replace) { + // Cache current container element before replacing it + cachePush(pjax.state.id, context.clone().contents()) + + window.history.pushState(null, "", stripPjaxParam(options.requestUrl)) + } + + fire('pjax:start', [xhr, options]) + fire('pjax:send', [xhr, options]) + } + + return pjax.xhr +} + +// Public: Reload current page with pjax. +// +// Returns whatever $.pjax returns. +function pjaxReload(container, options) { + var defaults = { + url: window.location.href, + push: false, + replace: true, + scrollTo: false + } + + return pjax($.extend(defaults, optionsFor(container, options))) +} + +// Internal: Hard replace current state with url. +// +// Work for around WebKit +// https://bugs.webkit.org/show_bug.cgi?id=93506 +// +// Returns nothing. +function locationReplace(url) { + window.history.replaceState(null, "", "#") + window.location.replace(url) +} + + +var initialPop = true +var initialURL = window.location.href +var initialState = window.history.state + +// Initialize $.pjax.state if possible +// Happens when reloading a page and coming forward from a different +// session history. +if (initialState && initialState.container) { + pjax.state = initialState +} + +// Non-webkit browsers don't fire an initial popstate event +if ('state' in window.history) { + initialPop = false +} + +// popstate handler takes care of the back and forward buttons +// +// You probably shouldn't use pjax on pages with other pushState +// stuff yet. +function onPjaxPopstate(event) { + var previousState = pjax.state; + var state = event.state + + if (state && state.container) { + // When coming forward from a separate history session, will get an + // initial pop with a state we are already at. Skip reloading the current + // page. + if (initialPop && initialURL == state.url) return + + // If popping back to the same state, just skip. + // Could be clicking back from hashchange rather than a pushState. + if (pjax.state && pjax.state.id === state.id) return + + var container = $(state.container) + if (container.length) { + var direction, contents = cacheMapping[state.id] + + if (pjax.state) { + // Since state ids always increase, we can deduce the history + // direction from the previous state. + direction = pjax.state.id < state.id ? 'forward' : 'back' + + // Cache current container before replacement and inform the + // cache which direction the history shifted. + cachePop(direction, pjax.state.id, container.clone().contents()) + } + + var popstateEvent = $.Event('pjax:popstate', { + state: state, + direction: direction + }) + container.trigger(popstateEvent) + + var options = { + id: state.id, + url: state.url, + container: container, + push: false, + fragment: state.fragment, + timeout: state.timeout, + scrollTo: false + } + + if (contents) { + container.trigger('pjax:start', [null, options]) + + pjax.state = state + if (state.title) document.title = state.title + var beforeReplaceEvent = $.Event('pjax:beforeReplace', { + state: state, + previousState: previousState + }) + container.trigger(beforeReplaceEvent, [contents, options]) + container.html(contents) + + container.trigger('pjax:end', [null, options]) + } else { + pjax(options) + } + + // Force reflow/relayout before the browser tries to restore the + // scroll position. + container[0].offsetHeight + } else { + locationReplace(location.href) + } + } + initialPop = false +} + +// Fallback version of main pjax function for browsers that don't +// support pushState. +// +// Returns nothing since it retriggers a hard form submission. +function fallbackPjax(options) { + var url = $.isFunction(options.url) ? options.url() : options.url, + method = options.type ? options.type.toUpperCase() : 'GET' + + var form = $('
    ', { + method: method === 'GET' ? 'GET' : 'POST', + action: url, + style: 'display:none' + }) + + if (method !== 'GET' && method !== 'POST') { + form.append($('', { + type: 'hidden', + name: '_method', + value: method.toLowerCase() + })) + } + + var data = options.data + if (typeof data === 'string') { + $.each(data.split('&'), function(index, value) { + var pair = value.split('=') + form.append($('', {type: 'hidden', name: pair[0], value: pair[1]})) + }) + } else if (typeof data === 'object') { + for (key in data) + form.append($('', {type: 'hidden', name: key, value: data[key]})) + } + + $(document.body).append(form) + form.submit() +} + +// Internal: Generate unique id for state object. +// +// Use a timestamp instead of a counter since ids should still be +// unique across page loads. +// +// Returns Number. +function uniqueId() { + return (new Date).getTime() +} + +// Internal: Strips _pjax param from url +// +// url - String +// +// Returns String. +function stripPjaxParam(url) { + return url + .replace(/\?_pjax=[^&]+&?/, '?') + .replace(/_pjax=[^&]+&?/, '') + .replace(/[\?&]$/, '') +} + +// Internal: Parse URL components and returns a Locationish object. +// +// url - String URL +// +// Returns HTMLAnchorElement that acts like Location. +function parseURL(url) { + var a = document.createElement('a') + a.href = url + return a +} + +// Internal: Build options Object for arguments. +// +// For convenience the first parameter can be either the container or +// the options object. +// +// Examples +// +// optionsFor('#container') +// // => {container: '#container'} +// +// optionsFor('#container', {push: true}) +// // => {container: '#container', push: true} +// +// optionsFor({container: '#container', push: true}) +// // => {container: '#container', push: true} +// +// Returns options Object. +function optionsFor(container, options) { + // Both container and options + if ( container && options ) + options.container = container + + // First argument is options Object + else if ( $.isPlainObject(container) ) + options = container + + // Only container + else + options = {container: container} + + // Find and validate container + if (options.container) + options.container = findContainerFor(options.container) + + return options +} + +// Internal: Find container element for a variety of inputs. +// +// Because we can't persist elements using the history API, we must be +// able to find a String selector that will consistently find the Element. +// +// container - A selector String, jQuery object, or DOM Element. +// +// Returns a jQuery object whose context is `document` and has a selector. +function findContainerFor(container) { + container = $(container) + + if ( !container.length ) { + throw "no pjax container for " + container.selector + } else if ( container.selector !== '' && container.context === document ) { + return container + } else if ( container.attr('id') ) { + return $('#' + container.attr('id')) + } else { + throw "cant get selector for pjax container!" + } +} + +// Internal: Filter and find all elements matching the selector. +// +// Where $.fn.find only matches descendants, findAll will test all the +// top level elements in the jQuery object as well. +// +// elems - jQuery object of Elements +// selector - String selector to match +// +// Returns a jQuery object. +function findAll(elems, selector) { + return elems.filter(selector).add(elems.find(selector)); +} + +function parseHTML(html) { + return $.parseHTML(html, document, true) +} + +// Internal: Extracts container and metadata from response. +// +// 1. Extracts X-PJAX-URL header if set +// 2. Extracts inline tags +// 3. Builds response Element and extracts fragment if set +// +// data - String response data +// xhr - XHR response +// options - pjax options Object +// +// Returns an Object with url, title, and contents keys. +function extractContainer(data, xhr, options) { + var obj = {} + + // Prefer X-PJAX-URL header if it was set, otherwise fallback to + // using the original requested url. + obj.url = stripPjaxParam(xhr.getResponseHeader('X-PJAX-URL') || options.requestUrl) + + // Attempt to parse response html into elements + if (/<html/i.test(data)) { + var $head = $(parseHTML(data.match(/<head[^>]*>([\s\S.]*)<\/head>/i)[0])) + var $body = $(parseHTML(data.match(/<body[^>]*>([\s\S.]*)<\/body>/i)[0])) + } else { + var $head = $body = $(parseHTML(data)) + } + + // If response data is empty, return fast + if ($body.length === 0) + return obj + + // If there's a <title> tag in the header, use it as + // the page's title. + obj.title = findAll($head, 'title').last().text() + + if (options.fragment) { + // If they specified a fragment, look for it in the response + // and pull it out. + if (options.fragment === 'body') { + var $fragment = $body + } else { + var $fragment = findAll($body, options.fragment).first() + } + + if ($fragment.length) { + obj.contents = $fragment.contents() + + // If there's no title, look for data-title and title attributes + // on the fragment + if (!obj.title) + obj.title = $fragment.attr('title') || $fragment.data('title') + } + + } else if (!/<html/i.test(data)) { + obj.contents = $body + } + + // Clean up any <title> tags + if (obj.contents) { + // Remove any parent title elements + obj.contents = obj.contents.not(function() { return $(this).is('title') }) + + // Then scrub any titles from their descendants + obj.contents.find('title').remove() + + // Gather all script[src] elements + obj.scripts = findAll(obj.contents, 'script[src]').remove() + obj.contents = obj.contents.not(obj.scripts) + } + + // Trim any whitespace off the title + if (obj.title) obj.title = $.trim(obj.title) + + return obj +} + +// Load an execute scripts using standard script request. +// +// Avoids jQuery's traditional $.getScript which does a XHR request and +// globalEval. +// +// scripts - jQuery object of script Elements +// +// Returns nothing. +function executeScriptTags(scripts) { + if (!scripts) return + + var existingScripts = $('script[src]') + + scripts.each(function() { + var src = this.src + var matchedScripts = existingScripts.filter(function() { + return this.src === src + }) + if (matchedScripts.length) return + + var script = document.createElement('script') + script.type = $(this).attr('type') + script.src = $(this).attr('src') + document.head.appendChild(script) + }) +} + +// Internal: History DOM caching class. +var cacheMapping = {} +var cacheForwardStack = [] +var cacheBackStack = [] + +// Push previous state id and container contents into the history +// cache. Should be called in conjunction with `pushState` to save the +// previous container contents. +// +// id - State ID Number +// value - DOM Element to cache +// +// Returns nothing. +function cachePush(id, value) { + cacheMapping[id] = value + cacheBackStack.push(id) + + // Remove all entires in forward history stack after pushing + // a new page. + while (cacheForwardStack.length) + delete cacheMapping[cacheForwardStack.shift()] + + // Trim back history stack to max cache length. + while (cacheBackStack.length > pjax.defaults.maxCacheLength) + delete cacheMapping[cacheBackStack.shift()] +} + +// Shifts cache from directional history cache. Should be +// called on `popstate` with the previous state id and container +// contents. +// +// direction - "forward" or "back" String +// id - State ID Number +// value - DOM Element to cache +// +// Returns nothing. +function cachePop(direction, id, value) { + var pushStack, popStack + cacheMapping[id] = value + + if (direction === 'forward') { + pushStack = cacheBackStack + popStack = cacheForwardStack + } else { + pushStack = cacheForwardStack + popStack = cacheBackStack + } + + pushStack.push(id) + if (id = popStack.pop()) + delete cacheMapping[id] +} + +// Public: Find version identifier for the initial page load. +// +// Returns String version or undefined. +function findVersion() { + return $('meta').filter(function() { + var name = $(this).attr('http-equiv') + return name && name.toUpperCase() === 'X-PJAX-VERSION' + }).attr('content') +} + +// Install pjax functions on $.pjax to enable pushState behavior. +// +// Does nothing if already enabled. +// +// Examples +// +// $.pjax.enable() +// +// Returns nothing. +function enable() { + $.fn.pjax = fnPjax + $.pjax = pjax + $.pjax.enable = $.noop + $.pjax.disable = disable + $.pjax.click = handleClick + $.pjax.submit = handleSubmit + $.pjax.reload = pjaxReload + $.pjax.defaults = { + timeout: 650, + push: true, + replace: false, + type: 'GET', + dataType: 'html', + scrollTo: 0, + maxCacheLength: 20, + version: findVersion + } + $(window).on('popstate.pjax', onPjaxPopstate) +} + +// Disable pushState behavior. +// +// This is the case when a browser doesn't support pushState. It is +// sometimes useful to disable pushState for debugging on a modern +// browser. +// +// Examples +// +// $.pjax.disable() +// +// Returns nothing. +function disable() { + $.fn.pjax = function() { return this } + $.pjax = fallbackPjax + $.pjax.enable = enable + $.pjax.disable = $.noop + $.pjax.click = $.noop + $.pjax.submit = $.noop + $.pjax.reload = function() { window.location.reload() } + + $(window).off('popstate.pjax', onPjaxPopstate) +} + + +// Add the state property to jQuery's event object so we can use it in +// $(window).bind('popstate') +if ( $.inArray('state', $.event.props) < 0 ) + $.event.props.push('state') + +// Is pjax supported by this browser? +$.support.pjax = + window.history && window.history.pushState && window.history.replaceState && + // pushState isn't reliable on iOS until 5. + !navigator.userAgent.match(/((iPod|iPhone|iPad).+\bOS\s+[1-4]|WebApps\/.+CFNetwork)/) + +$.support.pjax ? enable() : disable() + +})(jQuery); + +/* autogeneration */ +define("pjax", [], function(){}); + +/* @source lib/string_score.js */; + +/*! + * string_score.js: String Scoring Algorithm 0.1.10 + * + * http://joshaven.com/string_score + * https://github.com/joshaven/string_score + * + * Copyright (C) 2009-2011 Joshaven Potter <yourtech@gmail.com> + * Special thanks to all of the contributors listed here https://github.com/joshaven/string_score + * MIT license: http://www.opensource.org/licenses/mit-license.php + * + * Date: Tue Mar 1 2011 +*/ + +/** + * Scores a string against another string. + * 'Hello World'.score('he'); //=> 0.5931818181818181 + * 'Hello World'.score('Hello'); //=> 0.7318181818181818 + */ +String.prototype.score = function(abbreviation, fuzziness) { + // If the string is equal to the abbreviation, perfect match. + if (this == abbreviation) {return 1;} + //if it's not a perfect match and is empty return 0 + if(abbreviation == "") {return 0;} + + var total_character_score = 0, + abbreviation_length = abbreviation.length, + string = this, + string_length = string.length, + start_of_string_bonus, + abbreviation_score, + fuzzies=1, + final_score; + + // Walk through abbreviation and add up scores. + for (var i = 0, + character_score/* = 0*/, + index_in_string/* = 0*/, + c/* = ''*/, + index_c_lowercase/* = 0*/, + index_c_uppercase/* = 0*/, + min_index/* = 0*/; + i < abbreviation_length; + ++i) { + + // Find the first case-insensitive match of a character. + c = abbreviation.charAt(i); + + index_c_lowercase = string.indexOf(c.toLowerCase()); + index_c_uppercase = string.indexOf(c.toUpperCase()); + min_index = Math.min(index_c_lowercase, index_c_uppercase); + index_in_string = (min_index > -1) ? min_index : Math.max(index_c_lowercase, index_c_uppercase); + + if (index_in_string === -1) { + if (fuzziness) { + fuzzies += 1-fuzziness; + continue; + } else { + return 0; + } + } else { + character_score = 0.1; + } + + // Set base score for matching 'c'. + + // Same case bonus. + if (string[index_in_string] === c) { + character_score += 0.1; + } + + // Consecutive letter & start-of-string Bonus + if (index_in_string === 0) { + // Increase the score when matching first character of the remainder of the string + character_score += 0.6; + if (i === 0) { + // If match is the first character of the string + // & the first character of abbreviation, add a + // start-of-string match bonus. + start_of_string_bonus = 1 //true; + } + } + else { + // Acronym Bonus + // Weighing Logic: Typing the first character of an acronym is as if you + // preceded it with two perfect character matches. + if (string.charAt(index_in_string - 1) === ' ') { + character_score += 0.8; // * Math.min(index_in_string, 5); // Cap bonus at 0.4 * 5 + } + } + + // Left trim the already matched part of the string + // (forces sequential matching). + string = string.substring(index_in_string + 1, string_length); + + total_character_score += character_score; + } // end of for loop + + // Uncomment to weigh smaller words higher. + // return total_character_score / string_length; + + abbreviation_score = total_character_score / abbreviation_length; + //percentage_of_matched_string = abbreviation_length / string_length; + //word_score = abbreviation_score * percentage_of_matched_string; + + // Reduce penalty for longer strings. + //final_score = (word_score + abbreviation_score) / 2; + final_score = ((abbreviation_score * (abbreviation_length / string_length)) + abbreviation_score) / 2; + + final_score = final_score / fuzzies; + + if (start_of_string_bonus && (final_score + 0.15 < 1)) { + final_score += 0.15; + } + + return final_score; +}; + +/* autogeneration */ +define("string-score", [], function(){}); + +/* @source lib/keymaster.js */; + +// keymaster.js +// (c) 2011-2012 Thomas Fuchs +// keymaster.js may be freely distributed under the MIT license. + +;(function(global){ + var k, + _handlers = {}, + _mods = { 16: false, 18: false, 17: false, 91: false }, + _scope = 'all', + // modifier keys + _MODIFIERS = { + '⇧': 16, shift: 16, + '⌥': 18, alt: 18, option: 18, + '⌃': 17, ctrl: 17, control: 17, + '⌘': 91, command: 91 + }, + // special keys + _MAP = { + backspace: 8, tab: 9, clear: 12, + enter: 13, 'return': 13, + esc: 27, escape: 27, space: 32, + left: 37, up: 38, + right: 39, down: 40, + del: 46, 'delete': 46, + home: 36, end: 35, + pageup: 33, pagedown: 34, + ',': 188, '.': 190, '/': 191, + '`': 192, '-': 189, '=': 187, + ';': 186, '\'': 222, + '[': 219, ']': 221, '\\': 220 + }, + _downKeys = []; + + for(k=1;k<20;k++) _MODIFIERS['f'+k] = 111+k; + + // IE doesn't support Array#indexOf, so have a simple replacement + function index(array, item){ + var i = array.length; + while(i--) if(array[i]===item) return i; + return -1; + } + + // handle keydown event + function dispatch(event, scope){ + var key, handler, k, i, modifiersMatch; + key = event.keyCode; + + if (index(_downKeys, key) == -1) { + _downKeys.push(key); + } + + // if a modifier key, set the key.<modifierkeyname> property to true and return + if(key == 93 || key == 224) key = 91; // right command on webkit, command on Gecko + if(key in _mods) { + _mods[key] = true; + // 'assignKey' from inside this closure is exported to window.key + for(k in _MODIFIERS) if(_MODIFIERS[k] == key) assignKey[k] = true; + return; + } + + // see if we need to ignore the keypress (filter() can can be overridden) + // by default ignore key presses if a select, textarea, or input is focused + if(!assignKey.filter.call(this, event)) return; + + // abort if no potentially matching shortcuts found + if (!(key in _handlers)) return; + + // for each potential shortcut + for (i = 0; i < _handlers[key].length; i++) { + handler = _handlers[key][i]; + + // see if it's in the current scope + if(handler.scope == scope || handler.scope == 'all'){ + // check if modifiers match if any + modifiersMatch = handler.mods.length > 0; + for(k in _mods) + if((!_mods[k] && index(handler.mods, +k) > -1) || + (_mods[k] && index(handler.mods, +k) == -1)) modifiersMatch = false; + // call the handler and stop the event if neccessary + if((handler.mods.length == 0 && !_mods[16] && !_mods[18] && !_mods[17] && !_mods[91]) || modifiersMatch){ + if(handler.method(event, handler)===false){ + if(event.preventDefault) event.preventDefault(); + else event.returnValue = false; + if(event.stopPropagation) event.stopPropagation(); + if(event.cancelBubble) event.cancelBubble = true; + } + } + } + } + }; + + // unset modifier keys on keyup + function clearModifier(event){ + var key = event.keyCode, k, + i = index(_downKeys, key); + + // remove key from _downKeys + if (i >= 0) { + _downKeys.splice(i, 1); + } + + if(key == 93 || key == 224) key = 91; + if(key in _mods) { + _mods[key] = false; + for(k in _MODIFIERS) if(_MODIFIERS[k] == key) assignKey[k] = false; + } + }; + + function resetModifiers() { + for(k in _mods) _mods[k] = false; + for(k in _MODIFIERS) assignKey[k] = false; + } + + // parse and assign shortcut + function assignKey(key, scope, method){ + var keys, mods, i, mi; + if (method === undefined) { + method = scope; + scope = 'all'; + } + key = key.replace(/\s/g,''); + keys = key.split(','); + + if((keys[keys.length-1])=='') + keys[keys.length-2] += ','; + // for each shortcut + for (i = 0; i < keys.length; i++) { + // set modifier keys if any + mods = []; + key = keys[i].split('+'); + if(key.length > 1){ + mods = key.slice(0,key.length-1); + for (mi = 0; mi < mods.length; mi++) + mods[mi] = _MODIFIERS[mods[mi]]; + key = [key[key.length-1]]; + } + // convert to keycode and... + key = key[0] + key = _MAP[key] || key.toUpperCase().charCodeAt(0); + // ...store handler + if (!(key in _handlers)) _handlers[key] = []; + _handlers[key].push({ shortcut: keys[i], scope: scope, method: method, key: keys[i], mods: mods }); + } + }; + + // Returns true if the key with code 'keyCode' is currently down + // Converts strings into key codes. + function isPressed(keyCode) { + if (typeof(keyCode)=='string') { + if (keyCode.length == 1) { + keyCode = (keyCode.toUpperCase()).charCodeAt(0); + } else { + return false; + } + } + return index(_downKeys, keyCode) != -1; + } + + function getPressedKeyCodes() { + return _downKeys; + } + + function filter(event){ + var tagName = (event.target || event.srcElement).tagName; + // ignore keypressed in any elements that support keyboard data input + return !(tagName == 'INPUT' || tagName == 'SELECT' || tagName == 'TEXTAREA'); + } + + // initialize key.<modifier> to false + for(k in _MODIFIERS) assignKey[k] = false; + + // set current scope (default 'all') + function setScope(scope){ _scope = scope || 'all' }; + function getScope(){ return _scope || 'all' }; + + // delete all handlers for a given scope + function deleteScope(scope){ + var key, handlers, i; + + for (key in _handlers) { + handlers = _handlers[key]; + for (i = 0; i < handlers.length; ) { + if (handlers[i].scope === scope) handlers.splice(i, 1); + else i++; + } + } + }; + + // cross-browser events + function addEvent(object, event, method) { + if (object.addEventListener) + object.addEventListener(event, method, false); + else if(object.attachEvent) + object.attachEvent('on'+event, function(){ method(window.event) }); + }; + + // set the handlers globally on document + addEvent(document, 'keydown', function(event) { dispatch(event, _scope) }); // Passing _scope to a callback to ensure it remains the same by execution. Fixes #48 + addEvent(document, 'keyup', clearModifier); + + // reset modifiers to false whenever the window is (re)focused. + addEvent(window, 'focus', resetModifiers); + + // store previously defined key + var previousKey = global.key; + + // restore previously defined key and return reference to our key object + function noConflict() { + var k = global.key; + global.key = previousKey; + return k; + } + + // set window.key and window.key.set/get/deleteScope, and the default filter + global.key = assignKey; + global.key.setScope = setScope; + global.key.getScope = getScope; + global.key.deleteScope = deleteScope; + global.key.filter = filter; + global.key.isPressed = isPressed; + global.key.getPressedKeyCodes = getPressedKeyCodes; + global.key.noConflict = noConflict; + + if(typeof module !== 'undefined') module.exports = key; + +})(this); + +/* autogeneration */ +define("lib/keymaster.js", [], function(){}); + +/* @source mod/zclip.js */; + +define('mod/zclip', [ + "jquery", + "jquery-zclip" +], function($, _) { + $(function () { + $('input.git-url').focus(function(e) { + var elem = this; + setTimeout(function() { + elem.select(); + }, 0); + }); + $('.copy-git-url').zclip({ + path: '/static/js/lib/ZeroClipboard.swf', + copy: function() { + return $('.copy-git-url').attr('data-clipboard-text'); + }, + afterCopy: function() {} + }); + }); +}); + +/* @source mod/shortcut.js */; + +define('mod/shortcut', [ + "jquery", + "key" +], function($, key){ + // add shortcut key + var forkBtn = $('#fork-btn'), pullreqBtn = $('#pullrequest-btn'); + /* + if (forkBtn) { + forkBtn.click(function () { + window.location.href = forkBtn.attr("href"); + }); + key('f', function () {forkBtn.click();}); + } + */ + if (pullreqBtn) { + pullreqBtn.click(function () { + window.location.href = pullreqBtn.attr("href"); + }); + key('p', function () {pullreqBtn.click();}); + } +}); + +/* @source mod/fetch.js */; + +define('mod/fetch', [ + "jquery" +], function($){ + + $(function() { + var fetch_btn = $("#fetch-btn"); + var proj_id = fetch_btn.attr("proj_id"); + + fetch_btn.click(function() { + $.ajax("/fetch/"+proj_id, { + type: "POST", + success: function(data) { + if (!data.error) { + show_success("后台已经开始更新仓库,请耐心等待."); + } else { + show_error("仓库更新失败."); + } + }, + error: function(e) { + show_error("仓库更新失败."); + } + }); + }); + + function show_success(msg) { + var successDiv = $(".navbar .success"); + if (successDiv.size() === 0 ) { + successDiv= $("<div>").addClass("success").addClass("alert-success").addClass("alert"); + $("div.pagehead").append(successDiv); + } + successDiv.html(msg); + successDiv.fadeOut(5000, function () { + $(this).remove(); + }); + } + + function show_error(msg) { + var errorDiv = $(".navbar .error"); + if (errorDiv.size() === 0 ) { + errorDiv = $("<div>").addClass("error").addClass("alert-error").addClass("alert"); + $("div.pagehead").append(errorDiv); + } + errorDiv.html(msg); + } + + }); +}); + +/* @source mod/watch.js */; + +define('mod/watch', [ + "jquery" +], function($){ + + $(function() { + var watch_btn = $("#watch-btn"); + var countLabel = $('#watched-count'); + var proj_id = watch_btn.attr("proj_id"); + + var updateLabelBy = function (n) { + var count = Number(countLabel.text()) || 0; + if (count === 0 && n <= 0) { return; } + + count += n; + countLabel.text(count.toString()); + }; + + watch_btn.click(function() { + + if(watch_btn.hasClass('watch')) { + $.post("/watch/"+proj_id, function(data) { + if (!data.error) { + watch_btn.text('Unwatch'); + watch_btn.addClass('unwatch'); + watch_btn.removeClass('watch'); + updateLabelBy(1); + } else { + // show error notification to user + show_error("关注失败"); + } + }); + } + else{ + $.ajax("/watch/"+proj_id, { + type: "DELETE", + success: function(data) { + if (!data.error) { + watch_btn.text('Watch'); + watch_btn.addClass('watch'); + watch_btn.removeClass('unwatch'); + updateLabelBy(-1); + } else { + show_error("取消关注失败"); + } + }, + error: function(e) { + show_error("取消关注失败"); + } + }); + } + }); + + function show_success(msg) { + var successDiv = $(".navbar .success"); + if (successDiv.size() === 0 ) { + successDiv= $("<div>").addClass("success").addClass("alert-success"); + $("div.navbar").append(successDiv); + } + successDiv.html(msg); + successDiv.fadeOut(1500, function () { + $(this).remove(); + }); + } + + function show_error(msg) { + var errorDiv = $(".navbar .error"); + if (errorDiv.size() === 0 ) { + errorDiv = $("<div>").addClass("error").addClass("alert-error"); + $("div.navbar").append(errorDiv); + } + errorDiv.html(msg); + } + + }); +}); + +/* @source mod/type_search.js */; + +define('mod/type_search',[ + "jquery", + "string-score" +], function() { + var typeSearching = false, + projectName = $('#project_name').val(), + currentBranch = $('#current_branch').val(), + fileList, + fileListContainer, + fileListContainerBody, + searchInput = $('<input class="typing-search-input" type="text" autocomplete="off" spellcheck="false">'), + subPathsEle = $('#J_SubPaths'), + FILE_PATH_PREFIX = ['', projectName, 'blob', currentBranch, ''].join('/'), + TAG_MARK = 'mark', + TPL_FILE_LIST_WRAP = '\ + <div class="span12">\ + <table class="tree-browser finder" cellspacing="0" cellpadding="0">\ + <tbody>{ITEMS}</tbody>\ + </table>\ + </div>', + TPL_FILE_LIST_ITEM = '<tr class="tree-item"><td><a href="' + FILE_PATH_PREFIX + '{URL}">{NAME}</td></tr>', + CSS = '\ + input.typing-search-input { display:none; border:none; box-shadow:none; border-radius:none; padding:0; margin-bottom:0; font-size:100%; vertical-align:top; transition:none; }\ + input.typing-search-input:focus { box-shadow:none; }\ + .tree-browser.finder td { padding-left:20px; }\ + .tree-browser.finder tr.hover td { background:#fffeeb; }', + + SCROLLING_HOVER_LOCK = false, + CLICK_LOCK = false, + BLACK_LIST = { 'INPUT': 1, 'TEXTAREA': 1 }; + LOCK_TIMEOUT = 150; + + $('<style>' + CSS + '</style>').appendTo('head'); + + // insert search input + searchInput.insertAfter(subPathsEle); + $(document) + .keydown(function(evt) { + if (typeSearching && evt.keyCode === 27) { + searchInput.blur(); + + evt.preventDefault(); + } + }) + + .keypress(function(evt) { + if (typeSearching || evt.target.nodeName in BLACK_LIST ) return; + + if (!evt.metaKey && evt.charCode === 't'.charCodeAt(0)) { + + typeSearching = true; + + var def = $.Deferred(); + + if (!fileList) { + $.get('/api/' + projectName + '/git/allfiles', {'branch': currentBranch}, function(res) { + fileList = res; + fileListContainer = $(TPL_FILE_LIST_WRAP.replace('{ITEMS}', buildFileListHtml(fileList))).appendTo('.raw'); + fileListContainerBody = fileListContainer.find('tbody'); + + fileListContainerBody + .bind('mouseover mouseout', function(evt) { + // console.log('mouse') + if (SCROLLING_HOVER_LOCK) return; + + var target = evt.target, + ele; + + if (target.nodeName === 'TR') { + ele = $(target); + } else { + ele = $(target).parents('tr'); + } + + if (ele) { + $(this).find('tr').removeClass('hover'); + + if (evt.type === 'mouseover') { + ele.addClass('hover'); + } else { + ele.removeClass('hover'); + } + } + + }) + + .click(function(evt) { + var target = evt.target; + + if (target.nodeName !== 'A') { + window.location = $(target).find('a').attr('href'); + } + + CLICK_LOCK = true; + }); + + def.resolve(); + }, 'json'); + } else { + def.resolve(); + } + + def.done(function() { + searchInput.focus(); + }); + + evt.preventDefault(); + } + }); + + searchInput + .focus(function(evt) { + $(this).show(); + + subPathsEle.hide(); + + fileListContainerBody.html(buildFileListHtml(fileList)); + fileListContainer.show(); + $('#tree').hide(); + $('#readme').hide(); + }) + + .blur(function(evt) { + var self = this; + + setTimeout(function() { + if (CLICK_LOCK) return; + + $(self).hide().val(''); + + subPathsEle.show(); + + fileListContainer && fileListContainer.hide(); + $('#tree').show(); + $('#readme').show(); + + typeSearching = false; + }, LOCK_TIMEOUT); + }) + + .keydown(function(evt) { + var keyCode, item; + + if ((keyCode = evt.keyCode) === 27 || !typeSearching || !fileList) { + return; + } + + switch (keyCode) { + // UP + case 38: + fileSelect(-1); + evt.preventDefault(); + return; + // DOWN + case 40: + fileSelect(1); + evt.preventDefault(); + return; + // ENTER + case 13: + item = fileListContainerBody.find('tr.hover'); + item.click(); + return; + } + + var ele = this; + + setTimeout(function() { + var value = $.trim(ele.value), + result; + + if (!value) { + result = fileList; + } else { + // match + result = matchFileList(fileList, value); + + // sort + result = sortFileList(result); + + // get final fileList + result = $.map(result, function(item) { + return item.file; + }); + + } + + // fileListContainerBody.html(buildFileListHtml(result)); + fileListContainerBody[0].innerHTML = buildFileListHtml(result, value); + + }, 0); + + evt.stopPropagation(); + }); + + function buildFileListHtml(fileList, keyword) { + var html = ''; + + fileList.forEach(function(fileName) { + var name = fileName; + if (keyword) { + name = name.replace(keyword, '<' + TAG_MARK + '>' + keyword + '</' + TAG_MARK + '>'); + } + html += TPL_FILE_LIST_ITEM.replace(/\{URL\}/g, fileName).replace(/\{NAME\}/g, name); + }); + + return html; + } + + function matchFileList(fileList, keyword) { + var result = []; + + fileList.forEach(function(file) { + var score; + if (score = file.score(keyword)) { + result.push({ + score: score, + file: file + }); + } + }); + + return result; + } + + function sortFileList(fileListWithScore) { + return fileListWithScore.sort(function(a, b) { + return b.score - a.score; + }); + } + + function fileSelect(direction) { + var currentFileItem = fileListContainerBody.find('tr.hover'), + fileItems, fileItem; + + if (currentFileItem.length === 0) { + fileItems = fileListContainerBody.find('tr'); + fileItem = direction === 1 ? fileItems.eq(0) : fileItems.eq(-1); + } else { + fileItem = direction === 1 ? currentFileItem.next() : currentFileItem.prev(); + + if (fileItem.length === 0) { + fileItems = fileListContainerBody.find('tr'); + // scroll loop + fileItem = direction === 1 ? fileItems.eq(0) : fileItems.eq(-1); + } + } + + currentFileItem.removeClass('hover'); + fileItem.addClass('hover'); + + scrollIntoView(fileItem); + } + + var lockTimer; + + function scrollIntoView(element) { + element = $(element); + + var offsetTop = element.offset().top, + scrollTop = $(document).scrollTop(), + viewPortHeight = $(window).height(), + diff; + + if ( (diff = offsetTop - scrollTop) <= 0 || + (diff = offsetTop + element.height() - (scrollTop + viewPortHeight)) >= 0 ) { + + window.scrollTo(0, scrollTop + diff); + + // prevent scrolling trigger mouse event + // console.log('lock') + SCROLLING_HOVER_LOCK = true; + + if (lockTimer) { + clearTimeout(lockTimer); + lockTimer = null; + } + + lockTimer = setTimeout(function() { + // console.log('unlock') + SCROLLING_HOVER_LOCK = false; + }, LOCK_TIMEOUT); + } + + } + +}); + +/* @source */; + +define('key', ['lib/keymaster.js'], function(none){ + return key; +}); +define('string-score', 'lib/string_score.js'); +define('jquery-media', 'lib/jquery.media.js'); +define('jquery-commits-graph', 'lib/jquery.commits-graph.js'); +define('pjax', 'lib/jquery.pjax.js'); + +require(['jquery' +, 'spin' +, 'jquery-timeago' +, 'bootstrap' +, 'mod/type_search' +, 'mod/watch' +, 'mod/fetch' +, 'mod/shortcut' +, 'mod/zclip' +, 'key' +, 'string-score' +, 'pjax' +, 'jquery-media' +, 'jquery-commits-graph' +], function($, Spinner){ + + var init_source_info = function () { + var get_src = function (path, ref) { + var is_image = /^.+\.(jpg|png|gif|jpeg)$/i.test(path); + if(is_image){ + apiurl = '/'.concat(projectName, '/raw/', ref, '/', path); + file.html('<img src="'+apiurl+'">'); + } + else{ + $.ajax({type: 'GET', + data: {'path': path, 'ref': ref}, + url: '/api/'.concat(projectName, '/src'), + dataType: 'json', + success: function (ret) { + if (ret.type == 'blob') { + //if (ret.parser == 'markdown' || ret.parser == 'docutils') { + // // reuse markdown's css + // file.addClass('markdown-body'); + //} + file.html(ret.src); + $('.media').media({width:938, height:600}); + var anchor = window.location.hash; + var highlight_re = /#L(\d+)-(\d+)$/; + var scroll_re = /#L-?(\d+)$/; + if (anchor && anchor.match(scroll_re) != undefined){ + var paras = anchor.match(scroll_re); + var line_num = parseInt(paras[1]); + $('a[name="'+'L-'+line_num.toString()+'"]'). + parent('div').css('background-color', 'rgb(255, 255, 204)'); + $('a[href='.concat('#L-'+line_num.toString(), "]")).get(0).scrollIntoView(); + } + else if (anchor && anchor.match(highlight_re) != undefined){ + var paras = anchor.match(highlight_re); + var start = parseInt(paras[1]); + var end = parseInt(paras[2]); + var h = end - start; + $('a[name="'+'L-'+start.toString()+'"]'). + parent('div').css('background-color', 'rgb(255, 255, 204)') + .nextAll('div').slice(0, h).css('background-color', 'rgb(255, 255, 204)'); + $('a[href='.concat('#L-'+paras[1], "]")).get(0).scrollIntoView(); + } + } + }}); + } + }; + var get_commits = function (path, ref) { + $.ajax({type: 'GET', + data: {'path': path, 'ref': ref}, + url: '/api/'.concat(projectName, '/commits_by_path'), + dataType: 'json', + success: function (ret) { + if (ret.r) { + var commits = ret.commits; + treeBrowser.find('.tree-item').each( + function (idx) { + var id = $(this).attr('id') + var c = commits[id]; + $(this).children('.age').text(c.age); + if (!c.contributor_url) { + $(this).children('.message').html( + '<a class="message" href="/'.concat(projectName, '/commit/', c.sha, '">', c.message_with_emoji, '</a>', + ' [', '<span>', c.contributor, '</span>]')); + } else { + $(this).children('.message').html( + '<a class="message" href="/'.concat(projectName, '/commit/', c.sha, '">', c.message_with_emoji, '</a>', + ' [', '<a href="', c.contributor_url, '">', c.contributor, '</a>]')); + } + }); + } + }}); + }; + + var drawSpinner = function (elem, isSmall) { + var opts = { lines: 9, length: 6, width: 4, radius: 9, rotate: 12, + color: '#000', speed: 1, trail: 60, shadow: false, + hwaccel: false, className: 'spinner', zIndex: 2e9, + top: 'auto', left: 'auto' }; + if (isSmall) { + opts.length = 4; + opts.width = 2; + opts.radius = 4; + } + return new Spinner(opts).spin(elem); + }; + + // main + + var projectName = $('#project_name').val(), + blob = $('#blob'), file = $('.file'), + tree = $('#tree'), treeBrowser = $('.tree-browser'); + if (tree.length > 0) { + drawSpinner($('.tree-browser td.message:first')[0], true); + // get commits details + var path = tree.attr('data-path'), + ref = tree.attr('data-ref'); + get_commits(path, ref); + } + if (blob.length > 0) { + drawSpinner($('.file')[0]); + var path = blob.attr('data-path'), + ref = blob.attr('data-ref'); + get_src(path, ref); + } + + }; + + $(document).pjax('#pjax_container #tree .content a', '#pjax_container', {timeout:1500}); + $(document).pjax('#pjax_container #blob .content a', '#pjax_container', {timeout:1500}); + $(document).on('pjax:end', function() { + init_source_info(); + }); + + init_source_info(); + + $('body').delegate('#http', 'click', function (e) { + var git_url = $(this).parents('.git-url'); + git_url.removeClass('ssh'); + git_url.addClass('http'); + git_url.find('#git-label').text('HTTP'); + return true; + }); + $('body').delegate('#ssh', 'click', function (e) { + var git_url = $(this).parents('.git-url'); + git_url.removeClass('http'); + git_url.addClass('ssh'); + git_url.find('#git-label').text('SSH'); + return true; + }); + + $('#commits-graph').commits({ + width: 200, + height: 1200, + y_step: 59 + }); +}); diff --git a/dist/js/app/stat/main.js b/dist/js/app/stat/main.js new file mode 100644 index 0000000..3433bb7 --- /dev/null +++ b/dist/js/app/stat/main.js @@ -0,0 +1,671 @@ + +require.config({ enable_ozma: true }); + + +/* @source lib/odometer.js */; + +(function() { + var COUNT_FRAMERATE, COUNT_MS_PER_FRAME, DIGIT_FORMAT, DIGIT_HTML, DIGIT_SPEEDBOOST, DURATION, FORMAT_MARK_HTML, FORMAT_PARSER, FRAMERATE, FRAMES_PER_VALUE, MS_PER_FRAME, MutationObserver, Odometer, RIBBON_HTML, TRANSITION_END_EVENTS, TRANSITION_SUPPORT, VALUE_HTML, addClass, createFromHTML, fractionalPart, now, removeClass, requestAnimationFrame, round, transitionCheckStyles, trigger, truncate, wrapJQuery, _jQueryWrapped, _old, _ref, _ref1, + __slice = [].slice; + + VALUE_HTML = '<span class="odometer-value"></span>'; + + RIBBON_HTML = '<span class="odometer-ribbon"><span class="odometer-ribbon-inner">' + VALUE_HTML + '</span></span>'; + + DIGIT_HTML = '<span class="odometer-digit"><span class="odometer-digit-spacer">8</span><span class="odometer-digit-inner">' + RIBBON_HTML + '</span></span>'; + + FORMAT_MARK_HTML = '<span class="odometer-formatting-mark"></span>'; + + DIGIT_FORMAT = '(,ddd).dd'; + + FORMAT_PARSER = /^\(?([^)]*)\)?(?:(.)(d+))?$/; + + FRAMERATE = 30; + + DURATION = 2000; + + COUNT_FRAMERATE = 20; + + FRAMES_PER_VALUE = 2; + + DIGIT_SPEEDBOOST = .5; + + MS_PER_FRAME = 1000 / FRAMERATE; + + COUNT_MS_PER_FRAME = 1000 / COUNT_FRAMERATE; + + TRANSITION_END_EVENTS = 'transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd'; + + transitionCheckStyles = document.createElement('div').style; + + TRANSITION_SUPPORT = (transitionCheckStyles.transition != null) || (transitionCheckStyles.webkitTransition != null) || (transitionCheckStyles.mozTransition != null) || (transitionCheckStyles.oTransition != null); + + requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame; + + MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver; + + createFromHTML = function(html) { + var el; + el = document.createElement('div'); + el.innerHTML = html; + return el.children[0]; + }; + + removeClass = function(el, name) { + return el.className = el.className.replace(new RegExp("(^| )" + (name.split(' ').join('|')) + "( |$)", 'gi'), ' '); + }; + + addClass = function(el, name) { + removeClass(el, name); + return el.className += " " + name; + }; + + trigger = function(el, name) { + var evt; + if (document.createEvent != null) { + evt = document.createEvent('HTMLEvents'); + evt.initEvent(name, true, true); + return el.dispatchEvent(evt); + } + }; + + now = function() { + var _ref, _ref1; + return (_ref = (_ref1 = window.performance) != null ? typeof _ref1.now === "function" ? _ref1.now() : void 0 : void 0) != null ? _ref : +(new Date); + }; + + round = function(val, precision) { + if (precision == null) { + precision = 0; + } + if (!precision) { + return Math.round(val); + } + val *= Math.pow(10, precision); + val += 0.5; + val = Math.floor(val); + return val /= Math.pow(10, precision); + }; + + truncate = function(val) { + if (val < 0) { + return Math.ceil(val); + } else { + return Math.floor(val); + } + }; + + fractionalPart = function(val) { + return val - round(val); + }; + + _jQueryWrapped = false; + + (wrapJQuery = function() { + var property, _i, _len, _ref, _results; + if (_jQueryWrapped) { + return; + } + if (window.jQuery != null) { + _jQueryWrapped = true; + _ref = ['html', 'text']; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + property = _ref[_i]; + _results.push((function(property) { + var old; + old = window.jQuery.fn[property]; + return window.jQuery.fn[property] = function(val) { + var _ref1; + if ((val == null) || (((_ref1 = this[0]) != null ? _ref1.odometer : void 0) == null)) { + return old.apply(this, arguments); + } + return this[0].odometer.update(val); + }; + })(property)); + } + return _results; + } + })(); + + setTimeout(wrapJQuery, 0); + + Odometer = (function() { + function Odometer(options) { + var e, k, property, v, _base, _i, _len, _ref, _ref1, _ref2, + _this = this; + this.options = options; + this.el = this.options.el; + if (this.el.odometer != null) { + return this.el.odometer; + } + this.el.odometer = this; + _ref = Odometer.options; + for (k in _ref) { + v = _ref[k]; + if (this.options[k] == null) { + this.options[k] = v; + } + } + if ((_base = this.options).duration == null) { + _base.duration = DURATION; + } + this.MAX_VALUES = ((this.options.duration / MS_PER_FRAME) / FRAMES_PER_VALUE) | 0; + this.resetFormat(); + this.value = this.cleanValue((_ref1 = this.options.value) != null ? _ref1 : ''); + this.renderInside(); + this.render(); + try { + _ref2 = ['innerHTML', 'innerText', 'textContent']; + for (_i = 0, _len = _ref2.length; _i < _len; _i++) { + property = _ref2[_i]; + if (this.el[property] != null) { + (function(property) { + return Object.defineProperty(_this.el, property, { + get: function() { + var _ref3; + if (property === 'innerHTML') { + return _this.inside.outerHTML; + } else { + return (_ref3 = _this.inside.innerText) != null ? _ref3 : _this.inside.textContent; + } + }, + set: function(val) { + return _this.update(val); + } + }); + })(property); + } + } + } catch (_error) { + e = _error; + this.watchForMutations(); + } + this; + } + + Odometer.prototype.renderInside = function() { + this.inside = document.createElement('div'); + this.inside.className = 'odometer-inside'; + this.el.innerHTML = ''; + return this.el.appendChild(this.inside); + }; + + Odometer.prototype.watchForMutations = function() { + var e, + _this = this; + if (MutationObserver == null) { + return; + } + try { + if (this.observer == null) { + this.observer = new MutationObserver(function(mutations) { + var newVal; + newVal = _this.el.innerText; + _this.renderInside(); + _this.render(_this.value); + return _this.update(newVal); + }); + } + this.watchMutations = true; + return this.startWatchingMutations(); + } catch (_error) { + e = _error; + } + }; + + Odometer.prototype.startWatchingMutations = function() { + if (this.watchMutations) { + return this.observer.observe(this.el, { + childList: true + }); + } + }; + + Odometer.prototype.stopWatchingMutations = function() { + var _ref; + return (_ref = this.observer) != null ? _ref.disconnect() : void 0; + }; + + Odometer.prototype.cleanValue = function(val) { + var _ref; + if (typeof val === 'string') { + val = val.replace((_ref = this.format.radix) != null ? _ref : '.', '<radix>'); + val = val.replace(/[.,]/g, ''); + val = val.replace('<radix>', '.'); + val = parseFloat(val, 10) || 0; + } + return round(val, this.format.precision); + }; + + Odometer.prototype.bindTransitionEnd = function() { + var event, renderEnqueued, _i, _len, _ref, _results, + _this = this; + if (this.transitionEndBound) { + return; + } + this.transitionEndBound = true; + renderEnqueued = false; + _ref = TRANSITION_END_EVENTS.split(' '); + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + event = _ref[_i]; + _results.push(this.el.addEventListener(event, function() { + if (renderEnqueued) { + return true; + } + renderEnqueued = true; + setTimeout(function() { + _this.render(); + renderEnqueued = false; + return trigger(_this.el, 'odometerdone'); + }, 0); + return true; + }, false)); + } + return _results; + }; + + Odometer.prototype.resetFormat = function() { + var format, fractional, parsed, precision, radix, repeating, _ref, _ref1; + format = (_ref = this.options.format) != null ? _ref : DIGIT_FORMAT; + format || (format = 'd'); + parsed = FORMAT_PARSER.exec(format); + if (!parsed) { + throw new Error("Odometer: Unparsable digit format"); + } + _ref1 = parsed.slice(1, 4), repeating = _ref1[0], radix = _ref1[1], fractional = _ref1[2]; + precision = (fractional != null ? fractional.length : void 0) || 0; + return this.format = { + repeating: repeating, + radix: radix, + precision: precision + }; + }; + + Odometer.prototype.render = function(value) { + var classes, cls, match, newClasses, theme, _i, _len; + if (value == null) { + value = this.value; + } + this.stopWatchingMutations(); + this.resetFormat(); + this.inside.innerHTML = ''; + theme = this.options.theme; + classes = this.el.className.split(' '); + newClasses = []; + for (_i = 0, _len = classes.length; _i < _len; _i++) { + cls = classes[_i]; + if (!cls.length) { + continue; + } + if (match = /^odometer-theme-(.+)$/.exec(cls)) { + theme = match[1]; + continue; + } + if (/^odometer(-|$)/.test(cls)) { + continue; + } + newClasses.push(cls); + } + newClasses.push('odometer'); + if (!TRANSITION_SUPPORT) { + newClasses.push('odometer-no-transitions'); + } + if (theme) { + newClasses.push("odometer-theme-" + theme); + } else { + newClasses.push("odometer-auto-theme"); + } + this.el.className = newClasses.join(' '); + this.ribbons = {}; + this.formatDigits(value); + return this.startWatchingMutations(); + }; + + Odometer.prototype.formatDigits = function(value) { + var digit, valueDigit, valueString, wholePart, _i, _j, _len, _len1, _ref, _ref1; + this.digits = []; + if (this.options.formatFunction) { + valueString = this.options.formatFunction(value); + _ref = valueString.split('').reverse(); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + valueDigit = _ref[_i]; + if (valueDigit.match(/0-9/)) { + digit = this.renderDigit(); + digit.querySelector('.odometer-value').innerHTML = valueDigit; + this.digits.push(digit); + this.insertDigit(digit); + } else { + this.addSpacer(valueDigit); + } + } + } else { + wholePart = !this.format.precision || !fractionalPart(value) || false; + _ref1 = value.toString().split('').reverse(); + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + digit = _ref1[_j]; + if (digit === '.') { + wholePart = true; + } + this.addDigit(digit, wholePart); + } + } + }; + + Odometer.prototype.update = function(newValue) { + var diff, + _this = this; + newValue = this.cleanValue(newValue); + if (!(diff = newValue - this.value)) { + return; + } + removeClass(this.el, 'odometer-animating-up odometer-animating-down odometer-animating'); + if (diff > 0) { + addClass(this.el, 'odometer-animating-up'); + } else { + addClass(this.el, 'odometer-animating-down'); + } + this.stopWatchingMutations(); + this.animate(newValue); + this.startWatchingMutations(); + setTimeout(function() { + _this.el.offsetHeight; + return addClass(_this.el, 'odometer-animating'); + }, 0); + return this.value = newValue; + }; + + Odometer.prototype.renderDigit = function() { + return createFromHTML(DIGIT_HTML); + }; + + Odometer.prototype.insertDigit = function(digit, before) { + if (before != null) { + return this.inside.insertBefore(digit, before); + } else if (!this.inside.children.length) { + return this.inside.appendChild(digit); + } else { + return this.inside.insertBefore(digit, this.inside.children[0]); + } + }; + + Odometer.prototype.addSpacer = function(chr, before, extraClasses) { + var spacer; + spacer = createFromHTML(FORMAT_MARK_HTML); + spacer.innerHTML = chr; + if (extraClasses) { + addClass(spacer, extraClasses); + } + return this.insertDigit(spacer, before); + }; + + Odometer.prototype.addDigit = function(value, repeating) { + var chr, digit, resetted, _ref; + if (repeating == null) { + repeating = true; + } + if (value === '-') { + return this.addSpacer(value, null, 'odometer-negation-mark'); + } + if (value === '.') { + return this.addSpacer((_ref = this.format.radix) != null ? _ref : '.', null, 'odometer-radix-mark'); + } + if (repeating) { + resetted = false; + while (true) { + if (!this.format.repeating.length) { + if (resetted) { + throw new Error("Bad odometer format without digits"); + } + this.resetFormat(); + resetted = true; + } + chr = this.format.repeating[this.format.repeating.length - 1]; + this.format.repeating = this.format.repeating.substring(0, this.format.repeating.length - 1); + if (chr === 'd') { + break; + } + this.addSpacer(chr); + } + } + digit = this.renderDigit(); + digit.querySelector('.odometer-value').innerHTML = value; + this.digits.push(digit); + return this.insertDigit(digit); + }; + + Odometer.prototype.animate = function(newValue) { + if (!TRANSITION_SUPPORT || this.options.animation === 'count') { + return this.animateCount(newValue); + } else { + return this.animateSlide(newValue); + } + }; + + Odometer.prototype.animateCount = function(newValue) { + var cur, diff, last, start, tick, + _this = this; + if (!(diff = +newValue - this.value)) { + return; + } + start = last = now(); + cur = this.value; + return (tick = function() { + var delta, dist, fraction; + if ((now() - start) > _this.options.duration) { + _this.value = newValue; + _this.render(); + trigger(_this.el, 'odometerdone'); + return; + } + delta = now() - last; + if (delta > COUNT_MS_PER_FRAME) { + last = now(); + fraction = delta / _this.options.duration; + dist = diff * fraction; + cur += dist; + _this.render(Math.round(cur)); + } + if (requestAnimationFrame != null) { + return requestAnimationFrame(tick); + } else { + return setTimeout(tick, COUNT_MS_PER_FRAME); + } + })(); + }; + + Odometer.prototype.getDigitCount = function() { + var i, max, value, values, _i, _len; + values = 1 <= arguments.length ? __slice.call(arguments, 0) : []; + for (i = _i = 0, _len = values.length; _i < _len; i = ++_i) { + value = values[i]; + values[i] = Math.abs(value); + } + max = Math.max.apply(Math, values); + return Math.ceil(Math.log(max + 1) / Math.log(10)); + }; + + Odometer.prototype.getFractionalDigitCount = function() { + var i, parser, parts, value, values, _i, _len; + values = 1 <= arguments.length ? __slice.call(arguments, 0) : []; + parser = /^\-?\d*\.(\d*?)0*$/; + for (i = _i = 0, _len = values.length; _i < _len; i = ++_i) { + value = values[i]; + values[i] = value.toString(); + parts = parser.exec(values[i]); + if (parts == null) { + values[i] = 0; + } else { + values[i] = parts[1].length; + } + } + return Math.max.apply(Math, values); + }; + + Odometer.prototype.resetDigits = function() { + this.digits = []; + this.ribbons = []; + this.inside.innerHTML = ''; + return this.resetFormat(); + }; + + Odometer.prototype.animateSlide = function(newValue) { + var boosted, cur, diff, digitCount, digits, dist, end, fractionalCount, frame, frames, i, incr, j, mark, numEl, oldValue, start, _base, _i, _j, _k, _l, _len, _len1, _len2, _m, _ref, _results; + oldValue = this.value; + fractionalCount = this.getFractionalDigitCount(oldValue, newValue); + if (fractionalCount) { + newValue = newValue * Math.pow(10, fractionalCount); + oldValue = oldValue * Math.pow(10, fractionalCount); + } + if (!(diff = newValue - oldValue)) { + return; + } + this.bindTransitionEnd(); + digitCount = this.getDigitCount(oldValue, newValue); + digits = []; + boosted = 0; + for (i = _i = 0; 0 <= digitCount ? _i < digitCount : _i > digitCount; i = 0 <= digitCount ? ++_i : --_i) { + start = truncate(oldValue / Math.pow(10, digitCount - i - 1)); + end = truncate(newValue / Math.pow(10, digitCount - i - 1)); + dist = end - start; + if (Math.abs(dist) > this.MAX_VALUES) { + frames = []; + incr = dist / (this.MAX_VALUES + this.MAX_VALUES * boosted * DIGIT_SPEEDBOOST); + cur = start; + while ((dist > 0 && cur < end) || (dist < 0 && cur > end)) { + frames.push(Math.round(cur)); + cur += incr; + } + if (frames[frames.length - 1] !== end) { + frames.push(end); + } + boosted++; + } else { + frames = (function() { + _results = []; + for (var _j = start; start <= end ? _j <= end : _j >= end; start <= end ? _j++ : _j--){ _results.push(_j); } + return _results; + }).apply(this); + } + for (i = _k = 0, _len = frames.length; _k < _len; i = ++_k) { + frame = frames[i]; + frames[i] = Math.abs(frame % 10); + } + digits.push(frames); + } + this.resetDigits(); + _ref = digits.reverse(); + for (i = _l = 0, _len1 = _ref.length; _l < _len1; i = ++_l) { + frames = _ref[i]; + if (!this.digits[i]) { + this.addDigit(' ', i >= fractionalCount); + } + if ((_base = this.ribbons)[i] == null) { + _base[i] = this.digits[i].querySelector('.odometer-ribbon-inner'); + } + this.ribbons[i].innerHTML = ''; + if (diff < 0) { + frames = frames.reverse(); + } + for (j = _m = 0, _len2 = frames.length; _m < _len2; j = ++_m) { + frame = frames[j]; + numEl = document.createElement('div'); + numEl.className = 'odometer-value'; + numEl.innerHTML = frame; + this.ribbons[i].appendChild(numEl); + if (j === frames.length - 1) { + addClass(numEl, 'odometer-last-value'); + } + if (j === 0) { + addClass(numEl, 'odometer-first-value'); + } + } + } + if (start < 0) { + this.addDigit('-'); + } + mark = this.inside.querySelector('.odometer-radix-mark'); + if (mark != null) { + mark.parent.removeChild(mark); + } + if (fractionalCount) { + return this.addSpacer(this.format.radix, this.digits[fractionalCount - 1], 'odometer-radix-mark'); + } + }; + + return Odometer; + + })(); + + Odometer.options = (_ref = window.odometerOptions) != null ? _ref : {}; + + setTimeout(function() { + var k, v, _base, _ref1, _results; + if (window.odometerOptions) { + _ref1 = window.odometerOptions; + _results = []; + for (k in _ref1) { + v = _ref1[k]; + _results.push((_base = Odometer.options)[k] != null ? (_base = Odometer.options)[k] : _base[k] = v); + } + return _results; + } + }, 0); + + Odometer.init = function() { + var el, elements, _i, _len, _ref1, _results; + if (document.querySelectorAll == null) { + return; + } + elements = document.querySelectorAll(Odometer.options.selector || '.odometer'); + _results = []; + for (_i = 0, _len = elements.length; _i < _len; _i++) { + el = elements[_i]; + _results.push(el.odometer = new Odometer({ + el: el, + value: (_ref1 = el.innerText) != null ? _ref1 : el.textContent + })); + } + return _results; + }; + + if ((((_ref1 = document.documentElement) != null ? _ref1.doScroll : void 0) != null) && (document.createEventObject != null)) { + _old = document.onreadystatechange; + document.onreadystatechange = function() { + if (document.readyState === 'complete' && Odometer.options.auto !== false) { + Odometer.init(); + } + return _old != null ? _old.apply(this, arguments) : void 0; + }; + } else { + document.addEventListener('DOMContentLoaded', function() { + if (Odometer.options.auto !== false) { + return Odometer.init(); + } + }, false); + } + + if (typeof define === 'function' && define.amd) { + define("lib/odometer", [ + "jquery" + ], function() { + return Odometer; + }); + } else if (typeof exports === !'undefined') { + module.exports = Odometer; + } else { + window.Odometer = Odometer; + } + +}).call(this); + +/* @source */; + +require(['jquery', 'lib/odometer'], function() { + $.getJSON('/hub/stat/source', function( data ) { + $.each( data, function(className, val) { + $('.odometer.' + className).html(val); + }); + }); +}); diff --git a/dist/js/app/team/add_project.js b/dist/js/app/team/add_project.js new file mode 100644 index 0000000..dda4df4 --- /dev/null +++ b/dist/js/app/team/add_project.js @@ -0,0 +1,126 @@ + +require.config({ enable_ozma: true }); + + +/* @source mod/drop_down_list.js */; + +define( + 'mod/drop_down_list', + [ + "jquery" +], + function($) { + var addItemMenu = function (inputObj, success, introAppendTo, reqUrl, templ, menuType, successArg){ + var keyCode = {enter:13, esc:27, tab:9, up:38, down:40, ctrl:17, n:78, p:80}, + item_menu, + get_data = function (url){ + if (menuType == "repos"){ + length = url.length, + url = url.slice(1, length - 1); + }else { + url = url.split('/')[2]; + } + return url; + }, + call_success = function (){ + if (menuType == "repos"){ + success(); + } else { + success(successArg); + $(introAppendTo).find('.add-item-menu').remove(); + } + }; + + var hideAddItemMenu = function () { + item_menu && item_menu.empty().remove(); + }; + + var showIntro = function () { + if (!item_menu || item_menu.is(':empty')) { + item_menu = $('<div class="add-item-menu"></div>').appendTo(introAppendTo) + .on('mouseenter', 'li', function () { + item_menu.find('li.active').removeClass('active'); + $(this).addClass('active'); + }) + .on('click', 'li', function (e) { + e.preventDefault(); + var url = $(this).attr('data-url'); + url = get_data(url); + inputObj.val(url); + setTimeout(hideAddItemMenu, 100); + call_success(); + }); + } + }; + + $('body').click(function () {setTimeout(hideAddItemMenu, 100);}); + + inputObj.live('keydown', function (e) { + (e.keyCode == keyCode.enter && item_menu && item_menu.find('li.active').length) && e.preventDefault(); + showIntro(); + }).live('keyup', + function (e) { + showIntro(); + var k = e.keyCode; + if (k == keyCode.up || k == keyCode.down || k==keyCode.ctrl + || k == keyCode.enter || k == keyCode.p || k == keyCode.n){ + if (item_menu && item_menu.find('li').length){ + (k == keyCode.esc) && hideAddItemMenu();// esc key to close the menu + var actItem = item_menu.find('li.active'); + if (actItem.length) { + var a = actItem; + if (k == keyCode.up || + (k == keyCode.p && e.ctrlKey == true)) { // up + var p = a.removeClass('active').prev(); + (p.length ? p : item_menu.find('li:last')).addClass('active'); + } else if (k == keyCode.down || + (k == keyCode.n && e.ctrlKey == true)) { // down + var n = a.removeClass('active').next(); + (n.length ? n : item_menu.find('li:first')).addClass('active'); + } else if (k == keyCode.enter) { // enter key to go to repo + e.preventDefault(); + var url = actItem.attr('data-url'); + url = get_data(url); + inputObj.val(url); + setTimeout(hideAddItemMenu, 100); + call_success(); + } + } else { + item_menu.find('li:first').addClass('active'); + } + } + } else { + var q = $(this).val(); + (q != '') ? $.getJSON( + reqUrl, + {q:q}, + function (r) { + item_menu.html($.tmpl(templ, r)).show(); + }) : showIntro(); + } + } + ); + }; + return addItemMenu; + }); + +/* @source */; + +require([ + 'jquery', + 'mod/drop_down_list' +], function($, drop_down_list){ + var addProjectForm = $('#add-project-form'); + var success = function (data) { + addProjectForm.submit(); + }; + + // search for repos + var reqUrl = '/api/autocomplete_repos'; + var templ = $('#templ-repos-autocomplete'); + + $('#project_id').focusin(function(){ + var inputObj = $(this); + drop_down_list(inputObj, success, 'dd', reqUrl, templ, "repos", ''); + }); +}); diff --git a/dist/js/app/team/group.js b/dist/js/app/team/group.js new file mode 100644 index 0000000..ff2d01e --- /dev/null +++ b/dist/js/app/team/group.js @@ -0,0 +1,123 @@ + +require.config({ enable_ozma: true }); + + +/* @source */; + +require( + ['jquery', 'jquery-tmpl', 'bootstrap'], + function ($) { + var member_query_cache = {}; + var project_query_cache = {}; + var autocomplete_member = function (query, process) { + var $input = $('input.js-group-member') + var group_name = $input.data('group-name'); + var team_name = $input.data('team-name'); + + // if in cache use cached value, if don't wanto use cache remove this if statement + if(member_query_cache[query]){ + process(member_query_cache[query]); + return; + } + if( typeof searching != "undefined") { + clearTimeout(searching); + process([]); + } + searching = setTimeout(function() { + return $.getJSON( + '/api/teams/' + team_name + '/members/', + { query: query }, + function(data){ + var new_data = []; + $.each(data, function(){ + new_data.push(this.name); + }); + // save result to cache, remove next line if you don't want to use cache + member_query_cache[query] = new_data; + // only search if stop typing for 300ms aka fast typers + return process(new_data); + } + ); + }, 300); // 300 ms + } + var autocomplete_project = function (query, process) { + var $input = $('input.js-group-project') + var group_name = $input.data('group-name'); + var team_name = $input.data('team-name'); + + // if in cache use cached value, if don't wanto use cache remove this if statement + if(project_query_cache[query]){ + process(project_query_cache[query]); + return; + } + if( typeof searching != "undefined") { + clearTimeout(searching); + process([]); + } + searching = setTimeout(function() { + return $.getJSON( + '/api/teams/' + team_name + '/projects/', + { query: query }, + function(data){ + var new_data = []; + $.each(data, function(){ + new_data.push(this.name); + }); + // save result to cache, remove next line if you don't want to use cache + project_query_cache[query] = new_data; + // only search if stop typing for 300ms aka fast typers + return process(new_data); + } + ); + }, 300); // 300 ms + } + $('input.js-group-member').typeahead({source: autocomplete_member}); + $('input.js-group-project').typeahead({source: autocomplete_project}); + $(".js-add-group-member").on('click', function () { + var tmpl = $("#tmpl-group-member"); + var $input = $(this).parents().find('input.js-group-member'); + var group_id = $input.data('group'); + var team_id = $input.data('team'); + var group_name = $input.data('group-name'); + var team_name = $input.data('team-name'); + var val = $input.val() + if (val === '' || val === undefined) + return; + $.ajax({ + type: 'POST', + data: JSON.stringify({ + 'name': $input.val() + }), + contentType: 'application/json; charset=UTF-8', + url: '/api/teams/' + team_name + '/groups/' + group_name + '/members/', + dataType: 'json', + success: function (ret) { + $("ul#group-members").append($.tmpl(tmpl, ret)) + } + }); + }); + $(".js-add-group-project").on('click', function () { + var tmpl = $("#tmpl-group-project"); + var $input = $(this).parents().find('input.js-group-project'); + var group_id = $input.data('group'); + var team_id = $input.data('team'); + var group_name = $input.data('group-name'); + var team_name = $input.data('team-name'); + var val = $input.val() + if (val === '' || val === undefined) + return; + $.ajax({ + type: 'POST', + data: JSON.stringify({ + 'name': $input.val() + }), + contentType: 'application/json; charset=UTF-8', + url: '/api/teams/' + team_name + '/groups/' + group_name + '/projects/', + dataType: 'json', + success: function (ret) { + $("ul#group-projects").append($.tmpl(tmpl, ret)) + } + }); + }); + } +); diff --git a/dist/js/app/team/main.js b/dist/js/app/team/main.js new file mode 100644 index 0000000..064b623 --- /dev/null +++ b/dist/js/app/team/main.js @@ -0,0 +1,1857 @@ + +require.config({ enable_ozma: true }); + + +/* @source mod/team_header.js */; + +define('mod/team_header', [ + "jquery" +], function($){ + $(function(){ + var JoinOrLeaveTeam = function (url, onSuccess) { + $.post(url, function (ret) { + if (ret.r === 0) { + onSuccess(); + } + }, 'json'); + }; + $('.join-or-leave-btn').click(function () { + var Btn = $(this), team = Btn.attr('data-team'), _type = Btn.attr('data-type'), + url = '/hub/team/' + team + '/' + _type; + if (_type === "leave") { + JoinOrLeaveTeam(url, function () { + Btn.removeClass('btn-danger'); + Btn.addClass('btn-success'); + Btn.html('Join'); + Btn.attr('data-type', 'join'); + }); + }else{ + JoinOrLeaveTeam(url, function () { + Btn.removeClass('btn-success'); + Btn.addClass('btn-danger'); + Btn.html('Leave'); + Btn.attr('data-type', 'leave'); + }); + } + }); + }); +}); + +/* @source lib/tinycolor.js */; + +// TinyColor v0.9.16 +// https://github.com/bgrins/TinyColor +// 2013-08-10, Brian Grinstead, MIT License + +(function() { + +var trimLeft = /^[\s,#]+/, + trimRight = /\s+$/, + tinyCounter = 0, + math = Math, + mathRound = math.round, + mathMin = math.min, + mathMax = math.max, + mathRandom = math.random; + +function tinycolor (color, opts) { + + color = (color) ? color : ''; + opts = opts || { }; + + // If input is already a tinycolor, return itself + if (typeof color == "object" && color.hasOwnProperty("_tc_id")) { + return color; + } + + var rgb = inputToRGB(color); + var r = rgb.r, + g = rgb.g, + b = rgb.b, + a = rgb.a, + roundA = mathRound(100*a) / 100, + format = opts.format || rgb.format; + + // Don't let the range of [0,255] come back in [0,1]. + // Potentially lose a little bit of precision here, but will fix issues where + // .5 gets interpreted as half of the total, instead of half of 1 + // If it was supposed to be 128, this was already taken care of by `inputToRgb` + if (r < 1) { r = mathRound(r); } + if (g < 1) { g = mathRound(g); } + if (b < 1) { b = mathRound(b); } + + return { + ok: rgb.ok, + format: format, + _tc_id: tinyCounter++, + alpha: a, + getAlpha: function() { + return a; + }, + setAlpha: function(value) { + a = boundAlpha(value); + roundA = mathRound(100*a) / 100; + }, + toHsv: function() { + var hsv = rgbToHsv(r, g, b); + return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: a }; + }, + toHsvString: function() { + var hsv = rgbToHsv(r, g, b); + var h = mathRound(hsv.h * 360), s = mathRound(hsv.s * 100), v = mathRound(hsv.v * 100); + return (a == 1) ? + "hsv(" + h + ", " + s + "%, " + v + "%)" : + "hsva(" + h + ", " + s + "%, " + v + "%, "+ roundA + ")"; + }, + toHsl: function() { + var hsl = rgbToHsl(r, g, b); + return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: a }; + }, + toHslString: function() { + var hsl = rgbToHsl(r, g, b); + var h = mathRound(hsl.h * 360), s = mathRound(hsl.s * 100), l = mathRound(hsl.l * 100); + return (a == 1) ? + "hsl(" + h + ", " + s + "%, " + l + "%)" : + "hsla(" + h + ", " + s + "%, " + l + "%, "+ roundA + ")"; + }, + toHex: function(allow3Char) { + return rgbToHex(r, g, b, allow3Char); + }, + toHexString: function(allow3Char) { + return '#' + this.toHex(allow3Char); + }, + toHex8: function() { + return rgbaToHex(r, g, b, a); + }, + toHex8String: function() { + return '#' + this.toHex8(); + }, + toRgb: function() { + return { r: mathRound(r), g: mathRound(g), b: mathRound(b), a: a }; + }, + toRgbString: function() { + return (a == 1) ? + "rgb(" + mathRound(r) + ", " + mathRound(g) + ", " + mathRound(b) + ")" : + "rgba(" + mathRound(r) + ", " + mathRound(g) + ", " + mathRound(b) + ", " + roundA + ")"; + }, + toPercentageRgb: function() { + return { r: mathRound(bound01(r, 255) * 100) + "%", g: mathRound(bound01(g, 255) * 100) + "%", b: mathRound(bound01(b, 255) * 100) + "%", a: a }; + }, + toPercentageRgbString: function() { + return (a == 1) ? + "rgb(" + mathRound(bound01(r, 255) * 100) + "%, " + mathRound(bound01(g, 255) * 100) + "%, " + mathRound(bound01(b, 255) * 100) + "%)" : + "rgba(" + mathRound(bound01(r, 255) * 100) + "%, " + mathRound(bound01(g, 255) * 100) + "%, " + mathRound(bound01(b, 255) * 100) + "%, " + roundA + ")"; + }, + toName: function() { + if (a === 0) { + return "transparent"; + } + + return hexNames[rgbToHex(r, g, b, true)] || false; + }, + toFilter: function(secondColor) { + var hex8String = '#' + rgbaToHex(r, g, b, a); + var secondHex8String = hex8String; + var gradientType = opts && opts.gradientType ? "GradientType = 1, " : ""; + + if (secondColor) { + var s = tinycolor(secondColor); + secondHex8String = s.toHex8String(); + } + + return "progid:DXImageTransform.Microsoft.gradient("+gradientType+"startColorstr="+hex8String+",endColorstr="+secondHex8String+")"; + }, + toString: function(format) { + var formatSet = !!format; + format = format || this.format; + + var formattedString = false; + var hasAlphaAndFormatNotSet = !formatSet && a < 1 && a > 0; + var formatWithAlpha = hasAlphaAndFormatNotSet && (format === "hex" || format === "hex6" || format === "hex3" || format === "name"); + + if (format === "rgb") { + formattedString = this.toRgbString(); + } + if (format === "prgb") { + formattedString = this.toPercentageRgbString(); + } + if (format === "hex" || format === "hex6") { + formattedString = this.toHexString(); + } + if (format === "hex3") { + formattedString = this.toHexString(true); + } + if (format === "hex8") { + formattedString = this.toHex8String(); + } + if (format === "name") { + formattedString = this.toName(); + } + if (format === "hsl") { + formattedString = this.toHslString(); + } + if (format === "hsv") { + formattedString = this.toHsvString(); + } + + if (formatWithAlpha) { + return this.toRgbString(); + } + + return formattedString || this.toHexString(); + } + }; +} + +// If input is an object, force 1 into "1.0" to handle ratios properly +// String input requires "1.0" as input, so 1 will be treated as 1 +tinycolor.fromRatio = function(color, opts) { + if (typeof color == "object") { + var newColor = {}; + for (var i in color) { + if (color.hasOwnProperty(i)) { + if (i === "a") { + newColor[i] = color[i]; + } + else { + newColor[i] = convertToPercentage(color[i]); + } + } + } + color = newColor; + } + + return tinycolor(color, opts); +}; + +// Given a string or object, convert that input to RGB +// Possible string inputs: +// +// "red" +// "#f00" or "f00" +// "#ff0000" or "ff0000" +// "#ff000000" or "ff000000" +// "rgb 255 0 0" or "rgb (255, 0, 0)" +// "rgb 1.0 0 0" or "rgb (1, 0, 0)" +// "rgba (255, 0, 0, 1)" or "rgba 255, 0, 0, 1" +// "rgba (1.0, 0, 0, 1)" or "rgba 1.0, 0, 0, 1" +// "hsl(0, 100%, 50%)" or "hsl 0 100% 50%" +// "hsla(0, 100%, 50%, 1)" or "hsla 0 100% 50%, 1" +// "hsv(0, 100%, 100%)" or "hsv 0 100% 100%" +// +function inputToRGB(color) { + + var rgb = { r: 0, g: 0, b: 0 }; + var a = 1; + var ok = false; + var format = false; + + if (typeof color == "string") { + color = stringInputToObject(color); + } + + if (typeof color == "object") { + if (color.hasOwnProperty("r") && color.hasOwnProperty("g") && color.hasOwnProperty("b")) { + rgb = rgbToRgb(color.r, color.g, color.b); + ok = true; + format = String(color.r).substr(-1) === "%" ? "prgb" : "rgb"; + } + else if (color.hasOwnProperty("h") && color.hasOwnProperty("s") && color.hasOwnProperty("v")) { + color.s = convertToPercentage(color.s); + color.v = convertToPercentage(color.v); + rgb = hsvToRgb(color.h, color.s, color.v); + ok = true; + format = "hsv"; + } + else if (color.hasOwnProperty("h") && color.hasOwnProperty("s") && color.hasOwnProperty("l")) { + color.s = convertToPercentage(color.s); + color.l = convertToPercentage(color.l); + rgb = hslToRgb(color.h, color.s, color.l); + ok = true; + format = "hsl"; + } + + if (color.hasOwnProperty("a")) { + a = color.a; + } + } + + a = boundAlpha(a); + + return { + ok: ok, + format: color.format || format, + r: mathMin(255, mathMax(rgb.r, 0)), + g: mathMin(255, mathMax(rgb.g, 0)), + b: mathMin(255, mathMax(rgb.b, 0)), + a: a + }; +} + + +// Conversion Functions +// -------------------- + +// `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from: +// <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript> + +// `rgbToRgb` +// Handle bounds / percentage checking to conform to CSS color spec +// <http://www.w3.org/TR/css3-color/> +// *Assumes:* r, g, b in [0, 255] or [0, 1] +// *Returns:* { r, g, b } in [0, 255] +function rgbToRgb(r, g, b){ + return { + r: bound01(r, 255) * 255, + g: bound01(g, 255) * 255, + b: bound01(b, 255) * 255 + }; +} + +// `rgbToHsl` +// Converts an RGB color value to HSL. +// *Assumes:* r, g, and b are contained in [0, 255] or [0, 1] +// *Returns:* { h, s, l } in [0,1] +function rgbToHsl(r, g, b) { + + r = bound01(r, 255); + g = bound01(g, 255); + b = bound01(b, 255); + + var max = mathMax(r, g, b), min = mathMin(r, g, b); + var h, s, l = (max + min) / 2; + + if(max == min) { + h = s = 0; // achromatic + } + else { + var d = max - min; + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + switch(max) { + case r: h = (g - b) / d + (g < b ? 6 : 0); break; + case g: h = (b - r) / d + 2; break; + case b: h = (r - g) / d + 4; break; + } + + h /= 6; + } + + return { h: h, s: s, l: l }; +} + +// `hslToRgb` +// Converts an HSL color value to RGB. +// *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100] +// *Returns:* { r, g, b } in the set [0, 255] +function hslToRgb(h, s, l) { + var r, g, b; + + h = bound01(h, 360); + s = bound01(s, 100); + l = bound01(l, 100); + + function hue2rgb(p, q, t) { + if(t < 0) t += 1; + if(t > 1) t -= 1; + if(t < 1/6) return p + (q - p) * 6 * t; + if(t < 1/2) return q; + if(t < 2/3) return p + (q - p) * (2/3 - t) * 6; + return p; + } + + if(s === 0) { + r = g = b = l; // achromatic + } + else { + var q = l < 0.5 ? l * (1 + s) : l + s - l * s; + var p = 2 * l - q; + r = hue2rgb(p, q, h + 1/3); + g = hue2rgb(p, q, h); + b = hue2rgb(p, q, h - 1/3); + } + + return { r: r * 255, g: g * 255, b: b * 255 }; +} + +// `rgbToHsv` +// Converts an RGB color value to HSV +// *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1] +// *Returns:* { h, s, v } in [0,1] +function rgbToHsv(r, g, b) { + + r = bound01(r, 255); + g = bound01(g, 255); + b = bound01(b, 255); + + var max = mathMax(r, g, b), min = mathMin(r, g, b); + var h, s, v = max; + + var d = max - min; + s = max === 0 ? 0 : d / max; + + if(max == min) { + h = 0; // achromatic + } + else { + switch(max) { + case r: h = (g - b) / d + (g < b ? 6 : 0); break; + case g: h = (b - r) / d + 2; break; + case b: h = (r - g) / d + 4; break; + } + h /= 6; + } + return { h: h, s: s, v: v }; +} + +// `hsvToRgb` +// Converts an HSV color value to RGB. +// *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100] +// *Returns:* { r, g, b } in the set [0, 255] + function hsvToRgb(h, s, v) { + + h = bound01(h, 360) * 6; + s = bound01(s, 100); + v = bound01(v, 100); + + var i = math.floor(h), + f = h - i, + p = v * (1 - s), + q = v * (1 - f * s), + t = v * (1 - (1 - f) * s), + mod = i % 6, + r = [v, q, p, p, t, v][mod], + g = [t, v, v, q, p, p][mod], + b = [p, p, t, v, v, q][mod]; + + return { r: r * 255, g: g * 255, b: b * 255 }; +} + +// `rgbToHex` +// Converts an RGB color to hex +// Assumes r, g, and b are contained in the set [0, 255] +// Returns a 3 or 6 character hex +function rgbToHex(r, g, b, allow3Char) { + + var hex = [ + pad2(mathRound(r).toString(16)), + pad2(mathRound(g).toString(16)), + pad2(mathRound(b).toString(16)) + ]; + + // Return a 3 character hex if possible + if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) { + return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0); + } + + return hex.join(""); +} + // `rgbaToHex` + // Converts an RGBA color plus alpha transparency to hex + // Assumes r, g, b and a are contained in the set [0, 255] + // Returns an 8 character hex + function rgbaToHex(r, g, b, a) { + + var hex = [ + pad2(convertDecimalToHex(a)), + pad2(mathRound(r).toString(16)), + pad2(mathRound(g).toString(16)), + pad2(mathRound(b).toString(16)) + ]; + + return hex.join(""); + } + +// `equals` +// Can be called with any tinycolor input +tinycolor.equals = function (color1, color2) { + if (!color1 || !color2) { return false; } + return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString(); +}; +tinycolor.random = function() { + return tinycolor.fromRatio({ + r: mathRandom(), + g: mathRandom(), + b: mathRandom() + }); +}; + + +// Modification Functions +// ---------------------- +// Thanks to less.js for some of the basics here +// <https://github.com/cloudhead/less.js/blob/master/lib/less/functions.js> + +tinycolor.desaturate = function (color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var hsl = tinycolor(color).toHsl(); + hsl.s -= amount / 100; + hsl.s = clamp01(hsl.s); + return tinycolor(hsl); +}; +tinycolor.saturate = function (color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var hsl = tinycolor(color).toHsl(); + hsl.s += amount / 100; + hsl.s = clamp01(hsl.s); + return tinycolor(hsl); +}; +tinycolor.greyscale = function(color) { + return tinycolor.desaturate(color, 100); +}; +tinycolor.lighten = function(color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var hsl = tinycolor(color).toHsl(); + hsl.l += amount / 100; + hsl.l = clamp01(hsl.l); + return tinycolor(hsl); +}; +tinycolor.darken = function (color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var hsl = tinycolor(color).toHsl(); + hsl.l -= amount / 100; + hsl.l = clamp01(hsl.l); + return tinycolor(hsl); +}; +tinycolor.complement = function(color) { + var hsl = tinycolor(color).toHsl(); + hsl.h = (hsl.h + 180) % 360; + return tinycolor(hsl); +}; + + +// Combination Functions +// --------------------- +// Thanks to jQuery xColor for some of the ideas behind these +// <https://github.com/infusion/jQuery-xcolor/blob/master/jquery.xcolor.js> + +tinycolor.triad = function(color) { + var hsl = tinycolor(color).toHsl(); + var h = hsl.h; + return [ + tinycolor(color), + tinycolor({ h: (h + 120) % 360, s: hsl.s, l: hsl.l }), + tinycolor({ h: (h + 240) % 360, s: hsl.s, l: hsl.l }) + ]; +}; +tinycolor.tetrad = function(color) { + var hsl = tinycolor(color).toHsl(); + var h = hsl.h; + return [ + tinycolor(color), + tinycolor({ h: (h + 90) % 360, s: hsl.s, l: hsl.l }), + tinycolor({ h: (h + 180) % 360, s: hsl.s, l: hsl.l }), + tinycolor({ h: (h + 270) % 360, s: hsl.s, l: hsl.l }) + ]; +}; +tinycolor.splitcomplement = function(color) { + var hsl = tinycolor(color).toHsl(); + var h = hsl.h; + return [ + tinycolor(color), + tinycolor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l}), + tinycolor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l}) + ]; +}; +tinycolor.analogous = function(color, results, slices) { + results = results || 6; + slices = slices || 30; + + var hsl = tinycolor(color).toHsl(); + var part = 360 / slices; + var ret = [tinycolor(color)]; + + for (hsl.h = ((hsl.h - (part * results >> 1)) + 720) % 360; --results; ) { + hsl.h = (hsl.h + part) % 360; + ret.push(tinycolor(hsl)); + } + return ret; +}; +tinycolor.monochromatic = function(color, results) { + results = results || 6; + var hsv = tinycolor(color).toHsv(); + var h = hsv.h, s = hsv.s, v = hsv.v; + var ret = []; + var modification = 1 / results; + + while (results--) { + ret.push(tinycolor({ h: h, s: s, v: v})); + v = (v + modification) % 1; + } + + return ret; +}; + + +// Readability Functions +// --------------------- +// <http://www.w3.org/TR/AERT#color-contrast> + +// `readability` +// Analyze the 2 colors and returns an object with the following properties: +// `brightness`: difference in brightness between the two colors +// `color`: difference in color/hue between the two colors +tinycolor.readability = function(color1, color2) { + var a = tinycolor(color1).toRgb(); + var b = tinycolor(color2).toRgb(); + var brightnessA = (a.r * 299 + a.g * 587 + a.b * 114) / 1000; + var brightnessB = (b.r * 299 + b.g * 587 + b.b * 114) / 1000; + var colorDiff = ( + Math.max(a.r, b.r) - Math.min(a.r, b.r) + + Math.max(a.g, b.g) - Math.min(a.g, b.g) + + Math.max(a.b, b.b) - Math.min(a.b, b.b) + ); + + return { + brightness: Math.abs(brightnessA - brightnessB), + color: colorDiff + }; +}; + +// `readable` +// http://www.w3.org/TR/AERT#color-contrast +// Ensure that foreground and background color combinations provide sufficient contrast. +// *Example* +// tinycolor.readable("#000", "#111") => false +tinycolor.readable = function(color1, color2) { + var readability = tinycolor.readability(color1, color2); + return readability.brightness > 125 && readability.color > 500; +}; + +// `mostReadable` +// Given a base color and a list of possible foreground or background +// colors for that base, returns the most readable color. +// *Example* +// tinycolor.mostReadable("#123", ["#fff", "#000"]) => "#000" +tinycolor.mostReadable = function(baseColor, colorList) { + var bestColor = null; + var bestScore = 0; + var bestIsReadable = false; + for (var i=0; i < colorList.length; i++) { + + // We normalize both around the "acceptable" breaking point, + // but rank brightness constrast higher than hue. + + var readability = tinycolor.readability(baseColor, colorList[i]); + var readable = readability.brightness > 125 && readability.color > 500; + var score = 3 * (readability.brightness / 125) + (readability.color / 500); + + if ((readable && ! bestIsReadable) || + (readable && bestIsReadable && score > bestScore) || + ((! readable) && (! bestIsReadable) && score > bestScore)) { + bestIsReadable = readable; + bestScore = score; + bestColor = tinycolor(colorList[i]); + } + } + return bestColor; +}; + + +// Big List of Colors +// ------------------ +// <http://www.w3.org/TR/css3-color/#svg-color> +var names = tinycolor.names = { + aliceblue: "f0f8ff", + antiquewhite: "faebd7", + aqua: "0ff", + aquamarine: "7fffd4", + azure: "f0ffff", + beige: "f5f5dc", + bisque: "ffe4c4", + black: "000", + blanchedalmond: "ffebcd", + blue: "00f", + blueviolet: "8a2be2", + brown: "a52a2a", + burlywood: "deb887", + burntsienna: "ea7e5d", + cadetblue: "5f9ea0", + chartreuse: "7fff00", + chocolate: "d2691e", + coral: "ff7f50", + cornflowerblue: "6495ed", + cornsilk: "fff8dc", + crimson: "dc143c", + cyan: "0ff", + darkblue: "00008b", + darkcyan: "008b8b", + darkgoldenrod: "b8860b", + darkgray: "a9a9a9", + darkgreen: "006400", + darkgrey: "a9a9a9", + darkkhaki: "bdb76b", + darkmagenta: "8b008b", + darkolivegreen: "556b2f", + darkorange: "ff8c00", + darkorchid: "9932cc", + darkred: "8b0000", + darksalmon: "e9967a", + darkseagreen: "8fbc8f", + darkslateblue: "483d8b", + darkslategray: "2f4f4f", + darkslategrey: "2f4f4f", + darkturquoise: "00ced1", + darkviolet: "9400d3", + deeppink: "ff1493", + deepskyblue: "00bfff", + dimgray: "696969", + dimgrey: "696969", + dodgerblue: "1e90ff", + firebrick: "b22222", + floralwhite: "fffaf0", + forestgreen: "228b22", + fuchsia: "f0f", + gainsboro: "dcdcdc", + ghostwhite: "f8f8ff", + gold: "ffd700", + goldenrod: "daa520", + gray: "808080", + green: "008000", + greenyellow: "adff2f", + grey: "808080", + honeydew: "f0fff0", + hotpink: "ff69b4", + indianred: "cd5c5c", + indigo: "4b0082", + ivory: "fffff0", + khaki: "f0e68c", + lavender: "e6e6fa", + lavenderblush: "fff0f5", + lawngreen: "7cfc00", + lemonchiffon: "fffacd", + lightblue: "add8e6", + lightcoral: "f08080", + lightcyan: "e0ffff", + lightgoldenrodyellow: "fafad2", + lightgray: "d3d3d3", + lightgreen: "90ee90", + lightgrey: "d3d3d3", + lightpink: "ffb6c1", + lightsalmon: "ffa07a", + lightseagreen: "20b2aa", + lightskyblue: "87cefa", + lightslategray: "789", + lightslategrey: "789", + lightsteelblue: "b0c4de", + lightyellow: "ffffe0", + lime: "0f0", + limegreen: "32cd32", + linen: "faf0e6", + magenta: "f0f", + maroon: "800000", + mediumaquamarine: "66cdaa", + mediumblue: "0000cd", + mediumorchid: "ba55d3", + mediumpurple: "9370db", + mediumseagreen: "3cb371", + mediumslateblue: "7b68ee", + mediumspringgreen: "00fa9a", + mediumturquoise: "48d1cc", + mediumvioletred: "c71585", + midnightblue: "191970", + mintcream: "f5fffa", + mistyrose: "ffe4e1", + moccasin: "ffe4b5", + navajowhite: "ffdead", + navy: "000080", + oldlace: "fdf5e6", + olive: "808000", + olivedrab: "6b8e23", + orange: "ffa500", + orangered: "ff4500", + orchid: "da70d6", + palegoldenrod: "eee8aa", + palegreen: "98fb98", + paleturquoise: "afeeee", + palevioletred: "db7093", + papayawhip: "ffefd5", + peachpuff: "ffdab9", + peru: "cd853f", + pink: "ffc0cb", + plum: "dda0dd", + powderblue: "b0e0e6", + purple: "800080", + red: "f00", + rosybrown: "bc8f8f", + royalblue: "4169e1", + saddlebrown: "8b4513", + salmon: "fa8072", + sandybrown: "f4a460", + seagreen: "2e8b57", + seashell: "fff5ee", + sienna: "a0522d", + silver: "c0c0c0", + skyblue: "87ceeb", + slateblue: "6a5acd", + slategray: "708090", + slategrey: "708090", + snow: "fffafa", + springgreen: "00ff7f", + steelblue: "4682b4", + tan: "d2b48c", + teal: "008080", + thistle: "d8bfd8", + tomato: "ff6347", + turquoise: "40e0d0", + violet: "ee82ee", + wheat: "f5deb3", + white: "fff", + whitesmoke: "f5f5f5", + yellow: "ff0", + yellowgreen: "9acd32" +}; + +// Make it easy to access colors via `hexNames[hex]` +var hexNames = tinycolor.hexNames = flip(names); + + +// Utilities +// --------- + +// `{ 'name1': 'val1' }` becomes `{ 'val1': 'name1' }` +function flip(o) { + var flipped = { }; + for (var i in o) { + if (o.hasOwnProperty(i)) { + flipped[o[i]] = i; + } + } + return flipped; +} + +// Return a valid alpha value [0,1] with all invalid values being set to 1 +function boundAlpha(a) { + a = parseFloat(a); + + if (isNaN(a) || a < 0 || a > 1) { + a = 1; + } + + return a; +} + +// Take input from [0, n] and return it as [0, 1] +function bound01(n, max) { + if (isOnePointZero(n)) { n = "100%"; } + + var processPercent = isPercentage(n); + n = mathMin(max, mathMax(0, parseFloat(n))); + + // Automatically convert percentage into number + if (processPercent) { + n = parseInt(n * max, 10) / 100; + } + + // Handle floating point rounding errors + if ((math.abs(n - max) < 0.000001)) { + return 1; + } + + // Convert into [0, 1] range if it isn't already + return (n % max) / parseFloat(max); +} + +// Force a number between 0 and 1 +function clamp01(val) { + return mathMin(1, mathMax(0, val)); +} + +// Parse a base-16 hex value into a base-10 integer +function parseIntFromHex(val) { + return parseInt(val, 16); +} + +// Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1 +// <http://stackoverflow.com/questions/7422072/javascript-how-to-detect-number-as-a-decimal-including-1-0> +function isOnePointZero(n) { + return typeof n == "string" && n.indexOf('.') != -1 && parseFloat(n) === 1; +} + +// Check to see if string passed in is a percentage +function isPercentage(n) { + return typeof n === "string" && n.indexOf('%') != -1; +} + +// Force a hex value to have 2 characters +function pad2(c) { + return c.length == 1 ? '0' + c : '' + c; +} + +// Replace a decimal with it's percentage value +function convertToPercentage(n) { + if (n <= 1) { + n = (n * 100) + "%"; + } + + return n; +} + +// Converts a decimal to a hex value +function convertDecimalToHex(d) { + return Math.round(parseFloat(d) * 255).toString(16); +} +// Converts a hex value to a decimal +function convertHexToDecimal(h) { + return (parseIntFromHex(h) / 255); +} + +var matchers = (function() { + + // <http://www.w3.org/TR/css3-values/#integers> + var CSS_INTEGER = "[-\\+]?\\d+%?"; + + // <http://www.w3.org/TR/css3-values/#number-value> + var CSS_NUMBER = "[-\\+]?\\d*\\.\\d+%?"; + + // Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome. + var CSS_UNIT = "(?:" + CSS_NUMBER + ")|(?:" + CSS_INTEGER + ")"; + + // Actual matching. + // Parentheses and commas are optional, but not required. + // Whitespace can take the place of commas or opening paren + var PERMISSIVE_MATCH3 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?"; + var PERMISSIVE_MATCH4 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?"; + + return { + rgb: new RegExp("rgb" + PERMISSIVE_MATCH3), + rgba: new RegExp("rgba" + PERMISSIVE_MATCH4), + hsl: new RegExp("hsl" + PERMISSIVE_MATCH3), + hsla: new RegExp("hsla" + PERMISSIVE_MATCH4), + hsv: new RegExp("hsv" + PERMISSIVE_MATCH3), + hex3: /^([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/, + hex6: /^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/, + hex8: /^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/ + }; +})(); + +// `stringInputToObject` +// Permissive string parsing. Take in a number of formats, and output an object +// based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}` +function stringInputToObject(color) { + + color = color.replace(trimLeft,'').replace(trimRight, '').toLowerCase(); + var named = false; + if (names[color]) { + color = names[color]; + named = true; + } + else if (color == 'transparent') { + return { r: 0, g: 0, b: 0, a: 0, format: "name" }; + } + + // Try to match string input using regular expressions. + // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360] + // Just return an object and let the conversion functions handle that. + // This way the result will be the same whether the tinycolor is initialized with string or object. + var match; + if ((match = matchers.rgb.exec(color))) { + return { r: match[1], g: match[2], b: match[3] }; + } + if ((match = matchers.rgba.exec(color))) { + return { r: match[1], g: match[2], b: match[3], a: match[4] }; + } + if ((match = matchers.hsl.exec(color))) { + return { h: match[1], s: match[2], l: match[3] }; + } + if ((match = matchers.hsla.exec(color))) { + return { h: match[1], s: match[2], l: match[3], a: match[4] }; + } + if ((match = matchers.hsv.exec(color))) { + return { h: match[1], s: match[2], v: match[3] }; + } + if ((match = matchers.hex8.exec(color))) { + return { + a: convertHexToDecimal(match[1]), + r: parseIntFromHex(match[2]), + g: parseIntFromHex(match[3]), + b: parseIntFromHex(match[4]), + format: named ? "name" : "hex8" + }; + } + if ((match = matchers.hex6.exec(color))) { + return { + r: parseIntFromHex(match[1]), + g: parseIntFromHex(match[2]), + b: parseIntFromHex(match[3]), + format: named ? "name" : "hex" + }; + } + if ((match = matchers.hex3.exec(color))) { + return { + r: parseIntFromHex(match[1] + '' + match[1]), + g: parseIntFromHex(match[2] + '' + match[2]), + b: parseIntFromHex(match[3] + '' + match[3]), + format: named ? "name" : "hex" + }; + } + + return false; +} + +// Node: Export function +if (typeof module !== "undefined" && module.exports) { + module.exports = tinycolor; +} +// AMD/requirejs: Define the module +else if (typeof define !== "undefined") { + define("lib/tinycolor", function () {return tinycolor;}); +} +// Browser: Expose to window +else { + window.tinycolor = tinycolor; +} + +})(); + +/* @source lib/coloreditor.js */; + +// Generated by CoffeeScript 1.3.3 +(function() { + var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; + + define("lib/coloreditor", [ + "lib/tinycolor" + ], function(tinycolor) { + 'use strict'; + + var ColorEditor; + return ColorEditor = (function() { + + ColorEditor.prototype.defaultColor = 'rgba(0,0,0,1)'; + + ColorEditor.prototype.hsv = tinycolor('rgba(0,0,0,1)').toHsv(); + + function ColorEditor(element, color, callback, swatches) { + this.element = element; + this.callback = callback != null ? callback : null; + this.swatches = swatches != null ? swatches : null; + this.registerFocusHandler = __bind(this.registerFocusHandler, this); + + this.handleOpacityFocus = __bind(this.handleOpacityFocus, this); + + this.handleHueFocus = __bind(this.handleHueFocus, this); + + this.handleSelectionFocus = __bind(this.handleSelectionFocus, this); + + this.registerDragHandler = __bind(this.registerDragHandler, this); + + this.handleOpacityDrag = __bind(this.handleOpacityDrag, this); + + this.handleHueDrag = __bind(this.handleHueDrag, this); + + this.handleSelectionFieldDrag = __bind(this.handleSelectionFieldDrag, this); + + this.color = tinycolor(color); + this.lastColor = color; + this.$element = $(this.element); + this.$colorValue = this.$element.find('.color_value'); + this.$buttonList = this.$element.find('ul.button-bar'); + this.$rgbaButton = this.$element.find('.rgba'); + this.$hexButton = this.$element.find('.hex'); + this.$hslButton = this.$element.find('.hsla'); + this.$currentColor = this.$element.find('.current_color'); + this.$lastColor = this.$element.find('.last_color'); + this.$selection = this.$element.find('.color_selection_field'); + this.$selectionBase = this.$element.find('.color_selection_field .selector_base'); + this.$hueBase = this.$element.find('.hue_slider .selector_base'); + this.$opacityGradient = this.$element.find('.opacity_gradient'); + this.$hueSlider = this.$element.find('.hue_slider'); + this.$opacitySlider = this.$element.find('.opacity_slider'); + this.$hueSelector = this.$element.find('.hue_slider .selector_base'); + this.$opacitySlider = this.$element.find('.opacity_slider'); + this.$opacitySelector = this.$element.find('.opacity_slider .selector_base'); + this.$swatches = this.$element.find('.swatches'); + this.addFieldListeners(); + this.addSwatches(); + this.$lastColor.css('background-color', this.lastColor); + this.commitColor(color); + } + + ColorEditor.prototype.addFieldListeners = function() { + this.bindColorFormatToRadioButton('rgba'); + this.bindColorFormatToRadioButton('hex'); + this.bindColorFormatToRadioButton('hsla'); + this.$colorValue.change(this.colorSetter); + this.bindOriginalColorButton(); + this.bindColorSwatches(); + this.registerDragHandler('.color_selection_field', this.handleSelectionFieldDrag); + this.registerDragHandler('.hue_slider', this.handleHueDrag); + this.registerDragHandler('.opacity_slider', this.handleOpacityDrag); + this.registerFocusHandler(this.$selection.find('.selector_base'), this.handleSelectionFocus); + this.registerFocusHandler(this.$hueSlider.find('.selector_base'), this.handleHueFocus); + return this.registerFocusHandler(this.$opacitySlider.find('.selector_base'), this.handleOpacityFocus); + }; + + ColorEditor.prototype.synchronize = function() { + var colorObject, colorValue, hueColor; + colorValue = this.getColor().toString(); + colorObject = tinycolor(colorValue); + hueColor = 'hsl(' + this.hsv.h + ', 100%, 50%)'; + this.updateColorTypeRadioButtons(colorObject.format); + this.$colorValue.attr('value', colorValue); + this.$currentColor.css('background-color', colorValue); + this.$selection.css('background-color', hueColor); + this.$hueBase.css('background-color', hueColor); + this.$selectionBase.css('background-color', colorObject.toHexString()); + this.$opacityGradient.css('background-image', '-webkit-gradient(linear, 0% 0%, 0% 100%, from(' + hueColor + '), to(transparent))'); + this.$hueSelector.css('bottom', (this.hsv.h / 360 * 100) + "%"); + this.$opacitySelector.css('bottom', (this.hsv.a * 100) + "%"); + if (!isNaN(this.hsv.s)) { + this.hsv.s = (this.hsv.s * 100) + '%'; + } + if (!isNaN(this.hsv.v)) { + this.hsv.v = (this.hsv.v * 100) + '%'; + } + return this.$selectionBase.css({ + left: this.hsv.s, + bottom: this.hsv.v + }); + }; + + ColorEditor.prototype.focus = function() { + if (!this.$selection.find('.selector_base').is(":focus")) { + this.$selection.find('.selector_base').focus(); + return true; + } + return false; + }; + + ColorEditor.prototype.colorSetter = function() { + var newColor, newValue; + newValue = $.trim(this.$colorValue.val()); + newColor = tinycolor(newValue); + if (!newColor.ok) { + newValue = this.getColor(); + newColor = tinycolor(newValue); + } + this.commitColor(newValue, true); + this.hsv = newColor.toHsv(); + return this.synchronize(); + }; + + ColorEditor.prototype.getColor = function() { + return this.color || this.defaultColor; + }; + + ColorEditor.prototype.updateColorTypeRadioButtons = function(format) { + this.$buttonList.find('li').removeClass('selected'); + this.$buttonList.find('.' + format).parent().addClass('selected'); + switch (format) { + case 'rgb': + return this.$buttonList.find('.rgba').parent().addClass('selected'); + case 'hex': + case 'name': + return this.$buttonList.find('.hex').parent().addClass('selected'); + case 'hsl': + return this.$buttonList.find('.hsla').parent().addClass('selected'); + } + }; + + ColorEditor.prototype.bindColorFormatToRadioButton = function(buttonClass, propertyName, value) { + var handler, + _this = this; + handler = function(event) { + var colorObject, newColor, newFormat; + newFormat = $(event.currentTarget).html().toLowerCase(); + newColor = _this.getColor(); + colorObject = tinycolor(newColor); + switch (newFormat) { + case 'hsla': + newColor = colorObject.toHslString(); + break; + case 'rgba': + newColor = colorObject.toRgbString(); + break; + case 'hex': + newColor = colorObject.toHexString(); + _this.hsv.a = 1; + _this.synchronize(); + } + return _this.commitColor(newColor, false); + }; + return this.$element.find('.' + buttonClass).click(handler); + }; + + ColorEditor.prototype.bindOriginalColorButton = function() { + var _this = this; + return this.$lastColor.click(function(event) { + return _this.commitColor(_this.lastColor, true); + }); + }; + + ColorEditor.prototype.bindColorSwatches = function() { + var handler; + handler = function(event) { + var $swatch, color, hsvColor; + $swatch = $(event.currentTarget); + if ($swatch.attr('style').length > 0) { + color = $swatch.css('background-color'); + } + if (color.length > 0) { + hsvColor = tinycolor(color).toHsv(); + return this.setColorAsHsv(hsvColor, true); + } + }; + return this.$element.find('.color_swatch').click(handler); + }; + + ColorEditor.prototype.addSwatches = function() { + var index, swatch, _i, _len, _ref, + _this = this; + _ref = this.swatches; + for (index = _i = 0, _len = _ref.length; _i < _len; index = ++_i) { + swatch = _ref[index]; + this.$swatches.append("<li><div class=\"swatch_bg\"><div class=\"swatch\" style=\"background-color: " + swatch.value + ";\"></div></div> <span class=\"value\">" + swatch.value + "</span></li>"); + } + return this.$swatches.find('li').click(function(event) { + return _this.commitColor($(event.currentTarget).find('.value').html()); + }); + }; + + ColorEditor.prototype.setColorAsHsv = function(hsv, commitHsv) { + var colorVal, k, newColor, newHsv, oldColor, oldFormat, v; + newHsv = this.hsv; + for (k in hsv) { + v = hsv[k]; + newHsv[k] = v; + } + newColor = tinycolor(newHsv); + oldColor = tinycolor(this.getColor()); + oldFormat = oldColor.format; + colorVal; + + switch (oldFormat) { + case 'hsl': + colorVal = newColor.toHslString(); + break; + case 'rgb': + colorVal = newColor.toRgbString(); + break; + case 'hex': + case 'name': + colorVal = this.hsv.a < 1 ? newColor.toRgbString() : newColor.toHexString(); + } + return this.commitColor(colorVal, commitHsv); + }; + + ColorEditor.prototype.commitColor = function(colorVal, resetHsv) { + var colorObj; + if (resetHsv == null) { + resetHsv = true; + } + this.callback(colorVal); + this.color = colorVal; + this.$colorValue.val(colorVal); + if (resetHsv) { + colorObj = tinycolor(colorVal); + this.hsv = colorObj.toHsv(); + this.color = colorObj; + } + return this.synchronize(); + }; + + ColorEditor.prototype.handleSelectionFieldDrag = function(event) { + var height, hsv, width, xOffset, yOffset; + yOffset = event.clientY - this.$selection.offset().top; + xOffset = event.clientX - this.$selection.offset().left; + height = this.$selection.height(); + width = this.$selection.width(); + xOffset = Math.min(width, Math.max(0, xOffset)); + yOffset = Math.min(height, Math.max(0, yOffset)); + hsv = {}; + hsv.s = xOffset / width; + hsv.v = 1 - yOffset / height; + this.setColorAsHsv(hsv, false); + if (!this.$selection.find('.selector_base').is(":focus")) { + return this.$selection.find('.selector_base').focus(); + } + }; + + ColorEditor.prototype.handleHueDrag = function(event) { + var height, hsv, offset; + offset = event.clientY - this.$hueSlider.offset().top; + height = this.$hueSlider.height(); + offset = Math.min(height, Math.max(0, offset)); + hsv = {}; + hsv.h = (1 - offset / height) * 360; + this.setColorAsHsv(hsv, false); + if (!this.$hueSlider.find('.selector_base').is(":focus")) { + return this.$hueSlider.find('.selector_base').focus(); + } + }; + + ColorEditor.prototype.handleOpacityDrag = function(event) { + var height, hsv, offset; + offset = event.clientY - this.$opacitySlider.offset().top; + height = this.$opacitySlider.height(); + offset = Math.min(height, Math.max(0, offset)); + hsv = {}; + hsv.a = 1 - offset / height; + this.setColorAsHsv(hsv, false); + if (!this.$opacitySlider.find('.selector_base').is(":focus")) { + return this.$opacitySlider.find('.selector_base').focus(); + } + }; + + ColorEditor.prototype.registerDragHandler = function(selector, handler) { + var element, mouseupHandler; + element = this.$element.find(selector); + element.mousedown(handler); + mouseupHandler = function(event) { + $(window).unbind('mousemove', handler); + return $(window).unbind('mouseup', mouseupHandler); + }; + return element.mousedown(function(event) { + $(window).bind('mousemove', handler); + return $(window).bind('mouseup', mouseupHandler); + }); + }; + + ColorEditor.prototype.handleSelectionFocus = function(event) { + var hsv, step, xOffset, yOffset; + switch (event.keyCode) { + case 37: + step = 1.5; + step = event.shiftKey ? step * 5 : step; + xOffset = Number($.trim(this.$selectionBase.css('left').replace('%', ''))); + xOffset = Math.min(100, Math.max(0, xOffset - step)); + hsv = {}; + hsv.s = xOffset / 100; + this.setColorAsHsv(hsv, false); + return false; + case 39: + step = 1.5; + step = event.shiftKey ? step * 5 : step; + xOffset = Number($.trim(this.$selectionBase.css('left').replace('%', ''))); + xOffset = Math.min(100, Math.max(0, xOffset + step)); + hsv = {}; + hsv.s = xOffset / 100; + this.setColorAsHsv(hsv, false); + return false; + case 40: + step = 1.5; + step = event.shiftKey ? step * 5 : step; + yOffset = Number($.trim(this.$selectionBase.css('bottom').replace('%', ''))); + yOffset = Math.min(100, Math.max(0, yOffset - step)); + hsv = {}; + hsv.v = yOffset / 100; + this.setColorAsHsv(hsv, false); + return false; + case 38: + step = 1.5; + step = event.shiftKey ? step * 5 : step; + yOffset = Number($.trim(this.$selectionBase.css('bottom').replace('%', ''))); + yOffset = Math.min(100, Math.max(0, yOffset + step)); + hsv = {}; + hsv.v = yOffset / 100; + this.setColorAsHsv(hsv, false); + return false; + } + }; + + ColorEditor.prototype.handleHueFocus = function(event) { + var hsv, hue, step; + switch (event.keyCode) { + case 40: + step = 3.6; + step = event.shiftKey ? step * 5 : step; + hsv = {}; + hue = Number(this.hsv.h); + if (hue > 0) { + hsv.h = (hue - step) <= 0 ? 360 - step : hue - step; + this.setColorAsHsv(hsv); + } + return false; + case 38: + step = 3.6; + step = event.shiftKey ? step * 5 : step; + hsv = {}; + hue = Number(this.hsv.h); + if (hue < 360) { + hsv.h = (hue + step) >= 360 ? step : hue + step; + this.setColorAsHsv(hsv); + } + return false; + } + }; + + ColorEditor.prototype.handleOpacityFocus = function(event) { + var alpha, hsv, step; + switch (event.keyCode) { + case 40: + step = 0.01; + step = event.shiftKey ? step * 5 : step; + hsv = {}; + alpha = this.hsv.a; + if (alpha > 0) { + hsv.a = (alpha - step) <= 0 ? 0 : alpha - step; + this.setColorAsHsv(hsv); + } + return false; + case 38: + step = 0.01; + step = event.shiftKey ? step * 5 : step; + hsv = {}; + alpha = this.hsv.a; + if (alpha < 100) { + hsv.a = (alpha + step) >= 1 ? 1 : alpha + step; + return this.setColorAsHsv(hsv); + } + } + }; + + ColorEditor.prototype.registerFocusHandler = function(element, handler) { + element.focus(function(event) { + return element.bind('keydown', handler); + }); + return element.blur(function(event) { + return element.unbind('keydown', handler); + }); + }; + + return ColorEditor; + + })(); + }); + +}).call(this); + +/* @source mod/issue_tag.js */; + +define('mod/issue_tag', [ + "jquery", + "bootbox", + "lib/coloreditor" +], function($) { + $(function(){ + var issuesFilter = $('.nav-list-filter'), + issuesEdit = $('.nav-list-edit'), + remove_tag = function (name) { + issuesFilter.find('li').each(function (){ + var tName = $(this).attr('flag-tag'); + + if (name === tName){ + $(this).remove(); + } + }) + }, + clear_href_tag = function () { + var curHref = window.location.href, + url = curHref.split('?')[0], + tagCount = issuesEdit.attr('data-tag-count'); + if ($('.nav-list-edit div').length != tagCount){ + window.location.href = url; + } + }; + + $('.tag-admin').on('click', function() { + var admin = $(this); + if (admin.hasClass('tag-admin-unuse')){ + + admin.html('取消'); + admin.removeClass('tag-admin-unuse'); + admin.addClass('tag-admin-using'); + + issuesFilter.hide(); + issuesEdit.show(); + } else if (admin.hasClass('tag-admin-using')){ + + admin.html('管理'); + admin.removeClass('tag-admin-using'); + admin.addClass('tag-admin-unuse'); + + issuesFilter.show(); + issuesEdit.hide(); + + clear_href_tag(); + } + }); + $('.tag-remove').on('click', function () { + var tagItem = $(this).closest('div'), + tagType = tagItem.attr('data-tag-type'), + tagName = tagItem.attr('data-tag-name'), + tagTargetId = tagItem.attr('data-target-id'), + msg = '你确定要删除tag: ' + tagName + ' ?'; + if (tagName){ + bootbox.confirm(msg, function(confirmed){ + if (confirmed){ + $.post('/j/issue/delete_tag', {'tag_name': tagName, 'tag_type': tagType, 'tag_target_id': tagTargetId}, function (ret) { + var status = ret.r; + if (status === 1){ + tagItem.remove(); + remove_tag(tagName); + } + }, 'json') + } + }) + } + }); + var t, e, n; + e = function(e, n) { + return e.closest(".js-label-editor").find(".js-color-editor-bg").css("background-color", n), e.css("color", t(n, -.5)), e.css("border-color", n) + }, n = function(t) { + var e, n; + return e = "#eee", n = $(t).closest(".js-color-editor"), n.find(".js-color-editor-bg").css("background-color", e), t.css("color", "#c00"), t.css("border-color", e) + }, t = function(t, e) { + var n, s, a; + for (t = String(t).toLowerCase().replace(/[^0-9a-f]/g, ""), t.length < 6 && (t = t[0] + t[0] + t[1] + t[1] + t[2] + t[2]), e = e || 0, a = "#", n = void 0, s = 0; 3 > s; ) + n = parseInt(t.substr(2 * s, 2), 16), n = Math.round(Math.min(Math.max(0, n + n * e), 255)).toString(16), a += ("00" + n).substr(n.length), s++; + return a + }; + $('.js-color-cooser-color').on('click', function () { + var editor = $(this).closest(".js-label-editor"); + var editor_input = editor.find(".js-color-editor-input"); + editor.find(".js-label-editor-submit").removeClass("disabled"); + editor.removeClass("is-valid is-not-valid"); + var color_value = "#" + $(this).data("hex-color"); + editor_input.val(color_value); + e(editor_input, color_value); + }); + $('.js-color-editor-input').on('focusin', function () { + var t, s; + s = $(this), t = $(this).closest(".js-label-editor"), s.on("input.colorEditor", function() { + console.log('co'); + var a; + return "#" !== s.val().charAt(0) && s.val("#" + s.val()), t.removeClass("is-valid is-not-valid"), a = /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(s.val()), + t.find(".js-label-editor-submit").toggleClass("disabled", !a), a ? (t.addClass("is-valid"), e(s, s.val())) : (t.addClass("is-not-valid"), n(s)) + }), s.on("blur.colorEditor", function() { + return s.off(".colorEditor") + }); + console.log('test'); + }); + + }); +}) + +/* @source mod/count.js */; + +define('mod/count', [], function() { + var countDict = { + public_num: 35, + teamfeed_num: 35, + userfeed_num: 35, + }; + return countDict; +}); + +/* @source mod/user_avatar.js */; + +define('mod/user_avatar', [ + "jquery", + "jquery-lazyload" +], function($, _) { + var isRetinaDisplay = window.devicePixelRatio > 1; + + var patchForRetina = function(originalURL) { + var match = /^(.+\Ws=)(\d+)(.*)$/.exec(originalURL); + if (match === null) { + return originalURL; + } + + var oldSize = parseInt(match[2], 10); + var newSize = Math.ceil(window.devicePixelRatio * oldSize); + + return match[1] + newSize.toString(10) + match[3]; + }; + + var checkLoad = function() { + var e = $(this); + if (isRetinaDisplay) { + var dataOriginalURL = e.attr('data-original') || e.attr('src'); + e.attr('data-original', patchForRetina(dataOriginalURL)); + + e.lazyload({effect:"fadeIn", threshold:300}); + } + }; + + var loadAvatar = function () { + // $("img.user-avatar").each(checkLoad); + // $("img.avatar").each(checkLoad); + // $(window).resize(); + }; + return loadAvatar; +}); + +/* @source lib/date.extensions.js */; + +/** + * Returns a description of this date in relative terms. + + * Examples, where new Date().toString() == "Mon Nov 23 2009 17:36:51 GMT-0500 (EST)": + * + * new Date().toRelativeTime() + * --> 'Just now' + * + * new Date("Nov 21, 2009").toRelativeTime() + * --> '2 days ago' + * + * new Date("Nov 25, 2009").toRelativeTime() + * --> '2 days from now' + * + * // One second ago + * new Date("Nov 23 2009 17:36:50 GMT-0500 (EST)").toRelativeTime() + * --> '1 second ago' + * + * toRelativeTime() takes an optional argument - a configuration object. + * It can have the following properties: + * - now - Date object that defines "now" for the purpose of conversion. + * By default, current date & time is used (i.e. new Date()) + * - nowThreshold - Threshold in milliseconds which is considered "Just now" + * for times in the past or "Right now" for now or the immediate future + * - smartDays - If enabled, dates within a week of now will use Today/Yesterday/Tomorrow + * or weekdays along with time, e.g. "Thursday at 15:10:34" + * rather than "4 days ago" or "Tomorrow at 20:12:01" + * instead of "1 day from now" + * + * If a single number is given as argument, it is interpreted as nowThreshold: + * + * // One second ago, now setting a now_threshold to 5 seconds + * new Date("Nov 23 2009 17:36:50 GMT-0500 (EST)").toRelativeTime(5000) + * --> 'Just now' + * + * // One second in the future, now setting a now_threshold to 5 seconds + * new Date("Nov 23 2009 17:36:52 GMT-0500 (EST)").toRelativeTime(5000) + * --> 'Right now' + * + */ +var TRANSLATIONS = { + 'Right now':'现在', + 'Just now':'刚刚', + 'from now':'之后', + 'ago':'前', + 'Today':'今天', + 'Yesterday':'昨天', + 'Tomorrow':'明天', + ' at ':'', + 's':'', + ' ':'', + 'millisecond':'毫秒', + 'second':'秒', + 'minute':'分钟', + 'hour':'小时', + 'day':'天', + 'month':'个月', + 'year':'年', + 'Sunday':'星期天', + 'Monday':'星期六', + 'Tuesday':'星期二', + 'Wednesday':'星期三', + 'Thursday':'星期四', + 'Friday':'星期五', + 'Saturday':'星期六' +}, +_t = function (key) {return TRANSLATIONS[key];}; + + Date.prototype.toRelativeTime = (function() { + + var _ = function(options) { + var opts = processOptions(options); + + var now = opts.now || new Date(); + var delta = now - this; + var future = (delta <= 0); + delta = Math.abs(delta); + + // special cases controlled by options + if (delta <= opts.nowThreshold) { + return future ? _t('Right now') : _t('Just now'); + } + if (opts.smartDays && delta <= 6 * MS_IN_DAY) { + return toSmartDays(this, now); + } + + var units = null; + for (var key in CONVERSIONS) { + if (delta < CONVERSIONS[key]) + break; + units = _t(key); // keeps track of the selected key over the iteration + delta = delta / CONVERSIONS[key]; + } + + // pluralize a unit when the difference is greater than 1. + delta = Math.floor(delta); + if (delta !== 1) { units += _t("s"); } + return [delta, units, future ? _t("from now") : _t("ago")].join(_t(" ")); + }; + + var processOptions = function(arg) { + if (!arg) arg = 0; + if (typeof arg === 'string') { + arg = parseInt(arg, 10); + } + if (typeof arg === 'number') { + if (isNaN(arg)) arg = 0; + return {nowThreshold: arg}; + } + return arg; + }; + + var toSmartDays = function(date, now) { + var day; + var weekday = date.getDay(), + dayDiff = weekday - now.getDay(); + if (dayDiff == 0) day = _t('Today'); + else if (dayDiff == -1) day = _t('Yesterday'); + else if (dayDiff == 1 && date > now) day = _t('Tomorrow'); + else day = WEEKDAYS[weekday]; + return day + _t(" at ") + date.toLocaleTimeString(); + }; + + var CONVERSIONS = { + millisecond: 1, // ms -> ms + second: 1000, // ms -> sec + minute: 60, // sec -> min + hour: 60, // min -> hour + day: 24, // hour -> day + month: 30, // day -> month (roughly) + year: 12 // month -> year + }; + var MS_IN_DAY = (CONVERSIONS.millisecond * CONVERSIONS.second * CONVERSIONS.minute * CONVERSIONS.hour * CONVERSIONS.day); + + var WEEKDAYS = [_t('Sunday'), _t('Monday'), _t('Tuesday'), _t('Wednesday'), _t('Thursday'), _t('Friday'), _t('Saturday')]; + + return _; + +})(); + + + +/* + * Wraps up a common pattern used with this plugin whereby you take a String + * representation of a Date, and want back a date object. + */ +Date.fromString = function(str) { + return new Date(Date.parse(str)); +}; + +/* autogeneration */ +define("lib/date.extensions", [], function(){}); + +/* @source mod/relative_date.js */; + +define('mod/relative_date', [ + "jquery", + "lib/date.extensions" +], function($) { + var updateRelativeDate = function () { + $('.js-relative-date').each( + function (i, el) { + var el = $(el); + var t = (el.attr('datetime') || el.attr('data-time')).split(/[- : + T]/); + var d = new Date(t[0], t[1]-1, t[2], t[3], t[4], t[5]); + !isNaN(d.getTime()) && el.html(d.toRelativeTime({nowThreshold:60*1000})); + }); + }; + return updateRelativeDate; + }); + +/* @source mod/ajax_load.js */; + +define('mod/ajax_load', [ + "jquery", + "mod/count", + "mod/relative_date", + "mod/user_avatar" +], function($, countDict, updateRelativeDate, loadAvatar) { + var ajaxLoad = function(url, number_type) { + var maxShown = 35; + $.ajax({type: "GET", + url: url, + dataType: "json", + beforeSend: function() { + $('.timeline .loader').show(); + }, + success: function(data) { + var result = data.result; + var length = data.length; + + $('.timeline>ul').append(result); + $('.timeline .loader').hide(); + if (length < maxShown) { + $('.timeline .pagination').hide(); + } else { + countDict[number_type] += maxShown; + } + updateRelativeDate(); + loadAvatar(); + } + }); + }; + + return ajaxLoad; +}); + +/* @source mod/teamfeed_pagination.js */; + +define('mod/teamfeed_pagination', [ + "jquery", + "mod/ajax_load", + "mod/count" +], function($, ajaxLoad, countDict) { + $(function () { + var btn = $('.join-or-leave-btn'); + if (btn.length == 0) { + btn = $('.btn-success'); + } + var team_uid = btn.attr('data-team'); + $('.timeline .loader').hide(); + $('.timeline .pagination').show().click( + function () { + var number_type = "teamfeed_num"; + var url = "/j/more/team/" + team_uid + "/" + countDict.teamfeed_num; + ajaxLoad(url, number_type); + }); + }); +}); + +/* @source mod/newsfeed.js */; + +define('mod/newsfeed', [ + "jquery", + "mod/user_avatar" +], function($, loadAvatar) { + $(function () { + $('.timeline').delegate('.expand-rest', 'click', function(){ + var last = $(this).parents('.expand-last'); + last.prevUntil('.expand-first').show(300); + last.hide(); + loadAvatar(); + }); + }); +}); + + +/* @source */; + +require( + ['jquery' + , 'bootbox' + , 'mod/newsfeed' + , 'mod/teamfeed_pagination' + , 'mod/issue_tag' + , 'mod/team_header'], + function($){ + + // FIXME: 单纯用 css :hover 搞不定吗? + $('.my_projects li').hover( + function () {$(this).addClass('hover');}, + function () {$(this).removeClass('hover');} + ); + + var delProj = function (proj, team, onSuccess) { + bootbox.confirm("Are you sure?", function(confirmed) { + if (confirmed) { + $.post('/hub/team/' + team + '/remove_project', {"project_name": proj}, function (ret) { + if (ret.r === 0) { + onSuccess(); + } + }, 'json'); + } + }); + }; + $('.my_projects li .delete-btn').click(function () { + var delBtn = $(this), proj = delBtn.attr('data-proj'), team = delBtn.attr('data-team'); + delProj(proj, team, function () { delBtn.closest('li').remove(); }); + }); + + }); diff --git a/dist/js/app/team/settings.js b/dist/js/app/team/settings.js new file mode 100644 index 0000000..ff8d283 --- /dev/null +++ b/dist/js/app/team/settings.js @@ -0,0 +1,258 @@ + +require.config({ enable_ozma: true }); + + +/* @source mod/drop_down_list.js */; + +define( + 'mod/drop_down_list', + [ + "jquery" +], + function($) { + var addItemMenu = function (inputObj, success, introAppendTo, reqUrl, templ, menuType, successArg){ + var keyCode = {enter:13, esc:27, tab:9, up:38, down:40, ctrl:17, n:78, p:80}, + item_menu, + get_data = function (url){ + if (menuType == "repos"){ + length = url.length, + url = url.slice(1, length - 1); + }else { + url = url.split('/')[2]; + } + return url; + }, + call_success = function (){ + if (menuType == "repos"){ + success(); + } else { + success(successArg); + $(introAppendTo).find('.add-item-menu').remove(); + } + }; + + var hideAddItemMenu = function () { + item_menu && item_menu.empty().remove(); + }; + + var showIntro = function () { + if (!item_menu || item_menu.is(':empty')) { + item_menu = $('<div class="add-item-menu"></div>').appendTo(introAppendTo) + .on('mouseenter', 'li', function () { + item_menu.find('li.active').removeClass('active'); + $(this).addClass('active'); + }) + .on('click', 'li', function (e) { + e.preventDefault(); + var url = $(this).attr('data-url'); + url = get_data(url); + inputObj.val(url); + setTimeout(hideAddItemMenu, 100); + call_success(); + }); + } + }; + + $('body').click(function () {setTimeout(hideAddItemMenu, 100);}); + + inputObj.live('keydown', function (e) { + (e.keyCode == keyCode.enter && item_menu && item_menu.find('li.active').length) && e.preventDefault(); + showIntro(); + }).live('keyup', + function (e) { + showIntro(); + var k = e.keyCode; + if (k == keyCode.up || k == keyCode.down || k==keyCode.ctrl + || k == keyCode.enter || k == keyCode.p || k == keyCode.n){ + if (item_menu && item_menu.find('li').length){ + (k == keyCode.esc) && hideAddItemMenu();// esc key to close the menu + var actItem = item_menu.find('li.active'); + if (actItem.length) { + var a = actItem; + if (k == keyCode.up || + (k == keyCode.p && e.ctrlKey == true)) { // up + var p = a.removeClass('active').prev(); + (p.length ? p : item_menu.find('li:last')).addClass('active'); + } else if (k == keyCode.down || + (k == keyCode.n && e.ctrlKey == true)) { // down + var n = a.removeClass('active').next(); + (n.length ? n : item_menu.find('li:first')).addClass('active'); + } else if (k == keyCode.enter) { // enter key to go to repo + e.preventDefault(); + var url = actItem.attr('data-url'); + url = get_data(url); + inputObj.val(url); + setTimeout(hideAddItemMenu, 100); + call_success(); + } + } else { + item_menu.find('li:first').addClass('active'); + } + } + } else { + var q = $(this).val(); + (q != '') ? $.getJSON( + reqUrl, + {q:q}, + function (r) { + item_menu.html($.tmpl(templ, r)).show(); + }) : showIntro(); + } + } + ); + }; + return addItemMenu; + }); + +/* @source */; + +require.config({ enable_ozma: true }); +require(['jquery', 'bootbox', 'mod/drop_down_list'], + function($, bootbox, drop_down_list){ + $(function () { + var post_data = function (field_id) { + var fieldObj = $(field_id), + user_id = fieldObj.find('.input_user_id').val(), + team_uid = fieldObj.find('.input_user_id').attr('team_uid'), + identity = fieldObj.find('.input_identity').val(); + if (user_id === ''){ + var msg = 'uid不能为空'; + show_error(fieldObj, msg); + return false; + }else{ + $.ajax({ + url: '/hub/team/' + team_uid + '/add_user', + type: 'POST', + data: {'user_id': user_id, 'identity': identity}, + dataType: 'json', + success: function (msg) { + if (msg.r === 0){ + var user_id = msg.uid, + avatar_url = msg.avatar_url, + new_user = '<li><img height="20" src="'+avatar_url+'" width="20"><a href="/people/'+user_id+'/">'+user_id+'</a><a href="Javascript:void(0);" user_id="'+user_id+'" team_uid="'+team_uid+'" class="remove-user remove action">(remove)</a></li>'; + fieldObj.find('.usernames').find('li:last').parent().append(new_user); + fieldObj.find('.alert-error').remove(); + } else { + var error = msg.error; + show_error(fieldObj, error); + } + } + }); + } + }, + reqUrl = '/api/autocomplete_users', + templ = $('#templ-users-autocomplete'); + + $('.add_team_member_btn').live('click', function () { + var btnObj = $(this), + field_id = btnObj.parent().parent().attr('id'); + post_data('#'+field_id); + $('#'+field_id).find('.add-item-menu').remove(); + }); + + $('.input_user_id').one('focusin', function (){ + var inputObj = $(this), + field_id = inputObj.parent().parent().attr('id'), + form_id = inputObj.parent().attr('id'); + $('#'+field_id).find('.add-item-menu').remove(); + $('#'+field_id).find('.alert-error').remove(); + drop_down_list(inputObj, post_data, '#'+form_id, reqUrl, templ, "users", '#'+field_id); + $('#'+field_id).find('.add-item-menu').remove(); + }); + + $('.remove-user').live('click', function(event){ + var removeBtn = $(this), + field_id = removeBtn.parent().parent().parent().attr('id'), + user_id = removeBtn.attr('user_id'), + team_uid = removeBtn.attr('team_uid'), + fieldObj = $('#'+field_id); + $('#'+field_id).find('.alert-error').remove(); + + $.ajax({ + url: '/hub/team/' + team_uid + '/remove_user', + type: 'POST', + data: {'user_id': user_id}, + dataType: 'json', + success: function (msg) { + if (msg.r === 0){ + $('.remove-user[user_id='+user_id+']').parent().remove(); + } else { + var error = msg.error; + show_error(fieldObj, error); + } + } + }); + }); + + var delete_team_btn = $('#settings_del_team'); + delete_team_btn.click(function () { + var team_id = $(this).attr('data-team'); + bootbox.confirm("Are you sure?", function(confirmed){ + if (confirmed) { + $.ajax({ + url: '/hub/team/' + team_id + '/remove', + type: 'POST', + data: {}, + dataType: 'json', + success: function (msg) { + if (msg.r === 0){ + location.href = '/hub/teams'; + } + } + }); + } + }); + }); + + function show_error(targetObj, msg) { + var html = '<p class="alert alert-error">'+msg+'</p>'; + targetObj.find('.alert-error').remove(); + targetObj.append(html); + } + }); + $('#doc_project').on('change', function() { + var select = $(this); + var team_name = select.data('team-uid'); + $.ajax({ + type: 'POST', + data: JSON.stringify({ + 'content': select.val() + }), + contentType: 'application/json; charset=UTF-8', + url: '/api/teams/' + team_name + '/doc_project/', + dataType: 'json', + success: function (ret) { + if (ret.status == 201) { + select.find('option:selected').removeAttr('selected'); + select.find('option[value="' + ret.content + '"]').attr("selected",true); + } + } + }); + }); + + var enableImageUpload = function (uploader){ + uploader.submit( + function() { + $(this).ajaxSubmit({ + dataType: 'json', + delegation: true, + success: function(r){ + var team_id = uploader.data('team-uid'); + var url = "/teams/" + team_id + "/upload_profile"; + $.post(url,r,function(ret){ + if (ret.r == 0){ + var img = document.getElementById("profile_url"); + img.src = r.url; + } + }, 'json'); + }, + error: function(r) { + alert("上传错误,请确认您上传的文件类型合法"); + } + }); + return false; + }); + }; + var uploader = $('#form-file-upload'); + enableImageUpload(uploader); +}); diff --git a/dist/js/app/team/teamfeed_timeline.js b/dist/js/app/team/teamfeed_timeline.js new file mode 100644 index 0000000..8955fa3 --- /dev/null +++ b/dist/js/app/team/teamfeed_timeline.js @@ -0,0 +1,4213 @@ + +require.config({ enable_ozma: true }); + + +/* @source mod/user_profile_card.js */; + +define('mod/user_profile_card', [ + "jquery", + "jquery-tmpl" +], function($) { + $(function () { + var userCard, teamCard, users = {}, user_type = {}; + $(document).delegate( + '.user-link,.user-mention', 'mouseover', + function (e) { + if (!userCard) { + userCard = $('<div class="user-card"></div>').appendTo('body') + .mouseleave(function () { + $(this).hide(); + $('.team-card').hide(); + }); + } + if (!teamCard) { + teamCard = $('<div class="team-card"></div>').appendTo('body') + .mouseleave(function () { + $(this).hide(); + $('.user-card').hide(); + }); + } + var pos = $(this).offset(); + pos.left = pos.left - 5; + pos.top = pos.top - 5; + var name = /@?(\w+)/.exec($(this).text())[1], user = users[name]; + + if (!user) { + $.getJSON('/api/card_info', {user: name}, + function (r) { + if (r.team) { + teamCard.css(pos).empty().show(); + teamCard.append($.tmpl($('#templ-team-card'), r.team)); + user_type[name] = 'team'; + users[name] = r.team; + } else { + userCard.css(pos).empty().show(); + userCard.append($.tmpl($('#templ-user-card'), r.user)); + user_type[name] = 'user'; + users[name] = r.user; + } + }); + } else { + if (user_type[name] === 'team') { + teamCard.css(pos).empty().show(); + teamCard.append($.tmpl($('#templ-team-card'), user)); + } else { + userCard.css(pos).empty().show(); + userCard.append($.tmpl($('#templ-user-card'), user)); + } + } + }); + }); +}); + +/* @source mod/user_avatar.js */; + +define('mod/user_avatar', [ + "jquery", + "jquery-lazyload" +], function($, _) { + var isRetinaDisplay = window.devicePixelRatio > 1; + + var patchForRetina = function(originalURL) { + var match = /^(.+\Ws=)(\d+)(.*)$/.exec(originalURL); + if (match === null) { + return originalURL; + } + + var oldSize = parseInt(match[2], 10); + var newSize = Math.ceil(window.devicePixelRatio * oldSize); + + return match[1] + newSize.toString(10) + match[3]; + }; + + var checkLoad = function() { + var e = $(this); + if (isRetinaDisplay) { + var dataOriginalURL = e.attr('data-original') || e.attr('src'); + e.attr('data-original', patchForRetina(dataOriginalURL)); + + e.lazyload({effect:"fadeIn", threshold:300}); + } + }; + + var loadAvatar = function () { + // $("img.user-avatar").each(checkLoad); + // $("img.avatar").each(checkLoad); + // $(window).resize(); + }; + return loadAvatar; +}); + +/* @source lib/date.extensions.js */; + +/** + * Returns a description of this date in relative terms. + + * Examples, where new Date().toString() == "Mon Nov 23 2009 17:36:51 GMT-0500 (EST)": + * + * new Date().toRelativeTime() + * --> 'Just now' + * + * new Date("Nov 21, 2009").toRelativeTime() + * --> '2 days ago' + * + * new Date("Nov 25, 2009").toRelativeTime() + * --> '2 days from now' + * + * // One second ago + * new Date("Nov 23 2009 17:36:50 GMT-0500 (EST)").toRelativeTime() + * --> '1 second ago' + * + * toRelativeTime() takes an optional argument - a configuration object. + * It can have the following properties: + * - now - Date object that defines "now" for the purpose of conversion. + * By default, current date & time is used (i.e. new Date()) + * - nowThreshold - Threshold in milliseconds which is considered "Just now" + * for times in the past or "Right now" for now or the immediate future + * - smartDays - If enabled, dates within a week of now will use Today/Yesterday/Tomorrow + * or weekdays along with time, e.g. "Thursday at 15:10:34" + * rather than "4 days ago" or "Tomorrow at 20:12:01" + * instead of "1 day from now" + * + * If a single number is given as argument, it is interpreted as nowThreshold: + * + * // One second ago, now setting a now_threshold to 5 seconds + * new Date("Nov 23 2009 17:36:50 GMT-0500 (EST)").toRelativeTime(5000) + * --> 'Just now' + * + * // One second in the future, now setting a now_threshold to 5 seconds + * new Date("Nov 23 2009 17:36:52 GMT-0500 (EST)").toRelativeTime(5000) + * --> 'Right now' + * + */ +var TRANSLATIONS = { + 'Right now':'现在', + 'Just now':'刚刚', + 'from now':'之后', + 'ago':'前', + 'Today':'今天', + 'Yesterday':'昨天', + 'Tomorrow':'明天', + ' at ':'', + 's':'', + ' ':'', + 'millisecond':'毫秒', + 'second':'秒', + 'minute':'分钟', + 'hour':'小时', + 'day':'天', + 'month':'个月', + 'year':'年', + 'Sunday':'星期天', + 'Monday':'星期六', + 'Tuesday':'星期二', + 'Wednesday':'星期三', + 'Thursday':'星期四', + 'Friday':'星期五', + 'Saturday':'星期六' +}, +_t = function (key) {return TRANSLATIONS[key];}; + + Date.prototype.toRelativeTime = (function() { + + var _ = function(options) { + var opts = processOptions(options); + + var now = opts.now || new Date(); + var delta = now - this; + var future = (delta <= 0); + delta = Math.abs(delta); + + // special cases controlled by options + if (delta <= opts.nowThreshold) { + return future ? _t('Right now') : _t('Just now'); + } + if (opts.smartDays && delta <= 6 * MS_IN_DAY) { + return toSmartDays(this, now); + } + + var units = null; + for (var key in CONVERSIONS) { + if (delta < CONVERSIONS[key]) + break; + units = _t(key); // keeps track of the selected key over the iteration + delta = delta / CONVERSIONS[key]; + } + + // pluralize a unit when the difference is greater than 1. + delta = Math.floor(delta); + if (delta !== 1) { units += _t("s"); } + return [delta, units, future ? _t("from now") : _t("ago")].join(_t(" ")); + }; + + var processOptions = function(arg) { + if (!arg) arg = 0; + if (typeof arg === 'string') { + arg = parseInt(arg, 10); + } + if (typeof arg === 'number') { + if (isNaN(arg)) arg = 0; + return {nowThreshold: arg}; + } + return arg; + }; + + var toSmartDays = function(date, now) { + var day; + var weekday = date.getDay(), + dayDiff = weekday - now.getDay(); + if (dayDiff == 0) day = _t('Today'); + else if (dayDiff == -1) day = _t('Yesterday'); + else if (dayDiff == 1 && date > now) day = _t('Tomorrow'); + else day = WEEKDAYS[weekday]; + return day + _t(" at ") + date.toLocaleTimeString(); + }; + + var CONVERSIONS = { + millisecond: 1, // ms -> ms + second: 1000, // ms -> sec + minute: 60, // sec -> min + hour: 60, // min -> hour + day: 24, // hour -> day + month: 30, // day -> month (roughly) + year: 12 // month -> year + }; + var MS_IN_DAY = (CONVERSIONS.millisecond * CONVERSIONS.second * CONVERSIONS.minute * CONVERSIONS.hour * CONVERSIONS.day); + + var WEEKDAYS = [_t('Sunday'), _t('Monday'), _t('Tuesday'), _t('Wednesday'), _t('Thursday'), _t('Friday'), _t('Saturday')]; + + return _; + +})(); + + + +/* + * Wraps up a common pattern used with this plugin whereby you take a String + * representation of a Date, and want back a date object. + */ +Date.fromString = function(str) { + return new Date(Date.parse(str)); +}; + +/* autogeneration */ +define("lib/date.extensions", [], function(){}); + +/* @source mod/relative_date.js */; + +define('mod/relative_date', [ + "jquery", + "lib/date.extensions" +], function($) { + var updateRelativeDate = function () { + $('.js-relative-date').each( + function (i, el) { + var el = $(el); + var t = (el.attr('datetime') || el.attr('data-time')).split(/[- : + T]/); + var d = new Date(t[0], t[1]-1, t[2], t[3], t[4], t[5]); + !isNaN(d.getTime()) && el.html(d.toRelativeTime({nowThreshold:60*1000})); + }); + }; + return updateRelativeDate; + }); + +/* @source mod/count.js */; + +define('mod/count', [], function() { + var countDict = { + public_num: 35, + teamfeed_num: 35, + userfeed_num: 35, + }; + return countDict; +}); + +/* @source mod/node_config.js */; + +define('mod/node_config', function() { + var config = { + port:'7076', + host:'code.intra.douban.com', + };//need to write this when online + return config; +}); + +/* @source lib/socket.io.js */; + +/*! Socket.IO.js build:0.9.16, development. Copyright(c) 2011 LearnBoost <dev@learnboost.com> MIT Licensed */ + +var io = ('undefined' === typeof module ? {} : module.exports); +(function() { + +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, global) { + + /** + * IO namespace. + * + * @namespace + */ + + var io = exports; + + /** + * Socket.IO version + * + * @api public + */ + + io.version = '0.9.16'; + + /** + * Protocol implemented. + * + * @api public + */ + + io.protocol = 1; + + /** + * Available transports, these will be populated with the available transports + * + * @api public + */ + + io.transports = []; + + /** + * Keep track of jsonp callbacks. + * + * @api private + */ + + io.j = []; + + /** + * Keep track of our io.Sockets + * + * @api private + */ + io.sockets = {}; + + + /** + * Manages connections to hosts. + * + * @param {String} uri + * @Param {Boolean} force creation of new socket (defaults to false) + * @api public + */ + + io.connect = function (host, details) { + var uri = io.util.parseUri(host) + , uuri + , socket; + + if (global && global.location) { + uri.protocol = uri.protocol || global.location.protocol.slice(0, -1); + uri.host = uri.host || (global.document + ? global.document.domain : global.location.hostname); + uri.port = uri.port || global.location.port; + } + + uuri = io.util.uniqueUri(uri); + + var options = { + host: uri.host + , secure: 'https' == uri.protocol + , port: uri.port || ('https' == uri.protocol ? 443 : 80) + , query: uri.query || '' + }; + + io.util.merge(options, details); + + if (options['force new connection'] || !io.sockets[uuri]) { + socket = new io.Socket(options); + } + + if (!options['force new connection'] && socket) { + io.sockets[uuri] = socket; + } + + socket = socket || io.sockets[uuri]; + + // if path is different from '' or / + return socket.of(uri.path.length > 1 ? uri.path : ''); + }; + +})('object' === typeof module ? module.exports : (this.io = {}), this); +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, global) { + + /** + * Utilities namespace. + * + * @namespace + */ + + var util = exports.util = {}; + + /** + * Parses an URI + * + * @author Steven Levithan <stevenlevithan.com> (MIT license) + * @api public + */ + + var re = /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/; + + var parts = ['source', 'protocol', 'authority', 'userInfo', 'user', 'password', + 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', + 'anchor']; + + util.parseUri = function (str) { + var m = re.exec(str || '') + , uri = {} + , i = 14; + + while (i--) { + uri[parts[i]] = m[i] || ''; + } + + return uri; + }; + + /** + * Produces a unique url that identifies a Socket.IO connection. + * + * @param {Object} uri + * @api public + */ + + util.uniqueUri = function (uri) { + var protocol = uri.protocol + , host = uri.host + , port = uri.port; + + if ('document' in global) { + host = host || document.domain; + port = port || (protocol == 'https' + && document.location.protocol !== 'https:' ? 443 : document.location.port); + } else { + host = host || 'localhost'; + + if (!port && protocol == 'https') { + port = 443; + } + } + + return (protocol || 'http') + '://' + host + ':' + (port || 80); + }; + + /** + * Mergest 2 query strings in to once unique query string + * + * @param {String} base + * @param {String} addition + * @api public + */ + + util.query = function (base, addition) { + var query = util.chunkQuery(base || '') + , components = []; + + util.merge(query, util.chunkQuery(addition || '')); + for (var part in query) { + if (query.hasOwnProperty(part)) { + components.push(part + '=' + query[part]); + } + } + + return components.length ? '?' + components.join('&') : ''; + }; + + /** + * Transforms a querystring in to an object + * + * @param {String} qs + * @api public + */ + + util.chunkQuery = function (qs) { + var query = {} + , params = qs.split('&') + , i = 0 + , l = params.length + , kv; + + for (; i < l; ++i) { + kv = params[i].split('='); + if (kv[0]) { + query[kv[0]] = kv[1]; + } + } + + return query; + }; + + /** + * Executes the given function when the page is loaded. + * + * io.util.load(function () { console.log('page loaded'); }); + * + * @param {Function} fn + * @api public + */ + + var pageLoaded = false; + + util.load = function (fn) { + if ('document' in global && document.readyState === 'complete' || pageLoaded) { + return fn(); + } + + util.on(global, 'load', fn, false); + }; + + /** + * Adds an event. + * + * @api private + */ + + util.on = function (element, event, fn, capture) { + if (element.attachEvent) { + element.attachEvent('on' + event, fn); + } else if (element.addEventListener) { + element.addEventListener(event, fn, capture); + } + }; + + /** + * Generates the correct `XMLHttpRequest` for regular and cross domain requests. + * + * @param {Boolean} [xdomain] Create a request that can be used cross domain. + * @returns {XMLHttpRequest|false} If we can create a XMLHttpRequest. + * @api private + */ + + util.request = function (xdomain) { + + if (xdomain && 'undefined' != typeof XDomainRequest && !util.ua.hasCORS) { + return new XDomainRequest(); + } + + if ('undefined' != typeof XMLHttpRequest && (!xdomain || util.ua.hasCORS)) { + return new XMLHttpRequest(); + } + + if (!xdomain) { + try { + return new window[(['Active'].concat('Object').join('X'))]('Microsoft.XMLHTTP'); + } catch(e) { } + } + + return null; + }; + + /** + * XHR based transport constructor. + * + * @constructor + * @api public + */ + + /** + * Change the internal pageLoaded value. + */ + + if ('undefined' != typeof window) { + util.load(function () { + pageLoaded = true; + }); + } + + /** + * Defers a function to ensure a spinner is not displayed by the browser + * + * @param {Function} fn + * @api public + */ + + util.defer = function (fn) { + if (!util.ua.webkit || 'undefined' != typeof importScripts) { + return fn(); + } + + util.load(function () { + setTimeout(fn, 100); + }); + }; + + /** + * Merges two objects. + * + * @api public + */ + + util.merge = function merge (target, additional, deep, lastseen) { + var seen = lastseen || [] + , depth = typeof deep == 'undefined' ? 2 : deep + , prop; + + for (prop in additional) { + if (additional.hasOwnProperty(prop) && util.indexOf(seen, prop) < 0) { + if (typeof target[prop] !== 'object' || !depth) { + target[prop] = additional[prop]; + seen.push(additional[prop]); + } else { + util.merge(target[prop], additional[prop], depth - 1, seen); + } + } + } + + return target; + }; + + /** + * Merges prototypes from objects + * + * @api public + */ + + util.mixin = function (ctor, ctor2) { + util.merge(ctor.prototype, ctor2.prototype); + }; + + /** + * Shortcut for prototypical and static inheritance. + * + * @api private + */ + + util.inherit = function (ctor, ctor2) { + function f() {}; + f.prototype = ctor2.prototype; + ctor.prototype = new f; + }; + + /** + * Checks if the given object is an Array. + * + * io.util.isArray([]); // true + * io.util.isArray({}); // false + * + * @param Object obj + * @api public + */ + + util.isArray = Array.isArray || function (obj) { + return Object.prototype.toString.call(obj) === '[object Array]'; + }; + + /** + * Intersects values of two arrays into a third + * + * @api public + */ + + util.intersect = function (arr, arr2) { + var ret = [] + , longest = arr.length > arr2.length ? arr : arr2 + , shortest = arr.length > arr2.length ? arr2 : arr; + + for (var i = 0, l = shortest.length; i < l; i++) { + if (~util.indexOf(longest, shortest[i])) + ret.push(shortest[i]); + } + + return ret; + }; + + /** + * Array indexOf compatibility. + * + * @see bit.ly/a5Dxa2 + * @api public + */ + + util.indexOf = function (arr, o, i) { + + for (var j = arr.length, i = i < 0 ? i + j < 0 ? 0 : i + j : i || 0; + i < j && arr[i] !== o; i++) {} + + return j <= i ? -1 : i; + }; + + /** + * Converts enumerables to array. + * + * @api public + */ + + util.toArray = function (enu) { + var arr = []; + + for (var i = 0, l = enu.length; i < l; i++) + arr.push(enu[i]); + + return arr; + }; + + /** + * UA / engines detection namespace. + * + * @namespace + */ + + util.ua = {}; + + /** + * Whether the UA supports CORS for XHR. + * + * @api public + */ + + util.ua.hasCORS = 'undefined' != typeof XMLHttpRequest && (function () { + try { + var a = new XMLHttpRequest(); + } catch (e) { + return false; + } + + return a.withCredentials != undefined; + })(); + + /** + * Detect webkit. + * + * @api public + */ + + util.ua.webkit = 'undefined' != typeof navigator + && /webkit/i.test(navigator.userAgent); + + /** + * Detect iPad/iPhone/iPod. + * + * @api public + */ + + util.ua.iDevice = 'undefined' != typeof navigator + && /iPad|iPhone|iPod/i.test(navigator.userAgent); + +})('undefined' != typeof io ? io : module.exports, this); +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.EventEmitter = EventEmitter; + + /** + * Event emitter constructor. + * + * @api public. + */ + + function EventEmitter () {}; + + /** + * Adds a listener + * + * @api public + */ + + EventEmitter.prototype.on = function (name, fn) { + if (!this.$events) { + this.$events = {}; + } + + if (!this.$events[name]) { + this.$events[name] = fn; + } else if (io.util.isArray(this.$events[name])) { + this.$events[name].push(fn); + } else { + this.$events[name] = [this.$events[name], fn]; + } + + return this; + }; + + EventEmitter.prototype.addListener = EventEmitter.prototype.on; + + /** + * Adds a volatile listener. + * + * @api public + */ + + EventEmitter.prototype.once = function (name, fn) { + var self = this; + + function on () { + self.removeListener(name, on); + fn.apply(this, arguments); + }; + + on.listener = fn; + this.on(name, on); + + return this; + }; + + /** + * Removes a listener. + * + * @api public + */ + + EventEmitter.prototype.removeListener = function (name, fn) { + if (this.$events && this.$events[name]) { + var list = this.$events[name]; + + if (io.util.isArray(list)) { + var pos = -1; + + for (var i = 0, l = list.length; i < l; i++) { + if (list[i] === fn || (list[i].listener && list[i].listener === fn)) { + pos = i; + break; + } + } + + if (pos < 0) { + return this; + } + + list.splice(pos, 1); + + if (!list.length) { + delete this.$events[name]; + } + } else if (list === fn || (list.listener && list.listener === fn)) { + delete this.$events[name]; + } + } + + return this; + }; + + /** + * Removes all listeners for an event. + * + * @api public + */ + + EventEmitter.prototype.removeAllListeners = function (name) { + if (name === undefined) { + this.$events = {}; + return this; + } + + if (this.$events && this.$events[name]) { + this.$events[name] = null; + } + + return this; + }; + + /** + * Gets all listeners for a certain event. + * + * @api publci + */ + + EventEmitter.prototype.listeners = function (name) { + if (!this.$events) { + this.$events = {}; + } + + if (!this.$events[name]) { + this.$events[name] = []; + } + + if (!io.util.isArray(this.$events[name])) { + this.$events[name] = [this.$events[name]]; + } + + return this.$events[name]; + }; + + /** + * Emits an event. + * + * @api public + */ + + EventEmitter.prototype.emit = function (name) { + if (!this.$events) { + return false; + } + + var handler = this.$events[name]; + + if (!handler) { + return false; + } + + var args = Array.prototype.slice.call(arguments, 1); + + if ('function' == typeof handler) { + handler.apply(this, args); + } else if (io.util.isArray(handler)) { + var listeners = handler.slice(); + + for (var i = 0, l = listeners.length; i < l; i++) { + listeners[i].apply(this, args); + } + } else { + return false; + } + + return true; + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +/** + * Based on JSON2 (http://www.JSON.org/js.html). + */ + +(function (exports, nativeJSON) { + "use strict"; + + // use native JSON if it's available + if (nativeJSON && nativeJSON.parse){ + return exports.JSON = { + parse: nativeJSON.parse + , stringify: nativeJSON.stringify + }; + } + + var JSON = exports.JSON = {}; + + function f(n) { + // Format integers to have at least two digits. + return n < 10 ? '0' + n : n; + } + + function date(d, key) { + return isFinite(d.valueOf()) ? + d.getUTCFullYear() + '-' + + f(d.getUTCMonth() + 1) + '-' + + f(d.getUTCDate()) + 'T' + + f(d.getUTCHours()) + ':' + + f(d.getUTCMinutes()) + ':' + + f(d.getUTCSeconds()) + 'Z' : null; + }; + + var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + gap, + indent, + meta = { // table of character substitutions + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '\\': '\\\\' + }, + rep; + + + function quote(string) { + +// If the string contains no control characters, no quote characters, and no +// backslash characters, then we can safely slap some quotes around it. +// Otherwise we must also replace the offending characters with safe escape +// sequences. + + escapable.lastIndex = 0; + return escapable.test(string) ? '"' + string.replace(escapable, function (a) { + var c = meta[a]; + return typeof c === 'string' ? c : + '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }) + '"' : '"' + string + '"'; + } + + + function str(key, holder) { + +// Produce a string from holder[key]. + + var i, // The loop counter. + k, // The member key. + v, // The member value. + length, + mind = gap, + partial, + value = holder[key]; + +// If the value has a toJSON method, call it to obtain a replacement value. + + if (value instanceof Date) { + value = date(key); + } + +// If we were called with a replacer function, then call the replacer to +// obtain a replacement value. + + if (typeof rep === 'function') { + value = rep.call(holder, key, value); + } + +// What happens next depends on the value's type. + + switch (typeof value) { + case 'string': + return quote(value); + + case 'number': + +// JSON numbers must be finite. Encode non-finite numbers as null. + + return isFinite(value) ? String(value) : 'null'; + + case 'boolean': + case 'null': + +// If the value is a boolean or null, convert it to a string. Note: +// typeof null does not produce 'null'. The case is included here in +// the remote chance that this gets fixed someday. + + return String(value); + +// If the type is 'object', we might be dealing with an object or an array or +// null. + + case 'object': + +// Due to a specification blunder in ECMAScript, typeof null is 'object', +// so watch out for that case. + + if (!value) { + return 'null'; + } + +// Make an array to hold the partial results of stringifying this object value. + + gap += indent; + partial = []; + +// Is the value an array? + + if (Object.prototype.toString.apply(value) === '[object Array]') { + +// The value is an array. Stringify every element. Use null as a placeholder +// for non-JSON values. + + length = value.length; + for (i = 0; i < length; i += 1) { + partial[i] = str(i, value) || 'null'; + } + +// Join all of the elements together, separated with commas, and wrap them in +// brackets. + + v = partial.length === 0 ? '[]' : gap ? + '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : + '[' + partial.join(',') + ']'; + gap = mind; + return v; + } + +// If the replacer is an array, use it to select the members to be stringified. + + if (rep && typeof rep === 'object') { + length = rep.length; + for (i = 0; i < length; i += 1) { + if (typeof rep[i] === 'string') { + k = rep[i]; + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } else { + +// Otherwise, iterate through all of the keys in the object. + + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } + +// Join all of the member texts together, separated with commas, +// and wrap them in braces. + + v = partial.length === 0 ? '{}' : gap ? + '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : + '{' + partial.join(',') + '}'; + gap = mind; + return v; + } + } + +// If the JSON object does not yet have a stringify method, give it one. + + JSON.stringify = function (value, replacer, space) { + +// The stringify method takes a value and an optional replacer, and an optional +// space parameter, and returns a JSON text. The replacer can be a function +// that can replace values, or an array of strings that will select the keys. +// A default replacer method can be provided. Use of the space parameter can +// produce text that is more easily readable. + + var i; + gap = ''; + indent = ''; + +// If the space parameter is a number, make an indent string containing that +// many spaces. + + if (typeof space === 'number') { + for (i = 0; i < space; i += 1) { + indent += ' '; + } + +// If the space parameter is a string, it will be used as the indent string. + + } else if (typeof space === 'string') { + indent = space; + } + +// If there is a replacer, it must be a function or an array. +// Otherwise, throw an error. + + rep = replacer; + if (replacer && typeof replacer !== 'function' && + (typeof replacer !== 'object' || + typeof replacer.length !== 'number')) { + throw new Error('JSON.stringify'); + } + +// Make a fake root object containing our value under the key of ''. +// Return the result of stringifying the value. + + return str('', {'': value}); + }; + +// If the JSON object does not yet have a parse method, give it one. + + JSON.parse = function (text, reviver) { + // The parse method takes a text and an optional reviver function, and returns + // a JavaScript value if the text is a valid JSON text. + + var j; + + function walk(holder, key) { + + // The walk method is used to recursively walk the resulting structure so + // that modifications can be made. + + var k, v, value = holder[key]; + if (value && typeof value === 'object') { + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = walk(value, k); + if (v !== undefined) { + value[k] = v; + } else { + delete value[k]; + } + } + } + } + return reviver.call(holder, key, value); + } + + + // Parsing happens in four stages. In the first stage, we replace certain + // Unicode characters with escape sequences. JavaScript handles many characters + // incorrectly, either silently deleting them, or treating them as line endings. + + text = String(text); + cx.lastIndex = 0; + if (cx.test(text)) { + text = text.replace(cx, function (a) { + return '\\u' + + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }); + } + + // In the second stage, we run the text against regular expressions that look + // for non-JSON patterns. We are especially concerned with '()' and 'new' + // because they can cause invocation, and '=' because it can cause mutation. + // But just to be safe, we want to reject all unexpected forms. + + // We split the second stage into 4 regexp operations in order to work around + // crippling inefficiencies in IE's and Safari's regexp engines. First we + // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we + // replace all simple value tokens with ']' characters. Third, we delete all + // open brackets that follow a colon or comma or that begin the text. Finally, + // we look to see that the remaining characters are only whitespace or ']' or + // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. + + if (/^[\],:{}\s]*$/ + .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') + .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') + .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { + + // In the third stage we use the eval function to compile the text into a + // JavaScript structure. The '{' operator is subject to a syntactic ambiguity + // in JavaScript: it can begin a block or an object literal. We wrap the text + // in parens to eliminate the ambiguity. + + j = eval('(' + text + ')'); + + // In the optional fourth stage, we recursively walk the new structure, passing + // each name/value pair to a reviver function for possible transformation. + + return typeof reviver === 'function' ? + walk({'': j}, '') : j; + } + + // If the text is not JSON parseable, then a SyntaxError is thrown. + + throw new SyntaxError('JSON.parse'); + }; + +})( + 'undefined' != typeof io ? io : module.exports + , typeof JSON !== 'undefined' ? JSON : undefined +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Parser namespace. + * + * @namespace + */ + + var parser = exports.parser = {}; + + /** + * Packet types. + */ + + var packets = parser.packets = [ + 'disconnect' + , 'connect' + , 'heartbeat' + , 'message' + , 'json' + , 'event' + , 'ack' + , 'error' + , 'noop' + ]; + + /** + * Errors reasons. + */ + + var reasons = parser.reasons = [ + 'transport not supported' + , 'client not handshaken' + , 'unauthorized' + ]; + + /** + * Errors advice. + */ + + var advice = parser.advice = [ + 'reconnect' + ]; + + /** + * Shortcuts. + */ + + var JSON = io.JSON + , indexOf = io.util.indexOf; + + /** + * Encodes a packet. + * + * @api private + */ + + parser.encodePacket = function (packet) { + var type = indexOf(packets, packet.type) + , id = packet.id || '' + , endpoint = packet.endpoint || '' + , ack = packet.ack + , data = null; + + switch (packet.type) { + case 'error': + var reason = packet.reason ? indexOf(reasons, packet.reason) : '' + , adv = packet.advice ? indexOf(advice, packet.advice) : ''; + + if (reason !== '' || adv !== '') + data = reason + (adv !== '' ? ('+' + adv) : ''); + + break; + + case 'message': + if (packet.data !== '') + data = packet.data; + break; + + case 'event': + var ev = { name: packet.name }; + + if (packet.args && packet.args.length) { + ev.args = packet.args; + } + + data = JSON.stringify(ev); + break; + + case 'json': + data = JSON.stringify(packet.data); + break; + + case 'connect': + if (packet.qs) + data = packet.qs; + break; + + case 'ack': + data = packet.ackId + + (packet.args && packet.args.length + ? '+' + JSON.stringify(packet.args) : ''); + break; + } + + // construct packet with required fragments + var encoded = [ + type + , id + (ack == 'data' ? '+' : '') + , endpoint + ]; + + // data fragment is optional + if (data !== null && data !== undefined) + encoded.push(data); + + return encoded.join(':'); + }; + + /** + * Encodes multiple messages (payload). + * + * @param {Array} messages + * @api private + */ + + parser.encodePayload = function (packets) { + var decoded = ''; + + if (packets.length == 1) + return packets[0]; + + for (var i = 0, l = packets.length; i < l; i++) { + var packet = packets[i]; + decoded += '\ufffd' + packet.length + '\ufffd' + packets[i]; + } + + return decoded; + }; + + /** + * Decodes a packet + * + * @api private + */ + + var regexp = /([^:]+):([0-9]+)?(\+)?:([^:]+)?:?([\s\S]*)?/; + + parser.decodePacket = function (data) { + var pieces = data.match(regexp); + + if (!pieces) return {}; + + var id = pieces[2] || '' + , data = pieces[5] || '' + , packet = { + type: packets[pieces[1]] + , endpoint: pieces[4] || '' + }; + + // whether we need to acknowledge the packet + if (id) { + packet.id = id; + if (pieces[3]) + packet.ack = 'data'; + else + packet.ack = true; + } + + // handle different packet types + switch (packet.type) { + case 'error': + var pieces = data.split('+'); + packet.reason = reasons[pieces[0]] || ''; + packet.advice = advice[pieces[1]] || ''; + break; + + case 'message': + packet.data = data || ''; + break; + + case 'event': + try { + var opts = JSON.parse(data); + packet.name = opts.name; + packet.args = opts.args; + } catch (e) { } + + packet.args = packet.args || []; + break; + + case 'json': + try { + packet.data = JSON.parse(data); + } catch (e) { } + break; + + case 'connect': + packet.qs = data || ''; + break; + + case 'ack': + var pieces = data.match(/^([0-9]+)(\+)?(.*)/); + if (pieces) { + packet.ackId = pieces[1]; + packet.args = []; + + if (pieces[3]) { + try { + packet.args = pieces[3] ? JSON.parse(pieces[3]) : []; + } catch (e) { } + } + } + break; + + case 'disconnect': + case 'heartbeat': + break; + }; + + return packet; + }; + + /** + * Decodes data payload. Detects multiple messages + * + * @return {Array} messages + * @api public + */ + + parser.decodePayload = function (data) { + // IE doesn't like data[i] for unicode chars, charAt works fine + if (data.charAt(0) == '\ufffd') { + var ret = []; + + for (var i = 1, length = ''; i < data.length; i++) { + if (data.charAt(i) == '\ufffd') { + ret.push(parser.decodePacket(data.substr(i + 1).substr(0, length))); + i += Number(length) + 1; + length = ''; + } else { + length += data.charAt(i); + } + } + + return ret; + } else { + return [parser.decodePacket(data)]; + } + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.Transport = Transport; + + /** + * This is the transport template for all supported transport methods. + * + * @constructor + * @api public + */ + + function Transport (socket, sessid) { + this.socket = socket; + this.sessid = sessid; + }; + + /** + * Apply EventEmitter mixin. + */ + + io.util.mixin(Transport, io.EventEmitter); + + + /** + * Indicates whether heartbeats is enabled for this transport + * + * @api private + */ + + Transport.prototype.heartbeats = function () { + return true; + }; + + /** + * Handles the response from the server. When a new response is received + * it will automatically update the timeout, decode the message and + * forwards the response to the onMessage function for further processing. + * + * @param {String} data Response from the server. + * @api private + */ + + Transport.prototype.onData = function (data) { + this.clearCloseTimeout(); + + // If the connection in currently open (or in a reopening state) reset the close + // timeout since we have just received data. This check is necessary so + // that we don't reset the timeout on an explicitly disconnected connection. + if (this.socket.connected || this.socket.connecting || this.socket.reconnecting) { + this.setCloseTimeout(); + } + + if (data !== '') { + // todo: we should only do decodePayload for xhr transports + var msgs = io.parser.decodePayload(data); + + if (msgs && msgs.length) { + for (var i = 0, l = msgs.length; i < l; i++) { + this.onPacket(msgs[i]); + } + } + } + + return this; + }; + + /** + * Handles packets. + * + * @api private + */ + + Transport.prototype.onPacket = function (packet) { + this.socket.setHeartbeatTimeout(); + + if (packet.type == 'heartbeat') { + return this.onHeartbeat(); + } + + if (packet.type == 'connect' && packet.endpoint == '') { + this.onConnect(); + } + + if (packet.type == 'error' && packet.advice == 'reconnect') { + this.isOpen = false; + } + + this.socket.onPacket(packet); + + return this; + }; + + /** + * Sets close timeout + * + * @api private + */ + + Transport.prototype.setCloseTimeout = function () { + if (!this.closeTimeout) { + var self = this; + + this.closeTimeout = setTimeout(function () { + self.onDisconnect(); + }, this.socket.closeTimeout); + } + }; + + /** + * Called when transport disconnects. + * + * @api private + */ + + Transport.prototype.onDisconnect = function () { + if (this.isOpen) this.close(); + this.clearTimeouts(); + this.socket.onDisconnect(); + return this; + }; + + /** + * Called when transport connects + * + * @api private + */ + + Transport.prototype.onConnect = function () { + this.socket.onConnect(); + return this; + }; + + /** + * Clears close timeout + * + * @api private + */ + + Transport.prototype.clearCloseTimeout = function () { + if (this.closeTimeout) { + clearTimeout(this.closeTimeout); + this.closeTimeout = null; + } + }; + + /** + * Clear timeouts + * + * @api private + */ + + Transport.prototype.clearTimeouts = function () { + this.clearCloseTimeout(); + + if (this.reopenTimeout) { + clearTimeout(this.reopenTimeout); + } + }; + + /** + * Sends a packet + * + * @param {Object} packet object. + * @api private + */ + + Transport.prototype.packet = function (packet) { + this.send(io.parser.encodePacket(packet)); + }; + + /** + * Send the received heartbeat message back to server. So the server + * knows we are still connected. + * + * @param {String} heartbeat Heartbeat response from the server. + * @api private + */ + + Transport.prototype.onHeartbeat = function (heartbeat) { + this.packet({ type: 'heartbeat' }); + }; + + /** + * Called when the transport opens. + * + * @api private + */ + + Transport.prototype.onOpen = function () { + this.isOpen = true; + this.clearCloseTimeout(); + this.socket.onOpen(); + }; + + /** + * Notifies the base when the connection with the Socket.IO server + * has been disconnected. + * + * @api private + */ + + Transport.prototype.onClose = function () { + var self = this; + + /* FIXME: reopen delay causing a infinit loop + this.reopenTimeout = setTimeout(function () { + self.open(); + }, this.socket.options['reopen delay']);*/ + + this.isOpen = false; + this.socket.onClose(); + this.onDisconnect(); + }; + + /** + * Generates a connection url based on the Socket.IO URL Protocol. + * See <https://github.com/learnboost/socket.io-node/> for more details. + * + * @returns {String} Connection url + * @api private + */ + + Transport.prototype.prepareUrl = function () { + var options = this.socket.options; + + return this.scheme() + '://' + + options.host + ':' + options.port + '/' + + options.resource + '/' + io.protocol + + '/' + this.name + '/' + this.sessid; + }; + + /** + * Checks if the transport is ready to start a connection. + * + * @param {Socket} socket The socket instance that needs a transport + * @param {Function} fn The callback + * @api private + */ + + Transport.prototype.ready = function (socket, fn) { + fn.call(this); + }; +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + */ + + exports.Socket = Socket; + + /** + * Create a new `Socket.IO client` which can establish a persistent + * connection with a Socket.IO enabled server. + * + * @api public + */ + + function Socket (options) { + this.options = { + port: 80 + , secure: false + , document: 'document' in global ? document : false + , resource: 'socket.io' + , transports: io.transports + , 'connect timeout': 10000 + , 'try multiple transports': true + , 'reconnect': true + , 'reconnection delay': 500 + , 'reconnection limit': Infinity + , 'reopen delay': 3000 + , 'max reconnection attempts': 10 + , 'sync disconnect on unload': false + , 'auto connect': true + , 'flash policy port': 10843 + , 'manualFlush': false + }; + + io.util.merge(this.options, options); + + this.connected = false; + this.open = false; + this.connecting = false; + this.reconnecting = false; + this.namespaces = {}; + this.buffer = []; + this.doBuffer = false; + + if (this.options['sync disconnect on unload'] && + (!this.isXDomain() || io.util.ua.hasCORS)) { + var self = this; + io.util.on(global, 'beforeunload', function () { + self.disconnectSync(); + }, false); + } + + if (this.options['auto connect']) { + this.connect(); + } +}; + + /** + * Apply EventEmitter mixin. + */ + + io.util.mixin(Socket, io.EventEmitter); + + /** + * Returns a namespace listener/emitter for this socket + * + * @api public + */ + + Socket.prototype.of = function (name) { + if (!this.namespaces[name]) { + this.namespaces[name] = new io.SocketNamespace(this, name); + + if (name !== '') { + this.namespaces[name].packet({ type: 'connect' }); + } + } + + return this.namespaces[name]; + }; + + /** + * Emits the given event to the Socket and all namespaces + * + * @api private + */ + + Socket.prototype.publish = function () { + this.emit.apply(this, arguments); + + var nsp; + + for (var i in this.namespaces) { + if (this.namespaces.hasOwnProperty(i)) { + nsp = this.of(i); + nsp.$emit.apply(nsp, arguments); + } + } + }; + + /** + * Performs the handshake + * + * @api private + */ + + function empty () { }; + + Socket.prototype.handshake = function (fn) { + var self = this + , options = this.options; + + function complete (data) { + if (data instanceof Error) { + self.connecting = false; + self.onError(data.message); + } else { + fn.apply(null, data.split(':')); + } + }; + + var url = [ + 'http' + (options.secure ? 's' : '') + ':/' + , options.host + ':' + options.port + , options.resource + , io.protocol + , io.util.query(this.options.query, 't=' + +new Date) + ].join('/'); + + if (this.isXDomain() && !io.util.ua.hasCORS) { + var insertAt = document.getElementsByTagName('script')[0] + , script = document.createElement('script'); + + script.src = url + '&jsonp=' + io.j.length; + insertAt.parentNode.insertBefore(script, insertAt); + + io.j.push(function (data) { + complete(data); + script.parentNode.removeChild(script); + }); + } else { + var xhr = io.util.request(); + + xhr.open('GET', url, true); + if (this.isXDomain()) { + xhr.withCredentials = true; + } + xhr.onreadystatechange = function () { + if (xhr.readyState == 4) { + xhr.onreadystatechange = empty; + + if (xhr.status == 200) { + complete(xhr.responseText); + } else if (xhr.status == 403) { + self.onError(xhr.responseText); + } else { + self.connecting = false; + !self.reconnecting && self.onError(xhr.responseText); + } + } + }; + xhr.send(null); + } + }; + + /** + * Find an available transport based on the options supplied in the constructor. + * + * @api private + */ + + Socket.prototype.getTransport = function (override) { + var transports = override || this.transports, match; + + for (var i = 0, transport; transport = transports[i]; i++) { + if (io.Transport[transport] + && io.Transport[transport].check(this) + && (!this.isXDomain() || io.Transport[transport].xdomainCheck(this))) { + return new io.Transport[transport](this, this.sessionid); + } + } + + return null; + }; + + /** + * Connects to the server. + * + * @param {Function} [fn] Callback. + * @returns {io.Socket} + * @api public + */ + + Socket.prototype.connect = function (fn) { + if (this.connecting) { + return this; + } + + var self = this; + self.connecting = true; + + this.handshake(function (sid, heartbeat, close, transports) { + self.sessionid = sid; + self.closeTimeout = close * 1000; + self.heartbeatTimeout = heartbeat * 1000; + if(!self.transports) + self.transports = self.origTransports = (transports ? io.util.intersect( + transports.split(',') + , self.options.transports + ) : self.options.transports); + + self.setHeartbeatTimeout(); + + function connect (transports){ + if (self.transport) self.transport.clearTimeouts(); + + self.transport = self.getTransport(transports); + if (!self.transport) return self.publish('connect_failed'); + + // once the transport is ready + self.transport.ready(self, function () { + self.connecting = true; + self.publish('connecting', self.transport.name); + self.transport.open(); + + if (self.options['connect timeout']) { + self.connectTimeoutTimer = setTimeout(function () { + if (!self.connected) { + self.connecting = false; + + if (self.options['try multiple transports']) { + var remaining = self.transports; + + while (remaining.length > 0 && remaining.splice(0,1)[0] != + self.transport.name) {} + + if (remaining.length){ + connect(remaining); + } else { + self.publish('connect_failed'); + } + } + } + }, self.options['connect timeout']); + } + }); + } + + connect(self.transports); + + self.once('connect', function (){ + clearTimeout(self.connectTimeoutTimer); + + fn && typeof fn == 'function' && fn(); + }); + }); + + return this; + }; + + /** + * Clears and sets a new heartbeat timeout using the value given by the + * server during the handshake. + * + * @api private + */ + + Socket.prototype.setHeartbeatTimeout = function () { + clearTimeout(this.heartbeatTimeoutTimer); + if(this.transport && !this.transport.heartbeats()) return; + + var self = this; + this.heartbeatTimeoutTimer = setTimeout(function () { + self.transport.onClose(); + }, this.heartbeatTimeout); + }; + + /** + * Sends a message. + * + * @param {Object} data packet. + * @returns {io.Socket} + * @api public + */ + + Socket.prototype.packet = function (data) { + if (this.connected && !this.doBuffer) { + this.transport.packet(data); + } else { + this.buffer.push(data); + } + + return this; + }; + + /** + * Sets buffer state + * + * @api private + */ + + Socket.prototype.setBuffer = function (v) { + this.doBuffer = v; + + if (!v && this.connected && this.buffer.length) { + if (!this.options['manualFlush']) { + this.flushBuffer(); + } + } + }; + + /** + * Flushes the buffer data over the wire. + * To be invoked manually when 'manualFlush' is set to true. + * + * @api public + */ + + Socket.prototype.flushBuffer = function() { + this.transport.payload(this.buffer); + this.buffer = []; + }; + + + /** + * Disconnect the established connect. + * + * @returns {io.Socket} + * @api public + */ + + Socket.prototype.disconnect = function () { + if (this.connected || this.connecting) { + if (this.open) { + this.of('').packet({ type: 'disconnect' }); + } + + // handle disconnection immediately + this.onDisconnect('booted'); + } + + return this; + }; + + /** + * Disconnects the socket with a sync XHR. + * + * @api private + */ + + Socket.prototype.disconnectSync = function () { + // ensure disconnection + var xhr = io.util.request(); + var uri = [ + 'http' + (this.options.secure ? 's' : '') + ':/' + , this.options.host + ':' + this.options.port + , this.options.resource + , io.protocol + , '' + , this.sessionid + ].join('/') + '/?disconnect=1'; + + xhr.open('GET', uri, false); + xhr.send(null); + + // handle disconnection immediately + this.onDisconnect('booted'); + }; + + /** + * Check if we need to use cross domain enabled transports. Cross domain would + * be a different port or different domain name. + * + * @returns {Boolean} + * @api private + */ + + Socket.prototype.isXDomain = function () { + + var port = global.location.port || + ('https:' == global.location.protocol ? 443 : 80); + + return this.options.host !== global.location.hostname + || this.options.port != port; + }; + + /** + * Called upon handshake. + * + * @api private + */ + + Socket.prototype.onConnect = function () { + if (!this.connected) { + this.connected = true; + this.connecting = false; + if (!this.doBuffer) { + // make sure to flush the buffer + this.setBuffer(false); + } + this.emit('connect'); + } + }; + + /** + * Called when the transport opens + * + * @api private + */ + + Socket.prototype.onOpen = function () { + this.open = true; + }; + + /** + * Called when the transport closes. + * + * @api private + */ + + Socket.prototype.onClose = function () { + this.open = false; + clearTimeout(this.heartbeatTimeoutTimer); + }; + + /** + * Called when the transport first opens a connection + * + * @param text + */ + + Socket.prototype.onPacket = function (packet) { + this.of(packet.endpoint).onPacket(packet); + }; + + /** + * Handles an error. + * + * @api private + */ + + Socket.prototype.onError = function (err) { + if (err && err.advice) { + if (err.advice === 'reconnect' && (this.connected || this.connecting)) { + this.disconnect(); + if (this.options.reconnect) { + this.reconnect(); + } + } + } + + this.publish('error', err && err.reason ? err.reason : err); + }; + + /** + * Called when the transport disconnects. + * + * @api private + */ + + Socket.prototype.onDisconnect = function (reason) { + var wasConnected = this.connected + , wasConnecting = this.connecting; + + this.connected = false; + this.connecting = false; + this.open = false; + + if (wasConnected || wasConnecting) { + this.transport.close(); + this.transport.clearTimeouts(); + if (wasConnected) { + this.publish('disconnect', reason); + + if ('booted' != reason && this.options.reconnect && !this.reconnecting) { + this.reconnect(); + } + } + } + }; + + /** + * Called upon reconnection. + * + * @api private + */ + + Socket.prototype.reconnect = function () { + this.reconnecting = true; + this.reconnectionAttempts = 0; + this.reconnectionDelay = this.options['reconnection delay']; + + var self = this + , maxAttempts = this.options['max reconnection attempts'] + , tryMultiple = this.options['try multiple transports'] + , limit = this.options['reconnection limit']; + + function reset () { + if (self.connected) { + for (var i in self.namespaces) { + if (self.namespaces.hasOwnProperty(i) && '' !== i) { + self.namespaces[i].packet({ type: 'connect' }); + } + } + self.publish('reconnect', self.transport.name, self.reconnectionAttempts); + } + + clearTimeout(self.reconnectionTimer); + + self.removeListener('connect_failed', maybeReconnect); + self.removeListener('connect', maybeReconnect); + + self.reconnecting = false; + + delete self.reconnectionAttempts; + delete self.reconnectionDelay; + delete self.reconnectionTimer; + delete self.redoTransports; + + self.options['try multiple transports'] = tryMultiple; + }; + + function maybeReconnect () { + if (!self.reconnecting) { + return; + } + + if (self.connected) { + return reset(); + }; + + if (self.connecting && self.reconnecting) { + return self.reconnectionTimer = setTimeout(maybeReconnect, 1000); + } + + if (self.reconnectionAttempts++ >= maxAttempts) { + if (!self.redoTransports) { + self.on('connect_failed', maybeReconnect); + self.options['try multiple transports'] = true; + self.transports = self.origTransports; + self.transport = self.getTransport(); + self.redoTransports = true; + self.connect(); + } else { + self.publish('reconnect_failed'); + reset(); + } + } else { + if (self.reconnectionDelay < limit) { + self.reconnectionDelay *= 2; // exponential back off + } + + self.connect(); + self.publish('reconnecting', self.reconnectionDelay, self.reconnectionAttempts); + self.reconnectionTimer = setTimeout(maybeReconnect, self.reconnectionDelay); + } + }; + + this.options['try multiple transports'] = false; + this.reconnectionTimer = setTimeout(maybeReconnect, this.reconnectionDelay); + + this.on('connect', maybeReconnect); + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.SocketNamespace = SocketNamespace; + + /** + * Socket namespace constructor. + * + * @constructor + * @api public + */ + + function SocketNamespace (socket, name) { + this.socket = socket; + this.name = name || ''; + this.flags = {}; + this.json = new Flag(this, 'json'); + this.ackPackets = 0; + this.acks = {}; + }; + + /** + * Apply EventEmitter mixin. + */ + + io.util.mixin(SocketNamespace, io.EventEmitter); + + /** + * Copies emit since we override it + * + * @api private + */ + + SocketNamespace.prototype.$emit = io.EventEmitter.prototype.emit; + + /** + * Creates a new namespace, by proxying the request to the socket. This + * allows us to use the synax as we do on the server. + * + * @api public + */ + + SocketNamespace.prototype.of = function () { + return this.socket.of.apply(this.socket, arguments); + }; + + /** + * Sends a packet. + * + * @api private + */ + + SocketNamespace.prototype.packet = function (packet) { + packet.endpoint = this.name; + this.socket.packet(packet); + this.flags = {}; + return this; + }; + + /** + * Sends a message + * + * @api public + */ + + SocketNamespace.prototype.send = function (data, fn) { + var packet = { + type: this.flags.json ? 'json' : 'message' + , data: data + }; + + if ('function' == typeof fn) { + packet.id = ++this.ackPackets; + packet.ack = true; + this.acks[packet.id] = fn; + } + + return this.packet(packet); + }; + + /** + * Emits an event + * + * @api public + */ + + SocketNamespace.prototype.emit = function (name) { + var args = Array.prototype.slice.call(arguments, 1) + , lastArg = args[args.length - 1] + , packet = { + type: 'event' + , name: name + }; + + if ('function' == typeof lastArg) { + packet.id = ++this.ackPackets; + packet.ack = 'data'; + this.acks[packet.id] = lastArg; + args = args.slice(0, args.length - 1); + } + + packet.args = args; + + return this.packet(packet); + }; + + /** + * Disconnects the namespace + * + * @api private + */ + + SocketNamespace.prototype.disconnect = function () { + if (this.name === '') { + this.socket.disconnect(); + } else { + this.packet({ type: 'disconnect' }); + this.$emit('disconnect'); + } + + return this; + }; + + /** + * Handles a packet + * + * @api private + */ + + SocketNamespace.prototype.onPacket = function (packet) { + var self = this; + + function ack () { + self.packet({ + type: 'ack' + , args: io.util.toArray(arguments) + , ackId: packet.id + }); + }; + + switch (packet.type) { + case 'connect': + this.$emit('connect'); + break; + + case 'disconnect': + if (this.name === '') { + this.socket.onDisconnect(packet.reason || 'booted'); + } else { + this.$emit('disconnect', packet.reason); + } + break; + + case 'message': + case 'json': + var params = ['message', packet.data]; + + if (packet.ack == 'data') { + params.push(ack); + } else if (packet.ack) { + this.packet({ type: 'ack', ackId: packet.id }); + } + + this.$emit.apply(this, params); + break; + + case 'event': + var params = [packet.name].concat(packet.args); + + if (packet.ack == 'data') + params.push(ack); + + this.$emit.apply(this, params); + break; + + case 'ack': + if (this.acks[packet.ackId]) { + this.acks[packet.ackId].apply(this, packet.args); + delete this.acks[packet.ackId]; + } + break; + + case 'error': + if (packet.advice){ + this.socket.onError(packet); + } else { + if (packet.reason == 'unauthorized') { + this.$emit('connect_failed', packet.reason); + } else { + this.$emit('error', packet.reason); + } + } + break; + } + }; + + /** + * Flag interface. + * + * @api private + */ + + function Flag (nsp, name) { + this.namespace = nsp; + this.name = name; + }; + + /** + * Send a message + * + * @api public + */ + + Flag.prototype.send = function () { + this.namespace.flags[this.name] = true; + this.namespace.send.apply(this.namespace, arguments); + }; + + /** + * Emit an event + * + * @api public + */ + + Flag.prototype.emit = function () { + this.namespace.flags[this.name] = true; + this.namespace.emit.apply(this.namespace, arguments); + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + */ + + exports.websocket = WS; + + /** + * The WebSocket transport uses the HTML5 WebSocket API to establish an + * persistent connection with the Socket.IO server. This transport will also + * be inherited by the FlashSocket fallback as it provides a API compatible + * polyfill for the WebSockets. + * + * @constructor + * @extends {io.Transport} + * @api public + */ + + function WS (socket) { + io.Transport.apply(this, arguments); + }; + + /** + * Inherits from Transport. + */ + + io.util.inherit(WS, io.Transport); + + /** + * Transport name + * + * @api public + */ + + WS.prototype.name = 'websocket'; + + /** + * Initializes a new `WebSocket` connection with the Socket.IO server. We attach + * all the appropriate listeners to handle the responses from the server. + * + * @returns {Transport} + * @api public + */ + + WS.prototype.open = function () { + var query = io.util.query(this.socket.options.query) + , self = this + , Socket + + + if (!Socket) { + Socket = global.MozWebSocket || global.WebSocket; + } + + this.websocket = new Socket(this.prepareUrl() + query); + + this.websocket.onopen = function () { + self.onOpen(); + self.socket.setBuffer(false); + }; + this.websocket.onmessage = function (ev) { + self.onData(ev.data); + }; + this.websocket.onclose = function () { + self.onClose(); + self.socket.setBuffer(true); + }; + this.websocket.onerror = function (e) { + self.onError(e); + }; + + return this; + }; + + /** + * Send a message to the Socket.IO server. The message will automatically be + * encoded in the correct message format. + * + * @returns {Transport} + * @api public + */ + + // Do to a bug in the current IDevices browser, we need to wrap the send in a + // setTimeout, when they resume from sleeping the browser will crash if + // we don't allow the browser time to detect the socket has been closed + if (io.util.ua.iDevice) { + WS.prototype.send = function (data) { + var self = this; + setTimeout(function() { + self.websocket.send(data); + },0); + return this; + }; + } else { + WS.prototype.send = function (data) { + this.websocket.send(data); + return this; + }; + } + + /** + * Payload + * + * @api private + */ + + WS.prototype.payload = function (arr) { + for (var i = 0, l = arr.length; i < l; i++) { + this.packet(arr[i]); + } + return this; + }; + + /** + * Disconnect the established `WebSocket` connection. + * + * @returns {Transport} + * @api public + */ + + WS.prototype.close = function () { + this.websocket.close(); + return this; + }; + + /** + * Handle the errors that `WebSocket` might be giving when we + * are attempting to connect or send messages. + * + * @param {Error} e The error. + * @api private + */ + + WS.prototype.onError = function (e) { + this.socket.onError(e); + }; + + /** + * Returns the appropriate scheme for the URI generation. + * + * @api private + */ + WS.prototype.scheme = function () { + return this.socket.options.secure ? 'wss' : 'ws'; + }; + + /** + * Checks if the browser has support for native `WebSockets` and that + * it's not the polyfill created for the FlashSocket transport. + * + * @return {Boolean} + * @api public + */ + + WS.check = function () { + return ('WebSocket' in global && !('__addTask' in WebSocket)) + || 'MozWebSocket' in global; + }; + + /** + * Check if the `WebSocket` transport support cross domain communications. + * + * @returns {Boolean} + * @api public + */ + + WS.xdomainCheck = function () { + return true; + }; + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('websocket'); + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.flashsocket = Flashsocket; + + /** + * The FlashSocket transport. This is a API wrapper for the HTML5 WebSocket + * specification. It uses a .swf file to communicate with the server. If you want + * to serve the .swf file from a other server than where the Socket.IO script is + * coming from you need to use the insecure version of the .swf. More information + * about this can be found on the github page. + * + * @constructor + * @extends {io.Transport.websocket} + * @api public + */ + + function Flashsocket () { + io.Transport.websocket.apply(this, arguments); + }; + + /** + * Inherits from Transport. + */ + + io.util.inherit(Flashsocket, io.Transport.websocket); + + /** + * Transport name + * + * @api public + */ + + Flashsocket.prototype.name = 'flashsocket'; + + /** + * Disconnect the established `FlashSocket` connection. This is done by adding a + * new task to the FlashSocket. The rest will be handled off by the `WebSocket` + * transport. + * + * @returns {Transport} + * @api public + */ + + Flashsocket.prototype.open = function () { + var self = this + , args = arguments; + + WebSocket.__addTask(function () { + io.Transport.websocket.prototype.open.apply(self, args); + }); + return this; + }; + + /** + * Sends a message to the Socket.IO server. This is done by adding a new + * task to the FlashSocket. The rest will be handled off by the `WebSocket` + * transport. + * + * @returns {Transport} + * @api public + */ + + Flashsocket.prototype.send = function () { + var self = this, args = arguments; + WebSocket.__addTask(function () { + io.Transport.websocket.prototype.send.apply(self, args); + }); + return this; + }; + + /** + * Disconnects the established `FlashSocket` connection. + * + * @returns {Transport} + * @api public + */ + + Flashsocket.prototype.close = function () { + WebSocket.__tasks.length = 0; + io.Transport.websocket.prototype.close.call(this); + return this; + }; + + /** + * The WebSocket fall back needs to append the flash container to the body + * element, so we need to make sure we have access to it. Or defer the call + * until we are sure there is a body element. + * + * @param {Socket} socket The socket instance that needs a transport + * @param {Function} fn The callback + * @api private + */ + + Flashsocket.prototype.ready = function (socket, fn) { + function init () { + var options = socket.options + , port = options['flash policy port'] + , path = [ + 'http' + (options.secure ? 's' : '') + ':/' + , options.host + ':' + options.port + , options.resource + , 'static/flashsocket' + , 'WebSocketMain' + (socket.isXDomain() ? 'Insecure' : '') + '.swf' + ]; + + // Only start downloading the swf file when the checked that this browser + // actually supports it + if (!Flashsocket.loaded) { + if (typeof WEB_SOCKET_SWF_LOCATION === 'undefined') { + // Set the correct file based on the XDomain settings + WEB_SOCKET_SWF_LOCATION = path.join('/'); + } + + if (port !== 843) { + WebSocket.loadFlashPolicyFile('xmlsocket://' + options.host + ':' + port); + } + + WebSocket.__initialize(); + Flashsocket.loaded = true; + } + + fn.call(self); + } + + var self = this; + if (document.body) return init(); + + io.util.load(init); + }; + + /** + * Check if the FlashSocket transport is supported as it requires that the Adobe + * Flash Player plug-in version `10.0.0` or greater is installed. And also check if + * the polyfill is correctly loaded. + * + * @returns {Boolean} + * @api public + */ + + Flashsocket.check = function () { + if ( + typeof WebSocket == 'undefined' + || !('__initialize' in WebSocket) || !swfobject + ) return false; + + return swfobject.getFlashPlayerVersion().major >= 10; + }; + + /** + * Check if the FlashSocket transport can be used as cross domain / cross origin + * transport. Because we can't see which type (secure or insecure) of .swf is used + * we will just return true. + * + * @returns {Boolean} + * @api public + */ + + Flashsocket.xdomainCheck = function () { + return true; + }; + + /** + * Disable AUTO_INITIALIZATION + */ + + if (typeof window != 'undefined') { + WEB_SOCKET_DISABLE_AUTO_INITIALIZATION = true; + } + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('flashsocket'); +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); +/* SWFObject v2.2 <http://code.google.com/p/swfobject/> + is released under the MIT License <http://www.opensource.org/licenses/mit-license.php> +*/ +if ('undefined' != typeof window) { +var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O[(['Active'].concat('Object').join('X'))]!=D){try{var ad=new window[(['Active'].concat('Object').join('X'))](W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]()}}function K(X){if(J){X()}else{U[U.length]=X}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener("load",Y,false)}else{if(typeof j.addEventListener!=D){j.addEventListener("load",Y,false)}else{if(typeof O.attachEvent!=D){i(O,"onload",Y)}else{if(typeof O.onload=="function"){var X=O.onload;O.onload=function(){X();Y()}}else{O.onload=Y}}}}}function h(){if(T){V()}else{H()}}function V(){var X=j.getElementsByTagName("body")[0];var aa=C(r);aa.setAttribute("type",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable("$version");if(ab){ab=ab.split(" ")[1].split(",");M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return}}X.removeChild(aa);Z=null;H()})()}else{H()}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute("name").toLowerCase()!="movie"){ah[X[ad].getAttribute("name")]=X[ad].getAttribute("value")}}P(ai,ah,Y,ab)}else{p(ae);if(ab){ab(aa)}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z}ab(aa)}}}}}function z(aa){var X=null;var Y=c(aa);if(Y&&Y.nodeName=="OBJECT"){if(typeof Y.SetVariable!=D){X=Y}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z}}}return X}function A(){return !a&&F("6.0.65")&&(M.win||M.mac)&&!(M.wk&&M.wk<312)}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName=="OBJECT"){l=g(ae);Q=null}else{l=ae;Q=X}aa.id=R;if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width="310"}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height="137"}j.title=j.title.slice(0,47)+" - Flash Player Installation";var ad=M.ie&&M.win?(['Active'].concat('').join('X')):"PlugIn",ac="MMredirectURL="+O.location.toString().replace(/&/g,"%26")+"&MMplayerType="+ad+"&MMdoctitle="+j.title;if(typeof ab.flashvars!=D){ab.flashvars+="&"+ac}else{ab.flashvars=ac}if(M.ie&&M.win&&ae.readyState!=4){var Y=C("div");X+="SWFObjectNew";Y.setAttribute("id",X);ae.parentNode.insertBefore(Y,ae);ae.style.display="none";(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae)}else{setTimeout(arguments.callee,10)}})()}u(aa,ab,X)}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C("div");Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display="none";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.replaceChild(g(Y),Y)}}function g(ab){var aa=C("div");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML}else{var Y=ab.getElementsByTagName(r)[0];if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName=="PARAM")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true))}}}}}return aa}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X}if(aa){if(typeof ai.id==D){ai.id=Y}if(M.ie&&M.win){var ah="";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()=="data"){ag.movie=ai[ae]}else{if(ae.toLowerCase()=="styleclass"){ah+=' class="'+ai[ae]+'"'}else{if(ae.toLowerCase()!="classid"){ah+=" "+ae+'="'+ai[ae]+'"'}}}}}var af="";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name="'+ad+'" value="'+ag[ad]+'" />'}}aa.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+ah+">"+af+"</object>";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2])}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa])}for(var Y in M){M[Y]=null}M=null;for(var X in swfobject){swfobject[X]=null}swfobject=null})}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;w(ab,false)}else{if(Z){Z({success:false,id:ab})}}},getObjectById:function(X){if(M.w3){return z(X)}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+="";ag+="";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al]}}aj.data=ab;aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak]}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+="&"+ai+"="+Z[ai]}else{am.flashvars=ai+"="+Z[ai]}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true)}X.success=true;X.ref=an}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);return}else{w(ah,true)}}if(ac){ac(X)}})}else{if(ac){ac(X)}}},switchOffAutoHideShow:function(){m=false},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]}},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X)}else{return undefined}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y)}},removeSWF:function(X){if(M.w3){y(X)}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X)}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;if(Z){if(/\?/.test(Z)){Z=Z.split("?")[1]}if(aa==null){return L(Z)}var Y=Z.split("&");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf("="))==aa){return L(Y[X].substring((Y[X].indexOf("=")+1)))}}}return""},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display="block"}}if(E){E(B)}}a=false}}}}(); +} +// Copyright: Hiroshi Ichikawa <http://gimite.net/en/> +// License: New BSD License +// Reference: http://dev.w3.org/html5/websockets/ +// Reference: http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol + +(function() { + + if ('undefined' == typeof window || window.WebSocket) return; + + var console = window.console; + if (!console || !console.log || !console.error) { + console = {log: function(){ }, error: function(){ }}; + } + + if (!swfobject.hasFlashPlayerVersion("10.0.0")) { + console.error("Flash Player >= 10.0.0 is required."); + return; + } + if (location.protocol == "file:") { + console.error( + "WARNING: web-socket-js doesn't work in file:///... URL " + + "unless you set Flash Security Settings properly. " + + "Open the page via Web server i.e. http://..."); + } + + /** + * This class represents a faux web socket. + * @param {string} url + * @param {array or string} protocols + * @param {string} proxyHost + * @param {int} proxyPort + * @param {string} headers + */ + WebSocket = function(url, protocols, proxyHost, proxyPort, headers) { + var self = this; + self.__id = WebSocket.__nextId++; + WebSocket.__instances[self.__id] = self; + self.readyState = WebSocket.CONNECTING; + self.bufferedAmount = 0; + self.__events = {}; + if (!protocols) { + protocols = []; + } else if (typeof protocols == "string") { + protocols = [protocols]; + } + // Uses setTimeout() to make sure __createFlash() runs after the caller sets ws.onopen etc. + // Otherwise, when onopen fires immediately, onopen is called before it is set. + setTimeout(function() { + WebSocket.__addTask(function() { + WebSocket.__flash.create( + self.__id, url, protocols, proxyHost || null, proxyPort || 0, headers || null); + }); + }, 0); + }; + + /** + * Send data to the web socket. + * @param {string} data The data to send to the socket. + * @return {boolean} True for success, false for failure. + */ + WebSocket.prototype.send = function(data) { + if (this.readyState == WebSocket.CONNECTING) { + throw "INVALID_STATE_ERR: Web Socket connection has not been established"; + } + // We use encodeURIComponent() here, because FABridge doesn't work if + // the argument includes some characters. We don't use escape() here + // because of this: + // https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Functions#escape_and_unescape_Functions + // But it looks decodeURIComponent(encodeURIComponent(s)) doesn't + // preserve all Unicode characters either e.g. "\uffff" in Firefox. + // Note by wtritch: Hopefully this will not be necessary using ExternalInterface. Will require + // additional testing. + var result = WebSocket.__flash.send(this.__id, encodeURIComponent(data)); + if (result < 0) { // success + return true; + } else { + this.bufferedAmount += result; + return false; + } + }; + + /** + * Close this web socket gracefully. + */ + WebSocket.prototype.close = function() { + if (this.readyState == WebSocket.CLOSED || this.readyState == WebSocket.CLOSING) { + return; + } + this.readyState = WebSocket.CLOSING; + WebSocket.__flash.close(this.__id); + }; + + /** + * Implementation of {@link <a href="http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-registration">DOM 2 EventTarget Interface</a>} + * + * @param {string} type + * @param {function} listener + * @param {boolean} useCapture + * @return void + */ + WebSocket.prototype.addEventListener = function(type, listener, useCapture) { + if (!(type in this.__events)) { + this.__events[type] = []; + } + this.__events[type].push(listener); + }; + + /** + * Implementation of {@link <a href="http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-registration">DOM 2 EventTarget Interface</a>} + * + * @param {string} type + * @param {function} listener + * @param {boolean} useCapture + * @return void + */ + WebSocket.prototype.removeEventListener = function(type, listener, useCapture) { + if (!(type in this.__events)) return; + var events = this.__events[type]; + for (var i = events.length - 1; i >= 0; --i) { + if (events[i] === listener) { + events.splice(i, 1); + break; + } + } + }; + + /** + * Implementation of {@link <a href="http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-registration">DOM 2 EventTarget Interface</a>} + * + * @param {Event} event + * @return void + */ + WebSocket.prototype.dispatchEvent = function(event) { + var events = this.__events[event.type] || []; + for (var i = 0; i < events.length; ++i) { + events[i](event); + } + var handler = this["on" + event.type]; + if (handler) handler(event); + }; + + /** + * Handles an event from Flash. + * @param {Object} flashEvent + */ + WebSocket.prototype.__handleEvent = function(flashEvent) { + if ("readyState" in flashEvent) { + this.readyState = flashEvent.readyState; + } + if ("protocol" in flashEvent) { + this.protocol = flashEvent.protocol; + } + + var jsEvent; + if (flashEvent.type == "open" || flashEvent.type == "error") { + jsEvent = this.__createSimpleEvent(flashEvent.type); + } else if (flashEvent.type == "close") { + // TODO implement jsEvent.wasClean + jsEvent = this.__createSimpleEvent("close"); + } else if (flashEvent.type == "message") { + var data = decodeURIComponent(flashEvent.message); + jsEvent = this.__createMessageEvent("message", data); + } else { + throw "unknown event type: " + flashEvent.type; + } + + this.dispatchEvent(jsEvent); + }; + + WebSocket.prototype.__createSimpleEvent = function(type) { + if (document.createEvent && window.Event) { + var event = document.createEvent("Event"); + event.initEvent(type, false, false); + return event; + } else { + return {type: type, bubbles: false, cancelable: false}; + } + }; + + WebSocket.prototype.__createMessageEvent = function(type, data) { + if (document.createEvent && window.MessageEvent && !window.opera) { + var event = document.createEvent("MessageEvent"); + event.initMessageEvent("message", false, false, data, null, null, window, null); + return event; + } else { + // IE and Opera, the latter one truncates the data parameter after any 0x00 bytes. + return {type: type, data: data, bubbles: false, cancelable: false}; + } + }; + + /** + * Define the WebSocket readyState enumeration. + */ + WebSocket.CONNECTING = 0; + WebSocket.OPEN = 1; + WebSocket.CLOSING = 2; + WebSocket.CLOSED = 3; + + WebSocket.__flash = null; + WebSocket.__instances = {}; + WebSocket.__tasks = []; + WebSocket.__nextId = 0; + + /** + * Load a new flash security policy file. + * @param {string} url + */ + WebSocket.loadFlashPolicyFile = function(url){ + WebSocket.__addTask(function() { + WebSocket.__flash.loadManualPolicyFile(url); + }); + }; + + /** + * Loads WebSocketMain.swf and creates WebSocketMain object in Flash. + */ + WebSocket.__initialize = function() { + if (WebSocket.__flash) return; + + if (WebSocket.__swfLocation) { + // For backword compatibility. + window.WEB_SOCKET_SWF_LOCATION = WebSocket.__swfLocation; + } + if (!window.WEB_SOCKET_SWF_LOCATION) { + console.error("[WebSocket] set WEB_SOCKET_SWF_LOCATION to location of WebSocketMain.swf"); + return; + } + var container = document.createElement("div"); + container.id = "webSocketContainer"; + // Hides Flash box. We cannot use display: none or visibility: hidden because it prevents + // Flash from loading at least in IE. So we move it out of the screen at (-100, -100). + // But this even doesn't work with Flash Lite (e.g. in Droid Incredible). So with Flash + // Lite, we put it at (0, 0). This shows 1x1 box visible at left-top corner but this is + // the best we can do as far as we know now. + container.style.position = "absolute"; + if (WebSocket.__isFlashLite()) { + container.style.left = "0px"; + container.style.top = "0px"; + } else { + container.style.left = "-100px"; + container.style.top = "-100px"; + } + var holder = document.createElement("div"); + holder.id = "webSocketFlash"; + container.appendChild(holder); + document.body.appendChild(container); + // See this article for hasPriority: + // http://help.adobe.com/en_US/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-7ffd.html + swfobject.embedSWF( + WEB_SOCKET_SWF_LOCATION, + "webSocketFlash", + "1" /* width */, + "1" /* height */, + "10.0.0" /* SWF version */, + null, + null, + {hasPriority: true, swliveconnect : true, allowScriptAccess: "always"}, + null, + function(e) { + if (!e.success) { + console.error("[WebSocket] swfobject.embedSWF failed"); + } + }); + }; + + /** + * Called by Flash to notify JS that it's fully loaded and ready + * for communication. + */ + WebSocket.__onFlashInitialized = function() { + // We need to set a timeout here to avoid round-trip calls + // to flash during the initialization process. + setTimeout(function() { + WebSocket.__flash = document.getElementById("webSocketFlash"); + WebSocket.__flash.setCallerUrl(location.href); + WebSocket.__flash.setDebug(!!window.WEB_SOCKET_DEBUG); + for (var i = 0; i < WebSocket.__tasks.length; ++i) { + WebSocket.__tasks[i](); + } + WebSocket.__tasks = []; + }, 0); + }; + + /** + * Called by Flash to notify WebSockets events are fired. + */ + WebSocket.__onFlashEvent = function() { + setTimeout(function() { + try { + // Gets events using receiveEvents() instead of getting it from event object + // of Flash event. This is to make sure to keep message order. + // It seems sometimes Flash events don't arrive in the same order as they are sent. + var events = WebSocket.__flash.receiveEvents(); + for (var i = 0; i < events.length; ++i) { + WebSocket.__instances[events[i].webSocketId].__handleEvent(events[i]); + } + } catch (e) { + console.error(e); + } + }, 0); + return true; + }; + + // Called by Flash. + WebSocket.__log = function(message) { + console.log(decodeURIComponent(message)); + }; + + // Called by Flash. + WebSocket.__error = function(message) { + console.error(decodeURIComponent(message)); + }; + + WebSocket.__addTask = function(task) { + if (WebSocket.__flash) { + task(); + } else { + WebSocket.__tasks.push(task); + } + }; + + /** + * Test if the browser is running flash lite. + * @return {boolean} True if flash lite is running, false otherwise. + */ + WebSocket.__isFlashLite = function() { + if (!window.navigator || !window.navigator.mimeTypes) { + return false; + } + var mimeType = window.navigator.mimeTypes["application/x-shockwave-flash"]; + if (!mimeType || !mimeType.enabledPlugin || !mimeType.enabledPlugin.filename) { + return false; + } + return mimeType.enabledPlugin.filename.match(/flashlite/i) ? true : false; + }; + + if (!window.WEB_SOCKET_DISABLE_AUTO_INITIALIZATION) { + if (window.addEventListener) { + window.addEventListener("load", function(){ + WebSocket.__initialize(); + }, false); + } else { + window.attachEvent("onload", function(){ + WebSocket.__initialize(); + }); + } + } + +})(); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + * + * @api public + */ + + exports.XHR = XHR; + + /** + * XHR constructor + * + * @costructor + * @api public + */ + + function XHR (socket) { + if (!socket) return; + + io.Transport.apply(this, arguments); + this.sendBuffer = []; + }; + + /** + * Inherits from Transport. + */ + + io.util.inherit(XHR, io.Transport); + + /** + * Establish a connection + * + * @returns {Transport} + * @api public + */ + + XHR.prototype.open = function () { + this.socket.setBuffer(false); + this.onOpen(); + this.get(); + + // we need to make sure the request succeeds since we have no indication + // whether the request opened or not until it succeeded. + this.setCloseTimeout(); + + return this; + }; + + /** + * Check if we need to send data to the Socket.IO server, if we have data in our + * buffer we encode it and forward it to the `post` method. + * + * @api private + */ + + XHR.prototype.payload = function (payload) { + var msgs = []; + + for (var i = 0, l = payload.length; i < l; i++) { + msgs.push(io.parser.encodePacket(payload[i])); + } + + this.send(io.parser.encodePayload(msgs)); + }; + + /** + * Send data to the Socket.IO server. + * + * @param data The message + * @returns {Transport} + * @api public + */ + + XHR.prototype.send = function (data) { + this.post(data); + return this; + }; + + /** + * Posts a encoded message to the Socket.IO server. + * + * @param {String} data A encoded message. + * @api private + */ + + function empty () { }; + + XHR.prototype.post = function (data) { + var self = this; + this.socket.setBuffer(true); + + function stateChange () { + if (this.readyState == 4) { + this.onreadystatechange = empty; + self.posting = false; + + if (this.status == 200){ + self.socket.setBuffer(false); + } else { + self.onClose(); + } + } + } + + function onload () { + this.onload = empty; + self.socket.setBuffer(false); + }; + + this.sendXHR = this.request('POST'); + + if (global.XDomainRequest && this.sendXHR instanceof XDomainRequest) { + this.sendXHR.onload = this.sendXHR.onerror = onload; + } else { + this.sendXHR.onreadystatechange = stateChange; + } + + this.sendXHR.send(data); + }; + + /** + * Disconnects the established `XHR` connection. + * + * @returns {Transport} + * @api public + */ + + XHR.prototype.close = function () { + this.onClose(); + return this; + }; + + /** + * Generates a configured XHR request + * + * @param {String} url The url that needs to be requested. + * @param {String} method The method the request should use. + * @returns {XMLHttpRequest} + * @api private + */ + + XHR.prototype.request = function (method) { + var req = io.util.request(this.socket.isXDomain()) + , query = io.util.query(this.socket.options.query, 't=' + +new Date); + + req.open(method || 'GET', this.prepareUrl() + query, true); + + if (method == 'POST') { + try { + if (req.setRequestHeader) { + req.setRequestHeader('Content-type', 'text/plain;charset=UTF-8'); + } else { + // XDomainRequest + req.contentType = 'text/plain'; + } + } catch (e) {} + } + + return req; + }; + + /** + * Returns the scheme to use for the transport URLs. + * + * @api private + */ + + XHR.prototype.scheme = function () { + return this.socket.options.secure ? 'https' : 'http'; + }; + + /** + * Check if the XHR transports are supported + * + * @param {Boolean} xdomain Check if we support cross domain requests. + * @returns {Boolean} + * @api public + */ + + XHR.check = function (socket, xdomain) { + try { + var request = io.util.request(xdomain), + usesXDomReq = (global.XDomainRequest && request instanceof XDomainRequest), + socketProtocol = (socket && socket.options && socket.options.secure ? 'https:' : 'http:'), + isXProtocol = (global.location && socketProtocol != global.location.protocol); + if (request && !(usesXDomReq && isXProtocol)) { + return true; + } + } catch(e) {} + + return false; + }; + + /** + * Check if the XHR transport supports cross domain requests. + * + * @returns {Boolean} + * @api public + */ + + XHR.xdomainCheck = function (socket) { + return XHR.check(socket, true); + }; + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.htmlfile = HTMLFile; + + /** + * The HTMLFile transport creates a `forever iframe` based transport + * for Internet Explorer. Regular forever iframe implementations will + * continuously trigger the browsers buzy indicators. If the forever iframe + * is created inside a `htmlfile` these indicators will not be trigged. + * + * @constructor + * @extends {io.Transport.XHR} + * @api public + */ + + function HTMLFile (socket) { + io.Transport.XHR.apply(this, arguments); + }; + + /** + * Inherits from XHR transport. + */ + + io.util.inherit(HTMLFile, io.Transport.XHR); + + /** + * Transport name + * + * @api public + */ + + HTMLFile.prototype.name = 'htmlfile'; + + /** + * Creates a new Ac...eX `htmlfile` with a forever loading iframe + * that can be used to listen to messages. Inside the generated + * `htmlfile` a reference will be made to the HTMLFile transport. + * + * @api private + */ + + HTMLFile.prototype.get = function () { + this.doc = new window[(['Active'].concat('Object').join('X'))]('htmlfile'); + this.doc.open(); + this.doc.write('<html></html>'); + this.doc.close(); + this.doc.parentWindow.s = this; + + var iframeC = this.doc.createElement('div'); + iframeC.className = 'socketio'; + + this.doc.body.appendChild(iframeC); + this.iframe = this.doc.createElement('iframe'); + + iframeC.appendChild(this.iframe); + + var self = this + , query = io.util.query(this.socket.options.query, 't='+ +new Date); + + this.iframe.src = this.prepareUrl() + query; + + io.util.on(window, 'unload', function () { + self.destroy(); + }); + }; + + /** + * The Socket.IO server will write script tags inside the forever + * iframe, this function will be used as callback for the incoming + * information. + * + * @param {String} data The message + * @param {document} doc Reference to the context + * @api private + */ + + HTMLFile.prototype._ = function (data, doc) { + // unescape all forward slashes. see GH-1251 + data = data.replace(/\\\//g, '/'); + this.onData(data); + try { + var script = doc.getElementsByTagName('script')[0]; + script.parentNode.removeChild(script); + } catch (e) { } + }; + + /** + * Destroy the established connection, iframe and `htmlfile`. + * And calls the `CollectGarbage` function of Internet Explorer + * to release the memory. + * + * @api private + */ + + HTMLFile.prototype.destroy = function () { + if (this.iframe){ + try { + this.iframe.src = 'about:blank'; + } catch(e){} + + this.doc = null; + this.iframe.parentNode.removeChild(this.iframe); + this.iframe = null; + + CollectGarbage(); + } + }; + + /** + * Disconnects the established connection. + * + * @returns {Transport} Chaining. + * @api public + */ + + HTMLFile.prototype.close = function () { + this.destroy(); + return io.Transport.XHR.prototype.close.call(this); + }; + + /** + * Checks if the browser supports this transport. The browser + * must have an `Ac...eXObject` implementation. + * + * @return {Boolean} + * @api public + */ + + HTMLFile.check = function (socket) { + if (typeof window != "undefined" && (['Active'].concat('Object').join('X')) in window){ + try { + var a = new window[(['Active'].concat('Object').join('X'))]('htmlfile'); + return a && io.Transport.XHR.check(socket); + } catch(e){} + } + return false; + }; + + /** + * Check if cross domain requests are supported. + * + * @returns {Boolean} + * @api public + */ + + HTMLFile.xdomainCheck = function () { + // we can probably do handling for sub-domains, we should + // test that it's cross domain but a subdomain here + return false; + }; + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('htmlfile'); + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + */ + + exports['xhr-polling'] = XHRPolling; + + /** + * The XHR-polling transport uses long polling XHR requests to create a + * "persistent" connection with the server. + * + * @constructor + * @api public + */ + + function XHRPolling () { + io.Transport.XHR.apply(this, arguments); + }; + + /** + * Inherits from XHR transport. + */ + + io.util.inherit(XHRPolling, io.Transport.XHR); + + /** + * Merge the properties from XHR transport + */ + + io.util.merge(XHRPolling, io.Transport.XHR); + + /** + * Transport name + * + * @api public + */ + + XHRPolling.prototype.name = 'xhr-polling'; + + /** + * Indicates whether heartbeats is enabled for this transport + * + * @api private + */ + + XHRPolling.prototype.heartbeats = function () { + return false; + }; + + /** + * Establish a connection, for iPhone and Android this will be done once the page + * is loaded. + * + * @returns {Transport} Chaining. + * @api public + */ + + XHRPolling.prototype.open = function () { + var self = this; + + io.Transport.XHR.prototype.open.call(self); + return false; + }; + + /** + * Starts a XHR request to wait for incoming messages. + * + * @api private + */ + + function empty () {}; + + XHRPolling.prototype.get = function () { + if (!this.isOpen) return; + + var self = this; + + function stateChange () { + if (this.readyState == 4) { + this.onreadystatechange = empty; + + if (this.status == 200) { + self.onData(this.responseText); + self.get(); + } else { + self.onClose(); + } + } + }; + + function onload () { + this.onload = empty; + this.onerror = empty; + self.retryCounter = 1; + self.onData(this.responseText); + self.get(); + }; + + function onerror () { + self.retryCounter ++; + if(!self.retryCounter || self.retryCounter > 3) { + self.onClose(); + } else { + self.get(); + } + }; + + this.xhr = this.request(); + + if (global.XDomainRequest && this.xhr instanceof XDomainRequest) { + this.xhr.onload = onload; + this.xhr.onerror = onerror; + } else { + this.xhr.onreadystatechange = stateChange; + } + + this.xhr.send(null); + }; + + /** + * Handle the unclean close behavior. + * + * @api private + */ + + XHRPolling.prototype.onClose = function () { + io.Transport.XHR.prototype.onClose.call(this); + + if (this.xhr) { + this.xhr.onreadystatechange = this.xhr.onload = this.xhr.onerror = empty; + try { + this.xhr.abort(); + } catch(e){} + this.xhr = null; + } + }; + + /** + * Webkit based browsers show a infinit spinner when you start a XHR request + * before the browsers onload event is called so we need to defer opening of + * the transport until the onload event is called. Wrapping the cb in our + * defer method solve this. + * + * @param {Socket} socket The socket instance that needs a transport + * @param {Function} fn The callback + * @api private + */ + + XHRPolling.prototype.ready = function (socket, fn) { + var self = this; + + io.util.defer(function () { + fn.call(self); + }); + }; + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('xhr-polling'); + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, io, global) { + /** + * There is a way to hide the loading indicator in Firefox. If you create and + * remove a iframe it will stop showing the current loading indicator. + * Unfortunately we can't feature detect that and UA sniffing is evil. + * + * @api private + */ + + var indicator = global.document && "MozAppearance" in + global.document.documentElement.style; + + /** + * Expose constructor. + */ + + exports['jsonp-polling'] = JSONPPolling; + + /** + * The JSONP transport creates an persistent connection by dynamically + * inserting a script tag in the page. This script tag will receive the + * information of the Socket.IO server. When new information is received + * it creates a new script tag for the new data stream. + * + * @constructor + * @extends {io.Transport.xhr-polling} + * @api public + */ + + function JSONPPolling (socket) { + io.Transport['xhr-polling'].apply(this, arguments); + + this.index = io.j.length; + + var self = this; + + io.j.push(function (msg) { + self._(msg); + }); + }; + + /** + * Inherits from XHR polling transport. + */ + + io.util.inherit(JSONPPolling, io.Transport['xhr-polling']); + + /** + * Transport name + * + * @api public + */ + + JSONPPolling.prototype.name = 'jsonp-polling'; + + /** + * Posts a encoded message to the Socket.IO server using an iframe. + * The iframe is used because script tags can create POST based requests. + * The iframe is positioned outside of the view so the user does not + * notice it's existence. + * + * @param {String} data A encoded message. + * @api private + */ + + JSONPPolling.prototype.post = function (data) { + var self = this + , query = io.util.query( + this.socket.options.query + , 't='+ (+new Date) + '&i=' + this.index + ); + + if (!this.form) { + var form = document.createElement('form') + , area = document.createElement('textarea') + , id = this.iframeId = 'socketio_iframe_' + this.index + , iframe; + + form.className = 'socketio'; + form.style.position = 'absolute'; + form.style.top = '0px'; + form.style.left = '0px'; + form.style.display = 'none'; + form.target = id; + form.method = 'POST'; + form.setAttribute('accept-charset', 'utf-8'); + area.name = 'd'; + form.appendChild(area); + document.body.appendChild(form); + + this.form = form; + this.area = area; + } + + this.form.action = this.prepareUrl() + query; + + function complete () { + initIframe(); + self.socket.setBuffer(false); + }; + + function initIframe () { + if (self.iframe) { + self.form.removeChild(self.iframe); + } + + try { + // ie6 dynamic iframes with target="" support (thanks Chris Lambacher) + iframe = document.createElement('<iframe name="'+ self.iframeId +'">'); + } catch (e) { + iframe = document.createElement('iframe'); + iframe.name = self.iframeId; + } + + iframe.id = self.iframeId; + + self.form.appendChild(iframe); + self.iframe = iframe; + }; + + initIframe(); + + // we temporarily stringify until we figure out how to prevent + // browsers from turning `\n` into `\r\n` in form inputs + this.area.value = io.JSON.stringify(data); + + try { + this.form.submit(); + } catch(e) {} + + if (this.iframe.attachEvent) { + iframe.onreadystatechange = function () { + if (self.iframe.readyState == 'complete') { + complete(); + } + }; + } else { + this.iframe.onload = complete; + } + + this.socket.setBuffer(true); + }; + + /** + * Creates a new JSONP poll that can be used to listen + * for messages from the Socket.IO server. + * + * @api private + */ + + JSONPPolling.prototype.get = function () { + var self = this + , script = document.createElement('script') + , query = io.util.query( + this.socket.options.query + , 't='+ (+new Date) + '&i=' + this.index + ); + + if (this.script) { + this.script.parentNode.removeChild(this.script); + this.script = null; + } + + script.async = true; + script.src = this.prepareUrl() + query; + script.onerror = function () { + self.onClose(); + }; + + var insertAt = document.getElementsByTagName('script')[0]; + insertAt.parentNode.insertBefore(script, insertAt); + this.script = script; + + if (indicator) { + setTimeout(function () { + var iframe = document.createElement('iframe'); + document.body.appendChild(iframe); + document.body.removeChild(iframe); + }, 100); + } + }; + + /** + * Callback function for the incoming message stream from the Socket.IO server. + * + * @param {String} data The message + * @api private + */ + + JSONPPolling.prototype._ = function (msg) { + this.onData(msg); + if (this.isOpen) { + this.get(); + } + return this; + }; + + /** + * The indicator hack only works after onload + * + * @param {Socket} socket The socket instance that needs a transport + * @param {Function} fn The callback + * @api private + */ + + JSONPPolling.prototype.ready = function (socket, fn) { + var self = this; + if (!indicator) return fn.call(this); + + io.util.load(function () { + fn.call(self); + }); + }; + + /** + * Checks if browser supports this transport. + * + * @return {Boolean} + * @api public + */ + + JSONPPolling.check = function () { + return 'document' in global; + }; + + /** + * Check if cross domain requests are supported + * + * @returns {Boolean} + * @api public + */ + + JSONPPolling.xdomainCheck = function () { + return true; + }; + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('jsonp-polling'); + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); + +if (typeof define === "function" && define.amd) { + define("socket.io", [], function () { return io; }); +} +})(); +/* @source mod/connect.js */; + +define('socket.io', 'lib/socket.io.js'); +define('mod/connect', [ + "socket.io", + "mod/node_config" +], function(_, config) { + var connectNode = function(channel) { + var url = "http://" + config.host + ":" + config.port; + var nodeio = io.connect(url, { + 'reconnect': true, + 'reconnection delay': 500, + 'max reconnection attempts': 10 + }); + nodeio.emit('ready', {channel: channel}); + return nodeio; + } + + return connectNode; +}); + +/* @source */; + +require(['jquery' +, 'mod/connect' +, 'mod/count' +, 'mod/relative_date' +, 'mod/user_avatar' +, 'mod/user_profile_card' +], function($, connectNode, countDict, updateRelativeDate, loadAvatar) { + var btn = $('.join-or-leave-btn'); + if (btn.length == 0) { + btn = $('.btn-success'); + } + var team_id = btn.attr("data-teamid"); + var channel = 'feed:public:team:v2:' + team_id; + var io = connectNode(channel); + io.on('announce', function(data) { + countDict.teamfeed_num += 1; + $('.timeline>ul').prepend(data.send_message); + updateRelativeDate(); + loadAvatar(); + }); +}); diff --git a/dist/js/app/watching/main.js b/dist/js/app/watching/main.js new file mode 100644 index 0000000..9d2e0c3 --- /dev/null +++ b/dist/js/app/watching/main.js @@ -0,0 +1,80 @@ + +require.config({ enable_ozma: true }); + + +/* @source */; + +require(['jquery'], function($){ + $(function() { + var watch_btn = $(".watch-btn"); + var countLabel = $('#watched-count'); + + var updateLabelBy = function (n) { + var count = Number(countLabel.text()) || 0; + if (count === 0 && n <= 0) { return; } + + count += n; + countLabel.text(count.toString()); + }; + + $.each(watch_btn, function(index,value){ + $(value).click(function() { + + if($(value).hasClass('watch')) { + $.post("/watch/"+$(value).attr('proj_id'), function(data) { + if (!data.error) { + $(value).html('<i class="icon-eye-open"></i> Unwatch'); + $(value).addClass('unwatch'); + $(value).removeClass('watch'); + updateLabelBy(1); + } else { + // show error notification to user + show_error("关注失败"); + } + }); + } + else{ + $.ajax("/watch/"+$(value).attr('proj_id'), { + type: "DELETE", + success: function(data) { + if (!data.error) { + $(value).html('<i class="icon-eye-open"></i> Watch'); + $(value).addClass('watch'); + $(value).removeClass('unwatch'); + updateLabelBy(-1); + } else { + show_error("取消关注失败"); + } + }, + error: function(e) { + show_error("取消关注失败"); + } + }); + } + }); + + }); + + function show_success(msg) { + var successDiv = $(".navbar .success"); + if (successDiv.size() === 0 ) { + successDiv= $("<div>").addClass("success").addClass("alert-success"); + $("div.navbar").append(successDiv); + } + successDiv.html(msg); + successDiv.fadeOut(1500, function () { + $(this).remove(); + }); + } + + function show_error(msg) { + var errorDiv = $(".navbar .error"); + if (errorDiv.size() === 0 ) { + errorDiv = $("<div>").addClass("error").addClass("alert-error"); + $("div.navbar").append(errorDiv); + } + errorDiv.html(msg); + } + + }); +}); diff --git a/dist/js/mod/common.js b/dist/js/mod/common.js new file mode 100644 index 0000000..adc881c --- /dev/null +++ b/dist/js/mod/common.js @@ -0,0 +1,23188 @@ + +/* @source lib/oz.js */; + +/** + * OzJS: microkernel for modular javascript + * compatible with AMD (Asynchronous Module Definition) + * see http://ozjs.org for details + * + * Copyright (C) 2010-2012, Dexter.Yy, MIT License + * vim: et:ts=4:sw=4:sts=4 + */ +(function(){ + +var window = this, + _toString = Object.prototype.toString, + _RE_PLUGIN = /(.*)!(.+)/, + _RE_DEPS = /\Wrequire\((['"]).+?\1\)/g, //' + _RE_SUFFIX = /\.(js|json)$/, + _RE_RELPATH = /^\.+?\/.+/, + _RE_DOT = /(^|\/)\.\//g, + _RE_ALIAS_IN_MID = /^([\w\-]+)\//, + _builtin_mods = { "require": 1, "exports": 1, "module": 1, "host": 1, "finish": 1 }, + + _config = { + mods: {} + }, + _scripts = {}, + _delays = {}, + _refers = {}, + _waitings = {}, + _latest_mod, + _scope, + _resets = {}, + + forEach = Array.prototype.forEach || function(fn, sc){ + for(var i = 0, l = this.length; i < l; i++){ + if (i in this) + fn.call(sc, this[i], i, this); + } + }; + +/** + * @public define / register a module and its meta information + * @param {string} module name. optional as unique module in a script file + * @param {string[]} dependencies + * @param {function} module code, execute only once on the first call + * + * @note + * + * define('', [""], func) + * define([""], func) + * define('', func) + * define(func) + * + * define('', "") + * define('', [""], "") + * define('', [""]) + * + */ +function define(name, deps, block){ + var is_remote = typeof block === 'string'; + if (!block) { + if (deps) { + if (isArray(deps)) { + block = filesuffix(realname(basename(name))); + } else { + block = deps; + deps = null; + } + } else { + block = name; + name = ""; + } + if (typeof name !== 'string') { + deps = name; + name = ""; + } else { + is_remote = typeof block === 'string'; + if (!is_remote && !deps) { + deps = seek(block); + } + } + } + name = name && realname(name); + var mod = name && _config.mods[name]; + if (!_config.debug && mod && mod.name + && (is_remote && mod.loaded == 2 || mod.exports)) { + return; + } + if (is_remote && _config.enable_ozma) { + deps = null; + } + var host = isWindow(this) ? this : window; + mod = _config.mods[name] = { + name: name, + url: mod && mod.url, + host: host, + deps: deps || [] + }; + if (name === "") { // capture anonymous module + _latest_mod = mod; + } + if (typeof block !== 'string') { + mod.block = block; + mod.loaded = 2; + } else { // remote module + var alias = _config.aliases; + if (alias) { + block = block.replace(/\{(\w+)\}/g, function(e1, e2){ + return alias[e2] || ""; + }); + } + mod.url = block; + } + if (mod.block && !isFunction(mod.block)) { // json module + mod.exports = block; + } +} + +/** + * @public run a code block its dependencies + * @param {string[]} [module name] dependencies + * @param {function} + */ +function require(deps, block, _self_mod) { + if (typeof deps === 'string') { + if (!block) { + return (_config.mods[realname(basename(deps, _scope))] + || {}).exports; + } + deps = [deps]; + } else if (!block) { + block = deps; + deps = seek(block); + } + var host = isWindow(this) ? this : window; + if (!_self_mod) { + _self_mod = { url: _scope && _scope.url }; + } + var m, remotes = 0, // counter for remote scripts + list = scan.call(host, deps, _self_mod); // calculate dependencies, find all required modules + for (var i = 0, l = list.length; i < l; i++) { + m = list[i]; + if (m.is_reset) { + m = _config.mods[m.name]; + } + if (m.url && m.loaded !== 2) { // remote module + remotes++; + m.loaded = 1; // status: loading + fetch(m, function(){ + this.loaded = 2; // status: loaded + var lm = _latest_mod; + if (lm) { // capture anonymous module + lm.name = this.name; + lm.url = this.url; + _config.mods[this.name] = lm; + _latest_mod = null; + } + // loaded all modules, calculate dependencies all over again + if (--remotes <= 0) { + require.call(host, deps, block, _self_mod); + } + }); + } + } + if (!remotes) { + _self_mod.deps = deps; + _self_mod.host = host; + _self_mod.block = block; + setTimeout(function(){ + tidy(deps, _self_mod); + list.push(_self_mod); + exec(list.reverse()); + }, 0); + } +} + +/** + * @private execute modules in a sequence of dependency + * @param {object[]} [module object] + */ +var exec = function(list){ + var mod, mid, tid, result, isAsync, deps, + depObjs, exportObj, moduleObj, rmod, + wt = _waitings; + while (mod = list.pop()) { + if (mod.is_reset) { + rmod = clone(_config.mods[mod.name]); + rmod.host = mod.host; + rmod.newname = mod.newname; + mod = rmod; + if (!_resets[mod.newname]) { + _resets[mod.newname] = []; + } + _resets[mod.newname].push(mod); + mod.exports = undefined; + } else if (mod.name) { + mod = _config.mods[mod.name] || mod; + } + if (!mod.block || !mod.running && mod.exports !== undefined) { + continue; + } + depObjs = []; + exportObj = {}; // for "exports" module + moduleObj = { id: mod.name, filename: mod.url, exports: exportObj }; + deps = mod.deps.slice(); + deps[mod.block.hiddenDeps ? 'unshift' : 'push']("require", "exports", "module"); + for (var i = 0, l = deps.length; i < l; i++) { + mid = deps[i]; + switch(mid) { + case 'require': + depObjs.push(require); + break; + case 'exports': + depObjs.push(exportObj); + break; + case 'module': + depObjs.push(moduleObj); + break; + case 'host': // deprecated + depObjs.push(mod.host); + break; + case 'finish': // execute asynchronously + tid = mod.name; + if (!wt[tid]) // for delay execute + wt[tid] = [list]; + else + wt[tid].push(list); + depObjs.push(function(result){ + // HACK: no guarantee that this function will be invoked after while() loop termination in Chrome/Safari + setTimeout(function(){ + // 'mod' equal to 'list[list.length-1]' + if (result !== undefined) { + mod.exports = result; + } + if (!wt[tid]) + return; + forEach.call(wt[tid], function(list){ + this(list); + }, exec); + delete wt[tid]; + mod.running = 0; + }, 0); + }); + isAsync = 1; + break; + default: + depObjs.push(( + (_resets[mid] || []).pop() + || _config.mods[realname(mid)] + || {} + ).exports); + break; + } + } + if (!mod.running) { + // execute module code. arguments: [dep1, dep2, ..., require, exports, module] + _scope = mod; + result = mod.block.apply(mod.host, depObjs) || null; + _scope = false; + exportObj = moduleObj.exports; + mod.exports = result !== undefined ? result : exportObj; // use empty exportObj for "finish" + for (var v in exportObj) { + if (v) { + mod.exports = exportObj; + } + break; + } + } + if (isAsync) { // skip, wait for finish() + mod.running = 1; + break; + } + } +}; + +/** + * @private observer for script loader, prevent duplicate requests + * @param {object} module object + * @param {function} callback + */ +var fetch = function(m, cb){ + var url = m.url, + observers = _scripts[url]; + if (!observers) { + var mname = m.name, delays = _delays; + if (m.deps && m.deps.length && delays[mname] !== 1) { + delays[mname] = [m.deps.length, cb]; + forEach.call(m.deps, function(dep){ + var d = _config.mods[realname(dep)]; + if (this[dep] !== 1 && d.url && d.loaded !== 2) { + if (!this[dep]) { + this[dep] = []; + } + this[dep].push(m); + } else { + delays[mname][0]--; + } + }, _refers); + if (delays[mname][0] > 0) { + return; + } else { + delays[mname] = 1; + } + } + observers = _scripts[url] = [[cb, m]]; + var true_url = /^\w+:\/\//.test(url) ? url + : (_config.enable_ozma && _config.distUrl || _config.baseUrl || '') + + (_config.enableAutoSuffix ? namesuffix(url) : url); + getScript.call(m.host || this, true_url, function(){ + forEach.call(observers, function(args){ + args[0].call(args[1]); + }); + _scripts[url] = 1; + if (_refers[mname] && _refers[mname] !== 1) { + forEach.call(_refers[mname], function(dm){ + var b = this[dm.name]; + if (--b[0] <= 0) { + this[dm.name] = 1; + fetch(dm, b[1]); + } + }, delays); + _refers[mname] = 1; + } + }); + } else if (observers === 1) { + cb.call(m); + } else { + observers.push([cb, m]); + } +}; + +/** + * @private search and sequence all dependencies, based on DFS + * @param {string[]} a set of module names + * @param {object[]} + * @param {object[]} a sequence of modules, for recursion + * @return {object[]} a sequence of modules + */ +function scan(m, file_mod, list){ + list = list || []; + if (!m[0]) { + return list; + } + var deps, + history = list.history; + if (!history) { + history = list.history = {}; + } + if (m[1]) { + deps = m; + m = false; + } else { + var truename, + _mid = m[0], + plugin = _RE_PLUGIN.exec(_mid); + if (plugin) { + _mid = plugin[2]; + plugin = plugin[1]; + } + var mid = realname(_mid); + if (!_config.mods[mid] && !_builtin_mods[mid]) { + var true_mid = realname(basename(_mid, file_mod)); + if (mid !== true_mid) { + _config.mods[file_mod.url + ':' + mid] = true_mid; + mid = true_mid; + } + if (!_config.mods[true_mid]) { + define(true_mid, filesuffix(true_mid)); + } + } + m = file_mod = _config.mods[mid]; + if (m) { + if (plugin === "new") { + m = { + is_reset: true, + deps: m.deps, + name: mid, + newname: plugin + "!" + mid, + host: this + }; + } else { + truename = m.name; + } + if (history[truename]) { + return list; + } + } else { + return list; + } + if (!history[truename]) { + deps = m.deps || []; + // find require information within the code + // for server-side style module + //deps = deps.concat(seek(m)); + if (truename) { + history[truename] = true; + } + } else { + deps = []; + } + } + for (var i = deps.length - 1; i >= 0; i--) { + if (!history[deps[i]]) { + scan.call(this, [deps[i]], file_mod, list); + } + } + if (m) { + tidy(deps, m); + list.push(m); + } + return list; +} + +/** + * @experiment + * @private analyse module code + * to find out dependencies which have no explicit declaration + * @param {object} module object + */ +function seek(block){ + var hdeps = block.hiddenDeps || []; + if (!block.hiddenDeps) { + var code = block.toString(), + h = null; + hdeps = block.hiddenDeps = []; + while (h = _RE_DEPS.exec(code)) { + hdeps.push(h[0].slice(10, -2)); + } + } + return hdeps.slice(); +} + +function tidy(deps, m){ + forEach.call(deps.slice(), function(dep, i){ + var true_mid = this[m.url + ':' + realname(dep)]; + if (typeof true_mid === 'string') { + deps[i] = true_mid; + } + }, _config.mods); +} + +function config(opt){ + for (var i in opt) { + if (i === 'aliases') { + if (!_config[i]) { + _config[i] = {}; + } + for (var j in opt[i]) { + _config[i][j] = opt[i][j]; + } + var mods = _config.mods; + for (var k in mods) { + mods[k].name = realname(k); + mods[mods[k].name] = mods[k]; + } + } else { + _config[i] = opt[i]; + } + } +} + +/** + * @note naming pattern: + * _g_src.js + * _g_combo.js + * + * jquery.js + * jquery_pack.js + * + * _yy_src.pack.js + * _yy_combo.js + * + * _yy_bak.pack.js + * _yy_bak.pack_pack.js + */ +function namesuffix(file){ + return file.replace(/(.+?)(_src.*)?(\.\w+)$/, function($0, $1, $2, $3){ + return $1 + ($2 && '_combo' || '_pack') + $3; + }); +} + +function filesuffix(mid){ + return _RE_SUFFIX.test(mid) ? mid : mid + '.js'; +} + +function realname(mid){ + var alias = _config.aliases; + if (alias) { + mid = mid.replace(_RE_ALIAS_IN_MID, function(e1, e2){ + return alias[e2] || (e2 + '/'); + }); + } + return mid; +} + +function basename(mid, file_mod){ + var rel_path = _RE_RELPATH.exec(mid); + if (rel_path && file_mod) { // resolve relative path in Module ID + mid = (file_mod.url || '').replace(/[^\/]+$/, '') + rel_path[0]; + } + return resolvename(mid); +} + +function resolvename(url){ + url = url.replace(_RE_DOT, '$1'); + var dots, dots_n, url_dup = url, RE_DOTS = /(\.\.\/)+/g; + while (dots = (RE_DOTS.exec(url_dup) || [])[0]) { + dots_n = dots.match(/\.\.\//g).length; + dots = dots.replace(/\./, '\\.'); + url = url.replace(new RegExp('([^/\\.]+/){' + dots_n + '}' + dots), ''); + } + return url.replace(/\/\//g, '/'); +} + +/** + * @public non-blocking script loader + * @param {string} + * @param {object} config + */ +function getScript(url, op){ + var doc = isWindow(this) ? this.document : document, + s = doc.createElement("script"); + s.type = "text/javascript"; + s.async = "async"; //for firefox3.6 + if (!op) + op = {}; + else if (isFunction(op)) + op = { callback: op }; + if (op.charset) + s.charset = op.charset; + s.src = url; + var h = doc.getElementsByTagName("head")[0]; + s.onload = s.onreadystatechange = function(__, isAbort){ + if ( isAbort || !s.readyState || /loaded|complete/.test(s.readyState) ) { + s.onload = s.onreadystatechange = null; + if (h && s.parentNode) { + h.removeChild(s); + } + s = undefined; + if (!isAbort && op.callback) { + op.callback(); + } + } + }; + h.insertBefore(s, h.firstChild); +} + +function isFunction(obj) { + return _toString.call(obj) === "[object Function]"; +} + +function isArray(obj) { + return _toString.call(obj) === "[object Array]"; +} + +function isWindow(obj) { + return "setInterval" in obj; +} + +function clone(obj) { // be careful of using `delete` + function NewObj(){} + NewObj.prototype = obj; + return new NewObj(); +} + +var oz = { + define: define, + require: require, + config: config, + seek: seek, + fetch: fetch, + realname: realname, + basename: basename, + filesuffix: filesuffix, + namesuffix: namesuffix, + // non-core + _getScript: getScript, + _clone: clone, + _forEach: forEach, + _isFunction: isFunction, + _isWindow: isWindow +}; + +require.config = config; +define.amd = {}; + +if (!window.window) { // for nodejs + exports.oz = oz; + exports._config = _config; + // hook for build tool + for (var i in oz) { + exports[i] = oz[i]; + } + var hooking = function(fname){ + return function(){ return exports[fname].apply(this, arguments); }; + }; + exec = hooking('exec'); + fetch = hooking('fetch'); + require = hooking('require'); + require.config = config; +} else { + window.oz = oz; + window.define = define; + window.require = require; +} + +})(); + +require.config({ enable_ozma: true }); + + +/* @source lib/jquery-1.8.3.js */; + +/*! + * jQuery JavaScript Library v1.8.3 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright 2012 jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: Tue Nov 13 2012 08:20:33 GMT-0500 (Eastern Standard Time) + */ +(function( window, undefined ) { +var + // A central reference to the root jQuery(document) + rootjQuery, + + // The deferred used on DOM ready + readyList, + + // Use the correct document accordingly with window argument (sandbox) + document = window.document, + location = window.location, + navigator = window.navigator, + + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$, + + // Save a reference to some core methods + core_push = Array.prototype.push, + core_slice = Array.prototype.slice, + core_indexOf = Array.prototype.indexOf, + core_toString = Object.prototype.toString, + core_hasOwn = Object.prototype.hasOwnProperty, + core_trim = String.prototype.trim, + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context, rootjQuery ); + }, + + // Used for matching numbers + core_pnum = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source, + + // Used for detecting and trimming whitespace + core_rnotwhite = /\S/, + core_rspace = /\s+/, + + // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE) + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // A simple way to check for HTML strings + // Prioritize #id over <tag> to avoid XSS via location.hash (#9521) + rquickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, + + // Match a standalone tag + rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, + + // JSON RegExp + rvalidchars = /^[\],:{}\s]*$/, + rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, + rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g, + rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([\da-z])/gi, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return ( letter + "" ).toUpperCase(); + }, + + // The ready event handler and self cleanup method + DOMContentLoaded = function() { + if ( document.addEventListener ) { + document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + jQuery.ready(); + } else if ( document.readyState === "complete" ) { + // we're here because readyState === "complete" in oldIE + // which is good enough for us to call the dom ready! + document.detachEvent( "onreadystatechange", DOMContentLoaded ); + jQuery.ready(); + } + }, + + // [[Class]] -> type pairs + class2type = {}; + +jQuery.fn = jQuery.prototype = { + constructor: jQuery, + init: function( selector, context, rootjQuery ) { + var match, elem, ret, doc; + + // Handle $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + doc = ( context && context.nodeType ? context.ownerDocument || context : document ); + + // scripts is true for back-compat + selector = jQuery.parseHTML( match[1], doc, true ); + if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { + this.attr.call( selector, context, true ); + } + + return jQuery.merge( this, selector ); + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || rootjQuery ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return rootjQuery.ready( selector ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.8.3", + + // The default length of a jQuery object is 0 + length: 0, + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + toArray: function() { + return core_slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == null ? + + // Return a 'clean' array + this.toArray() : + + // Return just the object + ( num < 0 ? this[ this.length + num ] : this[ num ] ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) { + ret.selector = this.selector + ( this.selector ? " " : "" ) + selector; + } else if ( name ) { + ret.selector = this.selector + "." + name + "(" + selector + ")"; + } + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + ready: function( fn ) { + // Add the callback + jQuery.ready.promise().done( fn ); + + return this; + }, + + eq: function( i ) { + i = +i; + return i === -1 ? + this.slice( i ) : + this.slice( i, i + 1 ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + slice: function() { + return this.pushStack( core_slice.apply( this, arguments ), + "slice", core_slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: core_push, + sort: [].sort, + splice: [].splice +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( length === i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + noConflict: function( deep ) { + if ( window.$ === jQuery ) { + window.$ = _$; + } + + if ( deep && window.jQuery === jQuery ) { + window.jQuery = _jQuery; + } + + return jQuery; + }, + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready, 1 ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.trigger ) { + jQuery( document ).trigger("ready").off("ready"); + } + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + isWindow: function( obj ) { + return obj != null && obj == obj.window; + }, + + isNumeric: function( obj ) { + return !isNaN( parseFloat(obj) ) && isFinite( obj ); + }, + + type: function( obj ) { + return obj == null ? + String( obj ) : + class2type[ core_toString.call(obj) ] || "object"; + }, + + isPlainObject: function( obj ) { + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + // Not own constructor property must be Object + if ( obj.constructor && + !core_hasOwn.call(obj, "constructor") && + !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + } catch ( e ) { + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + + var key; + for ( key in obj ) {} + + return key === undefined || core_hasOwn.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + var name; + for ( name in obj ) { + return false; + } + return true; + }, + + error: function( msg ) { + throw new Error( msg ); + }, + + // data: string of html + // context (optional): If specified, the fragment will be created in this context, defaults to document + // scripts (optional): If true, will include scripts passed in the html string + parseHTML: function( data, context, scripts ) { + var parsed; + if ( !data || typeof data !== "string" ) { + return null; + } + if ( typeof context === "boolean" ) { + scripts = context; + context = 0; + } + context = context || document; + + // Single tag + if ( (parsed = rsingleTag.exec( data )) ) { + return [ context.createElement( parsed[1] ) ]; + } + + parsed = jQuery.buildFragment( [ data ], context, scripts ? null : [] ); + return jQuery.merge( [], + (parsed.cacheable ? jQuery.clone( parsed.fragment ) : parsed.fragment).childNodes ); + }, + + parseJSON: function( data ) { + if ( !data || typeof data !== "string") { + return null; + } + + // Make sure leading/trailing whitespace is removed (IE can't handle it) + data = jQuery.trim( data ); + + // Attempt to parse using the native JSON parser first + if ( window.JSON && window.JSON.parse ) { + return window.JSON.parse( data ); + } + + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if ( rvalidchars.test( data.replace( rvalidescape, "@" ) + .replace( rvalidtokens, "]" ) + .replace( rvalidbraces, "")) ) { + + return ( new Function( "return " + data ) )(); + + } + jQuery.error( "Invalid JSON: " + data ); + }, + + // Cross-browser xml parsing + parseXML: function( data ) { + var xml, tmp; + if ( !data || typeof data !== "string" ) { + return null; + } + try { + if ( window.DOMParser ) { // Standard + tmp = new DOMParser(); + xml = tmp.parseFromString( data , "text/xml" ); + } else { // IE + xml = new ActiveXObject( "Microsoft.XMLDOM" ); + xml.async = "false"; + xml.loadXML( data ); + } + } catch( e ) { + xml = undefined; + } + if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; + }, + + noop: function() {}, + + // Evaluates a script in a global context + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && core_rnotwhite.test( data ) ) { + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + // args is for internal usage only + each: function( obj, callback, args ) { + var name, + i = 0, + length = obj.length, + isObj = length === undefined || jQuery.isFunction( obj ); + + if ( args ) { + if ( isObj ) { + for ( name in obj ) { + if ( callback.apply( obj[ name ], args ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.apply( obj[ i++ ], args ) === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isObj ) { + for ( name in obj ) { + if ( callback.call( obj[ name ], name, obj[ name ] ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.call( obj[ i ], i, obj[ i++ ] ) === false ) { + break; + } + } + } + } + + return obj; + }, + + // Use native String.trim function wherever possible + trim: core_trim && !core_trim.call("\uFEFF\xA0") ? + function( text ) { + return text == null ? + "" : + core_trim.call( text ); + } : + + // Otherwise use our own trimming functionality + function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var type, + ret = results || []; + + if ( arr != null ) { + // The window, strings (and functions) also have 'length' + // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 + type = jQuery.type( arr ); + + if ( arr.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( arr ) ) { + core_push.call( ret, arr ); + } else { + jQuery.merge( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + var len; + + if ( arr ) { + if ( core_indexOf ) { + return core_indexOf.call( arr, elem, i ); + } + + len = arr.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + // Skip accessing in sparse arrays + if ( i in arr && arr[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var l = second.length, + i = first.length, + j = 0; + + if ( typeof l === "number" ) { + for ( ; j < l; j++ ) { + first[ i++ ] = second[ j ]; + } + + } else { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, inv ) { + var retVal, + ret = [], + i = 0, + length = elems.length; + inv = !!inv; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + retVal = !!callback( elems[ i ], i ); + if ( inv !== retVal ) { + ret.push( elems[ i ] ); + } + } + + return ret; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, key, + ret = [], + i = 0, + length = elems.length, + // jquery objects are treated as arrays + isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; + + // Go through the array, translating each of the items to their + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + + // Go through every key on the object, + } else { + for ( key in elems ) { + value = callback( elems[ key ], key, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + } + + // Flatten any nested arrays + return ret.concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var tmp, args, proxy; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = core_slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context, args.concat( core_slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + // Multifunctional method to get and set values of a collection + // The value/s can optionally be executed if it's a function + access: function( elems, fn, key, value, chainable, emptyGet, pass ) { + var exec, + bulk = key == null, + i = 0, + length = elems.length; + + // Sets many values + if ( key && typeof key === "object" ) { + for ( i in key ) { + jQuery.access( elems, fn, i, key[i], 1, emptyGet, value ); + } + chainable = 1; + + // Sets one value + } else if ( value !== undefined ) { + // Optionally, function values get executed if exec is true + exec = pass === undefined && jQuery.isFunction( value ); + + if ( bulk ) { + // Bulk operations only iterate when executing function values + if ( exec ) { + exec = fn; + fn = function( elem, key, value ) { + return exec.call( jQuery( elem ), value ); + }; + + // Otherwise they run against the entire set + } else { + fn.call( elems, value ); + fn = null; + } + } + + if ( fn ) { + for (; i < length; i++ ) { + fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); + } + } + + chainable = 1; + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + length ? fn( elems[0], key ) : emptyGet; + }, + + now: function() { + return ( new Date() ).getTime(); + } +}); + +jQuery.ready.promise = function( obj ) { + if ( !readyList ) { + + readyList = jQuery.Deferred(); + + // Catch cases where $(document).ready() is called after the browser event has already occurred. + // we once tried to use readyState "interactive" here, but it caused issues like the one + // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + setTimeout( jQuery.ready, 1 ); + + // Standards-based browsers support DOMContentLoaded + } else if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", jQuery.ready, false ); + + // If IE event model is used + } else { + // Ensure firing before onload, maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", DOMContentLoaded ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", jQuery.ready ); + + // If IE and not a frame + // continually check to see if the document is ready + var top = false; + + try { + top = window.frameElement == null && document.documentElement; + } catch(e) {} + + if ( top && top.doScroll ) { + (function doScrollCheck() { + if ( !jQuery.isReady ) { + + try { + // Use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + top.doScroll("left"); + } catch(e) { + return setTimeout( doScrollCheck, 50 ); + } + + // and execute any waiting functions + jQuery.ready(); + } + })(); + } + } + } + return readyList.promise( obj ); +}; + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +// All jQuery objects should point back to these +rootjQuery = jQuery(document); +// String to Object options format cache +var optionsCache = {}; + +// Convert String-formatted options into Object-formatted ones and store in cache +function createOptions( options ) { + var object = optionsCache[ options ] = {}; + jQuery.each( options.split( core_rspace ), function( _, flag ) { + object[ flag ] = true; + }); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + ( optionsCache[ options ] || createOptions( options ) ) : + jQuery.extend( {}, options ); + + var // Last fire value (for non-forgettable lists) + memory, + // Flag to know if list was already fired + fired, + // Flag to know if list is currently firing + firing, + // First callback to fire (used internally by add and fireWith) + firingStart, + // End of the loop when firing + firingLength, + // Index of currently firing callback (modified by remove if needed) + firingIndex, + // Actual callback list + list = [], + // Stack of fire calls for repeatable lists + stack = !options.once && [], + // Fire callbacks + fire = function( data ) { + memory = options.memory && data; + fired = true; + firingIndex = firingStart || 0; + firingStart = 0; + firingLength = list.length; + firing = true; + for ( ; list && firingIndex < firingLength; firingIndex++ ) { + if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { + memory = false; // To prevent further calls using add + break; + } + } + firing = false; + if ( list ) { + if ( stack ) { + if ( stack.length ) { + fire( stack.shift() ); + } + } else if ( memory ) { + list = []; + } else { + self.disable(); + } + } + }, + // Actual Callbacks object + self = { + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + // First, we save the current length + var start = list.length; + (function add( args ) { + jQuery.each( args, function( _, arg ) { + var type = jQuery.type( arg ); + if ( type === "function" ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && type !== "string" ) { + // Inspect recursively + add( arg ); + } + }); + })( arguments ); + // Do we need to add the callbacks to the + // current firing batch? + if ( firing ) { + firingLength = list.length; + // With memory, if we're not firing then + // we should call right away + } else if ( memory ) { + firingStart = start; + fire( memory ); + } + } + return this; + }, + // Remove a callback from the list + remove: function() { + if ( list ) { + jQuery.each( arguments, function( _, arg ) { + var index; + while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + // Handle firing indexes + if ( firing ) { + if ( index <= firingLength ) { + firingLength--; + } + if ( index <= firingIndex ) { + firingIndex--; + } + } + } + }); + } + return this; + }, + // Control if a given callback is in the list + has: function( fn ) { + return jQuery.inArray( fn, list ) > -1; + }, + // Remove all callbacks from the list + empty: function() { + list = []; + return this; + }, + // Have the list do nothing anymore + disable: function() { + list = stack = memory = undefined; + return this; + }, + // Is it disabled? + disabled: function() { + return !list; + }, + // Lock the list in its current state + lock: function() { + stack = undefined; + if ( !memory ) { + self.disable(); + } + return this; + }, + // Is it locked? + locked: function() { + return !stack; + }, + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + if ( list && ( !fired || stack ) ) { + if ( firing ) { + stack.push( args ); + } else { + fire( args ); + } + } + return this; + }, + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; +jQuery.extend({ + + Deferred: function( func ) { + var tuples = [ + // action, add listener, listener list, final state + [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], + [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], + [ "notify", "progress", jQuery.Callbacks("memory") ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + then: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + return jQuery.Deferred(function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + var action = tuple[ 0 ], + fn = fns[ i ]; + // deferred[ done | fail | progress ] for forwarding actions to newDefer + deferred[ tuple[1] ]( jQuery.isFunction( fn ) ? + function() { + var returned = fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .done( newDefer.resolve ) + .fail( newDefer.reject ) + .progress( newDefer.notify ); + } else { + newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); + } + } : + newDefer[ action ] + ); + }); + fns = null; + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 3 ]; + + // promise[ done | fail | progress ] = list.add + promise[ tuple[1] ] = list.add; + + // Handle state + if ( stateString ) { + list.add(function() { + // state = [ resolved | rejected ] + state = stateString; + + // [ reject_list | resolve_list ].disable; progress_list.lock + }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); + } + + // deferred[ resolve | reject | notify ] = list.fire + deferred[ tuple[0] ] = list.fire; + deferred[ tuple[0] + "With" ] = list.fireWith; + }); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( subordinate /* , ..., subordinateN */ ) { + var i = 0, + resolveValues = core_slice.call( arguments ), + length = resolveValues.length, + + // the count of uncompleted subordinates + remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + + // the master Deferred. If resolveValues consist of only a single Deferred, just use that. + deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + + // Update function for both resolve and progress values + updateFunc = function( i, contexts, values ) { + return function( value ) { + contexts[ i ] = this; + values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value; + if( values === progressValues ) { + deferred.notifyWith( contexts, values ); + } else if ( !( --remaining ) ) { + deferred.resolveWith( contexts, values ); + } + }; + }, + + progressValues, progressContexts, resolveContexts; + + // add listeners to Deferred subordinates; treat others as resolved + if ( length > 1 ) { + progressValues = new Array( length ); + progressContexts = new Array( length ); + resolveContexts = new Array( length ); + for ( ; i < length; i++ ) { + if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { + resolveValues[ i ].promise() + .done( updateFunc( i, resolveContexts, resolveValues ) ) + .fail( deferred.reject ) + .progress( updateFunc( i, progressContexts, progressValues ) ); + } else { + --remaining; + } + } + } + + // if we're not waiting on anything, resolve the master + if ( !remaining ) { + deferred.resolveWith( resolveContexts, resolveValues ); + } + + return deferred.promise(); + } +}); +jQuery.support = (function() { + + var support, + all, + a, + select, + opt, + input, + fragment, + eventName, + i, + isSupported, + clickFn, + div = document.createElement("div"); + + // Setup + div.setAttribute( "className", "t" ); + div.innerHTML = " <link/><table></table><a href='/a'>a</a><input type='checkbox'/>"; + + // Support tests won't run in some limited or non-browser environments + all = div.getElementsByTagName("*"); + a = div.getElementsByTagName("a")[ 0 ]; + if ( !all || !a || !all.length ) { + return {}; + } + + // First batch of tests + select = document.createElement("select"); + opt = select.appendChild( document.createElement("option") ); + input = div.getElementsByTagName("input")[ 0 ]; + + a.style.cssText = "top:1px;float:left;opacity:.5"; + support = { + // IE strips leading whitespace when .innerHTML is used + leadingWhitespace: ( div.firstChild.nodeType === 3 ), + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + tbody: !div.getElementsByTagName("tbody").length, + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + htmlSerialize: !!div.getElementsByTagName("link").length, + + // Get the style information from getAttribute + // (IE uses .cssText instead) + style: /top/.test( a.getAttribute("style") ), + + // Make sure that URLs aren't manipulated + // (IE normalizes it by default) + hrefNormalized: ( a.getAttribute("href") === "/a" ), + + // Make sure that element opacity exists + // (IE uses filter instead) + // Use a regex to work around a WebKit issue. See #5145 + opacity: /^0.5/.test( a.style.opacity ), + + // Verify style float existence + // (IE uses styleFloat instead of cssFloat) + cssFloat: !!a.style.cssFloat, + + // Make sure that if no value is specified for a checkbox + // that it defaults to "on". + // (WebKit defaults to "" instead) + checkOn: ( input.value === "on" ), + + // Make sure that a selected-by-default option has a working selected property. + // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) + optSelected: opt.selected, + + // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) + getSetAttribute: div.className !== "t", + + // Tests for enctype support on a form (#6743) + enctype: !!document.createElement("form").enctype, + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>", + + // jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode + boxModel: ( document.compatMode === "CSS1Compat" ), + + // Will be defined later + submitBubbles: true, + changeBubbles: true, + focusinBubbles: false, + deleteExpando: true, + noCloneEvent: true, + inlineBlockNeedsLayout: false, + shrinkWrapBlocks: false, + reliableMarginRight: true, + boxSizingReliable: true, + pixelPosition: false + }; + + // Make sure checked status is properly cloned + input.checked = true; + support.noCloneChecked = input.cloneNode( true ).checked; + + // Make sure that the options inside disabled selects aren't marked as disabled + // (WebKit marks them as disabled) + select.disabled = true; + support.optDisabled = !opt.disabled; + + // Test to see if it's possible to delete an expando from an element + // Fails in Internet Explorer + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + + if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { + div.attachEvent( "onclick", clickFn = function() { + // Cloning a node shouldn't copy over any + // bound event handlers (IE does this) + support.noCloneEvent = false; + }); + div.cloneNode( true ).fireEvent("onclick"); + div.detachEvent( "onclick", clickFn ); + } + + // Check if a radio maintains its value + // after being appended to the DOM + input = document.createElement("input"); + input.value = "t"; + input.setAttribute( "type", "radio" ); + support.radioValue = input.value === "t"; + + input.setAttribute( "checked", "checked" ); + + // #11217 - WebKit loses check when the name is after the checked attribute + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + fragment = document.createDocumentFragment(); + fragment.appendChild( div.lastChild ); + + // WebKit doesn't clone checked state correctly in fragments + support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + support.appendChecked = input.checked; + + fragment.removeChild( input ); + fragment.appendChild( div ); + + // Technique from Juriy Zaytsev + // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ + // We only care about the case where non-standard event systems + // are used, namely in IE. Short-circuiting here helps us to + // avoid an eval call (in setAttribute) which can cause CSP + // to go haywire. See: https://developer.mozilla.org/en/Security/CSP + if ( div.attachEvent ) { + for ( i in { + submit: true, + change: true, + focusin: true + }) { + eventName = "on" + i; + isSupported = ( eventName in div ); + if ( !isSupported ) { + div.setAttribute( eventName, "return;" ); + isSupported = ( typeof div[ eventName ] === "function" ); + } + support[ i + "Bubbles" ] = isSupported; + } + } + + // Run tests that need a body at doc ready + jQuery(function() { + var container, div, tds, marginDiv, + divReset = "padding:0;margin:0;border:0;display:block;overflow:hidden;", + body = document.getElementsByTagName("body")[0]; + + if ( !body ) { + // Return for frameset docs that don't have a body + return; + } + + container = document.createElement("div"); + container.style.cssText = "visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px"; + body.insertBefore( container, body.firstChild ); + + // Construct the test element + div = document.createElement("div"); + container.appendChild( div ); + + // Check if table cells still have offsetWidth/Height when they are set + // to display:none and there are still other visible table cells in a + // table row; if so, offsetWidth/Height are not reliable for use when + // determining if an element has been hidden directly using + // display:none (it is still safe to use offsets if a parent element is + // hidden; don safety goggles and see bug #4512 for more information). + // (only IE 8 fails this test) + div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>"; + tds = div.getElementsByTagName("td"); + tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none"; + isSupported = ( tds[ 0 ].offsetHeight === 0 ); + + tds[ 0 ].style.display = ""; + tds[ 1 ].style.display = "none"; + + // Check if empty table cells still have offsetWidth/Height + // (IE <= 8 fail this test) + support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); + + // Check box-sizing and margin behavior + div.innerHTML = ""; + div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;"; + support.boxSizing = ( div.offsetWidth === 4 ); + support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 ); + + // NOTE: To any future maintainer, we've window.getComputedStyle + // because jsdom on node.js will break without it. + if ( window.getComputedStyle ) { + support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%"; + support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px"; + + // Check if div with explicit width and no margin-right incorrectly + // gets computed margin-right based on width of container. For more + // info see bug #3333 + // Fails in WebKit before Feb 2011 nightlies + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + marginDiv = document.createElement("div"); + marginDiv.style.cssText = div.style.cssText = divReset; + marginDiv.style.marginRight = marginDiv.style.width = "0"; + div.style.width = "1px"; + div.appendChild( marginDiv ); + support.reliableMarginRight = + !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight ); + } + + if ( typeof div.style.zoom !== "undefined" ) { + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + // (IE < 8 does this) + div.innerHTML = ""; + div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1"; + support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 ); + + // Check if elements with layout shrink-wrap their children + // (IE 6 does this) + div.style.display = "block"; + div.style.overflow = "visible"; + div.innerHTML = "<div></div>"; + div.firstChild.style.width = "5px"; + support.shrinkWrapBlocks = ( div.offsetWidth !== 3 ); + + container.style.zoom = 1; + } + + // Null elements to avoid leaks in IE + body.removeChild( container ); + container = div = tds = marginDiv = null; + }); + + // Null elements to avoid leaks in IE + fragment.removeChild( div ); + all = a = select = opt = input = fragment = div = null; + + return support; +})(); +var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/, + rmultiDash = /([A-Z])/g; + +jQuery.extend({ + cache: {}, + + deletedIds: [], + + // Remove at next major release (1.9/2.0) + uuid: 0, + + // Unique for each copy of jQuery on the page + // Non-digits removed to match rinlinejQuery + expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), + + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "embed": true, + // Ban all objects except for Flash (which handle expandos) + "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", + "applet": true + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, ret, + internalKey = jQuery.expando, + getByName = typeof name === "string", + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + elem[ internalKey ] = id = jQuery.deletedIds.pop() || jQuery.guid++; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + cache[ id ] = {}; + + // Avoids exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( getByName ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; + }, + + removeData: function( elem, name, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, i, l, + + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split(" "); + } + } + } + + for ( i = 0, l = name.length; i < l; i++ ) { + delete thisCache[ name[i] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject( cache[ id ] ) ) { + return; + } + } + + // Destroy the cache + if ( isNode ) { + jQuery.cleanData( [ elem ], true ); + + // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) + } else if ( jQuery.support.deleteExpando || cache != cache.window ) { + delete cache[ id ]; + + // When all else fails, null + } else { + cache[ id ] = null; + } + }, + + // For internal use only. + _data: function( elem, name, data ) { + return jQuery.data( elem, name, data, true ); + }, + + // A method for determining if a DOM node can handle the data expando + acceptData: function( elem ) { + var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ]; + + // nodes accept data unless otherwise specified; rejection can be conditional + return !noData || noData !== true && elem.getAttribute("classid") === noData; + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var parts, part, attr, name, l, + elem = this[0], + i = 0, + data = null; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = jQuery.data( elem ); + + if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { + attr = elem.attributes; + for ( l = attr.length; i < l; i++ ) { + name = attr[i].name; + + if ( !name.indexOf( "data-" ) ) { + name = jQuery.camelCase( name.substring(5) ); + + dataAttr( elem, name, data[ name ] ); + } + } + jQuery._data( elem, "parsedAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + parts = key.split( ".", 2 ); + parts[1] = parts[1] ? "." + parts[1] : ""; + part = parts[1] + "!"; + + return jQuery.access( this, function( value ) { + + if ( value === undefined ) { + data = this.triggerHandler( "getData" + part, [ parts[0] ] ); + + // Try to fetch any internally stored data first + if ( data === undefined && elem ) { + data = jQuery.data( elem, key ); + data = dataAttr( elem, key, data ); + } + + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + } + + parts[1] = value; + this.each(function() { + var self = jQuery( this ); + + self.triggerHandler( "setData" + part, parts ); + jQuery.data( this, key, value ); + self.triggerHandler( "changeData" + part, parts ); + }); + }, null, value, arguments.length > 1, null, false ); + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + // Only convert to a number if it doesn't change the string + +data + "" === data ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + var name; + for ( name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} +jQuery.extend({ + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || jQuery.isArray(data) ) { + queue = jQuery._data( elem, type, jQuery.makeArray(data) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // not intended for public consumption - generates a queueHooks object, or returns the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return jQuery._data( elem, key ) || jQuery._data( elem, key, { + empty: jQuery.Callbacks("once memory").add(function() { + jQuery.removeData( elem, type + "queue", true ); + jQuery.removeData( elem, key, true ); + }) + }); + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[0], type ); + } + + return data === undefined ? + this : + this.each(function() { + var queue = jQuery.queue( this, type, data ); + + // ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + // Based off of the plugin by Clint Helfers, with permission. + // http://blindsignals.com/index.php/2009/07/jquery-delay/ + delay: function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = setTimeout( next, time ); + hooks.stop = function() { + clearTimeout( timeout ); + }; + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while( i-- ) { + tmp = jQuery._data( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +}); +var nodeHook, boolHook, fixSpecified, + rclass = /[\t\r\n]/g, + rreturn = /\r/g, + rtype = /^(?:button|input)$/i, + rfocusable = /^(?:button|input|object|select|textarea)$/i, + rclickable = /^a(?:rea|)$/i, + rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, + getSetAttribute = jQuery.support.getSetAttribute; + +jQuery.fn.extend({ + attr: function( name, value ) { + return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each(function() { + jQuery.removeAttr( this, name ); + }); + }, + + prop: function( name, value ) { + return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + name = jQuery.propFix[ name ] || name; + return this.each(function() { + // try/catch handles cases where IE balks (such as removing a property on window) + try { + this[ name ] = undefined; + delete this[ name ]; + } catch( e ) {} + }); + }, + + addClass: function( value ) { + var classNames, i, l, elem, + setClass, c, cl; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).addClass( value.call(this, j, this.className) ); + }); + } + + if ( value && typeof value === "string" ) { + classNames = value.split( core_rspace ); + + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; + + if ( elem.nodeType === 1 ) { + if ( !elem.className && classNames.length === 1 ) { + elem.className = value; + + } else { + setClass = " " + elem.className + " "; + + for ( c = 0, cl = classNames.length; c < cl; c++ ) { + if ( setClass.indexOf( " " + classNames[ c ] + " " ) < 0 ) { + setClass += classNames[ c ] + " "; + } + } + elem.className = jQuery.trim( setClass ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var removes, className, elem, c, cl, i, l; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).removeClass( value.call(this, j, this.className) ); + }); + } + if ( (value && typeof value === "string") || value === undefined ) { + removes = ( value || "" ).split( core_rspace ); + + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; + if ( elem.nodeType === 1 && elem.className ) { + + className = (" " + elem.className + " ").replace( rclass, " " ); + + // loop over each item in the removal list + for ( c = 0, cl = removes.length; c < cl; c++ ) { + // Remove until there is nothing to remove, + while ( className.indexOf(" " + removes[ c ] + " ") >= 0 ) { + className = className.replace( " " + removes[ c ] + " " , " " ); + } + } + elem.className = value ? jQuery.trim( className ) : ""; + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isBool = typeof stateVal === "boolean"; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( i ) { + jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); + }); + } + + return this.each(function() { + if ( type === "string" ) { + // toggle individual class names + var className, + i = 0, + self = jQuery( this ), + state = stateVal, + classNames = value.split( core_rspace ); + + while ( (className = classNames[ i++ ]) ) { + // check each className given, space separated list + state = isBool ? state : !self.hasClass( className ); + self[ state ? "addClass" : "removeClass" ]( className ); + } + + } else if ( type === "undefined" || type === "boolean" ) { + if ( this.className ) { + // store className if set + jQuery._data( this, "__className__", this.className ); + } + + // toggle whole className + this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; + } + }); + }, + + hasClass: function( selector ) { + var className = " " + selector + " ", + i = 0, + l = this.length; + for ( ; i < l; i++ ) { + if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) { + return true; + } + } + + return false; + }, + + val: function( value ) { + var hooks, ret, isFunction, + elem = this[0]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { + return ret; + } + + ret = elem.value; + + return typeof ret === "string" ? + // handle most common string cases + ret.replace(rreturn, "") : + // handle cases where value is null/undef or number + ret == null ? "" : ret; + } + + return; + } + + isFunction = jQuery.isFunction( value ); + + return this.each(function( i ) { + var val, + self = jQuery(this); + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, self.val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + } else if ( typeof val === "number" ) { + val += ""; + } else if ( jQuery.isArray( val ) ) { + val = jQuery.map(val, function ( value ) { + return value == null ? "" : value + ""; + }); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + }); + } +}); + +jQuery.extend({ + valHooks: { + option: { + get: function( elem ) { + // attributes.value is undefined in Blackberry 4.7 but + // uses .value. See #6932 + var val = elem.attributes.value; + return !val || val.specified ? elem.value : elem.text; + } + }, + select: { + get: function( elem ) { + var value, option, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one" || index < 0, + values = one ? null : [], + max = one ? index + 1 : options.length, + i = index < 0 ? + max : + one ? index : 0; + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // oldIE doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + // Don't return options that are disabled or in a disabled optgroup + ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) && + ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var values = jQuery.makeArray( value ); + + jQuery(elem).find("option").each(function() { + this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; + }); + + if ( !values.length ) { + elem.selectedIndex = -1; + } + return values; + } + } + }, + + // Unused in 1.8, left in so attrFn-stabbers won't die; remove in 1.9 + attrFn: {}, + + attr: function( elem, name, value, pass ) { + var ret, hooks, notxml, + nType = elem.nodeType; + + // don't get/set attributes on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( pass && jQuery.isFunction( jQuery.fn[ name ] ) ) { + return jQuery( elem )[ name ]( value ); + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + // All attributes are lowercase + // Grab necessary hook if one is defined + if ( notxml ) { + name = name.toLowerCase(); + hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook ); + } + + if ( value !== undefined ) { + + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + + } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + elem.setAttribute( name, value + "" ); + return value; + } + + } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + + ret = elem.getAttribute( name ); + + // Non-existent attributes return null, we normalize to undefined + return ret === null ? + undefined : + ret; + } + }, + + removeAttr: function( elem, value ) { + var propName, attrNames, name, isBool, + i = 0; + + if ( value && elem.nodeType === 1 ) { + + attrNames = value.split( core_rspace ); + + for ( ; i < attrNames.length; i++ ) { + name = attrNames[ i ]; + + if ( name ) { + propName = jQuery.propFix[ name ] || name; + isBool = rboolean.test( name ); + + // See #9699 for explanation of this approach (setting first, then removal) + // Do not do this for boolean attributes (see #10870) + if ( !isBool ) { + jQuery.attr( elem, name, "" ); + } + elem.removeAttribute( getSetAttribute ? name : propName ); + + // Set corresponding property to false for boolean attributes + if ( isBool && propName in elem ) { + elem[ propName ] = false; + } + } + } + } + }, + + attrHooks: { + type: { + set: function( elem, value ) { + // We can't allow the type property to be changed (since it causes problems in IE) + if ( rtype.test( elem.nodeName ) && elem.parentNode ) { + jQuery.error( "type property can't be changed" ); + } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { + // Setting the type on a radio button after the value resets the value in IE6-9 + // Reset value to it's default in case type is set after value + // This is for element creation + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + }, + // Use the value property for back compat + // Use the nodeHook for button elements in IE6/7 (#1954) + value: { + get: function( elem, name ) { + if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { + return nodeHook.get( elem, name ); + } + return name in elem ? + elem.value : + null; + }, + set: function( elem, value, name ) { + if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { + return nodeHook.set( elem, value, name ); + } + // Does not return so that setAttribute is also used + elem.value = value; + } + } + }, + + propFix: { + tabindex: "tabIndex", + readonly: "readOnly", + "for": "htmlFor", + "class": "className", + maxlength: "maxLength", + cellspacing: "cellSpacing", + cellpadding: "cellPadding", + rowspan: "rowSpan", + colspan: "colSpan", + usemap: "useMap", + frameborder: "frameBorder", + contenteditable: "contentEditable" + }, + + prop: function( elem, name, value ) { + var ret, hooks, notxml, + nType = elem.nodeType; + + // don't get/set properties on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + if ( notxml ) { + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + return ( elem[ name ] = value ); + } + + } else { + if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + return elem[ name ]; + } + } + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + var attributeNode = elem.getAttributeNode("tabindex"); + + return attributeNode && attributeNode.specified ? + parseInt( attributeNode.value, 10 ) : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + undefined; + } + } + } +}); + +// Hook for boolean attributes +boolHook = { + get: function( elem, name ) { + // Align boolean attributes with corresponding properties + // Fall back to attribute presence where some booleans are not supported + var attrNode, + property = jQuery.prop( elem, name ); + return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ? + name.toLowerCase() : + undefined; + }, + set: function( elem, value, name ) { + var propName; + if ( value === false ) { + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + // value is true since we know at this point it's type boolean and not false + // Set boolean attributes to the same name and set the DOM property + propName = jQuery.propFix[ name ] || name; + if ( propName in elem ) { + // Only set the IDL specifically if it already exists on the element + elem[ propName ] = true; + } + + elem.setAttribute( name, name.toLowerCase() ); + } + return name; + } +}; + +// IE6/7 do not support getting/setting some attributes with get/setAttribute +if ( !getSetAttribute ) { + + fixSpecified = { + name: true, + id: true, + coords: true + }; + + // Use this for any attribute in IE6/7 + // This fixes almost every IE6/7 issue + nodeHook = jQuery.valHooks.button = { + get: function( elem, name ) { + var ret; + ret = elem.getAttributeNode( name ); + return ret && ( fixSpecified[ name ] ? ret.value !== "" : ret.specified ) ? + ret.value : + undefined; + }, + set: function( elem, value, name ) { + // Set the existing or create a new attribute node + var ret = elem.getAttributeNode( name ); + if ( !ret ) { + ret = document.createAttribute( name ); + elem.setAttributeNode( ret ); + } + return ( ret.value = value + "" ); + } + }; + + // Set width and height to auto instead of 0 on empty string( Bug #8150 ) + // This is for removals + jQuery.each([ "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + set: function( elem, value ) { + if ( value === "" ) { + elem.setAttribute( name, "auto" ); + return value; + } + } + }); + }); + + // Set contenteditable to false on removals(#10429) + // Setting to empty string throws an error as an invalid value + jQuery.attrHooks.contenteditable = { + get: nodeHook.get, + set: function( elem, value, name ) { + if ( value === "" ) { + value = "false"; + } + nodeHook.set( elem, value, name ); + } + }; +} + + +// Some attributes require a special call on IE +if ( !jQuery.support.hrefNormalized ) { + jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + get: function( elem ) { + var ret = elem.getAttribute( name, 2 ); + return ret === null ? undefined : ret; + } + }); + }); +} + +if ( !jQuery.support.style ) { + jQuery.attrHooks.style = { + get: function( elem ) { + // Return undefined in the case of empty string + // Normalize to lowercase since IE uppercases css property names + return elem.style.cssText.toLowerCase() || undefined; + }, + set: function( elem, value ) { + return ( elem.style.cssText = value + "" ); + } + }; +} + +// Safari mis-reports the default selected property of an option +// Accessing the parent's selectedIndex property fixes it +if ( !jQuery.support.optSelected ) { + jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { + get: function( elem ) { + var parent = elem.parentNode; + + if ( parent ) { + parent.selectedIndex; + + // Make sure that it also works with optgroups, see #5701 + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + return null; + } + }); +} + +// IE6/7 call enctype encoding +if ( !jQuery.support.enctype ) { + jQuery.propFix.enctype = "encoding"; +} + +// Radios and checkboxes getter/setter +if ( !jQuery.support.checkOn ) { + jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + get: function( elem ) { + // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified + return elem.getAttribute("value") === null ? "on" : elem.value; + } + }; + }); +} +jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { + set: function( elem, value ) { + if ( jQuery.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); + } + } + }); +}); +var rformElems = /^(?:textarea|input|select)$/i, + rtypenamespace = /^([^\.]*|)(?:\.(.+)|)$/, + rhoverHack = /(?:^|\s)hover(\.\S+|)\b/, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|contextmenu)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + hoverHack = function( events ) { + return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" ); + }; + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + add: function( elem, types, handler, data, selector ) { + + var elemData, eventHandle, events, + t, tns, type, namespaces, handleObj, + handleObjIn, handlers, special; + + // Don't attach events to noData or text/comment nodes (allow plain objects tho) + if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + events = elemData.events; + if ( !events ) { + elemData.events = events = {}; + } + eventHandle = elemData.handle; + if ( !eventHandle ) { + elemData.handle = eventHandle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + // jQuery(...).bind("mouseover mouseout", fn); + types = jQuery.trim( hoverHack(types) ).split( " " ); + for ( t = 0; t < types.length; t++ ) { + + tns = rtypenamespace.exec( types[t] ) || []; + type = tns[1]; + namespaces = ( tns[2] || "" ).split( "." ).sort(); + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: tns[1], + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join(".") + }, handleObjIn ); + + // Init the event handler queue if we're the first + handlers = events[ type ]; + if ( !handlers ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + global: {}, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var t, tns, type, origType, namespaces, origCount, + j, events, special, eventType, handleObj, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ); + + if ( !elemData || !(events = elemData.events) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = jQuery.trim( hoverHack( types || "" ) ).split(" "); + for ( t = 0; t < types.length; t++ ) { + tns = rtypenamespace.exec( types[t] ) || []; + type = origType = tns[1]; + namespaces = tns[2]; + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector? special.delegateType : special.bindType ) || type; + eventType = events[ type ] || []; + origCount = eventType.length; + namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.|)") + "(\\.|$)") : null; + + // Remove matching events + for ( j = 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !namespaces || namespaces.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + eventType.splice( j--, 1 ); + + if ( handleObj.selector ) { + eventType.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( eventType.length === 0 && origCount !== eventType.length ) { + if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + delete elemData.handle; + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery.removeData( elem, "events", true ); + } + }, + + // Events that are safe to short-circuit if no handlers are attached. + // Native DOM events should not be added, they may have inline handlers. + customEvent: { + "getData": true, + "setData": true, + "changeData": true + }, + + trigger: function( event, data, elem, onlyHandlers ) { + // Don't do events on text and comment nodes + if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) { + return; + } + + // Event object or event type + var cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType, + type = event.type || event, + namespaces = []; + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "!" ) >= 0 ) { + // Exclusive events trigger only for the exact event (no namespaces) + type = type.slice(0, -1); + exclusive = true; + } + + if ( type.indexOf( "." ) >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + + if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { + // No jQuery handlers for this event type, and it can't have inline handlers + return; + } + + // Caller can pass in an Event, Object, or just an event type string + event = typeof event === "object" ? + // jQuery.Event object + event[ jQuery.expando ] ? event : + // Object literal + new jQuery.Event( type, event ) : + // Just the event type (string) + new jQuery.Event( type ); + + event.type = type; + event.isTrigger = true; + event.exclusive = exclusive; + event.namespace = namespaces.join( "." ); + event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null; + ontype = type.indexOf( ":" ) < 0 ? "on" + type : ""; + + // Handle a global trigger + if ( !elem ) { + + // TODO: Stop taunting the data cache; remove global events and always attach to document + cache = jQuery.cache; + for ( i in cache ) { + if ( cache[ i ].events && cache[ i ].events[ type ] ) { + jQuery.event.trigger( event, data, cache[ i ].handle.elem, true ); + } + } + return; + } + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data != null ? jQuery.makeArray( data ) : []; + data.unshift( event ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + eventPath = [[ elem, special.bindType || type ]]; + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode; + for ( old = elem; cur; cur = cur.parentNode ) { + eventPath.push([ cur, bubbleType ]); + old = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( old === (elem.ownerDocument || document) ) { + eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]); + } + } + + // Fire handlers on the event path + for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) { + + cur = eventPath[i][0]; + event.type = eventPath[i][1]; + + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + // Note that this is a bare JS function and not a jQuery handler + handle = ontype && cur[ ontype ]; + if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) { + event.preventDefault(); + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) && + !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + // IE<9 dies on focus/blur to hidden element (#1486) + if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + old = elem[ ontype ]; + + if ( old ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + elem[ type ](); + jQuery.event.triggered = undefined; + + if ( old ) { + elem[ ontype ] = old; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event || window.event ); + + var i, j, cur, ret, selMatch, matched, matches, handleObj, sel, related, + handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []), + delegateCount = handlers.delegateCount, + args = core_slice.call( arguments ), + run_all = !event.exclusive && !event.namespace, + special = jQuery.event.special[ event.type ] || {}, + handlerQueue = []; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers that should run if there are delegated events + // Avoid non-left-click bubbling in Firefox (#3861) + if ( delegateCount && !(event.button && event.type === "click") ) { + + for ( cur = event.target; cur != this; cur = cur.parentNode || this ) { + + // Don't process clicks (ONLY) on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.disabled !== true || event.type !== "click" ) { + selMatch = {}; + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + sel = handleObj.selector; + + if ( selMatch[ sel ] === undefined ) { + selMatch[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) >= 0 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( selMatch[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push({ elem: cur, matches: matches }); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( handlers.length > delegateCount ) { + handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) }); + } + + // Run delegates first; they may want to stop propagation beneath us + for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) { + matched = handlerQueue[ i ]; + event.currentTarget = matched.elem; + + for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) { + handleObj = matched.matches[ j ]; + + // Triggered event must either 1) be non-exclusive and have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). + if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) { + + event.data = handleObj.data; + event.handleObj = handleObj; + + ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) + .apply( matched.elem, args ); + + if ( ret !== undefined ) { + event.result = ret; + if ( ret === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 *** + props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + filter: function( event, original ) { + var eventDoc, doc, body, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, + originalEvent = event, + fixHook = jQuery.event.fixHooks[ event.type ] || {}, + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = jQuery.Event( originalEvent ); + + for ( i = copy.length; i; ) { + prop = copy[ --i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Target should not be a text node (#504, Safari) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // For mouse/key events, metaKey==false if it's undefined (#3368, #11328; IE6/7/8) + event.metaKey = !!event.metaKey; + + return fixHook.filter? fixHook.filter( event, originalEvent ) : event; + }, + + special: { + load: { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + + focus: { + delegateType: "focusin" + }, + blur: { + delegateType: "focusout" + }, + + beforeunload: { + setup: function( data, namespaces, eventHandle ) { + // We only want to do this special case on windows + if ( jQuery.isWindow( this ) ) { + this.onbeforeunload = eventHandle; + } + }, + + teardown: function( namespaces, eventHandle ) { + if ( this.onbeforeunload === eventHandle ) { + this.onbeforeunload = null; + } + } + } + }, + + simulate: function( type, elem, event, bubble ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + var e = jQuery.extend( + new jQuery.Event(), + event, + { type: type, + isSimulated: true, + originalEvent: {} + } + ); + if ( bubble ) { + jQuery.event.trigger( e, null, elem ); + } else { + jQuery.event.dispatch.call( elem, e ); + } + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +// Some plugins are using, but it's undocumented/deprecated and will be removed. +// The 1.7 special event interface should provide all the hooks needed now. +jQuery.event.handle = jQuery.event.dispatch; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + var name = "on" + type; + + if ( elem.detachEvent ) { + + // #8545, #7054, preventing memory leaks for custom events in IE6-8 + // detachEvent needed property on element, by name of that event, to properly expose it to GC + if ( typeof elem[ name ] === "undefined" ) { + elem[ name ] = null; + } + + elem.detachEvent( name, handle ); + } + }; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !(this instanceof jQuery.Event) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || + src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +function returnFalse() { + return false; +} +function returnTrue() { + return true; +} + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + preventDefault: function() { + this.isDefaultPrevented = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + + // if preventDefault exists run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // otherwise set the returnValue property of the original event to false (IE) + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + this.isPropagationStopped = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + // if stopPropagation exists run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + // otherwise set the cancelBubble property of the original event to true (IE) + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + }, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj, + selector = handleObj.selector; + + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || (related !== target && !jQuery.contains( target, related )) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +}); + +// IE submit delegation +if ( !jQuery.support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; + if ( form && !jQuery._data( form, "_submit_attached" ) ) { + jQuery.event.add( form, "submit._submit", function( event ) { + event._submit_bubble = true; + }); + jQuery._data( form, "_submit_attached", true ); + } + }); + // return undefined since we don't need an event listener + }, + + postDispatch: function( event ) { + // If form was submitted by the user, bubble the event up the tree + if ( event._submit_bubble ) { + delete event._submit_bubble; + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event, true ); + } + } + }, + + teardown: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !jQuery.support.changeBubbles ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._just_changed = true; + } + }); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._just_changed && !event.isTrigger ) { + this._just_changed = false; + } + // Allow triggered, simulated change events (#11500) + jQuery.event.simulate( "change", this, event, true ); + }); + } + return false; + } + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "_change_attached" ) ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event, true ); + } + }); + jQuery._data( elem, "_change_attached", true ); + } + }); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return !rformElems.test( this.nodeName ); + } + }; +} + +// Create "bubbling" focus and blur events +if ( !jQuery.support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler while someone wants focusin/focusout + var attaches = 0, + handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + if ( attaches++ === 0 ) { + document.addEventListener( orig, handler, true ); + } + }, + teardown: function() { + if ( --attaches === 0 ) { + document.removeEventListener( orig, handler, true ); + } + } + }; + }); +} + +jQuery.fn.extend({ + + on: function( types, selector, data, fn, /*INTERNAL*/ one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { // && selector != null + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + this.on( type, selector, data, types[ type ], one ); + } + return this; + } + + if ( data == null && fn == null ) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return this; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return this.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + }); + }, + one: function( types, selector, data, fn ) { + return this.on( types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each(function() { + jQuery.event.remove( this, types, fn, selector ); + }); + }, + + bind: function( types, data, fn ) { + return this.on( types, null, data, fn ); + }, + unbind: function( types, fn ) { + return this.off( types, null, fn ); + }, + + live: function( types, data, fn ) { + jQuery( this.context ).on( types, this.selector, data, fn ); + return this; + }, + die: function( types, fn ) { + jQuery( this.context ).off( types, this.selector || "**", fn ); + return this; + }, + + delegate: function( selector, types, data, fn ) { + return this.on( types, selector, data, fn ); + }, + undelegate: function( selector, types, fn ) { + // ( namespace ) or ( selector, types [, fn] ) + return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn ); + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + triggerHandler: function( type, data ) { + if ( this[0] ) { + return jQuery.event.trigger( type, data, this[0], true ); + } + }, + + toggle: function( fn ) { + // Save reference to arguments for access in closure + var args = arguments, + guid = fn.guid || jQuery.guid++, + i = 0, + toggler = function( event ) { + // Figure out which function to execute + var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; + jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); + + // Make sure that clicks stop + event.preventDefault(); + + // and execute the function + return args[ lastToggle ].apply( this, arguments ) || false; + }; + + // link all the functions, so any of them can unbind this click handler + toggler.guid = guid; + while ( i < args.length ) { + args[ i++ ].guid = guid; + } + + return this.click( toggler ); + }, + + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +}); + +jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + if ( fn == null ) { + fn = data; + data = null; + } + + return arguments.length > 0 ? + this.on( name, null, data, fn ) : + this.trigger( name ); + }; + + if ( rkeyEvent.test( name ) ) { + jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks; + } + + if ( rmouseEvent.test( name ) ) { + jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks; + } +}); +/*! + * Sizzle CSS Selector Engine + * Copyright 2012 jQuery Foundation and other contributors + * Released under the MIT license + * http://sizzlejs.com/ + */ +(function( window, undefined ) { + +var cachedruns, + assertGetIdNotName, + Expr, + getText, + isXML, + contains, + compile, + sortOrder, + hasDuplicate, + outermostContext, + + baseHasDuplicate = true, + strundefined = "undefined", + + expando = ( "sizcache" + Math.random() ).replace( ".", "" ), + + Token = String, + document = window.document, + docElem = document.documentElement, + dirruns = 0, + done = 0, + pop = [].pop, + push = [].push, + slice = [].slice, + // Use a stripped-down indexOf if a native one is unavailable + indexOf = [].indexOf || function( elem ) { + var i = 0, + len = this.length; + for ( ; i < len; i++ ) { + if ( this[i] === elem ) { + return i; + } + } + return -1; + }, + + // Augment a function for special use by Sizzle + markFunction = function( fn, value ) { + fn[ expando ] = value == null || value; + return fn; + }, + + createCache = function() { + var cache = {}, + keys = []; + + return markFunction(function( key, value ) { + // Only keep the most recent entries + if ( keys.push( key ) > Expr.cacheLength ) { + delete cache[ keys.shift() ]; + } + + // Retrieve with (key + " ") to avoid collision with native Object.prototype properties (see Issue #157) + return (cache[ key + " " ] = value); + }, cache ); + }, + + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + + // Regex + + // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + // http://www.w3.org/TR/css3-syntax/#characters + characterEncoding = "(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+", + + // Loosely modeled on CSS identifier characters + // An unquoted value should be a CSS identifier (http://www.w3.org/TR/css3-selectors/#attribute-selectors) + // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = characterEncoding.replace( "w", "w#" ), + + // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors + operators = "([*^$|!~]?=)", + attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace + + "*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]", + + // Prefer arguments not in parens/brackets, + // then attribute selectors and non-pseudos (denoted by :), + // then anything else + // These preferences are here to reduce the number of selectors + // needing tokenize in the PSEUDO preFilter + pseudos = ":(" + characterEncoding + ")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:" + attributes + ")|[^:]|\\\\.)*|.*))\\)|)", + + // For matchExpr.POS and matchExpr.needsContext + pos = ":(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ), + rpseudo = new RegExp( pseudos ), + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/, + + rnot = /^:not/, + rsibling = /[\x20\t\r\n\f]*[+~]/, + rendsWithNot = /:not\($/, + + rheader = /h\d/i, + rinputs = /input|select|textarea|button/i, + + rbackslash = /\\(?!\\)/g, + + matchExpr = { + "ID": new RegExp( "^#(" + characterEncoding + ")" ), + "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), + "NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ), + "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "POS": new RegExp( pos, "i" ), + "CHILD": new RegExp( "^:(only|nth|first|last)-child(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + // For use in libraries implementing .is() + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|" + pos, "i" ) + }, + + // Support + + // Used for testing something on an element + assert = function( fn ) { + var div = document.createElement("div"); + + try { + return fn( div ); + } catch (e) { + return false; + } finally { + // release memory in IE + div = null; + } + }, + + // Check if getElementsByTagName("*") returns only elements + assertTagNameNoComments = assert(function( div ) { + div.appendChild( document.createComment("") ); + return !div.getElementsByTagName("*").length; + }), + + // Check if getAttribute returns normalized href attributes + assertHrefNotNormalized = assert(function( div ) { + div.innerHTML = "<a href='#'></a>"; + return div.firstChild && typeof div.firstChild.getAttribute !== strundefined && + div.firstChild.getAttribute("href") === "#"; + }), + + // Check if attributes should be retrieved by attribute nodes + assertAttributes = assert(function( div ) { + div.innerHTML = "<select></select>"; + var type = typeof div.lastChild.getAttribute("multiple"); + // IE8 returns a string for some attributes even when not present + return type !== "boolean" && type !== "string"; + }), + + // Check if getElementsByClassName can be trusted + assertUsableClassName = assert(function( div ) { + // Opera can't find a second classname (in 9.6) + div.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>"; + if ( !div.getElementsByClassName || !div.getElementsByClassName("e").length ) { + return false; + } + + // Safari 3.2 caches class attributes and doesn't catch changes + div.lastChild.className = "e"; + return div.getElementsByClassName("e").length === 2; + }), + + // Check if getElementById returns elements by name + // Check if getElementsByName privileges form controls or returns elements by ID + assertUsableName = assert(function( div ) { + // Inject content + div.id = expando + 0; + div.innerHTML = "<a name='" + expando + "'></a><div name='" + expando + "'></div>"; + docElem.insertBefore( div, docElem.firstChild ); + + // Test + var pass = document.getElementsByName && + // buggy browsers will return fewer than the correct 2 + document.getElementsByName( expando ).length === 2 + + // buggy browsers will return more than the correct 0 + document.getElementsByName( expando + 0 ).length; + assertGetIdNotName = !document.getElementById( expando ); + + // Cleanup + docElem.removeChild( div ); + + return pass; + }); + +// If slice is not available, provide a backup +try { + slice.call( docElem.childNodes, 0 )[0].nodeType; +} catch ( e ) { + slice = function( i ) { + var elem, + results = []; + for ( ; (elem = this[i]); i++ ) { + results.push( elem ); + } + return results; + }; +} + +function Sizzle( selector, context, results, seed ) { + results = results || []; + context = context || document; + var match, elem, xml, m, + nodeType = context.nodeType; + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + if ( nodeType !== 1 && nodeType !== 9 ) { + return []; + } + + xml = isXML( context ); + + if ( !xml && !seed ) { + if ( (match = rquickExpr.exec( selector )) ) { + // Speed-up: Sizzle("#ID") + if ( (m = match[1]) ) { + if ( nodeType === 9 ) { + elem = context.getElementById( m ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE, Opera, and Webkit return items + // by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + } else { + // Context is not a document + if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && + contains( context, elem ) && elem.id === m ) { + results.push( elem ); + return results; + } + } + + // Speed-up: Sizzle("TAG") + } else if ( match[2] ) { + push.apply( results, slice.call(context.getElementsByTagName( selector ), 0) ); + return results; + + // Speed-up: Sizzle(".CLASS") + } else if ( (m = match[3]) && assertUsableClassName && context.getElementsByClassName ) { + push.apply( results, slice.call(context.getElementsByClassName( m ), 0) ); + return results; + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed, xml ); +} + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + return Sizzle( expr, null, null, [ elem ] ).length > 0; +}; + +// Returns a function to use in pseudos for input types +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +// Returns a function to use in pseudos for buttons +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +// Returns a function to use in pseudos for positionals +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( nodeType ) { + if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (see #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + } else { + + // If no nodeType, this is expected to be an array + for ( ; (node = elem[i]); i++ ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } + return ret; +}; + +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +// Element contains another +contains = Sizzle.contains = docElem.contains ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && adown.contains && adown.contains(bup) ); + } : + docElem.compareDocumentPosition ? + function( a, b ) { + return b && !!( a.compareDocumentPosition( b ) & 16 ); + } : + function( a, b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + return false; + }; + +Sizzle.attr = function( elem, name ) { + var val, + xml = isXML( elem ); + + if ( !xml ) { + name = name.toLowerCase(); + } + if ( (val = Expr.attrHandle[ name ]) ) { + return val( elem ); + } + if ( xml || assertAttributes ) { + return elem.getAttribute( name ); + } + val = elem.getAttributeNode( name ); + return val ? + typeof elem[ name ] === "boolean" ? + elem[ name ] ? name : null : + val.specified ? val.value : null : + null; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + // IE6/7 return a modified href + attrHandle: assertHrefNotNormalized ? + {} : + { + "href": function( elem ) { + return elem.getAttribute( "href", 2 ); + }, + "type": function( elem ) { + return elem.getAttribute("type"); + } + }, + + find: { + "ID": assertGetIdNotName ? + function( id, context, xml ) { + if ( typeof context.getElementById !== strundefined && !xml ) { + var m = context.getElementById( id ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [m] : []; + } + } : + function( id, context, xml ) { + if ( typeof context.getElementById !== strundefined && !xml ) { + var m = context.getElementById( id ); + + return m ? + m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ? + [m] : + undefined : + []; + } + }, + + "TAG": assertTagNameNoComments ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== strundefined ) { + return context.getElementsByTagName( tag ); + } + } : + function( tag, context ) { + var results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + var elem, + tmp = [], + i = 0; + + for ( ; (elem = results[i]); i++ ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }, + + "NAME": assertUsableName && function( tag, context ) { + if ( typeof context.getElementsByName !== strundefined ) { + return context.getElementsByName( name ); + } + }, + + "CLASS": assertUsableClassName && function( className, context, xml ) { + if ( typeof context.getElementsByClassName !== strundefined && !xml ) { + return context.getElementsByClassName( className ); + } + } + }, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( rbackslash, "" ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[4] || match[5] || "" ).replace( rbackslash, "" ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 3 xn-component of xn+y argument ([+-]?\d*n|) + 4 sign of xn-component + 5 x of xn-component + 6 sign of y-component + 7 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1] === "nth" ) { + // nth-child requires argument + if ( !match[2] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[3] = +( match[3] ? match[4] + (match[5] || 1) : 2 * ( match[2] === "even" || match[2] === "odd" ) ); + match[4] = +( ( match[6] + match[7] ) || match[2] === "odd" ); + + // other types prohibit arguments + } else if ( match[2] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var unquoted, excess; + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + if ( match[3] ) { + match[2] = match[3]; + } else if ( (unquoted = match[4]) ) { + // Only check arguments that contain a pseudo + if ( rpseudo.test(unquoted) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + unquoted = unquoted.slice( 0, excess ); + match[0] = match[0].slice( 0, excess ); + } + match[2] = unquoted; + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + "ID": assertGetIdNotName ? + function( id ) { + id = id.replace( rbackslash, "" ); + return function( elem ) { + return elem.getAttribute("id") === id; + }; + } : + function( id ) { + id = id.replace( rbackslash, "" ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id"); + return node && node.value === id; + }; + }, + + "TAG": function( nodeName ) { + if ( nodeName === "*" ) { + return function() { return true; }; + } + nodeName = nodeName.replace( rbackslash, "" ).toLowerCase(); + + return function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ expando ][ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem, context ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.substr( result.length - check.length ) === check : + operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.substr( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, argument, first, last ) { + + if ( type === "nth" ) { + return function( elem ) { + var node, diff, + parent = elem.parentNode; + + if ( first === 1 && last === 0 ) { + return true; + } + + if ( parent ) { + diff = 0; + for ( node = parent.firstChild; node; node = node.nextSibling ) { + if ( node.nodeType === 1 ) { + diff++; + if ( elem === node ) { + break; + } + } + } + } + + // Incorporate the offset (or cast to NaN), then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + }; + } + + return function( elem ) { + var node = elem; + + switch ( type ) { + case "only": + case "first": + while ( (node = node.previousSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + if ( type === "first" ) { + return true; + } + + node = elem; + + /* falls through */ + case "last": + while ( (node = node.nextSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + return true; + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf.call( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + "enabled": function( elem ) { + return elem.disabled === false; + }, + + "disabled": function( elem ) { + return elem.disabled === true; + }, + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)), + // not comment, processing instructions, or others + // Thanks to Diego Perini for the nodeName shortcut + // Greater than "@" means alpha characters (specifically not starting with "#" or "?") + var nodeType; + elem = elem.firstChild; + while ( elem ) { + if ( elem.nodeName > "@" || (nodeType = elem.nodeType) === 3 || nodeType === 4 ) { + return false; + } + elem = elem.nextSibling; + } + return true; + }, + + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "text": function( elem ) { + var type, attr; + // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) + // use getAttribute instead to test this case + return elem.nodeName.toLowerCase() === "input" && + (type = elem.type) === "text" && + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === type ); + }, + + // Input types + "radio": createInputPseudo("radio"), + "checkbox": createInputPseudo("checkbox"), + "file": createInputPseudo("file"), + "password": createInputPseudo("password"), + "image": createInputPseudo("image"), + + "submit": createButtonPseudo("submit"), + "reset": createButtonPseudo("reset"), + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "focus": function( elem ) { + var doc = elem.ownerDocument; + return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + "active": function( elem ) { + return elem === elem.ownerDocument.activeElement; + }, + + // Positional types + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + for ( var i = 0; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + for ( var i = 1; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + for ( var i = argument < 0 ? argument + length : argument; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + for ( var i = argument < 0 ? argument + length : argument; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +function siblingCheck( a, b, ret ) { + if ( a === b ) { + return ret; + } + + var cur = a.nextSibling; + + while ( cur ) { + if ( cur === b ) { + return -1; + } + + cur = cur.nextSibling; + } + + return 1; +} + +sortOrder = docElem.compareDocumentPosition ? + function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + return ( !a.compareDocumentPosition || !b.compareDocumentPosition ? + a.compareDocumentPosition : + a.compareDocumentPosition(b) & 4 + ) ? -1 : 1; + } : + function( a, b ) { + // The nodes are identical, we can exit early + if ( a === b ) { + hasDuplicate = true; + return 0; + + // Fallback to using sourceIndex (in IE) if it's available on both nodes + } else if ( a.sourceIndex && b.sourceIndex ) { + return a.sourceIndex - b.sourceIndex; + } + + var al, bl, + ap = [], + bp = [], + aup = a.parentNode, + bup = b.parentNode, + cur = aup; + + // If the nodes are siblings (or identical) we can do a quick check + if ( aup === bup ) { + return siblingCheck( a, b ); + + // If no parents were found then the nodes are disconnected + } else if ( !aup ) { + return -1; + + } else if ( !bup ) { + return 1; + } + + // Otherwise they're somewhere else in the tree so we need + // to build up a full list of the parentNodes for comparison + while ( cur ) { + ap.unshift( cur ); + cur = cur.parentNode; + } + + cur = bup; + + while ( cur ) { + bp.unshift( cur ); + cur = cur.parentNode; + } + + al = ap.length; + bl = bp.length; + + // Start walking down the tree looking for a discrepancy + for ( var i = 0; i < al && i < bl; i++ ) { + if ( ap[i] !== bp[i] ) { + return siblingCheck( ap[i], bp[i] ); + } + } + + // We ended someplace up the tree so do a sibling check + return i === al ? + siblingCheck( a, bp[i], -1 ) : + siblingCheck( ap[i], b, 1 ); + }; + +// Always assume the presence of duplicates if sort doesn't +// pass them to our comparison function (as in Google Chrome). +[0, 0].sort( sortOrder ); +baseHasDuplicate = !hasDuplicate; + +// Document sorting and removing duplicates +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + i = 1, + j = 0; + + hasDuplicate = baseHasDuplicate; + results.sort( sortOrder ); + + if ( hasDuplicate ) { + for ( ; (elem = results[i]); i++ ) { + if ( elem === results[ i - 1 ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + return results; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +function tokenize( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ expando ][ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( tokens = [] ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + tokens.push( matched = new Token( match.shift() ) ); + soFar = soFar.slice( matched.length ); + + // Cast descendant combinators to space + matched.type = match[0].replace( rtrim, " " ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + + tokens.push( matched = new Token( match.shift() ) ); + soFar = soFar.slice( matched.length ); + matched.type = type; + matched.matches = match; + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && combinator.dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( checkNonElements || elem.nodeType === 1 ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching + if ( !xml ) { + var cache, + dirkey = dirruns + " " + doneName + " ", + cachedkey = dirkey + cachedruns; + while ( (elem = elem[ dir ]) ) { + if ( checkNonElements || elem.nodeType === 1 ) { + if ( (cache = elem[ expando ]) === cachedkey ) { + return elem.sizset; + } else if ( typeof cache === "string" && cache.indexOf(dirkey) === 0 ) { + if ( elem.sizset ) { + return elem; + } + } else { + elem[ expando ] = cachedkey; + if ( matcher( elem, context, xml ) ) { + elem.sizset = true; + return elem; + } + elem.sizset = false; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( checkNonElements || elem.nodeType === 1 ) { + if ( matcher( elem, context, xml ) ) { + return elem; + } + } + } + } + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf.call( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + return ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && tokens.slice( 0, i - 1 ).join("").replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && tokens.join("") + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, expandContext ) { + var elem, j, matcher, + setMatched = [], + matchedCount = 0, + i = "0", + unmatched = seed && [], + outermost = expandContext != null, + contextBackup = outermostContext, + // We must always have either seed elements or context + elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ), + // Nested matchers should use non-integer dirruns + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.E); + + if ( outermost ) { + outermostContext = context !== document && context; + cachedruns = superMatcher.el; + } + + // Add elements passing elementMatchers directly to results + for ( ; (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + for ( j = 0; (matcher = elementMatchers[j]); j++ ) { + if ( matcher( elem, context, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + cachedruns = ++superMatcher.el; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // Apply set filters to unmatched elements + matchedCount += i; + if ( bySet && i !== matchedCount ) { + for ( j = 0; (matcher = setMatchers[j]); j++ ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + superMatcher.el = 0; + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ expando ][ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !group ) { + group = tokenize( selector ); + } + i = group.length; + while ( i-- ) { + cached = matcherFromTokens( group[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + } + return cached; +}; + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function select( selector, context, results, seed, xml ) { + var i, tokens, token, type, find, + match = tokenize( selector ), + j = match.length; + + if ( !seed ) { + // Try to minimize operations if there is only one group + if ( match.length === 1 ) { + + // Take a shortcut and set the context if the root selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + context.nodeType === 9 && !xml && + Expr.relative[ tokens[1].type ] ) { + + context = Expr.find["ID"]( token.matches[0].replace( rbackslash, "" ), context, xml )[0]; + if ( !context ) { + return results; + } + + selector = selector.slice( tokens.shift().length ); + } + + // Fetch a seed set for right-to-left matching + for ( i = matchExpr["POS"].test( selector ) ? -1 : tokens.length - 1; i >= 0; i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( rbackslash, "" ), + rsibling.test( tokens[0].type ) && context.parentNode || context, + xml + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && tokens.join(""); + if ( !selector ) { + push.apply( results, slice.call( seed, 0 ) ); + return results; + } + + break; + } + } + } + } + } + + // Compile and execute a filtering function + // Provide `match` to avoid retokenization if we modified the selector above + compile( selector, match )( + seed, + context, + xml, + results, + rsibling.test( selector ) + ); + return results; +} + +if ( document.querySelectorAll ) { + (function() { + var disconnectedMatch, + oldSelect = select, + rescape = /'|\\/g, + rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g, + + // qSa(:focus) reports false when true (Chrome 21), no need to also add to buggyMatches since matches checks buggyQSA + // A support test would require too much code (would include document ready) + rbuggyQSA = [ ":focus" ], + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + // A support test would require too much code (would include document ready) + // just skip matchesSelector for :active + rbuggyMatches = [ ":active" ], + matches = docElem.matchesSelector || + docElem.mozMatchesSelector || + docElem.webkitMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector; + + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( div ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explictly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + div.innerHTML = "<select><option selected=''></option></select>"; + + // IE8 - Some boolean attributes are not treated correctly + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" ); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here (do not put tests after this one) + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + }); + + assert(function( div ) { + + // Opera 10-12/IE9 - ^= $= *= and empty values + // Should not select anything + div.innerHTML = "<p test=''></p>"; + if ( div.querySelectorAll("[test^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here (do not put tests after this one) + div.innerHTML = "<input type='hidden'/>"; + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push(":enabled", ":disabled"); + } + }); + + // rbuggyQSA always contains :focus, so no need for a length check + rbuggyQSA = /* rbuggyQSA.length && */ new RegExp( rbuggyQSA.join("|") ); + + select = function( selector, context, results, seed, xml ) { + // Only use querySelectorAll when not filtering, + // when this is not xml, + // and when no QSA bugs apply + if ( !seed && !xml && !rbuggyQSA.test( selector ) ) { + var groups, i, + old = true, + nid = expando, + newContext = context, + newSelector = context.nodeType === 9 && selector; + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + groups = tokenize( selector ); + + if ( (old = context.getAttribute("id")) ) { + nid = old.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", nid ); + } + nid = "[id='" + nid + "'] "; + + i = groups.length; + while ( i-- ) { + groups[i] = nid + groups[i].join(""); + } + newContext = rsibling.test( selector ) && context.parentNode || context; + newSelector = groups.join(","); + } + + if ( newSelector ) { + try { + push.apply( results, slice.call( newContext.querySelectorAll( + newSelector + ), 0 ) ); + return results; + } catch(qsaError) { + } finally { + if ( !old ) { + context.removeAttribute("id"); + } + } + } + } + + return oldSelect( selector, context, results, seed, xml ); + }; + + if ( matches ) { + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + try { + matches.call( div, "[test!='']:sizzle" ); + rbuggyMatches.push( "!=", pseudos ); + } catch ( e ) {} + }); + + // rbuggyMatches always contains :active and :focus, so no need for a length check + rbuggyMatches = /* rbuggyMatches.length && */ new RegExp( rbuggyMatches.join("|") ); + + Sizzle.matchesSelector = function( elem, expr ) { + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + // rbuggyMatches always contains :active, so no need for an existence check + if ( !isXML( elem ) && !rbuggyMatches.test( expr ) && !rbuggyQSA.test( expr ) ) { + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch(e) {} + } + + return Sizzle( expr, null, null, [ elem ] ).length > 0; + }; + } + })(); +} + +// Deprecated +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Back-compat +function setFilters() {} +Expr.filters = setFilters.prototype = Expr.pseudos; +Expr.setFilters = new setFilters(); + +// Override sizzle attribute retrieval +Sizzle.attr = jQuery.attr; +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.pseudos; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + +})( window ); +var runtil = /Until$/, + rparentsprev = /^(?:parents|prev(?:Until|All))/, + isSimple = /^.[^:#\[\.,]*$/, + rneedsContext = jQuery.expr.match.needsContext, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend({ + find: function( selector ) { + var i, l, length, n, r, ret, + self = this; + + if ( typeof selector !== "string" ) { + return jQuery( selector ).filter(function() { + for ( i = 0, l = self.length; i < l; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }); + } + + ret = this.pushStack( "", "find", selector ); + + for ( i = 0, l = this.length; i < l; i++ ) { + length = ret.length; + jQuery.find( selector, this[i], ret ); + + if ( i > 0 ) { + // Make sure that the results are unique + for ( n = length; n < ret.length; n++ ) { + for ( r = 0; r < length; r++ ) { + if ( ret[r] === ret[n] ) { + ret.splice(n--, 1); + break; + } + } + } + } + } + + return ret; + }, + + has: function( target ) { + var i, + targets = jQuery( target, this ), + len = targets.length; + + return this.filter(function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + not: function( selector ) { + return this.pushStack( winnow(this, selector, false), "not", selector); + }, + + filter: function( selector ) { + return this.pushStack( winnow(this, selector, true), "filter", selector ); + }, + + is: function( selector ) { + return !!selector && ( + typeof selector === "string" ? + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + rneedsContext.test( selector ) ? + jQuery( selector, this.context ).index( this[0] ) >= 0 : + jQuery.filter( selector, this ).length > 0 : + this.filter( selector ).length > 0 ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + ret = [], + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( ; i < l; i++ ) { + cur = this[i]; + + while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) { + if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { + ret.push( cur ); + break; + } + cur = cur.parentNode; + } + } + + ret = ret.length > 1 ? jQuery.unique( ret ) : ret; + + return this.pushStack( ret, "closest", selectors ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[0], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + var set = typeof selector === "string" ? + jQuery( selector, context ) : + jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), + all = jQuery.merge( this.get(), set ); + + return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? + all : + jQuery.unique( all ) ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter(selector) + ); + } +}); + +jQuery.fn.andSelf = jQuery.fn.addBack; + +// A painfully simple check to see if an element is disconnected +// from a document (should be improved, where feasible). +function isDisconnected( node ) { + return !node || !node.parentNode || node.parentNode.nodeType === 11; +} + +function sibling( cur, dir ) { + do { + cur = cur[ dir ]; + } while ( cur && cur.nodeType !== 1 ); + + return cur; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( !runtil.test( name ) ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; + + if ( this.length > 1 && rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + + return this.pushStack( ret, name, core_slice.call( arguments ).join(",") ); + }; +}); + +jQuery.extend({ + filter: function( expr, elems, not ) { + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 ? + jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : + jQuery.find.matches(expr, elems); + }, + + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, keep ) { + + // Can't pass null or undefined to indexOf in Firefox 4 + // Set to 0 to skip string check + qualifier = qualifier || 0; + + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep(elements, function( elem, i ) { + var retVal = !!qualifier.call( elem, i, elem ); + return retVal === keep; + }); + + } else if ( qualifier.nodeType ) { + return jQuery.grep(elements, function( elem, i ) { + return ( elem === qualifier ) === keep; + }); + + } else if ( typeof qualifier === "string" ) { + var filtered = jQuery.grep(elements, function( elem ) { + return elem.nodeType === 1; + }); + + if ( isSimple.test( qualifier ) ) { + return jQuery.filter(qualifier, filtered, !keep); + } else { + qualifier = jQuery.filter( qualifier, filtered ); + } + } + + return jQuery.grep(elements, function( elem, i ) { + return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep; + }); +} +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + +var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", + rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, + rtagName = /<([\w:]+)/, + rtbody = /<tbody/i, + rhtml = /<|&#?\w+;/, + rnoInnerhtml = /<(?:script|style|link)/i, + rnocache = /<(?:script|object|embed|option|style)/i, + rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"), + rcheckableType = /^(?:checkbox|radio)$/, + // checked="checked" or checked + rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, + rscriptType = /\/(java|ecma)script/i, + rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g, + wrapMap = { + option: [ 1, "<select multiple='multiple'>", "</select>" ], + legend: [ 1, "<fieldset>", "</fieldset>" ], + thead: [ 1, "<table>", "</table>" ], + tr: [ 2, "<table><tbody>", "</tbody></table>" ], + td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ], + col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ], + area: [ 1, "<map>", "</map>" ], + _default: [ 0, "", "" ] + }, + safeFragment = createSafeFragment( document ), + fragmentDiv = safeFragment.appendChild( document.createElement("div") ); + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, +// unless wrapped in a div with non-breaking characters in front of it. +if ( !jQuery.support.htmlSerialize ) { + wrapMap._default = [ 1, "X<div>", "</div>" ]; +} + +jQuery.fn.extend({ + text: function( value ) { + return jQuery.access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) ); + }, null, value, arguments.length ); + }, + + wrapAll: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each(function(i) { + jQuery(this).wrapAll( html.call(this, i) ); + }); + } + + if ( this[0] ) { + // The elements to wrap the target around + var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true); + + if ( this[0].parentNode ) { + wrap.insertBefore( this[0] ); + } + + wrap.map(function() { + var elem = this; + + while ( elem.firstChild && elem.firstChild.nodeType === 1 ) { + elem = elem.firstChild; + } + + return elem; + }).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each(function(i) { + jQuery(this).wrapInner( html.call(this, i) ); + }); + } + + return this.each(function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + }); + }, + + wrap: function( html ) { + var isFunction = jQuery.isFunction( html ); + + return this.each(function(i) { + jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html ); + }); + }, + + unwrap: function() { + return this.parent().each(function() { + if ( !jQuery.nodeName( this, "body" ) ) { + jQuery( this ).replaceWith( this.childNodes ); + } + }).end(); + }, + + append: function() { + return this.domManip(arguments, true, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 ) { + this.appendChild( elem ); + } + }); + }, + + prepend: function() { + return this.domManip(arguments, true, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 ) { + this.insertBefore( elem, this.firstChild ); + } + }); + }, + + before: function() { + if ( !isDisconnected( this[0] ) ) { + return this.domManip(arguments, false, function( elem ) { + this.parentNode.insertBefore( elem, this ); + }); + } + + if ( arguments.length ) { + var set = jQuery.clean( arguments ); + return this.pushStack( jQuery.merge( set, this ), "before", this.selector ); + } + }, + + after: function() { + if ( !isDisconnected( this[0] ) ) { + return this.domManip(arguments, false, function( elem ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + }); + } + + if ( arguments.length ) { + var set = jQuery.clean( arguments ); + return this.pushStack( jQuery.merge( this, set ), "after", this.selector ); + } + }, + + // keepData is for internal use only--do not document + remove: function( selector, keepData ) { + var elem, + i = 0; + + for ( ; (elem = this[i]) != null; i++ ) { + if ( !selector || jQuery.filter( selector, [ elem ] ).length ) { + if ( !keepData && elem.nodeType === 1 ) { + jQuery.cleanData( elem.getElementsByTagName("*") ); + jQuery.cleanData( [ elem ] ); + } + + if ( elem.parentNode ) { + elem.parentNode.removeChild( elem ); + } + } + } + + return this; + }, + + empty: function() { + var elem, + i = 0; + + for ( ; (elem = this[i]) != null; i++ ) { + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( elem.getElementsByTagName("*") ); + } + + // Remove any remaining nodes + while ( elem.firstChild ) { + elem.removeChild( elem.firstChild ); + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function () { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + }); + }, + + html: function( value ) { + return jQuery.access( this, function( value ) { + var elem = this[0] || {}, + i = 0, + l = this.length; + + if ( value === undefined ) { + return elem.nodeType === 1 ? + elem.innerHTML.replace( rinlinejQuery, "" ) : + undefined; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + ( jQuery.support.htmlSerialize || !rnoshimcache.test( value ) ) && + ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && + !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) { + + value = value.replace( rxhtmlTag, "<$1></$2>" ); + + try { + for (; i < l; i++ ) { + // Remove element nodes and prevent memory leaks + elem = this[i] || {}; + if ( elem.nodeType === 1 ) { + jQuery.cleanData( elem.getElementsByTagName( "*" ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch(e) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function( value ) { + if ( !isDisconnected( this[0] ) ) { + // Make sure that the elements are removed from the DOM before they are inserted + // this can help fix replacing a parent with child elements + if ( jQuery.isFunction( value ) ) { + return this.each(function(i) { + var self = jQuery(this), old = self.html(); + self.replaceWith( value.call( this, i, old ) ); + }); + } + + if ( typeof value !== "string" ) { + value = jQuery( value ).detach(); + } + + return this.each(function() { + var next = this.nextSibling, + parent = this.parentNode; + + jQuery( this ).remove(); + + if ( next ) { + jQuery(next).before( value ); + } else { + jQuery(parent).append( value ); + } + }); + } + + return this.length ? + this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) : + this; + }, + + detach: function( selector ) { + return this.remove( selector, true ); + }, + + domManip: function( args, table, callback ) { + + // Flatten any nested arrays + args = [].concat.apply( [], args ); + + var results, first, fragment, iNoClone, + i = 0, + value = args[0], + scripts = [], + l = this.length; + + // We can't cloneNode fragments that contain checked, in WebKit + if ( !jQuery.support.checkClone && l > 1 && typeof value === "string" && rchecked.test( value ) ) { + return this.each(function() { + jQuery(this).domManip( args, table, callback ); + }); + } + + if ( jQuery.isFunction(value) ) { + return this.each(function(i) { + var self = jQuery(this); + args[0] = value.call( this, i, table ? self.html() : undefined ); + self.domManip( args, table, callback ); + }); + } + + if ( this[0] ) { + results = jQuery.buildFragment( args, this, scripts ); + fragment = results.fragment; + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + if ( first ) { + table = table && jQuery.nodeName( first, "tr" ); + + // Use the original fragment for the last item instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + // Fragments from the fragment cache must always be cloned and never used in place. + for ( iNoClone = results.cacheable || l - 1; i < l; i++ ) { + callback.call( + table && jQuery.nodeName( this[i], "table" ) ? + findOrAppend( this[i], "tbody" ) : + this[i], + i === iNoClone ? + fragment : + jQuery.clone( fragment, true, true ) + ); + } + } + + // Fix #11809: Avoid leaking memory + fragment = first = null; + + if ( scripts.length ) { + jQuery.each( scripts, function( i, elem ) { + if ( elem.src ) { + if ( jQuery.ajax ) { + jQuery.ajax({ + url: elem.src, + type: "GET", + dataType: "script", + async: false, + global: false, + "throws": true + }); + } else { + jQuery.error("no ajax"); + } + } else { + jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "" ) ); + } + + if ( elem.parentNode ) { + elem.parentNode.removeChild( elem ); + } + }); + } + } + + return this; + } +}); + +function findOrAppend( elem, tag ) { + return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) ); +} + +function cloneCopyEvent( src, dest ) { + + if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { + return; + } + + var type, i, l, + oldData = jQuery._data( src ), + curData = jQuery._data( dest, oldData ), + events = oldData.events; + + if ( events ) { + delete curData.handle; + curData.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + + // make the cloned public data object a copy from the original + if ( curData.data ) { + curData.data = jQuery.extend( {}, curData.data ); + } +} + +function cloneFixAttributes( src, dest ) { + var nodeName; + + // We do not need to do anything for non-Elements + if ( dest.nodeType !== 1 ) { + return; + } + + // clearAttributes removes the attributes, which we don't want, + // but also removes the attachEvent events, which we *do* want + if ( dest.clearAttributes ) { + dest.clearAttributes(); + } + + // mergeAttributes, in contrast, only merges back on the + // original attributes, not the events + if ( dest.mergeAttributes ) { + dest.mergeAttributes( src ); + } + + nodeName = dest.nodeName.toLowerCase(); + + if ( nodeName === "object" ) { + // IE6-10 improperly clones children of object elements using classid. + // IE10 throws NoModificationAllowedError if parent is null, #12132. + if ( dest.parentNode ) { + dest.outerHTML = src.outerHTML; + } + + // This path appears unavoidable for IE9. When cloning an object + // element in IE9, the outerHTML strategy above is not sufficient. + // If the src has innerHTML and the destination does not, + // copy the src.innerHTML into the dest.innerHTML. #10324 + if ( jQuery.support.html5Clone && (src.innerHTML && !jQuery.trim(dest.innerHTML)) ) { + dest.innerHTML = src.innerHTML; + } + + } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + // IE6-8 fails to persist the checked state of a cloned checkbox + // or radio button. Worse, IE6-7 fail to give the cloned element + // a checked appearance if the defaultChecked value isn't also set + + dest.defaultChecked = dest.checked = src.checked; + + // IE6-7 get confused and end up setting the value of a cloned + // checkbox/radio button to an empty string instead of "on" + if ( dest.value !== src.value ) { + dest.value = src.value; + } + + // IE6-8 fails to return the selected option to the default selected + // state when cloning options + } else if ( nodeName === "option" ) { + dest.selected = src.defaultSelected; + + // IE6-8 fails to set the defaultValue to the correct value when + // cloning other types of input fields + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + + // IE blanks contents when cloning scripts + } else if ( nodeName === "script" && dest.text !== src.text ) { + dest.text = src.text; + } + + // Event data gets referenced instead of copied if the expando + // gets copied too + dest.removeAttribute( jQuery.expando ); +} + +jQuery.buildFragment = function( args, context, scripts ) { + var fragment, cacheable, cachehit, + first = args[ 0 ]; + + // Set context from what may come in as undefined or a jQuery collection or a node + // Updated to fix #12266 where accessing context[0] could throw an exception in IE9/10 & + // also doubles as fix for #8950 where plain objects caused createDocumentFragment exception + context = context || document; + context = !context.nodeType && context[0] || context; + context = context.ownerDocument || context; + + // Only cache "small" (1/2 KB) HTML strings that are associated with the main document + // Cloning options loses the selected state, so don't cache them + // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment + // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache + // Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501 + if ( args.length === 1 && typeof first === "string" && first.length < 512 && context === document && + first.charAt(0) === "<" && !rnocache.test( first ) && + (jQuery.support.checkClone || !rchecked.test( first )) && + (jQuery.support.html5Clone || !rnoshimcache.test( first )) ) { + + // Mark cacheable and look for a hit + cacheable = true; + fragment = jQuery.fragments[ first ]; + cachehit = fragment !== undefined; + } + + if ( !fragment ) { + fragment = context.createDocumentFragment(); + jQuery.clean( args, context, fragment, scripts ); + + // Update the cache, but only store false + // unless this is a second parsing of the same content + if ( cacheable ) { + jQuery.fragments[ first ] = cachehit && fragment; + } + } + + return { fragment: fragment, cacheable: cacheable }; +}; + +jQuery.fragments = {}; + +jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + i = 0, + ret = [], + insert = jQuery( selector ), + l = insert.length, + parent = this.length === 1 && this[0].parentNode; + + if ( (parent == null || parent && parent.nodeType === 11 && parent.childNodes.length === 1) && l === 1 ) { + insert[ original ]( this[0] ); + return this; + } else { + for ( ; i < l; i++ ) { + elems = ( i > 0 ? this.clone(true) : this ).get(); + jQuery( insert[i] )[ original ]( elems ); + ret = ret.concat( elems ); + } + + return this.pushStack( ret, name, insert.selector ); + } + }; +}); + +function getAll( elem ) { + if ( typeof elem.getElementsByTagName !== "undefined" ) { + return elem.getElementsByTagName( "*" ); + + } else if ( typeof elem.querySelectorAll !== "undefined" ) { + return elem.querySelectorAll( "*" ); + + } else { + return []; + } +} + +// Used in clean, fixes the defaultChecked property +function fixDefaultChecked( elem ) { + if ( rcheckableType.test( elem.type ) ) { + elem.defaultChecked = elem.checked; + } +} + +jQuery.extend({ + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var srcElements, + destElements, + i, + clone; + + if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { + clone = elem.cloneNode( true ); + + // IE<=8 does not properly clone detached, unknown element nodes + } else { + fragmentDiv.innerHTML = elem.outerHTML; + fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); + } + + if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) && + (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { + // IE copies events bound via attachEvent when using cloneNode. + // Calling detachEvent on the clone will also remove the events + // from the original. In order to get around this, we use some + // proprietary methods to clear the events. Thanks to MooTools + // guys for this hotness. + + cloneFixAttributes( elem, clone ); + + // Using Sizzle here is crazy slow, so we use getElementsByTagName instead + srcElements = getAll( elem ); + destElements = getAll( clone ); + + // Weird iteration because IE will replace the length property + // with an element if you are cloning the body and one of the + // elements on the page has a name or id of "length" + for ( i = 0; srcElements[i]; ++i ) { + // Ensure that the destination node is not null; Fixes #9587 + if ( destElements[i] ) { + cloneFixAttributes( srcElements[i], destElements[i] ); + } + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + cloneCopyEvent( elem, clone ); + + if ( deepDataAndEvents ) { + srcElements = getAll( elem ); + destElements = getAll( clone ); + + for ( i = 0; srcElements[i]; ++i ) { + cloneCopyEvent( srcElements[i], destElements[i] ); + } + } + } + + srcElements = destElements = null; + + // Return the cloned set + return clone; + }, + + clean: function( elems, context, fragment, scripts ) { + var i, j, elem, tag, wrap, depth, div, hasBody, tbody, len, handleScript, jsTags, + safe = context === document && safeFragment, + ret = []; + + // Ensure that context is a document + if ( !context || typeof context.createDocumentFragment === "undefined" ) { + context = document; + } + + // Use the already-created safe fragment if context permits + for ( i = 0; (elem = elems[i]) != null; i++ ) { + if ( typeof elem === "number" ) { + elem += ""; + } + + if ( !elem ) { + continue; + } + + // Convert html string into DOM nodes + if ( typeof elem === "string" ) { + if ( !rhtml.test( elem ) ) { + elem = context.createTextNode( elem ); + } else { + // Ensure a safe container in which to render the html + safe = safe || createSafeFragment( context ); + div = context.createElement("div"); + safe.appendChild( div ); + + // Fix "XHTML"-style tags in all browsers + elem = elem.replace(rxhtmlTag, "<$1></$2>"); + + // Go to html and back, then peel off extra wrappers + tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + depth = wrap[0]; + div.innerHTML = wrap[1] + elem + wrap[2]; + + // Move to the right depth + while ( depth-- ) { + div = div.lastChild; + } + + // Remove IE's autoinserted <tbody> from table fragments + if ( !jQuery.support.tbody ) { + + // String was a <table>, *may* have spurious <tbody> + hasBody = rtbody.test(elem); + tbody = tag === "table" && !hasBody ? + div.firstChild && div.firstChild.childNodes : + + // String was a bare <thead> or <tfoot> + wrap[1] === "<table>" && !hasBody ? + div.childNodes : + []; + + for ( j = tbody.length - 1; j >= 0 ; --j ) { + if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) { + tbody[ j ].parentNode.removeChild( tbody[ j ] ); + } + } + } + + // IE completely kills leading whitespace when innerHTML is used + if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { + div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild ); + } + + elem = div.childNodes; + + // Take out of fragment container (we need a fresh div each time) + div.parentNode.removeChild( div ); + } + } + + if ( elem.nodeType ) { + ret.push( elem ); + } else { + jQuery.merge( ret, elem ); + } + } + + // Fix #11356: Clear elements from safeFragment + if ( div ) { + elem = div = safe = null; + } + + // Reset defaultChecked for any radios and checkboxes + // about to be appended to the DOM in IE 6/7 (#8060) + if ( !jQuery.support.appendChecked ) { + for ( i = 0; (elem = ret[i]) != null; i++ ) { + if ( jQuery.nodeName( elem, "input" ) ) { + fixDefaultChecked( elem ); + } else if ( typeof elem.getElementsByTagName !== "undefined" ) { + jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked ); + } + } + } + + // Append elements to a provided document fragment + if ( fragment ) { + // Special handling of each script element + handleScript = function( elem ) { + // Check if we consider it executable + if ( !elem.type || rscriptType.test( elem.type ) ) { + // Detach the script and store it in the scripts array (if provided) or the fragment + // Return truthy to indicate that it has been handled + return scripts ? + scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) : + fragment.appendChild( elem ); + } + }; + + for ( i = 0; (elem = ret[i]) != null; i++ ) { + // Check if we're done after handling an executable script + if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) { + // Append to fragment and handle embedded scripts + fragment.appendChild( elem ); + if ( typeof elem.getElementsByTagName !== "undefined" ) { + // handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration + jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript ); + + // Splice the scripts into ret after their former ancestor and advance our index beyond them + ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) ); + i += jsTags.length; + } + } + } + } + + return ret; + }, + + cleanData: function( elems, /* internal */ acceptData ) { + var data, id, elem, type, + i = 0, + internalKey = jQuery.expando, + cache = jQuery.cache, + deleteExpando = jQuery.support.deleteExpando, + special = jQuery.event.special; + + for ( ; (elem = elems[i]) != null; i++ ) { + + if ( acceptData || jQuery.acceptData( elem ) ) { + + id = elem[ internalKey ]; + data = id && cache[ id ]; + + if ( data ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Remove cache only if it was not already removed by jQuery.event.remove + if ( cache[ id ] ) { + + delete cache[ id ]; + + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( deleteExpando ) { + delete elem[ internalKey ]; + + } else if ( elem.removeAttribute ) { + elem.removeAttribute( internalKey ); + + } else { + elem[ internalKey ] = null; + } + + jQuery.deletedIds.push( id ); + } + } + } + } + } +}); +// Limit scope pollution from any deprecated API +(function() { + +var matched, browser; + +// Use of jQuery.browser is frowned upon. +// More details: http://api.jquery.com/jQuery.browser +// jQuery.uaMatch maintained for back-compat +jQuery.uaMatch = function( ua ) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) || + /(webkit)[ \/]([\w.]+)/.exec( ua ) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) || + /(msie) ([\w.]+)/.exec( ua ) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; +}; + +matched = jQuery.uaMatch( navigator.userAgent ); +browser = {}; + +if ( matched.browser ) { + browser[ matched.browser ] = true; + browser.version = matched.version; +} + +// Chrome is Webkit, but Webkit is also Safari. +if ( browser.chrome ) { + browser.webkit = true; +} else if ( browser.webkit ) { + browser.safari = true; +} + +jQuery.browser = browser; + +jQuery.sub = function() { + function jQuerySub( selector, context ) { + return new jQuerySub.fn.init( selector, context ); + } + jQuery.extend( true, jQuerySub, this ); + jQuerySub.superclass = this; + jQuerySub.fn = jQuerySub.prototype = this(); + jQuerySub.fn.constructor = jQuerySub; + jQuerySub.sub = this.sub; + jQuerySub.fn.init = function init( selector, context ) { + if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { + context = jQuerySub( context ); + } + + return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); + }; + jQuerySub.fn.init.prototype = jQuerySub.fn; + var rootjQuerySub = jQuerySub(document); + return jQuerySub; +}; + +})(); +var curCSS, iframe, iframeDoc, + ralpha = /alpha\([^)]*\)/i, + ropacity = /opacity=([^)]*)/, + rposition = /^(top|right|bottom|left)$/, + // swappable if display is none or starts with table except "table", "table-cell", or "table-caption" + // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rmargin = /^margin/, + rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ), + rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ), + rrelNum = new RegExp( "^([-+])=(" + core_pnum + ")", "i" ), + elemdisplay = { BODY: "block" }, + + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: 0, + fontWeight: 400 + }, + + cssExpand = [ "Top", "Right", "Bottom", "Left" ], + cssPrefixes = [ "Webkit", "O", "Moz", "ms" ], + + eventsToggle = jQuery.fn.toggle; + +// return a css property mapped to a potentially vendor prefixed property +function vendorPropName( style, name ) { + + // shortcut for names that are not vendor prefixed + if ( name in style ) { + return name; + } + + // check for vendor prefixed names + var capName = name.charAt(0).toUpperCase() + name.slice(1), + origName = name, + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in style ) { + return name; + } + } + + return origName; +} + +function isHidden( elem, el ) { + elem = el || elem; + return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); +} + +function showHide( elements, show ) { + var elem, display, + values = [], + index = 0, + length = elements.length; + + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + values[ index ] = jQuery._data( elem, "olddisplay" ); + if ( show ) { + // Reset the inline display of this element to learn if it is + // being hidden by cascaded rules or not + if ( !values[ index ] && elem.style.display === "none" ) { + elem.style.display = ""; + } + + // Set elements which have been overridden with display: none + // in a stylesheet to whatever the default browser style is + // for such an element + if ( elem.style.display === "" && isHidden( elem ) ) { + values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) ); + } + } else { + display = curCSS( elem, "display" ); + + if ( !values[ index ] && display !== "none" ) { + jQuery._data( elem, "olddisplay", display ); + } + } + } + + // Set the display of most of the elements in a second loop + // to avoid the constant reflow + for ( index = 0; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + if ( !show || elem.style.display === "none" || elem.style.display === "" ) { + elem.style.display = show ? values[ index ] || "" : "none"; + } + } + + return elements; +} + +jQuery.fn.extend({ + css: function( name, value ) { + return jQuery.access( this, function( elem, name, value ) { + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + }, + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state, fn2 ) { + var bool = typeof state === "boolean"; + + if ( jQuery.isFunction( state ) && jQuery.isFunction( fn2 ) ) { + return eventsToggle.apply( this, arguments ); + } + + return this.each(function() { + if ( bool ? state : isHidden( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + }); + } +}); + +jQuery.extend({ + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + + } + } + } + }, + + // Exclude the following css properties to add px + cssNumber: { + "fillOpacity": true, + "fontWeight": true, + "lineHeight": true, + "opacity": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: { + // normalize float css property + "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat" + }, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = jQuery.camelCase( name ), + style = elem.style; + + name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) ); + + // gets hook for the prefixed version + // followed by the unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // convert relative number strings (+= or -=) to relative numbers. #7345 + if ( type === "string" && (ret = rrelNum.exec( value )) ) { + value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) ); + // Fixes bug #9237 + type = "number"; + } + + // Make sure that NaN and null values aren't set. See: #7116 + if ( value == null || type === "number" && isNaN( value ) ) { + return; + } + + // If a number was passed in, add 'px' to the (except for certain CSS properties) + if ( type === "number" && !jQuery.cssNumber[ origName ] ) { + value += "px"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) { + // Wrapped to prevent IE from throwing errors when 'invalid' values are provided + // Fixes bug #5509 + try { + style[ name ] = value; + } catch(e) {} + } + + } else { + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) { + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, numeric, extra ) { + var val, num, hooks, + origName = jQuery.camelCase( name ); + + // Make sure that we're working with the right name + name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) ); + + // gets hook for the prefixed version + // followed by the unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name ); + } + + //convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Return, converting to number if forced or a qualifier was provided and val looks numeric + if ( numeric || extra !== undefined ) { + num = parseFloat( val ); + return numeric || jQuery.isNumeric( num ) ? num || 0 : val; + } + return val; + }, + + // A method for quickly swapping in/out CSS properties to get correct calculations + swap: function( elem, options, callback ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.call( elem ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; + } +}); + +// NOTE: To any future maintainer, we've window.getComputedStyle +// because jsdom on node.js will break without it. +if ( window.getComputedStyle ) { + curCSS = function( elem, name ) { + var ret, width, minWidth, maxWidth, + computed = window.getComputedStyle( elem, null ), + style = elem.style; + + if ( computed ) { + + // getPropertyValue is only needed for .css('filter') in IE9, see #12537 + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right + // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels + // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values + if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) { + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret; + }; +} else if ( document.documentElement.currentStyle ) { + curCSS = function( elem, name ) { + var left, rsLeft, + ret = elem.currentStyle && elem.currentStyle[ name ], + style = elem.style; + + // Avoid setting ret to empty string here + // so we don't default to auto + if ( ret == null && style && style[ name ] ) { + ret = style[ name ]; + } + + // From the awesome hack by Dean Edwards + // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 + + // If we're not dealing with a regular pixel number + // but a number that has a weird ending, we need to convert it to pixels + // but not position css attributes, as those are proportional to the parent element instead + // and we can't measure the parent instead because it might trigger a "stacking dolls" problem + if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) { + + // Remember the original values + left = style.left; + rsLeft = elem.runtimeStyle && elem.runtimeStyle.left; + + // Put in the new values to get a computed value out + if ( rsLeft ) { + elem.runtimeStyle.left = elem.currentStyle.left; + } + style.left = name === "fontSize" ? "1em" : ret; + ret = style.pixelLeft + "px"; + + // Revert the changed values + style.left = left; + if ( rsLeft ) { + elem.runtimeStyle.left = rsLeft; + } + } + + return ret === "" ? "auto" : ret; + }; +} + +function setPositiveNumber( elem, value, subtract ) { + var matches = rnumsplit.exec( value ); + return matches ? + Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) : + value; +} + +function augmentWidthOrHeight( elem, name, extra, isBorderBox ) { + var i = extra === ( isBorderBox ? "border" : "content" ) ? + // If we already have the right measurement, avoid augmentation + 4 : + // Otherwise initialize for horizontal or vertical properties + name === "width" ? 1 : 0, + + val = 0; + + for ( ; i < 4; i += 2 ) { + // both box models exclude margin, so add it if we want it + if ( extra === "margin" ) { + // we use jQuery.css instead of curCSS here + // because of the reliableMarginRight CSS hook! + val += jQuery.css( elem, extra + cssExpand[ i ], true ); + } + + // From this point on we use curCSS for maximum performance (relevant in animations) + if ( isBorderBox ) { + // border-box includes padding, so remove it if we want content + if ( extra === "content" ) { + val -= parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0; + } + + // at this point, extra isn't border nor margin, so remove border + if ( extra !== "margin" ) { + val -= parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0; + } + } else { + // at this point, extra isn't content, so add padding + val += parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0; + + // at this point, extra isn't content nor padding, so add border + if ( extra !== "padding" ) { + val += parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0; + } + } + } + + return val; +} + +function getWidthOrHeight( elem, name, extra ) { + + // Start with offset property, which is equivalent to the border-box value + var val = name === "width" ? elem.offsetWidth : elem.offsetHeight, + valueIsBorderBox = true, + isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box"; + + // some non-html elements return undefined for offsetWidth, so check for null/undefined + // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285 + // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668 + if ( val <= 0 || val == null ) { + // Fall back to computed then uncomputed css if necessary + val = curCSS( elem, name ); + if ( val < 0 || val == null ) { + val = elem.style[ name ]; + } + + // Computed unit is not pixels. Stop here and return. + if ( rnumnonpx.test(val) ) { + return val; + } + + // we need the check for style in case a browser which returns unreliable values + // for getComputedStyle silently falls back to the reliable elem.style + valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] ); + + // Normalize "", auto, and prepare for extra + val = parseFloat( val ) || 0; + } + + // use the active box-sizing model to add/subtract irrelevant styles + return ( val + + augmentWidthOrHeight( + elem, + name, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox + ) + ) + "px"; +} + + +// Try to determine the default display value of an element +function css_defaultDisplay( nodeName ) { + if ( elemdisplay[ nodeName ] ) { + return elemdisplay[ nodeName ]; + } + + var elem = jQuery( "<" + nodeName + ">" ).appendTo( document.body ), + display = elem.css("display"); + elem.remove(); + + // If the simple way fails, + // get element's real default display by attaching it to a temp iframe + if ( display === "none" || display === "" ) { + // Use the already-created iframe if possible + iframe = document.body.appendChild( + iframe || jQuery.extend( document.createElement("iframe"), { + frameBorder: 0, + width: 0, + height: 0 + }) + ); + + // Create a cacheable copy of the iframe document on first call. + // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML + // document to it; WebKit & Firefox won't allow reusing the iframe document. + if ( !iframeDoc || !iframe.createElement ) { + iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document; + iframeDoc.write("<!doctype html><html><body>"); + iframeDoc.close(); + } + + elem = iframeDoc.body.appendChild( iframeDoc.createElement(nodeName) ); + + display = curCSS( elem, "display" ); + document.body.removeChild( iframe ); + } + + // Store the correct default display + elemdisplay[ nodeName ] = display; + + return display; +} + +jQuery.each([ "height", "width" ], function( i, name ) { + jQuery.cssHooks[ name ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + // certain elements can have dimension info if we invisibly show them + // however, it must have a current display style that would benefit from this + if ( elem.offsetWidth === 0 && rdisplayswap.test( curCSS( elem, "display" ) ) ) { + return jQuery.swap( elem, cssShow, function() { + return getWidthOrHeight( elem, name, extra ); + }); + } else { + return getWidthOrHeight( elem, name, extra ); + } + } + }, + + set: function( elem, value, extra ) { + return setPositiveNumber( elem, value, extra ? + augmentWidthOrHeight( + elem, + name, + extra, + jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box" + ) : 0 + ); + } + }; +}); + +if ( !jQuery.support.opacity ) { + jQuery.cssHooks.opacity = { + get: function( elem, computed ) { + // IE uses filters for opacity + return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ? + ( 0.01 * parseFloat( RegExp.$1 ) ) + "" : + computed ? "1" : ""; + }, + + set: function( elem, value ) { + var style = elem.style, + currentStyle = elem.currentStyle, + opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "", + filter = currentStyle && currentStyle.filter || style.filter || ""; + + // IE has trouble with opacity if it does not have layout + // Force it by setting the zoom level + style.zoom = 1; + + // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652 + if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" && + style.removeAttribute ) { + + // Setting style.filter to null, "" & " " still leave "filter:" in the cssText + // if "filter:" is present at all, clearType is disabled, we want to avoid this + // style.removeAttribute is IE Only, but so apparently is this code path... + style.removeAttribute( "filter" ); + + // if there there is no filter style applied in a css rule, we are done + if ( currentStyle && !currentStyle.filter ) { + return; + } + } + + // otherwise, set new filter values + style.filter = ralpha.test( filter ) ? + filter.replace( ralpha, opacity ) : + filter + " " + opacity; + } + }; +} + +// These hooks cannot be added until DOM ready because the support test +// for it is not run until after DOM ready +jQuery(function() { + if ( !jQuery.support.reliableMarginRight ) { + jQuery.cssHooks.marginRight = { + get: function( elem, computed ) { + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + // Work around by temporarily setting element display to inline-block + return jQuery.swap( elem, { "display": "inline-block" }, function() { + if ( computed ) { + return curCSS( elem, "marginRight" ); + } + }); + } + }; + } + + // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084 + // getComputedStyle returns percent when specified for top/left/bottom/right + // rather than make the css module depend on the offset module, we just check for it here + if ( !jQuery.support.pixelPosition && jQuery.fn.position ) { + jQuery.each( [ "top", "left" ], function( i, prop ) { + jQuery.cssHooks[ prop ] = { + get: function( elem, computed ) { + if ( computed ) { + var ret = curCSS( elem, prop ); + // if curCSS returns percentage, fallback to offset + return rnumnonpx.test( ret ) ? jQuery( elem ).position()[ prop ] + "px" : ret; + } + } + }; + }); + } + +}); + +if ( jQuery.expr && jQuery.expr.filters ) { + jQuery.expr.filters.hidden = function( elem ) { + return ( elem.offsetWidth === 0 && elem.offsetHeight === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || curCSS( elem, "display" )) === "none"); + }; + + jQuery.expr.filters.visible = function( elem ) { + return !jQuery.expr.filters.hidden( elem ); + }; +} + +// These hooks are used by animate to expand properties +jQuery.each({ + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i, + + // assumes a single number if not a string + parts = typeof value === "string" ? value.split(" ") : [ value ], + expanded = {}; + + for ( i = 0; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( !rmargin.test( prefix ) ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +}); +var r20 = /%20/g, + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i, + rselectTextarea = /^(?:select|textarea)/i; + +jQuery.fn.extend({ + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map(function(){ + return this.elements ? jQuery.makeArray( this.elements ) : this; + }) + .filter(function(){ + return this.name && !this.disabled && + ( this.checked || rselectTextarea.test( this.nodeName ) || + rinput.test( this.type ) ); + }) + .map(function( i, elem ){ + var val = jQuery( this ).val(); + + return val == null ? + null : + jQuery.isArray( val ) ? + jQuery.map( val, function( val, i ){ + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + }) : + { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + }).get(); + } +}); + +//Serialize an array of form elements or a set of +//key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, value ) { + // If value is a function, invoke it and return its value + value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value ); + s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value ); + }; + + // Set traditional to true for jQuery <= 1.3.2 behavior. + if ( traditional === undefined ) { + traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional; + } + + // If an array was passed in, assume that it is an array of form elements. + if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + }); + + } else { + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ).replace( r20, "+" ); +}; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( jQuery.isArray( obj ) ) { + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + // If array item is non-scalar (array or object), encode its + // numeric index to resolve deserialization ambiguity issues. + // Note that rack (as of 1.0.0) can't currently deserialize + // nested arrays properly, and attempting to do so may cause + // a server error. Possible fixes are to modify rack's + // deserialization algorithm or to provide an option or flag + // to force array serialization to be shallow. + buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add ); + } + }); + + } else if ( !traditional && jQuery.type( obj ) === "object" ) { + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + // Serialize scalar item. + add( prefix, obj ); + } +} +var + // Document location + ajaxLocParts, + ajaxLocation, + + rhash = /#.*$/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + rquery = /\?/, + rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, + rts = /([?&])_=[^&]*/, + rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/, + + // Keep a copy of the old load method + _load = jQuery.fn.load, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = ["*/"] + ["*"]; + +// #8138, IE may throw an exception when accessing +// a field from window.location if document.domain has been set +try { + ajaxLocation = location.href; +} catch( e ) { + // Use the href attribute of an A element + // since IE will modify it given document.location + ajaxLocation = document.createElement( "a" ); + ajaxLocation.href = ""; + ajaxLocation = ajaxLocation.href; +} + +// Segment location into parts +ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || []; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, list, placeBefore, + dataTypes = dataTypeExpression.toLowerCase().split( core_rspace ), + i = 0, + length = dataTypes.length; + + if ( jQuery.isFunction( func ) ) { + // For each dataType in the dataTypeExpression + for ( ; i < length; i++ ) { + dataType = dataTypes[ i ]; + // We control if we're asked to add before + // any existing element + placeBefore = /^\+/.test( dataType ); + if ( placeBefore ) { + dataType = dataType.substr( 1 ) || "*"; + } + list = structure[ dataType ] = structure[ dataType ] || []; + // then we add to the structure accordingly + list[ placeBefore ? "unshift" : "push" ]( func ); + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR, + dataType /* internal */, inspected /* internal */ ) { + + dataType = dataType || options.dataTypes[ 0 ]; + inspected = inspected || {}; + + inspected[ dataType ] = true; + + var selection, + list = structure[ dataType ], + i = 0, + length = list ? list.length : 0, + executeOnly = ( structure === prefilters ); + + for ( ; i < length && ( executeOnly || !selection ); i++ ) { + selection = list[ i ]( options, originalOptions, jqXHR ); + // If we got redirected to another dataType + // we try there if executing only and not done already + if ( typeof selection === "string" ) { + if ( !executeOnly || inspected[ selection ] ) { + selection = undefined; + } else { + options.dataTypes.unshift( selection ); + selection = inspectPrefiltersOrTransports( + structure, options, originalOptions, jqXHR, selection, inspected ); + } + } + } + // If we're only executing or nothing was selected + // we try the catchall dataType if not done already + if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) { + selection = inspectPrefiltersOrTransports( + structure, options, originalOptions, jqXHR, "*", inspected ); + } + // unnecessary when only executing (prefilters) + // but it'll be ignored by the caller in that case + return selection; +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } +} + +jQuery.fn.load = function( url, params, callback ) { + if ( typeof url !== "string" && _load ) { + return _load.apply( this, arguments ); + } + + // Don't do a request if no elements are being requested + if ( !this.length ) { + return this; + } + + var selector, type, response, + self = this, + off = url.indexOf(" "); + + if ( off >= 0 ) { + selector = url.slice( off, url.length ); + url = url.slice( 0, off ); + } + + // If it's a function + if ( jQuery.isFunction( params ) ) { + + // We assume that it's the callback + callback = params; + params = undefined; + + // Otherwise, build a param string + } else if ( params && typeof params === "object" ) { + type = "POST"; + } + + // Request the remote document + jQuery.ajax({ + url: url, + + // if "type" variable is undefined, then "GET" method will be used + type: type, + dataType: "html", + data: params, + complete: function( jqXHR, status ) { + if ( callback ) { + self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] ); + } + } + }).done(function( responseText ) { + + // Save response for use in complete callback + response = arguments; + + // See if a selector was specified + self.html( selector ? + + // Create a dummy div to hold the results + jQuery("<div>") + + // inject the contents of the document in, removing the scripts + // to avoid any 'Permission Denied' errors in IE + .append( responseText.replace( rscript, "" ) ) + + // Locate the specified elements + .find( selector ) : + + // If not, just inject the full result + responseText ); + + }); + + return this; +}; + +// Attach a bunch of functions for handling common AJAX events +jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){ + jQuery.fn[ o ] = function( f ){ + return this.on( o, f ); + }; +}); + +jQuery.each( [ "get", "post" ], function( i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + // shift arguments if data argument was omitted + if ( jQuery.isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + return jQuery.ajax({ + type: method, + url: url, + data: data, + success: callback, + dataType: type + }); + }; +}); + +jQuery.extend({ + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + if ( settings ) { + // Building a settings object + ajaxExtend( target, jQuery.ajaxSettings ); + } else { + // Extending ajaxSettings + settings = target; + target = jQuery.ajaxSettings; + } + ajaxExtend( target, settings ); + return target; + }, + + ajaxSettings: { + url: ajaxLocation, + isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ), + global: true, + type: "GET", + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + processData: true, + async: true, + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + xml: "application/xml, text/xml", + html: "text/html", + text: "text/plain", + json: "application/json, text/javascript", + "*": allTypes + }, + + contents: { + xml: /xml/, + html: /html/, + json: /json/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText" + }, + + // List of data converters + // 1) key format is "source_type destination_type" (a single space in-between) + // 2) the catchall symbol "*" can be used for source_type + converters: { + + // Convert anything to text + "* text": window.String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": jQuery.parseJSON, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + context: true, + url: true + } + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var // ifModified key + ifModifiedKey, + // Response headers + responseHeadersString, + responseHeaders, + // transport + transport, + // timeout handle + timeoutTimer, + // Cross-domain detection vars + parts, + // To know if global events are to be dispatched + fireGlobals, + // Loop variable + i, + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + // Callbacks context + callbackContext = s.context || s, + // Context for global events + // It's the callbackContext if one was provided in the options + // and if it's a DOM node or a jQuery collection + globalEventContext = callbackContext !== s && + ( callbackContext.nodeType || callbackContext instanceof jQuery ) ? + jQuery( callbackContext ) : jQuery.event, + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + // Status-dependent callbacks + statusCode = s.statusCode || {}, + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + // The jqXHR state + state = 0, + // Default abort message + strAbort = "canceled", + // Fake xhr + jqXHR = { + + readyState: 0, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( !state ) { + var lname = name.toLowerCase(); + name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Raw string + getAllResponseHeaders: function() { + return state === 2 ? responseHeadersString : null; + }, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( state === 2 ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[1].toLowerCase() ] = match[ 2 ]; + } + } + match = responseHeaders[ key.toLowerCase() ]; + } + return match === undefined ? null : match; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( !state ) { + s.mimeType = type; + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + statusText = statusText || strAbort; + if ( transport ) { + transport.abort( statusText ); + } + done( 0, statusText ); + return this; + } + }; + + // Callback for when everything is done + // It is defined here because jslint complains if it is declared + // at the end of the function (which would be more logical and readable) + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Called once + if ( state === 2 ) { + return; + } + + // State is "done" now + state = 2; + + // Clear timeout if it exists + if ( timeoutTimer ) { + clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // If successful, handle type chaining + if ( status >= 200 && status < 300 || status === 304 ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + + modified = jqXHR.getResponseHeader("Last-Modified"); + if ( modified ) { + jQuery.lastModified[ ifModifiedKey ] = modified; + } + modified = jqXHR.getResponseHeader("Etag"); + if ( modified ) { + jQuery.etag[ ifModifiedKey ] = modified; + } + } + + // If not modified + if ( status === 304 ) { + + statusText = "notmodified"; + isSuccess = true; + + // If we have data + } else { + + isSuccess = ajaxConvert( s, response ); + statusText = isSuccess.state; + success = isSuccess.data; + error = isSuccess.error; + isSuccess = !error; + } + } else { + // We extract error from statusText + // then normalize statusText and status for non-aborts + error = statusText; + if ( !statusText || status ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ), + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + // Attach deferreds + deferred.promise( jqXHR ); + jqXHR.success = jqXHR.done; + jqXHR.error = jqXHR.fail; + jqXHR.complete = completeDeferred.add; + + // Status-dependent callbacks + jqXHR.statusCode = function( map ) { + if ( map ) { + var tmp; + if ( state < 2 ) { + for ( tmp in map ) { + statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ]; + } + } else { + tmp = map[ jqXHR.status ]; + jqXHR.always( tmp ); + } + } + return this; + }; + + // Remove hash character (#7531: and string promotion) + // Add protocol if not provided (#5866: IE7 issue with protocol-less urls) + // We also use the url parameter if available + s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" ); + + // Extract dataTypes list + s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( core_rspace ); + + // A cross-domain request is in order when we have a protocol:host:port mismatch + if ( s.crossDomain == null ) { + parts = rurl.exec( s.url.toLowerCase() ); + s.crossDomain = !!( parts && + ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] || + ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) != + ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) ) + ); + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( state === 2 ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + fireGlobals = s.global; + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // If data is available, append data to url + if ( s.data ) { + s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data; + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Get ifModifiedKey before adding the anti-cache parameter + ifModifiedKey = s.url; + + // Add anti-cache in url if needed + if ( s.cache === false ) { + + var ts = jQuery.now(), + // try replacing _= if it is there + ret = s.url.replace( rts, "$1_=" + ts ); + + // if nothing was replaced, add timestamp to the end + s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + ifModifiedKey = ifModifiedKey || s.url; + if ( jQuery.lastModified[ ifModifiedKey ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] ); + } + if ( jQuery.etag[ ifModifiedKey ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] ); + } + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ? + s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) { + // Abort if not done already and return + return jqXHR.abort(); + + } + + // aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + for ( i in { success: 1, error: 1, complete: 1 } ) { + jqXHR[ i ]( s[ i ] ); + } + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = setTimeout( function(){ + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + state = 1; + transport.send( requestHeaders, done ); + } catch (e) { + // Propagate exception as error if not done + if ( state < 2 ) { + done( -1, e ); + // Simply rethrow otherwise + } else { + throw e; + } + } + } + + return jqXHR; + }, + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {} + +}); + +/* Handles responses to an ajax request: + * - sets all responseXXX fields accordingly + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes, + responseFields = s.responseFields; + + // Fill responseXXX fields + for ( type in responseFields ) { + if ( type in responses ) { + jqXHR[ responseFields[type] ] = responses[ type ]; + } + } + + // Remove auto dataType and get content-type in the process + while( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "content-type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +// Chain conversions given the request and the original response +function ajaxConvert( s, response ) { + + var conv, conv2, current, tmp, + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(), + prev = dataTypes[ 0 ], + converters = {}, + i = 0; + + // Apply the dataFilter if provided + if ( s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + // Convert to each sequential dataType, tolerating list modification + for ( ; (current = dataTypes[++i]); ) { + + // There's only work to do if current dataType is non-auto + if ( current !== "*" ) { + + // Convert response if prev dataType is non-auto and differs from current + if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split(" "); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.splice( i--, 0, current ); + } + + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s["throws"] ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current }; + } + } + } + } + + // Update prev for next iteration + prev = current; + } + } + + return { state: "success", data: response }; +} +var oldCallbacks = [], + rquestion = /\?/, + rjsonp = /(=)\?(?=&|$)|\?\?/, + nonce = jQuery.now(); + +// Default jsonp settings +jQuery.ajaxSetup({ + jsonp: "callback", + jsonpCallback: function() { + var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) ); + this[ callback ] = true; + return callback; + } +}); + +// Detect, normalize options and install callbacks for jsonp requests +jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { + + var callbackName, overwritten, responseContainer, + data = s.data, + url = s.url, + hasCallback = s.jsonp !== false, + replaceInUrl = hasCallback && rjsonp.test( url ), + replaceInData = hasCallback && !replaceInUrl && typeof data === "string" && + !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && + rjsonp.test( data ); + + // Handle iff the expected data type is "jsonp" or we have a parameter to set + if ( s.dataTypes[ 0 ] === "jsonp" || replaceInUrl || replaceInData ) { + + // Get callback name, remembering preexisting value associated with it + callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ? + s.jsonpCallback() : + s.jsonpCallback; + overwritten = window[ callbackName ]; + + // Insert callback into url or form data + if ( replaceInUrl ) { + s.url = url.replace( rjsonp, "$1" + callbackName ); + } else if ( replaceInData ) { + s.data = data.replace( rjsonp, "$1" + callbackName ); + } else if ( hasCallback ) { + s.url += ( rquestion.test( url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName; + } + + // Use data converter to retrieve json after script execution + s.converters["script json"] = function() { + if ( !responseContainer ) { + jQuery.error( callbackName + " was not called" ); + } + return responseContainer[ 0 ]; + }; + + // force json dataType + s.dataTypes[ 0 ] = "json"; + + // Install callback + window[ callbackName ] = function() { + responseContainer = arguments; + }; + + // Clean-up function (fires after converters) + jqXHR.always(function() { + // Restore preexisting value + window[ callbackName ] = overwritten; + + // Save back as free + if ( s[ callbackName ] ) { + // make sure that re-using the options doesn't screw things around + s.jsonpCallback = originalSettings.jsonpCallback; + + // save the callback name for future use + oldCallbacks.push( callbackName ); + } + + // Call if it was a function and we have a response + if ( responseContainer && jQuery.isFunction( overwritten ) ) { + overwritten( responseContainer[ 0 ] ); + } + + responseContainer = overwritten = undefined; + }); + + // Delegate to script + return "script"; + } +}); +// Install script dataType +jQuery.ajaxSetup({ + accepts: { + script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /javascript|ecmascript/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +}); + +// Handle cache's special case and global +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + s.global = false; + } +}); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function(s) { + + // This transport only deals with cross domain requests + if ( s.crossDomain ) { + + var script, + head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement; + + return { + + send: function( _, callback ) { + + script = document.createElement( "script" ); + + script.async = "async"; + + if ( s.scriptCharset ) { + script.charset = s.scriptCharset; + } + + script.src = s.url; + + // Attach handlers for all browsers + script.onload = script.onreadystatechange = function( _, isAbort ) { + + if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) { + + // Handle memory leak in IE + script.onload = script.onreadystatechange = null; + + // Remove the script + if ( head && script.parentNode ) { + head.removeChild( script ); + } + + // Dereference the script + script = undefined; + + // Callback if not abort + if ( !isAbort ) { + callback( 200, "success" ); + } + } + }; + // Use insertBefore instead of appendChild to circumvent an IE6 bug. + // This arises when a base node is used (#2709 and #4378). + head.insertBefore( script, head.firstChild ); + }, + + abort: function() { + if ( script ) { + script.onload( 0, 1 ); + } + } + }; + } +}); +var xhrCallbacks, + // #5280: Internet Explorer will keep connections alive if we don't abort on unload + xhrOnUnloadAbort = window.ActiveXObject ? function() { + // Abort all pending requests + for ( var key in xhrCallbacks ) { + xhrCallbacks[ key ]( 0, 1 ); + } + } : false, + xhrId = 0; + +// Functions to create xhrs +function createStandardXHR() { + try { + return new window.XMLHttpRequest(); + } catch( e ) {} +} + +function createActiveXHR() { + try { + return new window.ActiveXObject( "Microsoft.XMLHTTP" ); + } catch( e ) {} +} + +// Create the request object +// (This is still attached to ajaxSettings for backward compatibility) +jQuery.ajaxSettings.xhr = window.ActiveXObject ? + /* Microsoft failed to properly + * implement the XMLHttpRequest in IE7 (can't request local files), + * so we use the ActiveXObject when it is available + * Additionally XMLHttpRequest can be disabled in IE7/IE8 so + * we need a fallback. + */ + function() { + return !this.isLocal && createStandardXHR() || createActiveXHR(); + } : + // For all other browsers, use the standard XMLHttpRequest object + createStandardXHR; + +// Determine support properties +(function( xhr ) { + jQuery.extend( jQuery.support, { + ajax: !!xhr, + cors: !!xhr && ( "withCredentials" in xhr ) + }); +})( jQuery.ajaxSettings.xhr() ); + +// Create transport if the browser can provide an xhr +if ( jQuery.support.ajax ) { + + jQuery.ajaxTransport(function( s ) { + // Cross domain only allowed if supported through XMLHttpRequest + if ( !s.crossDomain || jQuery.support.cors ) { + + var callback; + + return { + send: function( headers, complete ) { + + // Get a new xhr + var handle, i, + xhr = s.xhr(); + + // Open the socket + // Passing null username, generates a login popup on Opera (#2865) + if ( s.username ) { + xhr.open( s.type, s.url, s.async, s.username, s.password ); + } else { + xhr.open( s.type, s.url, s.async ); + } + + // Apply custom fields if provided + if ( s.xhrFields ) { + for ( i in s.xhrFields ) { + xhr[ i ] = s.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( s.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( s.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !s.crossDomain && !headers["X-Requested-With"] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Need an extra try/catch for cross domain requests in Firefox 3 + try { + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + } catch( _ ) {} + + // Do send the request + // This may raise an exception which is actually + // handled in jQuery.ajax (so no try/catch here) + xhr.send( ( s.hasContent && s.data ) || null ); + + // Listener + callback = function( _, isAbort ) { + + var status, + statusText, + responseHeaders, + responses, + xml; + + // Firefox throws exceptions when accessing properties + // of an xhr when a network error occurred + // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE) + try { + + // Was never called and is aborted or complete + if ( callback && ( isAbort || xhr.readyState === 4 ) ) { + + // Only called once + callback = undefined; + + // Do not keep as active anymore + if ( handle ) { + xhr.onreadystatechange = jQuery.noop; + if ( xhrOnUnloadAbort ) { + delete xhrCallbacks[ handle ]; + } + } + + // If it's an abort + if ( isAbort ) { + // Abort it manually if needed + if ( xhr.readyState !== 4 ) { + xhr.abort(); + } + } else { + status = xhr.status; + responseHeaders = xhr.getAllResponseHeaders(); + responses = {}; + xml = xhr.responseXML; + + // Construct response list + if ( xml && xml.documentElement /* #4958 */ ) { + responses.xml = xml; + } + + // When requesting binary data, IE6-9 will throw an exception + // on any attempt to access responseText (#11426) + try { + responses.text = xhr.responseText; + } catch( e ) { + } + + // Firefox throws an exception when accessing + // statusText for faulty cross-domain requests + try { + statusText = xhr.statusText; + } catch( e ) { + // We normalize with Webkit giving an empty statusText + statusText = ""; + } + + // Filter status for non standard behaviors + + // If the request is local and we have data: assume a success + // (success with no data won't get notified, that's the best we + // can do given current implementations) + if ( !status && s.isLocal && !s.crossDomain ) { + status = responses.text ? 200 : 404; + // IE - #1450: sometimes returns 1223 when it should be 204 + } else if ( status === 1223 ) { + status = 204; + } + } + } + } catch( firefoxAccessException ) { + if ( !isAbort ) { + complete( -1, firefoxAccessException ); + } + } + + // Call complete if needed + if ( responses ) { + complete( status, statusText, responses, responseHeaders ); + } + }; + + if ( !s.async ) { + // if we're in sync mode we fire the callback + callback(); + } else if ( xhr.readyState === 4 ) { + // (IE6 & IE7) if it's in cache and has been + // retrieved directly we need to fire the callback + setTimeout( callback, 0 ); + } else { + handle = ++xhrId; + if ( xhrOnUnloadAbort ) { + // Create the active xhrs callbacks list if needed + // and attach the unload handler + if ( !xhrCallbacks ) { + xhrCallbacks = {}; + jQuery( window ).unload( xhrOnUnloadAbort ); + } + // Add to list of active xhrs callbacks + xhrCallbacks[ handle ] = callback; + } + xhr.onreadystatechange = callback; + } + }, + + abort: function() { + if ( callback ) { + callback(0,1); + } + } + }; + } + }); +} +var fxNow, timerId, + rfxtypes = /^(?:toggle|show|hide)$/, + rfxnum = new RegExp( "^(?:([-+])=|)(" + core_pnum + ")([a-z%]*)$", "i" ), + rrun = /queueHooks$/, + animationPrefilters = [ defaultPrefilter ], + tweeners = { + "*": [function( prop, value ) { + var end, unit, + tween = this.createTween( prop, value ), + parts = rfxnum.exec( value ), + target = tween.cur(), + start = +target || 0, + scale = 1, + maxIterations = 20; + + if ( parts ) { + end = +parts[2]; + unit = parts[3] || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + + // We need to compute starting value + if ( unit !== "px" && start ) { + // Iteratively approximate from a nonzero starting point + // Prefer the current property, because this process will be trivial if it uses the same units + // Fallback to end or a simple constant + start = jQuery.css( tween.elem, prop, true ) || end || 1; + + do { + // If previous iteration zeroed out, double until we get *something* + // Use a string for doubling factor so we don't accidentally see scale as unchanged below + scale = scale || ".5"; + + // Adjust and apply + start = start / scale; + jQuery.style( tween.elem, prop, start + unit ); + + // Update scale, tolerating zero or NaN from tween.cur() + // And breaking the loop if scale is unchanged or perfect, or if we've just had enough + } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations ); + } + + tween.unit = unit; + tween.start = start; + // If a +=/-= token was provided, we're doing a relative animation + tween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end; + } + return tween; + }] + }; + +// Animations created synchronously will run synchronously +function createFxNow() { + setTimeout(function() { + fxNow = undefined; + }, 0 ); + return ( fxNow = jQuery.now() ); +} + +function createTweens( animation, props ) { + jQuery.each( props, function( prop, value ) { + var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( collection[ index ].call( animation, prop, value ) ) { + + // we're done with this property + return; + } + } + }); +} + +function Animation( elem, properties, options ) { + var result, + index = 0, + tweenerIndex = 0, + length = animationPrefilters.length, + deferred = jQuery.Deferred().always( function() { + // don't match elem in the :animated selector + delete tick.elem; + }), + tick = function() { + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length ; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ]); + + if ( percent < 1 && length ) { + return remaining; + } else { + deferred.resolveWith( elem, [ animation ] ); + return false; + } + }, + animation = deferred.promise({ + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { specialEasing: {} }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end, easing ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + // if we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + + for ( ; index < length ; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // resolve when we played the last frame + // otherwise, reject + if ( gotoEnd ) { + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + }), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length ; index++ ) { + result = animationPrefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + return result; + } + } + + createTweens( animation, props ); + + if ( jQuery.isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + jQuery.fx.timer( + jQuery.extend( tick, { + anim: animation, + queue: animation.opts.queue, + elem: elem + }) + ); + + // attach callbacks from options + return animation.progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = jQuery.camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( jQuery.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // not quite $.extend, this wont overwrite keys already present. + // also - reusing 'index' from above because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweener: function( props, callback ) { + if ( jQuery.isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.split(" "); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length ; index++ ) { + prop = props[ index ]; + tweeners[ prop ] = tweeners[ prop ] || []; + tweeners[ prop ].unshift( callback ); + } + }, + + prefilter: function( callback, prepend ) { + if ( prepend ) { + animationPrefilters.unshift( callback ); + } else { + animationPrefilters.push( callback ); + } + } +}); + +function defaultPrefilter( elem, props, opts ) { + var index, prop, value, length, dataShow, toggle, tween, hooks, oldfire, + anim = this, + style = elem.style, + orig = {}, + handled = [], + hidden = elem.nodeType && isHidden( elem ); + + // handle queue: false promises + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always(function() { + // doing this makes sure that the complete handler will be called + // before this completes + anim.always(function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + }); + }); + } + + // height/width overflow pass + if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) { + // Make sure that nothing sneaks out + // Record all 3 overflow attributes because IE does not + // change the overflow attribute when overflowX and + // overflowY are set to the same value + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Set display property to inline-block for height/width + // animations on inline elements that are having width/height animated + if ( jQuery.css( elem, "display" ) === "inline" && + jQuery.css( elem, "float" ) === "none" ) { + + // inline-level elements accept inline-block; + // block-level elements need to be inline with layout + if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) { + style.display = "inline-block"; + + } else { + style.zoom = 1; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + if ( !jQuery.support.shrinkWrapBlocks ) { + anim.done(function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + }); + } + } + + + // show/hide pass + for ( index in props ) { + value = props[ index ]; + if ( rfxtypes.exec( value ) ) { + delete props[ index ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + continue; + } + handled.push( index ); + } + } + + length = handled.length; + if ( length ) { + dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} ); + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + + // store state if its toggle - enables .stop().toggle() to "reverse" + if ( toggle ) { + dataShow.hidden = !hidden; + } + if ( hidden ) { + jQuery( elem ).show(); + } else { + anim.done(function() { + jQuery( elem ).hide(); + }); + } + anim.done(function() { + var prop; + jQuery.removeData( elem, "fxshow", true ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + }); + for ( index = 0 ; index < length ; index++ ) { + prop = handled[ index ]; + tween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 ); + orig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop ); + + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = tween.start; + if ( hidden ) { + tween.end = tween.start; + tween.start = prop === "width" || prop === "height" ? 1 : 0; + } + } + } + } +} + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || "swing"; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + if ( tween.elem[ tween.prop ] != null && + (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) { + return tween.elem[ tween.prop ]; + } + + // passing any value as a 4th parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails + // so, simple values such as "10px" are parsed to Float. + // complex values such as "rotate(1rad)" are returned as is. + result = jQuery.css( tween.elem, tween.prop, false, "" ); + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + // use step hook for back compat - use cssHook if its there - use .style if its + // available and use plain properties where available + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Remove in 2.0 - this supports IE8's panic based approach +// to setting things on disconnected nodes + +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.each([ "toggle", "show", "hide" ], function( i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" || + // special check for .toggle( handler, handler, ... ) + ( !i && jQuery.isFunction( speed ) && jQuery.isFunction( easing ) ) ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +}); + +jQuery.fn.extend({ + fadeTo: function( speed, to, easing, callback ) { + + // show any hidden elements after setting opacity to 0 + return this.filter( isHidden ).css( "opacity", 0 ).show() + + // animate to the value specified + .end().animate({ opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations resolve immediately + if ( empty ) { + anim.stop( true ); + } + }; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue && type !== false ) { + this.queue( type || "fx", [] ); + } + + return this.each(function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = jQuery._data( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) { + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // start the next in the queue if the last step wasn't forced + // timers currently will call their complete callbacks, which will dequeue + // but only if they were gotoEnd + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + }); + } +}); + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + attrs = { height: type }, + i = 0; + + // if we include width, step value is 1 to do all cssExpand values, + // if we don't include width, step value is 2 to skip over Left and Right + includeWidth = includeWidth? 1 : 0; + for( ; i < 4 ; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +// Generate shortcuts for custom animations +jQuery.each({ + slideDown: genFx("show"), + slideUp: genFx("hide"), + slideToggle: genFx("toggle"), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +}); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + jQuery.isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing + }; + + opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration : + opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default; + + // normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( jQuery.isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p*Math.PI ) / 2; + } +}; + +jQuery.timers = []; +jQuery.fx = Tween.prototype.init; +jQuery.fx.tick = function() { + var timer, + timers = jQuery.timers, + i = 0; + + fxNow = jQuery.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + // Checks the timer has not already been removed + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + if ( timer() && jQuery.timers.push( timer ) && !timerId ) { + timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval ); + } +}; + +jQuery.fx.interval = 13; + +jQuery.fx.stop = function() { + clearInterval( timerId ); + timerId = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + // Default speed + _default: 400 +}; + +// Back Compat <1.8 extension point +jQuery.fx.step = {}; + +if ( jQuery.expr && jQuery.expr.filters ) { + jQuery.expr.filters.animated = function( elem ) { + return jQuery.grep(jQuery.timers, function( fn ) { + return elem === fn.elem; + }).length; + }; +} +var rroot = /^(?:body|html)$/i; + +jQuery.fn.offset = function( options ) { + if ( arguments.length ) { + return options === undefined ? + this : + this.each(function( i ) { + jQuery.offset.setOffset( this, options, i ); + }); + } + + var docElem, body, win, clientTop, clientLeft, scrollTop, scrollLeft, + box = { top: 0, left: 0 }, + elem = this[ 0 ], + doc = elem && elem.ownerDocument; + + if ( !doc ) { + return; + } + + if ( (body = doc.body) === elem ) { + return jQuery.offset.bodyOffset( elem ); + } + + docElem = doc.documentElement; + + // Make sure it's not a disconnected DOM node + if ( !jQuery.contains( docElem, elem ) ) { + return box; + } + + // If we don't have gBCR, just use 0,0 rather than error + // BlackBerry 5, iOS 3 (original iPhone) + if ( typeof elem.getBoundingClientRect !== "undefined" ) { + box = elem.getBoundingClientRect(); + } + win = getWindow( doc ); + clientTop = docElem.clientTop || body.clientTop || 0; + clientLeft = docElem.clientLeft || body.clientLeft || 0; + scrollTop = win.pageYOffset || docElem.scrollTop; + scrollLeft = win.pageXOffset || docElem.scrollLeft; + return { + top: box.top + scrollTop - clientTop, + left: box.left + scrollLeft - clientLeft + }; +}; + +jQuery.offset = { + + bodyOffset: function( body ) { + var top = body.offsetTop, + left = body.offsetLeft; + + if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) { + top += parseFloat( jQuery.css(body, "marginTop") ) || 0; + left += parseFloat( jQuery.css(body, "marginLeft") ) || 0; + } + + return { top: top, left: left }; + }, + + setOffset: function( elem, options, i ) { + var position = jQuery.css( elem, "position" ); + + // set position first, in-case top/left are set even on static elem + if ( position === "static" ) { + elem.style.position = "relative"; + } + + var curElem = jQuery( elem ), + curOffset = curElem.offset(), + curCSSTop = jQuery.css( elem, "top" ), + curCSSLeft = jQuery.css( elem, "left" ), + calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1, + props = {}, curPosition = {}, curTop, curLeft; + + // need to be able to calculate position if either top or left is auto and position is either absolute or fixed + if ( calculatePosition ) { + curPosition = curElem.position(); + curTop = curPosition.top; + curLeft = curPosition.left; + } else { + curTop = parseFloat( curCSSTop ) || 0; + curLeft = parseFloat( curCSSLeft ) || 0; + } + + if ( jQuery.isFunction( options ) ) { + options = options.call( elem, i, curOffset ); + } + + if ( options.top != null ) { + props.top = ( options.top - curOffset.top ) + curTop; + } + if ( options.left != null ) { + props.left = ( options.left - curOffset.left ) + curLeft; + } + + if ( "using" in options ) { + options.using.call( elem, props ); + } else { + curElem.css( props ); + } + } +}; + + +jQuery.fn.extend({ + + position: function() { + if ( !this[0] ) { + return; + } + + var elem = this[0], + + // Get *real* offsetParent + offsetParent = this.offsetParent(), + + // Get correct offsets + offset = this.offset(), + parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset(); + + // Subtract element margins + // note: when an element has margin: auto the offsetLeft and marginLeft + // are the same in Safari causing offset.left to incorrectly be 0 + offset.top -= parseFloat( jQuery.css(elem, "marginTop") ) || 0; + offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0; + + // Add offsetParent borders + parentOffset.top += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0; + parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0; + + // Subtract the two offsets + return { + top: offset.top - parentOffset.top, + left: offset.left - parentOffset.left + }; + }, + + offsetParent: function() { + return this.map(function() { + var offsetParent = this.offsetParent || document.body; + while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) { + offsetParent = offsetParent.offsetParent; + } + return offsetParent || document.body; + }); + } +}); + + +// Create scrollLeft and scrollTop methods +jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) { + var top = /Y/.test( prop ); + + jQuery.fn[ method ] = function( val ) { + return jQuery.access( this, function( elem, method, val ) { + var win = getWindow( elem ); + + if ( val === undefined ) { + return win ? (prop in win) ? win[ prop ] : + win.document.documentElement[ method ] : + elem[ method ]; + } + + if ( win ) { + win.scrollTo( + !top ? val : jQuery( win ).scrollLeft(), + top ? val : jQuery( win ).scrollTop() + ); + + } else { + elem[ method ] = val; + } + }, method, val, arguments.length, null ); + }; +}); + +function getWindow( elem ) { + return jQuery.isWindow( elem ) ? + elem : + elem.nodeType === 9 ? + elem.defaultView || elem.parentWindow : + false; +} +// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods +jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { + jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) { + // margin is only for outerHeight, outerWidth + jQuery.fn[ funcName ] = function( margin, value ) { + var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ), + extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" ); + + return jQuery.access( this, function( elem, type, value ) { + var doc; + + if ( jQuery.isWindow( elem ) ) { + // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there + // isn't a whole lot we can do. See pull request at this URL for discussion: + // https://github.com/jquery/jquery/pull/764 + return elem.document.documentElement[ "client" + name ]; + } + + // Get document width or height + if ( elem.nodeType === 9 ) { + doc = elem.documentElement; + + // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest + // unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it. + return Math.max( + elem.body[ "scroll" + name ], doc[ "scroll" + name ], + elem.body[ "offset" + name ], doc[ "offset" + name ], + doc[ "client" + name ] + ); + } + + return value === undefined ? + // Get width or height on the element, requesting but not forcing parseFloat + jQuery.css( elem, type, value, extra ) : + + // Set width or height on the element + jQuery.style( elem, type, value, extra ); + }, type, chainable ? margin : undefined, chainable, null ); + }; + }); +}); +// Expose jQuery to the global object +window.jQuery = window.$ = jQuery; + +// Expose jQuery as an AMD module, but only for AMD loaders that +// understand the issues with loading multiple versions of jQuery +// in a page that all might call define(). The loader will indicate +// they have special allowances for multiple jQuery versions by +// specifying define.amd.jQuery = true. Register as a named module, +// since jQuery can be concatenated with other files that may use define, +// but not use a proper concatenation script that understands anonymous +// AMD modules. A named AMD is safest and most robust way to register. +// Lowercase jquery is used because AMD module names are derived from +// file names, and jQuery is normally delivered in a lowercase file name. +// Do this after creating the global so that if an AMD module wants to call +// noConflict to hide this version of jQuery, it will work. +if ( typeof define === "function" && define.amd && define.amd.jQuery ) { + define( "jquery", [], function () { return jQuery; } ); +} + +})( window ); + +/* autogeneration */ +define("jquery-src", [], function(){}); + +/* @source lib/bootbox.js */; + +/** + * bootbox.js v2.5.1 + * + * http://bootboxjs.com/license.txt + */ +var bootbox = window.bootbox || (function($) { + + var _locale = 'en', + _defaultLocale = 'en', + _animate = true, + _backdrop = 'static', + _defaultHref = 'javascript:;', + _classes = '', + _icons = {}, + /* last var should always be the public object we'll return */ + that = {}; + + /** + * standard locales. Please add more according to ISO 639-1 standard. Multiple language variants are + * unlikely to be required. If this gets too large it can be split out into separate JS files. + */ + var _locales = { + 'en' : { + OK : 'OK', + CANCEL : 'Cancel', + CONFIRM : 'OK' + }, + 'fr' : { + OK : 'OK', + CANCEL : 'Annuler', + CONFIRM : 'D\'accord' + }, + 'de' : { + OK : 'OK', + CANCEL : 'Abbrechen', + CONFIRM : 'Akzeptieren' + }, + 'es' : { + OK : 'OK', + CANCEL : 'Cancelar', + CONFIRM : 'Aceptar' + }, + 'br' : { + OK : 'OK', + CANCEL : 'Cancelar', + CONFIRM : 'Sim' + }, + 'nl' : { + OK : 'OK', + CANCEL : 'Annuleren', + CONFIRM : 'Accepteren' + }, + 'ru' : { + OK : 'OK', + CANCEL : 'Отмена', + CONFIRM : 'Применить' + }, + 'it' : { + OK : 'OK', + CANCEL : 'Annulla', + CONFIRM : 'Conferma' + } + }; + + /** + * private methods + */ + function _translate(str, locale) { + // we assume if no target locale is probided then we should take it from current setting + if (locale == null) { + locale = _locale; + } + if (typeof _locales[locale][str] == 'string') { + return _locales[locale][str]; + } + + // if we couldn't find a lookup then try and fallback to a default translation + + if (locale != _defaultLocale) { + return _translate(str, _defaultLocale); + } + + // if we can't do anything then bail out with whatever string was passed in - last resort + return str; + } + + /** + * public API + */ + that.setLocale = function(locale) { + for (var i in _locales) { + if (i == locale) { + _locale = locale; + return; + } + } + throw new Error('Invalid locale: '+locale); + }; + + that.addLocale = function(locale, translations) { + if (typeof _locales[locale] == 'undefined') { + _locales[locale] = {}; + } + for (var str in translations) { + _locales[locale][str] = translations[str]; + } + }; + + that.setIcons = function(icons) { + _icons = icons; + if (typeof _icons !== 'object' || _icons == null) { + _icons = {}; + } + }; + + that.alert = function(/*str, label, cb*/) { + var str = "", + label = _translate('OK'), + cb = null; + + switch (arguments.length) { + case 1: + // no callback, default button label + str = arguments[0]; + break; + case 2: + // callback *or* custom button label dependent on type + str = arguments[0]; + if (typeof arguments[1] == 'function') { + cb = arguments[1]; + } else { + label = arguments[1]; + } + break; + case 3: + // callback and custom button label + str = arguments[0]; + label = arguments[1]; + cb = arguments[2]; + break; + default: + throw new Error("Incorrect number of arguments: expected 1-3"); + break; + } + + return that.dialog(str, { + "label": label, + "icon" : _icons.OK, + "callback": cb + }, { + "onEscape": cb + }); + }; + + that.confirm = function(/*str, labelCancel, labelOk, cb*/) { + var str = "", + labelCancel = _translate('CANCEL'), + labelOk = _translate('CONFIRM'), + cb = null; + + switch (arguments.length) { + case 1: + str = arguments[0]; + break; + case 2: + str = arguments[0]; + if (typeof arguments[1] == 'function') { + cb = arguments[1]; + } else { + labelCancel = arguments[1]; + } + break; + case 3: + str = arguments[0]; + labelCancel = arguments[1]; + if (typeof arguments[2] == 'function') { + cb = arguments[2]; + } else { + labelOk = arguments[2]; + } + break; + case 4: + str = arguments[0]; + labelCancel = arguments[1]; + labelOk = arguments[2]; + cb = arguments[3]; + break; + default: + throw new Error("Incorrect number of arguments: expected 1-4"); + break; + } + + return that.dialog(str, [{ + "label": labelCancel, + "icon" : _icons.CANCEL, + "callback": function() { + if (typeof cb == 'function') { + cb(false); + } + } + }, { + "label": labelOk, + "icon" : _icons.CONFIRM, + "callback": function() { + if (typeof cb == 'function') { + cb(true); + } + } + }]); + }; + + that.prompt = function(/*str, labelCancel, labelOk, cb, defaultVal*/) { + var str = "", + labelCancel = _translate('CANCEL'), + labelOk = _translate('CONFIRM'), + cb = null, + defaultVal = ""; + + switch (arguments.length) { + case 1: + str = arguments[0]; + break; + case 2: + str = arguments[0]; + if (typeof arguments[1] == 'function') { + cb = arguments[1]; + } else { + labelCancel = arguments[1]; + } + break; + case 3: + str = arguments[0]; + labelCancel = arguments[1]; + if (typeof arguments[2] == 'function') { + cb = arguments[2]; + } else { + labelOk = arguments[2]; + } + break; + case 4: + str = arguments[0]; + labelCancel = arguments[1]; + labelOk = arguments[2]; + cb = arguments[3]; + break; + case 5: + str = arguments[0]; + labelCancel = arguments[1]; + labelOk = arguments[2]; + cb = arguments[3]; + defaultVal = arguments[4]; + break; + default: + throw new Error("Incorrect number of arguments: expected 1-5"); + break; + } + + var header = str; + + // let's keep a reference to the form object for later + var form = $("<form></form>"); + form.append("<input autocomplete=off type=text value='" + defaultVal + "' />"); + + var div = that.dialog(form, [{ + "label": labelCancel, + "icon" : _icons.CANCEL, + "callback": function() { + if (typeof cb == 'function') { + cb(null); + } + } + }, { + "label": labelOk, + "icon" : _icons.CONFIRM, + "callback": function() { + if (typeof cb == 'function') { + cb( + form.find("input[type=text]").val() + ); + } + } + }], { + "header": header + }); + + div.on("shown", function() { + form.find("input[type=text]").focus(); + + // ensure that submitting the form (e.g. with the enter key) + // replicates the behaviour of a normal prompt() + form.on("submit", function(e) { + e.preventDefault(); + div.find(".btn-primary").click(); + }); + }); + + return div; + }; + + that.modal = function(/*str, label, options*/) { + var str; + var label; + var options; + + var defaultOptions = { + "onEscape": null, + "keyboard": true, + "backdrop": _backdrop + }; + + switch (arguments.length) { + case 1: + str = arguments[0]; + break; + case 2: + str = arguments[0]; + if (typeof arguments[1] == 'object') { + options = arguments[1]; + } else { + label = arguments[1]; + } + break; + case 3: + str = arguments[0]; + label = arguments[1]; + options = arguments[2]; + break; + default: + throw new Error("Incorrect number of arguments: expected 1-3"); + break; + } + + defaultOptions['header'] = label; + + if (typeof options == 'object') { + options = $.extend(defaultOptions, options); + } else { + options = defaultOptions; + } + + return that.dialog(str, [], options); + }; + + that.dialog = function(str, handlers, options) { + var hideSource = null, + buttons = "", + callbacks = [], + options = options || {}; + + // check for single object and convert to array if necessary + if (handlers == null) { + handlers = []; + } else if (typeof handlers.length == 'undefined') { + handlers = [handlers]; + } + + var i = handlers.length; + while (i--) { + var label = null, + href = null, + _class = null, + icon = '', + callback = null; + + if (typeof handlers[i]['label'] == 'undefined' && + typeof handlers[i]['class'] == 'undefined' && + typeof handlers[i]['callback'] == 'undefined') { + // if we've got nothing we expect, check for condensed format + + var propCount = 0, // condensed will only match if this == 1 + property = null; // save the last property we found + + // be nicer to count the properties without this, but don't think it's possible... + for (var j in handlers[i]) { + property = j; + if (++propCount > 1) { + // forget it, too many properties + break; + } + } + + if (propCount == 1 && typeof handlers[i][j] == 'function') { + // matches condensed format of label -> function + handlers[i]['label'] = property; + handlers[i]['callback'] = handlers[i][j]; + } + } + + if (typeof handlers[i]['callback']== 'function') { + callback = handlers[i]['callback']; + } + + if (handlers[i]['class']) { + _class = handlers[i]['class']; + } else if (i == handlers.length -1 && handlers.length <= 2) { + // always add a primary to the main option in a two-button dialog + _class = 'btn-primary'; + } + + if (handlers[i]['label']) { + label = handlers[i]['label']; + } else { + label = "Option "+(i+1); + } + + if (handlers[i]['icon']) { + icon = "<i class='"+handlers[i]['icon']+"'></i> "; + } + + if (handlers[i]['href']) { + href = handlers[i]['href']; + } + else { + href = _defaultHref; + } + + buttons += "<a data-handler='"+i+"' class='btn "+_class+"' href='" + href + "'>"+icon+""+label+"</a>"; + + callbacks[i] = callback; + } + + // @see https://github.com/makeusabrew/bootbox/issues/46#issuecomment-8235302 + // and https://github.com/twitter/bootstrap/issues/4474 + // for an explanation of the inline overflow: hidden + + var parts = ["<div class='bootbox modal' style='overflow:hidden;'>"]; + + if (options['header']) { + var closeButton = ''; + if (typeof options['headerCloseButton'] == 'undefined' || options['headerCloseButton']) { + closeButton = "<a href='"+_defaultHref+"' class='close'>×</a>"; + } + + parts.push("<div class='modal-header'>"+closeButton+"<h3>"+options['header']+"</h3></div>"); + } + + // push an empty body into which we'll inject the proper content later + parts.push("<div class='modal-body'></div>"); + + if (buttons) { + parts.push("<div class='modal-footer'>"+buttons+"</div>"); + } + + parts.push("</div>"); + + var div = $(parts.join("\n")); + + // check whether we should fade in/out + var shouldFade = (typeof options.animate === 'undefined') ? _animate : options.animate; + + if (shouldFade) { + div.addClass("fade"); + } + + var optionalClasses = (typeof options.classes === 'undefined') ? _classes : options.classes; + if( optionalClasses ) { + div.addClass( optionalClasses ); + } + + // now we've built up the div properly we can inject the content whether it was a string or a jQuery object + $(".modal-body", div).html(str); + + div.bind('hidden', function() { + div.remove(); + }); + + div.bind('hide', function() { + if (hideSource == 'escape' && + typeof options.onEscape == 'function') { + options.onEscape(); + } + }); + + // hook into the modal's keyup trigger to check for the escape key + $(document).bind('keyup.modal', function ( e ) { + if (e.which == 27) { + hideSource = 'escape'; + } + }); + + // well, *if* we have a primary - give the last dom element (first displayed) focus + div.bind('shown', function() { + $("a.btn-primary:last", div).focus(); + }); + + // wire up button handlers + div.on('click', '.modal-footer a, a.close', function(e) { + + var handler = $(this).data("handler"), + cb = callbacks[handler], + hideModal = null; + + // sort of @see https://github.com/makeusabrew/bootbox/pull/68 - heavily adapted + // if we've got a custom href attribute, all bets are off + if (typeof handler !== 'undefined' && + typeof handlers[handler]['href'] !== 'undefined') { + + return; + } + + e.preventDefault(); + + if (typeof cb == 'function') { + hideModal = cb(); + } + + // the only way hideModal *will* be false is if a callback exists and + // returns it as a value. in those situations, don't hide the dialog + // @see https://github.com/makeusabrew/bootbox/pull/25 + if (hideModal !== false) { + hideSource = 'button'; + div.modal("hide"); + } + }); + + if (options.keyboard == null) { + options.keyboard = (typeof options.onEscape == 'function'); + } + + $("body").append(div); + + div.modal({ + "backdrop" : (typeof options.backdrop === 'undefined') ? _backdrop : options.backdrop, + "keyboard" : options.keyboard + }); + + return div; + }; + + that.hideAll = function() { + $(".bootbox").modal("hide"); + }; + + that.animate = function(animate) { + _animate = animate; + }; + + that.backdrop = function(backdrop) { + _backdrop = backdrop; + }; + + that.classes = function(classes) { + _classes = classes; + }; + + return that; + +})( window.jQuery ); + +// @see https://github.com/makeusabrew/bootbox/issues/71 +window.bootbox = bootbox; + +/* autogeneration */ +define("bootbox-origin", [ + "jquery" +], function(){}); + +/* @source lib/spin.js */; + +//fgnass.github.com/spin.js#v1.2.7 +!function(window, document, undefined) { + + /** + * Copyright (c) 2011 Felix Gnass [fgnass at neteye dot de] + * Licensed under the MIT license + */ + + var prefixes = ['webkit', 'Moz', 'ms', 'O'] /* Vendor prefixes */ + , animations = {} /* Animation rules keyed by their name */ + , useCssAnimations + + /** + * Utility function to create elements. If no tag name is given, + * a DIV is created. Optionally properties can be passed. + */ + function createEl(tag, prop) { + var el = document.createElement(tag || 'div') + , n + + for(n in prop) el[n] = prop[n] + return el + } + + /** + * Appends children and returns the parent. + */ + function ins(parent /* child1, child2, ...*/) { + for (var i=1, n=arguments.length; i<n; i++) + parent.appendChild(arguments[i]) + + return parent + } + + /** + * Insert a new stylesheet to hold the @keyframe or VML rules. + */ + var sheet = function() { + var el = createEl('style', {type : 'text/css'}) + ins(document.getElementsByTagName('head')[0], el) + return el.sheet || el.styleSheet + }() + + /** + * Creates an opacity keyframe animation rule and returns its name. + * Since most mobile Webkits have timing issues with animation-delay, + * we create separate rules for each line/segment. + */ + function addAnimation(alpha, trail, i, lines) { + var name = ['opacity', trail, ~~(alpha*100), i, lines].join('-') + , start = 0.01 + i/lines*100 + , z = Math.max(1 - (1-alpha) / trail * (100-start), alpha) + , prefix = useCssAnimations.substring(0, useCssAnimations.indexOf('Animation')).toLowerCase() + , pre = prefix && '-'+prefix+'-' || '' + + if (!animations[name]) { + sheet.insertRule( + '@' + pre + 'keyframes ' + name + '{' + + '0%{opacity:' + z + '}' + + start + '%{opacity:' + alpha + '}' + + (start+0.01) + '%{opacity:1}' + + (start+trail) % 100 + '%{opacity:' + alpha + '}' + + '100%{opacity:' + z + '}' + + '}', sheet.cssRules.length) + + animations[name] = 1 + } + return name + } + + /** + * Tries various vendor prefixes and returns the first supported property. + **/ + function vendor(el, prop) { + var s = el.style + , pp + , i + + if(s[prop] !== undefined) return prop + prop = prop.charAt(0).toUpperCase() + prop.slice(1) + for(i=0; i<prefixes.length; i++) { + pp = prefixes[i]+prop + if(s[pp] !== undefined) return pp + } + } + + /** + * Sets multiple style properties at once. + */ + function css(el, prop) { + for (var n in prop) + el.style[vendor(el, n)||n] = prop[n] + + return el + } + + /** + * Fills in default values. + */ + function merge(obj) { + for (var i=1; i < arguments.length; i++) { + var def = arguments[i] + for (var n in def) + if (obj[n] === undefined) obj[n] = def[n] + } + return obj + } + + /** + * Returns the absolute page-offset of the given element. + */ + function pos(el) { + var o = { x:el.offsetLeft, y:el.offsetTop } + while((el = el.offsetParent)) + o.x+=el.offsetLeft, o.y+=el.offsetTop + + return o + } + + var defaults = { + lines: 12, // The number of lines to draw + length: 7, // The length of each line + width: 5, // The line thickness + radius: 10, // The radius of the inner circle + rotate: 0, // Rotation offset + corners: 1, // Roundness (0..1) + color: '#000', // #rgb or #rrggbb + speed: 1, // Rounds per second + trail: 100, // Afterglow percentage + opacity: 1/4, // Opacity of the lines + fps: 20, // Frames per second when using setTimeout() + zIndex: 2e9, // Use a high z-index by default + className: 'spinner', // CSS class to assign to the element + top: 'auto', // center vertically + left: 'auto', // center horizontally + position: 'relative' // element position + } + + /** The constructor */ + var Spinner = function Spinner(o) { + if (!this.spin) return new Spinner(o) + this.opts = merge(o || {}, Spinner.defaults, defaults) + } + + Spinner.defaults = {} + + merge(Spinner.prototype, { + spin: function(target) { + this.stop() + var self = this + , o = self.opts + , el = self.el = css(createEl(0, {className: o.className}), {position: o.position, width: 0, zIndex: o.zIndex}) + , mid = o.radius+o.length+o.width + , ep // element position + , tp // target position + + if (target) { + target.insertBefore(el, target.firstChild||null) + tp = pos(target) + ep = pos(el) + css(el, { + left: (o.left == 'auto' ? tp.x-ep.x + (target.offsetWidth >> 1) : parseInt(o.left, 10) + mid) + 'px', + top: (o.top == 'auto' ? tp.y-ep.y + (target.offsetHeight >> 1) : parseInt(o.top, 10) + mid) + 'px' + }) + } + + el.setAttribute('aria-role', 'progressbar') + self.lines(el, self.opts) + + if (!useCssAnimations) { + // No CSS animation support, use setTimeout() instead + var i = 0 + , fps = o.fps + , f = fps/o.speed + , ostep = (1-o.opacity) / (f*o.trail / 100) + , astep = f/o.lines + + ;(function anim() { + i++; + for (var s=o.lines; s; s--) { + var alpha = Math.max(1-(i+s*astep)%f * ostep, o.opacity) + self.opacity(el, o.lines-s, alpha, o) + } + self.timeout = self.el && setTimeout(anim, ~~(1000/fps)) + })() + } + return self + }, + + stop: function() { + var el = this.el + if (el) { + clearTimeout(this.timeout) + if (el.parentNode) el.parentNode.removeChild(el) + this.el = undefined + } + return this + }, + + lines: function(el, o) { + var i = 0 + , seg + + function fill(color, shadow) { + return css(createEl(), { + position: 'absolute', + width: (o.length+o.width) + 'px', + height: o.width + 'px', + background: color, + boxShadow: shadow, + transformOrigin: 'left', + transform: 'rotate(' + ~~(360/o.lines*i+o.rotate) + 'deg) translate(' + o.radius+'px' +',0)', + borderRadius: (o.corners * o.width>>1) + 'px' + }) + } + + for (; i < o.lines; i++) { + seg = css(createEl(), { + position: 'absolute', + top: 1+~(o.width/2) + 'px', + transform: o.hwaccel ? 'translate3d(0,0,0)' : '', + opacity: o.opacity, + animation: useCssAnimations && addAnimation(o.opacity, o.trail, i, o.lines) + ' ' + 1/o.speed + 's linear infinite' + }) + + if (o.shadow) ins(seg, css(fill('#000', '0 0 4px ' + '#000'), {top: 2+'px'})) + + ins(el, ins(seg, fill(o.color, '0 0 1px rgba(0,0,0,.1)'))) + } + return el + }, + + opacity: function(el, i, val) { + if (i < el.childNodes.length) el.childNodes[i].style.opacity = val + } + + }) + + ///////////////////////////////////////////////////////////////////////// + // VML rendering for IE + ///////////////////////////////////////////////////////////////////////// + + /** + * Check and init VML support + */ + ;(function() { + + function vml(tag, attr) { + return createEl('<' + tag + ' xmlns="urn:schemas-microsoft.com:vml" class="spin-vml">', attr) + } + + var s = css(createEl('group'), {behavior: 'url(#default#VML)'}) + + if (!vendor(s, 'transform') && s.adj) { + + // VML support detected. Insert CSS rule ... + sheet.addRule('.spin-vml', 'behavior:url(#default#VML)') + + Spinner.prototype.lines = function(el, o) { + var r = o.length+o.width + , s = 2*r + + function grp() { + return css( + vml('group', { + coordsize: s + ' ' + s, + coordorigin: -r + ' ' + -r + }), + { width: s, height: s } + ) + } + + var margin = -(o.width+o.length)*2 + 'px' + , g = css(grp(), {position: 'absolute', top: margin, left: margin}) + , i + + function seg(i, dx, filter) { + ins(g, + ins(css(grp(), {rotation: 360 / o.lines * i + 'deg', left: ~~dx}), + ins(css(vml('roundrect', {arcsize: o.corners}), { + width: r, + height: o.width, + left: o.radius, + top: -o.width>>1, + filter: filter + }), + vml('fill', {color: o.color, opacity: o.opacity}), + vml('stroke', {opacity: 0}) // transparent stroke to fix color bleeding upon opacity change + ) + ) + ) + } + + if (o.shadow) + for (i = 1; i <= o.lines; i++) + seg(i, -2, 'progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)') + + for (i = 1; i <= o.lines; i++) seg(i) + return ins(el, g) + } + + Spinner.prototype.opacity = function(el, i, val, o) { + var c = el.firstChild + o = o.shadow && o.lines || 0 + if (c && i+o < c.childNodes.length) { + c = c.childNodes[i+o]; c = c && c.firstChild; c = c && c.firstChild + if (c) c.opacity = val + } + } + } + else + useCssAnimations = vendor(s, 'animation') + })() + + if (typeof define == 'function' && define.amd) + define("spin", function() { return Spinner }) + else + window.Spinner = Spinner + +}(window, document); + +/* @source lib/mustache.js */; + +/*! + * mustache.js - Logic-less {{mustache}} templates with JavaScript + * http://github.com/janl/mustache.js + */ + +/*global define: false*/ + +var Mustache; + +(function (exports) { + if (typeof module !== "undefined" && module.exports) { + module.exports = exports; // CommonJS + } else if (typeof define === "function") { + define("mustache", exports); // AMD + } else { + Mustache = exports; // <script> + } +}((function () { + + var exports = {}; + + exports.name = "mustache.js"; + exports.version = "0.7.1"; + exports.tags = ["{{", "}}"]; + + exports.Scanner = Scanner; + exports.Context = Context; + exports.Writer = Writer; + + var whiteRe = /\s*/; + var spaceRe = /\s+/; + var nonSpaceRe = /\S/; + var eqRe = /\s*=/; + var curlyRe = /\s*\}/; + var tagRe = /#|\^|\/|>|\{|&|=|!/; + + // Workaround for https://issues.apache.org/jira/browse/COUCHDB-577 + // See https://github.com/janl/mustache.js/issues/189 + function testRe(re, string) { + return RegExp.prototype.test.call(re, string); + } + + function isWhitespace(string) { + return !testRe(nonSpaceRe, string); + } + + var isArray = Array.isArray || function (obj) { + return Object.prototype.toString.call(obj) === "[object Array]"; + }; + + function escapeRe(string) { + return string.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"); + } + + var entityMap = { + "&": "&", + "<": "<", + ">": ">", + '"': '"', + "'": ''', + "/": '/' + }; + + function escapeHtml(string) { + return String(string).replace(/[&<>"'\/]/g, function (s) { + return entityMap[s]; + }); + } + + // Export the escaping function so that the user may override it. + // See https://github.com/janl/mustache.js/issues/244 + exports.escape = escapeHtml; + + function Scanner(string) { + this.string = string; + this.tail = string; + this.pos = 0; + } + + /** + * Returns `true` if the tail is empty (end of string). + */ + Scanner.prototype.eos = function () { + return this.tail === ""; + }; + + /** + * Tries to match the given regular expression at the current position. + * Returns the matched text if it can match, the empty string otherwise. + */ + Scanner.prototype.scan = function (re) { + var match = this.tail.match(re); + + if (match && match.index === 0) { + this.tail = this.tail.substring(match[0].length); + this.pos += match[0].length; + return match[0]; + } + + return ""; + }; + + /** + * Skips all text until the given regular expression can be matched. Returns + * the skipped string, which is the entire tail if no match can be made. + */ + Scanner.prototype.scanUntil = function (re) { + var match, pos = this.tail.search(re); + + switch (pos) { + case -1: + match = this.tail; + this.pos += this.tail.length; + this.tail = ""; + break; + case 0: + match = ""; + break; + default: + match = this.tail.substring(0, pos); + this.tail = this.tail.substring(pos); + this.pos += pos; + } + + return match; + }; + + function Context(view, parent) { + this.view = view; + this.parent = parent; + this.clearCache(); + } + + Context.make = function (view) { + return (view instanceof Context) ? view : new Context(view); + }; + + Context.prototype.clearCache = function () { + this._cache = {}; + }; + + Context.prototype.push = function (view) { + return new Context(view, this); + }; + + Context.prototype.lookup = function (name) { + var value = this._cache[name]; + + if (!value) { + if (name === ".") { + value = this.view; + } else { + var context = this; + + while (context) { + if (name.indexOf(".") > 0) { + var names = name.split("."), i = 0; + + value = context.view; + + while (value && i < names.length) { + value = value[names[i++]]; + } + } else { + value = context.view[name]; + } + + if (value != null) { + break; + } + + context = context.parent; + } + } + + this._cache[name] = value; + } + + if (typeof value === "function") { + value = value.call(this.view); + } + + return value; + }; + + function Writer() { + this.clearCache(); + } + + Writer.prototype.clearCache = function () { + this._cache = {}; + this._partialCache = {}; + }; + + Writer.prototype.compile = function (template, tags) { + var fn = this._cache[template]; + + if (!fn) { + var tokens = exports.parse(template, tags); + fn = this._cache[template] = this.compileTokens(tokens, template); + } + + return fn; + }; + + Writer.prototype.compilePartial = function (name, template, tags) { + var fn = this.compile(template, tags); + this._partialCache[name] = fn; + return fn; + }; + + Writer.prototype.compileTokens = function (tokens, template) { + var fn = compileTokens(tokens); + var self = this; + + return function (view, partials) { + if (partials) { + if (typeof partials === "function") { + self._loadPartial = partials; + } else { + for (var name in partials) { + self.compilePartial(name, partials[name]); + } + } + } + + return fn(self, Context.make(view), template); + }; + }; + + Writer.prototype.render = function (template, view, partials) { + return this.compile(template)(view, partials); + }; + + Writer.prototype._section = function (name, context, text, callback) { + var value = context.lookup(name); + + switch (typeof value) { + case "object": + if (isArray(value)) { + var buffer = ""; + + for (var i = 0, len = value.length; i < len; ++i) { + buffer += callback(this, context.push(value[i])); + } + + return buffer; + } + + return value ? callback(this, context.push(value)) : ""; + case "function": + var self = this; + var scopedRender = function (template) { + return self.render(template, context); + }; + + var result = value.call(context.view, text, scopedRender); + return result != null ? result : ""; + default: + if (value) { + return callback(this, context); + } + } + + return ""; + }; + + Writer.prototype._inverted = function (name, context, callback) { + var value = context.lookup(name); + + // Use JavaScript's definition of falsy. Include empty arrays. + // See https://github.com/janl/mustache.js/issues/186 + if (!value || (isArray(value) && value.length === 0)) { + return callback(this, context); + } + + return ""; + }; + + Writer.prototype._partial = function (name, context) { + if (!(name in this._partialCache) && this._loadPartial) { + this.compilePartial(name, this._loadPartial(name)); + } + + var fn = this._partialCache[name]; + + return fn ? fn(context) : ""; + }; + + Writer.prototype._name = function (name, context) { + var value = context.lookup(name); + + if (typeof value === "function") { + value = value.call(context.view); + } + + return (value == null) ? "" : String(value); + }; + + Writer.prototype._escaped = function (name, context) { + return exports.escape(this._name(name, context)); + }; + + /** + * Calculates the bounds of the section represented by the given `token` in + * the original template by drilling down into nested sections to find the + * last token that is part of that section. Returns an array of [start, end]. + */ + function sectionBounds(token) { + var start = token[3]; + var end = start; + + var tokens; + while ((tokens = token[4]) && tokens.length) { + token = tokens[tokens.length - 1]; + end = token[3]; + } + + return [start, end]; + } + + /** + * Low-level function that compiles the given `tokens` into a function + * that accepts three arguments: a Writer, a Context, and the template. + */ + function compileTokens(tokens) { + var subRenders = {}; + + function subRender(i, tokens, template) { + if (!subRenders[i]) { + var fn = compileTokens(tokens); + subRenders[i] = function (writer, context) { + return fn(writer, context, template); + }; + } + + return subRenders[i]; + } + + return function (writer, context, template) { + var buffer = ""; + var token, sectionText; + + for (var i = 0, len = tokens.length; i < len; ++i) { + token = tokens[i]; + + switch (token[0]) { + case "#": + sectionText = template.slice.apply(template, sectionBounds(token)); + buffer += writer._section(token[1], context, sectionText, subRender(i, token[4], template)); + break; + case "^": + buffer += writer._inverted(token[1], context, subRender(i, token[4], template)); + break; + case ">": + buffer += writer._partial(token[1], context); + break; + case "&": + buffer += writer._name(token[1], context); + break; + case "name": + buffer += writer._escaped(token[1], context); + break; + case "text": + buffer += token[1]; + break; + } + } + + return buffer; + }; + } + + /** + * Forms the given array of `tokens` into a nested tree structure where + * tokens that represent a section have a fifth item: an array that contains + * all tokens in that section. + */ + function nestTokens(tokens) { + var tree = []; + var collector = tree; + var sections = []; + var token, section; + + for (var i = 0; i < tokens.length; ++i) { + token = tokens[i]; + + switch (token[0]) { + case "#": + case "^": + token[4] = []; + sections.push(token); + collector.push(token); + collector = token[4]; + break; + case "/": + if (sections.length === 0) { + throw new Error("Unopened section: " + token[1]); + } + + section = sections.pop(); + + if (section[1] !== token[1]) { + throw new Error("Unclosed section: " + section[1]); + } + + if (sections.length > 0) { + collector = sections[sections.length - 1][4]; + } else { + collector = tree; + } + break; + default: + collector.push(token); + } + } + + // Make sure there were no open sections when we're done. + section = sections.pop(); + + if (section) { + throw new Error("Unclosed section: " + section[1]); + } + + return tree; + } + + /** + * Combines the values of consecutive text tokens in the given `tokens` array + * to a single token. + */ + function squashTokens(tokens) { + var token, lastToken, squashedTokens = []; + + for (var i = 0; i < tokens.length; ++i) { + token = tokens[i]; + + if (lastToken && lastToken[0] === "text" && token[0] === "text") { + lastToken[1] += token[1]; + lastToken[3] = token[3]; + } else { + lastToken = token; + squashedTokens.push(token); + } + } + + return squashedTokens; + } + + function escapeTags(tags) { + if (tags.length !== 2) { + throw new Error("Invalid tags: " + tags.join(" ")); + } + + return [ + new RegExp(escapeRe(tags[0]) + "\\s*"), + new RegExp("\\s*" + escapeRe(tags[1])) + ]; + } + + /** + * Breaks up the given `template` string into a tree of token objects. If + * `tags` is given here it must be an array with two string values: the + * opening and closing tags used in the template (e.g. ["<%", "%>"]). Of + * course, the default is to use mustaches (i.e. Mustache.tags). + */ + exports.parse = function (template, tags) { + template = template || ''; + tags = tags || exports.tags; + + var tagRes = escapeTags(tags); + var scanner = new Scanner(template); + + var tokens = [], // Buffer to hold the tokens + spaces = [], // Indices of whitespace tokens on the current line + hasTag = false, // Is there a {{tag}} on the current line? + nonSpace = false; // Is there a non-space char on the current line? + + // Strips all whitespace tokens array for the current line + // if there was a {{#tag}} on it and otherwise only space. + function stripSpace() { + if (hasTag && !nonSpace) { + while (spaces.length) { + tokens.splice(spaces.pop(), 1); + } + } else { + spaces = []; + } + + hasTag = false; + nonSpace = false; + } + + var start, type, value, chr; + + while (!scanner.eos()) { + start = scanner.pos; + value = scanner.scanUntil(tagRes[0]); + + if (value) { + for (var i = 0, len = value.length; i < len; ++i) { + chr = value.charAt(i); + + if (isWhitespace(chr)) { + spaces.push(tokens.length); + } else { + nonSpace = true; + } + + tokens.push(["text", chr, start, start + 1]); + start += 1; + + if (chr === "\n") { + stripSpace(); // Check for whitespace on the current line. + } + } + } + + start = scanner.pos; + + // Match the opening tag. + if (!scanner.scan(tagRes[0])) { + break; + } + + hasTag = true; + type = scanner.scan(tagRe) || "name"; + + // Skip any whitespace between tag and value. + scanner.scan(whiteRe); + + // Extract the tag value. + if (type === "=") { + value = scanner.scanUntil(eqRe); + scanner.scan(eqRe); + scanner.scanUntil(tagRes[1]); + } else if (type === "{") { + var closeRe = new RegExp("\\s*" + escapeRe("}" + tags[1])); + value = scanner.scanUntil(closeRe); + scanner.scan(curlyRe); + scanner.scanUntil(tagRes[1]); + type = "&"; + } else { + value = scanner.scanUntil(tagRes[1]); + } + + // Match the closing tag. + if (!scanner.scan(tagRes[1])) { + throw new Error("Unclosed tag at " + scanner.pos); + } + + tokens.push([type, value, start, scanner.pos]); + + if (type === "name" || type === "{" || type === "&") { + nonSpace = true; + } + + // Set the tags for the next time around. + if (type === "=") { + tags = value.split(spaceRe); + tagRes = escapeTags(tags); + } + } + + tokens = squashTokens(tokens); + + return nestTokens(tokens); + }; + + // The high-level clearCache, compile, compilePartial, and render functions + // use this default writer. + var _writer = new Writer(); + + /** + * Clears all cached templates and partials in the default writer. + */ + exports.clearCache = function () { + return _writer.clearCache(); + }; + + /** + * Compiles the given `template` to a reusable function using the default + * writer. + */ + exports.compile = function (template, tags) { + return _writer.compile(template, tags); + }; + + /** + * Compiles the partial with the given `name` and `template` to a reusable + * function using the default writer. + */ + exports.compilePartial = function (name, template, tags) { + return _writer.compilePartial(name, template, tags); + }; + + /** + * Compiles the given array of tokens (the output of a parse) to a reusable + * function using the default writer. + */ + exports.compileTokens = function (tokens, template) { + return _writer.compileTokens(tokens, template); + }; + + /** + * Renders the `template` with the given `view` and `partials` using the + * default writer. + */ + exports.render = function (template, view, partials) { + return _writer.render(template, view, partials); + }; + + // This is here for backwards compatibility with 0.4.x. + exports.to_html = function (template, view, partials, send) { + var result = exports.render(template, view, partials); + + if (typeof send === "function") { + send(result); + } else { + return result; + } + }; + + return exports; + +}()))); + +/* @source lib/bootstrap-amd.js */; + +define("bootstrap", [ + "jquery" +], function ( jQuery ) { +/* ========================================================== + * bootstrap-affix.js v2.2.2 + * http://twitter.github.com/bootstrap/javascript.html#affix + * ========================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* AFFIX CLASS DEFINITION + * ====================== */ + + var Affix = function (element, options) { + this.options = $.extend({}, $.fn.affix.defaults, options) + this.$window = $(window) + .on('scroll.affix.data-api', $.proxy(this.checkPosition, this)) + .on('click.affix.data-api', $.proxy(function () { setTimeout($.proxy(this.checkPosition, this), 1) }, this)) + this.$element = $(element) + this.checkPosition() + } + + Affix.prototype.checkPosition = function () { + if (!this.$element.is(':visible')) return + + var scrollHeight = $(document).height() + , scrollTop = this.$window.scrollTop() + , position = this.$element.offset() + , offset = this.options.offset + , offsetBottom = offset.bottom + , offsetTop = offset.top + , reset = 'affix affix-top affix-bottom' + , affix + + if (typeof offset != 'object') offsetBottom = offsetTop = offset + if (typeof offsetTop == 'function') offsetTop = offset.top() + if (typeof offsetBottom == 'function') offsetBottom = offset.bottom() + + affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? + false : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? + 'bottom' : offsetTop != null && scrollTop <= offsetTop ? + 'top' : false + + if (this.affixed === affix) return + + this.affixed = affix + this.unpin = affix == 'bottom' ? position.top - scrollTop : null + + this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : '')) + } + + + /* AFFIX PLUGIN DEFINITION + * ======================= */ + + var old = $.fn.affix + + $.fn.affix = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('affix') + , options = typeof option == 'object' && option + if (!data) $this.data('affix', (data = new Affix(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.affix.Constructor = Affix + + $.fn.affix.defaults = { + offset: 0 + } + + + /* AFFIX NO CONFLICT + * ================= */ + + $.fn.affix.noConflict = function () { + $.fn.affix = old + return this + } + + + /* AFFIX DATA-API + * ============== */ + + $(window).on('load', function () { + $('[data-spy="affix"]').each(function () { + var $spy = $(this) + , data = $spy.data() + + data.offset = data.offset || {} + + data.offsetBottom && (data.offset.bottom = data.offsetBottom) + data.offsetTop && (data.offset.top = data.offsetTop) + + $spy.affix(data) + }) + }) + + +}(window.jQuery);/* ========================================================== + * bootstrap-alert.js v2.2.2 + * http://twitter.github.com/bootstrap/javascript.html#alerts + * ========================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* ALERT CLASS DEFINITION + * ====================== */ + + var dismiss = '[data-dismiss="alert"]' + , Alert = function (el) { + $(el).on('click', dismiss, this.close) + } + + Alert.prototype.close = function (e) { + var $this = $(this) + , selector = $this.attr('data-target') + , $parent + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 + } + + $parent = $(selector) + + e && e.preventDefault() + + $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) + + $parent.trigger(e = $.Event('close')) + + if (e.isDefaultPrevented()) return + + $parent.removeClass('in') + + function removeElement() { + $parent + .trigger('closed') + .remove() + } + + $.support.transition && $parent.hasClass('fade') ? + $parent.on($.support.transition.end, removeElement) : + removeElement() + } + + + /* ALERT PLUGIN DEFINITION + * ======================= */ + + var old = $.fn.alert + + $.fn.alert = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('alert') + if (!data) $this.data('alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + $.fn.alert.Constructor = Alert + + + /* ALERT NO CONFLICT + * ================= */ + + $.fn.alert.noConflict = function () { + $.fn.alert = old + return this + } + + + /* ALERT DATA-API + * ============== */ + + $(document).on('click.alert.data-api', dismiss, Alert.prototype.close) + +}(window.jQuery);/* ============================================================ + * bootstrap-button.js v2.2.2 + * http://twitter.github.com/bootstrap/javascript.html#buttons + * ============================================================ + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* BUTTON PUBLIC CLASS DEFINITION + * ============================== */ + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, $.fn.button.defaults, options) + } + + Button.prototype.setState = function (state) { + var d = 'disabled' + , $el = this.$element + , data = $el.data() + , val = $el.is('input') ? 'val' : 'html' + + state = state + 'Text' + data.resetText || $el.data('resetText', $el[val]()) + + $el[val](data[state] || this.options[state]) + + // push to event loop to allow forms to submit + setTimeout(function () { + state == 'loadingText' ? + $el.addClass(d).attr(d, d) : + $el.removeClass(d).removeAttr(d) + }, 0) + } + + Button.prototype.toggle = function () { + var $parent = this.$element.closest('[data-toggle="buttons-radio"]') + + $parent && $parent + .find('.active') + .removeClass('active') + + this.$element.toggleClass('active') + } + + + /* BUTTON PLUGIN DEFINITION + * ======================== */ + + var old = $.fn.button + + $.fn.button = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('button') + , options = typeof option == 'object' && option + if (!data) $this.data('button', (data = new Button(this, options))) + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + $.fn.button.defaults = { + loadingText: 'loading...' + } + + $.fn.button.Constructor = Button + + + /* BUTTON NO CONFLICT + * ================== */ + + $.fn.button.noConflict = function () { + $.fn.button = old + return this + } + + + /* BUTTON DATA-API + * =============== */ + + $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) { + var $btn = $(e.target) + if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') + $btn.button('toggle') + }) + +}(window.jQuery);/* ========================================================== + * bootstrap-carousel.js v2.2.2 + * http://twitter.github.com/bootstrap/javascript.html#carousel + * ========================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* CAROUSEL CLASS DEFINITION + * ========================= */ + + var Carousel = function (element, options) { + this.$element = $(element) + this.options = options + this.options.pause == 'hover' && this.$element + .on('mouseenter', $.proxy(this.pause, this)) + .on('mouseleave', $.proxy(this.cycle, this)) + } + + Carousel.prototype = { + + cycle: function (e) { + if (!e) this.paused = false + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + return this + } + + , to: function (pos) { + var $active = this.$element.find('.item.active') + , children = $active.parent().children() + , activePos = children.index($active) + , that = this + + if (pos > (children.length - 1) || pos < 0) return + + if (this.sliding) { + return this.$element.one('slid', function () { + that.to(pos) + }) + } + + if (activePos == pos) { + return this.pause().cycle() + } + + return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos])) + } + + , pause: function (e) { + if (!e) this.paused = true + if (this.$element.find('.next, .prev').length && $.support.transition.end) { + this.$element.trigger($.support.transition.end) + this.cycle() + } + clearInterval(this.interval) + this.interval = null + return this + } + + , next: function () { + if (this.sliding) return + return this.slide('next') + } + + , prev: function () { + if (this.sliding) return + return this.slide('prev') + } + + , slide: function (type, next) { + var $active = this.$element.find('.item.active') + , $next = next || $active[type]() + , isCycling = this.interval + , direction = type == 'next' ? 'left' : 'right' + , fallback = type == 'next' ? 'first' : 'last' + , that = this + , e + + this.sliding = true + + isCycling && this.pause() + + $next = $next.length ? $next : this.$element.find('.item')[fallback]() + + e = $.Event('slide', { + relatedTarget: $next[0] + }) + + if ($next.hasClass('active')) return + + if ($.support.transition && this.$element.hasClass('slide')) { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + this.$element.one($.support.transition.end, function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { that.$element.trigger('slid') }, 0) + }) + } else { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger('slid') + } + + isCycling && this.cycle() + + return this + } + + } + + + /* CAROUSEL PLUGIN DEFINITION + * ========================== */ + + var old = $.fn.carousel + + $.fn.carousel = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('carousel') + , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option) + , action = typeof option == 'string' ? option : options.slide + if (!data) $this.data('carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.cycle() + }) + } + + $.fn.carousel.defaults = { + interval: 5000 + , pause: 'hover' + } + + $.fn.carousel.Constructor = Carousel + + + /* CAROUSEL NO CONFLICT + * ==================== */ + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + /* CAROUSEL DATA-API + * ================= */ + + $(document).on('click.carousel.data-api', '[data-slide]', function (e) { + var $this = $(this), href + , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 + , options = $.extend({}, $target.data(), $this.data()) + $target.carousel(options) + e.preventDefault() + }) + +}(window.jQuery);/* ============================================================= + * bootstrap-collapse.js v2.2.2 + * http://twitter.github.com/bootstrap/javascript.html#collapse + * ============================================================= + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* COLLAPSE PUBLIC CLASS DEFINITION + * ================================ */ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, $.fn.collapse.defaults, options) + + if (this.options.parent) { + this.$parent = $(this.options.parent) + } + + this.options.toggle && this.toggle() + } + + Collapse.prototype = { + + constructor: Collapse + + , dimension: function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + , show: function () { + var dimension + , scroll + , actives + , hasData + + if (this.transitioning) return + + dimension = this.dimension() + scroll = $.camelCase(['scroll', dimension].join('-')) + actives = this.$parent && this.$parent.find('> .accordion-group > .in') + + if (actives && actives.length) { + hasData = actives.data('collapse') + if (hasData && hasData.transitioning) return + actives.collapse('hide') + hasData || actives.data('collapse', null) + } + + this.$element[dimension](0) + this.transition('addClass', $.Event('show'), 'shown') + $.support.transition && this.$element[dimension](this.$element[0][scroll]) + } + + , hide: function () { + var dimension + if (this.transitioning) return + dimension = this.dimension() + this.reset(this.$element[dimension]()) + this.transition('removeClass', $.Event('hide'), 'hidden') + this.$element[dimension](0) + } + + , reset: function (size) { + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + [dimension](size || 'auto') + [0].offsetWidth + + this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') + + return this + } + + , transition: function (method, startEvent, completeEvent) { + var that = this + , complete = function () { + if (startEvent.type == 'show') that.reset() + that.transitioning = 0 + that.$element.trigger(completeEvent) + } + + this.$element.trigger(startEvent) + + if (startEvent.isDefaultPrevented()) return + + this.transitioning = 1 + + this.$element[method]('in') + + $.support.transition && this.$element.hasClass('collapse') ? + this.$element.one($.support.transition.end, complete) : + complete() + } + + , toggle: function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + } + + + /* COLLAPSE PLUGIN DEFINITION + * ========================== */ + + var old = $.fn.collapse + + $.fn.collapse = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('collapse') + , options = typeof option == 'object' && option + if (!data) $this.data('collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.collapse.defaults = { + toggle: true + } + + $.fn.collapse.Constructor = Collapse + + + /* COLLAPSE NO CONFLICT + * ==================== */ + + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } + + + /* COLLAPSE DATA-API + * ================= */ + + $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) { + var $this = $(this), href + , target = $this.attr('data-target') + || e.preventDefault() + || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 + , option = $(target).data('collapse') ? 'toggle' : $this.data() + $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed') + $(target).collapse(option) + }) + +}(window.jQuery);/* ============================================================ + * bootstrap-dropdown.js v2.2.2 + * http://twitter.github.com/bootstrap/javascript.html#dropdowns + * ============================================================ + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* DROPDOWN CLASS DEFINITION + * ========================= */ + + var toggle = '[data-toggle=dropdown]' + , Dropdown = function (element) { + var $el = $(element).on('click.dropdown.data-api', this.toggle) + $('html').on('click.dropdown.data-api', function () { + $el.parent().removeClass('open') + }) + } + + Dropdown.prototype = { + + constructor: Dropdown + + , toggle: function (e) { + var $this = $(this) + , $parent + , isActive + + if ($this.is('.disabled, :disabled')) return + + $parent = getParent($this) + + isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + $parent.toggleClass('open') + } + + $this.focus() + + return false + } + + , keydown: function (e) { + var $this + , $items + , $active + , $parent + , isActive + , index + + if (!/(38|40|27)/.test(e.keyCode)) return + + $this = $(this) + + e.preventDefault() + e.stopPropagation() + + if ($this.is('.disabled, :disabled')) return + + $parent = getParent($this) + + isActive = $parent.hasClass('open') + + if (!isActive || (isActive && e.keyCode == 27)) return $this.click() + + $items = $('[role=menu] li:not(.divider):visible a', $parent) + + if (!$items.length) return + + index = $items.index($items.filter(':focus')) + + if (e.keyCode == 38 && index > 0) index-- // up + if (e.keyCode == 40 && index < $items.length - 1) index++ // down + if (!~index) index = 0 + + $items + .eq(index) + .focus() + } + + } + + function clearMenus() { + $(toggle).each(function () { + getParent($(this)).removeClass('open') + }) + } + + function getParent($this) { + var selector = $this.attr('data-target') + , $parent + + if (!selector) { + selector = $this.attr('href') + selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 + } + + $parent = $(selector) + $parent.length || ($parent = $this.parent()) + + return $parent + } + + + /* DROPDOWN PLUGIN DEFINITION + * ========================== */ + + var old = $.fn.dropdown + + $.fn.dropdown = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('dropdown') + if (!data) $this.data('dropdown', (data = new Dropdown(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + $.fn.dropdown.Constructor = Dropdown + + + /* DROPDOWN NO CONFLICT + * ==================== */ + + $.fn.dropdown.noConflict = function () { + $.fn.dropdown = old + return this + } + + + /* APPLY TO STANDARD DROPDOWN ELEMENTS + * =================================== */ + + $(document) + .on('click.dropdown.data-api touchstart.dropdown.data-api', clearMenus) + .on('click.dropdown touchstart.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) + .on('touchstart.dropdown.data-api', '.dropdown-menu', function (e) { e.stopPropagation() }) + .on('click.dropdown.data-api touchstart.dropdown.data-api' , toggle, Dropdown.prototype.toggle) + .on('keydown.dropdown.data-api touchstart.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown) + +}(window.jQuery);/* ========================================================= + * bootstrap-modal.js v2.2.2 + * http://twitter.github.com/bootstrap/javascript.html#modals + * ========================================================= + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================= */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* MODAL CLASS DEFINITION + * ====================== */ + + var Modal = function (element, options) { + this.options = options + this.$element = $(element) + .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this)) + this.options.remote && this.$element.find('.modal-body').load(this.options.remote) + } + + Modal.prototype = { + + constructor: Modal + + , toggle: function () { + return this[!this.isShown ? 'show' : 'hide']() + } + + , show: function () { + var that = this + , e = $.Event('show') + + this.$element.trigger(e) + + if (this.isShown || e.isDefaultPrevented()) return + + this.isShown = true + + this.escape() + + this.backdrop(function () { + var transition = $.support.transition && that.$element.hasClass('fade') + + if (!that.$element.parent().length) { + that.$element.appendTo(document.body) //don't move modals dom position + } + + that.$element + .show() + + if (transition) { + that.$element[0].offsetWidth // force reflow + } + + that.$element + .addClass('in') + .attr('aria-hidden', false) + + that.enforceFocus() + + transition ? + that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown') }) : + that.$element.focus().trigger('shown') + + }) + } + + , hide: function (e) { + e && e.preventDefault() + + var that = this + + e = $.Event('hide') + + this.$element.trigger(e) + + if (!this.isShown || e.isDefaultPrevented()) return + + this.isShown = false + + this.escape() + + $(document).off('focusin.modal') + + this.$element + .removeClass('in') + .attr('aria-hidden', true) + + $.support.transition && this.$element.hasClass('fade') ? + this.hideWithTransition() : + this.hideModal() + } + + , enforceFocus: function () { + var that = this + $(document).on('focusin.modal', function (e) { + if (that.$element[0] !== e.target && !that.$element.has(e.target).length) { + that.$element.focus() + } + }) + } + + , escape: function () { + var that = this + if (this.isShown && this.options.keyboard) { + this.$element.on('keyup.dismiss.modal', function ( e ) { + e.which == 27 && that.hide() + }) + } else if (!this.isShown) { + this.$element.off('keyup.dismiss.modal') + } + } + + , hideWithTransition: function () { + var that = this + , timeout = setTimeout(function () { + that.$element.off($.support.transition.end) + that.hideModal() + }, 500) + + this.$element.one($.support.transition.end, function () { + clearTimeout(timeout) + that.hideModal() + }) + } + + , hideModal: function (that) { + this.$element + .hide() + .trigger('hidden') + + this.backdrop() + } + + , removeBackdrop: function () { + this.$backdrop.remove() + this.$backdrop = null + } + + , backdrop: function (callback) { + var that = this + , animate = this.$element.hasClass('fade') ? 'fade' : '' + + if (this.isShown && this.options.backdrop) { + var doAnimate = $.support.transition && animate + + this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />') + .appendTo(document.body) + + this.$backdrop.click( + this.options.backdrop == 'static' ? + $.proxy(this.$element[0].focus, this.$element[0]) + : $.proxy(this.hide, this) + ) + + if (doAnimate) this.$backdrop[0].offsetWidth // force reflow + + this.$backdrop.addClass('in') + + doAnimate ? + this.$backdrop.one($.support.transition.end, callback) : + callback() + + } else if (!this.isShown && this.$backdrop) { + this.$backdrop.removeClass('in') + + $.support.transition && this.$element.hasClass('fade')? + this.$backdrop.one($.support.transition.end, $.proxy(this.removeBackdrop, this)) : + this.removeBackdrop() + + } else if (callback) { + callback() + } + } + } + + + /* MODAL PLUGIN DEFINITION + * ======================= */ + + var old = $.fn.modal + + $.fn.modal = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('modal') + , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option) + if (!data) $this.data('modal', (data = new Modal(this, options))) + if (typeof option == 'string') data[option]() + else if (options.show) data.show() + }) + } + + $.fn.modal.defaults = { + backdrop: true + , keyboard: true + , show: true + } + + $.fn.modal.Constructor = Modal + + + /* MODAL NO CONFLICT + * ================= */ + + $.fn.modal.noConflict = function () { + $.fn.modal = old + return this + } + + + /* MODAL DATA-API + * ============== */ + + $(document).on('click.modal.data-api', '[data-toggle="modal"]', function (e) { + var $this = $(this) + , href = $this.attr('href') + , $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7 + , option = $target.data('modal') ? 'toggle' : $.extend({ remote:!/#/.test(href) && href }, $target.data(), $this.data()) + + e.preventDefault() + + $target + .modal(option) + .one('hide', function () { + $this.focus() + }) + }) + +}(window.jQuery); +/* ============================================================= + * bootstrap-scrollspy.js v2.2.2 + * http://twitter.github.com/bootstrap/javascript.html#scrollspy + * ============================================================= + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* SCROLLSPY CLASS DEFINITION + * ========================== */ + + function ScrollSpy(element, options) { + var process = $.proxy(this.process, this) + , $element = $(element).is('body') ? $(window) : $(element) + , href + this.options = $.extend({}, $.fn.scrollspy.defaults, options) + this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process) + this.selector = (this.options.target + || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 + || '') + ' .nav li > a' + this.$body = $('body') + this.refresh() + this.process() + } + + ScrollSpy.prototype = { + + constructor: ScrollSpy + + , refresh: function () { + var self = this + , $targets + + this.offsets = $([]) + this.targets = $([]) + + $targets = this.$body + .find(this.selector) + .map(function () { + var $el = $(this) + , href = $el.data('target') || $el.attr('href') + , $href = /^#\w/.test(href) && $(href) + return ( $href + && $href.length + && [[ $href.position().top + self.$scrollElement.scrollTop(), href ]] ) || null + }) + .sort(function (a, b) { return a[0] - b[0] }) + .each(function () { + self.offsets.push(this[0]) + self.targets.push(this[1]) + }) + } + + , process: function () { + var scrollTop = this.$scrollElement.scrollTop() + this.options.offset + , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight + , maxScroll = scrollHeight - this.$scrollElement.height() + , offsets = this.offsets + , targets = this.targets + , activeTarget = this.activeTarget + , i + + if (scrollTop >= maxScroll) { + return activeTarget != (i = targets.last()[0]) + && this.activate ( i ) + } + + for (i = offsets.length; i--;) { + activeTarget != targets[i] + && scrollTop >= offsets[i] + && (!offsets[i + 1] || scrollTop <= offsets[i + 1]) + && this.activate( targets[i] ) + } + } + + , activate: function (target) { + var active + , selector + + this.activeTarget = target + + $(this.selector) + .parent('.active') + .removeClass('active') + + selector = this.selector + + '[data-target="' + target + '"],' + + this.selector + '[href="' + target + '"]' + + active = $(selector) + .parent('li') + .addClass('active') + + if (active.parent('.dropdown-menu').length) { + active = active.closest('li.dropdown').addClass('active') + } + + active.trigger('activate') + } + + } + + + /* SCROLLSPY PLUGIN DEFINITION + * =========================== */ + + var old = $.fn.scrollspy + + $.fn.scrollspy = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('scrollspy') + , options = typeof option == 'object' && option + if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.scrollspy.Constructor = ScrollSpy + + $.fn.scrollspy.defaults = { + offset: 10 + } + + + /* SCROLLSPY NO CONFLICT + * ===================== */ + + $.fn.scrollspy.noConflict = function () { + $.fn.scrollspy = old + return this + } + + + /* SCROLLSPY DATA-API + * ================== */ + + $(window).on('load', function () { + $('[data-spy="scroll"]').each(function () { + var $spy = $(this) + $spy.scrollspy($spy.data()) + }) + }) + +}(window.jQuery);/* ======================================================== + * bootstrap-tab.js v2.2.2 + * http://twitter.github.com/bootstrap/javascript.html#tabs + * ======================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ======================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* TAB CLASS DEFINITION + * ==================== */ + + var Tab = function (element) { + this.element = $(element) + } + + Tab.prototype = { + + constructor: Tab + + , show: function () { + var $this = this.element + , $ul = $this.closest('ul:not(.dropdown-menu)') + , selector = $this.attr('data-target') + , previous + , $target + , e + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 + } + + if ( $this.parent('li').hasClass('active') ) return + + previous = $ul.find('.active:last a')[0] + + e = $.Event('show', { + relatedTarget: previous + }) + + $this.trigger(e) + + if (e.isDefaultPrevented()) return + + $target = $(selector) + + this.activate($this.parent('li'), $ul) + this.activate($target, $target.parent(), function () { + $this.trigger({ + type: 'shown' + , relatedTarget: previous + }) + }) + } + + , activate: function ( element, container, callback) { + var $active = container.find('> .active') + , transition = callback + && $.support.transition + && $active.hasClass('fade') + + function next() { + $active + .removeClass('active') + .find('> .dropdown-menu > .active') + .removeClass('active') + + element.addClass('active') + + if (transition) { + element[0].offsetWidth // reflow for transition + element.addClass('in') + } else { + element.removeClass('fade') + } + + if ( element.parent('.dropdown-menu') ) { + element.closest('li.dropdown').addClass('active') + } + + callback && callback() + } + + transition ? + $active.one($.support.transition.end, next) : + next() + + $active.removeClass('in') + } + } + + + /* TAB PLUGIN DEFINITION + * ===================== */ + + var old = $.fn.tab + + $.fn.tab = function ( option ) { + return this.each(function () { + var $this = $(this) + , data = $this.data('tab') + if (!data) $this.data('tab', (data = new Tab(this))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.tab.Constructor = Tab + + + /* TAB NO CONFLICT + * =============== */ + + $.fn.tab.noConflict = function () { + $.fn.tab = old + return this + } + + + /* TAB DATA-API + * ============ */ + + $(document).on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) { + e.preventDefault() + $(this).tab('show') + }) + +}(window.jQuery);/* =========================================================== + * bootstrap-tooltip.js v2.2.2 + * http://twitter.github.com/bootstrap/javascript.html#tooltips + * Inspired by the original jQuery.tipsy by Jason Frame + * =========================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* TOOLTIP PUBLIC CLASS DEFINITION + * =============================== */ + + var Tooltip = function (element, options) { + this.init('tooltip', element, options) + } + + Tooltip.prototype = { + + constructor: Tooltip + + , init: function (type, element, options) { + var eventIn + , eventOut + + this.type = type + this.$element = $(element) + this.options = this.getOptions(options) + this.enabled = true + + if (this.options.trigger == 'click') { + this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) + } else if (this.options.trigger != 'manual') { + eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus' + eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur' + this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) + this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) + } + + this.options.selector ? + (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : + this.fixTitle() + } + + , getOptions: function (options) { + options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data()) + + if (options.delay && typeof options.delay == 'number') { + options.delay = { + show: options.delay + , hide: options.delay + } + } + + return options + } + + , enter: function (e) { + var self = $(e.currentTarget)[this.type](this._options).data(this.type) + + if (!self.options.delay || !self.options.delay.show) return self.show() + + clearTimeout(this.timeout) + self.hoverState = 'in' + this.timeout = setTimeout(function() { + if (self.hoverState == 'in') self.show() + }, self.options.delay.show) + } + + , leave: function (e) { + var self = $(e.currentTarget)[this.type](this._options).data(this.type) + + if (this.timeout) clearTimeout(this.timeout) + if (!self.options.delay || !self.options.delay.hide) return self.hide() + + self.hoverState = 'out' + this.timeout = setTimeout(function() { + if (self.hoverState == 'out') self.hide() + }, self.options.delay.hide) + } + + , show: function () { + var $tip + , inside + , pos + , actualWidth + , actualHeight + , placement + , tp + + if (this.hasContent() && this.enabled) { + $tip = this.tip() + this.setContent() + + if (this.options.animation) { + $tip.addClass('fade') + } + + placement = typeof this.options.placement == 'function' ? + this.options.placement.call(this, $tip[0], this.$element[0]) : + this.options.placement + + inside = /in/.test(placement) + + $tip + .detach() + .css({ top: 0, left: 0, display: 'block' }) + .insertAfter(this.$element) + + pos = this.getPosition(inside) + + actualWidth = $tip[0].offsetWidth + actualHeight = $tip[0].offsetHeight + + switch (inside ? placement.split(' ')[1] : placement) { + case 'bottom': + tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2} + break + case 'top': + tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2} + break + case 'left': + tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth} + break + case 'right': + tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width} + break + } + + $tip + .offset(tp) + .addClass(placement) + .addClass('in') + } + } + + , setContent: function () { + var $tip = this.tip() + , title = this.getTitle() + + $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) + $tip.removeClass('fade in top bottom left right') + } + + , hide: function () { + var that = this + , $tip = this.tip() + + $tip.removeClass('in') + + function removeWithAnimation() { + var timeout = setTimeout(function () { + $tip.off($.support.transition.end).detach() + }, 500) + + $tip.one($.support.transition.end, function () { + clearTimeout(timeout) + $tip.detach() + }) + } + + $.support.transition && this.$tip.hasClass('fade') ? + removeWithAnimation() : + $tip.detach() + + return this + } + + , fixTitle: function () { + var $e = this.$element + if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') { + $e.attr('data-original-title', $e.attr('title') || '').removeAttr('title') + } + } + + , hasContent: function () { + return this.getTitle() + } + + , getPosition: function (inside) { + return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()), { + width: this.$element[0].offsetWidth + , height: this.$element[0].offsetHeight + }) + } + + , getTitle: function () { + var title + , $e = this.$element + , o = this.options + + title = $e.attr('data-original-title') + || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) + + return title + } + + , tip: function () { + return this.$tip = this.$tip || $(this.options.template) + } + + , validate: function () { + if (!this.$element[0].parentNode) { + this.hide() + this.$element = null + this.options = null + } + } + + , enable: function () { + this.enabled = true + } + + , disable: function () { + this.enabled = false + } + + , toggleEnabled: function () { + this.enabled = !this.enabled + } + + , toggle: function (e) { + var self = $(e.currentTarget)[this.type](this._options).data(this.type) + self[self.tip().hasClass('in') ? 'hide' : 'show']() + } + + , destroy: function () { + this.hide().$element.off('.' + this.type).removeData(this.type) + } + + } + + + /* TOOLTIP PLUGIN DEFINITION + * ========================= */ + + var old = $.fn.tooltip + + $.fn.tooltip = function ( option ) { + return this.each(function () { + var $this = $(this) + , data = $this.data('tooltip') + , options = typeof option == 'object' && option + if (!data) $this.data('tooltip', (data = new Tooltip(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.tooltip.Constructor = Tooltip + + $.fn.tooltip.defaults = { + animation: true + , placement: 'top' + , selector: false + , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>' + , trigger: 'hover' + , title: '' + , delay: 0 + , html: false + } + + + /* TOOLTIP NO CONFLICT + * =================== */ + + $.fn.tooltip.noConflict = function () { + $.fn.tooltip = old + return this + } + +}(window.jQuery);/* =================================================== + * bootstrap-transition.js v2.2.2 + * http://twitter.github.com/bootstrap/javascript.html#transitions + * =================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* CSS TRANSITION SUPPORT (http://www.modernizr.com/) + * ======================================================= */ + + $(function () { + + $.support.transition = (function () { + + var transitionEnd = (function () { + + var el = document.createElement('bootstrap') + , transEndEventNames = { + 'WebkitTransition' : 'webkitTransitionEnd' + , 'MozTransition' : 'transitionend' + , 'OTransition' : 'oTransitionEnd otransitionend' + , 'transition' : 'transitionend' + } + , name + + for (name in transEndEventNames){ + if (el.style[name] !== undefined) { + return transEndEventNames[name] + } + } + + }()) + + return transitionEnd && { + end: transitionEnd + } + + })() + + }) + +}(window.jQuery);/* ============================================================= + * bootstrap-typeahead.js v2.2.2 + * http://twitter.github.com/bootstrap/javascript.html#typeahead + * ============================================================= + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function($){ + + "use strict"; // jshint ;_; + + + /* TYPEAHEAD PUBLIC CLASS DEFINITION + * ================================= */ + + var Typeahead = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, $.fn.typeahead.defaults, options) + this.matcher = this.options.matcher || this.matcher + this.sorter = this.options.sorter || this.sorter + this.highlighter = this.options.highlighter || this.highlighter + this.updater = this.options.updater || this.updater + this.source = this.options.source + this.$menu = $(this.options.menu) + this.shown = false + this.listen() + } + + Typeahead.prototype = { + + constructor: Typeahead + + , select: function () { + var val = this.$menu.find('.active').attr('data-value') + this.$element + .val(this.updater(val)) + .change() + return this.hide() + } + + , updater: function (item) { + return item + } + + , show: function () { + var pos = $.extend({}, this.$element.position(), { + height: this.$element[0].offsetHeight + }) + + this.$menu + .insertAfter(this.$element) + .css({ + top: pos.top + pos.height + , left: pos.left + }) + .show() + + this.shown = true + return this + } + + , hide: function () { + this.$menu.hide() + this.shown = false + return this + } + + , lookup: function (event) { + var items + + this.query = this.$element.val() + + if (!this.query || this.query.length < this.options.minLength) { + return this.shown ? this.hide() : this + } + + items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source + + return items ? this.process(items) : this + } + + , process: function (items) { + var that = this + + items = $.grep(items, function (item) { + return that.matcher(item) + }) + + items = this.sorter(items) + + if (!items.length) { + return this.shown ? this.hide() : this + } + + return this.render(items.slice(0, this.options.items)).show() + } + + , matcher: function (item) { + return ~item.toLowerCase().indexOf(this.query.toLowerCase()) + } + + , sorter: function (items) { + var beginswith = [] + , caseSensitive = [] + , caseInsensitive = [] + , item + + while (item = items.shift()) { + if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item) + else if (~item.indexOf(this.query)) caseSensitive.push(item) + else caseInsensitive.push(item) + } + + return beginswith.concat(caseSensitive, caseInsensitive) + } + + , highlighter: function (item) { + var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&') + return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) { + return '<strong>' + match + '</strong>' + }) + } + + , render: function (items) { + var that = this + + items = $(items).map(function (i, item) { + i = $(that.options.item).attr('data-value', item) + i.find('a').html(that.highlighter(item)) + return i[0] + }) + + items.first().addClass('active') + this.$menu.html(items) + return this + } + + , next: function (event) { + var active = this.$menu.find('.active').removeClass('active') + , next = active.next() + + if (!next.length) { + next = $(this.$menu.find('li')[0]) + } + + next.addClass('active') + } + + , prev: function (event) { + var active = this.$menu.find('.active').removeClass('active') + , prev = active.prev() + + if (!prev.length) { + prev = this.$menu.find('li').last() + } + + prev.addClass('active') + } + + , listen: function () { + this.$element + .on('blur', $.proxy(this.blur, this)) + .on('keypress', $.proxy(this.keypress, this)) + .on('keyup', $.proxy(this.keyup, this)) + + if (this.eventSupported('keydown')) { + this.$element.on('keydown', $.proxy(this.keydown, this)) + } + + this.$menu + .on('click', $.proxy(this.click, this)) + .on('mouseenter', 'li', $.proxy(this.mouseenter, this)) + } + + , eventSupported: function(eventName) { + var isSupported = eventName in this.$element + if (!isSupported) { + this.$element.setAttribute(eventName, 'return;') + isSupported = typeof this.$element[eventName] === 'function' + } + return isSupported + } + + , move: function (e) { + if (!this.shown) return + + switch(e.keyCode) { + case 9: // tab + case 13: // enter + case 27: // escape + e.preventDefault() + break + + case 38: // up arrow + e.preventDefault() + this.prev() + break + + case 40: // down arrow + e.preventDefault() + this.next() + break + } + + e.stopPropagation() + } + + , keydown: function (e) { + this.suppressKeyPressRepeat = ~$.inArray(e.keyCode, [40,38,9,13,27]) + this.move(e) + } + + , keypress: function (e) { + if (this.suppressKeyPressRepeat) return + this.move(e) + } + + , keyup: function (e) { + switch(e.keyCode) { + case 40: // down arrow + case 38: // up arrow + case 16: // shift + case 17: // ctrl + case 18: // alt + break + + case 9: // tab + case 13: // enter + if (!this.shown) return + this.select() + break + + case 27: // escape + if (!this.shown) return + this.hide() + break + + default: + this.lookup() + } + + e.stopPropagation() + e.preventDefault() + } + + , blur: function (e) { + var that = this + setTimeout(function () { that.hide() }, 150) + } + + , click: function (e) { + e.stopPropagation() + e.preventDefault() + this.select() + } + + , mouseenter: function (e) { + this.$menu.find('.active').removeClass('active') + $(e.currentTarget).addClass('active') + } + + } + + + /* TYPEAHEAD PLUGIN DEFINITION + * =========================== */ + + var old = $.fn.typeahead + + $.fn.typeahead = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('typeahead') + , options = typeof option == 'object' && option + if (!data) $this.data('typeahead', (data = new Typeahead(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.typeahead.defaults = { + source: [] + , items: 8 + , menu: '<ul class="typeahead dropdown-menu"></ul>' + , item: '<li><a href="#"></a></li>' + , minLength: 1 + } + + $.fn.typeahead.Constructor = Typeahead + + + /* TYPEAHEAD NO CONFLICT + * =================== */ + + $.fn.typeahead.noConflict = function () { + $.fn.typeahead = old + return this + } + + + /* TYPEAHEAD DATA-API + * ================== */ + + $(document).on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) { + var $this = $(this) + if ($this.data('typeahead')) return + e.preventDefault() + $this.typeahead($this.data()) + }) + +}(window.jQuery); +/* =========================================================== + * bootstrap-popover.js v2.2.2 + * http://twitter.github.com/bootstrap/javascript.html#popovers + * =========================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * =========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* POPOVER PUBLIC CLASS DEFINITION + * =============================== */ + + var Popover = function (element, options) { + this.init('popover', element, options) + } + + + /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js + ========================================== */ + + Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, { + + constructor: Popover + + , setContent: function () { + var $tip = this.tip() + , title = this.getTitle() + , content = this.getContent() + + $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) + $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content) + + $tip.removeClass('fade top bottom left right in') + } + + , hasContent: function () { + return this.getTitle() || this.getContent() + } + + , getContent: function () { + var content + , $e = this.$element + , o = this.options + + content = $e.attr('data-content') + || (typeof o.content == 'function' ? o.content.call($e[0]) : o.content) + + return content + } + + , tip: function () { + if (!this.$tip) { + this.$tip = $(this.options.template) + } + return this.$tip + } + + , destroy: function () { + this.hide().$element.off('.' + this.type).removeData(this.type) + } + + }) + + + /* POPOVER PLUGIN DEFINITION + * ======================= */ + + var old = $.fn.popover + + $.fn.popover = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('popover') + , options = typeof option == 'object' && option + if (!data) $this.data('popover', (data = new Popover(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.popover.Constructor = Popover + + $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, { + placement: 'right' + , trigger: 'click' + , content: '' + , template: '<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"></div></div></div>' + }) + + + /* POPOVER NO CONFLICT + * =================== */ + + $.fn.popover.noConflict = function () { + $.fn.popover = old + return this + } + +}(window.jQuery); +}); +/* @source lib/socket.io.js */; + +/*! Socket.IO.js build:0.9.16, development. Copyright(c) 2011 LearnBoost <dev@learnboost.com> MIT Licensed */ + +var io = ('undefined' === typeof module ? {} : module.exports); +(function() { + +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, global) { + + /** + * IO namespace. + * + * @namespace + */ + + var io = exports; + + /** + * Socket.IO version + * + * @api public + */ + + io.version = '0.9.16'; + + /** + * Protocol implemented. + * + * @api public + */ + + io.protocol = 1; + + /** + * Available transports, these will be populated with the available transports + * + * @api public + */ + + io.transports = []; + + /** + * Keep track of jsonp callbacks. + * + * @api private + */ + + io.j = []; + + /** + * Keep track of our io.Sockets + * + * @api private + */ + io.sockets = {}; + + + /** + * Manages connections to hosts. + * + * @param {String} uri + * @Param {Boolean} force creation of new socket (defaults to false) + * @api public + */ + + io.connect = function (host, details) { + var uri = io.util.parseUri(host) + , uuri + , socket; + + if (global && global.location) { + uri.protocol = uri.protocol || global.location.protocol.slice(0, -1); + uri.host = uri.host || (global.document + ? global.document.domain : global.location.hostname); + uri.port = uri.port || global.location.port; + } + + uuri = io.util.uniqueUri(uri); + + var options = { + host: uri.host + , secure: 'https' == uri.protocol + , port: uri.port || ('https' == uri.protocol ? 443 : 80) + , query: uri.query || '' + }; + + io.util.merge(options, details); + + if (options['force new connection'] || !io.sockets[uuri]) { + socket = new io.Socket(options); + } + + if (!options['force new connection'] && socket) { + io.sockets[uuri] = socket; + } + + socket = socket || io.sockets[uuri]; + + // if path is different from '' or / + return socket.of(uri.path.length > 1 ? uri.path : ''); + }; + +})('object' === typeof module ? module.exports : (this.io = {}), this); +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, global) { + + /** + * Utilities namespace. + * + * @namespace + */ + + var util = exports.util = {}; + + /** + * Parses an URI + * + * @author Steven Levithan <stevenlevithan.com> (MIT license) + * @api public + */ + + var re = /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/; + + var parts = ['source', 'protocol', 'authority', 'userInfo', 'user', 'password', + 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', + 'anchor']; + + util.parseUri = function (str) { + var m = re.exec(str || '') + , uri = {} + , i = 14; + + while (i--) { + uri[parts[i]] = m[i] || ''; + } + + return uri; + }; + + /** + * Produces a unique url that identifies a Socket.IO connection. + * + * @param {Object} uri + * @api public + */ + + util.uniqueUri = function (uri) { + var protocol = uri.protocol + , host = uri.host + , port = uri.port; + + if ('document' in global) { + host = host || document.domain; + port = port || (protocol == 'https' + && document.location.protocol !== 'https:' ? 443 : document.location.port); + } else { + host = host || 'localhost'; + + if (!port && protocol == 'https') { + port = 443; + } + } + + return (protocol || 'http') + '://' + host + ':' + (port || 80); + }; + + /** + * Mergest 2 query strings in to once unique query string + * + * @param {String} base + * @param {String} addition + * @api public + */ + + util.query = function (base, addition) { + var query = util.chunkQuery(base || '') + , components = []; + + util.merge(query, util.chunkQuery(addition || '')); + for (var part in query) { + if (query.hasOwnProperty(part)) { + components.push(part + '=' + query[part]); + } + } + + return components.length ? '?' + components.join('&') : ''; + }; + + /** + * Transforms a querystring in to an object + * + * @param {String} qs + * @api public + */ + + util.chunkQuery = function (qs) { + var query = {} + , params = qs.split('&') + , i = 0 + , l = params.length + , kv; + + for (; i < l; ++i) { + kv = params[i].split('='); + if (kv[0]) { + query[kv[0]] = kv[1]; + } + } + + return query; + }; + + /** + * Executes the given function when the page is loaded. + * + * io.util.load(function () { console.log('page loaded'); }); + * + * @param {Function} fn + * @api public + */ + + var pageLoaded = false; + + util.load = function (fn) { + if ('document' in global && document.readyState === 'complete' || pageLoaded) { + return fn(); + } + + util.on(global, 'load', fn, false); + }; + + /** + * Adds an event. + * + * @api private + */ + + util.on = function (element, event, fn, capture) { + if (element.attachEvent) { + element.attachEvent('on' + event, fn); + } else if (element.addEventListener) { + element.addEventListener(event, fn, capture); + } + }; + + /** + * Generates the correct `XMLHttpRequest` for regular and cross domain requests. + * + * @param {Boolean} [xdomain] Create a request that can be used cross domain. + * @returns {XMLHttpRequest|false} If we can create a XMLHttpRequest. + * @api private + */ + + util.request = function (xdomain) { + + if (xdomain && 'undefined' != typeof XDomainRequest && !util.ua.hasCORS) { + return new XDomainRequest(); + } + + if ('undefined' != typeof XMLHttpRequest && (!xdomain || util.ua.hasCORS)) { + return new XMLHttpRequest(); + } + + if (!xdomain) { + try { + return new window[(['Active'].concat('Object').join('X'))]('Microsoft.XMLHTTP'); + } catch(e) { } + } + + return null; + }; + + /** + * XHR based transport constructor. + * + * @constructor + * @api public + */ + + /** + * Change the internal pageLoaded value. + */ + + if ('undefined' != typeof window) { + util.load(function () { + pageLoaded = true; + }); + } + + /** + * Defers a function to ensure a spinner is not displayed by the browser + * + * @param {Function} fn + * @api public + */ + + util.defer = function (fn) { + if (!util.ua.webkit || 'undefined' != typeof importScripts) { + return fn(); + } + + util.load(function () { + setTimeout(fn, 100); + }); + }; + + /** + * Merges two objects. + * + * @api public + */ + + util.merge = function merge (target, additional, deep, lastseen) { + var seen = lastseen || [] + , depth = typeof deep == 'undefined' ? 2 : deep + , prop; + + for (prop in additional) { + if (additional.hasOwnProperty(prop) && util.indexOf(seen, prop) < 0) { + if (typeof target[prop] !== 'object' || !depth) { + target[prop] = additional[prop]; + seen.push(additional[prop]); + } else { + util.merge(target[prop], additional[prop], depth - 1, seen); + } + } + } + + return target; + }; + + /** + * Merges prototypes from objects + * + * @api public + */ + + util.mixin = function (ctor, ctor2) { + util.merge(ctor.prototype, ctor2.prototype); + }; + + /** + * Shortcut for prototypical and static inheritance. + * + * @api private + */ + + util.inherit = function (ctor, ctor2) { + function f() {}; + f.prototype = ctor2.prototype; + ctor.prototype = new f; + }; + + /** + * Checks if the given object is an Array. + * + * io.util.isArray([]); // true + * io.util.isArray({}); // false + * + * @param Object obj + * @api public + */ + + util.isArray = Array.isArray || function (obj) { + return Object.prototype.toString.call(obj) === '[object Array]'; + }; + + /** + * Intersects values of two arrays into a third + * + * @api public + */ + + util.intersect = function (arr, arr2) { + var ret = [] + , longest = arr.length > arr2.length ? arr : arr2 + , shortest = arr.length > arr2.length ? arr2 : arr; + + for (var i = 0, l = shortest.length; i < l; i++) { + if (~util.indexOf(longest, shortest[i])) + ret.push(shortest[i]); + } + + return ret; + }; + + /** + * Array indexOf compatibility. + * + * @see bit.ly/a5Dxa2 + * @api public + */ + + util.indexOf = function (arr, o, i) { + + for (var j = arr.length, i = i < 0 ? i + j < 0 ? 0 : i + j : i || 0; + i < j && arr[i] !== o; i++) {} + + return j <= i ? -1 : i; + }; + + /** + * Converts enumerables to array. + * + * @api public + */ + + util.toArray = function (enu) { + var arr = []; + + for (var i = 0, l = enu.length; i < l; i++) + arr.push(enu[i]); + + return arr; + }; + + /** + * UA / engines detection namespace. + * + * @namespace + */ + + util.ua = {}; + + /** + * Whether the UA supports CORS for XHR. + * + * @api public + */ + + util.ua.hasCORS = 'undefined' != typeof XMLHttpRequest && (function () { + try { + var a = new XMLHttpRequest(); + } catch (e) { + return false; + } + + return a.withCredentials != undefined; + })(); + + /** + * Detect webkit. + * + * @api public + */ + + util.ua.webkit = 'undefined' != typeof navigator + && /webkit/i.test(navigator.userAgent); + + /** + * Detect iPad/iPhone/iPod. + * + * @api public + */ + + util.ua.iDevice = 'undefined' != typeof navigator + && /iPad|iPhone|iPod/i.test(navigator.userAgent); + +})('undefined' != typeof io ? io : module.exports, this); +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.EventEmitter = EventEmitter; + + /** + * Event emitter constructor. + * + * @api public. + */ + + function EventEmitter () {}; + + /** + * Adds a listener + * + * @api public + */ + + EventEmitter.prototype.on = function (name, fn) { + if (!this.$events) { + this.$events = {}; + } + + if (!this.$events[name]) { + this.$events[name] = fn; + } else if (io.util.isArray(this.$events[name])) { + this.$events[name].push(fn); + } else { + this.$events[name] = [this.$events[name], fn]; + } + + return this; + }; + + EventEmitter.prototype.addListener = EventEmitter.prototype.on; + + /** + * Adds a volatile listener. + * + * @api public + */ + + EventEmitter.prototype.once = function (name, fn) { + var self = this; + + function on () { + self.removeListener(name, on); + fn.apply(this, arguments); + }; + + on.listener = fn; + this.on(name, on); + + return this; + }; + + /** + * Removes a listener. + * + * @api public + */ + + EventEmitter.prototype.removeListener = function (name, fn) { + if (this.$events && this.$events[name]) { + var list = this.$events[name]; + + if (io.util.isArray(list)) { + var pos = -1; + + for (var i = 0, l = list.length; i < l; i++) { + if (list[i] === fn || (list[i].listener && list[i].listener === fn)) { + pos = i; + break; + } + } + + if (pos < 0) { + return this; + } + + list.splice(pos, 1); + + if (!list.length) { + delete this.$events[name]; + } + } else if (list === fn || (list.listener && list.listener === fn)) { + delete this.$events[name]; + } + } + + return this; + }; + + /** + * Removes all listeners for an event. + * + * @api public + */ + + EventEmitter.prototype.removeAllListeners = function (name) { + if (name === undefined) { + this.$events = {}; + return this; + } + + if (this.$events && this.$events[name]) { + this.$events[name] = null; + } + + return this; + }; + + /** + * Gets all listeners for a certain event. + * + * @api publci + */ + + EventEmitter.prototype.listeners = function (name) { + if (!this.$events) { + this.$events = {}; + } + + if (!this.$events[name]) { + this.$events[name] = []; + } + + if (!io.util.isArray(this.$events[name])) { + this.$events[name] = [this.$events[name]]; + } + + return this.$events[name]; + }; + + /** + * Emits an event. + * + * @api public + */ + + EventEmitter.prototype.emit = function (name) { + if (!this.$events) { + return false; + } + + var handler = this.$events[name]; + + if (!handler) { + return false; + } + + var args = Array.prototype.slice.call(arguments, 1); + + if ('function' == typeof handler) { + handler.apply(this, args); + } else if (io.util.isArray(handler)) { + var listeners = handler.slice(); + + for (var i = 0, l = listeners.length; i < l; i++) { + listeners[i].apply(this, args); + } + } else { + return false; + } + + return true; + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +/** + * Based on JSON2 (http://www.JSON.org/js.html). + */ + +(function (exports, nativeJSON) { + "use strict"; + + // use native JSON if it's available + if (nativeJSON && nativeJSON.parse){ + return exports.JSON = { + parse: nativeJSON.parse + , stringify: nativeJSON.stringify + }; + } + + var JSON = exports.JSON = {}; + + function f(n) { + // Format integers to have at least two digits. + return n < 10 ? '0' + n : n; + } + + function date(d, key) { + return isFinite(d.valueOf()) ? + d.getUTCFullYear() + '-' + + f(d.getUTCMonth() + 1) + '-' + + f(d.getUTCDate()) + 'T' + + f(d.getUTCHours()) + ':' + + f(d.getUTCMinutes()) + ':' + + f(d.getUTCSeconds()) + 'Z' : null; + }; + + var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + gap, + indent, + meta = { // table of character substitutions + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '\\': '\\\\' + }, + rep; + + + function quote(string) { + +// If the string contains no control characters, no quote characters, and no +// backslash characters, then we can safely slap some quotes around it. +// Otherwise we must also replace the offending characters with safe escape +// sequences. + + escapable.lastIndex = 0; + return escapable.test(string) ? '"' + string.replace(escapable, function (a) { + var c = meta[a]; + return typeof c === 'string' ? c : + '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }) + '"' : '"' + string + '"'; + } + + + function str(key, holder) { + +// Produce a string from holder[key]. + + var i, // The loop counter. + k, // The member key. + v, // The member value. + length, + mind = gap, + partial, + value = holder[key]; + +// If the value has a toJSON method, call it to obtain a replacement value. + + if (value instanceof Date) { + value = date(key); + } + +// If we were called with a replacer function, then call the replacer to +// obtain a replacement value. + + if (typeof rep === 'function') { + value = rep.call(holder, key, value); + } + +// What happens next depends on the value's type. + + switch (typeof value) { + case 'string': + return quote(value); + + case 'number': + +// JSON numbers must be finite. Encode non-finite numbers as null. + + return isFinite(value) ? String(value) : 'null'; + + case 'boolean': + case 'null': + +// If the value is a boolean or null, convert it to a string. Note: +// typeof null does not produce 'null'. The case is included here in +// the remote chance that this gets fixed someday. + + return String(value); + +// If the type is 'object', we might be dealing with an object or an array or +// null. + + case 'object': + +// Due to a specification blunder in ECMAScript, typeof null is 'object', +// so watch out for that case. + + if (!value) { + return 'null'; + } + +// Make an array to hold the partial results of stringifying this object value. + + gap += indent; + partial = []; + +// Is the value an array? + + if (Object.prototype.toString.apply(value) === '[object Array]') { + +// The value is an array. Stringify every element. Use null as a placeholder +// for non-JSON values. + + length = value.length; + for (i = 0; i < length; i += 1) { + partial[i] = str(i, value) || 'null'; + } + +// Join all of the elements together, separated with commas, and wrap them in +// brackets. + + v = partial.length === 0 ? '[]' : gap ? + '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : + '[' + partial.join(',') + ']'; + gap = mind; + return v; + } + +// If the replacer is an array, use it to select the members to be stringified. + + if (rep && typeof rep === 'object') { + length = rep.length; + for (i = 0; i < length; i += 1) { + if (typeof rep[i] === 'string') { + k = rep[i]; + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } else { + +// Otherwise, iterate through all of the keys in the object. + + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } + +// Join all of the member texts together, separated with commas, +// and wrap them in braces. + + v = partial.length === 0 ? '{}' : gap ? + '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : + '{' + partial.join(',') + '}'; + gap = mind; + return v; + } + } + +// If the JSON object does not yet have a stringify method, give it one. + + JSON.stringify = function (value, replacer, space) { + +// The stringify method takes a value and an optional replacer, and an optional +// space parameter, and returns a JSON text. The replacer can be a function +// that can replace values, or an array of strings that will select the keys. +// A default replacer method can be provided. Use of the space parameter can +// produce text that is more easily readable. + + var i; + gap = ''; + indent = ''; + +// If the space parameter is a number, make an indent string containing that +// many spaces. + + if (typeof space === 'number') { + for (i = 0; i < space; i += 1) { + indent += ' '; + } + +// If the space parameter is a string, it will be used as the indent string. + + } else if (typeof space === 'string') { + indent = space; + } + +// If there is a replacer, it must be a function or an array. +// Otherwise, throw an error. + + rep = replacer; + if (replacer && typeof replacer !== 'function' && + (typeof replacer !== 'object' || + typeof replacer.length !== 'number')) { + throw new Error('JSON.stringify'); + } + +// Make a fake root object containing our value under the key of ''. +// Return the result of stringifying the value. + + return str('', {'': value}); + }; + +// If the JSON object does not yet have a parse method, give it one. + + JSON.parse = function (text, reviver) { + // The parse method takes a text and an optional reviver function, and returns + // a JavaScript value if the text is a valid JSON text. + + var j; + + function walk(holder, key) { + + // The walk method is used to recursively walk the resulting structure so + // that modifications can be made. + + var k, v, value = holder[key]; + if (value && typeof value === 'object') { + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = walk(value, k); + if (v !== undefined) { + value[k] = v; + } else { + delete value[k]; + } + } + } + } + return reviver.call(holder, key, value); + } + + + // Parsing happens in four stages. In the first stage, we replace certain + // Unicode characters with escape sequences. JavaScript handles many characters + // incorrectly, either silently deleting them, or treating them as line endings. + + text = String(text); + cx.lastIndex = 0; + if (cx.test(text)) { + text = text.replace(cx, function (a) { + return '\\u' + + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }); + } + + // In the second stage, we run the text against regular expressions that look + // for non-JSON patterns. We are especially concerned with '()' and 'new' + // because they can cause invocation, and '=' because it can cause mutation. + // But just to be safe, we want to reject all unexpected forms. + + // We split the second stage into 4 regexp operations in order to work around + // crippling inefficiencies in IE's and Safari's regexp engines. First we + // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we + // replace all simple value tokens with ']' characters. Third, we delete all + // open brackets that follow a colon or comma or that begin the text. Finally, + // we look to see that the remaining characters are only whitespace or ']' or + // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. + + if (/^[\],:{}\s]*$/ + .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') + .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') + .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { + + // In the third stage we use the eval function to compile the text into a + // JavaScript structure. The '{' operator is subject to a syntactic ambiguity + // in JavaScript: it can begin a block or an object literal. We wrap the text + // in parens to eliminate the ambiguity. + + j = eval('(' + text + ')'); + + // In the optional fourth stage, we recursively walk the new structure, passing + // each name/value pair to a reviver function for possible transformation. + + return typeof reviver === 'function' ? + walk({'': j}, '') : j; + } + + // If the text is not JSON parseable, then a SyntaxError is thrown. + + throw new SyntaxError('JSON.parse'); + }; + +})( + 'undefined' != typeof io ? io : module.exports + , typeof JSON !== 'undefined' ? JSON : undefined +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Parser namespace. + * + * @namespace + */ + + var parser = exports.parser = {}; + + /** + * Packet types. + */ + + var packets = parser.packets = [ + 'disconnect' + , 'connect' + , 'heartbeat' + , 'message' + , 'json' + , 'event' + , 'ack' + , 'error' + , 'noop' + ]; + + /** + * Errors reasons. + */ + + var reasons = parser.reasons = [ + 'transport not supported' + , 'client not handshaken' + , 'unauthorized' + ]; + + /** + * Errors advice. + */ + + var advice = parser.advice = [ + 'reconnect' + ]; + + /** + * Shortcuts. + */ + + var JSON = io.JSON + , indexOf = io.util.indexOf; + + /** + * Encodes a packet. + * + * @api private + */ + + parser.encodePacket = function (packet) { + var type = indexOf(packets, packet.type) + , id = packet.id || '' + , endpoint = packet.endpoint || '' + , ack = packet.ack + , data = null; + + switch (packet.type) { + case 'error': + var reason = packet.reason ? indexOf(reasons, packet.reason) : '' + , adv = packet.advice ? indexOf(advice, packet.advice) : ''; + + if (reason !== '' || adv !== '') + data = reason + (adv !== '' ? ('+' + adv) : ''); + + break; + + case 'message': + if (packet.data !== '') + data = packet.data; + break; + + case 'event': + var ev = { name: packet.name }; + + if (packet.args && packet.args.length) { + ev.args = packet.args; + } + + data = JSON.stringify(ev); + break; + + case 'json': + data = JSON.stringify(packet.data); + break; + + case 'connect': + if (packet.qs) + data = packet.qs; + break; + + case 'ack': + data = packet.ackId + + (packet.args && packet.args.length + ? '+' + JSON.stringify(packet.args) : ''); + break; + } + + // construct packet with required fragments + var encoded = [ + type + , id + (ack == 'data' ? '+' : '') + , endpoint + ]; + + // data fragment is optional + if (data !== null && data !== undefined) + encoded.push(data); + + return encoded.join(':'); + }; + + /** + * Encodes multiple messages (payload). + * + * @param {Array} messages + * @api private + */ + + parser.encodePayload = function (packets) { + var decoded = ''; + + if (packets.length == 1) + return packets[0]; + + for (var i = 0, l = packets.length; i < l; i++) { + var packet = packets[i]; + decoded += '\ufffd' + packet.length + '\ufffd' + packets[i]; + } + + return decoded; + }; + + /** + * Decodes a packet + * + * @api private + */ + + var regexp = /([^:]+):([0-9]+)?(\+)?:([^:]+)?:?([\s\S]*)?/; + + parser.decodePacket = function (data) { + var pieces = data.match(regexp); + + if (!pieces) return {}; + + var id = pieces[2] || '' + , data = pieces[5] || '' + , packet = { + type: packets[pieces[1]] + , endpoint: pieces[4] || '' + }; + + // whether we need to acknowledge the packet + if (id) { + packet.id = id; + if (pieces[3]) + packet.ack = 'data'; + else + packet.ack = true; + } + + // handle different packet types + switch (packet.type) { + case 'error': + var pieces = data.split('+'); + packet.reason = reasons[pieces[0]] || ''; + packet.advice = advice[pieces[1]] || ''; + break; + + case 'message': + packet.data = data || ''; + break; + + case 'event': + try { + var opts = JSON.parse(data); + packet.name = opts.name; + packet.args = opts.args; + } catch (e) { } + + packet.args = packet.args || []; + break; + + case 'json': + try { + packet.data = JSON.parse(data); + } catch (e) { } + break; + + case 'connect': + packet.qs = data || ''; + break; + + case 'ack': + var pieces = data.match(/^([0-9]+)(\+)?(.*)/); + if (pieces) { + packet.ackId = pieces[1]; + packet.args = []; + + if (pieces[3]) { + try { + packet.args = pieces[3] ? JSON.parse(pieces[3]) : []; + } catch (e) { } + } + } + break; + + case 'disconnect': + case 'heartbeat': + break; + }; + + return packet; + }; + + /** + * Decodes data payload. Detects multiple messages + * + * @return {Array} messages + * @api public + */ + + parser.decodePayload = function (data) { + // IE doesn't like data[i] for unicode chars, charAt works fine + if (data.charAt(0) == '\ufffd') { + var ret = []; + + for (var i = 1, length = ''; i < data.length; i++) { + if (data.charAt(i) == '\ufffd') { + ret.push(parser.decodePacket(data.substr(i + 1).substr(0, length))); + i += Number(length) + 1; + length = ''; + } else { + length += data.charAt(i); + } + } + + return ret; + } else { + return [parser.decodePacket(data)]; + } + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.Transport = Transport; + + /** + * This is the transport template for all supported transport methods. + * + * @constructor + * @api public + */ + + function Transport (socket, sessid) { + this.socket = socket; + this.sessid = sessid; + }; + + /** + * Apply EventEmitter mixin. + */ + + io.util.mixin(Transport, io.EventEmitter); + + + /** + * Indicates whether heartbeats is enabled for this transport + * + * @api private + */ + + Transport.prototype.heartbeats = function () { + return true; + }; + + /** + * Handles the response from the server. When a new response is received + * it will automatically update the timeout, decode the message and + * forwards the response to the onMessage function for further processing. + * + * @param {String} data Response from the server. + * @api private + */ + + Transport.prototype.onData = function (data) { + this.clearCloseTimeout(); + + // If the connection in currently open (or in a reopening state) reset the close + // timeout since we have just received data. This check is necessary so + // that we don't reset the timeout on an explicitly disconnected connection. + if (this.socket.connected || this.socket.connecting || this.socket.reconnecting) { + this.setCloseTimeout(); + } + + if (data !== '') { + // todo: we should only do decodePayload for xhr transports + var msgs = io.parser.decodePayload(data); + + if (msgs && msgs.length) { + for (var i = 0, l = msgs.length; i < l; i++) { + this.onPacket(msgs[i]); + } + } + } + + return this; + }; + + /** + * Handles packets. + * + * @api private + */ + + Transport.prototype.onPacket = function (packet) { + this.socket.setHeartbeatTimeout(); + + if (packet.type == 'heartbeat') { + return this.onHeartbeat(); + } + + if (packet.type == 'connect' && packet.endpoint == '') { + this.onConnect(); + } + + if (packet.type == 'error' && packet.advice == 'reconnect') { + this.isOpen = false; + } + + this.socket.onPacket(packet); + + return this; + }; + + /** + * Sets close timeout + * + * @api private + */ + + Transport.prototype.setCloseTimeout = function () { + if (!this.closeTimeout) { + var self = this; + + this.closeTimeout = setTimeout(function () { + self.onDisconnect(); + }, this.socket.closeTimeout); + } + }; + + /** + * Called when transport disconnects. + * + * @api private + */ + + Transport.prototype.onDisconnect = function () { + if (this.isOpen) this.close(); + this.clearTimeouts(); + this.socket.onDisconnect(); + return this; + }; + + /** + * Called when transport connects + * + * @api private + */ + + Transport.prototype.onConnect = function () { + this.socket.onConnect(); + return this; + }; + + /** + * Clears close timeout + * + * @api private + */ + + Transport.prototype.clearCloseTimeout = function () { + if (this.closeTimeout) { + clearTimeout(this.closeTimeout); + this.closeTimeout = null; + } + }; + + /** + * Clear timeouts + * + * @api private + */ + + Transport.prototype.clearTimeouts = function () { + this.clearCloseTimeout(); + + if (this.reopenTimeout) { + clearTimeout(this.reopenTimeout); + } + }; + + /** + * Sends a packet + * + * @param {Object} packet object. + * @api private + */ + + Transport.prototype.packet = function (packet) { + this.send(io.parser.encodePacket(packet)); + }; + + /** + * Send the received heartbeat message back to server. So the server + * knows we are still connected. + * + * @param {String} heartbeat Heartbeat response from the server. + * @api private + */ + + Transport.prototype.onHeartbeat = function (heartbeat) { + this.packet({ type: 'heartbeat' }); + }; + + /** + * Called when the transport opens. + * + * @api private + */ + + Transport.prototype.onOpen = function () { + this.isOpen = true; + this.clearCloseTimeout(); + this.socket.onOpen(); + }; + + /** + * Notifies the base when the connection with the Socket.IO server + * has been disconnected. + * + * @api private + */ + + Transport.prototype.onClose = function () { + var self = this; + + /* FIXME: reopen delay causing a infinit loop + this.reopenTimeout = setTimeout(function () { + self.open(); + }, this.socket.options['reopen delay']);*/ + + this.isOpen = false; + this.socket.onClose(); + this.onDisconnect(); + }; + + /** + * Generates a connection url based on the Socket.IO URL Protocol. + * See <https://github.com/learnboost/socket.io-node/> for more details. + * + * @returns {String} Connection url + * @api private + */ + + Transport.prototype.prepareUrl = function () { + var options = this.socket.options; + + return this.scheme() + '://' + + options.host + ':' + options.port + '/' + + options.resource + '/' + io.protocol + + '/' + this.name + '/' + this.sessid; + }; + + /** + * Checks if the transport is ready to start a connection. + * + * @param {Socket} socket The socket instance that needs a transport + * @param {Function} fn The callback + * @api private + */ + + Transport.prototype.ready = function (socket, fn) { + fn.call(this); + }; +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + */ + + exports.Socket = Socket; + + /** + * Create a new `Socket.IO client` which can establish a persistent + * connection with a Socket.IO enabled server. + * + * @api public + */ + + function Socket (options) { + this.options = { + port: 80 + , secure: false + , document: 'document' in global ? document : false + , resource: 'socket.io' + , transports: io.transports + , 'connect timeout': 10000 + , 'try multiple transports': true + , 'reconnect': true + , 'reconnection delay': 500 + , 'reconnection limit': Infinity + , 'reopen delay': 3000 + , 'max reconnection attempts': 10 + , 'sync disconnect on unload': false + , 'auto connect': true + , 'flash policy port': 10843 + , 'manualFlush': false + }; + + io.util.merge(this.options, options); + + this.connected = false; + this.open = false; + this.connecting = false; + this.reconnecting = false; + this.namespaces = {}; + this.buffer = []; + this.doBuffer = false; + + if (this.options['sync disconnect on unload'] && + (!this.isXDomain() || io.util.ua.hasCORS)) { + var self = this; + io.util.on(global, 'beforeunload', function () { + self.disconnectSync(); + }, false); + } + + if (this.options['auto connect']) { + this.connect(); + } +}; + + /** + * Apply EventEmitter mixin. + */ + + io.util.mixin(Socket, io.EventEmitter); + + /** + * Returns a namespace listener/emitter for this socket + * + * @api public + */ + + Socket.prototype.of = function (name) { + if (!this.namespaces[name]) { + this.namespaces[name] = new io.SocketNamespace(this, name); + + if (name !== '') { + this.namespaces[name].packet({ type: 'connect' }); + } + } + + return this.namespaces[name]; + }; + + /** + * Emits the given event to the Socket and all namespaces + * + * @api private + */ + + Socket.prototype.publish = function () { + this.emit.apply(this, arguments); + + var nsp; + + for (var i in this.namespaces) { + if (this.namespaces.hasOwnProperty(i)) { + nsp = this.of(i); + nsp.$emit.apply(nsp, arguments); + } + } + }; + + /** + * Performs the handshake + * + * @api private + */ + + function empty () { }; + + Socket.prototype.handshake = function (fn) { + var self = this + , options = this.options; + + function complete (data) { + if (data instanceof Error) { + self.connecting = false; + self.onError(data.message); + } else { + fn.apply(null, data.split(':')); + } + }; + + var url = [ + 'http' + (options.secure ? 's' : '') + ':/' + , options.host + ':' + options.port + , options.resource + , io.protocol + , io.util.query(this.options.query, 't=' + +new Date) + ].join('/'); + + if (this.isXDomain() && !io.util.ua.hasCORS) { + var insertAt = document.getElementsByTagName('script')[0] + , script = document.createElement('script'); + + script.src = url + '&jsonp=' + io.j.length; + insertAt.parentNode.insertBefore(script, insertAt); + + io.j.push(function (data) { + complete(data); + script.parentNode.removeChild(script); + }); + } else { + var xhr = io.util.request(); + + xhr.open('GET', url, true); + if (this.isXDomain()) { + xhr.withCredentials = true; + } + xhr.onreadystatechange = function () { + if (xhr.readyState == 4) { + xhr.onreadystatechange = empty; + + if (xhr.status == 200) { + complete(xhr.responseText); + } else if (xhr.status == 403) { + self.onError(xhr.responseText); + } else { + self.connecting = false; + !self.reconnecting && self.onError(xhr.responseText); + } + } + }; + xhr.send(null); + } + }; + + /** + * Find an available transport based on the options supplied in the constructor. + * + * @api private + */ + + Socket.prototype.getTransport = function (override) { + var transports = override || this.transports, match; + + for (var i = 0, transport; transport = transports[i]; i++) { + if (io.Transport[transport] + && io.Transport[transport].check(this) + && (!this.isXDomain() || io.Transport[transport].xdomainCheck(this))) { + return new io.Transport[transport](this, this.sessionid); + } + } + + return null; + }; + + /** + * Connects to the server. + * + * @param {Function} [fn] Callback. + * @returns {io.Socket} + * @api public + */ + + Socket.prototype.connect = function (fn) { + if (this.connecting) { + return this; + } + + var self = this; + self.connecting = true; + + this.handshake(function (sid, heartbeat, close, transports) { + self.sessionid = sid; + self.closeTimeout = close * 1000; + self.heartbeatTimeout = heartbeat * 1000; + if(!self.transports) + self.transports = self.origTransports = (transports ? io.util.intersect( + transports.split(',') + , self.options.transports + ) : self.options.transports); + + self.setHeartbeatTimeout(); + + function connect (transports){ + if (self.transport) self.transport.clearTimeouts(); + + self.transport = self.getTransport(transports); + if (!self.transport) return self.publish('connect_failed'); + + // once the transport is ready + self.transport.ready(self, function () { + self.connecting = true; + self.publish('connecting', self.transport.name); + self.transport.open(); + + if (self.options['connect timeout']) { + self.connectTimeoutTimer = setTimeout(function () { + if (!self.connected) { + self.connecting = false; + + if (self.options['try multiple transports']) { + var remaining = self.transports; + + while (remaining.length > 0 && remaining.splice(0,1)[0] != + self.transport.name) {} + + if (remaining.length){ + connect(remaining); + } else { + self.publish('connect_failed'); + } + } + } + }, self.options['connect timeout']); + } + }); + } + + connect(self.transports); + + self.once('connect', function (){ + clearTimeout(self.connectTimeoutTimer); + + fn && typeof fn == 'function' && fn(); + }); + }); + + return this; + }; + + /** + * Clears and sets a new heartbeat timeout using the value given by the + * server during the handshake. + * + * @api private + */ + + Socket.prototype.setHeartbeatTimeout = function () { + clearTimeout(this.heartbeatTimeoutTimer); + if(this.transport && !this.transport.heartbeats()) return; + + var self = this; + this.heartbeatTimeoutTimer = setTimeout(function () { + self.transport.onClose(); + }, this.heartbeatTimeout); + }; + + /** + * Sends a message. + * + * @param {Object} data packet. + * @returns {io.Socket} + * @api public + */ + + Socket.prototype.packet = function (data) { + if (this.connected && !this.doBuffer) { + this.transport.packet(data); + } else { + this.buffer.push(data); + } + + return this; + }; + + /** + * Sets buffer state + * + * @api private + */ + + Socket.prototype.setBuffer = function (v) { + this.doBuffer = v; + + if (!v && this.connected && this.buffer.length) { + if (!this.options['manualFlush']) { + this.flushBuffer(); + } + } + }; + + /** + * Flushes the buffer data over the wire. + * To be invoked manually when 'manualFlush' is set to true. + * + * @api public + */ + + Socket.prototype.flushBuffer = function() { + this.transport.payload(this.buffer); + this.buffer = []; + }; + + + /** + * Disconnect the established connect. + * + * @returns {io.Socket} + * @api public + */ + + Socket.prototype.disconnect = function () { + if (this.connected || this.connecting) { + if (this.open) { + this.of('').packet({ type: 'disconnect' }); + } + + // handle disconnection immediately + this.onDisconnect('booted'); + } + + return this; + }; + + /** + * Disconnects the socket with a sync XHR. + * + * @api private + */ + + Socket.prototype.disconnectSync = function () { + // ensure disconnection + var xhr = io.util.request(); + var uri = [ + 'http' + (this.options.secure ? 's' : '') + ':/' + , this.options.host + ':' + this.options.port + , this.options.resource + , io.protocol + , '' + , this.sessionid + ].join('/') + '/?disconnect=1'; + + xhr.open('GET', uri, false); + xhr.send(null); + + // handle disconnection immediately + this.onDisconnect('booted'); + }; + + /** + * Check if we need to use cross domain enabled transports. Cross domain would + * be a different port or different domain name. + * + * @returns {Boolean} + * @api private + */ + + Socket.prototype.isXDomain = function () { + + var port = global.location.port || + ('https:' == global.location.protocol ? 443 : 80); + + return this.options.host !== global.location.hostname + || this.options.port != port; + }; + + /** + * Called upon handshake. + * + * @api private + */ + + Socket.prototype.onConnect = function () { + if (!this.connected) { + this.connected = true; + this.connecting = false; + if (!this.doBuffer) { + // make sure to flush the buffer + this.setBuffer(false); + } + this.emit('connect'); + } + }; + + /** + * Called when the transport opens + * + * @api private + */ + + Socket.prototype.onOpen = function () { + this.open = true; + }; + + /** + * Called when the transport closes. + * + * @api private + */ + + Socket.prototype.onClose = function () { + this.open = false; + clearTimeout(this.heartbeatTimeoutTimer); + }; + + /** + * Called when the transport first opens a connection + * + * @param text + */ + + Socket.prototype.onPacket = function (packet) { + this.of(packet.endpoint).onPacket(packet); + }; + + /** + * Handles an error. + * + * @api private + */ + + Socket.prototype.onError = function (err) { + if (err && err.advice) { + if (err.advice === 'reconnect' && (this.connected || this.connecting)) { + this.disconnect(); + if (this.options.reconnect) { + this.reconnect(); + } + } + } + + this.publish('error', err && err.reason ? err.reason : err); + }; + + /** + * Called when the transport disconnects. + * + * @api private + */ + + Socket.prototype.onDisconnect = function (reason) { + var wasConnected = this.connected + , wasConnecting = this.connecting; + + this.connected = false; + this.connecting = false; + this.open = false; + + if (wasConnected || wasConnecting) { + this.transport.close(); + this.transport.clearTimeouts(); + if (wasConnected) { + this.publish('disconnect', reason); + + if ('booted' != reason && this.options.reconnect && !this.reconnecting) { + this.reconnect(); + } + } + } + }; + + /** + * Called upon reconnection. + * + * @api private + */ + + Socket.prototype.reconnect = function () { + this.reconnecting = true; + this.reconnectionAttempts = 0; + this.reconnectionDelay = this.options['reconnection delay']; + + var self = this + , maxAttempts = this.options['max reconnection attempts'] + , tryMultiple = this.options['try multiple transports'] + , limit = this.options['reconnection limit']; + + function reset () { + if (self.connected) { + for (var i in self.namespaces) { + if (self.namespaces.hasOwnProperty(i) && '' !== i) { + self.namespaces[i].packet({ type: 'connect' }); + } + } + self.publish('reconnect', self.transport.name, self.reconnectionAttempts); + } + + clearTimeout(self.reconnectionTimer); + + self.removeListener('connect_failed', maybeReconnect); + self.removeListener('connect', maybeReconnect); + + self.reconnecting = false; + + delete self.reconnectionAttempts; + delete self.reconnectionDelay; + delete self.reconnectionTimer; + delete self.redoTransports; + + self.options['try multiple transports'] = tryMultiple; + }; + + function maybeReconnect () { + if (!self.reconnecting) { + return; + } + + if (self.connected) { + return reset(); + }; + + if (self.connecting && self.reconnecting) { + return self.reconnectionTimer = setTimeout(maybeReconnect, 1000); + } + + if (self.reconnectionAttempts++ >= maxAttempts) { + if (!self.redoTransports) { + self.on('connect_failed', maybeReconnect); + self.options['try multiple transports'] = true; + self.transports = self.origTransports; + self.transport = self.getTransport(); + self.redoTransports = true; + self.connect(); + } else { + self.publish('reconnect_failed'); + reset(); + } + } else { + if (self.reconnectionDelay < limit) { + self.reconnectionDelay *= 2; // exponential back off + } + + self.connect(); + self.publish('reconnecting', self.reconnectionDelay, self.reconnectionAttempts); + self.reconnectionTimer = setTimeout(maybeReconnect, self.reconnectionDelay); + } + }; + + this.options['try multiple transports'] = false; + this.reconnectionTimer = setTimeout(maybeReconnect, this.reconnectionDelay); + + this.on('connect', maybeReconnect); + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.SocketNamespace = SocketNamespace; + + /** + * Socket namespace constructor. + * + * @constructor + * @api public + */ + + function SocketNamespace (socket, name) { + this.socket = socket; + this.name = name || ''; + this.flags = {}; + this.json = new Flag(this, 'json'); + this.ackPackets = 0; + this.acks = {}; + }; + + /** + * Apply EventEmitter mixin. + */ + + io.util.mixin(SocketNamespace, io.EventEmitter); + + /** + * Copies emit since we override it + * + * @api private + */ + + SocketNamespace.prototype.$emit = io.EventEmitter.prototype.emit; + + /** + * Creates a new namespace, by proxying the request to the socket. This + * allows us to use the synax as we do on the server. + * + * @api public + */ + + SocketNamespace.prototype.of = function () { + return this.socket.of.apply(this.socket, arguments); + }; + + /** + * Sends a packet. + * + * @api private + */ + + SocketNamespace.prototype.packet = function (packet) { + packet.endpoint = this.name; + this.socket.packet(packet); + this.flags = {}; + return this; + }; + + /** + * Sends a message + * + * @api public + */ + + SocketNamespace.prototype.send = function (data, fn) { + var packet = { + type: this.flags.json ? 'json' : 'message' + , data: data + }; + + if ('function' == typeof fn) { + packet.id = ++this.ackPackets; + packet.ack = true; + this.acks[packet.id] = fn; + } + + return this.packet(packet); + }; + + /** + * Emits an event + * + * @api public + */ + + SocketNamespace.prototype.emit = function (name) { + var args = Array.prototype.slice.call(arguments, 1) + , lastArg = args[args.length - 1] + , packet = { + type: 'event' + , name: name + }; + + if ('function' == typeof lastArg) { + packet.id = ++this.ackPackets; + packet.ack = 'data'; + this.acks[packet.id] = lastArg; + args = args.slice(0, args.length - 1); + } + + packet.args = args; + + return this.packet(packet); + }; + + /** + * Disconnects the namespace + * + * @api private + */ + + SocketNamespace.prototype.disconnect = function () { + if (this.name === '') { + this.socket.disconnect(); + } else { + this.packet({ type: 'disconnect' }); + this.$emit('disconnect'); + } + + return this; + }; + + /** + * Handles a packet + * + * @api private + */ + + SocketNamespace.prototype.onPacket = function (packet) { + var self = this; + + function ack () { + self.packet({ + type: 'ack' + , args: io.util.toArray(arguments) + , ackId: packet.id + }); + }; + + switch (packet.type) { + case 'connect': + this.$emit('connect'); + break; + + case 'disconnect': + if (this.name === '') { + this.socket.onDisconnect(packet.reason || 'booted'); + } else { + this.$emit('disconnect', packet.reason); + } + break; + + case 'message': + case 'json': + var params = ['message', packet.data]; + + if (packet.ack == 'data') { + params.push(ack); + } else if (packet.ack) { + this.packet({ type: 'ack', ackId: packet.id }); + } + + this.$emit.apply(this, params); + break; + + case 'event': + var params = [packet.name].concat(packet.args); + + if (packet.ack == 'data') + params.push(ack); + + this.$emit.apply(this, params); + break; + + case 'ack': + if (this.acks[packet.ackId]) { + this.acks[packet.ackId].apply(this, packet.args); + delete this.acks[packet.ackId]; + } + break; + + case 'error': + if (packet.advice){ + this.socket.onError(packet); + } else { + if (packet.reason == 'unauthorized') { + this.$emit('connect_failed', packet.reason); + } else { + this.$emit('error', packet.reason); + } + } + break; + } + }; + + /** + * Flag interface. + * + * @api private + */ + + function Flag (nsp, name) { + this.namespace = nsp; + this.name = name; + }; + + /** + * Send a message + * + * @api public + */ + + Flag.prototype.send = function () { + this.namespace.flags[this.name] = true; + this.namespace.send.apply(this.namespace, arguments); + }; + + /** + * Emit an event + * + * @api public + */ + + Flag.prototype.emit = function () { + this.namespace.flags[this.name] = true; + this.namespace.emit.apply(this.namespace, arguments); + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + */ + + exports.websocket = WS; + + /** + * The WebSocket transport uses the HTML5 WebSocket API to establish an + * persistent connection with the Socket.IO server. This transport will also + * be inherited by the FlashSocket fallback as it provides a API compatible + * polyfill for the WebSockets. + * + * @constructor + * @extends {io.Transport} + * @api public + */ + + function WS (socket) { + io.Transport.apply(this, arguments); + }; + + /** + * Inherits from Transport. + */ + + io.util.inherit(WS, io.Transport); + + /** + * Transport name + * + * @api public + */ + + WS.prototype.name = 'websocket'; + + /** + * Initializes a new `WebSocket` connection with the Socket.IO server. We attach + * all the appropriate listeners to handle the responses from the server. + * + * @returns {Transport} + * @api public + */ + + WS.prototype.open = function () { + var query = io.util.query(this.socket.options.query) + , self = this + , Socket + + + if (!Socket) { + Socket = global.MozWebSocket || global.WebSocket; + } + + this.websocket = new Socket(this.prepareUrl() + query); + + this.websocket.onopen = function () { + self.onOpen(); + self.socket.setBuffer(false); + }; + this.websocket.onmessage = function (ev) { + self.onData(ev.data); + }; + this.websocket.onclose = function () { + self.onClose(); + self.socket.setBuffer(true); + }; + this.websocket.onerror = function (e) { + self.onError(e); + }; + + return this; + }; + + /** + * Send a message to the Socket.IO server. The message will automatically be + * encoded in the correct message format. + * + * @returns {Transport} + * @api public + */ + + // Do to a bug in the current IDevices browser, we need to wrap the send in a + // setTimeout, when they resume from sleeping the browser will crash if + // we don't allow the browser time to detect the socket has been closed + if (io.util.ua.iDevice) { + WS.prototype.send = function (data) { + var self = this; + setTimeout(function() { + self.websocket.send(data); + },0); + return this; + }; + } else { + WS.prototype.send = function (data) { + this.websocket.send(data); + return this; + }; + } + + /** + * Payload + * + * @api private + */ + + WS.prototype.payload = function (arr) { + for (var i = 0, l = arr.length; i < l; i++) { + this.packet(arr[i]); + } + return this; + }; + + /** + * Disconnect the established `WebSocket` connection. + * + * @returns {Transport} + * @api public + */ + + WS.prototype.close = function () { + this.websocket.close(); + return this; + }; + + /** + * Handle the errors that `WebSocket` might be giving when we + * are attempting to connect or send messages. + * + * @param {Error} e The error. + * @api private + */ + + WS.prototype.onError = function (e) { + this.socket.onError(e); + }; + + /** + * Returns the appropriate scheme for the URI generation. + * + * @api private + */ + WS.prototype.scheme = function () { + return this.socket.options.secure ? 'wss' : 'ws'; + }; + + /** + * Checks if the browser has support for native `WebSockets` and that + * it's not the polyfill created for the FlashSocket transport. + * + * @return {Boolean} + * @api public + */ + + WS.check = function () { + return ('WebSocket' in global && !('__addTask' in WebSocket)) + || 'MozWebSocket' in global; + }; + + /** + * Check if the `WebSocket` transport support cross domain communications. + * + * @returns {Boolean} + * @api public + */ + + WS.xdomainCheck = function () { + return true; + }; + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('websocket'); + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.flashsocket = Flashsocket; + + /** + * The FlashSocket transport. This is a API wrapper for the HTML5 WebSocket + * specification. It uses a .swf file to communicate with the server. If you want + * to serve the .swf file from a other server than where the Socket.IO script is + * coming from you need to use the insecure version of the .swf. More information + * about this can be found on the github page. + * + * @constructor + * @extends {io.Transport.websocket} + * @api public + */ + + function Flashsocket () { + io.Transport.websocket.apply(this, arguments); + }; + + /** + * Inherits from Transport. + */ + + io.util.inherit(Flashsocket, io.Transport.websocket); + + /** + * Transport name + * + * @api public + */ + + Flashsocket.prototype.name = 'flashsocket'; + + /** + * Disconnect the established `FlashSocket` connection. This is done by adding a + * new task to the FlashSocket. The rest will be handled off by the `WebSocket` + * transport. + * + * @returns {Transport} + * @api public + */ + + Flashsocket.prototype.open = function () { + var self = this + , args = arguments; + + WebSocket.__addTask(function () { + io.Transport.websocket.prototype.open.apply(self, args); + }); + return this; + }; + + /** + * Sends a message to the Socket.IO server. This is done by adding a new + * task to the FlashSocket. The rest will be handled off by the `WebSocket` + * transport. + * + * @returns {Transport} + * @api public + */ + + Flashsocket.prototype.send = function () { + var self = this, args = arguments; + WebSocket.__addTask(function () { + io.Transport.websocket.prototype.send.apply(self, args); + }); + return this; + }; + + /** + * Disconnects the established `FlashSocket` connection. + * + * @returns {Transport} + * @api public + */ + + Flashsocket.prototype.close = function () { + WebSocket.__tasks.length = 0; + io.Transport.websocket.prototype.close.call(this); + return this; + }; + + /** + * The WebSocket fall back needs to append the flash container to the body + * element, so we need to make sure we have access to it. Or defer the call + * until we are sure there is a body element. + * + * @param {Socket} socket The socket instance that needs a transport + * @param {Function} fn The callback + * @api private + */ + + Flashsocket.prototype.ready = function (socket, fn) { + function init () { + var options = socket.options + , port = options['flash policy port'] + , path = [ + 'http' + (options.secure ? 's' : '') + ':/' + , options.host + ':' + options.port + , options.resource + , 'static/flashsocket' + , 'WebSocketMain' + (socket.isXDomain() ? 'Insecure' : '') + '.swf' + ]; + + // Only start downloading the swf file when the checked that this browser + // actually supports it + if (!Flashsocket.loaded) { + if (typeof WEB_SOCKET_SWF_LOCATION === 'undefined') { + // Set the correct file based on the XDomain settings + WEB_SOCKET_SWF_LOCATION = path.join('/'); + } + + if (port !== 843) { + WebSocket.loadFlashPolicyFile('xmlsocket://' + options.host + ':' + port); + } + + WebSocket.__initialize(); + Flashsocket.loaded = true; + } + + fn.call(self); + } + + var self = this; + if (document.body) return init(); + + io.util.load(init); + }; + + /** + * Check if the FlashSocket transport is supported as it requires that the Adobe + * Flash Player plug-in version `10.0.0` or greater is installed. And also check if + * the polyfill is correctly loaded. + * + * @returns {Boolean} + * @api public + */ + + Flashsocket.check = function () { + if ( + typeof WebSocket == 'undefined' + || !('__initialize' in WebSocket) || !swfobject + ) return false; + + return swfobject.getFlashPlayerVersion().major >= 10; + }; + + /** + * Check if the FlashSocket transport can be used as cross domain / cross origin + * transport. Because we can't see which type (secure or insecure) of .swf is used + * we will just return true. + * + * @returns {Boolean} + * @api public + */ + + Flashsocket.xdomainCheck = function () { + return true; + }; + + /** + * Disable AUTO_INITIALIZATION + */ + + if (typeof window != 'undefined') { + WEB_SOCKET_DISABLE_AUTO_INITIALIZATION = true; + } + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('flashsocket'); +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); +/* SWFObject v2.2 <http://code.google.com/p/swfobject/> + is released under the MIT License <http://www.opensource.org/licenses/mit-license.php> +*/ +if ('undefined' != typeof window) { +var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O[(['Active'].concat('Object').join('X'))]!=D){try{var ad=new window[(['Active'].concat('Object').join('X'))](W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]()}}function K(X){if(J){X()}else{U[U.length]=X}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener("load",Y,false)}else{if(typeof j.addEventListener!=D){j.addEventListener("load",Y,false)}else{if(typeof O.attachEvent!=D){i(O,"onload",Y)}else{if(typeof O.onload=="function"){var X=O.onload;O.onload=function(){X();Y()}}else{O.onload=Y}}}}}function h(){if(T){V()}else{H()}}function V(){var X=j.getElementsByTagName("body")[0];var aa=C(r);aa.setAttribute("type",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable("$version");if(ab){ab=ab.split(" ")[1].split(",");M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return}}X.removeChild(aa);Z=null;H()})()}else{H()}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute("name").toLowerCase()!="movie"){ah[X[ad].getAttribute("name")]=X[ad].getAttribute("value")}}P(ai,ah,Y,ab)}else{p(ae);if(ab){ab(aa)}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z}ab(aa)}}}}}function z(aa){var X=null;var Y=c(aa);if(Y&&Y.nodeName=="OBJECT"){if(typeof Y.SetVariable!=D){X=Y}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z}}}return X}function A(){return !a&&F("6.0.65")&&(M.win||M.mac)&&!(M.wk&&M.wk<312)}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName=="OBJECT"){l=g(ae);Q=null}else{l=ae;Q=X}aa.id=R;if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width="310"}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height="137"}j.title=j.title.slice(0,47)+" - Flash Player Installation";var ad=M.ie&&M.win?(['Active'].concat('').join('X')):"PlugIn",ac="MMredirectURL="+O.location.toString().replace(/&/g,"%26")+"&MMplayerType="+ad+"&MMdoctitle="+j.title;if(typeof ab.flashvars!=D){ab.flashvars+="&"+ac}else{ab.flashvars=ac}if(M.ie&&M.win&&ae.readyState!=4){var Y=C("div");X+="SWFObjectNew";Y.setAttribute("id",X);ae.parentNode.insertBefore(Y,ae);ae.style.display="none";(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae)}else{setTimeout(arguments.callee,10)}})()}u(aa,ab,X)}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C("div");Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display="none";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.replaceChild(g(Y),Y)}}function g(ab){var aa=C("div");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML}else{var Y=ab.getElementsByTagName(r)[0];if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName=="PARAM")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true))}}}}}return aa}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X}if(aa){if(typeof ai.id==D){ai.id=Y}if(M.ie&&M.win){var ah="";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()=="data"){ag.movie=ai[ae]}else{if(ae.toLowerCase()=="styleclass"){ah+=' class="'+ai[ae]+'"'}else{if(ae.toLowerCase()!="classid"){ah+=" "+ae+'="'+ai[ae]+'"'}}}}}var af="";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name="'+ad+'" value="'+ag[ad]+'" />'}}aa.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+ah+">"+af+"</object>";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2])}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa])}for(var Y in M){M[Y]=null}M=null;for(var X in swfobject){swfobject[X]=null}swfobject=null})}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;w(ab,false)}else{if(Z){Z({success:false,id:ab})}}},getObjectById:function(X){if(M.w3){return z(X)}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+="";ag+="";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al]}}aj.data=ab;aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak]}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+="&"+ai+"="+Z[ai]}else{am.flashvars=ai+"="+Z[ai]}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true)}X.success=true;X.ref=an}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);return}else{w(ah,true)}}if(ac){ac(X)}})}else{if(ac){ac(X)}}},switchOffAutoHideShow:function(){m=false},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]}},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X)}else{return undefined}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y)}},removeSWF:function(X){if(M.w3){y(X)}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X)}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;if(Z){if(/\?/.test(Z)){Z=Z.split("?")[1]}if(aa==null){return L(Z)}var Y=Z.split("&");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf("="))==aa){return L(Y[X].substring((Y[X].indexOf("=")+1)))}}}return""},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display="block"}}if(E){E(B)}}a=false}}}}(); +} +// Copyright: Hiroshi Ichikawa <http://gimite.net/en/> +// License: New BSD License +// Reference: http://dev.w3.org/html5/websockets/ +// Reference: http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol + +(function() { + + if ('undefined' == typeof window || window.WebSocket) return; + + var console = window.console; + if (!console || !console.log || !console.error) { + console = {log: function(){ }, error: function(){ }}; + } + + if (!swfobject.hasFlashPlayerVersion("10.0.0")) { + console.error("Flash Player >= 10.0.0 is required."); + return; + } + if (location.protocol == "file:") { + console.error( + "WARNING: web-socket-js doesn't work in file:///... URL " + + "unless you set Flash Security Settings properly. " + + "Open the page via Web server i.e. http://..."); + } + + /** + * This class represents a faux web socket. + * @param {string} url + * @param {array or string} protocols + * @param {string} proxyHost + * @param {int} proxyPort + * @param {string} headers + */ + WebSocket = function(url, protocols, proxyHost, proxyPort, headers) { + var self = this; + self.__id = WebSocket.__nextId++; + WebSocket.__instances[self.__id] = self; + self.readyState = WebSocket.CONNECTING; + self.bufferedAmount = 0; + self.__events = {}; + if (!protocols) { + protocols = []; + } else if (typeof protocols == "string") { + protocols = [protocols]; + } + // Uses setTimeout() to make sure __createFlash() runs after the caller sets ws.onopen etc. + // Otherwise, when onopen fires immediately, onopen is called before it is set. + setTimeout(function() { + WebSocket.__addTask(function() { + WebSocket.__flash.create( + self.__id, url, protocols, proxyHost || null, proxyPort || 0, headers || null); + }); + }, 0); + }; + + /** + * Send data to the web socket. + * @param {string} data The data to send to the socket. + * @return {boolean} True for success, false for failure. + */ + WebSocket.prototype.send = function(data) { + if (this.readyState == WebSocket.CONNECTING) { + throw "INVALID_STATE_ERR: Web Socket connection has not been established"; + } + // We use encodeURIComponent() here, because FABridge doesn't work if + // the argument includes some characters. We don't use escape() here + // because of this: + // https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Functions#escape_and_unescape_Functions + // But it looks decodeURIComponent(encodeURIComponent(s)) doesn't + // preserve all Unicode characters either e.g. "\uffff" in Firefox. + // Note by wtritch: Hopefully this will not be necessary using ExternalInterface. Will require + // additional testing. + var result = WebSocket.__flash.send(this.__id, encodeURIComponent(data)); + if (result < 0) { // success + return true; + } else { + this.bufferedAmount += result; + return false; + } + }; + + /** + * Close this web socket gracefully. + */ + WebSocket.prototype.close = function() { + if (this.readyState == WebSocket.CLOSED || this.readyState == WebSocket.CLOSING) { + return; + } + this.readyState = WebSocket.CLOSING; + WebSocket.__flash.close(this.__id); + }; + + /** + * Implementation of {@link <a href="http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-registration">DOM 2 EventTarget Interface</a>} + * + * @param {string} type + * @param {function} listener + * @param {boolean} useCapture + * @return void + */ + WebSocket.prototype.addEventListener = function(type, listener, useCapture) { + if (!(type in this.__events)) { + this.__events[type] = []; + } + this.__events[type].push(listener); + }; + + /** + * Implementation of {@link <a href="http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-registration">DOM 2 EventTarget Interface</a>} + * + * @param {string} type + * @param {function} listener + * @param {boolean} useCapture + * @return void + */ + WebSocket.prototype.removeEventListener = function(type, listener, useCapture) { + if (!(type in this.__events)) return; + var events = this.__events[type]; + for (var i = events.length - 1; i >= 0; --i) { + if (events[i] === listener) { + events.splice(i, 1); + break; + } + } + }; + + /** + * Implementation of {@link <a href="http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-registration">DOM 2 EventTarget Interface</a>} + * + * @param {Event} event + * @return void + */ + WebSocket.prototype.dispatchEvent = function(event) { + var events = this.__events[event.type] || []; + for (var i = 0; i < events.length; ++i) { + events[i](event); + } + var handler = this["on" + event.type]; + if (handler) handler(event); + }; + + /** + * Handles an event from Flash. + * @param {Object} flashEvent + */ + WebSocket.prototype.__handleEvent = function(flashEvent) { + if ("readyState" in flashEvent) { + this.readyState = flashEvent.readyState; + } + if ("protocol" in flashEvent) { + this.protocol = flashEvent.protocol; + } + + var jsEvent; + if (flashEvent.type == "open" || flashEvent.type == "error") { + jsEvent = this.__createSimpleEvent(flashEvent.type); + } else if (flashEvent.type == "close") { + // TODO implement jsEvent.wasClean + jsEvent = this.__createSimpleEvent("close"); + } else if (flashEvent.type == "message") { + var data = decodeURIComponent(flashEvent.message); + jsEvent = this.__createMessageEvent("message", data); + } else { + throw "unknown event type: " + flashEvent.type; + } + + this.dispatchEvent(jsEvent); + }; + + WebSocket.prototype.__createSimpleEvent = function(type) { + if (document.createEvent && window.Event) { + var event = document.createEvent("Event"); + event.initEvent(type, false, false); + return event; + } else { + return {type: type, bubbles: false, cancelable: false}; + } + }; + + WebSocket.prototype.__createMessageEvent = function(type, data) { + if (document.createEvent && window.MessageEvent && !window.opera) { + var event = document.createEvent("MessageEvent"); + event.initMessageEvent("message", false, false, data, null, null, window, null); + return event; + } else { + // IE and Opera, the latter one truncates the data parameter after any 0x00 bytes. + return {type: type, data: data, bubbles: false, cancelable: false}; + } + }; + + /** + * Define the WebSocket readyState enumeration. + */ + WebSocket.CONNECTING = 0; + WebSocket.OPEN = 1; + WebSocket.CLOSING = 2; + WebSocket.CLOSED = 3; + + WebSocket.__flash = null; + WebSocket.__instances = {}; + WebSocket.__tasks = []; + WebSocket.__nextId = 0; + + /** + * Load a new flash security policy file. + * @param {string} url + */ + WebSocket.loadFlashPolicyFile = function(url){ + WebSocket.__addTask(function() { + WebSocket.__flash.loadManualPolicyFile(url); + }); + }; + + /** + * Loads WebSocketMain.swf and creates WebSocketMain object in Flash. + */ + WebSocket.__initialize = function() { + if (WebSocket.__flash) return; + + if (WebSocket.__swfLocation) { + // For backword compatibility. + window.WEB_SOCKET_SWF_LOCATION = WebSocket.__swfLocation; + } + if (!window.WEB_SOCKET_SWF_LOCATION) { + console.error("[WebSocket] set WEB_SOCKET_SWF_LOCATION to location of WebSocketMain.swf"); + return; + } + var container = document.createElement("div"); + container.id = "webSocketContainer"; + // Hides Flash box. We cannot use display: none or visibility: hidden because it prevents + // Flash from loading at least in IE. So we move it out of the screen at (-100, -100). + // But this even doesn't work with Flash Lite (e.g. in Droid Incredible). So with Flash + // Lite, we put it at (0, 0). This shows 1x1 box visible at left-top corner but this is + // the best we can do as far as we know now. + container.style.position = "absolute"; + if (WebSocket.__isFlashLite()) { + container.style.left = "0px"; + container.style.top = "0px"; + } else { + container.style.left = "-100px"; + container.style.top = "-100px"; + } + var holder = document.createElement("div"); + holder.id = "webSocketFlash"; + container.appendChild(holder); + document.body.appendChild(container); + // See this article for hasPriority: + // http://help.adobe.com/en_US/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-7ffd.html + swfobject.embedSWF( + WEB_SOCKET_SWF_LOCATION, + "webSocketFlash", + "1" /* width */, + "1" /* height */, + "10.0.0" /* SWF version */, + null, + null, + {hasPriority: true, swliveconnect : true, allowScriptAccess: "always"}, + null, + function(e) { + if (!e.success) { + console.error("[WebSocket] swfobject.embedSWF failed"); + } + }); + }; + + /** + * Called by Flash to notify JS that it's fully loaded and ready + * for communication. + */ + WebSocket.__onFlashInitialized = function() { + // We need to set a timeout here to avoid round-trip calls + // to flash during the initialization process. + setTimeout(function() { + WebSocket.__flash = document.getElementById("webSocketFlash"); + WebSocket.__flash.setCallerUrl(location.href); + WebSocket.__flash.setDebug(!!window.WEB_SOCKET_DEBUG); + for (var i = 0; i < WebSocket.__tasks.length; ++i) { + WebSocket.__tasks[i](); + } + WebSocket.__tasks = []; + }, 0); + }; + + /** + * Called by Flash to notify WebSockets events are fired. + */ + WebSocket.__onFlashEvent = function() { + setTimeout(function() { + try { + // Gets events using receiveEvents() instead of getting it from event object + // of Flash event. This is to make sure to keep message order. + // It seems sometimes Flash events don't arrive in the same order as they are sent. + var events = WebSocket.__flash.receiveEvents(); + for (var i = 0; i < events.length; ++i) { + WebSocket.__instances[events[i].webSocketId].__handleEvent(events[i]); + } + } catch (e) { + console.error(e); + } + }, 0); + return true; + }; + + // Called by Flash. + WebSocket.__log = function(message) { + console.log(decodeURIComponent(message)); + }; + + // Called by Flash. + WebSocket.__error = function(message) { + console.error(decodeURIComponent(message)); + }; + + WebSocket.__addTask = function(task) { + if (WebSocket.__flash) { + task(); + } else { + WebSocket.__tasks.push(task); + } + }; + + /** + * Test if the browser is running flash lite. + * @return {boolean} True if flash lite is running, false otherwise. + */ + WebSocket.__isFlashLite = function() { + if (!window.navigator || !window.navigator.mimeTypes) { + return false; + } + var mimeType = window.navigator.mimeTypes["application/x-shockwave-flash"]; + if (!mimeType || !mimeType.enabledPlugin || !mimeType.enabledPlugin.filename) { + return false; + } + return mimeType.enabledPlugin.filename.match(/flashlite/i) ? true : false; + }; + + if (!window.WEB_SOCKET_DISABLE_AUTO_INITIALIZATION) { + if (window.addEventListener) { + window.addEventListener("load", function(){ + WebSocket.__initialize(); + }, false); + } else { + window.attachEvent("onload", function(){ + WebSocket.__initialize(); + }); + } + } + +})(); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + * + * @api public + */ + + exports.XHR = XHR; + + /** + * XHR constructor + * + * @costructor + * @api public + */ + + function XHR (socket) { + if (!socket) return; + + io.Transport.apply(this, arguments); + this.sendBuffer = []; + }; + + /** + * Inherits from Transport. + */ + + io.util.inherit(XHR, io.Transport); + + /** + * Establish a connection + * + * @returns {Transport} + * @api public + */ + + XHR.prototype.open = function () { + this.socket.setBuffer(false); + this.onOpen(); + this.get(); + + // we need to make sure the request succeeds since we have no indication + // whether the request opened or not until it succeeded. + this.setCloseTimeout(); + + return this; + }; + + /** + * Check if we need to send data to the Socket.IO server, if we have data in our + * buffer we encode it and forward it to the `post` method. + * + * @api private + */ + + XHR.prototype.payload = function (payload) { + var msgs = []; + + for (var i = 0, l = payload.length; i < l; i++) { + msgs.push(io.parser.encodePacket(payload[i])); + } + + this.send(io.parser.encodePayload(msgs)); + }; + + /** + * Send data to the Socket.IO server. + * + * @param data The message + * @returns {Transport} + * @api public + */ + + XHR.prototype.send = function (data) { + this.post(data); + return this; + }; + + /** + * Posts a encoded message to the Socket.IO server. + * + * @param {String} data A encoded message. + * @api private + */ + + function empty () { }; + + XHR.prototype.post = function (data) { + var self = this; + this.socket.setBuffer(true); + + function stateChange () { + if (this.readyState == 4) { + this.onreadystatechange = empty; + self.posting = false; + + if (this.status == 200){ + self.socket.setBuffer(false); + } else { + self.onClose(); + } + } + } + + function onload () { + this.onload = empty; + self.socket.setBuffer(false); + }; + + this.sendXHR = this.request('POST'); + + if (global.XDomainRequest && this.sendXHR instanceof XDomainRequest) { + this.sendXHR.onload = this.sendXHR.onerror = onload; + } else { + this.sendXHR.onreadystatechange = stateChange; + } + + this.sendXHR.send(data); + }; + + /** + * Disconnects the established `XHR` connection. + * + * @returns {Transport} + * @api public + */ + + XHR.prototype.close = function () { + this.onClose(); + return this; + }; + + /** + * Generates a configured XHR request + * + * @param {String} url The url that needs to be requested. + * @param {String} method The method the request should use. + * @returns {XMLHttpRequest} + * @api private + */ + + XHR.prototype.request = function (method) { + var req = io.util.request(this.socket.isXDomain()) + , query = io.util.query(this.socket.options.query, 't=' + +new Date); + + req.open(method || 'GET', this.prepareUrl() + query, true); + + if (method == 'POST') { + try { + if (req.setRequestHeader) { + req.setRequestHeader('Content-type', 'text/plain;charset=UTF-8'); + } else { + // XDomainRequest + req.contentType = 'text/plain'; + } + } catch (e) {} + } + + return req; + }; + + /** + * Returns the scheme to use for the transport URLs. + * + * @api private + */ + + XHR.prototype.scheme = function () { + return this.socket.options.secure ? 'https' : 'http'; + }; + + /** + * Check if the XHR transports are supported + * + * @param {Boolean} xdomain Check if we support cross domain requests. + * @returns {Boolean} + * @api public + */ + + XHR.check = function (socket, xdomain) { + try { + var request = io.util.request(xdomain), + usesXDomReq = (global.XDomainRequest && request instanceof XDomainRequest), + socketProtocol = (socket && socket.options && socket.options.secure ? 'https:' : 'http:'), + isXProtocol = (global.location && socketProtocol != global.location.protocol); + if (request && !(usesXDomReq && isXProtocol)) { + return true; + } + } catch(e) {} + + return false; + }; + + /** + * Check if the XHR transport supports cross domain requests. + * + * @returns {Boolean} + * @api public + */ + + XHR.xdomainCheck = function (socket) { + return XHR.check(socket, true); + }; + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.htmlfile = HTMLFile; + + /** + * The HTMLFile transport creates a `forever iframe` based transport + * for Internet Explorer. Regular forever iframe implementations will + * continuously trigger the browsers buzy indicators. If the forever iframe + * is created inside a `htmlfile` these indicators will not be trigged. + * + * @constructor + * @extends {io.Transport.XHR} + * @api public + */ + + function HTMLFile (socket) { + io.Transport.XHR.apply(this, arguments); + }; + + /** + * Inherits from XHR transport. + */ + + io.util.inherit(HTMLFile, io.Transport.XHR); + + /** + * Transport name + * + * @api public + */ + + HTMLFile.prototype.name = 'htmlfile'; + + /** + * Creates a new Ac...eX `htmlfile` with a forever loading iframe + * that can be used to listen to messages. Inside the generated + * `htmlfile` a reference will be made to the HTMLFile transport. + * + * @api private + */ + + HTMLFile.prototype.get = function () { + this.doc = new window[(['Active'].concat('Object').join('X'))]('htmlfile'); + this.doc.open(); + this.doc.write('<html></html>'); + this.doc.close(); + this.doc.parentWindow.s = this; + + var iframeC = this.doc.createElement('div'); + iframeC.className = 'socketio'; + + this.doc.body.appendChild(iframeC); + this.iframe = this.doc.createElement('iframe'); + + iframeC.appendChild(this.iframe); + + var self = this + , query = io.util.query(this.socket.options.query, 't='+ +new Date); + + this.iframe.src = this.prepareUrl() + query; + + io.util.on(window, 'unload', function () { + self.destroy(); + }); + }; + + /** + * The Socket.IO server will write script tags inside the forever + * iframe, this function will be used as callback for the incoming + * information. + * + * @param {String} data The message + * @param {document} doc Reference to the context + * @api private + */ + + HTMLFile.prototype._ = function (data, doc) { + // unescape all forward slashes. see GH-1251 + data = data.replace(/\\\//g, '/'); + this.onData(data); + try { + var script = doc.getElementsByTagName('script')[0]; + script.parentNode.removeChild(script); + } catch (e) { } + }; + + /** + * Destroy the established connection, iframe and `htmlfile`. + * And calls the `CollectGarbage` function of Internet Explorer + * to release the memory. + * + * @api private + */ + + HTMLFile.prototype.destroy = function () { + if (this.iframe){ + try { + this.iframe.src = 'about:blank'; + } catch(e){} + + this.doc = null; + this.iframe.parentNode.removeChild(this.iframe); + this.iframe = null; + + CollectGarbage(); + } + }; + + /** + * Disconnects the established connection. + * + * @returns {Transport} Chaining. + * @api public + */ + + HTMLFile.prototype.close = function () { + this.destroy(); + return io.Transport.XHR.prototype.close.call(this); + }; + + /** + * Checks if the browser supports this transport. The browser + * must have an `Ac...eXObject` implementation. + * + * @return {Boolean} + * @api public + */ + + HTMLFile.check = function (socket) { + if (typeof window != "undefined" && (['Active'].concat('Object').join('X')) in window){ + try { + var a = new window[(['Active'].concat('Object').join('X'))]('htmlfile'); + return a && io.Transport.XHR.check(socket); + } catch(e){} + } + return false; + }; + + /** + * Check if cross domain requests are supported. + * + * @returns {Boolean} + * @api public + */ + + HTMLFile.xdomainCheck = function () { + // we can probably do handling for sub-domains, we should + // test that it's cross domain but a subdomain here + return false; + }; + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('htmlfile'); + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + */ + + exports['xhr-polling'] = XHRPolling; + + /** + * The XHR-polling transport uses long polling XHR requests to create a + * "persistent" connection with the server. + * + * @constructor + * @api public + */ + + function XHRPolling () { + io.Transport.XHR.apply(this, arguments); + }; + + /** + * Inherits from XHR transport. + */ + + io.util.inherit(XHRPolling, io.Transport.XHR); + + /** + * Merge the properties from XHR transport + */ + + io.util.merge(XHRPolling, io.Transport.XHR); + + /** + * Transport name + * + * @api public + */ + + XHRPolling.prototype.name = 'xhr-polling'; + + /** + * Indicates whether heartbeats is enabled for this transport + * + * @api private + */ + + XHRPolling.prototype.heartbeats = function () { + return false; + }; + + /** + * Establish a connection, for iPhone and Android this will be done once the page + * is loaded. + * + * @returns {Transport} Chaining. + * @api public + */ + + XHRPolling.prototype.open = function () { + var self = this; + + io.Transport.XHR.prototype.open.call(self); + return false; + }; + + /** + * Starts a XHR request to wait for incoming messages. + * + * @api private + */ + + function empty () {}; + + XHRPolling.prototype.get = function () { + if (!this.isOpen) return; + + var self = this; + + function stateChange () { + if (this.readyState == 4) { + this.onreadystatechange = empty; + + if (this.status == 200) { + self.onData(this.responseText); + self.get(); + } else { + self.onClose(); + } + } + }; + + function onload () { + this.onload = empty; + this.onerror = empty; + self.retryCounter = 1; + self.onData(this.responseText); + self.get(); + }; + + function onerror () { + self.retryCounter ++; + if(!self.retryCounter || self.retryCounter > 3) { + self.onClose(); + } else { + self.get(); + } + }; + + this.xhr = this.request(); + + if (global.XDomainRequest && this.xhr instanceof XDomainRequest) { + this.xhr.onload = onload; + this.xhr.onerror = onerror; + } else { + this.xhr.onreadystatechange = stateChange; + } + + this.xhr.send(null); + }; + + /** + * Handle the unclean close behavior. + * + * @api private + */ + + XHRPolling.prototype.onClose = function () { + io.Transport.XHR.prototype.onClose.call(this); + + if (this.xhr) { + this.xhr.onreadystatechange = this.xhr.onload = this.xhr.onerror = empty; + try { + this.xhr.abort(); + } catch(e){} + this.xhr = null; + } + }; + + /** + * Webkit based browsers show a infinit spinner when you start a XHR request + * before the browsers onload event is called so we need to defer opening of + * the transport until the onload event is called. Wrapping the cb in our + * defer method solve this. + * + * @param {Socket} socket The socket instance that needs a transport + * @param {Function} fn The callback + * @api private + */ + + XHRPolling.prototype.ready = function (socket, fn) { + var self = this; + + io.util.defer(function () { + fn.call(self); + }); + }; + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('xhr-polling'); + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, io, global) { + /** + * There is a way to hide the loading indicator in Firefox. If you create and + * remove a iframe it will stop showing the current loading indicator. + * Unfortunately we can't feature detect that and UA sniffing is evil. + * + * @api private + */ + + var indicator = global.document && "MozAppearance" in + global.document.documentElement.style; + + /** + * Expose constructor. + */ + + exports['jsonp-polling'] = JSONPPolling; + + /** + * The JSONP transport creates an persistent connection by dynamically + * inserting a script tag in the page. This script tag will receive the + * information of the Socket.IO server. When new information is received + * it creates a new script tag for the new data stream. + * + * @constructor + * @extends {io.Transport.xhr-polling} + * @api public + */ + + function JSONPPolling (socket) { + io.Transport['xhr-polling'].apply(this, arguments); + + this.index = io.j.length; + + var self = this; + + io.j.push(function (msg) { + self._(msg); + }); + }; + + /** + * Inherits from XHR polling transport. + */ + + io.util.inherit(JSONPPolling, io.Transport['xhr-polling']); + + /** + * Transport name + * + * @api public + */ + + JSONPPolling.prototype.name = 'jsonp-polling'; + + /** + * Posts a encoded message to the Socket.IO server using an iframe. + * The iframe is used because script tags can create POST based requests. + * The iframe is positioned outside of the view so the user does not + * notice it's existence. + * + * @param {String} data A encoded message. + * @api private + */ + + JSONPPolling.prototype.post = function (data) { + var self = this + , query = io.util.query( + this.socket.options.query + , 't='+ (+new Date) + '&i=' + this.index + ); + + if (!this.form) { + var form = document.createElement('form') + , area = document.createElement('textarea') + , id = this.iframeId = 'socketio_iframe_' + this.index + , iframe; + + form.className = 'socketio'; + form.style.position = 'absolute'; + form.style.top = '0px'; + form.style.left = '0px'; + form.style.display = 'none'; + form.target = id; + form.method = 'POST'; + form.setAttribute('accept-charset', 'utf-8'); + area.name = 'd'; + form.appendChild(area); + document.body.appendChild(form); + + this.form = form; + this.area = area; + } + + this.form.action = this.prepareUrl() + query; + + function complete () { + initIframe(); + self.socket.setBuffer(false); + }; + + function initIframe () { + if (self.iframe) { + self.form.removeChild(self.iframe); + } + + try { + // ie6 dynamic iframes with target="" support (thanks Chris Lambacher) + iframe = document.createElement('<iframe name="'+ self.iframeId +'">'); + } catch (e) { + iframe = document.createElement('iframe'); + iframe.name = self.iframeId; + } + + iframe.id = self.iframeId; + + self.form.appendChild(iframe); + self.iframe = iframe; + }; + + initIframe(); + + // we temporarily stringify until we figure out how to prevent + // browsers from turning `\n` into `\r\n` in form inputs + this.area.value = io.JSON.stringify(data); + + try { + this.form.submit(); + } catch(e) {} + + if (this.iframe.attachEvent) { + iframe.onreadystatechange = function () { + if (self.iframe.readyState == 'complete') { + complete(); + } + }; + } else { + this.iframe.onload = complete; + } + + this.socket.setBuffer(true); + }; + + /** + * Creates a new JSONP poll that can be used to listen + * for messages from the Socket.IO server. + * + * @api private + */ + + JSONPPolling.prototype.get = function () { + var self = this + , script = document.createElement('script') + , query = io.util.query( + this.socket.options.query + , 't='+ (+new Date) + '&i=' + this.index + ); + + if (this.script) { + this.script.parentNode.removeChild(this.script); + this.script = null; + } + + script.async = true; + script.src = this.prepareUrl() + query; + script.onerror = function () { + self.onClose(); + }; + + var insertAt = document.getElementsByTagName('script')[0]; + insertAt.parentNode.insertBefore(script, insertAt); + this.script = script; + + if (indicator) { + setTimeout(function () { + var iframe = document.createElement('iframe'); + document.body.appendChild(iframe); + document.body.removeChild(iframe); + }, 100); + } + }; + + /** + * Callback function for the incoming message stream from the Socket.IO server. + * + * @param {String} data The message + * @api private + */ + + JSONPPolling.prototype._ = function (msg) { + this.onData(msg); + if (this.isOpen) { + this.get(); + } + return this; + }; + + /** + * The indicator hack only works after onload + * + * @param {Socket} socket The socket instance that needs a transport + * @param {Function} fn The callback + * @api private + */ + + JSONPPolling.prototype.ready = function (socket, fn) { + var self = this; + if (!indicator) return fn.call(this); + + io.util.load(function () { + fn.call(self); + }); + }; + + /** + * Checks if browser supports this transport. + * + * @return {Boolean} + * @api public + */ + + JSONPPolling.check = function () { + return 'document' in global; + }; + + /** + * Check if cross domain requests are supported + * + * @returns {Boolean} + * @api public + */ + + JSONPPolling.xdomainCheck = function () { + return true; + }; + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('jsonp-polling'); + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); + +if (typeof define === "function" && define.amd) { + define("socket.io", [], function () { return io; }); +} +})(); +/* @source lib/jquery.tooltipster.js */; + +/* + + Tooltipster 3.3.0 | 2014-11-08 + A rockin' custom tooltip jQuery plugin + + Developed by Caleb Jacob under the MIT license http://opensource.org/licenses/MIT + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + */ + +;(function ($, window, document) { + + var pluginName = "tooltipster", + defaults = { + animation: 'fade', + arrow: true, + arrowColor: '', + autoClose: true, + content: null, + contentAsHTML: false, + contentCloning: true, + debug: true, + delay: 200, + minWidth: 0, + maxWidth: null, + functionInit: function(origin, content) {}, + functionBefore: function(origin, continueTooltip) { + continueTooltip(); + }, + functionReady: function(origin, tooltip) {}, + functionAfter: function(origin) {}, + hideOnClick: false, + icon: '(?)', + iconCloning: true, + iconDesktop: false, + iconTouch: false, + iconTheme: 'tooltipster-icon', + interactive: false, + interactiveTolerance: 350, + multiple: false, + offsetX: 0, + offsetY: 0, + onlyOne: false, + position: 'top', + positionTracker: false, + positionTrackerCallback: function(origin){ + // the default tracker callback will close the tooltip when the trigger is + // 'hover' (see https://github.com/iamceege/tooltipster/pull/253) + if(this.option('trigger') == 'hover' && this.option('autoClose')) { + this.hide(); + } + }, + restoration: 'current', + speed: 350, + timer: 0, + theme: 'tooltipster-default', + touchDevices: true, + trigger: 'hover', + updateAnimation: true + }; + + function Plugin(element, options) { + + // list of instance variables + + this.bodyOverflowX; + // stack of custom callbacks provided as parameters to API methods + this.callbacks = { + hide: [], + show: [] + }; + this.checkInterval = null; + // this will be the user content shown in the tooltip. A capital "C" is used because there is also a method called content() + this.Content; + // this is the original element which is being applied the tooltipster plugin + this.$el = $(element); + // this will be the element which triggers the appearance of the tooltip on hover/click/custom events. + // it will be the same as this.$el if icons are not used (see in the options), otherwise it will correspond to the created icon + this.$elProxy; + this.elProxyPosition; + this.enabled = true; + this.options = $.extend({}, defaults, options); + this.mouseIsOverProxy = false; + // a unique namespace per instance, for easy selective unbinding + this.namespace = 'tooltipster-'+ Math.round(Math.random()*100000); + // Status (capital S) can be either : appearing, shown, disappearing, hidden + this.Status = 'hidden'; + this.timerHide = null; + this.timerShow = null; + // this will be the tooltip element (jQuery wrapped HTML element) + this.$tooltip; + + // for backward compatibility + this.options.iconTheme = this.options.iconTheme.replace('.', ''); + this.options.theme = this.options.theme.replace('.', ''); + + // launch + + this._init(); + } + + Plugin.prototype = { + + _init: function() { + + var self = this; + + // disable the plugin on old browsers (including IE7 and lower) + if (document.querySelector) { + + // note : the content is null (empty) by default and can stay that way if the plugin remains initialized but not fed any content. The tooltip will just not appear. + + // let's save the initial value of the title attribute for later restoration if need be. + var initialTitle = null; + // it will already have been saved in case of multiple tooltips + if (self.$el.data('tooltipster-initialTitle') === undefined) { + + initialTitle = self.$el.attr('title'); + + // we do not want initialTitle to have the value "undefined" because of how jQuery's .data() method works + if (initialTitle === undefined) initialTitle = null; + + self.$el.data('tooltipster-initialTitle', initialTitle); + } + + // if content is provided in the options, its has precedence over the title attribute. + // Note : an empty string is considered content, only 'null' represents the absence of content. + // Also, an existing title="" attribute will result in an empty string content + if (self.options.content !== null){ + self._content_set(self.options.content); + } + else { + self._content_set(initialTitle); + } + + var c = self.options.functionInit.call(self.$el, self.$el, self.Content); + if(typeof c !== 'undefined') self._content_set(c); + + self.$el + // strip the title off of the element to prevent the default tooltips from popping up + .removeAttr('title') + // to be able to find all instances on the page later (upon window events in particular) + .addClass('tooltipstered'); + + // detect if we're changing the tooltip origin to an icon + // note about this condition : if the device has touch capability and self.options.iconTouch is false, you'll have no icons event though you may consider your device as a desktop if it also has a mouse. Not sure why someone would have this use case though. + if ((!deviceHasTouchCapability && self.options.iconDesktop) || (deviceHasTouchCapability && self.options.iconTouch)) { + + // TODO : the tooltip should be automatically be given an absolute position to be near the origin. Otherwise, when the origin is floating or what, it's going to be nowhere near it and disturb the position flow of the page elements. It will imply that the icon also detects when its origin moves, to follow it : not trivial. + // Until it's done, the icon feature does not really make sense since the user still has most of the work to do by himself + + // if the icon provided is in the form of a string + if(typeof self.options.icon === 'string'){ + // wrap it in a span with the icon class + self.$elProxy = $('<span class="'+ self.options.iconTheme +'"></span>'); + self.$elProxy.text(self.options.icon); + } + // if it is an object (sensible choice) + else { + // (deep) clone the object if iconCloning == true, to make sure every instance has its own proxy. We use the icon without wrapping, no need to. We do not give it a class either, as the user will undoubtedly style the object on his own and since our css properties may conflict with his own + if (self.options.iconCloning) self.$elProxy = self.options.icon.clone(true); + else self.$elProxy = self.options.icon; + } + + self.$elProxy.insertAfter(self.$el); + } + else { + self.$elProxy = self.$el; + } + + // for 'click' and 'hover' triggers : bind on events to open the tooltip. Closing is now handled in _showNow() because of its bindings. + // Notes about touch events : + // - mouseenter, mouseleave and clicks happen even on pure touch devices because they are emulated. deviceIsPureTouch() is a simple attempt to detect them. + // - on hybrid devices, we do not prevent touch gesture from opening tooltips. It would be too complex to differentiate real mouse events from emulated ones. + // - we check deviceIsPureTouch() at each event rather than prior to binding because the situation may change during browsing + if (self.options.trigger == 'hover') { + + // these binding are for mouse interaction only + self.$elProxy + .on('mouseenter.'+ self.namespace, function() { + if (!deviceIsPureTouch() || self.options.touchDevices) { + self.mouseIsOverProxy = true; + self._show(); + } + }) + .on('mouseleave.'+ self.namespace, function() { + if (!deviceIsPureTouch() || self.options.touchDevices) { + self.mouseIsOverProxy = false; + } + }); + + // for touch interaction only + if (deviceHasTouchCapability && self.options.touchDevices) { + + // for touch devices, we immediately display the tooltip because we cannot rely on mouseleave to handle the delay + self.$elProxy.on('touchstart.'+ self.namespace, function() { + self._showNow(); + }); + } + } + else if (self.options.trigger == 'click') { + + // note : for touch devices, we do not bind on touchstart, we only rely on the emulated clicks (triggered by taps) + self.$elProxy.on('click.'+ self.namespace, function() { + if (!deviceIsPureTouch() || self.options.touchDevices) { + self._show(); + } + }); + } + } + }, + + // this function will schedule the opening of the tooltip after the delay, if there is one + _show: function() { + + var self = this; + + if (self.Status != 'shown' && self.Status != 'appearing') { + + if (self.options.delay) { + self.timerShow = setTimeout(function(){ + + // for hover trigger, we check if the mouse is still over the proxy, otherwise we do not show anything + if (self.options.trigger == 'click' || (self.options.trigger == 'hover' && self.mouseIsOverProxy)) { + self._showNow(); + } + }, self.options.delay); + } + else self._showNow(); + } + }, + + // this function will open the tooltip right away + _showNow: function(callback) { + + var self = this; + + // call our constructor custom function before continuing + self.options.functionBefore.call(self.$el, self.$el, function() { + + // continue only if the tooltip is enabled and has any content + if (self.enabled && self.Content !== null) { + + // save the method callback and cancel hide method callbacks + if (callback) self.callbacks.show.push(callback); + self.callbacks.hide = []; + + //get rid of any appearance timer + clearTimeout(self.timerShow); + self.timerShow = null; + clearTimeout(self.timerHide); + self.timerHide = null; + + // if we only want one tooltip open at a time, close all auto-closing tooltips currently open and not already disappearing + if (self.options.onlyOne) { + $('.tooltipstered').not(self.$el).each(function(i,el) { + + var $el = $(el), + nss = $el.data('tooltipster-ns'); + + // iterate on all tooltips of the element + $.each(nss, function(i, ns){ + var instance = $el.data(ns), + // we have to use the public methods here + s = instance.status(), + ac = instance.option('autoClose'); + + if (s !== 'hidden' && s !== 'disappearing' && ac) { + instance.hide(); + } + }); + }); + } + + var finish = function() { + self.Status = 'shown'; + + // trigger any show method custom callbacks and reset them + $.each(self.callbacks.show, function(i,c) { c.call(self.$el); }); + self.callbacks.show = []; + }; + + // if this origin already has its tooltip open + if (self.Status !== 'hidden') { + + // the timer (if any) will start (or restart) right now + var extraTime = 0; + + // if it was disappearing, cancel that + if (self.Status === 'disappearing') { + + self.Status = 'appearing'; + + if (supportsTransitions()) { + + self.$tooltip + .clearQueue() + .removeClass('tooltipster-dying') + .addClass('tooltipster-'+ self.options.animation +'-show'); + + if (self.options.speed > 0) self.$tooltip.delay(self.options.speed); + + self.$tooltip.queue(finish); + } + else { + // in case the tooltip was currently fading out, bring it back to life + self.$tooltip + .stop() + .fadeIn(finish); + } + } + // if the tooltip is already open, we still need to trigger the method custom callback + else if(self.Status === 'shown') { + finish(); + } + } + // if the tooltip isn't already open, open that sucker up! + else { + + self.Status = 'appearing'; + + // the timer (if any) will start when the tooltip has fully appeared after its transition + var extraTime = self.options.speed; + + // disable horizontal scrollbar to keep overflowing tooltips from jacking with it and then restore it to its previous value + self.bodyOverflowX = $('body').css('overflow-x'); + $('body').css('overflow-x', 'hidden'); + + // get some other settings related to building the tooltip + var animation = 'tooltipster-' + self.options.animation, + animationSpeed = '-webkit-transition-duration: '+ self.options.speed +'ms; -webkit-animation-duration: '+ self.options.speed +'ms; -moz-transition-duration: '+ self.options.speed +'ms; -moz-animation-duration: '+ self.options.speed +'ms; -o-transition-duration: '+ self.options.speed +'ms; -o-animation-duration: '+ self.options.speed +'ms; -ms-transition-duration: '+ self.options.speed +'ms; -ms-animation-duration: '+ self.options.speed +'ms; transition-duration: '+ self.options.speed +'ms; animation-duration: '+ self.options.speed +'ms;', + minWidth = self.options.minWidth ? 'min-width:'+ Math.round(self.options.minWidth) +'px;' : '', + maxWidth = self.options.maxWidth ? 'max-width:'+ Math.round(self.options.maxWidth) +'px;' : '', + pointerEvents = self.options.interactive ? 'pointer-events: auto;' : ''; + + // build the base of our tooltip + self.$tooltip = $('<div class="tooltipster-base '+ self.options.theme +'" style="'+ minWidth +' '+ maxWidth +' '+ pointerEvents +' '+ animationSpeed +'"><div class="tooltipster-content"></div></div>'); + + // only add the animation class if the user has a browser that supports animations + if (supportsTransitions()) self.$tooltip.addClass(animation); + + // insert the content + self._content_insert(); + + // attach + self.$tooltip.appendTo('body'); + + // do all the crazy calculations and positioning + self.reposition(); + + // call our custom callback since the content of the tooltip is now part of the DOM + self.options.functionReady.call(self.$el, self.$el, self.$tooltip); + + // animate in the tooltip + if (supportsTransitions()) { + + self.$tooltip.addClass(animation + '-show'); + + if(self.options.speed > 0) self.$tooltip.delay(self.options.speed); + + self.$tooltip.queue(finish); + } + else { + self.$tooltip.css('display', 'none').fadeIn(self.options.speed, finish); + } + + // will check if our tooltip origin is removed while the tooltip is shown + self._interval_set(); + + // reposition on scroll (otherwise position:fixed element's tooltips will move away form their origin) and on resize (in case position can/has to be changed) + $(window).on('scroll.'+ self.namespace +' resize.'+ self.namespace, function() { + self.reposition(); + }); + + // auto-close bindings + if (self.options.autoClose) { + + // in case a listener is already bound for autoclosing (mouse or touch, hover or click), unbind it first + $('body').off('.'+ self.namespace); + + // here we'll have to set different sets of bindings for both touch and mouse + if (self.options.trigger == 'hover') { + + // if the user touches the body, hide + if (deviceHasTouchCapability) { + // timeout 0 : explanation below in click section + setTimeout(function() { + // we don't want to bind on click here because the initial touchstart event has not yet triggered its click event, which is thus about to happen + $('body').on('touchstart.'+ self.namespace, function() { + self.hide(); + }); + }, 0); + } + + // if we have to allow interaction + if (self.options.interactive) { + + // touch events inside the tooltip must not close it + if (deviceHasTouchCapability) { + self.$tooltip.on('touchstart.'+ self.namespace, function(event) { + event.stopPropagation(); + }); + } + + // as for mouse interaction, we get rid of the tooltip only after the mouse has spent some time out of it + var tolerance = null; + + self.$elProxy.add(self.$tooltip) + // hide after some time out of the proxy and the tooltip + .on('mouseleave.'+ self.namespace + '-autoClose', function() { + clearTimeout(tolerance); + tolerance = setTimeout(function(){ + self.hide(); + }, self.options.interactiveTolerance); + }) + // suspend timeout when the mouse is over the proxy or the tooltip + .on('mouseenter.'+ self.namespace + '-autoClose', function() { + clearTimeout(tolerance); + }); + } + // if this is a non-interactive tooltip, get rid of it if the mouse leaves + else { + self.$elProxy.on('mouseleave.'+ self.namespace + '-autoClose', function() { + self.hide(); + }); + } + + // close the tooltip when the proxy gets a click (common behavior of native tooltips) + if (self.options.hideOnClick) { + + self.$elProxy.on('click.'+ self.namespace + '-autoClose', function() { + self.hide(); + }); + } + } + // here we'll set the same bindings for both clicks and touch on the body to hide the tooltip + else if(self.options.trigger == 'click'){ + + // use a timeout to prevent immediate closing if the method was called on a click event and if options.delay == 0 (because of bubbling) + setTimeout(function() { + $('body').on('click.'+ self.namespace +' touchstart.'+ self.namespace, function() { + self.hide(); + }); + }, 0); + + // if interactive, we'll stop the events that were emitted from inside the tooltip to stop autoClosing + if (self.options.interactive) { + + // note : the touch events will just not be used if the plugin is not enabled on touch devices + self.$tooltip.on('click.'+ self.namespace +' touchstart.'+ self.namespace, function(event) { + event.stopPropagation(); + }); + } + } + } + } + + // if we have a timer set, let the countdown begin + if (self.options.timer > 0) { + + self.timerHide = setTimeout(function() { + self.timerHide = null; + self.hide(); + }, self.options.timer + extraTime); + } + } + }); + }, + + _interval_set: function() { + + var self = this; + + self.checkInterval = setInterval(function() { + + // if the tooltip and/or its interval should be stopped + if ( + // if the origin has been removed + $('body').find(self.$el).length === 0 + // if the elProxy has been removed + || $('body').find(self.$elProxy).length === 0 + // if the tooltip has been closed + || self.Status == 'hidden' + // if the tooltip has somehow been removed + || $('body').find(self.$tooltip).length === 0 + ) { + // remove the tooltip if it's still here + if (self.Status == 'shown' || self.Status == 'appearing') self.hide(); + + // clear this interval as it is no longer necessary + self._interval_cancel(); + } + // if everything is alright + else { + // compare the former and current positions of the elProxy to reposition the tooltip if need be + if(self.options.positionTracker){ + + var p = self._repositionInfo(self.$elProxy), + identical = false; + + // compare size first (a change requires repositioning too) + if(areEqual(p.dimension, self.elProxyPosition.dimension)){ + + // for elements with a fixed position, we track the top and left properties (relative to window) + if(self.$elProxy.css('position') === 'fixed'){ + if(areEqual(p.position, self.elProxyPosition.position)) identical = true; + } + // otherwise, track total offset (relative to document) + else { + if(areEqual(p.offset, self.elProxyPosition.offset)) identical = true; + } + } + + if(!identical){ + self.reposition(); + self.options.positionTrackerCallback.call(self, self.$el); + } + } + } + }, 200); + }, + + _interval_cancel: function() { + clearInterval(this.checkInterval); + // clean delete + this.checkInterval = null; + }, + + _content_set: function(content) { + // clone if asked. Cloning the object makes sure that each instance has its own version of the content (in case a same object were provided for several instances) + // reminder : typeof null === object + if (typeof content === 'object' && content !== null && this.options.contentCloning) { + content = content.clone(true); + } + this.Content = content; + }, + + _content_insert: function() { + + var self = this, + $d = this.$tooltip.find('.tooltipster-content'); + + if (typeof self.Content === 'string' && !self.options.contentAsHTML) { + $d.text(self.Content); + } + else { + $d + .empty() + .append(self.Content); + } + }, + + _update: function(content) { + + var self = this; + + // change the content + self._content_set(content); + + if (self.Content !== null) { + + // update the tooltip if it is open + if (self.Status !== 'hidden') { + + // reset the content in the tooltip + self._content_insert(); + + // reposition and resize the tooltip + self.reposition(); + + // if we want to play a little animation showing the content changed + if (self.options.updateAnimation) { + + if (supportsTransitions()) { + + self.$tooltip.css({ + 'width': '', + '-webkit-transition': 'all ' + self.options.speed + 'ms, width 0ms, height 0ms, left 0ms, top 0ms', + '-moz-transition': 'all ' + self.options.speed + 'ms, width 0ms, height 0ms, left 0ms, top 0ms', + '-o-transition': 'all ' + self.options.speed + 'ms, width 0ms, height 0ms, left 0ms, top 0ms', + '-ms-transition': 'all ' + self.options.speed + 'ms, width 0ms, height 0ms, left 0ms, top 0ms', + 'transition': 'all ' + self.options.speed + 'ms, width 0ms, height 0ms, left 0ms, top 0ms' + }).addClass('tooltipster-content-changing'); + + // reset the CSS transitions and finish the change animation + setTimeout(function() { + + if(self.Status != 'hidden'){ + + self.$tooltip.removeClass('tooltipster-content-changing'); + + // after the changing animation has completed, reset the CSS transitions + setTimeout(function() { + + if(self.Status !== 'hidden'){ + self.$tooltip.css({ + '-webkit-transition': self.options.speed + 'ms', + '-moz-transition': self.options.speed + 'ms', + '-o-transition': self.options.speed + 'ms', + '-ms-transition': self.options.speed + 'ms', + 'transition': self.options.speed + 'ms' + }); + } + }, self.options.speed); + } + }, self.options.speed); + } + else { + self.$tooltip.fadeTo(self.options.speed, 0.5, function() { + if(self.Status != 'hidden'){ + self.$tooltip.fadeTo(self.options.speed, 1); + } + }); + } + } + } + } + else { + self.hide(); + } + }, + + _repositionInfo: function($el) { + return { + dimension: { + height: $el.outerHeight(false), + width: $el.outerWidth(false) + }, + offset: $el.offset(), + position: { + left: parseInt($el.css('left')), + top: parseInt($el.css('top')) + } + }; + }, + + hide: function(callback) { + + var self = this; + + // save the method custom callback and cancel any show method custom callbacks + if (callback) self.callbacks.hide.push(callback); + self.callbacks.show = []; + + // get rid of any appearance timeout + clearTimeout(self.timerShow); + self.timerShow = null; + clearTimeout(self.timerHide); + self.timerHide = null; + + var finishCallbacks = function() { + // trigger any hide method custom callbacks and reset them + $.each(self.callbacks.hide, function(i,c) { c.call(self.$el); }); + self.callbacks.hide = []; + }; + + // hide + if (self.Status == 'shown' || self.Status == 'appearing') { + + self.Status = 'disappearing'; + + var finish = function() { + + self.Status = 'hidden'; + + // detach our content object first, so the next jQuery's remove() call does not unbind its event handlers + if (typeof self.Content == 'object' && self.Content !== null) { + self.Content.detach(); + } + + self.$tooltip.remove(); + self.$tooltip = null; + + // unbind orientationchange, scroll and resize listeners + $(window).off('.'+ self.namespace); + + $('body') + // unbind any auto-closing click/touch listeners + .off('.'+ self.namespace) + .css('overflow-x', self.bodyOverflowX); + + // unbind any auto-closing click/touch listeners + $('body').off('.'+ self.namespace); + + // unbind any auto-closing hover listeners + self.$elProxy.off('.'+ self.namespace + '-autoClose'); + + // call our constructor custom callback function + self.options.functionAfter.call(self.$el, self.$el); + + // call our method custom callbacks functions + finishCallbacks(); + }; + + if (supportsTransitions()) { + + self.$tooltip + .clearQueue() + .removeClass('tooltipster-' + self.options.animation + '-show') + // for transitions only + .addClass('tooltipster-dying'); + + if(self.options.speed > 0) self.$tooltip.delay(self.options.speed); + + self.$tooltip.queue(finish); + } + else { + self.$tooltip + .stop() + .fadeOut(self.options.speed, finish); + } + } + // if the tooltip is already hidden, we still need to trigger the method custom callback + else if(self.Status == 'hidden') { + finishCallbacks(); + } + + return self; + }, + + // the public show() method is actually an alias for the private showNow() method + show: function(callback) { + this._showNow(callback); + return this; + }, + + // 'update' is deprecated in favor of 'content' but is kept for backward compatibility + update: function(c) { + return this.content(c); + }, + content: function(c) { + // getter method + if(typeof c === 'undefined'){ + return this.Content; + } + // setter method + else { + this._update(c); + return this; + } + }, + + reposition: function() { + + var self = this; + + // in case the tooltip has been removed from DOM manually + if ($('body').find(self.$tooltip).length !== 0) { + + // reset width + self.$tooltip.css('width', ''); + + // find variables to determine placement + self.elProxyPosition = self._repositionInfo(self.$elProxy); + var arrowReposition = null, + windowWidth = $(window).width(), + // shorthand + proxy = self.elProxyPosition, + tooltipWidth = self.$tooltip.outerWidth(false), + tooltipInnerWidth = self.$tooltip.innerWidth() + 1, // this +1 stops FireFox from sometimes forcing an additional text line + tooltipHeight = self.$tooltip.outerHeight(false); + + // if this is an <area> tag inside a <map>, all hell breaks loose. Recalculate all the measurements based on coordinates + if (self.$elProxy.is('area')) { + var areaShape = self.$elProxy.attr('shape'), + mapName = self.$elProxy.parent().attr('name'), + map = $('img[usemap="#'+ mapName +'"]'), + mapOffsetLeft = map.offset().left, + mapOffsetTop = map.offset().top, + areaMeasurements = self.$elProxy.attr('coords') !== undefined ? self.$elProxy.attr('coords').split(',') : undefined; + + if (areaShape == 'circle') { + var areaLeft = parseInt(areaMeasurements[0]), + areaTop = parseInt(areaMeasurements[1]), + areaWidth = parseInt(areaMeasurements[2]); + proxy.dimension.height = areaWidth * 2; + proxy.dimension.width = areaWidth * 2; + proxy.offset.top = mapOffsetTop + areaTop - areaWidth; + proxy.offset.left = mapOffsetLeft + areaLeft - areaWidth; + } + else if (areaShape == 'rect') { + var areaLeft = parseInt(areaMeasurements[0]), + areaTop = parseInt(areaMeasurements[1]), + areaRight = parseInt(areaMeasurements[2]), + areaBottom = parseInt(areaMeasurements[3]); + proxy.dimension.height = areaBottom - areaTop; + proxy.dimension.width = areaRight - areaLeft; + proxy.offset.top = mapOffsetTop + areaTop; + proxy.offset.left = mapOffsetLeft + areaLeft; + } + else if (areaShape == 'poly') { + var areaXs = [], + areaYs = [], + areaSmallestX = 0, + areaSmallestY = 0, + areaGreatestX = 0, + areaGreatestY = 0, + arrayAlternate = 'even'; + + for (var i = 0; i < areaMeasurements.length; i++) { + var areaNumber = parseInt(areaMeasurements[i]); + + if (arrayAlternate == 'even') { + if (areaNumber > areaGreatestX) { + areaGreatestX = areaNumber; + if (i === 0) { + areaSmallestX = areaGreatestX; + } + } + + if (areaNumber < areaSmallestX) { + areaSmallestX = areaNumber; + } + + arrayAlternate = 'odd'; + } + else { + if (areaNumber > areaGreatestY) { + areaGreatestY = areaNumber; + if (i == 1) { + areaSmallestY = areaGreatestY; + } + } + + if (areaNumber < areaSmallestY) { + areaSmallestY = areaNumber; + } + + arrayAlternate = 'even'; + } + } + + proxy.dimension.height = areaGreatestY - areaSmallestY; + proxy.dimension.width = areaGreatestX - areaSmallestX; + proxy.offset.top = mapOffsetTop + areaSmallestY; + proxy.offset.left = mapOffsetLeft + areaSmallestX; + } + else { + proxy.dimension.height = map.outerHeight(false); + proxy.dimension.width = map.outerWidth(false); + proxy.offset.top = mapOffsetTop; + proxy.offset.left = mapOffsetLeft; + } + } + + // our function and global vars for positioning our tooltip + var myLeft = 0, + myLeftMirror = 0, + myTop = 0, + offsetY = parseInt(self.options.offsetY), + offsetX = parseInt(self.options.offsetX), + // this is the arrow position that will eventually be used. It may differ from the position option if the tooltip cannot be displayed in this position + practicalPosition = self.options.position; + + // a function to detect if the tooltip is going off the screen horizontally. If so, reposition the crap out of it! + function dontGoOffScreenX() { + + var windowLeft = $(window).scrollLeft(); + + // if the tooltip goes off the left side of the screen, line it up with the left side of the window + if((myLeft - windowLeft) < 0) { + arrowReposition = myLeft - windowLeft; + myLeft = windowLeft; + } + + // if the tooltip goes off the right of the screen, line it up with the right side of the window + if (((myLeft + tooltipWidth) - windowLeft) > windowWidth) { + arrowReposition = myLeft - ((windowWidth + windowLeft) - tooltipWidth); + myLeft = (windowWidth + windowLeft) - tooltipWidth; + } + } + + // a function to detect if the tooltip is going off the screen vertically. If so, switch to the opposite! + function dontGoOffScreenY(switchTo, switchFrom) { + // if it goes off the top off the page + if(((proxy.offset.top - $(window).scrollTop() - tooltipHeight - offsetY - 12) < 0) && (switchFrom.indexOf('top') > -1)) { + practicalPosition = switchTo; + } + + // if it goes off the bottom of the page + if (((proxy.offset.top + proxy.dimension.height + tooltipHeight + 12 + offsetY) > ($(window).scrollTop() + $(window).height())) && (switchFrom.indexOf('bottom') > -1)) { + practicalPosition = switchTo; + myTop = (proxy.offset.top - tooltipHeight) - offsetY - 12; + } + } + + if(practicalPosition == 'top') { + var leftDifference = (proxy.offset.left + tooltipWidth) - (proxy.offset.left + proxy.dimension.width); + myLeft = (proxy.offset.left + offsetX) - (leftDifference / 2); + myTop = (proxy.offset.top - tooltipHeight) - offsetY - 12; + dontGoOffScreenX(); + dontGoOffScreenY('bottom', 'top'); + } + + if(practicalPosition == 'top-left') { + myLeft = proxy.offset.left + offsetX; + myTop = (proxy.offset.top - tooltipHeight) - offsetY - 12; + dontGoOffScreenX(); + dontGoOffScreenY('bottom-left', 'top-left'); + } + + if(practicalPosition == 'top-right') { + myLeft = (proxy.offset.left + proxy.dimension.width + offsetX) - tooltipWidth; + myTop = (proxy.offset.top - tooltipHeight) - offsetY - 12; + dontGoOffScreenX(); + dontGoOffScreenY('bottom-right', 'top-right'); + } + + if(practicalPosition == 'bottom') { + var leftDifference = (proxy.offset.left + tooltipWidth) - (proxy.offset.left + proxy.dimension.width); + myLeft = proxy.offset.left - (leftDifference / 2) + offsetX; + myTop = (proxy.offset.top + proxy.dimension.height) + offsetY + 12; + dontGoOffScreenX(); + dontGoOffScreenY('top', 'bottom'); + } + + if(practicalPosition == 'bottom-left') { + myLeft = proxy.offset.left + offsetX; + myTop = (proxy.offset.top + proxy.dimension.height) + offsetY + 12; + dontGoOffScreenX(); + dontGoOffScreenY('top-left', 'bottom-left'); + } + + if(practicalPosition == 'bottom-right') { + myLeft = (proxy.offset.left + proxy.dimension.width + offsetX) - tooltipWidth; + myTop = (proxy.offset.top + proxy.dimension.height) + offsetY + 12; + dontGoOffScreenX(); + dontGoOffScreenY('top-right', 'bottom-right'); + } + + if(practicalPosition == 'left') { + myLeft = proxy.offset.left - offsetX - tooltipWidth - 12; + myLeftMirror = proxy.offset.left + offsetX + proxy.dimension.width + 12; + var topDifference = (proxy.offset.top + tooltipHeight) - (proxy.offset.top + proxy.dimension.height); + myTop = proxy.offset.top - (topDifference / 2) - offsetY; + + // if the tooltip goes off boths sides of the page + if((myLeft < 0) && ((myLeftMirror + tooltipWidth) > windowWidth)) { + var borderWidth = parseFloat(self.$tooltip.css('border-width')) * 2, + newWidth = (tooltipWidth + myLeft) - borderWidth; + self.$tooltip.css('width', newWidth + 'px'); + + tooltipHeight = self.$tooltip.outerHeight(false); + myLeft = proxy.offset.left - offsetX - newWidth - 12 - borderWidth; + topDifference = (proxy.offset.top + tooltipHeight) - (proxy.offset.top + proxy.dimension.height); + myTop = proxy.offset.top - (topDifference / 2) - offsetY; + } + + // if it only goes off one side, flip it to the other side + else if(myLeft < 0) { + myLeft = proxy.offset.left + offsetX + proxy.dimension.width + 12; + arrowReposition = 'left'; + } + } + + if(practicalPosition == 'right') { + myLeft = proxy.offset.left + offsetX + proxy.dimension.width + 12; + myLeftMirror = proxy.offset.left - offsetX - tooltipWidth - 12; + var topDifference = (proxy.offset.top + tooltipHeight) - (proxy.offset.top + proxy.dimension.height); + myTop = proxy.offset.top - (topDifference / 2) - offsetY; + + // if the tooltip goes off boths sides of the page + if(((myLeft + tooltipWidth) > windowWidth) && (myLeftMirror < 0)) { + var borderWidth = parseFloat(self.$tooltip.css('border-width')) * 2, + newWidth = (windowWidth - myLeft) - borderWidth; + self.$tooltip.css('width', newWidth + 'px'); + + tooltipHeight = self.$tooltip.outerHeight(false); + topDifference = (proxy.offset.top + tooltipHeight) - (proxy.offset.top + proxy.dimension.height); + myTop = proxy.offset.top - (topDifference / 2) - offsetY; + } + + // if it only goes off one side, flip it to the other side + else if((myLeft + tooltipWidth) > windowWidth) { + myLeft = proxy.offset.left - offsetX - tooltipWidth - 12; + arrowReposition = 'right'; + } + } + + // if arrow is set true, style it and append it + if (self.options.arrow) { + + var arrowClass = 'tooltipster-arrow-' + practicalPosition; + + // set color of the arrow + if(self.options.arrowColor.length < 1) { + var arrowColor = self.$tooltip.css('background-color'); + } + else { + var arrowColor = self.options.arrowColor; + } + + // if the tooltip was going off the page and had to re-adjust, we need to update the arrow's position + if (!arrowReposition) { + arrowReposition = ''; + } + else if (arrowReposition == 'left') { + arrowClass = 'tooltipster-arrow-right'; + arrowReposition = ''; + } + else if (arrowReposition == 'right') { + arrowClass = 'tooltipster-arrow-left'; + arrowReposition = ''; + } + else { + arrowReposition = 'left:'+ Math.round(arrowReposition) +'px;'; + } + + // building the logic to create the border around the arrow of the tooltip + if ((practicalPosition == 'top') || (practicalPosition == 'top-left') || (practicalPosition == 'top-right')) { + var tooltipBorderWidth = parseFloat(self.$tooltip.css('border-bottom-width')), + tooltipBorderColor = self.$tooltip.css('border-bottom-color'); + } + else if ((practicalPosition == 'bottom') || (practicalPosition == 'bottom-left') || (practicalPosition == 'bottom-right')) { + var tooltipBorderWidth = parseFloat(self.$tooltip.css('border-top-width')), + tooltipBorderColor = self.$tooltip.css('border-top-color'); + } + else if (practicalPosition == 'left') { + var tooltipBorderWidth = parseFloat(self.$tooltip.css('border-right-width')), + tooltipBorderColor = self.$tooltip.css('border-right-color'); + } + else if (practicalPosition == 'right') { + var tooltipBorderWidth = parseFloat(self.$tooltip.css('border-left-width')), + tooltipBorderColor = self.$tooltip.css('border-left-color'); + } + else { + var tooltipBorderWidth = parseFloat(self.$tooltip.css('border-bottom-width')), + tooltipBorderColor = self.$tooltip.css('border-bottom-color'); + } + + if (tooltipBorderWidth > 1) { + tooltipBorderWidth++; + } + + var arrowBorder = ''; + if (tooltipBorderWidth !== 0) { + var arrowBorderSize = '', + arrowBorderColor = 'border-color: '+ tooltipBorderColor +';'; + if (arrowClass.indexOf('bottom') !== -1) { + arrowBorderSize = 'margin-top: -'+ Math.round(tooltipBorderWidth) +'px;'; + } + else if (arrowClass.indexOf('top') !== -1) { + arrowBorderSize = 'margin-bottom: -'+ Math.round(tooltipBorderWidth) +'px;'; + } + else if (arrowClass.indexOf('left') !== -1) { + arrowBorderSize = 'margin-right: -'+ Math.round(tooltipBorderWidth) +'px;'; + } + else if (arrowClass.indexOf('right') !== -1) { + arrowBorderSize = 'margin-left: -'+ Math.round(tooltipBorderWidth) +'px;'; + } + arrowBorder = '<span class="tooltipster-arrow-border" style="'+ arrowBorderSize +' '+ arrowBorderColor +';"></span>'; + } + + // if the arrow already exists, remove and replace it + self.$tooltip.find('.tooltipster-arrow').remove(); + + // build out the arrow and append it + var arrowConstruct = '<div class="'+ arrowClass +' tooltipster-arrow" style="'+ arrowReposition +'">'+ arrowBorder +'<span style="border-color:'+ arrowColor +';"></span></div>'; + self.$tooltip.append(arrowConstruct); + } + + // position the tooltip + self.$tooltip.css({'top': Math.round(myTop) + 'px', 'left': Math.round(myLeft) + 'px'}); + } + + return self; + }, + + enable: function() { + this.enabled = true; + return this; + }, + + disable: function() { + // hide first, in case the tooltip would not disappear on its own (autoClose false) + this.hide(); + this.enabled = false; + return this; + }, + + destroy: function() { + + var self = this; + + self.hide(); + + // remove the icon, if any + if (self.$el[0] !== self.$elProxy[0]) { + self.$elProxy.remove(); + } + + self.$el + .removeData(self.namespace) + .off('.'+ self.namespace); + + var ns = self.$el.data('tooltipster-ns'); + + // if there are no more tooltips on this element + if(ns.length === 1){ + + // optional restoration of a title attribute + var title = null; + if (self.options.restoration === 'previous'){ + title = self.$el.data('tooltipster-initialTitle'); + } + else if(self.options.restoration === 'current'){ + + // old school technique to stringify when outerHTML is not supported + title = + (typeof self.Content === 'string') ? + self.Content : + $('<div></div>').append(self.Content).html(); + } + + if (title) { + self.$el.attr('title', title); + } + + // final cleaning + self.$el + .removeClass('tooltipstered') + .removeData('tooltipster-ns') + .removeData('tooltipster-initialTitle'); + } + else { + // remove the instance namespace from the list of namespaces of tooltips present on the element + ns = $.grep(ns, function(el, i){ + return el !== self.namespace; + }); + self.$el.data('tooltipster-ns', ns); + } + + return self; + }, + + elementIcon: function() { + return (this.$el[0] !== this.$elProxy[0]) ? this.$elProxy[0] : undefined; + }, + + elementTooltip: function() { + return this.$tooltip ? this.$tooltip[0] : undefined; + }, + + // public methods but for internal use only + // getter if val is ommitted, setter otherwise + option: function(o, val) { + if (typeof val == 'undefined') return this.options[o]; + else { + this.options[o] = val; + return this; + } + }, + status: function() { + return this.Status; + } + }; + + $.fn[pluginName] = function () { + + // for using in closures + var args = arguments; + + // if we are not in the context of jQuery wrapped HTML element(s) : + // this happens when calling static methods in the form $.fn.tooltipster('methodName'), or when calling $(sel).tooltipster('methodName or options') where $(sel) does not match anything + if (this.length === 0) { + + // if the first argument is a method name + if (typeof args[0] === 'string') { + + var methodIsStatic = true; + + // list static methods here (usable by calling $.fn.tooltipster('methodName');) + switch (args[0]) { + + case 'setDefaults': + // change default options for all future instances + $.extend(defaults, args[1]); + break; + + default: + methodIsStatic = false; + break; + } + + // $.fn.tooltipster('methodName') calls will return true + if (methodIsStatic) return true; + // $(sel).tooltipster('methodName') calls will return the list of objects event though it's empty because chaining should work on empty lists + else return this; + } + // the first argument is undefined or an object of options : we are initalizing but there is no element matched by selector + else { + // still chainable : same as above + return this; + } + } + // this happens when calling $(sel).tooltipster('methodName or options') where $(sel) matches one or more elements + else { + + // method calls + if (typeof args[0] === 'string') { + + var v = '#*$~&'; + + this.each(function() { + + // retrieve the namepaces of the tooltip(s) that exist on that element. We will interact with the first tooltip only. + var ns = $(this).data('tooltipster-ns'), + // self represents the instance of the first tooltipster plugin associated to the current HTML object of the loop + self = ns ? $(this).data(ns[0]) : null; + + // if the current element holds a tooltipster instance + if (self) { + + if (typeof self[args[0]] === 'function') { + // note : args[1] and args[2] may not be defined + var resp = self[args[0]](args[1], args[2]); + } + else { + throw new Error('Unknown method .tooltipster("' + args[0] + '")'); + } + + // if the function returned anything other than the instance itself (which implies chaining) + if (resp !== self){ + v = resp; + // return false to stop .each iteration on the first element matched by the selector + return false; + } + } + else { + throw new Error('You called Tooltipster\'s "' + args[0] + '" method on an uninitialized element'); + } + }); + + return (v !== '#*$~&') ? v : this; + } + // first argument is undefined or an object : the tooltip is initializing + else { + + var instances = [], + // is there a defined value for the multiple option in the options object ? + multipleIsSet = args[0] && typeof args[0].multiple !== 'undefined', + // if the multiple option is set to true, or if it's not defined but set to true in the defaults + multiple = (multipleIsSet && args[0].multiple) || (!multipleIsSet && defaults.multiple), + // same for debug + debugIsSet = args[0] && typeof args[0].debug !== 'undefined', + debug = (debugIsSet && args[0].debug) || (!debugIsSet && defaults.debug); + + // initialize a tooltipster instance for each element if it doesn't already have one or if the multiple option is set, and attach the object to it + this.each(function () { + + var go = false, + ns = $(this).data('tooltipster-ns'), + instance = null; + + if (!ns) { + go = true; + } + else if (multiple) { + go = true; + } + else if (debug) { + console.log('Tooltipster: one or more tooltips are already attached to this element: ignoring. Use the "multiple" option to attach more tooltips.'); + } + + if (go) { + instance = new Plugin(this, args[0]); + + // save the reference of the new instance + if (!ns) ns = []; + ns.push(instance.namespace); + $(this).data('tooltipster-ns', ns) + + // save the instance itself + $(this).data(instance.namespace, instance); + } + + instances.push(instance); + }); + + if (multiple) return instances; + else return this; + } + } + }; + + // quick & dirty compare function (not bijective nor multidimensional) + function areEqual(a,b) { + var same = true; + $.each(a, function(i, el){ + if(typeof b[i] === 'undefined' || a[i] !== b[i]){ + same = false; + return false; + } + }); + return same; + } + + // detect if this device can trigger touch events + var deviceHasTouchCapability = !!('ontouchstart' in window); + + // we'll assume the device has no mouse until we detect any mouse movement + var deviceHasMouse = false; + $('body').one('mousemove', function() { + deviceHasMouse = true; + }); + + function deviceIsPureTouch() { + return (!deviceHasMouse && deviceHasTouchCapability); + } + + // detecting support for CSS transitions + function supportsTransitions() { + var b = document.body || document.documentElement, + s = b.style, + p = 'transition'; + + if(typeof s[p] == 'string') {return true; } + + v = ['Moz', 'Webkit', 'Khtml', 'O', 'ms'], + p = p.charAt(0).toUpperCase() + p.substr(1); + for(var i=0; i<v.length; i++) { + if(typeof s[v[i] + p] == 'string') { return true; } + } + return false; + } +})( jQuery, window, document ); + +/* autogeneration */ +define("jquery-tooltipster", [ + "jquery" +], function(){}); + +/* @source lib/jquery.zclip.js */; + +/* + * zClip :: jQuery ZeroClipboard v1.1.1 + * http://steamdev.com/zclip + * + * Copyright 2011, SteamDev + * Released under the MIT license. + * http://www.opensource.org/licenses/mit-license.php + * + * Date: Wed Jun 01, 2011 + */ + + +(function ($) { + + $.fn.zclip = function (params) { + + if (typeof params == "object" && !params.length) { + + var settings = $.extend({ + + path: 'ZeroClipboard.swf', + copy: null, + beforeCopy: null, + afterCopy: null, + clickAfter: true, + setHandCursor: true, + setCSSEffects: true + + }, params); + + + return this.each(function () { + + var o = $(this); + + if (o.is(':visible') && (typeof settings.copy == 'string' || $.isFunction(settings.copy))) { + + ZeroClipboard.setMoviePath(settings.path); + var clip = new ZeroClipboard.Client(); + + if($.isFunction(settings.copy)){ + o.bind('zClip_copy',settings.copy); + } + if($.isFunction(settings.beforeCopy)){ + o.bind('zClip_beforeCopy',settings.beforeCopy); + } + if($.isFunction(settings.afterCopy)){ + o.bind('zClip_afterCopy',settings.afterCopy); + } + + clip.setHandCursor(settings.setHandCursor); + clip.setCSSEffects(settings.setCSSEffects); + clip.addEventListener('mouseOver', function (client) { + o.trigger('mouseenter'); + }); + clip.addEventListener('mouseOut', function (client) { + o.trigger('mouseleave'); + }); + clip.addEventListener('mouseDown', function (client) { + + o.trigger('mousedown'); + + if(!$.isFunction(settings.copy)){ + clip.setText(settings.copy); + } else { + clip.setText(o.triggerHandler('zClip_copy')); + } + + if ($.isFunction(settings.beforeCopy)) { + o.trigger('zClip_beforeCopy'); + } + + }); + + clip.addEventListener('complete', function (client, text) { + + if ($.isFunction(settings.afterCopy)) { + + o.trigger('zClip_afterCopy'); + + } else { + if (text.length > 500) { + text = text.substr(0, 500) + "...\n\n(" + (text.length - 500) + " characters not shown)"; + } + + o.removeClass('hover'); + alert("Copied text to clipboard:\n\n " + text); + } + + if (settings.clickAfter) { + o.trigger('click'); + } + + }); + + + clip.glue(o[0], o.parent()[0]); + + $(window).bind('load resize',function(){clip.reposition();}); + + + } + + }); + + } else if (typeof params == "string") { + + return this.each(function () { + + var o = $(this); + + params = params.toLowerCase(); + var zclipId = o.data('zclipId'); + var clipElm = $('#' + zclipId + '.zclip'); + + if (params == "remove") { + + clipElm.remove(); + o.removeClass('active hover'); + + } else if (params == "hide") { + + clipElm.hide(); + o.removeClass('active hover'); + + } else if (params == "show") { + + clipElm.show(); + + } + + }); + + } + + } + + + +})(jQuery); + + + + + + + +// ZeroClipboard +// Simple Set Clipboard System +// Author: Joseph Huckaby +var ZeroClipboard = { + + version: "1.0.7", + clients: {}, + // registered upload clients on page, indexed by id + moviePath: 'ZeroClipboard.swf', + // URL to movie + nextId: 1, + // ID of next movie + $: function (thingy) { + // simple DOM lookup utility function + if (typeof(thingy) == 'string') thingy = document.getElementById(thingy); + if (!thingy.addClass) { + // extend element with a few useful methods + thingy.hide = function () { + this.style.display = 'none'; + }; + thingy.show = function () { + this.style.display = ''; + }; + thingy.addClass = function (name) { + this.removeClass(name); + this.className += ' ' + name; + }; + thingy.removeClass = function (name) { + var classes = this.className.split(/\s+/); + var idx = -1; + for (var k = 0; k < classes.length; k++) { + if (classes[k] == name) { + idx = k; + k = classes.length; + } + } + if (idx > -1) { + classes.splice(idx, 1); + this.className = classes.join(' '); + } + return this; + }; + thingy.hasClass = function (name) { + return !!this.className.match(new RegExp("\\s*" + name + "\\s*")); + }; + } + return thingy; + }, + + setMoviePath: function (path) { + // set path to ZeroClipboard.swf + this.moviePath = path; + }, + + dispatch: function (id, eventName, args) { + // receive event from flash movie, send to client + var client = this.clients[id]; + if (client) { + client.receiveEvent(eventName, args); + } + }, + + register: function (id, client) { + // register new client to receive events + this.clients[id] = client; + }, + + getDOMObjectPosition: function (obj, stopObj) { + // get absolute coordinates for dom element + var info = { + left: 0, + top: 0, + width: obj.width ? obj.width : obj.offsetWidth, + height: obj.height ? obj.height : obj.offsetHeight + }; + + if (obj && (obj != stopObj)) { + info.left += obj.offsetLeft; + info.top += obj.offsetTop; + } + + return info; + }, + + Client: function (elem) { + // constructor for new simple upload client + this.handlers = {}; + + // unique ID + this.id = ZeroClipboard.nextId++; + this.movieId = 'ZeroClipboardMovie_' + this.id; + + // register client with singleton to receive flash events + ZeroClipboard.register(this.id, this); + + // create movie + if (elem) this.glue(elem); + } +}; + +ZeroClipboard.Client.prototype = { + + id: 0, + // unique ID for us + ready: false, + // whether movie is ready to receive events or not + movie: null, + // reference to movie object + clipText: '', + // text to copy to clipboard + handCursorEnabled: true, + // whether to show hand cursor, or default pointer cursor + cssEffects: true, + // enable CSS mouse effects on dom container + handlers: null, + // user event handlers + glue: function (elem, appendElem, stylesToAdd) { + // glue to DOM element + // elem can be ID or actual DOM element object + this.domElement = ZeroClipboard.$(elem); + + // float just above object, or zIndex 99 if dom element isn't set + var zIndex = 99; + if (this.domElement.style.zIndex) { + zIndex = parseInt(this.domElement.style.zIndex, 10) + 1; + } + + if (typeof(appendElem) == 'string') { + appendElem = ZeroClipboard.$(appendElem); + } else if (typeof(appendElem) == 'undefined') { + appendElem = document.getElementsByTagName('body')[0]; + } + + // find X/Y position of domElement + var box = ZeroClipboard.getDOMObjectPosition(this.domElement, appendElem); + + // create floating DIV above element + this.div = document.createElement('div'); + this.div.className = "zclip"; + this.div.id = "zclip-" + this.movieId; + $(this.domElement).data('zclipId', 'zclip-' + this.movieId); + var style = this.div.style; + style.position = 'absolute'; + style.left = '' + box.left + 'px'; + style.top = '' + box.top + 'px'; + style.width = '' + box.width + 'px'; + style.height = '' + box.height + 'px'; + style.zIndex = zIndex; + + if (typeof(stylesToAdd) == 'object') { + for (addedStyle in stylesToAdd) { + style[addedStyle] = stylesToAdd[addedStyle]; + } + } + + // style.backgroundColor = '#f00'; // debug + appendElem.appendChild(this.div); + + this.div.innerHTML = this.getHTML(box.width, box.height); + }, + + getHTML: function (width, height) { + // return HTML for movie + var html = ''; + var flashvars = 'id=' + this.id + '&width=' + width + '&height=' + height; + + if (navigator.userAgent.match(/MSIE/)) { + // IE gets an OBJECT tag + var protocol = location.href.match(/^https/i) ? 'https://' : 'http://'; + html += '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="' + protocol + 'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="' + width + '" height="' + height + '" id="' + this.movieId + '" align="middle"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="' + ZeroClipboard.moviePath + '" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="' + flashvars + '"/><param name="wmode" value="transparent"/></object>'; + } else { + // all other browsers get an EMBED tag + html += '<embed id="' + this.movieId + '" src="' + ZeroClipboard.moviePath + '" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="' + width + '" height="' + height + '" name="' + this.movieId + '" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="' + flashvars + '" wmode="transparent" />'; + } + return html; + }, + + hide: function () { + // temporarily hide floater offscreen + if (this.div) { + this.div.style.left = '-2000px'; + } + }, + + show: function () { + // show ourselves after a call to hide() + this.reposition(); + }, + + destroy: function () { + // destroy control and floater + if (this.domElement && this.div) { + this.hide(); + this.div.innerHTML = ''; + + var body = document.getElementsByTagName('body')[0]; + try { + body.removeChild(this.div); + } catch (e) {; + } + + this.domElement = null; + this.div = null; + } + }, + + reposition: function (elem) { + // reposition our floating div, optionally to new container + // warning: container CANNOT change size, only position + if (elem) { + this.domElement = ZeroClipboard.$(elem); + if (!this.domElement) this.hide(); + } + + if (this.domElement && this.div) { + var box = ZeroClipboard.getDOMObjectPosition(this.domElement); + var style = this.div.style; + style.left = '' + box.left + 'px'; + style.top = '' + box.top + 'px'; + } + }, + + setText: function (newText) { + // set text to be copied to clipboard + this.clipText = newText; + if (this.ready) { + this.movie.setText(newText); + } + }, + + addEventListener: function (eventName, func) { + // add user event listener for event + // event types: load, queueStart, fileStart, fileComplete, queueComplete, progress, error, cancel + eventName = eventName.toString().toLowerCase().replace(/^on/, ''); + if (!this.handlers[eventName]) { + this.handlers[eventName] = []; + } + this.handlers[eventName].push(func); + }, + + setHandCursor: function (enabled) { + // enable hand cursor (true), or default arrow cursor (false) + this.handCursorEnabled = enabled; + if (this.ready) { + this.movie.setHandCursor(enabled); + } + }, + + setCSSEffects: function (enabled) { + // enable or disable CSS effects on DOM container + this.cssEffects = !! enabled; + }, + + receiveEvent: function (eventName, args) { + // receive event from flash + eventName = eventName.toString().toLowerCase().replace(/^on/, ''); + + // special behavior for certain events + switch (eventName) { + case 'load': + // movie claims it is ready, but in IE this isn't always the case... + // bug fix: Cannot extend EMBED DOM elements in Firefox, must use traditional function + this.movie = document.getElementById(this.movieId); + if (!this.movie) { + var self = this; + setTimeout(function () { + self.receiveEvent('load', null); + }, 1); + return; + } + + // firefox on pc needs a "kick" in order to set these in certain cases + if (!this.ready && navigator.userAgent.match(/Firefox/) && navigator.userAgent.match(/Windows/)) { + var self = this; + setTimeout(function () { + self.receiveEvent('load', null); + }, 100); + this.ready = true; + return; + } + + this.ready = true; + try { + this.movie.setText(this.clipText); + } catch (e) {} + try { + this.movie.setHandCursor(this.handCursorEnabled); + } catch (e) {} + break; + + case 'mouseover': + if (this.domElement && this.cssEffects) { + this.domElement.addClass('hover'); + if (this.recoverActive) { + this.domElement.addClass('active'); + } + + + } + + + break; + + case 'mouseout': + if (this.domElement && this.cssEffects) { + this.recoverActive = false; + if (this.domElement.hasClass('active')) { + this.domElement.removeClass('active'); + this.recoverActive = true; + } + this.domElement.removeClass('hover'); + + } + break; + + case 'mousedown': + if (this.domElement && this.cssEffects) { + this.domElement.addClass('active'); + } + break; + + case 'mouseup': + if (this.domElement && this.cssEffects) { + this.domElement.removeClass('active'); + this.recoverActive = false; + } + break; + } // switch eventName + if (this.handlers[eventName]) { + for (var idx = 0, len = this.handlers[eventName].length; idx < len; idx++) { + var func = this.handlers[eventName][idx]; + + if (typeof(func) == 'function') { + // actual function reference + func(this, args); + } else if ((typeof(func) == 'object') && (func.length == 2)) { + // PHP style object + method, i.e. [myObject, 'myMethod'] + func[0][func[1]](this, args); + } else if (typeof(func) == 'string') { + // name of function + window[func](this, args); + } + } // foreach event handler defined + } // user defined handler for event + } + +}; + + +/* autogeneration */ +define("jquery-zclip", [ + "jquery" +], function(){}); + +/* @source lib/unobtrusive.js */; + +jQuery(function ($) { + var csrf_token = $('meta[name=csrf-token]').attr('content'), + csrf_param = $('meta[name=csrf-param]').attr('content'); + + + $.fn.extend({ + triggerAndReturn: function (name, data) { + var event = new $.Event(name); + this.trigger(event, data); + + return event.result !== false; + }, + + /** + * Handles execution of remote calls firing overridable events along the way + */ + callRemote: function () { + var el = this, + method = el.attr('method') || el.attr('data-method') || 'GET', + url = el.attr('action') || el.attr('href'), + dataType = el.attr('data-type') || 'script'; + + if (url === undefined) { + throw "No URL specified for remote call (action or href must be present)."; + } else { + if (el.triggerAndReturn('ajax:before')) { + var data = el.is('form') ? el.serializeArray() : []; + $.ajax({ + url: url, + data: data, + dataType: dataType, + type: method.toUpperCase(), + beforeSend: function (xhr) { + el.trigger('ajax:loading', xhr); + }, + success: function (data, status, xhr) { + el.trigger('ajax:success', [data, status, xhr]); + }, + complete: function (xhr) { + el.trigger('ajax:complete', xhr); + }, + error: function (xhr, status, error) { + el.trigger('ajax:failure', [xhr, status, error]); + } + }); + } + + el.trigger('ajax:after'); + } + } + }); + + /** + * confirmation handler + */ + $('a[data-confirm],input[data-confirm]').on('click', function () { + var el = $(this); + if (el.triggerAndReturn('confirm')) { + if (!confirm(el.attr('data-confirm'))) { + return false; + } + } + }); + + + /** + * remote handlers + */ + $('form[data-remote]').on('submit', function (e) { + $(this).callRemote(); + e.preventDefault(); + }); + + $('a[data-remote],input[data-remote]').on('click', function (e) { + $(this).callRemote(); + e.preventDefault(); + }); + + $('a[data-method]:not([data-remote])').on('click', function (e){ + var link = $(this), + href = link.attr('href'), + method = link.attr('data-method'), + form = $('<form method="post" action="'+href+'"></form>'), + metadata_input = '<input name="_method" value="'+method+'" type="hidden" />'; + + form.hide() + .append(metadata_input) + .appendTo('body'); + + e.preventDefault(); + form.submit(); + }); + + /** + * disable-with handlers + */ + var disable_with_input_selector = 'input[data-disable-with]'; + var disable_with_form_remote_selector = 'form[data-remote]:has(' + disable_with_input_selector + ')'; + var disable_with_form_not_remote_selector = 'form:not([data-remote]):has(' + disable_with_input_selector + ')'; + + var disable_with_input_function = function () { + $(this).find(disable_with_input_selector).each(function () { + var input = $(this); + input.data('enable-with', input.val()) + .attr('value', input.attr('data-disable-with')) + .attr('disabled', 'disabled'); + }); + }; + + $(disable_with_form_remote_selector).on('ajax:before', disable_with_input_function); + $(disable_with_form_not_remote_selector).on('submit', disable_with_input_function); + + $(disable_with_form_remote_selector).on('ajax:complete', function () { + $(this).find(disable_with_input_selector).each(function () { + var input = $(this); + input.removeAttr('disabled') + .val(input.data('enable-with')); + }); + }); + +}); + +/* autogeneration */ +define("jquery-unobstrusive", [ + "jquery" +], function(){}); + +/* @source lib/jquery.forms.js */; + +/*! + * jQuery Form Plugin + * version: 3.24 (26-DEC-2012) + * @requires jQuery v1.5 or later + * + * Examples and documentation at: http://malsup.com/jquery/form/ + * Project repository: https://github.com/malsup/form + * Dual licensed under the MIT and GPL licenses: + * http://malsup.github.com/mit-license.txt + * http://malsup.github.com/gpl-license-v2.txt + */ +/*global ActiveXObject alert */ +;(function($) { +"use strict"; + +/* + Usage Note: + ----------- + Do not use both ajaxSubmit and ajaxForm on the same form. These + functions are mutually exclusive. Use ajaxSubmit if you want + to bind your own submit handler to the form. For example, + + $(document).ready(function() { + $('#myForm').on('submit', function(e) { + e.preventDefault(); // <-- important + $(this).ajaxSubmit({ + target: '#output' + }); + }); + }); + + Use ajaxForm when you want the plugin to manage all the event binding + for you. For example, + + $(document).ready(function() { + $('#myForm').ajaxForm({ + target: '#output' + }); + }); + + You can also use ajaxForm with delegation (requires jQuery v1.7+), so the + form does not have to exist when you invoke ajaxForm: + + $('#myForm').ajaxForm({ + delegation: true, + target: '#output' + }); + + When using ajaxForm, the ajaxSubmit function will be invoked for you + at the appropriate time. +*/ + +/** + * Feature detection + */ +var feature = {}; +feature.fileapi = $("<input type='file'/>").get(0).files !== undefined; +feature.formdata = window.FormData !== undefined; + +/** + * ajaxSubmit() provides a mechanism for immediately submitting + * an HTML form using AJAX. + */ +$.fn.ajaxSubmit = function(options) { + /*jshint scripturl:true */ + + // fast fail if nothing selected (http://dev.jquery.com/ticket/2752) + if (!this.length) { + log('ajaxSubmit: skipping submit process - no element selected'); + return this; + } + + var method, action, url, $form = this; + + if (typeof options == 'function') { + options = { success: options }; + } + + method = this.attr('method'); + action = this.attr('action'); + url = (typeof action === 'string') ? $.trim(action) : ''; + url = url || window.location.href || ''; + if (url) { + // clean url (don't include hash vaue) + url = (url.match(/^([^#]+)/)||[])[1]; + } + + options = $.extend(true, { + url: url, + success: $.ajaxSettings.success, + type: method || 'GET', + iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank' + }, options); + + // hook for manipulating the form data before it is extracted; + // convenient for use with rich editors like tinyMCE or FCKEditor + var veto = {}; + this.trigger('form-pre-serialize', [this, options, veto]); + if (veto.veto) { + log('ajaxSubmit: submit vetoed via form-pre-serialize trigger'); + return this; + } + + // provide opportunity to alter form data before it is serialized + if (options.beforeSerialize && options.beforeSerialize(this, options) === false) { + log('ajaxSubmit: submit aborted via beforeSerialize callback'); + return this; + } + + var traditional = options.traditional; + if ( traditional === undefined ) { + traditional = $.ajaxSettings.traditional; + } + + var elements = []; + var qx, a = this.formToArray(options.semantic, elements); + if (options.data) { + options.extraData = options.data; + qx = $.param(options.data, traditional); + } + + // give pre-submit callback an opportunity to abort the submit + if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) { + log('ajaxSubmit: submit aborted via beforeSubmit callback'); + return this; + } + + // fire vetoable 'validate' event + this.trigger('form-submit-validate', [a, this, options, veto]); + if (veto.veto) { + log('ajaxSubmit: submit vetoed via form-submit-validate trigger'); + return this; + } + + var q = $.param(a, traditional); + if (qx) { + q = ( q ? (q + '&' + qx) : qx ); + } + if (options.type.toUpperCase() == 'GET') { + options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q; + options.data = null; // data is null for 'get' + } + else { + options.data = q; // data is the query string for 'post' + } + + var callbacks = []; + if (options.resetForm) { + callbacks.push(function() { $form.resetForm(); }); + } + if (options.clearForm) { + callbacks.push(function() { $form.clearForm(options.includeHidden); }); + } + + // perform a load on the target only if dataType is not provided + if (!options.dataType && options.target) { + var oldSuccess = options.success || function(){}; + callbacks.push(function(data) { + var fn = options.replaceTarget ? 'replaceWith' : 'html'; + $(options.target)[fn](data).each(oldSuccess, arguments); + }); + } + else if (options.success) { + callbacks.push(options.success); + } + + options.success = function(data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg + var context = options.context || this ; // jQuery 1.4+ supports scope context + for (var i=0, max=callbacks.length; i < max; i++) { + callbacks[i].apply(context, [data, status, xhr || $form, $form]); + } + }; + + // are there files to upload? + + // [value] (issue #113), also see comment: + // https://github.com/malsup/form/commit/588306aedba1de01388032d5f42a60159eea9228#commitcomment-2180219 + var fileInputs = $('input[type=file]:enabled[value!=""]', this); + + var hasFileInputs = fileInputs.length > 0; + var mp = 'multipart/form-data'; + var multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp); + + var fileAPI = feature.fileapi && feature.formdata; + log("fileAPI :" + fileAPI); + var shouldUseFrame = (hasFileInputs || multipart) && !fileAPI; + + var jqxhr; + + // options.iframe allows user to force iframe mode + // 06-NOV-09: now defaulting to iframe mode if file input is detected + if (options.iframe !== false && (options.iframe || shouldUseFrame)) { + // hack to fix Safari hang (thanks to Tim Molendijk for this) + // see: http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d + if (options.closeKeepAlive) { + $.get(options.closeKeepAlive, function() { + jqxhr = fileUploadIframe(a); + }); + } + else { + jqxhr = fileUploadIframe(a); + } + } + else if ((hasFileInputs || multipart) && fileAPI) { + jqxhr = fileUploadXhr(a); + } + else { + jqxhr = $.ajax(options); + } + + $form.removeData('jqxhr').data('jqxhr', jqxhr); + + // clear element array + for (var k=0; k < elements.length; k++) + elements[k] = null; + + // fire 'notify' event + this.trigger('form-submit-notify', [this, options]); + return this; + + // utility fn for deep serialization + function deepSerialize(extraData){ + var serialized = $.param(extraData).split('&'); + var len = serialized.length; + var result = {}; + var i, part; + for (i=0; i < len; i++) { + // #252; undo param space replacement + serialized[i] = serialized[i].replace(/\+/g,' '); + part = serialized[i].split('='); + result[decodeURIComponent(part[0])] = decodeURIComponent(part[1]); + } + return result; + } + + // XMLHttpRequest Level 2 file uploads (big hat tip to francois2metz) + function fileUploadXhr(a) { + var formdata = new FormData(); + + for (var i=0; i < a.length; i++) { + formdata.append(a[i].name, a[i].value); + } + + if (options.extraData) { + var serializedData = deepSerialize(options.extraData); + for (var p in serializedData) + if (serializedData.hasOwnProperty(p)) + formdata.append(p, serializedData[p]); + } + + options.data = null; + + var s = $.extend(true, {}, $.ajaxSettings, options, { + contentType: false, + processData: false, + cache: false, + type: method || 'POST' + }); + + if (options.uploadProgress) { + // workaround because jqXHR does not expose upload property + s.xhr = function() { + var xhr = jQuery.ajaxSettings.xhr(); + if (xhr.upload) { + xhr.upload.onprogress = function(event) { + var percent = 0; + var position = event.loaded || event.position; /*event.position is deprecated*/ + var total = event.total; + if (event.lengthComputable) { + percent = Math.ceil(position / total * 100); + } + options.uploadProgress(event, position, total, percent); + }; + } + return xhr; + }; + } + + s.data = null; + var beforeSend = s.beforeSend; + s.beforeSend = function(xhr, o) { + o.data = formdata; + if(beforeSend) + beforeSend.call(this, xhr, o); + }; + return $.ajax(s); + } + + // private function for handling file uploads (hat tip to YAHOO!) + function fileUploadIframe(a) { + var form = $form[0], el, i, s, g, id, $io, io, xhr, sub, n, timedOut, timeoutHandle; + var useProp = !!$.fn.prop; + var deferred = $.Deferred(); + + if ($('[name=submit],[id=submit]', form).length) { + // if there is an input with a name or id of 'submit' then we won't be + // able to invoke the submit fn on the form (at least not x-browser) + alert('Error: Form elements must not have name or id of "submit".'); + deferred.reject(); + return deferred; + } + + if (a) { + // ensure that every serialized input is still enabled + for (i=0; i < elements.length; i++) { + el = $(elements[i]); + if ( useProp ) + el.prop('disabled', false); + else + el.removeAttr('disabled'); + } + } + + s = $.extend(true, {}, $.ajaxSettings, options); + s.context = s.context || s; + id = 'jqFormIO' + (new Date().getTime()); + if (s.iframeTarget) { + $io = $(s.iframeTarget); + n = $io.attr('name'); + if (!n) + $io.attr('name', id); + else + id = n; + } + else { + $io = $('<iframe name="' + id + '" src="'+ s.iframeSrc +'" />'); + $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' }); + } + io = $io[0]; + + + xhr = { // mock object + aborted: 0, + responseText: null, + responseXML: null, + status: 0, + statusText: 'n/a', + getAllResponseHeaders: function() {}, + getResponseHeader: function() {}, + setRequestHeader: function() {}, + abort: function(status) { + var e = (status === 'timeout' ? 'timeout' : 'aborted'); + log('aborting upload... ' + e); + this.aborted = 1; + + try { // #214, #257 + if (io.contentWindow.document.execCommand) { + io.contentWindow.document.execCommand('Stop'); + } + } + catch(ignore) {} + + $io.attr('src', s.iframeSrc); // abort op in progress + xhr.error = e; + if (s.error) + s.error.call(s.context, xhr, e, status); + if (g) + $.event.trigger("ajaxError", [xhr, s, e]); + if (s.complete) + s.complete.call(s.context, xhr, e); + } + }; + + g = s.global; + // trigger ajax global events so that activity/block indicators work like normal + if (g && 0 === $.active++) { + $.event.trigger("ajaxStart"); + } + if (g) { + $.event.trigger("ajaxSend", [xhr, s]); + } + + if (s.beforeSend && s.beforeSend.call(s.context, xhr, s) === false) { + if (s.global) { + $.active--; + } + deferred.reject(); + return deferred; + } + if (xhr.aborted) { + deferred.reject(); + return deferred; + } + + // add submitting element to data if we know it + sub = form.clk; + if (sub) { + n = sub.name; + if (n && !sub.disabled) { + s.extraData = s.extraData || {}; + s.extraData[n] = sub.value; + if (sub.type == "image") { + s.extraData[n+'.x'] = form.clk_x; + s.extraData[n+'.y'] = form.clk_y; + } + } + } + + var CLIENT_TIMEOUT_ABORT = 1; + var SERVER_ABORT = 2; + + function getDoc(frame) { + var doc = frame.contentWindow ? frame.contentWindow.document : frame.contentDocument ? frame.contentDocument : frame.document; + return doc; + } + + // Rails CSRF hack (thanks to Yvan Barthelemy) + var csrf_token = $('meta[name=csrf-token]').attr('content'); + var csrf_param = $('meta[name=csrf-param]').attr('content'); + if (csrf_param && csrf_token) { + s.extraData = s.extraData || {}; + s.extraData[csrf_param] = csrf_token; + } + + // take a breath so that pending repaints get some cpu time before the upload starts + function doSubmit() { + // make sure form attrs are set + var t = $form.attr('target'), a = $form.attr('action'); + + // update form attrs in IE friendly way + form.setAttribute('target',id); + if (!method) { + form.setAttribute('method', 'POST'); + } + if (a != s.url) { + form.setAttribute('action', s.url); + } + + // ie borks in some cases when setting encoding + if (! s.skipEncodingOverride && (!method || /post/i.test(method))) { + $form.attr({ + encoding: 'multipart/form-data', + enctype: 'multipart/form-data' + }); + } + + // support timout + if (s.timeout) { + timeoutHandle = setTimeout(function() { timedOut = true; cb(CLIENT_TIMEOUT_ABORT); }, s.timeout); + } + + // look for server aborts + function checkState() { + try { + var state = getDoc(io).readyState; + log('state = ' + state); + if (state && state.toLowerCase() == 'uninitialized') + setTimeout(checkState,50); + } + catch(e) { + log('Server abort: ' , e, ' (', e.name, ')'); + cb(SERVER_ABORT); + if (timeoutHandle) + clearTimeout(timeoutHandle); + timeoutHandle = undefined; + } + } + + // add "extra" data to form if provided in options + var extraInputs = []; + try { + if (s.extraData) { + for (var n in s.extraData) { + if (s.extraData.hasOwnProperty(n)) { + // if using the $.param format that allows for multiple values with the same name + if($.isPlainObject(s.extraData[n]) && s.extraData[n].hasOwnProperty('name') && s.extraData[n].hasOwnProperty('value')) { + extraInputs.push( + $('<input type="hidden" name="'+s.extraData[n].name+'">').val(s.extraData[n].value) + .appendTo(form)[0]); + } else { + extraInputs.push( + $('<input type="hidden" name="'+n+'">').val(s.extraData[n]) + .appendTo(form)[0]); + } + } + } + } + + if (!s.iframeTarget) { + // add iframe to doc and submit the form + $io.appendTo('body'); + if (io.attachEvent) + io.attachEvent('onload', cb); + else + io.addEventListener('load', cb, false); + } + setTimeout(checkState,15); + form.submit(); + } + finally { + // reset attrs and remove "extra" input elements + form.setAttribute('action',a); + if(t) { + form.setAttribute('target', t); + } else { + $form.removeAttr('target'); + } + $(extraInputs).remove(); + } + } + + if (s.forceSync) { + doSubmit(); + } + else { + setTimeout(doSubmit, 10); // this lets dom updates render + } + + var data, doc, domCheckCount = 50, callbackProcessed; + + function cb(e) { + if (xhr.aborted || callbackProcessed) { + return; + } + try { + doc = getDoc(io); + } + catch(ex) { + log('cannot access response document: ', ex); + e = SERVER_ABORT; + } + if (e === CLIENT_TIMEOUT_ABORT && xhr) { + xhr.abort('timeout'); + deferred.reject(xhr, 'timeout'); + return; + } + else if (e == SERVER_ABORT && xhr) { + xhr.abort('server abort'); + deferred.reject(xhr, 'error', 'server abort'); + return; + } + + if (!doc || doc.location.href == s.iframeSrc) { + // response not received yet + if (!timedOut) + return; + } + if (io.detachEvent) + io.detachEvent('onload', cb); + else + io.removeEventListener('load', cb, false); + + var status = 'success', errMsg; + try { + if (timedOut) { + throw 'timeout'; + } + + var isXml = s.dataType == 'xml' || doc.XMLDocument || $.isXMLDoc(doc); + log('isXml='+isXml); + if (!isXml && window.opera && (doc.body === null || !doc.body.innerHTML)) { + if (--domCheckCount) { + // in some browsers (Opera) the iframe DOM is not always traversable when + // the onload callback fires, so we loop a bit to accommodate + log('requeing onLoad callback, DOM not available'); + setTimeout(cb, 250); + return; + } + // let this fall through because server response could be an empty document + //log('Could not access iframe DOM after mutiple tries.'); + //throw 'DOMException: not available'; + } + + //log('response detected'); + var docRoot = doc.body ? doc.body : doc.documentElement; + xhr.responseText = docRoot ? docRoot.innerHTML : null; + xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc; + if (isXml) + s.dataType = 'xml'; + xhr.getResponseHeader = function(header){ + var headers = {'content-type': s.dataType}; + return headers[header]; + }; + // support for XHR 'status' & 'statusText' emulation : + if (docRoot) { + xhr.status = Number( docRoot.getAttribute('status') ) || xhr.status; + xhr.statusText = docRoot.getAttribute('statusText') || xhr.statusText; + } + + var dt = (s.dataType || '').toLowerCase(); + var scr = /(json|script|text)/.test(dt); + if (scr || s.textarea) { + // see if user embedded response in textarea + var ta = doc.getElementsByTagName('textarea')[0]; + if (ta) { + xhr.responseText = ta.value; + // support for XHR 'status' & 'statusText' emulation : + xhr.status = Number( ta.getAttribute('status') ) || xhr.status; + xhr.statusText = ta.getAttribute('statusText') || xhr.statusText; + } + else if (scr) { + // account for browsers injecting pre around json response + var pre = doc.getElementsByTagName('pre')[0]; + var b = doc.getElementsByTagName('body')[0]; + if (pre) { + xhr.responseText = pre.textContent ? pre.textContent : pre.innerText; + } + else if (b) { + xhr.responseText = b.textContent ? b.textContent : b.innerText; + } + } + } + else if (dt == 'xml' && !xhr.responseXML && xhr.responseText) { + xhr.responseXML = toXml(xhr.responseText); + } + + try { + data = httpData(xhr, dt, s); + } + catch (e) { + status = 'parsererror'; + xhr.error = errMsg = (e || status); + } + } + catch (e) { + log('error caught: ',e); + status = 'error'; + xhr.error = errMsg = (e || status); + } + + if (xhr.aborted) { + log('upload aborted'); + status = null; + } + + if (xhr.status) { // we've set xhr.status + status = (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) ? 'success' : 'error'; + } + + // ordering of these callbacks/triggers is odd, but that's how $.ajax does it + if (status === 'success') { + if (s.success) + s.success.call(s.context, data, 'success', xhr); + deferred.resolve(xhr.responseText, 'success', xhr); + if (g) + $.event.trigger("ajaxSuccess", [xhr, s]); + } + else if (status) { + if (errMsg === undefined) + errMsg = xhr.statusText; + if (s.error) + s.error.call(s.context, xhr, status, errMsg); + deferred.reject(xhr, 'error', errMsg); + if (g) + $.event.trigger("ajaxError", [xhr, s, errMsg]); + } + + if (g) + $.event.trigger("ajaxComplete", [xhr, s]); + + if (g && ! --$.active) { + $.event.trigger("ajaxStop"); + } + + if (s.complete) + s.complete.call(s.context, xhr, status); + + callbackProcessed = true; + if (s.timeout) + clearTimeout(timeoutHandle); + + // clean up + setTimeout(function() { + if (!s.iframeTarget) + $io.remove(); + xhr.responseXML = null; + }, 100); + } + + var toXml = $.parseXML || function(s, doc) { // use parseXML if available (jQuery 1.5+) + if (window.ActiveXObject) { + doc = new ActiveXObject('Microsoft.XMLDOM'); + doc.async = 'false'; + doc.loadXML(s); + } + else { + doc = (new DOMParser()).parseFromString(s, 'text/xml'); + } + return (doc && doc.documentElement && doc.documentElement.nodeName != 'parsererror') ? doc : null; + }; + var parseJSON = $.parseJSON || function(s) { + /*jslint evil:true */ + return window['eval']('(' + s + ')'); + }; + + var httpData = function( xhr, type, s ) { // mostly lifted from jq1.4.4 + + var ct = xhr.getResponseHeader('content-type') || '', + xml = type === 'xml' || !type && ct.indexOf('xml') >= 0, + data = xml ? xhr.responseXML : xhr.responseText; + + if (xml && data.documentElement.nodeName === 'parsererror') { + if ($.error) + $.error('parsererror'); + } + if (s && s.dataFilter) { + data = s.dataFilter(data, type); + } + if (typeof data === 'string') { + if (type === 'json' || !type && ct.indexOf('json') >= 0) { + data = parseJSON(data); + } else if (type === "script" || !type && ct.indexOf("javascript") >= 0) { + $.globalEval(data); + } + } + return data; + }; + + return deferred; + } +}; + +/** + * ajaxForm() provides a mechanism for fully automating form submission. + * + * The advantages of using this method instead of ajaxSubmit() are: + * + * 1: This method will include coordinates for <input type="image" /> elements (if the element + * is used to submit the form). + * 2. This method will include the submit element's name/value data (for the element that was + * used to submit the form). + * 3. This method binds the submit() method to the form for you. + * + * The options argument for ajaxForm works exactly as it does for ajaxSubmit. ajaxForm merely + * passes the options argument along after properly binding events for submit elements and + * the form itself. + */ +$.fn.ajaxForm = function(options) { + options = options || {}; + options.delegation = options.delegation && $.isFunction($.fn.on); + + // in jQuery 1.3+ we can fix mistakes with the ready state + if (!options.delegation && this.length === 0) { + var o = { s: this.selector, c: this.context }; + if (!$.isReady && o.s) { + log('DOM not ready, queuing ajaxForm'); + $(function() { + $(o.s,o.c).ajaxForm(options); + }); + return this; + } + // is your DOM ready? http://docs.jquery.com/Tutorials:Introducing_$(document).ready() + log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)')); + return this; + } + + if ( options.delegation ) { + $(document) + .off('submit.form-plugin', this.selector, doAjaxSubmit) + .off('click.form-plugin', this.selector, captureSubmittingElement) + .on('submit.form-plugin', this.selector, options, doAjaxSubmit) + .on('click.form-plugin', this.selector, options, captureSubmittingElement); + return this; + } + + return this.ajaxFormUnbind() + .bind('submit.form-plugin', options, doAjaxSubmit) + .bind('click.form-plugin', options, captureSubmittingElement); +}; + +// private event handlers +function doAjaxSubmit(e) { + /*jshint validthis:true */ + var options = e.data; + if (!e.isDefaultPrevented()) { // if event has been canceled, don't proceed + e.preventDefault(); + $(this).ajaxSubmit(options); + } +} + +function captureSubmittingElement(e) { + /*jshint validthis:true */ + var target = e.target; + var $el = $(target); + if (!($el.is("[type=submit],[type=image]"))) { + // is this a child element of the submit el? (ex: a span within a button) + var t = $el.closest('[type=submit]'); + if (t.length === 0) { + return; + } + target = t[0]; + } + var form = this; + form.clk = target; + if (target.type == 'image') { + if (e.offsetX !== undefined) { + form.clk_x = e.offsetX; + form.clk_y = e.offsetY; + } else if (typeof $.fn.offset == 'function') { + var offset = $el.offset(); + form.clk_x = e.pageX - offset.left; + form.clk_y = e.pageY - offset.top; + } else { + form.clk_x = e.pageX - target.offsetLeft; + form.clk_y = e.pageY - target.offsetTop; + } + } + // clear form vars + setTimeout(function() { form.clk = form.clk_x = form.clk_y = null; }, 100); +} + + +// ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm +$.fn.ajaxFormUnbind = function() { + return this.unbind('submit.form-plugin click.form-plugin'); +}; + +/** + * formToArray() gathers form element data into an array of objects that can + * be passed to any of the following ajax functions: $.get, $.post, or load. + * Each object in the array has both a 'name' and 'value' property. An example of + * an array for a simple login form might be: + * + * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ] + * + * It is this array that is passed to pre-submit callback functions provided to the + * ajaxSubmit() and ajaxForm() methods. + */ +$.fn.formToArray = function(semantic, elements) { + var a = []; + if (this.length === 0) { + return a; + } + + var form = this[0]; + var els = semantic ? form.getElementsByTagName('*') : form.elements; + if (!els) { + return a; + } + + var i,j,n,v,el,max,jmax; + for(i=0, max=els.length; i < max; i++) { + el = els[i]; + n = el.name; + if (!n) { + continue; + } + + if (semantic && form.clk && el.type == "image") { + // handle image inputs on the fly when semantic == true + if(!el.disabled && form.clk == el) { + a.push({name: n, value: $(el).val(), type: el.type }); + a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y}); + } + continue; + } + + v = $.fieldValue(el, true); + if (v && v.constructor == Array) { + if (elements) + elements.push(el); + for(j=0, jmax=v.length; j < jmax; j++) { + a.push({name: n, value: v[j]}); + } + } + else if (feature.fileapi && el.type == 'file' && !el.disabled) { + if (elements) + elements.push(el); + var files = el.files; + if (files.length) { + for (j=0; j < files.length; j++) { + a.push({name: n, value: files[j], type: el.type}); + } + } + else { + // #180 + a.push({ name: n, value: '', type: el.type }); + } + } + else if (v !== null && typeof v != 'undefined') { + if (elements) + elements.push(el); + a.push({name: n, value: v, type: el.type, required: el.required}); + } + } + + if (!semantic && form.clk) { + // input type=='image' are not found in elements array! handle it here + var $input = $(form.clk), input = $input[0]; + n = input.name; + if (n && !input.disabled && input.type == 'image') { + a.push({name: n, value: $input.val()}); + a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y}); + } + } + return a; +}; + +/** + * Serializes form data into a 'submittable' string. This method will return a string + * in the format: name1=value1&name2=value2 + */ +$.fn.formSerialize = function(semantic) { + //hand off to jQuery.param for proper encoding + return $.param(this.formToArray(semantic)); +}; + +/** + * Serializes all field elements in the jQuery object into a query string. + * This method will return a string in the format: name1=value1&name2=value2 + */ +$.fn.fieldSerialize = function(successful) { + var a = []; + this.each(function() { + var n = this.name; + if (!n) { + return; + } + var v = $.fieldValue(this, successful); + if (v && v.constructor == Array) { + for (var i=0,max=v.length; i < max; i++) { + a.push({name: n, value: v[i]}); + } + } + else if (v !== null && typeof v != 'undefined') { + a.push({name: this.name, value: v}); + } + }); + //hand off to jQuery.param for proper encoding + return $.param(a); +}; + +/** + * Returns the value(s) of the element in the matched set. For example, consider the following form: + * + * <form><fieldset> + * <input name="A" type="text" /> + * <input name="A" type="text" /> + * <input name="B" type="checkbox" value="B1" /> + * <input name="B" type="checkbox" value="B2"/> + * <input name="C" type="radio" value="C1" /> + * <input name="C" type="radio" value="C2" /> + * </fieldset></form> + * + * var v = $('input[type=text]').fieldValue(); + * // if no values are entered into the text inputs + * v == ['',''] + * // if values entered into the text inputs are 'foo' and 'bar' + * v == ['foo','bar'] + * + * var v = $('input[type=checkbox]').fieldValue(); + * // if neither checkbox is checked + * v === undefined + * // if both checkboxes are checked + * v == ['B1', 'B2'] + * + * var v = $('input[type=radio]').fieldValue(); + * // if neither radio is checked + * v === undefined + * // if first radio is checked + * v == ['C1'] + * + * The successful argument controls whether or not the field element must be 'successful' + * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls). + * The default value of the successful argument is true. If this value is false the value(s) + * for each element is returned. + * + * Note: This method *always* returns an array. If no valid value can be determined the + * array will be empty, otherwise it will contain one or more values. + */ +$.fn.fieldValue = function(successful) { + for (var val=[], i=0, max=this.length; i < max; i++) { + var el = this[i]; + var v = $.fieldValue(el, successful); + if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length)) { + continue; + } + if (v.constructor == Array) + $.merge(val, v); + else + val.push(v); + } + return val; +}; + +/** + * Returns the value of the field element. + */ +$.fieldValue = function(el, successful) { + var n = el.name, t = el.type, tag = el.tagName.toLowerCase(); + if (successful === undefined) { + successful = true; + } + + if (successful && (!n || el.disabled || t == 'reset' || t == 'button' || + (t == 'checkbox' || t == 'radio') && !el.checked || + (t == 'submit' || t == 'image') && el.form && el.form.clk != el || + tag == 'select' && el.selectedIndex == -1)) { + return null; + } + + if (tag == 'select') { + var index = el.selectedIndex; + if (index < 0) { + return null; + } + var a = [], ops = el.options; + var one = (t == 'select-one'); + var max = (one ? index+1 : ops.length); + for(var i=(one ? index : 0); i < max; i++) { + var op = ops[i]; + if (op.selected) { + var v = op.value; + if (!v) { // extra pain for IE... + v = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value; + } + if (one) { + return v; + } + a.push(v); + } + } + return a; + } + return $(el).val(); +}; + +/** + * Clears the form data. Takes the following actions on the form's input fields: + * - input text fields will have their 'value' property set to the empty string + * - select elements will have their 'selectedIndex' property set to -1 + * - checkbox and radio inputs will have their 'checked' property set to false + * - inputs of type submit, button, reset, and hidden will *not* be effected + * - button elements will *not* be effected + */ +$.fn.clearForm = function(includeHidden) { + return this.each(function() { + $('input,select,textarea', this).clearFields(includeHidden); + }); +}; + +/** + * Clears the selected form elements. + */ +$.fn.clearFields = $.fn.clearInputs = function(includeHidden) { + var re = /^(?:color|date|datetime|email|month|number|password|range|search|tel|text|time|url|week)$/i; // 'hidden' is not in this list + return this.each(function() { + var t = this.type, tag = this.tagName.toLowerCase(); + if (re.test(t) || tag == 'textarea') { + this.value = ''; + } + else if (t == 'checkbox' || t == 'radio') { + this.checked = false; + } + else if (tag == 'select') { + this.selectedIndex = -1; + } + else if (t == "file") { + if ($.browser.msie) { + $(this).replaceWith($(this).clone()); + } else { + $(this).val(''); + } + } + else if (includeHidden) { + // includeHidden can be the value true, or it can be a selector string + // indicating a special test; for example: + // $('#myForm').clearForm('.special:hidden') + // the above would clean hidden inputs that have the class of 'special' + if ( (includeHidden === true && /hidden/.test(t)) || + (typeof includeHidden == 'string' && $(this).is(includeHidden)) ) + this.value = ''; + } + }); +}; + +/** + * Resets the form data. Causes all form elements to be reset to their original value. + */ +$.fn.resetForm = function() { + return this.each(function() { + // guard against an input with the name of 'reset' + // note that IE reports the reset function as an 'object' + if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType)) { + this.reset(); + } + }); +}; + +/** + * Enables or disables any matching elements. + */ +$.fn.enable = function(b) { + if (b === undefined) { + b = true; + } + return this.each(function() { + this.disabled = !b; + }); +}; + +/** + * Checks/unchecks any matching checkboxes or radio buttons and + * selects/deselects and matching option elements. + */ +$.fn.selected = function(select) { + if (select === undefined) { + select = true; + } + return this.each(function() { + var t = this.type; + if (t == 'checkbox' || t == 'radio') { + this.checked = select; + } + else if (this.tagName.toLowerCase() == 'option') { + var $sel = $(this).parent('select'); + if (select && $sel[0] && $sel[0].type == 'select-one') { + // deselect all other options + $sel.find('option').selected(false); + } + this.selected = select; + } + }); +}; + +// expose debug var +$.fn.ajaxSubmit.debug = false; + +// helper fn for console logging +function log() { + if (!$.fn.ajaxSubmit.debug) + return; + var msg = '[jquery.form] ' + Array.prototype.join.call(arguments,''); + if (window.console && window.console.log) { + window.console.log(msg); + } + else if (window.opera && window.opera.postError) { + window.opera.postError(msg); + } +} + +})(jQuery); + +/* autogeneration */ +define("jquery-forms", [ + "jquery" +], function(){}); + +/* @source lib/jquery.atwho.js */; + + +/* + Implement Github like autocomplete mentions + http://ichord.github.com/At.js + + Copyright (c) 2013 chord.luo@gmail.com + Licensed under the MIT license. +*/ + + +(function() { + + (function(factory) { + if (typeof define === 'function' && define.amd) { + return define("jquery-atwho", [ + "jquery" + ], factory); + } else { + return factory(window.jQuery); + } + })(function($) { + var Controller, DEFAULT_CALLBACKS, DEFAULT_TPL, KEY_CODE, Mirror, View; + Mirror = (function() { + + Mirror.prototype.css_attr = ["overflowY", "height", "width", "paddingTop", "paddingLeft", "paddingRight", "paddingBottom", "marginTop", "marginLeft", "marginRight", "marginBottom", 'fontFamily', 'borderStyle', 'borderWidth', 'wordWrap', 'fontSize', 'lineHeight', 'overflowX']; + + function Mirror($inputor) { + this.$inputor = $inputor; + } + + Mirror.prototype.copy_inputor_css = function() { + var css, + _this = this; + css = { + position: 'absolute', + left: -9999, + top: 0, + zIndex: -20000, + 'white-space': 'pre-wrap' + }; + $.each(this.css_attr, function(i, p) { + return css[p] = _this.$inputor.css(p); + }); + return css; + }; + + Mirror.prototype.create = function(html) { + this.$mirror = $('<div></div>'); + this.$mirror.css(this.copy_inputor_css()); + this.$mirror.html(html); + this.$inputor.after(this.$mirror); + return this; + }; + + Mirror.prototype.get_flag_rect = function() { + var $flag, pos, rect; + $flag = this.$mirror.find("span#flag"); + pos = $flag.position(); + rect = { + left: pos.left, + top: pos.top, + bottom: $flag.height() + pos.top + }; + this.$mirror.remove(); + return rect; + }; + + return Mirror; + + })(); + KEY_CODE = { + DOWN: 40, + UP: 38, + ESC: 27, + TAB: 9, + ENTER: 13 + }; + DEFAULT_CALLBACKS = { + data_refactor: function(data) { + return $.map(data, function(item, k) { + if (!$.isPlainObject(item)) { + item = { + name: item + }; + } + return item; + }); + }, + matcher: function(flag, subtext) { + var match, matched, regexp; + regexp = new RegExp(flag + '([A-Za-z0-9_\+\-]*)$|' + flag + '([^\\x00-\\xff]*)$', 'gi'); + match = regexp.exec(subtext); + matched = null; + if (match) { + matched = match[2] ? match[2] : match[1]; + } + return matched; + }, + filter: function(query, data, search_key) { + var _this = this; + return $.map(data, function(item, i) { + var name; + name = $.isPlainObject(item) ? item[search_key] : item; + if (name.toLowerCase().indexOf(query) >= 0) { + return item; + } + }); + }, + remote_filter: function(params, url, render_view) { + return $.ajax(url, { + data: params, + success: function(data) { + return render_view(data); + } + }); + }, + sorter: function(query, items, search_key) { + var item, results, text, _i, _len; + if (!query) { + items; + + } + results = []; + for (_i = 0, _len = items.length; _i < _len; _i++) { + item = items[_i]; + text = item[search_key]; + item.order = text.toLowerCase().indexOf(query); + results.push(item); + } + return results.sort(function(a, b) { + return a.order - b.order; + }); + }, + tpl_eval: function(tpl, map) { + var el; + try { + return el = tpl.replace(/\$\{([^\}]*)\}/g, function(tag, key, pos) { + return map[key]; + }); + } catch (error) { + return ""; + } + }, + highlighter: function(li, query) { + if (!query) { + return li; + } + return li.replace(new RegExp(">\\s*(\\w*)(" + query.replace("+", "\\+") + ")(\\w*)\\s*<", 'ig'), function(str, $1, $2, $3) { + return '> ' + $1 + '<strong>' + $2 + '</strong>' + $3 + ' <'; + }); + }, + selector: function($li) { + if ($li.length > 0) { + return this.replace_str($li.data("value") || ""); + } + } + }; + Controller = (function() { + + function Controller(inputor) { + this.settings = {}; + this.common_settings = {}; + this.pos = 0; + this.flags = null; + this.current_flag = null; + this.query = null; + this.$inputor = $(inputor); + this.mirror = new Mirror(this.$inputor); + this.common_settings = $.extend({}, $.fn.atwho["default"]); + this.view = new View(this, this.$el); + this.listen(); + } + + Controller.prototype.listen = function() { + var _this = this; + return this.$inputor.on('keyup.atwho', function(e) { + return _this.on_keyup(e); + }).on('keydown.atwho', function(e) { + return _this.on_keydown(e); + }).on('scroll.atwho', function(e) { + return _this.view.hide(); + }).on('blur.atwho', function(e) { + return _this.view.hide(_this.get_opt("display_timeout")); + }); + }; + + Controller.prototype.reg = function(flag, settings) { + var current_settings, data; + current_settings = {}; + current_settings = $.isPlainObject(flag) ? this.common_settings = $.extend({}, this.common_settings, flag) : !this.settings[flag] ? this.settings[flag] = $.extend({}, settings) : this.settings[flag] = $.extend({}, this.settings[flag], settings); + data = current_settings["data"]; + if (typeof data === "string") { + current_settings["data"] = data; + } else if (data) { + current_settings["data"] = this.callbacks("data_refactor").call(this, data); + } + return this; + }; + + Controller.prototype.trigger = function(name, data) { + data || (data = []); + data.push(this); + return this.$inputor.trigger("" + name + ".atwho", data); + }; + + Controller.prototype.data = function() { + return this.get_opt("data"); + }; + + Controller.prototype.callbacks = function(func_name) { + var func; + if (!(func = this.get_opt("callbacks", {})[func_name])) { + func = this.common_settings["callbacks"][func_name]; + } + return func; + }; + + Controller.prototype.get_opt = function(key, default_value) { + var value; + try { + if (this.current_flag) { + value = this.settings[this.current_flag][key]; + } + if (value === void 0) { + value = this.common_settings[key]; + } + return value = value === void 0 ? default_value : value; + } catch (e) { + return value = default_value === void 0 ? null : default_value; + } + }; + + Controller.prototype.rect = function() { + var $inputor, Sel, at_rect, bottom, format, html, offset, start_range, x, y; + $inputor = this.$inputor; + if (document.selection) { + Sel = document.selection.createRange(); + x = Sel.boundingLeft + $inputor.scrollLeft(); + y = Sel.boundingTop + $(window).scrollTop() + $inputor.scrollTop(); + bottom = y + Sel.boundingHeight; + return { + top: y - 2, + left: x - 2, + bottom: bottom - 2 + }; + } + format = function(value) { + return value.replace(/</g, '<').replace(/>/g, '>').replace(/`/g, '`').replace(/"/g, '"').replace(/\r\n|\r|\n/g, "<br />"); + }; + /* 克隆完inputor后将原来的文本内容根据 + @的位置进行分块,以获取@块在inputor(输入框)里的position + */ + + start_range = $inputor.val().slice(0, this.pos - 1); + html = "<span>" + format(start_range) + "</span>"; + html += "<span id='flag'>?</span>"; + /* + 将inputor的 offset(相对于document) + 和@在inputor里的position相加 + 就得到了@相对于document的offset. + 当然,还要加上行高和滚动条的偏移量. + */ + + offset = $inputor.offset(); + at_rect = this.mirror.create(html).get_flag_rect(); + x = offset.left + at_rect.left - $inputor.scrollLeft(); + y = offset.top - $inputor.scrollTop(); + bottom = y + at_rect.bottom; + y += at_rect.top; + return { + top: y, + left: x, + bottom: bottom + 2 + }; + }; + + Controller.prototype.catch_query = function() { + var caret_pos, content, end, query, start, subtext, + _this = this; + content = this.$inputor.val(); + caret_pos = this.$inputor.caretPos(); + /* 向在插入符前的的文本进行正则匹配 + * 考虑会有多个 @ 的存在, 匹配离插入符最近的一个 + */ + + subtext = content.slice(0, caret_pos); + query = null; + $.each(this.settings, function(flag, settings) { + query = _this.callbacks("matcher").call(_this, flag, subtext); + if (query != null) { + _this.current_flag = flag; + return false; + } + }); + if (typeof query === "string" && query.length <= 20) { + start = caret_pos - query.length; + end = start + query.length; + this.pos = start; + query = { + 'text': query.toLowerCase(), + 'head_pos': start, + 'end_pos': end + }; + this.trigger("matched", [this.current_flag, query.text]); + } else { + this.view.hide(); + } + return this.query = query; + }; + + Controller.prototype.replace_str = function(str) { + var $inputor, flag_len, source, start_str, text; + $inputor = this.$inputor; + source = $inputor.val(); + flag_len = this.get_opt("display_flag") ? 0 : this.current_flag.length; + start_str = source.slice(0, (this.query['head_pos'] || 0) - flag_len); + text = "" + start_str + str + " " + (source.slice(this.query['end_pos'] || 0)); + $inputor.val(text); + $inputor.caretPos(start_str.length + str.length + 1); + return $inputor.change(); + }; + + Controller.prototype.on_keyup = function(e) { + switch (e.keyCode) { + case KEY_CODE.ESC: + e.preventDefault(); + this.view.hide(); + break; + case KEY_CODE.DOWN: + case KEY_CODE.UP: + $.noop(); + break; + default: + this.look_up(); + } + return e.stopPropagation(); + }; + + Controller.prototype.on_keydown = function(e) { + if (!this.view.visible()) { + return; + } + switch (e.keyCode) { + case KEY_CODE.ESC: + e.preventDefault(); + this.view.hide(); + break; + case KEY_CODE.UP: + e.preventDefault(); + this.view.prev(); + break; + case KEY_CODE.DOWN: + e.preventDefault(); + this.view.next(); + break; + case KEY_CODE.TAB: + case KEY_CODE.ENTER: + if (!this.view.visible()) { + return; + } + e.preventDefault(); + this.view.choose(); + break; + default: + $.noop(); + } + return e.stopPropagation(); + }; + + Controller.prototype.render_view = function(data) { + var search_key; + search_key = this.get_opt("search_key"); + data = this.callbacks("sorter").call(this, this.query.text, data, search_key); + data = data.splice(0, this.get_opt('limit')); + return this.view.render(data); + }; + + Controller.prototype.look_up = function() { + var data, origin_data, params, query, search_key; + query = this.catch_query(); + if (!query) { + return false; + } + origin_data = this.get_opt("data"); + search_key = this.get_opt("search_key"); + if (typeof origin_data === "string") { + params = { + q: query.text, + limit: this.get_opt("limit") + }; + this.callbacks('remote_filter').call(this, params, origin_data, $.proxy(this.render_view, this)); + } else if ((data = this.callbacks('filter').call(this, query.text, origin_data, search_key))) { + this.render_view(data); + } else { + this.view.hide(); + } + return $.noop(); + }; + + return Controller; + + })(); + View = (function() { + + function View(controller) { + this.controller = controller; + this.id = this.controller.get_opt("view_id", "at-view"); + this.timeout_id = null; + this.$el = $("#" + this.id); + this.create_view(); + } + + View.prototype.create_view = function() { + var $menu, tpl, + _this = this; + if (this.exist()) { + return; + } + tpl = "<div id='" + this.id + "' class='at-view'><ul id='" + this.id + "-ul'></ul></div>"; + $("body").append(tpl); + this.$el = $("#" + this.id); + $menu = this.$el.find('ul'); + return $menu.on('mouseenter.view', 'li', function(e) { + $menu.find('.cur').removeClass('cur'); + return $(e.currentTarget).addClass('cur'); + }).on('click', function(e) { + e.stopPropagation(); + e.preventDefault(); + return _this.$el.data("_view").choose(); + }); + }; + + View.prototype.exist = function() { + return $("#" + this.id).length > 0; + }; + + View.prototype.visible = function() { + return this.$el.is(":visible"); + }; + + View.prototype.choose = function() { + var $li; + $li = this.$el.find(".cur"); + this.controller.callbacks("selector").call(this.controller, $li); + this.controller.trigger("choose", [$li]); + return this.hide(); + }; + + View.prototype.reposition = function() { + var offset, rect; + rect = this.controller.rect(); + if (rect.bottom + this.$el.height() - $(window).scrollTop() > $(window).height()) { + rect.bottom = rect.top - this.$el.height(); + } + offset = { + left: rect.left, + top: rect.bottom + }; + this.$el.offset(offset); + return this.controller.trigger("reposition", [offset]); + }; + + View.prototype.next = function() { + var cur, next; + cur = this.$el.find('.cur').removeClass('cur'); + next = cur.next(); + if (!next.length) { + next = $(this.$el.find('li')[0]); + } + return next.addClass('cur'); + }; + + View.prototype.prev = function() { + var cur, prev; + cur = this.$el.find('.cur').removeClass('cur'); + prev = cur.prev(); + if (!prev.length) { + prev = this.$el.find('li').last(); + } + return prev.addClass('cur'); + }; + + View.prototype.show = function() { + if (!this.visible()) { + this.$el.show(); + } + return this.reposition(); + }; + + View.prototype.hide = function(time) { + var callback, + _this = this; + if (isNaN(time)) { + if (this.visible()) { + return this.$el.hide(); + } + } else { + callback = function() { + return _this.hide(); + }; + clearTimeout(this.timeout_id); + return this.timeout_id = setTimeout(callback, time); + } + }; + + View.prototype.clear = function() { + return this.$el.find('ul').empty(); + }; + + View.prototype.render = function(list) { + var $ul, tpl, + _this = this; + if (!$.isArray(list)) { + return false; + } + if (list.length <= 0) { + this.hide(); + return true; + } + this.clear(); + this.$el.data("_view", this); + $ul = this.$el.find('ul'); + tpl = this.controller.get_opt('tpl', DEFAULT_TPL); + $.each(list, function(i, item) { + var $li, li; + li = _this.controller.callbacks("tpl_eval").call(_this.controller, tpl, item); + $li = $(_this.controller.callbacks("highlighter").call(_this.controller, li, _this.controller.query.text)); + $li.data("info", item); + return $ul.append($li); + }); + this.show(); + return $ul.find("li:eq(0)").addClass("cur"); + }; + + return View; + + })(); + DEFAULT_TPL = "<li data-value='${name}'>${name}</li>"; + $.fn.atwho = function(flag, options) { + return this.filter('textarea, input').each(function() { + var $this, data; + $this = $(this); + data = $this.data("atwho"); + if (!data) { + $this.data('atwho', (data = new Controller(this))); + } + return data.reg(flag, options); + }); + }; + $.fn.atwho.Controller = Controller; + $.fn.atwho.View = View; + $.fn.atwho.Mirror = Mirror; + return $.fn.atwho["default"] = { + data: null, + search_key: "name", + callbacks: DEFAULT_CALLBACKS, + limit: 5, + display_flag: true, + display_timeout: 300, + tpl: DEFAULT_TPL + }; + }); + +}).call(this); + +/* @source lib/jquery.caret.js */; + + +/* + Implement Twitter/Weibo @ mentions + + Copyright (c) 2012 chord.luo@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +/* +本插件操作 textarea 或者 input 内的插入符 +只实现了获得插入符在文本框中的位置,以及设置 +插入符的位置. +*/ + +(function() { + + (function($) { + var getCaretPos, setCaretPos; + getCaretPos = function(inputor) { + var end, endRange, len, normalizedValue, pos, range, start, textInputRange; + if (document.selection) { + /* + #assume we select "HATE" in the inputor such as textarea -> { }. + * start end-point. + * / + * < I really [HATE] IE > between the brackets is the selection range. + * \ + * end end-point. + */ + range = document.selection.createRange(); + pos = 0; + if (range && range.parentElement() === inputor) { + normalizedValue = inputor.value.replace(/\r\n/g, "\n"); + /* SOMETIME !!! + "/r/n" is counted as two char. + one line is two, two will be four. balalala. + so we have to using the normalized one's length.; + */ + len = normalizedValue.length; + /* + <[ I really HATE IE ]>: + the whole content in the inputor will be the textInputRange. + */ + textInputRange = inputor.createTextRange(); + /* _here must be the position of bookmark. + / + <[ I really [HATE] IE ]> + [---------->[ ] : this is what moveToBookmark do. + < I really [[HATE] IE ]> : here is result. + \ two brackets in should be in line. + */ + textInputRange.moveToBookmark(range.getBookmark()); + endRange = inputor.createTextRange(); + /* [--------------------->[] : if set false all end-point goto end. + < I really [[HATE] IE []]> + */ + endRange.collapse(false); + /* + ___VS____ + / \ + < I really [[HATE] IE []]> + \_endRange end-point. + + " > -1" mean the start end-point will be the same or right to the end end-point + * simplelly, all in the end. + */ + if (textInputRange.compareEndPoints("StartToEnd", endRange) > -1) { + start = end = len; + } else { + /* + I really |HATE] IE ]> + <-| + I really[ [HATE] IE ]> + <-[ + I reall[y [HATE] IE ]> + + will return how many unit have moved. + */ + start = -textInputRange.moveStart("character", -len); + end = -textInputRange.moveEnd("character", -len); + } + } + } else { + start = inputor.selectionStart; + } + return start; + }; + setCaretPos = function(inputor, pos) { + var range; + if (document.selection) { + range = inputor.createTextRange(); + range.move("character", pos); + return range.select(); + } else { + return inputor.setSelectionRange(pos, pos); + } + }; + return $.fn.caretPos = function(pos) { + var inputor; + inputor = this[0]; + inputor.focus(); + if (pos) { + return setCaretPos(inputor, pos); + } else { + return getCaretPos(inputor); + } + }; + })(window.jQuery); + +}).call(this); + +/* autogeneration */ +define("jquery-caret", [ + "jquery" +], function(){}); + +/* @source lib/jquery.lazyload.js */; + +/* + * Lazy Load - jQuery plugin for lazy loading images + * + * Copyright (c) 2007-2012 Mika Tuupola + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/mit-license.php + * + * Project home: + * http://www.appelsiini.net/projects/lazyload + * + * Version: 1.8.3 + * + */ +(function($, window, document, undefined) { + var $window = $(window); + + $.fn.lazyload = function(options) { + var elements = this; + var $container; + var settings = { + threshold : 0, + failure_limit : 0, + event : "scroll", + effect : "show", + container : window, + data_attribute : "original", + skip_invisible : true, + appear : null, + load : null + }; + + function update() { + var counter = 0; + + elements.each(function() { + var $this = $(this); + if (settings.skip_invisible && !$this.is(":visible")) { + return; + } + if ($.abovethetop(this, settings) || + $.leftofbegin(this, settings)) { + /* Nothing. */ + } else if (!$.belowthefold(this, settings) && + !$.rightoffold(this, settings)) { + $this.trigger("appear"); + /* if we found an image we'll load, reset the counter */ + counter = 0; + } else { + if (++counter > settings.failure_limit) { + return false; + } + } + }); + + } + + if(options) { + /* Maintain BC for a couple of versions. */ + if (undefined !== options.failurelimit) { + options.failure_limit = options.failurelimit; + delete options.failurelimit; + } + if (undefined !== options.effectspeed) { + options.effect_speed = options.effectspeed; + delete options.effectspeed; + } + + $.extend(settings, options); + } + + /* Cache container as jQuery as object. */ + $container = (settings.container === undefined || + settings.container === window) ? $window : $(settings.container); + + /* Fire one scroll event per scroll. Not one scroll event per image. */ + if (0 === settings.event.indexOf("scroll")) { + $container.bind(settings.event, function(event) { + return update(); + }); + } + + this.each(function() { + var self = this; + var $self = $(self); + + self.loaded = false; + + /* When appear is triggered load original image. */ + $self.one("appear", function() { + if (!this.loaded) { + if (settings.appear) { + var elements_left = elements.length; + settings.appear.call(self, elements_left, settings); + } + $("<img />") + .bind("load", function() { + $self + .hide() + .attr("src", $self.data(settings.data_attribute)) + [settings.effect](settings.effect_speed); + self.loaded = true; + + /* Remove image from array so it is not looped next time. */ + var temp = $.grep(elements, function(element) { + return !element.loaded; + }); + elements = $(temp); + + if (settings.load) { + var elements_left = elements.length; + settings.load.call(self, elements_left, settings); + } + }) + .attr("src", $self.data(settings.data_attribute)); + } + }); + + /* When wanted event is triggered load original image */ + /* by triggering appear. */ + if (0 !== settings.event.indexOf("scroll")) { + $self.bind(settings.event, function(event) { + if (!self.loaded) { + $self.trigger("appear"); + } + }); + } + }); + + /* Check if something appears when window is resized. */ + $window.bind("resize", function(event) { + update(); + }); + + /* With IOS5 force loading images when navigating with back button. */ + /* Non optimal workaround. */ + if ((/iphone|ipod|ipad.*os 5/gi).test(navigator.appVersion)) { + $window.bind("pageshow", function(event) { + if (event.originalEvent.persisted) { + elements.each(function() { + $(this).trigger("appear"); + }); + } + }); + } + + /* Force initial check if images should appear. */ + $(window).load(function() { + update(); + }); + + return this; + }; + + /* Convenience methods in jQuery namespace. */ + /* Use as $.belowthefold(element, {threshold : 100, container : window}) */ + + $.belowthefold = function(element, settings) { + var fold; + + if (settings.container === undefined || settings.container === window) { + fold = $window.height() + $window.scrollTop(); + } else { + fold = $(settings.container).offset().top + $(settings.container).height(); + } + + return fold <= $(element).offset().top - settings.threshold; + }; + + $.rightoffold = function(element, settings) { + var fold; + + if (settings.container === undefined || settings.container === window) { + fold = $window.width() + $window.scrollLeft(); + } else { + fold = $(settings.container).offset().left + $(settings.container).width(); + } + + return fold <= $(element).offset().left - settings.threshold; + }; + + $.abovethetop = function(element, settings) { + var fold; + + if (settings.container === undefined || settings.container === window) { + fold = $window.scrollTop(); + } else { + fold = $(settings.container).offset().top; + } + + return fold >= $(element).offset().top + settings.threshold + $(element).height(); + }; + + $.leftofbegin = function(element, settings) { + var fold; + + if (settings.container === undefined || settings.container === window) { + fold = $window.scrollLeft(); + } else { + fold = $(settings.container).offset().left; + } + + return fold >= $(element).offset().left + settings.threshold + $(element).width(); + }; + + $.inviewport = function(element, settings) { + return !$.rightoffold(element, settings) && !$.leftofbegin(element, settings) && + !$.belowthefold(element, settings) && !$.abovethetop(element, settings); + }; + + /* Custom selectors for your convenience. */ + /* Use as $("img:below-the-fold").something() or */ + /* $("img").filter(":below-the-fold").something() which is faster */ + + $.extend($.expr[':'], { + "below-the-fold" : function(a) { return $.belowthefold(a, {threshold : 0}); }, + "above-the-top" : function(a) { return !$.belowthefold(a, {threshold : 0}); }, + "right-of-screen": function(a) { return $.rightoffold(a, {threshold : 0}); }, + "left-of-screen" : function(a) { return !$.rightoffold(a, {threshold : 0}); }, + "in-viewport" : function(a) { return $.inviewport(a, {threshold : 0}); }, + /* Maintain BC for couple of versions. */ + "above-the-fold" : function(a) { return !$.belowthefold(a, {threshold : 0}); }, + "right-of-fold" : function(a) { return $.rightoffold(a, {threshold : 0}); }, + "left-of-fold" : function(a) { return !$.rightoffold(a, {threshold : 0}); } + }); + +})(jQuery, window, document); + +/* autogeneration */ +define("jquery-lazyload", [ + "jquery" +], function(){}); + +/* @source lib/jquery.timeago.js */; + +/** + * Timeago is a jQuery plugin that makes it easy to support automatically + * updating fuzzy timestamps (e.g. "4 minutes ago" or "about 1 day ago"). + * + * @name timeago + * @version 0.11.1 + * @requires jQuery v1.2.3+ + * @author Ryan McGeary + * @license MIT License - http://www.opensource.org/licenses/mit-license.php + * + * For usage and examples, visit: + * http://timeago.yarp.com/ + * + * Copyright (c) 2008-2011, Ryan McGeary (ryanonjavascript -[at]- mcgeary [*dot*] org) + */ +(function($) { + $.timeago = function(timestamp) { + if (timestamp instanceof Date) { + return inWords(timestamp); + } else if (typeof timestamp === "string") { + return inWords($.timeago.parse(timestamp)); + } else { + return inWords($.timeago.datetime(timestamp)); + } + }; + var $t = $.timeago; + + $.extend($.timeago, { + settings: { + refreshMillis: 60000, + allowFuture: false, + strings: { + prefixAgo: null, + prefixFromNow: null, + suffixAgo: "ago", + suffixFromNow: "from now", + seconds: "less than a minute", + minute: "about a minute", + minutes: "%d minutes", + hour: "about an hour", + hours: "about %d hours", + day: "a day", + days: "%d days", + month: "about a month", + months: "%d months", + year: "about a year", + years: "%d years", + wordSeparator: " ", + numbers: [] + } + }, + inWords: function(distanceMillis) { + var $l = this.settings.strings; + var prefix = $l.prefixAgo; + var suffix = $l.suffixAgo; + if (this.settings.allowFuture) { + if (distanceMillis < 0) { + prefix = $l.prefixFromNow; + suffix = $l.suffixFromNow; + } + } + + var seconds = Math.abs(distanceMillis) / 1000; + var minutes = seconds / 60; + var hours = minutes / 60; + var days = hours / 24; + var years = days / 365; + + function substitute(stringOrFunction, number) { + var string = $.isFunction(stringOrFunction) ? stringOrFunction(number, distanceMillis) : stringOrFunction; + var value = ($l.numbers && $l.numbers[number]) || number; + return string.replace(/%d/i, value); + } + + var words = seconds < 45 && substitute($l.seconds, Math.round(seconds)) || + seconds < 90 && substitute($l.minute, 1) || + minutes < 45 && substitute($l.minutes, Math.round(minutes)) || + minutes < 90 && substitute($l.hour, 1) || + hours < 24 && substitute($l.hours, Math.round(hours)) || + hours < 42 && substitute($l.day, 1) || + days < 30 && substitute($l.days, Math.round(days)) || + days < 45 && substitute($l.month, 1) || + days < 365 && substitute($l.months, Math.round(days / 30)) || + years < 1.5 && substitute($l.year, 1) || + substitute($l.years, Math.round(years)); + + var separator = $l.wordSeparator === undefined ? " " : $l.wordSeparator; + return $.trim([prefix, words, suffix].join(separator)); + }, + parse: function(iso8601) { + var s = $.trim(iso8601); + s = s.replace(/\.\d\d\d+/,""); // remove milliseconds + s = s.replace(/-/,"/").replace(/-/,"/"); + s = s.replace(/T/," ").replace(/Z/," UTC"); + s = s.replace(/([\+\-]\d\d)\:?(\d\d)/," $1$2"); // -04:00 -> -0400 + return new Date(s); + }, + datetime: function(elem) { + // jQuery's `is()` doesn't play well with HTML5 in IE + var isTime = $(elem).get(0).tagName.toLowerCase() === "time"; // $(elem).is("time"); + var iso8601 = isTime ? $(elem).attr("datetime") : $(elem).attr("title"); + return $t.parse(iso8601); + } + }); + + $.fn.timeago = function() { + var self = this; + self.each(refresh); + + var $s = $t.settings; + if ($s.refreshMillis > 0) { + setInterval(function() { self.each(refresh); }, $s.refreshMillis); + } + return self; + }; + + function refresh() { + var data = prepareData(this); + if (!isNaN(data.datetime)) { + $(this).text(inWords(data.datetime)); + } + return this; + } + + function prepareData(element) { + element = $(element); + if (!element.data("timeago")) { + element.data("timeago", { datetime: $t.datetime(element) }); + var text = $.trim(element.text()); + if (text.length > 0) { + element.attr("title", text); + } + } + return element.data("timeago"); + } + + function inWords(date) { + return $t.inWords(distance(date)); + } + + function distance(date) { + return (new Date().getTime() - date.getTime()); + } + + // fix for IE6 suckage + document.createElement("abbr"); + document.createElement("time"); +}(jQuery)); + +/* autogeneration */ +define("jquery-timeago", [ + "jquery" +], function(){}); + +/* @source lib/jquery.tmpl.js */; + +/*! + * jQuery Templates Plugin 1.0.0pre + * http://github.com/jquery/jquery-tmpl + * Requires jQuery 1.4.2 + * + * Copyright 2011, Software Freedom Conservancy, Inc. + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + */ +(function( jQuery, undefined ){ + var oldManip = jQuery.fn.domManip, tmplItmAtt = "_tmplitem", htmlExpr = /^[^<]*(<[\w\W]+>)[^>]*$|\{\{\! /, + newTmplItems = {}, wrappedItems = {}, appendToTmplItems, topTmplItem = { key: 0, data: {} }, itemKey = 0, cloneIndex = 0, stack = []; + + function newTmplItem( options, parentItem, fn, data ) { + // Returns a template item data structure for a new rendered instance of a template (a 'template item'). + // The content field is a hierarchical array of strings and nested items (to be + // removed and replaced by nodes field of dom elements, once inserted in DOM). + var newItem = { + data: data || (data === 0 || data === false) ? data : (parentItem ? parentItem.data : {}), + _wrap: parentItem ? parentItem._wrap : null, + tmpl: null, + parent: parentItem || null, + nodes: [], + calls: tiCalls, + nest: tiNest, + wrap: tiWrap, + html: tiHtml, + update: tiUpdate + }; + if ( options ) { + jQuery.extend( newItem, options, { nodes: [], parent: parentItem }); + } + if ( fn ) { + // Build the hierarchical content to be used during insertion into DOM + newItem.tmpl = fn; + newItem._ctnt = newItem._ctnt || newItem.tmpl( jQuery, newItem ); + newItem.key = ++itemKey; + // Keep track of new template item, until it is stored as jQuery Data on DOM element + (stack.length ? wrappedItems : newTmplItems)[itemKey] = newItem; + } + return newItem; + } + + // Override appendTo etc., in order to provide support for targeting multiple elements. (This code would disappear if integrated in jquery core). + jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" + }, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var ret = [], insert = jQuery( selector ), elems, i, l, tmplItems, + parent = this.length === 1 && this[0].parentNode; + + appendToTmplItems = newTmplItems || {}; + if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) { + insert[ original ]( this[0] ); + ret = this; + } else { + for ( i = 0, l = insert.length; i < l; i++ ) { + cloneIndex = i; + elems = (i > 0 ? this.clone(true) : this).get(); + jQuery( insert[i] )[ original ]( elems ); + ret = ret.concat( elems ); + } + cloneIndex = 0; + ret = this.pushStack( ret, name, insert.selector ); + } + tmplItems = appendToTmplItems; + appendToTmplItems = null; + jQuery.tmpl.complete( tmplItems ); + return ret; + }; + }); + + jQuery.fn.extend({ + // Use first wrapped element as template markup. + // Return wrapped set of template items, obtained by rendering template against data. + tmpl: function( data, options, parentItem ) { + return jQuery.tmpl( this[0], data, options, parentItem ); + }, + + // Find which rendered template item the first wrapped DOM element belongs to + tmplItem: function() { + return jQuery.tmplItem( this[0] ); + }, + + // Consider the first wrapped element as a template declaration, and get the compiled template or store it as a named template. + template: function( name ) { + return jQuery.template( name, this[0] ); + }, + + domManip: function( args, table, callback, options ) { + if ( args[0] && jQuery.isArray( args[0] )) { + var dmArgs = jQuery.makeArray( arguments ), elems = args[0], elemsLength = elems.length, i = 0, tmplItem; + while ( i < elemsLength && !(tmplItem = jQuery.data( elems[i++], "tmplItem" ))) {} + if ( tmplItem && cloneIndex ) { + dmArgs[2] = function( fragClone ) { + // Handler called by oldManip when rendered template has been inserted into DOM. + jQuery.tmpl.afterManip( this, fragClone, callback ); + }; + } + oldManip.apply( this, dmArgs ); + } else { + oldManip.apply( this, arguments ); + } + cloneIndex = 0; + if ( !appendToTmplItems ) { + jQuery.tmpl.complete( newTmplItems ); + } + return this; + } + }); + + jQuery.extend({ + // Return wrapped set of template items, obtained by rendering template against data. + tmpl: function( tmpl, data, options, parentItem ) { + var ret, topLevel = !parentItem; + if ( topLevel ) { + // This is a top-level tmpl call (not from a nested template using {{tmpl}}) + parentItem = topTmplItem; + tmpl = jQuery.template[tmpl] || jQuery.template( null, tmpl ); + wrappedItems = {}; // Any wrapped items will be rebuilt, since this is top level + } else if ( !tmpl ) { + // The template item is already associated with DOM - this is a refresh. + // Re-evaluate rendered template for the parentItem + tmpl = parentItem.tmpl; + newTmplItems[parentItem.key] = parentItem; + parentItem.nodes = []; + if ( parentItem.wrapped ) { + updateWrapped( parentItem, parentItem.wrapped ); + } + // Rebuild, without creating a new template item + return jQuery( build( parentItem, null, parentItem.tmpl( jQuery, parentItem ) )); + } + if ( !tmpl ) { + return []; // Could throw... + } + if ( typeof data === "function" ) { + data = data.call( parentItem || {} ); + } + if ( options && options.wrapped ) { + updateWrapped( options, options.wrapped ); + } + ret = jQuery.isArray( data ) ? + jQuery.map( data, function( dataItem ) { + return dataItem ? newTmplItem( options, parentItem, tmpl, dataItem ) : null; + }) : + [ newTmplItem( options, parentItem, tmpl, data ) ]; + return topLevel ? jQuery( build( parentItem, null, ret ) ) : ret; + }, + + // Return rendered template item for an element. + tmplItem: function( elem ) { + var tmplItem; + if ( elem instanceof jQuery ) { + elem = elem[0]; + } + while ( elem && elem.nodeType === 1 && !(tmplItem = jQuery.data( elem, "tmplItem" )) && (elem = elem.parentNode) ) {} + return tmplItem || topTmplItem; + }, + + // Set: + // Use $.template( name, tmpl ) to cache a named template, + // where tmpl is a template string, a script element or a jQuery instance wrapping a script element, etc. + // Use $( "selector" ).template( name ) to provide access by name to a script block template declaration. + + // Get: + // Use $.template( name ) to access a cached template. + // Also $( selectorToScriptBlock ).template(), or $.template( null, templateString ) + // will return the compiled template, without adding a name reference. + // If templateString includes at least one HTML tag, $.template( templateString ) is equivalent + // to $.template( null, templateString ) + template: function( name, tmpl ) { + if (tmpl) { + // Compile template and associate with name + if ( typeof tmpl === "string" ) { + // This is an HTML string being passed directly in. + tmpl = buildTmplFn( tmpl ); + } else if ( tmpl instanceof jQuery ) { + tmpl = tmpl[0] || {}; + } + if ( tmpl.nodeType ) { + // If this is a template block, use cached copy, or generate tmpl function and cache. + tmpl = jQuery.data( tmpl, "tmpl" ) || jQuery.data( tmpl, "tmpl", buildTmplFn( tmpl.innerHTML )); + // Issue: In IE, if the container element is not a script block, the innerHTML will remove quotes from attribute values whenever the value does not include white space. + // This means that foo="${x}" will not work if the value of x includes white space: foo="${x}" -> foo=value of x. + // To correct this, include space in tag: foo="${ x }" -> foo="value of x" + } + return typeof name === "string" ? (jQuery.template[name] = tmpl) : tmpl; + } + // Return named compiled template + return name ? (typeof name !== "string" ? jQuery.template( null, name ): + (jQuery.template[name] || + // If not in map, and not containing at least on HTML tag, treat as a selector. + // (If integrated with core, use quickExpr.exec) + jQuery.template( null, htmlExpr.test( name ) ? name : jQuery( name )))) : null; + }, + + encode: function( text ) { + // Do HTML encoding replacing < > & and ' and " by corresponding entities. + return ("" + text).split("<").join("<").split(">").join(">").split('"').join(""").split("'").join("'"); + } + }); + + jQuery.extend( jQuery.tmpl, { + tag: { + "tmpl": { + _default: { $2: "null" }, + open: "if($notnull_1){__=__.concat($item.nest($1,$2));}" + // tmpl target parameter can be of type function, so use $1, not $1a (so not auto detection of functions) + // This means that {{tmpl foo}} treats foo as a template (which IS a function). + // Explicit parens can be used if foo is a function that returns a template: {{tmpl foo()}}. + }, + "wrap": { + _default: { $2: "null" }, + open: "$item.calls(__,$1,$2);__=[];", + close: "call=$item.calls();__=call._.concat($item.wrap(call,__));" + }, + "each": { + _default: { $2: "$index, $value" }, + open: "if($notnull_1){$.each($1a,function($2){with(this){", + close: "}});}" + }, + "if": { + open: "if(($notnull_1) && $1a){", + close: "}" + }, + "else": { + _default: { $1: "true" }, + open: "}else if(($notnull_1) && $1a){" + }, + "html": { + // Unecoded expression evaluation. + open: "if($notnull_1){__.push($1a);}" + }, + "=": { + // Encoded expression evaluation. Abbreviated form is ${}. + _default: { $1: "$data" }, + open: "if($notnull_1){__.push($.encode($1a));}" + }, + "!": { + // Comment tag. Skipped by parser + open: "" + } + }, + + // This stub can be overridden, e.g. in jquery.tmplPlus for providing rendered events + complete: function( items ) { + newTmplItems = {}; + }, + + // Call this from code which overrides domManip, or equivalent + // Manage cloning/storing template items etc. + afterManip: function afterManip( elem, fragClone, callback ) { + // Provides cloned fragment ready for fixup prior to and after insertion into DOM + var content = fragClone.nodeType === 11 ? + jQuery.makeArray(fragClone.childNodes) : + fragClone.nodeType === 1 ? [fragClone] : []; + + // Return fragment to original caller (e.g. append) for DOM insertion + callback.call( elem, fragClone ); + + // Fragment has been inserted:- Add inserted nodes to tmplItem data structure. Replace inserted element annotations by jQuery.data. + storeTmplItems( content ); + cloneIndex++; + } + }); + + //========================== Private helper functions, used by code above ========================== + + function build( tmplItem, nested, content ) { + // Convert hierarchical content into flat string array + // and finally return array of fragments ready for DOM insertion + var frag, ret = content ? jQuery.map( content, function( item ) { + return (typeof item === "string") ? + // Insert template item annotations, to be converted to jQuery.data( "tmplItem" ) when elems are inserted into DOM. + (tmplItem.key ? item.replace( /(<\w+)(?=[\s>])(?![^>]*_tmplitem)([^>]*)/g, "$1 " + tmplItmAtt + "=\"" + tmplItem.key + "\" $2" ) : item) : + // This is a child template item. Build nested template. + build( item, tmplItem, item._ctnt ); + }) : + // If content is not defined, insert tmplItem directly. Not a template item. May be a string, or a string array, e.g. from {{html $item.html()}}. + tmplItem; + if ( nested ) { + return ret; + } + + // top-level template + ret = ret.join(""); + + // Support templates which have initial or final text nodes, or consist only of text + // Also support HTML entities within the HTML markup. + ret.replace( /^\s*([^<\s][^<]*)?(<[\w\W]+>)([^>]*[^>\s])?\s*$/, function( all, before, middle, after) { + frag = jQuery( middle ).get(); + + storeTmplItems( frag ); + if ( before ) { + frag = unencode( before ).concat(frag); + } + if ( after ) { + frag = frag.concat(unencode( after )); + } + }); + return frag ? frag : unencode( ret ); + } + + function unencode( text ) { + // Use createElement, since createTextNode will not render HTML entities correctly + var el = document.createElement( "div" ); + el.innerHTML = text; + return jQuery.makeArray(el.childNodes); + } + + // Generate a reusable function that will serve to render a template against data + function buildTmplFn( markup ) { + return new Function("jQuery","$item", + // Use the variable __ to hold a string array while building the compiled template. (See https://github.com/jquery/jquery-tmpl/issues#issue/10). + "var $=jQuery,call,__=[],$data=$item.data;" + + + // Introduce the data as local variables using with(){} + "with($data){__.push('" + + + // Convert the template into pure JavaScript + jQuery.trim(markup) + .replace( /([\\'])/g, "\\$1" ) + .replace( /[\r\t\n]/g, " " ) + .replace( /\$\{([^\}]*)\}/g, "{{= $1}}" ) + .replace( /\{\{(\/?)(\w+|.)(?:\(((?:[^\}]|\}(?!\}))*?)?\))?(?:\s+(.*?)?)?(\(((?:[^\}]|\}(?!\}))*?)\))?\s*\}\}/g, + function( all, slash, type, fnargs, target, parens, args ) { + var tag = jQuery.tmpl.tag[ type ], def, expr, exprAutoFnDetect; + if ( !tag ) { + throw "Unknown template tag: " + type; + } + def = tag._default || []; + if ( parens && !/\w$/.test(target)) { + target += parens; + parens = ""; + } + if ( target ) { + target = unescape( target ); + args = args ? ("," + unescape( args ) + ")") : (parens ? ")" : ""); + // Support for target being things like a.toLowerCase(); + // In that case don't call with template item as 'this' pointer. Just evaluate... + expr = parens ? (target.indexOf(".") > -1 ? target + unescape( parens ) : ("(" + target + ").call($item" + args)) : target; + exprAutoFnDetect = parens ? expr : "(typeof(" + target + ")==='function'?(" + target + ").call($item):(" + target + "))"; + } else { + exprAutoFnDetect = expr = def.$1 || "null"; + } + fnargs = unescape( fnargs ); + return "');" + + tag[ slash ? "close" : "open" ] + .split( "$notnull_1" ).join( target ? "typeof(" + target + ")!=='undefined' && (" + target + ")!=null" : "true" ) + .split( "$1a" ).join( exprAutoFnDetect ) + .split( "$1" ).join( expr ) + .split( "$2" ).join( fnargs || def.$2 || "" ) + + "__.push('"; + }) + + "');}return __;" + ); + } + function updateWrapped( options, wrapped ) { + // Build the wrapped content. + options._wrap = build( options, true, + // Suport imperative scenario in which options.wrapped can be set to a selector or an HTML string. + jQuery.isArray( wrapped ) ? wrapped : [htmlExpr.test( wrapped ) ? wrapped : jQuery( wrapped ).html()] + ).join(""); + } + + function unescape( args ) { + return args ? args.replace( /\\'/g, "'").replace(/\\\\/g, "\\" ) : null; + } + function outerHtml( elem ) { + var div = document.createElement("div"); + div.appendChild( elem.cloneNode(true) ); + return div.innerHTML; + } + + // Store template items in jQuery.data(), ensuring a unique tmplItem data data structure for each rendered template instance. + function storeTmplItems( content ) { + var keySuffix = "_" + cloneIndex, elem, elems, newClonedItems = {}, i, l, m; + for ( i = 0, l = content.length; i < l; i++ ) { + if ( (elem = content[i]).nodeType !== 1 ) { + continue; + } + elems = elem.getElementsByTagName("*"); + for ( m = elems.length - 1; m >= 0; m-- ) { + processItemKey( elems[m] ); + } + processItemKey( elem ); + } + function processItemKey( el ) { + var pntKey, pntNode = el, pntItem, tmplItem, key; + // Ensure that each rendered template inserted into the DOM has its own template item, + if ( (key = el.getAttribute( tmplItmAtt ))) { + while ( pntNode.parentNode && (pntNode = pntNode.parentNode).nodeType === 1 && !(pntKey = pntNode.getAttribute( tmplItmAtt ))) { } + if ( pntKey !== key ) { + // The next ancestor with a _tmplitem expando is on a different key than this one. + // So this is a top-level element within this template item + // Set pntNode to the key of the parentNode, or to 0 if pntNode.parentNode is null, or pntNode is a fragment. + pntNode = pntNode.parentNode ? (pntNode.nodeType === 11 ? 0 : (pntNode.getAttribute( tmplItmAtt ) || 0)) : 0; + if ( !(tmplItem = newTmplItems[key]) ) { + // The item is for wrapped content, and was copied from the temporary parent wrappedItem. + tmplItem = wrappedItems[key]; + tmplItem = newTmplItem( tmplItem, newTmplItems[pntNode]||wrappedItems[pntNode] ); + tmplItem.key = ++itemKey; + newTmplItems[itemKey] = tmplItem; + } + if ( cloneIndex ) { + cloneTmplItem( key ); + } + } + el.removeAttribute( tmplItmAtt ); + } else if ( cloneIndex && (tmplItem = jQuery.data( el, "tmplItem" )) ) { + // This was a rendered element, cloned during append or appendTo etc. + // TmplItem stored in jQuery data has already been cloned in cloneCopyEvent. We must replace it with a fresh cloned tmplItem. + cloneTmplItem( tmplItem.key ); + newTmplItems[tmplItem.key] = tmplItem; + pntNode = jQuery.data( el.parentNode, "tmplItem" ); + pntNode = pntNode ? pntNode.key : 0; + } + if ( tmplItem ) { + pntItem = tmplItem; + // Find the template item of the parent element. + // (Using !=, not !==, since pntItem.key is number, and pntNode may be a string) + while ( pntItem && pntItem.key != pntNode ) { + // Add this element as a top-level node for this rendered template item, as well as for any + // ancestor items between this item and the item of its parent element + pntItem.nodes.push( el ); + pntItem = pntItem.parent; + } + // Delete content built during rendering - reduce API surface area and memory use, and avoid exposing of stale data after rendering... + delete tmplItem._ctnt; + delete tmplItem._wrap; + // Store template item as jQuery data on the element + jQuery.data( el, "tmplItem", tmplItem ); + } + function cloneTmplItem( key ) { + key = key + keySuffix; + tmplItem = newClonedItems[key] = + (newClonedItems[key] || newTmplItem( tmplItem, newTmplItems[tmplItem.parent.key + keySuffix] || tmplItem.parent )); + } + } + } + + //---- Helper functions for template item ---- + + function tiCalls( content, tmpl, data, options ) { + if ( !content ) { + return stack.pop(); + } + stack.push({ _: content, tmpl: tmpl, item:this, data: data, options: options }); + } + + function tiNest( tmpl, data, options ) { + // nested template, using {{tmpl}} tag + return jQuery.tmpl( jQuery.template( tmpl ), data, options, this ); + } + + function tiWrap( call, wrapped ) { + // nested template, using {{wrap}} tag + var options = call.options || {}; + options.wrapped = wrapped; + // Apply the template, which may incorporate wrapped content, + return jQuery.tmpl( jQuery.template( call.tmpl ), call.data, options, call.item ); + } + + function tiHtml( filter, textOnly ) { + var wrapped = this._wrap; + return jQuery.map( + jQuery( jQuery.isArray( wrapped ) ? wrapped.join("") : wrapped ).filter( filter || "*" ), + function(e) { + return textOnly ? + e.innerText || e.textContent : + e.outerHTML || outerHtml(e); + }); + } + + function tiUpdate() { + var coll = this.nodes; + jQuery.tmpl( null, null, null, this).insertBefore( coll[0] ); + jQuery( coll ).remove(); + } +})( jQuery ); + +/* autogeneration */ +define("jquery-tmpl", [ + "jquery" +], function(){}); + +/* @source lib/keymaster.js */; + +// keymaster.js +// (c) 2011-2012 Thomas Fuchs +// keymaster.js may be freely distributed under the MIT license. + +;(function(global){ + var k, + _handlers = {}, + _mods = { 16: false, 18: false, 17: false, 91: false }, + _scope = 'all', + // modifier keys + _MODIFIERS = { + '⇧': 16, shift: 16, + '⌥': 18, alt: 18, option: 18, + '⌃': 17, ctrl: 17, control: 17, + '⌘': 91, command: 91 + }, + // special keys + _MAP = { + backspace: 8, tab: 9, clear: 12, + enter: 13, 'return': 13, + esc: 27, escape: 27, space: 32, + left: 37, up: 38, + right: 39, down: 40, + del: 46, 'delete': 46, + home: 36, end: 35, + pageup: 33, pagedown: 34, + ',': 188, '.': 190, '/': 191, + '`': 192, '-': 189, '=': 187, + ';': 186, '\'': 222, + '[': 219, ']': 221, '\\': 220 + }, + _downKeys = []; + + for(k=1;k<20;k++) _MODIFIERS['f'+k] = 111+k; + + // IE doesn't support Array#indexOf, so have a simple replacement + function index(array, item){ + var i = array.length; + while(i--) if(array[i]===item) return i; + return -1; + } + + // handle keydown event + function dispatch(event, scope){ + var key, handler, k, i, modifiersMatch; + key = event.keyCode; + + if (index(_downKeys, key) == -1) { + _downKeys.push(key); + } + + // if a modifier key, set the key.<modifierkeyname> property to true and return + if(key == 93 || key == 224) key = 91; // right command on webkit, command on Gecko + if(key in _mods) { + _mods[key] = true; + // 'assignKey' from inside this closure is exported to window.key + for(k in _MODIFIERS) if(_MODIFIERS[k] == key) assignKey[k] = true; + return; + } + + // see if we need to ignore the keypress (filter() can can be overridden) + // by default ignore key presses if a select, textarea, or input is focused + if(!assignKey.filter.call(this, event)) return; + + // abort if no potentially matching shortcuts found + if (!(key in _handlers)) return; + + // for each potential shortcut + for (i = 0; i < _handlers[key].length; i++) { + handler = _handlers[key][i]; + + // see if it's in the current scope + if(handler.scope == scope || handler.scope == 'all'){ + // check if modifiers match if any + modifiersMatch = handler.mods.length > 0; + for(k in _mods) + if((!_mods[k] && index(handler.mods, +k) > -1) || + (_mods[k] && index(handler.mods, +k) == -1)) modifiersMatch = false; + // call the handler and stop the event if neccessary + if((handler.mods.length == 0 && !_mods[16] && !_mods[18] && !_mods[17] && !_mods[91]) || modifiersMatch){ + if(handler.method(event, handler)===false){ + if(event.preventDefault) event.preventDefault(); + else event.returnValue = false; + if(event.stopPropagation) event.stopPropagation(); + if(event.cancelBubble) event.cancelBubble = true; + } + } + } + } + }; + + // unset modifier keys on keyup + function clearModifier(event){ + var key = event.keyCode, k, + i = index(_downKeys, key); + + // remove key from _downKeys + if (i >= 0) { + _downKeys.splice(i, 1); + } + + if(key == 93 || key == 224) key = 91; + if(key in _mods) { + _mods[key] = false; + for(k in _MODIFIERS) if(_MODIFIERS[k] == key) assignKey[k] = false; + } + }; + + function resetModifiers() { + for(k in _mods) _mods[k] = false; + for(k in _MODIFIERS) assignKey[k] = false; + } + + // parse and assign shortcut + function assignKey(key, scope, method){ + var keys, mods, i, mi; + if (method === undefined) { + method = scope; + scope = 'all'; + } + key = key.replace(/\s/g,''); + keys = key.split(','); + + if((keys[keys.length-1])=='') + keys[keys.length-2] += ','; + // for each shortcut + for (i = 0; i < keys.length; i++) { + // set modifier keys if any + mods = []; + key = keys[i].split('+'); + if(key.length > 1){ + mods = key.slice(0,key.length-1); + for (mi = 0; mi < mods.length; mi++) + mods[mi] = _MODIFIERS[mods[mi]]; + key = [key[key.length-1]]; + } + // convert to keycode and... + key = key[0] + key = _MAP[key] || key.toUpperCase().charCodeAt(0); + // ...store handler + if (!(key in _handlers)) _handlers[key] = []; + _handlers[key].push({ shortcut: keys[i], scope: scope, method: method, key: keys[i], mods: mods }); + } + }; + + // Returns true if the key with code 'keyCode' is currently down + // Converts strings into key codes. + function isPressed(keyCode) { + if (typeof(keyCode)=='string') { + if (keyCode.length == 1) { + keyCode = (keyCode.toUpperCase()).charCodeAt(0); + } else { + return false; + } + } + return index(_downKeys, keyCode) != -1; + } + + function getPressedKeyCodes() { + return _downKeys; + } + + function filter(event){ + var tagName = (event.target || event.srcElement).tagName; + // ignore keypressed in any elements that support keyboard data input + return !(tagName == 'INPUT' || tagName == 'SELECT' || tagName == 'TEXTAREA'); + } + + // initialize key.<modifier> to false + for(k in _MODIFIERS) assignKey[k] = false; + + // set current scope (default 'all') + function setScope(scope){ _scope = scope || 'all' }; + function getScope(){ return _scope || 'all' }; + + // delete all handlers for a given scope + function deleteScope(scope){ + var key, handlers, i; + + for (key in _handlers) { + handlers = _handlers[key]; + for (i = 0; i < handlers.length; ) { + if (handlers[i].scope === scope) handlers.splice(i, 1); + else i++; + } + } + }; + + // cross-browser events + function addEvent(object, event, method) { + if (object.addEventListener) + object.addEventListener(event, method, false); + else if(object.attachEvent) + object.attachEvent('on'+event, function(){ method(window.event) }); + }; + + // set the handlers globally on document + addEvent(document, 'keydown', function(event) { dispatch(event, _scope) }); // Passing _scope to a callback to ensure it remains the same by execution. Fixes #48 + addEvent(document, 'keyup', clearModifier); + + // reset modifiers to false whenever the window is (re)focused. + addEvent(window, 'focus', resetModifiers); + + // store previously defined key + var previousKey = global.key; + + // restore previously defined key and return reference to our key object + function noConflict() { + var k = global.key; + global.key = previousKey; + return k; + } + + // set window.key and window.key.set/get/deleteScope, and the default filter + global.key = assignKey; + global.key.setScope = setScope; + global.key.getScope = getScope; + global.key.deleteScope = deleteScope; + global.key.filter = filter; + global.key.isPressed = isPressed; + global.key.getPressedKeyCodes = getPressedKeyCodes; + global.key.noConflict = noConflict; + + if(typeof module !== 'undefined') module.exports = key; + +})(this); + +/* autogeneration */ +define("lib/keymaster.js", [], function(){}); + +/* @source mod/emoji-hint.js */; + +define('mod/emoji-hint', [ + "jquery", + "key" +], function($, key) { + var emojiHint; + $('#show-emoji-hint').click( + function () { + if (!emojiHint) { + emojiHint = $('<div class="emoji-hint"><iframe src="/hub/emoji" width="650" height="600" frameborder="0"></iframe><a href="javascript:void(0)" id="close">X</a></div>').appendTo('body'); + emojiHint.find('#close').click(function () {emojiHint.hide();}); + $('body').click(function () {emojiHint.hide();}); + } + emojiHint.show().css('top', $(window).scrollTop()); + return false; + }); + + key('esc', function(){ + emojiHint.hide(); + }); +}); + +/* @source mod/search_autocomplete.js */; + +define('mod/search_autocomplete', [ + "jquery" +], function($) { + var keyCode = {enter:13, esc:27, tab:9, up:38, down:40, ctrl:17, n:78, p:80}; + var searchInput = $('#global-search-field'), search_repos_menu, + hideReposMenu = function () { + search_repos_menu && !searchInput.is(":focus") + && !search_repos_menu.is(":focus") && search_repos_menu.empty().hide(); + }, + showIntro = function () { + if (!search_repos_menu || search_repos_menu.is(':empty')) { + var introContent = '<ul><li class="intro">Input project name to search <b>project</b> or startswith <span style="color:#4183C4">"@"</span> to search <b>user</b>.</li></ul>'; + search_repos_menu = $('<div id="search-repos-menu"></div>').appendTo('#search') + .on('mouseenter', 'li', function () { + search_repos_menu.find('li.active').removeClass('active'); + $(this).addClass('active'); + }) + .on('click', 'li', function (e) { + e.preventDefault(); + var url = $(this).attr('data-url'); + url && (window.location.href = url); + }); + search_repos_menu.html(introContent).show(); + } + }; + $('body').click(function () {setTimeout(hideReposMenu, 100);}); + searchInput + .focusin(showIntro) + .keydown(function (e) { + (e.keyCode == keyCode.enter && search_repos_menu && search_repos_menu.find('li.active').length) && e.preventDefault(); + }) + .keyup( + function (e) { + var k = e.keyCode; + if (k == keyCode.up || k == keyCode.down || k == keyCode.n + || k == keyCode.p || k == keyCode.ctrl || k == keyCode.enter) { + if (search_repos_menu && search_repos_menu.find('li').length) { + (k == keyCode.esc) && hideReposMenu();// esc key to close the menu + var actItem = search_repos_menu.find('li.active'); + if (actItem.length) { + var a = actItem; + if (k == keyCode.up || + (k == keyCode.p && e.ctrlKey == true)) { // up + var p = a.removeClass('active').prev(); + (p.length ? p : search_repos_menu.find('li:last')).addClass('active'); + } else if (k == keyCode.down || + (k == keyCode.n && e.ctrlKey == true)) { // down + var n = a.removeClass('active').next(); + (n.length ? n : search_repos_menu.find('li:first')).addClass('active'); + } else if (k == keyCode.enter) { // enter key to go to repo + e.preventDefault(); + var url = actItem.attr('data-url'); + url && (window.location.href = url); + } + } else { + search_repos_menu.find('li:first').addClass('active'); + } + } + } else { + var q = $(this).val(), reqUrl, templ; + if (q.substr(0, 1) == '@') { + // search for users + q = q.substring(1); + reqUrl = '/api/autocomplete_users'; + templ = $('#templ-users-autocomplete'); + } else { + // search for repos + reqUrl = '/api/autocomplete_repos'; + templ = $('#templ-repos-autocomplete'); + } + (q != '') ? $.getJSON(reqUrl, + {q:q}, + function (r) { + var current_q = searchInput.val(); + if (current_q === q) { + search_repos_menu.html($.tmpl(templ, r)).show(); + } + }) : showIntro(); + } + }); + +}); + +/* @source lib/store.js */; + +;(function(win){ + var store = {}, + doc = win.document, + localStorageName = 'localStorage', + namespace = '__storejs__', + storage + + store.disabled = false + store.set = function(key, value) {} + store.get = function(key) {} + store.remove = function(key) {} + store.clear = function() {} + store.transact = function(key, defaultVal, transactionFn) { + var val = store.get(key) + if (transactionFn == null) { + transactionFn = defaultVal + defaultVal = null + } + if (typeof val == 'undefined') { val = defaultVal || {} } + transactionFn(val) + store.set(key, val) + } + store.getAll = function() {} + + store.serialize = function(value) { + return JSON.stringify(value) + } + store.deserialize = function(value) { + if (typeof value != 'string') { return undefined } + try { return JSON.parse(value) } + catch(e) { return value || undefined } + } + + // Functions to encapsulate questionable FireFox 3.6.13 behavior + // when about.config::dom.storage.enabled === false + // See https://github.com/marcuswestin/store.js/issues#issue/13 + function isLocalStorageNameSupported() { + try { return (localStorageName in win && win[localStorageName]) } + catch(err) { return false } + } + + if (isLocalStorageNameSupported()) { + storage = win[localStorageName] + store.set = function(key, val) { + if (val === undefined) { return store.remove(key) } + storage.setItem(key, store.serialize(val)) + return val + } + store.get = function(key) { return store.deserialize(storage.getItem(key)) } + store.remove = function(key) { storage.removeItem(key) } + store.clear = function() { storage.clear() } + store.getAll = function() { + var ret = {} + for (var i=0; i<storage.length; ++i) { + var key = storage.key(i) + ret[key] = store.get(key) + } + return ret + } + } else if (doc.documentElement.addBehavior) { + var storageOwner, + storageContainer + // Since #userData storage applies only to specific paths, we need to + // somehow link our data to a specific path. We choose /favicon.ico + // as a pretty safe option, since all browsers already make a request to + // this URL anyway and being a 404 will not hurt us here. We wrap an + // iframe pointing to the favicon in an ActiveXObject(htmlfile) object + // (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx) + // since the iframe access rules appear to allow direct access and + // manipulation of the document element, even for a 404 page. This + // document can be used instead of the current document (which would + // have been limited to the current path) to perform #userData storage. + try { + storageContainer = new ActiveXObject('htmlfile') + storageContainer.open() + storageContainer.write('<s' + 'cript>document.w=window</s' + 'cript><iframe src="/favicon.ico"></iframe>') + storageContainer.close() + storageOwner = storageContainer.w.frames[0].document + storage = storageOwner.createElement('div') + } catch(e) { + // somehow ActiveXObject instantiation failed (perhaps some special + // security settings or otherwse), fall back to per-path storage + storage = doc.createElement('div') + storageOwner = doc.body + } + function withIEStorage(storeFunction) { + return function() { + var args = Array.prototype.slice.call(arguments, 0) + args.unshift(storage) + // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx + // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx + storageOwner.appendChild(storage) + storage.addBehavior('#default#userData') + storage.load(localStorageName) + var result = storeFunction.apply(store, args) + storageOwner.removeChild(storage) + return result + } + } + + // In IE7, keys may not contain special chars. See all of https://github.com/marcuswestin/store.js/issues/40 + var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g") + function ieKeyFix(key) { + return key.replace(forbiddenCharsRegex, '___') + } + store.set = withIEStorage(function(storage, key, val) { + key = ieKeyFix(key) + if (val === undefined) { return store.remove(key) } + storage.setAttribute(key, store.serialize(val)) + storage.save(localStorageName) + return val + }) + store.get = withIEStorage(function(storage, key) { + key = ieKeyFix(key) + return store.deserialize(storage.getAttribute(key)) + }) + store.remove = withIEStorage(function(storage, key) { + key = ieKeyFix(key) + storage.removeAttribute(key) + storage.save(localStorageName) + }) + store.clear = withIEStorage(function(storage) { + var attributes = storage.XMLDocument.documentElement.attributes + storage.load(localStorageName) + for (var i=0, attr; attr=attributes[i]; i++) { + storage.removeAttribute(attr.name) + } + storage.save(localStorageName) + }) + store.getAll = withIEStorage(function(storage) { + var attributes = storage.XMLDocument.documentElement.attributes + var ret = {} + for (var i=0, attr; attr=attributes[i]; ++i) { + var key = ieKeyFix(attr.name) + ret[attr.name] = store.deserialize(storage.getAttribute(key)) + } + return ret + }) + } + + try { + store.set(namespace, namespace) + if (store.get(namespace) != namespace) { store.disabled = true } + store.remove(namespace) + } catch(e) { + store.disabled = true + } + store.enabled = !store.disabled + if (typeof module != 'undefined' && module.exports) { module.exports = store } + else if (typeof define === 'function' && define.amd) { define("store", store) } + else { win.store = store } +})(this.window || global); + +/* @source mod/user_following.js */; + +define('store', 'lib/store.js'); +define('mod/user_following', [ + "jquery", + "store" +], function($, store) { + var API_USER_FOLLOWING_PATH = "/api/user/following" + var USER_FOLLOWING_KEY = "user-following"; + var USER_FOLLOWING_UPDATE_KEY= "date:user-following" + var ONE_DAY_IN_SECONDS = 60*60*24; + + var update = function() { + var currentTime = new Date().getTime(); + var lastTime = store.get(USER_FOLLOWING_UPDATE_KEY); + if (lastTime && (currentTime - lastTime) < ONE_DAY_IN_SECONDS ) { + return; + } + + $.ajax( + API_USER_FOLLOWING_PATH + ).done(function(users){ + var following = $.map(users, function(item){ + return item["username"]; + }); + store.set(USER_FOLLOWING_KEY, following); + store.set(USER_FOLLOWING_UPDATE_KEY, currentTime); + }).fail(function(jqxhr, textStatus, error){ + return; + }); + } + + return { + update: update, + val: function(){ + return store.get(USER_FOLLOWING_KEY) || []; + } + }; + +}); + +/* @source mod/code_version.js */; + +define('mod/code_version', [ + "jquery" +], function($) { + + function init(){ + $.getJSON("/api/get_code_version", function(data){ + var sha = data.code_version; + var time = data.release_time; + $('#rev_sha').html(sha); + $('#rel_time').html(time.substr(5,11)); + }); + } + + return { + init: init + }; + +}); + +/* @source lib/date.extensions.js */; + +/** + * Returns a description of this date in relative terms. + + * Examples, where new Date().toString() == "Mon Nov 23 2009 17:36:51 GMT-0500 (EST)": + * + * new Date().toRelativeTime() + * --> 'Just now' + * + * new Date("Nov 21, 2009").toRelativeTime() + * --> '2 days ago' + * + * new Date("Nov 25, 2009").toRelativeTime() + * --> '2 days from now' + * + * // One second ago + * new Date("Nov 23 2009 17:36:50 GMT-0500 (EST)").toRelativeTime() + * --> '1 second ago' + * + * toRelativeTime() takes an optional argument - a configuration object. + * It can have the following properties: + * - now - Date object that defines "now" for the purpose of conversion. + * By default, current date & time is used (i.e. new Date()) + * - nowThreshold - Threshold in milliseconds which is considered "Just now" + * for times in the past or "Right now" for now or the immediate future + * - smartDays - If enabled, dates within a week of now will use Today/Yesterday/Tomorrow + * or weekdays along with time, e.g. "Thursday at 15:10:34" + * rather than "4 days ago" or "Tomorrow at 20:12:01" + * instead of "1 day from now" + * + * If a single number is given as argument, it is interpreted as nowThreshold: + * + * // One second ago, now setting a now_threshold to 5 seconds + * new Date("Nov 23 2009 17:36:50 GMT-0500 (EST)").toRelativeTime(5000) + * --> 'Just now' + * + * // One second in the future, now setting a now_threshold to 5 seconds + * new Date("Nov 23 2009 17:36:52 GMT-0500 (EST)").toRelativeTime(5000) + * --> 'Right now' + * + */ +var TRANSLATIONS = { + 'Right now':'现在', + 'Just now':'刚刚', + 'from now':'之后', + 'ago':'前', + 'Today':'今天', + 'Yesterday':'昨天', + 'Tomorrow':'明天', + ' at ':'', + 's':'', + ' ':'', + 'millisecond':'毫秒', + 'second':'秒', + 'minute':'分钟', + 'hour':'小时', + 'day':'天', + 'month':'个月', + 'year':'年', + 'Sunday':'星期天', + 'Monday':'星期六', + 'Tuesday':'星期二', + 'Wednesday':'星期三', + 'Thursday':'星期四', + 'Friday':'星期五', + 'Saturday':'星期六' +}, +_t = function (key) {return TRANSLATIONS[key];}; + + Date.prototype.toRelativeTime = (function() { + + var _ = function(options) { + var opts = processOptions(options); + + var now = opts.now || new Date(); + var delta = now - this; + var future = (delta <= 0); + delta = Math.abs(delta); + + // special cases controlled by options + if (delta <= opts.nowThreshold) { + return future ? _t('Right now') : _t('Just now'); + } + if (opts.smartDays && delta <= 6 * MS_IN_DAY) { + return toSmartDays(this, now); + } + + var units = null; + for (var key in CONVERSIONS) { + if (delta < CONVERSIONS[key]) + break; + units = _t(key); // keeps track of the selected key over the iteration + delta = delta / CONVERSIONS[key]; + } + + // pluralize a unit when the difference is greater than 1. + delta = Math.floor(delta); + if (delta !== 1) { units += _t("s"); } + return [delta, units, future ? _t("from now") : _t("ago")].join(_t(" ")); + }; + + var processOptions = function(arg) { + if (!arg) arg = 0; + if (typeof arg === 'string') { + arg = parseInt(arg, 10); + } + if (typeof arg === 'number') { + if (isNaN(arg)) arg = 0; + return {nowThreshold: arg}; + } + return arg; + }; + + var toSmartDays = function(date, now) { + var day; + var weekday = date.getDay(), + dayDiff = weekday - now.getDay(); + if (dayDiff == 0) day = _t('Today'); + else if (dayDiff == -1) day = _t('Yesterday'); + else if (dayDiff == 1 && date > now) day = _t('Tomorrow'); + else day = WEEKDAYS[weekday]; + return day + _t(" at ") + date.toLocaleTimeString(); + }; + + var CONVERSIONS = { + millisecond: 1, // ms -> ms + second: 1000, // ms -> sec + minute: 60, // sec -> min + hour: 60, // min -> hour + day: 24, // hour -> day + month: 30, // day -> month (roughly) + year: 12 // month -> year + }; + var MS_IN_DAY = (CONVERSIONS.millisecond * CONVERSIONS.second * CONVERSIONS.minute * CONVERSIONS.hour * CONVERSIONS.day); + + var WEEKDAYS = [_t('Sunday'), _t('Monday'), _t('Tuesday'), _t('Wednesday'), _t('Thursday'), _t('Friday'), _t('Saturday')]; + + return _; + +})(); + + + +/* + * Wraps up a common pattern used with this plugin whereby you take a String + * representation of a Date, and want back a date object. + */ +Date.fromString = function(str) { + return new Date(Date.parse(str)); +}; + +/* autogeneration */ +define("lib/date.extensions", [], function(){}); + +/* @source mod/relative_date.js */; + +define('mod/relative_date', [ + "jquery", + "lib/date.extensions" +], function($) { + var updateRelativeDate = function () { + $('.js-relative-date').each( + function (i, el) { + var el = $(el); + var t = (el.attr('datetime') || el.attr('data-time')).split(/[- : + T]/); + var d = new Date(t[0], t[1]-1, t[2], t[3], t[4], t[5]); + !isNaN(d.getTime()) && el.html(d.toRelativeTime({nowThreshold:60*1000})); + }); + }; + return updateRelativeDate; + }); + +/* @source mod/user_avatar.js */; + +define('mod/user_avatar', [ + "jquery", + "jquery-lazyload" +], function($, _) { + var isRetinaDisplay = window.devicePixelRatio > 1; + + var patchForRetina = function(originalURL) { + var match = /^(.+\Ws=)(\d+)(.*)$/.exec(originalURL); + if (match === null) { + return originalURL; + } + + var oldSize = parseInt(match[2], 10); + var newSize = Math.ceil(window.devicePixelRatio * oldSize); + + return match[1] + newSize.toString(10) + match[3]; + }; + + var checkLoad = function() { + var e = $(this); + if (isRetinaDisplay) { + var dataOriginalURL = e.attr('data-original') || e.attr('src'); + e.attr('data-original', patchForRetina(dataOriginalURL)); + + e.lazyload({effect:"fadeIn", threshold:300}); + } + }; + + var loadAvatar = function () { + // $("img.user-avatar").each(checkLoad); + // $("img.avatar").each(checkLoad); + // $(window).resize(); + }; + return loadAvatar; +}); + +/* @source */; + +require.config({ + baseUrl: '/js/' +}); + +define('jquery-src', 'lib/jquery-1.8.3.js'); +define('jquery', ['jquery-src'], function(){ + return window.jQuery; +}); + +define('jquery-tmpl', ['jquery'], 'lib/jquery.tmpl.js'); +define('jquery-lazyload', ['jquery'], 'lib/jquery.lazyload.js'); +define('jquery-caret', ['jquery'], 'lib/jquery.caret.js'); +define('jquery-atwho', ['jquery'], 'lib/jquery.atwho.js'); +define('jquery-timeago', ['jquery'], 'lib/jquery.timeago.js'); +define('jquery-forms', ['jquery'], 'lib/jquery.forms.js'); +define('jquery-unobstrusive', ['jquery'], 'lib/unobtrusive.js'); +define('jquery-zclip', ['jquery'], 'lib/jquery.zclip.js'); +define('jquery-tooltipster', ['jquery'], 'lib/jquery.tooltipster.js'); +define('socket.io', 'lib/socket.io.js'); +define('bootstrap', ['jquery'], 'lib/bootstrap-amd.js'); +define('mustache', 'lib/mustache.js'); +define('store', 'lib/store.js'); +define('spin', 'lib/spin.js'); +define('key', ['lib/keymaster.js'], function(none){ + return key; +}); +define('mousetrap', 'lib/mousetrap.js'); +define('codemirror', ['lib/codemirror.js'], function(none){ + return CodeMirror; +}); +define('bootbox-origin', ['jquery'], 'lib/bootbox.js'); + +define('bootbox', ['bootbox-origin'], function(none){ + return bootbox; +}); + +define('d3', ['lib/d3-3.3.3.js'], function(none){ + return d3; +}); +define('string-score', 'lib/string_score.js'); + + +require([ + 'jquery', + 'mod/user_avatar', + 'mod/relative_date', + 'mod/code_version', + 'mod/user_following', + 'mod/search_autocomplete', + 'mod/emoji-hint', + 'jquery-tmpl', + 'jquery-timeago', + 'jquery-lazyload', + 'jquery-caret', + 'jquery-atwho', + 'jquery-forms', + 'jquery-unobstrusive', + 'jquery-zclip', + 'jquery-tooltipster', + 'socket.io', + 'bootstrap', + 'mustache', + 'spin', + 'bootbox' +], function($, loadAvatar, updateRelativeDate, codeVersion, userFollowing) { + $(function () { + setTimeout(loadAvatar, 800); + updateRelativeDate(); + codeVersion.init(); + userFollowing.update(); + + if (("standalone" in window.navigator) && window.navigator.standalone) { + // For iOS Apps + $('a').on('click', function(e){ + e.preventDefault(); + var new_location = $(this).attr('href'); + if (new_location != undefined && new_location.substr(0, 1) != '#' && $(this).attr('data-method') == undefined){ + window.location = new_location; + } + }); + } + + }); +}); diff --git a/dist/js/mod/login.js b/dist/js/mod/login.js new file mode 100644 index 0000000..6c7c2e2 --- /dev/null +++ b/dist/js/mod/login.js @@ -0,0 +1,22091 @@ +webpackJsonp([0],[ +/* 0 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + + var _reactDom = __webpack_require__(1); + + var _reactDom2 = _interopRequireDefault(_reactDom); + + var _react = __webpack_require__(147); + + var _react2 = _interopRequireDefault(_react); + + var _signin = __webpack_require__(159); + + var _signin2 = _interopRequireDefault(_signin); + + _reactDom2['default'].render(_react2['default'].createElement(_signin2['default'], null), document.getElementById('main')); + +/***/ }, +/* 1 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + module.exports = __webpack_require__(2); + + +/***/ }, +/* 2 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactDOM + */ + + /* globals __REACT_DEVTOOLS_GLOBAL_HOOK__*/ + + 'use strict'; + + var ReactCurrentOwner = __webpack_require__(4); + var ReactDOMTextComponent = __webpack_require__(5); + var ReactDefaultInjection = __webpack_require__(70); + var ReactInstanceHandles = __webpack_require__(44); + var ReactMount = __webpack_require__(27); + var ReactPerf = __webpack_require__(17); + var ReactReconciler = __webpack_require__(49); + var ReactUpdates = __webpack_require__(53); + var ReactVersion = __webpack_require__(145); + + var findDOMNode = __webpack_require__(90); + var renderSubtreeIntoContainer = __webpack_require__(146); + var warning = __webpack_require__(24); + + ReactDefaultInjection.inject(); + + var render = ReactPerf.measure('React', 'render', ReactMount.render); + + var React = { + findDOMNode: findDOMNode, + render: render, + unmountComponentAtNode: ReactMount.unmountComponentAtNode, + version: ReactVersion, + + /* eslint-disable camelcase */ + unstable_batchedUpdates: ReactUpdates.batchedUpdates, + unstable_renderSubtreeIntoContainer: renderSubtreeIntoContainer + }; + + // Inject the runtime into a devtools global hook regardless of browser. + // Allows for debugging when the hook is injected on the page. + /* eslint-enable camelcase */ + if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.inject === 'function') { + __REACT_DEVTOOLS_GLOBAL_HOOK__.inject({ + CurrentOwner: ReactCurrentOwner, + InstanceHandles: ReactInstanceHandles, + Mount: ReactMount, + Reconciler: ReactReconciler, + TextComponent: ReactDOMTextComponent + }); + } + + if (process.env.NODE_ENV !== 'production') { + var ExecutionEnvironment = __webpack_require__(8); + if (ExecutionEnvironment.canUseDOM && window.top === window.self) { + + // First check if devtools is not installed + if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined') { + // If we're in Chrome or Firefox, provide a download link if not installed. + if (navigator.userAgent.indexOf('Chrome') > -1 && navigator.userAgent.indexOf('Edge') === -1 || navigator.userAgent.indexOf('Firefox') > -1) { + console.debug('Download the React DevTools for a better development experience: ' + 'https://fb.me/react-devtools'); + } + } + + // If we're in IE8, check to see if we are in compatibility mode and provide + // information on preventing compatibility mode + var ieCompatibilityMode = document.documentMode && document.documentMode < 8; + + process.env.NODE_ENV !== 'production' ? warning(!ieCompatibilityMode, 'Internet Explorer is running in compatibility mode; please add the ' + 'following tag to your HTML to prevent this from happening: ' + '<meta http-equiv="X-UA-Compatible" content="IE=edge" />') : undefined; + + var expectedFeatures = [ + // shims + Array.isArray, Array.prototype.every, Array.prototype.forEach, Array.prototype.indexOf, Array.prototype.map, Date.now, Function.prototype.bind, Object.keys, String.prototype.split, String.prototype.trim, + + // shams + Object.create, Object.freeze]; + + for (var i = 0; i < expectedFeatures.length; i++) { + if (!expectedFeatures[i]) { + console.error('One or more ES5 shim/shams expected by React are not available: ' + 'https://fb.me/react-warning-polyfills'); + break; + } + } + } + } + + module.exports = React; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 3 */ +/***/ function(module, exports) { + + // shim for using process in browser + + var process = module.exports = {}; + var queue = []; + var draining = false; + var currentQueue; + var queueIndex = -1; + + function cleanUpNextTick() { + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } + } + + function drainQueue() { + if (draining) { + return; + } + var timeout = setTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + clearTimeout(timeout); + } + + process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + setTimeout(drainQueue, 0); + } + }; + + // v8 likes predictible objects + function Item(fun, array) { + this.fun = fun; + this.array = array; + } + Item.prototype.run = function () { + this.fun.apply(null, this.array); + }; + process.title = 'browser'; + process.browser = true; + process.env = {}; + process.argv = []; + process.version = ''; // empty string to avoid regexp issues + process.versions = {}; + + function noop() {} + + process.on = noop; + process.addListener = noop; + process.once = noop; + process.off = noop; + process.removeListener = noop; + process.removeAllListeners = noop; + process.emit = noop; + + process.binding = function (name) { + throw new Error('process.binding is not supported'); + }; + + process.cwd = function () { return '/' }; + process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); + }; + process.umask = function() { return 0; }; + + +/***/ }, +/* 4 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactCurrentOwner + */ + + 'use strict'; + + /** + * Keeps track of the current owner. + * + * The current owner is the component who should own any components that are + * currently being constructed. + */ + var ReactCurrentOwner = { + + /** + * @internal + * @type {ReactComponent} + */ + current: null + + }; + + module.exports = ReactCurrentOwner; + +/***/ }, +/* 5 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactDOMTextComponent + * @typechecks static-only + */ + + 'use strict'; + + var DOMChildrenOperations = __webpack_require__(6); + var DOMPropertyOperations = __webpack_require__(21); + var ReactComponentBrowserEnvironment = __webpack_require__(25); + var ReactMount = __webpack_require__(27); + + var assign = __webpack_require__(38); + var escapeTextContentForBrowser = __webpack_require__(20); + var setTextContent = __webpack_require__(19); + var validateDOMNesting = __webpack_require__(69); + + /** + * Text nodes violate a couple assumptions that React makes about components: + * + * - When mounting text into the DOM, adjacent text nodes are merged. + * - Text nodes cannot be assigned a React root ID. + * + * This component is used to wrap strings in elements so that they can undergo + * the same reconciliation that is applied to elements. + * + * TODO: Investigate representing React components in the DOM with text nodes. + * + * @class ReactDOMTextComponent + * @extends ReactComponent + * @internal + */ + var ReactDOMTextComponent = function (props) { + // This constructor and its argument is currently used by mocks. + }; + + assign(ReactDOMTextComponent.prototype, { + + /** + * @param {ReactText} text + * @internal + */ + construct: function (text) { + // TODO: This is really a ReactText (ReactNode), not a ReactElement + this._currentElement = text; + this._stringText = '' + text; + + // Properties + this._rootNodeID = null; + this._mountIndex = 0; + }, + + /** + * Creates the markup for this text node. This node is not intended to have + * any features besides containing text content. + * + * @param {string} rootID DOM ID of the root node. + * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction + * @return {string} Markup for this text node. + * @internal + */ + mountComponent: function (rootID, transaction, context) { + if (process.env.NODE_ENV !== 'production') { + if (context[validateDOMNesting.ancestorInfoContextKey]) { + validateDOMNesting('span', null, context[validateDOMNesting.ancestorInfoContextKey]); + } + } + + this._rootNodeID = rootID; + if (transaction.useCreateElement) { + var ownerDocument = context[ReactMount.ownerDocumentContextKey]; + var el = ownerDocument.createElement('span'); + DOMPropertyOperations.setAttributeForID(el, rootID); + // Populate node cache + ReactMount.getID(el); + setTextContent(el, this._stringText); + return el; + } else { + var escapedText = escapeTextContentForBrowser(this._stringText); + + if (transaction.renderToStaticMarkup) { + // Normally we'd wrap this in a `span` for the reasons stated above, but + // since this is a situation where React won't take over (static pages), + // we can simply return the text as it is. + return escapedText; + } + + return '<span ' + DOMPropertyOperations.createMarkupForID(rootID) + '>' + escapedText + '</span>'; + } + }, + + /** + * Updates this component by updating the text content. + * + * @param {ReactText} nextText The next text content + * @param {ReactReconcileTransaction} transaction + * @internal + */ + receiveComponent: function (nextText, transaction) { + if (nextText !== this._currentElement) { + this._currentElement = nextText; + var nextStringText = '' + nextText; + if (nextStringText !== this._stringText) { + // TODO: Save this as pending props and use performUpdateIfNecessary + // and/or updateComponent to do the actual update for consistency with + // other component types? + this._stringText = nextStringText; + var node = ReactMount.getNode(this._rootNodeID); + DOMChildrenOperations.updateTextContent(node, nextStringText); + } + } + }, + + unmountComponent: function () { + ReactComponentBrowserEnvironment.unmountIDFromEnvironment(this._rootNodeID); + } + + }); + + module.exports = ReactDOMTextComponent; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 6 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule DOMChildrenOperations + * @typechecks static-only + */ + + 'use strict'; + + var Danger = __webpack_require__(7); + var ReactMultiChildUpdateTypes = __webpack_require__(15); + var ReactPerf = __webpack_require__(17); + + var setInnerHTML = __webpack_require__(18); + var setTextContent = __webpack_require__(19); + var invariant = __webpack_require__(12); + + /** + * Inserts `childNode` as a child of `parentNode` at the `index`. + * + * @param {DOMElement} parentNode Parent node in which to insert. + * @param {DOMElement} childNode Child node to insert. + * @param {number} index Index at which to insert the child. + * @internal + */ + function insertChildAt(parentNode, childNode, index) { + // By exploiting arrays returning `undefined` for an undefined index, we can + // rely exclusively on `insertBefore(node, null)` instead of also using + // `appendChild(node)`. However, using `undefined` is not allowed by all + // browsers so we must replace it with `null`. + + // fix render order error in safari + // IE8 will throw error when index out of list size. + var beforeChild = index >= parentNode.childNodes.length ? null : parentNode.childNodes.item(index); + + parentNode.insertBefore(childNode, beforeChild); + } + + /** + * Operations for updating with DOM children. + */ + var DOMChildrenOperations = { + + dangerouslyReplaceNodeWithMarkup: Danger.dangerouslyReplaceNodeWithMarkup, + + updateTextContent: setTextContent, + + /** + * Updates a component's children by processing a series of updates. The + * update configurations are each expected to have a `parentNode` property. + * + * @param {array<object>} updates List of update configurations. + * @param {array<string>} markupList List of markup strings. + * @internal + */ + processUpdates: function (updates, markupList) { + var update; + // Mapping from parent IDs to initial child orderings. + var initialChildren = null; + // List of children that will be moved or removed. + var updatedChildren = null; + + for (var i = 0; i < updates.length; i++) { + update = updates[i]; + if (update.type === ReactMultiChildUpdateTypes.MOVE_EXISTING || update.type === ReactMultiChildUpdateTypes.REMOVE_NODE) { + var updatedIndex = update.fromIndex; + var updatedChild = update.parentNode.childNodes[updatedIndex]; + var parentID = update.parentID; + + !updatedChild ? process.env.NODE_ENV !== 'production' ? invariant(false, 'processUpdates(): Unable to find child %s of element. This ' + 'probably means the DOM was unexpectedly mutated (e.g., by the ' + 'browser), usually due to forgetting a <tbody> when using tables, ' + 'nesting tags like <form>, <p>, or <a>, or using non-SVG elements ' + 'in an <svg> parent. Try inspecting the child nodes of the element ' + 'with React ID `%s`.', updatedIndex, parentID) : invariant(false) : undefined; + + initialChildren = initialChildren || {}; + initialChildren[parentID] = initialChildren[parentID] || []; + initialChildren[parentID][updatedIndex] = updatedChild; + + updatedChildren = updatedChildren || []; + updatedChildren.push(updatedChild); + } + } + + var renderedMarkup; + // markupList is either a list of markup or just a list of elements + if (markupList.length && typeof markupList[0] === 'string') { + renderedMarkup = Danger.dangerouslyRenderMarkup(markupList); + } else { + renderedMarkup = markupList; + } + + // Remove updated children first so that `toIndex` is consistent. + if (updatedChildren) { + for (var j = 0; j < updatedChildren.length; j++) { + updatedChildren[j].parentNode.removeChild(updatedChildren[j]); + } + } + + for (var k = 0; k < updates.length; k++) { + update = updates[k]; + switch (update.type) { + case ReactMultiChildUpdateTypes.INSERT_MARKUP: + insertChildAt(update.parentNode, renderedMarkup[update.markupIndex], update.toIndex); + break; + case ReactMultiChildUpdateTypes.MOVE_EXISTING: + insertChildAt(update.parentNode, initialChildren[update.parentID][update.fromIndex], update.toIndex); + break; + case ReactMultiChildUpdateTypes.SET_MARKUP: + setInnerHTML(update.parentNode, update.content); + break; + case ReactMultiChildUpdateTypes.TEXT_CONTENT: + setTextContent(update.parentNode, update.content); + break; + case ReactMultiChildUpdateTypes.REMOVE_NODE: + // Already removed by the for-loop above. + break; + } + } + } + + }; + + ReactPerf.measureMethods(DOMChildrenOperations, 'DOMChildrenOperations', { + updateTextContent: 'updateTextContent' + }); + + module.exports = DOMChildrenOperations; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 7 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule Danger + * @typechecks static-only + */ + + 'use strict'; + + var ExecutionEnvironment = __webpack_require__(8); + + var createNodesFromMarkup = __webpack_require__(9); + var emptyFunction = __webpack_require__(14); + var getMarkupWrap = __webpack_require__(13); + var invariant = __webpack_require__(12); + + var OPEN_TAG_NAME_EXP = /^(<[^ \/>]+)/; + var RESULT_INDEX_ATTR = 'data-danger-index'; + + /** + * Extracts the `nodeName` from a string of markup. + * + * NOTE: Extracting the `nodeName` does not require a regular expression match + * because we make assumptions about React-generated markup (i.e. there are no + * spaces surrounding the opening tag and there is at least one attribute). + * + * @param {string} markup String of markup. + * @return {string} Node name of the supplied markup. + * @see http://jsperf.com/extract-nodename + */ + function getNodeName(markup) { + return markup.substring(1, markup.indexOf(' ')); + } + + var Danger = { + + /** + * Renders markup into an array of nodes. The markup is expected to render + * into a list of root nodes. Also, the length of `resultList` and + * `markupList` should be the same. + * + * @param {array<string>} markupList List of markup strings to render. + * @return {array<DOMElement>} List of rendered nodes. + * @internal + */ + dangerouslyRenderMarkup: function (markupList) { + !ExecutionEnvironment.canUseDOM ? process.env.NODE_ENV !== 'production' ? invariant(false, 'dangerouslyRenderMarkup(...): Cannot render markup in a worker ' + 'thread. Make sure `window` and `document` are available globally ' + 'before requiring React when unit testing or use ' + 'ReactDOMServer.renderToString for server rendering.') : invariant(false) : undefined; + var nodeName; + var markupByNodeName = {}; + // Group markup by `nodeName` if a wrap is necessary, else by '*'. + for (var i = 0; i < markupList.length; i++) { + !markupList[i] ? process.env.NODE_ENV !== 'production' ? invariant(false, 'dangerouslyRenderMarkup(...): Missing markup.') : invariant(false) : undefined; + nodeName = getNodeName(markupList[i]); + nodeName = getMarkupWrap(nodeName) ? nodeName : '*'; + markupByNodeName[nodeName] = markupByNodeName[nodeName] || []; + markupByNodeName[nodeName][i] = markupList[i]; + } + var resultList = []; + var resultListAssignmentCount = 0; + for (nodeName in markupByNodeName) { + if (!markupByNodeName.hasOwnProperty(nodeName)) { + continue; + } + var markupListByNodeName = markupByNodeName[nodeName]; + + // This for-in loop skips the holes of the sparse array. The order of + // iteration should follow the order of assignment, which happens to match + // numerical index order, but we don't rely on that. + var resultIndex; + for (resultIndex in markupListByNodeName) { + if (markupListByNodeName.hasOwnProperty(resultIndex)) { + var markup = markupListByNodeName[resultIndex]; + + // Push the requested markup with an additional RESULT_INDEX_ATTR + // attribute. If the markup does not start with a < character, it + // will be discarded below (with an appropriate console.error). + markupListByNodeName[resultIndex] = markup.replace(OPEN_TAG_NAME_EXP, + // This index will be parsed back out below. + '$1 ' + RESULT_INDEX_ATTR + '="' + resultIndex + '" '); + } + } + + // Render each group of markup with similar wrapping `nodeName`. + var renderNodes = createNodesFromMarkup(markupListByNodeName.join(''), emptyFunction // Do nothing special with <script> tags. + ); + + for (var j = 0; j < renderNodes.length; ++j) { + var renderNode = renderNodes[j]; + if (renderNode.hasAttribute && renderNode.hasAttribute(RESULT_INDEX_ATTR)) { + + resultIndex = +renderNode.getAttribute(RESULT_INDEX_ATTR); + renderNode.removeAttribute(RESULT_INDEX_ATTR); + + !!resultList.hasOwnProperty(resultIndex) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Danger: Assigning to an already-occupied result index.') : invariant(false) : undefined; + + resultList[resultIndex] = renderNode; + + // This should match resultList.length and markupList.length when + // we're done. + resultListAssignmentCount += 1; + } else if (process.env.NODE_ENV !== 'production') { + console.error('Danger: Discarding unexpected node:', renderNode); + } + } + } + + // Although resultList was populated out of order, it should now be a dense + // array. + !(resultListAssignmentCount === resultList.length) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Danger: Did not assign to every index of resultList.') : invariant(false) : undefined; + + !(resultList.length === markupList.length) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Danger: Expected markup to render %s nodes, but rendered %s.', markupList.length, resultList.length) : invariant(false) : undefined; + + return resultList; + }, + + /** + * Replaces a node with a string of markup at its current position within its + * parent. The markup must render into a single root node. + * + * @param {DOMElement} oldChild Child node to replace. + * @param {string} markup Markup to render in place of the child node. + * @internal + */ + dangerouslyReplaceNodeWithMarkup: function (oldChild, markup) { + !ExecutionEnvironment.canUseDOM ? process.env.NODE_ENV !== 'production' ? invariant(false, 'dangerouslyReplaceNodeWithMarkup(...): Cannot render markup in a ' + 'worker thread. Make sure `window` and `document` are available ' + 'globally before requiring React when unit testing or use ' + 'ReactDOMServer.renderToString() for server rendering.') : invariant(false) : undefined; + !markup ? process.env.NODE_ENV !== 'production' ? invariant(false, 'dangerouslyReplaceNodeWithMarkup(...): Missing markup.') : invariant(false) : undefined; + !(oldChild.tagName.toLowerCase() !== 'html') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'dangerouslyReplaceNodeWithMarkup(...): Cannot replace markup of the ' + '<html> node. This is because browser quirks make this unreliable ' + 'and/or slow. If you want to render to the root you must use ' + 'server rendering. See ReactDOMServer.renderToString().') : invariant(false) : undefined; + + var newChild; + if (typeof markup === 'string') { + newChild = createNodesFromMarkup(markup, emptyFunction)[0]; + } else { + newChild = markup; + } + oldChild.parentNode.replaceChild(newChild, oldChild); + } + + }; + + module.exports = Danger; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 8 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ExecutionEnvironment + */ + + 'use strict'; + + var canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement); + + /** + * Simple, lightweight module assisting with the detection and context of + * Worker. Helps avoid circular dependencies and allows code to reason about + * whether or not they are in a Worker, even if they never include the main + * `ReactWorker` dependency. + */ + var ExecutionEnvironment = { + + canUseDOM: canUseDOM, + + canUseWorkers: typeof Worker !== 'undefined', + + canUseEventListeners: canUseDOM && !!(window.addEventListener || window.attachEvent), + + canUseViewport: canUseDOM && !!window.screen, + + isInWorker: !canUseDOM // For now, this is true - might change in the future. + + }; + + module.exports = ExecutionEnvironment; + +/***/ }, +/* 9 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule createNodesFromMarkup + * @typechecks + */ + + /*eslint-disable fb-www/unsafe-html*/ + + 'use strict'; + + var ExecutionEnvironment = __webpack_require__(8); + + var createArrayFromMixed = __webpack_require__(10); + var getMarkupWrap = __webpack_require__(13); + var invariant = __webpack_require__(12); + + /** + * Dummy container used to render all markup. + */ + var dummyNode = ExecutionEnvironment.canUseDOM ? document.createElement('div') : null; + + /** + * Pattern used by `getNodeName`. + */ + var nodeNamePattern = /^\s*<(\w+)/; + + /** + * Extracts the `nodeName` of the first element in a string of markup. + * + * @param {string} markup String of markup. + * @return {?string} Node name of the supplied markup. + */ + function getNodeName(markup) { + var nodeNameMatch = markup.match(nodeNamePattern); + return nodeNameMatch && nodeNameMatch[1].toLowerCase(); + } + + /** + * Creates an array containing the nodes rendered from the supplied markup. The + * optionally supplied `handleScript` function will be invoked once for each + * <script> element that is rendered. If no `handleScript` function is supplied, + * an exception is thrown if any <script> elements are rendered. + * + * @param {string} markup A string of valid HTML markup. + * @param {?function} handleScript Invoked once for each rendered <script>. + * @return {array<DOMElement|DOMTextNode>} An array of rendered nodes. + */ + function createNodesFromMarkup(markup, handleScript) { + var node = dummyNode; + !!!dummyNode ? process.env.NODE_ENV !== 'production' ? invariant(false, 'createNodesFromMarkup dummy not initialized') : invariant(false) : undefined; + var nodeName = getNodeName(markup); + + var wrap = nodeName && getMarkupWrap(nodeName); + if (wrap) { + node.innerHTML = wrap[1] + markup + wrap[2]; + + var wrapDepth = wrap[0]; + while (wrapDepth--) { + node = node.lastChild; + } + } else { + node.innerHTML = markup; + } + + var scripts = node.getElementsByTagName('script'); + if (scripts.length) { + !handleScript ? process.env.NODE_ENV !== 'production' ? invariant(false, 'createNodesFromMarkup(...): Unexpected <script> element rendered.') : invariant(false) : undefined; + createArrayFromMixed(scripts).forEach(handleScript); + } + + var nodes = createArrayFromMixed(node.childNodes); + while (node.lastChild) { + node.removeChild(node.lastChild); + } + return nodes; + } + + module.exports = createNodesFromMarkup; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 10 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule createArrayFromMixed + * @typechecks + */ + + 'use strict'; + + var toArray = __webpack_require__(11); + + /** + * Perform a heuristic test to determine if an object is "array-like". + * + * A monk asked Joshu, a Zen master, "Has a dog Buddha nature?" + * Joshu replied: "Mu." + * + * This function determines if its argument has "array nature": it returns + * true if the argument is an actual array, an `arguments' object, or an + * HTMLCollection (e.g. node.childNodes or node.getElementsByTagName()). + * + * It will return false for other array-like objects like Filelist. + * + * @param {*} obj + * @return {boolean} + */ + function hasArrayNature(obj) { + return( + // not null/false + !!obj && ( + // arrays are objects, NodeLists are functions in Safari + typeof obj == 'object' || typeof obj == 'function') && + // quacks like an array + 'length' in obj && + // not window + !('setInterval' in obj) && + // no DOM node should be considered an array-like + // a 'select' element has 'length' and 'item' properties on IE8 + typeof obj.nodeType != 'number' && ( + // a real array + Array.isArray(obj) || + // arguments + 'callee' in obj || + // HTMLCollection/NodeList + 'item' in obj) + ); + } + + /** + * Ensure that the argument is an array by wrapping it in an array if it is not. + * Creates a copy of the argument if it is already an array. + * + * This is mostly useful idiomatically: + * + * var createArrayFromMixed = require('createArrayFromMixed'); + * + * function takesOneOrMoreThings(things) { + * things = createArrayFromMixed(things); + * ... + * } + * + * This allows you to treat `things' as an array, but accept scalars in the API. + * + * If you need to convert an array-like object, like `arguments`, into an array + * use toArray instead. + * + * @param {*} obj + * @return {array} + */ + function createArrayFromMixed(obj) { + if (!hasArrayNature(obj)) { + return [obj]; + } else if (Array.isArray(obj)) { + return obj.slice(); + } else { + return toArray(obj); + } + } + + module.exports = createArrayFromMixed; + +/***/ }, +/* 11 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule toArray + * @typechecks + */ + + 'use strict'; + + var invariant = __webpack_require__(12); + + /** + * Convert array-like objects to arrays. + * + * This API assumes the caller knows the contents of the data type. For less + * well defined inputs use createArrayFromMixed. + * + * @param {object|function|filelist} obj + * @return {array} + */ + function toArray(obj) { + var length = obj.length; + + // Some browse builtin objects can report typeof 'function' (e.g. NodeList in + // old versions of Safari). + !(!Array.isArray(obj) && (typeof obj === 'object' || typeof obj === 'function')) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'toArray: Array-like object expected') : invariant(false) : undefined; + + !(typeof length === 'number') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'toArray: Object needs a length property') : invariant(false) : undefined; + + !(length === 0 || length - 1 in obj) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'toArray: Object should have keys for indices') : invariant(false) : undefined; + + // Old IE doesn't give collections access to hasOwnProperty. Assume inputs + // without method will throw during the slice call and skip straight to the + // fallback. + if (obj.hasOwnProperty) { + try { + return Array.prototype.slice.call(obj); + } catch (e) { + // IE < 9 does not support Array#slice on collections objects + } + } + + // Fall back to copying key by key. This assumes all keys have a value, + // so will not preserve sparsely populated inputs. + var ret = Array(length); + for (var ii = 0; ii < length; ii++) { + ret[ii] = obj[ii]; + } + return ret; + } + + module.exports = toArray; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 12 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule invariant + */ + + 'use strict'; + + /** + * Use invariant() to assert state which your program assumes to be true. + * + * Provide sprintf-style format (only %s is supported) and arguments + * to provide information about what broke and what you were + * expecting. + * + * The invariant message will be stripped in production, but the invariant + * will remain to ensure logic does not differ in production. + */ + + var invariant = function (condition, format, a, b, c, d, e, f) { + if (process.env.NODE_ENV !== 'production') { + if (format === undefined) { + throw new Error('invariant requires an error message argument'); + } + } + + if (!condition) { + var error; + if (format === undefined) { + error = new Error('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.'); + } else { + var args = [a, b, c, d, e, f]; + var argIndex = 0; + error = new Error('Invariant Violation: ' + format.replace(/%s/g, function () { + return args[argIndex++]; + })); + } + + error.framesToPop = 1; // we don't care about invariant's own frame + throw error; + } + }; + + module.exports = invariant; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 13 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule getMarkupWrap + */ + + /*eslint-disable fb-www/unsafe-html */ + + 'use strict'; + + var ExecutionEnvironment = __webpack_require__(8); + + var invariant = __webpack_require__(12); + + /** + * Dummy container used to detect which wraps are necessary. + */ + var dummyNode = ExecutionEnvironment.canUseDOM ? document.createElement('div') : null; + + /** + * Some browsers cannot use `innerHTML` to render certain elements standalone, + * so we wrap them, render the wrapped nodes, then extract the desired node. + * + * In IE8, certain elements cannot render alone, so wrap all elements ('*'). + */ + + var shouldWrap = {}; + + var selectWrap = [1, '<select multiple="true">', '</select>']; + var tableWrap = [1, '<table>', '</table>']; + var trWrap = [3, '<table><tbody><tr>', '</tr></tbody></table>']; + + var svgWrap = [1, '<svg xmlns="http://www.w3.org/2000/svg">', '</svg>']; + + var markupWrap = { + '*': [1, '?<div>', '</div>'], + + 'area': [1, '<map>', '</map>'], + 'col': [2, '<table><tbody></tbody><colgroup>', '</colgroup></table>'], + 'legend': [1, '<fieldset>', '</fieldset>'], + 'param': [1, '<object>', '</object>'], + 'tr': [2, '<table><tbody>', '</tbody></table>'], + + 'optgroup': selectWrap, + 'option': selectWrap, + + 'caption': tableWrap, + 'colgroup': tableWrap, + 'tbody': tableWrap, + 'tfoot': tableWrap, + 'thead': tableWrap, + + 'td': trWrap, + 'th': trWrap + }; + + // Initialize the SVG elements since we know they'll always need to be wrapped + // consistently. If they are created inside a <div> they will be initialized in + // the wrong namespace (and will not display). + var svgElements = ['circle', 'clipPath', 'defs', 'ellipse', 'g', 'image', 'line', 'linearGradient', 'mask', 'path', 'pattern', 'polygon', 'polyline', 'radialGradient', 'rect', 'stop', 'text', 'tspan']; + svgElements.forEach(function (nodeName) { + markupWrap[nodeName] = svgWrap; + shouldWrap[nodeName] = true; + }); + + /** + * Gets the markup wrap configuration for the supplied `nodeName`. + * + * NOTE: This lazily detects which wraps are necessary for the current browser. + * + * @param {string} nodeName Lowercase `nodeName`. + * @return {?array} Markup wrap configuration, if applicable. + */ + function getMarkupWrap(nodeName) { + !!!dummyNode ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Markup wrapping node not initialized') : invariant(false) : undefined; + if (!markupWrap.hasOwnProperty(nodeName)) { + nodeName = '*'; + } + if (!shouldWrap.hasOwnProperty(nodeName)) { + if (nodeName === '*') { + dummyNode.innerHTML = '<link />'; + } else { + dummyNode.innerHTML = '<' + nodeName + '></' + nodeName + '>'; + } + shouldWrap[nodeName] = !dummyNode.firstChild; + } + return shouldWrap[nodeName] ? markupWrap[nodeName] : null; + } + + module.exports = getMarkupWrap; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 14 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule emptyFunction + */ + + "use strict"; + + function makeEmptyFunction(arg) { + return function () { + return arg; + }; + } + + /** + * This function accepts and discards inputs; it has no side effects. This is + * primarily useful idiomatically for overridable function endpoints which + * always need to be callable, since JS lacks a null-call idiom ala Cocoa. + */ + function emptyFunction() {} + + emptyFunction.thatReturns = makeEmptyFunction; + emptyFunction.thatReturnsFalse = makeEmptyFunction(false); + emptyFunction.thatReturnsTrue = makeEmptyFunction(true); + emptyFunction.thatReturnsNull = makeEmptyFunction(null); + emptyFunction.thatReturnsThis = function () { + return this; + }; + emptyFunction.thatReturnsArgument = function (arg) { + return arg; + }; + + module.exports = emptyFunction; + +/***/ }, +/* 15 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactMultiChildUpdateTypes + */ + + 'use strict'; + + var keyMirror = __webpack_require__(16); + + /** + * When a component's children are updated, a series of update configuration + * objects are created in order to batch and serialize the required changes. + * + * Enumerates all the possible types of update configurations. + * + * @internal + */ + var ReactMultiChildUpdateTypes = keyMirror({ + INSERT_MARKUP: null, + MOVE_EXISTING: null, + REMOVE_NODE: null, + SET_MARKUP: null, + TEXT_CONTENT: null + }); + + module.exports = ReactMultiChildUpdateTypes; + +/***/ }, +/* 16 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule keyMirror + * @typechecks static-only + */ + + 'use strict'; + + var invariant = __webpack_require__(12); + + /** + * Constructs an enumeration with keys equal to their value. + * + * For example: + * + * var COLORS = keyMirror({blue: null, red: null}); + * var myColor = COLORS.blue; + * var isColorValid = !!COLORS[myColor]; + * + * The last line could not be performed if the values of the generated enum were + * not equal to their keys. + * + * Input: {key1: val1, key2: val2} + * Output: {key1: key1, key2: key2} + * + * @param {object} obj + * @return {object} + */ + var keyMirror = function (obj) { + var ret = {}; + var key; + !(obj instanceof Object && !Array.isArray(obj)) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'keyMirror(...): Argument must be an object.') : invariant(false) : undefined; + for (key in obj) { + if (!obj.hasOwnProperty(key)) { + continue; + } + ret[key] = key; + } + return ret; + }; + + module.exports = keyMirror; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 17 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactPerf + * @typechecks static-only + */ + + 'use strict'; + + /** + * ReactPerf is a general AOP system designed to measure performance. This + * module only has the hooks: see ReactDefaultPerf for the analysis tool. + */ + var ReactPerf = { + /** + * Boolean to enable/disable measurement. Set to false by default to prevent + * accidental logging and perf loss. + */ + enableMeasure: false, + + /** + * Holds onto the measure function in use. By default, don't measure + * anything, but we'll override this if we inject a measure function. + */ + storedMeasure: _noMeasure, + + /** + * @param {object} object + * @param {string} objectName + * @param {object<string>} methodNames + */ + measureMethods: function (object, objectName, methodNames) { + if (process.env.NODE_ENV !== 'production') { + for (var key in methodNames) { + if (!methodNames.hasOwnProperty(key)) { + continue; + } + object[key] = ReactPerf.measure(objectName, methodNames[key], object[key]); + } + } + }, + + /** + * Use this to wrap methods you want to measure. Zero overhead in production. + * + * @param {string} objName + * @param {string} fnName + * @param {function} func + * @return {function} + */ + measure: function (objName, fnName, func) { + if (process.env.NODE_ENV !== 'production') { + var measuredFunc = null; + var wrapper = function () { + if (ReactPerf.enableMeasure) { + if (!measuredFunc) { + measuredFunc = ReactPerf.storedMeasure(objName, fnName, func); + } + return measuredFunc.apply(this, arguments); + } + return func.apply(this, arguments); + }; + wrapper.displayName = objName + '_' + fnName; + return wrapper; + } + return func; + }, + + injection: { + /** + * @param {function} measure + */ + injectMeasure: function (measure) { + ReactPerf.storedMeasure = measure; + } + } + }; + + /** + * Simply passes through the measured function, without measuring it. + * + * @param {string} objName + * @param {string} fnName + * @param {function} func + * @return {function} + */ + function _noMeasure(objName, fnName, func) { + return func; + } + + module.exports = ReactPerf; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 18 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule setInnerHTML + */ + + /* globals MSApp */ + + 'use strict'; + + var ExecutionEnvironment = __webpack_require__(8); + + var WHITESPACE_TEST = /^[ \r\n\t\f]/; + var NONVISIBLE_TEST = /<(!--|link|noscript|meta|script|style)[ \r\n\t\f\/>]/; + + /** + * Set the innerHTML property of a node, ensuring that whitespace is preserved + * even in IE8. + * + * @param {DOMElement} node + * @param {string} html + * @internal + */ + var setInnerHTML = function (node, html) { + node.innerHTML = html; + }; + + // Win8 apps: Allow all html to be inserted + if (typeof MSApp !== 'undefined' && MSApp.execUnsafeLocalFunction) { + setInnerHTML = function (node, html) { + MSApp.execUnsafeLocalFunction(function () { + node.innerHTML = html; + }); + }; + } + + if (ExecutionEnvironment.canUseDOM) { + // IE8: When updating a just created node with innerHTML only leading + // whitespace is removed. When updating an existing node with innerHTML + // whitespace in root TextNodes is also collapsed. + // @see quirksmode.org/bugreports/archives/2004/11/innerhtml_and_t.html + + // Feature detection; only IE8 is known to behave improperly like this. + var testElement = document.createElement('div'); + testElement.innerHTML = ' '; + if (testElement.innerHTML === '') { + setInnerHTML = function (node, html) { + // Magic theory: IE8 supposedly differentiates between added and updated + // nodes when processing innerHTML, innerHTML on updated nodes suffers + // from worse whitespace behavior. Re-adding a node like this triggers + // the initial and more favorable whitespace behavior. + // TODO: What to do on a detached node? + if (node.parentNode) { + node.parentNode.replaceChild(node, node); + } + + // We also implement a workaround for non-visible tags disappearing into + // thin air on IE8, this only happens if there is no visible text + // in-front of the non-visible tags. Piggyback on the whitespace fix + // and simply check if any non-visible tags appear in the source. + if (WHITESPACE_TEST.test(html) || html[0] === '<' && NONVISIBLE_TEST.test(html)) { + // Recover leading whitespace by temporarily prepending any character. + // \uFEFF has the potential advantage of being zero-width/invisible. + // UglifyJS drops U+FEFF chars when parsing, so use String.fromCharCode + // in hopes that this is preserved even if "\uFEFF" is transformed to + // the actual Unicode character (by Babel, for example). + // https://github.com/mishoo/UglifyJS2/blob/v2.4.20/lib/parse.js#L216 + node.innerHTML = String.fromCharCode(0xFEFF) + html; + + // deleteData leaves an empty `TextNode` which offsets the index of all + // children. Definitely want to avoid this. + var textNode = node.firstChild; + if (textNode.data.length === 1) { + node.removeChild(textNode); + } else { + textNode.deleteData(0, 1); + } + } else { + node.innerHTML = html; + } + }; + } + } + + module.exports = setInnerHTML; + +/***/ }, +/* 19 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule setTextContent + */ + + 'use strict'; + + var ExecutionEnvironment = __webpack_require__(8); + var escapeTextContentForBrowser = __webpack_require__(20); + var setInnerHTML = __webpack_require__(18); + + /** + * Set the textContent property of a node, ensuring that whitespace is preserved + * even in IE8. innerText is a poor substitute for textContent and, among many + * issues, inserts <br> instead of the literal newline chars. innerHTML behaves + * as it should. + * + * @param {DOMElement} node + * @param {string} text + * @internal + */ + var setTextContent = function (node, text) { + node.textContent = text; + }; + + if (ExecutionEnvironment.canUseDOM) { + if (!('textContent' in document.documentElement)) { + setTextContent = function (node, text) { + setInnerHTML(node, escapeTextContentForBrowser(text)); + }; + } + } + + module.exports = setTextContent; + +/***/ }, +/* 20 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule escapeTextContentForBrowser + */ + + 'use strict'; + + var ESCAPE_LOOKUP = { + '&': '&', + '>': '>', + '<': '<', + '"': '"', + '\'': ''' + }; + + var ESCAPE_REGEX = /[&><"']/g; + + function escaper(match) { + return ESCAPE_LOOKUP[match]; + } + + /** + * Escapes text to prevent scripting attacks. + * + * @param {*} text Text value to escape. + * @return {string} An escaped string. + */ + function escapeTextContentForBrowser(text) { + return ('' + text).replace(ESCAPE_REGEX, escaper); + } + + module.exports = escapeTextContentForBrowser; + +/***/ }, +/* 21 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule DOMPropertyOperations + * @typechecks static-only + */ + + 'use strict'; + + var DOMProperty = __webpack_require__(22); + var ReactPerf = __webpack_require__(17); + + var quoteAttributeValueForBrowser = __webpack_require__(23); + var warning = __webpack_require__(24); + + // Simplified subset + var VALID_ATTRIBUTE_NAME_REGEX = /^[a-zA-Z_][\w\.\-]*$/; + var illegalAttributeNameCache = {}; + var validatedAttributeNameCache = {}; + + function isAttributeNameSafe(attributeName) { + if (validatedAttributeNameCache.hasOwnProperty(attributeName)) { + return true; + } + if (illegalAttributeNameCache.hasOwnProperty(attributeName)) { + return false; + } + if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) { + validatedAttributeNameCache[attributeName] = true; + return true; + } + illegalAttributeNameCache[attributeName] = true; + process.env.NODE_ENV !== 'production' ? warning(false, 'Invalid attribute name: `%s`', attributeName) : undefined; + return false; + } + + function shouldIgnoreValue(propertyInfo, value) { + return value == null || propertyInfo.hasBooleanValue && !value || propertyInfo.hasNumericValue && isNaN(value) || propertyInfo.hasPositiveNumericValue && value < 1 || propertyInfo.hasOverloadedBooleanValue && value === false; + } + + if (process.env.NODE_ENV !== 'production') { + var reactProps = { + children: true, + dangerouslySetInnerHTML: true, + key: true, + ref: true + }; + var warnedProperties = {}; + + var warnUnknownProperty = function (name) { + if (reactProps.hasOwnProperty(name) && reactProps[name] || warnedProperties.hasOwnProperty(name) && warnedProperties[name]) { + return; + } + + warnedProperties[name] = true; + var lowerCasedName = name.toLowerCase(); + + // data-* attributes should be lowercase; suggest the lowercase version + var standardName = DOMProperty.isCustomAttribute(lowerCasedName) ? lowerCasedName : DOMProperty.getPossibleStandardName.hasOwnProperty(lowerCasedName) ? DOMProperty.getPossibleStandardName[lowerCasedName] : null; + + // For now, only warn when we have a suggested correction. This prevents + // logging too much when using transferPropsTo. + process.env.NODE_ENV !== 'production' ? warning(standardName == null, 'Unknown DOM property %s. Did you mean %s?', name, standardName) : undefined; + }; + } + + /** + * Operations for dealing with DOM properties. + */ + var DOMPropertyOperations = { + + /** + * Creates markup for the ID property. + * + * @param {string} id Unescaped ID. + * @return {string} Markup string. + */ + createMarkupForID: function (id) { + return DOMProperty.ID_ATTRIBUTE_NAME + '=' + quoteAttributeValueForBrowser(id); + }, + + setAttributeForID: function (node, id) { + node.setAttribute(DOMProperty.ID_ATTRIBUTE_NAME, id); + }, + + /** + * Creates markup for a property. + * + * @param {string} name + * @param {*} value + * @return {?string} Markup string, or null if the property was invalid. + */ + createMarkupForProperty: function (name, value) { + var propertyInfo = DOMProperty.properties.hasOwnProperty(name) ? DOMProperty.properties[name] : null; + if (propertyInfo) { + if (shouldIgnoreValue(propertyInfo, value)) { + return ''; + } + var attributeName = propertyInfo.attributeName; + if (propertyInfo.hasBooleanValue || propertyInfo.hasOverloadedBooleanValue && value === true) { + return attributeName + '=""'; + } + return attributeName + '=' + quoteAttributeValueForBrowser(value); + } else if (DOMProperty.isCustomAttribute(name)) { + if (value == null) { + return ''; + } + return name + '=' + quoteAttributeValueForBrowser(value); + } else if (process.env.NODE_ENV !== 'production') { + warnUnknownProperty(name); + } + return null; + }, + + /** + * Creates markup for a custom property. + * + * @param {string} name + * @param {*} value + * @return {string} Markup string, or empty string if the property was invalid. + */ + createMarkupForCustomAttribute: function (name, value) { + if (!isAttributeNameSafe(name) || value == null) { + return ''; + } + return name + '=' + quoteAttributeValueForBrowser(value); + }, + + /** + * Sets the value for a property on a node. + * + * @param {DOMElement} node + * @param {string} name + * @param {*} value + */ + setValueForProperty: function (node, name, value) { + var propertyInfo = DOMProperty.properties.hasOwnProperty(name) ? DOMProperty.properties[name] : null; + if (propertyInfo) { + var mutationMethod = propertyInfo.mutationMethod; + if (mutationMethod) { + mutationMethod(node, value); + } else if (shouldIgnoreValue(propertyInfo, value)) { + this.deleteValueForProperty(node, name); + } else if (propertyInfo.mustUseAttribute) { + var attributeName = propertyInfo.attributeName; + var namespace = propertyInfo.attributeNamespace; + // `setAttribute` with objects becomes only `[object]` in IE8/9, + // ('' + value) makes it output the correct toString()-value. + if (namespace) { + node.setAttributeNS(namespace, attributeName, '' + value); + } else if (propertyInfo.hasBooleanValue || propertyInfo.hasOverloadedBooleanValue && value === true) { + node.setAttribute(attributeName, ''); + } else { + node.setAttribute(attributeName, '' + value); + } + } else { + var propName = propertyInfo.propertyName; + // Must explicitly cast values for HAS_SIDE_EFFECTS-properties to the + // property type before comparing; only `value` does and is string. + if (!propertyInfo.hasSideEffects || '' + node[propName] !== '' + value) { + // Contrary to `setAttribute`, object properties are properly + // `toString`ed by IE8/9. + node[propName] = value; + } + } + } else if (DOMProperty.isCustomAttribute(name)) { + DOMPropertyOperations.setValueForAttribute(node, name, value); + } else if (process.env.NODE_ENV !== 'production') { + warnUnknownProperty(name); + } + }, + + setValueForAttribute: function (node, name, value) { + if (!isAttributeNameSafe(name)) { + return; + } + if (value == null) { + node.removeAttribute(name); + } else { + node.setAttribute(name, '' + value); + } + }, + + /** + * Deletes the value for a property on a node. + * + * @param {DOMElement} node + * @param {string} name + */ + deleteValueForProperty: function (node, name) { + var propertyInfo = DOMProperty.properties.hasOwnProperty(name) ? DOMProperty.properties[name] : null; + if (propertyInfo) { + var mutationMethod = propertyInfo.mutationMethod; + if (mutationMethod) { + mutationMethod(node, undefined); + } else if (propertyInfo.mustUseAttribute) { + node.removeAttribute(propertyInfo.attributeName); + } else { + var propName = propertyInfo.propertyName; + var defaultValue = DOMProperty.getDefaultValueForProperty(node.nodeName, propName); + if (!propertyInfo.hasSideEffects || '' + node[propName] !== defaultValue) { + node[propName] = defaultValue; + } + } + } else if (DOMProperty.isCustomAttribute(name)) { + node.removeAttribute(name); + } else if (process.env.NODE_ENV !== 'production') { + warnUnknownProperty(name); + } + } + + }; + + ReactPerf.measureMethods(DOMPropertyOperations, 'DOMPropertyOperations', { + setValueForProperty: 'setValueForProperty', + setValueForAttribute: 'setValueForAttribute', + deleteValueForProperty: 'deleteValueForProperty' + }); + + module.exports = DOMPropertyOperations; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 22 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule DOMProperty + * @typechecks static-only + */ + + 'use strict'; + + var invariant = __webpack_require__(12); + + function checkMask(value, bitmask) { + return (value & bitmask) === bitmask; + } + + var DOMPropertyInjection = { + /** + * Mapping from normalized, camelcased property names to a configuration that + * specifies how the associated DOM property should be accessed or rendered. + */ + MUST_USE_ATTRIBUTE: 0x1, + MUST_USE_PROPERTY: 0x2, + HAS_SIDE_EFFECTS: 0x4, + HAS_BOOLEAN_VALUE: 0x8, + HAS_NUMERIC_VALUE: 0x10, + HAS_POSITIVE_NUMERIC_VALUE: 0x20 | 0x10, + HAS_OVERLOADED_BOOLEAN_VALUE: 0x40, + + /** + * Inject some specialized knowledge about the DOM. This takes a config object + * with the following properties: + * + * isCustomAttribute: function that given an attribute name will return true + * if it can be inserted into the DOM verbatim. Useful for data-* or aria-* + * attributes where it's impossible to enumerate all of the possible + * attribute names, + * + * Properties: object mapping DOM property name to one of the + * DOMPropertyInjection constants or null. If your attribute isn't in here, + * it won't get written to the DOM. + * + * DOMAttributeNames: object mapping React attribute name to the DOM + * attribute name. Attribute names not specified use the **lowercase** + * normalized name. + * + * DOMAttributeNamespaces: object mapping React attribute name to the DOM + * attribute namespace URL. (Attribute names not specified use no namespace.) + * + * DOMPropertyNames: similar to DOMAttributeNames but for DOM properties. + * Property names not specified use the normalized name. + * + * DOMMutationMethods: Properties that require special mutation methods. If + * `value` is undefined, the mutation method should unset the property. + * + * @param {object} domPropertyConfig the config as described above. + */ + injectDOMPropertyConfig: function (domPropertyConfig) { + var Injection = DOMPropertyInjection; + var Properties = domPropertyConfig.Properties || {}; + var DOMAttributeNamespaces = domPropertyConfig.DOMAttributeNamespaces || {}; + var DOMAttributeNames = domPropertyConfig.DOMAttributeNames || {}; + var DOMPropertyNames = domPropertyConfig.DOMPropertyNames || {}; + var DOMMutationMethods = domPropertyConfig.DOMMutationMethods || {}; + + if (domPropertyConfig.isCustomAttribute) { + DOMProperty._isCustomAttributeFunctions.push(domPropertyConfig.isCustomAttribute); + } + + for (var propName in Properties) { + !!DOMProperty.properties.hasOwnProperty(propName) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'injectDOMPropertyConfig(...): You\'re trying to inject DOM property ' + '\'%s\' which has already been injected. You may be accidentally ' + 'injecting the same DOM property config twice, or you may be ' + 'injecting two configs that have conflicting property names.', propName) : invariant(false) : undefined; + + var lowerCased = propName.toLowerCase(); + var propConfig = Properties[propName]; + + var propertyInfo = { + attributeName: lowerCased, + attributeNamespace: null, + propertyName: propName, + mutationMethod: null, + + mustUseAttribute: checkMask(propConfig, Injection.MUST_USE_ATTRIBUTE), + mustUseProperty: checkMask(propConfig, Injection.MUST_USE_PROPERTY), + hasSideEffects: checkMask(propConfig, Injection.HAS_SIDE_EFFECTS), + hasBooleanValue: checkMask(propConfig, Injection.HAS_BOOLEAN_VALUE), + hasNumericValue: checkMask(propConfig, Injection.HAS_NUMERIC_VALUE), + hasPositiveNumericValue: checkMask(propConfig, Injection.HAS_POSITIVE_NUMERIC_VALUE), + hasOverloadedBooleanValue: checkMask(propConfig, Injection.HAS_OVERLOADED_BOOLEAN_VALUE) + }; + + !(!propertyInfo.mustUseAttribute || !propertyInfo.mustUseProperty) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'DOMProperty: Cannot require using both attribute and property: %s', propName) : invariant(false) : undefined; + !(propertyInfo.mustUseProperty || !propertyInfo.hasSideEffects) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'DOMProperty: Properties that have side effects must use property: %s', propName) : invariant(false) : undefined; + !(propertyInfo.hasBooleanValue + propertyInfo.hasNumericValue + propertyInfo.hasOverloadedBooleanValue <= 1) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'DOMProperty: Value can be one of boolean, overloaded boolean, or ' + 'numeric value, but not a combination: %s', propName) : invariant(false) : undefined; + + if (process.env.NODE_ENV !== 'production') { + DOMProperty.getPossibleStandardName[lowerCased] = propName; + } + + if (DOMAttributeNames.hasOwnProperty(propName)) { + var attributeName = DOMAttributeNames[propName]; + propertyInfo.attributeName = attributeName; + if (process.env.NODE_ENV !== 'production') { + DOMProperty.getPossibleStandardName[attributeName] = propName; + } + } + + if (DOMAttributeNamespaces.hasOwnProperty(propName)) { + propertyInfo.attributeNamespace = DOMAttributeNamespaces[propName]; + } + + if (DOMPropertyNames.hasOwnProperty(propName)) { + propertyInfo.propertyName = DOMPropertyNames[propName]; + } + + if (DOMMutationMethods.hasOwnProperty(propName)) { + propertyInfo.mutationMethod = DOMMutationMethods[propName]; + } + + DOMProperty.properties[propName] = propertyInfo; + } + } + }; + var defaultValueCache = {}; + + /** + * DOMProperty exports lookup objects that can be used like functions: + * + * > DOMProperty.isValid['id'] + * true + * > DOMProperty.isValid['foobar'] + * undefined + * + * Although this may be confusing, it performs better in general. + * + * @see http://jsperf.com/key-exists + * @see http://jsperf.com/key-missing + */ + var DOMProperty = { + + ID_ATTRIBUTE_NAME: 'data-reactid', + + /** + * Map from property "standard name" to an object with info about how to set + * the property in the DOM. Each object contains: + * + * attributeName: + * Used when rendering markup or with `*Attribute()`. + * attributeNamespace + * propertyName: + * Used on DOM node instances. (This includes properties that mutate due to + * external factors.) + * mutationMethod: + * If non-null, used instead of the property or `setAttribute()` after + * initial render. + * mustUseAttribute: + * Whether the property must be accessed and mutated using `*Attribute()`. + * (This includes anything that fails `<propName> in <element>`.) + * mustUseProperty: + * Whether the property must be accessed and mutated as an object property. + * hasSideEffects: + * Whether or not setting a value causes side effects such as triggering + * resources to be loaded or text selection changes. If true, we read from + * the DOM before updating to ensure that the value is only set if it has + * changed. + * hasBooleanValue: + * Whether the property should be removed when set to a falsey value. + * hasNumericValue: + * Whether the property must be numeric or parse as a numeric and should be + * removed when set to a falsey value. + * hasPositiveNumericValue: + * Whether the property must be positive numeric or parse as a positive + * numeric and should be removed when set to a falsey value. + * hasOverloadedBooleanValue: + * Whether the property can be used as a flag as well as with a value. + * Removed when strictly equal to false; present without a value when + * strictly equal to true; present with a value otherwise. + */ + properties: {}, + + /** + * Mapping from lowercase property names to the properly cased version, used + * to warn in the case of missing properties. Available only in __DEV__. + * @type {Object} + */ + getPossibleStandardName: process.env.NODE_ENV !== 'production' ? {} : null, + + /** + * All of the isCustomAttribute() functions that have been injected. + */ + _isCustomAttributeFunctions: [], + + /** + * Checks whether a property name is a custom attribute. + * @method + */ + isCustomAttribute: function (attributeName) { + for (var i = 0; i < DOMProperty._isCustomAttributeFunctions.length; i++) { + var isCustomAttributeFn = DOMProperty._isCustomAttributeFunctions[i]; + if (isCustomAttributeFn(attributeName)) { + return true; + } + } + return false; + }, + + /** + * Returns the default property value for a DOM property (i.e., not an + * attribute). Most default values are '' or false, but not all. Worse yet, + * some (in particular, `type`) vary depending on the type of element. + * + * TODO: Is it better to grab all the possible properties when creating an + * element to avoid having to create the same element twice? + */ + getDefaultValueForProperty: function (nodeName, prop) { + var nodeDefaults = defaultValueCache[nodeName]; + var testElement; + if (!nodeDefaults) { + defaultValueCache[nodeName] = nodeDefaults = {}; + } + if (!(prop in nodeDefaults)) { + testElement = document.createElement(nodeName); + nodeDefaults[prop] = testElement[prop]; + } + return nodeDefaults[prop]; + }, + + injection: DOMPropertyInjection + }; + + module.exports = DOMProperty; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 23 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule quoteAttributeValueForBrowser + */ + + 'use strict'; + + var escapeTextContentForBrowser = __webpack_require__(20); + + /** + * Escapes attribute value to prevent scripting attacks. + * + * @param {*} value Value to escape. + * @return {string} An escaped string. + */ + function quoteAttributeValueForBrowser(value) { + return '"' + escapeTextContentForBrowser(value) + '"'; + } + + module.exports = quoteAttributeValueForBrowser; + +/***/ }, +/* 24 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2014-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule warning + */ + + 'use strict'; + + var emptyFunction = __webpack_require__(14); + + /** + * Similar to invariant but only logs a warning if the condition is not met. + * This can be used to log issues in development environments in critical + * paths. Removing the logging code for production environments will keep the + * same logic and follow the same code paths. + */ + + var warning = emptyFunction; + + if (process.env.NODE_ENV !== 'production') { + warning = function (condition, format) { + for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { + args[_key - 2] = arguments[_key]; + } + + if (format === undefined) { + throw new Error('`warning(condition, format, ...args)` requires a warning ' + 'message argument'); + } + + if (format.indexOf('Failed Composite propType: ') === 0) { + return; // Ignore CompositeComponent proptype check. + } + + if (!condition) { + var argIndex = 0; + var message = 'Warning: ' + format.replace(/%s/g, function () { + return args[argIndex++]; + }); + if (typeof console !== 'undefined') { + console.error(message); + } + try { + // --- Welcome to debugging React --- + // This error was thrown as a convenience so that you can use this stack + // to find the callsite that caused this warning to fire. + throw new Error(message); + } catch (x) {} + } + }; + } + + module.exports = warning; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 25 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactComponentBrowserEnvironment + */ + + 'use strict'; + + var ReactDOMIDOperations = __webpack_require__(26); + var ReactMount = __webpack_require__(27); + + /** + * Abstracts away all functionality of the reconciler that requires knowledge of + * the browser context. TODO: These callers should be refactored to avoid the + * need for this injection. + */ + var ReactComponentBrowserEnvironment = { + + processChildrenUpdates: ReactDOMIDOperations.dangerouslyProcessChildrenUpdates, + + replaceNodeWithMarkupByID: ReactDOMIDOperations.dangerouslyReplaceNodeWithMarkupByID, + + /** + * If a particular environment requires that some resources be cleaned up, + * specify this in the injected Mixin. In the DOM, we would likely want to + * purge any cached node ID lookups. + * + * @private + */ + unmountIDFromEnvironment: function (rootNodeID) { + ReactMount.purgeID(rootNodeID); + } + + }; + + module.exports = ReactComponentBrowserEnvironment; + +/***/ }, +/* 26 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactDOMIDOperations + * @typechecks static-only + */ + + 'use strict'; + + var DOMChildrenOperations = __webpack_require__(6); + var DOMPropertyOperations = __webpack_require__(21); + var ReactMount = __webpack_require__(27); + var ReactPerf = __webpack_require__(17); + + var invariant = __webpack_require__(12); + + /** + * Errors for properties that should not be updated with `updatePropertyByID()`. + * + * @type {object} + * @private + */ + var INVALID_PROPERTY_ERRORS = { + dangerouslySetInnerHTML: '`dangerouslySetInnerHTML` must be set using `updateInnerHTMLByID()`.', + style: '`style` must be set using `updateStylesByID()`.' + }; + + /** + * Operations used to process updates to DOM nodes. + */ + var ReactDOMIDOperations = { + + /** + * Updates a DOM node with new property values. This should only be used to + * update DOM properties in `DOMProperty`. + * + * @param {string} id ID of the node to update. + * @param {string} name A valid property name, see `DOMProperty`. + * @param {*} value New value of the property. + * @internal + */ + updatePropertyByID: function (id, name, value) { + var node = ReactMount.getNode(id); + !!INVALID_PROPERTY_ERRORS.hasOwnProperty(name) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'updatePropertyByID(...): %s', INVALID_PROPERTY_ERRORS[name]) : invariant(false) : undefined; + + // If we're updating to null or undefined, we should remove the property + // from the DOM node instead of inadvertantly setting to a string. This + // brings us in line with the same behavior we have on initial render. + if (value != null) { + DOMPropertyOperations.setValueForProperty(node, name, value); + } else { + DOMPropertyOperations.deleteValueForProperty(node, name); + } + }, + + /** + * Replaces a DOM node that exists in the document with markup. + * + * @param {string} id ID of child to be replaced. + * @param {string} markup Dangerous markup to inject in place of child. + * @internal + * @see {Danger.dangerouslyReplaceNodeWithMarkup} + */ + dangerouslyReplaceNodeWithMarkupByID: function (id, markup) { + var node = ReactMount.getNode(id); + DOMChildrenOperations.dangerouslyReplaceNodeWithMarkup(node, markup); + }, + + /** + * Updates a component's children by processing a series of updates. + * + * @param {array<object>} updates List of update configurations. + * @param {array<string>} markup List of markup strings. + * @internal + */ + dangerouslyProcessChildrenUpdates: function (updates, markup) { + for (var i = 0; i < updates.length; i++) { + updates[i].parentNode = ReactMount.getNode(updates[i].parentID); + } + DOMChildrenOperations.processUpdates(updates, markup); + } + }; + + ReactPerf.measureMethods(ReactDOMIDOperations, 'ReactDOMIDOperations', { + dangerouslyReplaceNodeWithMarkupByID: 'dangerouslyReplaceNodeWithMarkupByID', + dangerouslyProcessChildrenUpdates: 'dangerouslyProcessChildrenUpdates' + }); + + module.exports = ReactDOMIDOperations; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 27 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactMount + */ + + 'use strict'; + + var DOMProperty = __webpack_require__(22); + var ReactBrowserEventEmitter = __webpack_require__(28); + var ReactCurrentOwner = __webpack_require__(4); + var ReactDOMFeatureFlags = __webpack_require__(40); + var ReactElement = __webpack_require__(41); + var ReactEmptyComponentRegistry = __webpack_require__(43); + var ReactInstanceHandles = __webpack_require__(44); + var ReactInstanceMap = __webpack_require__(46); + var ReactMarkupChecksum = __webpack_require__(47); + var ReactPerf = __webpack_require__(17); + var ReactReconciler = __webpack_require__(49); + var ReactUpdateQueue = __webpack_require__(52); + var ReactUpdates = __webpack_require__(53); + + var assign = __webpack_require__(38); + var emptyObject = __webpack_require__(57); + var containsNode = __webpack_require__(58); + var instantiateReactComponent = __webpack_require__(61); + var invariant = __webpack_require__(12); + var setInnerHTML = __webpack_require__(18); + var shouldUpdateReactComponent = __webpack_require__(66); + var validateDOMNesting = __webpack_require__(69); + var warning = __webpack_require__(24); + + var ATTR_NAME = DOMProperty.ID_ATTRIBUTE_NAME; + var nodeCache = {}; + + var ELEMENT_NODE_TYPE = 1; + var DOC_NODE_TYPE = 9; + var DOCUMENT_FRAGMENT_NODE_TYPE = 11; + + var ownerDocumentContextKey = '__ReactMount_ownerDocument$' + Math.random().toString(36).slice(2); + + /** Mapping from reactRootID to React component instance. */ + var instancesByReactRootID = {}; + + /** Mapping from reactRootID to `container` nodes. */ + var containersByReactRootID = {}; + + if (process.env.NODE_ENV !== 'production') { + /** __DEV__-only mapping from reactRootID to root elements. */ + var rootElementsByReactRootID = {}; + } + + // Used to store breadth-first search state in findComponentRoot. + var findComponentRootReusableArray = []; + + /** + * Finds the index of the first character + * that's not common between the two given strings. + * + * @return {number} the index of the character where the strings diverge + */ + function firstDifferenceIndex(string1, string2) { + var minLen = Math.min(string1.length, string2.length); + for (var i = 0; i < minLen; i++) { + if (string1.charAt(i) !== string2.charAt(i)) { + return i; + } + } + return string1.length === string2.length ? -1 : minLen; + } + + /** + * @param {DOMElement|DOMDocument} container DOM element that may contain + * a React component + * @return {?*} DOM element that may have the reactRoot ID, or null. + */ + function getReactRootElementInContainer(container) { + if (!container) { + return null; + } + + if (container.nodeType === DOC_NODE_TYPE) { + return container.documentElement; + } else { + return container.firstChild; + } + } + + /** + * @param {DOMElement} container DOM element that may contain a React component. + * @return {?string} A "reactRoot" ID, if a React component is rendered. + */ + function getReactRootID(container) { + var rootElement = getReactRootElementInContainer(container); + return rootElement && ReactMount.getID(rootElement); + } + + /** + * Accessing node[ATTR_NAME] or calling getAttribute(ATTR_NAME) on a form + * element can return its control whose name or ID equals ATTR_NAME. All + * DOM nodes support `getAttributeNode` but this can also get called on + * other objects so just return '' if we're given something other than a + * DOM node (such as window). + * + * @param {?DOMElement|DOMWindow|DOMDocument|DOMTextNode} node DOM node. + * @return {string} ID of the supplied `domNode`. + */ + function getID(node) { + var id = internalGetID(node); + if (id) { + if (nodeCache.hasOwnProperty(id)) { + var cached = nodeCache[id]; + if (cached !== node) { + !!isValid(cached, id) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactMount: Two valid but unequal nodes with the same `%s`: %s', ATTR_NAME, id) : invariant(false) : undefined; + + nodeCache[id] = node; + } + } else { + nodeCache[id] = node; + } + } + + return id; + } + + function internalGetID(node) { + // If node is something like a window, document, or text node, none of + // which support attributes or a .getAttribute method, gracefully return + // the empty string, as if the attribute were missing. + return node && node.getAttribute && node.getAttribute(ATTR_NAME) || ''; + } + + /** + * Sets the React-specific ID of the given node. + * + * @param {DOMElement} node The DOM node whose ID will be set. + * @param {string} id The value of the ID attribute. + */ + function setID(node, id) { + var oldID = internalGetID(node); + if (oldID !== id) { + delete nodeCache[oldID]; + } + node.setAttribute(ATTR_NAME, id); + nodeCache[id] = node; + } + + /** + * Finds the node with the supplied React-generated DOM ID. + * + * @param {string} id A React-generated DOM ID. + * @return {DOMElement} DOM node with the suppled `id`. + * @internal + */ + function getNode(id) { + if (!nodeCache.hasOwnProperty(id) || !isValid(nodeCache[id], id)) { + nodeCache[id] = ReactMount.findReactNodeByID(id); + } + return nodeCache[id]; + } + + /** + * Finds the node with the supplied public React instance. + * + * @param {*} instance A public React instance. + * @return {?DOMElement} DOM node with the suppled `id`. + * @internal + */ + function getNodeFromInstance(instance) { + var id = ReactInstanceMap.get(instance)._rootNodeID; + if (ReactEmptyComponentRegistry.isNullComponentID(id)) { + return null; + } + if (!nodeCache.hasOwnProperty(id) || !isValid(nodeCache[id], id)) { + nodeCache[id] = ReactMount.findReactNodeByID(id); + } + return nodeCache[id]; + } + + /** + * A node is "valid" if it is contained by a currently mounted container. + * + * This means that the node does not have to be contained by a document in + * order to be considered valid. + * + * @param {?DOMElement} node The candidate DOM node. + * @param {string} id The expected ID of the node. + * @return {boolean} Whether the node is contained by a mounted container. + */ + function isValid(node, id) { + if (node) { + !(internalGetID(node) === id) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactMount: Unexpected modification of `%s`', ATTR_NAME) : invariant(false) : undefined; + + var container = ReactMount.findReactContainerForID(id); + if (container && containsNode(container, node)) { + return true; + } + } + + return false; + } + + /** + * Causes the cache to forget about one React-specific ID. + * + * @param {string} id The ID to forget. + */ + function purgeID(id) { + delete nodeCache[id]; + } + + var deepestNodeSoFar = null; + function findDeepestCachedAncestorImpl(ancestorID) { + var ancestor = nodeCache[ancestorID]; + if (ancestor && isValid(ancestor, ancestorID)) { + deepestNodeSoFar = ancestor; + } else { + // This node isn't populated in the cache, so presumably none of its + // descendants are. Break out of the loop. + return false; + } + } + + /** + * Return the deepest cached node whose ID is a prefix of `targetID`. + */ + function findDeepestCachedAncestor(targetID) { + deepestNodeSoFar = null; + ReactInstanceHandles.traverseAncestors(targetID, findDeepestCachedAncestorImpl); + + var foundNode = deepestNodeSoFar; + deepestNodeSoFar = null; + return foundNode; + } + + /** + * Mounts this component and inserts it into the DOM. + * + * @param {ReactComponent} componentInstance The instance to mount. + * @param {string} rootID DOM ID of the root node. + * @param {DOMElement} container DOM element to mount into. + * @param {ReactReconcileTransaction} transaction + * @param {boolean} shouldReuseMarkup If true, do not insert markup + */ + function mountComponentIntoNode(componentInstance, rootID, container, transaction, shouldReuseMarkup, context) { + if (ReactDOMFeatureFlags.useCreateElement) { + context = assign({}, context); + if (container.nodeType === DOC_NODE_TYPE) { + context[ownerDocumentContextKey] = container; + } else { + context[ownerDocumentContextKey] = container.ownerDocument; + } + } + if (process.env.NODE_ENV !== 'production') { + if (context === emptyObject) { + context = {}; + } + var tag = container.nodeName.toLowerCase(); + context[validateDOMNesting.ancestorInfoContextKey] = validateDOMNesting.updatedAncestorInfo(null, tag, null); + } + var markup = ReactReconciler.mountComponent(componentInstance, rootID, transaction, context); + componentInstance._renderedComponent._topLevelWrapper = componentInstance; + ReactMount._mountImageIntoNode(markup, container, shouldReuseMarkup, transaction); + } + + /** + * Batched mount. + * + * @param {ReactComponent} componentInstance The instance to mount. + * @param {string} rootID DOM ID of the root node. + * @param {DOMElement} container DOM element to mount into. + * @param {boolean} shouldReuseMarkup If true, do not insert markup + */ + function batchedMountComponentIntoNode(componentInstance, rootID, container, shouldReuseMarkup, context) { + var transaction = ReactUpdates.ReactReconcileTransaction.getPooled( + /* forceHTML */shouldReuseMarkup); + transaction.perform(mountComponentIntoNode, null, componentInstance, rootID, container, transaction, shouldReuseMarkup, context); + ReactUpdates.ReactReconcileTransaction.release(transaction); + } + + /** + * Unmounts a component and removes it from the DOM. + * + * @param {ReactComponent} instance React component instance. + * @param {DOMElement} container DOM element to unmount from. + * @final + * @internal + * @see {ReactMount.unmountComponentAtNode} + */ + function unmountComponentFromNode(instance, container) { + ReactReconciler.unmountComponent(instance); + + if (container.nodeType === DOC_NODE_TYPE) { + container = container.documentElement; + } + + // http://jsperf.com/emptying-a-node + while (container.lastChild) { + container.removeChild(container.lastChild); + } + } + + /** + * True if the supplied DOM node has a direct React-rendered child that is + * not a React root element. Useful for warning in `render`, + * `unmountComponentAtNode`, etc. + * + * @param {?DOMElement} node The candidate DOM node. + * @return {boolean} True if the DOM element contains a direct child that was + * rendered by React but is not a root element. + * @internal + */ + function hasNonRootReactChild(node) { + var reactRootID = getReactRootID(node); + return reactRootID ? reactRootID !== ReactInstanceHandles.getReactRootIDFromNodeID(reactRootID) : false; + } + + /** + * Returns the first (deepest) ancestor of a node which is rendered by this copy + * of React. + */ + function findFirstReactDOMImpl(node) { + // This node might be from another React instance, so we make sure not to + // examine the node cache here + for (; node && node.parentNode !== node; node = node.parentNode) { + if (node.nodeType !== 1) { + // Not a DOMElement, therefore not a React component + continue; + } + var nodeID = internalGetID(node); + if (!nodeID) { + continue; + } + var reactRootID = ReactInstanceHandles.getReactRootIDFromNodeID(nodeID); + + // If containersByReactRootID contains the container we find by crawling up + // the tree, we know that this instance of React rendered the node. + // nb. isValid's strategy (with containsNode) does not work because render + // trees may be nested and we don't want a false positive in that case. + var current = node; + var lastID; + do { + lastID = internalGetID(current); + current = current.parentNode; + if (current == null) { + // The passed-in node has been detached from the container it was + // originally rendered into. + return null; + } + } while (lastID !== reactRootID); + + if (current === containersByReactRootID[reactRootID]) { + return node; + } + } + return null; + } + + /** + * Temporary (?) hack so that we can store all top-level pending updates on + * composites instead of having to worry about different types of components + * here. + */ + var TopLevelWrapper = function () {}; + TopLevelWrapper.prototype.isReactComponent = {}; + if (process.env.NODE_ENV !== 'production') { + TopLevelWrapper.displayName = 'TopLevelWrapper'; + } + TopLevelWrapper.prototype.render = function () { + // this.props is actually a ReactElement + return this.props; + }; + + /** + * Mounting is the process of initializing a React component by creating its + * representative DOM elements and inserting them into a supplied `container`. + * Any prior content inside `container` is destroyed in the process. + * + * ReactMount.render( + * component, + * document.getElementById('container') + * ); + * + * <div id="container"> <-- Supplied `container`. + * <div data-reactid=".3"> <-- Rendered reactRoot of React + * // ... component. + * </div> + * </div> + * + * Inside of `container`, the first element rendered is the "reactRoot". + */ + var ReactMount = { + + TopLevelWrapper: TopLevelWrapper, + + /** Exposed for debugging purposes **/ + _instancesByReactRootID: instancesByReactRootID, + + /** + * This is a hook provided to support rendering React components while + * ensuring that the apparent scroll position of its `container` does not + * change. + * + * @param {DOMElement} container The `container` being rendered into. + * @param {function} renderCallback This must be called once to do the render. + */ + scrollMonitor: function (container, renderCallback) { + renderCallback(); + }, + + /** + * Take a component that's already mounted into the DOM and replace its props + * @param {ReactComponent} prevComponent component instance already in the DOM + * @param {ReactElement} nextElement component instance to render + * @param {DOMElement} container container to render into + * @param {?function} callback function triggered on completion + */ + _updateRootComponent: function (prevComponent, nextElement, container, callback) { + ReactMount.scrollMonitor(container, function () { + ReactUpdateQueue.enqueueElementInternal(prevComponent, nextElement); + if (callback) { + ReactUpdateQueue.enqueueCallbackInternal(prevComponent, callback); + } + }); + + if (process.env.NODE_ENV !== 'production') { + // Record the root element in case it later gets transplanted. + rootElementsByReactRootID[getReactRootID(container)] = getReactRootElementInContainer(container); + } + + return prevComponent; + }, + + /** + * Register a component into the instance map and starts scroll value + * monitoring + * @param {ReactComponent} nextComponent component instance to render + * @param {DOMElement} container container to render into + * @return {string} reactRoot ID prefix + */ + _registerComponent: function (nextComponent, container) { + !(container && (container.nodeType === ELEMENT_NODE_TYPE || container.nodeType === DOC_NODE_TYPE || container.nodeType === DOCUMENT_FRAGMENT_NODE_TYPE)) ? process.env.NODE_ENV !== 'production' ? invariant(false, '_registerComponent(...): Target container is not a DOM element.') : invariant(false) : undefined; + + ReactBrowserEventEmitter.ensureScrollValueMonitoring(); + + var reactRootID = ReactMount.registerContainer(container); + instancesByReactRootID[reactRootID] = nextComponent; + return reactRootID; + }, + + /** + * Render a new component into the DOM. + * @param {ReactElement} nextElement element to render + * @param {DOMElement} container container to render into + * @param {boolean} shouldReuseMarkup if we should skip the markup insertion + * @return {ReactComponent} nextComponent + */ + _renderNewRootComponent: function (nextElement, container, shouldReuseMarkup, context) { + // Various parts of our code (such as ReactCompositeComponent's + // _renderValidatedComponent) assume that calls to render aren't nested; + // verify that that's the case. + process.env.NODE_ENV !== 'production' ? warning(ReactCurrentOwner.current == null, '_renderNewRootComponent(): Render methods should be a pure function ' + 'of props and state; triggering nested component updates from ' + 'render is not allowed. If necessary, trigger nested updates in ' + 'componentDidUpdate. Check the render method of %s.', ReactCurrentOwner.current && ReactCurrentOwner.current.getName() || 'ReactCompositeComponent') : undefined; + + var componentInstance = instantiateReactComponent(nextElement, null); + var reactRootID = ReactMount._registerComponent(componentInstance, container); + + // The initial render is synchronous but any updates that happen during + // rendering, in componentWillMount or componentDidMount, will be batched + // according to the current batching strategy. + + ReactUpdates.batchedUpdates(batchedMountComponentIntoNode, componentInstance, reactRootID, container, shouldReuseMarkup, context); + + if (process.env.NODE_ENV !== 'production') { + // Record the root element in case it later gets transplanted. + rootElementsByReactRootID[reactRootID] = getReactRootElementInContainer(container); + } + + return componentInstance; + }, + + /** + * Renders a React component into the DOM in the supplied `container`. + * + * If the React component was previously rendered into `container`, this will + * perform an update on it and only mutate the DOM as necessary to reflect the + * latest React component. + * + * @param {ReactComponent} parentComponent The conceptual parent of this render tree. + * @param {ReactElement} nextElement Component element to render. + * @param {DOMElement} container DOM element to render into. + * @param {?function} callback function triggered on completion + * @return {ReactComponent} Component instance rendered in `container`. + */ + renderSubtreeIntoContainer: function (parentComponent, nextElement, container, callback) { + !(parentComponent != null && parentComponent._reactInternalInstance != null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'parentComponent must be a valid React Component') : invariant(false) : undefined; + return ReactMount._renderSubtreeIntoContainer(parentComponent, nextElement, container, callback); + }, + + _renderSubtreeIntoContainer: function (parentComponent, nextElement, container, callback) { + !ReactElement.isValidElement(nextElement) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactDOM.render(): Invalid component element.%s', typeof nextElement === 'string' ? ' Instead of passing an element string, make sure to instantiate ' + 'it by passing it to React.createElement.' : typeof nextElement === 'function' ? ' Instead of passing a component class, make sure to instantiate ' + 'it by passing it to React.createElement.' : + // Check if it quacks like an element + nextElement != null && nextElement.props !== undefined ? ' This may be caused by unintentionally loading two independent ' + 'copies of React.' : '') : invariant(false) : undefined; + + process.env.NODE_ENV !== 'production' ? warning(!container || !container.tagName || container.tagName.toUpperCase() !== 'BODY', 'render(): Rendering components directly into document.body is ' + 'discouraged, since its children are often manipulated by third-party ' + 'scripts and browser extensions. This may lead to subtle ' + 'reconciliation issues. Try rendering into a container element created ' + 'for your app.') : undefined; + + var nextWrappedElement = new ReactElement(TopLevelWrapper, null, null, null, null, null, nextElement); + + var prevComponent = instancesByReactRootID[getReactRootID(container)]; + + if (prevComponent) { + var prevWrappedElement = prevComponent._currentElement; + var prevElement = prevWrappedElement.props; + if (shouldUpdateReactComponent(prevElement, nextElement)) { + var publicInst = prevComponent._renderedComponent.getPublicInstance(); + var updatedCallback = callback && function () { + callback.call(publicInst); + }; + ReactMount._updateRootComponent(prevComponent, nextWrappedElement, container, updatedCallback); + return publicInst; + } else { + ReactMount.unmountComponentAtNode(container); + } + } + + var reactRootElement = getReactRootElementInContainer(container); + var containerHasReactMarkup = reactRootElement && !!internalGetID(reactRootElement); + var containerHasNonRootReactChild = hasNonRootReactChild(container); + + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(!containerHasNonRootReactChild, 'render(...): Replacing React-rendered children with a new root ' + 'component. If you intended to update the children of this node, ' + 'you should instead have the existing children update their state ' + 'and render the new components instead of calling ReactDOM.render.') : undefined; + + if (!containerHasReactMarkup || reactRootElement.nextSibling) { + var rootElementSibling = reactRootElement; + while (rootElementSibling) { + if (internalGetID(rootElementSibling)) { + process.env.NODE_ENV !== 'production' ? warning(false, 'render(): Target node has markup rendered by React, but there ' + 'are unrelated nodes as well. This is most commonly caused by ' + 'white-space inserted around server-rendered markup.') : undefined; + break; + } + rootElementSibling = rootElementSibling.nextSibling; + } + } + } + + var shouldReuseMarkup = containerHasReactMarkup && !prevComponent && !containerHasNonRootReactChild; + var component = ReactMount._renderNewRootComponent(nextWrappedElement, container, shouldReuseMarkup, parentComponent != null ? parentComponent._reactInternalInstance._processChildContext(parentComponent._reactInternalInstance._context) : emptyObject)._renderedComponent.getPublicInstance(); + if (callback) { + callback.call(component); + } + return component; + }, + + /** + * Renders a React component into the DOM in the supplied `container`. + * + * If the React component was previously rendered into `container`, this will + * perform an update on it and only mutate the DOM as necessary to reflect the + * latest React component. + * + * @param {ReactElement} nextElement Component element to render. + * @param {DOMElement} container DOM element to render into. + * @param {?function} callback function triggered on completion + * @return {ReactComponent} Component instance rendered in `container`. + */ + render: function (nextElement, container, callback) { + return ReactMount._renderSubtreeIntoContainer(null, nextElement, container, callback); + }, + + /** + * Registers a container node into which React components will be rendered. + * This also creates the "reactRoot" ID that will be assigned to the element + * rendered within. + * + * @param {DOMElement} container DOM element to register as a container. + * @return {string} The "reactRoot" ID of elements rendered within. + */ + registerContainer: function (container) { + var reactRootID = getReactRootID(container); + if (reactRootID) { + // If one exists, make sure it is a valid "reactRoot" ID. + reactRootID = ReactInstanceHandles.getReactRootIDFromNodeID(reactRootID); + } + if (!reactRootID) { + // No valid "reactRoot" ID found, create one. + reactRootID = ReactInstanceHandles.createReactRootID(); + } + containersByReactRootID[reactRootID] = container; + return reactRootID; + }, + + /** + * Unmounts and destroys the React component rendered in the `container`. + * + * @param {DOMElement} container DOM element containing a React component. + * @return {boolean} True if a component was found in and unmounted from + * `container` + */ + unmountComponentAtNode: function (container) { + // Various parts of our code (such as ReactCompositeComponent's + // _renderValidatedComponent) assume that calls to render aren't nested; + // verify that that's the case. (Strictly speaking, unmounting won't cause a + // render but we still don't expect to be in a render call here.) + process.env.NODE_ENV !== 'production' ? warning(ReactCurrentOwner.current == null, 'unmountComponentAtNode(): Render methods should be a pure function ' + 'of props and state; triggering nested component updates from render ' + 'is not allowed. If necessary, trigger nested updates in ' + 'componentDidUpdate. Check the render method of %s.', ReactCurrentOwner.current && ReactCurrentOwner.current.getName() || 'ReactCompositeComponent') : undefined; + + !(container && (container.nodeType === ELEMENT_NODE_TYPE || container.nodeType === DOC_NODE_TYPE || container.nodeType === DOCUMENT_FRAGMENT_NODE_TYPE)) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'unmountComponentAtNode(...): Target container is not a DOM element.') : invariant(false) : undefined; + + var reactRootID = getReactRootID(container); + var component = instancesByReactRootID[reactRootID]; + if (!component) { + // Check if the node being unmounted was rendered by React, but isn't a + // root node. + var containerHasNonRootReactChild = hasNonRootReactChild(container); + + // Check if the container itself is a React root node. + var containerID = internalGetID(container); + var isContainerReactRoot = containerID && containerID === ReactInstanceHandles.getReactRootIDFromNodeID(containerID); + + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(!containerHasNonRootReactChild, 'unmountComponentAtNode(): The node you\'re attempting to unmount ' + 'was rendered by React and is not a top-level container. %s', isContainerReactRoot ? 'You may have accidentally passed in a React root node instead ' + 'of its container.' : 'Instead, have the parent component update its state and ' + 'rerender in order to remove this component.') : undefined; + } + + return false; + } + ReactUpdates.batchedUpdates(unmountComponentFromNode, component, container); + delete instancesByReactRootID[reactRootID]; + delete containersByReactRootID[reactRootID]; + if (process.env.NODE_ENV !== 'production') { + delete rootElementsByReactRootID[reactRootID]; + } + return true; + }, + + /** + * Finds the container DOM element that contains React component to which the + * supplied DOM `id` belongs. + * + * @param {string} id The ID of an element rendered by a React component. + * @return {?DOMElement} DOM element that contains the `id`. + */ + findReactContainerForID: function (id) { + var reactRootID = ReactInstanceHandles.getReactRootIDFromNodeID(id); + var container = containersByReactRootID[reactRootID]; + + if (process.env.NODE_ENV !== 'production') { + var rootElement = rootElementsByReactRootID[reactRootID]; + if (rootElement && rootElement.parentNode !== container) { + process.env.NODE_ENV !== 'production' ? warning( + // Call internalGetID here because getID calls isValid which calls + // findReactContainerForID (this function). + internalGetID(rootElement) === reactRootID, 'ReactMount: Root element ID differed from reactRootID.') : undefined; + var containerChild = container.firstChild; + if (containerChild && reactRootID === internalGetID(containerChild)) { + // If the container has a new child with the same ID as the old + // root element, then rootElementsByReactRootID[reactRootID] is + // just stale and needs to be updated. The case that deserves a + // warning is when the container is empty. + rootElementsByReactRootID[reactRootID] = containerChild; + } else { + process.env.NODE_ENV !== 'production' ? warning(false, 'ReactMount: Root element has been removed from its original ' + 'container. New container: %s', rootElement.parentNode) : undefined; + } + } + } + + return container; + }, + + /** + * Finds an element rendered by React with the supplied ID. + * + * @param {string} id ID of a DOM node in the React component. + * @return {DOMElement} Root DOM node of the React component. + */ + findReactNodeByID: function (id) { + var reactRoot = ReactMount.findReactContainerForID(id); + return ReactMount.findComponentRoot(reactRoot, id); + }, + + /** + * Traverses up the ancestors of the supplied node to find a node that is a + * DOM representation of a React component rendered by this copy of React. + * + * @param {*} node + * @return {?DOMEventTarget} + * @internal + */ + getFirstReactDOM: function (node) { + return findFirstReactDOMImpl(node); + }, + + /** + * Finds a node with the supplied `targetID` inside of the supplied + * `ancestorNode`. Exploits the ID naming scheme to perform the search + * quickly. + * + * @param {DOMEventTarget} ancestorNode Search from this root. + * @pararm {string} targetID ID of the DOM representation of the component. + * @return {DOMEventTarget} DOM node with the supplied `targetID`. + * @internal + */ + findComponentRoot: function (ancestorNode, targetID) { + var firstChildren = findComponentRootReusableArray; + var childIndex = 0; + + var deepestAncestor = findDeepestCachedAncestor(targetID) || ancestorNode; + + if (process.env.NODE_ENV !== 'production') { + // This will throw on the next line; give an early warning + process.env.NODE_ENV !== 'production' ? warning(deepestAncestor != null, 'React can\'t find the root component node for data-reactid value ' + '`%s`. If you\'re seeing this message, it probably means that ' + 'you\'ve loaded two copies of React on the page. At this time, only ' + 'a single copy of React can be loaded at a time.', targetID) : undefined; + } + + firstChildren[0] = deepestAncestor.firstChild; + firstChildren.length = 1; + + while (childIndex < firstChildren.length) { + var child = firstChildren[childIndex++]; + var targetChild; + + while (child) { + var childID = ReactMount.getID(child); + if (childID) { + // Even if we find the node we're looking for, we finish looping + // through its siblings to ensure they're cached so that we don't have + // to revisit this node again. Otherwise, we make n^2 calls to getID + // when visiting the many children of a single node in order. + + if (targetID === childID) { + targetChild = child; + } else if (ReactInstanceHandles.isAncestorIDOf(childID, targetID)) { + // If we find a child whose ID is an ancestor of the given ID, + // then we can be sure that we only want to search the subtree + // rooted at this child, so we can throw out the rest of the + // search state. + firstChildren.length = childIndex = 0; + firstChildren.push(child.firstChild); + } + } else { + // If this child had no ID, then there's a chance that it was + // injected automatically by the browser, as when a `<table>` + // element sprouts an extra `<tbody>` child as a side effect of + // `.innerHTML` parsing. Optimistically continue down this + // branch, but not before examining the other siblings. + firstChildren.push(child.firstChild); + } + + child = child.nextSibling; + } + + if (targetChild) { + // Emptying firstChildren/findComponentRootReusableArray is + // not necessary for correctness, but it helps the GC reclaim + // any nodes that were left at the end of the search. + firstChildren.length = 0; + + return targetChild; + } + } + + firstChildren.length = 0; + + true ? process.env.NODE_ENV !== 'production' ? invariant(false, 'findComponentRoot(..., %s): Unable to find element. This probably ' + 'means the DOM was unexpectedly mutated (e.g., by the browser), ' + 'usually due to forgetting a <tbody> when using tables, nesting tags ' + 'like <form>, <p>, or <a>, or using non-SVG elements in an <svg> ' + 'parent. ' + 'Try inspecting the child nodes of the element with React ID `%s`.', targetID, ReactMount.getID(ancestorNode)) : invariant(false) : undefined; + }, + + _mountImageIntoNode: function (markup, container, shouldReuseMarkup, transaction) { + !(container && (container.nodeType === ELEMENT_NODE_TYPE || container.nodeType === DOC_NODE_TYPE || container.nodeType === DOCUMENT_FRAGMENT_NODE_TYPE)) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'mountComponentIntoNode(...): Target container is not valid.') : invariant(false) : undefined; + + if (shouldReuseMarkup) { + var rootElement = getReactRootElementInContainer(container); + if (ReactMarkupChecksum.canReuseMarkup(markup, rootElement)) { + return; + } else { + var checksum = rootElement.getAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME); + rootElement.removeAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME); + + var rootMarkup = rootElement.outerHTML; + rootElement.setAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME, checksum); + + var normalizedMarkup = markup; + if (process.env.NODE_ENV !== 'production') { + // because rootMarkup is retrieved from the DOM, various normalizations + // will have occurred which will not be present in `markup`. Here, + // insert markup into a <div> or <iframe> depending on the container + // type to perform the same normalizations before comparing. + var normalizer; + if (container.nodeType === ELEMENT_NODE_TYPE) { + normalizer = document.createElement('div'); + normalizer.innerHTML = markup; + normalizedMarkup = normalizer.innerHTML; + } else { + normalizer = document.createElement('iframe'); + document.body.appendChild(normalizer); + normalizer.contentDocument.write(markup); + normalizedMarkup = normalizer.contentDocument.documentElement.outerHTML; + document.body.removeChild(normalizer); + } + } + + var diffIndex = firstDifferenceIndex(normalizedMarkup, rootMarkup); + var difference = ' (client) ' + normalizedMarkup.substring(diffIndex - 20, diffIndex + 20) + '\n (server) ' + rootMarkup.substring(diffIndex - 20, diffIndex + 20); + + !(container.nodeType !== DOC_NODE_TYPE) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'You\'re trying to render a component to the document using ' + 'server rendering but the checksum was invalid. This usually ' + 'means you rendered a different component type or props on ' + 'the client from the one on the server, or your render() ' + 'methods are impure. React cannot handle this case due to ' + 'cross-browser quirks by rendering at the document root. You ' + 'should look for environment dependent code in your components ' + 'and ensure the props are the same client and server side:\n%s', difference) : invariant(false) : undefined; + + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(false, 'React attempted to reuse markup in a container but the ' + 'checksum was invalid. This generally means that you are ' + 'using server rendering and the markup generated on the ' + 'server was not what the client was expecting. React injected ' + 'new markup to compensate which works but you have lost many ' + 'of the benefits of server rendering. Instead, figure out ' + 'why the markup being generated is different on the client ' + 'or server:\n%s', difference) : undefined; + } + } + } + + !(container.nodeType !== DOC_NODE_TYPE) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'You\'re trying to render a component to the document but ' + 'you didn\'t use server rendering. We can\'t do this ' + 'without using server rendering due to cross-browser quirks. ' + 'See ReactDOMServer.renderToString() for server rendering.') : invariant(false) : undefined; + + if (transaction.useCreateElement) { + while (container.lastChild) { + container.removeChild(container.lastChild); + } + container.appendChild(markup); + } else { + setInnerHTML(container, markup); + } + }, + + ownerDocumentContextKey: ownerDocumentContextKey, + + /** + * React ID utilities. + */ + + getReactRootID: getReactRootID, + + getID: getID, + + setID: setID, + + getNode: getNode, + + getNodeFromInstance: getNodeFromInstance, + + isValid: isValid, + + purgeID: purgeID + }; + + ReactPerf.measureMethods(ReactMount, 'ReactMount', { + _renderNewRootComponent: '_renderNewRootComponent', + _mountImageIntoNode: '_mountImageIntoNode' + }); + + module.exports = ReactMount; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 28 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactBrowserEventEmitter + * @typechecks static-only + */ + + 'use strict'; + + var EventConstants = __webpack_require__(29); + var EventPluginHub = __webpack_require__(30); + var EventPluginRegistry = __webpack_require__(31); + var ReactEventEmitterMixin = __webpack_require__(36); + var ReactPerf = __webpack_require__(17); + var ViewportMetrics = __webpack_require__(37); + + var assign = __webpack_require__(38); + var isEventSupported = __webpack_require__(39); + + /** + * Summary of `ReactBrowserEventEmitter` event handling: + * + * - Top-level delegation is used to trap most native browser events. This + * may only occur in the main thread and is the responsibility of + * ReactEventListener, which is injected and can therefore support pluggable + * event sources. This is the only work that occurs in the main thread. + * + * - We normalize and de-duplicate events to account for browser quirks. This + * may be done in the worker thread. + * + * - Forward these native events (with the associated top-level type used to + * trap it) to `EventPluginHub`, which in turn will ask plugins if they want + * to extract any synthetic events. + * + * - The `EventPluginHub` will then process each event by annotating them with + * "dispatches", a sequence of listeners and IDs that care about that event. + * + * - The `EventPluginHub` then dispatches the events. + * + * Overview of React and the event system: + * + * +------------+ . + * | DOM | . + * +------------+ . + * | . + * v . + * +------------+ . + * | ReactEvent | . + * | Listener | . + * +------------+ . +-----------+ + * | . +--------+|SimpleEvent| + * | . | |Plugin | + * +-----|------+ . v +-----------+ + * | | | . +--------------+ +------------+ + * | +-----------.--->|EventPluginHub| | Event | + * | | . | | +-----------+ | Propagators| + * | ReactEvent | . | | |TapEvent | |------------| + * | Emitter | . | |<---+|Plugin | |other plugin| + * | | . | | +-----------+ | utilities | + * | +-----------.--->| | +------------+ + * | | | . +--------------+ + * +-----|------+ . ^ +-----------+ + * | . | |Enter/Leave| + * + . +-------+|Plugin | + * +-------------+ . +-----------+ + * | application | . + * |-------------| . + * | | . + * | | . + * +-------------+ . + * . + * React Core . General Purpose Event Plugin System + */ + + var alreadyListeningTo = {}; + var isMonitoringScrollValue = false; + var reactTopListenersCounter = 0; + + // For events like 'submit' which don't consistently bubble (which we trap at a + // lower node than `document`), binding at `document` would cause duplicate + // events so we don't include them here + var topEventMapping = { + topAbort: 'abort', + topBlur: 'blur', + topCanPlay: 'canplay', + topCanPlayThrough: 'canplaythrough', + topChange: 'change', + topClick: 'click', + topCompositionEnd: 'compositionend', + topCompositionStart: 'compositionstart', + topCompositionUpdate: 'compositionupdate', + topContextMenu: 'contextmenu', + topCopy: 'copy', + topCut: 'cut', + topDoubleClick: 'dblclick', + topDrag: 'drag', + topDragEnd: 'dragend', + topDragEnter: 'dragenter', + topDragExit: 'dragexit', + topDragLeave: 'dragleave', + topDragOver: 'dragover', + topDragStart: 'dragstart', + topDrop: 'drop', + topDurationChange: 'durationchange', + topEmptied: 'emptied', + topEncrypted: 'encrypted', + topEnded: 'ended', + topError: 'error', + topFocus: 'focus', + topInput: 'input', + topKeyDown: 'keydown', + topKeyPress: 'keypress', + topKeyUp: 'keyup', + topLoadedData: 'loadeddata', + topLoadedMetadata: 'loadedmetadata', + topLoadStart: 'loadstart', + topMouseDown: 'mousedown', + topMouseMove: 'mousemove', + topMouseOut: 'mouseout', + topMouseOver: 'mouseover', + topMouseUp: 'mouseup', + topPaste: 'paste', + topPause: 'pause', + topPlay: 'play', + topPlaying: 'playing', + topProgress: 'progress', + topRateChange: 'ratechange', + topScroll: 'scroll', + topSeeked: 'seeked', + topSeeking: 'seeking', + topSelectionChange: 'selectionchange', + topStalled: 'stalled', + topSuspend: 'suspend', + topTextInput: 'textInput', + topTimeUpdate: 'timeupdate', + topTouchCancel: 'touchcancel', + topTouchEnd: 'touchend', + topTouchMove: 'touchmove', + topTouchStart: 'touchstart', + topVolumeChange: 'volumechange', + topWaiting: 'waiting', + topWheel: 'wheel' + }; + + /** + * To ensure no conflicts with other potential React instances on the page + */ + var topListenersIDKey = '_reactListenersID' + String(Math.random()).slice(2); + + function getListeningForDocument(mountAt) { + // In IE8, `mountAt` is a host object and doesn't have `hasOwnProperty` + // directly. + if (!Object.prototype.hasOwnProperty.call(mountAt, topListenersIDKey)) { + mountAt[topListenersIDKey] = reactTopListenersCounter++; + alreadyListeningTo[mountAt[topListenersIDKey]] = {}; + } + return alreadyListeningTo[mountAt[topListenersIDKey]]; + } + + /** + * `ReactBrowserEventEmitter` is used to attach top-level event listeners. For + * example: + * + * ReactBrowserEventEmitter.putListener('myID', 'onClick', myFunction); + * + * This would allocate a "registration" of `('onClick', myFunction)` on 'myID'. + * + * @internal + */ + var ReactBrowserEventEmitter = assign({}, ReactEventEmitterMixin, { + + /** + * Injectable event backend + */ + ReactEventListener: null, + + injection: { + /** + * @param {object} ReactEventListener + */ + injectReactEventListener: function (ReactEventListener) { + ReactEventListener.setHandleTopLevel(ReactBrowserEventEmitter.handleTopLevel); + ReactBrowserEventEmitter.ReactEventListener = ReactEventListener; + } + }, + + /** + * Sets whether or not any created callbacks should be enabled. + * + * @param {boolean} enabled True if callbacks should be enabled. + */ + setEnabled: function (enabled) { + if (ReactBrowserEventEmitter.ReactEventListener) { + ReactBrowserEventEmitter.ReactEventListener.setEnabled(enabled); + } + }, + + /** + * @return {boolean} True if callbacks are enabled. + */ + isEnabled: function () { + return !!(ReactBrowserEventEmitter.ReactEventListener && ReactBrowserEventEmitter.ReactEventListener.isEnabled()); + }, + + /** + * We listen for bubbled touch events on the document object. + * + * Firefox v8.01 (and possibly others) exhibited strange behavior when + * mounting `onmousemove` events at some node that was not the document + * element. The symptoms were that if your mouse is not moving over something + * contained within that mount point (for example on the background) the + * top-level listeners for `onmousemove` won't be called. However, if you + * register the `mousemove` on the document object, then it will of course + * catch all `mousemove`s. This along with iOS quirks, justifies restricting + * top-level listeners to the document object only, at least for these + * movement types of events and possibly all events. + * + * @see http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html + * + * Also, `keyup`/`keypress`/`keydown` do not bubble to the window on IE, but + * they bubble to document. + * + * @param {string} registrationName Name of listener (e.g. `onClick`). + * @param {object} contentDocumentHandle Document which owns the container + */ + listenTo: function (registrationName, contentDocumentHandle) { + var mountAt = contentDocumentHandle; + var isListening = getListeningForDocument(mountAt); + var dependencies = EventPluginRegistry.registrationNameDependencies[registrationName]; + + var topLevelTypes = EventConstants.topLevelTypes; + for (var i = 0; i < dependencies.length; i++) { + var dependency = dependencies[i]; + if (!(isListening.hasOwnProperty(dependency) && isListening[dependency])) { + if (dependency === topLevelTypes.topWheel) { + if (isEventSupported('wheel')) { + ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelTypes.topWheel, 'wheel', mountAt); + } else if (isEventSupported('mousewheel')) { + ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelTypes.topWheel, 'mousewheel', mountAt); + } else { + // Firefox needs to capture a different mouse scroll event. + // @see http://www.quirksmode.org/dom/events/tests/scroll.html + ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelTypes.topWheel, 'DOMMouseScroll', mountAt); + } + } else if (dependency === topLevelTypes.topScroll) { + + if (isEventSupported('scroll', true)) { + ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(topLevelTypes.topScroll, 'scroll', mountAt); + } else { + ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelTypes.topScroll, 'scroll', ReactBrowserEventEmitter.ReactEventListener.WINDOW_HANDLE); + } + } else if (dependency === topLevelTypes.topFocus || dependency === topLevelTypes.topBlur) { + + if (isEventSupported('focus', true)) { + ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(topLevelTypes.topFocus, 'focus', mountAt); + ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(topLevelTypes.topBlur, 'blur', mountAt); + } else if (isEventSupported('focusin')) { + // IE has `focusin` and `focusout` events which bubble. + // @see http://www.quirksmode.org/blog/archives/2008/04/delegating_the.html + ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelTypes.topFocus, 'focusin', mountAt); + ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelTypes.topBlur, 'focusout', mountAt); + } + + // to make sure blur and focus event listeners are only attached once + isListening[topLevelTypes.topBlur] = true; + isListening[topLevelTypes.topFocus] = true; + } else if (topEventMapping.hasOwnProperty(dependency)) { + ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(dependency, topEventMapping[dependency], mountAt); + } + + isListening[dependency] = true; + } + } + }, + + trapBubbledEvent: function (topLevelType, handlerBaseName, handle) { + return ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelType, handlerBaseName, handle); + }, + + trapCapturedEvent: function (topLevelType, handlerBaseName, handle) { + return ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(topLevelType, handlerBaseName, handle); + }, + + /** + * Listens to window scroll and resize events. We cache scroll values so that + * application code can access them without triggering reflows. + * + * NOTE: Scroll events do not bubble. + * + * @see http://www.quirksmode.org/dom/events/scroll.html + */ + ensureScrollValueMonitoring: function () { + if (!isMonitoringScrollValue) { + var refresh = ViewportMetrics.refreshScrollValues; + ReactBrowserEventEmitter.ReactEventListener.monitorScrollValue(refresh); + isMonitoringScrollValue = true; + } + }, + + eventNameDispatchConfigs: EventPluginHub.eventNameDispatchConfigs, + + registrationNameModules: EventPluginHub.registrationNameModules, + + putListener: EventPluginHub.putListener, + + getListener: EventPluginHub.getListener, + + deleteListener: EventPluginHub.deleteListener, + + deleteAllListeners: EventPluginHub.deleteAllListeners + + }); + + ReactPerf.measureMethods(ReactBrowserEventEmitter, 'ReactBrowserEventEmitter', { + putListener: 'putListener', + deleteListener: 'deleteListener' + }); + + module.exports = ReactBrowserEventEmitter; + +/***/ }, +/* 29 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule EventConstants + */ + + 'use strict'; + + var keyMirror = __webpack_require__(16); + + var PropagationPhases = keyMirror({ bubbled: null, captured: null }); + + /** + * Types of raw signals from the browser caught at the top level. + */ + var topLevelTypes = keyMirror({ + topAbort: null, + topBlur: null, + topCanPlay: null, + topCanPlayThrough: null, + topChange: null, + topClick: null, + topCompositionEnd: null, + topCompositionStart: null, + topCompositionUpdate: null, + topContextMenu: null, + topCopy: null, + topCut: null, + topDoubleClick: null, + topDrag: null, + topDragEnd: null, + topDragEnter: null, + topDragExit: null, + topDragLeave: null, + topDragOver: null, + topDragStart: null, + topDrop: null, + topDurationChange: null, + topEmptied: null, + topEncrypted: null, + topEnded: null, + topError: null, + topFocus: null, + topInput: null, + topKeyDown: null, + topKeyPress: null, + topKeyUp: null, + topLoad: null, + topLoadedData: null, + topLoadedMetadata: null, + topLoadStart: null, + topMouseDown: null, + topMouseMove: null, + topMouseOut: null, + topMouseOver: null, + topMouseUp: null, + topPaste: null, + topPause: null, + topPlay: null, + topPlaying: null, + topProgress: null, + topRateChange: null, + topReset: null, + topScroll: null, + topSeeked: null, + topSeeking: null, + topSelectionChange: null, + topStalled: null, + topSubmit: null, + topSuspend: null, + topTextInput: null, + topTimeUpdate: null, + topTouchCancel: null, + topTouchEnd: null, + topTouchMove: null, + topTouchStart: null, + topVolumeChange: null, + topWaiting: null, + topWheel: null + }); + + var EventConstants = { + topLevelTypes: topLevelTypes, + PropagationPhases: PropagationPhases + }; + + module.exports = EventConstants; + +/***/ }, +/* 30 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule EventPluginHub + */ + + 'use strict'; + + var EventPluginRegistry = __webpack_require__(31); + var EventPluginUtils = __webpack_require__(32); + var ReactErrorUtils = __webpack_require__(33); + + var accumulateInto = __webpack_require__(34); + var forEachAccumulated = __webpack_require__(35); + var invariant = __webpack_require__(12); + var warning = __webpack_require__(24); + + /** + * Internal store for event listeners + */ + var listenerBank = {}; + + /** + * Internal queue of events that have accumulated their dispatches and are + * waiting to have their dispatches executed. + */ + var eventQueue = null; + + /** + * Dispatches an event and releases it back into the pool, unless persistent. + * + * @param {?object} event Synthetic event to be dispatched. + * @param {boolean} simulated If the event is simulated (changes exn behavior) + * @private + */ + var executeDispatchesAndRelease = function (event, simulated) { + if (event) { + EventPluginUtils.executeDispatchesInOrder(event, simulated); + + if (!event.isPersistent()) { + event.constructor.release(event); + } + } + }; + var executeDispatchesAndReleaseSimulated = function (e) { + return executeDispatchesAndRelease(e, true); + }; + var executeDispatchesAndReleaseTopLevel = function (e) { + return executeDispatchesAndRelease(e, false); + }; + + /** + * - `InstanceHandle`: [required] Module that performs logical traversals of DOM + * hierarchy given ids of the logical DOM elements involved. + */ + var InstanceHandle = null; + + function validateInstanceHandle() { + var valid = InstanceHandle && InstanceHandle.traverseTwoPhase && InstanceHandle.traverseEnterLeave; + process.env.NODE_ENV !== 'production' ? warning(valid, 'InstanceHandle not injected before use!') : undefined; + } + + /** + * This is a unified interface for event plugins to be installed and configured. + * + * Event plugins can implement the following properties: + * + * `extractEvents` {function(string, DOMEventTarget, string, object): *} + * Required. When a top-level event is fired, this method is expected to + * extract synthetic events that will in turn be queued and dispatched. + * + * `eventTypes` {object} + * Optional, plugins that fire events must publish a mapping of registration + * names that are used to register listeners. Values of this mapping must + * be objects that contain `registrationName` or `phasedRegistrationNames`. + * + * `executeDispatch` {function(object, function, string)} + * Optional, allows plugins to override how an event gets dispatched. By + * default, the listener is simply invoked. + * + * Each plugin that is injected into `EventsPluginHub` is immediately operable. + * + * @public + */ + var EventPluginHub = { + + /** + * Methods for injecting dependencies. + */ + injection: { + + /** + * @param {object} InjectedMount + * @public + */ + injectMount: EventPluginUtils.injection.injectMount, + + /** + * @param {object} InjectedInstanceHandle + * @public + */ + injectInstanceHandle: function (InjectedInstanceHandle) { + InstanceHandle = InjectedInstanceHandle; + if (process.env.NODE_ENV !== 'production') { + validateInstanceHandle(); + } + }, + + getInstanceHandle: function () { + if (process.env.NODE_ENV !== 'production') { + validateInstanceHandle(); + } + return InstanceHandle; + }, + + /** + * @param {array} InjectedEventPluginOrder + * @public + */ + injectEventPluginOrder: EventPluginRegistry.injectEventPluginOrder, + + /** + * @param {object} injectedNamesToPlugins Map from names to plugin modules. + */ + injectEventPluginsByName: EventPluginRegistry.injectEventPluginsByName + + }, + + eventNameDispatchConfigs: EventPluginRegistry.eventNameDispatchConfigs, + + registrationNameModules: EventPluginRegistry.registrationNameModules, + + /** + * Stores `listener` at `listenerBank[registrationName][id]`. Is idempotent. + * + * @param {string} id ID of the DOM element. + * @param {string} registrationName Name of listener (e.g. `onClick`). + * @param {?function} listener The callback to store. + */ + putListener: function (id, registrationName, listener) { + !(typeof listener === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Expected %s listener to be a function, instead got type %s', registrationName, typeof listener) : invariant(false) : undefined; + + var bankForRegistrationName = listenerBank[registrationName] || (listenerBank[registrationName] = {}); + bankForRegistrationName[id] = listener; + + var PluginModule = EventPluginRegistry.registrationNameModules[registrationName]; + if (PluginModule && PluginModule.didPutListener) { + PluginModule.didPutListener(id, registrationName, listener); + } + }, + + /** + * @param {string} id ID of the DOM element. + * @param {string} registrationName Name of listener (e.g. `onClick`). + * @return {?function} The stored callback. + */ + getListener: function (id, registrationName) { + var bankForRegistrationName = listenerBank[registrationName]; + return bankForRegistrationName && bankForRegistrationName[id]; + }, + + /** + * Deletes a listener from the registration bank. + * + * @param {string} id ID of the DOM element. + * @param {string} registrationName Name of listener (e.g. `onClick`). + */ + deleteListener: function (id, registrationName) { + var PluginModule = EventPluginRegistry.registrationNameModules[registrationName]; + if (PluginModule && PluginModule.willDeleteListener) { + PluginModule.willDeleteListener(id, registrationName); + } + + var bankForRegistrationName = listenerBank[registrationName]; + // TODO: This should never be null -- when is it? + if (bankForRegistrationName) { + delete bankForRegistrationName[id]; + } + }, + + /** + * Deletes all listeners for the DOM element with the supplied ID. + * + * @param {string} id ID of the DOM element. + */ + deleteAllListeners: function (id) { + for (var registrationName in listenerBank) { + if (!listenerBank[registrationName][id]) { + continue; + } + + var PluginModule = EventPluginRegistry.registrationNameModules[registrationName]; + if (PluginModule && PluginModule.willDeleteListener) { + PluginModule.willDeleteListener(id, registrationName); + } + + delete listenerBank[registrationName][id]; + } + }, + + /** + * Allows registered plugins an opportunity to extract events from top-level + * native browser events. + * + * @param {string} topLevelType Record from `EventConstants`. + * @param {DOMEventTarget} topLevelTarget The listening component root node. + * @param {string} topLevelTargetID ID of `topLevelTarget`. + * @param {object} nativeEvent Native browser event. + * @return {*} An accumulation of synthetic events. + * @internal + */ + extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) { + var events; + var plugins = EventPluginRegistry.plugins; + for (var i = 0; i < plugins.length; i++) { + // Not every plugin in the ordering may be loaded at runtime. + var possiblePlugin = plugins[i]; + if (possiblePlugin) { + var extractedEvents = possiblePlugin.extractEvents(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget); + if (extractedEvents) { + events = accumulateInto(events, extractedEvents); + } + } + } + return events; + }, + + /** + * Enqueues a synthetic event that should be dispatched when + * `processEventQueue` is invoked. + * + * @param {*} events An accumulation of synthetic events. + * @internal + */ + enqueueEvents: function (events) { + if (events) { + eventQueue = accumulateInto(eventQueue, events); + } + }, + + /** + * Dispatches all synthetic events on the event queue. + * + * @internal + */ + processEventQueue: function (simulated) { + // Set `eventQueue` to null before processing it so that we can tell if more + // events get enqueued while processing. + var processingEventQueue = eventQueue; + eventQueue = null; + if (simulated) { + forEachAccumulated(processingEventQueue, executeDispatchesAndReleaseSimulated); + } else { + forEachAccumulated(processingEventQueue, executeDispatchesAndReleaseTopLevel); + } + !!eventQueue ? process.env.NODE_ENV !== 'production' ? invariant(false, 'processEventQueue(): Additional events were enqueued while processing ' + 'an event queue. Support for this has not yet been implemented.') : invariant(false) : undefined; + // This would be a good time to rethrow if any of the event handlers threw. + ReactErrorUtils.rethrowCaughtError(); + }, + + /** + * These are needed for tests only. Do not use! + */ + __purge: function () { + listenerBank = {}; + }, + + __getListenerBank: function () { + return listenerBank; + } + + }; + + module.exports = EventPluginHub; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 31 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule EventPluginRegistry + * @typechecks static-only + */ + + 'use strict'; + + var invariant = __webpack_require__(12); + + /** + * Injectable ordering of event plugins. + */ + var EventPluginOrder = null; + + /** + * Injectable mapping from names to event plugin modules. + */ + var namesToPlugins = {}; + + /** + * Recomputes the plugin list using the injected plugins and plugin ordering. + * + * @private + */ + function recomputePluginOrdering() { + if (!EventPluginOrder) { + // Wait until an `EventPluginOrder` is injected. + return; + } + for (var pluginName in namesToPlugins) { + var PluginModule = namesToPlugins[pluginName]; + var pluginIndex = EventPluginOrder.indexOf(pluginName); + !(pluginIndex > -1) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginRegistry: Cannot inject event plugins that do not exist in ' + 'the plugin ordering, `%s`.', pluginName) : invariant(false) : undefined; + if (EventPluginRegistry.plugins[pluginIndex]) { + continue; + } + !PluginModule.extractEvents ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginRegistry: Event plugins must implement an `extractEvents` ' + 'method, but `%s` does not.', pluginName) : invariant(false) : undefined; + EventPluginRegistry.plugins[pluginIndex] = PluginModule; + var publishedEvents = PluginModule.eventTypes; + for (var eventName in publishedEvents) { + !publishEventForPlugin(publishedEvents[eventName], PluginModule, eventName) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginRegistry: Failed to publish event `%s` for plugin `%s`.', eventName, pluginName) : invariant(false) : undefined; + } + } + } + + /** + * Publishes an event so that it can be dispatched by the supplied plugin. + * + * @param {object} dispatchConfig Dispatch configuration for the event. + * @param {object} PluginModule Plugin publishing the event. + * @return {boolean} True if the event was successfully published. + * @private + */ + function publishEventForPlugin(dispatchConfig, PluginModule, eventName) { + !!EventPluginRegistry.eventNameDispatchConfigs.hasOwnProperty(eventName) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginHub: More than one plugin attempted to publish the same ' + 'event name, `%s`.', eventName) : invariant(false) : undefined; + EventPluginRegistry.eventNameDispatchConfigs[eventName] = dispatchConfig; + + var phasedRegistrationNames = dispatchConfig.phasedRegistrationNames; + if (phasedRegistrationNames) { + for (var phaseName in phasedRegistrationNames) { + if (phasedRegistrationNames.hasOwnProperty(phaseName)) { + var phasedRegistrationName = phasedRegistrationNames[phaseName]; + publishRegistrationName(phasedRegistrationName, PluginModule, eventName); + } + } + return true; + } else if (dispatchConfig.registrationName) { + publishRegistrationName(dispatchConfig.registrationName, PluginModule, eventName); + return true; + } + return false; + } + + /** + * Publishes a registration name that is used to identify dispatched events and + * can be used with `EventPluginHub.putListener` to register listeners. + * + * @param {string} registrationName Registration name to add. + * @param {object} PluginModule Plugin publishing the event. + * @private + */ + function publishRegistrationName(registrationName, PluginModule, eventName) { + !!EventPluginRegistry.registrationNameModules[registrationName] ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginHub: More than one plugin attempted to publish the same ' + 'registration name, `%s`.', registrationName) : invariant(false) : undefined; + EventPluginRegistry.registrationNameModules[registrationName] = PluginModule; + EventPluginRegistry.registrationNameDependencies[registrationName] = PluginModule.eventTypes[eventName].dependencies; + } + + /** + * Registers plugins so that they can extract and dispatch events. + * + * @see {EventPluginHub} + */ + var EventPluginRegistry = { + + /** + * Ordered list of injected plugins. + */ + plugins: [], + + /** + * Mapping from event name to dispatch config + */ + eventNameDispatchConfigs: {}, + + /** + * Mapping from registration name to plugin module + */ + registrationNameModules: {}, + + /** + * Mapping from registration name to event name + */ + registrationNameDependencies: {}, + + /** + * Injects an ordering of plugins (by plugin name). This allows the ordering + * to be decoupled from injection of the actual plugins so that ordering is + * always deterministic regardless of packaging, on-the-fly injection, etc. + * + * @param {array} InjectedEventPluginOrder + * @internal + * @see {EventPluginHub.injection.injectEventPluginOrder} + */ + injectEventPluginOrder: function (InjectedEventPluginOrder) { + !!EventPluginOrder ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginRegistry: Cannot inject event plugin ordering more than ' + 'once. You are likely trying to load more than one copy of React.') : invariant(false) : undefined; + // Clone the ordering so it cannot be dynamically mutated. + EventPluginOrder = Array.prototype.slice.call(InjectedEventPluginOrder); + recomputePluginOrdering(); + }, + + /** + * Injects plugins to be used by `EventPluginHub`. The plugin names must be + * in the ordering injected by `injectEventPluginOrder`. + * + * Plugins can be injected as part of page initialization or on-the-fly. + * + * @param {object} injectedNamesToPlugins Map from names to plugin modules. + * @internal + * @see {EventPluginHub.injection.injectEventPluginsByName} + */ + injectEventPluginsByName: function (injectedNamesToPlugins) { + var isOrderingDirty = false; + for (var pluginName in injectedNamesToPlugins) { + if (!injectedNamesToPlugins.hasOwnProperty(pluginName)) { + continue; + } + var PluginModule = injectedNamesToPlugins[pluginName]; + if (!namesToPlugins.hasOwnProperty(pluginName) || namesToPlugins[pluginName] !== PluginModule) { + !!namesToPlugins[pluginName] ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginRegistry: Cannot inject two different event plugins ' + 'using the same name, `%s`.', pluginName) : invariant(false) : undefined; + namesToPlugins[pluginName] = PluginModule; + isOrderingDirty = true; + } + } + if (isOrderingDirty) { + recomputePluginOrdering(); + } + }, + + /** + * Looks up the plugin for the supplied event. + * + * @param {object} event A synthetic event. + * @return {?object} The plugin that created the supplied event. + * @internal + */ + getPluginModuleForEvent: function (event) { + var dispatchConfig = event.dispatchConfig; + if (dispatchConfig.registrationName) { + return EventPluginRegistry.registrationNameModules[dispatchConfig.registrationName] || null; + } + for (var phase in dispatchConfig.phasedRegistrationNames) { + if (!dispatchConfig.phasedRegistrationNames.hasOwnProperty(phase)) { + continue; + } + var PluginModule = EventPluginRegistry.registrationNameModules[dispatchConfig.phasedRegistrationNames[phase]]; + if (PluginModule) { + return PluginModule; + } + } + return null; + }, + + /** + * Exposed for unit testing. + * @private + */ + _resetEventPlugins: function () { + EventPluginOrder = null; + for (var pluginName in namesToPlugins) { + if (namesToPlugins.hasOwnProperty(pluginName)) { + delete namesToPlugins[pluginName]; + } + } + EventPluginRegistry.plugins.length = 0; + + var eventNameDispatchConfigs = EventPluginRegistry.eventNameDispatchConfigs; + for (var eventName in eventNameDispatchConfigs) { + if (eventNameDispatchConfigs.hasOwnProperty(eventName)) { + delete eventNameDispatchConfigs[eventName]; + } + } + + var registrationNameModules = EventPluginRegistry.registrationNameModules; + for (var registrationName in registrationNameModules) { + if (registrationNameModules.hasOwnProperty(registrationName)) { + delete registrationNameModules[registrationName]; + } + } + } + + }; + + module.exports = EventPluginRegistry; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 32 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule EventPluginUtils + */ + + 'use strict'; + + var EventConstants = __webpack_require__(29); + var ReactErrorUtils = __webpack_require__(33); + + var invariant = __webpack_require__(12); + var warning = __webpack_require__(24); + + /** + * Injected dependencies: + */ + + /** + * - `Mount`: [required] Module that can convert between React dom IDs and + * actual node references. + */ + var injection = { + Mount: null, + injectMount: function (InjectedMount) { + injection.Mount = InjectedMount; + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(InjectedMount && InjectedMount.getNode && InjectedMount.getID, 'EventPluginUtils.injection.injectMount(...): Injected Mount ' + 'module is missing getNode or getID.') : undefined; + } + } + }; + + var topLevelTypes = EventConstants.topLevelTypes; + + function isEndish(topLevelType) { + return topLevelType === topLevelTypes.topMouseUp || topLevelType === topLevelTypes.topTouchEnd || topLevelType === topLevelTypes.topTouchCancel; + } + + function isMoveish(topLevelType) { + return topLevelType === topLevelTypes.topMouseMove || topLevelType === topLevelTypes.topTouchMove; + } + function isStartish(topLevelType) { + return topLevelType === topLevelTypes.topMouseDown || topLevelType === topLevelTypes.topTouchStart; + } + + var validateEventDispatches; + if (process.env.NODE_ENV !== 'production') { + validateEventDispatches = function (event) { + var dispatchListeners = event._dispatchListeners; + var dispatchIDs = event._dispatchIDs; + + var listenersIsArr = Array.isArray(dispatchListeners); + var idsIsArr = Array.isArray(dispatchIDs); + var IDsLen = idsIsArr ? dispatchIDs.length : dispatchIDs ? 1 : 0; + var listenersLen = listenersIsArr ? dispatchListeners.length : dispatchListeners ? 1 : 0; + + process.env.NODE_ENV !== 'production' ? warning(idsIsArr === listenersIsArr && IDsLen === listenersLen, 'EventPluginUtils: Invalid `event`.') : undefined; + }; + } + + /** + * Dispatch the event to the listener. + * @param {SyntheticEvent} event SyntheticEvent to handle + * @param {boolean} simulated If the event is simulated (changes exn behavior) + * @param {function} listener Application-level callback + * @param {string} domID DOM id to pass to the callback. + */ + function executeDispatch(event, simulated, listener, domID) { + var type = event.type || 'unknown-event'; + event.currentTarget = injection.Mount.getNode(domID); + if (simulated) { + ReactErrorUtils.invokeGuardedCallbackWithCatch(type, listener, event, domID); + } else { + ReactErrorUtils.invokeGuardedCallback(type, listener, event, domID); + } + event.currentTarget = null; + } + + /** + * Standard/simple iteration through an event's collected dispatches. + */ + function executeDispatchesInOrder(event, simulated) { + var dispatchListeners = event._dispatchListeners; + var dispatchIDs = event._dispatchIDs; + if (process.env.NODE_ENV !== 'production') { + validateEventDispatches(event); + } + if (Array.isArray(dispatchListeners)) { + for (var i = 0; i < dispatchListeners.length; i++) { + if (event.isPropagationStopped()) { + break; + } + // Listeners and IDs are two parallel arrays that are always in sync. + executeDispatch(event, simulated, dispatchListeners[i], dispatchIDs[i]); + } + } else if (dispatchListeners) { + executeDispatch(event, simulated, dispatchListeners, dispatchIDs); + } + event._dispatchListeners = null; + event._dispatchIDs = null; + } + + /** + * Standard/simple iteration through an event's collected dispatches, but stops + * at the first dispatch execution returning true, and returns that id. + * + * @return {?string} id of the first dispatch execution who's listener returns + * true, or null if no listener returned true. + */ + function executeDispatchesInOrderStopAtTrueImpl(event) { + var dispatchListeners = event._dispatchListeners; + var dispatchIDs = event._dispatchIDs; + if (process.env.NODE_ENV !== 'production') { + validateEventDispatches(event); + } + if (Array.isArray(dispatchListeners)) { + for (var i = 0; i < dispatchListeners.length; i++) { + if (event.isPropagationStopped()) { + break; + } + // Listeners and IDs are two parallel arrays that are always in sync. + if (dispatchListeners[i](event, dispatchIDs[i])) { + return dispatchIDs[i]; + } + } + } else if (dispatchListeners) { + if (dispatchListeners(event, dispatchIDs)) { + return dispatchIDs; + } + } + return null; + } + + /** + * @see executeDispatchesInOrderStopAtTrueImpl + */ + function executeDispatchesInOrderStopAtTrue(event) { + var ret = executeDispatchesInOrderStopAtTrueImpl(event); + event._dispatchIDs = null; + event._dispatchListeners = null; + return ret; + } + + /** + * Execution of a "direct" dispatch - there must be at most one dispatch + * accumulated on the event or it is considered an error. It doesn't really make + * sense for an event with multiple dispatches (bubbled) to keep track of the + * return values at each dispatch execution, but it does tend to make sense when + * dealing with "direct" dispatches. + * + * @return {*} The return value of executing the single dispatch. + */ + function executeDirectDispatch(event) { + if (process.env.NODE_ENV !== 'production') { + validateEventDispatches(event); + } + var dispatchListener = event._dispatchListeners; + var dispatchID = event._dispatchIDs; + !!Array.isArray(dispatchListener) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'executeDirectDispatch(...): Invalid `event`.') : invariant(false) : undefined; + var res = dispatchListener ? dispatchListener(event, dispatchID) : null; + event._dispatchListeners = null; + event._dispatchIDs = null; + return res; + } + + /** + * @param {SyntheticEvent} event + * @return {boolean} True iff number of dispatches accumulated is greater than 0. + */ + function hasDispatches(event) { + return !!event._dispatchListeners; + } + + /** + * General utilities that are useful in creating custom Event Plugins. + */ + var EventPluginUtils = { + isEndish: isEndish, + isMoveish: isMoveish, + isStartish: isStartish, + + executeDirectDispatch: executeDirectDispatch, + executeDispatchesInOrder: executeDispatchesInOrder, + executeDispatchesInOrderStopAtTrue: executeDispatchesInOrderStopAtTrue, + hasDispatches: hasDispatches, + + getNode: function (id) { + return injection.Mount.getNode(id); + }, + getID: function (node) { + return injection.Mount.getID(node); + }, + + injection: injection + }; + + module.exports = EventPluginUtils; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 33 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactErrorUtils + * @typechecks + */ + + 'use strict'; + + var caughtError = null; + + /** + * Call a function while guarding against errors that happens within it. + * + * @param {?String} name of the guard to use for logging or debugging + * @param {Function} func The function to invoke + * @param {*} a First argument + * @param {*} b Second argument + */ + function invokeGuardedCallback(name, func, a, b) { + try { + return func(a, b); + } catch (x) { + if (caughtError === null) { + caughtError = x; + } + return undefined; + } + } + + var ReactErrorUtils = { + invokeGuardedCallback: invokeGuardedCallback, + + /** + * Invoked by ReactTestUtils.Simulate so that any errors thrown by the event + * handler are sure to be rethrown by rethrowCaughtError. + */ + invokeGuardedCallbackWithCatch: invokeGuardedCallback, + + /** + * During execution of guarded functions we will capture the first error which + * we will rethrow to be handled by the top level error handler. + */ + rethrowCaughtError: function () { + if (caughtError) { + var error = caughtError; + caughtError = null; + throw error; + } + } + }; + + if (process.env.NODE_ENV !== 'production') { + /** + * To help development we can get better devtools integration by simulating a + * real browser event. + */ + if (typeof window !== 'undefined' && typeof window.dispatchEvent === 'function' && typeof document !== 'undefined' && typeof document.createEvent === 'function') { + var fakeNode = document.createElement('react'); + ReactErrorUtils.invokeGuardedCallback = function (name, func, a, b) { + var boundFunc = func.bind(null, a, b); + var evtType = 'react-' + name; + fakeNode.addEventListener(evtType, boundFunc, false); + var evt = document.createEvent('Event'); + evt.initEvent(evtType, false, false); + fakeNode.dispatchEvent(evt); + fakeNode.removeEventListener(evtType, boundFunc, false); + }; + } + } + + module.exports = ReactErrorUtils; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 34 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2014-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule accumulateInto + */ + + 'use strict'; + + var invariant = __webpack_require__(12); + + /** + * + * Accumulates items that must not be null or undefined into the first one. This + * is used to conserve memory by avoiding array allocations, and thus sacrifices + * API cleanness. Since `current` can be null before being passed in and not + * null after this function, make sure to assign it back to `current`: + * + * `a = accumulateInto(a, b);` + * + * This API should be sparingly used. Try `accumulate` for something cleaner. + * + * @return {*|array<*>} An accumulation of items. + */ + + function accumulateInto(current, next) { + !(next != null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'accumulateInto(...): Accumulated items must not be null or undefined.') : invariant(false) : undefined; + if (current == null) { + return next; + } + + // Both are not empty. Warning: Never call x.concat(y) when you are not + // certain that x is an Array (x could be a string with concat method). + var currentIsArray = Array.isArray(current); + var nextIsArray = Array.isArray(next); + + if (currentIsArray && nextIsArray) { + current.push.apply(current, next); + return current; + } + + if (currentIsArray) { + current.push(next); + return current; + } + + if (nextIsArray) { + // A bit too dangerous to mutate `next`. + return [current].concat(next); + } + + return [current, next]; + } + + module.exports = accumulateInto; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 35 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule forEachAccumulated + */ + + 'use strict'; + + /** + * @param {array} arr an "accumulation" of items which is either an Array or + * a single item. Useful when paired with the `accumulate` module. This is a + * simple utility that allows us to reason about a collection of items, but + * handling the case when there is exactly one item (and we do not need to + * allocate an array). + */ + var forEachAccumulated = function (arr, cb, scope) { + if (Array.isArray(arr)) { + arr.forEach(cb, scope); + } else if (arr) { + cb.call(scope, arr); + } + }; + + module.exports = forEachAccumulated; + +/***/ }, +/* 36 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactEventEmitterMixin + */ + + 'use strict'; + + var EventPluginHub = __webpack_require__(30); + + function runEventQueueInBatch(events) { + EventPluginHub.enqueueEvents(events); + EventPluginHub.processEventQueue(false); + } + + var ReactEventEmitterMixin = { + + /** + * Streams a fired top-level event to `EventPluginHub` where plugins have the + * opportunity to create `ReactEvent`s to be dispatched. + * + * @param {string} topLevelType Record from `EventConstants`. + * @param {object} topLevelTarget The listening component root node. + * @param {string} topLevelTargetID ID of `topLevelTarget`. + * @param {object} nativeEvent Native environment event. + */ + handleTopLevel: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) { + var events = EventPluginHub.extractEvents(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget); + runEventQueueInBatch(events); + } + }; + + module.exports = ReactEventEmitterMixin; + +/***/ }, +/* 37 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ViewportMetrics + */ + + 'use strict'; + + var ViewportMetrics = { + + currentScrollLeft: 0, + + currentScrollTop: 0, + + refreshScrollValues: function (scrollPosition) { + ViewportMetrics.currentScrollLeft = scrollPosition.x; + ViewportMetrics.currentScrollTop = scrollPosition.y; + } + + }; + + module.exports = ViewportMetrics; + +/***/ }, +/* 38 */ +/***/ function(module, exports) { + + /** + * Copyright 2014-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule Object.assign + */ + + // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.assign + + 'use strict'; + + function assign(target, sources) { + if (target == null) { + throw new TypeError('Object.assign target cannot be null or undefined'); + } + + var to = Object(target); + var hasOwnProperty = Object.prototype.hasOwnProperty; + + for (var nextIndex = 1; nextIndex < arguments.length; nextIndex++) { + var nextSource = arguments[nextIndex]; + if (nextSource == null) { + continue; + } + + var from = Object(nextSource); + + // We don't currently support accessors nor proxies. Therefore this + // copy cannot throw. If we ever supported this then we must handle + // exceptions and side-effects. We don't support symbols so they won't + // be transferred. + + for (var key in from) { + if (hasOwnProperty.call(from, key)) { + to[key] = from[key]; + } + } + } + + return to; + } + + module.exports = assign; + +/***/ }, +/* 39 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule isEventSupported + */ + + 'use strict'; + + var ExecutionEnvironment = __webpack_require__(8); + + var useHasFeature; + if (ExecutionEnvironment.canUseDOM) { + useHasFeature = document.implementation && document.implementation.hasFeature && + // always returns true in newer browsers as per the standard. + // @see http://dom.spec.whatwg.org/#dom-domimplementation-hasfeature + document.implementation.hasFeature('', '') !== true; + } + + /** + * Checks if an event is supported in the current execution environment. + * + * NOTE: This will not work correctly for non-generic events such as `change`, + * `reset`, `load`, `error`, and `select`. + * + * Borrows from Modernizr. + * + * @param {string} eventNameSuffix Event name, e.g. "click". + * @param {?boolean} capture Check if the capture phase is supported. + * @return {boolean} True if the event is supported. + * @internal + * @license Modernizr 3.0.0pre (Custom Build) | MIT + */ + function isEventSupported(eventNameSuffix, capture) { + if (!ExecutionEnvironment.canUseDOM || capture && !('addEventListener' in document)) { + return false; + } + + var eventName = 'on' + eventNameSuffix; + var isSupported = (eventName in document); + + if (!isSupported) { + var element = document.createElement('div'); + element.setAttribute(eventName, 'return;'); + isSupported = typeof element[eventName] === 'function'; + } + + if (!isSupported && useHasFeature && eventNameSuffix === 'wheel') { + // This is the only way to test support for the `wheel` event in IE9+. + isSupported = document.implementation.hasFeature('Events.wheel', '3.0'); + } + + return isSupported; + } + + module.exports = isEventSupported; + +/***/ }, +/* 40 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactDOMFeatureFlags + */ + + 'use strict'; + + var ReactDOMFeatureFlags = { + useCreateElement: false + }; + + module.exports = ReactDOMFeatureFlags; + +/***/ }, +/* 41 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2014-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactElement + */ + + 'use strict'; + + var ReactCurrentOwner = __webpack_require__(4); + + var assign = __webpack_require__(38); + var canDefineProperty = __webpack_require__(42); + + // The Symbol used to tag the ReactElement type. If there is no native Symbol + // nor polyfill, then a plain number is used for performance. + var REACT_ELEMENT_TYPE = typeof Symbol === 'function' && Symbol['for'] && Symbol['for']('react.element') || 0xeac7; + + var RESERVED_PROPS = { + key: true, + ref: true, + __self: true, + __source: true + }; + + /** + * Base constructor for all React elements. This is only used to make this + * work with a dynamic instanceof check. Nothing should live on this prototype. + * + * @param {*} type + * @param {*} key + * @param {string|object} ref + * @param {*} self A *temporary* helper to detect places where `this` is + * different from the `owner` when React.createElement is called, so that we + * can warn. We want to get rid of owner and replace string `ref`s with arrow + * functions, and as long as `this` and owner are the same, there will be no + * change in behavior. + * @param {*} source An annotation object (added by a transpiler or otherwise) + * indicating filename, line number, and/or other information. + * @param {*} owner + * @param {*} props + * @internal + */ + var ReactElement = function (type, key, ref, self, source, owner, props) { + var element = { + // This tag allow us to uniquely identify this as a React Element + $$typeof: REACT_ELEMENT_TYPE, + + // Built-in properties that belong on the element + type: type, + key: key, + ref: ref, + props: props, + + // Record the component responsible for creating this element. + _owner: owner + }; + + if (process.env.NODE_ENV !== 'production') { + // The validation flag is currently mutative. We put it on + // an external backing store so that we can freeze the whole object. + // This can be replaced with a WeakMap once they are implemented in + // commonly used development environments. + element._store = {}; + + // To make comparing ReactElements easier for testing purposes, we make + // the validation flag non-enumerable (where possible, which should + // include every environment we run tests in), so the test framework + // ignores it. + if (canDefineProperty) { + Object.defineProperty(element._store, 'validated', { + configurable: false, + enumerable: false, + writable: true, + value: false + }); + // self and source are DEV only properties. + Object.defineProperty(element, '_self', { + configurable: false, + enumerable: false, + writable: false, + value: self + }); + // Two elements created in two different places should be considered + // equal for testing purposes and therefore we hide it from enumeration. + Object.defineProperty(element, '_source', { + configurable: false, + enumerable: false, + writable: false, + value: source + }); + } else { + element._store.validated = false; + element._self = self; + element._source = source; + } + Object.freeze(element.props); + Object.freeze(element); + } + + return element; + }; + + ReactElement.createElement = function (type, config, children) { + var propName; + + // Reserved names are extracted + var props = {}; + + var key = null; + var ref = null; + var self = null; + var source = null; + + if (config != null) { + ref = config.ref === undefined ? null : config.ref; + key = config.key === undefined ? null : '' + config.key; + self = config.__self === undefined ? null : config.__self; + source = config.__source === undefined ? null : config.__source; + // Remaining properties are added to a new props object + for (propName in config) { + if (config.hasOwnProperty(propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { + props[propName] = config[propName]; + } + } + } + + // Children can be more than one argument, and those are transferred onto + // the newly allocated props object. + var childrenLength = arguments.length - 2; + if (childrenLength === 1) { + props.children = children; + } else if (childrenLength > 1) { + var childArray = Array(childrenLength); + for (var i = 0; i < childrenLength; i++) { + childArray[i] = arguments[i + 2]; + } + props.children = childArray; + } + + // Resolve default props + if (type && type.defaultProps) { + var defaultProps = type.defaultProps; + for (propName in defaultProps) { + if (typeof props[propName] === 'undefined') { + props[propName] = defaultProps[propName]; + } + } + } + + return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props); + }; + + ReactElement.createFactory = function (type) { + var factory = ReactElement.createElement.bind(null, type); + // Expose the type on the factory and the prototype so that it can be + // easily accessed on elements. E.g. `<Foo />.type === Foo`. + // This should not be named `constructor` since this may not be the function + // that created the element, and it may not even be a constructor. + // Legacy hook TODO: Warn if this is accessed + factory.type = type; + return factory; + }; + + ReactElement.cloneAndReplaceKey = function (oldElement, newKey) { + var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props); + + return newElement; + }; + + ReactElement.cloneAndReplaceProps = function (oldElement, newProps) { + var newElement = ReactElement(oldElement.type, oldElement.key, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, newProps); + + if (process.env.NODE_ENV !== 'production') { + // If the key on the original is valid, then the clone is valid + newElement._store.validated = oldElement._store.validated; + } + + return newElement; + }; + + ReactElement.cloneElement = function (element, config, children) { + var propName; + + // Original props are copied + var props = assign({}, element.props); + + // Reserved names are extracted + var key = element.key; + var ref = element.ref; + // Self is preserved since the owner is preserved. + var self = element._self; + // Source is preserved since cloneElement is unlikely to be targeted by a + // transpiler, and the original source is probably a better indicator of the + // true owner. + var source = element._source; + + // Owner will be preserved, unless ref is overridden + var owner = element._owner; + + if (config != null) { + if (config.ref !== undefined) { + // Silently steal the ref from the parent. + ref = config.ref; + owner = ReactCurrentOwner.current; + } + if (config.key !== undefined) { + key = '' + config.key; + } + // Remaining properties override existing props + for (propName in config) { + if (config.hasOwnProperty(propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { + props[propName] = config[propName]; + } + } + } + + // Children can be more than one argument, and those are transferred onto + // the newly allocated props object. + var childrenLength = arguments.length - 2; + if (childrenLength === 1) { + props.children = children; + } else if (childrenLength > 1) { + var childArray = Array(childrenLength); + for (var i = 0; i < childrenLength; i++) { + childArray[i] = arguments[i + 2]; + } + props.children = childArray; + } + + return ReactElement(element.type, key, ref, self, source, owner, props); + }; + + /** + * @param {?object} object + * @return {boolean} True if `object` is a valid component. + * @final + */ + ReactElement.isValidElement = function (object) { + return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; + }; + + module.exports = ReactElement; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 42 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule canDefineProperty + */ + + 'use strict'; + + var canDefineProperty = false; + if (process.env.NODE_ENV !== 'production') { + try { + Object.defineProperty({}, 'x', { get: function () {} }); + canDefineProperty = true; + } catch (x) { + // IE will fail on defineProperty + } + } + + module.exports = canDefineProperty; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 43 */ +/***/ function(module, exports) { + + /** + * Copyright 2014-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactEmptyComponentRegistry + */ + + 'use strict'; + + // This registry keeps track of the React IDs of the components that rendered to + // `null` (in reality a placeholder such as `noscript`) + var nullComponentIDsRegistry = {}; + + /** + * @param {string} id Component's `_rootNodeID`. + * @return {boolean} True if the component is rendered to null. + */ + function isNullComponentID(id) { + return !!nullComponentIDsRegistry[id]; + } + + /** + * Mark the component as having rendered to null. + * @param {string} id Component's `_rootNodeID`. + */ + function registerNullComponentID(id) { + nullComponentIDsRegistry[id] = true; + } + + /** + * Unmark the component as having rendered to null: it renders to something now. + * @param {string} id Component's `_rootNodeID`. + */ + function deregisterNullComponentID(id) { + delete nullComponentIDsRegistry[id]; + } + + var ReactEmptyComponentRegistry = { + isNullComponentID: isNullComponentID, + registerNullComponentID: registerNullComponentID, + deregisterNullComponentID: deregisterNullComponentID + }; + + module.exports = ReactEmptyComponentRegistry; + +/***/ }, +/* 44 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactInstanceHandles + * @typechecks static-only + */ + + 'use strict'; + + var ReactRootIndex = __webpack_require__(45); + + var invariant = __webpack_require__(12); + + var SEPARATOR = '.'; + var SEPARATOR_LENGTH = SEPARATOR.length; + + /** + * Maximum depth of traversals before we consider the possibility of a bad ID. + */ + var MAX_TREE_DEPTH = 10000; + + /** + * Creates a DOM ID prefix to use when mounting React components. + * + * @param {number} index A unique integer + * @return {string} React root ID. + * @internal + */ + function getReactRootIDString(index) { + return SEPARATOR + index.toString(36); + } + + /** + * Checks if a character in the supplied ID is a separator or the end. + * + * @param {string} id A React DOM ID. + * @param {number} index Index of the character to check. + * @return {boolean} True if the character is a separator or end of the ID. + * @private + */ + function isBoundary(id, index) { + return id.charAt(index) === SEPARATOR || index === id.length; + } + + /** + * Checks if the supplied string is a valid React DOM ID. + * + * @param {string} id A React DOM ID, maybe. + * @return {boolean} True if the string is a valid React DOM ID. + * @private + */ + function isValidID(id) { + return id === '' || id.charAt(0) === SEPARATOR && id.charAt(id.length - 1) !== SEPARATOR; + } + + /** + * Checks if the first ID is an ancestor of or equal to the second ID. + * + * @param {string} ancestorID + * @param {string} descendantID + * @return {boolean} True if `ancestorID` is an ancestor of `descendantID`. + * @internal + */ + function isAncestorIDOf(ancestorID, descendantID) { + return descendantID.indexOf(ancestorID) === 0 && isBoundary(descendantID, ancestorID.length); + } + + /** + * Gets the parent ID of the supplied React DOM ID, `id`. + * + * @param {string} id ID of a component. + * @return {string} ID of the parent, or an empty string. + * @private + */ + function getParentID(id) { + return id ? id.substr(0, id.lastIndexOf(SEPARATOR)) : ''; + } + + /** + * Gets the next DOM ID on the tree path from the supplied `ancestorID` to the + * supplied `destinationID`. If they are equal, the ID is returned. + * + * @param {string} ancestorID ID of an ancestor node of `destinationID`. + * @param {string} destinationID ID of the destination node. + * @return {string} Next ID on the path from `ancestorID` to `destinationID`. + * @private + */ + function getNextDescendantID(ancestorID, destinationID) { + !(isValidID(ancestorID) && isValidID(destinationID)) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'getNextDescendantID(%s, %s): Received an invalid React DOM ID.', ancestorID, destinationID) : invariant(false) : undefined; + !isAncestorIDOf(ancestorID, destinationID) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'getNextDescendantID(...): React has made an invalid assumption about ' + 'the DOM hierarchy. Expected `%s` to be an ancestor of `%s`.', ancestorID, destinationID) : invariant(false) : undefined; + if (ancestorID === destinationID) { + return ancestorID; + } + // Skip over the ancestor and the immediate separator. Traverse until we hit + // another separator or we reach the end of `destinationID`. + var start = ancestorID.length + SEPARATOR_LENGTH; + var i; + for (i = start; i < destinationID.length; i++) { + if (isBoundary(destinationID, i)) { + break; + } + } + return destinationID.substr(0, i); + } + + /** + * Gets the nearest common ancestor ID of two IDs. + * + * Using this ID scheme, the nearest common ancestor ID is the longest common + * prefix of the two IDs that immediately preceded a "marker" in both strings. + * + * @param {string} oneID + * @param {string} twoID + * @return {string} Nearest common ancestor ID, or the empty string if none. + * @private + */ + function getFirstCommonAncestorID(oneID, twoID) { + var minLength = Math.min(oneID.length, twoID.length); + if (minLength === 0) { + return ''; + } + var lastCommonMarkerIndex = 0; + // Use `<=` to traverse until the "EOL" of the shorter string. + for (var i = 0; i <= minLength; i++) { + if (isBoundary(oneID, i) && isBoundary(twoID, i)) { + lastCommonMarkerIndex = i; + } else if (oneID.charAt(i) !== twoID.charAt(i)) { + break; + } + } + var longestCommonID = oneID.substr(0, lastCommonMarkerIndex); + !isValidID(longestCommonID) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'getFirstCommonAncestorID(%s, %s): Expected a valid React DOM ID: %s', oneID, twoID, longestCommonID) : invariant(false) : undefined; + return longestCommonID; + } + + /** + * Traverses the parent path between two IDs (either up or down). The IDs must + * not be the same, and there must exist a parent path between them. If the + * callback returns `false`, traversal is stopped. + * + * @param {?string} start ID at which to start traversal. + * @param {?string} stop ID at which to end traversal. + * @param {function} cb Callback to invoke each ID with. + * @param {*} arg Argument to invoke the callback with. + * @param {?boolean} skipFirst Whether or not to skip the first node. + * @param {?boolean} skipLast Whether or not to skip the last node. + * @private + */ + function traverseParentPath(start, stop, cb, arg, skipFirst, skipLast) { + start = start || ''; + stop = stop || ''; + !(start !== stop) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'traverseParentPath(...): Cannot traverse from and to the same ID, `%s`.', start) : invariant(false) : undefined; + var traverseUp = isAncestorIDOf(stop, start); + !(traverseUp || isAncestorIDOf(start, stop)) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'traverseParentPath(%s, %s, ...): Cannot traverse from two IDs that do ' + 'not have a parent path.', start, stop) : invariant(false) : undefined; + // Traverse from `start` to `stop` one depth at a time. + var depth = 0; + var traverse = traverseUp ? getParentID : getNextDescendantID; + for (var id = start;; /* until break */id = traverse(id, stop)) { + var ret; + if ((!skipFirst || id !== start) && (!skipLast || id !== stop)) { + ret = cb(id, traverseUp, arg); + } + if (ret === false || id === stop) { + // Only break //after// visiting `stop`. + break; + } + !(depth++ < MAX_TREE_DEPTH) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'traverseParentPath(%s, %s, ...): Detected an infinite loop while ' + 'traversing the React DOM ID tree. This may be due to malformed IDs: %s', start, stop, id) : invariant(false) : undefined; + } + } + + /** + * Manages the IDs assigned to DOM representations of React components. This + * uses a specific scheme in order to traverse the DOM efficiently (e.g. in + * order to simulate events). + * + * @internal + */ + var ReactInstanceHandles = { + + /** + * Constructs a React root ID + * @return {string} A React root ID. + */ + createReactRootID: function () { + return getReactRootIDString(ReactRootIndex.createReactRootIndex()); + }, + + /** + * Constructs a React ID by joining a root ID with a name. + * + * @param {string} rootID Root ID of a parent component. + * @param {string} name A component's name (as flattened children). + * @return {string} A React ID. + * @internal + */ + createReactID: function (rootID, name) { + return rootID + name; + }, + + /** + * Gets the DOM ID of the React component that is the root of the tree that + * contains the React component with the supplied DOM ID. + * + * @param {string} id DOM ID of a React component. + * @return {?string} DOM ID of the React component that is the root. + * @internal + */ + getReactRootIDFromNodeID: function (id) { + if (id && id.charAt(0) === SEPARATOR && id.length > 1) { + var index = id.indexOf(SEPARATOR, 1); + return index > -1 ? id.substr(0, index) : id; + } + return null; + }, + + /** + * Traverses the ID hierarchy and invokes the supplied `cb` on any IDs that + * should would receive a `mouseEnter` or `mouseLeave` event. + * + * NOTE: Does not invoke the callback on the nearest common ancestor because + * nothing "entered" or "left" that element. + * + * @param {string} leaveID ID being left. + * @param {string} enterID ID being entered. + * @param {function} cb Callback to invoke on each entered/left ID. + * @param {*} upArg Argument to invoke the callback with on left IDs. + * @param {*} downArg Argument to invoke the callback with on entered IDs. + * @internal + */ + traverseEnterLeave: function (leaveID, enterID, cb, upArg, downArg) { + var ancestorID = getFirstCommonAncestorID(leaveID, enterID); + if (ancestorID !== leaveID) { + traverseParentPath(leaveID, ancestorID, cb, upArg, false, true); + } + if (ancestorID !== enterID) { + traverseParentPath(ancestorID, enterID, cb, downArg, true, false); + } + }, + + /** + * Simulates the traversal of a two-phase, capture/bubble event dispatch. + * + * NOTE: This traversal happens on IDs without touching the DOM. + * + * @param {string} targetID ID of the target node. + * @param {function} cb Callback to invoke. + * @param {*} arg Argument to invoke the callback with. + * @internal + */ + traverseTwoPhase: function (targetID, cb, arg) { + if (targetID) { + traverseParentPath('', targetID, cb, arg, true, false); + traverseParentPath(targetID, '', cb, arg, false, true); + } + }, + + /** + * Same as `traverseTwoPhase` but skips the `targetID`. + */ + traverseTwoPhaseSkipTarget: function (targetID, cb, arg) { + if (targetID) { + traverseParentPath('', targetID, cb, arg, true, true); + traverseParentPath(targetID, '', cb, arg, true, true); + } + }, + + /** + * Traverse a node ID, calling the supplied `cb` for each ancestor ID. For + * example, passing `.0.$row-0.1` would result in `cb` getting called + * with `.0`, `.0.$row-0`, and `.0.$row-0.1`. + * + * NOTE: This traversal happens on IDs without touching the DOM. + * + * @param {string} targetID ID of the target node. + * @param {function} cb Callback to invoke. + * @param {*} arg Argument to invoke the callback with. + * @internal + */ + traverseAncestors: function (targetID, cb, arg) { + traverseParentPath('', targetID, cb, arg, true, false); + }, + + getFirstCommonAncestorID: getFirstCommonAncestorID, + + /** + * Exposed for unit testing. + * @private + */ + _getNextDescendantID: getNextDescendantID, + + isAncestorIDOf: isAncestorIDOf, + + SEPARATOR: SEPARATOR + + }; + + module.exports = ReactInstanceHandles; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 45 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactRootIndex + * @typechecks + */ + + 'use strict'; + + var ReactRootIndexInjection = { + /** + * @param {function} _createReactRootIndex + */ + injectCreateReactRootIndex: function (_createReactRootIndex) { + ReactRootIndex.createReactRootIndex = _createReactRootIndex; + } + }; + + var ReactRootIndex = { + createReactRootIndex: null, + injection: ReactRootIndexInjection + }; + + module.exports = ReactRootIndex; + +/***/ }, +/* 46 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactInstanceMap + */ + + 'use strict'; + + /** + * `ReactInstanceMap` maintains a mapping from a public facing stateful + * instance (key) and the internal representation (value). This allows public + * methods to accept the user facing instance as an argument and map them back + * to internal methods. + */ + + // TODO: Replace this with ES6: var ReactInstanceMap = new Map(); + var ReactInstanceMap = { + + /** + * This API should be called `delete` but we'd have to make sure to always + * transform these to strings for IE support. When this transform is fully + * supported we can rename it. + */ + remove: function (key) { + key._reactInternalInstance = undefined; + }, + + get: function (key) { + return key._reactInternalInstance; + }, + + has: function (key) { + return key._reactInternalInstance !== undefined; + }, + + set: function (key, value) { + key._reactInternalInstance = value; + } + + }; + + module.exports = ReactInstanceMap; + +/***/ }, +/* 47 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactMarkupChecksum + */ + + 'use strict'; + + var adler32 = __webpack_require__(48); + + var TAG_END = /\/?>/; + + var ReactMarkupChecksum = { + CHECKSUM_ATTR_NAME: 'data-react-checksum', + + /** + * @param {string} markup Markup string + * @return {string} Markup string with checksum attribute attached + */ + addChecksumToMarkup: function (markup) { + var checksum = adler32(markup); + + // Add checksum (handle both parent tags and self-closing tags) + return markup.replace(TAG_END, ' ' + ReactMarkupChecksum.CHECKSUM_ATTR_NAME + '="' + checksum + '"$&'); + }, + + /** + * @param {string} markup to use + * @param {DOMElement} element root React element + * @returns {boolean} whether or not the markup is the same + */ + canReuseMarkup: function (markup, element) { + var existingChecksum = element.getAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME); + existingChecksum = existingChecksum && parseInt(existingChecksum, 10); + var markupChecksum = adler32(markup); + return markupChecksum === existingChecksum; + } + }; + + module.exports = ReactMarkupChecksum; + +/***/ }, +/* 48 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule adler32 + */ + + 'use strict'; + + var MOD = 65521; + + // adler32 is not cryptographically strong, and is only used to sanity check that + // markup generated on the server matches the markup generated on the client. + // This implementation (a modified version of the SheetJS version) has been optimized + // for our use case, at the expense of conforming to the adler32 specification + // for non-ascii inputs. + function adler32(data) { + var a = 1; + var b = 0; + var i = 0; + var l = data.length; + var m = l & ~0x3; + while (i < m) { + for (; i < Math.min(i + 4096, m); i += 4) { + b += (a += data.charCodeAt(i)) + (a += data.charCodeAt(i + 1)) + (a += data.charCodeAt(i + 2)) + (a += data.charCodeAt(i + 3)); + } + a %= MOD; + b %= MOD; + } + for (; i < l; i++) { + b += a += data.charCodeAt(i); + } + a %= MOD; + b %= MOD; + return a | b << 16; + } + + module.exports = adler32; + +/***/ }, +/* 49 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactReconciler + */ + + 'use strict'; + + var ReactRef = __webpack_require__(50); + + /** + * Helper to call ReactRef.attachRefs with this composite component, split out + * to avoid allocations in the transaction mount-ready queue. + */ + function attachRefs() { + ReactRef.attachRefs(this, this._currentElement); + } + + var ReactReconciler = { + + /** + * Initializes the component, renders markup, and registers event listeners. + * + * @param {ReactComponent} internalInstance + * @param {string} rootID DOM ID of the root node. + * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction + * @return {?string} Rendered markup to be inserted into the DOM. + * @final + * @internal + */ + mountComponent: function (internalInstance, rootID, transaction, context) { + var markup = internalInstance.mountComponent(rootID, transaction, context); + if (internalInstance._currentElement && internalInstance._currentElement.ref != null) { + transaction.getReactMountReady().enqueue(attachRefs, internalInstance); + } + return markup; + }, + + /** + * Releases any resources allocated by `mountComponent`. + * + * @final + * @internal + */ + unmountComponent: function (internalInstance) { + ReactRef.detachRefs(internalInstance, internalInstance._currentElement); + internalInstance.unmountComponent(); + }, + + /** + * Update a component using a new element. + * + * @param {ReactComponent} internalInstance + * @param {ReactElement} nextElement + * @param {ReactReconcileTransaction} transaction + * @param {object} context + * @internal + */ + receiveComponent: function (internalInstance, nextElement, transaction, context) { + var prevElement = internalInstance._currentElement; + + if (nextElement === prevElement && context === internalInstance._context) { + // Since elements are immutable after the owner is rendered, + // we can do a cheap identity compare here to determine if this is a + // superfluous reconcile. It's possible for state to be mutable but such + // change should trigger an update of the owner which would recreate + // the element. We explicitly check for the existence of an owner since + // it's possible for an element created outside a composite to be + // deeply mutated and reused. + + // TODO: Bailing out early is just a perf optimization right? + // TODO: Removing the return statement should affect correctness? + return; + } + + var refsChanged = ReactRef.shouldUpdateRefs(prevElement, nextElement); + + if (refsChanged) { + ReactRef.detachRefs(internalInstance, prevElement); + } + + internalInstance.receiveComponent(nextElement, transaction, context); + + if (refsChanged && internalInstance._currentElement && internalInstance._currentElement.ref != null) { + transaction.getReactMountReady().enqueue(attachRefs, internalInstance); + } + }, + + /** + * Flush any dirty changes in a component. + * + * @param {ReactComponent} internalInstance + * @param {ReactReconcileTransaction} transaction + * @internal + */ + performUpdateIfNecessary: function (internalInstance, transaction) { + internalInstance.performUpdateIfNecessary(transaction); + } + + }; + + module.exports = ReactReconciler; + +/***/ }, +/* 50 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactRef + */ + + 'use strict'; + + var ReactOwner = __webpack_require__(51); + + var ReactRef = {}; + + function attachRef(ref, component, owner) { + if (typeof ref === 'function') { + ref(component.getPublicInstance()); + } else { + // Legacy ref + ReactOwner.addComponentAsRefTo(component, ref, owner); + } + } + + function detachRef(ref, component, owner) { + if (typeof ref === 'function') { + ref(null); + } else { + // Legacy ref + ReactOwner.removeComponentAsRefFrom(component, ref, owner); + } + } + + ReactRef.attachRefs = function (instance, element) { + if (element === null || element === false) { + return; + } + var ref = element.ref; + if (ref != null) { + attachRef(ref, instance, element._owner); + } + }; + + ReactRef.shouldUpdateRefs = function (prevElement, nextElement) { + // If either the owner or a `ref` has changed, make sure the newest owner + // has stored a reference to `this`, and the previous owner (if different) + // has forgotten the reference to `this`. We use the element instead + // of the public this.props because the post processing cannot determine + // a ref. The ref conceptually lives on the element. + + // TODO: Should this even be possible? The owner cannot change because + // it's forbidden by shouldUpdateReactComponent. The ref can change + // if you swap the keys of but not the refs. Reconsider where this check + // is made. It probably belongs where the key checking and + // instantiateReactComponent is done. + + var prevEmpty = prevElement === null || prevElement === false; + var nextEmpty = nextElement === null || nextElement === false; + + return( + // This has a few false positives w/r/t empty components. + prevEmpty || nextEmpty || nextElement._owner !== prevElement._owner || nextElement.ref !== prevElement.ref + ); + }; + + ReactRef.detachRefs = function (instance, element) { + if (element === null || element === false) { + return; + } + var ref = element.ref; + if (ref != null) { + detachRef(ref, instance, element._owner); + } + }; + + module.exports = ReactRef; + +/***/ }, +/* 51 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactOwner + */ + + 'use strict'; + + var invariant = __webpack_require__(12); + + /** + * ReactOwners are capable of storing references to owned components. + * + * All components are capable of //being// referenced by owner components, but + * only ReactOwner components are capable of //referencing// owned components. + * The named reference is known as a "ref". + * + * Refs are available when mounted and updated during reconciliation. + * + * var MyComponent = React.createClass({ + * render: function() { + * return ( + * <div onClick={this.handleClick}> + * <CustomComponent ref="custom" /> + * </div> + * ); + * }, + * handleClick: function() { + * this.refs.custom.handleClick(); + * }, + * componentDidMount: function() { + * this.refs.custom.initialize(); + * } + * }); + * + * Refs should rarely be used. When refs are used, they should only be done to + * control data that is not handled by React's data flow. + * + * @class ReactOwner + */ + var ReactOwner = { + + /** + * @param {?object} object + * @return {boolean} True if `object` is a valid owner. + * @final + */ + isValidOwner: function (object) { + return !!(object && typeof object.attachRef === 'function' && typeof object.detachRef === 'function'); + }, + + /** + * Adds a component by ref to an owner component. + * + * @param {ReactComponent} component Component to reference. + * @param {string} ref Name by which to refer to the component. + * @param {ReactOwner} owner Component on which to record the ref. + * @final + * @internal + */ + addComponentAsRefTo: function (component, ref, owner) { + !ReactOwner.isValidOwner(owner) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'addComponentAsRefTo(...): Only a ReactOwner can have refs. You might ' + 'be adding a ref to a component that was not created inside a component\'s ' + '`render` method, or you have multiple copies of React loaded ' + '(details: https://fb.me/react-refs-must-have-owner).') : invariant(false) : undefined; + owner.attachRef(ref, component); + }, + + /** + * Removes a component by ref from an owner component. + * + * @param {ReactComponent} component Component to dereference. + * @param {string} ref Name of the ref to remove. + * @param {ReactOwner} owner Component on which the ref is recorded. + * @final + * @internal + */ + removeComponentAsRefFrom: function (component, ref, owner) { + !ReactOwner.isValidOwner(owner) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'removeComponentAsRefFrom(...): Only a ReactOwner can have refs. You might ' + 'be removing a ref to a component that was not created inside a component\'s ' + '`render` method, or you have multiple copies of React loaded ' + '(details: https://fb.me/react-refs-must-have-owner).') : invariant(false) : undefined; + // Check that `component` is still the current ref because we do not want to + // detach the ref if another component stole it. + if (owner.getPublicInstance().refs[ref] === component.getPublicInstance()) { + owner.detachRef(ref); + } + } + + }; + + module.exports = ReactOwner; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 52 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactUpdateQueue + */ + + 'use strict'; + + var ReactCurrentOwner = __webpack_require__(4); + var ReactElement = __webpack_require__(41); + var ReactInstanceMap = __webpack_require__(46); + var ReactUpdates = __webpack_require__(53); + + var assign = __webpack_require__(38); + var invariant = __webpack_require__(12); + var warning = __webpack_require__(24); + + function enqueueUpdate(internalInstance) { + ReactUpdates.enqueueUpdate(internalInstance); + } + + function getInternalInstanceReadyForUpdate(publicInstance, callerName) { + var internalInstance = ReactInstanceMap.get(publicInstance); + if (!internalInstance) { + if (process.env.NODE_ENV !== 'production') { + // Only warn when we have a callerName. Otherwise we should be silent. + // We're probably calling from enqueueCallback. We don't want to warn + // there because we already warned for the corresponding lifecycle method. + process.env.NODE_ENV !== 'production' ? warning(!callerName, '%s(...): Can only update a mounted or mounting component. ' + 'This usually means you called %s() on an unmounted component. ' + 'This is a no-op. Please check the code for the %s component.', callerName, callerName, publicInstance.constructor.displayName) : undefined; + } + return null; + } + + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(ReactCurrentOwner.current == null, '%s(...): Cannot update during an existing state transition ' + '(such as within `render`). Render methods should be a pure function ' + 'of props and state.', callerName) : undefined; + } + + return internalInstance; + } + + /** + * ReactUpdateQueue allows for state updates to be scheduled into a later + * reconciliation step. + */ + var ReactUpdateQueue = { + + /** + * Checks whether or not this composite component is mounted. + * @param {ReactClass} publicInstance The instance we want to test. + * @return {boolean} True if mounted, false otherwise. + * @protected + * @final + */ + isMounted: function (publicInstance) { + if (process.env.NODE_ENV !== 'production') { + var owner = ReactCurrentOwner.current; + if (owner !== null) { + process.env.NODE_ENV !== 'production' ? warning(owner._warnedAboutRefsInRender, '%s is accessing isMounted inside its render() function. ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', owner.getName() || 'A component') : undefined; + owner._warnedAboutRefsInRender = true; + } + } + var internalInstance = ReactInstanceMap.get(publicInstance); + if (internalInstance) { + // During componentWillMount and render this will still be null but after + // that will always render to something. At least for now. So we can use + // this hack. + return !!internalInstance._renderedComponent; + } else { + return false; + } + }, + + /** + * Enqueue a callback that will be executed after all the pending updates + * have processed. + * + * @param {ReactClass} publicInstance The instance to use as `this` context. + * @param {?function} callback Called after state is updated. + * @internal + */ + enqueueCallback: function (publicInstance, callback) { + !(typeof callback === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'enqueueCallback(...): You called `setProps`, `replaceProps`, ' + '`setState`, `replaceState`, or `forceUpdate` with a callback that ' + 'isn\'t callable.') : invariant(false) : undefined; + var internalInstance = getInternalInstanceReadyForUpdate(publicInstance); + + // Previously we would throw an error if we didn't have an internal + // instance. Since we want to make it a no-op instead, we mirror the same + // behavior we have in other enqueue* methods. + // We also need to ignore callbacks in componentWillMount. See + // enqueueUpdates. + if (!internalInstance) { + return null; + } + + if (internalInstance._pendingCallbacks) { + internalInstance._pendingCallbacks.push(callback); + } else { + internalInstance._pendingCallbacks = [callback]; + } + // TODO: The callback here is ignored when setState is called from + // componentWillMount. Either fix it or disallow doing so completely in + // favor of getInitialState. Alternatively, we can disallow + // componentWillMount during server-side rendering. + enqueueUpdate(internalInstance); + }, + + enqueueCallbackInternal: function (internalInstance, callback) { + !(typeof callback === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'enqueueCallback(...): You called `setProps`, `replaceProps`, ' + '`setState`, `replaceState`, or `forceUpdate` with a callback that ' + 'isn\'t callable.') : invariant(false) : undefined; + if (internalInstance._pendingCallbacks) { + internalInstance._pendingCallbacks.push(callback); + } else { + internalInstance._pendingCallbacks = [callback]; + } + enqueueUpdate(internalInstance); + }, + + /** + * Forces an update. This should only be invoked when it is known with + * certainty that we are **not** in a DOM transaction. + * + * You may want to call this when you know that some deeper aspect of the + * component's state has changed but `setState` was not called. + * + * This will not invoke `shouldComponentUpdate`, but it will invoke + * `componentWillUpdate` and `componentDidUpdate`. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @internal + */ + enqueueForceUpdate: function (publicInstance) { + var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'forceUpdate'); + + if (!internalInstance) { + return; + } + + internalInstance._pendingForceUpdate = true; + + enqueueUpdate(internalInstance); + }, + + /** + * Replaces all of the state. Always use this or `setState` to mutate state. + * You should treat `this.state` as immutable. + * + * There is no guarantee that `this.state` will be immediately updated, so + * accessing `this.state` after calling this method may return the old value. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {object} completeState Next state. + * @internal + */ + enqueueReplaceState: function (publicInstance, completeState) { + var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'replaceState'); + + if (!internalInstance) { + return; + } + + internalInstance._pendingStateQueue = [completeState]; + internalInstance._pendingReplaceState = true; + + enqueueUpdate(internalInstance); + }, + + /** + * Sets a subset of the state. This only exists because _pendingState is + * internal. This provides a merging strategy that is not available to deep + * properties which is confusing. TODO: Expose pendingState or don't use it + * during the merge. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {object} partialState Next partial state to be merged with state. + * @internal + */ + enqueueSetState: function (publicInstance, partialState) { + var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'setState'); + + if (!internalInstance) { + return; + } + + var queue = internalInstance._pendingStateQueue || (internalInstance._pendingStateQueue = []); + queue.push(partialState); + + enqueueUpdate(internalInstance); + }, + + /** + * Sets a subset of the props. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {object} partialProps Subset of the next props. + * @internal + */ + enqueueSetProps: function (publicInstance, partialProps) { + var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'setProps'); + if (!internalInstance) { + return; + } + ReactUpdateQueue.enqueueSetPropsInternal(internalInstance, partialProps); + }, + + enqueueSetPropsInternal: function (internalInstance, partialProps) { + var topLevelWrapper = internalInstance._topLevelWrapper; + !topLevelWrapper ? process.env.NODE_ENV !== 'production' ? invariant(false, 'setProps(...): You called `setProps` on a ' + 'component with a parent. This is an anti-pattern since props will ' + 'get reactively updated when rendered. Instead, change the owner\'s ' + '`render` method to pass the correct value as props to the component ' + 'where it is created.') : invariant(false) : undefined; + + // Merge with the pending element if it exists, otherwise with existing + // element props. + var wrapElement = topLevelWrapper._pendingElement || topLevelWrapper._currentElement; + var element = wrapElement.props; + var props = assign({}, element.props, partialProps); + topLevelWrapper._pendingElement = ReactElement.cloneAndReplaceProps(wrapElement, ReactElement.cloneAndReplaceProps(element, props)); + + enqueueUpdate(topLevelWrapper); + }, + + /** + * Replaces all of the props. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {object} props New props. + * @internal + */ + enqueueReplaceProps: function (publicInstance, props) { + var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'replaceProps'); + if (!internalInstance) { + return; + } + ReactUpdateQueue.enqueueReplacePropsInternal(internalInstance, props); + }, + + enqueueReplacePropsInternal: function (internalInstance, props) { + var topLevelWrapper = internalInstance._topLevelWrapper; + !topLevelWrapper ? process.env.NODE_ENV !== 'production' ? invariant(false, 'replaceProps(...): You called `replaceProps` on a ' + 'component with a parent. This is an anti-pattern since props will ' + 'get reactively updated when rendered. Instead, change the owner\'s ' + '`render` method to pass the correct value as props to the component ' + 'where it is created.') : invariant(false) : undefined; + + // Merge with the pending element if it exists, otherwise with existing + // element props. + var wrapElement = topLevelWrapper._pendingElement || topLevelWrapper._currentElement; + var element = wrapElement.props; + topLevelWrapper._pendingElement = ReactElement.cloneAndReplaceProps(wrapElement, ReactElement.cloneAndReplaceProps(element, props)); + + enqueueUpdate(topLevelWrapper); + }, + + enqueueElementInternal: function (internalInstance, newElement) { + internalInstance._pendingElement = newElement; + enqueueUpdate(internalInstance); + } + + }; + + module.exports = ReactUpdateQueue; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 53 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactUpdates + */ + + 'use strict'; + + var CallbackQueue = __webpack_require__(54); + var PooledClass = __webpack_require__(55); + var ReactPerf = __webpack_require__(17); + var ReactReconciler = __webpack_require__(49); + var Transaction = __webpack_require__(56); + + var assign = __webpack_require__(38); + var invariant = __webpack_require__(12); + + var dirtyComponents = []; + var asapCallbackQueue = CallbackQueue.getPooled(); + var asapEnqueued = false; + + var batchingStrategy = null; + + function ensureInjected() { + !(ReactUpdates.ReactReconcileTransaction && batchingStrategy) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactUpdates: must inject a reconcile transaction class and batching ' + 'strategy') : invariant(false) : undefined; + } + + var NESTED_UPDATES = { + initialize: function () { + this.dirtyComponentsLength = dirtyComponents.length; + }, + close: function () { + if (this.dirtyComponentsLength !== dirtyComponents.length) { + // Additional updates were enqueued by componentDidUpdate handlers or + // similar; before our own UPDATE_QUEUEING wrapper closes, we want to run + // these new updates so that if A's componentDidUpdate calls setState on + // B, B will update before the callback A's updater provided when calling + // setState. + dirtyComponents.splice(0, this.dirtyComponentsLength); + flushBatchedUpdates(); + } else { + dirtyComponents.length = 0; + } + } + }; + + var UPDATE_QUEUEING = { + initialize: function () { + this.callbackQueue.reset(); + }, + close: function () { + this.callbackQueue.notifyAll(); + } + }; + + var TRANSACTION_WRAPPERS = [NESTED_UPDATES, UPDATE_QUEUEING]; + + function ReactUpdatesFlushTransaction() { + this.reinitializeTransaction(); + this.dirtyComponentsLength = null; + this.callbackQueue = CallbackQueue.getPooled(); + this.reconcileTransaction = ReactUpdates.ReactReconcileTransaction.getPooled( /* forceHTML */false); + } + + assign(ReactUpdatesFlushTransaction.prototype, Transaction.Mixin, { + getTransactionWrappers: function () { + return TRANSACTION_WRAPPERS; + }, + + destructor: function () { + this.dirtyComponentsLength = null; + CallbackQueue.release(this.callbackQueue); + this.callbackQueue = null; + ReactUpdates.ReactReconcileTransaction.release(this.reconcileTransaction); + this.reconcileTransaction = null; + }, + + perform: function (method, scope, a) { + // Essentially calls `this.reconcileTransaction.perform(method, scope, a)` + // with this transaction's wrappers around it. + return Transaction.Mixin.perform.call(this, this.reconcileTransaction.perform, this.reconcileTransaction, method, scope, a); + } + }); + + PooledClass.addPoolingTo(ReactUpdatesFlushTransaction); + + function batchedUpdates(callback, a, b, c, d, e) { + ensureInjected(); + batchingStrategy.batchedUpdates(callback, a, b, c, d, e); + } + + /** + * Array comparator for ReactComponents by mount ordering. + * + * @param {ReactComponent} c1 first component you're comparing + * @param {ReactComponent} c2 second component you're comparing + * @return {number} Return value usable by Array.prototype.sort(). + */ + function mountOrderComparator(c1, c2) { + return c1._mountOrder - c2._mountOrder; + } + + function runBatchedUpdates(transaction) { + var len = transaction.dirtyComponentsLength; + !(len === dirtyComponents.length) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Expected flush transaction\'s stored dirty-components length (%s) to ' + 'match dirty-components array length (%s).', len, dirtyComponents.length) : invariant(false) : undefined; + + // Since reconciling a component higher in the owner hierarchy usually (not + // always -- see shouldComponentUpdate()) will reconcile children, reconcile + // them before their children by sorting the array. + dirtyComponents.sort(mountOrderComparator); + + for (var i = 0; i < len; i++) { + // If a component is unmounted before pending changes apply, it will still + // be here, but we assume that it has cleared its _pendingCallbacks and + // that performUpdateIfNecessary is a noop. + var component = dirtyComponents[i]; + + // If performUpdateIfNecessary happens to enqueue any new updates, we + // shouldn't execute the callbacks until the next render happens, so + // stash the callbacks first + var callbacks = component._pendingCallbacks; + component._pendingCallbacks = null; + + ReactReconciler.performUpdateIfNecessary(component, transaction.reconcileTransaction); + + if (callbacks) { + for (var j = 0; j < callbacks.length; j++) { + transaction.callbackQueue.enqueue(callbacks[j], component.getPublicInstance()); + } + } + } + } + + var flushBatchedUpdates = function () { + // ReactUpdatesFlushTransaction's wrappers will clear the dirtyComponents + // array and perform any updates enqueued by mount-ready handlers (i.e., + // componentDidUpdate) but we need to check here too in order to catch + // updates enqueued by setState callbacks and asap calls. + while (dirtyComponents.length || asapEnqueued) { + if (dirtyComponents.length) { + var transaction = ReactUpdatesFlushTransaction.getPooled(); + transaction.perform(runBatchedUpdates, null, transaction); + ReactUpdatesFlushTransaction.release(transaction); + } + + if (asapEnqueued) { + asapEnqueued = false; + var queue = asapCallbackQueue; + asapCallbackQueue = CallbackQueue.getPooled(); + queue.notifyAll(); + CallbackQueue.release(queue); + } + } + }; + flushBatchedUpdates = ReactPerf.measure('ReactUpdates', 'flushBatchedUpdates', flushBatchedUpdates); + + /** + * Mark a component as needing a rerender, adding an optional callback to a + * list of functions which will be executed once the rerender occurs. + */ + function enqueueUpdate(component) { + ensureInjected(); + + // Various parts of our code (such as ReactCompositeComponent's + // _renderValidatedComponent) assume that calls to render aren't nested; + // verify that that's the case. (This is called by each top-level update + // function, like setProps, setState, forceUpdate, etc.; creation and + // destruction of top-level components is guarded in ReactMount.) + + if (!batchingStrategy.isBatchingUpdates) { + batchingStrategy.batchedUpdates(enqueueUpdate, component); + return; + } + + dirtyComponents.push(component); + } + + /** + * Enqueue a callback to be run at the end of the current batching cycle. Throws + * if no updates are currently being performed. + */ + function asap(callback, context) { + !batchingStrategy.isBatchingUpdates ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactUpdates.asap: Can\'t enqueue an asap callback in a context where' + 'updates are not being batched.') : invariant(false) : undefined; + asapCallbackQueue.enqueue(callback, context); + asapEnqueued = true; + } + + var ReactUpdatesInjection = { + injectReconcileTransaction: function (ReconcileTransaction) { + !ReconcileTransaction ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactUpdates: must provide a reconcile transaction class') : invariant(false) : undefined; + ReactUpdates.ReactReconcileTransaction = ReconcileTransaction; + }, + + injectBatchingStrategy: function (_batchingStrategy) { + !_batchingStrategy ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactUpdates: must provide a batching strategy') : invariant(false) : undefined; + !(typeof _batchingStrategy.batchedUpdates === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactUpdates: must provide a batchedUpdates() function') : invariant(false) : undefined; + !(typeof _batchingStrategy.isBatchingUpdates === 'boolean') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactUpdates: must provide an isBatchingUpdates boolean attribute') : invariant(false) : undefined; + batchingStrategy = _batchingStrategy; + } + }; + + var ReactUpdates = { + /** + * React references `ReactReconcileTransaction` using this property in order + * to allow dependency injection. + * + * @internal + */ + ReactReconcileTransaction: null, + + batchedUpdates: batchedUpdates, + enqueueUpdate: enqueueUpdate, + flushBatchedUpdates: flushBatchedUpdates, + injection: ReactUpdatesInjection, + asap: asap + }; + + module.exports = ReactUpdates; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 54 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule CallbackQueue + */ + + 'use strict'; + + var PooledClass = __webpack_require__(55); + + var assign = __webpack_require__(38); + var invariant = __webpack_require__(12); + + /** + * A specialized pseudo-event module to help keep track of components waiting to + * be notified when their DOM representations are available for use. + * + * This implements `PooledClass`, so you should never need to instantiate this. + * Instead, use `CallbackQueue.getPooled()`. + * + * @class ReactMountReady + * @implements PooledClass + * @internal + */ + function CallbackQueue() { + this._callbacks = null; + this._contexts = null; + } + + assign(CallbackQueue.prototype, { + + /** + * Enqueues a callback to be invoked when `notifyAll` is invoked. + * + * @param {function} callback Invoked when `notifyAll` is invoked. + * @param {?object} context Context to call `callback` with. + * @internal + */ + enqueue: function (callback, context) { + this._callbacks = this._callbacks || []; + this._contexts = this._contexts || []; + this._callbacks.push(callback); + this._contexts.push(context); + }, + + /** + * Invokes all enqueued callbacks and clears the queue. This is invoked after + * the DOM representation of a component has been created or updated. + * + * @internal + */ + notifyAll: function () { + var callbacks = this._callbacks; + var contexts = this._contexts; + if (callbacks) { + !(callbacks.length === contexts.length) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Mismatched list of contexts in callback queue') : invariant(false) : undefined; + this._callbacks = null; + this._contexts = null; + for (var i = 0; i < callbacks.length; i++) { + callbacks[i].call(contexts[i]); + } + callbacks.length = 0; + contexts.length = 0; + } + }, + + /** + * Resets the internal queue. + * + * @internal + */ + reset: function () { + this._callbacks = null; + this._contexts = null; + }, + + /** + * `PooledClass` looks for this. + */ + destructor: function () { + this.reset(); + } + + }); + + PooledClass.addPoolingTo(CallbackQueue); + + module.exports = CallbackQueue; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 55 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule PooledClass + */ + + 'use strict'; + + var invariant = __webpack_require__(12); + + /** + * Static poolers. Several custom versions for each potential number of + * arguments. A completely generic pooler is easy to implement, but would + * require accessing the `arguments` object. In each of these, `this` refers to + * the Class itself, not an instance. If any others are needed, simply add them + * here, or in their own files. + */ + var oneArgumentPooler = function (copyFieldsFrom) { + var Klass = this; + if (Klass.instancePool.length) { + var instance = Klass.instancePool.pop(); + Klass.call(instance, copyFieldsFrom); + return instance; + } else { + return new Klass(copyFieldsFrom); + } + }; + + var twoArgumentPooler = function (a1, a2) { + var Klass = this; + if (Klass.instancePool.length) { + var instance = Klass.instancePool.pop(); + Klass.call(instance, a1, a2); + return instance; + } else { + return new Klass(a1, a2); + } + }; + + var threeArgumentPooler = function (a1, a2, a3) { + var Klass = this; + if (Klass.instancePool.length) { + var instance = Klass.instancePool.pop(); + Klass.call(instance, a1, a2, a3); + return instance; + } else { + return new Klass(a1, a2, a3); + } + }; + + var fourArgumentPooler = function (a1, a2, a3, a4) { + var Klass = this; + if (Klass.instancePool.length) { + var instance = Klass.instancePool.pop(); + Klass.call(instance, a1, a2, a3, a4); + return instance; + } else { + return new Klass(a1, a2, a3, a4); + } + }; + + var fiveArgumentPooler = function (a1, a2, a3, a4, a5) { + var Klass = this; + if (Klass.instancePool.length) { + var instance = Klass.instancePool.pop(); + Klass.call(instance, a1, a2, a3, a4, a5); + return instance; + } else { + return new Klass(a1, a2, a3, a4, a5); + } + }; + + var standardReleaser = function (instance) { + var Klass = this; + !(instance instanceof Klass) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Trying to release an instance into a pool of a different type.') : invariant(false) : undefined; + instance.destructor(); + if (Klass.instancePool.length < Klass.poolSize) { + Klass.instancePool.push(instance); + } + }; + + var DEFAULT_POOL_SIZE = 10; + var DEFAULT_POOLER = oneArgumentPooler; + + /** + * Augments `CopyConstructor` to be a poolable class, augmenting only the class + * itself (statically) not adding any prototypical fields. Any CopyConstructor + * you give this may have a `poolSize` property, and will look for a + * prototypical `destructor` on instances (optional). + * + * @param {Function} CopyConstructor Constructor that can be used to reset. + * @param {Function} pooler Customizable pooler. + */ + var addPoolingTo = function (CopyConstructor, pooler) { + var NewKlass = CopyConstructor; + NewKlass.instancePool = []; + NewKlass.getPooled = pooler || DEFAULT_POOLER; + if (!NewKlass.poolSize) { + NewKlass.poolSize = DEFAULT_POOL_SIZE; + } + NewKlass.release = standardReleaser; + return NewKlass; + }; + + var PooledClass = { + addPoolingTo: addPoolingTo, + oneArgumentPooler: oneArgumentPooler, + twoArgumentPooler: twoArgumentPooler, + threeArgumentPooler: threeArgumentPooler, + fourArgumentPooler: fourArgumentPooler, + fiveArgumentPooler: fiveArgumentPooler + }; + + module.exports = PooledClass; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 56 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule Transaction + */ + + 'use strict'; + + var invariant = __webpack_require__(12); + + /** + * `Transaction` creates a black box that is able to wrap any method such that + * certain invariants are maintained before and after the method is invoked + * (Even if an exception is thrown while invoking the wrapped method). Whoever + * instantiates a transaction can provide enforcers of the invariants at + * creation time. The `Transaction` class itself will supply one additional + * automatic invariant for you - the invariant that any transaction instance + * should not be run while it is already being run. You would typically create a + * single instance of a `Transaction` for reuse multiple times, that potentially + * is used to wrap several different methods. Wrappers are extremely simple - + * they only require implementing two methods. + * + * <pre> + * wrappers (injected at creation time) + * + + + * | | + * +-----------------|--------|--------------+ + * | v | | + * | +---------------+ | | + * | +--| wrapper1 |---|----+ | + * | | +---------------+ v | | + * | | +-------------+ | | + * | | +----| wrapper2 |--------+ | + * | | | +-------------+ | | | + * | | | | | | + * | v v v v | wrapper + * | +---+ +---+ +---------+ +---+ +---+ | invariants + * perform(anyMethod) | | | | | | | | | | | | maintained + * +----------------->|-|---|-|---|-->|anyMethod|---|---|-|---|-|--------> + * | | | | | | | | | | | | + * | | | | | | | | | | | | + * | | | | | | | | | | | | + * | +---+ +---+ +---------+ +---+ +---+ | + * | initialize close | + * +-----------------------------------------+ + * </pre> + * + * Use cases: + * - Preserving the input selection ranges before/after reconciliation. + * Restoring selection even in the event of an unexpected error. + * - Deactivating events while rearranging the DOM, preventing blurs/focuses, + * while guaranteeing that afterwards, the event system is reactivated. + * - Flushing a queue of collected DOM mutations to the main UI thread after a + * reconciliation takes place in a worker thread. + * - Invoking any collected `componentDidUpdate` callbacks after rendering new + * content. + * - (Future use case): Wrapping particular flushes of the `ReactWorker` queue + * to preserve the `scrollTop` (an automatic scroll aware DOM). + * - (Future use case): Layout calculations before and after DOM updates. + * + * Transactional plugin API: + * - A module that has an `initialize` method that returns any precomputation. + * - and a `close` method that accepts the precomputation. `close` is invoked + * when the wrapped process is completed, or has failed. + * + * @param {Array<TransactionalWrapper>} transactionWrapper Wrapper modules + * that implement `initialize` and `close`. + * @return {Transaction} Single transaction for reuse in thread. + * + * @class Transaction + */ + var Mixin = { + /** + * Sets up this instance so that it is prepared for collecting metrics. Does + * so such that this setup method may be used on an instance that is already + * initialized, in a way that does not consume additional memory upon reuse. + * That can be useful if you decide to make your subclass of this mixin a + * "PooledClass". + */ + reinitializeTransaction: function () { + this.transactionWrappers = this.getTransactionWrappers(); + if (this.wrapperInitData) { + this.wrapperInitData.length = 0; + } else { + this.wrapperInitData = []; + } + this._isInTransaction = false; + }, + + _isInTransaction: false, + + /** + * @abstract + * @return {Array<TransactionWrapper>} Array of transaction wrappers. + */ + getTransactionWrappers: null, + + isInTransaction: function () { + return !!this._isInTransaction; + }, + + /** + * Executes the function within a safety window. Use this for the top level + * methods that result in large amounts of computation/mutations that would + * need to be safety checked. The optional arguments helps prevent the need + * to bind in many cases. + * + * @param {function} method Member of scope to call. + * @param {Object} scope Scope to invoke from. + * @param {Object?=} a Argument to pass to the method. + * @param {Object?=} b Argument to pass to the method. + * @param {Object?=} c Argument to pass to the method. + * @param {Object?=} d Argument to pass to the method. + * @param {Object?=} e Argument to pass to the method. + * @param {Object?=} f Argument to pass to the method. + * + * @return {*} Return value from `method`. + */ + perform: function (method, scope, a, b, c, d, e, f) { + !!this.isInTransaction() ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Transaction.perform(...): Cannot initialize a transaction when there ' + 'is already an outstanding transaction.') : invariant(false) : undefined; + var errorThrown; + var ret; + try { + this._isInTransaction = true; + // Catching errors makes debugging more difficult, so we start with + // errorThrown set to true before setting it to false after calling + // close -- if it's still set to true in the finally block, it means + // one of these calls threw. + errorThrown = true; + this.initializeAll(0); + ret = method.call(scope, a, b, c, d, e, f); + errorThrown = false; + } finally { + try { + if (errorThrown) { + // If `method` throws, prefer to show that stack trace over any thrown + // by invoking `closeAll`. + try { + this.closeAll(0); + } catch (err) {} + } else { + // Since `method` didn't throw, we don't want to silence the exception + // here. + this.closeAll(0); + } + } finally { + this._isInTransaction = false; + } + } + return ret; + }, + + initializeAll: function (startIndex) { + var transactionWrappers = this.transactionWrappers; + for (var i = startIndex; i < transactionWrappers.length; i++) { + var wrapper = transactionWrappers[i]; + try { + // Catching errors makes debugging more difficult, so we start with the + // OBSERVED_ERROR state before overwriting it with the real return value + // of initialize -- if it's still set to OBSERVED_ERROR in the finally + // block, it means wrapper.initialize threw. + this.wrapperInitData[i] = Transaction.OBSERVED_ERROR; + this.wrapperInitData[i] = wrapper.initialize ? wrapper.initialize.call(this) : null; + } finally { + if (this.wrapperInitData[i] === Transaction.OBSERVED_ERROR) { + // The initializer for wrapper i threw an error; initialize the + // remaining wrappers but silence any exceptions from them to ensure + // that the first error is the one to bubble up. + try { + this.initializeAll(i + 1); + } catch (err) {} + } + } + } + }, + + /** + * Invokes each of `this.transactionWrappers.close[i]` functions, passing into + * them the respective return values of `this.transactionWrappers.init[i]` + * (`close`rs that correspond to initializers that failed will not be + * invoked). + */ + closeAll: function (startIndex) { + !this.isInTransaction() ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Transaction.closeAll(): Cannot close transaction when none are open.') : invariant(false) : undefined; + var transactionWrappers = this.transactionWrappers; + for (var i = startIndex; i < transactionWrappers.length; i++) { + var wrapper = transactionWrappers[i]; + var initData = this.wrapperInitData[i]; + var errorThrown; + try { + // Catching errors makes debugging more difficult, so we start with + // errorThrown set to true before setting it to false after calling + // close -- if it's still set to true in the finally block, it means + // wrapper.close threw. + errorThrown = true; + if (initData !== Transaction.OBSERVED_ERROR && wrapper.close) { + wrapper.close.call(this, initData); + } + errorThrown = false; + } finally { + if (errorThrown) { + // The closer for wrapper i threw an error; close the remaining + // wrappers but silence any exceptions from them to ensure that the + // first error is the one to bubble up. + try { + this.closeAll(i + 1); + } catch (e) {} + } + } + } + this.wrapperInitData.length = 0; + } + }; + + var Transaction = { + + Mixin: Mixin, + + /** + * Token to look for to determine if an error occurred. + */ + OBSERVED_ERROR: {} + + }; + + module.exports = Transaction; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 57 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule emptyObject + */ + + 'use strict'; + + var emptyObject = {}; + + if (process.env.NODE_ENV !== 'production') { + Object.freeze(emptyObject); + } + + module.exports = emptyObject; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 58 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule containsNode + * @typechecks + */ + + 'use strict'; + + var isTextNode = __webpack_require__(59); + + /*eslint-disable no-bitwise */ + + /** + * Checks if a given DOM node contains or is another DOM node. + * + * @param {?DOMNode} outerNode Outer DOM node. + * @param {?DOMNode} innerNode Inner DOM node. + * @return {boolean} True if `outerNode` contains or is `innerNode`. + */ + function containsNode(_x, _x2) { + var _again = true; + + _function: while (_again) { + var outerNode = _x, + innerNode = _x2; + _again = false; + + if (!outerNode || !innerNode) { + return false; + } else if (outerNode === innerNode) { + return true; + } else if (isTextNode(outerNode)) { + return false; + } else if (isTextNode(innerNode)) { + _x = outerNode; + _x2 = innerNode.parentNode; + _again = true; + continue _function; + } else if (outerNode.contains) { + return outerNode.contains(innerNode); + } else if (outerNode.compareDocumentPosition) { + return !!(outerNode.compareDocumentPosition(innerNode) & 16); + } else { + return false; + } + } + } + + module.exports = containsNode; + +/***/ }, +/* 59 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule isTextNode + * @typechecks + */ + + 'use strict'; + + var isNode = __webpack_require__(60); + + /** + * @param {*} object The object to check. + * @return {boolean} Whether or not the object is a DOM text node. + */ + function isTextNode(object) { + return isNode(object) && object.nodeType == 3; + } + + module.exports = isTextNode; + +/***/ }, +/* 60 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule isNode + * @typechecks + */ + + /** + * @param {*} object The object to check. + * @return {boolean} Whether or not the object is a DOM node. + */ + 'use strict'; + + function isNode(object) { + return !!(object && (typeof Node === 'function' ? object instanceof Node : typeof object === 'object' && typeof object.nodeType === 'number' && typeof object.nodeName === 'string')); + } + + module.exports = isNode; + +/***/ }, +/* 61 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule instantiateReactComponent + * @typechecks static-only + */ + + 'use strict'; + + var ReactCompositeComponent = __webpack_require__(62); + var ReactEmptyComponent = __webpack_require__(67); + var ReactNativeComponent = __webpack_require__(68); + + var assign = __webpack_require__(38); + var invariant = __webpack_require__(12); + var warning = __webpack_require__(24); + + // To avoid a cyclic dependency, we create the final class in this module + var ReactCompositeComponentWrapper = function () {}; + assign(ReactCompositeComponentWrapper.prototype, ReactCompositeComponent.Mixin, { + _instantiateReactComponent: instantiateReactComponent + }); + + function getDeclarationErrorAddendum(owner) { + if (owner) { + var name = owner.getName(); + if (name) { + return ' Check the render method of `' + name + '`.'; + } + } + return ''; + } + + /** + * Check if the type reference is a known internal type. I.e. not a user + * provided composite type. + * + * @param {function} type + * @return {boolean} Returns true if this is a valid internal type. + */ + function isInternalComponentType(type) { + return typeof type === 'function' && typeof type.prototype !== 'undefined' && typeof type.prototype.mountComponent === 'function' && typeof type.prototype.receiveComponent === 'function'; + } + + /** + * Given a ReactNode, create an instance that will actually be mounted. + * + * @param {ReactNode} node + * @return {object} A new instance of the element's constructor. + * @protected + */ + function instantiateReactComponent(node) { + var instance; + + if (node === null || node === false) { + instance = new ReactEmptyComponent(instantiateReactComponent); + } else if (typeof node === 'object') { + var element = node; + !(element && (typeof element.type === 'function' || typeof element.type === 'string')) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Element type is invalid: expected a string (for built-in components) ' + 'or a class/function (for composite components) but got: %s.%s', element.type == null ? element.type : typeof element.type, getDeclarationErrorAddendum(element._owner)) : invariant(false) : undefined; + + // Special case string values + if (typeof element.type === 'string') { + instance = ReactNativeComponent.createInternalComponent(element); + } else if (isInternalComponentType(element.type)) { + // This is temporarily available for custom components that are not string + // representations. I.e. ART. Once those are updated to use the string + // representation, we can drop this code path. + instance = new element.type(element); + } else { + instance = new ReactCompositeComponentWrapper(); + } + } else if (typeof node === 'string' || typeof node === 'number') { + instance = ReactNativeComponent.createInstanceForText(node); + } else { + true ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Encountered invalid React node of type %s', typeof node) : invariant(false) : undefined; + } + + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(typeof instance.construct === 'function' && typeof instance.mountComponent === 'function' && typeof instance.receiveComponent === 'function' && typeof instance.unmountComponent === 'function', 'Only React Components can be mounted.') : undefined; + } + + // Sets up the instance. This can probably just move into the constructor now. + instance.construct(node); + + // These two fields are used by the DOM and ART diffing algorithms + // respectively. Instead of using expandos on components, we should be + // storing the state needed by the diffing algorithms elsewhere. + instance._mountIndex = 0; + instance._mountImage = null; + + if (process.env.NODE_ENV !== 'production') { + instance._isOwnerNecessary = false; + instance._warnedAboutRefsInRender = false; + } + + // Internal instances should fully constructed at this point, so they should + // not get any new fields added to them at this point. + if (process.env.NODE_ENV !== 'production') { + if (Object.preventExtensions) { + Object.preventExtensions(instance); + } + } + + return instance; + } + + module.exports = instantiateReactComponent; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 62 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactCompositeComponent + */ + + 'use strict'; + + var ReactComponentEnvironment = __webpack_require__(63); + var ReactCurrentOwner = __webpack_require__(4); + var ReactElement = __webpack_require__(41); + var ReactInstanceMap = __webpack_require__(46); + var ReactPerf = __webpack_require__(17); + var ReactPropTypeLocations = __webpack_require__(64); + var ReactPropTypeLocationNames = __webpack_require__(65); + var ReactReconciler = __webpack_require__(49); + var ReactUpdateQueue = __webpack_require__(52); + + var assign = __webpack_require__(38); + var emptyObject = __webpack_require__(57); + var invariant = __webpack_require__(12); + var shouldUpdateReactComponent = __webpack_require__(66); + var warning = __webpack_require__(24); + + function getDeclarationErrorAddendum(component) { + var owner = component._currentElement._owner || null; + if (owner) { + var name = owner.getName(); + if (name) { + return ' Check the render method of `' + name + '`.'; + } + } + return ''; + } + + function StatelessComponent(Component) {} + StatelessComponent.prototype.render = function () { + var Component = ReactInstanceMap.get(this)._currentElement.type; + return Component(this.props, this.context, this.updater); + }; + + /** + * ------------------ The Life-Cycle of a Composite Component ------------------ + * + * - constructor: Initialization of state. The instance is now retained. + * - componentWillMount + * - render + * - [children's constructors] + * - [children's componentWillMount and render] + * - [children's componentDidMount] + * - componentDidMount + * + * Update Phases: + * - componentWillReceiveProps (only called if parent updated) + * - shouldComponentUpdate + * - componentWillUpdate + * - render + * - [children's constructors or receive props phases] + * - componentDidUpdate + * + * - componentWillUnmount + * - [children's componentWillUnmount] + * - [children destroyed] + * - (destroyed): The instance is now blank, released by React and ready for GC. + * + * ----------------------------------------------------------------------------- + */ + + /** + * An incrementing ID assigned to each component when it is mounted. This is + * used to enforce the order in which `ReactUpdates` updates dirty components. + * + * @private + */ + var nextMountID = 1; + + /** + * @lends {ReactCompositeComponent.prototype} + */ + var ReactCompositeComponentMixin = { + + /** + * Base constructor for all composite component. + * + * @param {ReactElement} element + * @final + * @internal + */ + construct: function (element) { + this._currentElement = element; + this._rootNodeID = null; + this._instance = null; + + // See ReactUpdateQueue + this._pendingElement = null; + this._pendingStateQueue = null; + this._pendingReplaceState = false; + this._pendingForceUpdate = false; + + this._renderedComponent = null; + + this._context = null; + this._mountOrder = 0; + this._topLevelWrapper = null; + + // See ReactUpdates and ReactUpdateQueue. + this._pendingCallbacks = null; + }, + + /** + * Initializes the component, renders markup, and registers event listeners. + * + * @param {string} rootID DOM ID of the root node. + * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction + * @return {?string} Rendered markup to be inserted into the DOM. + * @final + * @internal + */ + mountComponent: function (rootID, transaction, context) { + this._context = context; + this._mountOrder = nextMountID++; + this._rootNodeID = rootID; + + var publicProps = this._processProps(this._currentElement.props); + var publicContext = this._processContext(context); + + var Component = this._currentElement.type; + + // Initialize the public class + var inst; + var renderedElement; + + // This is a way to detect if Component is a stateless arrow function + // component, which is not newable. It might not be 100% reliable but is + // something we can do until we start detecting that Component extends + // React.Component. We already assume that typeof Component === 'function'. + var canInstantiate = ('prototype' in Component); + + if (canInstantiate) { + if (process.env.NODE_ENV !== 'production') { + ReactCurrentOwner.current = this; + try { + inst = new Component(publicProps, publicContext, ReactUpdateQueue); + } finally { + ReactCurrentOwner.current = null; + } + } else { + inst = new Component(publicProps, publicContext, ReactUpdateQueue); + } + } + + if (!canInstantiate || inst === null || inst === false || ReactElement.isValidElement(inst)) { + renderedElement = inst; + inst = new StatelessComponent(Component); + } + + if (process.env.NODE_ENV !== 'production') { + // This will throw later in _renderValidatedComponent, but add an early + // warning now to help debugging + if (inst.render == null) { + process.env.NODE_ENV !== 'production' ? warning(false, '%s(...): No `render` method found on the returned component ' + 'instance: you may have forgotten to define `render`, returned ' + 'null/false from a stateless component, or tried to render an ' + 'element whose type is a function that isn\'t a React component.', Component.displayName || Component.name || 'Component') : undefined; + } else { + // We support ES6 inheriting from React.Component, the module pattern, + // and stateless components, but not ES6 classes that don't extend + process.env.NODE_ENV !== 'production' ? warning(Component.prototype && Component.prototype.isReactComponent || !canInstantiate || !(inst instanceof Component), '%s(...): React component classes must extend React.Component.', Component.displayName || Component.name || 'Component') : undefined; + } + } + + // These should be set up in the constructor, but as a convenience for + // simpler class abstractions, we set them up after the fact. + inst.props = publicProps; + inst.context = publicContext; + inst.refs = emptyObject; + inst.updater = ReactUpdateQueue; + + this._instance = inst; + + // Store a reference from the instance back to the internal representation + ReactInstanceMap.set(inst, this); + + if (process.env.NODE_ENV !== 'production') { + // Since plain JS classes are defined without any special initialization + // logic, we can not catch common errors early. Therefore, we have to + // catch them here, at initialization time, instead. + process.env.NODE_ENV !== 'production' ? warning(!inst.getInitialState || inst.getInitialState.isReactClassApproved, 'getInitialState was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Did you mean to define a state property instead?', this.getName() || 'a component') : undefined; + process.env.NODE_ENV !== 'production' ? warning(!inst.getDefaultProps || inst.getDefaultProps.isReactClassApproved, 'getDefaultProps was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Use a static property to define defaultProps instead.', this.getName() || 'a component') : undefined; + process.env.NODE_ENV !== 'production' ? warning(!inst.propTypes, 'propTypes was defined as an instance property on %s. Use a static ' + 'property to define propTypes instead.', this.getName() || 'a component') : undefined; + process.env.NODE_ENV !== 'production' ? warning(!inst.contextTypes, 'contextTypes was defined as an instance property on %s. Use a ' + 'static property to define contextTypes instead.', this.getName() || 'a component') : undefined; + process.env.NODE_ENV !== 'production' ? warning(typeof inst.componentShouldUpdate !== 'function', '%s has a method called ' + 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' + 'The name is phrased as a question because the function is ' + 'expected to return a value.', this.getName() || 'A component') : undefined; + process.env.NODE_ENV !== 'production' ? warning(typeof inst.componentDidUnmount !== 'function', '%s has a method called ' + 'componentDidUnmount(). But there is no such lifecycle method. ' + 'Did you mean componentWillUnmount()?', this.getName() || 'A component') : undefined; + process.env.NODE_ENV !== 'production' ? warning(typeof inst.componentWillRecieveProps !== 'function', '%s has a method called ' + 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', this.getName() || 'A component') : undefined; + } + + var initialState = inst.state; + if (initialState === undefined) { + inst.state = initialState = null; + } + !(typeof initialState === 'object' && !Array.isArray(initialState)) ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s.state: must be set to an object or null', this.getName() || 'ReactCompositeComponent') : invariant(false) : undefined; + + this._pendingStateQueue = null; + this._pendingReplaceState = false; + this._pendingForceUpdate = false; + + if (inst.componentWillMount) { + inst.componentWillMount(); + // When mounting, calls to `setState` by `componentWillMount` will set + // `this._pendingStateQueue` without triggering a re-render. + if (this._pendingStateQueue) { + inst.state = this._processPendingState(inst.props, inst.context); + } + } + + // If not a stateless component, we now render + if (renderedElement === undefined) { + renderedElement = this._renderValidatedComponent(); + } + + this._renderedComponent = this._instantiateReactComponent(renderedElement); + + var markup = ReactReconciler.mountComponent(this._renderedComponent, rootID, transaction, this._processChildContext(context)); + if (inst.componentDidMount) { + transaction.getReactMountReady().enqueue(inst.componentDidMount, inst); + } + + return markup; + }, + + /** + * Releases any resources allocated by `mountComponent`. + * + * @final + * @internal + */ + unmountComponent: function () { + var inst = this._instance; + + if (inst.componentWillUnmount) { + inst.componentWillUnmount(); + } + + ReactReconciler.unmountComponent(this._renderedComponent); + this._renderedComponent = null; + this._instance = null; + + // Reset pending fields + // Even if this component is scheduled for another update in ReactUpdates, + // it would still be ignored because these fields are reset. + this._pendingStateQueue = null; + this._pendingReplaceState = false; + this._pendingForceUpdate = false; + this._pendingCallbacks = null; + this._pendingElement = null; + + // These fields do not really need to be reset since this object is no + // longer accessible. + this._context = null; + this._rootNodeID = null; + this._topLevelWrapper = null; + + // Delete the reference from the instance to this internal representation + // which allow the internals to be properly cleaned up even if the user + // leaks a reference to the public instance. + ReactInstanceMap.remove(inst); + + // Some existing components rely on inst.props even after they've been + // destroyed (in event handlers). + // TODO: inst.props = null; + // TODO: inst.state = null; + // TODO: inst.context = null; + }, + + /** + * Filters the context object to only contain keys specified in + * `contextTypes` + * + * @param {object} context + * @return {?object} + * @private + */ + _maskContext: function (context) { + var maskedContext = null; + var Component = this._currentElement.type; + var contextTypes = Component.contextTypes; + if (!contextTypes) { + return emptyObject; + } + maskedContext = {}; + for (var contextName in contextTypes) { + maskedContext[contextName] = context[contextName]; + } + return maskedContext; + }, + + /** + * Filters the context object to only contain keys specified in + * `contextTypes`, and asserts that they are valid. + * + * @param {object} context + * @return {?object} + * @private + */ + _processContext: function (context) { + var maskedContext = this._maskContext(context); + if (process.env.NODE_ENV !== 'production') { + var Component = this._currentElement.type; + if (Component.contextTypes) { + this._checkPropTypes(Component.contextTypes, maskedContext, ReactPropTypeLocations.context); + } + } + return maskedContext; + }, + + /** + * @param {object} currentContext + * @return {object} + * @private + */ + _processChildContext: function (currentContext) { + var Component = this._currentElement.type; + var inst = this._instance; + var childContext = inst.getChildContext && inst.getChildContext(); + if (childContext) { + !(typeof Component.childContextTypes === 'object') ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s.getChildContext(): childContextTypes must be defined in order to ' + 'use getChildContext().', this.getName() || 'ReactCompositeComponent') : invariant(false) : undefined; + if (process.env.NODE_ENV !== 'production') { + this._checkPropTypes(Component.childContextTypes, childContext, ReactPropTypeLocations.childContext); + } + for (var name in childContext) { + !(name in Component.childContextTypes) ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s.getChildContext(): key "%s" is not defined in childContextTypes.', this.getName() || 'ReactCompositeComponent', name) : invariant(false) : undefined; + } + return assign({}, currentContext, childContext); + } + return currentContext; + }, + + /** + * Processes props by setting default values for unspecified props and + * asserting that the props are valid. Does not mutate its argument; returns + * a new props object with defaults merged in. + * + * @param {object} newProps + * @return {object} + * @private + */ + _processProps: function (newProps) { + if (process.env.NODE_ENV !== 'production') { + var Component = this._currentElement.type; + if (Component.propTypes) { + this._checkPropTypes(Component.propTypes, newProps, ReactPropTypeLocations.prop); + } + } + return newProps; + }, + + /** + * Assert that the props are valid + * + * @param {object} propTypes Map of prop name to a ReactPropType + * @param {object} props + * @param {string} location e.g. "prop", "context", "child context" + * @private + */ + _checkPropTypes: function (propTypes, props, location) { + // TODO: Stop validating prop types here and only use the element + // validation. + var componentName = this.getName(); + for (var propName in propTypes) { + if (propTypes.hasOwnProperty(propName)) { + var error; + try { + // This is intentionally an invariant that gets caught. It's the same + // behavior as without this statement except with a better message. + !(typeof propTypes[propName] === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s: %s type `%s` is invalid; it must be a function, usually ' + 'from React.PropTypes.', componentName || 'React class', ReactPropTypeLocationNames[location], propName) : invariant(false) : undefined; + error = propTypes[propName](props, propName, componentName, location); + } catch (ex) { + error = ex; + } + if (error instanceof Error) { + // We may want to extend this logic for similar errors in + // top-level render calls, so I'm abstracting it away into + // a function to minimize refactoring in the future + var addendum = getDeclarationErrorAddendum(this); + + if (location === ReactPropTypeLocations.prop) { + // Preface gives us something to blacklist in warning module + process.env.NODE_ENV !== 'production' ? warning(false, 'Failed Composite propType: %s%s', error.message, addendum) : undefined; + } else { + process.env.NODE_ENV !== 'production' ? warning(false, 'Failed Context Types: %s%s', error.message, addendum) : undefined; + } + } + } + } + }, + + receiveComponent: function (nextElement, transaction, nextContext) { + var prevElement = this._currentElement; + var prevContext = this._context; + + this._pendingElement = null; + + this.updateComponent(transaction, prevElement, nextElement, prevContext, nextContext); + }, + + /** + * If any of `_pendingElement`, `_pendingStateQueue`, or `_pendingForceUpdate` + * is set, update the component. + * + * @param {ReactReconcileTransaction} transaction + * @internal + */ + performUpdateIfNecessary: function (transaction) { + if (this._pendingElement != null) { + ReactReconciler.receiveComponent(this, this._pendingElement || this._currentElement, transaction, this._context); + } + + if (this._pendingStateQueue !== null || this._pendingForceUpdate) { + this.updateComponent(transaction, this._currentElement, this._currentElement, this._context, this._context); + } + }, + + /** + * Perform an update to a mounted component. The componentWillReceiveProps and + * shouldComponentUpdate methods are called, then (assuming the update isn't + * skipped) the remaining update lifecycle methods are called and the DOM + * representation is updated. + * + * By default, this implements React's rendering and reconciliation algorithm. + * Sophisticated clients may wish to override this. + * + * @param {ReactReconcileTransaction} transaction + * @param {ReactElement} prevParentElement + * @param {ReactElement} nextParentElement + * @internal + * @overridable + */ + updateComponent: function (transaction, prevParentElement, nextParentElement, prevUnmaskedContext, nextUnmaskedContext) { + var inst = this._instance; + + var nextContext = this._context === nextUnmaskedContext ? inst.context : this._processContext(nextUnmaskedContext); + var nextProps; + + // Distinguish between a props update versus a simple state update + if (prevParentElement === nextParentElement) { + // Skip checking prop types again -- we don't read inst.props to avoid + // warning for DOM component props in this upgrade + nextProps = nextParentElement.props; + } else { + nextProps = this._processProps(nextParentElement.props); + // An update here will schedule an update but immediately set + // _pendingStateQueue which will ensure that any state updates gets + // immediately reconciled instead of waiting for the next batch. + + if (inst.componentWillReceiveProps) { + inst.componentWillReceiveProps(nextProps, nextContext); + } + } + + var nextState = this._processPendingState(nextProps, nextContext); + + var shouldUpdate = this._pendingForceUpdate || !inst.shouldComponentUpdate || inst.shouldComponentUpdate(nextProps, nextState, nextContext); + + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(typeof shouldUpdate !== 'undefined', '%s.shouldComponentUpdate(): Returned undefined instead of a ' + 'boolean value. Make sure to return true or false.', this.getName() || 'ReactCompositeComponent') : undefined; + } + + if (shouldUpdate) { + this._pendingForceUpdate = false; + // Will set `this.props`, `this.state` and `this.context`. + this._performComponentUpdate(nextParentElement, nextProps, nextState, nextContext, transaction, nextUnmaskedContext); + } else { + // If it's determined that a component should not update, we still want + // to set props and state but we shortcut the rest of the update. + this._currentElement = nextParentElement; + this._context = nextUnmaskedContext; + inst.props = nextProps; + inst.state = nextState; + inst.context = nextContext; + } + }, + + _processPendingState: function (props, context) { + var inst = this._instance; + var queue = this._pendingStateQueue; + var replace = this._pendingReplaceState; + this._pendingReplaceState = false; + this._pendingStateQueue = null; + + if (!queue) { + return inst.state; + } + + if (replace && queue.length === 1) { + return queue[0]; + } + + var nextState = assign({}, replace ? queue[0] : inst.state); + for (var i = replace ? 1 : 0; i < queue.length; i++) { + var partial = queue[i]; + assign(nextState, typeof partial === 'function' ? partial.call(inst, nextState, props, context) : partial); + } + + return nextState; + }, + + /** + * Merges new props and state, notifies delegate methods of update and + * performs update. + * + * @param {ReactElement} nextElement Next element + * @param {object} nextProps Next public object to set as properties. + * @param {?object} nextState Next object to set as state. + * @param {?object} nextContext Next public object to set as context. + * @param {ReactReconcileTransaction} transaction + * @param {?object} unmaskedContext + * @private + */ + _performComponentUpdate: function (nextElement, nextProps, nextState, nextContext, transaction, unmaskedContext) { + var inst = this._instance; + + var hasComponentDidUpdate = Boolean(inst.componentDidUpdate); + var prevProps; + var prevState; + var prevContext; + if (hasComponentDidUpdate) { + prevProps = inst.props; + prevState = inst.state; + prevContext = inst.context; + } + + if (inst.componentWillUpdate) { + inst.componentWillUpdate(nextProps, nextState, nextContext); + } + + this._currentElement = nextElement; + this._context = unmaskedContext; + inst.props = nextProps; + inst.state = nextState; + inst.context = nextContext; + + this._updateRenderedComponent(transaction, unmaskedContext); + + if (hasComponentDidUpdate) { + transaction.getReactMountReady().enqueue(inst.componentDidUpdate.bind(inst, prevProps, prevState, prevContext), inst); + } + }, + + /** + * Call the component's `render` method and update the DOM accordingly. + * + * @param {ReactReconcileTransaction} transaction + * @internal + */ + _updateRenderedComponent: function (transaction, context) { + var prevComponentInstance = this._renderedComponent; + var prevRenderedElement = prevComponentInstance._currentElement; + var nextRenderedElement = this._renderValidatedComponent(); + if (shouldUpdateReactComponent(prevRenderedElement, nextRenderedElement)) { + ReactReconciler.receiveComponent(prevComponentInstance, nextRenderedElement, transaction, this._processChildContext(context)); + } else { + // These two IDs are actually the same! But nothing should rely on that. + var thisID = this._rootNodeID; + var prevComponentID = prevComponentInstance._rootNodeID; + ReactReconciler.unmountComponent(prevComponentInstance); + + this._renderedComponent = this._instantiateReactComponent(nextRenderedElement); + var nextMarkup = ReactReconciler.mountComponent(this._renderedComponent, thisID, transaction, this._processChildContext(context)); + this._replaceNodeWithMarkupByID(prevComponentID, nextMarkup); + } + }, + + /** + * @protected + */ + _replaceNodeWithMarkupByID: function (prevComponentID, nextMarkup) { + ReactComponentEnvironment.replaceNodeWithMarkupByID(prevComponentID, nextMarkup); + }, + + /** + * @protected + */ + _renderValidatedComponentWithoutOwnerOrContext: function () { + var inst = this._instance; + var renderedComponent = inst.render(); + if (process.env.NODE_ENV !== 'production') { + // We allow auto-mocks to proceed as if they're returning null. + if (typeof renderedComponent === 'undefined' && inst.render._isMockFunction) { + // This is probably bad practice. Consider warning here and + // deprecating this convenience. + renderedComponent = null; + } + } + + return renderedComponent; + }, + + /** + * @private + */ + _renderValidatedComponent: function () { + var renderedComponent; + ReactCurrentOwner.current = this; + try { + renderedComponent = this._renderValidatedComponentWithoutOwnerOrContext(); + } finally { + ReactCurrentOwner.current = null; + } + !( + // TODO: An `isValidNode` function would probably be more appropriate + renderedComponent === null || renderedComponent === false || ReactElement.isValidElement(renderedComponent)) ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s.render(): A valid ReactComponent must be returned. You may have ' + 'returned undefined, an array or some other invalid object.', this.getName() || 'ReactCompositeComponent') : invariant(false) : undefined; + return renderedComponent; + }, + + /** + * Lazily allocates the refs object and stores `component` as `ref`. + * + * @param {string} ref Reference name. + * @param {component} component Component to store as `ref`. + * @final + * @private + */ + attachRef: function (ref, component) { + var inst = this.getPublicInstance(); + !(inst != null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Stateless function components cannot have refs.') : invariant(false) : undefined; + var publicComponentInstance = component.getPublicInstance(); + if (process.env.NODE_ENV !== 'production') { + var componentName = component && component.getName ? component.getName() : 'a component'; + process.env.NODE_ENV !== 'production' ? warning(publicComponentInstance != null, 'Stateless function components cannot be given refs ' + '(See ref "%s" in %s created by %s). ' + 'Attempts to access this ref will fail.', ref, componentName, this.getName()) : undefined; + } + var refs = inst.refs === emptyObject ? inst.refs = {} : inst.refs; + refs[ref] = publicComponentInstance; + }, + + /** + * Detaches a reference name. + * + * @param {string} ref Name to dereference. + * @final + * @private + */ + detachRef: function (ref) { + var refs = this.getPublicInstance().refs; + delete refs[ref]; + }, + + /** + * Get a text description of the component that can be used to identify it + * in error messages. + * @return {string} The name or null. + * @internal + */ + getName: function () { + var type = this._currentElement.type; + var constructor = this._instance && this._instance.constructor; + return type.displayName || constructor && constructor.displayName || type.name || constructor && constructor.name || null; + }, + + /** + * Get the publicly accessible representation of this component - i.e. what + * is exposed by refs and returned by render. Can be null for stateless + * components. + * + * @return {ReactComponent} the public component instance. + * @internal + */ + getPublicInstance: function () { + var inst = this._instance; + if (inst instanceof StatelessComponent) { + return null; + } + return inst; + }, + + // Stub + _instantiateReactComponent: null + + }; + + ReactPerf.measureMethods(ReactCompositeComponentMixin, 'ReactCompositeComponent', { + mountComponent: 'mountComponent', + updateComponent: 'updateComponent', + _renderValidatedComponent: '_renderValidatedComponent' + }); + + var ReactCompositeComponent = { + + Mixin: ReactCompositeComponentMixin + + }; + + module.exports = ReactCompositeComponent; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 63 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2014-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactComponentEnvironment + */ + + 'use strict'; + + var invariant = __webpack_require__(12); + + var injected = false; + + var ReactComponentEnvironment = { + + /** + * Optionally injectable environment dependent cleanup hook. (server vs. + * browser etc). Example: A browser system caches DOM nodes based on component + * ID and must remove that cache entry when this instance is unmounted. + */ + unmountIDFromEnvironment: null, + + /** + * Optionally injectable hook for swapping out mount images in the middle of + * the tree. + */ + replaceNodeWithMarkupByID: null, + + /** + * Optionally injectable hook for processing a queue of child updates. Will + * later move into MultiChildComponents. + */ + processChildrenUpdates: null, + + injection: { + injectEnvironment: function (environment) { + !!injected ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactCompositeComponent: injectEnvironment() can only be called once.') : invariant(false) : undefined; + ReactComponentEnvironment.unmountIDFromEnvironment = environment.unmountIDFromEnvironment; + ReactComponentEnvironment.replaceNodeWithMarkupByID = environment.replaceNodeWithMarkupByID; + ReactComponentEnvironment.processChildrenUpdates = environment.processChildrenUpdates; + injected = true; + } + } + + }; + + module.exports = ReactComponentEnvironment; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 64 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactPropTypeLocations + */ + + 'use strict'; + + var keyMirror = __webpack_require__(16); + + var ReactPropTypeLocations = keyMirror({ + prop: null, + context: null, + childContext: null + }); + + module.exports = ReactPropTypeLocations; + +/***/ }, +/* 65 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactPropTypeLocationNames + */ + + 'use strict'; + + var ReactPropTypeLocationNames = {}; + + if (process.env.NODE_ENV !== 'production') { + ReactPropTypeLocationNames = { + prop: 'prop', + context: 'context', + childContext: 'child context' + }; + } + + module.exports = ReactPropTypeLocationNames; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 66 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule shouldUpdateReactComponent + * @typechecks static-only + */ + + 'use strict'; + + /** + * Given a `prevElement` and `nextElement`, determines if the existing + * instance should be updated as opposed to being destroyed or replaced by a new + * instance. Both arguments are elements. This ensures that this logic can + * operate on stateless trees without any backing instance. + * + * @param {?object} prevElement + * @param {?object} nextElement + * @return {boolean} True if the existing instance should be updated. + * @protected + */ + function shouldUpdateReactComponent(prevElement, nextElement) { + var prevEmpty = prevElement === null || prevElement === false; + var nextEmpty = nextElement === null || nextElement === false; + if (prevEmpty || nextEmpty) { + return prevEmpty === nextEmpty; + } + + var prevType = typeof prevElement; + var nextType = typeof nextElement; + if (prevType === 'string' || prevType === 'number') { + return nextType === 'string' || nextType === 'number'; + } else { + return nextType === 'object' && prevElement.type === nextElement.type && prevElement.key === nextElement.key; + } + return false; + } + + module.exports = shouldUpdateReactComponent; + +/***/ }, +/* 67 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2014-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactEmptyComponent + */ + + 'use strict'; + + var ReactElement = __webpack_require__(41); + var ReactEmptyComponentRegistry = __webpack_require__(43); + var ReactReconciler = __webpack_require__(49); + + var assign = __webpack_require__(38); + + var placeholderElement; + + var ReactEmptyComponentInjection = { + injectEmptyComponent: function (component) { + placeholderElement = ReactElement.createElement(component); + } + }; + + var ReactEmptyComponent = function (instantiate) { + this._currentElement = null; + this._rootNodeID = null; + this._renderedComponent = instantiate(placeholderElement); + }; + assign(ReactEmptyComponent.prototype, { + construct: function (element) {}, + mountComponent: function (rootID, transaction, context) { + ReactEmptyComponentRegistry.registerNullComponentID(rootID); + this._rootNodeID = rootID; + return ReactReconciler.mountComponent(this._renderedComponent, rootID, transaction, context); + }, + receiveComponent: function () {}, + unmountComponent: function (rootID, transaction, context) { + ReactReconciler.unmountComponent(this._renderedComponent); + ReactEmptyComponentRegistry.deregisterNullComponentID(this._rootNodeID); + this._rootNodeID = null; + this._renderedComponent = null; + } + }); + + ReactEmptyComponent.injection = ReactEmptyComponentInjection; + + module.exports = ReactEmptyComponent; + +/***/ }, +/* 68 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2014-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactNativeComponent + */ + + 'use strict'; + + var assign = __webpack_require__(38); + var invariant = __webpack_require__(12); + + var autoGenerateWrapperClass = null; + var genericComponentClass = null; + // This registry keeps track of wrapper classes around native tags. + var tagToComponentClass = {}; + var textComponentClass = null; + + var ReactNativeComponentInjection = { + // This accepts a class that receives the tag string. This is a catch all + // that can render any kind of tag. + injectGenericComponentClass: function (componentClass) { + genericComponentClass = componentClass; + }, + // This accepts a text component class that takes the text string to be + // rendered as props. + injectTextComponentClass: function (componentClass) { + textComponentClass = componentClass; + }, + // This accepts a keyed object with classes as values. Each key represents a + // tag. That particular tag will use this class instead of the generic one. + injectComponentClasses: function (componentClasses) { + assign(tagToComponentClass, componentClasses); + } + }; + + /** + * Get a composite component wrapper class for a specific tag. + * + * @param {ReactElement} element The tag for which to get the class. + * @return {function} The React class constructor function. + */ + function getComponentClassForElement(element) { + if (typeof element.type === 'function') { + return element.type; + } + var tag = element.type; + var componentClass = tagToComponentClass[tag]; + if (componentClass == null) { + tagToComponentClass[tag] = componentClass = autoGenerateWrapperClass(tag); + } + return componentClass; + } + + /** + * Get a native internal component class for a specific tag. + * + * @param {ReactElement} element The element to create. + * @return {function} The internal class constructor function. + */ + function createInternalComponent(element) { + !genericComponentClass ? process.env.NODE_ENV !== 'production' ? invariant(false, 'There is no registered component for the tag %s', element.type) : invariant(false) : undefined; + return new genericComponentClass(element.type, element.props); + } + + /** + * @param {ReactText} text + * @return {ReactComponent} + */ + function createInstanceForText(text) { + return new textComponentClass(text); + } + + /** + * @param {ReactComponent} component + * @return {boolean} + */ + function isTextComponent(component) { + return component instanceof textComponentClass; + } + + var ReactNativeComponent = { + getComponentClassForElement: getComponentClassForElement, + createInternalComponent: createInternalComponent, + createInstanceForText: createInstanceForText, + isTextComponent: isTextComponent, + injection: ReactNativeComponentInjection + }; + + module.exports = ReactNativeComponent; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 69 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule validateDOMNesting + */ + + 'use strict'; + + var assign = __webpack_require__(38); + var emptyFunction = __webpack_require__(14); + var warning = __webpack_require__(24); + + var validateDOMNesting = emptyFunction; + + if (process.env.NODE_ENV !== 'production') { + // This validation code was written based on the HTML5 parsing spec: + // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope + // + // Note: this does not catch all invalid nesting, nor does it try to (as it's + // not clear what practical benefit doing so provides); instead, we warn only + // for cases where the parser will give a parse tree differing from what React + // intended. For example, <b><div></div></b> is invalid but we don't warn + // because it still parses correctly; we do warn for other cases like nested + // <p> tags where the beginning of the second element implicitly closes the + // first, causing a confusing mess. + + // https://html.spec.whatwg.org/multipage/syntax.html#special + var specialTags = ['address', 'applet', 'area', 'article', 'aside', 'base', 'basefont', 'bgsound', 'blockquote', 'body', 'br', 'button', 'caption', 'center', 'col', 'colgroup', 'dd', 'details', 'dir', 'div', 'dl', 'dt', 'embed', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'frame', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'iframe', 'img', 'input', 'isindex', 'li', 'link', 'listing', 'main', 'marquee', 'menu', 'menuitem', 'meta', 'nav', 'noembed', 'noframes', 'noscript', 'object', 'ol', 'p', 'param', 'plaintext', 'pre', 'script', 'section', 'select', 'source', 'style', 'summary', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'title', 'tr', 'track', 'ul', 'wbr', 'xmp']; + + // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope + var inScopeTags = ['applet', 'caption', 'html', 'table', 'td', 'th', 'marquee', 'object', 'template', + + // https://html.spec.whatwg.org/multipage/syntax.html#html-integration-point + // TODO: Distinguish by namespace here -- for <title>, including it here + // errs on the side of fewer warnings + 'foreignObject', 'desc', 'title']; + + // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-button-scope + var buttonScopeTags = inScopeTags.concat(['button']); + + // https://html.spec.whatwg.org/multipage/syntax.html#generate-implied-end-tags + var impliedEndTags = ['dd', 'dt', 'li', 'option', 'optgroup', 'p', 'rp', 'rt']; + + var emptyAncestorInfo = { + parentTag: null, + + formTag: null, + aTagInScope: null, + buttonTagInScope: null, + nobrTagInScope: null, + pTagInButtonScope: null, + + listItemTagAutoclosing: null, + dlItemTagAutoclosing: null + }; + + var updatedAncestorInfo = function (oldInfo, tag, instance) { + var ancestorInfo = assign({}, oldInfo || emptyAncestorInfo); + var info = { tag: tag, instance: instance }; + + if (inScopeTags.indexOf(tag) !== -1) { + ancestorInfo.aTagInScope = null; + ancestorInfo.buttonTagInScope = null; + ancestorInfo.nobrTagInScope = null; + } + if (buttonScopeTags.indexOf(tag) !== -1) { + ancestorInfo.pTagInButtonScope = null; + } + + // See rules for 'li', 'dd', 'dt' start tags in + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody + if (specialTags.indexOf(tag) !== -1 && tag !== 'address' && tag !== 'div' && tag !== 'p') { + ancestorInfo.listItemTagAutoclosing = null; + ancestorInfo.dlItemTagAutoclosing = null; + } + + ancestorInfo.parentTag = info; + + if (tag === 'form') { + ancestorInfo.formTag = info; + } + if (tag === 'a') { + ancestorInfo.aTagInScope = info; + } + if (tag === 'button') { + ancestorInfo.buttonTagInScope = info; + } + if (tag === 'nobr') { + ancestorInfo.nobrTagInScope = info; + } + if (tag === 'p') { + ancestorInfo.pTagInButtonScope = info; + } + if (tag === 'li') { + ancestorInfo.listItemTagAutoclosing = info; + } + if (tag === 'dd' || tag === 'dt') { + ancestorInfo.dlItemTagAutoclosing = info; + } + + return ancestorInfo; + }; + + /** + * Returns whether + */ + var isTagValidWithParent = function (tag, parentTag) { + // First, let's check if we're in an unusual parsing mode... + switch (parentTag) { + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inselect + case 'select': + return tag === 'option' || tag === 'optgroup' || tag === '#text'; + case 'optgroup': + return tag === 'option' || tag === '#text'; + // Strictly speaking, seeing an <option> doesn't mean we're in a <select> + // but + case 'option': + return tag === '#text'; + + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intd + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incaption + // No special behavior since these rules fall back to "in body" mode for + // all except special table nodes which cause bad parsing behavior anyway. + + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intr + case 'tr': + return tag === 'th' || tag === 'td' || tag === 'style' || tag === 'script' || tag === 'template'; + + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intbody + case 'tbody': + case 'thead': + case 'tfoot': + return tag === 'tr' || tag === 'style' || tag === 'script' || tag === 'template'; + + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incolgroup + case 'colgroup': + return tag === 'col' || tag === 'template'; + + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intable + case 'table': + return tag === 'caption' || tag === 'colgroup' || tag === 'tbody' || tag === 'tfoot' || tag === 'thead' || tag === 'style' || tag === 'script' || tag === 'template'; + + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inhead + case 'head': + return tag === 'base' || tag === 'basefont' || tag === 'bgsound' || tag === 'link' || tag === 'meta' || tag === 'title' || tag === 'noscript' || tag === 'noframes' || tag === 'style' || tag === 'script' || tag === 'template'; + + // https://html.spec.whatwg.org/multipage/semantics.html#the-html-element + case 'html': + return tag === 'head' || tag === 'body'; + } + + // Probably in the "in body" parsing mode, so we outlaw only tag combos + // where the parsing rules cause implicit opens or closes to be added. + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody + switch (tag) { + case 'h1': + case 'h2': + case 'h3': + case 'h4': + case 'h5': + case 'h6': + return parentTag !== 'h1' && parentTag !== 'h2' && parentTag !== 'h3' && parentTag !== 'h4' && parentTag !== 'h5' && parentTag !== 'h6'; + + case 'rp': + case 'rt': + return impliedEndTags.indexOf(parentTag) === -1; + + case 'caption': + case 'col': + case 'colgroup': + case 'frame': + case 'head': + case 'tbody': + case 'td': + case 'tfoot': + case 'th': + case 'thead': + case 'tr': + // These tags are only valid with a few parents that have special child + // parsing rules -- if we're down here, then none of those matched and + // so we allow it only if we don't know what the parent is, as all other + // cases are invalid. + return parentTag == null; + } + + return true; + }; + + /** + * Returns whether + */ + var findInvalidAncestorForTag = function (tag, ancestorInfo) { + switch (tag) { + case 'address': + case 'article': + case 'aside': + case 'blockquote': + case 'center': + case 'details': + case 'dialog': + case 'dir': + case 'div': + case 'dl': + case 'fieldset': + case 'figcaption': + case 'figure': + case 'footer': + case 'header': + case 'hgroup': + case 'main': + case 'menu': + case 'nav': + case 'ol': + case 'p': + case 'section': + case 'summary': + case 'ul': + + case 'pre': + case 'listing': + + case 'table': + + case 'hr': + + case 'xmp': + + case 'h1': + case 'h2': + case 'h3': + case 'h4': + case 'h5': + case 'h6': + return ancestorInfo.pTagInButtonScope; + + case 'form': + return ancestorInfo.formTag || ancestorInfo.pTagInButtonScope; + + case 'li': + return ancestorInfo.listItemTagAutoclosing; + + case 'dd': + case 'dt': + return ancestorInfo.dlItemTagAutoclosing; + + case 'button': + return ancestorInfo.buttonTagInScope; + + case 'a': + // Spec says something about storing a list of markers, but it sounds + // equivalent to this check. + return ancestorInfo.aTagInScope; + + case 'nobr': + return ancestorInfo.nobrTagInScope; + } + + return null; + }; + + /** + * Given a ReactCompositeComponent instance, return a list of its recursive + * owners, starting at the root and ending with the instance itself. + */ + var findOwnerStack = function (instance) { + if (!instance) { + return []; + } + + var stack = []; + /*eslint-disable space-after-keywords */ + do { + /*eslint-enable space-after-keywords */ + stack.push(instance); + } while (instance = instance._currentElement._owner); + stack.reverse(); + return stack; + }; + + var didWarn = {}; + + validateDOMNesting = function (childTag, childInstance, ancestorInfo) { + ancestorInfo = ancestorInfo || emptyAncestorInfo; + var parentInfo = ancestorInfo.parentTag; + var parentTag = parentInfo && parentInfo.tag; + + var invalidParent = isTagValidWithParent(childTag, parentTag) ? null : parentInfo; + var invalidAncestor = invalidParent ? null : findInvalidAncestorForTag(childTag, ancestorInfo); + var problematic = invalidParent || invalidAncestor; + + if (problematic) { + var ancestorTag = problematic.tag; + var ancestorInstance = problematic.instance; + + var childOwner = childInstance && childInstance._currentElement._owner; + var ancestorOwner = ancestorInstance && ancestorInstance._currentElement._owner; + + var childOwners = findOwnerStack(childOwner); + var ancestorOwners = findOwnerStack(ancestorOwner); + + var minStackLen = Math.min(childOwners.length, ancestorOwners.length); + var i; + + var deepestCommon = -1; + for (i = 0; i < minStackLen; i++) { + if (childOwners[i] === ancestorOwners[i]) { + deepestCommon = i; + } else { + break; + } + } + + var UNKNOWN = '(unknown)'; + var childOwnerNames = childOwners.slice(deepestCommon + 1).map(function (inst) { + return inst.getName() || UNKNOWN; + }); + var ancestorOwnerNames = ancestorOwners.slice(deepestCommon + 1).map(function (inst) { + return inst.getName() || UNKNOWN; + }); + var ownerInfo = [].concat( + // If the parent and child instances have a common owner ancestor, start + // with that -- otherwise we just start with the parent's owners. + deepestCommon !== -1 ? childOwners[deepestCommon].getName() || UNKNOWN : [], ancestorOwnerNames, ancestorTag, + // If we're warning about an invalid (non-parent) ancestry, add '...' + invalidAncestor ? ['...'] : [], childOwnerNames, childTag).join(' > '); + + var warnKey = !!invalidParent + '|' + childTag + '|' + ancestorTag + '|' + ownerInfo; + if (didWarn[warnKey]) { + return; + } + didWarn[warnKey] = true; + + if (invalidParent) { + var info = ''; + if (ancestorTag === 'table' && childTag === 'tr') { + info += ' Add a <tbody> to your code to match the DOM tree generated by ' + 'the browser.'; + } + process.env.NODE_ENV !== 'production' ? warning(false, 'validateDOMNesting(...): <%s> cannot appear as a child of <%s>. ' + 'See %s.%s', childTag, ancestorTag, ownerInfo, info) : undefined; + } else { + process.env.NODE_ENV !== 'production' ? warning(false, 'validateDOMNesting(...): <%s> cannot appear as a descendant of ' + '<%s>. See %s.', childTag, ancestorTag, ownerInfo) : undefined; + } + } + }; + + validateDOMNesting.ancestorInfoContextKey = '__validateDOMNesting_ancestorInfo$' + Math.random().toString(36).slice(2); + + validateDOMNesting.updatedAncestorInfo = updatedAncestorInfo; + + // For testing + validateDOMNesting.isTagValidInContext = function (tag, ancestorInfo) { + ancestorInfo = ancestorInfo || emptyAncestorInfo; + var parentInfo = ancestorInfo.parentTag; + var parentTag = parentInfo && parentInfo.tag; + return isTagValidWithParent(tag, parentTag) && !findInvalidAncestorForTag(tag, ancestorInfo); + }; + } + + module.exports = validateDOMNesting; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 70 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactDefaultInjection + */ + + 'use strict'; + + var BeforeInputEventPlugin = __webpack_require__(71); + var ChangeEventPlugin = __webpack_require__(79); + var ClientReactRootIndex = __webpack_require__(82); + var DefaultEventPluginOrder = __webpack_require__(83); + var EnterLeaveEventPlugin = __webpack_require__(84); + var ExecutionEnvironment = __webpack_require__(8); + var HTMLDOMPropertyConfig = __webpack_require__(88); + var ReactBrowserComponentMixin = __webpack_require__(89); + var ReactComponentBrowserEnvironment = __webpack_require__(25); + var ReactDefaultBatchingStrategy = __webpack_require__(91); + var ReactDOMComponent = __webpack_require__(92); + var ReactDOMTextComponent = __webpack_require__(5); + var ReactEventListener = __webpack_require__(117); + var ReactInjection = __webpack_require__(120); + var ReactInstanceHandles = __webpack_require__(44); + var ReactMount = __webpack_require__(27); + var ReactReconcileTransaction = __webpack_require__(124); + var SelectEventPlugin = __webpack_require__(129); + var ServerReactRootIndex = __webpack_require__(130); + var SimpleEventPlugin = __webpack_require__(131); + var SVGDOMPropertyConfig = __webpack_require__(140); + + var alreadyInjected = false; + + function inject() { + if (alreadyInjected) { + // TODO: This is currently true because these injections are shared between + // the client and the server package. They should be built independently + // and not share any injection state. Then this problem will be solved. + return; + } + alreadyInjected = true; + + ReactInjection.EventEmitter.injectReactEventListener(ReactEventListener); + + /** + * Inject modules for resolving DOM hierarchy and plugin ordering. + */ + ReactInjection.EventPluginHub.injectEventPluginOrder(DefaultEventPluginOrder); + ReactInjection.EventPluginHub.injectInstanceHandle(ReactInstanceHandles); + ReactInjection.EventPluginHub.injectMount(ReactMount); + + /** + * Some important event plugins included by default (without having to require + * them). + */ + ReactInjection.EventPluginHub.injectEventPluginsByName({ + SimpleEventPlugin: SimpleEventPlugin, + EnterLeaveEventPlugin: EnterLeaveEventPlugin, + ChangeEventPlugin: ChangeEventPlugin, + SelectEventPlugin: SelectEventPlugin, + BeforeInputEventPlugin: BeforeInputEventPlugin + }); + + ReactInjection.NativeComponent.injectGenericComponentClass(ReactDOMComponent); + + ReactInjection.NativeComponent.injectTextComponentClass(ReactDOMTextComponent); + + ReactInjection.Class.injectMixin(ReactBrowserComponentMixin); + + ReactInjection.DOMProperty.injectDOMPropertyConfig(HTMLDOMPropertyConfig); + ReactInjection.DOMProperty.injectDOMPropertyConfig(SVGDOMPropertyConfig); + + ReactInjection.EmptyComponent.injectEmptyComponent('noscript'); + + ReactInjection.Updates.injectReconcileTransaction(ReactReconcileTransaction); + ReactInjection.Updates.injectBatchingStrategy(ReactDefaultBatchingStrategy); + + ReactInjection.RootIndex.injectCreateReactRootIndex(ExecutionEnvironment.canUseDOM ? ClientReactRootIndex.createReactRootIndex : ServerReactRootIndex.createReactRootIndex); + + ReactInjection.Component.injectEnvironment(ReactComponentBrowserEnvironment); + + if (process.env.NODE_ENV !== 'production') { + var url = ExecutionEnvironment.canUseDOM && window.location.href || ''; + if (/[?&]react_perf\b/.test(url)) { + var ReactDefaultPerf = __webpack_require__(141); + ReactDefaultPerf.start(); + } + } + } + + module.exports = { + inject: inject + }; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 71 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015 Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule BeforeInputEventPlugin + * @typechecks static-only + */ + + 'use strict'; + + var EventConstants = __webpack_require__(29); + var EventPropagators = __webpack_require__(72); + var ExecutionEnvironment = __webpack_require__(8); + var FallbackCompositionState = __webpack_require__(73); + var SyntheticCompositionEvent = __webpack_require__(75); + var SyntheticInputEvent = __webpack_require__(77); + + var keyOf = __webpack_require__(78); + + var END_KEYCODES = [9, 13, 27, 32]; // Tab, Return, Esc, Space + var START_KEYCODE = 229; + + var canUseCompositionEvent = ExecutionEnvironment.canUseDOM && 'CompositionEvent' in window; + + var documentMode = null; + if (ExecutionEnvironment.canUseDOM && 'documentMode' in document) { + documentMode = document.documentMode; + } + + // Webkit offers a very useful `textInput` event that can be used to + // directly represent `beforeInput`. The IE `textinput` event is not as + // useful, so we don't use it. + var canUseTextInputEvent = ExecutionEnvironment.canUseDOM && 'TextEvent' in window && !documentMode && !isPresto(); + + // In IE9+, we have access to composition events, but the data supplied + // by the native compositionend event may be incorrect. Japanese ideographic + // spaces, for instance (\u3000) are not recorded correctly. + var useFallbackCompositionData = ExecutionEnvironment.canUseDOM && (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11); + + /** + * Opera <= 12 includes TextEvent in window, but does not fire + * text input events. Rely on keypress instead. + */ + function isPresto() { + var opera = window.opera; + return typeof opera === 'object' && typeof opera.version === 'function' && parseInt(opera.version(), 10) <= 12; + } + + var SPACEBAR_CODE = 32; + var SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE); + + var topLevelTypes = EventConstants.topLevelTypes; + + // Events and their corresponding property names. + var eventTypes = { + beforeInput: { + phasedRegistrationNames: { + bubbled: keyOf({ onBeforeInput: null }), + captured: keyOf({ onBeforeInputCapture: null }) + }, + dependencies: [topLevelTypes.topCompositionEnd, topLevelTypes.topKeyPress, topLevelTypes.topTextInput, topLevelTypes.topPaste] + }, + compositionEnd: { + phasedRegistrationNames: { + bubbled: keyOf({ onCompositionEnd: null }), + captured: keyOf({ onCompositionEndCapture: null }) + }, + dependencies: [topLevelTypes.topBlur, topLevelTypes.topCompositionEnd, topLevelTypes.topKeyDown, topLevelTypes.topKeyPress, topLevelTypes.topKeyUp, topLevelTypes.topMouseDown] + }, + compositionStart: { + phasedRegistrationNames: { + bubbled: keyOf({ onCompositionStart: null }), + captured: keyOf({ onCompositionStartCapture: null }) + }, + dependencies: [topLevelTypes.topBlur, topLevelTypes.topCompositionStart, topLevelTypes.topKeyDown, topLevelTypes.topKeyPress, topLevelTypes.topKeyUp, topLevelTypes.topMouseDown] + }, + compositionUpdate: { + phasedRegistrationNames: { + bubbled: keyOf({ onCompositionUpdate: null }), + captured: keyOf({ onCompositionUpdateCapture: null }) + }, + dependencies: [topLevelTypes.topBlur, topLevelTypes.topCompositionUpdate, topLevelTypes.topKeyDown, topLevelTypes.topKeyPress, topLevelTypes.topKeyUp, topLevelTypes.topMouseDown] + } + }; + + // Track whether we've ever handled a keypress on the space key. + var hasSpaceKeypress = false; + + /** + * Return whether a native keypress event is assumed to be a command. + * This is required because Firefox fires `keypress` events for key commands + * (cut, copy, select-all, etc.) even though no character is inserted. + */ + function isKeypressCommand(nativeEvent) { + return (nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) && + // ctrlKey && altKey is equivalent to AltGr, and is not a command. + !(nativeEvent.ctrlKey && nativeEvent.altKey); + } + + /** + * Translate native top level events into event types. + * + * @param {string} topLevelType + * @return {object} + */ + function getCompositionEventType(topLevelType) { + switch (topLevelType) { + case topLevelTypes.topCompositionStart: + return eventTypes.compositionStart; + case topLevelTypes.topCompositionEnd: + return eventTypes.compositionEnd; + case topLevelTypes.topCompositionUpdate: + return eventTypes.compositionUpdate; + } + } + + /** + * Does our fallback best-guess model think this event signifies that + * composition has begun? + * + * @param {string} topLevelType + * @param {object} nativeEvent + * @return {boolean} + */ + function isFallbackCompositionStart(topLevelType, nativeEvent) { + return topLevelType === topLevelTypes.topKeyDown && nativeEvent.keyCode === START_KEYCODE; + } + + /** + * Does our fallback mode think that this event is the end of composition? + * + * @param {string} topLevelType + * @param {object} nativeEvent + * @return {boolean} + */ + function isFallbackCompositionEnd(topLevelType, nativeEvent) { + switch (topLevelType) { + case topLevelTypes.topKeyUp: + // Command keys insert or clear IME input. + return END_KEYCODES.indexOf(nativeEvent.keyCode) !== -1; + case topLevelTypes.topKeyDown: + // Expect IME keyCode on each keydown. If we get any other + // code we must have exited earlier. + return nativeEvent.keyCode !== START_KEYCODE; + case topLevelTypes.topKeyPress: + case topLevelTypes.topMouseDown: + case topLevelTypes.topBlur: + // Events are not possible without cancelling IME. + return true; + default: + return false; + } + } + + /** + * Google Input Tools provides composition data via a CustomEvent, + * with the `data` property populated in the `detail` object. If this + * is available on the event object, use it. If not, this is a plain + * composition event and we have nothing special to extract. + * + * @param {object} nativeEvent + * @return {?string} + */ + function getDataFromCustomEvent(nativeEvent) { + var detail = nativeEvent.detail; + if (typeof detail === 'object' && 'data' in detail) { + return detail.data; + } + return null; + } + + // Track the current IME composition fallback object, if any. + var currentComposition = null; + + /** + * @param {string} topLevelType Record from `EventConstants`. + * @param {DOMEventTarget} topLevelTarget The listening component root node. + * @param {string} topLevelTargetID ID of `topLevelTarget`. + * @param {object} nativeEvent Native browser event. + * @return {?object} A SyntheticCompositionEvent. + */ + function extractCompositionEvent(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) { + var eventType; + var fallbackData; + + if (canUseCompositionEvent) { + eventType = getCompositionEventType(topLevelType); + } else if (!currentComposition) { + if (isFallbackCompositionStart(topLevelType, nativeEvent)) { + eventType = eventTypes.compositionStart; + } + } else if (isFallbackCompositionEnd(topLevelType, nativeEvent)) { + eventType = eventTypes.compositionEnd; + } + + if (!eventType) { + return null; + } + + if (useFallbackCompositionData) { + // The current composition is stored statically and must not be + // overwritten while composition continues. + if (!currentComposition && eventType === eventTypes.compositionStart) { + currentComposition = FallbackCompositionState.getPooled(topLevelTarget); + } else if (eventType === eventTypes.compositionEnd) { + if (currentComposition) { + fallbackData = currentComposition.getData(); + } + } + } + + var event = SyntheticCompositionEvent.getPooled(eventType, topLevelTargetID, nativeEvent, nativeEventTarget); + + if (fallbackData) { + // Inject data generated from fallback path into the synthetic event. + // This matches the property of native CompositionEventInterface. + event.data = fallbackData; + } else { + var customData = getDataFromCustomEvent(nativeEvent); + if (customData !== null) { + event.data = customData; + } + } + + EventPropagators.accumulateTwoPhaseDispatches(event); + return event; + } + + /** + * @param {string} topLevelType Record from `EventConstants`. + * @param {object} nativeEvent Native browser event. + * @return {?string} The string corresponding to this `beforeInput` event. + */ + function getNativeBeforeInputChars(topLevelType, nativeEvent) { + switch (topLevelType) { + case topLevelTypes.topCompositionEnd: + return getDataFromCustomEvent(nativeEvent); + case topLevelTypes.topKeyPress: + /** + * If native `textInput` events are available, our goal is to make + * use of them. However, there is a special case: the spacebar key. + * In Webkit, preventing default on a spacebar `textInput` event + * cancels character insertion, but it *also* causes the browser + * to fall back to its default spacebar behavior of scrolling the + * page. + * + * Tracking at: + * https://code.google.com/p/chromium/issues/detail?id=355103 + * + * To avoid this issue, use the keypress event as if no `textInput` + * event is available. + */ + var which = nativeEvent.which; + if (which !== SPACEBAR_CODE) { + return null; + } + + hasSpaceKeypress = true; + return SPACEBAR_CHAR; + + case topLevelTypes.topTextInput: + // Record the characters to be added to the DOM. + var chars = nativeEvent.data; + + // If it's a spacebar character, assume that we have already handled + // it at the keypress level and bail immediately. Android Chrome + // doesn't give us keycodes, so we need to blacklist it. + if (chars === SPACEBAR_CHAR && hasSpaceKeypress) { + return null; + } + + return chars; + + default: + // For other native event types, do nothing. + return null; + } + } + + /** + * For browsers that do not provide the `textInput` event, extract the + * appropriate string to use for SyntheticInputEvent. + * + * @param {string} topLevelType Record from `EventConstants`. + * @param {object} nativeEvent Native browser event. + * @return {?string} The fallback string for this `beforeInput` event. + */ + function getFallbackBeforeInputChars(topLevelType, nativeEvent) { + // If we are currently composing (IME) and using a fallback to do so, + // try to extract the composed characters from the fallback object. + if (currentComposition) { + if (topLevelType === topLevelTypes.topCompositionEnd || isFallbackCompositionEnd(topLevelType, nativeEvent)) { + var chars = currentComposition.getData(); + FallbackCompositionState.release(currentComposition); + currentComposition = null; + return chars; + } + return null; + } + + switch (topLevelType) { + case topLevelTypes.topPaste: + // If a paste event occurs after a keypress, throw out the input + // chars. Paste events should not lead to BeforeInput events. + return null; + case topLevelTypes.topKeyPress: + /** + * As of v27, Firefox may fire keypress events even when no character + * will be inserted. A few possibilities: + * + * - `which` is `0`. Arrow keys, Esc key, etc. + * + * - `which` is the pressed key code, but no char is available. + * Ex: 'AltGr + d` in Polish. There is no modified character for + * this key combination and no character is inserted into the + * document, but FF fires the keypress for char code `100` anyway. + * No `input` event will occur. + * + * - `which` is the pressed key code, but a command combination is + * being used. Ex: `Cmd+C`. No character is inserted, and no + * `input` event will occur. + */ + if (nativeEvent.which && !isKeypressCommand(nativeEvent)) { + return String.fromCharCode(nativeEvent.which); + } + return null; + case topLevelTypes.topCompositionEnd: + return useFallbackCompositionData ? null : nativeEvent.data; + default: + return null; + } + } + + /** + * Extract a SyntheticInputEvent for `beforeInput`, based on either native + * `textInput` or fallback behavior. + * + * @param {string} topLevelType Record from `EventConstants`. + * @param {DOMEventTarget} topLevelTarget The listening component root node. + * @param {string} topLevelTargetID ID of `topLevelTarget`. + * @param {object} nativeEvent Native browser event. + * @return {?object} A SyntheticInputEvent. + */ + function extractBeforeInputEvent(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) { + var chars; + + if (canUseTextInputEvent) { + chars = getNativeBeforeInputChars(topLevelType, nativeEvent); + } else { + chars = getFallbackBeforeInputChars(topLevelType, nativeEvent); + } + + // If no characters are being inserted, no BeforeInput event should + // be fired. + if (!chars) { + return null; + } + + var event = SyntheticInputEvent.getPooled(eventTypes.beforeInput, topLevelTargetID, nativeEvent, nativeEventTarget); + + event.data = chars; + EventPropagators.accumulateTwoPhaseDispatches(event); + return event; + } + + /** + * Create an `onBeforeInput` event to match + * http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105/#events-inputevents. + * + * This event plugin is based on the native `textInput` event + * available in Chrome, Safari, Opera, and IE. This event fires after + * `onKeyPress` and `onCompositionEnd`, but before `onInput`. + * + * `beforeInput` is spec'd but not implemented in any browsers, and + * the `input` event does not provide any useful information about what has + * actually been added, contrary to the spec. Thus, `textInput` is the best + * available event to identify the characters that have actually been inserted + * into the target node. + * + * This plugin is also responsible for emitting `composition` events, thus + * allowing us to share composition fallback code for both `beforeInput` and + * `composition` event types. + */ + var BeforeInputEventPlugin = { + + eventTypes: eventTypes, + + /** + * @param {string} topLevelType Record from `EventConstants`. + * @param {DOMEventTarget} topLevelTarget The listening component root node. + * @param {string} topLevelTargetID ID of `topLevelTarget`. + * @param {object} nativeEvent Native browser event. + * @return {*} An accumulation of synthetic events. + * @see {EventPluginHub.extractEvents} + */ + extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) { + return [extractCompositionEvent(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget), extractBeforeInputEvent(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget)]; + } + }; + + module.exports = BeforeInputEventPlugin; + +/***/ }, +/* 72 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule EventPropagators + */ + + 'use strict'; + + var EventConstants = __webpack_require__(29); + var EventPluginHub = __webpack_require__(30); + + var warning = __webpack_require__(24); + + var accumulateInto = __webpack_require__(34); + var forEachAccumulated = __webpack_require__(35); + + var PropagationPhases = EventConstants.PropagationPhases; + var getListener = EventPluginHub.getListener; + + /** + * Some event types have a notion of different registration names for different + * "phases" of propagation. This finds listeners by a given phase. + */ + function listenerAtPhase(id, event, propagationPhase) { + var registrationName = event.dispatchConfig.phasedRegistrationNames[propagationPhase]; + return getListener(id, registrationName); + } + + /** + * Tags a `SyntheticEvent` with dispatched listeners. Creating this function + * here, allows us to not have to bind or create functions for each event. + * Mutating the event's members allows us to not have to create a wrapping + * "dispatch" object that pairs the event with the listener. + */ + function accumulateDirectionalDispatches(domID, upwards, event) { + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(domID, 'Dispatching id must not be null') : undefined; + } + var phase = upwards ? PropagationPhases.bubbled : PropagationPhases.captured; + var listener = listenerAtPhase(domID, event, phase); + if (listener) { + event._dispatchListeners = accumulateInto(event._dispatchListeners, listener); + event._dispatchIDs = accumulateInto(event._dispatchIDs, domID); + } + } + + /** + * Collect dispatches (must be entirely collected before dispatching - see unit + * tests). Lazily allocate the array to conserve memory. We must loop through + * each event and perform the traversal for each one. We cannot perform a + * single traversal for the entire collection of events because each event may + * have a different target. + */ + function accumulateTwoPhaseDispatchesSingle(event) { + if (event && event.dispatchConfig.phasedRegistrationNames) { + EventPluginHub.injection.getInstanceHandle().traverseTwoPhase(event.dispatchMarker, accumulateDirectionalDispatches, event); + } + } + + /** + * Same as `accumulateTwoPhaseDispatchesSingle`, but skips over the targetID. + */ + function accumulateTwoPhaseDispatchesSingleSkipTarget(event) { + if (event && event.dispatchConfig.phasedRegistrationNames) { + EventPluginHub.injection.getInstanceHandle().traverseTwoPhaseSkipTarget(event.dispatchMarker, accumulateDirectionalDispatches, event); + } + } + + /** + * Accumulates without regard to direction, does not look for phased + * registration names. Same as `accumulateDirectDispatchesSingle` but without + * requiring that the `dispatchMarker` be the same as the dispatched ID. + */ + function accumulateDispatches(id, ignoredDirection, event) { + if (event && event.dispatchConfig.registrationName) { + var registrationName = event.dispatchConfig.registrationName; + var listener = getListener(id, registrationName); + if (listener) { + event._dispatchListeners = accumulateInto(event._dispatchListeners, listener); + event._dispatchIDs = accumulateInto(event._dispatchIDs, id); + } + } + } + + /** + * Accumulates dispatches on an `SyntheticEvent`, but only for the + * `dispatchMarker`. + * @param {SyntheticEvent} event + */ + function accumulateDirectDispatchesSingle(event) { + if (event && event.dispatchConfig.registrationName) { + accumulateDispatches(event.dispatchMarker, null, event); + } + } + + function accumulateTwoPhaseDispatches(events) { + forEachAccumulated(events, accumulateTwoPhaseDispatchesSingle); + } + + function accumulateTwoPhaseDispatchesSkipTarget(events) { + forEachAccumulated(events, accumulateTwoPhaseDispatchesSingleSkipTarget); + } + + function accumulateEnterLeaveDispatches(leave, enter, fromID, toID) { + EventPluginHub.injection.getInstanceHandle().traverseEnterLeave(fromID, toID, accumulateDispatches, leave, enter); + } + + function accumulateDirectDispatches(events) { + forEachAccumulated(events, accumulateDirectDispatchesSingle); + } + + /** + * A small set of propagation patterns, each of which will accept a small amount + * of information, and generate a set of "dispatch ready event objects" - which + * are sets of events that have already been annotated with a set of dispatched + * listener functions/ids. The API is designed this way to discourage these + * propagation strategies from actually executing the dispatches, since we + * always want to collect the entire set of dispatches before executing event a + * single one. + * + * @constructor EventPropagators + */ + var EventPropagators = { + accumulateTwoPhaseDispatches: accumulateTwoPhaseDispatches, + accumulateTwoPhaseDispatchesSkipTarget: accumulateTwoPhaseDispatchesSkipTarget, + accumulateDirectDispatches: accumulateDirectDispatches, + accumulateEnterLeaveDispatches: accumulateEnterLeaveDispatches + }; + + module.exports = EventPropagators; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 73 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule FallbackCompositionState + * @typechecks static-only + */ + + 'use strict'; + + var PooledClass = __webpack_require__(55); + + var assign = __webpack_require__(38); + var getTextContentAccessor = __webpack_require__(74); + + /** + * This helper class stores information about text content of a target node, + * allowing comparison of content before and after a given event. + * + * Identify the node where selection currently begins, then observe + * both its text content and its current position in the DOM. Since the + * browser may natively replace the target node during composition, we can + * use its position to find its replacement. + * + * @param {DOMEventTarget} root + */ + function FallbackCompositionState(root) { + this._root = root; + this._startText = this.getText(); + this._fallbackText = null; + } + + assign(FallbackCompositionState.prototype, { + destructor: function () { + this._root = null; + this._startText = null; + this._fallbackText = null; + }, + + /** + * Get current text of input. + * + * @return {string} + */ + getText: function () { + if ('value' in this._root) { + return this._root.value; + } + return this._root[getTextContentAccessor()]; + }, + + /** + * Determine the differing substring between the initially stored + * text content and the current content. + * + * @return {string} + */ + getData: function () { + if (this._fallbackText) { + return this._fallbackText; + } + + var start; + var startValue = this._startText; + var startLength = startValue.length; + var end; + var endValue = this.getText(); + var endLength = endValue.length; + + for (start = 0; start < startLength; start++) { + if (startValue[start] !== endValue[start]) { + break; + } + } + + var minEnd = startLength - start; + for (end = 1; end <= minEnd; end++) { + if (startValue[startLength - end] !== endValue[endLength - end]) { + break; + } + } + + var sliceTail = end > 1 ? 1 - end : undefined; + this._fallbackText = endValue.slice(start, sliceTail); + return this._fallbackText; + } + }); + + PooledClass.addPoolingTo(FallbackCompositionState); + + module.exports = FallbackCompositionState; + +/***/ }, +/* 74 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule getTextContentAccessor + */ + + 'use strict'; + + var ExecutionEnvironment = __webpack_require__(8); + + var contentKey = null; + + /** + * Gets the key used to access text content on a DOM node. + * + * @return {?string} Key used to access text content. + * @internal + */ + function getTextContentAccessor() { + if (!contentKey && ExecutionEnvironment.canUseDOM) { + // Prefer textContent to innerText because many browsers support both but + // SVG <text> elements don't support innerText even when <div> does. + contentKey = 'textContent' in document.documentElement ? 'textContent' : 'innerText'; + } + return contentKey; + } + + module.exports = getTextContentAccessor; + +/***/ }, +/* 75 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule SyntheticCompositionEvent + * @typechecks static-only + */ + + 'use strict'; + + var SyntheticEvent = __webpack_require__(76); + + /** + * @interface Event + * @see http://www.w3.org/TR/DOM-Level-3-Events/#events-compositionevents + */ + var CompositionEventInterface = { + data: null + }; + + /** + * @param {object} dispatchConfig Configuration used to dispatch this event. + * @param {string} dispatchMarker Marker identifying the event target. + * @param {object} nativeEvent Native browser event. + * @extends {SyntheticUIEvent} + */ + function SyntheticCompositionEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) { + SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget); + } + + SyntheticEvent.augmentClass(SyntheticCompositionEvent, CompositionEventInterface); + + module.exports = SyntheticCompositionEvent; + +/***/ }, +/* 76 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule SyntheticEvent + * @typechecks static-only + */ + + 'use strict'; + + var PooledClass = __webpack_require__(55); + + var assign = __webpack_require__(38); + var emptyFunction = __webpack_require__(14); + var warning = __webpack_require__(24); + + /** + * @interface Event + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ + var EventInterface = { + type: null, + // currentTarget is set when dispatching; no use in copying it here + currentTarget: emptyFunction.thatReturnsNull, + eventPhase: null, + bubbles: null, + cancelable: null, + timeStamp: function (event) { + return event.timeStamp || Date.now(); + }, + defaultPrevented: null, + isTrusted: null + }; + + /** + * Synthetic events are dispatched by event plugins, typically in response to a + * top-level event delegation handler. + * + * These systems should generally use pooling to reduce the frequency of garbage + * collection. The system should check `isPersistent` to determine whether the + * event should be released into the pool after being dispatched. Users that + * need a persisted event should invoke `persist`. + * + * Synthetic events (and subclasses) implement the DOM Level 3 Events API by + * normalizing browser quirks. Subclasses do not necessarily have to implement a + * DOM interface; custom application-specific events can also subclass this. + * + * @param {object} dispatchConfig Configuration used to dispatch this event. + * @param {string} dispatchMarker Marker identifying the event target. + * @param {object} nativeEvent Native browser event. + */ + function SyntheticEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) { + this.dispatchConfig = dispatchConfig; + this.dispatchMarker = dispatchMarker; + this.nativeEvent = nativeEvent; + this.target = nativeEventTarget; + this.currentTarget = nativeEventTarget; + + var Interface = this.constructor.Interface; + for (var propName in Interface) { + if (!Interface.hasOwnProperty(propName)) { + continue; + } + var normalize = Interface[propName]; + if (normalize) { + this[propName] = normalize(nativeEvent); + } else { + this[propName] = nativeEvent[propName]; + } + } + + var defaultPrevented = nativeEvent.defaultPrevented != null ? nativeEvent.defaultPrevented : nativeEvent.returnValue === false; + if (defaultPrevented) { + this.isDefaultPrevented = emptyFunction.thatReturnsTrue; + } else { + this.isDefaultPrevented = emptyFunction.thatReturnsFalse; + } + this.isPropagationStopped = emptyFunction.thatReturnsFalse; + } + + assign(SyntheticEvent.prototype, { + + preventDefault: function () { + this.defaultPrevented = true; + var event = this.nativeEvent; + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(event, 'This synthetic event is reused for performance reasons. If you\'re ' + 'seeing this, you\'re calling `preventDefault` on a ' + 'released/nullified synthetic event. This is a no-op. See ' + 'https://fb.me/react-event-pooling for more information.') : undefined; + } + if (!event) { + return; + } + + if (event.preventDefault) { + event.preventDefault(); + } else { + event.returnValue = false; + } + this.isDefaultPrevented = emptyFunction.thatReturnsTrue; + }, + + stopPropagation: function () { + var event = this.nativeEvent; + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(event, 'This synthetic event is reused for performance reasons. If you\'re ' + 'seeing this, you\'re calling `stopPropagation` on a ' + 'released/nullified synthetic event. This is a no-op. See ' + 'https://fb.me/react-event-pooling for more information.') : undefined; + } + if (!event) { + return; + } + + if (event.stopPropagation) { + event.stopPropagation(); + } else { + event.cancelBubble = true; + } + this.isPropagationStopped = emptyFunction.thatReturnsTrue; + }, + + /** + * We release all dispatched `SyntheticEvent`s after each event loop, adding + * them back into the pool. This allows a way to hold onto a reference that + * won't be added back into the pool. + */ + persist: function () { + this.isPersistent = emptyFunction.thatReturnsTrue; + }, + + /** + * Checks if this event should be released back into the pool. + * + * @return {boolean} True if this should not be released, false otherwise. + */ + isPersistent: emptyFunction.thatReturnsFalse, + + /** + * `PooledClass` looks for `destructor` on each instance it releases. + */ + destructor: function () { + var Interface = this.constructor.Interface; + for (var propName in Interface) { + this[propName] = null; + } + this.dispatchConfig = null; + this.dispatchMarker = null; + this.nativeEvent = null; + } + + }); + + SyntheticEvent.Interface = EventInterface; + + /** + * Helper to reduce boilerplate when creating subclasses. + * + * @param {function} Class + * @param {?object} Interface + */ + SyntheticEvent.augmentClass = function (Class, Interface) { + var Super = this; + + var prototype = Object.create(Super.prototype); + assign(prototype, Class.prototype); + Class.prototype = prototype; + Class.prototype.constructor = Class; + + Class.Interface = assign({}, Super.Interface, Interface); + Class.augmentClass = Super.augmentClass; + + PooledClass.addPoolingTo(Class, PooledClass.fourArgumentPooler); + }; + + PooledClass.addPoolingTo(SyntheticEvent, PooledClass.fourArgumentPooler); + + module.exports = SyntheticEvent; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 77 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule SyntheticInputEvent + * @typechecks static-only + */ + + 'use strict'; + + var SyntheticEvent = __webpack_require__(76); + + /** + * @interface Event + * @see http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105 + * /#events-inputevents + */ + var InputEventInterface = { + data: null + }; + + /** + * @param {object} dispatchConfig Configuration used to dispatch this event. + * @param {string} dispatchMarker Marker identifying the event target. + * @param {object} nativeEvent Native browser event. + * @extends {SyntheticUIEvent} + */ + function SyntheticInputEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) { + SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget); + } + + SyntheticEvent.augmentClass(SyntheticInputEvent, InputEventInterface); + + module.exports = SyntheticInputEvent; + +/***/ }, +/* 78 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule keyOf + */ + + /** + * Allows extraction of a minified key. Let's the build system minify keys + * without losing the ability to dynamically use key strings as values + * themselves. Pass in an object with a single key/val pair and it will return + * you the string key of that single record. Suppose you want to grab the + * value for a key 'className' inside of an object. Key/val minification may + * have aliased that key to be 'xa12'. keyOf({className: null}) will return + * 'xa12' in that case. Resolve keys you want to use once at startup time, then + * reuse those resolutions. + */ + "use strict"; + + var keyOf = function (oneKeyObj) { + var key; + for (key in oneKeyObj) { + if (!oneKeyObj.hasOwnProperty(key)) { + continue; + } + return key; + } + return null; + }; + + module.exports = keyOf; + +/***/ }, +/* 79 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ChangeEventPlugin + */ + + 'use strict'; + + var EventConstants = __webpack_require__(29); + var EventPluginHub = __webpack_require__(30); + var EventPropagators = __webpack_require__(72); + var ExecutionEnvironment = __webpack_require__(8); + var ReactUpdates = __webpack_require__(53); + var SyntheticEvent = __webpack_require__(76); + + var getEventTarget = __webpack_require__(80); + var isEventSupported = __webpack_require__(39); + var isTextInputElement = __webpack_require__(81); + var keyOf = __webpack_require__(78); + + var topLevelTypes = EventConstants.topLevelTypes; + + var eventTypes = { + change: { + phasedRegistrationNames: { + bubbled: keyOf({ onChange: null }), + captured: keyOf({ onChangeCapture: null }) + }, + dependencies: [topLevelTypes.topBlur, topLevelTypes.topChange, topLevelTypes.topClick, topLevelTypes.topFocus, topLevelTypes.topInput, topLevelTypes.topKeyDown, topLevelTypes.topKeyUp, topLevelTypes.topSelectionChange] + } + }; + + /** + * For IE shims + */ + var activeElement = null; + var activeElementID = null; + var activeElementValue = null; + var activeElementValueProp = null; + + /** + * SECTION: handle `change` event + */ + function shouldUseChangeEvent(elem) { + var nodeName = elem.nodeName && elem.nodeName.toLowerCase(); + return nodeName === 'select' || nodeName === 'input' && elem.type === 'file'; + } + + var doesChangeEventBubble = false; + if (ExecutionEnvironment.canUseDOM) { + // See `handleChange` comment below + doesChangeEventBubble = isEventSupported('change') && (!('documentMode' in document) || document.documentMode > 8); + } + + function manualDispatchChangeEvent(nativeEvent) { + var event = SyntheticEvent.getPooled(eventTypes.change, activeElementID, nativeEvent, getEventTarget(nativeEvent)); + EventPropagators.accumulateTwoPhaseDispatches(event); + + // If change and propertychange bubbled, we'd just bind to it like all the + // other events and have it go through ReactBrowserEventEmitter. Since it + // doesn't, we manually listen for the events and so we have to enqueue and + // process the abstract event manually. + // + // Batching is necessary here in order to ensure that all event handlers run + // before the next rerender (including event handlers attached to ancestor + // elements instead of directly on the input). Without this, controlled + // components don't work properly in conjunction with event bubbling because + // the component is rerendered and the value reverted before all the event + // handlers can run. See https://github.com/facebook/react/issues/708. + ReactUpdates.batchedUpdates(runEventInBatch, event); + } + + function runEventInBatch(event) { + EventPluginHub.enqueueEvents(event); + EventPluginHub.processEventQueue(false); + } + + function startWatchingForChangeEventIE8(target, targetID) { + activeElement = target; + activeElementID = targetID; + activeElement.attachEvent('onchange', manualDispatchChangeEvent); + } + + function stopWatchingForChangeEventIE8() { + if (!activeElement) { + return; + } + activeElement.detachEvent('onchange', manualDispatchChangeEvent); + activeElement = null; + activeElementID = null; + } + + function getTargetIDForChangeEvent(topLevelType, topLevelTarget, topLevelTargetID) { + if (topLevelType === topLevelTypes.topChange) { + return topLevelTargetID; + } + } + function handleEventsForChangeEventIE8(topLevelType, topLevelTarget, topLevelTargetID) { + if (topLevelType === topLevelTypes.topFocus) { + // stopWatching() should be a noop here but we call it just in case we + // missed a blur event somehow. + stopWatchingForChangeEventIE8(); + startWatchingForChangeEventIE8(topLevelTarget, topLevelTargetID); + } else if (topLevelType === topLevelTypes.topBlur) { + stopWatchingForChangeEventIE8(); + } + } + + /** + * SECTION: handle `input` event + */ + var isInputEventSupported = false; + if (ExecutionEnvironment.canUseDOM) { + // IE9 claims to support the input event but fails to trigger it when + // deleting text, so we ignore its input events + isInputEventSupported = isEventSupported('input') && (!('documentMode' in document) || document.documentMode > 9); + } + + /** + * (For old IE.) Replacement getter/setter for the `value` property that gets + * set on the active element. + */ + var newValueProp = { + get: function () { + return activeElementValueProp.get.call(this); + }, + set: function (val) { + // Cast to a string so we can do equality checks. + activeElementValue = '' + val; + activeElementValueProp.set.call(this, val); + } + }; + + /** + * (For old IE.) Starts tracking propertychange events on the passed-in element + * and override the value property so that we can distinguish user events from + * value changes in JS. + */ + function startWatchingForValueChange(target, targetID) { + activeElement = target; + activeElementID = targetID; + activeElementValue = target.value; + activeElementValueProp = Object.getOwnPropertyDescriptor(target.constructor.prototype, 'value'); + + // Not guarded in a canDefineProperty check: IE8 supports defineProperty only + // on DOM elements + Object.defineProperty(activeElement, 'value', newValueProp); + activeElement.attachEvent('onpropertychange', handlePropertyChange); + } + + /** + * (For old IE.) Removes the event listeners from the currently-tracked element, + * if any exists. + */ + function stopWatchingForValueChange() { + if (!activeElement) { + return; + } + + // delete restores the original property definition + delete activeElement.value; + activeElement.detachEvent('onpropertychange', handlePropertyChange); + + activeElement = null; + activeElementID = null; + activeElementValue = null; + activeElementValueProp = null; + } + + /** + * (For old IE.) Handles a propertychange event, sending a `change` event if + * the value of the active element has changed. + */ + function handlePropertyChange(nativeEvent) { + if (nativeEvent.propertyName !== 'value') { + return; + } + var value = nativeEvent.srcElement.value; + if (value === activeElementValue) { + return; + } + activeElementValue = value; + + manualDispatchChangeEvent(nativeEvent); + } + + /** + * If a `change` event should be fired, returns the target's ID. + */ + function getTargetIDForInputEvent(topLevelType, topLevelTarget, topLevelTargetID) { + if (topLevelType === topLevelTypes.topInput) { + // In modern browsers (i.e., not IE8 or IE9), the input event is exactly + // what we want so fall through here and trigger an abstract event + return topLevelTargetID; + } + } + + // For IE8 and IE9. + function handleEventsForInputEventIE(topLevelType, topLevelTarget, topLevelTargetID) { + if (topLevelType === topLevelTypes.topFocus) { + // In IE8, we can capture almost all .value changes by adding a + // propertychange handler and looking for events with propertyName + // equal to 'value' + // In IE9, propertychange fires for most input events but is buggy and + // doesn't fire when text is deleted, but conveniently, selectionchange + // appears to fire in all of the remaining cases so we catch those and + // forward the event if the value has changed + // In either case, we don't want to call the event handler if the value + // is changed from JS so we redefine a setter for `.value` that updates + // our activeElementValue variable, allowing us to ignore those changes + // + // stopWatching() should be a noop here but we call it just in case we + // missed a blur event somehow. + stopWatchingForValueChange(); + startWatchingForValueChange(topLevelTarget, topLevelTargetID); + } else if (topLevelType === topLevelTypes.topBlur) { + stopWatchingForValueChange(); + } + } + + // For IE8 and IE9. + function getTargetIDForInputEventIE(topLevelType, topLevelTarget, topLevelTargetID) { + if (topLevelType === topLevelTypes.topSelectionChange || topLevelType === topLevelTypes.topKeyUp || topLevelType === topLevelTypes.topKeyDown) { + // On the selectionchange event, the target is just document which isn't + // helpful for us so just check activeElement instead. + // + // 99% of the time, keydown and keyup aren't necessary. IE8 fails to fire + // propertychange on the first input event after setting `value` from a + // script and fires only keydown, keypress, keyup. Catching keyup usually + // gets it and catching keydown lets us fire an event for the first + // keystroke if user does a key repeat (it'll be a little delayed: right + // before the second keystroke). Other input methods (e.g., paste) seem to + // fire selectionchange normally. + if (activeElement && activeElement.value !== activeElementValue) { + activeElementValue = activeElement.value; + return activeElementID; + } + } + } + + /** + * SECTION: handle `click` event + */ + function shouldUseClickEvent(elem) { + // Use the `click` event to detect changes to checkbox and radio inputs. + // This approach works across all browsers, whereas `change` does not fire + // until `blur` in IE8. + return elem.nodeName && elem.nodeName.toLowerCase() === 'input' && (elem.type === 'checkbox' || elem.type === 'radio'); + } + + function getTargetIDForClickEvent(topLevelType, topLevelTarget, topLevelTargetID) { + if (topLevelType === topLevelTypes.topClick) { + return topLevelTargetID; + } + } + + /** + * This plugin creates an `onChange` event that normalizes change events + * across form elements. This event fires at a time when it's possible to + * change the element's value without seeing a flicker. + * + * Supported elements are: + * - input (see `isTextInputElement`) + * - textarea + * - select + */ + var ChangeEventPlugin = { + + eventTypes: eventTypes, + + /** + * @param {string} topLevelType Record from `EventConstants`. + * @param {DOMEventTarget} topLevelTarget The listening component root node. + * @param {string} topLevelTargetID ID of `topLevelTarget`. + * @param {object} nativeEvent Native browser event. + * @return {*} An accumulation of synthetic events. + * @see {EventPluginHub.extractEvents} + */ + extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) { + + var getTargetIDFunc, handleEventFunc; + if (shouldUseChangeEvent(topLevelTarget)) { + if (doesChangeEventBubble) { + getTargetIDFunc = getTargetIDForChangeEvent; + } else { + handleEventFunc = handleEventsForChangeEventIE8; + } + } else if (isTextInputElement(topLevelTarget)) { + if (isInputEventSupported) { + getTargetIDFunc = getTargetIDForInputEvent; + } else { + getTargetIDFunc = getTargetIDForInputEventIE; + handleEventFunc = handleEventsForInputEventIE; + } + } else if (shouldUseClickEvent(topLevelTarget)) { + getTargetIDFunc = getTargetIDForClickEvent; + } + + if (getTargetIDFunc) { + var targetID = getTargetIDFunc(topLevelType, topLevelTarget, topLevelTargetID); + if (targetID) { + var event = SyntheticEvent.getPooled(eventTypes.change, targetID, nativeEvent, nativeEventTarget); + event.type = 'change'; + EventPropagators.accumulateTwoPhaseDispatches(event); + return event; + } + } + + if (handleEventFunc) { + handleEventFunc(topLevelType, topLevelTarget, topLevelTargetID); + } + } + + }; + + module.exports = ChangeEventPlugin; + +/***/ }, +/* 80 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule getEventTarget + * @typechecks static-only + */ + + 'use strict'; + + /** + * Gets the target node from a native browser event by accounting for + * inconsistencies in browser DOM APIs. + * + * @param {object} nativeEvent Native browser event. + * @return {DOMEventTarget} Target node. + */ + function getEventTarget(nativeEvent) { + var target = nativeEvent.target || nativeEvent.srcElement || window; + // Safari may fire events on text nodes (Node.TEXT_NODE is 3). + // @see http://www.quirksmode.org/js/events_properties.html + return target.nodeType === 3 ? target.parentNode : target; + } + + module.exports = getEventTarget; + +/***/ }, +/* 81 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule isTextInputElement + */ + + 'use strict'; + + /** + * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary + */ + var supportedInputTypes = { + 'color': true, + 'date': true, + 'datetime': true, + 'datetime-local': true, + 'email': true, + 'month': true, + 'number': true, + 'password': true, + 'range': true, + 'search': true, + 'tel': true, + 'text': true, + 'time': true, + 'url': true, + 'week': true + }; + + function isTextInputElement(elem) { + var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase(); + return nodeName && (nodeName === 'input' && supportedInputTypes[elem.type] || nodeName === 'textarea'); + } + + module.exports = isTextInputElement; + +/***/ }, +/* 82 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ClientReactRootIndex + * @typechecks + */ + + 'use strict'; + + var nextReactRootIndex = 0; + + var ClientReactRootIndex = { + createReactRootIndex: function () { + return nextReactRootIndex++; + } + }; + + module.exports = ClientReactRootIndex; + +/***/ }, +/* 83 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule DefaultEventPluginOrder + */ + + 'use strict'; + + var keyOf = __webpack_require__(78); + + /** + * Module that is injectable into `EventPluginHub`, that specifies a + * deterministic ordering of `EventPlugin`s. A convenient way to reason about + * plugins, without having to package every one of them. This is better than + * having plugins be ordered in the same order that they are injected because + * that ordering would be influenced by the packaging order. + * `ResponderEventPlugin` must occur before `SimpleEventPlugin` so that + * preventing default on events is convenient in `SimpleEventPlugin` handlers. + */ + var DefaultEventPluginOrder = [keyOf({ ResponderEventPlugin: null }), keyOf({ SimpleEventPlugin: null }), keyOf({ TapEventPlugin: null }), keyOf({ EnterLeaveEventPlugin: null }), keyOf({ ChangeEventPlugin: null }), keyOf({ SelectEventPlugin: null }), keyOf({ BeforeInputEventPlugin: null })]; + + module.exports = DefaultEventPluginOrder; + +/***/ }, +/* 84 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule EnterLeaveEventPlugin + * @typechecks static-only + */ + + 'use strict'; + + var EventConstants = __webpack_require__(29); + var EventPropagators = __webpack_require__(72); + var SyntheticMouseEvent = __webpack_require__(85); + + var ReactMount = __webpack_require__(27); + var keyOf = __webpack_require__(78); + + var topLevelTypes = EventConstants.topLevelTypes; + var getFirstReactDOM = ReactMount.getFirstReactDOM; + + var eventTypes = { + mouseEnter: { + registrationName: keyOf({ onMouseEnter: null }), + dependencies: [topLevelTypes.topMouseOut, topLevelTypes.topMouseOver] + }, + mouseLeave: { + registrationName: keyOf({ onMouseLeave: null }), + dependencies: [topLevelTypes.topMouseOut, topLevelTypes.topMouseOver] + } + }; + + var extractedEvents = [null, null]; + + var EnterLeaveEventPlugin = { + + eventTypes: eventTypes, + + /** + * For almost every interaction we care about, there will be both a top-level + * `mouseover` and `mouseout` event that occurs. Only use `mouseout` so that + * we do not extract duplicate events. However, moving the mouse into the + * browser from outside will not fire a `mouseout` event. In this case, we use + * the `mouseover` top-level event. + * + * @param {string} topLevelType Record from `EventConstants`. + * @param {DOMEventTarget} topLevelTarget The listening component root node. + * @param {string} topLevelTargetID ID of `topLevelTarget`. + * @param {object} nativeEvent Native browser event. + * @return {*} An accumulation of synthetic events. + * @see {EventPluginHub.extractEvents} + */ + extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) { + if (topLevelType === topLevelTypes.topMouseOver && (nativeEvent.relatedTarget || nativeEvent.fromElement)) { + return null; + } + if (topLevelType !== topLevelTypes.topMouseOut && topLevelType !== topLevelTypes.topMouseOver) { + // Must not be a mouse in or mouse out - ignoring. + return null; + } + + var win; + if (topLevelTarget.window === topLevelTarget) { + // `topLevelTarget` is probably a window object. + win = topLevelTarget; + } else { + // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8. + var doc = topLevelTarget.ownerDocument; + if (doc) { + win = doc.defaultView || doc.parentWindow; + } else { + win = window; + } + } + + var from; + var to; + var fromID = ''; + var toID = ''; + if (topLevelType === topLevelTypes.topMouseOut) { + from = topLevelTarget; + fromID = topLevelTargetID; + to = getFirstReactDOM(nativeEvent.relatedTarget || nativeEvent.toElement); + if (to) { + toID = ReactMount.getID(to); + } else { + to = win; + } + to = to || win; + } else { + from = win; + to = topLevelTarget; + toID = topLevelTargetID; + } + + if (from === to) { + // Nothing pertains to our managed components. + return null; + } + + var leave = SyntheticMouseEvent.getPooled(eventTypes.mouseLeave, fromID, nativeEvent, nativeEventTarget); + leave.type = 'mouseleave'; + leave.target = from; + leave.relatedTarget = to; + + var enter = SyntheticMouseEvent.getPooled(eventTypes.mouseEnter, toID, nativeEvent, nativeEventTarget); + enter.type = 'mouseenter'; + enter.target = to; + enter.relatedTarget = from; + + EventPropagators.accumulateEnterLeaveDispatches(leave, enter, fromID, toID); + + extractedEvents[0] = leave; + extractedEvents[1] = enter; + + return extractedEvents; + } + + }; + + module.exports = EnterLeaveEventPlugin; + +/***/ }, +/* 85 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule SyntheticMouseEvent + * @typechecks static-only + */ + + 'use strict'; + + var SyntheticUIEvent = __webpack_require__(86); + var ViewportMetrics = __webpack_require__(37); + + var getEventModifierState = __webpack_require__(87); + + /** + * @interface MouseEvent + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ + var MouseEventInterface = { + screenX: null, + screenY: null, + clientX: null, + clientY: null, + ctrlKey: null, + shiftKey: null, + altKey: null, + metaKey: null, + getModifierState: getEventModifierState, + button: function (event) { + // Webkit, Firefox, IE9+ + // which: 1 2 3 + // button: 0 1 2 (standard) + var button = event.button; + if ('which' in event) { + return button; + } + // IE<9 + // which: undefined + // button: 0 0 0 + // button: 1 4 2 (onmouseup) + return button === 2 ? 2 : button === 4 ? 1 : 0; + }, + buttons: null, + relatedTarget: function (event) { + return event.relatedTarget || (event.fromElement === event.srcElement ? event.toElement : event.fromElement); + }, + // "Proprietary" Interface. + pageX: function (event) { + return 'pageX' in event ? event.pageX : event.clientX + ViewportMetrics.currentScrollLeft; + }, + pageY: function (event) { + return 'pageY' in event ? event.pageY : event.clientY + ViewportMetrics.currentScrollTop; + } + }; + + /** + * @param {object} dispatchConfig Configuration used to dispatch this event. + * @param {string} dispatchMarker Marker identifying the event target. + * @param {object} nativeEvent Native browser event. + * @extends {SyntheticUIEvent} + */ + function SyntheticMouseEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) { + SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget); + } + + SyntheticUIEvent.augmentClass(SyntheticMouseEvent, MouseEventInterface); + + module.exports = SyntheticMouseEvent; + +/***/ }, +/* 86 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule SyntheticUIEvent + * @typechecks static-only + */ + + 'use strict'; + + var SyntheticEvent = __webpack_require__(76); + + var getEventTarget = __webpack_require__(80); + + /** + * @interface UIEvent + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ + var UIEventInterface = { + view: function (event) { + if (event.view) { + return event.view; + } + + var target = getEventTarget(event); + if (target != null && target.window === target) { + // target is a window object + return target; + } + + var doc = target.ownerDocument; + // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8. + if (doc) { + return doc.defaultView || doc.parentWindow; + } else { + return window; + } + }, + detail: function (event) { + return event.detail || 0; + } + }; + + /** + * @param {object} dispatchConfig Configuration used to dispatch this event. + * @param {string} dispatchMarker Marker identifying the event target. + * @param {object} nativeEvent Native browser event. + * @extends {SyntheticEvent} + */ + function SyntheticUIEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) { + SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget); + } + + SyntheticEvent.augmentClass(SyntheticUIEvent, UIEventInterface); + + module.exports = SyntheticUIEvent; + +/***/ }, +/* 87 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule getEventModifierState + * @typechecks static-only + */ + + 'use strict'; + + /** + * Translation from modifier key to the associated property in the event. + * @see http://www.w3.org/TR/DOM-Level-3-Events/#keys-Modifiers + */ + + var modifierKeyToProp = { + 'Alt': 'altKey', + 'Control': 'ctrlKey', + 'Meta': 'metaKey', + 'Shift': 'shiftKey' + }; + + // IE8 does not implement getModifierState so we simply map it to the only + // modifier keys exposed by the event itself, does not support Lock-keys. + // Currently, all major browsers except Chrome seems to support Lock-keys. + function modifierStateGetter(keyArg) { + var syntheticEvent = this; + var nativeEvent = syntheticEvent.nativeEvent; + if (nativeEvent.getModifierState) { + return nativeEvent.getModifierState(keyArg); + } + var keyProp = modifierKeyToProp[keyArg]; + return keyProp ? !!nativeEvent[keyProp] : false; + } + + function getEventModifierState(nativeEvent) { + return modifierStateGetter; + } + + module.exports = getEventModifierState; + +/***/ }, +/* 88 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule HTMLDOMPropertyConfig + */ + + 'use strict'; + + var DOMProperty = __webpack_require__(22); + var ExecutionEnvironment = __webpack_require__(8); + + var MUST_USE_ATTRIBUTE = DOMProperty.injection.MUST_USE_ATTRIBUTE; + var MUST_USE_PROPERTY = DOMProperty.injection.MUST_USE_PROPERTY; + var HAS_BOOLEAN_VALUE = DOMProperty.injection.HAS_BOOLEAN_VALUE; + var HAS_SIDE_EFFECTS = DOMProperty.injection.HAS_SIDE_EFFECTS; + var HAS_NUMERIC_VALUE = DOMProperty.injection.HAS_NUMERIC_VALUE; + var HAS_POSITIVE_NUMERIC_VALUE = DOMProperty.injection.HAS_POSITIVE_NUMERIC_VALUE; + var HAS_OVERLOADED_BOOLEAN_VALUE = DOMProperty.injection.HAS_OVERLOADED_BOOLEAN_VALUE; + + var hasSVG; + if (ExecutionEnvironment.canUseDOM) { + var implementation = document.implementation; + hasSVG = implementation && implementation.hasFeature && implementation.hasFeature('http://www.w3.org/TR/SVG11/feature#BasicStructure', '1.1'); + } + + var HTMLDOMPropertyConfig = { + isCustomAttribute: RegExp.prototype.test.bind(/^(data|aria)-[a-z_][a-z\d_.\-]*$/), + Properties: { + /** + * Standard Properties + */ + accept: null, + acceptCharset: null, + accessKey: null, + action: null, + allowFullScreen: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE, + allowTransparency: MUST_USE_ATTRIBUTE, + alt: null, + async: HAS_BOOLEAN_VALUE, + autoComplete: null, + // autoFocus is polyfilled/normalized by AutoFocusUtils + // autoFocus: HAS_BOOLEAN_VALUE, + autoPlay: HAS_BOOLEAN_VALUE, + capture: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE, + cellPadding: null, + cellSpacing: null, + charSet: MUST_USE_ATTRIBUTE, + challenge: MUST_USE_ATTRIBUTE, + checked: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE, + classID: MUST_USE_ATTRIBUTE, + // To set className on SVG elements, it's necessary to use .setAttribute; + // this works on HTML elements too in all browsers except IE8. Conveniently, + // IE8 doesn't support SVG and so we can simply use the attribute in + // browsers that support SVG and the property in browsers that don't, + // regardless of whether the element is HTML or SVG. + className: hasSVG ? MUST_USE_ATTRIBUTE : MUST_USE_PROPERTY, + cols: MUST_USE_ATTRIBUTE | HAS_POSITIVE_NUMERIC_VALUE, + colSpan: null, + content: null, + contentEditable: null, + contextMenu: MUST_USE_ATTRIBUTE, + controls: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE, + coords: null, + crossOrigin: null, + data: null, // For `<object />` acts as `src`. + dateTime: MUST_USE_ATTRIBUTE, + 'default': HAS_BOOLEAN_VALUE, + defer: HAS_BOOLEAN_VALUE, + dir: null, + disabled: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE, + download: HAS_OVERLOADED_BOOLEAN_VALUE, + draggable: null, + encType: null, + form: MUST_USE_ATTRIBUTE, + formAction: MUST_USE_ATTRIBUTE, + formEncType: MUST_USE_ATTRIBUTE, + formMethod: MUST_USE_ATTRIBUTE, + formNoValidate: HAS_BOOLEAN_VALUE, + formTarget: MUST_USE_ATTRIBUTE, + frameBorder: MUST_USE_ATTRIBUTE, + headers: null, + height: MUST_USE_ATTRIBUTE, + hidden: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE, + high: null, + href: null, + hrefLang: null, + htmlFor: null, + httpEquiv: null, + icon: null, + id: MUST_USE_PROPERTY, + inputMode: MUST_USE_ATTRIBUTE, + integrity: null, + is: MUST_USE_ATTRIBUTE, + keyParams: MUST_USE_ATTRIBUTE, + keyType: MUST_USE_ATTRIBUTE, + kind: null, + label: null, + lang: null, + list: MUST_USE_ATTRIBUTE, + loop: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE, + low: null, + manifest: MUST_USE_ATTRIBUTE, + marginHeight: null, + marginWidth: null, + max: null, + maxLength: MUST_USE_ATTRIBUTE, + media: MUST_USE_ATTRIBUTE, + mediaGroup: null, + method: null, + min: null, + minLength: MUST_USE_ATTRIBUTE, + multiple: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE, + muted: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE, + name: null, + nonce: MUST_USE_ATTRIBUTE, + noValidate: HAS_BOOLEAN_VALUE, + open: HAS_BOOLEAN_VALUE, + optimum: null, + pattern: null, + placeholder: null, + poster: null, + preload: null, + radioGroup: null, + readOnly: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE, + rel: null, + required: HAS_BOOLEAN_VALUE, + reversed: HAS_BOOLEAN_VALUE, + role: MUST_USE_ATTRIBUTE, + rows: MUST_USE_ATTRIBUTE | HAS_POSITIVE_NUMERIC_VALUE, + rowSpan: null, + sandbox: null, + scope: null, + scoped: HAS_BOOLEAN_VALUE, + scrolling: null, + seamless: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE, + selected: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE, + shape: null, + size: MUST_USE_ATTRIBUTE | HAS_POSITIVE_NUMERIC_VALUE, + sizes: MUST_USE_ATTRIBUTE, + span: HAS_POSITIVE_NUMERIC_VALUE, + spellCheck: null, + src: null, + srcDoc: MUST_USE_PROPERTY, + srcLang: null, + srcSet: MUST_USE_ATTRIBUTE, + start: HAS_NUMERIC_VALUE, + step: null, + style: null, + summary: null, + tabIndex: null, + target: null, + title: null, + type: null, + useMap: null, + value: MUST_USE_PROPERTY | HAS_SIDE_EFFECTS, + width: MUST_USE_ATTRIBUTE, + wmode: MUST_USE_ATTRIBUTE, + wrap: null, + + /** + * RDFa Properties + */ + about: MUST_USE_ATTRIBUTE, + datatype: MUST_USE_ATTRIBUTE, + inlist: MUST_USE_ATTRIBUTE, + prefix: MUST_USE_ATTRIBUTE, + // property is also supported for OpenGraph in meta tags. + property: MUST_USE_ATTRIBUTE, + resource: MUST_USE_ATTRIBUTE, + 'typeof': MUST_USE_ATTRIBUTE, + vocab: MUST_USE_ATTRIBUTE, + + /** + * Non-standard Properties + */ + // autoCapitalize and autoCorrect are supported in Mobile Safari for + // keyboard hints. + autoCapitalize: null, + autoCorrect: null, + // autoSave allows WebKit/Blink to persist values of input fields on page reloads + autoSave: null, + // color is for Safari mask-icon link + color: null, + // itemProp, itemScope, itemType are for + // Microdata support. See http://schema.org/docs/gs.html + itemProp: MUST_USE_ATTRIBUTE, + itemScope: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE, + itemType: MUST_USE_ATTRIBUTE, + // itemID and itemRef are for Microdata support as well but + // only specified in the the WHATWG spec document. See + // https://html.spec.whatwg.org/multipage/microdata.html#microdata-dom-api + itemID: MUST_USE_ATTRIBUTE, + itemRef: MUST_USE_ATTRIBUTE, + // results show looking glass icon and recent searches on input + // search fields in WebKit/Blink + results: null, + // IE-only attribute that specifies security restrictions on an iframe + // as an alternative to the sandbox attribute on IE<10 + security: MUST_USE_ATTRIBUTE, + // IE-only attribute that controls focus behavior + unselectable: MUST_USE_ATTRIBUTE + }, + DOMAttributeNames: { + acceptCharset: 'accept-charset', + className: 'class', + htmlFor: 'for', + httpEquiv: 'http-equiv' + }, + DOMPropertyNames: { + autoCapitalize: 'autocapitalize', + autoComplete: 'autocomplete', + autoCorrect: 'autocorrect', + autoFocus: 'autofocus', + autoPlay: 'autoplay', + autoSave: 'autosave', + // `encoding` is equivalent to `enctype`, IE8 lacks an `enctype` setter. + // http://www.w3.org/TR/html5/forms.html#dom-fs-encoding + encType: 'encoding', + hrefLang: 'hreflang', + radioGroup: 'radiogroup', + spellCheck: 'spellcheck', + srcDoc: 'srcdoc', + srcSet: 'srcset' + } + }; + + module.exports = HTMLDOMPropertyConfig; + +/***/ }, +/* 89 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactBrowserComponentMixin + */ + + 'use strict'; + + var ReactInstanceMap = __webpack_require__(46); + + var findDOMNode = __webpack_require__(90); + var warning = __webpack_require__(24); + + var didWarnKey = '_getDOMNodeDidWarn'; + + var ReactBrowserComponentMixin = { + /** + * Returns the DOM node rendered by this component. + * + * @return {DOMElement} The root node of this component. + * @final + * @protected + */ + getDOMNode: function () { + process.env.NODE_ENV !== 'production' ? warning(this.constructor[didWarnKey], '%s.getDOMNode(...) is deprecated. Please use ' + 'ReactDOM.findDOMNode(instance) instead.', ReactInstanceMap.get(this).getName() || this.tagName || 'Unknown') : undefined; + this.constructor[didWarnKey] = true; + return findDOMNode(this); + } + }; + + module.exports = ReactBrowserComponentMixin; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 90 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule findDOMNode + * @typechecks static-only + */ + + 'use strict'; + + var ReactCurrentOwner = __webpack_require__(4); + var ReactInstanceMap = __webpack_require__(46); + var ReactMount = __webpack_require__(27); + + var invariant = __webpack_require__(12); + var warning = __webpack_require__(24); + + /** + * Returns the DOM node rendered by this element. + * + * @param {ReactComponent|DOMElement} componentOrElement + * @return {?DOMElement} The root node of this element. + */ + function findDOMNode(componentOrElement) { + if (process.env.NODE_ENV !== 'production') { + var owner = ReactCurrentOwner.current; + if (owner !== null) { + process.env.NODE_ENV !== 'production' ? warning(owner._warnedAboutRefsInRender, '%s is accessing getDOMNode or findDOMNode inside its render(). ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', owner.getName() || 'A component') : undefined; + owner._warnedAboutRefsInRender = true; + } + } + if (componentOrElement == null) { + return null; + } + if (componentOrElement.nodeType === 1) { + return componentOrElement; + } + if (ReactInstanceMap.has(componentOrElement)) { + return ReactMount.getNodeFromInstance(componentOrElement); + } + !(componentOrElement.render == null || typeof componentOrElement.render !== 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'findDOMNode was called on an unmounted component.') : invariant(false) : undefined; + true ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Element appears to be neither ReactComponent nor DOMNode (keys: %s)', Object.keys(componentOrElement)) : invariant(false) : undefined; + } + + module.exports = findDOMNode; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 91 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactDefaultBatchingStrategy + */ + + 'use strict'; + + var ReactUpdates = __webpack_require__(53); + var Transaction = __webpack_require__(56); + + var assign = __webpack_require__(38); + var emptyFunction = __webpack_require__(14); + + var RESET_BATCHED_UPDATES = { + initialize: emptyFunction, + close: function () { + ReactDefaultBatchingStrategy.isBatchingUpdates = false; + } + }; + + var FLUSH_BATCHED_UPDATES = { + initialize: emptyFunction, + close: ReactUpdates.flushBatchedUpdates.bind(ReactUpdates) + }; + + var TRANSACTION_WRAPPERS = [FLUSH_BATCHED_UPDATES, RESET_BATCHED_UPDATES]; + + function ReactDefaultBatchingStrategyTransaction() { + this.reinitializeTransaction(); + } + + assign(ReactDefaultBatchingStrategyTransaction.prototype, Transaction.Mixin, { + getTransactionWrappers: function () { + return TRANSACTION_WRAPPERS; + } + }); + + var transaction = new ReactDefaultBatchingStrategyTransaction(); + + var ReactDefaultBatchingStrategy = { + isBatchingUpdates: false, + + /** + * Call the provided function in a context within which calls to `setState` + * and friends are batched such that components aren't updated unnecessarily. + */ + batchedUpdates: function (callback, a, b, c, d, e) { + var alreadyBatchingUpdates = ReactDefaultBatchingStrategy.isBatchingUpdates; + + ReactDefaultBatchingStrategy.isBatchingUpdates = true; + + // The code is written this way to avoid extra allocations + if (alreadyBatchingUpdates) { + callback(a, b, c, d, e); + } else { + transaction.perform(callback, null, a, b, c, d, e); + } + } + }; + + module.exports = ReactDefaultBatchingStrategy; + +/***/ }, +/* 92 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactDOMComponent + * @typechecks static-only + */ + + /* global hasOwnProperty:true */ + + 'use strict'; + + var AutoFocusUtils = __webpack_require__(93); + var CSSPropertyOperations = __webpack_require__(95); + var DOMProperty = __webpack_require__(22); + var DOMPropertyOperations = __webpack_require__(21); + var EventConstants = __webpack_require__(29); + var ReactBrowserEventEmitter = __webpack_require__(28); + var ReactComponentBrowserEnvironment = __webpack_require__(25); + var ReactDOMButton = __webpack_require__(103); + var ReactDOMInput = __webpack_require__(104); + var ReactDOMOption = __webpack_require__(108); + var ReactDOMSelect = __webpack_require__(111); + var ReactDOMTextarea = __webpack_require__(112); + var ReactMount = __webpack_require__(27); + var ReactMultiChild = __webpack_require__(113); + var ReactPerf = __webpack_require__(17); + var ReactUpdateQueue = __webpack_require__(52); + + var assign = __webpack_require__(38); + var canDefineProperty = __webpack_require__(42); + var escapeTextContentForBrowser = __webpack_require__(20); + var invariant = __webpack_require__(12); + var isEventSupported = __webpack_require__(39); + var keyOf = __webpack_require__(78); + var setInnerHTML = __webpack_require__(18); + var setTextContent = __webpack_require__(19); + var shallowEqual = __webpack_require__(116); + var validateDOMNesting = __webpack_require__(69); + var warning = __webpack_require__(24); + + var deleteListener = ReactBrowserEventEmitter.deleteListener; + var listenTo = ReactBrowserEventEmitter.listenTo; + var registrationNameModules = ReactBrowserEventEmitter.registrationNameModules; + + // For quickly matching children type, to test if can be treated as content. + var CONTENT_TYPES = { 'string': true, 'number': true }; + + var CHILDREN = keyOf({ children: null }); + var STYLE = keyOf({ style: null }); + var HTML = keyOf({ __html: null }); + + var ELEMENT_NODE_TYPE = 1; + + function getDeclarationErrorAddendum(internalInstance) { + if (internalInstance) { + var owner = internalInstance._currentElement._owner || null; + if (owner) { + var name = owner.getName(); + if (name) { + return ' This DOM node was rendered by `' + name + '`.'; + } + } + } + return ''; + } + + var legacyPropsDescriptor; + if (process.env.NODE_ENV !== 'production') { + legacyPropsDescriptor = { + props: { + enumerable: false, + get: function () { + var component = this._reactInternalComponent; + process.env.NODE_ENV !== 'production' ? warning(false, 'ReactDOMComponent: Do not access .props of a DOM node; instead, ' + 'recreate the props as `render` did originally or read the DOM ' + 'properties/attributes directly from this node (e.g., ' + 'this.refs.box.className).%s', getDeclarationErrorAddendum(component)) : undefined; + return component._currentElement.props; + } + } + }; + } + + function legacyGetDOMNode() { + if (process.env.NODE_ENV !== 'production') { + var component = this._reactInternalComponent; + process.env.NODE_ENV !== 'production' ? warning(false, 'ReactDOMComponent: Do not access .getDOMNode() of a DOM node; ' + 'instead, use the node directly.%s', getDeclarationErrorAddendum(component)) : undefined; + } + return this; + } + + function legacyIsMounted() { + var component = this._reactInternalComponent; + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(false, 'ReactDOMComponent: Do not access .isMounted() of a DOM node.%s', getDeclarationErrorAddendum(component)) : undefined; + } + return !!component; + } + + function legacySetStateEtc() { + if (process.env.NODE_ENV !== 'production') { + var component = this._reactInternalComponent; + process.env.NODE_ENV !== 'production' ? warning(false, 'ReactDOMComponent: Do not access .setState(), .replaceState(), or ' + '.forceUpdate() of a DOM node. This is a no-op.%s', getDeclarationErrorAddendum(component)) : undefined; + } + } + + function legacySetProps(partialProps, callback) { + var component = this._reactInternalComponent; + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(false, 'ReactDOMComponent: Do not access .setProps() of a DOM node. ' + 'Instead, call ReactDOM.render again at the top level.%s', getDeclarationErrorAddendum(component)) : undefined; + } + if (!component) { + return; + } + ReactUpdateQueue.enqueueSetPropsInternal(component, partialProps); + if (callback) { + ReactUpdateQueue.enqueueCallbackInternal(component, callback); + } + } + + function legacyReplaceProps(partialProps, callback) { + var component = this._reactInternalComponent; + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(false, 'ReactDOMComponent: Do not access .replaceProps() of a DOM node. ' + 'Instead, call ReactDOM.render again at the top level.%s', getDeclarationErrorAddendum(component)) : undefined; + } + if (!component) { + return; + } + ReactUpdateQueue.enqueueReplacePropsInternal(component, partialProps); + if (callback) { + ReactUpdateQueue.enqueueCallbackInternal(component, callback); + } + } + + function friendlyStringify(obj) { + if (typeof obj === 'object') { + if (Array.isArray(obj)) { + return '[' + obj.map(friendlyStringify).join(', ') + ']'; + } else { + var pairs = []; + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + var keyEscaped = /^[a-z$_][\w$_]*$/i.test(key) ? key : JSON.stringify(key); + pairs.push(keyEscaped + ': ' + friendlyStringify(obj[key])); + } + } + return '{' + pairs.join(', ') + '}'; + } + } else if (typeof obj === 'string') { + return JSON.stringify(obj); + } else if (typeof obj === 'function') { + return '[function object]'; + } + // Differs from JSON.stringify in that undefined becauses undefined and that + // inf and nan don't become null + return String(obj); + } + + var styleMutationWarning = {}; + + function checkAndWarnForMutatedStyle(style1, style2, component) { + if (style1 == null || style2 == null) { + return; + } + if (shallowEqual(style1, style2)) { + return; + } + + var componentName = component._tag; + var owner = component._currentElement._owner; + var ownerName; + if (owner) { + ownerName = owner.getName(); + } + + var hash = ownerName + '|' + componentName; + + if (styleMutationWarning.hasOwnProperty(hash)) { + return; + } + + styleMutationWarning[hash] = true; + + process.env.NODE_ENV !== 'production' ? warning(false, '`%s` was passed a style object that has previously been mutated. ' + 'Mutating `style` is deprecated. Consider cloning it beforehand. Check ' + 'the `render` %s. Previous style: %s. Mutated style: %s.', componentName, owner ? 'of `' + ownerName + '`' : 'using <' + componentName + '>', friendlyStringify(style1), friendlyStringify(style2)) : undefined; + } + + /** + * @param {object} component + * @param {?object} props + */ + function assertValidProps(component, props) { + if (!props) { + return; + } + // Note the use of `==` which checks for null or undefined. + if (process.env.NODE_ENV !== 'production') { + if (voidElementTags[component._tag]) { + process.env.NODE_ENV !== 'production' ? warning(props.children == null && props.dangerouslySetInnerHTML == null, '%s is a void element tag and must not have `children` or ' + 'use `props.dangerouslySetInnerHTML`.%s', component._tag, component._currentElement._owner ? ' Check the render method of ' + component._currentElement._owner.getName() + '.' : '') : undefined; + } + } + if (props.dangerouslySetInnerHTML != null) { + !(props.children == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Can only set one of `children` or `props.dangerouslySetInnerHTML`.') : invariant(false) : undefined; + !(typeof props.dangerouslySetInnerHTML === 'object' && HTML in props.dangerouslySetInnerHTML) ? process.env.NODE_ENV !== 'production' ? invariant(false, '`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. ' + 'Please visit https://fb.me/react-invariant-dangerously-set-inner-html ' + 'for more information.') : invariant(false) : undefined; + } + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(props.innerHTML == null, 'Directly setting property `innerHTML` is not permitted. ' + 'For more information, lookup documentation on `dangerouslySetInnerHTML`.') : undefined; + process.env.NODE_ENV !== 'production' ? warning(!props.contentEditable || props.children == null, 'A component is `contentEditable` and contains `children` managed by ' + 'React. It is now your responsibility to guarantee that none of ' + 'those nodes are unexpectedly modified or duplicated. This is ' + 'probably not intentional.') : undefined; + } + !(props.style == null || typeof props.style === 'object') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'The `style` prop expects a mapping from style properties to values, ' + 'not a string. For example, style={{marginRight: spacing + \'em\'}} when ' + 'using JSX.%s', getDeclarationErrorAddendum(component)) : invariant(false) : undefined; + } + + function enqueuePutListener(id, registrationName, listener, transaction) { + if (process.env.NODE_ENV !== 'production') { + // IE8 has no API for event capturing and the `onScroll` event doesn't + // bubble. + process.env.NODE_ENV !== 'production' ? warning(registrationName !== 'onScroll' || isEventSupported('scroll', true), 'This browser doesn\'t support the `onScroll` event') : undefined; + } + var container = ReactMount.findReactContainerForID(id); + if (container) { + var doc = container.nodeType === ELEMENT_NODE_TYPE ? container.ownerDocument : container; + listenTo(registrationName, doc); + } + transaction.getReactMountReady().enqueue(putListener, { + id: id, + registrationName: registrationName, + listener: listener + }); + } + + function putListener() { + var listenerToPut = this; + ReactBrowserEventEmitter.putListener(listenerToPut.id, listenerToPut.registrationName, listenerToPut.listener); + } + + // There are so many media events, it makes sense to just + // maintain a list rather than create a `trapBubbledEvent` for each + var mediaEvents = { + topAbort: 'abort', + topCanPlay: 'canplay', + topCanPlayThrough: 'canplaythrough', + topDurationChange: 'durationchange', + topEmptied: 'emptied', + topEncrypted: 'encrypted', + topEnded: 'ended', + topError: 'error', + topLoadedData: 'loadeddata', + topLoadedMetadata: 'loadedmetadata', + topLoadStart: 'loadstart', + topPause: 'pause', + topPlay: 'play', + topPlaying: 'playing', + topProgress: 'progress', + topRateChange: 'ratechange', + topSeeked: 'seeked', + topSeeking: 'seeking', + topStalled: 'stalled', + topSuspend: 'suspend', + topTimeUpdate: 'timeupdate', + topVolumeChange: 'volumechange', + topWaiting: 'waiting' + }; + + function trapBubbledEventsLocal() { + var inst = this; + // If a component renders to null or if another component fatals and causes + // the state of the tree to be corrupted, `node` here can be null. + !inst._rootNodeID ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Must be mounted to trap events') : invariant(false) : undefined; + var node = ReactMount.getNode(inst._rootNodeID); + !node ? process.env.NODE_ENV !== 'production' ? invariant(false, 'trapBubbledEvent(...): Requires node to be rendered.') : invariant(false) : undefined; + + switch (inst._tag) { + case 'iframe': + inst._wrapperState.listeners = [ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topLoad, 'load', node)]; + break; + case 'video': + case 'audio': + + inst._wrapperState.listeners = []; + // create listener for each media event + for (var event in mediaEvents) { + if (mediaEvents.hasOwnProperty(event)) { + inst._wrapperState.listeners.push(ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes[event], mediaEvents[event], node)); + } + } + + break; + case 'img': + inst._wrapperState.listeners = [ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topError, 'error', node), ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topLoad, 'load', node)]; + break; + case 'form': + inst._wrapperState.listeners = [ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topReset, 'reset', node), ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topSubmit, 'submit', node)]; + break; + } + } + + function mountReadyInputWrapper() { + ReactDOMInput.mountReadyWrapper(this); + } + + function postUpdateSelectWrapper() { + ReactDOMSelect.postUpdateWrapper(this); + } + + // For HTML, certain tags should omit their close tag. We keep a whitelist for + // those special cased tags. + + var omittedCloseTags = { + 'area': true, + 'base': true, + 'br': true, + 'col': true, + 'embed': true, + 'hr': true, + 'img': true, + 'input': true, + 'keygen': true, + 'link': true, + 'meta': true, + 'param': true, + 'source': true, + 'track': true, + 'wbr': true + }; + + // NOTE: menuitem's close tag should be omitted, but that causes problems. + var newlineEatingTags = { + 'listing': true, + 'pre': true, + 'textarea': true + }; + + // For HTML, certain tags cannot have children. This has the same purpose as + // `omittedCloseTags` except that `menuitem` should still have its closing tag. + + var voidElementTags = assign({ + 'menuitem': true + }, omittedCloseTags); + + // We accept any tag to be rendered but since this gets injected into arbitrary + // HTML, we want to make sure that it's a safe tag. + // http://www.w3.org/TR/REC-xml/#NT-Name + + var VALID_TAG_REGEX = /^[a-zA-Z][a-zA-Z:_\.\-\d]*$/; // Simplified subset + var validatedTagCache = {}; + var hasOwnProperty = ({}).hasOwnProperty; + + function validateDangerousTag(tag) { + if (!hasOwnProperty.call(validatedTagCache, tag)) { + !VALID_TAG_REGEX.test(tag) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Invalid tag: %s', tag) : invariant(false) : undefined; + validatedTagCache[tag] = true; + } + } + + function processChildContextDev(context, inst) { + // Pass down our tag name to child components for validation purposes + context = assign({}, context); + var info = context[validateDOMNesting.ancestorInfoContextKey]; + context[validateDOMNesting.ancestorInfoContextKey] = validateDOMNesting.updatedAncestorInfo(info, inst._tag, inst); + return context; + } + + function isCustomComponent(tagName, props) { + return tagName.indexOf('-') >= 0 || props.is != null; + } + + /** + * Creates a new React class that is idempotent and capable of containing other + * React components. It accepts event listeners and DOM properties that are + * valid according to `DOMProperty`. + * + * - Event listeners: `onClick`, `onMouseDown`, etc. + * - DOM properties: `className`, `name`, `title`, etc. + * + * The `style` property functions differently from the DOM API. It accepts an + * object mapping of style properties to values. + * + * @constructor ReactDOMComponent + * @extends ReactMultiChild + */ + function ReactDOMComponent(tag) { + validateDangerousTag(tag); + this._tag = tag.toLowerCase(); + this._renderedChildren = null; + this._previousStyle = null; + this._previousStyleCopy = null; + this._rootNodeID = null; + this._wrapperState = null; + this._topLevelWrapper = null; + this._nodeWithLegacyProperties = null; + if (process.env.NODE_ENV !== 'production') { + this._unprocessedContextDev = null; + this._processedContextDev = null; + } + } + + ReactDOMComponent.displayName = 'ReactDOMComponent'; + + ReactDOMComponent.Mixin = { + + construct: function (element) { + this._currentElement = element; + }, + + /** + * Generates root tag markup then recurses. This method has side effects and + * is not idempotent. + * + * @internal + * @param {string} rootID The root DOM ID for this node. + * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction + * @param {object} context + * @return {string} The computed markup. + */ + mountComponent: function (rootID, transaction, context) { + this._rootNodeID = rootID; + + var props = this._currentElement.props; + + switch (this._tag) { + case 'iframe': + case 'img': + case 'form': + case 'video': + case 'audio': + this._wrapperState = { + listeners: null + }; + transaction.getReactMountReady().enqueue(trapBubbledEventsLocal, this); + break; + case 'button': + props = ReactDOMButton.getNativeProps(this, props, context); + break; + case 'input': + ReactDOMInput.mountWrapper(this, props, context); + props = ReactDOMInput.getNativeProps(this, props, context); + break; + case 'option': + ReactDOMOption.mountWrapper(this, props, context); + props = ReactDOMOption.getNativeProps(this, props, context); + break; + case 'select': + ReactDOMSelect.mountWrapper(this, props, context); + props = ReactDOMSelect.getNativeProps(this, props, context); + context = ReactDOMSelect.processChildContext(this, props, context); + break; + case 'textarea': + ReactDOMTextarea.mountWrapper(this, props, context); + props = ReactDOMTextarea.getNativeProps(this, props, context); + break; + } + + assertValidProps(this, props); + if (process.env.NODE_ENV !== 'production') { + if (context[validateDOMNesting.ancestorInfoContextKey]) { + validateDOMNesting(this._tag, this, context[validateDOMNesting.ancestorInfoContextKey]); + } + } + + if (process.env.NODE_ENV !== 'production') { + this._unprocessedContextDev = context; + this._processedContextDev = processChildContextDev(context, this); + context = this._processedContextDev; + } + + var mountImage; + if (transaction.useCreateElement) { + var ownerDocument = context[ReactMount.ownerDocumentContextKey]; + var el = ownerDocument.createElement(this._currentElement.type); + DOMPropertyOperations.setAttributeForID(el, this._rootNodeID); + // Populate node cache + ReactMount.getID(el); + this._updateDOMProperties({}, props, transaction, el); + this._createInitialChildren(transaction, props, context, el); + mountImage = el; + } else { + var tagOpen = this._createOpenTagMarkupAndPutListeners(transaction, props); + var tagContent = this._createContentMarkup(transaction, props, context); + if (!tagContent && omittedCloseTags[this._tag]) { + mountImage = tagOpen + '/>'; + } else { + mountImage = tagOpen + '>' + tagContent + '</' + this._currentElement.type + '>'; + } + } + + switch (this._tag) { + case 'input': + transaction.getReactMountReady().enqueue(mountReadyInputWrapper, this); + // falls through + case 'button': + case 'select': + case 'textarea': + if (props.autoFocus) { + transaction.getReactMountReady().enqueue(AutoFocusUtils.focusDOMComponent, this); + } + break; + } + + return mountImage; + }, + + /** + * Creates markup for the open tag and all attributes. + * + * This method has side effects because events get registered. + * + * Iterating over object properties is faster than iterating over arrays. + * @see http://jsperf.com/obj-vs-arr-iteration + * + * @private + * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction + * @param {object} props + * @return {string} Markup of opening tag. + */ + _createOpenTagMarkupAndPutListeners: function (transaction, props) { + var ret = '<' + this._currentElement.type; + + for (var propKey in props) { + if (!props.hasOwnProperty(propKey)) { + continue; + } + var propValue = props[propKey]; + if (propValue == null) { + continue; + } + if (registrationNameModules.hasOwnProperty(propKey)) { + if (propValue) { + enqueuePutListener(this._rootNodeID, propKey, propValue, transaction); + } + } else { + if (propKey === STYLE) { + if (propValue) { + if (process.env.NODE_ENV !== 'production') { + // See `_updateDOMProperties`. style block + this._previousStyle = propValue; + } + propValue = this._previousStyleCopy = assign({}, props.style); + } + propValue = CSSPropertyOperations.createMarkupForStyles(propValue); + } + var markup = null; + if (this._tag != null && isCustomComponent(this._tag, props)) { + if (propKey !== CHILDREN) { + markup = DOMPropertyOperations.createMarkupForCustomAttribute(propKey, propValue); + } + } else { + markup = DOMPropertyOperations.createMarkupForProperty(propKey, propValue); + } + if (markup) { + ret += ' ' + markup; + } + } + } + + // For static pages, no need to put React ID and checksum. Saves lots of + // bytes. + if (transaction.renderToStaticMarkup) { + return ret; + } + + var markupForID = DOMPropertyOperations.createMarkupForID(this._rootNodeID); + return ret + ' ' + markupForID; + }, + + /** + * Creates markup for the content between the tags. + * + * @private + * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction + * @param {object} props + * @param {object} context + * @return {string} Content markup. + */ + _createContentMarkup: function (transaction, props, context) { + var ret = ''; + + // Intentional use of != to avoid catching zero/false. + var innerHTML = props.dangerouslySetInnerHTML; + if (innerHTML != null) { + if (innerHTML.__html != null) { + ret = innerHTML.__html; + } + } else { + var contentToUse = CONTENT_TYPES[typeof props.children] ? props.children : null; + var childrenToUse = contentToUse != null ? null : props.children; + if (contentToUse != null) { + // TODO: Validate that text is allowed as a child of this node + ret = escapeTextContentForBrowser(contentToUse); + } else if (childrenToUse != null) { + var mountImages = this.mountChildren(childrenToUse, transaction, context); + ret = mountImages.join(''); + } + } + if (newlineEatingTags[this._tag] && ret.charAt(0) === '\n') { + // text/html ignores the first character in these tags if it's a newline + // Prefer to break application/xml over text/html (for now) by adding + // a newline specifically to get eaten by the parser. (Alternately for + // textareas, replacing "^\n" with "\r\n" doesn't get eaten, and the first + // \r is normalized out by HTMLTextAreaElement#value.) + // See: <http://www.w3.org/TR/html-polyglot/#newlines-in-textarea-and-pre> + // See: <http://www.w3.org/TR/html5/syntax.html#element-restrictions> + // See: <http://www.w3.org/TR/html5/syntax.html#newlines> + // See: Parsing of "textarea" "listing" and "pre" elements + // from <http://www.w3.org/TR/html5/syntax.html#parsing-main-inbody> + return '\n' + ret; + } else { + return ret; + } + }, + + _createInitialChildren: function (transaction, props, context, el) { + // Intentional use of != to avoid catching zero/false. + var innerHTML = props.dangerouslySetInnerHTML; + if (innerHTML != null) { + if (innerHTML.__html != null) { + setInnerHTML(el, innerHTML.__html); + } + } else { + var contentToUse = CONTENT_TYPES[typeof props.children] ? props.children : null; + var childrenToUse = contentToUse != null ? null : props.children; + if (contentToUse != null) { + // TODO: Validate that text is allowed as a child of this node + setTextContent(el, contentToUse); + } else if (childrenToUse != null) { + var mountImages = this.mountChildren(childrenToUse, transaction, context); + for (var i = 0; i < mountImages.length; i++) { + el.appendChild(mountImages[i]); + } + } + } + }, + + /** + * Receives a next element and updates the component. + * + * @internal + * @param {ReactElement} nextElement + * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction + * @param {object} context + */ + receiveComponent: function (nextElement, transaction, context) { + var prevElement = this._currentElement; + this._currentElement = nextElement; + this.updateComponent(transaction, prevElement, nextElement, context); + }, + + /** + * Updates a native DOM component after it has already been allocated and + * attached to the DOM. Reconciles the root DOM node, then recurses. + * + * @param {ReactReconcileTransaction} transaction + * @param {ReactElement} prevElement + * @param {ReactElement} nextElement + * @internal + * @overridable + */ + updateComponent: function (transaction, prevElement, nextElement, context) { + var lastProps = prevElement.props; + var nextProps = this._currentElement.props; + + switch (this._tag) { + case 'button': + lastProps = ReactDOMButton.getNativeProps(this, lastProps); + nextProps = ReactDOMButton.getNativeProps(this, nextProps); + break; + case 'input': + ReactDOMInput.updateWrapper(this); + lastProps = ReactDOMInput.getNativeProps(this, lastProps); + nextProps = ReactDOMInput.getNativeProps(this, nextProps); + break; + case 'option': + lastProps = ReactDOMOption.getNativeProps(this, lastProps); + nextProps = ReactDOMOption.getNativeProps(this, nextProps); + break; + case 'select': + lastProps = ReactDOMSelect.getNativeProps(this, lastProps); + nextProps = ReactDOMSelect.getNativeProps(this, nextProps); + break; + case 'textarea': + ReactDOMTextarea.updateWrapper(this); + lastProps = ReactDOMTextarea.getNativeProps(this, lastProps); + nextProps = ReactDOMTextarea.getNativeProps(this, nextProps); + break; + } + + if (process.env.NODE_ENV !== 'production') { + // If the context is reference-equal to the old one, pass down the same + // processed object so the update bailout in ReactReconciler behaves + // correctly (and identically in dev and prod). See #5005. + if (this._unprocessedContextDev !== context) { + this._unprocessedContextDev = context; + this._processedContextDev = processChildContextDev(context, this); + } + context = this._processedContextDev; + } + + assertValidProps(this, nextProps); + this._updateDOMProperties(lastProps, nextProps, transaction, null); + this._updateDOMChildren(lastProps, nextProps, transaction, context); + + if (!canDefineProperty && this._nodeWithLegacyProperties) { + this._nodeWithLegacyProperties.props = nextProps; + } + + if (this._tag === 'select') { + // <select> value update needs to occur after <option> children + // reconciliation + transaction.getReactMountReady().enqueue(postUpdateSelectWrapper, this); + } + }, + + /** + * Reconciles the properties by detecting differences in property values and + * updating the DOM as necessary. This function is probably the single most + * critical path for performance optimization. + * + * TODO: Benchmark whether checking for changed values in memory actually + * improves performance (especially statically positioned elements). + * TODO: Benchmark the effects of putting this at the top since 99% of props + * do not change for a given reconciliation. + * TODO: Benchmark areas that can be improved with caching. + * + * @private + * @param {object} lastProps + * @param {object} nextProps + * @param {ReactReconcileTransaction} transaction + * @param {?DOMElement} node + */ + _updateDOMProperties: function (lastProps, nextProps, transaction, node) { + var propKey; + var styleName; + var styleUpdates; + for (propKey in lastProps) { + if (nextProps.hasOwnProperty(propKey) || !lastProps.hasOwnProperty(propKey)) { + continue; + } + if (propKey === STYLE) { + var lastStyle = this._previousStyleCopy; + for (styleName in lastStyle) { + if (lastStyle.hasOwnProperty(styleName)) { + styleUpdates = styleUpdates || {}; + styleUpdates[styleName] = ''; + } + } + this._previousStyleCopy = null; + } else if (registrationNameModules.hasOwnProperty(propKey)) { + if (lastProps[propKey]) { + // Only call deleteListener if there was a listener previously or + // else willDeleteListener gets called when there wasn't actually a + // listener (e.g., onClick={null}) + deleteListener(this._rootNodeID, propKey); + } + } else if (DOMProperty.properties[propKey] || DOMProperty.isCustomAttribute(propKey)) { + if (!node) { + node = ReactMount.getNode(this._rootNodeID); + } + DOMPropertyOperations.deleteValueForProperty(node, propKey); + } + } + for (propKey in nextProps) { + var nextProp = nextProps[propKey]; + var lastProp = propKey === STYLE ? this._previousStyleCopy : lastProps[propKey]; + if (!nextProps.hasOwnProperty(propKey) || nextProp === lastProp) { + continue; + } + if (propKey === STYLE) { + if (nextProp) { + if (process.env.NODE_ENV !== 'production') { + checkAndWarnForMutatedStyle(this._previousStyleCopy, this._previousStyle, this); + this._previousStyle = nextProp; + } + nextProp = this._previousStyleCopy = assign({}, nextProp); + } else { + this._previousStyleCopy = null; + } + if (lastProp) { + // Unset styles on `lastProp` but not on `nextProp`. + for (styleName in lastProp) { + if (lastProp.hasOwnProperty(styleName) && (!nextProp || !nextProp.hasOwnProperty(styleName))) { + styleUpdates = styleUpdates || {}; + styleUpdates[styleName] = ''; + } + } + // Update styles that changed since `lastProp`. + for (styleName in nextProp) { + if (nextProp.hasOwnProperty(styleName) && lastProp[styleName] !== nextProp[styleName]) { + styleUpdates = styleUpdates || {}; + styleUpdates[styleName] = nextProp[styleName]; + } + } + } else { + // Relies on `updateStylesByID` not mutating `styleUpdates`. + styleUpdates = nextProp; + } + } else if (registrationNameModules.hasOwnProperty(propKey)) { + if (nextProp) { + enqueuePutListener(this._rootNodeID, propKey, nextProp, transaction); + } else if (lastProp) { + deleteListener(this._rootNodeID, propKey); + } + } else if (isCustomComponent(this._tag, nextProps)) { + if (!node) { + node = ReactMount.getNode(this._rootNodeID); + } + if (propKey === CHILDREN) { + nextProp = null; + } + DOMPropertyOperations.setValueForAttribute(node, propKey, nextProp); + } else if (DOMProperty.properties[propKey] || DOMProperty.isCustomAttribute(propKey)) { + if (!node) { + node = ReactMount.getNode(this._rootNodeID); + } + // If we're updating to null or undefined, we should remove the property + // from the DOM node instead of inadvertantly setting to a string. This + // brings us in line with the same behavior we have on initial render. + if (nextProp != null) { + DOMPropertyOperations.setValueForProperty(node, propKey, nextProp); + } else { + DOMPropertyOperations.deleteValueForProperty(node, propKey); + } + } + } + if (styleUpdates) { + if (!node) { + node = ReactMount.getNode(this._rootNodeID); + } + CSSPropertyOperations.setValueForStyles(node, styleUpdates); + } + }, + + /** + * Reconciles the children with the various properties that affect the + * children content. + * + * @param {object} lastProps + * @param {object} nextProps + * @param {ReactReconcileTransaction} transaction + * @param {object} context + */ + _updateDOMChildren: function (lastProps, nextProps, transaction, context) { + var lastContent = CONTENT_TYPES[typeof lastProps.children] ? lastProps.children : null; + var nextContent = CONTENT_TYPES[typeof nextProps.children] ? nextProps.children : null; + + var lastHtml = lastProps.dangerouslySetInnerHTML && lastProps.dangerouslySetInnerHTML.__html; + var nextHtml = nextProps.dangerouslySetInnerHTML && nextProps.dangerouslySetInnerHTML.__html; + + // Note the use of `!=` which checks for null or undefined. + var lastChildren = lastContent != null ? null : lastProps.children; + var nextChildren = nextContent != null ? null : nextProps.children; + + // If we're switching from children to content/html or vice versa, remove + // the old content + var lastHasContentOrHtml = lastContent != null || lastHtml != null; + var nextHasContentOrHtml = nextContent != null || nextHtml != null; + if (lastChildren != null && nextChildren == null) { + this.updateChildren(null, transaction, context); + } else if (lastHasContentOrHtml && !nextHasContentOrHtml) { + this.updateTextContent(''); + } + + if (nextContent != null) { + if (lastContent !== nextContent) { + this.updateTextContent('' + nextContent); + } + } else if (nextHtml != null) { + if (lastHtml !== nextHtml) { + this.updateMarkup('' + nextHtml); + } + } else if (nextChildren != null) { + this.updateChildren(nextChildren, transaction, context); + } + }, + + /** + * Destroys all event registrations for this instance. Does not remove from + * the DOM. That must be done by the parent. + * + * @internal + */ + unmountComponent: function () { + switch (this._tag) { + case 'iframe': + case 'img': + case 'form': + case 'video': + case 'audio': + var listeners = this._wrapperState.listeners; + if (listeners) { + for (var i = 0; i < listeners.length; i++) { + listeners[i].remove(); + } + } + break; + case 'input': + ReactDOMInput.unmountWrapper(this); + break; + case 'html': + case 'head': + case 'body': + /** + * Components like <html> <head> and <body> can't be removed or added + * easily in a cross-browser way, however it's valuable to be able to + * take advantage of React's reconciliation for styling and <title> + * management. So we just document it and throw in dangerous cases. + */ + true ? process.env.NODE_ENV !== 'production' ? invariant(false, '<%s> tried to unmount. Because of cross-browser quirks it is ' + 'impossible to unmount some top-level components (eg <html>, ' + '<head>, and <body>) reliably and efficiently. To fix this, have a ' + 'single top-level component that never unmounts render these ' + 'elements.', this._tag) : invariant(false) : undefined; + break; + } + + this.unmountChildren(); + ReactBrowserEventEmitter.deleteAllListeners(this._rootNodeID); + ReactComponentBrowserEnvironment.unmountIDFromEnvironment(this._rootNodeID); + this._rootNodeID = null; + this._wrapperState = null; + if (this._nodeWithLegacyProperties) { + var node = this._nodeWithLegacyProperties; + node._reactInternalComponent = null; + this._nodeWithLegacyProperties = null; + } + }, + + getPublicInstance: function () { + if (!this._nodeWithLegacyProperties) { + var node = ReactMount.getNode(this._rootNodeID); + + node._reactInternalComponent = this; + node.getDOMNode = legacyGetDOMNode; + node.isMounted = legacyIsMounted; + node.setState = legacySetStateEtc; + node.replaceState = legacySetStateEtc; + node.forceUpdate = legacySetStateEtc; + node.setProps = legacySetProps; + node.replaceProps = legacyReplaceProps; + + if (process.env.NODE_ENV !== 'production') { + if (canDefineProperty) { + Object.defineProperties(node, legacyPropsDescriptor); + } else { + // updateComponent will update this property on subsequent renders + node.props = this._currentElement.props; + } + } else { + // updateComponent will update this property on subsequent renders + node.props = this._currentElement.props; + } + + this._nodeWithLegacyProperties = node; + } + return this._nodeWithLegacyProperties; + } + + }; + + ReactPerf.measureMethods(ReactDOMComponent, 'ReactDOMComponent', { + mountComponent: 'mountComponent', + updateComponent: 'updateComponent' + }); + + assign(ReactDOMComponent.prototype, ReactDOMComponent.Mixin, ReactMultiChild.Mixin); + + module.exports = ReactDOMComponent; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 93 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule AutoFocusUtils + * @typechecks static-only + */ + + 'use strict'; + + var ReactMount = __webpack_require__(27); + + var findDOMNode = __webpack_require__(90); + var focusNode = __webpack_require__(94); + + var Mixin = { + componentDidMount: function () { + if (this.props.autoFocus) { + focusNode(findDOMNode(this)); + } + } + }; + + var AutoFocusUtils = { + Mixin: Mixin, + + focusDOMComponent: function () { + focusNode(ReactMount.getNode(this._rootNodeID)); + } + }; + + module.exports = AutoFocusUtils; + +/***/ }, +/* 94 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule focusNode + */ + + 'use strict'; + + /** + * @param {DOMElement} node input/textarea to focus + */ + function focusNode(node) { + // IE8 can throw "Can't move focus to the control because it is invisible, + // not enabled, or of a type that does not accept the focus." for all kinds of + // reasons that are too expensive and fragile to test. + try { + node.focus(); + } catch (e) {} + } + + module.exports = focusNode; + +/***/ }, +/* 95 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule CSSPropertyOperations + * @typechecks static-only + */ + + 'use strict'; + + var CSSProperty = __webpack_require__(96); + var ExecutionEnvironment = __webpack_require__(8); + var ReactPerf = __webpack_require__(17); + + var camelizeStyleName = __webpack_require__(97); + var dangerousStyleValue = __webpack_require__(99); + var hyphenateStyleName = __webpack_require__(100); + var memoizeStringOnly = __webpack_require__(102); + var warning = __webpack_require__(24); + + var processStyleName = memoizeStringOnly(function (styleName) { + return hyphenateStyleName(styleName); + }); + + var hasShorthandPropertyBug = false; + var styleFloatAccessor = 'cssFloat'; + if (ExecutionEnvironment.canUseDOM) { + var tempStyle = document.createElement('div').style; + try { + // IE8 throws "Invalid argument." if resetting shorthand style properties. + tempStyle.font = ''; + } catch (e) { + hasShorthandPropertyBug = true; + } + // IE8 only supports accessing cssFloat (standard) as styleFloat + if (document.documentElement.style.cssFloat === undefined) { + styleFloatAccessor = 'styleFloat'; + } + } + + if (process.env.NODE_ENV !== 'production') { + // 'msTransform' is correct, but the other prefixes should be capitalized + var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/; + + // style values shouldn't contain a semicolon + var badStyleValueWithSemicolonPattern = /;\s*$/; + + var warnedStyleNames = {}; + var warnedStyleValues = {}; + + var warnHyphenatedStyleName = function (name) { + if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) { + return; + } + + warnedStyleNames[name] = true; + process.env.NODE_ENV !== 'production' ? warning(false, 'Unsupported style property %s. Did you mean %s?', name, camelizeStyleName(name)) : undefined; + }; + + var warnBadVendoredStyleName = function (name) { + if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) { + return; + } + + warnedStyleNames[name] = true; + process.env.NODE_ENV !== 'production' ? warning(false, 'Unsupported vendor-prefixed style property %s. Did you mean %s?', name, name.charAt(0).toUpperCase() + name.slice(1)) : undefined; + }; + + var warnStyleValueWithSemicolon = function (name, value) { + if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) { + return; + } + + warnedStyleValues[value] = true; + process.env.NODE_ENV !== 'production' ? warning(false, 'Style property values shouldn\'t contain a semicolon. ' + 'Try "%s: %s" instead.', name, value.replace(badStyleValueWithSemicolonPattern, '')) : undefined; + }; + + /** + * @param {string} name + * @param {*} value + */ + var warnValidStyle = function (name, value) { + if (name.indexOf('-') > -1) { + warnHyphenatedStyleName(name); + } else if (badVendoredStyleNamePattern.test(name)) { + warnBadVendoredStyleName(name); + } else if (badStyleValueWithSemicolonPattern.test(value)) { + warnStyleValueWithSemicolon(name, value); + } + }; + } + + /** + * Operations for dealing with CSS properties. + */ + var CSSPropertyOperations = { + + /** + * Serializes a mapping of style properties for use as inline styles: + * + * > createMarkupForStyles({width: '200px', height: 0}) + * "width:200px;height:0;" + * + * Undefined values are ignored so that declarative programming is easier. + * The result should be HTML-escaped before insertion into the DOM. + * + * @param {object} styles + * @return {?string} + */ + createMarkupForStyles: function (styles) { + var serialized = ''; + for (var styleName in styles) { + if (!styles.hasOwnProperty(styleName)) { + continue; + } + var styleValue = styles[styleName]; + if (process.env.NODE_ENV !== 'production') { + warnValidStyle(styleName, styleValue); + } + if (styleValue != null) { + serialized += processStyleName(styleName) + ':'; + serialized += dangerousStyleValue(styleName, styleValue) + ';'; + } + } + return serialized || null; + }, + + /** + * Sets the value for multiple styles on a node. If a value is specified as + * '' (empty string), the corresponding style property will be unset. + * + * @param {DOMElement} node + * @param {object} styles + */ + setValueForStyles: function (node, styles) { + var style = node.style; + for (var styleName in styles) { + if (!styles.hasOwnProperty(styleName)) { + continue; + } + if (process.env.NODE_ENV !== 'production') { + warnValidStyle(styleName, styles[styleName]); + } + var styleValue = dangerousStyleValue(styleName, styles[styleName]); + if (styleName === 'float') { + styleName = styleFloatAccessor; + } + if (styleValue) { + style[styleName] = styleValue; + } else { + var expansion = hasShorthandPropertyBug && CSSProperty.shorthandPropertyExpansions[styleName]; + if (expansion) { + // Shorthand property that IE8 won't like unsetting, so unset each + // component to placate it + for (var individualStyleName in expansion) { + style[individualStyleName] = ''; + } + } else { + style[styleName] = ''; + } + } + } + } + + }; + + ReactPerf.measureMethods(CSSPropertyOperations, 'CSSPropertyOperations', { + setValueForStyles: 'setValueForStyles' + }); + + module.exports = CSSPropertyOperations; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 96 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule CSSProperty + */ + + 'use strict'; + + /** + * CSS properties which accept numbers but are not in units of "px". + */ + var isUnitlessNumber = { + animationIterationCount: true, + boxFlex: true, + boxFlexGroup: true, + boxOrdinalGroup: true, + columnCount: true, + flex: true, + flexGrow: true, + flexPositive: true, + flexShrink: true, + flexNegative: true, + flexOrder: true, + fontWeight: true, + lineClamp: true, + lineHeight: true, + opacity: true, + order: true, + orphans: true, + tabSize: true, + widows: true, + zIndex: true, + zoom: true, + + // SVG-related properties + fillOpacity: true, + stopOpacity: true, + strokeDashoffset: true, + strokeOpacity: true, + strokeWidth: true + }; + + /** + * @param {string} prefix vendor-specific prefix, eg: Webkit + * @param {string} key style name, eg: transitionDuration + * @return {string} style name prefixed with `prefix`, properly camelCased, eg: + * WebkitTransitionDuration + */ + function prefixKey(prefix, key) { + return prefix + key.charAt(0).toUpperCase() + key.substring(1); + } + + /** + * Support style names that may come passed in prefixed by adding permutations + * of vendor prefixes. + */ + var prefixes = ['Webkit', 'ms', 'Moz', 'O']; + + // Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an + // infinite loop, because it iterates over the newly added props too. + Object.keys(isUnitlessNumber).forEach(function (prop) { + prefixes.forEach(function (prefix) { + isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop]; + }); + }); + + /** + * Most style properties can be unset by doing .style[prop] = '' but IE8 + * doesn't like doing that with shorthand properties so for the properties that + * IE8 breaks on, which are listed here, we instead unset each of the + * individual properties. See http://bugs.jquery.com/ticket/12385. + * The 4-value 'clock' properties like margin, padding, border-width seem to + * behave without any problems. Curiously, list-style works too without any + * special prodding. + */ + var shorthandPropertyExpansions = { + background: { + backgroundAttachment: true, + backgroundColor: true, + backgroundImage: true, + backgroundPositionX: true, + backgroundPositionY: true, + backgroundRepeat: true + }, + backgroundPosition: { + backgroundPositionX: true, + backgroundPositionY: true + }, + border: { + borderWidth: true, + borderStyle: true, + borderColor: true + }, + borderBottom: { + borderBottomWidth: true, + borderBottomStyle: true, + borderBottomColor: true + }, + borderLeft: { + borderLeftWidth: true, + borderLeftStyle: true, + borderLeftColor: true + }, + borderRight: { + borderRightWidth: true, + borderRightStyle: true, + borderRightColor: true + }, + borderTop: { + borderTopWidth: true, + borderTopStyle: true, + borderTopColor: true + }, + font: { + fontStyle: true, + fontVariant: true, + fontWeight: true, + fontSize: true, + lineHeight: true, + fontFamily: true + }, + outline: { + outlineWidth: true, + outlineStyle: true, + outlineColor: true + } + }; + + var CSSProperty = { + isUnitlessNumber: isUnitlessNumber, + shorthandPropertyExpansions: shorthandPropertyExpansions + }; + + module.exports = CSSProperty; + +/***/ }, +/* 97 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule camelizeStyleName + * @typechecks + */ + + 'use strict'; + + var camelize = __webpack_require__(98); + + var msPattern = /^-ms-/; + + /** + * Camelcases a hyphenated CSS property name, for example: + * + * > camelizeStyleName('background-color') + * < "backgroundColor" + * > camelizeStyleName('-moz-transition') + * < "MozTransition" + * > camelizeStyleName('-ms-transition') + * < "msTransition" + * + * As Andi Smith suggests + * (http://www.andismith.com/blog/2012/02/modernizr-prefixed/), an `-ms` prefix + * is converted to lowercase `ms`. + * + * @param {string} string + * @return {string} + */ + function camelizeStyleName(string) { + return camelize(string.replace(msPattern, 'ms-')); + } + + module.exports = camelizeStyleName; + +/***/ }, +/* 98 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule camelize + * @typechecks + */ + + "use strict"; + + var _hyphenPattern = /-(.)/g; + + /** + * Camelcases a hyphenated string, for example: + * + * > camelize('background-color') + * < "backgroundColor" + * + * @param {string} string + * @return {string} + */ + function camelize(string) { + return string.replace(_hyphenPattern, function (_, character) { + return character.toUpperCase(); + }); + } + + module.exports = camelize; + +/***/ }, +/* 99 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule dangerousStyleValue + * @typechecks static-only + */ + + 'use strict'; + + var CSSProperty = __webpack_require__(96); + + var isUnitlessNumber = CSSProperty.isUnitlessNumber; + + /** + * Convert a value into the proper css writable value. The style name `name` + * should be logical (no hyphens), as specified + * in `CSSProperty.isUnitlessNumber`. + * + * @param {string} name CSS property name such as `topMargin`. + * @param {*} value CSS property value such as `10px`. + * @return {string} Normalized style value with dimensions applied. + */ + function dangerousStyleValue(name, value) { + // Note that we've removed escapeTextForBrowser() calls here since the + // whole string will be escaped when the attribute is injected into + // the markup. If you provide unsafe user data here they can inject + // arbitrary CSS which may be problematic (I couldn't repro this): + // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet + // http://www.thespanner.co.uk/2007/11/26/ultimate-xss-css-injection/ + // This is not an XSS hole but instead a potential CSS injection issue + // which has lead to a greater discussion about how we're going to + // trust URLs moving forward. See #2115901 + + var isEmpty = value == null || typeof value === 'boolean' || value === ''; + if (isEmpty) { + return ''; + } + + var isNonNumeric = isNaN(value); + if (isNonNumeric || value === 0 || isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name]) { + return '' + value; // cast to string + } + + if (typeof value === 'string') { + value = value.trim(); + } + return value + 'px'; + } + + module.exports = dangerousStyleValue; + +/***/ }, +/* 100 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule hyphenateStyleName + * @typechecks + */ + + 'use strict'; + + var hyphenate = __webpack_require__(101); + + var msPattern = /^ms-/; + + /** + * Hyphenates a camelcased CSS property name, for example: + * + * > hyphenateStyleName('backgroundColor') + * < "background-color" + * > hyphenateStyleName('MozTransition') + * < "-moz-transition" + * > hyphenateStyleName('msTransition') + * < "-ms-transition" + * + * As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix + * is converted to `-ms-`. + * + * @param {string} string + * @return {string} + */ + function hyphenateStyleName(string) { + return hyphenate(string).replace(msPattern, '-ms-'); + } + + module.exports = hyphenateStyleName; + +/***/ }, +/* 101 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule hyphenate + * @typechecks + */ + + 'use strict'; + + var _uppercasePattern = /([A-Z])/g; + + /** + * Hyphenates a camelcased string, for example: + * + * > hyphenate('backgroundColor') + * < "background-color" + * + * For CSS style names, use `hyphenateStyleName` instead which works properly + * with all vendor prefixes, including `ms`. + * + * @param {string} string + * @return {string} + */ + function hyphenate(string) { + return string.replace(_uppercasePattern, '-$1').toLowerCase(); + } + + module.exports = hyphenate; + +/***/ }, +/* 102 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule memoizeStringOnly + * @typechecks static-only + */ + + 'use strict'; + + /** + * Memoizes the return value of a function that accepts one string argument. + * + * @param {function} callback + * @return {function} + */ + function memoizeStringOnly(callback) { + var cache = {}; + return function (string) { + if (!cache.hasOwnProperty(string)) { + cache[string] = callback.call(this, string); + } + return cache[string]; + }; + } + + module.exports = memoizeStringOnly; + +/***/ }, +/* 103 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactDOMButton + */ + + 'use strict'; + + var mouseListenerNames = { + onClick: true, + onDoubleClick: true, + onMouseDown: true, + onMouseMove: true, + onMouseUp: true, + + onClickCapture: true, + onDoubleClickCapture: true, + onMouseDownCapture: true, + onMouseMoveCapture: true, + onMouseUpCapture: true + }; + + /** + * Implements a <button> native component that does not receive mouse events + * when `disabled` is set. + */ + var ReactDOMButton = { + getNativeProps: function (inst, props, context) { + if (!props.disabled) { + return props; + } + + // Copy the props, except the mouse listeners + var nativeProps = {}; + for (var key in props) { + if (props.hasOwnProperty(key) && !mouseListenerNames[key]) { + nativeProps[key] = props[key]; + } + } + + return nativeProps; + } + }; + + module.exports = ReactDOMButton; + +/***/ }, +/* 104 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactDOMInput + */ + + 'use strict'; + + var ReactDOMIDOperations = __webpack_require__(26); + var LinkedValueUtils = __webpack_require__(105); + var ReactMount = __webpack_require__(27); + var ReactUpdates = __webpack_require__(53); + + var assign = __webpack_require__(38); + var invariant = __webpack_require__(12); + + var instancesByReactID = {}; + + function forceUpdateIfMounted() { + if (this._rootNodeID) { + // DOM component is still mounted; update + ReactDOMInput.updateWrapper(this); + } + } + + /** + * Implements an <input> native component that allows setting these optional + * props: `checked`, `value`, `defaultChecked`, and `defaultValue`. + * + * If `checked` or `value` are not supplied (or null/undefined), user actions + * that affect the checked state or value will trigger updates to the element. + * + * If they are supplied (and not null/undefined), the rendered element will not + * trigger updates to the element. Instead, the props must change in order for + * the rendered element to be updated. + * + * The rendered element will be initialized as unchecked (or `defaultChecked`) + * with an empty value (or `defaultValue`). + * + * @see http://www.w3.org/TR/2012/WD-html5-20121025/the-input-element.html + */ + var ReactDOMInput = { + getNativeProps: function (inst, props, context) { + var value = LinkedValueUtils.getValue(props); + var checked = LinkedValueUtils.getChecked(props); + + var nativeProps = assign({}, props, { + defaultChecked: undefined, + defaultValue: undefined, + value: value != null ? value : inst._wrapperState.initialValue, + checked: checked != null ? checked : inst._wrapperState.initialChecked, + onChange: inst._wrapperState.onChange + }); + + return nativeProps; + }, + + mountWrapper: function (inst, props) { + if (process.env.NODE_ENV !== 'production') { + LinkedValueUtils.checkPropTypes('input', props, inst._currentElement._owner); + } + + var defaultValue = props.defaultValue; + inst._wrapperState = { + initialChecked: props.defaultChecked || false, + initialValue: defaultValue != null ? defaultValue : null, + onChange: _handleChange.bind(inst) + }; + }, + + mountReadyWrapper: function (inst) { + // Can't be in mountWrapper or else server rendering leaks. + instancesByReactID[inst._rootNodeID] = inst; + }, + + unmountWrapper: function (inst) { + delete instancesByReactID[inst._rootNodeID]; + }, + + updateWrapper: function (inst) { + var props = inst._currentElement.props; + + // TODO: Shouldn't this be getChecked(props)? + var checked = props.checked; + if (checked != null) { + ReactDOMIDOperations.updatePropertyByID(inst._rootNodeID, 'checked', checked || false); + } + + var value = LinkedValueUtils.getValue(props); + if (value != null) { + // Cast `value` to a string to ensure the value is set correctly. While + // browsers typically do this as necessary, jsdom doesn't. + ReactDOMIDOperations.updatePropertyByID(inst._rootNodeID, 'value', '' + value); + } + } + }; + + function _handleChange(event) { + var props = this._currentElement.props; + + var returnValue = LinkedValueUtils.executeOnChange(props, event); + + // Here we use asap to wait until all updates have propagated, which + // is important when using controlled components within layers: + // https://github.com/facebook/react/issues/1698 + ReactUpdates.asap(forceUpdateIfMounted, this); + + var name = props.name; + if (props.type === 'radio' && name != null) { + var rootNode = ReactMount.getNode(this._rootNodeID); + var queryRoot = rootNode; + + while (queryRoot.parentNode) { + queryRoot = queryRoot.parentNode; + } + + // If `rootNode.form` was non-null, then we could try `form.elements`, + // but that sometimes behaves strangely in IE8. We could also try using + // `form.getElementsByName`, but that will only return direct children + // and won't include inputs that use the HTML5 `form=` attribute. Since + // the input might not even be in a form, let's just use the global + // `querySelectorAll` to ensure we don't miss anything. + var group = queryRoot.querySelectorAll('input[name=' + JSON.stringify('' + name) + '][type="radio"]'); + + for (var i = 0; i < group.length; i++) { + var otherNode = group[i]; + if (otherNode === rootNode || otherNode.form !== rootNode.form) { + continue; + } + // This will throw if radio buttons rendered by different copies of React + // and the same name are rendered into the same form (same as #1939). + // That's probably okay; we don't support it just as we don't support + // mixing React with non-React. + var otherID = ReactMount.getID(otherNode); + !otherID ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactDOMInput: Mixing React and non-React radio inputs with the ' + 'same `name` is not supported.') : invariant(false) : undefined; + var otherInstance = instancesByReactID[otherID]; + !otherInstance ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactDOMInput: Unknown radio button ID %s.', otherID) : invariant(false) : undefined; + // If this is a controlled radio button group, forcing the input that + // was previously checked to update will cause it to be come re-checked + // as appropriate. + ReactUpdates.asap(forceUpdateIfMounted, otherInstance); + } + } + + return returnValue; + } + + module.exports = ReactDOMInput; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 105 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule LinkedValueUtils + * @typechecks static-only + */ + + 'use strict'; + + var ReactPropTypes = __webpack_require__(106); + var ReactPropTypeLocations = __webpack_require__(64); + + var invariant = __webpack_require__(12); + var warning = __webpack_require__(24); + + var hasReadOnlyValue = { + 'button': true, + 'checkbox': true, + 'image': true, + 'hidden': true, + 'radio': true, + 'reset': true, + 'submit': true + }; + + function _assertSingleLink(inputProps) { + !(inputProps.checkedLink == null || inputProps.valueLink == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Cannot provide a checkedLink and a valueLink. If you want to use ' + 'checkedLink, you probably don\'t want to use valueLink and vice versa.') : invariant(false) : undefined; + } + function _assertValueLink(inputProps) { + _assertSingleLink(inputProps); + !(inputProps.value == null && inputProps.onChange == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Cannot provide a valueLink and a value or onChange event. If you want ' + 'to use value or onChange, you probably don\'t want to use valueLink.') : invariant(false) : undefined; + } + + function _assertCheckedLink(inputProps) { + _assertSingleLink(inputProps); + !(inputProps.checked == null && inputProps.onChange == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Cannot provide a checkedLink and a checked property or onChange event. ' + 'If you want to use checked or onChange, you probably don\'t want to ' + 'use checkedLink') : invariant(false) : undefined; + } + + var propTypes = { + value: function (props, propName, componentName) { + if (!props[propName] || hasReadOnlyValue[props.type] || props.onChange || props.readOnly || props.disabled) { + return null; + } + return new Error('You provided a `value` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultValue`. Otherwise, ' + 'set either `onChange` or `readOnly`.'); + }, + checked: function (props, propName, componentName) { + if (!props[propName] || props.onChange || props.readOnly || props.disabled) { + return null; + } + return new Error('You provided a `checked` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultChecked`. Otherwise, ' + 'set either `onChange` or `readOnly`.'); + }, + onChange: ReactPropTypes.func + }; + + var loggedTypeFailures = {}; + function getDeclarationErrorAddendum(owner) { + if (owner) { + var name = owner.getName(); + if (name) { + return ' Check the render method of `' + name + '`.'; + } + } + return ''; + } + + /** + * Provide a linked `value` attribute for controlled forms. You should not use + * this outside of the ReactDOM controlled form components. + */ + var LinkedValueUtils = { + checkPropTypes: function (tagName, props, owner) { + for (var propName in propTypes) { + if (propTypes.hasOwnProperty(propName)) { + var error = propTypes[propName](props, propName, tagName, ReactPropTypeLocations.prop); + } + if (error instanceof Error && !(error.message in loggedTypeFailures)) { + // Only monitor this failure once because there tends to be a lot of the + // same error. + loggedTypeFailures[error.message] = true; + + var addendum = getDeclarationErrorAddendum(owner); + process.env.NODE_ENV !== 'production' ? warning(false, 'Failed form propType: %s%s', error.message, addendum) : undefined; + } + } + }, + + /** + * @param {object} inputProps Props for form component + * @return {*} current value of the input either from value prop or link. + */ + getValue: function (inputProps) { + if (inputProps.valueLink) { + _assertValueLink(inputProps); + return inputProps.valueLink.value; + } + return inputProps.value; + }, + + /** + * @param {object} inputProps Props for form component + * @return {*} current checked status of the input either from checked prop + * or link. + */ + getChecked: function (inputProps) { + if (inputProps.checkedLink) { + _assertCheckedLink(inputProps); + return inputProps.checkedLink.value; + } + return inputProps.checked; + }, + + /** + * @param {object} inputProps Props for form component + * @param {SyntheticEvent} event change event to handle + */ + executeOnChange: function (inputProps, event) { + if (inputProps.valueLink) { + _assertValueLink(inputProps); + return inputProps.valueLink.requestChange(event.target.value); + } else if (inputProps.checkedLink) { + _assertCheckedLink(inputProps); + return inputProps.checkedLink.requestChange(event.target.checked); + } else if (inputProps.onChange) { + return inputProps.onChange.call(undefined, event); + } + } + }; + + module.exports = LinkedValueUtils; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 106 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactPropTypes + */ + + 'use strict'; + + var ReactElement = __webpack_require__(41); + var ReactPropTypeLocationNames = __webpack_require__(65); + + var emptyFunction = __webpack_require__(14); + var getIteratorFn = __webpack_require__(107); + + /** + * Collection of methods that allow declaration and validation of props that are + * supplied to React components. Example usage: + * + * var Props = require('ReactPropTypes'); + * var MyArticle = React.createClass({ + * propTypes: { + * // An optional string prop named "description". + * description: Props.string, + * + * // A required enum prop named "category". + * category: Props.oneOf(['News','Photos']).isRequired, + * + * // A prop named "dialog" that requires an instance of Dialog. + * dialog: Props.instanceOf(Dialog).isRequired + * }, + * render: function() { ... } + * }); + * + * A more formal specification of how these methods are used: + * + * type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...) + * decl := ReactPropTypes.{type}(.isRequired)? + * + * Each and every declaration produces a function with the same signature. This + * allows the creation of custom validation functions. For example: + * + * var MyLink = React.createClass({ + * propTypes: { + * // An optional string or URI prop named "href". + * href: function(props, propName, componentName) { + * var propValue = props[propName]; + * if (propValue != null && typeof propValue !== 'string' && + * !(propValue instanceof URI)) { + * return new Error( + * 'Expected a string or an URI for ' + propName + ' in ' + + * componentName + * ); + * } + * } + * }, + * render: function() {...} + * }); + * + * @internal + */ + + var ANONYMOUS = '<<anonymous>>'; + + var ReactPropTypes = { + array: createPrimitiveTypeChecker('array'), + bool: createPrimitiveTypeChecker('boolean'), + func: createPrimitiveTypeChecker('function'), + number: createPrimitiveTypeChecker('number'), + object: createPrimitiveTypeChecker('object'), + string: createPrimitiveTypeChecker('string'), + + any: createAnyTypeChecker(), + arrayOf: createArrayOfTypeChecker, + element: createElementTypeChecker(), + instanceOf: createInstanceTypeChecker, + node: createNodeChecker(), + objectOf: createObjectOfTypeChecker, + oneOf: createEnumTypeChecker, + oneOfType: createUnionTypeChecker, + shape: createShapeTypeChecker + }; + + function createChainableTypeChecker(validate) { + function checkType(isRequired, props, propName, componentName, location, propFullName) { + componentName = componentName || ANONYMOUS; + propFullName = propFullName || propName; + if (props[propName] == null) { + var locationName = ReactPropTypeLocationNames[location]; + if (isRequired) { + return new Error('Required ' + locationName + ' `' + propFullName + '` was not specified in ' + ('`' + componentName + '`.')); + } + return null; + } else { + return validate(props, propName, componentName, location, propFullName); + } + } + + var chainedCheckType = checkType.bind(null, false); + chainedCheckType.isRequired = checkType.bind(null, true); + + return chainedCheckType; + } + + function createPrimitiveTypeChecker(expectedType) { + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + var propType = getPropType(propValue); + if (propType !== expectedType) { + var locationName = ReactPropTypeLocationNames[location]; + // `propValue` being instance of, say, date/regexp, pass the 'object' + // check, but we can offer a more precise error message here rather than + // 'of type `object`'. + var preciseType = getPreciseType(propValue); + + return new Error('Invalid ' + locationName + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.')); + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createAnyTypeChecker() { + return createChainableTypeChecker(emptyFunction.thatReturns(null)); + } + + function createArrayOfTypeChecker(typeChecker) { + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + if (!Array.isArray(propValue)) { + var locationName = ReactPropTypeLocationNames[location]; + var propType = getPropType(propValue); + return new Error('Invalid ' + locationName + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.')); + } + for (var i = 0; i < propValue.length; i++) { + var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']'); + if (error instanceof Error) { + return error; + } + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createElementTypeChecker() { + function validate(props, propName, componentName, location, propFullName) { + if (!ReactElement.isValidElement(props[propName])) { + var locationName = ReactPropTypeLocationNames[location]; + return new Error('Invalid ' + locationName + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a single ReactElement.')); + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createInstanceTypeChecker(expectedClass) { + function validate(props, propName, componentName, location, propFullName) { + if (!(props[propName] instanceof expectedClass)) { + var locationName = ReactPropTypeLocationNames[location]; + var expectedClassName = expectedClass.name || ANONYMOUS; + var actualClassName = getClassName(props[propName]); + return new Error('Invalid ' + locationName + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.')); + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createEnumTypeChecker(expectedValues) { + if (!Array.isArray(expectedValues)) { + return createChainableTypeChecker(function () { + return new Error('Invalid argument supplied to oneOf, expected an instance of array.'); + }); + } + + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + for (var i = 0; i < expectedValues.length; i++) { + if (propValue === expectedValues[i]) { + return null; + } + } + + var locationName = ReactPropTypeLocationNames[location]; + var valuesString = JSON.stringify(expectedValues); + return new Error('Invalid ' + locationName + ' `' + propFullName + '` of value `' + propValue + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.')); + } + return createChainableTypeChecker(validate); + } + + function createObjectOfTypeChecker(typeChecker) { + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + var propType = getPropType(propValue); + if (propType !== 'object') { + var locationName = ReactPropTypeLocationNames[location]; + return new Error('Invalid ' + locationName + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.')); + } + for (var key in propValue) { + if (propValue.hasOwnProperty(key)) { + var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key); + if (error instanceof Error) { + return error; + } + } + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createUnionTypeChecker(arrayOfTypeCheckers) { + if (!Array.isArray(arrayOfTypeCheckers)) { + return createChainableTypeChecker(function () { + return new Error('Invalid argument supplied to oneOfType, expected an instance of array.'); + }); + } + + function validate(props, propName, componentName, location, propFullName) { + for (var i = 0; i < arrayOfTypeCheckers.length; i++) { + var checker = arrayOfTypeCheckers[i]; + if (checker(props, propName, componentName, location, propFullName) == null) { + return null; + } + } + + var locationName = ReactPropTypeLocationNames[location]; + return new Error('Invalid ' + locationName + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`.')); + } + return createChainableTypeChecker(validate); + } + + function createNodeChecker() { + function validate(props, propName, componentName, location, propFullName) { + if (!isNode(props[propName])) { + var locationName = ReactPropTypeLocationNames[location]; + return new Error('Invalid ' + locationName + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.')); + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createShapeTypeChecker(shapeTypes) { + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + var propType = getPropType(propValue); + if (propType !== 'object') { + var locationName = ReactPropTypeLocationNames[location]; + return new Error('Invalid ' + locationName + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.')); + } + for (var key in shapeTypes) { + var checker = shapeTypes[key]; + if (!checker) { + continue; + } + var error = checker(propValue, key, componentName, location, propFullName + '.' + key); + if (error) { + return error; + } + } + return null; + } + return createChainableTypeChecker(validate); + } + + function isNode(propValue) { + switch (typeof propValue) { + case 'number': + case 'string': + case 'undefined': + return true; + case 'boolean': + return !propValue; + case 'object': + if (Array.isArray(propValue)) { + return propValue.every(isNode); + } + if (propValue === null || ReactElement.isValidElement(propValue)) { + return true; + } + + var iteratorFn = getIteratorFn(propValue); + if (iteratorFn) { + var iterator = iteratorFn.call(propValue); + var step; + if (iteratorFn !== propValue.entries) { + while (!(step = iterator.next()).done) { + if (!isNode(step.value)) { + return false; + } + } + } else { + // Iterator will provide entry [k,v] tuples rather than values. + while (!(step = iterator.next()).done) { + var entry = step.value; + if (entry) { + if (!isNode(entry[1])) { + return false; + } + } + } + } + } else { + return false; + } + + return true; + default: + return false; + } + } + + // Equivalent of `typeof` but with special handling for array and regexp. + function getPropType(propValue) { + var propType = typeof propValue; + if (Array.isArray(propValue)) { + return 'array'; + } + if (propValue instanceof RegExp) { + // Old webkits (at least until Android 4.0) return 'function' rather than + // 'object' for typeof a RegExp. We'll normalize this here so that /bla/ + // passes PropTypes.object. + return 'object'; + } + return propType; + } + + // This handles more types than `getPropType`. Only used for error messages. + // See `createPrimitiveTypeChecker`. + function getPreciseType(propValue) { + var propType = getPropType(propValue); + if (propType === 'object') { + if (propValue instanceof Date) { + return 'date'; + } else if (propValue instanceof RegExp) { + return 'regexp'; + } + } + return propType; + } + + // Returns class name of the object, if any. + function getClassName(propValue) { + if (!propValue.constructor || !propValue.constructor.name) { + return '<<anonymous>>'; + } + return propValue.constructor.name; + } + + module.exports = ReactPropTypes; + +/***/ }, +/* 107 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule getIteratorFn + * @typechecks static-only + */ + + 'use strict'; + + /* global Symbol */ + var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; + var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec. + + /** + * Returns the iterator method function contained on the iterable object. + * + * Be sure to invoke the function with the iterable as context: + * + * var iteratorFn = getIteratorFn(myIterable); + * if (iteratorFn) { + * var iterator = iteratorFn.call(myIterable); + * ... + * } + * + * @param {?object} maybeIterable + * @return {?function} + */ + function getIteratorFn(maybeIterable) { + var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]); + if (typeof iteratorFn === 'function') { + return iteratorFn; + } + } + + module.exports = getIteratorFn; + +/***/ }, +/* 108 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactDOMOption + */ + + 'use strict'; + + var ReactChildren = __webpack_require__(109); + var ReactDOMSelect = __webpack_require__(111); + + var assign = __webpack_require__(38); + var warning = __webpack_require__(24); + + var valueContextKey = ReactDOMSelect.valueContextKey; + + /** + * Implements an <option> native component that warns when `selected` is set. + */ + var ReactDOMOption = { + mountWrapper: function (inst, props, context) { + // TODO (yungsters): Remove support for `selected` in <option>. + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(props.selected == null, 'Use the `defaultValue` or `value` props on <select> instead of ' + 'setting `selected` on <option>.') : undefined; + } + + // Look up whether this option is 'selected' via context + var selectValue = context[valueContextKey]; + + // If context key is null (e.g., no specified value or after initial mount) + // or missing (e.g., for <datalist>), we don't change props.selected + var selected = null; + if (selectValue != null) { + selected = false; + if (Array.isArray(selectValue)) { + // multiple + for (var i = 0; i < selectValue.length; i++) { + if ('' + selectValue[i] === '' + props.value) { + selected = true; + break; + } + } + } else { + selected = '' + selectValue === '' + props.value; + } + } + + inst._wrapperState = { selected: selected }; + }, + + getNativeProps: function (inst, props, context) { + var nativeProps = assign({ selected: undefined, children: undefined }, props); + + // Read state only from initial mount because <select> updates value + // manually; we need the initial state only for server rendering + if (inst._wrapperState.selected != null) { + nativeProps.selected = inst._wrapperState.selected; + } + + var content = ''; + + // Flatten children and warn if they aren't strings or numbers; + // invalid types are ignored. + ReactChildren.forEach(props.children, function (child) { + if (child == null) { + return; + } + if (typeof child === 'string' || typeof child === 'number') { + content += child; + } else { + process.env.NODE_ENV !== 'production' ? warning(false, 'Only strings and numbers are supported as <option> children.') : undefined; + } + }); + + nativeProps.children = content; + return nativeProps; + } + + }; + + module.exports = ReactDOMOption; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 109 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactChildren + */ + + 'use strict'; + + var PooledClass = __webpack_require__(55); + var ReactElement = __webpack_require__(41); + + var emptyFunction = __webpack_require__(14); + var traverseAllChildren = __webpack_require__(110); + + var twoArgumentPooler = PooledClass.twoArgumentPooler; + var fourArgumentPooler = PooledClass.fourArgumentPooler; + + var userProvidedKeyEscapeRegex = /\/(?!\/)/g; + function escapeUserProvidedKey(text) { + return ('' + text).replace(userProvidedKeyEscapeRegex, '//'); + } + + /** + * PooledClass representing the bookkeeping associated with performing a child + * traversal. Allows avoiding binding callbacks. + * + * @constructor ForEachBookKeeping + * @param {!function} forEachFunction Function to perform traversal with. + * @param {?*} forEachContext Context to perform context with. + */ + function ForEachBookKeeping(forEachFunction, forEachContext) { + this.func = forEachFunction; + this.context = forEachContext; + this.count = 0; + } + ForEachBookKeeping.prototype.destructor = function () { + this.func = null; + this.context = null; + this.count = 0; + }; + PooledClass.addPoolingTo(ForEachBookKeeping, twoArgumentPooler); + + function forEachSingleChild(bookKeeping, child, name) { + var func = bookKeeping.func; + var context = bookKeeping.context; + + func.call(context, child, bookKeeping.count++); + } + + /** + * Iterates through children that are typically specified as `props.children`. + * + * The provided forEachFunc(child, index) will be called for each + * leaf child. + * + * @param {?*} children Children tree container. + * @param {function(*, int)} forEachFunc + * @param {*} forEachContext Context for forEachContext. + */ + function forEachChildren(children, forEachFunc, forEachContext) { + if (children == null) { + return children; + } + var traverseContext = ForEachBookKeeping.getPooled(forEachFunc, forEachContext); + traverseAllChildren(children, forEachSingleChild, traverseContext); + ForEachBookKeeping.release(traverseContext); + } + + /** + * PooledClass representing the bookkeeping associated with performing a child + * mapping. Allows avoiding binding callbacks. + * + * @constructor MapBookKeeping + * @param {!*} mapResult Object containing the ordered map of results. + * @param {!function} mapFunction Function to perform mapping with. + * @param {?*} mapContext Context to perform mapping with. + */ + function MapBookKeeping(mapResult, keyPrefix, mapFunction, mapContext) { + this.result = mapResult; + this.keyPrefix = keyPrefix; + this.func = mapFunction; + this.context = mapContext; + this.count = 0; + } + MapBookKeeping.prototype.destructor = function () { + this.result = null; + this.keyPrefix = null; + this.func = null; + this.context = null; + this.count = 0; + }; + PooledClass.addPoolingTo(MapBookKeeping, fourArgumentPooler); + + function mapSingleChildIntoContext(bookKeeping, child, childKey) { + var result = bookKeeping.result; + var keyPrefix = bookKeeping.keyPrefix; + var func = bookKeeping.func; + var context = bookKeeping.context; + + var mappedChild = func.call(context, child, bookKeeping.count++); + if (Array.isArray(mappedChild)) { + mapIntoWithKeyPrefixInternal(mappedChild, result, childKey, emptyFunction.thatReturnsArgument); + } else if (mappedChild != null) { + if (ReactElement.isValidElement(mappedChild)) { + mappedChild = ReactElement.cloneAndReplaceKey(mappedChild, + // Keep both the (mapped) and old keys if they differ, just as + // traverseAllChildren used to do for objects as children + keyPrefix + (mappedChild !== child ? escapeUserProvidedKey(mappedChild.key || '') + '/' : '') + childKey); + } + result.push(mappedChild); + } + } + + function mapIntoWithKeyPrefixInternal(children, array, prefix, func, context) { + var escapedPrefix = ''; + if (prefix != null) { + escapedPrefix = escapeUserProvidedKey(prefix) + '/'; + } + var traverseContext = MapBookKeeping.getPooled(array, escapedPrefix, func, context); + traverseAllChildren(children, mapSingleChildIntoContext, traverseContext); + MapBookKeeping.release(traverseContext); + } + + /** + * Maps children that are typically specified as `props.children`. + * + * The provided mapFunction(child, key, index) will be called for each + * leaf child. + * + * @param {?*} children Children tree container. + * @param {function(*, int)} func The map function. + * @param {*} context Context for mapFunction. + * @return {object} Object containing the ordered map of results. + */ + function mapChildren(children, func, context) { + if (children == null) { + return children; + } + var result = []; + mapIntoWithKeyPrefixInternal(children, result, null, func, context); + return result; + } + + function forEachSingleChildDummy(traverseContext, child, name) { + return null; + } + + /** + * Count the number of children that are typically specified as + * `props.children`. + * + * @param {?*} children Children tree container. + * @return {number} The number of children. + */ + function countChildren(children, context) { + return traverseAllChildren(children, forEachSingleChildDummy, null); + } + + /** + * Flatten a children object (typically specified as `props.children`) and + * return an array with appropriately re-keyed children. + */ + function toArray(children) { + var result = []; + mapIntoWithKeyPrefixInternal(children, result, null, emptyFunction.thatReturnsArgument); + return result; + } + + var ReactChildren = { + forEach: forEachChildren, + map: mapChildren, + mapIntoWithKeyPrefixInternal: mapIntoWithKeyPrefixInternal, + count: countChildren, + toArray: toArray + }; + + module.exports = ReactChildren; + +/***/ }, +/* 110 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule traverseAllChildren + */ + + 'use strict'; + + var ReactCurrentOwner = __webpack_require__(4); + var ReactElement = __webpack_require__(41); + var ReactInstanceHandles = __webpack_require__(44); + + var getIteratorFn = __webpack_require__(107); + var invariant = __webpack_require__(12); + var warning = __webpack_require__(24); + + var SEPARATOR = ReactInstanceHandles.SEPARATOR; + var SUBSEPARATOR = ':'; + + /** + * TODO: Test that a single child and an array with one item have the same key + * pattern. + */ + + var userProvidedKeyEscaperLookup = { + '=': '=0', + '.': '=1', + ':': '=2' + }; + + var userProvidedKeyEscapeRegex = /[=.:]/g; + + var didWarnAboutMaps = false; + + function userProvidedKeyEscaper(match) { + return userProvidedKeyEscaperLookup[match]; + } + + /** + * Generate a key string that identifies a component within a set. + * + * @param {*} component A component that could contain a manual key. + * @param {number} index Index that is used if a manual key is not provided. + * @return {string} + */ + function getComponentKey(component, index) { + if (component && component.key != null) { + // Explicit key + return wrapUserProvidedKey(component.key); + } + // Implicit key determined by the index in the set + return index.toString(36); + } + + /** + * Escape a component key so that it is safe to use in a reactid. + * + * @param {*} text Component key to be escaped. + * @return {string} An escaped string. + */ + function escapeUserProvidedKey(text) { + return ('' + text).replace(userProvidedKeyEscapeRegex, userProvidedKeyEscaper); + } + + /** + * Wrap a `key` value explicitly provided by the user to distinguish it from + * implicitly-generated keys generated by a component's index in its parent. + * + * @param {string} key Value of a user-provided `key` attribute + * @return {string} + */ + function wrapUserProvidedKey(key) { + return '$' + escapeUserProvidedKey(key); + } + + /** + * @param {?*} children Children tree container. + * @param {!string} nameSoFar Name of the key path so far. + * @param {!function} callback Callback to invoke with each child found. + * @param {?*} traverseContext Used to pass information throughout the traversal + * process. + * @return {!number} The number of children in this subtree. + */ + function traverseAllChildrenImpl(children, nameSoFar, callback, traverseContext) { + var type = typeof children; + + if (type === 'undefined' || type === 'boolean') { + // All of the above are perceived as null. + children = null; + } + + if (children === null || type === 'string' || type === 'number' || ReactElement.isValidElement(children)) { + callback(traverseContext, children, + // If it's the only child, treat the name as if it was wrapped in an array + // so that it's consistent if the number of children grows. + nameSoFar === '' ? SEPARATOR + getComponentKey(children, 0) : nameSoFar); + return 1; + } + + var child; + var nextName; + var subtreeCount = 0; // Count of children found in the current subtree. + var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR; + + if (Array.isArray(children)) { + for (var i = 0; i < children.length; i++) { + child = children[i]; + nextName = nextNamePrefix + getComponentKey(child, i); + subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext); + } + } else { + var iteratorFn = getIteratorFn(children); + if (iteratorFn) { + var iterator = iteratorFn.call(children); + var step; + if (iteratorFn !== children.entries) { + var ii = 0; + while (!(step = iterator.next()).done) { + child = step.value; + nextName = nextNamePrefix + getComponentKey(child, ii++); + subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext); + } + } else { + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(didWarnAboutMaps, 'Using Maps as children is not yet fully supported. It is an ' + 'experimental feature that might be removed. Convert it to a ' + 'sequence / iterable of keyed ReactElements instead.') : undefined; + didWarnAboutMaps = true; + } + // Iterator will provide entry [k,v] tuples rather than values. + while (!(step = iterator.next()).done) { + var entry = step.value; + if (entry) { + child = entry[1]; + nextName = nextNamePrefix + wrapUserProvidedKey(entry[0]) + SUBSEPARATOR + getComponentKey(child, 0); + subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext); + } + } + } + } else if (type === 'object') { + var addendum = ''; + if (process.env.NODE_ENV !== 'production') { + addendum = ' If you meant to render a collection of children, use an array ' + 'instead or wrap the object using createFragment(object) from the ' + 'React add-ons.'; + if (children._isReactElement) { + addendum = ' It looks like you\'re using an element created by a different ' + 'version of React. Make sure to use only one copy of React.'; + } + if (ReactCurrentOwner.current) { + var name = ReactCurrentOwner.current.getName(); + if (name) { + addendum += ' Check the render method of `' + name + '`.'; + } + } + } + var childrenString = String(children); + true ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Objects are not valid as a React child (found: %s).%s', childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString, addendum) : invariant(false) : undefined; + } + } + + return subtreeCount; + } + + /** + * Traverses children that are typically specified as `props.children`, but + * might also be specified through attributes: + * + * - `traverseAllChildren(this.props.children, ...)` + * - `traverseAllChildren(this.props.leftPanelChildren, ...)` + * + * The `traverseContext` is an optional argument that is passed through the + * entire traversal. It can be used to store accumulations or anything else that + * the callback might find relevant. + * + * @param {?*} children Children tree object. + * @param {!function} callback To invoke upon traversing each child. + * @param {?*} traverseContext Context for traversal. + * @return {!number} The number of children in this subtree. + */ + function traverseAllChildren(children, callback, traverseContext) { + if (children == null) { + return 0; + } + + return traverseAllChildrenImpl(children, '', callback, traverseContext); + } + + module.exports = traverseAllChildren; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 111 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactDOMSelect + */ + + 'use strict'; + + var LinkedValueUtils = __webpack_require__(105); + var ReactMount = __webpack_require__(27); + var ReactUpdates = __webpack_require__(53); + + var assign = __webpack_require__(38); + var warning = __webpack_require__(24); + + var valueContextKey = '__ReactDOMSelect_value$' + Math.random().toString(36).slice(2); + + function updateOptionsIfPendingUpdateAndMounted() { + if (this._rootNodeID && this._wrapperState.pendingUpdate) { + this._wrapperState.pendingUpdate = false; + + var props = this._currentElement.props; + var value = LinkedValueUtils.getValue(props); + + if (value != null) { + updateOptions(this, props, value); + } + } + } + + function getDeclarationErrorAddendum(owner) { + if (owner) { + var name = owner.getName(); + if (name) { + return ' Check the render method of `' + name + '`.'; + } + } + return ''; + } + + var valuePropNames = ['value', 'defaultValue']; + + /** + * Validation function for `value` and `defaultValue`. + * @private + */ + function checkSelectPropTypes(inst, props) { + var owner = inst._currentElement._owner; + LinkedValueUtils.checkPropTypes('select', props, owner); + + for (var i = 0; i < valuePropNames.length; i++) { + var propName = valuePropNames[i]; + if (props[propName] == null) { + continue; + } + if (props.multiple) { + process.env.NODE_ENV !== 'production' ? warning(Array.isArray(props[propName]), 'The `%s` prop supplied to <select> must be an array if ' + '`multiple` is true.%s', propName, getDeclarationErrorAddendum(owner)) : undefined; + } else { + process.env.NODE_ENV !== 'production' ? warning(!Array.isArray(props[propName]), 'The `%s` prop supplied to <select> must be a scalar ' + 'value if `multiple` is false.%s', propName, getDeclarationErrorAddendum(owner)) : undefined; + } + } + } + + /** + * @param {ReactDOMComponent} inst + * @param {boolean} multiple + * @param {*} propValue A stringable (with `multiple`, a list of stringables). + * @private + */ + function updateOptions(inst, multiple, propValue) { + var selectedValue, i; + var options = ReactMount.getNode(inst._rootNodeID).options; + + if (multiple) { + selectedValue = {}; + for (i = 0; i < propValue.length; i++) { + selectedValue['' + propValue[i]] = true; + } + for (i = 0; i < options.length; i++) { + var selected = selectedValue.hasOwnProperty(options[i].value); + if (options[i].selected !== selected) { + options[i].selected = selected; + } + } + } else { + // Do not set `select.value` as exact behavior isn't consistent across all + // browsers for all cases. + selectedValue = '' + propValue; + for (i = 0; i < options.length; i++) { + if (options[i].value === selectedValue) { + options[i].selected = true; + return; + } + } + if (options.length) { + options[0].selected = true; + } + } + } + + /** + * Implements a <select> native component that allows optionally setting the + * props `value` and `defaultValue`. If `multiple` is false, the prop must be a + * stringable. If `multiple` is true, the prop must be an array of stringables. + * + * If `value` is not supplied (or null/undefined), user actions that change the + * selected option will trigger updates to the rendered options. + * + * If it is supplied (and not null/undefined), the rendered options will not + * update in response to user actions. Instead, the `value` prop must change in + * order for the rendered options to update. + * + * If `defaultValue` is provided, any options with the supplied values will be + * selected. + */ + var ReactDOMSelect = { + valueContextKey: valueContextKey, + + getNativeProps: function (inst, props, context) { + return assign({}, props, { + onChange: inst._wrapperState.onChange, + value: undefined + }); + }, + + mountWrapper: function (inst, props) { + if (process.env.NODE_ENV !== 'production') { + checkSelectPropTypes(inst, props); + } + + var value = LinkedValueUtils.getValue(props); + inst._wrapperState = { + pendingUpdate: false, + initialValue: value != null ? value : props.defaultValue, + onChange: _handleChange.bind(inst), + wasMultiple: Boolean(props.multiple) + }; + }, + + processChildContext: function (inst, props, context) { + // Pass down initial value so initial generated markup has correct + // `selected` attributes + var childContext = assign({}, context); + childContext[valueContextKey] = inst._wrapperState.initialValue; + return childContext; + }, + + postUpdateWrapper: function (inst) { + var props = inst._currentElement.props; + + // After the initial mount, we control selected-ness manually so don't pass + // the context value down + inst._wrapperState.initialValue = undefined; + + var wasMultiple = inst._wrapperState.wasMultiple; + inst._wrapperState.wasMultiple = Boolean(props.multiple); + + var value = LinkedValueUtils.getValue(props); + if (value != null) { + inst._wrapperState.pendingUpdate = false; + updateOptions(inst, Boolean(props.multiple), value); + } else if (wasMultiple !== Boolean(props.multiple)) { + // For simplicity, reapply `defaultValue` if `multiple` is toggled. + if (props.defaultValue != null) { + updateOptions(inst, Boolean(props.multiple), props.defaultValue); + } else { + // Revert the select back to its default unselected state. + updateOptions(inst, Boolean(props.multiple), props.multiple ? [] : ''); + } + } + } + }; + + function _handleChange(event) { + var props = this._currentElement.props; + var returnValue = LinkedValueUtils.executeOnChange(props, event); + + this._wrapperState.pendingUpdate = true; + ReactUpdates.asap(updateOptionsIfPendingUpdateAndMounted, this); + return returnValue; + } + + module.exports = ReactDOMSelect; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 112 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactDOMTextarea + */ + + 'use strict'; + + var LinkedValueUtils = __webpack_require__(105); + var ReactDOMIDOperations = __webpack_require__(26); + var ReactUpdates = __webpack_require__(53); + + var assign = __webpack_require__(38); + var invariant = __webpack_require__(12); + var warning = __webpack_require__(24); + + function forceUpdateIfMounted() { + if (this._rootNodeID) { + // DOM component is still mounted; update + ReactDOMTextarea.updateWrapper(this); + } + } + + /** + * Implements a <textarea> native component that allows setting `value`, and + * `defaultValue`. This differs from the traditional DOM API because value is + * usually set as PCDATA children. + * + * If `value` is not supplied (or null/undefined), user actions that affect the + * value will trigger updates to the element. + * + * If `value` is supplied (and not null/undefined), the rendered element will + * not trigger updates to the element. Instead, the `value` prop must change in + * order for the rendered element to be updated. + * + * The rendered element will be initialized with an empty value, the prop + * `defaultValue` if specified, or the children content (deprecated). + */ + var ReactDOMTextarea = { + getNativeProps: function (inst, props, context) { + !(props.dangerouslySetInnerHTML == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, '`dangerouslySetInnerHTML` does not make sense on <textarea>.') : invariant(false) : undefined; + + // Always set children to the same thing. In IE9, the selection range will + // get reset if `textContent` is mutated. + var nativeProps = assign({}, props, { + defaultValue: undefined, + value: undefined, + children: inst._wrapperState.initialValue, + onChange: inst._wrapperState.onChange + }); + + return nativeProps; + }, + + mountWrapper: function (inst, props) { + if (process.env.NODE_ENV !== 'production') { + LinkedValueUtils.checkPropTypes('textarea', props, inst._currentElement._owner); + } + + var defaultValue = props.defaultValue; + // TODO (yungsters): Remove support for children content in <textarea>. + var children = props.children; + if (children != null) { + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(false, 'Use the `defaultValue` or `value` props instead of setting ' + 'children on <textarea>.') : undefined; + } + !(defaultValue == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'If you supply `defaultValue` on a <textarea>, do not pass children.') : invariant(false) : undefined; + if (Array.isArray(children)) { + !(children.length <= 1) ? process.env.NODE_ENV !== 'production' ? invariant(false, '<textarea> can only have at most one child.') : invariant(false) : undefined; + children = children[0]; + } + + defaultValue = '' + children; + } + if (defaultValue == null) { + defaultValue = ''; + } + var value = LinkedValueUtils.getValue(props); + + inst._wrapperState = { + // We save the initial value so that `ReactDOMComponent` doesn't update + // `textContent` (unnecessary since we update value). + // The initial value can be a boolean or object so that's why it's + // forced to be a string. + initialValue: '' + (value != null ? value : defaultValue), + onChange: _handleChange.bind(inst) + }; + }, + + updateWrapper: function (inst) { + var props = inst._currentElement.props; + var value = LinkedValueUtils.getValue(props); + if (value != null) { + // Cast `value` to a string to ensure the value is set correctly. While + // browsers typically do this as necessary, jsdom doesn't. + ReactDOMIDOperations.updatePropertyByID(inst._rootNodeID, 'value', '' + value); + } + } + }; + + function _handleChange(event) { + var props = this._currentElement.props; + var returnValue = LinkedValueUtils.executeOnChange(props, event); + ReactUpdates.asap(forceUpdateIfMounted, this); + return returnValue; + } + + module.exports = ReactDOMTextarea; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 113 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactMultiChild + * @typechecks static-only + */ + + 'use strict'; + + var ReactComponentEnvironment = __webpack_require__(63); + var ReactMultiChildUpdateTypes = __webpack_require__(15); + + var ReactCurrentOwner = __webpack_require__(4); + var ReactReconciler = __webpack_require__(49); + var ReactChildReconciler = __webpack_require__(114); + + var flattenChildren = __webpack_require__(115); + + /** + * Updating children of a component may trigger recursive updates. The depth is + * used to batch recursive updates to render markup more efficiently. + * + * @type {number} + * @private + */ + var updateDepth = 0; + + /** + * Queue of update configuration objects. + * + * Each object has a `type` property that is in `ReactMultiChildUpdateTypes`. + * + * @type {array<object>} + * @private + */ + var updateQueue = []; + + /** + * Queue of markup to be rendered. + * + * @type {array<string>} + * @private + */ + var markupQueue = []; + + /** + * Enqueues markup to be rendered and inserted at a supplied index. + * + * @param {string} parentID ID of the parent component. + * @param {string} markup Markup that renders into an element. + * @param {number} toIndex Destination index. + * @private + */ + function enqueueInsertMarkup(parentID, markup, toIndex) { + // NOTE: Null values reduce hidden classes. + updateQueue.push({ + parentID: parentID, + parentNode: null, + type: ReactMultiChildUpdateTypes.INSERT_MARKUP, + markupIndex: markupQueue.push(markup) - 1, + content: null, + fromIndex: null, + toIndex: toIndex + }); + } + + /** + * Enqueues moving an existing element to another index. + * + * @param {string} parentID ID of the parent component. + * @param {number} fromIndex Source index of the existing element. + * @param {number} toIndex Destination index of the element. + * @private + */ + function enqueueMove(parentID, fromIndex, toIndex) { + // NOTE: Null values reduce hidden classes. + updateQueue.push({ + parentID: parentID, + parentNode: null, + type: ReactMultiChildUpdateTypes.MOVE_EXISTING, + markupIndex: null, + content: null, + fromIndex: fromIndex, + toIndex: toIndex + }); + } + + /** + * Enqueues removing an element at an index. + * + * @param {string} parentID ID of the parent component. + * @param {number} fromIndex Index of the element to remove. + * @private + */ + function enqueueRemove(parentID, fromIndex) { + // NOTE: Null values reduce hidden classes. + updateQueue.push({ + parentID: parentID, + parentNode: null, + type: ReactMultiChildUpdateTypes.REMOVE_NODE, + markupIndex: null, + content: null, + fromIndex: fromIndex, + toIndex: null + }); + } + + /** + * Enqueues setting the markup of a node. + * + * @param {string} parentID ID of the parent component. + * @param {string} markup Markup that renders into an element. + * @private + */ + function enqueueSetMarkup(parentID, markup) { + // NOTE: Null values reduce hidden classes. + updateQueue.push({ + parentID: parentID, + parentNode: null, + type: ReactMultiChildUpdateTypes.SET_MARKUP, + markupIndex: null, + content: markup, + fromIndex: null, + toIndex: null + }); + } + + /** + * Enqueues setting the text content. + * + * @param {string} parentID ID of the parent component. + * @param {string} textContent Text content to set. + * @private + */ + function enqueueTextContent(parentID, textContent) { + // NOTE: Null values reduce hidden classes. + updateQueue.push({ + parentID: parentID, + parentNode: null, + type: ReactMultiChildUpdateTypes.TEXT_CONTENT, + markupIndex: null, + content: textContent, + fromIndex: null, + toIndex: null + }); + } + + /** + * Processes any enqueued updates. + * + * @private + */ + function processQueue() { + if (updateQueue.length) { + ReactComponentEnvironment.processChildrenUpdates(updateQueue, markupQueue); + clearQueue(); + } + } + + /** + * Clears any enqueued updates. + * + * @private + */ + function clearQueue() { + updateQueue.length = 0; + markupQueue.length = 0; + } + + /** + * ReactMultiChild are capable of reconciling multiple children. + * + * @class ReactMultiChild + * @internal + */ + var ReactMultiChild = { + + /** + * Provides common functionality for components that must reconcile multiple + * children. This is used by `ReactDOMComponent` to mount, update, and + * unmount child components. + * + * @lends {ReactMultiChild.prototype} + */ + Mixin: { + + _reconcilerInstantiateChildren: function (nestedChildren, transaction, context) { + if (process.env.NODE_ENV !== 'production') { + if (this._currentElement) { + try { + ReactCurrentOwner.current = this._currentElement._owner; + return ReactChildReconciler.instantiateChildren(nestedChildren, transaction, context); + } finally { + ReactCurrentOwner.current = null; + } + } + } + return ReactChildReconciler.instantiateChildren(nestedChildren, transaction, context); + }, + + _reconcilerUpdateChildren: function (prevChildren, nextNestedChildrenElements, transaction, context) { + var nextChildren; + if (process.env.NODE_ENV !== 'production') { + if (this._currentElement) { + try { + ReactCurrentOwner.current = this._currentElement._owner; + nextChildren = flattenChildren(nextNestedChildrenElements); + } finally { + ReactCurrentOwner.current = null; + } + return ReactChildReconciler.updateChildren(prevChildren, nextChildren, transaction, context); + } + } + nextChildren = flattenChildren(nextNestedChildrenElements); + return ReactChildReconciler.updateChildren(prevChildren, nextChildren, transaction, context); + }, + + /** + * Generates a "mount image" for each of the supplied children. In the case + * of `ReactDOMComponent`, a mount image is a string of markup. + * + * @param {?object} nestedChildren Nested child maps. + * @return {array} An array of mounted representations. + * @internal + */ + mountChildren: function (nestedChildren, transaction, context) { + var children = this._reconcilerInstantiateChildren(nestedChildren, transaction, context); + this._renderedChildren = children; + var mountImages = []; + var index = 0; + for (var name in children) { + if (children.hasOwnProperty(name)) { + var child = children[name]; + // Inlined for performance, see `ReactInstanceHandles.createReactID`. + var rootID = this._rootNodeID + name; + var mountImage = ReactReconciler.mountComponent(child, rootID, transaction, context); + child._mountIndex = index++; + mountImages.push(mountImage); + } + } + return mountImages; + }, + + /** + * Replaces any rendered children with a text content string. + * + * @param {string} nextContent String of content. + * @internal + */ + updateTextContent: function (nextContent) { + updateDepth++; + var errorThrown = true; + try { + var prevChildren = this._renderedChildren; + // Remove any rendered children. + ReactChildReconciler.unmountChildren(prevChildren); + // TODO: The setTextContent operation should be enough + for (var name in prevChildren) { + if (prevChildren.hasOwnProperty(name)) { + this._unmountChild(prevChildren[name]); + } + } + // Set new text content. + this.setTextContent(nextContent); + errorThrown = false; + } finally { + updateDepth--; + if (!updateDepth) { + if (errorThrown) { + clearQueue(); + } else { + processQueue(); + } + } + } + }, + + /** + * Replaces any rendered children with a markup string. + * + * @param {string} nextMarkup String of markup. + * @internal + */ + updateMarkup: function (nextMarkup) { + updateDepth++; + var errorThrown = true; + try { + var prevChildren = this._renderedChildren; + // Remove any rendered children. + ReactChildReconciler.unmountChildren(prevChildren); + for (var name in prevChildren) { + if (prevChildren.hasOwnProperty(name)) { + this._unmountChildByName(prevChildren[name], name); + } + } + this.setMarkup(nextMarkup); + errorThrown = false; + } finally { + updateDepth--; + if (!updateDepth) { + if (errorThrown) { + clearQueue(); + } else { + processQueue(); + } + } + } + }, + + /** + * Updates the rendered children with new children. + * + * @param {?object} nextNestedChildrenElements Nested child element maps. + * @param {ReactReconcileTransaction} transaction + * @internal + */ + updateChildren: function (nextNestedChildrenElements, transaction, context) { + updateDepth++; + var errorThrown = true; + try { + this._updateChildren(nextNestedChildrenElements, transaction, context); + errorThrown = false; + } finally { + updateDepth--; + if (!updateDepth) { + if (errorThrown) { + clearQueue(); + } else { + processQueue(); + } + } + } + }, + + /** + * Improve performance by isolating this hot code path from the try/catch + * block in `updateChildren`. + * + * @param {?object} nextNestedChildrenElements Nested child element maps. + * @param {ReactReconcileTransaction} transaction + * @final + * @protected + */ + _updateChildren: function (nextNestedChildrenElements, transaction, context) { + var prevChildren = this._renderedChildren; + var nextChildren = this._reconcilerUpdateChildren(prevChildren, nextNestedChildrenElements, transaction, context); + this._renderedChildren = nextChildren; + if (!nextChildren && !prevChildren) { + return; + } + var name; + // `nextIndex` will increment for each child in `nextChildren`, but + // `lastIndex` will be the last index visited in `prevChildren`. + var lastIndex = 0; + var nextIndex = 0; + for (name in nextChildren) { + if (!nextChildren.hasOwnProperty(name)) { + continue; + } + var prevChild = prevChildren && prevChildren[name]; + var nextChild = nextChildren[name]; + if (prevChild === nextChild) { + this.moveChild(prevChild, nextIndex, lastIndex); + lastIndex = Math.max(prevChild._mountIndex, lastIndex); + prevChild._mountIndex = nextIndex; + } else { + if (prevChild) { + // Update `lastIndex` before `_mountIndex` gets unset by unmounting. + lastIndex = Math.max(prevChild._mountIndex, lastIndex); + this._unmountChild(prevChild); + } + // The child must be instantiated before it's mounted. + this._mountChildByNameAtIndex(nextChild, name, nextIndex, transaction, context); + } + nextIndex++; + } + // Remove children that are no longer present. + for (name in prevChildren) { + if (prevChildren.hasOwnProperty(name) && !(nextChildren && nextChildren.hasOwnProperty(name))) { + this._unmountChild(prevChildren[name]); + } + } + }, + + /** + * Unmounts all rendered children. This should be used to clean up children + * when this component is unmounted. + * + * @internal + */ + unmountChildren: function () { + var renderedChildren = this._renderedChildren; + ReactChildReconciler.unmountChildren(renderedChildren); + this._renderedChildren = null; + }, + + /** + * Moves a child component to the supplied index. + * + * @param {ReactComponent} child Component to move. + * @param {number} toIndex Destination index of the element. + * @param {number} lastIndex Last index visited of the siblings of `child`. + * @protected + */ + moveChild: function (child, toIndex, lastIndex) { + // If the index of `child` is less than `lastIndex`, then it needs to + // be moved. Otherwise, we do not need to move it because a child will be + // inserted or moved before `child`. + if (child._mountIndex < lastIndex) { + enqueueMove(this._rootNodeID, child._mountIndex, toIndex); + } + }, + + /** + * Creates a child component. + * + * @param {ReactComponent} child Component to create. + * @param {string} mountImage Markup to insert. + * @protected + */ + createChild: function (child, mountImage) { + enqueueInsertMarkup(this._rootNodeID, mountImage, child._mountIndex); + }, + + /** + * Removes a child component. + * + * @param {ReactComponent} child Child to remove. + * @protected + */ + removeChild: function (child) { + enqueueRemove(this._rootNodeID, child._mountIndex); + }, + + /** + * Sets this text content string. + * + * @param {string} textContent Text content to set. + * @protected + */ + setTextContent: function (textContent) { + enqueueTextContent(this._rootNodeID, textContent); + }, + + /** + * Sets this markup string. + * + * @param {string} markup Markup to set. + * @protected + */ + setMarkup: function (markup) { + enqueueSetMarkup(this._rootNodeID, markup); + }, + + /** + * Mounts a child with the supplied name. + * + * NOTE: This is part of `updateChildren` and is here for readability. + * + * @param {ReactComponent} child Component to mount. + * @param {string} name Name of the child. + * @param {number} index Index at which to insert the child. + * @param {ReactReconcileTransaction} transaction + * @private + */ + _mountChildByNameAtIndex: function (child, name, index, transaction, context) { + // Inlined for performance, see `ReactInstanceHandles.createReactID`. + var rootID = this._rootNodeID + name; + var mountImage = ReactReconciler.mountComponent(child, rootID, transaction, context); + child._mountIndex = index; + this.createChild(child, mountImage); + }, + + /** + * Unmounts a rendered child. + * + * NOTE: This is part of `updateChildren` and is here for readability. + * + * @param {ReactComponent} child Component to unmount. + * @private + */ + _unmountChild: function (child) { + this.removeChild(child); + child._mountIndex = null; + } + + } + + }; + + module.exports = ReactMultiChild; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 114 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2014-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactChildReconciler + * @typechecks static-only + */ + + 'use strict'; + + var ReactReconciler = __webpack_require__(49); + + var instantiateReactComponent = __webpack_require__(61); + var shouldUpdateReactComponent = __webpack_require__(66); + var traverseAllChildren = __webpack_require__(110); + var warning = __webpack_require__(24); + + function instantiateChild(childInstances, child, name) { + // We found a component instance. + var keyUnique = childInstances[name] === undefined; + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(keyUnique, 'flattenChildren(...): Encountered two children with the same key, ' + '`%s`. Child keys must be unique; when two children share a key, only ' + 'the first child will be used.', name) : undefined; + } + if (child != null && keyUnique) { + childInstances[name] = instantiateReactComponent(child, null); + } + } + + /** + * ReactChildReconciler provides helpers for initializing or updating a set of + * children. Its output is suitable for passing it onto ReactMultiChild which + * does diffed reordering and insertion. + */ + var ReactChildReconciler = { + /** + * Generates a "mount image" for each of the supplied children. In the case + * of `ReactDOMComponent`, a mount image is a string of markup. + * + * @param {?object} nestedChildNodes Nested child maps. + * @return {?object} A set of child instances. + * @internal + */ + instantiateChildren: function (nestedChildNodes, transaction, context) { + if (nestedChildNodes == null) { + return null; + } + var childInstances = {}; + traverseAllChildren(nestedChildNodes, instantiateChild, childInstances); + return childInstances; + }, + + /** + * Updates the rendered children and returns a new set of children. + * + * @param {?object} prevChildren Previously initialized set of children. + * @param {?object} nextChildren Flat child element maps. + * @param {ReactReconcileTransaction} transaction + * @param {object} context + * @return {?object} A new set of child instances. + * @internal + */ + updateChildren: function (prevChildren, nextChildren, transaction, context) { + // We currently don't have a way to track moves here but if we use iterators + // instead of for..in we can zip the iterators and check if an item has + // moved. + // TODO: If nothing has changed, return the prevChildren object so that we + // can quickly bailout if nothing has changed. + if (!nextChildren && !prevChildren) { + return null; + } + var name; + for (name in nextChildren) { + if (!nextChildren.hasOwnProperty(name)) { + continue; + } + var prevChild = prevChildren && prevChildren[name]; + var prevElement = prevChild && prevChild._currentElement; + var nextElement = nextChildren[name]; + if (prevChild != null && shouldUpdateReactComponent(prevElement, nextElement)) { + ReactReconciler.receiveComponent(prevChild, nextElement, transaction, context); + nextChildren[name] = prevChild; + } else { + if (prevChild) { + ReactReconciler.unmountComponent(prevChild, name); + } + // The child must be instantiated before it's mounted. + var nextChildInstance = instantiateReactComponent(nextElement, null); + nextChildren[name] = nextChildInstance; + } + } + // Unmount children that are no longer present. + for (name in prevChildren) { + if (prevChildren.hasOwnProperty(name) && !(nextChildren && nextChildren.hasOwnProperty(name))) { + ReactReconciler.unmountComponent(prevChildren[name]); + } + } + return nextChildren; + }, + + /** + * Unmounts all rendered children. This should be used to clean up children + * when this component is unmounted. + * + * @param {?object} renderedChildren Previously initialized set of children. + * @internal + */ + unmountChildren: function (renderedChildren) { + for (var name in renderedChildren) { + if (renderedChildren.hasOwnProperty(name)) { + var renderedChild = renderedChildren[name]; + ReactReconciler.unmountComponent(renderedChild); + } + } + } + + }; + + module.exports = ReactChildReconciler; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 115 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule flattenChildren + */ + + 'use strict'; + + var traverseAllChildren = __webpack_require__(110); + var warning = __webpack_require__(24); + + /** + * @param {function} traverseContext Context passed through traversal. + * @param {?ReactComponent} child React child component. + * @param {!string} name String name of key path to child. + */ + function flattenSingleChildIntoContext(traverseContext, child, name) { + // We found a component instance. + var result = traverseContext; + var keyUnique = result[name] === undefined; + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(keyUnique, 'flattenChildren(...): Encountered two children with the same key, ' + '`%s`. Child keys must be unique; when two children share a key, only ' + 'the first child will be used.', name) : undefined; + } + if (keyUnique && child != null) { + result[name] = child; + } + } + + /** + * Flattens children that are typically specified as `props.children`. Any null + * children will not be included in the resulting object. + * @return {!object} flattened children keyed by name. + */ + function flattenChildren(children) { + if (children == null) { + return children; + } + var result = {}; + traverseAllChildren(children, flattenSingleChildIntoContext, result); + return result; + } + + module.exports = flattenChildren; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 116 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule shallowEqual + * @typechecks + * + */ + + 'use strict'; + + var hasOwnProperty = Object.prototype.hasOwnProperty; + + /** + * Performs equality by iterating through keys on an object and returning false + * when any key has values which are not strictly equal between the arguments. + * Returns true when the values of all keys are strictly equal. + */ + function shallowEqual(objA, objB) { + if (objA === objB) { + return true; + } + + if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) { + return false; + } + + var keysA = Object.keys(objA); + var keysB = Object.keys(objB); + + if (keysA.length !== keysB.length) { + return false; + } + + // Test for A's keys different from B. + var bHasOwnProperty = hasOwnProperty.bind(objB); + for (var i = 0; i < keysA.length; i++) { + if (!bHasOwnProperty(keysA[i]) || objA[keysA[i]] !== objB[keysA[i]]) { + return false; + } + } + + return true; + } + + module.exports = shallowEqual; + +/***/ }, +/* 117 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactEventListener + * @typechecks static-only + */ + + 'use strict'; + + var EventListener = __webpack_require__(118); + var ExecutionEnvironment = __webpack_require__(8); + var PooledClass = __webpack_require__(55); + var ReactInstanceHandles = __webpack_require__(44); + var ReactMount = __webpack_require__(27); + var ReactUpdates = __webpack_require__(53); + + var assign = __webpack_require__(38); + var getEventTarget = __webpack_require__(80); + var getUnboundedScrollPosition = __webpack_require__(119); + + var DOCUMENT_FRAGMENT_NODE_TYPE = 11; + + /** + * Finds the parent React component of `node`. + * + * @param {*} node + * @return {?DOMEventTarget} Parent container, or `null` if the specified node + * is not nested. + */ + function findParent(node) { + // TODO: It may be a good idea to cache this to prevent unnecessary DOM + // traversal, but caching is difficult to do correctly without using a + // mutation observer to listen for all DOM changes. + var nodeID = ReactMount.getID(node); + var rootID = ReactInstanceHandles.getReactRootIDFromNodeID(nodeID); + var container = ReactMount.findReactContainerForID(rootID); + var parent = ReactMount.getFirstReactDOM(container); + return parent; + } + + // Used to store ancestor hierarchy in top level callback + function TopLevelCallbackBookKeeping(topLevelType, nativeEvent) { + this.topLevelType = topLevelType; + this.nativeEvent = nativeEvent; + this.ancestors = []; + } + assign(TopLevelCallbackBookKeeping.prototype, { + destructor: function () { + this.topLevelType = null; + this.nativeEvent = null; + this.ancestors.length = 0; + } + }); + PooledClass.addPoolingTo(TopLevelCallbackBookKeeping, PooledClass.twoArgumentPooler); + + function handleTopLevelImpl(bookKeeping) { + // TODO: Re-enable event.path handling + // + // if (bookKeeping.nativeEvent.path && bookKeeping.nativeEvent.path.length > 1) { + // // New browsers have a path attribute on native events + // handleTopLevelWithPath(bookKeeping); + // } else { + // // Legacy browsers don't have a path attribute on native events + // handleTopLevelWithoutPath(bookKeeping); + // } + + void handleTopLevelWithPath; // temporarily unused + handleTopLevelWithoutPath(bookKeeping); + } + + // Legacy browsers don't have a path attribute on native events + function handleTopLevelWithoutPath(bookKeeping) { + var topLevelTarget = ReactMount.getFirstReactDOM(getEventTarget(bookKeeping.nativeEvent)) || window; + + // Loop through the hierarchy, in case there's any nested components. + // It's important that we build the array of ancestors before calling any + // event handlers, because event handlers can modify the DOM, leading to + // inconsistencies with ReactMount's node cache. See #1105. + var ancestor = topLevelTarget; + while (ancestor) { + bookKeeping.ancestors.push(ancestor); + ancestor = findParent(ancestor); + } + + for (var i = 0; i < bookKeeping.ancestors.length; i++) { + topLevelTarget = bookKeeping.ancestors[i]; + var topLevelTargetID = ReactMount.getID(topLevelTarget) || ''; + ReactEventListener._handleTopLevel(bookKeeping.topLevelType, topLevelTarget, topLevelTargetID, bookKeeping.nativeEvent, getEventTarget(bookKeeping.nativeEvent)); + } + } + + // New browsers have a path attribute on native events + function handleTopLevelWithPath(bookKeeping) { + var path = bookKeeping.nativeEvent.path; + var currentNativeTarget = path[0]; + var eventsFired = 0; + for (var i = 0; i < path.length; i++) { + var currentPathElement = path[i]; + if (currentPathElement.nodeType === DOCUMENT_FRAGMENT_NODE_TYPE) { + currentNativeTarget = path[i + 1]; + } + // TODO: slow + var reactParent = ReactMount.getFirstReactDOM(currentPathElement); + if (reactParent === currentPathElement) { + var currentPathElementID = ReactMount.getID(currentPathElement); + var newRootID = ReactInstanceHandles.getReactRootIDFromNodeID(currentPathElementID); + bookKeeping.ancestors.push(currentPathElement); + + var topLevelTargetID = ReactMount.getID(currentPathElement) || ''; + eventsFired++; + ReactEventListener._handleTopLevel(bookKeeping.topLevelType, currentPathElement, topLevelTargetID, bookKeeping.nativeEvent, currentNativeTarget); + + // Jump to the root of this React render tree + while (currentPathElementID !== newRootID) { + i++; + currentPathElement = path[i]; + currentPathElementID = ReactMount.getID(currentPathElement); + } + } + } + if (eventsFired === 0) { + ReactEventListener._handleTopLevel(bookKeeping.topLevelType, window, '', bookKeeping.nativeEvent, getEventTarget(bookKeeping.nativeEvent)); + } + } + + function scrollValueMonitor(cb) { + var scrollPosition = getUnboundedScrollPosition(window); + cb(scrollPosition); + } + + var ReactEventListener = { + _enabled: true, + _handleTopLevel: null, + + WINDOW_HANDLE: ExecutionEnvironment.canUseDOM ? window : null, + + setHandleTopLevel: function (handleTopLevel) { + ReactEventListener._handleTopLevel = handleTopLevel; + }, + + setEnabled: function (enabled) { + ReactEventListener._enabled = !!enabled; + }, + + isEnabled: function () { + return ReactEventListener._enabled; + }, + + /** + * Traps top-level events by using event bubbling. + * + * @param {string} topLevelType Record from `EventConstants`. + * @param {string} handlerBaseName Event name (e.g. "click"). + * @param {object} handle Element on which to attach listener. + * @return {?object} An object with a remove function which will forcefully + * remove the listener. + * @internal + */ + trapBubbledEvent: function (topLevelType, handlerBaseName, handle) { + var element = handle; + if (!element) { + return null; + } + return EventListener.listen(element, handlerBaseName, ReactEventListener.dispatchEvent.bind(null, topLevelType)); + }, + + /** + * Traps a top-level event by using event capturing. + * + * @param {string} topLevelType Record from `EventConstants`. + * @param {string} handlerBaseName Event name (e.g. "click"). + * @param {object} handle Element on which to attach listener. + * @return {?object} An object with a remove function which will forcefully + * remove the listener. + * @internal + */ + trapCapturedEvent: function (topLevelType, handlerBaseName, handle) { + var element = handle; + if (!element) { + return null; + } + return EventListener.capture(element, handlerBaseName, ReactEventListener.dispatchEvent.bind(null, topLevelType)); + }, + + monitorScrollValue: function (refresh) { + var callback = scrollValueMonitor.bind(null, refresh); + EventListener.listen(window, 'scroll', callback); + }, + + dispatchEvent: function (topLevelType, nativeEvent) { + if (!ReactEventListener._enabled) { + return; + } + + var bookKeeping = TopLevelCallbackBookKeeping.getPooled(topLevelType, nativeEvent); + try { + // Event queue being processed in the same cycle allows + // `preventDefault`. + ReactUpdates.batchedUpdates(handleTopLevelImpl, bookKeeping); + } finally { + TopLevelCallbackBookKeeping.release(bookKeeping); + } + } + }; + + module.exports = ReactEventListener; + +/***/ }, +/* 118 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule EventListener + * @typechecks + */ + + 'use strict'; + + var emptyFunction = __webpack_require__(14); + + /** + * Upstream version of event listener. Does not take into account specific + * nature of platform. + */ + var EventListener = { + /** + * Listen to DOM events during the bubble phase. + * + * @param {DOMEventTarget} target DOM element to register listener on. + * @param {string} eventType Event type, e.g. 'click' or 'mouseover'. + * @param {function} callback Callback function. + * @return {object} Object with a `remove` method. + */ + listen: function (target, eventType, callback) { + if (target.addEventListener) { + target.addEventListener(eventType, callback, false); + return { + remove: function () { + target.removeEventListener(eventType, callback, false); + } + }; + } else if (target.attachEvent) { + target.attachEvent('on' + eventType, callback); + return { + remove: function () { + target.detachEvent('on' + eventType, callback); + } + }; + } + }, + + /** + * Listen to DOM events during the capture phase. + * + * @param {DOMEventTarget} target DOM element to register listener on. + * @param {string} eventType Event type, e.g. 'click' or 'mouseover'. + * @param {function} callback Callback function. + * @return {object} Object with a `remove` method. + */ + capture: function (target, eventType, callback) { + if (target.addEventListener) { + target.addEventListener(eventType, callback, true); + return { + remove: function () { + target.removeEventListener(eventType, callback, true); + } + }; + } else { + if (process.env.NODE_ENV !== 'production') { + console.error('Attempted to listen to events during the capture phase on a ' + 'browser that does not support the capture phase. Your application ' + 'will not receive some events.'); + } + return { + remove: emptyFunction + }; + } + }, + + registerDefault: function () {} + }; + + module.exports = EventListener; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 119 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule getUnboundedScrollPosition + * @typechecks + */ + + 'use strict'; + + /** + * Gets the scroll position of the supplied element or window. + * + * The return values are unbounded, unlike `getScrollPosition`. This means they + * may be negative or exceed the element boundaries (which is possible using + * inertial scrolling). + * + * @param {DOMWindow|DOMElement} scrollable + * @return {object} Map with `x` and `y` keys. + */ + function getUnboundedScrollPosition(scrollable) { + if (scrollable === window) { + return { + x: window.pageXOffset || document.documentElement.scrollLeft, + y: window.pageYOffset || document.documentElement.scrollTop + }; + } + return { + x: scrollable.scrollLeft, + y: scrollable.scrollTop + }; + } + + module.exports = getUnboundedScrollPosition; + +/***/ }, +/* 120 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactInjection + */ + + 'use strict'; + + var DOMProperty = __webpack_require__(22); + var EventPluginHub = __webpack_require__(30); + var ReactComponentEnvironment = __webpack_require__(63); + var ReactClass = __webpack_require__(121); + var ReactEmptyComponent = __webpack_require__(67); + var ReactBrowserEventEmitter = __webpack_require__(28); + var ReactNativeComponent = __webpack_require__(68); + var ReactPerf = __webpack_require__(17); + var ReactRootIndex = __webpack_require__(45); + var ReactUpdates = __webpack_require__(53); + + var ReactInjection = { + Component: ReactComponentEnvironment.injection, + Class: ReactClass.injection, + DOMProperty: DOMProperty.injection, + EmptyComponent: ReactEmptyComponent.injection, + EventPluginHub: EventPluginHub.injection, + EventEmitter: ReactBrowserEventEmitter.injection, + NativeComponent: ReactNativeComponent.injection, + Perf: ReactPerf.injection, + RootIndex: ReactRootIndex.injection, + Updates: ReactUpdates.injection + }; + + module.exports = ReactInjection; + +/***/ }, +/* 121 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactClass + */ + + 'use strict'; + + var ReactComponent = __webpack_require__(122); + var ReactElement = __webpack_require__(41); + var ReactPropTypeLocations = __webpack_require__(64); + var ReactPropTypeLocationNames = __webpack_require__(65); + var ReactNoopUpdateQueue = __webpack_require__(123); + + var assign = __webpack_require__(38); + var emptyObject = __webpack_require__(57); + var invariant = __webpack_require__(12); + var keyMirror = __webpack_require__(16); + var keyOf = __webpack_require__(78); + var warning = __webpack_require__(24); + + var MIXINS_KEY = keyOf({ mixins: null }); + + /** + * Policies that describe methods in `ReactClassInterface`. + */ + var SpecPolicy = keyMirror({ + /** + * These methods may be defined only once by the class specification or mixin. + */ + DEFINE_ONCE: null, + /** + * These methods may be defined by both the class specification and mixins. + * Subsequent definitions will be chained. These methods must return void. + */ + DEFINE_MANY: null, + /** + * These methods are overriding the base class. + */ + OVERRIDE_BASE: null, + /** + * These methods are similar to DEFINE_MANY, except we assume they return + * objects. We try to merge the keys of the return values of all the mixed in + * functions. If there is a key conflict we throw. + */ + DEFINE_MANY_MERGED: null + }); + + var injectedMixins = []; + + var warnedSetProps = false; + function warnSetProps() { + if (!warnedSetProps) { + warnedSetProps = true; + process.env.NODE_ENV !== 'production' ? warning(false, 'setProps(...) and replaceProps(...) are deprecated. ' + 'Instead, call render again at the top level.') : undefined; + } + } + + /** + * Composite components are higher-level components that compose other composite + * or native components. + * + * To create a new type of `ReactClass`, pass a specification of + * your new class to `React.createClass`. The only requirement of your class + * specification is that you implement a `render` method. + * + * var MyComponent = React.createClass({ + * render: function() { + * return <div>Hello World</div>; + * } + * }); + * + * The class specification supports a specific protocol of methods that have + * special meaning (e.g. `render`). See `ReactClassInterface` for + * more the comprehensive protocol. Any other properties and methods in the + * class specification will be available on the prototype. + * + * @interface ReactClassInterface + * @internal + */ + var ReactClassInterface = { + + /** + * An array of Mixin objects to include when defining your component. + * + * @type {array} + * @optional + */ + mixins: SpecPolicy.DEFINE_MANY, + + /** + * An object containing properties and methods that should be defined on + * the component's constructor instead of its prototype (static methods). + * + * @type {object} + * @optional + */ + statics: SpecPolicy.DEFINE_MANY, + + /** + * Definition of prop types for this component. + * + * @type {object} + * @optional + */ + propTypes: SpecPolicy.DEFINE_MANY, + + /** + * Definition of context types for this component. + * + * @type {object} + * @optional + */ + contextTypes: SpecPolicy.DEFINE_MANY, + + /** + * Definition of context types this component sets for its children. + * + * @type {object} + * @optional + */ + childContextTypes: SpecPolicy.DEFINE_MANY, + + // ==== Definition methods ==== + + /** + * Invoked when the component is mounted. Values in the mapping will be set on + * `this.props` if that prop is not specified (i.e. using an `in` check). + * + * This method is invoked before `getInitialState` and therefore cannot rely + * on `this.state` or use `this.setState`. + * + * @return {object} + * @optional + */ + getDefaultProps: SpecPolicy.DEFINE_MANY_MERGED, + + /** + * Invoked once before the component is mounted. The return value will be used + * as the initial value of `this.state`. + * + * getInitialState: function() { + * return { + * isOn: false, + * fooBaz: new BazFoo() + * } + * } + * + * @return {object} + * @optional + */ + getInitialState: SpecPolicy.DEFINE_MANY_MERGED, + + /** + * @return {object} + * @optional + */ + getChildContext: SpecPolicy.DEFINE_MANY_MERGED, + + /** + * Uses props from `this.props` and state from `this.state` to render the + * structure of the component. + * + * No guarantees are made about when or how often this method is invoked, so + * it must not have side effects. + * + * render: function() { + * var name = this.props.name; + * return <div>Hello, {name}!</div>; + * } + * + * @return {ReactComponent} + * @nosideeffects + * @required + */ + render: SpecPolicy.DEFINE_ONCE, + + // ==== Delegate methods ==== + + /** + * Invoked when the component is initially created and about to be mounted. + * This may have side effects, but any external subscriptions or data created + * by this method must be cleaned up in `componentWillUnmount`. + * + * @optional + */ + componentWillMount: SpecPolicy.DEFINE_MANY, + + /** + * Invoked when the component has been mounted and has a DOM representation. + * However, there is no guarantee that the DOM node is in the document. + * + * Use this as an opportunity to operate on the DOM when the component has + * been mounted (initialized and rendered) for the first time. + * + * @param {DOMElement} rootNode DOM element representing the component. + * @optional + */ + componentDidMount: SpecPolicy.DEFINE_MANY, + + /** + * Invoked before the component receives new props. + * + * Use this as an opportunity to react to a prop transition by updating the + * state using `this.setState`. Current props are accessed via `this.props`. + * + * componentWillReceiveProps: function(nextProps, nextContext) { + * this.setState({ + * likesIncreasing: nextProps.likeCount > this.props.likeCount + * }); + * } + * + * NOTE: There is no equivalent `componentWillReceiveState`. An incoming prop + * transition may cause a state change, but the opposite is not true. If you + * need it, you are probably looking for `componentWillUpdate`. + * + * @param {object} nextProps + * @optional + */ + componentWillReceiveProps: SpecPolicy.DEFINE_MANY, + + /** + * Invoked while deciding if the component should be updated as a result of + * receiving new props, state and/or context. + * + * Use this as an opportunity to `return false` when you're certain that the + * transition to the new props/state/context will not require a component + * update. + * + * shouldComponentUpdate: function(nextProps, nextState, nextContext) { + * return !equal(nextProps, this.props) || + * !equal(nextState, this.state) || + * !equal(nextContext, this.context); + * } + * + * @param {object} nextProps + * @param {?object} nextState + * @param {?object} nextContext + * @return {boolean} True if the component should update. + * @optional + */ + shouldComponentUpdate: SpecPolicy.DEFINE_ONCE, + + /** + * Invoked when the component is about to update due to a transition from + * `this.props`, `this.state` and `this.context` to `nextProps`, `nextState` + * and `nextContext`. + * + * Use this as an opportunity to perform preparation before an update occurs. + * + * NOTE: You **cannot** use `this.setState()` in this method. + * + * @param {object} nextProps + * @param {?object} nextState + * @param {?object} nextContext + * @param {ReactReconcileTransaction} transaction + * @optional + */ + componentWillUpdate: SpecPolicy.DEFINE_MANY, + + /** + * Invoked when the component's DOM representation has been updated. + * + * Use this as an opportunity to operate on the DOM when the component has + * been updated. + * + * @param {object} prevProps + * @param {?object} prevState + * @param {?object} prevContext + * @param {DOMElement} rootNode DOM element representing the component. + * @optional + */ + componentDidUpdate: SpecPolicy.DEFINE_MANY, + + /** + * Invoked when the component is about to be removed from its parent and have + * its DOM representation destroyed. + * + * Use this as an opportunity to deallocate any external resources. + * + * NOTE: There is no `componentDidUnmount` since your component will have been + * destroyed by that point. + * + * @optional + */ + componentWillUnmount: SpecPolicy.DEFINE_MANY, + + // ==== Advanced methods ==== + + /** + * Updates the component's currently mounted DOM representation. + * + * By default, this implements React's rendering and reconciliation algorithm. + * Sophisticated clients may wish to override this. + * + * @param {ReactReconcileTransaction} transaction + * @internal + * @overridable + */ + updateComponent: SpecPolicy.OVERRIDE_BASE + + }; + + /** + * Mapping from class specification keys to special processing functions. + * + * Although these are declared like instance properties in the specification + * when defining classes using `React.createClass`, they are actually static + * and are accessible on the constructor instead of the prototype. Despite + * being static, they must be defined outside of the "statics" key under + * which all other static methods are defined. + */ + var RESERVED_SPEC_KEYS = { + displayName: function (Constructor, displayName) { + Constructor.displayName = displayName; + }, + mixins: function (Constructor, mixins) { + if (mixins) { + for (var i = 0; i < mixins.length; i++) { + mixSpecIntoComponent(Constructor, mixins[i]); + } + } + }, + childContextTypes: function (Constructor, childContextTypes) { + if (process.env.NODE_ENV !== 'production') { + validateTypeDef(Constructor, childContextTypes, ReactPropTypeLocations.childContext); + } + Constructor.childContextTypes = assign({}, Constructor.childContextTypes, childContextTypes); + }, + contextTypes: function (Constructor, contextTypes) { + if (process.env.NODE_ENV !== 'production') { + validateTypeDef(Constructor, contextTypes, ReactPropTypeLocations.context); + } + Constructor.contextTypes = assign({}, Constructor.contextTypes, contextTypes); + }, + /** + * Special case getDefaultProps which should move into statics but requires + * automatic merging. + */ + getDefaultProps: function (Constructor, getDefaultProps) { + if (Constructor.getDefaultProps) { + Constructor.getDefaultProps = createMergedResultFunction(Constructor.getDefaultProps, getDefaultProps); + } else { + Constructor.getDefaultProps = getDefaultProps; + } + }, + propTypes: function (Constructor, propTypes) { + if (process.env.NODE_ENV !== 'production') { + validateTypeDef(Constructor, propTypes, ReactPropTypeLocations.prop); + } + Constructor.propTypes = assign({}, Constructor.propTypes, propTypes); + }, + statics: function (Constructor, statics) { + mixStaticSpecIntoComponent(Constructor, statics); + }, + autobind: function () {} }; + + // noop + function validateTypeDef(Constructor, typeDef, location) { + for (var propName in typeDef) { + if (typeDef.hasOwnProperty(propName)) { + // use a warning instead of an invariant so components + // don't show up in prod but not in __DEV__ + process.env.NODE_ENV !== 'production' ? warning(typeof typeDef[propName] === 'function', '%s: %s type `%s` is invalid; it must be a function, usually from ' + 'React.PropTypes.', Constructor.displayName || 'ReactClass', ReactPropTypeLocationNames[location], propName) : undefined; + } + } + } + + function validateMethodOverride(proto, name) { + var specPolicy = ReactClassInterface.hasOwnProperty(name) ? ReactClassInterface[name] : null; + + // Disallow overriding of base class methods unless explicitly allowed. + if (ReactClassMixin.hasOwnProperty(name)) { + !(specPolicy === SpecPolicy.OVERRIDE_BASE) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClassInterface: You are attempting to override ' + '`%s` from your class specification. Ensure that your method names ' + 'do not overlap with React methods.', name) : invariant(false) : undefined; + } + + // Disallow defining methods more than once unless explicitly allowed. + if (proto.hasOwnProperty(name)) { + !(specPolicy === SpecPolicy.DEFINE_MANY || specPolicy === SpecPolicy.DEFINE_MANY_MERGED) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClassInterface: You are attempting to define ' + '`%s` on your component more than once. This conflict may be due ' + 'to a mixin.', name) : invariant(false) : undefined; + } + } + + /** + * Mixin helper which handles policy validation and reserved + * specification keys when building React classses. + */ + function mixSpecIntoComponent(Constructor, spec) { + if (!spec) { + return; + } + + !(typeof spec !== 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClass: You\'re attempting to ' + 'use a component class as a mixin. Instead, just use a regular object.') : invariant(false) : undefined; + !!ReactElement.isValidElement(spec) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClass: You\'re attempting to ' + 'use a component as a mixin. Instead, just use a regular object.') : invariant(false) : undefined; + + var proto = Constructor.prototype; + + // By handling mixins before any other properties, we ensure the same + // chaining order is applied to methods with DEFINE_MANY policy, whether + // mixins are listed before or after these methods in the spec. + if (spec.hasOwnProperty(MIXINS_KEY)) { + RESERVED_SPEC_KEYS.mixins(Constructor, spec.mixins); + } + + for (var name in spec) { + if (!spec.hasOwnProperty(name)) { + continue; + } + + if (name === MIXINS_KEY) { + // We have already handled mixins in a special case above. + continue; + } + + var property = spec[name]; + validateMethodOverride(proto, name); + + if (RESERVED_SPEC_KEYS.hasOwnProperty(name)) { + RESERVED_SPEC_KEYS[name](Constructor, property); + } else { + // Setup methods on prototype: + // The following member methods should not be automatically bound: + // 1. Expected ReactClass methods (in the "interface"). + // 2. Overridden methods (that were mixed in). + var isReactClassMethod = ReactClassInterface.hasOwnProperty(name); + var isAlreadyDefined = proto.hasOwnProperty(name); + var isFunction = typeof property === 'function'; + var shouldAutoBind = isFunction && !isReactClassMethod && !isAlreadyDefined && spec.autobind !== false; + + if (shouldAutoBind) { + if (!proto.__reactAutoBindMap) { + proto.__reactAutoBindMap = {}; + } + proto.__reactAutoBindMap[name] = property; + proto[name] = property; + } else { + if (isAlreadyDefined) { + var specPolicy = ReactClassInterface[name]; + + // These cases should already be caught by validateMethodOverride. + !(isReactClassMethod && (specPolicy === SpecPolicy.DEFINE_MANY_MERGED || specPolicy === SpecPolicy.DEFINE_MANY)) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClass: Unexpected spec policy %s for key %s ' + 'when mixing in component specs.', specPolicy, name) : invariant(false) : undefined; + + // For methods which are defined more than once, call the existing + // methods before calling the new property, merging if appropriate. + if (specPolicy === SpecPolicy.DEFINE_MANY_MERGED) { + proto[name] = createMergedResultFunction(proto[name], property); + } else if (specPolicy === SpecPolicy.DEFINE_MANY) { + proto[name] = createChainedFunction(proto[name], property); + } + } else { + proto[name] = property; + if (process.env.NODE_ENV !== 'production') { + // Add verbose displayName to the function, which helps when looking + // at profiling tools. + if (typeof property === 'function' && spec.displayName) { + proto[name].displayName = spec.displayName + '_' + name; + } + } + } + } + } + } + } + + function mixStaticSpecIntoComponent(Constructor, statics) { + if (!statics) { + return; + } + for (var name in statics) { + var property = statics[name]; + if (!statics.hasOwnProperty(name)) { + continue; + } + + var isReserved = (name in RESERVED_SPEC_KEYS); + !!isReserved ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClass: You are attempting to define a reserved ' + 'property, `%s`, that shouldn\'t be on the "statics" key. Define it ' + 'as an instance property instead; it will still be accessible on the ' + 'constructor.', name) : invariant(false) : undefined; + + var isInherited = (name in Constructor); + !!isInherited ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClass: You are attempting to define ' + '`%s` on your component more than once. This conflict may be ' + 'due to a mixin.', name) : invariant(false) : undefined; + Constructor[name] = property; + } + } + + /** + * Merge two objects, but throw if both contain the same key. + * + * @param {object} one The first object, which is mutated. + * @param {object} two The second object + * @return {object} one after it has been mutated to contain everything in two. + */ + function mergeIntoWithNoDuplicateKeys(one, two) { + !(one && two && typeof one === 'object' && typeof two === 'object') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects.') : invariant(false) : undefined; + + for (var key in two) { + if (two.hasOwnProperty(key)) { + !(one[key] === undefined) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'mergeIntoWithNoDuplicateKeys(): ' + 'Tried to merge two objects with the same key: `%s`. This conflict ' + 'may be due to a mixin; in particular, this may be caused by two ' + 'getInitialState() or getDefaultProps() methods returning objects ' + 'with clashing keys.', key) : invariant(false) : undefined; + one[key] = two[key]; + } + } + return one; + } + + /** + * Creates a function that invokes two functions and merges their return values. + * + * @param {function} one Function to invoke first. + * @param {function} two Function to invoke second. + * @return {function} Function that invokes the two argument functions. + * @private + */ + function createMergedResultFunction(one, two) { + return function mergedResult() { + var a = one.apply(this, arguments); + var b = two.apply(this, arguments); + if (a == null) { + return b; + } else if (b == null) { + return a; + } + var c = {}; + mergeIntoWithNoDuplicateKeys(c, a); + mergeIntoWithNoDuplicateKeys(c, b); + return c; + }; + } + + /** + * Creates a function that invokes two functions and ignores their return vales. + * + * @param {function} one Function to invoke first. + * @param {function} two Function to invoke second. + * @return {function} Function that invokes the two argument functions. + * @private + */ + function createChainedFunction(one, two) { + return function chainedFunction() { + one.apply(this, arguments); + two.apply(this, arguments); + }; + } + + /** + * Binds a method to the component. + * + * @param {object} component Component whose method is going to be bound. + * @param {function} method Method to be bound. + * @return {function} The bound method. + */ + function bindAutoBindMethod(component, method) { + var boundMethod = method.bind(component); + if (process.env.NODE_ENV !== 'production') { + boundMethod.__reactBoundContext = component; + boundMethod.__reactBoundMethod = method; + boundMethod.__reactBoundArguments = null; + var componentName = component.constructor.displayName; + var _bind = boundMethod.bind; + /* eslint-disable block-scoped-var, no-undef */ + boundMethod.bind = function (newThis) { + for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + // User is trying to bind() an autobound method; we effectively will + // ignore the value of "this" that the user is trying to use, so + // let's warn. + if (newThis !== component && newThis !== null) { + process.env.NODE_ENV !== 'production' ? warning(false, 'bind(): React component methods may only be bound to the ' + 'component instance. See %s', componentName) : undefined; + } else if (!args.length) { + process.env.NODE_ENV !== 'production' ? warning(false, 'bind(): You are binding a component method to the component. ' + 'React does this for you automatically in a high-performance ' + 'way, so you can safely remove this call. See %s', componentName) : undefined; + return boundMethod; + } + var reboundMethod = _bind.apply(boundMethod, arguments); + reboundMethod.__reactBoundContext = component; + reboundMethod.__reactBoundMethod = method; + reboundMethod.__reactBoundArguments = args; + return reboundMethod; + /* eslint-enable */ + }; + } + return boundMethod; + } + + /** + * Binds all auto-bound methods in a component. + * + * @param {object} component Component whose method is going to be bound. + */ + function bindAutoBindMethods(component) { + for (var autoBindKey in component.__reactAutoBindMap) { + if (component.__reactAutoBindMap.hasOwnProperty(autoBindKey)) { + var method = component.__reactAutoBindMap[autoBindKey]; + component[autoBindKey] = bindAutoBindMethod(component, method); + } + } + } + + /** + * Add more to the ReactClass base class. These are all legacy features and + * therefore not already part of the modern ReactComponent. + */ + var ReactClassMixin = { + + /** + * TODO: This will be deprecated because state should always keep a consistent + * type signature and the only use case for this, is to avoid that. + */ + replaceState: function (newState, callback) { + this.updater.enqueueReplaceState(this, newState); + if (callback) { + this.updater.enqueueCallback(this, callback); + } + }, + + /** + * Checks whether or not this composite component is mounted. + * @return {boolean} True if mounted, false otherwise. + * @protected + * @final + */ + isMounted: function () { + return this.updater.isMounted(this); + }, + + /** + * Sets a subset of the props. + * + * @param {object} partialProps Subset of the next props. + * @param {?function} callback Called after props are updated. + * @final + * @public + * @deprecated + */ + setProps: function (partialProps, callback) { + if (process.env.NODE_ENV !== 'production') { + warnSetProps(); + } + this.updater.enqueueSetProps(this, partialProps); + if (callback) { + this.updater.enqueueCallback(this, callback); + } + }, + + /** + * Replace all the props. + * + * @param {object} newProps Subset of the next props. + * @param {?function} callback Called after props are updated. + * @final + * @public + * @deprecated + */ + replaceProps: function (newProps, callback) { + if (process.env.NODE_ENV !== 'production') { + warnSetProps(); + } + this.updater.enqueueReplaceProps(this, newProps); + if (callback) { + this.updater.enqueueCallback(this, callback); + } + } + }; + + var ReactClassComponent = function () {}; + assign(ReactClassComponent.prototype, ReactComponent.prototype, ReactClassMixin); + + /** + * Module for creating composite components. + * + * @class ReactClass + */ + var ReactClass = { + + /** + * Creates a composite component class given a class specification. + * + * @param {object} spec Class specification (which must define `render`). + * @return {function} Component constructor function. + * @public + */ + createClass: function (spec) { + var Constructor = function (props, context, updater) { + // This constructor is overridden by mocks. The argument is used + // by mocks to assert on what gets mounted. + + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(this instanceof Constructor, 'Something is calling a React component directly. Use a factory or ' + 'JSX instead. See: https://fb.me/react-legacyfactory') : undefined; + } + + // Wire up auto-binding + if (this.__reactAutoBindMap) { + bindAutoBindMethods(this); + } + + this.props = props; + this.context = context; + this.refs = emptyObject; + this.updater = updater || ReactNoopUpdateQueue; + + this.state = null; + + // ReactClasses doesn't have constructors. Instead, they use the + // getInitialState and componentWillMount methods for initialization. + + var initialState = this.getInitialState ? this.getInitialState() : null; + if (process.env.NODE_ENV !== 'production') { + // We allow auto-mocks to proceed as if they're returning null. + if (typeof initialState === 'undefined' && this.getInitialState._isMockFunction) { + // This is probably bad practice. Consider warning here and + // deprecating this convenience. + initialState = null; + } + } + !(typeof initialState === 'object' && !Array.isArray(initialState)) ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s.getInitialState(): must return an object or null', Constructor.displayName || 'ReactCompositeComponent') : invariant(false) : undefined; + + this.state = initialState; + }; + Constructor.prototype = new ReactClassComponent(); + Constructor.prototype.constructor = Constructor; + + injectedMixins.forEach(mixSpecIntoComponent.bind(null, Constructor)); + + mixSpecIntoComponent(Constructor, spec); + + // Initialize the defaultProps property after all mixins have been merged. + if (Constructor.getDefaultProps) { + Constructor.defaultProps = Constructor.getDefaultProps(); + } + + if (process.env.NODE_ENV !== 'production') { + // This is a tag to indicate that the use of these method names is ok, + // since it's used with createClass. If it's not, then it's likely a + // mistake so we'll warn you to use the static property, property + // initializer or constructor respectively. + if (Constructor.getDefaultProps) { + Constructor.getDefaultProps.isReactClassApproved = {}; + } + if (Constructor.prototype.getInitialState) { + Constructor.prototype.getInitialState.isReactClassApproved = {}; + } + } + + !Constructor.prototype.render ? process.env.NODE_ENV !== 'production' ? invariant(false, 'createClass(...): Class specification must implement a `render` method.') : invariant(false) : undefined; + + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(!Constructor.prototype.componentShouldUpdate, '%s has a method called ' + 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' + 'The name is phrased as a question because the function is ' + 'expected to return a value.', spec.displayName || 'A component') : undefined; + process.env.NODE_ENV !== 'production' ? warning(!Constructor.prototype.componentWillRecieveProps, '%s has a method called ' + 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', spec.displayName || 'A component') : undefined; + } + + // Reduce time spent doing lookups by setting these on the prototype. + for (var methodName in ReactClassInterface) { + if (!Constructor.prototype[methodName]) { + Constructor.prototype[methodName] = null; + } + } + + return Constructor; + }, + + injection: { + injectMixin: function (mixin) { + injectedMixins.push(mixin); + } + } + + }; + + module.exports = ReactClass; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 122 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactComponent + */ + + 'use strict'; + + var ReactNoopUpdateQueue = __webpack_require__(123); + + var canDefineProperty = __webpack_require__(42); + var emptyObject = __webpack_require__(57); + var invariant = __webpack_require__(12); + var warning = __webpack_require__(24); + + /** + * Base class helpers for the updating state of a component. + */ + function ReactComponent(props, context, updater) { + this.props = props; + this.context = context; + this.refs = emptyObject; + // We initialize the default updater but the real one gets injected by the + // renderer. + this.updater = updater || ReactNoopUpdateQueue; + } + + ReactComponent.prototype.isReactComponent = {}; + + /** + * Sets a subset of the state. Always use this to mutate + * state. You should treat `this.state` as immutable. + * + * There is no guarantee that `this.state` will be immediately updated, so + * accessing `this.state` after calling this method may return the old value. + * + * There is no guarantee that calls to `setState` will run synchronously, + * as they may eventually be batched together. You can provide an optional + * callback that will be executed when the call to setState is actually + * completed. + * + * When a function is provided to setState, it will be called at some point in + * the future (not synchronously). It will be called with the up to date + * component arguments (state, props, context). These values can be different + * from this.* because your function may be called after receiveProps but before + * shouldComponentUpdate, and this new state, props, and context will not yet be + * assigned to this. + * + * @param {object|function} partialState Next partial state or function to + * produce next partial state to be merged with current state. + * @param {?function} callback Called after state is updated. + * @final + * @protected + */ + ReactComponent.prototype.setState = function (partialState, callback) { + !(typeof partialState === 'object' || typeof partialState === 'function' || partialState == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'setState(...): takes an object of state variables to update or a ' + 'function which returns an object of state variables.') : invariant(false) : undefined; + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(partialState != null, 'setState(...): You passed an undefined or null state object; ' + 'instead, use forceUpdate().') : undefined; + } + this.updater.enqueueSetState(this, partialState); + if (callback) { + this.updater.enqueueCallback(this, callback); + } + }; + + /** + * Forces an update. This should only be invoked when it is known with + * certainty that we are **not** in a DOM transaction. + * + * You may want to call this when you know that some deeper aspect of the + * component's state has changed but `setState` was not called. + * + * This will not invoke `shouldComponentUpdate`, but it will invoke + * `componentWillUpdate` and `componentDidUpdate`. + * + * @param {?function} callback Called after update is complete. + * @final + * @protected + */ + ReactComponent.prototype.forceUpdate = function (callback) { + this.updater.enqueueForceUpdate(this); + if (callback) { + this.updater.enqueueCallback(this, callback); + } + }; + + /** + * Deprecated APIs. These APIs used to exist on classic React classes but since + * we would like to deprecate them, we're not going to move them over to this + * modern base class. Instead, we define a getter that warns if it's accessed. + */ + if (process.env.NODE_ENV !== 'production') { + var deprecatedAPIs = { + getDOMNode: ['getDOMNode', 'Use ReactDOM.findDOMNode(component) instead.'], + isMounted: ['isMounted', 'Instead, make sure to clean up subscriptions and pending requests in ' + 'componentWillUnmount to prevent memory leaks.'], + replaceProps: ['replaceProps', 'Instead, call render again at the top level.'], + replaceState: ['replaceState', 'Refactor your code to use setState instead (see ' + 'https://github.com/facebook/react/issues/3236).'], + setProps: ['setProps', 'Instead, call render again at the top level.'] + }; + var defineDeprecationWarning = function (methodName, info) { + if (canDefineProperty) { + Object.defineProperty(ReactComponent.prototype, methodName, { + get: function () { + process.env.NODE_ENV !== 'production' ? warning(false, '%s(...) is deprecated in plain JavaScript React classes. %s', info[0], info[1]) : undefined; + return undefined; + } + }); + } + }; + for (var fnName in deprecatedAPIs) { + if (deprecatedAPIs.hasOwnProperty(fnName)) { + defineDeprecationWarning(fnName, deprecatedAPIs[fnName]); + } + } + } + + module.exports = ReactComponent; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 123 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactNoopUpdateQueue + */ + + 'use strict'; + + var warning = __webpack_require__(24); + + function warnTDZ(publicInstance, callerName) { + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(false, '%s(...): Can only update a mounted or mounting component. ' + 'This usually means you called %s() on an unmounted component. ' + 'This is a no-op. Please check the code for the %s component.', callerName, callerName, publicInstance.constructor && publicInstance.constructor.displayName || '') : undefined; + } + } + + /** + * This is the abstract API for an update queue. + */ + var ReactNoopUpdateQueue = { + + /** + * Checks whether or not this composite component is mounted. + * @param {ReactClass} publicInstance The instance we want to test. + * @return {boolean} True if mounted, false otherwise. + * @protected + * @final + */ + isMounted: function (publicInstance) { + return false; + }, + + /** + * Enqueue a callback that will be executed after all the pending updates + * have processed. + * + * @param {ReactClass} publicInstance The instance to use as `this` context. + * @param {?function} callback Called after state is updated. + * @internal + */ + enqueueCallback: function (publicInstance, callback) {}, + + /** + * Forces an update. This should only be invoked when it is known with + * certainty that we are **not** in a DOM transaction. + * + * You may want to call this when you know that some deeper aspect of the + * component's state has changed but `setState` was not called. + * + * This will not invoke `shouldComponentUpdate`, but it will invoke + * `componentWillUpdate` and `componentDidUpdate`. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @internal + */ + enqueueForceUpdate: function (publicInstance) { + warnTDZ(publicInstance, 'forceUpdate'); + }, + + /** + * Replaces all of the state. Always use this or `setState` to mutate state. + * You should treat `this.state` as immutable. + * + * There is no guarantee that `this.state` will be immediately updated, so + * accessing `this.state` after calling this method may return the old value. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {object} completeState Next state. + * @internal + */ + enqueueReplaceState: function (publicInstance, completeState) { + warnTDZ(publicInstance, 'replaceState'); + }, + + /** + * Sets a subset of the state. This only exists because _pendingState is + * internal. This provides a merging strategy that is not available to deep + * properties which is confusing. TODO: Expose pendingState or don't use it + * during the merge. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {object} partialState Next partial state to be merged with state. + * @internal + */ + enqueueSetState: function (publicInstance, partialState) { + warnTDZ(publicInstance, 'setState'); + }, + + /** + * Sets a subset of the props. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {object} partialProps Subset of the next props. + * @internal + */ + enqueueSetProps: function (publicInstance, partialProps) { + warnTDZ(publicInstance, 'setProps'); + }, + + /** + * Replaces all of the props. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {object} props New props. + * @internal + */ + enqueueReplaceProps: function (publicInstance, props) { + warnTDZ(publicInstance, 'replaceProps'); + } + + }; + + module.exports = ReactNoopUpdateQueue; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 124 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactReconcileTransaction + * @typechecks static-only + */ + + 'use strict'; + + var CallbackQueue = __webpack_require__(54); + var PooledClass = __webpack_require__(55); + var ReactBrowserEventEmitter = __webpack_require__(28); + var ReactDOMFeatureFlags = __webpack_require__(40); + var ReactInputSelection = __webpack_require__(125); + var Transaction = __webpack_require__(56); + + var assign = __webpack_require__(38); + + /** + * Ensures that, when possible, the selection range (currently selected text + * input) is not disturbed by performing the transaction. + */ + var SELECTION_RESTORATION = { + /** + * @return {Selection} Selection information. + */ + initialize: ReactInputSelection.getSelectionInformation, + /** + * @param {Selection} sel Selection information returned from `initialize`. + */ + close: ReactInputSelection.restoreSelection + }; + + /** + * Suppresses events (blur/focus) that could be inadvertently dispatched due to + * high level DOM manipulations (like temporarily removing a text input from the + * DOM). + */ + var EVENT_SUPPRESSION = { + /** + * @return {boolean} The enabled status of `ReactBrowserEventEmitter` before + * the reconciliation. + */ + initialize: function () { + var currentlyEnabled = ReactBrowserEventEmitter.isEnabled(); + ReactBrowserEventEmitter.setEnabled(false); + return currentlyEnabled; + }, + + /** + * @param {boolean} previouslyEnabled Enabled status of + * `ReactBrowserEventEmitter` before the reconciliation occurred. `close` + * restores the previous value. + */ + close: function (previouslyEnabled) { + ReactBrowserEventEmitter.setEnabled(previouslyEnabled); + } + }; + + /** + * Provides a queue for collecting `componentDidMount` and + * `componentDidUpdate` callbacks during the the transaction. + */ + var ON_DOM_READY_QUEUEING = { + /** + * Initializes the internal `onDOMReady` queue. + */ + initialize: function () { + this.reactMountReady.reset(); + }, + + /** + * After DOM is flushed, invoke all registered `onDOMReady` callbacks. + */ + close: function () { + this.reactMountReady.notifyAll(); + } + }; + + /** + * Executed within the scope of the `Transaction` instance. Consider these as + * being member methods, but with an implied ordering while being isolated from + * each other. + */ + var TRANSACTION_WRAPPERS = [SELECTION_RESTORATION, EVENT_SUPPRESSION, ON_DOM_READY_QUEUEING]; + + /** + * Currently: + * - The order that these are listed in the transaction is critical: + * - Suppresses events. + * - Restores selection range. + * + * Future: + * - Restore document/overflow scroll positions that were unintentionally + * modified via DOM insertions above the top viewport boundary. + * - Implement/integrate with customized constraint based layout system and keep + * track of which dimensions must be remeasured. + * + * @class ReactReconcileTransaction + */ + function ReactReconcileTransaction(forceHTML) { + this.reinitializeTransaction(); + // Only server-side rendering really needs this option (see + // `ReactServerRendering`), but server-side uses + // `ReactServerRenderingTransaction` instead. This option is here so that it's + // accessible and defaults to false when `ReactDOMComponent` and + // `ReactTextComponent` checks it in `mountComponent`.` + this.renderToStaticMarkup = false; + this.reactMountReady = CallbackQueue.getPooled(null); + this.useCreateElement = !forceHTML && ReactDOMFeatureFlags.useCreateElement; + } + + var Mixin = { + /** + * @see Transaction + * @abstract + * @final + * @return {array<object>} List of operation wrap procedures. + * TODO: convert to array<TransactionWrapper> + */ + getTransactionWrappers: function () { + return TRANSACTION_WRAPPERS; + }, + + /** + * @return {object} The queue to collect `onDOMReady` callbacks with. + */ + getReactMountReady: function () { + return this.reactMountReady; + }, + + /** + * `PooledClass` looks for this, and will invoke this before allowing this + * instance to be reused. + */ + destructor: function () { + CallbackQueue.release(this.reactMountReady); + this.reactMountReady = null; + } + }; + + assign(ReactReconcileTransaction.prototype, Transaction.Mixin, Mixin); + + PooledClass.addPoolingTo(ReactReconcileTransaction); + + module.exports = ReactReconcileTransaction; + +/***/ }, +/* 125 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactInputSelection + */ + + 'use strict'; + + var ReactDOMSelection = __webpack_require__(126); + + var containsNode = __webpack_require__(58); + var focusNode = __webpack_require__(94); + var getActiveElement = __webpack_require__(128); + + function isInDocument(node) { + return containsNode(document.documentElement, node); + } + + /** + * @ReactInputSelection: React input selection module. Based on Selection.js, + * but modified to be suitable for react and has a couple of bug fixes (doesn't + * assume buttons have range selections allowed). + * Input selection module for React. + */ + var ReactInputSelection = { + + hasSelectionCapabilities: function (elem) { + var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase(); + return nodeName && (nodeName === 'input' && elem.type === 'text' || nodeName === 'textarea' || elem.contentEditable === 'true'); + }, + + getSelectionInformation: function () { + var focusedElem = getActiveElement(); + return { + focusedElem: focusedElem, + selectionRange: ReactInputSelection.hasSelectionCapabilities(focusedElem) ? ReactInputSelection.getSelection(focusedElem) : null + }; + }, + + /** + * @restoreSelection: If any selection information was potentially lost, + * restore it. This is useful when performing operations that could remove dom + * nodes and place them back in, resulting in focus being lost. + */ + restoreSelection: function (priorSelectionInformation) { + var curFocusedElem = getActiveElement(); + var priorFocusedElem = priorSelectionInformation.focusedElem; + var priorSelectionRange = priorSelectionInformation.selectionRange; + if (curFocusedElem !== priorFocusedElem && isInDocument(priorFocusedElem)) { + if (ReactInputSelection.hasSelectionCapabilities(priorFocusedElem)) { + ReactInputSelection.setSelection(priorFocusedElem, priorSelectionRange); + } + focusNode(priorFocusedElem); + } + }, + + /** + * @getSelection: Gets the selection bounds of a focused textarea, input or + * contentEditable node. + * -@input: Look up selection bounds of this input + * -@return {start: selectionStart, end: selectionEnd} + */ + getSelection: function (input) { + var selection; + + if ('selectionStart' in input) { + // Modern browser with input or textarea. + selection = { + start: input.selectionStart, + end: input.selectionEnd + }; + } else if (document.selection && (input.nodeName && input.nodeName.toLowerCase() === 'input')) { + // IE8 input. + var range = document.selection.createRange(); + // There can only be one selection per document in IE, so it must + // be in our element. + if (range.parentElement() === input) { + selection = { + start: -range.moveStart('character', -input.value.length), + end: -range.moveEnd('character', -input.value.length) + }; + } + } else { + // Content editable or old IE textarea. + selection = ReactDOMSelection.getOffsets(input); + } + + return selection || { start: 0, end: 0 }; + }, + + /** + * @setSelection: Sets the selection bounds of a textarea or input and focuses + * the input. + * -@input Set selection bounds of this input or textarea + * -@offsets Object of same form that is returned from get* + */ + setSelection: function (input, offsets) { + var start = offsets.start; + var end = offsets.end; + if (typeof end === 'undefined') { + end = start; + } + + if ('selectionStart' in input) { + input.selectionStart = start; + input.selectionEnd = Math.min(end, input.value.length); + } else if (document.selection && (input.nodeName && input.nodeName.toLowerCase() === 'input')) { + var range = input.createTextRange(); + range.collapse(true); + range.moveStart('character', start); + range.moveEnd('character', end - start); + range.select(); + } else { + ReactDOMSelection.setOffsets(input, offsets); + } + } + }; + + module.exports = ReactInputSelection; + +/***/ }, +/* 126 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactDOMSelection + */ + + 'use strict'; + + var ExecutionEnvironment = __webpack_require__(8); + + var getNodeForCharacterOffset = __webpack_require__(127); + var getTextContentAccessor = __webpack_require__(74); + + /** + * While `isCollapsed` is available on the Selection object and `collapsed` + * is available on the Range object, IE11 sometimes gets them wrong. + * If the anchor/focus nodes and offsets are the same, the range is collapsed. + */ + function isCollapsed(anchorNode, anchorOffset, focusNode, focusOffset) { + return anchorNode === focusNode && anchorOffset === focusOffset; + } + + /** + * Get the appropriate anchor and focus node/offset pairs for IE. + * + * The catch here is that IE's selection API doesn't provide information + * about whether the selection is forward or backward, so we have to + * behave as though it's always forward. + * + * IE text differs from modern selection in that it behaves as though + * block elements end with a new line. This means character offsets will + * differ between the two APIs. + * + * @param {DOMElement} node + * @return {object} + */ + function getIEOffsets(node) { + var selection = document.selection; + var selectedRange = selection.createRange(); + var selectedLength = selectedRange.text.length; + + // Duplicate selection so we can move range without breaking user selection. + var fromStart = selectedRange.duplicate(); + fromStart.moveToElementText(node); + fromStart.setEndPoint('EndToStart', selectedRange); + + var startOffset = fromStart.text.length; + var endOffset = startOffset + selectedLength; + + return { + start: startOffset, + end: endOffset + }; + } + + /** + * @param {DOMElement} node + * @return {?object} + */ + function getModernOffsets(node) { + var selection = window.getSelection && window.getSelection(); + + if (!selection || selection.rangeCount === 0) { + return null; + } + + var anchorNode = selection.anchorNode; + var anchorOffset = selection.anchorOffset; + var focusNode = selection.focusNode; + var focusOffset = selection.focusOffset; + + var currentRange = selection.getRangeAt(0); + + // In Firefox, range.startContainer and range.endContainer can be "anonymous + // divs", e.g. the up/down buttons on an <input type="number">. Anonymous + // divs do not seem to expose properties, triggering a "Permission denied + // error" if any of its properties are accessed. The only seemingly possible + // way to avoid erroring is to access a property that typically works for + // non-anonymous divs and catch any error that may otherwise arise. See + // https://bugzilla.mozilla.org/show_bug.cgi?id=208427 + try { + /* eslint-disable no-unused-expressions */ + currentRange.startContainer.nodeType; + currentRange.endContainer.nodeType; + /* eslint-enable no-unused-expressions */ + } catch (e) { + return null; + } + + // If the node and offset values are the same, the selection is collapsed. + // `Selection.isCollapsed` is available natively, but IE sometimes gets + // this value wrong. + var isSelectionCollapsed = isCollapsed(selection.anchorNode, selection.anchorOffset, selection.focusNode, selection.focusOffset); + + var rangeLength = isSelectionCollapsed ? 0 : currentRange.toString().length; + + var tempRange = currentRange.cloneRange(); + tempRange.selectNodeContents(node); + tempRange.setEnd(currentRange.startContainer, currentRange.startOffset); + + var isTempRangeCollapsed = isCollapsed(tempRange.startContainer, tempRange.startOffset, tempRange.endContainer, tempRange.endOffset); + + var start = isTempRangeCollapsed ? 0 : tempRange.toString().length; + var end = start + rangeLength; + + // Detect whether the selection is backward. + var detectionRange = document.createRange(); + detectionRange.setStart(anchorNode, anchorOffset); + detectionRange.setEnd(focusNode, focusOffset); + var isBackward = detectionRange.collapsed; + + return { + start: isBackward ? end : start, + end: isBackward ? start : end + }; + } + + /** + * @param {DOMElement|DOMTextNode} node + * @param {object} offsets + */ + function setIEOffsets(node, offsets) { + var range = document.selection.createRange().duplicate(); + var start, end; + + if (typeof offsets.end === 'undefined') { + start = offsets.start; + end = start; + } else if (offsets.start > offsets.end) { + start = offsets.end; + end = offsets.start; + } else { + start = offsets.start; + end = offsets.end; + } + + range.moveToElementText(node); + range.moveStart('character', start); + range.setEndPoint('EndToStart', range); + range.moveEnd('character', end - start); + range.select(); + } + + /** + * In modern non-IE browsers, we can support both forward and backward + * selections. + * + * Note: IE10+ supports the Selection object, but it does not support + * the `extend` method, which means that even in modern IE, it's not possible + * to programatically create a backward selection. Thus, for all IE + * versions, we use the old IE API to create our selections. + * + * @param {DOMElement|DOMTextNode} node + * @param {object} offsets + */ + function setModernOffsets(node, offsets) { + if (!window.getSelection) { + return; + } + + var selection = window.getSelection(); + var length = node[getTextContentAccessor()].length; + var start = Math.min(offsets.start, length); + var end = typeof offsets.end === 'undefined' ? start : Math.min(offsets.end, length); + + // IE 11 uses modern selection, but doesn't support the extend method. + // Flip backward selections, so we can set with a single range. + if (!selection.extend && start > end) { + var temp = end; + end = start; + start = temp; + } + + var startMarker = getNodeForCharacterOffset(node, start); + var endMarker = getNodeForCharacterOffset(node, end); + + if (startMarker && endMarker) { + var range = document.createRange(); + range.setStart(startMarker.node, startMarker.offset); + selection.removeAllRanges(); + + if (start > end) { + selection.addRange(range); + selection.extend(endMarker.node, endMarker.offset); + } else { + range.setEnd(endMarker.node, endMarker.offset); + selection.addRange(range); + } + } + } + + var useIEOffsets = ExecutionEnvironment.canUseDOM && 'selection' in document && !('getSelection' in window); + + var ReactDOMSelection = { + /** + * @param {DOMElement} node + */ + getOffsets: useIEOffsets ? getIEOffsets : getModernOffsets, + + /** + * @param {DOMElement|DOMTextNode} node + * @param {object} offsets + */ + setOffsets: useIEOffsets ? setIEOffsets : setModernOffsets + }; + + module.exports = ReactDOMSelection; + +/***/ }, +/* 127 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule getNodeForCharacterOffset + */ + + 'use strict'; + + /** + * Given any node return the first leaf node without children. + * + * @param {DOMElement|DOMTextNode} node + * @return {DOMElement|DOMTextNode} + */ + function getLeafNode(node) { + while (node && node.firstChild) { + node = node.firstChild; + } + return node; + } + + /** + * Get the next sibling within a container. This will walk up the + * DOM if a node's siblings have been exhausted. + * + * @param {DOMElement|DOMTextNode} node + * @return {?DOMElement|DOMTextNode} + */ + function getSiblingNode(node) { + while (node) { + if (node.nextSibling) { + return node.nextSibling; + } + node = node.parentNode; + } + } + + /** + * Get object describing the nodes which contain characters at offset. + * + * @param {DOMElement|DOMTextNode} root + * @param {number} offset + * @return {?object} + */ + function getNodeForCharacterOffset(root, offset) { + var node = getLeafNode(root); + var nodeStart = 0; + var nodeEnd = 0; + + while (node) { + if (node.nodeType === 3) { + nodeEnd = nodeStart + node.textContent.length; + + if (nodeStart <= offset && nodeEnd >= offset) { + return { + node: node, + offset: offset - nodeStart + }; + } + + nodeStart = nodeEnd; + } + + node = getLeafNode(getSiblingNode(node)); + } + } + + module.exports = getNodeForCharacterOffset; + +/***/ }, +/* 128 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule getActiveElement + * @typechecks + */ + + /** + * Same as document.activeElement but wraps in a try-catch block. In IE it is + * not safe to call document.activeElement if there is nothing focused. + * + * The activeElement will be null only if the document or document body is not yet defined. + */ + 'use strict'; + + function getActiveElement() /*?DOMElement*/{ + if (typeof document === 'undefined') { + return null; + } + + try { + return document.activeElement || document.body; + } catch (e) { + return document.body; + } + } + + module.exports = getActiveElement; + +/***/ }, +/* 129 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule SelectEventPlugin + */ + + 'use strict'; + + var EventConstants = __webpack_require__(29); + var EventPropagators = __webpack_require__(72); + var ExecutionEnvironment = __webpack_require__(8); + var ReactInputSelection = __webpack_require__(125); + var SyntheticEvent = __webpack_require__(76); + + var getActiveElement = __webpack_require__(128); + var isTextInputElement = __webpack_require__(81); + var keyOf = __webpack_require__(78); + var shallowEqual = __webpack_require__(116); + + var topLevelTypes = EventConstants.topLevelTypes; + + var skipSelectionChangeEvent = ExecutionEnvironment.canUseDOM && 'documentMode' in document && document.documentMode <= 11; + + var eventTypes = { + select: { + phasedRegistrationNames: { + bubbled: keyOf({ onSelect: null }), + captured: keyOf({ onSelectCapture: null }) + }, + dependencies: [topLevelTypes.topBlur, topLevelTypes.topContextMenu, topLevelTypes.topFocus, topLevelTypes.topKeyDown, topLevelTypes.topMouseDown, topLevelTypes.topMouseUp, topLevelTypes.topSelectionChange] + } + }; + + var activeElement = null; + var activeElementID = null; + var lastSelection = null; + var mouseDown = false; + + // Track whether a listener exists for this plugin. If none exist, we do + // not extract events. + var hasListener = false; + var ON_SELECT_KEY = keyOf({ onSelect: null }); + + /** + * Get an object which is a unique representation of the current selection. + * + * The return value will not be consistent across nodes or browsers, but + * two identical selections on the same node will return identical objects. + * + * @param {DOMElement} node + * @return {object} + */ + function getSelection(node) { + if ('selectionStart' in node && ReactInputSelection.hasSelectionCapabilities(node)) { + return { + start: node.selectionStart, + end: node.selectionEnd + }; + } else if (window.getSelection) { + var selection = window.getSelection(); + return { + anchorNode: selection.anchorNode, + anchorOffset: selection.anchorOffset, + focusNode: selection.focusNode, + focusOffset: selection.focusOffset + }; + } else if (document.selection) { + var range = document.selection.createRange(); + return { + parentElement: range.parentElement(), + text: range.text, + top: range.boundingTop, + left: range.boundingLeft + }; + } + } + + /** + * Poll selection to see whether it's changed. + * + * @param {object} nativeEvent + * @return {?SyntheticEvent} + */ + function constructSelectEvent(nativeEvent, nativeEventTarget) { + // Ensure we have the right element, and that the user is not dragging a + // selection (this matches native `select` event behavior). In HTML5, select + // fires only on input and textarea thus if there's no focused element we + // won't dispatch. + if (mouseDown || activeElement == null || activeElement !== getActiveElement()) { + return null; + } + + // Only fire when selection has actually changed. + var currentSelection = getSelection(activeElement); + if (!lastSelection || !shallowEqual(lastSelection, currentSelection)) { + lastSelection = currentSelection; + + var syntheticEvent = SyntheticEvent.getPooled(eventTypes.select, activeElementID, nativeEvent, nativeEventTarget); + + syntheticEvent.type = 'select'; + syntheticEvent.target = activeElement; + + EventPropagators.accumulateTwoPhaseDispatches(syntheticEvent); + + return syntheticEvent; + } + + return null; + } + + /** + * This plugin creates an `onSelect` event that normalizes select events + * across form elements. + * + * Supported elements are: + * - input (see `isTextInputElement`) + * - textarea + * - contentEditable + * + * This differs from native browser implementations in the following ways: + * - Fires on contentEditable fields as well as inputs. + * - Fires for collapsed selection. + * - Fires after user input. + */ + var SelectEventPlugin = { + + eventTypes: eventTypes, + + /** + * @param {string} topLevelType Record from `EventConstants`. + * @param {DOMEventTarget} topLevelTarget The listening component root node. + * @param {string} topLevelTargetID ID of `topLevelTarget`. + * @param {object} nativeEvent Native browser event. + * @return {*} An accumulation of synthetic events. + * @see {EventPluginHub.extractEvents} + */ + extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) { + if (!hasListener) { + return null; + } + + switch (topLevelType) { + // Track the input node that has focus. + case topLevelTypes.topFocus: + if (isTextInputElement(topLevelTarget) || topLevelTarget.contentEditable === 'true') { + activeElement = topLevelTarget; + activeElementID = topLevelTargetID; + lastSelection = null; + } + break; + case topLevelTypes.topBlur: + activeElement = null; + activeElementID = null; + lastSelection = null; + break; + + // Don't fire the event while the user is dragging. This matches the + // semantics of the native select event. + case topLevelTypes.topMouseDown: + mouseDown = true; + break; + case topLevelTypes.topContextMenu: + case topLevelTypes.topMouseUp: + mouseDown = false; + return constructSelectEvent(nativeEvent, nativeEventTarget); + + // Chrome and IE fire non-standard event when selection is changed (and + // sometimes when it hasn't). IE's event fires out of order with respect + // to key and input events on deletion, so we discard it. + // + // Firefox doesn't support selectionchange, so check selection status + // after each key entry. The selection changes after keydown and before + // keyup, but we check on keydown as well in the case of holding down a + // key, when multiple keydown events are fired but only one keyup is. + // This is also our approach for IE handling, for the reason above. + case topLevelTypes.topSelectionChange: + if (skipSelectionChangeEvent) { + break; + } + // falls through + case topLevelTypes.topKeyDown: + case topLevelTypes.topKeyUp: + return constructSelectEvent(nativeEvent, nativeEventTarget); + } + + return null; + }, + + didPutListener: function (id, registrationName, listener) { + if (registrationName === ON_SELECT_KEY) { + hasListener = true; + } + } + }; + + module.exports = SelectEventPlugin; + +/***/ }, +/* 130 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ServerReactRootIndex + * @typechecks + */ + + 'use strict'; + + /** + * Size of the reactRoot ID space. We generate random numbers for React root + * IDs and if there's a collision the events and DOM update system will + * get confused. In the future we need a way to generate GUIDs but for + * now this will work on a smaller scale. + */ + var GLOBAL_MOUNT_POINT_MAX = Math.pow(2, 53); + + var ServerReactRootIndex = { + createReactRootIndex: function () { + return Math.ceil(Math.random() * GLOBAL_MOUNT_POINT_MAX); + } + }; + + module.exports = ServerReactRootIndex; + +/***/ }, +/* 131 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule SimpleEventPlugin + */ + + 'use strict'; + + var EventConstants = __webpack_require__(29); + var EventListener = __webpack_require__(118); + var EventPropagators = __webpack_require__(72); + var ReactMount = __webpack_require__(27); + var SyntheticClipboardEvent = __webpack_require__(132); + var SyntheticEvent = __webpack_require__(76); + var SyntheticFocusEvent = __webpack_require__(133); + var SyntheticKeyboardEvent = __webpack_require__(134); + var SyntheticMouseEvent = __webpack_require__(85); + var SyntheticDragEvent = __webpack_require__(137); + var SyntheticTouchEvent = __webpack_require__(138); + var SyntheticUIEvent = __webpack_require__(86); + var SyntheticWheelEvent = __webpack_require__(139); + + var emptyFunction = __webpack_require__(14); + var getEventCharCode = __webpack_require__(135); + var invariant = __webpack_require__(12); + var keyOf = __webpack_require__(78); + + var topLevelTypes = EventConstants.topLevelTypes; + + var eventTypes = { + abort: { + phasedRegistrationNames: { + bubbled: keyOf({ onAbort: true }), + captured: keyOf({ onAbortCapture: true }) + } + }, + blur: { + phasedRegistrationNames: { + bubbled: keyOf({ onBlur: true }), + captured: keyOf({ onBlurCapture: true }) + } + }, + canPlay: { + phasedRegistrationNames: { + bubbled: keyOf({ onCanPlay: true }), + captured: keyOf({ onCanPlayCapture: true }) + } + }, + canPlayThrough: { + phasedRegistrationNames: { + bubbled: keyOf({ onCanPlayThrough: true }), + captured: keyOf({ onCanPlayThroughCapture: true }) + } + }, + click: { + phasedRegistrationNames: { + bubbled: keyOf({ onClick: true }), + captured: keyOf({ onClickCapture: true }) + } + }, + contextMenu: { + phasedRegistrationNames: { + bubbled: keyOf({ onContextMenu: true }), + captured: keyOf({ onContextMenuCapture: true }) + } + }, + copy: { + phasedRegistrationNames: { + bubbled: keyOf({ onCopy: true }), + captured: keyOf({ onCopyCapture: true }) + } + }, + cut: { + phasedRegistrationNames: { + bubbled: keyOf({ onCut: true }), + captured: keyOf({ onCutCapture: true }) + } + }, + doubleClick: { + phasedRegistrationNames: { + bubbled: keyOf({ onDoubleClick: true }), + captured: keyOf({ onDoubleClickCapture: true }) + } + }, + drag: { + phasedRegistrationNames: { + bubbled: keyOf({ onDrag: true }), + captured: keyOf({ onDragCapture: true }) + } + }, + dragEnd: { + phasedRegistrationNames: { + bubbled: keyOf({ onDragEnd: true }), + captured: keyOf({ onDragEndCapture: true }) + } + }, + dragEnter: { + phasedRegistrationNames: { + bubbled: keyOf({ onDragEnter: true }), + captured: keyOf({ onDragEnterCapture: true }) + } + }, + dragExit: { + phasedRegistrationNames: { + bubbled: keyOf({ onDragExit: true }), + captured: keyOf({ onDragExitCapture: true }) + } + }, + dragLeave: { + phasedRegistrationNames: { + bubbled: keyOf({ onDragLeave: true }), + captured: keyOf({ onDragLeaveCapture: true }) + } + }, + dragOver: { + phasedRegistrationNames: { + bubbled: keyOf({ onDragOver: true }), + captured: keyOf({ onDragOverCapture: true }) + } + }, + dragStart: { + phasedRegistrationNames: { + bubbled: keyOf({ onDragStart: true }), + captured: keyOf({ onDragStartCapture: true }) + } + }, + drop: { + phasedRegistrationNames: { + bubbled: keyOf({ onDrop: true }), + captured: keyOf({ onDropCapture: true }) + } + }, + durationChange: { + phasedRegistrationNames: { + bubbled: keyOf({ onDurationChange: true }), + captured: keyOf({ onDurationChangeCapture: true }) + } + }, + emptied: { + phasedRegistrationNames: { + bubbled: keyOf({ onEmptied: true }), + captured: keyOf({ onEmptiedCapture: true }) + } + }, + encrypted: { + phasedRegistrationNames: { + bubbled: keyOf({ onEncrypted: true }), + captured: keyOf({ onEncryptedCapture: true }) + } + }, + ended: { + phasedRegistrationNames: { + bubbled: keyOf({ onEnded: true }), + captured: keyOf({ onEndedCapture: true }) + } + }, + error: { + phasedRegistrationNames: { + bubbled: keyOf({ onError: true }), + captured: keyOf({ onErrorCapture: true }) + } + }, + focus: { + phasedRegistrationNames: { + bubbled: keyOf({ onFocus: true }), + captured: keyOf({ onFocusCapture: true }) + } + }, + input: { + phasedRegistrationNames: { + bubbled: keyOf({ onInput: true }), + captured: keyOf({ onInputCapture: true }) + } + }, + keyDown: { + phasedRegistrationNames: { + bubbled: keyOf({ onKeyDown: true }), + captured: keyOf({ onKeyDownCapture: true }) + } + }, + keyPress: { + phasedRegistrationNames: { + bubbled: keyOf({ onKeyPress: true }), + captured: keyOf({ onKeyPressCapture: true }) + } + }, + keyUp: { + phasedRegistrationNames: { + bubbled: keyOf({ onKeyUp: true }), + captured: keyOf({ onKeyUpCapture: true }) + } + }, + load: { + phasedRegistrationNames: { + bubbled: keyOf({ onLoad: true }), + captured: keyOf({ onLoadCapture: true }) + } + }, + loadedData: { + phasedRegistrationNames: { + bubbled: keyOf({ onLoadedData: true }), + captured: keyOf({ onLoadedDataCapture: true }) + } + }, + loadedMetadata: { + phasedRegistrationNames: { + bubbled: keyOf({ onLoadedMetadata: true }), + captured: keyOf({ onLoadedMetadataCapture: true }) + } + }, + loadStart: { + phasedRegistrationNames: { + bubbled: keyOf({ onLoadStart: true }), + captured: keyOf({ onLoadStartCapture: true }) + } + }, + // Note: We do not allow listening to mouseOver events. Instead, use the + // onMouseEnter/onMouseLeave created by `EnterLeaveEventPlugin`. + mouseDown: { + phasedRegistrationNames: { + bubbled: keyOf({ onMouseDown: true }), + captured: keyOf({ onMouseDownCapture: true }) + } + }, + mouseMove: { + phasedRegistrationNames: { + bubbled: keyOf({ onMouseMove: true }), + captured: keyOf({ onMouseMoveCapture: true }) + } + }, + mouseOut: { + phasedRegistrationNames: { + bubbled: keyOf({ onMouseOut: true }), + captured: keyOf({ onMouseOutCapture: true }) + } + }, + mouseOver: { + phasedRegistrationNames: { + bubbled: keyOf({ onMouseOver: true }), + captured: keyOf({ onMouseOverCapture: true }) + } + }, + mouseUp: { + phasedRegistrationNames: { + bubbled: keyOf({ onMouseUp: true }), + captured: keyOf({ onMouseUpCapture: true }) + } + }, + paste: { + phasedRegistrationNames: { + bubbled: keyOf({ onPaste: true }), + captured: keyOf({ onPasteCapture: true }) + } + }, + pause: { + phasedRegistrationNames: { + bubbled: keyOf({ onPause: true }), + captured: keyOf({ onPauseCapture: true }) + } + }, + play: { + phasedRegistrationNames: { + bubbled: keyOf({ onPlay: true }), + captured: keyOf({ onPlayCapture: true }) + } + }, + playing: { + phasedRegistrationNames: { + bubbled: keyOf({ onPlaying: true }), + captured: keyOf({ onPlayingCapture: true }) + } + }, + progress: { + phasedRegistrationNames: { + bubbled: keyOf({ onProgress: true }), + captured: keyOf({ onProgressCapture: true }) + } + }, + rateChange: { + phasedRegistrationNames: { + bubbled: keyOf({ onRateChange: true }), + captured: keyOf({ onRateChangeCapture: true }) + } + }, + reset: { + phasedRegistrationNames: { + bubbled: keyOf({ onReset: true }), + captured: keyOf({ onResetCapture: true }) + } + }, + scroll: { + phasedRegistrationNames: { + bubbled: keyOf({ onScroll: true }), + captured: keyOf({ onScrollCapture: true }) + } + }, + seeked: { + phasedRegistrationNames: { + bubbled: keyOf({ onSeeked: true }), + captured: keyOf({ onSeekedCapture: true }) + } + }, + seeking: { + phasedRegistrationNames: { + bubbled: keyOf({ onSeeking: true }), + captured: keyOf({ onSeekingCapture: true }) + } + }, + stalled: { + phasedRegistrationNames: { + bubbled: keyOf({ onStalled: true }), + captured: keyOf({ onStalledCapture: true }) + } + }, + submit: { + phasedRegistrationNames: { + bubbled: keyOf({ onSubmit: true }), + captured: keyOf({ onSubmitCapture: true }) + } + }, + suspend: { + phasedRegistrationNames: { + bubbled: keyOf({ onSuspend: true }), + captured: keyOf({ onSuspendCapture: true }) + } + }, + timeUpdate: { + phasedRegistrationNames: { + bubbled: keyOf({ onTimeUpdate: true }), + captured: keyOf({ onTimeUpdateCapture: true }) + } + }, + touchCancel: { + phasedRegistrationNames: { + bubbled: keyOf({ onTouchCancel: true }), + captured: keyOf({ onTouchCancelCapture: true }) + } + }, + touchEnd: { + phasedRegistrationNames: { + bubbled: keyOf({ onTouchEnd: true }), + captured: keyOf({ onTouchEndCapture: true }) + } + }, + touchMove: { + phasedRegistrationNames: { + bubbled: keyOf({ onTouchMove: true }), + captured: keyOf({ onTouchMoveCapture: true }) + } + }, + touchStart: { + phasedRegistrationNames: { + bubbled: keyOf({ onTouchStart: true }), + captured: keyOf({ onTouchStartCapture: true }) + } + }, + volumeChange: { + phasedRegistrationNames: { + bubbled: keyOf({ onVolumeChange: true }), + captured: keyOf({ onVolumeChangeCapture: true }) + } + }, + waiting: { + phasedRegistrationNames: { + bubbled: keyOf({ onWaiting: true }), + captured: keyOf({ onWaitingCapture: true }) + } + }, + wheel: { + phasedRegistrationNames: { + bubbled: keyOf({ onWheel: true }), + captured: keyOf({ onWheelCapture: true }) + } + } + }; + + var topLevelEventsToDispatchConfig = { + topAbort: eventTypes.abort, + topBlur: eventTypes.blur, + topCanPlay: eventTypes.canPlay, + topCanPlayThrough: eventTypes.canPlayThrough, + topClick: eventTypes.click, + topContextMenu: eventTypes.contextMenu, + topCopy: eventTypes.copy, + topCut: eventTypes.cut, + topDoubleClick: eventTypes.doubleClick, + topDrag: eventTypes.drag, + topDragEnd: eventTypes.dragEnd, + topDragEnter: eventTypes.dragEnter, + topDragExit: eventTypes.dragExit, + topDragLeave: eventTypes.dragLeave, + topDragOver: eventTypes.dragOver, + topDragStart: eventTypes.dragStart, + topDrop: eventTypes.drop, + topDurationChange: eventTypes.durationChange, + topEmptied: eventTypes.emptied, + topEncrypted: eventTypes.encrypted, + topEnded: eventTypes.ended, + topError: eventTypes.error, + topFocus: eventTypes.focus, + topInput: eventTypes.input, + topKeyDown: eventTypes.keyDown, + topKeyPress: eventTypes.keyPress, + topKeyUp: eventTypes.keyUp, + topLoad: eventTypes.load, + topLoadedData: eventTypes.loadedData, + topLoadedMetadata: eventTypes.loadedMetadata, + topLoadStart: eventTypes.loadStart, + topMouseDown: eventTypes.mouseDown, + topMouseMove: eventTypes.mouseMove, + topMouseOut: eventTypes.mouseOut, + topMouseOver: eventTypes.mouseOver, + topMouseUp: eventTypes.mouseUp, + topPaste: eventTypes.paste, + topPause: eventTypes.pause, + topPlay: eventTypes.play, + topPlaying: eventTypes.playing, + topProgress: eventTypes.progress, + topRateChange: eventTypes.rateChange, + topReset: eventTypes.reset, + topScroll: eventTypes.scroll, + topSeeked: eventTypes.seeked, + topSeeking: eventTypes.seeking, + topStalled: eventTypes.stalled, + topSubmit: eventTypes.submit, + topSuspend: eventTypes.suspend, + topTimeUpdate: eventTypes.timeUpdate, + topTouchCancel: eventTypes.touchCancel, + topTouchEnd: eventTypes.touchEnd, + topTouchMove: eventTypes.touchMove, + topTouchStart: eventTypes.touchStart, + topVolumeChange: eventTypes.volumeChange, + topWaiting: eventTypes.waiting, + topWheel: eventTypes.wheel + }; + + for (var type in topLevelEventsToDispatchConfig) { + topLevelEventsToDispatchConfig[type].dependencies = [type]; + } + + var ON_CLICK_KEY = keyOf({ onClick: null }); + var onClickListeners = {}; + + var SimpleEventPlugin = { + + eventTypes: eventTypes, + + /** + * @param {string} topLevelType Record from `EventConstants`. + * @param {DOMEventTarget} topLevelTarget The listening component root node. + * @param {string} topLevelTargetID ID of `topLevelTarget`. + * @param {object} nativeEvent Native browser event. + * @return {*} An accumulation of synthetic events. + * @see {EventPluginHub.extractEvents} + */ + extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) { + var dispatchConfig = topLevelEventsToDispatchConfig[topLevelType]; + if (!dispatchConfig) { + return null; + } + var EventConstructor; + switch (topLevelType) { + case topLevelTypes.topAbort: + case topLevelTypes.topCanPlay: + case topLevelTypes.topCanPlayThrough: + case topLevelTypes.topDurationChange: + case topLevelTypes.topEmptied: + case topLevelTypes.topEncrypted: + case topLevelTypes.topEnded: + case topLevelTypes.topError: + case topLevelTypes.topInput: + case topLevelTypes.topLoad: + case topLevelTypes.topLoadedData: + case topLevelTypes.topLoadedMetadata: + case topLevelTypes.topLoadStart: + case topLevelTypes.topPause: + case topLevelTypes.topPlay: + case topLevelTypes.topPlaying: + case topLevelTypes.topProgress: + case topLevelTypes.topRateChange: + case topLevelTypes.topReset: + case topLevelTypes.topSeeked: + case topLevelTypes.topSeeking: + case topLevelTypes.topStalled: + case topLevelTypes.topSubmit: + case topLevelTypes.topSuspend: + case topLevelTypes.topTimeUpdate: + case topLevelTypes.topVolumeChange: + case topLevelTypes.topWaiting: + // HTML Events + // @see http://www.w3.org/TR/html5/index.html#events-0 + EventConstructor = SyntheticEvent; + break; + case topLevelTypes.topKeyPress: + // FireFox creates a keypress event for function keys too. This removes + // the unwanted keypress events. Enter is however both printable and + // non-printable. One would expect Tab to be as well (but it isn't). + if (getEventCharCode(nativeEvent) === 0) { + return null; + } + /* falls through */ + case topLevelTypes.topKeyDown: + case topLevelTypes.topKeyUp: + EventConstructor = SyntheticKeyboardEvent; + break; + case topLevelTypes.topBlur: + case topLevelTypes.topFocus: + EventConstructor = SyntheticFocusEvent; + break; + case topLevelTypes.topClick: + // Firefox creates a click event on right mouse clicks. This removes the + // unwanted click events. + if (nativeEvent.button === 2) { + return null; + } + /* falls through */ + case topLevelTypes.topContextMenu: + case topLevelTypes.topDoubleClick: + case topLevelTypes.topMouseDown: + case topLevelTypes.topMouseMove: + case topLevelTypes.topMouseOut: + case topLevelTypes.topMouseOver: + case topLevelTypes.topMouseUp: + EventConstructor = SyntheticMouseEvent; + break; + case topLevelTypes.topDrag: + case topLevelTypes.topDragEnd: + case topLevelTypes.topDragEnter: + case topLevelTypes.topDragExit: + case topLevelTypes.topDragLeave: + case topLevelTypes.topDragOver: + case topLevelTypes.topDragStart: + case topLevelTypes.topDrop: + EventConstructor = SyntheticDragEvent; + break; + case topLevelTypes.topTouchCancel: + case topLevelTypes.topTouchEnd: + case topLevelTypes.topTouchMove: + case topLevelTypes.topTouchStart: + EventConstructor = SyntheticTouchEvent; + break; + case topLevelTypes.topScroll: + EventConstructor = SyntheticUIEvent; + break; + case topLevelTypes.topWheel: + EventConstructor = SyntheticWheelEvent; + break; + case topLevelTypes.topCopy: + case topLevelTypes.topCut: + case topLevelTypes.topPaste: + EventConstructor = SyntheticClipboardEvent; + break; + } + !EventConstructor ? process.env.NODE_ENV !== 'production' ? invariant(false, 'SimpleEventPlugin: Unhandled event type, `%s`.', topLevelType) : invariant(false) : undefined; + var event = EventConstructor.getPooled(dispatchConfig, topLevelTargetID, nativeEvent, nativeEventTarget); + EventPropagators.accumulateTwoPhaseDispatches(event); + return event; + }, + + didPutListener: function (id, registrationName, listener) { + // Mobile Safari does not fire properly bubble click events on + // non-interactive elements, which means delegated click listeners do not + // fire. The workaround for this bug involves attaching an empty click + // listener on the target node. + if (registrationName === ON_CLICK_KEY) { + var node = ReactMount.getNode(id); + if (!onClickListeners[id]) { + onClickListeners[id] = EventListener.listen(node, 'click', emptyFunction); + } + } + }, + + willDeleteListener: function (id, registrationName) { + if (registrationName === ON_CLICK_KEY) { + onClickListeners[id].remove(); + delete onClickListeners[id]; + } + } + + }; + + module.exports = SimpleEventPlugin; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 132 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule SyntheticClipboardEvent + * @typechecks static-only + */ + + 'use strict'; + + var SyntheticEvent = __webpack_require__(76); + + /** + * @interface Event + * @see http://www.w3.org/TR/clipboard-apis/ + */ + var ClipboardEventInterface = { + clipboardData: function (event) { + return 'clipboardData' in event ? event.clipboardData : window.clipboardData; + } + }; + + /** + * @param {object} dispatchConfig Configuration used to dispatch this event. + * @param {string} dispatchMarker Marker identifying the event target. + * @param {object} nativeEvent Native browser event. + * @extends {SyntheticUIEvent} + */ + function SyntheticClipboardEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) { + SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget); + } + + SyntheticEvent.augmentClass(SyntheticClipboardEvent, ClipboardEventInterface); + + module.exports = SyntheticClipboardEvent; + +/***/ }, +/* 133 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule SyntheticFocusEvent + * @typechecks static-only + */ + + 'use strict'; + + var SyntheticUIEvent = __webpack_require__(86); + + /** + * @interface FocusEvent + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ + var FocusEventInterface = { + relatedTarget: null + }; + + /** + * @param {object} dispatchConfig Configuration used to dispatch this event. + * @param {string} dispatchMarker Marker identifying the event target. + * @param {object} nativeEvent Native browser event. + * @extends {SyntheticUIEvent} + */ + function SyntheticFocusEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) { + SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget); + } + + SyntheticUIEvent.augmentClass(SyntheticFocusEvent, FocusEventInterface); + + module.exports = SyntheticFocusEvent; + +/***/ }, +/* 134 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule SyntheticKeyboardEvent + * @typechecks static-only + */ + + 'use strict'; + + var SyntheticUIEvent = __webpack_require__(86); + + var getEventCharCode = __webpack_require__(135); + var getEventKey = __webpack_require__(136); + var getEventModifierState = __webpack_require__(87); + + /** + * @interface KeyboardEvent + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ + var KeyboardEventInterface = { + key: getEventKey, + location: null, + ctrlKey: null, + shiftKey: null, + altKey: null, + metaKey: null, + repeat: null, + locale: null, + getModifierState: getEventModifierState, + // Legacy Interface + charCode: function (event) { + // `charCode` is the result of a KeyPress event and represents the value of + // the actual printable character. + + // KeyPress is deprecated, but its replacement is not yet final and not + // implemented in any major browser. Only KeyPress has charCode. + if (event.type === 'keypress') { + return getEventCharCode(event); + } + return 0; + }, + keyCode: function (event) { + // `keyCode` is the result of a KeyDown/Up event and represents the value of + // physical keyboard key. + + // The actual meaning of the value depends on the users' keyboard layout + // which cannot be detected. Assuming that it is a US keyboard layout + // provides a surprisingly accurate mapping for US and European users. + // Due to this, it is left to the user to implement at this time. + if (event.type === 'keydown' || event.type === 'keyup') { + return event.keyCode; + } + return 0; + }, + which: function (event) { + // `which` is an alias for either `keyCode` or `charCode` depending on the + // type of the event. + if (event.type === 'keypress') { + return getEventCharCode(event); + } + if (event.type === 'keydown' || event.type === 'keyup') { + return event.keyCode; + } + return 0; + } + }; + + /** + * @param {object} dispatchConfig Configuration used to dispatch this event. + * @param {string} dispatchMarker Marker identifying the event target. + * @param {object} nativeEvent Native browser event. + * @extends {SyntheticUIEvent} + */ + function SyntheticKeyboardEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) { + SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget); + } + + SyntheticUIEvent.augmentClass(SyntheticKeyboardEvent, KeyboardEventInterface); + + module.exports = SyntheticKeyboardEvent; + +/***/ }, +/* 135 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule getEventCharCode + * @typechecks static-only + */ + + 'use strict'; + + /** + * `charCode` represents the actual "character code" and is safe to use with + * `String.fromCharCode`. As such, only keys that correspond to printable + * characters produce a valid `charCode`, the only exception to this is Enter. + * The Tab-key is considered non-printable and does not have a `charCode`, + * presumably because it does not produce a tab-character in browsers. + * + * @param {object} nativeEvent Native browser event. + * @return {number} Normalized `charCode` property. + */ + function getEventCharCode(nativeEvent) { + var charCode; + var keyCode = nativeEvent.keyCode; + + if ('charCode' in nativeEvent) { + charCode = nativeEvent.charCode; + + // FF does not set `charCode` for the Enter-key, check against `keyCode`. + if (charCode === 0 && keyCode === 13) { + charCode = 13; + } + } else { + // IE8 does not implement `charCode`, but `keyCode` has the correct value. + charCode = keyCode; + } + + // Some non-printable keys are reported in `charCode`/`keyCode`, discard them. + // Must not discard the (non-)printable Enter-key. + if (charCode >= 32 || charCode === 13) { + return charCode; + } + + return 0; + } + + module.exports = getEventCharCode; + +/***/ }, +/* 136 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule getEventKey + * @typechecks static-only + */ + + 'use strict'; + + var getEventCharCode = __webpack_require__(135); + + /** + * Normalization of deprecated HTML5 `key` values + * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names + */ + var normalizeKey = { + 'Esc': 'Escape', + 'Spacebar': ' ', + 'Left': 'ArrowLeft', + 'Up': 'ArrowUp', + 'Right': 'ArrowRight', + 'Down': 'ArrowDown', + 'Del': 'Delete', + 'Win': 'OS', + 'Menu': 'ContextMenu', + 'Apps': 'ContextMenu', + 'Scroll': 'ScrollLock', + 'MozPrintableKey': 'Unidentified' + }; + + /** + * Translation from legacy `keyCode` to HTML5 `key` + * Only special keys supported, all others depend on keyboard layout or browser + * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names + */ + var translateToKey = { + 8: 'Backspace', + 9: 'Tab', + 12: 'Clear', + 13: 'Enter', + 16: 'Shift', + 17: 'Control', + 18: 'Alt', + 19: 'Pause', + 20: 'CapsLock', + 27: 'Escape', + 32: ' ', + 33: 'PageUp', + 34: 'PageDown', + 35: 'End', + 36: 'Home', + 37: 'ArrowLeft', + 38: 'ArrowUp', + 39: 'ArrowRight', + 40: 'ArrowDown', + 45: 'Insert', + 46: 'Delete', + 112: 'F1', 113: 'F2', 114: 'F3', 115: 'F4', 116: 'F5', 117: 'F6', + 118: 'F7', 119: 'F8', 120: 'F9', 121: 'F10', 122: 'F11', 123: 'F12', + 144: 'NumLock', + 145: 'ScrollLock', + 224: 'Meta' + }; + + /** + * @param {object} nativeEvent Native browser event. + * @return {string} Normalized `key` property. + */ + function getEventKey(nativeEvent) { + if (nativeEvent.key) { + // Normalize inconsistent values reported by browsers due to + // implementations of a working draft specification. + + // FireFox implements `key` but returns `MozPrintableKey` for all + // printable characters (normalized to `Unidentified`), ignore it. + var key = normalizeKey[nativeEvent.key] || nativeEvent.key; + if (key !== 'Unidentified') { + return key; + } + } + + // Browser does not implement `key`, polyfill as much of it as we can. + if (nativeEvent.type === 'keypress') { + var charCode = getEventCharCode(nativeEvent); + + // The enter-key is technically both printable and non-printable and can + // thus be captured by `keypress`, no other non-printable key should. + return charCode === 13 ? 'Enter' : String.fromCharCode(charCode); + } + if (nativeEvent.type === 'keydown' || nativeEvent.type === 'keyup') { + // While user keyboard layout determines the actual meaning of each + // `keyCode` value, almost all function keys have a universal value. + return translateToKey[nativeEvent.keyCode] || 'Unidentified'; + } + return ''; + } + + module.exports = getEventKey; + +/***/ }, +/* 137 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule SyntheticDragEvent + * @typechecks static-only + */ + + 'use strict'; + + var SyntheticMouseEvent = __webpack_require__(85); + + /** + * @interface DragEvent + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ + var DragEventInterface = { + dataTransfer: null + }; + + /** + * @param {object} dispatchConfig Configuration used to dispatch this event. + * @param {string} dispatchMarker Marker identifying the event target. + * @param {object} nativeEvent Native browser event. + * @extends {SyntheticUIEvent} + */ + function SyntheticDragEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) { + SyntheticMouseEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget); + } + + SyntheticMouseEvent.augmentClass(SyntheticDragEvent, DragEventInterface); + + module.exports = SyntheticDragEvent; + +/***/ }, +/* 138 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule SyntheticTouchEvent + * @typechecks static-only + */ + + 'use strict'; + + var SyntheticUIEvent = __webpack_require__(86); + + var getEventModifierState = __webpack_require__(87); + + /** + * @interface TouchEvent + * @see http://www.w3.org/TR/touch-events/ + */ + var TouchEventInterface = { + touches: null, + targetTouches: null, + changedTouches: null, + altKey: null, + metaKey: null, + ctrlKey: null, + shiftKey: null, + getModifierState: getEventModifierState + }; + + /** + * @param {object} dispatchConfig Configuration used to dispatch this event. + * @param {string} dispatchMarker Marker identifying the event target. + * @param {object} nativeEvent Native browser event. + * @extends {SyntheticUIEvent} + */ + function SyntheticTouchEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) { + SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget); + } + + SyntheticUIEvent.augmentClass(SyntheticTouchEvent, TouchEventInterface); + + module.exports = SyntheticTouchEvent; + +/***/ }, +/* 139 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule SyntheticWheelEvent + * @typechecks static-only + */ + + 'use strict'; + + var SyntheticMouseEvent = __webpack_require__(85); + + /** + * @interface WheelEvent + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ + var WheelEventInterface = { + deltaX: function (event) { + return 'deltaX' in event ? event.deltaX : + // Fallback to `wheelDeltaX` for Webkit and normalize (right is positive). + 'wheelDeltaX' in event ? -event.wheelDeltaX : 0; + }, + deltaY: function (event) { + return 'deltaY' in event ? event.deltaY : + // Fallback to `wheelDeltaY` for Webkit and normalize (down is positive). + 'wheelDeltaY' in event ? -event.wheelDeltaY : + // Fallback to `wheelDelta` for IE<9 and normalize (down is positive). + 'wheelDelta' in event ? -event.wheelDelta : 0; + }, + deltaZ: null, + + // Browsers without "deltaMode" is reporting in raw wheel delta where one + // notch on the scroll is always +/- 120, roughly equivalent to pixels. + // A good approximation of DOM_DELTA_LINE (1) is 5% of viewport size or + // ~40 pixels, for DOM_DELTA_SCREEN (2) it is 87.5% of viewport size. + deltaMode: null + }; + + /** + * @param {object} dispatchConfig Configuration used to dispatch this event. + * @param {string} dispatchMarker Marker identifying the event target. + * @param {object} nativeEvent Native browser event. + * @extends {SyntheticMouseEvent} + */ + function SyntheticWheelEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) { + SyntheticMouseEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget); + } + + SyntheticMouseEvent.augmentClass(SyntheticWheelEvent, WheelEventInterface); + + module.exports = SyntheticWheelEvent; + +/***/ }, +/* 140 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule SVGDOMPropertyConfig + */ + + 'use strict'; + + var DOMProperty = __webpack_require__(22); + + var MUST_USE_ATTRIBUTE = DOMProperty.injection.MUST_USE_ATTRIBUTE; + + var NS = { + xlink: 'http://www.w3.org/1999/xlink', + xml: 'http://www.w3.org/XML/1998/namespace' + }; + + var SVGDOMPropertyConfig = { + Properties: { + clipPath: MUST_USE_ATTRIBUTE, + cx: MUST_USE_ATTRIBUTE, + cy: MUST_USE_ATTRIBUTE, + d: MUST_USE_ATTRIBUTE, + dx: MUST_USE_ATTRIBUTE, + dy: MUST_USE_ATTRIBUTE, + fill: MUST_USE_ATTRIBUTE, + fillOpacity: MUST_USE_ATTRIBUTE, + fontFamily: MUST_USE_ATTRIBUTE, + fontSize: MUST_USE_ATTRIBUTE, + fx: MUST_USE_ATTRIBUTE, + fy: MUST_USE_ATTRIBUTE, + gradientTransform: MUST_USE_ATTRIBUTE, + gradientUnits: MUST_USE_ATTRIBUTE, + markerEnd: MUST_USE_ATTRIBUTE, + markerMid: MUST_USE_ATTRIBUTE, + markerStart: MUST_USE_ATTRIBUTE, + offset: MUST_USE_ATTRIBUTE, + opacity: MUST_USE_ATTRIBUTE, + patternContentUnits: MUST_USE_ATTRIBUTE, + patternUnits: MUST_USE_ATTRIBUTE, + points: MUST_USE_ATTRIBUTE, + preserveAspectRatio: MUST_USE_ATTRIBUTE, + r: MUST_USE_ATTRIBUTE, + rx: MUST_USE_ATTRIBUTE, + ry: MUST_USE_ATTRIBUTE, + spreadMethod: MUST_USE_ATTRIBUTE, + stopColor: MUST_USE_ATTRIBUTE, + stopOpacity: MUST_USE_ATTRIBUTE, + stroke: MUST_USE_ATTRIBUTE, + strokeDasharray: MUST_USE_ATTRIBUTE, + strokeLinecap: MUST_USE_ATTRIBUTE, + strokeOpacity: MUST_USE_ATTRIBUTE, + strokeWidth: MUST_USE_ATTRIBUTE, + textAnchor: MUST_USE_ATTRIBUTE, + transform: MUST_USE_ATTRIBUTE, + version: MUST_USE_ATTRIBUTE, + viewBox: MUST_USE_ATTRIBUTE, + x1: MUST_USE_ATTRIBUTE, + x2: MUST_USE_ATTRIBUTE, + x: MUST_USE_ATTRIBUTE, + xlinkActuate: MUST_USE_ATTRIBUTE, + xlinkArcrole: MUST_USE_ATTRIBUTE, + xlinkHref: MUST_USE_ATTRIBUTE, + xlinkRole: MUST_USE_ATTRIBUTE, + xlinkShow: MUST_USE_ATTRIBUTE, + xlinkTitle: MUST_USE_ATTRIBUTE, + xlinkType: MUST_USE_ATTRIBUTE, + xmlBase: MUST_USE_ATTRIBUTE, + xmlLang: MUST_USE_ATTRIBUTE, + xmlSpace: MUST_USE_ATTRIBUTE, + y1: MUST_USE_ATTRIBUTE, + y2: MUST_USE_ATTRIBUTE, + y: MUST_USE_ATTRIBUTE + }, + DOMAttributeNamespaces: { + xlinkActuate: NS.xlink, + xlinkArcrole: NS.xlink, + xlinkHref: NS.xlink, + xlinkRole: NS.xlink, + xlinkShow: NS.xlink, + xlinkTitle: NS.xlink, + xlinkType: NS.xlink, + xmlBase: NS.xml, + xmlLang: NS.xml, + xmlSpace: NS.xml + }, + DOMAttributeNames: { + clipPath: 'clip-path', + fillOpacity: 'fill-opacity', + fontFamily: 'font-family', + fontSize: 'font-size', + gradientTransform: 'gradientTransform', + gradientUnits: 'gradientUnits', + markerEnd: 'marker-end', + markerMid: 'marker-mid', + markerStart: 'marker-start', + patternContentUnits: 'patternContentUnits', + patternUnits: 'patternUnits', + preserveAspectRatio: 'preserveAspectRatio', + spreadMethod: 'spreadMethod', + stopColor: 'stop-color', + stopOpacity: 'stop-opacity', + strokeDasharray: 'stroke-dasharray', + strokeLinecap: 'stroke-linecap', + strokeOpacity: 'stroke-opacity', + strokeWidth: 'stroke-width', + textAnchor: 'text-anchor', + viewBox: 'viewBox', + xlinkActuate: 'xlink:actuate', + xlinkArcrole: 'xlink:arcrole', + xlinkHref: 'xlink:href', + xlinkRole: 'xlink:role', + xlinkShow: 'xlink:show', + xlinkTitle: 'xlink:title', + xlinkType: 'xlink:type', + xmlBase: 'xml:base', + xmlLang: 'xml:lang', + xmlSpace: 'xml:space' + } + }; + + module.exports = SVGDOMPropertyConfig; + +/***/ }, +/* 141 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactDefaultPerf + * @typechecks static-only + */ + + 'use strict'; + + var DOMProperty = __webpack_require__(22); + var ReactDefaultPerfAnalysis = __webpack_require__(142); + var ReactMount = __webpack_require__(27); + var ReactPerf = __webpack_require__(17); + + var performanceNow = __webpack_require__(143); + + function roundFloat(val) { + return Math.floor(val * 100) / 100; + } + + function addValue(obj, key, val) { + obj[key] = (obj[key] || 0) + val; + } + + var ReactDefaultPerf = { + _allMeasurements: [], // last item in the list is the current one + _mountStack: [0], + _injected: false, + + start: function () { + if (!ReactDefaultPerf._injected) { + ReactPerf.injection.injectMeasure(ReactDefaultPerf.measure); + } + + ReactDefaultPerf._allMeasurements.length = 0; + ReactPerf.enableMeasure = true; + }, + + stop: function () { + ReactPerf.enableMeasure = false; + }, + + getLastMeasurements: function () { + return ReactDefaultPerf._allMeasurements; + }, + + printExclusive: function (measurements) { + measurements = measurements || ReactDefaultPerf._allMeasurements; + var summary = ReactDefaultPerfAnalysis.getExclusiveSummary(measurements); + console.table(summary.map(function (item) { + return { + 'Component class name': item.componentName, + 'Total inclusive time (ms)': roundFloat(item.inclusive), + 'Exclusive mount time (ms)': roundFloat(item.exclusive), + 'Exclusive render time (ms)': roundFloat(item.render), + 'Mount time per instance (ms)': roundFloat(item.exclusive / item.count), + 'Render time per instance (ms)': roundFloat(item.render / item.count), + 'Instances': item.count + }; + })); + // TODO: ReactDefaultPerfAnalysis.getTotalTime() does not return the correct + // number. + }, + + printInclusive: function (measurements) { + measurements = measurements || ReactDefaultPerf._allMeasurements; + var summary = ReactDefaultPerfAnalysis.getInclusiveSummary(measurements); + console.table(summary.map(function (item) { + return { + 'Owner > component': item.componentName, + 'Inclusive time (ms)': roundFloat(item.time), + 'Instances': item.count + }; + })); + console.log('Total time:', ReactDefaultPerfAnalysis.getTotalTime(measurements).toFixed(2) + ' ms'); + }, + + getMeasurementsSummaryMap: function (measurements) { + var summary = ReactDefaultPerfAnalysis.getInclusiveSummary(measurements, true); + return summary.map(function (item) { + return { + 'Owner > component': item.componentName, + 'Wasted time (ms)': item.time, + 'Instances': item.count + }; + }); + }, + + printWasted: function (measurements) { + measurements = measurements || ReactDefaultPerf._allMeasurements; + console.table(ReactDefaultPerf.getMeasurementsSummaryMap(measurements)); + console.log('Total time:', ReactDefaultPerfAnalysis.getTotalTime(measurements).toFixed(2) + ' ms'); + }, + + printDOM: function (measurements) { + measurements = measurements || ReactDefaultPerf._allMeasurements; + var summary = ReactDefaultPerfAnalysis.getDOMSummary(measurements); + console.table(summary.map(function (item) { + var result = {}; + result[DOMProperty.ID_ATTRIBUTE_NAME] = item.id; + result.type = item.type; + result.args = JSON.stringify(item.args); + return result; + })); + console.log('Total time:', ReactDefaultPerfAnalysis.getTotalTime(measurements).toFixed(2) + ' ms'); + }, + + _recordWrite: function (id, fnName, totalTime, args) { + // TODO: totalTime isn't that useful since it doesn't count paints/reflows + var writes = ReactDefaultPerf._allMeasurements[ReactDefaultPerf._allMeasurements.length - 1].writes; + writes[id] = writes[id] || []; + writes[id].push({ + type: fnName, + time: totalTime, + args: args + }); + }, + + measure: function (moduleName, fnName, func) { + return function () { + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + var totalTime; + var rv; + var start; + + if (fnName === '_renderNewRootComponent' || fnName === 'flushBatchedUpdates') { + // A "measurement" is a set of metrics recorded for each flush. We want + // to group the metrics for a given flush together so we can look at the + // components that rendered and the DOM operations that actually + // happened to determine the amount of "wasted work" performed. + ReactDefaultPerf._allMeasurements.push({ + exclusive: {}, + inclusive: {}, + render: {}, + counts: {}, + writes: {}, + displayNames: {}, + totalTime: 0, + created: {} + }); + start = performanceNow(); + rv = func.apply(this, args); + ReactDefaultPerf._allMeasurements[ReactDefaultPerf._allMeasurements.length - 1].totalTime = performanceNow() - start; + return rv; + } else if (fnName === '_mountImageIntoNode' || moduleName === 'ReactBrowserEventEmitter' || moduleName === 'ReactDOMIDOperations' || moduleName === 'CSSPropertyOperations' || moduleName === 'DOMChildrenOperations' || moduleName === 'DOMPropertyOperations') { + start = performanceNow(); + rv = func.apply(this, args); + totalTime = performanceNow() - start; + + if (fnName === '_mountImageIntoNode') { + var mountID = ReactMount.getID(args[1]); + ReactDefaultPerf._recordWrite(mountID, fnName, totalTime, args[0]); + } else if (fnName === 'dangerouslyProcessChildrenUpdates') { + // special format + args[0].forEach(function (update) { + var writeArgs = {}; + if (update.fromIndex !== null) { + writeArgs.fromIndex = update.fromIndex; + } + if (update.toIndex !== null) { + writeArgs.toIndex = update.toIndex; + } + if (update.textContent !== null) { + writeArgs.textContent = update.textContent; + } + if (update.markupIndex !== null) { + writeArgs.markup = args[1][update.markupIndex]; + } + ReactDefaultPerf._recordWrite(update.parentID, update.type, totalTime, writeArgs); + }); + } else { + // basic format + var id = args[0]; + if (typeof id === 'object') { + id = ReactMount.getID(args[0]); + } + ReactDefaultPerf._recordWrite(id, fnName, totalTime, Array.prototype.slice.call(args, 1)); + } + return rv; + } else if (moduleName === 'ReactCompositeComponent' && (fnName === 'mountComponent' || fnName === 'updateComponent' || // TODO: receiveComponent()? + fnName === '_renderValidatedComponent')) { + + if (this._currentElement.type === ReactMount.TopLevelWrapper) { + return func.apply(this, args); + } + + var rootNodeID = fnName === 'mountComponent' ? args[0] : this._rootNodeID; + var isRender = fnName === '_renderValidatedComponent'; + var isMount = fnName === 'mountComponent'; + + var mountStack = ReactDefaultPerf._mountStack; + var entry = ReactDefaultPerf._allMeasurements[ReactDefaultPerf._allMeasurements.length - 1]; + + if (isRender) { + addValue(entry.counts, rootNodeID, 1); + } else if (isMount) { + entry.created[rootNodeID] = true; + mountStack.push(0); + } + + start = performanceNow(); + rv = func.apply(this, args); + totalTime = performanceNow() - start; + + if (isRender) { + addValue(entry.render, rootNodeID, totalTime); + } else if (isMount) { + var subMountTime = mountStack.pop(); + mountStack[mountStack.length - 1] += totalTime; + addValue(entry.exclusive, rootNodeID, totalTime - subMountTime); + addValue(entry.inclusive, rootNodeID, totalTime); + } else { + addValue(entry.inclusive, rootNodeID, totalTime); + } + + entry.displayNames[rootNodeID] = { + current: this.getName(), + owner: this._currentElement._owner ? this._currentElement._owner.getName() : '<root>' + }; + + return rv; + } else { + return func.apply(this, args); + } + }; + } + }; + + module.exports = ReactDefaultPerf; + +/***/ }, +/* 142 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactDefaultPerfAnalysis + */ + + 'use strict'; + + var assign = __webpack_require__(38); + + // Don't try to save users less than 1.2ms (a number I made up) + var DONT_CARE_THRESHOLD = 1.2; + var DOM_OPERATION_TYPES = { + '_mountImageIntoNode': 'set innerHTML', + INSERT_MARKUP: 'set innerHTML', + MOVE_EXISTING: 'move', + REMOVE_NODE: 'remove', + SET_MARKUP: 'set innerHTML', + TEXT_CONTENT: 'set textContent', + 'setValueForProperty': 'update attribute', + 'setValueForAttribute': 'update attribute', + 'deleteValueForProperty': 'remove attribute', + 'dangerouslyReplaceNodeWithMarkupByID': 'replace' + }; + + function getTotalTime(measurements) { + // TODO: return number of DOM ops? could be misleading. + // TODO: measure dropped frames after reconcile? + // TODO: log total time of each reconcile and the top-level component + // class that triggered it. + var totalTime = 0; + for (var i = 0; i < measurements.length; i++) { + var measurement = measurements[i]; + totalTime += measurement.totalTime; + } + return totalTime; + } + + function getDOMSummary(measurements) { + var items = []; + measurements.forEach(function (measurement) { + Object.keys(measurement.writes).forEach(function (id) { + measurement.writes[id].forEach(function (write) { + items.push({ + id: id, + type: DOM_OPERATION_TYPES[write.type] || write.type, + args: write.args + }); + }); + }); + }); + return items; + } + + function getExclusiveSummary(measurements) { + var candidates = {}; + var displayName; + + for (var i = 0; i < measurements.length; i++) { + var measurement = measurements[i]; + var allIDs = assign({}, measurement.exclusive, measurement.inclusive); + + for (var id in allIDs) { + displayName = measurement.displayNames[id].current; + + candidates[displayName] = candidates[displayName] || { + componentName: displayName, + inclusive: 0, + exclusive: 0, + render: 0, + count: 0 + }; + if (measurement.render[id]) { + candidates[displayName].render += measurement.render[id]; + } + if (measurement.exclusive[id]) { + candidates[displayName].exclusive += measurement.exclusive[id]; + } + if (measurement.inclusive[id]) { + candidates[displayName].inclusive += measurement.inclusive[id]; + } + if (measurement.counts[id]) { + candidates[displayName].count += measurement.counts[id]; + } + } + } + + // Now make a sorted array with the results. + var arr = []; + for (displayName in candidates) { + if (candidates[displayName].exclusive >= DONT_CARE_THRESHOLD) { + arr.push(candidates[displayName]); + } + } + + arr.sort(function (a, b) { + return b.exclusive - a.exclusive; + }); + + return arr; + } + + function getInclusiveSummary(measurements, onlyClean) { + var candidates = {}; + var inclusiveKey; + + for (var i = 0; i < measurements.length; i++) { + var measurement = measurements[i]; + var allIDs = assign({}, measurement.exclusive, measurement.inclusive); + var cleanComponents; + + if (onlyClean) { + cleanComponents = getUnchangedComponents(measurement); + } + + for (var id in allIDs) { + if (onlyClean && !cleanComponents[id]) { + continue; + } + + var displayName = measurement.displayNames[id]; + + // Inclusive time is not useful for many components without knowing where + // they are instantiated. So we aggregate inclusive time with both the + // owner and current displayName as the key. + inclusiveKey = displayName.owner + ' > ' + displayName.current; + + candidates[inclusiveKey] = candidates[inclusiveKey] || { + componentName: inclusiveKey, + time: 0, + count: 0 + }; + + if (measurement.inclusive[id]) { + candidates[inclusiveKey].time += measurement.inclusive[id]; + } + if (measurement.counts[id]) { + candidates[inclusiveKey].count += measurement.counts[id]; + } + } + } + + // Now make a sorted array with the results. + var arr = []; + for (inclusiveKey in candidates) { + if (candidates[inclusiveKey].time >= DONT_CARE_THRESHOLD) { + arr.push(candidates[inclusiveKey]); + } + } + + arr.sort(function (a, b) { + return b.time - a.time; + }); + + return arr; + } + + function getUnchangedComponents(measurement) { + // For a given reconcile, look at which components did not actually + // render anything to the DOM and return a mapping of their ID to + // the amount of time it took to render the entire subtree. + var cleanComponents = {}; + var dirtyLeafIDs = Object.keys(measurement.writes); + var allIDs = assign({}, measurement.exclusive, measurement.inclusive); + + for (var id in allIDs) { + var isDirty = false; + // For each component that rendered, see if a component that triggered + // a DOM op is in its subtree. + for (var i = 0; i < dirtyLeafIDs.length; i++) { + if (dirtyLeafIDs[i].indexOf(id) === 0) { + isDirty = true; + break; + } + } + // check if component newly created + if (measurement.created[id]) { + isDirty = true; + } + if (!isDirty && measurement.counts[id] > 0) { + cleanComponents[id] = true; + } + } + return cleanComponents; + } + + var ReactDefaultPerfAnalysis = { + getExclusiveSummary: getExclusiveSummary, + getInclusiveSummary: getInclusiveSummary, + getDOMSummary: getDOMSummary, + getTotalTime: getTotalTime + }; + + module.exports = ReactDefaultPerfAnalysis; + +/***/ }, +/* 143 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule performanceNow + * @typechecks + */ + + 'use strict'; + + var performance = __webpack_require__(144); + var curPerformance = performance; + + /** + * Detect if we can use `window.performance.now()` and gracefully fallback to + * `Date.now()` if it doesn't exist. We need to support Firefox < 15 for now + * because of Facebook's testing infrastructure. + */ + if (!curPerformance || !curPerformance.now) { + curPerformance = Date; + } + + var performanceNow = curPerformance.now.bind(curPerformance); + + module.exports = performanceNow; + +/***/ }, +/* 144 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule performance + * @typechecks + */ + + 'use strict'; + + var ExecutionEnvironment = __webpack_require__(8); + + var performance; + + if (ExecutionEnvironment.canUseDOM) { + performance = window.performance || window.msPerformance || window.webkitPerformance; + } + + module.exports = performance || {}; + +/***/ }, +/* 145 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactVersion + */ + + 'use strict'; + + module.exports = '0.14.3'; + +/***/ }, +/* 146 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule renderSubtreeIntoContainer + */ + + 'use strict'; + + var ReactMount = __webpack_require__(27); + + module.exports = ReactMount.renderSubtreeIntoContainer; + +/***/ }, +/* 147 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + module.exports = __webpack_require__(148); + + +/***/ }, +/* 148 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule React + */ + + 'use strict'; + + var ReactDOM = __webpack_require__(2); + var ReactDOMServer = __webpack_require__(149); + var ReactIsomorphic = __webpack_require__(153); + + var assign = __webpack_require__(38); + var deprecated = __webpack_require__(158); + + // `version` will be added here by ReactIsomorphic. + var React = {}; + + assign(React, ReactIsomorphic); + + assign(React, { + // ReactDOM + findDOMNode: deprecated('findDOMNode', 'ReactDOM', 'react-dom', ReactDOM, ReactDOM.findDOMNode), + render: deprecated('render', 'ReactDOM', 'react-dom', ReactDOM, ReactDOM.render), + unmountComponentAtNode: deprecated('unmountComponentAtNode', 'ReactDOM', 'react-dom', ReactDOM, ReactDOM.unmountComponentAtNode), + + // ReactDOMServer + renderToString: deprecated('renderToString', 'ReactDOMServer', 'react-dom/server', ReactDOMServer, ReactDOMServer.renderToString), + renderToStaticMarkup: deprecated('renderToStaticMarkup', 'ReactDOMServer', 'react-dom/server', ReactDOMServer, ReactDOMServer.renderToStaticMarkup) + }); + + React.__SECRET_DOM_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ReactDOM; + React.__SECRET_DOM_SERVER_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ReactDOMServer; + + module.exports = React; + +/***/ }, +/* 149 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactDOMServer + */ + + 'use strict'; + + var ReactDefaultInjection = __webpack_require__(70); + var ReactServerRendering = __webpack_require__(150); + var ReactVersion = __webpack_require__(145); + + ReactDefaultInjection.inject(); + + var ReactDOMServer = { + renderToString: ReactServerRendering.renderToString, + renderToStaticMarkup: ReactServerRendering.renderToStaticMarkup, + version: ReactVersion + }; + + module.exports = ReactDOMServer; + +/***/ }, +/* 150 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @typechecks static-only + * @providesModule ReactServerRendering + */ + 'use strict'; + + var ReactDefaultBatchingStrategy = __webpack_require__(91); + var ReactElement = __webpack_require__(41); + var ReactInstanceHandles = __webpack_require__(44); + var ReactMarkupChecksum = __webpack_require__(47); + var ReactServerBatchingStrategy = __webpack_require__(151); + var ReactServerRenderingTransaction = __webpack_require__(152); + var ReactUpdates = __webpack_require__(53); + + var emptyObject = __webpack_require__(57); + var instantiateReactComponent = __webpack_require__(61); + var invariant = __webpack_require__(12); + + /** + * @param {ReactElement} element + * @return {string} the HTML markup + */ + function renderToString(element) { + !ReactElement.isValidElement(element) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'renderToString(): You must pass a valid ReactElement.') : invariant(false) : undefined; + + var transaction; + try { + ReactUpdates.injection.injectBatchingStrategy(ReactServerBatchingStrategy); + + var id = ReactInstanceHandles.createReactRootID(); + transaction = ReactServerRenderingTransaction.getPooled(false); + + return transaction.perform(function () { + var componentInstance = instantiateReactComponent(element, null); + var markup = componentInstance.mountComponent(id, transaction, emptyObject); + return ReactMarkupChecksum.addChecksumToMarkup(markup); + }, null); + } finally { + ReactServerRenderingTransaction.release(transaction); + // Revert to the DOM batching strategy since these two renderers + // currently share these stateful modules. + ReactUpdates.injection.injectBatchingStrategy(ReactDefaultBatchingStrategy); + } + } + + /** + * @param {ReactElement} element + * @return {string} the HTML markup, without the extra React ID and checksum + * (for generating static pages) + */ + function renderToStaticMarkup(element) { + !ReactElement.isValidElement(element) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'renderToStaticMarkup(): You must pass a valid ReactElement.') : invariant(false) : undefined; + + var transaction; + try { + ReactUpdates.injection.injectBatchingStrategy(ReactServerBatchingStrategy); + + var id = ReactInstanceHandles.createReactRootID(); + transaction = ReactServerRenderingTransaction.getPooled(true); + + return transaction.perform(function () { + var componentInstance = instantiateReactComponent(element, null); + return componentInstance.mountComponent(id, transaction, emptyObject); + }, null); + } finally { + ReactServerRenderingTransaction.release(transaction); + // Revert to the DOM batching strategy since these two renderers + // currently share these stateful modules. + ReactUpdates.injection.injectBatchingStrategy(ReactDefaultBatchingStrategy); + } + } + + module.exports = { + renderToString: renderToString, + renderToStaticMarkup: renderToStaticMarkup + }; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 151 */ +/***/ function(module, exports) { + + /** + * Copyright 2014-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactServerBatchingStrategy + * @typechecks + */ + + 'use strict'; + + var ReactServerBatchingStrategy = { + isBatchingUpdates: false, + batchedUpdates: function (callback) { + // Don't do anything here. During the server rendering we don't want to + // schedule any updates. We will simply ignore them. + } + }; + + module.exports = ReactServerBatchingStrategy; + +/***/ }, +/* 152 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2014-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactServerRenderingTransaction + * @typechecks + */ + + 'use strict'; + + var PooledClass = __webpack_require__(55); + var CallbackQueue = __webpack_require__(54); + var Transaction = __webpack_require__(56); + + var assign = __webpack_require__(38); + var emptyFunction = __webpack_require__(14); + + /** + * Provides a `CallbackQueue` queue for collecting `onDOMReady` callbacks + * during the performing of the transaction. + */ + var ON_DOM_READY_QUEUEING = { + /** + * Initializes the internal `onDOMReady` queue. + */ + initialize: function () { + this.reactMountReady.reset(); + }, + + close: emptyFunction + }; + + /** + * Executed within the scope of the `Transaction` instance. Consider these as + * being member methods, but with an implied ordering while being isolated from + * each other. + */ + var TRANSACTION_WRAPPERS = [ON_DOM_READY_QUEUEING]; + + /** + * @class ReactServerRenderingTransaction + * @param {boolean} renderToStaticMarkup + */ + function ReactServerRenderingTransaction(renderToStaticMarkup) { + this.reinitializeTransaction(); + this.renderToStaticMarkup = renderToStaticMarkup; + this.reactMountReady = CallbackQueue.getPooled(null); + this.useCreateElement = false; + } + + var Mixin = { + /** + * @see Transaction + * @abstract + * @final + * @return {array} Empty list of operation wrap procedures. + */ + getTransactionWrappers: function () { + return TRANSACTION_WRAPPERS; + }, + + /** + * @return {object} The queue to collect `onDOMReady` callbacks with. + */ + getReactMountReady: function () { + return this.reactMountReady; + }, + + /** + * `PooledClass` looks for this, and will invoke this before allowing this + * instance to be reused. + */ + destructor: function () { + CallbackQueue.release(this.reactMountReady); + this.reactMountReady = null; + } + }; + + assign(ReactServerRenderingTransaction.prototype, Transaction.Mixin, Mixin); + + PooledClass.addPoolingTo(ReactServerRenderingTransaction); + + module.exports = ReactServerRenderingTransaction; + +/***/ }, +/* 153 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactIsomorphic + */ + + 'use strict'; + + var ReactChildren = __webpack_require__(109); + var ReactComponent = __webpack_require__(122); + var ReactClass = __webpack_require__(121); + var ReactDOMFactories = __webpack_require__(154); + var ReactElement = __webpack_require__(41); + var ReactElementValidator = __webpack_require__(155); + var ReactPropTypes = __webpack_require__(106); + var ReactVersion = __webpack_require__(145); + + var assign = __webpack_require__(38); + var onlyChild = __webpack_require__(157); + + var createElement = ReactElement.createElement; + var createFactory = ReactElement.createFactory; + var cloneElement = ReactElement.cloneElement; + + if (process.env.NODE_ENV !== 'production') { + createElement = ReactElementValidator.createElement; + createFactory = ReactElementValidator.createFactory; + cloneElement = ReactElementValidator.cloneElement; + } + + var React = { + + // Modern + + Children: { + map: ReactChildren.map, + forEach: ReactChildren.forEach, + count: ReactChildren.count, + toArray: ReactChildren.toArray, + only: onlyChild + }, + + Component: ReactComponent, + + createElement: createElement, + cloneElement: cloneElement, + isValidElement: ReactElement.isValidElement, + + // Classic + + PropTypes: ReactPropTypes, + createClass: ReactClass.createClass, + createFactory: createFactory, + createMixin: function (mixin) { + // Currently a noop. Will be used to validate and trace mixins. + return mixin; + }, + + // This looks DOM specific but these are actually isomorphic helpers + // since they are just generating DOM strings. + DOM: ReactDOMFactories, + + version: ReactVersion, + + // Hook for JSX spread, don't use this for anything else. + __spread: assign + }; + + module.exports = React; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 154 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactDOMFactories + * @typechecks static-only + */ + + 'use strict'; + + var ReactElement = __webpack_require__(41); + var ReactElementValidator = __webpack_require__(155); + + var mapObject = __webpack_require__(156); + + /** + * Create a factory that creates HTML tag elements. + * + * @param {string} tag Tag name (e.g. `div`). + * @private + */ + function createDOMFactory(tag) { + if (process.env.NODE_ENV !== 'production') { + return ReactElementValidator.createFactory(tag); + } + return ReactElement.createFactory(tag); + } + + /** + * Creates a mapping from supported HTML tags to `ReactDOMComponent` classes. + * This is also accessible via `React.DOM`. + * + * @public + */ + var ReactDOMFactories = mapObject({ + a: 'a', + abbr: 'abbr', + address: 'address', + area: 'area', + article: 'article', + aside: 'aside', + audio: 'audio', + b: 'b', + base: 'base', + bdi: 'bdi', + bdo: 'bdo', + big: 'big', + blockquote: 'blockquote', + body: 'body', + br: 'br', + button: 'button', + canvas: 'canvas', + caption: 'caption', + cite: 'cite', + code: 'code', + col: 'col', + colgroup: 'colgroup', + data: 'data', + datalist: 'datalist', + dd: 'dd', + del: 'del', + details: 'details', + dfn: 'dfn', + dialog: 'dialog', + div: 'div', + dl: 'dl', + dt: 'dt', + em: 'em', + embed: 'embed', + fieldset: 'fieldset', + figcaption: 'figcaption', + figure: 'figure', + footer: 'footer', + form: 'form', + h1: 'h1', + h2: 'h2', + h3: 'h3', + h4: 'h4', + h5: 'h5', + h6: 'h6', + head: 'head', + header: 'header', + hgroup: 'hgroup', + hr: 'hr', + html: 'html', + i: 'i', + iframe: 'iframe', + img: 'img', + input: 'input', + ins: 'ins', + kbd: 'kbd', + keygen: 'keygen', + label: 'label', + legend: 'legend', + li: 'li', + link: 'link', + main: 'main', + map: 'map', + mark: 'mark', + menu: 'menu', + menuitem: 'menuitem', + meta: 'meta', + meter: 'meter', + nav: 'nav', + noscript: 'noscript', + object: 'object', + ol: 'ol', + optgroup: 'optgroup', + option: 'option', + output: 'output', + p: 'p', + param: 'param', + picture: 'picture', + pre: 'pre', + progress: 'progress', + q: 'q', + rp: 'rp', + rt: 'rt', + ruby: 'ruby', + s: 's', + samp: 'samp', + script: 'script', + section: 'section', + select: 'select', + small: 'small', + source: 'source', + span: 'span', + strong: 'strong', + style: 'style', + sub: 'sub', + summary: 'summary', + sup: 'sup', + table: 'table', + tbody: 'tbody', + td: 'td', + textarea: 'textarea', + tfoot: 'tfoot', + th: 'th', + thead: 'thead', + time: 'time', + title: 'title', + tr: 'tr', + track: 'track', + u: 'u', + ul: 'ul', + 'var': 'var', + video: 'video', + wbr: 'wbr', + + // SVG + circle: 'circle', + clipPath: 'clipPath', + defs: 'defs', + ellipse: 'ellipse', + g: 'g', + image: 'image', + line: 'line', + linearGradient: 'linearGradient', + mask: 'mask', + path: 'path', + pattern: 'pattern', + polygon: 'polygon', + polyline: 'polyline', + radialGradient: 'radialGradient', + rect: 'rect', + stop: 'stop', + svg: 'svg', + text: 'text', + tspan: 'tspan' + + }, createDOMFactory); + + module.exports = ReactDOMFactories; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 155 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2014-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactElementValidator + */ + + /** + * ReactElementValidator provides a wrapper around a element factory + * which validates the props passed to the element. This is intended to be + * used only in DEV and could be replaced by a static type checker for languages + * that support it. + */ + + 'use strict'; + + var ReactElement = __webpack_require__(41); + var ReactPropTypeLocations = __webpack_require__(64); + var ReactPropTypeLocationNames = __webpack_require__(65); + var ReactCurrentOwner = __webpack_require__(4); + + var canDefineProperty = __webpack_require__(42); + var getIteratorFn = __webpack_require__(107); + var invariant = __webpack_require__(12); + var warning = __webpack_require__(24); + + function getDeclarationErrorAddendum() { + if (ReactCurrentOwner.current) { + var name = ReactCurrentOwner.current.getName(); + if (name) { + return ' Check the render method of `' + name + '`.'; + } + } + return ''; + } + + /** + * Warn if there's no key explicitly set on dynamic arrays of children or + * object keys are not valid. This allows us to keep track of children between + * updates. + */ + var ownerHasKeyUseWarning = {}; + + var loggedTypeFailures = {}; + + /** + * Warn if the element doesn't have an explicit key assigned to it. + * This element is in an array. The array could grow and shrink or be + * reordered. All children that haven't already been validated are required to + * have a "key" property assigned to it. + * + * @internal + * @param {ReactElement} element Element that requires a key. + * @param {*} parentType element's parent's type. + */ + function validateExplicitKey(element, parentType) { + if (!element._store || element._store.validated || element.key != null) { + return; + } + element._store.validated = true; + + var addenda = getAddendaForKeyUse('uniqueKey', element, parentType); + if (addenda === null) { + // we already showed the warning + return; + } + process.env.NODE_ENV !== 'production' ? warning(false, 'Each child in an array or iterator should have a unique "key" prop.' + '%s%s%s', addenda.parentOrOwner || '', addenda.childOwner || '', addenda.url || '') : undefined; + } + + /** + * Shared warning and monitoring code for the key warnings. + * + * @internal + * @param {string} messageType A key used for de-duping warnings. + * @param {ReactElement} element Component that requires a key. + * @param {*} parentType element's parent's type. + * @returns {?object} A set of addenda to use in the warning message, or null + * if the warning has already been shown before (and shouldn't be shown again). + */ + function getAddendaForKeyUse(messageType, element, parentType) { + var addendum = getDeclarationErrorAddendum(); + if (!addendum) { + var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name; + if (parentName) { + addendum = ' Check the top-level render call using <' + parentName + '>.'; + } + } + + var memoizer = ownerHasKeyUseWarning[messageType] || (ownerHasKeyUseWarning[messageType] = {}); + if (memoizer[addendum]) { + return null; + } + memoizer[addendum] = true; + + var addenda = { + parentOrOwner: addendum, + url: ' See https://fb.me/react-warning-keys for more information.', + childOwner: null + }; + + // Usually the current owner is the offender, but if it accepts children as a + // property, it may be the creator of the child that's responsible for + // assigning it a key. + if (element && element._owner && element._owner !== ReactCurrentOwner.current) { + // Give the component that originally created this child. + addenda.childOwner = ' It was passed a child from ' + element._owner.getName() + '.'; + } + + return addenda; + } + + /** + * Ensure that every element either is passed in a static location, in an + * array with an explicit keys property defined, or in an object literal + * with valid key property. + * + * @internal + * @param {ReactNode} node Statically passed child of any type. + * @param {*} parentType node's parent's type. + */ + function validateChildKeys(node, parentType) { + if (typeof node !== 'object') { + return; + } + if (Array.isArray(node)) { + for (var i = 0; i < node.length; i++) { + var child = node[i]; + if (ReactElement.isValidElement(child)) { + validateExplicitKey(child, parentType); + } + } + } else if (ReactElement.isValidElement(node)) { + // This element was passed in a valid location. + if (node._store) { + node._store.validated = true; + } + } else if (node) { + var iteratorFn = getIteratorFn(node); + // Entry iterators provide implicit keys. + if (iteratorFn) { + if (iteratorFn !== node.entries) { + var iterator = iteratorFn.call(node); + var step; + while (!(step = iterator.next()).done) { + if (ReactElement.isValidElement(step.value)) { + validateExplicitKey(step.value, parentType); + } + } + } + } + } + } + + /** + * Assert that the props are valid + * + * @param {string} componentName Name of the component for error messages. + * @param {object} propTypes Map of prop name to a ReactPropType + * @param {object} props + * @param {string} location e.g. "prop", "context", "child context" + * @private + */ + function checkPropTypes(componentName, propTypes, props, location) { + for (var propName in propTypes) { + if (propTypes.hasOwnProperty(propName)) { + var error; + // Prop type validation may throw. In case they do, we don't want to + // fail the render phase where it didn't fail before. So we log it. + // After these have been cleaned up, we'll let them throw. + try { + // This is intentionally an invariant that gets caught. It's the same + // behavior as without this statement except with a better message. + !(typeof propTypes[propName] === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s: %s type `%s` is invalid; it must be a function, usually from ' + 'React.PropTypes.', componentName || 'React class', ReactPropTypeLocationNames[location], propName) : invariant(false) : undefined; + error = propTypes[propName](props, propName, componentName, location); + } catch (ex) { + error = ex; + } + process.env.NODE_ENV !== 'production' ? warning(!error || error instanceof Error, '%s: type specification of %s `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', ReactPropTypeLocationNames[location], propName, typeof error) : undefined; + if (error instanceof Error && !(error.message in loggedTypeFailures)) { + // Only monitor this failure once because there tends to be a lot of the + // same error. + loggedTypeFailures[error.message] = true; + + var addendum = getDeclarationErrorAddendum(); + process.env.NODE_ENV !== 'production' ? warning(false, 'Failed propType: %s%s', error.message, addendum) : undefined; + } + } + } + } + + /** + * Given an element, validate that its props follow the propTypes definition, + * provided by the type. + * + * @param {ReactElement} element + */ + function validatePropTypes(element) { + var componentClass = element.type; + if (typeof componentClass !== 'function') { + return; + } + var name = componentClass.displayName || componentClass.name; + if (componentClass.propTypes) { + checkPropTypes(name, componentClass.propTypes, element.props, ReactPropTypeLocations.prop); + } + if (typeof componentClass.getDefaultProps === 'function') { + process.env.NODE_ENV !== 'production' ? warning(componentClass.getDefaultProps.isReactClassApproved, 'getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.') : undefined; + } + } + + var ReactElementValidator = { + + createElement: function (type, props, children) { + var validType = typeof type === 'string' || typeof type === 'function'; + // We warn in this case but don't throw. We expect the element creation to + // succeed and there will likely be errors in render. + process.env.NODE_ENV !== 'production' ? warning(validType, 'React.createElement: type should not be null, undefined, boolean, or ' + 'number. It should be a string (for DOM elements) or a ReactClass ' + '(for composite components).%s', getDeclarationErrorAddendum()) : undefined; + + var element = ReactElement.createElement.apply(this, arguments); + + // The result can be nullish if a mock or a custom function is used. + // TODO: Drop this when these are no longer allowed as the type argument. + if (element == null) { + return element; + } + + // Skip key warning if the type isn't valid since our key validation logic + // doesn't expect a non-string/function type and can throw confusing errors. + // We don't want exception behavior to differ between dev and prod. + // (Rendering will throw with a helpful message and as soon as the type is + // fixed, the key warnings will appear.) + if (validType) { + for (var i = 2; i < arguments.length; i++) { + validateChildKeys(arguments[i], type); + } + } + + validatePropTypes(element); + + return element; + }, + + createFactory: function (type) { + var validatedFactory = ReactElementValidator.createElement.bind(null, type); + // Legacy hook TODO: Warn if this is accessed + validatedFactory.type = type; + + if (process.env.NODE_ENV !== 'production') { + if (canDefineProperty) { + Object.defineProperty(validatedFactory, 'type', { + enumerable: false, + get: function () { + process.env.NODE_ENV !== 'production' ? warning(false, 'Factory.type is deprecated. Access the class directly ' + 'before passing it to createFactory.') : undefined; + Object.defineProperty(this, 'type', { + value: type + }); + return type; + } + }); + } + } + + return validatedFactory; + }, + + cloneElement: function (element, props, children) { + var newElement = ReactElement.cloneElement.apply(this, arguments); + for (var i = 2; i < arguments.length; i++) { + validateChildKeys(arguments[i], newElement.type); + } + validatePropTypes(newElement); + return newElement; + } + + }; + + module.exports = ReactElementValidator; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 156 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule mapObject + */ + + 'use strict'; + + var hasOwnProperty = Object.prototype.hasOwnProperty; + + /** + * Executes the provided `callback` once for each enumerable own property in the + * object and constructs a new object from the results. The `callback` is + * invoked with three arguments: + * + * - the property value + * - the property name + * - the object being traversed + * + * Properties that are added after the call to `mapObject` will not be visited + * by `callback`. If the values of existing properties are changed, the value + * passed to `callback` will be the value at the time `mapObject` visits them. + * Properties that are deleted before being visited are not visited. + * + * @grep function objectMap() + * @grep function objMap() + * + * @param {?object} object + * @param {function} callback + * @param {*} context + * @return {?object} + */ + function mapObject(object, callback, context) { + if (!object) { + return null; + } + var result = {}; + for (var name in object) { + if (hasOwnProperty.call(object, name)) { + result[name] = callback.call(context, object[name], name, object); + } + } + return result; + } + + module.exports = mapObject; + +/***/ }, +/* 157 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule onlyChild + */ + 'use strict'; + + var ReactElement = __webpack_require__(41); + + var invariant = __webpack_require__(12); + + /** + * Returns the first child in a collection of children and verifies that there + * is only one child in the collection. The current implementation of this + * function assumes that a single child gets passed without a wrapper, but the + * purpose of this helper function is to abstract away the particular structure + * of children. + * + * @param {?object} children Child collection structure. + * @return {ReactComponent} The first and only `ReactComponent` contained in the + * structure. + */ + function onlyChild(children) { + !ReactElement.isValidElement(children) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'onlyChild must be passed a children with exactly one child.') : invariant(false) : undefined; + return children; + } + + module.exports = onlyChild; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 158 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule deprecated + */ + + 'use strict'; + + var assign = __webpack_require__(38); + var warning = __webpack_require__(24); + + /** + * This will log a single deprecation notice per function and forward the call + * on to the new API. + * + * @param {string} fnName The name of the function + * @param {string} newModule The module that fn will exist in + * @param {string} newPackage The module that fn will exist in + * @param {*} ctx The context this forwarded call should run in + * @param {function} fn The function to forward on to + * @return {function} The function that will warn once and then call fn + */ + function deprecated(fnName, newModule, newPackage, ctx, fn) { + var warned = false; + if (process.env.NODE_ENV !== 'production') { + var newFn = function () { + process.env.NODE_ENV !== 'production' ? warning(warned, + // Require examples in this string must be split to prevent React's + // build tools from mistaking them for real requires. + // Otherwise the build tools will attempt to build a '%s' module. + 'React.%s is deprecated. Please use %s.%s from require' + '(\'%s\') ' + 'instead.', fnName, newModule, fnName, newPackage) : undefined; + warned = true; + return fn.apply(ctx, arguments); + }; + // We need to make sure all properties of the original fn are copied over. + // In particular, this is needed to support PropTypes + return assign(newFn, fn); + } + + return fn; + } + + module.exports = deprecated; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 159 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, '__esModule', { + value: true + }); + + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + + var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + + var _react = __webpack_require__(147); + + var _react2 = _interopRequireDefault(_react); + + var _underscore = __webpack_require__(160); + + var _underscore2 = _interopRequireDefault(_underscore); + + var _jquery = __webpack_require__(161); + + var _jquery2 = _interopRequireDefault(_jquery); + + var _componentsInput = __webpack_require__(162); + + var _componentsInput2 = _interopRequireDefault(_componentsInput); + + var _componentsIcon = __webpack_require__(163); + + var _componentsIcon2 = _interopRequireDefault(_componentsIcon); + + var _componentsInputError = __webpack_require__(164); + + var _componentsInputError2 = _interopRequireDefault(_componentsInputError); + + var _componentsUtils = __webpack_require__(167); + + var LoginComponent = (function (_React$Component) { + _inherits(LoginComponent, _React$Component); + + function LoginComponent(props) { + var _this = this; + + _classCallCheck(this, LoginComponent); + + _get(Object.getPrototypeOf(LoginComponent.prototype), 'constructor', this).call(this, props); + + this.saveAndContinue = function (event) { + event.preventDefault(); + var data = { + username: _this.state.username, + password: _this.state.password, + 'continue': decodeURIComponent((0, _componentsUtils.getQueryVariable)('continue')) + }, + self = _this; + + _jquery2['default'].post('/login/', data).done(function (result) { + var res = JSON.parse(result); + if (res.r) { + self.setState({ + errorVisible: true, + errorMessage: res.message + }); + } else { + window.location = res['continue']; + } + }); + }; + + this.handleUsernameInput = function (event) { + _this.setState({ + username: event.target.value + }); + }; + + this.handlePasswordInput = function (event) { + _this.setState({ + password: event.target.value + }); + }; + + this.state = { + username: null, + password: null, + errorVisible: false, + errorMessage: '登录失败, 请联系管理员' + }; + } + + _createClass(LoginComponent, [{ + key: 'render', + value: function render() { + return _react2['default'].createElement( + 'div', + { className: 'create_account_screen' }, + _react2['default'].createElement( + 'div', + { className: 'create_account_form' }, + _react2['default'].createElement( + 'h1', + null, + '登录CODE' + ), + _react2['default'].createElement( + 'form', + { onSubmit: this.saveAndContinue }, + _react2['default'].createElement(_componentsInput2['default'], { + text: '用户名', + ref: 'username', + type: 'text', + defaultValue: this.state.username, + value: this.state.username, + onChange: this.handleUsernameInput + }), + _react2['default'].createElement(_componentsInput2['default'], { + text: '密码', + type: 'password', + ref: 'text', + defaultValue: this.state.username, + value: this.state.passsword, + onChange: this.handlePasswordInput + }), + _react2['default'].createElement(_componentsInputError2['default'], { + visible: this.state.errorVisible, + errorMessage: this.state.errorMessage + }), + _react2['default'].createElement( + 'button', + { + type: 'submit', + className: 'button button_wide' }, + '登录' + ) + ) + ) + ); + } + }]); + + return LoginComponent; + })(_react2['default'].Component); + + exports.LoginComponent = LoginComponent; + + var Login = (function (_React$Component2) { + _inherits(Login, _React$Component2); + + function Login() { + _classCallCheck(this, Login); + + _get(Object.getPrototypeOf(Login.prototype), 'constructor', this).apply(this, arguments); + } + + _createClass(Login, [{ + key: 'render', + value: function render() { + return _react2['default'].createElement( + 'div', + { className: 'application_wrapper' }, + _react2['default'].createElement( + 'div', + { className: 'application_routeHandler' }, + _react2['default'].createElement(LoginComponent, null) + ) + ); + } + }]); + + return Login; + })(_react2['default'].Component); + + exports['default'] = Login; + +/***/ }, +/* 160 */ +/***/ function(module, exports, __webpack_require__) { + + var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// Underscore.js 1.8.3 + // http://underscorejs.org + // (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + // Underscore may be freely distributed under the MIT license. + + (function() { + + // Baseline setup + // -------------- + + // Establish the root object, `window` in the browser, or `exports` on the server. + var root = this; + + // Save the previous value of the `_` variable. + var previousUnderscore = root._; + + // Save bytes in the minified (but not gzipped) version: + var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype; + + // Create quick reference variables for speed access to core prototypes. + var + push = ArrayProto.push, + slice = ArrayProto.slice, + toString = ObjProto.toString, + hasOwnProperty = ObjProto.hasOwnProperty; + + // All **ECMAScript 5** native function implementations that we hope to use + // are declared here. + var + nativeIsArray = Array.isArray, + nativeKeys = Object.keys, + nativeBind = FuncProto.bind, + nativeCreate = Object.create; + + // Naked function reference for surrogate-prototype-swapping. + var Ctor = function(){}; + + // Create a safe reference to the Underscore object for use below. + var _ = function(obj) { + if (obj instanceof _) return obj; + if (!(this instanceof _)) return new _(obj); + this._wrapped = obj; + }; + + // Export the Underscore object for **Node.js**, with + // backwards-compatibility for the old `require()` API. If we're in + // the browser, add `_` as a global object. + if (true) { + if (typeof module !== 'undefined' && module.exports) { + exports = module.exports = _; + } + exports._ = _; + } else { + root._ = _; + } + + // Current version. + _.VERSION = '1.8.3'; + + // Internal function that returns an efficient (for current engines) version + // of the passed-in callback, to be repeatedly applied in other Underscore + // functions. + var optimizeCb = function(func, context, argCount) { + if (context === void 0) return func; + switch (argCount == null ? 3 : argCount) { + case 1: return function(value) { + return func.call(context, value); + }; + case 2: return function(value, other) { + return func.call(context, value, other); + }; + case 3: return function(value, index, collection) { + return func.call(context, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(context, accumulator, value, index, collection); + }; + } + return function() { + return func.apply(context, arguments); + }; + }; + + // A mostly-internal function to generate callbacks that can be applied + // to each element in a collection, returning the desired result — either + // identity, an arbitrary callback, a property matcher, or a property accessor. + var cb = function(value, context, argCount) { + if (value == null) return _.identity; + if (_.isFunction(value)) return optimizeCb(value, context, argCount); + if (_.isObject(value)) return _.matcher(value); + return _.property(value); + }; + _.iteratee = function(value, context) { + return cb(value, context, Infinity); + }; + + // An internal function for creating assigner functions. + var createAssigner = function(keysFunc, undefinedOnly) { + return function(obj) { + var length = arguments.length; + if (length < 2 || obj == null) return obj; + for (var index = 1; index < length; index++) { + var source = arguments[index], + keys = keysFunc(source), + l = keys.length; + for (var i = 0; i < l; i++) { + var key = keys[i]; + if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key]; + } + } + return obj; + }; + }; + + // An internal function for creating a new object that inherits from another. + var baseCreate = function(prototype) { + if (!_.isObject(prototype)) return {}; + if (nativeCreate) return nativeCreate(prototype); + Ctor.prototype = prototype; + var result = new Ctor; + Ctor.prototype = null; + return result; + }; + + var property = function(key) { + return function(obj) { + return obj == null ? void 0 : obj[key]; + }; + }; + + // Helper for collection methods to determine whether a collection + // should be iterated as an array or as an object + // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength + // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094 + var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; + var getLength = property('length'); + var isArrayLike = function(collection) { + var length = getLength(collection); + return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX; + }; + + // Collection Functions + // -------------------- + + // The cornerstone, an `each` implementation, aka `forEach`. + // Handles raw objects in addition to array-likes. Treats all + // sparse array-likes as if they were dense. + _.each = _.forEach = function(obj, iteratee, context) { + iteratee = optimizeCb(iteratee, context); + var i, length; + if (isArrayLike(obj)) { + for (i = 0, length = obj.length; i < length; i++) { + iteratee(obj[i], i, obj); + } + } else { + var keys = _.keys(obj); + for (i = 0, length = keys.length; i < length; i++) { + iteratee(obj[keys[i]], keys[i], obj); + } + } + return obj; + }; + + // Return the results of applying the iteratee to each element. + _.map = _.collect = function(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length, + results = Array(length); + for (var index = 0; index < length; index++) { + var currentKey = keys ? keys[index] : index; + results[index] = iteratee(obj[currentKey], currentKey, obj); + } + return results; + }; + + // Create a reducing function iterating left or right. + function createReduce(dir) { + // Optimized iterator function as using arguments.length + // in the main function will deoptimize the, see #1991. + function iterator(obj, iteratee, memo, keys, index, length) { + for (; index >= 0 && index < length; index += dir) { + var currentKey = keys ? keys[index] : index; + memo = iteratee(memo, obj[currentKey], currentKey, obj); + } + return memo; + } + + return function(obj, iteratee, memo, context) { + iteratee = optimizeCb(iteratee, context, 4); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length, + index = dir > 0 ? 0 : length - 1; + // Determine the initial value if none is provided. + if (arguments.length < 3) { + memo = obj[keys ? keys[index] : index]; + index += dir; + } + return iterator(obj, iteratee, memo, keys, index, length); + }; + } + + // **Reduce** builds up a single result from a list of values, aka `inject`, + // or `foldl`. + _.reduce = _.foldl = _.inject = createReduce(1); + + // The right-associative version of reduce, also known as `foldr`. + _.reduceRight = _.foldr = createReduce(-1); + + // Return the first value which passes a truth test. Aliased as `detect`. + _.find = _.detect = function(obj, predicate, context) { + var key; + if (isArrayLike(obj)) { + key = _.findIndex(obj, predicate, context); + } else { + key = _.findKey(obj, predicate, context); + } + if (key !== void 0 && key !== -1) return obj[key]; + }; + + // Return all the elements that pass a truth test. + // Aliased as `select`. + _.filter = _.select = function(obj, predicate, context) { + var results = []; + predicate = cb(predicate, context); + _.each(obj, function(value, index, list) { + if (predicate(value, index, list)) results.push(value); + }); + return results; + }; + + // Return all the elements for which a truth test fails. + _.reject = function(obj, predicate, context) { + return _.filter(obj, _.negate(cb(predicate)), context); + }; + + // Determine whether all of the elements match a truth test. + // Aliased as `all`. + _.every = _.all = function(obj, predicate, context) { + predicate = cb(predicate, context); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = keys ? keys[index] : index; + if (!predicate(obj[currentKey], currentKey, obj)) return false; + } + return true; + }; + + // Determine if at least one element in the object matches a truth test. + // Aliased as `any`. + _.some = _.any = function(obj, predicate, context) { + predicate = cb(predicate, context); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = keys ? keys[index] : index; + if (predicate(obj[currentKey], currentKey, obj)) return true; + } + return false; + }; + + // Determine if the array or object contains a given item (using `===`). + // Aliased as `includes` and `include`. + _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) { + if (!isArrayLike(obj)) obj = _.values(obj); + if (typeof fromIndex != 'number' || guard) fromIndex = 0; + return _.indexOf(obj, item, fromIndex) >= 0; + }; + + // Invoke a method (with arguments) on every item in a collection. + _.invoke = function(obj, method) { + var args = slice.call(arguments, 2); + var isFunc = _.isFunction(method); + return _.map(obj, function(value) { + var func = isFunc ? method : value[method]; + return func == null ? func : func.apply(value, args); + }); + }; + + // Convenience version of a common use case of `map`: fetching a property. + _.pluck = function(obj, key) { + return _.map(obj, _.property(key)); + }; + + // Convenience version of a common use case of `filter`: selecting only objects + // containing specific `key:value` pairs. + _.where = function(obj, attrs) { + return _.filter(obj, _.matcher(attrs)); + }; + + // Convenience version of a common use case of `find`: getting the first object + // containing specific `key:value` pairs. + _.findWhere = function(obj, attrs) { + return _.find(obj, _.matcher(attrs)); + }; + + // Return the maximum element (or element-based computation). + _.max = function(obj, iteratee, context) { + var result = -Infinity, lastComputed = -Infinity, + value, computed; + if (iteratee == null && obj != null) { + obj = isArrayLike(obj) ? obj : _.values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value > result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + _.each(obj, function(value, index, list) { + computed = iteratee(value, index, list); + if (computed > lastComputed || computed === -Infinity && result === -Infinity) { + result = value; + lastComputed = computed; + } + }); + } + return result; + }; + + // Return the minimum element (or element-based computation). + _.min = function(obj, iteratee, context) { + var result = Infinity, lastComputed = Infinity, + value, computed; + if (iteratee == null && obj != null) { + obj = isArrayLike(obj) ? obj : _.values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value < result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + _.each(obj, function(value, index, list) { + computed = iteratee(value, index, list); + if (computed < lastComputed || computed === Infinity && result === Infinity) { + result = value; + lastComputed = computed; + } + }); + } + return result; + }; + + // Shuffle a collection, using the modern version of the + // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle). + _.shuffle = function(obj) { + var set = isArrayLike(obj) ? obj : _.values(obj); + var length = set.length; + var shuffled = Array(length); + for (var index = 0, rand; index < length; index++) { + rand = _.random(0, index); + if (rand !== index) shuffled[index] = shuffled[rand]; + shuffled[rand] = set[index]; + } + return shuffled; + }; + + // Sample **n** random values from a collection. + // If **n** is not specified, returns a single random element. + // The internal `guard` argument allows it to work with `map`. + _.sample = function(obj, n, guard) { + if (n == null || guard) { + if (!isArrayLike(obj)) obj = _.values(obj); + return obj[_.random(obj.length - 1)]; + } + return _.shuffle(obj).slice(0, Math.max(0, n)); + }; + + // Sort the object's values by a criterion produced by an iteratee. + _.sortBy = function(obj, iteratee, context) { + iteratee = cb(iteratee, context); + return _.pluck(_.map(obj, function(value, index, list) { + return { + value: value, + index: index, + criteria: iteratee(value, index, list) + }; + }).sort(function(left, right) { + var a = left.criteria; + var b = right.criteria; + if (a !== b) { + if (a > b || a === void 0) return 1; + if (a < b || b === void 0) return -1; + } + return left.index - right.index; + }), 'value'); + }; + + // An internal function used for aggregate "group by" operations. + var group = function(behavior) { + return function(obj, iteratee, context) { + var result = {}; + iteratee = cb(iteratee, context); + _.each(obj, function(value, index) { + var key = iteratee(value, index, obj); + behavior(result, value, key); + }); + return result; + }; + }; + + // Groups the object's values by a criterion. Pass either a string attribute + // to group by, or a function that returns the criterion. + _.groupBy = group(function(result, value, key) { + if (_.has(result, key)) result[key].push(value); else result[key] = [value]; + }); + + // Indexes the object's values by a criterion, similar to `groupBy`, but for + // when you know that your index values will be unique. + _.indexBy = group(function(result, value, key) { + result[key] = value; + }); + + // Counts instances of an object that group by a certain criterion. Pass + // either a string attribute to count by, or a function that returns the + // criterion. + _.countBy = group(function(result, value, key) { + if (_.has(result, key)) result[key]++; else result[key] = 1; + }); + + // Safely create a real, live array from anything iterable. + _.toArray = function(obj) { + if (!obj) return []; + if (_.isArray(obj)) return slice.call(obj); + if (isArrayLike(obj)) return _.map(obj, _.identity); + return _.values(obj); + }; + + // Return the number of elements in an object. + _.size = function(obj) { + if (obj == null) return 0; + return isArrayLike(obj) ? obj.length : _.keys(obj).length; + }; + + // Split a collection into two arrays: one whose elements all satisfy the given + // predicate, and one whose elements all do not satisfy the predicate. + _.partition = function(obj, predicate, context) { + predicate = cb(predicate, context); + var pass = [], fail = []; + _.each(obj, function(value, key, obj) { + (predicate(value, key, obj) ? pass : fail).push(value); + }); + return [pass, fail]; + }; + + // Array Functions + // --------------- + + // Get the first element of an array. Passing **n** will return the first N + // values in the array. Aliased as `head` and `take`. The **guard** check + // allows it to work with `_.map`. + _.first = _.head = _.take = function(array, n, guard) { + if (array == null) return void 0; + if (n == null || guard) return array[0]; + return _.initial(array, array.length - n); + }; + + // Returns everything but the last entry of the array. Especially useful on + // the arguments object. Passing **n** will return all the values in + // the array, excluding the last N. + _.initial = function(array, n, guard) { + return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n))); + }; + + // Get the last element of an array. Passing **n** will return the last N + // values in the array. + _.last = function(array, n, guard) { + if (array == null) return void 0; + if (n == null || guard) return array[array.length - 1]; + return _.rest(array, Math.max(0, array.length - n)); + }; + + // Returns everything but the first entry of the array. Aliased as `tail` and `drop`. + // Especially useful on the arguments object. Passing an **n** will return + // the rest N values in the array. + _.rest = _.tail = _.drop = function(array, n, guard) { + return slice.call(array, n == null || guard ? 1 : n); + }; + + // Trim out all falsy values from an array. + _.compact = function(array) { + return _.filter(array, _.identity); + }; + + // Internal implementation of a recursive `flatten` function. + var flatten = function(input, shallow, strict, startIndex) { + var output = [], idx = 0; + for (var i = startIndex || 0, length = getLength(input); i < length; i++) { + var value = input[i]; + if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) { + //flatten current level of array or arguments object + if (!shallow) value = flatten(value, shallow, strict); + var j = 0, len = value.length; + output.length += len; + while (j < len) { + output[idx++] = value[j++]; + } + } else if (!strict) { + output[idx++] = value; + } + } + return output; + }; + + // Flatten out an array, either recursively (by default), or just one level. + _.flatten = function(array, shallow) { + return flatten(array, shallow, false); + }; + + // Return a version of the array that does not contain the specified value(s). + _.without = function(array) { + return _.difference(array, slice.call(arguments, 1)); + }; + + // Produce a duplicate-free version of the array. If the array has already + // been sorted, you have the option of using a faster algorithm. + // Aliased as `unique`. + _.uniq = _.unique = function(array, isSorted, iteratee, context) { + if (!_.isBoolean(isSorted)) { + context = iteratee; + iteratee = isSorted; + isSorted = false; + } + if (iteratee != null) iteratee = cb(iteratee, context); + var result = []; + var seen = []; + for (var i = 0, length = getLength(array); i < length; i++) { + var value = array[i], + computed = iteratee ? iteratee(value, i, array) : value; + if (isSorted) { + if (!i || seen !== computed) result.push(value); + seen = computed; + } else if (iteratee) { + if (!_.contains(seen, computed)) { + seen.push(computed); + result.push(value); + } + } else if (!_.contains(result, value)) { + result.push(value); + } + } + return result; + }; + + // Produce an array that contains the union: each distinct element from all of + // the passed-in arrays. + _.union = function() { + return _.uniq(flatten(arguments, true, true)); + }; + + // Produce an array that contains every item shared between all the + // passed-in arrays. + _.intersection = function(array) { + var result = []; + var argsLength = arguments.length; + for (var i = 0, length = getLength(array); i < length; i++) { + var item = array[i]; + if (_.contains(result, item)) continue; + for (var j = 1; j < argsLength; j++) { + if (!_.contains(arguments[j], item)) break; + } + if (j === argsLength) result.push(item); + } + return result; + }; + + // Take the difference between one array and a number of other arrays. + // Only the elements present in just the first array will remain. + _.difference = function(array) { + var rest = flatten(arguments, true, true, 1); + return _.filter(array, function(value){ + return !_.contains(rest, value); + }); + }; + + // Zip together multiple lists into a single array -- elements that share + // an index go together. + _.zip = function() { + return _.unzip(arguments); + }; + + // Complement of _.zip. Unzip accepts an array of arrays and groups + // each array's elements on shared indices + _.unzip = function(array) { + var length = array && _.max(array, getLength).length || 0; + var result = Array(length); + + for (var index = 0; index < length; index++) { + result[index] = _.pluck(array, index); + } + return result; + }; + + // Converts lists into objects. Pass either a single array of `[key, value]` + // pairs, or two parallel arrays of the same length -- one of keys, and one of + // the corresponding values. + _.object = function(list, values) { + var result = {}; + for (var i = 0, length = getLength(list); i < length; i++) { + if (values) { + result[list[i]] = values[i]; + } else { + result[list[i][0]] = list[i][1]; + } + } + return result; + }; + + // Generator function to create the findIndex and findLastIndex functions + function createPredicateIndexFinder(dir) { + return function(array, predicate, context) { + predicate = cb(predicate, context); + var length = getLength(array); + var index = dir > 0 ? 0 : length - 1; + for (; index >= 0 && index < length; index += dir) { + if (predicate(array[index], index, array)) return index; + } + return -1; + }; + } + + // Returns the first index on an array-like that passes a predicate test + _.findIndex = createPredicateIndexFinder(1); + _.findLastIndex = createPredicateIndexFinder(-1); + + // Use a comparator function to figure out the smallest index at which + // an object should be inserted so as to maintain order. Uses binary search. + _.sortedIndex = function(array, obj, iteratee, context) { + iteratee = cb(iteratee, context, 1); + var value = iteratee(obj); + var low = 0, high = getLength(array); + while (low < high) { + var mid = Math.floor((low + high) / 2); + if (iteratee(array[mid]) < value) low = mid + 1; else high = mid; + } + return low; + }; + + // Generator function to create the indexOf and lastIndexOf functions + function createIndexFinder(dir, predicateFind, sortedIndex) { + return function(array, item, idx) { + var i = 0, length = getLength(array); + if (typeof idx == 'number') { + if (dir > 0) { + i = idx >= 0 ? idx : Math.max(idx + length, i); + } else { + length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1; + } + } else if (sortedIndex && idx && length) { + idx = sortedIndex(array, item); + return array[idx] === item ? idx : -1; + } + if (item !== item) { + idx = predicateFind(slice.call(array, i, length), _.isNaN); + return idx >= 0 ? idx + i : -1; + } + for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) { + if (array[idx] === item) return idx; + } + return -1; + }; + } + + // Return the position of the first occurrence of an item in an array, + // or -1 if the item is not included in the array. + // If the array is large and already in sort order, pass `true` + // for **isSorted** to use binary search. + _.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex); + _.lastIndexOf = createIndexFinder(-1, _.findLastIndex); + + // Generate an integer Array containing an arithmetic progression. A port of + // the native Python `range()` function. See + // [the Python documentation](http://docs.python.org/library/functions.html#range). + _.range = function(start, stop, step) { + if (stop == null) { + stop = start || 0; + start = 0; + } + step = step || 1; + + var length = Math.max(Math.ceil((stop - start) / step), 0); + var range = Array(length); + + for (var idx = 0; idx < length; idx++, start += step) { + range[idx] = start; + } + + return range; + }; + + // Function (ahem) Functions + // ------------------ + + // Determines whether to execute a function as a constructor + // or a normal function with the provided arguments + var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) { + if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args); + var self = baseCreate(sourceFunc.prototype); + var result = sourceFunc.apply(self, args); + if (_.isObject(result)) return result; + return self; + }; + + // Create a function bound to a given object (assigning `this`, and arguments, + // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if + // available. + _.bind = function(func, context) { + if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1)); + if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function'); + var args = slice.call(arguments, 2); + var bound = function() { + return executeBound(func, bound, context, this, args.concat(slice.call(arguments))); + }; + return bound; + }; + + // Partially apply a function by creating a version that has had some of its + // arguments pre-filled, without changing its dynamic `this` context. _ acts + // as a placeholder, allowing any combination of arguments to be pre-filled. + _.partial = function(func) { + var boundArgs = slice.call(arguments, 1); + var bound = function() { + var position = 0, length = boundArgs.length; + var args = Array(length); + for (var i = 0; i < length; i++) { + args[i] = boundArgs[i] === _ ? arguments[position++] : boundArgs[i]; + } + while (position < arguments.length) args.push(arguments[position++]); + return executeBound(func, bound, this, this, args); + }; + return bound; + }; + + // Bind a number of an object's methods to that object. Remaining arguments + // are the method names to be bound. Useful for ensuring that all callbacks + // defined on an object belong to it. + _.bindAll = function(obj) { + var i, length = arguments.length, key; + if (length <= 1) throw new Error('bindAll must be passed function names'); + for (i = 1; i < length; i++) { + key = arguments[i]; + obj[key] = _.bind(obj[key], obj); + } + return obj; + }; + + // Memoize an expensive function by storing its results. + _.memoize = function(func, hasher) { + var memoize = function(key) { + var cache = memoize.cache; + var address = '' + (hasher ? hasher.apply(this, arguments) : key); + if (!_.has(cache, address)) cache[address] = func.apply(this, arguments); + return cache[address]; + }; + memoize.cache = {}; + return memoize; + }; + + // Delays a function for the given number of milliseconds, and then calls + // it with the arguments supplied. + _.delay = function(func, wait) { + var args = slice.call(arguments, 2); + return setTimeout(function(){ + return func.apply(null, args); + }, wait); + }; + + // Defers a function, scheduling it to run after the current call stack has + // cleared. + _.defer = _.partial(_.delay, _, 1); + + // Returns a function, that, when invoked, will only be triggered at most once + // during a given window of time. Normally, the throttled function will run + // as much as it can, without ever going more than once per `wait` duration; + // but if you'd like to disable the execution on the leading edge, pass + // `{leading: false}`. To disable execution on the trailing edge, ditto. + _.throttle = function(func, wait, options) { + var context, args, result; + var timeout = null; + var previous = 0; + if (!options) options = {}; + var later = function() { + previous = options.leading === false ? 0 : _.now(); + timeout = null; + result = func.apply(context, args); + if (!timeout) context = args = null; + }; + return function() { + var now = _.now(); + if (!previous && options.leading === false) previous = now; + var remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + previous = now; + result = func.apply(context, args); + if (!timeout) context = args = null; + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; + }; + + // Returns a function, that, as long as it continues to be invoked, will not + // be triggered. The function will be called after it stops being called for + // N milliseconds. If `immediate` is passed, trigger the function on the + // leading edge, instead of the trailing. + _.debounce = function(func, wait, immediate) { + var timeout, args, context, timestamp, result; + + var later = function() { + var last = _.now() - timestamp; + + if (last < wait && last >= 0) { + timeout = setTimeout(later, wait - last); + } else { + timeout = null; + if (!immediate) { + result = func.apply(context, args); + if (!timeout) context = args = null; + } + } + }; + + return function() { + context = this; + args = arguments; + timestamp = _.now(); + var callNow = immediate && !timeout; + if (!timeout) timeout = setTimeout(later, wait); + if (callNow) { + result = func.apply(context, args); + context = args = null; + } + + return result; + }; + }; + + // Returns the first function passed as an argument to the second, + // allowing you to adjust arguments, run code before and after, and + // conditionally execute the original function. + _.wrap = function(func, wrapper) { + return _.partial(wrapper, func); + }; + + // Returns a negated version of the passed-in predicate. + _.negate = function(predicate) { + return function() { + return !predicate.apply(this, arguments); + }; + }; + + // Returns a function that is the composition of a list of functions, each + // consuming the return value of the function that follows. + _.compose = function() { + var args = arguments; + var start = args.length - 1; + return function() { + var i = start; + var result = args[start].apply(this, arguments); + while (i--) result = args[i].call(this, result); + return result; + }; + }; + + // Returns a function that will only be executed on and after the Nth call. + _.after = function(times, func) { + return function() { + if (--times < 1) { + return func.apply(this, arguments); + } + }; + }; + + // Returns a function that will only be executed up to (but not including) the Nth call. + _.before = function(times, func) { + var memo; + return function() { + if (--times > 0) { + memo = func.apply(this, arguments); + } + if (times <= 1) func = null; + return memo; + }; + }; + + // Returns a function that will be executed at most one time, no matter how + // often you call it. Useful for lazy initialization. + _.once = _.partial(_.before, 2); + + // Object Functions + // ---------------- + + // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed. + var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString'); + var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString', + 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; + + function collectNonEnumProps(obj, keys) { + var nonEnumIdx = nonEnumerableProps.length; + var constructor = obj.constructor; + var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto; + + // Constructor is a special case. + var prop = 'constructor'; + if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop); + + while (nonEnumIdx--) { + prop = nonEnumerableProps[nonEnumIdx]; + if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) { + keys.push(prop); + } + } + } + + // Retrieve the names of an object's own properties. + // Delegates to **ECMAScript 5**'s native `Object.keys` + _.keys = function(obj) { + if (!_.isObject(obj)) return []; + if (nativeKeys) return nativeKeys(obj); + var keys = []; + for (var key in obj) if (_.has(obj, key)) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; + }; + + // Retrieve all the property names of an object. + _.allKeys = function(obj) { + if (!_.isObject(obj)) return []; + var keys = []; + for (var key in obj) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; + }; + + // Retrieve the values of an object's properties. + _.values = function(obj) { + var keys = _.keys(obj); + var length = keys.length; + var values = Array(length); + for (var i = 0; i < length; i++) { + values[i] = obj[keys[i]]; + } + return values; + }; + + // Returns the results of applying the iteratee to each element of the object + // In contrast to _.map it returns an object + _.mapObject = function(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var keys = _.keys(obj), + length = keys.length, + results = {}, + currentKey; + for (var index = 0; index < length; index++) { + currentKey = keys[index]; + results[currentKey] = iteratee(obj[currentKey], currentKey, obj); + } + return results; + }; + + // Convert an object into a list of `[key, value]` pairs. + _.pairs = function(obj) { + var keys = _.keys(obj); + var length = keys.length; + var pairs = Array(length); + for (var i = 0; i < length; i++) { + pairs[i] = [keys[i], obj[keys[i]]]; + } + return pairs; + }; + + // Invert the keys and values of an object. The values must be serializable. + _.invert = function(obj) { + var result = {}; + var keys = _.keys(obj); + for (var i = 0, length = keys.length; i < length; i++) { + result[obj[keys[i]]] = keys[i]; + } + return result; + }; + + // Return a sorted list of the function names available on the object. + // Aliased as `methods` + _.functions = _.methods = function(obj) { + var names = []; + for (var key in obj) { + if (_.isFunction(obj[key])) names.push(key); + } + return names.sort(); + }; + + // Extend a given object with all the properties in passed-in object(s). + _.extend = createAssigner(_.allKeys); + + // Assigns a given object with all the own properties in the passed-in object(s) + // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) + _.extendOwn = _.assign = createAssigner(_.keys); + + // Returns the first key on an object that passes a predicate test + _.findKey = function(obj, predicate, context) { + predicate = cb(predicate, context); + var keys = _.keys(obj), key; + for (var i = 0, length = keys.length; i < length; i++) { + key = keys[i]; + if (predicate(obj[key], key, obj)) return key; + } + }; + + // Return a copy of the object only containing the whitelisted properties. + _.pick = function(object, oiteratee, context) { + var result = {}, obj = object, iteratee, keys; + if (obj == null) return result; + if (_.isFunction(oiteratee)) { + keys = _.allKeys(obj); + iteratee = optimizeCb(oiteratee, context); + } else { + keys = flatten(arguments, false, false, 1); + iteratee = function(value, key, obj) { return key in obj; }; + obj = Object(obj); + } + for (var i = 0, length = keys.length; i < length; i++) { + var key = keys[i]; + var value = obj[key]; + if (iteratee(value, key, obj)) result[key] = value; + } + return result; + }; + + // Return a copy of the object without the blacklisted properties. + _.omit = function(obj, iteratee, context) { + if (_.isFunction(iteratee)) { + iteratee = _.negate(iteratee); + } else { + var keys = _.map(flatten(arguments, false, false, 1), String); + iteratee = function(value, key) { + return !_.contains(keys, key); + }; + } + return _.pick(obj, iteratee, context); + }; + + // Fill in a given object with default properties. + _.defaults = createAssigner(_.allKeys, true); + + // Creates an object that inherits from the given prototype object. + // If additional properties are provided then they will be added to the + // created object. + _.create = function(prototype, props) { + var result = baseCreate(prototype); + if (props) _.extendOwn(result, props); + return result; + }; + + // Create a (shallow-cloned) duplicate of an object. + _.clone = function(obj) { + if (!_.isObject(obj)) return obj; + return _.isArray(obj) ? obj.slice() : _.extend({}, obj); + }; + + // Invokes interceptor with the obj, and then returns obj. + // The primary purpose of this method is to "tap into" a method chain, in + // order to perform operations on intermediate results within the chain. + _.tap = function(obj, interceptor) { + interceptor(obj); + return obj; + }; + + // Returns whether an object has a given set of `key:value` pairs. + _.isMatch = function(object, attrs) { + var keys = _.keys(attrs), length = keys.length; + if (object == null) return !length; + var obj = Object(object); + for (var i = 0; i < length; i++) { + var key = keys[i]; + if (attrs[key] !== obj[key] || !(key in obj)) return false; + } + return true; + }; + + + // Internal recursive comparison function for `isEqual`. + var eq = function(a, b, aStack, bStack) { + // Identical objects are equal. `0 === -0`, but they aren't identical. + // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal). + if (a === b) return a !== 0 || 1 / a === 1 / b; + // A strict comparison is necessary because `null == undefined`. + if (a == null || b == null) return a === b; + // Unwrap any wrapped objects. + if (a instanceof _) a = a._wrapped; + if (b instanceof _) b = b._wrapped; + // Compare `[[Class]]` names. + var className = toString.call(a); + if (className !== toString.call(b)) return false; + switch (className) { + // Strings, numbers, regular expressions, dates, and booleans are compared by value. + case '[object RegExp]': + // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i') + case '[object String]': + // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is + // equivalent to `new String("5")`. + return '' + a === '' + b; + case '[object Number]': + // `NaN`s are equivalent, but non-reflexive. + // Object(NaN) is equivalent to NaN + if (+a !== +a) return +b !== +b; + // An `egal` comparison is performed for other numeric values. + return +a === 0 ? 1 / +a === 1 / b : +a === +b; + case '[object Date]': + case '[object Boolean]': + // Coerce dates and booleans to numeric primitive values. Dates are compared by their + // millisecond representations. Note that invalid dates with millisecond representations + // of `NaN` are not equivalent. + return +a === +b; + } + + var areArrays = className === '[object Array]'; + if (!areArrays) { + if (typeof a != 'object' || typeof b != 'object') return false; + + // Objects with different constructors are not equivalent, but `Object`s or `Array`s + // from different frames are. + var aCtor = a.constructor, bCtor = b.constructor; + if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor && + _.isFunction(bCtor) && bCtor instanceof bCtor) + && ('constructor' in a && 'constructor' in b)) { + return false; + } + } + // Assume equality for cyclic structures. The algorithm for detecting cyclic + // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. + + // Initializing stack of traversed objects. + // It's done here since we only need them for objects and arrays comparison. + aStack = aStack || []; + bStack = bStack || []; + var length = aStack.length; + while (length--) { + // Linear search. Performance is inversely proportional to the number of + // unique nested structures. + if (aStack[length] === a) return bStack[length] === b; + } + + // Add the first object to the stack of traversed objects. + aStack.push(a); + bStack.push(b); + + // Recursively compare objects and arrays. + if (areArrays) { + // Compare array lengths to determine if a deep comparison is necessary. + length = a.length; + if (length !== b.length) return false; + // Deep compare the contents, ignoring non-numeric properties. + while (length--) { + if (!eq(a[length], b[length], aStack, bStack)) return false; + } + } else { + // Deep compare objects. + var keys = _.keys(a), key; + length = keys.length; + // Ensure that both objects contain the same number of properties before comparing deep equality. + if (_.keys(b).length !== length) return false; + while (length--) { + // Deep compare each member + key = keys[length]; + if (!(_.has(b, key) && eq(a[key], b[key], aStack, bStack))) return false; + } + } + // Remove the first object from the stack of traversed objects. + aStack.pop(); + bStack.pop(); + return true; + }; + + // Perform a deep comparison to check if two objects are equal. + _.isEqual = function(a, b) { + return eq(a, b); + }; + + // Is a given array, string, or object empty? + // An "empty" object has no enumerable own-properties. + _.isEmpty = function(obj) { + if (obj == null) return true; + if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0; + return _.keys(obj).length === 0; + }; + + // Is a given value a DOM element? + _.isElement = function(obj) { + return !!(obj && obj.nodeType === 1); + }; + + // Is a given value an array? + // Delegates to ECMA5's native Array.isArray + _.isArray = nativeIsArray || function(obj) { + return toString.call(obj) === '[object Array]'; + }; + + // Is a given variable an object? + _.isObject = function(obj) { + var type = typeof obj; + return type === 'function' || type === 'object' && !!obj; + }; + + // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError. + _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) { + _['is' + name] = function(obj) { + return toString.call(obj) === '[object ' + name + ']'; + }; + }); + + // Define a fallback version of the method in browsers (ahem, IE < 9), where + // there isn't any inspectable "Arguments" type. + if (!_.isArguments(arguments)) { + _.isArguments = function(obj) { + return _.has(obj, 'callee'); + }; + } + + // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8, + // IE 11 (#1621), and in Safari 8 (#1929). + if (typeof /./ != 'function' && typeof Int8Array != 'object') { + _.isFunction = function(obj) { + return typeof obj == 'function' || false; + }; + } + + // Is a given object a finite number? + _.isFinite = function(obj) { + return isFinite(obj) && !isNaN(parseFloat(obj)); + }; + + // Is the given value `NaN`? (NaN is the only number which does not equal itself). + _.isNaN = function(obj) { + return _.isNumber(obj) && obj !== +obj; + }; + + // Is a given value a boolean? + _.isBoolean = function(obj) { + return obj === true || obj === false || toString.call(obj) === '[object Boolean]'; + }; + + // Is a given value equal to null? + _.isNull = function(obj) { + return obj === null; + }; + + // Is a given variable undefined? + _.isUndefined = function(obj) { + return obj === void 0; + }; + + // Shortcut function for checking if an object has a given property directly + // on itself (in other words, not on a prototype). + _.has = function(obj, key) { + return obj != null && hasOwnProperty.call(obj, key); + }; + + // Utility Functions + // ----------------- + + // Run Underscore.js in *noConflict* mode, returning the `_` variable to its + // previous owner. Returns a reference to the Underscore object. + _.noConflict = function() { + root._ = previousUnderscore; + return this; + }; + + // Keep the identity function around for default iteratees. + _.identity = function(value) { + return value; + }; + + // Predicate-generating functions. Often useful outside of Underscore. + _.constant = function(value) { + return function() { + return value; + }; + }; + + _.noop = function(){}; + + _.property = property; + + // Generates a function for a given object that returns a given property. + _.propertyOf = function(obj) { + return obj == null ? function(){} : function(key) { + return obj[key]; + }; + }; + + // Returns a predicate for checking whether an object has a given set of + // `key:value` pairs. + _.matcher = _.matches = function(attrs) { + attrs = _.extendOwn({}, attrs); + return function(obj) { + return _.isMatch(obj, attrs); + }; + }; + + // Run a function **n** times. + _.times = function(n, iteratee, context) { + var accum = Array(Math.max(0, n)); + iteratee = optimizeCb(iteratee, context, 1); + for (var i = 0; i < n; i++) accum[i] = iteratee(i); + return accum; + }; + + // Return a random integer between min and max (inclusive). + _.random = function(min, max) { + if (max == null) { + max = min; + min = 0; + } + return min + Math.floor(Math.random() * (max - min + 1)); + }; + + // A (possibly faster) way to get the current timestamp as an integer. + _.now = Date.now || function() { + return new Date().getTime(); + }; + + // List of HTML entities for escaping. + var escapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`' + }; + var unescapeMap = _.invert(escapeMap); + + // Functions for escaping and unescaping strings to/from HTML interpolation. + var createEscaper = function(map) { + var escaper = function(match) { + return map[match]; + }; + // Regexes for identifying a key that needs to be escaped + var source = '(?:' + _.keys(map).join('|') + ')'; + var testRegexp = RegExp(source); + var replaceRegexp = RegExp(source, 'g'); + return function(string) { + string = string == null ? '' : '' + string; + return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string; + }; + }; + _.escape = createEscaper(escapeMap); + _.unescape = createEscaper(unescapeMap); + + // If the value of the named `property` is a function then invoke it with the + // `object` as context; otherwise, return it. + _.result = function(object, property, fallback) { + var value = object == null ? void 0 : object[property]; + if (value === void 0) { + value = fallback; + } + return _.isFunction(value) ? value.call(object) : value; + }; + + // Generate a unique integer id (unique within the entire client session). + // Useful for temporary DOM ids. + var idCounter = 0; + _.uniqueId = function(prefix) { + var id = ++idCounter + ''; + return prefix ? prefix + id : id; + }; + + // By default, Underscore uses ERB-style template delimiters, change the + // following template settings to use alternative delimiters. + _.templateSettings = { + evaluate : /<%([\s\S]+?)%>/g, + interpolate : /<%=([\s\S]+?)%>/g, + escape : /<%-([\s\S]+?)%>/g + }; + + // When customizing `templateSettings`, if you don't want to define an + // interpolation, evaluation or escaping regex, we need one that is + // guaranteed not to match. + var noMatch = /(.)^/; + + // Certain characters need to be escaped so that they can be put into a + // string literal. + var escapes = { + "'": "'", + '\\': '\\', + '\r': 'r', + '\n': 'n', + '\u2028': 'u2028', + '\u2029': 'u2029' + }; + + var escaper = /\\|'|\r|\n|\u2028|\u2029/g; + + var escapeChar = function(match) { + return '\\' + escapes[match]; + }; + + // JavaScript micro-templating, similar to John Resig's implementation. + // Underscore templating handles arbitrary delimiters, preserves whitespace, + // and correctly escapes quotes within interpolated code. + // NB: `oldSettings` only exists for backwards compatibility. + _.template = function(text, settings, oldSettings) { + if (!settings && oldSettings) settings = oldSettings; + settings = _.defaults({}, settings, _.templateSettings); + + // Combine delimiters into one regular expression via alternation. + var matcher = RegExp([ + (settings.escape || noMatch).source, + (settings.interpolate || noMatch).source, + (settings.evaluate || noMatch).source + ].join('|') + '|$', 'g'); + + // Compile the template source, escaping string literals appropriately. + var index = 0; + var source = "__p+='"; + text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { + source += text.slice(index, offset).replace(escaper, escapeChar); + index = offset + match.length; + + if (escape) { + source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; + } else if (interpolate) { + source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; + } else if (evaluate) { + source += "';\n" + evaluate + "\n__p+='"; + } + + // Adobe VMs need the match returned to produce the correct offest. + return match; + }); + source += "';\n"; + + // If a variable is not specified, place data values in local scope. + if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n'; + + source = "var __t,__p='',__j=Array.prototype.join," + + "print=function(){__p+=__j.call(arguments,'');};\n" + + source + 'return __p;\n'; + + try { + var render = new Function(settings.variable || 'obj', '_', source); + } catch (e) { + e.source = source; + throw e; + } + + var template = function(data) { + return render.call(this, data, _); + }; + + // Provide the compiled source as a convenience for precompilation. + var argument = settings.variable || 'obj'; + template.source = 'function(' + argument + '){\n' + source + '}'; + + return template; + }; + + // Add a "chain" function. Start chaining a wrapped Underscore object. + _.chain = function(obj) { + var instance = _(obj); + instance._chain = true; + return instance; + }; + + // OOP + // --------------- + // If Underscore is called as a function, it returns a wrapped object that + // can be used OO-style. This wrapper holds altered versions of all the + // underscore functions. Wrapped objects may be chained. + + // Helper function to continue chaining intermediate results. + var result = function(instance, obj) { + return instance._chain ? _(obj).chain() : obj; + }; + + // Add your own custom functions to the Underscore object. + _.mixin = function(obj) { + _.each(_.functions(obj), function(name) { + var func = _[name] = obj[name]; + _.prototype[name] = function() { + var args = [this._wrapped]; + push.apply(args, arguments); + return result(this, func.apply(_, args)); + }; + }); + }; + + // Add all of the Underscore functions to the wrapper object. + _.mixin(_); + + // Add all mutator Array functions to the wrapper. + _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { + var method = ArrayProto[name]; + _.prototype[name] = function() { + var obj = this._wrapped; + method.apply(obj, arguments); + if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0]; + return result(this, obj); + }; + }); + + // Add all accessor Array functions to the wrapper. + _.each(['concat', 'join', 'slice'], function(name) { + var method = ArrayProto[name]; + _.prototype[name] = function() { + return result(this, method.apply(this._wrapped, arguments)); + }; + }); + + // Extracts the result from a wrapped and chained object. + _.prototype.value = function() { + return this._wrapped; + }; + + // Provide unwrapping proxy for some methods used in engine operations + // such as arithmetic and JSON stringification. + _.prototype.valueOf = _.prototype.toJSON = _.prototype.value; + + _.prototype.toString = function() { + return '' + this._wrapped; + }; + + // AMD registration happens at the end for compatibility with AMD loaders + // that may not enforce next-turn semantics on modules. Even though general + // practice for AMD registration is to be anonymous, underscore registers + // as a named module because, like jQuery, it is a base library that is + // popular enough to be bundled in a third party lib, but not be part of + // an AMD load request. Those cases could generate an error when an + // anonymous define() is called outside of a loader request. + if (true) { + !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function() { + return _; + }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + } + }.call(this)); + + +/***/ }, +/* 161 */, +/* 162 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, '__esModule', { + value: true + }); + + var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + + var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + + var _react = __webpack_require__(147); + + var _react2 = _interopRequireDefault(_react); + + var _underscore = __webpack_require__(160); + + var _underscore2 = _interopRequireDefault(_underscore); + + var _Icon = __webpack_require__(163); + + var _Icon2 = _interopRequireDefault(_Icon); + + var _InputError = __webpack_require__(164); + + var _InputError2 = _interopRequireDefault(_InputError); + + var _PasswordValidator = __webpack_require__(166); + + var _PasswordValidator2 = _interopRequireDefault(_PasswordValidator); + + var _classnamesBind = __webpack_require__(165); + + var _classnamesBind2 = _interopRequireDefault(_classnamesBind); + + var cx = _classnamesBind2['default'].bind({}); + + var Input = (function (_React$Component) { + _inherits(Input, _React$Component); + + function Input(props) { + var _this = this; + + _classCallCheck(this, Input); + + _get(Object.getPrototypeOf(Input.prototype), 'constructor', this).call(this, props); + + this.handleChange = function (event) { + _this.setState({ + value: event.target.value, + empty: _underscore2['default'].isEmpty(event.target.value) + }); + + if (_this.props.validator) { + _this.checkRules(event.target.value); + }; + + if (_this.props.validate) { + _this.validateInput(event.target.value); + } + + if (_this.props.onChange) { + _this.props.onChange(event); + } + }; + + this.validateInput = function (value) { + // trigger custom validation method in the parent component + if (_this.props.validate && _this.props.validate(value)) { + _this.setState({ + valid: true, + errorVisible: false + }); + } else { + _this.setState({ + valid: false, + errorMessage: !_underscore2['default'].isEmpty(value) ? _this.props.errorMessage : _this.props.emptyMessage + }); + } + }; + + this.componentWillReceiveProps = function (newProps) { + // perform update only when new value exists and not empty + if (newProps.value) { + if (!_underscore2['default'].isUndefined(newProps.value) && newProps.value.length > 0) { + if (_this.props.validate) { + _this.validateInput(newProps.value); + } + _this.setState({ + value: newProps.value, + empty: _underscore2['default'].isEmpty(newProps.value) + }); + } + } + }; + + this.handleFocus = function (event) { + _this.setState({ + focus: true, + validatorVisible: true + }); + + if (_this.props.validator) { + _this.setState({ + errorVisible: false + }); + } + }; + + this.handleBlur = function (event) { + _this.setState({ + focus: false, + errorVisible: !_this.state.valid, + validatorVisible: false + }); + }; + + this.checkRules = function (value) { + var validData = { + minChars: !_underscore2['default'].isEmpty(value) ? value.length >= parseInt(_this.state.minCharacters) : false, + capitalLetters: !_underscore2['default'].isEmpty(value) ? _this.countCapitals(value) : false, + numbers: !_underscore2['default'].isEmpty(value) ? _this.countNumbers(value) > 0 : false, + words: !_underscore2['default'].isEmpty(value) ? !_this.checkWords(value) : false + }; + var allValid = validData.minChars && validData.capitalLetters && validData.numbers && validData.words; + + _this.setState({ + isValidatorValid: validData, + allValidatorValid: allValid, + valid: allValid + }); + }; + + this.countCapitals = function (value) { + return value.replace(/[^A-Z]/g, "").length; + }; + + this.countNumbers = function (value) { + return (/\d/.test(value) + ); + }; + + this.checkWords = function (value) { + return _underscore2['default'].some(_this.state.forbiddenWords, function (word) { + var matched = word === value ? true : ""; + return matched; + }); + }; + + this.state = { + valid: this.props.isValid && this.props.isValid() || true, + empty: _underscore2['default'].isEmpty(this.props.value), + focus: false, + value: null, + iconsVisible: !this.props.validator, + errorMessage: this.props.emptyMessage, + validator: this.props.validator, + validatorVisible: false, + type: this.props.type, + minCharacters: this.props.minCharacters, + requireCapitals: this.props.requireCapitals, + requireNumbers: this.props.requireNumbers, + forbiddenWords: this.props.forbiddenWords, + isValidatorValid: { + minChars: false, + capitalLetters: false, + numbers: false, + words: false, + all: false + }, + allValidatorValid: false + }; + } + + _createClass(Input, [{ + key: 'isValid', + value: function isValid() { + if (this.props.validate) { + if (_underscore2['default'].isEmpty(this.state.value) || !this.props.validate(this.state.value)) { + this.setState({ + valid: false, + errorVisible: true + }); + } + } + + return this.state.valid; + } + }, { + key: 'mouseEnterError', + value: function mouseEnterError() { + this.setState({ + errorVisible: true + }); + } + }, { + key: 'hideError', + value: function hideError() { + this.setState({ + errorVisible: false, + validatorVisible: false + }); + } + + // validator function + }, { + key: 'render', + value: function render() { + + var inputGroupClasses = cx({ + 'input_group': true, + 'input_valid': this.state.valid, + 'input_error': !this.state.valid, + 'input_empty': this.state.empty, + 'input_hasValue': !this.state.empty, + 'input_focused': this.state.focus, + 'input_unfocused': !this.state.focus + }); + + var validator; + + if (this.state.validator) { + validator = _react2['default'].createElement(_PasswordValidator2['default'], { + ref: 'passwordValidator', + visible: this.state.validatorVisible, + name: this.props.text, + value: this.state.value, + validData: this.state.isValidatorValid, + valid: this.state.allValidatorValid, + forbiddenWords: this.state.forbiddenWords, + minCharacters: this.props.minCharacters, + requireCapitals: this.props.requireCapitals, + requireNumbers: this.props.requireNumbers + }); + }; + + return _react2['default'].createElement( + 'div', + { className: inputGroupClasses }, + _react2['default'].createElement( + 'label', + { className: 'input_label', htmlFor: this.props.text }, + _react2['default'].createElement( + 'span', + { className: 'label_text' }, + this.props.text + ) + ), + _react2['default'].createElement('input', _extends({}, this.props, { + placeholder: this.props.placeholder, + className: 'input', + id: this.props.text, + defaultValue: this.props.defaultValue, + value: this.state.value, + onChange: this.handleChange, + onFocus: this.handleFocus, + onBlur: this.handleBlur, + autoComplete: 'off' + })), + _react2['default'].createElement(_InputError2['default'], { + visible: this.state.errorVisible, + errorMessage: this.state.errorMessage + }), + _react2['default'].createElement( + 'div', + { className: 'validationIcons' }, + _react2['default'].createElement( + 'i', + { className: 'input_error_icon', onMouseEnter: this.mouseEnterError }, + ' ', + _react2['default'].createElement(_Icon2['default'], { type: 'circle_error' }), + ' ' + ), + _react2['default'].createElement( + 'i', + { className: 'input_valid_icon' }, + ' ', + _react2['default'].createElement(_Icon2['default'], { type: 'circle_tick' }), + ' ' + ) + ), + validator + ); + } + }]); + + return Input; + })(_react2['default'].Component); + + exports['default'] = Input; + ; + module.exports = exports['default']; + +/***/ }, +/* 163 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, '__esModule', { + value: true + }); + + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + + var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + + var _react = __webpack_require__(147); + + var _react2 = _interopRequireDefault(_react); + + var Icon = (function (_React$Component) { + _inherits(Icon, _React$Component); + + function Icon() { + _classCallCheck(this, Icon); + + _get(Object.getPrototypeOf(Icon.prototype), 'constructor', this).apply(this, arguments); + } + + _createClass(Icon, [{ + key: 'render', + value: function render() { + switch (this.props.type) { + + case 'circle_error': + return _react2['default'].createElement( + 'svg', + { viewBox: '0 0 20 20' }, + _react2['default'].createElement('path', { d: 'M10,0.982c4.973,0,9.018,4.046,9.018,9.018S14.973,19.018,10,19.018S0.982,14.973,0.982,10 S5.027,0.982,10,0.982 M10,0C4.477,0,0,4.477,0,10c0,5.523,4.477,10,10,10s10-4.477,10-10C20,4.477,15.523,0,10,0L10,0z M9,5.703 V5.441h2.5v0.262l-0.66,5.779H9.66L9,5.703z M9.44,12.951h1.621v1.491H9.44V12.951z' }) + ); + + case 'circle_tick': + return _react2['default'].createElement( + 'svg', + { viewBox: '0 0 23 23' }, + _react2['default'].createElement('path', { d: 'M11.5,23C5.2,23,0,17.8,0,11.5S5.2,0,11.5,0S23,5.2,23,11.5S17.8,23,11.5,23z M11.5,1C5.7,1,1,5.7,1,11.5S5.7,22,11.5,22 S22,17.3,22,11.5S17.3,1,11.5,1z M10.4,15.2l6.7-7c0.2-0.2,0.2-0.5,0-0.7c-0.2-0.2-0.5-0.2-0.7,0L10,14.2L7,11 c-0.2-0.2-0.5-0.2-0.7,0c-0.2,0.2-0.2,0.5,0,0.7l3.4,3.5c0.1,0.1,0.2,0.1,0.3,0.1S10.3,15.3,10.4,15.2z' }) + ); + + case 'circle_tick_filled': + return _react2['default'].createElement( + 'svg', + { viewBox: '0 0 20 20' }, + _react2['default'].createElement('path', { fill: '#4FB07F', d: 'M9.5,0C14.7,0,19,4.3,19,9.5S14.7,19,9.5,19S0,14.7,0,9.5S4.3,0,9.5,0z' }), + _react2['default'].createElement('path', { fill: '#FFFFFF', d: 'M8.7,12.9c-0.1,0-0.2,0-0.3-0.1l-2.4-2.5c-0.1-0.1-0.1-0.4,0-0.5c0.1-0.2,0.4-0.2,0.5,0L8.7,12l4.6-5 c0.1-0.1,0.4-0.1,0.5,0c0.1,0.2,0.1,0.4,0,0.5L9,12.8C9,12.8,8.9,12.9,8.7,12.9C8.8,12.9,8.8,12.9,8.7,12.9z' }) + ); + + case 'guthub': + return _react2['default'].createElement( + 'svg', + { viewBox: '0 0 34 34' }, + _react2['default'].createElement('path', { 'fill-rule': 'evenodd', 'clip-rule': 'evenodd', fill: '#191717', d: 'M32.6,16.3c0,7.2-4.7,13.3-11.1,15.5c-0.8,0.2-1.1-0.3-1.1-0.8 c0-0.5,0-2.3,0-4.5c0-1.5-0.5-2.5-1.1-3c3.6-0.4,7.4-1.8,7.4-8c0-1.8-0.6-3.2-1.7-4.4c0.2-0.4,0.7-2.1-0.2-4.3c0,0-1.4-0.4-4.5,1.7 c-1.3-0.4-2.7-0.5-4.1-0.5c-1.4,0-2.8,0.2-4.1,0.5C9.1,6.3,7.7,6.8,7.7,6.8C6.8,9,7.4,10.7,7.6,11.1c-1,1.1-1.7,2.6-1.7,4.4 c0,6.2,3.8,7.6,7.4,8.1c-0.5,0.4-0.9,1.1-1,2.2c-0.9,0.4-3.3,1.1-4.7-1.4c0,0-0.9-1.6-2.5-1.7c0,0-1.6,0-0.1,1c0,0,1.1,0.5,1.8,2.4 c0,0,1,3.2,5.5,2.2c0,1.4,0,2.4,0,2.8c0,0.4-0.3,0.9-1.1,0.8C4.7,29.6,0,23.5,0,16.3C0,7.3,7.3,0,16.3,0C25.3,0,32.6,7.3,32.6,16.3z ' }) + ); + } + } + }]); + + return Icon; + })(_react2['default'].Component); + + exports['default'] = Icon; + module.exports = exports['default']; + +/***/ }, +/* 164 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, '__esModule', { + value: true + }); + + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + + var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + + var _react = __webpack_require__(147); + + var _react2 = _interopRequireDefault(_react); + + var _underscore = __webpack_require__(160); + + var _underscore2 = _interopRequireDefault(_underscore); + + var _classnamesBind = __webpack_require__(165); + + var _classnamesBind2 = _interopRequireDefault(_classnamesBind); + + var cx = _classnamesBind2['default'].bind({}); + + var InputError = (function (_React$Component) { + _inherits(InputError, _React$Component); + + function InputError(props) { + _classCallCheck(this, InputError); + + _get(Object.getPrototypeOf(InputError.prototype), 'constructor', this).call(this, props); + this.state = { + message: 'Input is invalid' + }; + } + + _createClass(InputError, [{ + key: 'render', + value: function render() { + var errorClass = cx({ + 'error_container': true, + 'visible': this.props.visible, + 'invisible': !this.props.visible + }); + + return _react2['default'].createElement( + 'div', + { className: errorClass }, + _react2['default'].createElement( + 'span', + null, + this.props.errorMessage + ) + ); + } + }]); + + return InputError; + })(_react2['default'].Component); + + exports['default'] = InputError; + module.exports = exports['default']; + +/***/ }, +/* 165 */ +/***/ function(module, exports, __webpack_require__) { + + var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! + Copyright (c) 2015 Jed Watson. + Licensed under the MIT License (MIT), see + http://jedwatson.github.io/classnames + */ + /* global define */ + + (function () { + 'use strict'; + + var hasOwn = {}.hasOwnProperty; + + function classNames () { + var classes = ''; + + for (var i = 0; i < arguments.length; i++) { + var arg = arguments[i]; + if (!arg) continue; + + var argType = typeof arg; + + if (argType === 'string' || argType === 'number') { + classes += ' ' + (this && this[arg] || arg); + } else if (Array.isArray(arg)) { + classes += ' ' + classNames.apply(this, arg); + } else if (argType === 'object') { + for (var key in arg) { + if (hasOwn.call(arg, key) && arg[key]) { + classes += ' ' + (this && this[key] || key); + } + } + } + } + + return classes.substr(1); + } + + if (typeof module !== 'undefined' && module.exports) { + module.exports = classNames; + } else if (true) { + // register as 'classnames', consistent with npm package name + !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function () { + return classNames; + }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + } else { + window.classNames = classNames; + } + }()); + + +/***/ }, +/* 166 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, '__esModule', { + value: true + }); + + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + + var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + + var _react = __webpack_require__(147); + + var _react2 = _interopRequireDefault(_react); + + var _underscore = __webpack_require__(160); + + var _underscore2 = _interopRequireDefault(_underscore); + + var _Icon = __webpack_require__(163); + + var _Icon2 = _interopRequireDefault(_Icon); + + var _classnamesBind = __webpack_require__(165); + + var _classnamesBind2 = _interopRequireDefault(_classnamesBind); + + var cx = _classnamesBind2['default'].bind({}); + + var PasswordValidator = (function (_React$Component) { + _inherits(PasswordValidator, _React$Component); + + function PasswordValidator(props) { + _classCallCheck(this, PasswordValidator); + + _get(Object.getPrototypeOf(PasswordValidator.prototype), 'constructor', this).call(this, props); + this.state = { + value: null, + minCharacters: this.props.minCharacters, + requireCapitals: this.props.requireCapitals, + requireNumbers: this.props.requireNumbers, + forbiddenWords: this.props.forbiddenWords, + name: this.props.name + }; + } + + _createClass(PasswordValidator, [{ + key: 'render', + value: function render() { + var validatorClass = cx({ + 'password_validator': true, + 'visible': this.props.visible, + 'invisible': !this.props.visible + }); + + var forbiddenWords = this.state.forbiddenWords.map(function (word, i) { + return _react2['default'].createElement( + 'span', + { key: i, className: 'bad_word' }, + '"', + word, + '"' + ); + }); + + var validatorTitle; + + if (this.props.valid) { + validatorTitle = _react2['default'].createElement( + 'h4', + { className: 'validator_title valid' }, + this.props.name, + ' IS OK' + ); + } else { + validatorTitle = _react2['default'].createElement( + 'h4', + { className: 'validator_title invalid' }, + this.props.name, + ' RULES' + ); + } + + return _react2['default'].createElement( + 'div', + { className: validatorClass }, + _react2['default'].createElement( + 'div', + { className: 'validator_container' }, + validatorTitle, + _react2['default'].createElement( + 'ul', + { className: 'rules_list' }, + _react2['default'].createElement( + 'li', + { className: cx({ 'valid': this.props.validData.minChars }) }, + _react2['default'].createElement( + 'i', + { className: 'icon_valid' }, + ' ', + _react2['default'].createElement(_Icon2['default'], { type: 'circle_tick_filled' }), + ' ' + ), + _react2['default'].createElement( + 'i', + { className: 'icon_invalid' }, + ' ', + _react2['default'].createElement(_Icon2['default'], { type: 'circle_error' }), + ' ' + ), + _react2['default'].createElement( + 'span', + { className: 'error_message' }, + this.state.minCharacters, + ' characters minimum' + ) + ), + _react2['default'].createElement( + 'li', + { className: cx({ 'valid': this.props.validData.capitalLetters }) }, + _react2['default'].createElement( + 'i', + { className: 'icon_valid' }, + ' ', + _react2['default'].createElement(_Icon2['default'], { type: 'circle_tick_filled' }), + ' ' + ), + _react2['default'].createElement( + 'i', + { className: 'icon_invalid' }, + ' ', + _react2['default'].createElement(_Icon2['default'], { type: 'circle_error' }), + ' ' + ), + _react2['default'].createElement( + 'span', + { className: 'error_message' }, + 'Contains at least ', + this.state.requireCapitals, + ' capital letter' + ) + ), + _react2['default'].createElement( + 'li', + { className: cx({ 'valid': this.props.validData.numbers }) }, + _react2['default'].createElement( + 'i', + { className: 'icon_valid' }, + ' ', + _react2['default'].createElement(_Icon2['default'], { type: 'circle_tick_filled' }), + ' ' + ), + _react2['default'].createElement( + 'i', + { className: 'icon_invalid' }, + ' ', + _react2['default'].createElement(_Icon2['default'], { type: 'circle_error' }), + ' ' + ), + _react2['default'].createElement( + 'span', + { className: 'error_message' }, + 'Contains at least ', + this.state.requireNumbers, + ' number' + ) + ), + _react2['default'].createElement( + 'li', + { className: cx({ 'valid': this.props.validData.words }) }, + _react2['default'].createElement( + 'i', + { className: 'icon_valid' }, + ' ', + _react2['default'].createElement(_Icon2['default'], { type: 'circle_tick_filled' }), + ' ' + ), + _react2['default'].createElement( + 'i', + { className: 'icon_invalid' }, + ' ', + _react2['default'].createElement(_Icon2['default'], { type: 'circle_error' }), + ' ' + ), + _react2['default'].createElement( + 'span', + { className: 'error_message' }, + 'Can\'t be ', + forbiddenWords + ) + ) + ) + ) + ); + } + }]); + + return PasswordValidator; + })(_react2['default'].Component); + + exports['default'] = PasswordValidator; + module.exports = exports['default']; + +/***/ }, +/* 167 */ +/***/ function(module, exports) { + + "use strict"; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.getQueryVariable = getQueryVariable; + + function getQueryVariable(variable) { + var query = window.location.search.substring(1); + var vars = query.split("&"); + for (var i = 0; i < vars.length; i++) { + var pair = vars[i].split("="); + if (pair[0] == variable) { + return pair[1]; + } + } + return '/'; + } + +/***/ } +]); +//# sourceMappingURL=login.js.map \ No newline at end of file diff --git a/dist/js/mod/login.js.map b/dist/js/mod/login.js.map new file mode 100644 index 0000000..eb11014 --- /dev/null +++ b/dist/js/mod/login.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./hub/static/jsx/login.jsx","webpack:///./~/react-dom/index.js","webpack:///./~/react/lib/ReactDOM.js","webpack:///(webpack)/~/node-libs-browser/~/process/browser.js","webpack:///./~/react/lib/ReactCurrentOwner.js","webpack:///./~/react/lib/ReactDOMTextComponent.js","webpack:///./~/react/lib/DOMChildrenOperations.js","webpack:///./~/react/lib/Danger.js","webpack:///./~/react/~/fbjs/lib/ExecutionEnvironment.js","webpack:///./~/react/~/fbjs/lib/createNodesFromMarkup.js","webpack:///./~/react/~/fbjs/lib/createArrayFromMixed.js","webpack:///./~/react/~/fbjs/lib/toArray.js","webpack:///./~/react/~/fbjs/lib/invariant.js","webpack:///./~/react/~/fbjs/lib/getMarkupWrap.js","webpack:///./~/react/~/fbjs/lib/emptyFunction.js","webpack:///./~/react/lib/ReactMultiChildUpdateTypes.js","webpack:///./~/react/~/fbjs/lib/keyMirror.js","webpack:///./~/react/lib/ReactPerf.js","webpack:///./~/react/lib/setInnerHTML.js","webpack:///./~/react/lib/setTextContent.js","webpack:///./~/react/lib/escapeTextContentForBrowser.js","webpack:///./~/react/lib/DOMPropertyOperations.js","webpack:///./~/react/lib/DOMProperty.js","webpack:///./~/react/lib/quoteAttributeValueForBrowser.js","webpack:///./~/react/~/fbjs/lib/warning.js","webpack:///./~/react/lib/ReactComponentBrowserEnvironment.js","webpack:///./~/react/lib/ReactDOMIDOperations.js","webpack:///./~/react/lib/ReactMount.js","webpack:///./~/react/lib/ReactBrowserEventEmitter.js","webpack:///./~/react/lib/EventConstants.js","webpack:///./~/react/lib/EventPluginHub.js","webpack:///./~/react/lib/EventPluginRegistry.js","webpack:///./~/react/lib/EventPluginUtils.js","webpack:///./~/react/lib/ReactErrorUtils.js","webpack:///./~/react/lib/accumulateInto.js","webpack:///./~/react/lib/forEachAccumulated.js","webpack:///./~/react/lib/ReactEventEmitterMixin.js","webpack:///./~/react/lib/ViewportMetrics.js","webpack:///./~/react/lib/Object.assign.js","webpack:///./~/react/lib/isEventSupported.js","webpack:///./~/react/lib/ReactDOMFeatureFlags.js","webpack:///./~/react/lib/ReactElement.js","webpack:///./~/react/lib/canDefineProperty.js","webpack:///./~/react/lib/ReactEmptyComponentRegistry.js","webpack:///./~/react/lib/ReactInstanceHandles.js","webpack:///./~/react/lib/ReactRootIndex.js","webpack:///./~/react/lib/ReactInstanceMap.js","webpack:///./~/react/lib/ReactMarkupChecksum.js","webpack:///./~/react/lib/adler32.js","webpack:///./~/react/lib/ReactReconciler.js","webpack:///./~/react/lib/ReactRef.js","webpack:///./~/react/lib/ReactOwner.js","webpack:///./~/react/lib/ReactUpdateQueue.js","webpack:///./~/react/lib/ReactUpdates.js","webpack:///./~/react/lib/CallbackQueue.js","webpack:///./~/react/lib/PooledClass.js","webpack:///./~/react/lib/Transaction.js","webpack:///./~/react/~/fbjs/lib/emptyObject.js","webpack:///./~/react/~/fbjs/lib/containsNode.js","webpack:///./~/react/~/fbjs/lib/isTextNode.js","webpack:///./~/react/~/fbjs/lib/isNode.js","webpack:///./~/react/lib/instantiateReactComponent.js","webpack:///./~/react/lib/ReactCompositeComponent.js","webpack:///./~/react/lib/ReactComponentEnvironment.js","webpack:///./~/react/lib/ReactPropTypeLocations.js","webpack:///./~/react/lib/ReactPropTypeLocationNames.js","webpack:///./~/react/lib/shouldUpdateReactComponent.js","webpack:///./~/react/lib/ReactEmptyComponent.js","webpack:///./~/react/lib/ReactNativeComponent.js","webpack:///./~/react/lib/validateDOMNesting.js","webpack:///./~/react/lib/ReactDefaultInjection.js","webpack:///./~/react/lib/BeforeInputEventPlugin.js","webpack:///./~/react/lib/EventPropagators.js","webpack:///./~/react/lib/FallbackCompositionState.js","webpack:///./~/react/lib/getTextContentAccessor.js","webpack:///./~/react/lib/SyntheticCompositionEvent.js","webpack:///./~/react/lib/SyntheticEvent.js","webpack:///./~/react/lib/SyntheticInputEvent.js","webpack:///./~/react/~/fbjs/lib/keyOf.js","webpack:///./~/react/lib/ChangeEventPlugin.js","webpack:///./~/react/lib/getEventTarget.js","webpack:///./~/react/lib/isTextInputElement.js","webpack:///./~/react/lib/ClientReactRootIndex.js","webpack:///./~/react/lib/DefaultEventPluginOrder.js","webpack:///./~/react/lib/EnterLeaveEventPlugin.js","webpack:///./~/react/lib/SyntheticMouseEvent.js","webpack:///./~/react/lib/SyntheticUIEvent.js","webpack:///./~/react/lib/getEventModifierState.js","webpack:///./~/react/lib/HTMLDOMPropertyConfig.js","webpack:///./~/react/lib/ReactBrowserComponentMixin.js","webpack:///./~/react/lib/findDOMNode.js","webpack:///./~/react/lib/ReactDefaultBatchingStrategy.js","webpack:///./~/react/lib/ReactDOMComponent.js","webpack:///./~/react/lib/AutoFocusUtils.js","webpack:///./~/react/~/fbjs/lib/focusNode.js","webpack:///./~/react/lib/CSSPropertyOperations.js","webpack:///./~/react/lib/CSSProperty.js","webpack:///./~/react/~/fbjs/lib/camelizeStyleName.js","webpack:///./~/react/~/fbjs/lib/camelize.js","webpack:///./~/react/lib/dangerousStyleValue.js","webpack:///./~/react/~/fbjs/lib/hyphenateStyleName.js","webpack:///./~/react/~/fbjs/lib/hyphenate.js","webpack:///./~/react/~/fbjs/lib/memoizeStringOnly.js","webpack:///./~/react/lib/ReactDOMButton.js","webpack:///./~/react/lib/ReactDOMInput.js","webpack:///./~/react/lib/LinkedValueUtils.js","webpack:///./~/react/lib/ReactPropTypes.js","webpack:///./~/react/lib/getIteratorFn.js","webpack:///./~/react/lib/ReactDOMOption.js","webpack:///./~/react/lib/ReactChildren.js","webpack:///./~/react/lib/traverseAllChildren.js","webpack:///./~/react/lib/ReactDOMSelect.js","webpack:///./~/react/lib/ReactDOMTextarea.js","webpack:///./~/react/lib/ReactMultiChild.js","webpack:///./~/react/lib/ReactChildReconciler.js","webpack:///./~/react/lib/flattenChildren.js","webpack:///./~/react/~/fbjs/lib/shallowEqual.js","webpack:///./~/react/lib/ReactEventListener.js","webpack:///./~/react/~/fbjs/lib/EventListener.js","webpack:///./~/react/~/fbjs/lib/getUnboundedScrollPosition.js","webpack:///./~/react/lib/ReactInjection.js","webpack:///./~/react/lib/ReactClass.js","webpack:///./~/react/lib/ReactComponent.js","webpack:///./~/react/lib/ReactNoopUpdateQueue.js","webpack:///./~/react/lib/ReactReconcileTransaction.js","webpack:///./~/react/lib/ReactInputSelection.js","webpack:///./~/react/lib/ReactDOMSelection.js","webpack:///./~/react/lib/getNodeForCharacterOffset.js","webpack:///./~/react/~/fbjs/lib/getActiveElement.js","webpack:///./~/react/lib/SelectEventPlugin.js","webpack:///./~/react/lib/ServerReactRootIndex.js","webpack:///./~/react/lib/SimpleEventPlugin.js","webpack:///./~/react/lib/SyntheticClipboardEvent.js","webpack:///./~/react/lib/SyntheticFocusEvent.js","webpack:///./~/react/lib/SyntheticKeyboardEvent.js","webpack:///./~/react/lib/getEventCharCode.js","webpack:///./~/react/lib/getEventKey.js","webpack:///./~/react/lib/SyntheticDragEvent.js","webpack:///./~/react/lib/SyntheticTouchEvent.js","webpack:///./~/react/lib/SyntheticWheelEvent.js","webpack:///./~/react/lib/SVGDOMPropertyConfig.js","webpack:///./~/react/lib/ReactDefaultPerf.js","webpack:///./~/react/lib/ReactDefaultPerfAnalysis.js","webpack:///./~/react/~/fbjs/lib/performanceNow.js","webpack:///./~/react/~/fbjs/lib/performance.js","webpack:///./~/react/lib/ReactVersion.js","webpack:///./~/react/lib/renderSubtreeIntoContainer.js","webpack:///./~/react/react.js","webpack:///./~/react/lib/React.js","webpack:///./~/react/lib/ReactDOMServer.js","webpack:///./~/react/lib/ReactServerRendering.js","webpack:///./~/react/lib/ReactServerBatchingStrategy.js","webpack:///./~/react/lib/ReactServerRenderingTransaction.js","webpack:///./~/react/lib/ReactIsomorphic.js","webpack:///./~/react/lib/ReactDOMFactories.js","webpack:///./~/react/lib/ReactElementValidator.js","webpack:///./~/react/~/fbjs/lib/mapObject.js","webpack:///./~/react/lib/onlyChild.js","webpack:///./~/react/lib/deprecated.js","webpack:///./hub/static/jsx/signin.jsx","webpack:///./~/underscore/underscore.js","webpack:///./hub/static/jsx/components/Input.jsx","webpack:///./hub/static/jsx/components/Icon.jsx","webpack:///./hub/static/jsx/components/InputError.jsx","webpack:///./~/classnames/bind.js","webpack:///./hub/static/jsx/components/PasswordValidator.jsx","webpack:///./hub/static/jsx/components/Utils.jsx"],"names":[],"mappings":";;;;;;;;qCAAqB,CAAW;;;;kCACd,GAAO;;;;mCACP,GAAU;;;;AAE5B,uBAAS,MAAM,CAAC,2DAAQ,EAAE,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,C;;;;;;ACJ1D;;AAEA;;;;;;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,+HAA8H;;AAE9H;AACA;AACA;;AAEA;AACA;;AAEA,oBAAmB,6BAA6B;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wB;;;;;;;AC3FA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,wBAAuB,sBAAsB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,4BAA2B;AAC3B;AACA;AACA;AACA,6BAA4B,UAAU;;;;;;;AC1FtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAY;AACZ;AACA;;AAEA;;AAEA,oC;;;;;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,cAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,0DAA0D;AACvE,eAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,UAAU;AACvB,cAAa,0BAA0B;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA,EAAC;;AAED,wC;;;;;;;AC9HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,WAAW;AACtB,YAAW,WAAW;AACtB,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,cAAa,cAAc;AAC3B,cAAa,cAAc;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,oBAAmB,oBAAoB;AACvC;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA,sBAAqB,4BAA4B;AACjD;AACA;AACA;;AAEA,oBAAmB,oBAAoB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,EAAC;;AAED,wC;;;;;;;AChIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,aAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa,cAAc;AAC3B,eAAc,kBAAkB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAmB,uBAAuB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,sBAAqB,wBAAwB;AAC7C;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,WAAW;AACxB,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;;AAEA,yB;;;;;;;AChJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,uC;;;;;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,aAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,UAAU;AACrB,aAAY,8BAA8B;AAC1C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,wC;;;;;;;ACnFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,EAAE;AACb,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,EAAE;AACb,aAAY;AACZ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA,IAAG;AACH;AACA;AACA;;AAEA,uC;;;;;;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,yBAAyB;AACpC,aAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA,mBAAkB,aAAa;AAC/B;AACA;AACA;AACA;;AAEA,0B;;;;;;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,sDAAqD;AACrD,MAAK;AACL;AACA;AACA;AACA;AACA,QAAO;AACP;;AAEA,2BAA0B;AAC1B;AACA;AACA;;AAEA,4B;;;;;;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;AAED;AACA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,aAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA,gC;;;;;;;AC9FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,8CAA6C;AAC7C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gC;;;;;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;AAED,6C;;;;;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,8BAA6B,sBAAsB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA,eAAc;AACd,eAAc;AACd;AACA,YAAW,OAAO;AAClB,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,4B;;;;;;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,eAAe;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,SAAS;AACtB,eAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,gBAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,SAAS;AACpB,aAAY;AACZ;AACA;AACA;AACA;;AAEA,4B;;;;;;;AC/FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW,WAAW;AACtB,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,wBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;;AAEA,+B;;;;;;ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,WAAW;AACtB,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iC;;;;;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,cAAa;AACb,aAAY;AACZ,aAAY;AACZ,eAAc;AACd,gBAAe;AACf;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,EAAE;AACb,aAAY,OAAO;AACnB;AACA;AACA;AACA;;AAEA,8C;;;;;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,8CAA6C;AAC7C;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAa,OAAO;AACpB,eAAc,OAAO;AACrB;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,EAAE;AACf,eAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,EAAE;AACf,eAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,WAAW;AACxB,cAAa,OAAO;AACpB,cAAa,EAAE;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA;AACA,QAAO;AACP;AACA;AACA,2CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA,MAAK;AACL;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,WAAW;AACxB,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA,MAAK;AACL;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,EAAC;;AAED,wC;;;;;;;AChOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA4C;AAC5C,+BAA8B;AAC9B;AACA,iBAAgB;;AAEhB;AACA;AACA;AACA,aAAY;AACZ;AACA,sEAAqE;;AAErE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAmB,oDAAoD;AACvE;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA,8B;;;;;;;ACzOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,YAAW,EAAE;AACb,aAAY,OAAO;AACnB;AACA;AACA;AACA;;AAEA,gD;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,uFAAsF,aAAa;AACnG;AACA;;AAEA;AACA;AACA;;AAEA;AACA,cAAa;AACb;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA,0B;;;;;;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,mD;;;;;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,WAAU;AACV;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,EAAE;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA,YAAW;AACX;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,cAAc;AAC3B,cAAa,cAAc;AAC3B;AACA;AACA;AACA,oBAAmB,oBAAoB;AACvC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,EAAC;;AAED,uC;;;;;;;AC7FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAY,OAAO;AACnB;AACA;AACA;AACA,kBAAiB,YAAY;AAC7B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW,uBAAuB;AAClC;AACA,aAAY,GAAG;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA,YAAW,WAAW;AACtB,aAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,8CAA8C;AACzD,aAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,WAAW;AACtB,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,aAAY,WAAW;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,EAAE;AACb,aAAY,YAAY;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,YAAY;AACvB,YAAW,OAAO;AAClB,aAAY,QAAQ;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,eAAe;AAC1B,YAAW,OAAO;AAClB,YAAW,WAAW;AACtB,YAAW,0BAA0B;AACrC,YAAW,QAAQ;AACnB;AACA;AACA;AACA,wBAAuB;AACvB;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,eAAe;AAC1B,YAAW,OAAO;AAClB,YAAW,WAAW;AACtB,YAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,eAAe;AAC1B,YAAW,WAAW;AACtB;AACA;AACA,UAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAW,YAAY;AACvB,aAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAQ,kCAAkC;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa,WAAW;AACxB,cAAa,SAAS;AACtB;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,cAAa,eAAe;AAC5B,cAAa,aAAa;AAC1B,cAAa,WAAW;AACxB,cAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,eAAe;AAC5B,cAAa,WAAW;AACxB,eAAc,OAAO;AACrB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,cAAa,aAAa;AAC1B,cAAa,WAAW;AACxB,cAAa,QAAQ;AACrB,eAAc,eAAe;AAC7B;AACA;AACA;AACA;AACA;AACA,qLAAoL;;AAEpL;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,eAAe;AAC5B,cAAa,aAAa;AAC1B,cAAa,WAAW;AACxB,cAAa,UAAU;AACvB,eAAc,eAAe;AAC7B;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,aAAa;AAC1B,cAAa,WAAW;AACxB,cAAa,UAAU;AACvB,eAAc,eAAe;AAC7B;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,cAAa,WAAW;AACxB,eAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,WAAW;AACxB,eAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oLAAmL;;AAEnL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,eAAc,YAAY;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,OAAO;AACpB,eAAc,WAAW;AACzB;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,EAAE;AACf,eAAc;AACd;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,cAAa,eAAe;AAC5B,eAAc,OAAO;AACrB,eAAc,eAAe;AAC7B;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,2CAA0C;AAC1C;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,EAAC;;AAED,6B;;;;;;;ACj1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAwC;;AAExC;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA,eAAc,QAAQ;AACtB;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAmB,yBAAyB;AAC5C;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA,YAAW;AACX;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,YAAW;AACX;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,EAAC;;AAED;AACA;AACA;AACA,EAAC;;AAED,2C;;;;;;ACnUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,oCAAmC,gCAAgC;;AAEnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;AAED;AACA;AACA;AACA;;AAEA,iC;;;;;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,QAAQ;AACnB,YAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,uBAAsB;AACtB;AACA;AACA;AACA,oBAAmB;AACnB;AACA;AACA;AACA;AACA,yBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,gBAAe,OAAO;AACtB;AACA;AACA;;AAEA;AACA,gBAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA,gBAAe,MAAM;AACrB;AACA;AACA;;AAEA;AACA,gBAAe,OAAO;AACtB;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,UAAU;AACvB;AACA;AACA;;AAEA,yGAAwG;AACxG;;AAEA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,eAAc,UAAU;AACxB;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,eAAe;AAC5B,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,eAAc,EAAE;AAChB;AACA;AACA;AACA;AACA;AACA,oBAAmB,oBAAoB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,EAAE;AACf;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;;AAEA,iC;;;;;;;ACtRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,aAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,+BAA8B;;AAE9B;AACA;AACA;AACA,8BAA6B;;AAE7B;AACA;AACA;AACA,mCAAkC;;AAElC;AACA;AACA;AACA;AACA;AACA,cAAa,MAAM;AACnB;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,OAAO;AACpB,eAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,sC;;;;;;;AC3NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,YAAW,eAAe;AAC1B,YAAW,QAAQ;AACnB,YAAW,SAAS;AACpB,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAmB,8BAA8B;AACjD;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAmB,8BAA8B;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAY,EAAE;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW,eAAe;AAC1B,aAAY,QAAQ;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;;AAEH;AACA;;AAEA,mC;;;;;;;ACzMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,YAAW,QAAQ;AACnB,YAAW,SAAS;AACpB,YAAW,EAAE;AACb,YAAW,EAAE;AACb;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,kC;;;;;;;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA6B;AAC7B;AACA;AACA;AACA,aAAY,WAAW;AACvB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,iC;;;;;;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,YAAW,MAAM;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA,qC;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA,yC;;;;;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,kC;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,0BAAyB,8BAA8B;AACvD;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,yB;;;;;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,SAAS;AACpB,aAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,6CAA4C;AAC5C;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,mC;;;;;;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,uC;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW,EAAE;AACb,YAAW,EAAE;AACb,YAAW,cAAc;AACzB,YAAW,EAAE;AACb;AACA;AACA;AACA;AACA,YAAW,EAAE;AACb;AACA,YAAW,EAAE;AACb,YAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA,oBAAmB,oBAAoB;AACvC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,wBAAuB;;AAEvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA,oBAAmB,oBAAoB;AACvC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,YAAW,QAAQ;AACnB,aAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;;AAEA,+B;;;;;;;ACtPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,6BAA4B,QAAQ,oBAAoB,EAAE;AAC1D;AACA,IAAG;AACH;AACA;AACA;;AAEA,oC;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,YAAW,OAAO;AAClB,aAAY,QAAQ;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,8C;;;;;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,aAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,aAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,aAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,aAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,aAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,aAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB,0BAA0B;AAC3C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,aAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB,gBAAgB;AACjC;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAW,QAAQ;AACnB,YAAW,QAAQ;AACnB,YAAW,SAAS;AACpB,YAAW,EAAE;AACb,YAAW,SAAS;AACpB,YAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAc,OAAO;AACrB;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,eAAc,OAAO;AACrB;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,eAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,SAAS;AACtB,cAAa,EAAE;AACf,cAAa,EAAE;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,SAAS;AACtB,cAAa,EAAE;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,SAAS;AACtB,cAAa,EAAE;AACf;AACA;AACA;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,uC;;;;;;;AC7SA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,cAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iC;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;;AAEA,mC;;;;;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA,cAAa,OAAO;AACpB,eAAc,OAAO;AACrB;AACA;AACA;;AAEA;AACA;AACA,IAAG;;AAEH;AACA,cAAa,OAAO;AACpB,cAAa,WAAW;AACxB,gBAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sC;;;;;;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAU,2BAA2B;AACrC;AACA;AACA;AACA;AACA;AACA,SAAQ,OAAO;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA,0B;;;;;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,cAAa,eAAe;AAC5B,cAAa,OAAO;AACpB,cAAa,0DAA0D;AACvE,eAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,eAAe;AAC5B,cAAa,aAAa;AAC1B,cAAa,0BAA0B;AACvC,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,eAAe;AAC5B,cAAa,0BAA0B;AACvC;AACA;AACA;AACA;AACA;;AAEA;;AAEA,kC;;;;;;AC1GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,2B;;;;;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAAyB,iBAAiB;AAC1C;AACA;AACA;AACA,SAAQ;AACR;AACA;AACA,SAAQ;AACR;AACA;AACA;AACA,OAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,cAAa,QAAQ;AACrB,eAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,eAAe;AAC5B,cAAa,OAAO;AACpB,cAAa,WAAW;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,eAAe;AAC5B,cAAa,OAAO;AACpB,cAAa,WAAW;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,6B;;;;;;;AC1FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAa,WAAW;AACxB,eAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,WAAW;AACxB,cAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,WAAW;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,WAAW;AACxB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,WAAW;AACxB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,WAAW;AACxB,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,0BAAyB;AACzB;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,WAAW;AACxB,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;;AAEA,mC;;;;;;;AChQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,EAAC;;AAED;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,eAAe;AAC1B,YAAW,eAAe;AAC1B,aAAY,OAAO;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,kBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,sBAAqB,sBAAsB;AAC3C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,2DAA0D;AAC1D;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,+B;;;;;;;AC9NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,cAAa,SAAS;AACtB,cAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB,sBAAsB;AAC3C;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA,EAAC;;AAED;;AAEA,gC;;;;;;;AC5FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,SAAS;AACpB,YAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,8B;;;;;;;ACtHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,4BAA4B;AACvC;AACA,aAAY,YAAY;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;AACA,eAAc,0BAA0B;AACxC;AACA;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,SAAS;AACtB,cAAa,OAAO;AACpB,cAAa,SAAS;AACtB,cAAa,SAAS;AACtB,cAAa,SAAS;AACtB,cAAa,SAAS;AACtB,cAAa,SAAS;AACtB,cAAa,SAAS;AACtB;AACA,eAAc,EAAE;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX,UAAS;AACT;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,6BAA4B,gCAAgC;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,2DAA0D;AAC1D;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA4B,gCAAgC;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,sDAAqD;AACrD;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,8B;;;;;;;ACtOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,8B;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,YAAW,SAAS;AACpB,YAAW,SAAS;AACpB,aAAY,QAAQ;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA,MAAK;AACL;AACA,MAAK;AACL;AACA;AACA;AACA;AACA,MAAK;AACL;AACA,MAAK;AACL;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA,+B;;;;;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA,YAAW,EAAE;AACb,aAAY,QAAQ;AACpB;AACA;AACA;AACA;;AAEA,6B;;;;;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW,EAAE;AACb,aAAY,QAAQ;AACpB;AACA;;AAEA;AACA;AACA;;AAEA,yB;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,EAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW,SAAS;AACpB,aAAY,QAAQ;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,UAAU;AACrB,aAAY,OAAO;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;AACH;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,4C;;;;;;;AC/GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW;AACX;AACA;;AAEA;AACA;AACA;AACA,cAAa,aAAa;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,0DAA0D;AACvE,eAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,eAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,eAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA,cAAa,OAAO;AACpB,eAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAsB;AACtB;AACA;AACA,IAAG;;AAEH;AACA;AACA,uEAAsE;AACtE;AACA;AACA,cAAa,OAAO;AACpB,eAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gJAA+I;AAC/I;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,0BAA0B;AACvC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,0BAA0B;AACvC,cAAa,aAAa;AAC1B,cAAa,aAAa;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,8BAA6B;AAC7B,kCAAiC,kBAAkB;AACnD;AACA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,aAAa;AAC1B,cAAa,OAAO;AACpB,cAAa,QAAQ;AACrB,cAAa,QAAQ;AACrB,cAAa,0BAA0B;AACvC,cAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,0BAA0B;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAAyD;AACzD;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,eAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,eAAc,eAAe;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,EAAC;;AAED;;AAEA;;AAEA;;AAEA,0C;;;;;;;ACrrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,4C;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,EAAC;;AAED,yC;;;;;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,6C;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,QAAQ;AACnB,YAAW,QAAQ;AACnB,aAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;;AAEA,6C;;;;;;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAkC;AAClC;AACA;AACA;AACA;AACA,IAAG;AACH,mCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;AAED;;AAEA,sC;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,aAAa;AACxB,aAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,aAAa;AACxB,aAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW,UAAU;AACrB,aAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA,YAAW,eAAe;AAC1B,aAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,uC;;;;;;;AC7FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,0DAAyD;AACzD;AACA;AACA,wCAAuC;AACvC;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,iCAAgC;AAChC,iBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,kBAAiB,iBAAiB;AAClC;AACA;AACA,UAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qC;;;;;;;AC1WA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,G;;;;;;;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,oCAAmC;AACnC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,uBAAsB,sBAAsB;AAC5C,wBAAuB,6BAA6B;AACpD,MAAK;AACL;AACA,IAAG;AACH;AACA;AACA,uBAAsB,yBAAyB;AAC/C,wBAAuB,gCAAgC;AACvD,MAAK;AACL;AACA,IAAG;AACH;AACA;AACA,uBAAsB,2BAA2B;AACjD,wBAAuB,kCAAkC;AACzD,MAAK;AACL;AACA,IAAG;AACH;AACA;AACA,uBAAsB,4BAA4B;AAClD,wBAAuB,mCAAmC;AAC1D,MAAK;AACL;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,aAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,YAAW,OAAO;AAClB,YAAW,eAAe;AAC1B,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,aAAY,QAAQ;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,aAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,aAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,eAAe;AAC1B,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,aAAY,QAAQ;AACpB;AACA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,cAAa,OAAO;AACpB,cAAa,eAAe;AAC5B,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,eAAc,EAAE;AAChB,YAAW;AACX;AACA;AACA;AACA;AACA;;AAEA,yC;;;;;;ACpZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,eAAe;AAC1B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,mC;;;;;;;ACtIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,eAAe;AAC1B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,eAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,eAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,oBAAmB,qBAAqB;AACxC;AACA;AACA;AACA;;AAEA;AACA,kBAAiB,eAAe;AAChC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,EAAC;;AAED;;AAEA,2C;;;;;;AC9FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,aAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yC;;;;;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,cAAa;AACb;AACA;AACA;AACA;;AAEA;;AAEA,4C;;;;;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,eAAc,QAAQ;AACtB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,EAAC;;AAED;;AAEA;AACA;AACA;AACA,YAAW,SAAS;AACpB,YAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,8BAA6B;AAC7B;;AAEA;AACA;;AAEA;;AAEA,iC;;;;;;;AChLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,cAAa;AACb;AACA;AACA;AACA;;AAEA;;AAEA,sC;;;;;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA8C,gBAAgB;AAC9D;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wB;;;;;;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,uBAAsB,iBAAiB;AACvC,wBAAuB,wBAAwB;AAC/C,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,cAAa,OAAO;AACpB,cAAa,eAAe;AAC5B,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,eAAc,EAAE;AAChB,YAAW;AACX;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,MAAK;AACL;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,oC;;;;;;AChUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,aAAY,eAAe;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iC;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,qC;;;;;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,uC;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAsC,6BAA6B,UAAU,0BAA0B,UAAU,uBAAuB,UAAU,8BAA8B,UAAU,0BAA0B,UAAU,0BAA0B,UAAU,+BAA+B;;AAEjS,0C;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,8BAA6B,qBAAqB;AAClD;AACA,IAAG;AACH;AACA,8BAA6B,qBAAqB;AAClD;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,eAAe;AAC5B,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,eAAc,EAAE;AAChB,YAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,wC;;;;;;AC3HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;;AAEA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,cAAa;AACb;AACA;AACA;AACA;;AAEA;;AAEA,sC;;;;;;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;;AAEA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,cAAa;AACb;AACA;AACA;AACA;;AAEA;;AAEA,mC;;;;;;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,wC;;;;;;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wC;;;;;;ACvOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,eAAc,WAAW;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,6C;;;;;;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,YAAW,0BAA0B;AACrC,aAAY,YAAY;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,8B;;;;;;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,EAAC;;AAED;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA,+C;;;;;;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,sBAAqB;;AAErB,uBAAsB,iBAAiB;AACvC,oBAAmB,cAAc;AACjC,mBAAkB,eAAe;;AAEjC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uHAAsH;AACtH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,0HAAyH;AACzH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAe,yBAAyB;AACxC;AACA,IAAG;AACH;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,YAAW,OAAO;AAClB,YAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qNAAoN,YAAY;AAChO;AACA;AACA;AACA;AACA;AACA,qOAAoO,+BAA+B;AACnQ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,EAAC;;AAED;AACA;AACA;;AAEA,qDAAoD;AACpD;AACA,yBAAwB;;AAExB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,sBAAqB;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,0DAA0D;AACvE,cAAa,OAAO;AACpB,eAAc,OAAO;AACrB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAkC;AAClC;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,0DAA0D;AACvE,cAAa,OAAO;AACpB,eAAc,OAAO;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,4DAA2D;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,0DAA0D;AACvE,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,eAAc,OAAO;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,wBAAuB,wBAAwB;AAC/C;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,aAAa;AAC1B,cAAa,0DAA0D;AACvE,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,0BAA0B;AACvC,cAAa,aAAa;AAC1B,cAAa,aAAa;AAC1B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,0BAA0B;AACvC,cAAa,YAAY;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,uCAAsC,KAAK;AAC3C;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAwD;AACxD,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,UAAS;AACT;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,0BAA0B;AACvC,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAAyB,sBAAsB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,EAAC;;AAED;;AAEA,oC;;;;;;;ACj8BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iC;;;;;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,YAAW,WAAW;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA,4B;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,EAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,6CAA4C;;AAE5C;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,cAAa,OAAO;AACpB,cAAa,EAAE;AACf;AACA;AACA;AACA;AACA,MAAK;AACL;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iCAAgC,0BAA0B;AAC1D,qBAAoB,SAAS;AAC7B;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,eAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAqE;AACrE;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,WAAW;AACxB,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,EAAC;;AAED,wC;;;;;;;AC9KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,aAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH,EAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,8B;;;;;;AC1IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,aAAY;AACZ;AACA;AACA;AACA;;AAEA,oC;;;;;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,aAAY;AACZ;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA,2B;;;;;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,EAAE;AACb,aAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,uBAAsB;AACtB;;AAEA;AACA;AACA;AACA;AACA;;AAEA,sC;;;;;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,aAAY;AACZ;AACA;AACA;AACA;;AAEA,qC;;;;;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,aAAY;AACZ;AACA;AACA;AACA;;AAEA,4B;;;;;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,YAAW,SAAS;AACpB,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,oC;;;;;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,iC;;;;;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,uCAAsC;AACtC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gCAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,oBAAmB,kBAAkB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,+BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,gC;;;;;;;ACxJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA,cAAa,OAAO;AACpB,eAAc,EAAE;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA,cAAa,OAAO;AACpB,eAAc,EAAE;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA,cAAa,OAAO;AACpB,cAAa,eAAe;AAC5B;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA,mC;;;;;;;ACrIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAQ;AACR,4BAA2B;AAC3B,OAAM;AACN;AACA;AACA;AACA;AACA,8BAA6B,KAAK;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP,2BAA0B;AAC1B,MAAK;AACL;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAmB,sBAAsB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA,oBAAmB,2BAA2B;AAC9C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA,oBAAmB,gCAAgC;AACnD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iC;;;;;;ACnWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,yCAAwC;;AAExC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,QAAQ;AACnB,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gC;;;;;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAuB,wBAAwB;AAC/C;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA,2BAA0B;AAC1B,IAAG;;AAEH;AACA,+BAA8B,2CAA2C;;AAEzE;AACA,iBAAgB;AAChB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,iC;;;;;;;ACrFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAW,UAAU;AACrB,YAAW,GAAG;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,GAAG;AACd,YAAW,iBAAiB;AAC5B,YAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAW,GAAG;AACd,YAAW,UAAU;AACrB,YAAW,GAAG;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,GAAG;AACd,YAAW,iBAAiB;AAC5B,YAAW,EAAE;AACb,aAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW,GAAG;AACd,aAAY,OAAO;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gC;;;;;;ACrLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,EAAE;AACb,YAAW,OAAO;AAClB,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,EAAE;AACb,aAAY,OAAO;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,aAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA,YAAW,GAAG;AACd,YAAW,QAAQ;AACnB,YAAW,UAAU;AACrB,YAAW,GAAG;AACd;AACA,aAAY,QAAQ;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,wBAAuB;AACvB;;AAEA;AACA,oBAAmB,qBAAqB;AACxC;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2LAA2L,yCAAyC;AACpO;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,GAAG;AACd,YAAW,UAAU;AACrB,YAAW,GAAG;AACd,aAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,sC;;;;;;;AC5LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,kBAAiB,2BAA2B;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;AACA,YAAW,kBAAkB;AAC7B,YAAW,QAAQ;AACnB,YAAW,EAAE;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAe,sBAAsB;AACrC;AACA;AACA,gBAAe,oBAAoB;AACnC;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,gBAAe,oBAAoB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qBAAoB;AACpB;AACA;AACA,MAAK;AACL,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,iCAAgC;AAChC;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iC;;;;;;;AC3LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uCAAsC;AACtC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gCAA+B;AAC/B;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,mC;;;;;;;AChHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,WAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA,gBAAe,QAAQ;AACvB,iBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,gBAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,gBAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,gBAAe,QAAQ;AACvB,gBAAe,0BAA0B;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA,gBAAe,QAAQ;AACvB,gBAAe,0BAA0B;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,gBAAe,eAAe;AAC9B,gBAAe,OAAO;AACtB,gBAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,gBAAe,eAAe;AAC9B,gBAAe,OAAO;AACtB;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,gBAAe,eAAe;AAC9B;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,gBAAe,OAAO;AACtB;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,gBAAe,OAAO;AACtB;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,gBAAe,eAAe;AAC9B,gBAAe,OAAO;AACtB,gBAAe,OAAO;AACtB,gBAAe,0BAA0B;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,gBAAe,eAAe;AAC9B;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,kC;;;;;;;AC/eA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,wKAAuK;AACvK;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,QAAQ;AACrB,eAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,QAAQ;AACrB,cAAa,QAAQ;AACrB,cAAa,0BAA0B;AACvC,cAAa,OAAO;AACpB,eAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,uC;;;;;;;ACzHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,YAAW,SAAS;AACpB,YAAW,gBAAgB;AAC3B,YAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,wKAAuK;AACvK;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,kC;;;;;;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,kBAAiB,kBAAkB;AACnC;AACA;AACA;AACA;;AAEA;AACA;;AAEA,+B;;;;;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,YAAW,EAAE;AACb,aAAY,gBAAgB;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;AACD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAM;AACN;AACA;AACA;;AAEA,+BAA8B;AAC9B;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,kBAAiB,kCAAkC;AACnD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAiB,iBAAiB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,eAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,eAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA,qC;;;;;;AClNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,eAAe;AAC5B,cAAa,OAAO;AACpB,cAAa,SAAS;AACtB,eAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,eAAe;AAC5B,cAAa,OAAO;AACpB,cAAa,SAAS;AACtB,eAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA,gC;;;;;;;ACnFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,qBAAqB;AAChC,aAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,6C;;;;;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iC;;;;;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAwB,eAAe;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;AAED;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAY;AACZ;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAc;AACd;AACA;AACA;;AAEA;AACA,eAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA6B,KAAK;AAClC;AACA;AACA,eAAc;AACd;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,WAAW;AACxB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,QAAQ;AACrB,cAAa,QAAQ;AACrB,eAAc,QAAQ;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,QAAQ;AACrB,cAAa,QAAQ;AACrB,cAAa,0BAA0B;AACvC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,QAAQ;AACrB,cAAa,QAAQ;AACrB,cAAa,WAAW;AACxB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,0BAA0B;AACvC;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,sBAAqB,mBAAmB;AACxC;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,8CAA6C;AAC7C,IAAG;AACH;AACA;AACA;AACA;AACA,yCAAwC;AACxC,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,sCAAqC;AACrC,IAAG;AACH;AACA;AACA,IAAG;AACH,2BAA0B;;AAE1B;AACA;AACA;AACA;AACA;AACA;AACA,6HAA4H;AAC5H;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,+OAA8O;;AAE9O;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,aAAY,OAAO;AACnB;AACA;AACA;;AAEA;AACA;AACA,+NAA8N;AAC9N;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,SAAS;AACpB,YAAW,SAAS;AACpB,aAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,SAAS;AACpB,YAAW,SAAS;AACpB,aAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,SAAS;AACpB,aAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yFAAwF,aAAa;AACrG;AACA;;AAEA,uDAAsD;AACtD;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,eAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAa,OAAO;AACpB,eAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;;AAEA,6B;;;;;;;AClwBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,gBAAgB;AAC3B;AACA,YAAW,UAAU;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,wIAAuI;AACvI;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,UAAU;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iC;;;;;;;ACzHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAa,WAAW;AACxB,eAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,WAAW;AACxB,cAAa,UAAU;AACvB;AACA;AACA,0DAAyD;;AAEzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,WAAW;AACxB;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,WAAW;AACxB,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,WAAW;AACxB,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,WAAW;AACxB,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,WAAW;AACxB,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;;AAEA;;AAEA,uC;;;;;;;ACrHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAc,UAAU;AACxB;AACA;AACA;AACA,cAAa,UAAU;AACvB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA,cAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAc,cAAc;AAC5B;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA,eAAc,OAAO;AACrB;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,4C;;;;;;ACtJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA,0BAAyB;AACzB,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA,sC;;;;;;AC3HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,WAAW;AACtB,aAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW,WAAW;AACtB,aAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW,uBAAuB;AAClC,YAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,uBAAuB;AAClC,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,cAAa,WAAW;AACxB;AACA;;AAEA;AACA,cAAa,uBAAuB;AACpC,cAAa,OAAO;AACpB;AACA;AACA;;AAEA,oC;;;;;;ACnNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,YAAW,uBAAuB;AAClC,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW,uBAAuB;AAClC,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,uBAAuB;AAClC,YAAW,OAAO;AAClB,aAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,4C;;;;;;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA,mC;;;;;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,uBAAsB,iBAAiB;AACvC,wBAAuB,wBAAwB;AAC/C,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,4BAA2B,iBAAiB;;AAE5C;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,WAAW;AACtB,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,cAAa,OAAO;AACpB,cAAa,eAAe;AAC5B,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,eAAc,EAAE;AAChB,YAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA,oC;;;;;;ACxMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,uC;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,uBAAsB,gBAAgB;AACtC,wBAAuB,uBAAuB;AAC9C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,eAAe;AACrC,wBAAuB,sBAAsB;AAC7C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,kBAAkB;AACxC,wBAAuB,yBAAyB;AAChD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,yBAAyB;AAC/C,wBAAuB,gCAAgC;AACvD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,gBAAgB;AACtC,wBAAuB,uBAAuB;AAC9C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,sBAAsB;AAC5C,wBAAuB,6BAA6B;AACpD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,eAAe;AACrC,wBAAuB,sBAAsB;AAC7C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,cAAc;AACpC,wBAAuB,qBAAqB;AAC5C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,sBAAsB;AAC5C,wBAAuB,6BAA6B;AACpD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,eAAe;AACrC,wBAAuB,sBAAsB;AAC7C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,kBAAkB;AACxC,wBAAuB,yBAAyB;AAChD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,oBAAoB;AAC1C,wBAAuB,2BAA2B;AAClD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,mBAAmB;AACzC,wBAAuB,0BAA0B;AACjD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,oBAAoB;AAC1C,wBAAuB,2BAA2B;AAClD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,mBAAmB;AACzC,wBAAuB,0BAA0B;AACjD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,oBAAoB;AAC1C,wBAAuB,2BAA2B;AAClD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,eAAe;AACrC,wBAAuB,sBAAsB;AAC7C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,yBAAyB;AAC/C,wBAAuB,gCAAgC;AACvD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,kBAAkB;AACxC,wBAAuB,yBAAyB;AAChD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,oBAAoB;AAC1C,wBAAuB,2BAA2B;AAClD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,gBAAgB;AACtC,wBAAuB,uBAAuB;AAC9C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,gBAAgB;AACtC,wBAAuB,uBAAuB;AAC9C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,gBAAgB;AACtC,wBAAuB,uBAAuB;AAC9C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,gBAAgB;AACtC,wBAAuB,uBAAuB;AAC9C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,kBAAkB;AACxC,wBAAuB,yBAAyB;AAChD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,mBAAmB;AACzC,wBAAuB,0BAA0B;AACjD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,gBAAgB;AACtC,wBAAuB,uBAAuB;AAC9C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,eAAe;AACrC,wBAAuB,sBAAsB;AAC7C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,qBAAqB;AAC3C,wBAAuB,4BAA4B;AACnD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,yBAAyB;AAC/C,wBAAuB,gCAAgC;AACvD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,oBAAoB;AAC1C,wBAAuB,2BAA2B;AAClD;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,uBAAsB,oBAAoB;AAC1C,wBAAuB,2BAA2B;AAClD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,oBAAoB;AAC1C,wBAAuB,2BAA2B;AAClD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,mBAAmB;AACzC,wBAAuB,0BAA0B;AACjD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,oBAAoB;AAC1C,wBAAuB,2BAA2B;AAClD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,kBAAkB;AACxC,wBAAuB,yBAAyB;AAChD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,gBAAgB;AACtC,wBAAuB,uBAAuB;AAC9C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,gBAAgB;AACtC,wBAAuB,uBAAuB;AAC9C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,eAAe;AACrC,wBAAuB,sBAAsB;AAC7C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,kBAAkB;AACxC,wBAAuB,yBAAyB;AAChD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,mBAAmB;AACzC,wBAAuB,0BAA0B;AACjD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,qBAAqB;AAC3C,wBAAuB,4BAA4B;AACnD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,gBAAgB;AACtC,wBAAuB,uBAAuB;AAC9C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,iBAAiB;AACvC,wBAAuB,wBAAwB;AAC/C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,iBAAiB;AACvC,wBAAuB,wBAAwB;AAC/C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,kBAAkB;AACxC,wBAAuB,yBAAyB;AAChD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,kBAAkB;AACxC,wBAAuB,yBAAyB;AAChD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,iBAAiB;AACvC,wBAAuB,wBAAwB;AAC/C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,kBAAkB;AACxC,wBAAuB,yBAAyB;AAChD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,qBAAqB;AAC3C,wBAAuB,4BAA4B;AACnD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,sBAAsB;AAC5C,wBAAuB,6BAA6B;AACpD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,mBAAmB;AACzC,wBAAuB,0BAA0B;AACjD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,oBAAoB;AAC1C,wBAAuB,2BAA2B;AAClD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,qBAAqB;AAC3C,wBAAuB,4BAA4B;AACnD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,uBAAuB;AAC7C,wBAAuB,8BAA8B;AACrD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,kBAAkB;AACxC,wBAAuB,yBAAyB;AAChD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,gBAAgB;AACtC,wBAAuB,uBAAuB;AAC9C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,2BAA0B,gBAAgB;AAC1C;;AAEA;;AAEA;;AAEA;AACA,cAAa,OAAO;AACpB,cAAa,eAAe;AAC5B,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,eAAc,EAAE;AAChB,YAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,oC;;;;;;;AC1kBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,cAAa;AACb;AACA;AACA;AACA;;AAEA;;AAEA,0C;;;;;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,cAAa;AACb;AACA;AACA;AACA;;AAEA;;AAEA,sC;;;;;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,cAAa;AACb;AACA;AACA;AACA;;AAEA;;AAEA,yC;;;;;;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,aAAY,OAAO;AACnB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,mC;;;;;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW,OAAO;AAClB,aAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,8B;;;;;;ACtGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,cAAa;AACb;AACA;AACA;AACA;;AAEA;;AAEA,qC;;;;;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,cAAa;AACb;AACA;AACA;AACA;;AAEA;;AAEA,sC;;;;;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,cAAa;AACb;AACA;AACA;AACA;;AAEA;;AAEA,sC;;;;;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,uC;;;;;;AC9HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;AACA;AACA,sEAAqE,aAAa;AAClF;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAuB;AACvB,wBAAuB;AACvB,qBAAoB;AACpB,qBAAoB;AACpB,qBAAoB;AACpB,2BAA0B;AAC1B;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;;AAEA,mC;;;;;;AC5OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB,yBAAyB;AAC1C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT,QAAO;AACP,MAAK;AACL,IAAG;AACH;AACA;;AAEA;AACA;AACA;;AAEA,kBAAiB,yBAAyB;AAC1C;AACA,2BAA0B;;AAE1B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;;AAEA,kBAAiB,yBAAyB;AAC1C;AACA,2BAA0B;AAC1B;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAwB;;AAExB;AACA;AACA;AACA;AACA,oBAAmB,yBAAyB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,2C;;;;;;ACtMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,iC;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,oC;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,2B;;;;;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,wD;;;;;;ACfA;;AAEA;;;;;;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,EAAC;;AAED;AACA;;AAEA,wB;;;;;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,iC;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,YAAW,aAAa;AACxB,aAAY,OAAO;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW,aAAa;AACxB,aAAY,OAAO;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,G;;;;;;;AClFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,8C;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAc,MAAM;AACpB;AACA;AACA;AACA,IAAG;;AAEH;AACA,eAAc,OAAO;AACrB;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,kD;;;;;;ACtFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,wB;;;;;;;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,EAAC;;AAED,oC;;;;;;;AChLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,aAAa;AACxB,YAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,aAAa;AACxB,YAAW,EAAE;AACb,cAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gGAA+F;AAC/F;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,UAAU;AACrB,YAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;AACA,oBAAmB,iBAAiB;AACpC;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8IAA6I;AAC7I;AACA,QAAO;AACP;AACA;AACA,uIAAsI;AACtI;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW,aAAa;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB,sBAAsB;AAC3C;AACA;AACA;;AAEA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA,UAAS;AACT;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA,oBAAmB,sBAAsB;AACzC;AACA;AACA;AACA;AACA;;AAEA;;AAEA,wC;;;;;;;ACxRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,QAAQ;AACnB,YAAW,SAAS;AACpB,YAAW,EAAE;AACb,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,4B;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,QAAQ;AACnB,aAAY,eAAe;AAC3B;AACA;AACA;AACA;AACA;AACA;;AAEA,4B;;;;;;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,EAAE;AACb,YAAW,SAAS;AACpB,aAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,6B;;;;;;;;;;;;;;;;;;;;;;;kCC/CkB,GAAO;;;;uCACX,GAAY;;;;mCACZ,GAAQ;;;;4CACJ,GAAoB;;;;2CACrB,GAAmB;;;;iDACb,GAAyB;;;;4CACjB,GAAoB;;KAEtC,cAAc;eAAd,cAAc;;AACZ,cADF,cAAc,CACX,KAAK,EAAE;;;+BADV,cAAc;;AAEnB,oCAFK,cAAc,6CAEb,KAAK,EAAE;;cASjB,eAAe,GAAG,UAAC,KAAK,EAAM;AAC1B,kBAAK,CAAC,cAAc,EAAE,CAAC;AACvB,iBAAI,IAAI,GAAG;AACP,yBAAQ,EAAE,MAAK,KAAK,CAAC,QAAQ;AAC7B,yBAAQ,EAAE,MAAK,KAAK,CAAC,QAAQ;AAC7B,6BAAU,kBAAkB,CAAC,uCAAiB,UAAU,CAAC,CAAC;cAC7D;iBAAE,IAAI,QAAO,CAAC;;AAEf,iCAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,UAAS,MAAM,EAAE;AAC1C,qBAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC7B,qBAAI,GAAG,CAAC,CAAC,EAAE;AACP,yBAAI,CAAC,QAAQ,CAAC;AACV,qCAAY,EAAE,IAAI;AAClB,qCAAY,EAAE,GAAG,CAAC,OAAO;sBAC5B,CAAC,CAAC;kBACN,MAAM;AACH,2BAAM,CAAC,QAAQ,GAAG,GAAG,YAAS,CAAC;kBAClC;cACJ,CAAC,CAAC;UACN;;cAED,mBAAmB,GAAG,UAAC,KAAK,EAAM;AAC9B,mBAAK,QAAQ,CAAC;AACV,yBAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK;cAC/B,CAAC,CAAC;UACN;;cAED,mBAAmB,GAAG,UAAC,KAAK,EAAM;AAC9B,mBAAK,QAAQ,CAAC;AACV,yBAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK;cAC/B,CAAC,CAAC;UACN;;AAvCG,aAAI,CAAC,KAAK,GAAG;AACT,qBAAQ,EAAE,IAAI;AACd,qBAAQ,EAAE,IAAI;AACd,yBAAY,EAAE,KAAK;AACnB,yBAAY,EAAE,cAAc;UAC/B,CAAC;MACL;;kBATQ,cAAc;;gBA4CjB,kBAAG;AACL,oBACQ;;mBAAK,SAAS,EAAC,uBAAuB;iBAClC;;uBAAK,SAAS,EAAC,qBAAqB;qBAChC;;;;sBAAe;qBACvB;;2BAAM,QAAQ,EAAE,IAAI,CAAC,eAAgB;yBAEjC;AACI,iCAAI,EAAC,KAAK;AACV,gCAAG,EAAC,UAAU;AACd,iCAAI,EAAC,MAAM;AACX,yCAAY,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;AAClC,kCAAK,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;AAC3B,qCAAQ,EAAE,IAAI,CAAC,mBAAoB;2BACrC;yBAEF;AACI,iCAAI,EAAC,IAAI;AACT,iCAAI,EAAC,UAAU;AACf,gCAAG,EAAC,MAAM;AACV,yCAAY,EAAE,IAAI,CAAC,KAAK,CAAC,QAAS;AAClC,kCAAK,EAAE,IAAI,CAAC,KAAK,CAAC,SAAU;AAC5B,qCAAQ,EAAE,IAAI,CAAC,mBAAoB;2BACrC;yBAEF;AACI,oCAAO,EAAE,IAAI,CAAC,KAAK,CAAC,YAAa;AACjC,yCAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAa;2BACxC;yBAEF;;;AACI,qCAAI,EAAC,QAAQ;AACb,0CAAS,EAAC,oBAAoB;;0BAEzB;sBACR;kBACL;cACJ,CACF;UACL;;;YAnFQ,cAAc;IAAS,mBAAM,SAAS;;;;KAsF9B,KAAK;eAAL,KAAK;;cAAL,KAAK;+BAAL,KAAK;;oCAAL,KAAK;;;kBAAL,KAAK;;gBAChB,kBAAG;AACL,oBACQ;;mBAAK,SAAS,EAAC,qBAAqB;iBAChC;;uBAAK,SAAS,EAAC,0BAA0B;qBACrC,iCAAC,cAAc,OAAE;kBACf;cACJ,CACZ;UACL;;;YATgB,KAAK;IAAS,mBAAM,SAAS;;sBAA7B,KAAK,C;;;;;;AC9F1B;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,0BAAyB,gBAAgB;AACzC;AACA;AACA;AACA,wBAAuB,OAAO;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAsC,YAAY;AAClD;AACA;AACA,MAAK;AACL;AACA,wCAAuC,YAAY;AACnD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAY,8BAA8B;AAC1C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA0C,YAAY;AACtD;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA0C,YAAY;AACtD;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA6B,gBAAgB;AAC7C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA,qDAAoD;AACpD,IAAG;;AAEH;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,2CAA0C;AAC1C,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,6DAA4D,YAAY;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA8C,YAAY;AAC1D;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,+CAA8C,YAAY;AAC1D;AACA;AACA,sBAAqB,gBAAgB;AACrC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,wBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,8CAA6C,YAAY;AACzD;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAY,8BAA8B;AAC1C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAsD;AACtD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA0C,0BAA0B;AACpE;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,sBAAqB,cAAc;AACnC;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB,YAAY;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAe,YAAY;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO,eAAe;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,sBAAqB,eAAe;AACpC;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAmB,YAAY;AAC/B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAsB;AACtB;AACA,0BAAyB,gBAAgB;AACzC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAmB,YAAY;AAC/B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,0CAAyC,YAAY;AACrD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,0CAAyC,YAAY;AACrD;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAmB;AACnB;AACA;AACA;AACA;AACA,MAAK;AACL;AACA,6CAA4C,mBAAmB;AAC/D;AACA;AACA,0CAAyC,YAAY;AACrD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,sDAAqD;AACrD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAmB,YAAY;AAC/B;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA6E;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,sCAAqC;AACrC;AACA;AACA;;AAEA;AACA;AACA;AACA,2BAA0B;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAe;AACf,eAAc;AACd,eAAc;AACd,iBAAgB;AAChB,iBAAgB;AAChB,iBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,0BAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA4B;;AAE5B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP,sBAAqB;AACrB;;AAEA;AACA;AACA,MAAK;AACL,kBAAiB;;AAEjB;AACA,mDAAkD,EAAE,iBAAiB;;AAErE;AACA,yBAAwB,8BAA8B;AACtD,4BAA2B;;AAE3B;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,mDAAkD,iBAAiB;;AAEnE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA,EAAC;;;;;;;;;;;;;;;;;;;;;;;;;;kCC3gDiB,GAAO;;;;uCACX,GAAY;;;;iCACT,GAAQ;;;;uCACF,GAAc;;;;8CACP,GAAqB;;;;2CAC5B,GAAiB;;;;AAExC,KAAI,EAAE,GAAG,4BAAW,IAAI,CAAC,EAAE,CAAC,CAAC;;KAER,KAAK;eAAL,KAAK;;AACX,cADM,KAAK,CACV,KAAK,EAAE;;;+BADF,KAAK;;AAElB,oCAFa,KAAK,6CAEZ,KAAK,EAAE;;cA0BjB,YAAY,GAAG,UAAC,KAAK,EAAK;AACtB,mBAAK,QAAQ,CAAC;AACV,sBAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK;AACzB,sBAAK,EAAE,wBAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;cACvC,CAAC,CAAC;;AAEH,iBAAI,MAAK,KAAK,CAAC,SAAS,EAAE;AACtB,uBAAK,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;cACtC,CAAC;;AAEF,iBAAI,MAAK,KAAK,CAAC,QAAQ,EAAE;AACrB,uBAAK,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;cAC1C;;AAED,iBAAI,MAAK,KAAK,CAAC,QAAQ,EAAE;AACrB,uBAAK,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;cAC9B;UACJ;;cAED,aAAa,GAAI,UAAC,KAAK,EAAM;;AAEzB,iBAAI,MAAK,KAAK,CAAC,QAAQ,IAAI,MAAK,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAC;AAClD,uBAAK,QAAQ,CAAC;AACV,0BAAK,EAAE,IAAI;AACX,iCAAY,EAAE,KAAK;kBACtB,CAAC,CAAC;cACN,MAAM;AACH,uBAAK,QAAQ,CAAC;AACV,0BAAK,EAAE,KAAK;AACZ,iCAAY,EAAE,CAAC,wBAAE,OAAO,CAAC,KAAK,CAAC,GAAG,MAAK,KAAK,CAAC,YAAY,GAAG,MAAK,KAAK,CAAC,YAAY;kBACtF,CAAC,CAAC;cACN;UAEJ;;cAED,yBAAyB,GAAI,UAAC,QAAQ,EAAM;;AAExC,iBAAI,QAAQ,CAAC,KAAK,EAAE;AAChB,qBAAG,CAAC,wBAAE,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AAC5D,yBAAI,MAAK,KAAK,CAAC,QAAQ,EAAE;AACrB,+BAAK,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;sBACtC;AACD,2BAAK,QAAQ,CAAC;AACV,8BAAK,EAAE,QAAQ,CAAC,KAAK;AACrB,8BAAK,EAAE,wBAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;sBACnC,CAAC,CAAC;kBACN;cACJ;UACJ;;cAeD,WAAW,GAAG,UAAC,KAAK,EAAK;AACrB,mBAAK,QAAQ,CAAC;AACV,sBAAK,EAAE,IAAI;AACX,iCAAgB,EAAE,IAAI;cACzB,CAAC,CAAC;;AAEH,iBAAI,MAAK,KAAK,CAAC,SAAS,EAAE;AACtB,uBAAK,QAAQ,CAAC;AACV,iCAAY,EAAE,KAAK;kBACtB,CAAC,CAAC;cACN;UACJ;;cAED,UAAU,GAAG,UAAC,KAAK,EAAK;AACpB,mBAAK,QAAQ,CAAC;AACV,sBAAK,EAAE,KAAK;AACZ,6BAAY,EAAE,CAAC,MAAK,KAAK,CAAC,KAAK;AAC/B,iCAAgB,EAAE,KAAK;cAC1B,CAAC,CAAC;UACN;;cAgBD,UAAU,GAAI,UAAC,KAAK,EAAM;AACtB,iBAAI,SAAS,GAAG;AACZ,yBAAQ,EAAE,CAAC,wBAAE,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAK,KAAK,CAAC,aAAa,CAAC,GAAE,KAAK;AACvF,+BAAc,EAAE,CAAC,wBAAE,OAAO,CAAC,KAAK,CAAC,GAAG,MAAK,aAAa,CAAC,KAAK,CAAC,GAAE,KAAK;AACpE,wBAAO,EAAE,CAAC,wBAAE,OAAO,CAAC,KAAK,CAAC,GAAG,MAAK,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK;AACjE,sBAAK,EAAE,CAAC,wBAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,MAAK,UAAU,CAAC,KAAK,CAAC,GAAG,KAAK;cAC7D,CAAC;AACF,iBAAI,QAAQ,GAAI,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,cAAc,IAAI,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,KAAM,CAAC;;AAExG,mBAAK,QAAQ,CAAC;AACV,iCAAgB,EAAE,SAAS;AAC3B,kCAAiB,EAAE,QAAQ;AAC3B,sBAAK,EAAE,QAAQ;cAClB,CAAC,CAAC;UACN;;cAED,aAAa,GAAI,UAAC,KAAK,EAAM;AACzB,oBAAO,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;UAC9C;;cAED,YAAY,GAAI,UAAC,KAAK,EAAM;AACxB,oBAAO,KAAI,CAAC,IAAI,CAAC,KAAK,CAAC;eAAC;UAC3B;;cAED,UAAU,GAAI,UAAC,KAAK,EAAM;AACtB,oBAAQ,wBAAE,IAAI,CAAC,MAAK,KAAK,CAAC,cAAc,EAAE,UAAU,IAAI,EAAE;AACtD,qBAAI,OAAO,GAAI,IAAI,KAAK,KAAK,GAAI,IAAI,GAAG,EAAE,CAAC;AAC3C,wBAAO,OAAO;cACjB,CAAC,CAAC;UACN;;AAxJG,aAAI,CAAC,KAAK,GAAG;AACT,kBAAK,EAAG,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,IAAK,IAAI;AAC3D,kBAAK,EAAE,wBAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;AAClC,kBAAK,EAAE,KAAK;AACZ,kBAAK,EAAE,IAAI;AACX,yBAAY,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS;AACnC,yBAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY;AACrC,sBAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;AAC/B,6BAAgB,EAAE,KAAK;AACvB,iBAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;AACrB,0BAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa;AACvC,4BAAe,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe;AAC3C,2BAAc,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc;AACzC,2BAAc,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc;AACzC,6BAAgB,EAAE;AACd,yBAAQ,EAAE,KAAK;AACf,+BAAc,EAAE,KAAK;AACrB,wBAAO,EAAE,KAAK;AACd,sBAAK,EAAE,KAAK;AACZ,oBAAG,EAAE,KAAK;cACb;AACD,8BAAiB,EAAE,KAAK;UAC3B,CAAC;MACL;;kBA1BgB,KAAK;;gBA8Ef,mBAAG;AACN,iBAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;AACrB,qBAAI,wBAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;AACvE,yBAAI,CAAC,QAAQ,CAAC;AACV,8BAAK,EAAE,KAAK;AACZ,qCAAY,EAAE,IAAI;sBACrB,CAAC,CAAC;kBACN;cACJ;;AAED,oBAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;UAC3B;;;gBAuBc,2BAAG;AACd,iBAAI,CAAC,QAAQ,CAAC;AACV,6BAAY,EAAE,IAAI;cACrB,CAAC,CAAC;UACN;;;gBAEQ,qBAAG;AACR,iBAAI,CAAC,QAAQ,CAAC;AACV,6BAAY,EAAE,KAAK;AACnB,iCAAgB,EAAE,KAAK;cAC1B,CAAC,CAAC;UACN;;;;;gBAkCK,kBAAG;;AAEL,iBAAI,iBAAiB,GAAG,EAAE,CAAC;AACvB,8BAAa,EAAM,IAAI;AACvB,8BAAa,EAAM,IAAI,CAAC,KAAK,CAAC,KAAK;AACnC,8BAAa,EAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK;AACpC,8BAAa,EAAM,IAAI,CAAC,KAAK,CAAC,KAAK;AACnC,iCAAgB,EAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK;AACpC,gCAAe,EAAI,IAAI,CAAC,KAAK,CAAC,KAAK;AACnC,kCAAiB,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK;cACvC,CAAC,CAAC;;AAEH,iBAAI,SAAS,CAAC;;AAEd,iBAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;AACtB,0BAAS,GACL;AACJ,wBAAG,EAAC,mBAAmB;AACvB,4BAAO,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAiB;AACrC,yBAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAK;AACtB,0BAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAM;AACxB,8BAAS,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAiB;AACvC,0BAAK,EAAE,IAAI,CAAC,KAAK,CAAC,iBAAkB;AACpC,mCAAc,EAAE,IAAI,CAAC,KAAK,CAAC,cAAe;AAC1C,kCAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;AACxC,oCAAe,EAAE,IAAI,CAAC,KAAK,CAAC,eAAgB;AAC5C,mCAAc,EAAE,IAAI,CAAC,KAAK,CAAC,cAAe;mBACpC;cACT,CAAC;;AAEF,oBACQ;;mBAAK,SAAS,EAAE,iBAAkB;iBAElC;;uBAAO,SAAS,EAAC,aAAa,EAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAK;qBACxD;;2BAAM,SAAS,EAAC,YAAY;yBAAE,IAAI,CAAC,KAAK,CAAC,IAAI;sBAAQ;kBAC7C;iBAER,uDACA,IAAI,CAAC,KAAK;AACd,gCAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAY;AACpC,8BAAS,EAAC,OAAO;AACjB,uBAAE,EAAE,IAAI,CAAC,KAAK,CAAC,IAAK;AACpB,iCAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAa;AACtC,0BAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAM;AACxB,6BAAQ,EAAE,IAAI,CAAC,YAAa;AAC5B,4BAAO,EAAE,IAAI,CAAC,WAAY;AAC1B,2BAAM,EAAE,IAAI,CAAC,UAAW;AACxB,iCAAY,EAAC,KAAK;oBACZ;iBAEF;AACJ,4BAAO,EAAE,IAAI,CAAC,KAAK,CAAC,YAAa;AACjC,iCAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAa;mBAChC;iBAEF;;uBAAK,SAAS,EAAC,iBAAiB;qBAChC;;2BAAG,SAAS,EAAC,kBAAkB,EAAC,YAAY,EAAE,IAAI,CAAC,eAAgB;;yBAAE,sDAAM,IAAI,EAAC,cAAc,GAAE;;sBAAK;qBACrG;;2BAAG,SAAS,EAAC,kBAAkB;;yBAAE,sDAAM,IAAI,EAAC,aAAa,GAAE;;sBAAK;kBAC1D;iBAET,SAAS;cAEJ,CACR;UACL;;;YA7NgB,KAAK;IAAS,mBAAM,SAAS;;sBAA7B,KAAK;AA8NzB,EAAC;;;;;;;;;;;;;;;;;;;;;;;kCCvOgB,GAAO;;;;KAEJ,IAAI;aAAJ,IAAI;;YAAJ,IAAI;2BAAJ,IAAI;;gCAAJ,IAAI;;;gBAAJ,IAAI;;YAEjB,kBAAG;AACP,eAAO,IAAI,CAAC,KAAK,CAAC,IAAI;;AAEpB,cAAK,cAAc;AACjB,kBACE;;eAAK,OAAO,EAAC,WAAW;aACxB,2CAAM,CAAC,EAAC,uSAE2E,GAAE;YAC/E,CACP;;AAEH,cAAK,aAAa;AAChB,kBACE;;eAAK,OAAO,EAAC,WAAW;aACxB,2CAAM,CAAC,EAAC,qUAE8F,GAAE;YAClG,CACP;;AAEH,cAAK,oBAAoB;AACvB,kBACE;;eAAK,OAAO,EAAC,WAAW;aACtB,2CAAM,IAAI,EAAC,SAAS,EAAC,CAAC,EAAC,sEAAsE,GAAE;aAC/F,2CAAM,IAAI,EAAC,SAAS,EAAC,CAAC,EAAC,4MACoF,GAAE;YACzG,CACP;;AAEH,cAAK,QAAQ;AACX,kBACE;;eAAK,OAAO,EAAC,WAAW;aACxB,2CAAM,aAAU,SAAS,EAAC,aAAU,SAAS,EAAC,IAAI,EAAC,SAAS,EAAC,CAAC,EAAC,qjBAK5D,GAAE;YACC,CACP;AAAA,QACJ;MACF;;;UA5CkB,IAAI;IAAS,mBAAM,SAAS;;sBAA5B,IAAI;;;;;;;;;;;;;;;;;;;;;;;kCCFP,GAAO;;;;uCACX,GAAY;;;;2CACH,GAAiB;;;;AAExC,KAAI,EAAE,GAAG,4BAAW,IAAI,CAAC,EAAE,CAAC,CAAC;;KAER,UAAU;eAAV,UAAU;;AAChB,cADM,UAAU,CACf,KAAK,EAAE;+BADF,UAAU;;AAEvB,oCAFa,UAAU,6CAEjB,KAAK,EAAE;AACb,aAAI,CAAC,KAAK,GAAG;AACT,oBAAO,EAAE,kBAAkB;UAC9B,CAAC;MACL;;kBANgB,UAAU;;gBAQrB,kBAAG;AACL,iBAAI,UAAU,GAAG,EAAE,CAAC;AAChB,kCAAiB,EAAI,IAAI;AACzB,0BAAS,EAAY,IAAI,CAAC,KAAK,CAAC,OAAO;AACvC,4BAAW,EAAU,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO;cAC3C,CAAC,CAAC;;AAEH,oBACQ;;mBAAK,SAAS,EAAE,UAAW;iBACvB;;;qBAAO,IAAI,CAAC,KAAK,CAAC,YAAY;kBAAQ;cACpC,CACb;UACJ;;;YApBgB,UAAU;IAAS,mBAAM,SAAS;;sBAAlC,UAAU;;;;;;;ACN/B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,iBAAgB;;AAEhB;AACA;;AAEA,kBAAiB,sBAAsB;AACvC;AACA;;AAEA;;AAEA;AACA;AACA,KAAI;AACJ;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA,IAAG;AACH,GAAE;AACF;AACA;AACA,EAAC;;;;;;;;;;;;;;;;;;;;;;;kCC/CiB,GAAO;;;;uCACX,GAAY;;;;iCACT,GAAQ;;;;2CACF,GAAiB;;;;AAExC,KAAI,EAAE,GAAG,4BAAW,IAAI,CAAC,EAAE,CAAC,CAAC;;KAER,iBAAiB;eAAjB,iBAAiB;;AACvB,cADM,iBAAiB,CACtB,KAAK,EAAE;+BADF,iBAAiB;;AAE9B,oCAFa,iBAAiB,6CAExB,KAAK,EAAE;AACb,aAAI,CAAC,KAAK,GAAG;AACT,kBAAK,EAAE,IAAI;AACX,0BAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa;AACvC,4BAAe,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe;AAC3C,2BAAc,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc;AACzC,2BAAc,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc;AACzC,iBAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;UACxB;MACJ;;kBAXgB,iBAAiB;;gBAa5B,kBAAG;AACL,iBAAI,cAAc,GAAG,EAAE,CAAC;AACpB,qCAAoB,EAAI,IAAI;AAC5B,0BAAS,EAAe,IAAI,CAAC,KAAK,CAAC,OAAO;AAC1C,4BAAW,EAAa,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO;cAC9C,CAAC,CAAC;;AAEH,iBAAI,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,UAAS,IAAI,EAAE,CAAC,EAAE;AACjE,wBACQ;;uBAAM,GAAG,EAAE,CAAE,EAAC,SAAS,EAAC,UAAU;;qBAChC,IAAI;;kBACH,CACV;cACJ,CAAC,CAAC;;AAEH,iBAAI,cAAc,CAAC;;AAEnB,iBAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;AAClB,+BAAc,GACV;;uBAAI,SAAS,EAAC,uBAAuB;qBACpC,IAAI,CAAC,KAAK,CAAC,IAAI;;kBACf;cACR,MAAM;AACH,+BAAc,GACV;;uBAAI,SAAS,EAAC,yBAAyB;qBACtC,IAAI,CAAC,KAAK,CAAC,IAAI;;kBACf;cACR;;AAED,oBACQ;;mBAAK,SAAS,EAAE,cAAe;iBAC3B;;uBAAK,SAAS,EAAC,qBAAqB;qBACnC,cAAc;qBACf;;2BAAI,SAAS,EAAC,YAAY;yBACtB;;+BAAI,SAAS,EAAE,EAAE,CAAC,EAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAC,CAAE;6BACxD;;mCAAG,SAAS,EAAC,YAAY;;iCAAE,sDAAM,IAAI,EAAC,oBAAoB,GAAE;;8BAAK;6BACjE;;mCAAG,SAAS,EAAC,cAAc;;iCAAE,sDAAM,IAAI,EAAC,cAAc,GAAE;;8BAAK;6BAC7D;;mCAAM,SAAS,EAAC,eAAe;iCAAE,IAAI,CAAC,KAAK,CAAC,aAAa;;8BAA2B;0BACpF;yBAEL;;+BAAI,SAAS,EAAE,EAAE,CAAC,EAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,cAAc,EAAC,CAAE;6BAC9D;;mCAAG,SAAS,EAAC,YAAY;;iCAAE,sDAAM,IAAI,EAAC,oBAAoB,GAAE;;8BAAK;6BACjE;;mCAAG,SAAS,EAAC,cAAc;;iCAAE,sDAAM,IAAI,EAAC,cAAc,GAAE;;8BAAK;6BAC7D;;mCAAM,SAAS,EAAC,eAAe;;iCAAoB,IAAI,CAAC,KAAK,CAAC,eAAe;;8BAAuB;0BACpG;yBAEL;;+BAAI,SAAS,EAAE,EAAE,CAAC,EAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAC,CAAE;6BACvD;;mCAAG,SAAS,EAAC,YAAY;;iCAAE,sDAAM,IAAI,EAAC,oBAAoB,GAAE;;8BAAK;6BACjE;;mCAAG,SAAS,EAAC,cAAc;;iCAAE,sDAAM,IAAI,EAAC,cAAc,GAAE;;8BAAK;6BAC7D;;mCAAM,SAAS,EAAC,eAAe;;iCAAoB,IAAI,CAAC,KAAK,CAAC,cAAc;;8BAAe;0BAC3F;yBAEL;;+BAAI,SAAS,EAAE,EAAE,CAAC,EAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,EAAC,CAAE;6BACrD;;mCAAG,SAAS,EAAC,YAAY;;iCAAE,sDAAM,IAAI,EAAC,oBAAoB,GAAE;;8BAAK;6BACjE;;mCAAG,SAAS,EAAC,cAAc;;iCAAE,sDAAM,IAAI,EAAC,cAAc,GAAE;;8BAAK;6BAC7D;;mCAAM,SAAS,EAAC,eAAe;;iCAAW,cAAc;8BAAQ;0BAChE;sBACJ;kBACH;cACJ,CACL;UACJ;;;YA1EgB,iBAAiB;IAAS,mBAAM,SAAS;;sBAAzC,iBAAiB;;;;;;;;;;;;;;ACP/B,UAAS,gBAAgB,CAAC,QAAQ,EACzC;AACI,SAAI,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAChD,SAAI,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC5B,UAAK,IAAI,CAAC,GAAC,CAAC,EAAC,CAAC,GAAC,IAAI,CAAC,MAAM,EAAC,CAAC,EAAE,EAAE;AAC5B,aAAI,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC9B,aAAG,IAAI,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAC;AAAC,oBAAO,IAAI,CAAC,CAAC,CAAC,CAAC;UAAC;MAC3C;AACD,YAAO,GAAG,CAAC","file":"login.js","sourcesContent":["import ReactDOM from 'react-dom';\nimport React from 'react';\nimport Login from './signin';\n\nReactDOM.render(<Login/>, document.getElementById('main'));\n\n\n\n/** WEBPACK FOOTER **\n ** ./hub/static/jsx/login.jsx\n **/","'use strict';\n\nmodule.exports = require('react/lib/ReactDOM');\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react-dom/index.js\n ** module id = 1\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactDOM\n */\n\n/* globals __REACT_DEVTOOLS_GLOBAL_HOOK__*/\n\n'use strict';\n\nvar ReactCurrentOwner = require('./ReactCurrentOwner');\nvar ReactDOMTextComponent = require('./ReactDOMTextComponent');\nvar ReactDefaultInjection = require('./ReactDefaultInjection');\nvar ReactInstanceHandles = require('./ReactInstanceHandles');\nvar ReactMount = require('./ReactMount');\nvar ReactPerf = require('./ReactPerf');\nvar ReactReconciler = require('./ReactReconciler');\nvar ReactUpdates = require('./ReactUpdates');\nvar ReactVersion = require('./ReactVersion');\n\nvar findDOMNode = require('./findDOMNode');\nvar renderSubtreeIntoContainer = require('./renderSubtreeIntoContainer');\nvar warning = require('fbjs/lib/warning');\n\nReactDefaultInjection.inject();\n\nvar render = ReactPerf.measure('React', 'render', ReactMount.render);\n\nvar React = {\n findDOMNode: findDOMNode,\n render: render,\n unmountComponentAtNode: ReactMount.unmountComponentAtNode,\n version: ReactVersion,\n\n /* eslint-disable camelcase */\n unstable_batchedUpdates: ReactUpdates.batchedUpdates,\n unstable_renderSubtreeIntoContainer: renderSubtreeIntoContainer\n};\n\n// Inject the runtime into a devtools global hook regardless of browser.\n// Allows for debugging when the hook is injected on the page.\n/* eslint-enable camelcase */\nif (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.inject === 'function') {\n __REACT_DEVTOOLS_GLOBAL_HOOK__.inject({\n CurrentOwner: ReactCurrentOwner,\n InstanceHandles: ReactInstanceHandles,\n Mount: ReactMount,\n Reconciler: ReactReconciler,\n TextComponent: ReactDOMTextComponent\n });\n}\n\nif (process.env.NODE_ENV !== 'production') {\n var ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');\n if (ExecutionEnvironment.canUseDOM && window.top === window.self) {\n\n // First check if devtools is not installed\n if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined') {\n // If we're in Chrome or Firefox, provide a download link if not installed.\n if (navigator.userAgent.indexOf('Chrome') > -1 && navigator.userAgent.indexOf('Edge') === -1 || navigator.userAgent.indexOf('Firefox') > -1) {\n console.debug('Download the React DevTools for a better development experience: ' + 'https://fb.me/react-devtools');\n }\n }\n\n // If we're in IE8, check to see if we are in compatibility mode and provide\n // information on preventing compatibility mode\n var ieCompatibilityMode = document.documentMode && document.documentMode < 8;\n\n process.env.NODE_ENV !== 'production' ? warning(!ieCompatibilityMode, 'Internet Explorer is running in compatibility mode; please add the ' + 'following tag to your HTML to prevent this from happening: ' + '<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />') : undefined;\n\n var expectedFeatures = [\n // shims\n Array.isArray, Array.prototype.every, Array.prototype.forEach, Array.prototype.indexOf, Array.prototype.map, Date.now, Function.prototype.bind, Object.keys, String.prototype.split, String.prototype.trim,\n\n // shams\n Object.create, Object.freeze];\n\n for (var i = 0; i < expectedFeatures.length; i++) {\n if (!expectedFeatures[i]) {\n console.error('One or more ES5 shim/shams expected by React are not available: ' + 'https://fb.me/react-warning-polyfills');\n break;\n }\n }\n }\n}\n\nmodule.exports = React;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactDOM.js\n ** module id = 2\n ** module chunks = 0 1\n **/","// shim for using process in browser\n\nvar process = module.exports = {};\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = setTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n clearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n setTimeout(drainQueue, 0);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** (webpack)/~/node-libs-browser/~/process/browser.js\n ** module id = 3\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactCurrentOwner\n */\n\n'use strict';\n\n/**\n * Keeps track of the current owner.\n *\n * The current owner is the component who should own any components that are\n * currently being constructed.\n */\nvar ReactCurrentOwner = {\n\n /**\n * @internal\n * @type {ReactComponent}\n */\n current: null\n\n};\n\nmodule.exports = ReactCurrentOwner;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactCurrentOwner.js\n ** module id = 4\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactDOMTextComponent\n * @typechecks static-only\n */\n\n'use strict';\n\nvar DOMChildrenOperations = require('./DOMChildrenOperations');\nvar DOMPropertyOperations = require('./DOMPropertyOperations');\nvar ReactComponentBrowserEnvironment = require('./ReactComponentBrowserEnvironment');\nvar ReactMount = require('./ReactMount');\n\nvar assign = require('./Object.assign');\nvar escapeTextContentForBrowser = require('./escapeTextContentForBrowser');\nvar setTextContent = require('./setTextContent');\nvar validateDOMNesting = require('./validateDOMNesting');\n\n/**\n * Text nodes violate a couple assumptions that React makes about components:\n *\n * - When mounting text into the DOM, adjacent text nodes are merged.\n * - Text nodes cannot be assigned a React root ID.\n *\n * This component is used to wrap strings in elements so that they can undergo\n * the same reconciliation that is applied to elements.\n *\n * TODO: Investigate representing React components in the DOM with text nodes.\n *\n * @class ReactDOMTextComponent\n * @extends ReactComponent\n * @internal\n */\nvar ReactDOMTextComponent = function (props) {\n // This constructor and its argument is currently used by mocks.\n};\n\nassign(ReactDOMTextComponent.prototype, {\n\n /**\n * @param {ReactText} text\n * @internal\n */\n construct: function (text) {\n // TODO: This is really a ReactText (ReactNode), not a ReactElement\n this._currentElement = text;\n this._stringText = '' + text;\n\n // Properties\n this._rootNodeID = null;\n this._mountIndex = 0;\n },\n\n /**\n * Creates the markup for this text node. This node is not intended to have\n * any features besides containing text content.\n *\n * @param {string} rootID DOM ID of the root node.\n * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction\n * @return {string} Markup for this text node.\n * @internal\n */\n mountComponent: function (rootID, transaction, context) {\n if (process.env.NODE_ENV !== 'production') {\n if (context[validateDOMNesting.ancestorInfoContextKey]) {\n validateDOMNesting('span', null, context[validateDOMNesting.ancestorInfoContextKey]);\n }\n }\n\n this._rootNodeID = rootID;\n if (transaction.useCreateElement) {\n var ownerDocument = context[ReactMount.ownerDocumentContextKey];\n var el = ownerDocument.createElement('span');\n DOMPropertyOperations.setAttributeForID(el, rootID);\n // Populate node cache\n ReactMount.getID(el);\n setTextContent(el, this._stringText);\n return el;\n } else {\n var escapedText = escapeTextContentForBrowser(this._stringText);\n\n if (transaction.renderToStaticMarkup) {\n // Normally we'd wrap this in a `span` for the reasons stated above, but\n // since this is a situation where React won't take over (static pages),\n // we can simply return the text as it is.\n return escapedText;\n }\n\n return '<span ' + DOMPropertyOperations.createMarkupForID(rootID) + '>' + escapedText + '</span>';\n }\n },\n\n /**\n * Updates this component by updating the text content.\n *\n * @param {ReactText} nextText The next text content\n * @param {ReactReconcileTransaction} transaction\n * @internal\n */\n receiveComponent: function (nextText, transaction) {\n if (nextText !== this._currentElement) {\n this._currentElement = nextText;\n var nextStringText = '' + nextText;\n if (nextStringText !== this._stringText) {\n // TODO: Save this as pending props and use performUpdateIfNecessary\n // and/or updateComponent to do the actual update for consistency with\n // other component types?\n this._stringText = nextStringText;\n var node = ReactMount.getNode(this._rootNodeID);\n DOMChildrenOperations.updateTextContent(node, nextStringText);\n }\n }\n },\n\n unmountComponent: function () {\n ReactComponentBrowserEnvironment.unmountIDFromEnvironment(this._rootNodeID);\n }\n\n});\n\nmodule.exports = ReactDOMTextComponent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactDOMTextComponent.js\n ** module id = 5\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule DOMChildrenOperations\n * @typechecks static-only\n */\n\n'use strict';\n\nvar Danger = require('./Danger');\nvar ReactMultiChildUpdateTypes = require('./ReactMultiChildUpdateTypes');\nvar ReactPerf = require('./ReactPerf');\n\nvar setInnerHTML = require('./setInnerHTML');\nvar setTextContent = require('./setTextContent');\nvar invariant = require('fbjs/lib/invariant');\n\n/**\n * Inserts `childNode` as a child of `parentNode` at the `index`.\n *\n * @param {DOMElement} parentNode Parent node in which to insert.\n * @param {DOMElement} childNode Child node to insert.\n * @param {number} index Index at which to insert the child.\n * @internal\n */\nfunction insertChildAt(parentNode, childNode, index) {\n // By exploiting arrays returning `undefined` for an undefined index, we can\n // rely exclusively on `insertBefore(node, null)` instead of also using\n // `appendChild(node)`. However, using `undefined` is not allowed by all\n // browsers so we must replace it with `null`.\n\n // fix render order error in safari\n // IE8 will throw error when index out of list size.\n var beforeChild = index >= parentNode.childNodes.length ? null : parentNode.childNodes.item(index);\n\n parentNode.insertBefore(childNode, beforeChild);\n}\n\n/**\n * Operations for updating with DOM children.\n */\nvar DOMChildrenOperations = {\n\n dangerouslyReplaceNodeWithMarkup: Danger.dangerouslyReplaceNodeWithMarkup,\n\n updateTextContent: setTextContent,\n\n /**\n * Updates a component's children by processing a series of updates. The\n * update configurations are each expected to have a `parentNode` property.\n *\n * @param {array<object>} updates List of update configurations.\n * @param {array<string>} markupList List of markup strings.\n * @internal\n */\n processUpdates: function (updates, markupList) {\n var update;\n // Mapping from parent IDs to initial child orderings.\n var initialChildren = null;\n // List of children that will be moved or removed.\n var updatedChildren = null;\n\n for (var i = 0; i < updates.length; i++) {\n update = updates[i];\n if (update.type === ReactMultiChildUpdateTypes.MOVE_EXISTING || update.type === ReactMultiChildUpdateTypes.REMOVE_NODE) {\n var updatedIndex = update.fromIndex;\n var updatedChild = update.parentNode.childNodes[updatedIndex];\n var parentID = update.parentID;\n\n !updatedChild ? process.env.NODE_ENV !== 'production' ? invariant(false, 'processUpdates(): Unable to find child %s of element. This ' + 'probably means the DOM was unexpectedly mutated (e.g., by the ' + 'browser), usually due to forgetting a <tbody> when using tables, ' + 'nesting tags like <form>, <p>, or <a>, or using non-SVG elements ' + 'in an <svg> parent. Try inspecting the child nodes of the element ' + 'with React ID `%s`.', updatedIndex, parentID) : invariant(false) : undefined;\n\n initialChildren = initialChildren || {};\n initialChildren[parentID] = initialChildren[parentID] || [];\n initialChildren[parentID][updatedIndex] = updatedChild;\n\n updatedChildren = updatedChildren || [];\n updatedChildren.push(updatedChild);\n }\n }\n\n var renderedMarkup;\n // markupList is either a list of markup or just a list of elements\n if (markupList.length && typeof markupList[0] === 'string') {\n renderedMarkup = Danger.dangerouslyRenderMarkup(markupList);\n } else {\n renderedMarkup = markupList;\n }\n\n // Remove updated children first so that `toIndex` is consistent.\n if (updatedChildren) {\n for (var j = 0; j < updatedChildren.length; j++) {\n updatedChildren[j].parentNode.removeChild(updatedChildren[j]);\n }\n }\n\n for (var k = 0; k < updates.length; k++) {\n update = updates[k];\n switch (update.type) {\n case ReactMultiChildUpdateTypes.INSERT_MARKUP:\n insertChildAt(update.parentNode, renderedMarkup[update.markupIndex], update.toIndex);\n break;\n case ReactMultiChildUpdateTypes.MOVE_EXISTING:\n insertChildAt(update.parentNode, initialChildren[update.parentID][update.fromIndex], update.toIndex);\n break;\n case ReactMultiChildUpdateTypes.SET_MARKUP:\n setInnerHTML(update.parentNode, update.content);\n break;\n case ReactMultiChildUpdateTypes.TEXT_CONTENT:\n setTextContent(update.parentNode, update.content);\n break;\n case ReactMultiChildUpdateTypes.REMOVE_NODE:\n // Already removed by the for-loop above.\n break;\n }\n }\n }\n\n};\n\nReactPerf.measureMethods(DOMChildrenOperations, 'DOMChildrenOperations', {\n updateTextContent: 'updateTextContent'\n});\n\nmodule.exports = DOMChildrenOperations;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/DOMChildrenOperations.js\n ** module id = 6\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule Danger\n * @typechecks static-only\n */\n\n'use strict';\n\nvar ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');\n\nvar createNodesFromMarkup = require('fbjs/lib/createNodesFromMarkup');\nvar emptyFunction = require('fbjs/lib/emptyFunction');\nvar getMarkupWrap = require('fbjs/lib/getMarkupWrap');\nvar invariant = require('fbjs/lib/invariant');\n\nvar OPEN_TAG_NAME_EXP = /^(<[^ \\/>]+)/;\nvar RESULT_INDEX_ATTR = 'data-danger-index';\n\n/**\n * Extracts the `nodeName` from a string of markup.\n *\n * NOTE: Extracting the `nodeName` does not require a regular expression match\n * because we make assumptions about React-generated markup (i.e. there are no\n * spaces surrounding the opening tag and there is at least one attribute).\n *\n * @param {string} markup String of markup.\n * @return {string} Node name of the supplied markup.\n * @see http://jsperf.com/extract-nodename\n */\nfunction getNodeName(markup) {\n return markup.substring(1, markup.indexOf(' '));\n}\n\nvar Danger = {\n\n /**\n * Renders markup into an array of nodes. The markup is expected to render\n * into a list of root nodes. Also, the length of `resultList` and\n * `markupList` should be the same.\n *\n * @param {array<string>} markupList List of markup strings to render.\n * @return {array<DOMElement>} List of rendered nodes.\n * @internal\n */\n dangerouslyRenderMarkup: function (markupList) {\n !ExecutionEnvironment.canUseDOM ? process.env.NODE_ENV !== 'production' ? invariant(false, 'dangerouslyRenderMarkup(...): Cannot render markup in a worker ' + 'thread. Make sure `window` and `document` are available globally ' + 'before requiring React when unit testing or use ' + 'ReactDOMServer.renderToString for server rendering.') : invariant(false) : undefined;\n var nodeName;\n var markupByNodeName = {};\n // Group markup by `nodeName` if a wrap is necessary, else by '*'.\n for (var i = 0; i < markupList.length; i++) {\n !markupList[i] ? process.env.NODE_ENV !== 'production' ? invariant(false, 'dangerouslyRenderMarkup(...): Missing markup.') : invariant(false) : undefined;\n nodeName = getNodeName(markupList[i]);\n nodeName = getMarkupWrap(nodeName) ? nodeName : '*';\n markupByNodeName[nodeName] = markupByNodeName[nodeName] || [];\n markupByNodeName[nodeName][i] = markupList[i];\n }\n var resultList = [];\n var resultListAssignmentCount = 0;\n for (nodeName in markupByNodeName) {\n if (!markupByNodeName.hasOwnProperty(nodeName)) {\n continue;\n }\n var markupListByNodeName = markupByNodeName[nodeName];\n\n // This for-in loop skips the holes of the sparse array. The order of\n // iteration should follow the order of assignment, which happens to match\n // numerical index order, but we don't rely on that.\n var resultIndex;\n for (resultIndex in markupListByNodeName) {\n if (markupListByNodeName.hasOwnProperty(resultIndex)) {\n var markup = markupListByNodeName[resultIndex];\n\n // Push the requested markup with an additional RESULT_INDEX_ATTR\n // attribute. If the markup does not start with a < character, it\n // will be discarded below (with an appropriate console.error).\n markupListByNodeName[resultIndex] = markup.replace(OPEN_TAG_NAME_EXP,\n // This index will be parsed back out below.\n '$1 ' + RESULT_INDEX_ATTR + '=\"' + resultIndex + '\" ');\n }\n }\n\n // Render each group of markup with similar wrapping `nodeName`.\n var renderNodes = createNodesFromMarkup(markupListByNodeName.join(''), emptyFunction // Do nothing special with <script> tags.\n );\n\n for (var j = 0; j < renderNodes.length; ++j) {\n var renderNode = renderNodes[j];\n if (renderNode.hasAttribute && renderNode.hasAttribute(RESULT_INDEX_ATTR)) {\n\n resultIndex = +renderNode.getAttribute(RESULT_INDEX_ATTR);\n renderNode.removeAttribute(RESULT_INDEX_ATTR);\n\n !!resultList.hasOwnProperty(resultIndex) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Danger: Assigning to an already-occupied result index.') : invariant(false) : undefined;\n\n resultList[resultIndex] = renderNode;\n\n // This should match resultList.length and markupList.length when\n // we're done.\n resultListAssignmentCount += 1;\n } else if (process.env.NODE_ENV !== 'production') {\n console.error('Danger: Discarding unexpected node:', renderNode);\n }\n }\n }\n\n // Although resultList was populated out of order, it should now be a dense\n // array.\n !(resultListAssignmentCount === resultList.length) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Danger: Did not assign to every index of resultList.') : invariant(false) : undefined;\n\n !(resultList.length === markupList.length) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Danger: Expected markup to render %s nodes, but rendered %s.', markupList.length, resultList.length) : invariant(false) : undefined;\n\n return resultList;\n },\n\n /**\n * Replaces a node with a string of markup at its current position within its\n * parent. The markup must render into a single root node.\n *\n * @param {DOMElement} oldChild Child node to replace.\n * @param {string} markup Markup to render in place of the child node.\n * @internal\n */\n dangerouslyReplaceNodeWithMarkup: function (oldChild, markup) {\n !ExecutionEnvironment.canUseDOM ? process.env.NODE_ENV !== 'production' ? invariant(false, 'dangerouslyReplaceNodeWithMarkup(...): Cannot render markup in a ' + 'worker thread. Make sure `window` and `document` are available ' + 'globally before requiring React when unit testing or use ' + 'ReactDOMServer.renderToString() for server rendering.') : invariant(false) : undefined;\n !markup ? process.env.NODE_ENV !== 'production' ? invariant(false, 'dangerouslyReplaceNodeWithMarkup(...): Missing markup.') : invariant(false) : undefined;\n !(oldChild.tagName.toLowerCase() !== 'html') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'dangerouslyReplaceNodeWithMarkup(...): Cannot replace markup of the ' + '<html> node. This is because browser quirks make this unreliable ' + 'and/or slow. If you want to render to the root you must use ' + 'server rendering. See ReactDOMServer.renderToString().') : invariant(false) : undefined;\n\n var newChild;\n if (typeof markup === 'string') {\n newChild = createNodesFromMarkup(markup, emptyFunction)[0];\n } else {\n newChild = markup;\n }\n oldChild.parentNode.replaceChild(newChild, oldChild);\n }\n\n};\n\nmodule.exports = Danger;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/Danger.js\n ** module id = 7\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ExecutionEnvironment\n */\n\n'use strict';\n\nvar canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);\n\n/**\n * Simple, lightweight module assisting with the detection and context of\n * Worker. Helps avoid circular dependencies and allows code to reason about\n * whether or not they are in a Worker, even if they never include the main\n * `ReactWorker` dependency.\n */\nvar ExecutionEnvironment = {\n\n canUseDOM: canUseDOM,\n\n canUseWorkers: typeof Worker !== 'undefined',\n\n canUseEventListeners: canUseDOM && !!(window.addEventListener || window.attachEvent),\n\n canUseViewport: canUseDOM && !!window.screen,\n\n isInWorker: !canUseDOM // For now, this is true - might change in the future.\n\n};\n\nmodule.exports = ExecutionEnvironment;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/ExecutionEnvironment.js\n ** module id = 8\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule createNodesFromMarkup\n * @typechecks\n */\n\n/*eslint-disable fb-www/unsafe-html*/\n\n'use strict';\n\nvar ExecutionEnvironment = require('./ExecutionEnvironment');\n\nvar createArrayFromMixed = require('./createArrayFromMixed');\nvar getMarkupWrap = require('./getMarkupWrap');\nvar invariant = require('./invariant');\n\n/**\n * Dummy container used to render all markup.\n */\nvar dummyNode = ExecutionEnvironment.canUseDOM ? document.createElement('div') : null;\n\n/**\n * Pattern used by `getNodeName`.\n */\nvar nodeNamePattern = /^\\s*<(\\w+)/;\n\n/**\n * Extracts the `nodeName` of the first element in a string of markup.\n *\n * @param {string} markup String of markup.\n * @return {?string} Node name of the supplied markup.\n */\nfunction getNodeName(markup) {\n var nodeNameMatch = markup.match(nodeNamePattern);\n return nodeNameMatch && nodeNameMatch[1].toLowerCase();\n}\n\n/**\n * Creates an array containing the nodes rendered from the supplied markup. The\n * optionally supplied `handleScript` function will be invoked once for each\n * <script> element that is rendered. If no `handleScript` function is supplied,\n * an exception is thrown if any <script> elements are rendered.\n *\n * @param {string} markup A string of valid HTML markup.\n * @param {?function} handleScript Invoked once for each rendered <script>.\n * @return {array<DOMElement|DOMTextNode>} An array of rendered nodes.\n */\nfunction createNodesFromMarkup(markup, handleScript) {\n var node = dummyNode;\n !!!dummyNode ? process.env.NODE_ENV !== 'production' ? invariant(false, 'createNodesFromMarkup dummy not initialized') : invariant(false) : undefined;\n var nodeName = getNodeName(markup);\n\n var wrap = nodeName && getMarkupWrap(nodeName);\n if (wrap) {\n node.innerHTML = wrap[1] + markup + wrap[2];\n\n var wrapDepth = wrap[0];\n while (wrapDepth--) {\n node = node.lastChild;\n }\n } else {\n node.innerHTML = markup;\n }\n\n var scripts = node.getElementsByTagName('script');\n if (scripts.length) {\n !handleScript ? process.env.NODE_ENV !== 'production' ? invariant(false, 'createNodesFromMarkup(...): Unexpected <script> element rendered.') : invariant(false) : undefined;\n createArrayFromMixed(scripts).forEach(handleScript);\n }\n\n var nodes = createArrayFromMixed(node.childNodes);\n while (node.lastChild) {\n node.removeChild(node.lastChild);\n }\n return nodes;\n}\n\nmodule.exports = createNodesFromMarkup;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/createNodesFromMarkup.js\n ** module id = 9\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule createArrayFromMixed\n * @typechecks\n */\n\n'use strict';\n\nvar toArray = require('./toArray');\n\n/**\n * Perform a heuristic test to determine if an object is \"array-like\".\n *\n * A monk asked Joshu, a Zen master, \"Has a dog Buddha nature?\"\n * Joshu replied: \"Mu.\"\n *\n * This function determines if its argument has \"array nature\": it returns\n * true if the argument is an actual array, an `arguments' object, or an\n * HTMLCollection (e.g. node.childNodes or node.getElementsByTagName()).\n *\n * It will return false for other array-like objects like Filelist.\n *\n * @param {*} obj\n * @return {boolean}\n */\nfunction hasArrayNature(obj) {\n return(\n // not null/false\n !!obj && (\n // arrays are objects, NodeLists are functions in Safari\n typeof obj == 'object' || typeof obj == 'function') &&\n // quacks like an array\n 'length' in obj &&\n // not window\n !('setInterval' in obj) &&\n // no DOM node should be considered an array-like\n // a 'select' element has 'length' and 'item' properties on IE8\n typeof obj.nodeType != 'number' && (\n // a real array\n Array.isArray(obj) ||\n // arguments\n 'callee' in obj ||\n // HTMLCollection/NodeList\n 'item' in obj)\n );\n}\n\n/**\n * Ensure that the argument is an array by wrapping it in an array if it is not.\n * Creates a copy of the argument if it is already an array.\n *\n * This is mostly useful idiomatically:\n *\n * var createArrayFromMixed = require('createArrayFromMixed');\n *\n * function takesOneOrMoreThings(things) {\n * things = createArrayFromMixed(things);\n * ...\n * }\n *\n * This allows you to treat `things' as an array, but accept scalars in the API.\n *\n * If you need to convert an array-like object, like `arguments`, into an array\n * use toArray instead.\n *\n * @param {*} obj\n * @return {array}\n */\nfunction createArrayFromMixed(obj) {\n if (!hasArrayNature(obj)) {\n return [obj];\n } else if (Array.isArray(obj)) {\n return obj.slice();\n } else {\n return toArray(obj);\n }\n}\n\nmodule.exports = createArrayFromMixed;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/createArrayFromMixed.js\n ** module id = 10\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule toArray\n * @typechecks\n */\n\n'use strict';\n\nvar invariant = require('./invariant');\n\n/**\n * Convert array-like objects to arrays.\n *\n * This API assumes the caller knows the contents of the data type. For less\n * well defined inputs use createArrayFromMixed.\n *\n * @param {object|function|filelist} obj\n * @return {array}\n */\nfunction toArray(obj) {\n var length = obj.length;\n\n // Some browse builtin objects can report typeof 'function' (e.g. NodeList in\n // old versions of Safari).\n !(!Array.isArray(obj) && (typeof obj === 'object' || typeof obj === 'function')) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'toArray: Array-like object expected') : invariant(false) : undefined;\n\n !(typeof length === 'number') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'toArray: Object needs a length property') : invariant(false) : undefined;\n\n !(length === 0 || length - 1 in obj) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'toArray: Object should have keys for indices') : invariant(false) : undefined;\n\n // Old IE doesn't give collections access to hasOwnProperty. Assume inputs\n // without method will throw during the slice call and skip straight to the\n // fallback.\n if (obj.hasOwnProperty) {\n try {\n return Array.prototype.slice.call(obj);\n } catch (e) {\n // IE < 9 does not support Array#slice on collections objects\n }\n }\n\n // Fall back to copying key by key. This assumes all keys have a value,\n // so will not preserve sparsely populated inputs.\n var ret = Array(length);\n for (var ii = 0; ii < length; ii++) {\n ret[ii] = obj[ii];\n }\n return ret;\n}\n\nmodule.exports = toArray;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/toArray.js\n ** module id = 11\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule invariant\n */\n\n'use strict';\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar invariant = function (condition, format, a, b, c, d, e, f) {\n if (process.env.NODE_ENV !== 'production') {\n if (format === undefined) {\n throw new Error('invariant requires an error message argument');\n }\n }\n\n if (!condition) {\n var error;\n if (format === undefined) {\n error = new Error('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.');\n } else {\n var args = [a, b, c, d, e, f];\n var argIndex = 0;\n error = new Error('Invariant Violation: ' + format.replace(/%s/g, function () {\n return args[argIndex++];\n }));\n }\n\n error.framesToPop = 1; // we don't care about invariant's own frame\n throw error;\n }\n};\n\nmodule.exports = invariant;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/invariant.js\n ** module id = 12\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule getMarkupWrap\n */\n\n/*eslint-disable fb-www/unsafe-html */\n\n'use strict';\n\nvar ExecutionEnvironment = require('./ExecutionEnvironment');\n\nvar invariant = require('./invariant');\n\n/**\n * Dummy container used to detect which wraps are necessary.\n */\nvar dummyNode = ExecutionEnvironment.canUseDOM ? document.createElement('div') : null;\n\n/**\n * Some browsers cannot use `innerHTML` to render certain elements standalone,\n * so we wrap them, render the wrapped nodes, then extract the desired node.\n *\n * In IE8, certain elements cannot render alone, so wrap all elements ('*').\n */\n\nvar shouldWrap = {};\n\nvar selectWrap = [1, '<select multiple=\"true\">', '</select>'];\nvar tableWrap = [1, '<table>', '</table>'];\nvar trWrap = [3, '<table><tbody><tr>', '</tr></tbody></table>'];\n\nvar svgWrap = [1, '<svg xmlns=\"http://www.w3.org/2000/svg\">', '</svg>'];\n\nvar markupWrap = {\n '*': [1, '?<div>', '</div>'],\n\n 'area': [1, '<map>', '</map>'],\n 'col': [2, '<table><tbody></tbody><colgroup>', '</colgroup></table>'],\n 'legend': [1, '<fieldset>', '</fieldset>'],\n 'param': [1, '<object>', '</object>'],\n 'tr': [2, '<table><tbody>', '</tbody></table>'],\n\n 'optgroup': selectWrap,\n 'option': selectWrap,\n\n 'caption': tableWrap,\n 'colgroup': tableWrap,\n 'tbody': tableWrap,\n 'tfoot': tableWrap,\n 'thead': tableWrap,\n\n 'td': trWrap,\n 'th': trWrap\n};\n\n// Initialize the SVG elements since we know they'll always need to be wrapped\n// consistently. If they are created inside a <div> they will be initialized in\n// the wrong namespace (and will not display).\nvar svgElements = ['circle', 'clipPath', 'defs', 'ellipse', 'g', 'image', 'line', 'linearGradient', 'mask', 'path', 'pattern', 'polygon', 'polyline', 'radialGradient', 'rect', 'stop', 'text', 'tspan'];\nsvgElements.forEach(function (nodeName) {\n markupWrap[nodeName] = svgWrap;\n shouldWrap[nodeName] = true;\n});\n\n/**\n * Gets the markup wrap configuration for the supplied `nodeName`.\n *\n * NOTE: This lazily detects which wraps are necessary for the current browser.\n *\n * @param {string} nodeName Lowercase `nodeName`.\n * @return {?array} Markup wrap configuration, if applicable.\n */\nfunction getMarkupWrap(nodeName) {\n !!!dummyNode ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Markup wrapping node not initialized') : invariant(false) : undefined;\n if (!markupWrap.hasOwnProperty(nodeName)) {\n nodeName = '*';\n }\n if (!shouldWrap.hasOwnProperty(nodeName)) {\n if (nodeName === '*') {\n dummyNode.innerHTML = '<link />';\n } else {\n dummyNode.innerHTML = '<' + nodeName + '></' + nodeName + '>';\n }\n shouldWrap[nodeName] = !dummyNode.firstChild;\n }\n return shouldWrap[nodeName] ? markupWrap[nodeName] : null;\n}\n\nmodule.exports = getMarkupWrap;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/getMarkupWrap.js\n ** module id = 13\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule emptyFunction\n */\n\n\"use strict\";\n\nfunction makeEmptyFunction(arg) {\n return function () {\n return arg;\n };\n}\n\n/**\n * This function accepts and discards inputs; it has no side effects. This is\n * primarily useful idiomatically for overridable function endpoints which\n * always need to be callable, since JS lacks a null-call idiom ala Cocoa.\n */\nfunction emptyFunction() {}\n\nemptyFunction.thatReturns = makeEmptyFunction;\nemptyFunction.thatReturnsFalse = makeEmptyFunction(false);\nemptyFunction.thatReturnsTrue = makeEmptyFunction(true);\nemptyFunction.thatReturnsNull = makeEmptyFunction(null);\nemptyFunction.thatReturnsThis = function () {\n return this;\n};\nemptyFunction.thatReturnsArgument = function (arg) {\n return arg;\n};\n\nmodule.exports = emptyFunction;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/emptyFunction.js\n ** module id = 14\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactMultiChildUpdateTypes\n */\n\n'use strict';\n\nvar keyMirror = require('fbjs/lib/keyMirror');\n\n/**\n * When a component's children are updated, a series of update configuration\n * objects are created in order to batch and serialize the required changes.\n *\n * Enumerates all the possible types of update configurations.\n *\n * @internal\n */\nvar ReactMultiChildUpdateTypes = keyMirror({\n INSERT_MARKUP: null,\n MOVE_EXISTING: null,\n REMOVE_NODE: null,\n SET_MARKUP: null,\n TEXT_CONTENT: null\n});\n\nmodule.exports = ReactMultiChildUpdateTypes;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactMultiChildUpdateTypes.js\n ** module id = 15\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule keyMirror\n * @typechecks static-only\n */\n\n'use strict';\n\nvar invariant = require('./invariant');\n\n/**\n * Constructs an enumeration with keys equal to their value.\n *\n * For example:\n *\n * var COLORS = keyMirror({blue: null, red: null});\n * var myColor = COLORS.blue;\n * var isColorValid = !!COLORS[myColor];\n *\n * The last line could not be performed if the values of the generated enum were\n * not equal to their keys.\n *\n * Input: {key1: val1, key2: val2}\n * Output: {key1: key1, key2: key2}\n *\n * @param {object} obj\n * @return {object}\n */\nvar keyMirror = function (obj) {\n var ret = {};\n var key;\n !(obj instanceof Object && !Array.isArray(obj)) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'keyMirror(...): Argument must be an object.') : invariant(false) : undefined;\n for (key in obj) {\n if (!obj.hasOwnProperty(key)) {\n continue;\n }\n ret[key] = key;\n }\n return ret;\n};\n\nmodule.exports = keyMirror;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/keyMirror.js\n ** module id = 16\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactPerf\n * @typechecks static-only\n */\n\n'use strict';\n\n/**\n * ReactPerf is a general AOP system designed to measure performance. This\n * module only has the hooks: see ReactDefaultPerf for the analysis tool.\n */\nvar ReactPerf = {\n /**\n * Boolean to enable/disable measurement. Set to false by default to prevent\n * accidental logging and perf loss.\n */\n enableMeasure: false,\n\n /**\n * Holds onto the measure function in use. By default, don't measure\n * anything, but we'll override this if we inject a measure function.\n */\n storedMeasure: _noMeasure,\n\n /**\n * @param {object} object\n * @param {string} objectName\n * @param {object<string>} methodNames\n */\n measureMethods: function (object, objectName, methodNames) {\n if (process.env.NODE_ENV !== 'production') {\n for (var key in methodNames) {\n if (!methodNames.hasOwnProperty(key)) {\n continue;\n }\n object[key] = ReactPerf.measure(objectName, methodNames[key], object[key]);\n }\n }\n },\n\n /**\n * Use this to wrap methods you want to measure. Zero overhead in production.\n *\n * @param {string} objName\n * @param {string} fnName\n * @param {function} func\n * @return {function}\n */\n measure: function (objName, fnName, func) {\n if (process.env.NODE_ENV !== 'production') {\n var measuredFunc = null;\n var wrapper = function () {\n if (ReactPerf.enableMeasure) {\n if (!measuredFunc) {\n measuredFunc = ReactPerf.storedMeasure(objName, fnName, func);\n }\n return measuredFunc.apply(this, arguments);\n }\n return func.apply(this, arguments);\n };\n wrapper.displayName = objName + '_' + fnName;\n return wrapper;\n }\n return func;\n },\n\n injection: {\n /**\n * @param {function} measure\n */\n injectMeasure: function (measure) {\n ReactPerf.storedMeasure = measure;\n }\n }\n};\n\n/**\n * Simply passes through the measured function, without measuring it.\n *\n * @param {string} objName\n * @param {string} fnName\n * @param {function} func\n * @return {function}\n */\nfunction _noMeasure(objName, fnName, func) {\n return func;\n}\n\nmodule.exports = ReactPerf;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactPerf.js\n ** module id = 17\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule setInnerHTML\n */\n\n/* globals MSApp */\n\n'use strict';\n\nvar ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');\n\nvar WHITESPACE_TEST = /^[ \\r\\n\\t\\f]/;\nvar NONVISIBLE_TEST = /<(!--|link|noscript|meta|script|style)[ \\r\\n\\t\\f\\/>]/;\n\n/**\n * Set the innerHTML property of a node, ensuring that whitespace is preserved\n * even in IE8.\n *\n * @param {DOMElement} node\n * @param {string} html\n * @internal\n */\nvar setInnerHTML = function (node, html) {\n node.innerHTML = html;\n};\n\n// Win8 apps: Allow all html to be inserted\nif (typeof MSApp !== 'undefined' && MSApp.execUnsafeLocalFunction) {\n setInnerHTML = function (node, html) {\n MSApp.execUnsafeLocalFunction(function () {\n node.innerHTML = html;\n });\n };\n}\n\nif (ExecutionEnvironment.canUseDOM) {\n // IE8: When updating a just created node with innerHTML only leading\n // whitespace is removed. When updating an existing node with innerHTML\n // whitespace in root TextNodes is also collapsed.\n // @see quirksmode.org/bugreports/archives/2004/11/innerhtml_and_t.html\n\n // Feature detection; only IE8 is known to behave improperly like this.\n var testElement = document.createElement('div');\n testElement.innerHTML = ' ';\n if (testElement.innerHTML === '') {\n setInnerHTML = function (node, html) {\n // Magic theory: IE8 supposedly differentiates between added and updated\n // nodes when processing innerHTML, innerHTML on updated nodes suffers\n // from worse whitespace behavior. Re-adding a node like this triggers\n // the initial and more favorable whitespace behavior.\n // TODO: What to do on a detached node?\n if (node.parentNode) {\n node.parentNode.replaceChild(node, node);\n }\n\n // We also implement a workaround for non-visible tags disappearing into\n // thin air on IE8, this only happens if there is no visible text\n // in-front of the non-visible tags. Piggyback on the whitespace fix\n // and simply check if any non-visible tags appear in the source.\n if (WHITESPACE_TEST.test(html) || html[0] === '<' && NONVISIBLE_TEST.test(html)) {\n // Recover leading whitespace by temporarily prepending any character.\n // \\uFEFF has the potential advantage of being zero-width/invisible.\n // UglifyJS drops U+FEFF chars when parsing, so use String.fromCharCode\n // in hopes that this is preserved even if \"\\uFEFF\" is transformed to\n // the actual Unicode character (by Babel, for example).\n // https://github.com/mishoo/UglifyJS2/blob/v2.4.20/lib/parse.js#L216\n node.innerHTML = String.fromCharCode(0xFEFF) + html;\n\n // deleteData leaves an empty `TextNode` which offsets the index of all\n // children. Definitely want to avoid this.\n var textNode = node.firstChild;\n if (textNode.data.length === 1) {\n node.removeChild(textNode);\n } else {\n textNode.deleteData(0, 1);\n }\n } else {\n node.innerHTML = html;\n }\n };\n }\n}\n\nmodule.exports = setInnerHTML;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/setInnerHTML.js\n ** module id = 18\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule setTextContent\n */\n\n'use strict';\n\nvar ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');\nvar escapeTextContentForBrowser = require('./escapeTextContentForBrowser');\nvar setInnerHTML = require('./setInnerHTML');\n\n/**\n * Set the textContent property of a node, ensuring that whitespace is preserved\n * even in IE8. innerText is a poor substitute for textContent and, among many\n * issues, inserts <br> instead of the literal newline chars. innerHTML behaves\n * as it should.\n *\n * @param {DOMElement} node\n * @param {string} text\n * @internal\n */\nvar setTextContent = function (node, text) {\n node.textContent = text;\n};\n\nif (ExecutionEnvironment.canUseDOM) {\n if (!('textContent' in document.documentElement)) {\n setTextContent = function (node, text) {\n setInnerHTML(node, escapeTextContentForBrowser(text));\n };\n }\n}\n\nmodule.exports = setTextContent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/setTextContent.js\n ** module id = 19\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule escapeTextContentForBrowser\n */\n\n'use strict';\n\nvar ESCAPE_LOOKUP = {\n '&': '&',\n '>': '>',\n '<': '<',\n '\"': '"',\n '\\'': '''\n};\n\nvar ESCAPE_REGEX = /[&><\"']/g;\n\nfunction escaper(match) {\n return ESCAPE_LOOKUP[match];\n}\n\n/**\n * Escapes text to prevent scripting attacks.\n *\n * @param {*} text Text value to escape.\n * @return {string} An escaped string.\n */\nfunction escapeTextContentForBrowser(text) {\n return ('' + text).replace(ESCAPE_REGEX, escaper);\n}\n\nmodule.exports = escapeTextContentForBrowser;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/escapeTextContentForBrowser.js\n ** module id = 20\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule DOMPropertyOperations\n * @typechecks static-only\n */\n\n'use strict';\n\nvar DOMProperty = require('./DOMProperty');\nvar ReactPerf = require('./ReactPerf');\n\nvar quoteAttributeValueForBrowser = require('./quoteAttributeValueForBrowser');\nvar warning = require('fbjs/lib/warning');\n\n// Simplified subset\nvar VALID_ATTRIBUTE_NAME_REGEX = /^[a-zA-Z_][\\w\\.\\-]*$/;\nvar illegalAttributeNameCache = {};\nvar validatedAttributeNameCache = {};\n\nfunction isAttributeNameSafe(attributeName) {\n if (validatedAttributeNameCache.hasOwnProperty(attributeName)) {\n return true;\n }\n if (illegalAttributeNameCache.hasOwnProperty(attributeName)) {\n return false;\n }\n if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) {\n validatedAttributeNameCache[attributeName] = true;\n return true;\n }\n illegalAttributeNameCache[attributeName] = true;\n process.env.NODE_ENV !== 'production' ? warning(false, 'Invalid attribute name: `%s`', attributeName) : undefined;\n return false;\n}\n\nfunction shouldIgnoreValue(propertyInfo, value) {\n return value == null || propertyInfo.hasBooleanValue && !value || propertyInfo.hasNumericValue && isNaN(value) || propertyInfo.hasPositiveNumericValue && value < 1 || propertyInfo.hasOverloadedBooleanValue && value === false;\n}\n\nif (process.env.NODE_ENV !== 'production') {\n var reactProps = {\n children: true,\n dangerouslySetInnerHTML: true,\n key: true,\n ref: true\n };\n var warnedProperties = {};\n\n var warnUnknownProperty = function (name) {\n if (reactProps.hasOwnProperty(name) && reactProps[name] || warnedProperties.hasOwnProperty(name) && warnedProperties[name]) {\n return;\n }\n\n warnedProperties[name] = true;\n var lowerCasedName = name.toLowerCase();\n\n // data-* attributes should be lowercase; suggest the lowercase version\n var standardName = DOMProperty.isCustomAttribute(lowerCasedName) ? lowerCasedName : DOMProperty.getPossibleStandardName.hasOwnProperty(lowerCasedName) ? DOMProperty.getPossibleStandardName[lowerCasedName] : null;\n\n // For now, only warn when we have a suggested correction. This prevents\n // logging too much when using transferPropsTo.\n process.env.NODE_ENV !== 'production' ? warning(standardName == null, 'Unknown DOM property %s. Did you mean %s?', name, standardName) : undefined;\n };\n}\n\n/**\n * Operations for dealing with DOM properties.\n */\nvar DOMPropertyOperations = {\n\n /**\n * Creates markup for the ID property.\n *\n * @param {string} id Unescaped ID.\n * @return {string} Markup string.\n */\n createMarkupForID: function (id) {\n return DOMProperty.ID_ATTRIBUTE_NAME + '=' + quoteAttributeValueForBrowser(id);\n },\n\n setAttributeForID: function (node, id) {\n node.setAttribute(DOMProperty.ID_ATTRIBUTE_NAME, id);\n },\n\n /**\n * Creates markup for a property.\n *\n * @param {string} name\n * @param {*} value\n * @return {?string} Markup string, or null if the property was invalid.\n */\n createMarkupForProperty: function (name, value) {\n var propertyInfo = DOMProperty.properties.hasOwnProperty(name) ? DOMProperty.properties[name] : null;\n if (propertyInfo) {\n if (shouldIgnoreValue(propertyInfo, value)) {\n return '';\n }\n var attributeName = propertyInfo.attributeName;\n if (propertyInfo.hasBooleanValue || propertyInfo.hasOverloadedBooleanValue && value === true) {\n return attributeName + '=\"\"';\n }\n return attributeName + '=' + quoteAttributeValueForBrowser(value);\n } else if (DOMProperty.isCustomAttribute(name)) {\n if (value == null) {\n return '';\n }\n return name + '=' + quoteAttributeValueForBrowser(value);\n } else if (process.env.NODE_ENV !== 'production') {\n warnUnknownProperty(name);\n }\n return null;\n },\n\n /**\n * Creates markup for a custom property.\n *\n * @param {string} name\n * @param {*} value\n * @return {string} Markup string, or empty string if the property was invalid.\n */\n createMarkupForCustomAttribute: function (name, value) {\n if (!isAttributeNameSafe(name) || value == null) {\n return '';\n }\n return name + '=' + quoteAttributeValueForBrowser(value);\n },\n\n /**\n * Sets the value for a property on a node.\n *\n * @param {DOMElement} node\n * @param {string} name\n * @param {*} value\n */\n setValueForProperty: function (node, name, value) {\n var propertyInfo = DOMProperty.properties.hasOwnProperty(name) ? DOMProperty.properties[name] : null;\n if (propertyInfo) {\n var mutationMethod = propertyInfo.mutationMethod;\n if (mutationMethod) {\n mutationMethod(node, value);\n } else if (shouldIgnoreValue(propertyInfo, value)) {\n this.deleteValueForProperty(node, name);\n } else if (propertyInfo.mustUseAttribute) {\n var attributeName = propertyInfo.attributeName;\n var namespace = propertyInfo.attributeNamespace;\n // `setAttribute` with objects becomes only `[object]` in IE8/9,\n // ('' + value) makes it output the correct toString()-value.\n if (namespace) {\n node.setAttributeNS(namespace, attributeName, '' + value);\n } else if (propertyInfo.hasBooleanValue || propertyInfo.hasOverloadedBooleanValue && value === true) {\n node.setAttribute(attributeName, '');\n } else {\n node.setAttribute(attributeName, '' + value);\n }\n } else {\n var propName = propertyInfo.propertyName;\n // Must explicitly cast values for HAS_SIDE_EFFECTS-properties to the\n // property type before comparing; only `value` does and is string.\n if (!propertyInfo.hasSideEffects || '' + node[propName] !== '' + value) {\n // Contrary to `setAttribute`, object properties are properly\n // `toString`ed by IE8/9.\n node[propName] = value;\n }\n }\n } else if (DOMProperty.isCustomAttribute(name)) {\n DOMPropertyOperations.setValueForAttribute(node, name, value);\n } else if (process.env.NODE_ENV !== 'production') {\n warnUnknownProperty(name);\n }\n },\n\n setValueForAttribute: function (node, name, value) {\n if (!isAttributeNameSafe(name)) {\n return;\n }\n if (value == null) {\n node.removeAttribute(name);\n } else {\n node.setAttribute(name, '' + value);\n }\n },\n\n /**\n * Deletes the value for a property on a node.\n *\n * @param {DOMElement} node\n * @param {string} name\n */\n deleteValueForProperty: function (node, name) {\n var propertyInfo = DOMProperty.properties.hasOwnProperty(name) ? DOMProperty.properties[name] : null;\n if (propertyInfo) {\n var mutationMethod = propertyInfo.mutationMethod;\n if (mutationMethod) {\n mutationMethod(node, undefined);\n } else if (propertyInfo.mustUseAttribute) {\n node.removeAttribute(propertyInfo.attributeName);\n } else {\n var propName = propertyInfo.propertyName;\n var defaultValue = DOMProperty.getDefaultValueForProperty(node.nodeName, propName);\n if (!propertyInfo.hasSideEffects || '' + node[propName] !== defaultValue) {\n node[propName] = defaultValue;\n }\n }\n } else if (DOMProperty.isCustomAttribute(name)) {\n node.removeAttribute(name);\n } else if (process.env.NODE_ENV !== 'production') {\n warnUnknownProperty(name);\n }\n }\n\n};\n\nReactPerf.measureMethods(DOMPropertyOperations, 'DOMPropertyOperations', {\n setValueForProperty: 'setValueForProperty',\n setValueForAttribute: 'setValueForAttribute',\n deleteValueForProperty: 'deleteValueForProperty'\n});\n\nmodule.exports = DOMPropertyOperations;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/DOMPropertyOperations.js\n ** module id = 21\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule DOMProperty\n * @typechecks static-only\n */\n\n'use strict';\n\nvar invariant = require('fbjs/lib/invariant');\n\nfunction checkMask(value, bitmask) {\n return (value & bitmask) === bitmask;\n}\n\nvar DOMPropertyInjection = {\n /**\n * Mapping from normalized, camelcased property names to a configuration that\n * specifies how the associated DOM property should be accessed or rendered.\n */\n MUST_USE_ATTRIBUTE: 0x1,\n MUST_USE_PROPERTY: 0x2,\n HAS_SIDE_EFFECTS: 0x4,\n HAS_BOOLEAN_VALUE: 0x8,\n HAS_NUMERIC_VALUE: 0x10,\n HAS_POSITIVE_NUMERIC_VALUE: 0x20 | 0x10,\n HAS_OVERLOADED_BOOLEAN_VALUE: 0x40,\n\n /**\n * Inject some specialized knowledge about the DOM. This takes a config object\n * with the following properties:\n *\n * isCustomAttribute: function that given an attribute name will return true\n * if it can be inserted into the DOM verbatim. Useful for data-* or aria-*\n * attributes where it's impossible to enumerate all of the possible\n * attribute names,\n *\n * Properties: object mapping DOM property name to one of the\n * DOMPropertyInjection constants or null. If your attribute isn't in here,\n * it won't get written to the DOM.\n *\n * DOMAttributeNames: object mapping React attribute name to the DOM\n * attribute name. Attribute names not specified use the **lowercase**\n * normalized name.\n *\n * DOMAttributeNamespaces: object mapping React attribute name to the DOM\n * attribute namespace URL. (Attribute names not specified use no namespace.)\n *\n * DOMPropertyNames: similar to DOMAttributeNames but for DOM properties.\n * Property names not specified use the normalized name.\n *\n * DOMMutationMethods: Properties that require special mutation methods. If\n * `value` is undefined, the mutation method should unset the property.\n *\n * @param {object} domPropertyConfig the config as described above.\n */\n injectDOMPropertyConfig: function (domPropertyConfig) {\n var Injection = DOMPropertyInjection;\n var Properties = domPropertyConfig.Properties || {};\n var DOMAttributeNamespaces = domPropertyConfig.DOMAttributeNamespaces || {};\n var DOMAttributeNames = domPropertyConfig.DOMAttributeNames || {};\n var DOMPropertyNames = domPropertyConfig.DOMPropertyNames || {};\n var DOMMutationMethods = domPropertyConfig.DOMMutationMethods || {};\n\n if (domPropertyConfig.isCustomAttribute) {\n DOMProperty._isCustomAttributeFunctions.push(domPropertyConfig.isCustomAttribute);\n }\n\n for (var propName in Properties) {\n !!DOMProperty.properties.hasOwnProperty(propName) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'injectDOMPropertyConfig(...): You\\'re trying to inject DOM property ' + '\\'%s\\' which has already been injected. You may be accidentally ' + 'injecting the same DOM property config twice, or you may be ' + 'injecting two configs that have conflicting property names.', propName) : invariant(false) : undefined;\n\n var lowerCased = propName.toLowerCase();\n var propConfig = Properties[propName];\n\n var propertyInfo = {\n attributeName: lowerCased,\n attributeNamespace: null,\n propertyName: propName,\n mutationMethod: null,\n\n mustUseAttribute: checkMask(propConfig, Injection.MUST_USE_ATTRIBUTE),\n mustUseProperty: checkMask(propConfig, Injection.MUST_USE_PROPERTY),\n hasSideEffects: checkMask(propConfig, Injection.HAS_SIDE_EFFECTS),\n hasBooleanValue: checkMask(propConfig, Injection.HAS_BOOLEAN_VALUE),\n hasNumericValue: checkMask(propConfig, Injection.HAS_NUMERIC_VALUE),\n hasPositiveNumericValue: checkMask(propConfig, Injection.HAS_POSITIVE_NUMERIC_VALUE),\n hasOverloadedBooleanValue: checkMask(propConfig, Injection.HAS_OVERLOADED_BOOLEAN_VALUE)\n };\n\n !(!propertyInfo.mustUseAttribute || !propertyInfo.mustUseProperty) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'DOMProperty: Cannot require using both attribute and property: %s', propName) : invariant(false) : undefined;\n !(propertyInfo.mustUseProperty || !propertyInfo.hasSideEffects) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'DOMProperty: Properties that have side effects must use property: %s', propName) : invariant(false) : undefined;\n !(propertyInfo.hasBooleanValue + propertyInfo.hasNumericValue + propertyInfo.hasOverloadedBooleanValue <= 1) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'DOMProperty: Value can be one of boolean, overloaded boolean, or ' + 'numeric value, but not a combination: %s', propName) : invariant(false) : undefined;\n\n if (process.env.NODE_ENV !== 'production') {\n DOMProperty.getPossibleStandardName[lowerCased] = propName;\n }\n\n if (DOMAttributeNames.hasOwnProperty(propName)) {\n var attributeName = DOMAttributeNames[propName];\n propertyInfo.attributeName = attributeName;\n if (process.env.NODE_ENV !== 'production') {\n DOMProperty.getPossibleStandardName[attributeName] = propName;\n }\n }\n\n if (DOMAttributeNamespaces.hasOwnProperty(propName)) {\n propertyInfo.attributeNamespace = DOMAttributeNamespaces[propName];\n }\n\n if (DOMPropertyNames.hasOwnProperty(propName)) {\n propertyInfo.propertyName = DOMPropertyNames[propName];\n }\n\n if (DOMMutationMethods.hasOwnProperty(propName)) {\n propertyInfo.mutationMethod = DOMMutationMethods[propName];\n }\n\n DOMProperty.properties[propName] = propertyInfo;\n }\n }\n};\nvar defaultValueCache = {};\n\n/**\n * DOMProperty exports lookup objects that can be used like functions:\n *\n * > DOMProperty.isValid['id']\n * true\n * > DOMProperty.isValid['foobar']\n * undefined\n *\n * Although this may be confusing, it performs better in general.\n *\n * @see http://jsperf.com/key-exists\n * @see http://jsperf.com/key-missing\n */\nvar DOMProperty = {\n\n ID_ATTRIBUTE_NAME: 'data-reactid',\n\n /**\n * Map from property \"standard name\" to an object with info about how to set\n * the property in the DOM. Each object contains:\n *\n * attributeName:\n * Used when rendering markup or with `*Attribute()`.\n * attributeNamespace\n * propertyName:\n * Used on DOM node instances. (This includes properties that mutate due to\n * external factors.)\n * mutationMethod:\n * If non-null, used instead of the property or `setAttribute()` after\n * initial render.\n * mustUseAttribute:\n * Whether the property must be accessed and mutated using `*Attribute()`.\n * (This includes anything that fails `<propName> in <element>`.)\n * mustUseProperty:\n * Whether the property must be accessed and mutated as an object property.\n * hasSideEffects:\n * Whether or not setting a value causes side effects such as triggering\n * resources to be loaded or text selection changes. If true, we read from\n * the DOM before updating to ensure that the value is only set if it has\n * changed.\n * hasBooleanValue:\n * Whether the property should be removed when set to a falsey value.\n * hasNumericValue:\n * Whether the property must be numeric or parse as a numeric and should be\n * removed when set to a falsey value.\n * hasPositiveNumericValue:\n * Whether the property must be positive numeric or parse as a positive\n * numeric and should be removed when set to a falsey value.\n * hasOverloadedBooleanValue:\n * Whether the property can be used as a flag as well as with a value.\n * Removed when strictly equal to false; present without a value when\n * strictly equal to true; present with a value otherwise.\n */\n properties: {},\n\n /**\n * Mapping from lowercase property names to the properly cased version, used\n * to warn in the case of missing properties. Available only in __DEV__.\n * @type {Object}\n */\n getPossibleStandardName: process.env.NODE_ENV !== 'production' ? {} : null,\n\n /**\n * All of the isCustomAttribute() functions that have been injected.\n */\n _isCustomAttributeFunctions: [],\n\n /**\n * Checks whether a property name is a custom attribute.\n * @method\n */\n isCustomAttribute: function (attributeName) {\n for (var i = 0; i < DOMProperty._isCustomAttributeFunctions.length; i++) {\n var isCustomAttributeFn = DOMProperty._isCustomAttributeFunctions[i];\n if (isCustomAttributeFn(attributeName)) {\n return true;\n }\n }\n return false;\n },\n\n /**\n * Returns the default property value for a DOM property (i.e., not an\n * attribute). Most default values are '' or false, but not all. Worse yet,\n * some (in particular, `type`) vary depending on the type of element.\n *\n * TODO: Is it better to grab all the possible properties when creating an\n * element to avoid having to create the same element twice?\n */\n getDefaultValueForProperty: function (nodeName, prop) {\n var nodeDefaults = defaultValueCache[nodeName];\n var testElement;\n if (!nodeDefaults) {\n defaultValueCache[nodeName] = nodeDefaults = {};\n }\n if (!(prop in nodeDefaults)) {\n testElement = document.createElement(nodeName);\n nodeDefaults[prop] = testElement[prop];\n }\n return nodeDefaults[prop];\n },\n\n injection: DOMPropertyInjection\n};\n\nmodule.exports = DOMProperty;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/DOMProperty.js\n ** module id = 22\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule quoteAttributeValueForBrowser\n */\n\n'use strict';\n\nvar escapeTextContentForBrowser = require('./escapeTextContentForBrowser');\n\n/**\n * Escapes attribute value to prevent scripting attacks.\n *\n * @param {*} value Value to escape.\n * @return {string} An escaped string.\n */\nfunction quoteAttributeValueForBrowser(value) {\n return '\"' + escapeTextContentForBrowser(value) + '\"';\n}\n\nmodule.exports = quoteAttributeValueForBrowser;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/quoteAttributeValueForBrowser.js\n ** module id = 23\n ** module chunks = 0 1\n **/","/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule warning\n */\n\n'use strict';\n\nvar emptyFunction = require('./emptyFunction');\n\n/**\n * Similar to invariant but only logs a warning if the condition is not met.\n * This can be used to log issues in development environments in critical\n * paths. Removing the logging code for production environments will keep the\n * same logic and follow the same code paths.\n */\n\nvar warning = emptyFunction;\n\nif (process.env.NODE_ENV !== 'production') {\n warning = function (condition, format) {\n for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n\n if (format === undefined) {\n throw new Error('`warning(condition, format, ...args)` requires a warning ' + 'message argument');\n }\n\n if (format.indexOf('Failed Composite propType: ') === 0) {\n return; // Ignore CompositeComponent proptype check.\n }\n\n if (!condition) {\n var argIndex = 0;\n var message = 'Warning: ' + format.replace(/%s/g, function () {\n return args[argIndex++];\n });\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) {}\n }\n };\n}\n\nmodule.exports = warning;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/warning.js\n ** module id = 24\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactComponentBrowserEnvironment\n */\n\n'use strict';\n\nvar ReactDOMIDOperations = require('./ReactDOMIDOperations');\nvar ReactMount = require('./ReactMount');\n\n/**\n * Abstracts away all functionality of the reconciler that requires knowledge of\n * the browser context. TODO: These callers should be refactored to avoid the\n * need for this injection.\n */\nvar ReactComponentBrowserEnvironment = {\n\n processChildrenUpdates: ReactDOMIDOperations.dangerouslyProcessChildrenUpdates,\n\n replaceNodeWithMarkupByID: ReactDOMIDOperations.dangerouslyReplaceNodeWithMarkupByID,\n\n /**\n * If a particular environment requires that some resources be cleaned up,\n * specify this in the injected Mixin. In the DOM, we would likely want to\n * purge any cached node ID lookups.\n *\n * @private\n */\n unmountIDFromEnvironment: function (rootNodeID) {\n ReactMount.purgeID(rootNodeID);\n }\n\n};\n\nmodule.exports = ReactComponentBrowserEnvironment;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactComponentBrowserEnvironment.js\n ** module id = 25\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactDOMIDOperations\n * @typechecks static-only\n */\n\n'use strict';\n\nvar DOMChildrenOperations = require('./DOMChildrenOperations');\nvar DOMPropertyOperations = require('./DOMPropertyOperations');\nvar ReactMount = require('./ReactMount');\nvar ReactPerf = require('./ReactPerf');\n\nvar invariant = require('fbjs/lib/invariant');\n\n/**\n * Errors for properties that should not be updated with `updatePropertyByID()`.\n *\n * @type {object}\n * @private\n */\nvar INVALID_PROPERTY_ERRORS = {\n dangerouslySetInnerHTML: '`dangerouslySetInnerHTML` must be set using `updateInnerHTMLByID()`.',\n style: '`style` must be set using `updateStylesByID()`.'\n};\n\n/**\n * Operations used to process updates to DOM nodes.\n */\nvar ReactDOMIDOperations = {\n\n /**\n * Updates a DOM node with new property values. This should only be used to\n * update DOM properties in `DOMProperty`.\n *\n * @param {string} id ID of the node to update.\n * @param {string} name A valid property name, see `DOMProperty`.\n * @param {*} value New value of the property.\n * @internal\n */\n updatePropertyByID: function (id, name, value) {\n var node = ReactMount.getNode(id);\n !!INVALID_PROPERTY_ERRORS.hasOwnProperty(name) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'updatePropertyByID(...): %s', INVALID_PROPERTY_ERRORS[name]) : invariant(false) : undefined;\n\n // If we're updating to null or undefined, we should remove the property\n // from the DOM node instead of inadvertantly setting to a string. This\n // brings us in line with the same behavior we have on initial render.\n if (value != null) {\n DOMPropertyOperations.setValueForProperty(node, name, value);\n } else {\n DOMPropertyOperations.deleteValueForProperty(node, name);\n }\n },\n\n /**\n * Replaces a DOM node that exists in the document with markup.\n *\n * @param {string} id ID of child to be replaced.\n * @param {string} markup Dangerous markup to inject in place of child.\n * @internal\n * @see {Danger.dangerouslyReplaceNodeWithMarkup}\n */\n dangerouslyReplaceNodeWithMarkupByID: function (id, markup) {\n var node = ReactMount.getNode(id);\n DOMChildrenOperations.dangerouslyReplaceNodeWithMarkup(node, markup);\n },\n\n /**\n * Updates a component's children by processing a series of updates.\n *\n * @param {array<object>} updates List of update configurations.\n * @param {array<string>} markup List of markup strings.\n * @internal\n */\n dangerouslyProcessChildrenUpdates: function (updates, markup) {\n for (var i = 0; i < updates.length; i++) {\n updates[i].parentNode = ReactMount.getNode(updates[i].parentID);\n }\n DOMChildrenOperations.processUpdates(updates, markup);\n }\n};\n\nReactPerf.measureMethods(ReactDOMIDOperations, 'ReactDOMIDOperations', {\n dangerouslyReplaceNodeWithMarkupByID: 'dangerouslyReplaceNodeWithMarkupByID',\n dangerouslyProcessChildrenUpdates: 'dangerouslyProcessChildrenUpdates'\n});\n\nmodule.exports = ReactDOMIDOperations;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactDOMIDOperations.js\n ** module id = 26\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactMount\n */\n\n'use strict';\n\nvar DOMProperty = require('./DOMProperty');\nvar ReactBrowserEventEmitter = require('./ReactBrowserEventEmitter');\nvar ReactCurrentOwner = require('./ReactCurrentOwner');\nvar ReactDOMFeatureFlags = require('./ReactDOMFeatureFlags');\nvar ReactElement = require('./ReactElement');\nvar ReactEmptyComponentRegistry = require('./ReactEmptyComponentRegistry');\nvar ReactInstanceHandles = require('./ReactInstanceHandles');\nvar ReactInstanceMap = require('./ReactInstanceMap');\nvar ReactMarkupChecksum = require('./ReactMarkupChecksum');\nvar ReactPerf = require('./ReactPerf');\nvar ReactReconciler = require('./ReactReconciler');\nvar ReactUpdateQueue = require('./ReactUpdateQueue');\nvar ReactUpdates = require('./ReactUpdates');\n\nvar assign = require('./Object.assign');\nvar emptyObject = require('fbjs/lib/emptyObject');\nvar containsNode = require('fbjs/lib/containsNode');\nvar instantiateReactComponent = require('./instantiateReactComponent');\nvar invariant = require('fbjs/lib/invariant');\nvar setInnerHTML = require('./setInnerHTML');\nvar shouldUpdateReactComponent = require('./shouldUpdateReactComponent');\nvar validateDOMNesting = require('./validateDOMNesting');\nvar warning = require('fbjs/lib/warning');\n\nvar ATTR_NAME = DOMProperty.ID_ATTRIBUTE_NAME;\nvar nodeCache = {};\n\nvar ELEMENT_NODE_TYPE = 1;\nvar DOC_NODE_TYPE = 9;\nvar DOCUMENT_FRAGMENT_NODE_TYPE = 11;\n\nvar ownerDocumentContextKey = '__ReactMount_ownerDocument$' + Math.random().toString(36).slice(2);\n\n/** Mapping from reactRootID to React component instance. */\nvar instancesByReactRootID = {};\n\n/** Mapping from reactRootID to `container` nodes. */\nvar containersByReactRootID = {};\n\nif (process.env.NODE_ENV !== 'production') {\n /** __DEV__-only mapping from reactRootID to root elements. */\n var rootElementsByReactRootID = {};\n}\n\n// Used to store breadth-first search state in findComponentRoot.\nvar findComponentRootReusableArray = [];\n\n/**\n * Finds the index of the first character\n * that's not common between the two given strings.\n *\n * @return {number} the index of the character where the strings diverge\n */\nfunction firstDifferenceIndex(string1, string2) {\n var minLen = Math.min(string1.length, string2.length);\n for (var i = 0; i < minLen; i++) {\n if (string1.charAt(i) !== string2.charAt(i)) {\n return i;\n }\n }\n return string1.length === string2.length ? -1 : minLen;\n}\n\n/**\n * @param {DOMElement|DOMDocument} container DOM element that may contain\n * a React component\n * @return {?*} DOM element that may have the reactRoot ID, or null.\n */\nfunction getReactRootElementInContainer(container) {\n if (!container) {\n return null;\n }\n\n if (container.nodeType === DOC_NODE_TYPE) {\n return container.documentElement;\n } else {\n return container.firstChild;\n }\n}\n\n/**\n * @param {DOMElement} container DOM element that may contain a React component.\n * @return {?string} A \"reactRoot\" ID, if a React component is rendered.\n */\nfunction getReactRootID(container) {\n var rootElement = getReactRootElementInContainer(container);\n return rootElement && ReactMount.getID(rootElement);\n}\n\n/**\n * Accessing node[ATTR_NAME] or calling getAttribute(ATTR_NAME) on a form\n * element can return its control whose name or ID equals ATTR_NAME. All\n * DOM nodes support `getAttributeNode` but this can also get called on\n * other objects so just return '' if we're given something other than a\n * DOM node (such as window).\n *\n * @param {?DOMElement|DOMWindow|DOMDocument|DOMTextNode} node DOM node.\n * @return {string} ID of the supplied `domNode`.\n */\nfunction getID(node) {\n var id = internalGetID(node);\n if (id) {\n if (nodeCache.hasOwnProperty(id)) {\n var cached = nodeCache[id];\n if (cached !== node) {\n !!isValid(cached, id) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactMount: Two valid but unequal nodes with the same `%s`: %s', ATTR_NAME, id) : invariant(false) : undefined;\n\n nodeCache[id] = node;\n }\n } else {\n nodeCache[id] = node;\n }\n }\n\n return id;\n}\n\nfunction internalGetID(node) {\n // If node is something like a window, document, or text node, none of\n // which support attributes or a .getAttribute method, gracefully return\n // the empty string, as if the attribute were missing.\n return node && node.getAttribute && node.getAttribute(ATTR_NAME) || '';\n}\n\n/**\n * Sets the React-specific ID of the given node.\n *\n * @param {DOMElement} node The DOM node whose ID will be set.\n * @param {string} id The value of the ID attribute.\n */\nfunction setID(node, id) {\n var oldID = internalGetID(node);\n if (oldID !== id) {\n delete nodeCache[oldID];\n }\n node.setAttribute(ATTR_NAME, id);\n nodeCache[id] = node;\n}\n\n/**\n * Finds the node with the supplied React-generated DOM ID.\n *\n * @param {string} id A React-generated DOM ID.\n * @return {DOMElement} DOM node with the suppled `id`.\n * @internal\n */\nfunction getNode(id) {\n if (!nodeCache.hasOwnProperty(id) || !isValid(nodeCache[id], id)) {\n nodeCache[id] = ReactMount.findReactNodeByID(id);\n }\n return nodeCache[id];\n}\n\n/**\n * Finds the node with the supplied public React instance.\n *\n * @param {*} instance A public React instance.\n * @return {?DOMElement} DOM node with the suppled `id`.\n * @internal\n */\nfunction getNodeFromInstance(instance) {\n var id = ReactInstanceMap.get(instance)._rootNodeID;\n if (ReactEmptyComponentRegistry.isNullComponentID(id)) {\n return null;\n }\n if (!nodeCache.hasOwnProperty(id) || !isValid(nodeCache[id], id)) {\n nodeCache[id] = ReactMount.findReactNodeByID(id);\n }\n return nodeCache[id];\n}\n\n/**\n * A node is \"valid\" if it is contained by a currently mounted container.\n *\n * This means that the node does not have to be contained by a document in\n * order to be considered valid.\n *\n * @param {?DOMElement} node The candidate DOM node.\n * @param {string} id The expected ID of the node.\n * @return {boolean} Whether the node is contained by a mounted container.\n */\nfunction isValid(node, id) {\n if (node) {\n !(internalGetID(node) === id) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactMount: Unexpected modification of `%s`', ATTR_NAME) : invariant(false) : undefined;\n\n var container = ReactMount.findReactContainerForID(id);\n if (container && containsNode(container, node)) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Causes the cache to forget about one React-specific ID.\n *\n * @param {string} id The ID to forget.\n */\nfunction purgeID(id) {\n delete nodeCache[id];\n}\n\nvar deepestNodeSoFar = null;\nfunction findDeepestCachedAncestorImpl(ancestorID) {\n var ancestor = nodeCache[ancestorID];\n if (ancestor && isValid(ancestor, ancestorID)) {\n deepestNodeSoFar = ancestor;\n } else {\n // This node isn't populated in the cache, so presumably none of its\n // descendants are. Break out of the loop.\n return false;\n }\n}\n\n/**\n * Return the deepest cached node whose ID is a prefix of `targetID`.\n */\nfunction findDeepestCachedAncestor(targetID) {\n deepestNodeSoFar = null;\n ReactInstanceHandles.traverseAncestors(targetID, findDeepestCachedAncestorImpl);\n\n var foundNode = deepestNodeSoFar;\n deepestNodeSoFar = null;\n return foundNode;\n}\n\n/**\n * Mounts this component and inserts it into the DOM.\n *\n * @param {ReactComponent} componentInstance The instance to mount.\n * @param {string} rootID DOM ID of the root node.\n * @param {DOMElement} container DOM element to mount into.\n * @param {ReactReconcileTransaction} transaction\n * @param {boolean} shouldReuseMarkup If true, do not insert markup\n */\nfunction mountComponentIntoNode(componentInstance, rootID, container, transaction, shouldReuseMarkup, context) {\n if (ReactDOMFeatureFlags.useCreateElement) {\n context = assign({}, context);\n if (container.nodeType === DOC_NODE_TYPE) {\n context[ownerDocumentContextKey] = container;\n } else {\n context[ownerDocumentContextKey] = container.ownerDocument;\n }\n }\n if (process.env.NODE_ENV !== 'production') {\n if (context === emptyObject) {\n context = {};\n }\n var tag = container.nodeName.toLowerCase();\n context[validateDOMNesting.ancestorInfoContextKey] = validateDOMNesting.updatedAncestorInfo(null, tag, null);\n }\n var markup = ReactReconciler.mountComponent(componentInstance, rootID, transaction, context);\n componentInstance._renderedComponent._topLevelWrapper = componentInstance;\n ReactMount._mountImageIntoNode(markup, container, shouldReuseMarkup, transaction);\n}\n\n/**\n * Batched mount.\n *\n * @param {ReactComponent} componentInstance The instance to mount.\n * @param {string} rootID DOM ID of the root node.\n * @param {DOMElement} container DOM element to mount into.\n * @param {boolean} shouldReuseMarkup If true, do not insert markup\n */\nfunction batchedMountComponentIntoNode(componentInstance, rootID, container, shouldReuseMarkup, context) {\n var transaction = ReactUpdates.ReactReconcileTransaction.getPooled(\n /* forceHTML */shouldReuseMarkup);\n transaction.perform(mountComponentIntoNode, null, componentInstance, rootID, container, transaction, shouldReuseMarkup, context);\n ReactUpdates.ReactReconcileTransaction.release(transaction);\n}\n\n/**\n * Unmounts a component and removes it from the DOM.\n *\n * @param {ReactComponent} instance React component instance.\n * @param {DOMElement} container DOM element to unmount from.\n * @final\n * @internal\n * @see {ReactMount.unmountComponentAtNode}\n */\nfunction unmountComponentFromNode(instance, container) {\n ReactReconciler.unmountComponent(instance);\n\n if (container.nodeType === DOC_NODE_TYPE) {\n container = container.documentElement;\n }\n\n // http://jsperf.com/emptying-a-node\n while (container.lastChild) {\n container.removeChild(container.lastChild);\n }\n}\n\n/**\n * True if the supplied DOM node has a direct React-rendered child that is\n * not a React root element. Useful for warning in `render`,\n * `unmountComponentAtNode`, etc.\n *\n * @param {?DOMElement} node The candidate DOM node.\n * @return {boolean} True if the DOM element contains a direct child that was\n * rendered by React but is not a root element.\n * @internal\n */\nfunction hasNonRootReactChild(node) {\n var reactRootID = getReactRootID(node);\n return reactRootID ? reactRootID !== ReactInstanceHandles.getReactRootIDFromNodeID(reactRootID) : false;\n}\n\n/**\n * Returns the first (deepest) ancestor of a node which is rendered by this copy\n * of React.\n */\nfunction findFirstReactDOMImpl(node) {\n // This node might be from another React instance, so we make sure not to\n // examine the node cache here\n for (; node && node.parentNode !== node; node = node.parentNode) {\n if (node.nodeType !== 1) {\n // Not a DOMElement, therefore not a React component\n continue;\n }\n var nodeID = internalGetID(node);\n if (!nodeID) {\n continue;\n }\n var reactRootID = ReactInstanceHandles.getReactRootIDFromNodeID(nodeID);\n\n // If containersByReactRootID contains the container we find by crawling up\n // the tree, we know that this instance of React rendered the node.\n // nb. isValid's strategy (with containsNode) does not work because render\n // trees may be nested and we don't want a false positive in that case.\n var current = node;\n var lastID;\n do {\n lastID = internalGetID(current);\n current = current.parentNode;\n if (current == null) {\n // The passed-in node has been detached from the container it was\n // originally rendered into.\n return null;\n }\n } while (lastID !== reactRootID);\n\n if (current === containersByReactRootID[reactRootID]) {\n return node;\n }\n }\n return null;\n}\n\n/**\n * Temporary (?) hack so that we can store all top-level pending updates on\n * composites instead of having to worry about different types of components\n * here.\n */\nvar TopLevelWrapper = function () {};\nTopLevelWrapper.prototype.isReactComponent = {};\nif (process.env.NODE_ENV !== 'production') {\n TopLevelWrapper.displayName = 'TopLevelWrapper';\n}\nTopLevelWrapper.prototype.render = function () {\n // this.props is actually a ReactElement\n return this.props;\n};\n\n/**\n * Mounting is the process of initializing a React component by creating its\n * representative DOM elements and inserting them into a supplied `container`.\n * Any prior content inside `container` is destroyed in the process.\n *\n * ReactMount.render(\n * component,\n * document.getElementById('container')\n * );\n *\n * <div id=\"container\"> <-- Supplied `container`.\n * <div data-reactid=\".3\"> <-- Rendered reactRoot of React\n * // ... component.\n * </div>\n * </div>\n *\n * Inside of `container`, the first element rendered is the \"reactRoot\".\n */\nvar ReactMount = {\n\n TopLevelWrapper: TopLevelWrapper,\n\n /** Exposed for debugging purposes **/\n _instancesByReactRootID: instancesByReactRootID,\n\n /**\n * This is a hook provided to support rendering React components while\n * ensuring that the apparent scroll position of its `container` does not\n * change.\n *\n * @param {DOMElement} container The `container` being rendered into.\n * @param {function} renderCallback This must be called once to do the render.\n */\n scrollMonitor: function (container, renderCallback) {\n renderCallback();\n },\n\n /**\n * Take a component that's already mounted into the DOM and replace its props\n * @param {ReactComponent} prevComponent component instance already in the DOM\n * @param {ReactElement} nextElement component instance to render\n * @param {DOMElement} container container to render into\n * @param {?function} callback function triggered on completion\n */\n _updateRootComponent: function (prevComponent, nextElement, container, callback) {\n ReactMount.scrollMonitor(container, function () {\n ReactUpdateQueue.enqueueElementInternal(prevComponent, nextElement);\n if (callback) {\n ReactUpdateQueue.enqueueCallbackInternal(prevComponent, callback);\n }\n });\n\n if (process.env.NODE_ENV !== 'production') {\n // Record the root element in case it later gets transplanted.\n rootElementsByReactRootID[getReactRootID(container)] = getReactRootElementInContainer(container);\n }\n\n return prevComponent;\n },\n\n /**\n * Register a component into the instance map and starts scroll value\n * monitoring\n * @param {ReactComponent} nextComponent component instance to render\n * @param {DOMElement} container container to render into\n * @return {string} reactRoot ID prefix\n */\n _registerComponent: function (nextComponent, container) {\n !(container && (container.nodeType === ELEMENT_NODE_TYPE || container.nodeType === DOC_NODE_TYPE || container.nodeType === DOCUMENT_FRAGMENT_NODE_TYPE)) ? process.env.NODE_ENV !== 'production' ? invariant(false, '_registerComponent(...): Target container is not a DOM element.') : invariant(false) : undefined;\n\n ReactBrowserEventEmitter.ensureScrollValueMonitoring();\n\n var reactRootID = ReactMount.registerContainer(container);\n instancesByReactRootID[reactRootID] = nextComponent;\n return reactRootID;\n },\n\n /**\n * Render a new component into the DOM.\n * @param {ReactElement} nextElement element to render\n * @param {DOMElement} container container to render into\n * @param {boolean} shouldReuseMarkup if we should skip the markup insertion\n * @return {ReactComponent} nextComponent\n */\n _renderNewRootComponent: function (nextElement, container, shouldReuseMarkup, context) {\n // Various parts of our code (such as ReactCompositeComponent's\n // _renderValidatedComponent) assume that calls to render aren't nested;\n // verify that that's the case.\n process.env.NODE_ENV !== 'production' ? warning(ReactCurrentOwner.current == null, '_renderNewRootComponent(): Render methods should be a pure function ' + 'of props and state; triggering nested component updates from ' + 'render is not allowed. If necessary, trigger nested updates in ' + 'componentDidUpdate. Check the render method of %s.', ReactCurrentOwner.current && ReactCurrentOwner.current.getName() || 'ReactCompositeComponent') : undefined;\n\n var componentInstance = instantiateReactComponent(nextElement, null);\n var reactRootID = ReactMount._registerComponent(componentInstance, container);\n\n // The initial render is synchronous but any updates that happen during\n // rendering, in componentWillMount or componentDidMount, will be batched\n // according to the current batching strategy.\n\n ReactUpdates.batchedUpdates(batchedMountComponentIntoNode, componentInstance, reactRootID, container, shouldReuseMarkup, context);\n\n if (process.env.NODE_ENV !== 'production') {\n // Record the root element in case it later gets transplanted.\n rootElementsByReactRootID[reactRootID] = getReactRootElementInContainer(container);\n }\n\n return componentInstance;\n },\n\n /**\n * Renders a React component into the DOM in the supplied `container`.\n *\n * If the React component was previously rendered into `container`, this will\n * perform an update on it and only mutate the DOM as necessary to reflect the\n * latest React component.\n *\n * @param {ReactComponent} parentComponent The conceptual parent of this render tree.\n * @param {ReactElement} nextElement Component element to render.\n * @param {DOMElement} container DOM element to render into.\n * @param {?function} callback function triggered on completion\n * @return {ReactComponent} Component instance rendered in `container`.\n */\n renderSubtreeIntoContainer: function (parentComponent, nextElement, container, callback) {\n !(parentComponent != null && parentComponent._reactInternalInstance != null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'parentComponent must be a valid React Component') : invariant(false) : undefined;\n return ReactMount._renderSubtreeIntoContainer(parentComponent, nextElement, container, callback);\n },\n\n _renderSubtreeIntoContainer: function (parentComponent, nextElement, container, callback) {\n !ReactElement.isValidElement(nextElement) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactDOM.render(): Invalid component element.%s', typeof nextElement === 'string' ? ' Instead of passing an element string, make sure to instantiate ' + 'it by passing it to React.createElement.' : typeof nextElement === 'function' ? ' Instead of passing a component class, make sure to instantiate ' + 'it by passing it to React.createElement.' :\n // Check if it quacks like an element\n nextElement != null && nextElement.props !== undefined ? ' This may be caused by unintentionally loading two independent ' + 'copies of React.' : '') : invariant(false) : undefined;\n\n process.env.NODE_ENV !== 'production' ? warning(!container || !container.tagName || container.tagName.toUpperCase() !== 'BODY', 'render(): Rendering components directly into document.body is ' + 'discouraged, since its children are often manipulated by third-party ' + 'scripts and browser extensions. This may lead to subtle ' + 'reconciliation issues. Try rendering into a container element created ' + 'for your app.') : undefined;\n\n var nextWrappedElement = new ReactElement(TopLevelWrapper, null, null, null, null, null, nextElement);\n\n var prevComponent = instancesByReactRootID[getReactRootID(container)];\n\n if (prevComponent) {\n var prevWrappedElement = prevComponent._currentElement;\n var prevElement = prevWrappedElement.props;\n if (shouldUpdateReactComponent(prevElement, nextElement)) {\n var publicInst = prevComponent._renderedComponent.getPublicInstance();\n var updatedCallback = callback && function () {\n callback.call(publicInst);\n };\n ReactMount._updateRootComponent(prevComponent, nextWrappedElement, container, updatedCallback);\n return publicInst;\n } else {\n ReactMount.unmountComponentAtNode(container);\n }\n }\n\n var reactRootElement = getReactRootElementInContainer(container);\n var containerHasReactMarkup = reactRootElement && !!internalGetID(reactRootElement);\n var containerHasNonRootReactChild = hasNonRootReactChild(container);\n\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(!containerHasNonRootReactChild, 'render(...): Replacing React-rendered children with a new root ' + 'component. If you intended to update the children of this node, ' + 'you should instead have the existing children update their state ' + 'and render the new components instead of calling ReactDOM.render.') : undefined;\n\n if (!containerHasReactMarkup || reactRootElement.nextSibling) {\n var rootElementSibling = reactRootElement;\n while (rootElementSibling) {\n if (internalGetID(rootElementSibling)) {\n process.env.NODE_ENV !== 'production' ? warning(false, 'render(): Target node has markup rendered by React, but there ' + 'are unrelated nodes as well. This is most commonly caused by ' + 'white-space inserted around server-rendered markup.') : undefined;\n break;\n }\n rootElementSibling = rootElementSibling.nextSibling;\n }\n }\n }\n\n var shouldReuseMarkup = containerHasReactMarkup && !prevComponent && !containerHasNonRootReactChild;\n var component = ReactMount._renderNewRootComponent(nextWrappedElement, container, shouldReuseMarkup, parentComponent != null ? parentComponent._reactInternalInstance._processChildContext(parentComponent._reactInternalInstance._context) : emptyObject)._renderedComponent.getPublicInstance();\n if (callback) {\n callback.call(component);\n }\n return component;\n },\n\n /**\n * Renders a React component into the DOM in the supplied `container`.\n *\n * If the React component was previously rendered into `container`, this will\n * perform an update on it and only mutate the DOM as necessary to reflect the\n * latest React component.\n *\n * @param {ReactElement} nextElement Component element to render.\n * @param {DOMElement} container DOM element to render into.\n * @param {?function} callback function triggered on completion\n * @return {ReactComponent} Component instance rendered in `container`.\n */\n render: function (nextElement, container, callback) {\n return ReactMount._renderSubtreeIntoContainer(null, nextElement, container, callback);\n },\n\n /**\n * Registers a container node into which React components will be rendered.\n * This also creates the \"reactRoot\" ID that will be assigned to the element\n * rendered within.\n *\n * @param {DOMElement} container DOM element to register as a container.\n * @return {string} The \"reactRoot\" ID of elements rendered within.\n */\n registerContainer: function (container) {\n var reactRootID = getReactRootID(container);\n if (reactRootID) {\n // If one exists, make sure it is a valid \"reactRoot\" ID.\n reactRootID = ReactInstanceHandles.getReactRootIDFromNodeID(reactRootID);\n }\n if (!reactRootID) {\n // No valid \"reactRoot\" ID found, create one.\n reactRootID = ReactInstanceHandles.createReactRootID();\n }\n containersByReactRootID[reactRootID] = container;\n return reactRootID;\n },\n\n /**\n * Unmounts and destroys the React component rendered in the `container`.\n *\n * @param {DOMElement} container DOM element containing a React component.\n * @return {boolean} True if a component was found in and unmounted from\n * `container`\n */\n unmountComponentAtNode: function (container) {\n // Various parts of our code (such as ReactCompositeComponent's\n // _renderValidatedComponent) assume that calls to render aren't nested;\n // verify that that's the case. (Strictly speaking, unmounting won't cause a\n // render but we still don't expect to be in a render call here.)\n process.env.NODE_ENV !== 'production' ? warning(ReactCurrentOwner.current == null, 'unmountComponentAtNode(): Render methods should be a pure function ' + 'of props and state; triggering nested component updates from render ' + 'is not allowed. If necessary, trigger nested updates in ' + 'componentDidUpdate. Check the render method of %s.', ReactCurrentOwner.current && ReactCurrentOwner.current.getName() || 'ReactCompositeComponent') : undefined;\n\n !(container && (container.nodeType === ELEMENT_NODE_TYPE || container.nodeType === DOC_NODE_TYPE || container.nodeType === DOCUMENT_FRAGMENT_NODE_TYPE)) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'unmountComponentAtNode(...): Target container is not a DOM element.') : invariant(false) : undefined;\n\n var reactRootID = getReactRootID(container);\n var component = instancesByReactRootID[reactRootID];\n if (!component) {\n // Check if the node being unmounted was rendered by React, but isn't a\n // root node.\n var containerHasNonRootReactChild = hasNonRootReactChild(container);\n\n // Check if the container itself is a React root node.\n var containerID = internalGetID(container);\n var isContainerReactRoot = containerID && containerID === ReactInstanceHandles.getReactRootIDFromNodeID(containerID);\n\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(!containerHasNonRootReactChild, 'unmountComponentAtNode(): The node you\\'re attempting to unmount ' + 'was rendered by React and is not a top-level container. %s', isContainerReactRoot ? 'You may have accidentally passed in a React root node instead ' + 'of its container.' : 'Instead, have the parent component update its state and ' + 'rerender in order to remove this component.') : undefined;\n }\n\n return false;\n }\n ReactUpdates.batchedUpdates(unmountComponentFromNode, component, container);\n delete instancesByReactRootID[reactRootID];\n delete containersByReactRootID[reactRootID];\n if (process.env.NODE_ENV !== 'production') {\n delete rootElementsByReactRootID[reactRootID];\n }\n return true;\n },\n\n /**\n * Finds the container DOM element that contains React component to which the\n * supplied DOM `id` belongs.\n *\n * @param {string} id The ID of an element rendered by a React component.\n * @return {?DOMElement} DOM element that contains the `id`.\n */\n findReactContainerForID: function (id) {\n var reactRootID = ReactInstanceHandles.getReactRootIDFromNodeID(id);\n var container = containersByReactRootID[reactRootID];\n\n if (process.env.NODE_ENV !== 'production') {\n var rootElement = rootElementsByReactRootID[reactRootID];\n if (rootElement && rootElement.parentNode !== container) {\n process.env.NODE_ENV !== 'production' ? warning(\n // Call internalGetID here because getID calls isValid which calls\n // findReactContainerForID (this function).\n internalGetID(rootElement) === reactRootID, 'ReactMount: Root element ID differed from reactRootID.') : undefined;\n var containerChild = container.firstChild;\n if (containerChild && reactRootID === internalGetID(containerChild)) {\n // If the container has a new child with the same ID as the old\n // root element, then rootElementsByReactRootID[reactRootID] is\n // just stale and needs to be updated. The case that deserves a\n // warning is when the container is empty.\n rootElementsByReactRootID[reactRootID] = containerChild;\n } else {\n process.env.NODE_ENV !== 'production' ? warning(false, 'ReactMount: Root element has been removed from its original ' + 'container. New container: %s', rootElement.parentNode) : undefined;\n }\n }\n }\n\n return container;\n },\n\n /**\n * Finds an element rendered by React with the supplied ID.\n *\n * @param {string} id ID of a DOM node in the React component.\n * @return {DOMElement} Root DOM node of the React component.\n */\n findReactNodeByID: function (id) {\n var reactRoot = ReactMount.findReactContainerForID(id);\n return ReactMount.findComponentRoot(reactRoot, id);\n },\n\n /**\n * Traverses up the ancestors of the supplied node to find a node that is a\n * DOM representation of a React component rendered by this copy of React.\n *\n * @param {*} node\n * @return {?DOMEventTarget}\n * @internal\n */\n getFirstReactDOM: function (node) {\n return findFirstReactDOMImpl(node);\n },\n\n /**\n * Finds a node with the supplied `targetID` inside of the supplied\n * `ancestorNode`. Exploits the ID naming scheme to perform the search\n * quickly.\n *\n * @param {DOMEventTarget} ancestorNode Search from this root.\n * @pararm {string} targetID ID of the DOM representation of the component.\n * @return {DOMEventTarget} DOM node with the supplied `targetID`.\n * @internal\n */\n findComponentRoot: function (ancestorNode, targetID) {\n var firstChildren = findComponentRootReusableArray;\n var childIndex = 0;\n\n var deepestAncestor = findDeepestCachedAncestor(targetID) || ancestorNode;\n\n if (process.env.NODE_ENV !== 'production') {\n // This will throw on the next line; give an early warning\n process.env.NODE_ENV !== 'production' ? warning(deepestAncestor != null, 'React can\\'t find the root component node for data-reactid value ' + '`%s`. If you\\'re seeing this message, it probably means that ' + 'you\\'ve loaded two copies of React on the page. At this time, only ' + 'a single copy of React can be loaded at a time.', targetID) : undefined;\n }\n\n firstChildren[0] = deepestAncestor.firstChild;\n firstChildren.length = 1;\n\n while (childIndex < firstChildren.length) {\n var child = firstChildren[childIndex++];\n var targetChild;\n\n while (child) {\n var childID = ReactMount.getID(child);\n if (childID) {\n // Even if we find the node we're looking for, we finish looping\n // through its siblings to ensure they're cached so that we don't have\n // to revisit this node again. Otherwise, we make n^2 calls to getID\n // when visiting the many children of a single node in order.\n\n if (targetID === childID) {\n targetChild = child;\n } else if (ReactInstanceHandles.isAncestorIDOf(childID, targetID)) {\n // If we find a child whose ID is an ancestor of the given ID,\n // then we can be sure that we only want to search the subtree\n // rooted at this child, so we can throw out the rest of the\n // search state.\n firstChildren.length = childIndex = 0;\n firstChildren.push(child.firstChild);\n }\n } else {\n // If this child had no ID, then there's a chance that it was\n // injected automatically by the browser, as when a `<table>`\n // element sprouts an extra `<tbody>` child as a side effect of\n // `.innerHTML` parsing. Optimistically continue down this\n // branch, but not before examining the other siblings.\n firstChildren.push(child.firstChild);\n }\n\n child = child.nextSibling;\n }\n\n if (targetChild) {\n // Emptying firstChildren/findComponentRootReusableArray is\n // not necessary for correctness, but it helps the GC reclaim\n // any nodes that were left at the end of the search.\n firstChildren.length = 0;\n\n return targetChild;\n }\n }\n\n firstChildren.length = 0;\n\n !false ? process.env.NODE_ENV !== 'production' ? invariant(false, 'findComponentRoot(..., %s): Unable to find element. This probably ' + 'means the DOM was unexpectedly mutated (e.g., by the browser), ' + 'usually due to forgetting a <tbody> when using tables, nesting tags ' + 'like <form>, <p>, or <a>, or using non-SVG elements in an <svg> ' + 'parent. ' + 'Try inspecting the child nodes of the element with React ID `%s`.', targetID, ReactMount.getID(ancestorNode)) : invariant(false) : undefined;\n },\n\n _mountImageIntoNode: function (markup, container, shouldReuseMarkup, transaction) {\n !(container && (container.nodeType === ELEMENT_NODE_TYPE || container.nodeType === DOC_NODE_TYPE || container.nodeType === DOCUMENT_FRAGMENT_NODE_TYPE)) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'mountComponentIntoNode(...): Target container is not valid.') : invariant(false) : undefined;\n\n if (shouldReuseMarkup) {\n var rootElement = getReactRootElementInContainer(container);\n if (ReactMarkupChecksum.canReuseMarkup(markup, rootElement)) {\n return;\n } else {\n var checksum = rootElement.getAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME);\n rootElement.removeAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME);\n\n var rootMarkup = rootElement.outerHTML;\n rootElement.setAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME, checksum);\n\n var normalizedMarkup = markup;\n if (process.env.NODE_ENV !== 'production') {\n // because rootMarkup is retrieved from the DOM, various normalizations\n // will have occurred which will not be present in `markup`. Here,\n // insert markup into a <div> or <iframe> depending on the container\n // type to perform the same normalizations before comparing.\n var normalizer;\n if (container.nodeType === ELEMENT_NODE_TYPE) {\n normalizer = document.createElement('div');\n normalizer.innerHTML = markup;\n normalizedMarkup = normalizer.innerHTML;\n } else {\n normalizer = document.createElement('iframe');\n document.body.appendChild(normalizer);\n normalizer.contentDocument.write(markup);\n normalizedMarkup = normalizer.contentDocument.documentElement.outerHTML;\n document.body.removeChild(normalizer);\n }\n }\n\n var diffIndex = firstDifferenceIndex(normalizedMarkup, rootMarkup);\n var difference = ' (client) ' + normalizedMarkup.substring(diffIndex - 20, diffIndex + 20) + '\\n (server) ' + rootMarkup.substring(diffIndex - 20, diffIndex + 20);\n\n !(container.nodeType !== DOC_NODE_TYPE) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'You\\'re trying to render a component to the document using ' + 'server rendering but the checksum was invalid. This usually ' + 'means you rendered a different component type or props on ' + 'the client from the one on the server, or your render() ' + 'methods are impure. React cannot handle this case due to ' + 'cross-browser quirks by rendering at the document root. You ' + 'should look for environment dependent code in your components ' + 'and ensure the props are the same client and server side:\\n%s', difference) : invariant(false) : undefined;\n\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(false, 'React attempted to reuse markup in a container but the ' + 'checksum was invalid. This generally means that you are ' + 'using server rendering and the markup generated on the ' + 'server was not what the client was expecting. React injected ' + 'new markup to compensate which works but you have lost many ' + 'of the benefits of server rendering. Instead, figure out ' + 'why the markup being generated is different on the client ' + 'or server:\\n%s', difference) : undefined;\n }\n }\n }\n\n !(container.nodeType !== DOC_NODE_TYPE) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'You\\'re trying to render a component to the document but ' + 'you didn\\'t use server rendering. We can\\'t do this ' + 'without using server rendering due to cross-browser quirks. ' + 'See ReactDOMServer.renderToString() for server rendering.') : invariant(false) : undefined;\n\n if (transaction.useCreateElement) {\n while (container.lastChild) {\n container.removeChild(container.lastChild);\n }\n container.appendChild(markup);\n } else {\n setInnerHTML(container, markup);\n }\n },\n\n ownerDocumentContextKey: ownerDocumentContextKey,\n\n /**\n * React ID utilities.\n */\n\n getReactRootID: getReactRootID,\n\n getID: getID,\n\n setID: setID,\n\n getNode: getNode,\n\n getNodeFromInstance: getNodeFromInstance,\n\n isValid: isValid,\n\n purgeID: purgeID\n};\n\nReactPerf.measureMethods(ReactMount, 'ReactMount', {\n _renderNewRootComponent: '_renderNewRootComponent',\n _mountImageIntoNode: '_mountImageIntoNode'\n});\n\nmodule.exports = ReactMount;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactMount.js\n ** module id = 27\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactBrowserEventEmitter\n * @typechecks static-only\n */\n\n'use strict';\n\nvar EventConstants = require('./EventConstants');\nvar EventPluginHub = require('./EventPluginHub');\nvar EventPluginRegistry = require('./EventPluginRegistry');\nvar ReactEventEmitterMixin = require('./ReactEventEmitterMixin');\nvar ReactPerf = require('./ReactPerf');\nvar ViewportMetrics = require('./ViewportMetrics');\n\nvar assign = require('./Object.assign');\nvar isEventSupported = require('./isEventSupported');\n\n/**\n * Summary of `ReactBrowserEventEmitter` event handling:\n *\n * - Top-level delegation is used to trap most native browser events. This\n * may only occur in the main thread and is the responsibility of\n * ReactEventListener, which is injected and can therefore support pluggable\n * event sources. This is the only work that occurs in the main thread.\n *\n * - We normalize and de-duplicate events to account for browser quirks. This\n * may be done in the worker thread.\n *\n * - Forward these native events (with the associated top-level type used to\n * trap it) to `EventPluginHub`, which in turn will ask plugins if they want\n * to extract any synthetic events.\n *\n * - The `EventPluginHub` will then process each event by annotating them with\n * \"dispatches\", a sequence of listeners and IDs that care about that event.\n *\n * - The `EventPluginHub` then dispatches the events.\n *\n * Overview of React and the event system:\n *\n * +------------+ .\n * | DOM | .\n * +------------+ .\n * | .\n * v .\n * +------------+ .\n * | ReactEvent | .\n * | Listener | .\n * +------------+ . +-----------+\n * | . +--------+|SimpleEvent|\n * | . | |Plugin |\n * +-----|------+ . v +-----------+\n * | | | . +--------------+ +------------+\n * | +-----------.--->|EventPluginHub| | Event |\n * | | . | | +-----------+ | Propagators|\n * | ReactEvent | . | | |TapEvent | |------------|\n * | Emitter | . | |<---+|Plugin | |other plugin|\n * | | . | | +-----------+ | utilities |\n * | +-----------.--->| | +------------+\n * | | | . +--------------+\n * +-----|------+ . ^ +-----------+\n * | . | |Enter/Leave|\n * + . +-------+|Plugin |\n * +-------------+ . +-----------+\n * | application | .\n * |-------------| .\n * | | .\n * | | .\n * +-------------+ .\n * .\n * React Core . General Purpose Event Plugin System\n */\n\nvar alreadyListeningTo = {};\nvar isMonitoringScrollValue = false;\nvar reactTopListenersCounter = 0;\n\n// For events like 'submit' which don't consistently bubble (which we trap at a\n// lower node than `document`), binding at `document` would cause duplicate\n// events so we don't include them here\nvar topEventMapping = {\n topAbort: 'abort',\n topBlur: 'blur',\n topCanPlay: 'canplay',\n topCanPlayThrough: 'canplaythrough',\n topChange: 'change',\n topClick: 'click',\n topCompositionEnd: 'compositionend',\n topCompositionStart: 'compositionstart',\n topCompositionUpdate: 'compositionupdate',\n topContextMenu: 'contextmenu',\n topCopy: 'copy',\n topCut: 'cut',\n topDoubleClick: 'dblclick',\n topDrag: 'drag',\n topDragEnd: 'dragend',\n topDragEnter: 'dragenter',\n topDragExit: 'dragexit',\n topDragLeave: 'dragleave',\n topDragOver: 'dragover',\n topDragStart: 'dragstart',\n topDrop: 'drop',\n topDurationChange: 'durationchange',\n topEmptied: 'emptied',\n topEncrypted: 'encrypted',\n topEnded: 'ended',\n topError: 'error',\n topFocus: 'focus',\n topInput: 'input',\n topKeyDown: 'keydown',\n topKeyPress: 'keypress',\n topKeyUp: 'keyup',\n topLoadedData: 'loadeddata',\n topLoadedMetadata: 'loadedmetadata',\n topLoadStart: 'loadstart',\n topMouseDown: 'mousedown',\n topMouseMove: 'mousemove',\n topMouseOut: 'mouseout',\n topMouseOver: 'mouseover',\n topMouseUp: 'mouseup',\n topPaste: 'paste',\n topPause: 'pause',\n topPlay: 'play',\n topPlaying: 'playing',\n topProgress: 'progress',\n topRateChange: 'ratechange',\n topScroll: 'scroll',\n topSeeked: 'seeked',\n topSeeking: 'seeking',\n topSelectionChange: 'selectionchange',\n topStalled: 'stalled',\n topSuspend: 'suspend',\n topTextInput: 'textInput',\n topTimeUpdate: 'timeupdate',\n topTouchCancel: 'touchcancel',\n topTouchEnd: 'touchend',\n topTouchMove: 'touchmove',\n topTouchStart: 'touchstart',\n topVolumeChange: 'volumechange',\n topWaiting: 'waiting',\n topWheel: 'wheel'\n};\n\n/**\n * To ensure no conflicts with other potential React instances on the page\n */\nvar topListenersIDKey = '_reactListenersID' + String(Math.random()).slice(2);\n\nfunction getListeningForDocument(mountAt) {\n // In IE8, `mountAt` is a host object and doesn't have `hasOwnProperty`\n // directly.\n if (!Object.prototype.hasOwnProperty.call(mountAt, topListenersIDKey)) {\n mountAt[topListenersIDKey] = reactTopListenersCounter++;\n alreadyListeningTo[mountAt[topListenersIDKey]] = {};\n }\n return alreadyListeningTo[mountAt[topListenersIDKey]];\n}\n\n/**\n * `ReactBrowserEventEmitter` is used to attach top-level event listeners. For\n * example:\n *\n * ReactBrowserEventEmitter.putListener('myID', 'onClick', myFunction);\n *\n * This would allocate a \"registration\" of `('onClick', myFunction)` on 'myID'.\n *\n * @internal\n */\nvar ReactBrowserEventEmitter = assign({}, ReactEventEmitterMixin, {\n\n /**\n * Injectable event backend\n */\n ReactEventListener: null,\n\n injection: {\n /**\n * @param {object} ReactEventListener\n */\n injectReactEventListener: function (ReactEventListener) {\n ReactEventListener.setHandleTopLevel(ReactBrowserEventEmitter.handleTopLevel);\n ReactBrowserEventEmitter.ReactEventListener = ReactEventListener;\n }\n },\n\n /**\n * Sets whether or not any created callbacks should be enabled.\n *\n * @param {boolean} enabled True if callbacks should be enabled.\n */\n setEnabled: function (enabled) {\n if (ReactBrowserEventEmitter.ReactEventListener) {\n ReactBrowserEventEmitter.ReactEventListener.setEnabled(enabled);\n }\n },\n\n /**\n * @return {boolean} True if callbacks are enabled.\n */\n isEnabled: function () {\n return !!(ReactBrowserEventEmitter.ReactEventListener && ReactBrowserEventEmitter.ReactEventListener.isEnabled());\n },\n\n /**\n * We listen for bubbled touch events on the document object.\n *\n * Firefox v8.01 (and possibly others) exhibited strange behavior when\n * mounting `onmousemove` events at some node that was not the document\n * element. The symptoms were that if your mouse is not moving over something\n * contained within that mount point (for example on the background) the\n * top-level listeners for `onmousemove` won't be called. However, if you\n * register the `mousemove` on the document object, then it will of course\n * catch all `mousemove`s. This along with iOS quirks, justifies restricting\n * top-level listeners to the document object only, at least for these\n * movement types of events and possibly all events.\n *\n * @see http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html\n *\n * Also, `keyup`/`keypress`/`keydown` do not bubble to the window on IE, but\n * they bubble to document.\n *\n * @param {string} registrationName Name of listener (e.g. `onClick`).\n * @param {object} contentDocumentHandle Document which owns the container\n */\n listenTo: function (registrationName, contentDocumentHandle) {\n var mountAt = contentDocumentHandle;\n var isListening = getListeningForDocument(mountAt);\n var dependencies = EventPluginRegistry.registrationNameDependencies[registrationName];\n\n var topLevelTypes = EventConstants.topLevelTypes;\n for (var i = 0; i < dependencies.length; i++) {\n var dependency = dependencies[i];\n if (!(isListening.hasOwnProperty(dependency) && isListening[dependency])) {\n if (dependency === topLevelTypes.topWheel) {\n if (isEventSupported('wheel')) {\n ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelTypes.topWheel, 'wheel', mountAt);\n } else if (isEventSupported('mousewheel')) {\n ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelTypes.topWheel, 'mousewheel', mountAt);\n } else {\n // Firefox needs to capture a different mouse scroll event.\n // @see http://www.quirksmode.org/dom/events/tests/scroll.html\n ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelTypes.topWheel, 'DOMMouseScroll', mountAt);\n }\n } else if (dependency === topLevelTypes.topScroll) {\n\n if (isEventSupported('scroll', true)) {\n ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(topLevelTypes.topScroll, 'scroll', mountAt);\n } else {\n ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelTypes.topScroll, 'scroll', ReactBrowserEventEmitter.ReactEventListener.WINDOW_HANDLE);\n }\n } else if (dependency === topLevelTypes.topFocus || dependency === topLevelTypes.topBlur) {\n\n if (isEventSupported('focus', true)) {\n ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(topLevelTypes.topFocus, 'focus', mountAt);\n ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(topLevelTypes.topBlur, 'blur', mountAt);\n } else if (isEventSupported('focusin')) {\n // IE has `focusin` and `focusout` events which bubble.\n // @see http://www.quirksmode.org/blog/archives/2008/04/delegating_the.html\n ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelTypes.topFocus, 'focusin', mountAt);\n ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelTypes.topBlur, 'focusout', mountAt);\n }\n\n // to make sure blur and focus event listeners are only attached once\n isListening[topLevelTypes.topBlur] = true;\n isListening[topLevelTypes.topFocus] = true;\n } else if (topEventMapping.hasOwnProperty(dependency)) {\n ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(dependency, topEventMapping[dependency], mountAt);\n }\n\n isListening[dependency] = true;\n }\n }\n },\n\n trapBubbledEvent: function (topLevelType, handlerBaseName, handle) {\n return ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelType, handlerBaseName, handle);\n },\n\n trapCapturedEvent: function (topLevelType, handlerBaseName, handle) {\n return ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(topLevelType, handlerBaseName, handle);\n },\n\n /**\n * Listens to window scroll and resize events. We cache scroll values so that\n * application code can access them without triggering reflows.\n *\n * NOTE: Scroll events do not bubble.\n *\n * @see http://www.quirksmode.org/dom/events/scroll.html\n */\n ensureScrollValueMonitoring: function () {\n if (!isMonitoringScrollValue) {\n var refresh = ViewportMetrics.refreshScrollValues;\n ReactBrowserEventEmitter.ReactEventListener.monitorScrollValue(refresh);\n isMonitoringScrollValue = true;\n }\n },\n\n eventNameDispatchConfigs: EventPluginHub.eventNameDispatchConfigs,\n\n registrationNameModules: EventPluginHub.registrationNameModules,\n\n putListener: EventPluginHub.putListener,\n\n getListener: EventPluginHub.getListener,\n\n deleteListener: EventPluginHub.deleteListener,\n\n deleteAllListeners: EventPluginHub.deleteAllListeners\n\n});\n\nReactPerf.measureMethods(ReactBrowserEventEmitter, 'ReactBrowserEventEmitter', {\n putListener: 'putListener',\n deleteListener: 'deleteListener'\n});\n\nmodule.exports = ReactBrowserEventEmitter;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactBrowserEventEmitter.js\n ** module id = 28\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule EventConstants\n */\n\n'use strict';\n\nvar keyMirror = require('fbjs/lib/keyMirror');\n\nvar PropagationPhases = keyMirror({ bubbled: null, captured: null });\n\n/**\n * Types of raw signals from the browser caught at the top level.\n */\nvar topLevelTypes = keyMirror({\n topAbort: null,\n topBlur: null,\n topCanPlay: null,\n topCanPlayThrough: null,\n topChange: null,\n topClick: null,\n topCompositionEnd: null,\n topCompositionStart: null,\n topCompositionUpdate: null,\n topContextMenu: null,\n topCopy: null,\n topCut: null,\n topDoubleClick: null,\n topDrag: null,\n topDragEnd: null,\n topDragEnter: null,\n topDragExit: null,\n topDragLeave: null,\n topDragOver: null,\n topDragStart: null,\n topDrop: null,\n topDurationChange: null,\n topEmptied: null,\n topEncrypted: null,\n topEnded: null,\n topError: null,\n topFocus: null,\n topInput: null,\n topKeyDown: null,\n topKeyPress: null,\n topKeyUp: null,\n topLoad: null,\n topLoadedData: null,\n topLoadedMetadata: null,\n topLoadStart: null,\n topMouseDown: null,\n topMouseMove: null,\n topMouseOut: null,\n topMouseOver: null,\n topMouseUp: null,\n topPaste: null,\n topPause: null,\n topPlay: null,\n topPlaying: null,\n topProgress: null,\n topRateChange: null,\n topReset: null,\n topScroll: null,\n topSeeked: null,\n topSeeking: null,\n topSelectionChange: null,\n topStalled: null,\n topSubmit: null,\n topSuspend: null,\n topTextInput: null,\n topTimeUpdate: null,\n topTouchCancel: null,\n topTouchEnd: null,\n topTouchMove: null,\n topTouchStart: null,\n topVolumeChange: null,\n topWaiting: null,\n topWheel: null\n});\n\nvar EventConstants = {\n topLevelTypes: topLevelTypes,\n PropagationPhases: PropagationPhases\n};\n\nmodule.exports = EventConstants;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/EventConstants.js\n ** module id = 29\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule EventPluginHub\n */\n\n'use strict';\n\nvar EventPluginRegistry = require('./EventPluginRegistry');\nvar EventPluginUtils = require('./EventPluginUtils');\nvar ReactErrorUtils = require('./ReactErrorUtils');\n\nvar accumulateInto = require('./accumulateInto');\nvar forEachAccumulated = require('./forEachAccumulated');\nvar invariant = require('fbjs/lib/invariant');\nvar warning = require('fbjs/lib/warning');\n\n/**\n * Internal store for event listeners\n */\nvar listenerBank = {};\n\n/**\n * Internal queue of events that have accumulated their dispatches and are\n * waiting to have their dispatches executed.\n */\nvar eventQueue = null;\n\n/**\n * Dispatches an event and releases it back into the pool, unless persistent.\n *\n * @param {?object} event Synthetic event to be dispatched.\n * @param {boolean} simulated If the event is simulated (changes exn behavior)\n * @private\n */\nvar executeDispatchesAndRelease = function (event, simulated) {\n if (event) {\n EventPluginUtils.executeDispatchesInOrder(event, simulated);\n\n if (!event.isPersistent()) {\n event.constructor.release(event);\n }\n }\n};\nvar executeDispatchesAndReleaseSimulated = function (e) {\n return executeDispatchesAndRelease(e, true);\n};\nvar executeDispatchesAndReleaseTopLevel = function (e) {\n return executeDispatchesAndRelease(e, false);\n};\n\n/**\n * - `InstanceHandle`: [required] Module that performs logical traversals of DOM\n * hierarchy given ids of the logical DOM elements involved.\n */\nvar InstanceHandle = null;\n\nfunction validateInstanceHandle() {\n var valid = InstanceHandle && InstanceHandle.traverseTwoPhase && InstanceHandle.traverseEnterLeave;\n process.env.NODE_ENV !== 'production' ? warning(valid, 'InstanceHandle not injected before use!') : undefined;\n}\n\n/**\n * This is a unified interface for event plugins to be installed and configured.\n *\n * Event plugins can implement the following properties:\n *\n * `extractEvents` {function(string, DOMEventTarget, string, object): *}\n * Required. When a top-level event is fired, this method is expected to\n * extract synthetic events that will in turn be queued and dispatched.\n *\n * `eventTypes` {object}\n * Optional, plugins that fire events must publish a mapping of registration\n * names that are used to register listeners. Values of this mapping must\n * be objects that contain `registrationName` or `phasedRegistrationNames`.\n *\n * `executeDispatch` {function(object, function, string)}\n * Optional, allows plugins to override how an event gets dispatched. By\n * default, the listener is simply invoked.\n *\n * Each plugin that is injected into `EventsPluginHub` is immediately operable.\n *\n * @public\n */\nvar EventPluginHub = {\n\n /**\n * Methods for injecting dependencies.\n */\n injection: {\n\n /**\n * @param {object} InjectedMount\n * @public\n */\n injectMount: EventPluginUtils.injection.injectMount,\n\n /**\n * @param {object} InjectedInstanceHandle\n * @public\n */\n injectInstanceHandle: function (InjectedInstanceHandle) {\n InstanceHandle = InjectedInstanceHandle;\n if (process.env.NODE_ENV !== 'production') {\n validateInstanceHandle();\n }\n },\n\n getInstanceHandle: function () {\n if (process.env.NODE_ENV !== 'production') {\n validateInstanceHandle();\n }\n return InstanceHandle;\n },\n\n /**\n * @param {array} InjectedEventPluginOrder\n * @public\n */\n injectEventPluginOrder: EventPluginRegistry.injectEventPluginOrder,\n\n /**\n * @param {object} injectedNamesToPlugins Map from names to plugin modules.\n */\n injectEventPluginsByName: EventPluginRegistry.injectEventPluginsByName\n\n },\n\n eventNameDispatchConfigs: EventPluginRegistry.eventNameDispatchConfigs,\n\n registrationNameModules: EventPluginRegistry.registrationNameModules,\n\n /**\n * Stores `listener` at `listenerBank[registrationName][id]`. Is idempotent.\n *\n * @param {string} id ID of the DOM element.\n * @param {string} registrationName Name of listener (e.g. `onClick`).\n * @param {?function} listener The callback to store.\n */\n putListener: function (id, registrationName, listener) {\n !(typeof listener === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Expected %s listener to be a function, instead got type %s', registrationName, typeof listener) : invariant(false) : undefined;\n\n var bankForRegistrationName = listenerBank[registrationName] || (listenerBank[registrationName] = {});\n bankForRegistrationName[id] = listener;\n\n var PluginModule = EventPluginRegistry.registrationNameModules[registrationName];\n if (PluginModule && PluginModule.didPutListener) {\n PluginModule.didPutListener(id, registrationName, listener);\n }\n },\n\n /**\n * @param {string} id ID of the DOM element.\n * @param {string} registrationName Name of listener (e.g. `onClick`).\n * @return {?function} The stored callback.\n */\n getListener: function (id, registrationName) {\n var bankForRegistrationName = listenerBank[registrationName];\n return bankForRegistrationName && bankForRegistrationName[id];\n },\n\n /**\n * Deletes a listener from the registration bank.\n *\n * @param {string} id ID of the DOM element.\n * @param {string} registrationName Name of listener (e.g. `onClick`).\n */\n deleteListener: function (id, registrationName) {\n var PluginModule = EventPluginRegistry.registrationNameModules[registrationName];\n if (PluginModule && PluginModule.willDeleteListener) {\n PluginModule.willDeleteListener(id, registrationName);\n }\n\n var bankForRegistrationName = listenerBank[registrationName];\n // TODO: This should never be null -- when is it?\n if (bankForRegistrationName) {\n delete bankForRegistrationName[id];\n }\n },\n\n /**\n * Deletes all listeners for the DOM element with the supplied ID.\n *\n * @param {string} id ID of the DOM element.\n */\n deleteAllListeners: function (id) {\n for (var registrationName in listenerBank) {\n if (!listenerBank[registrationName][id]) {\n continue;\n }\n\n var PluginModule = EventPluginRegistry.registrationNameModules[registrationName];\n if (PluginModule && PluginModule.willDeleteListener) {\n PluginModule.willDeleteListener(id, registrationName);\n }\n\n delete listenerBank[registrationName][id];\n }\n },\n\n /**\n * Allows registered plugins an opportunity to extract events from top-level\n * native browser events.\n *\n * @param {string} topLevelType Record from `EventConstants`.\n * @param {DOMEventTarget} topLevelTarget The listening component root node.\n * @param {string} topLevelTargetID ID of `topLevelTarget`.\n * @param {object} nativeEvent Native browser event.\n * @return {*} An accumulation of synthetic events.\n * @internal\n */\n extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) {\n var events;\n var plugins = EventPluginRegistry.plugins;\n for (var i = 0; i < plugins.length; i++) {\n // Not every plugin in the ordering may be loaded at runtime.\n var possiblePlugin = plugins[i];\n if (possiblePlugin) {\n var extractedEvents = possiblePlugin.extractEvents(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget);\n if (extractedEvents) {\n events = accumulateInto(events, extractedEvents);\n }\n }\n }\n return events;\n },\n\n /**\n * Enqueues a synthetic event that should be dispatched when\n * `processEventQueue` is invoked.\n *\n * @param {*} events An accumulation of synthetic events.\n * @internal\n */\n enqueueEvents: function (events) {\n if (events) {\n eventQueue = accumulateInto(eventQueue, events);\n }\n },\n\n /**\n * Dispatches all synthetic events on the event queue.\n *\n * @internal\n */\n processEventQueue: function (simulated) {\n // Set `eventQueue` to null before processing it so that we can tell if more\n // events get enqueued while processing.\n var processingEventQueue = eventQueue;\n eventQueue = null;\n if (simulated) {\n forEachAccumulated(processingEventQueue, executeDispatchesAndReleaseSimulated);\n } else {\n forEachAccumulated(processingEventQueue, executeDispatchesAndReleaseTopLevel);\n }\n !!eventQueue ? process.env.NODE_ENV !== 'production' ? invariant(false, 'processEventQueue(): Additional events were enqueued while processing ' + 'an event queue. Support for this has not yet been implemented.') : invariant(false) : undefined;\n // This would be a good time to rethrow if any of the event handlers threw.\n ReactErrorUtils.rethrowCaughtError();\n },\n\n /**\n * These are needed for tests only. Do not use!\n */\n __purge: function () {\n listenerBank = {};\n },\n\n __getListenerBank: function () {\n return listenerBank;\n }\n\n};\n\nmodule.exports = EventPluginHub;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/EventPluginHub.js\n ** module id = 30\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule EventPluginRegistry\n * @typechecks static-only\n */\n\n'use strict';\n\nvar invariant = require('fbjs/lib/invariant');\n\n/**\n * Injectable ordering of event plugins.\n */\nvar EventPluginOrder = null;\n\n/**\n * Injectable mapping from names to event plugin modules.\n */\nvar namesToPlugins = {};\n\n/**\n * Recomputes the plugin list using the injected plugins and plugin ordering.\n *\n * @private\n */\nfunction recomputePluginOrdering() {\n if (!EventPluginOrder) {\n // Wait until an `EventPluginOrder` is injected.\n return;\n }\n for (var pluginName in namesToPlugins) {\n var PluginModule = namesToPlugins[pluginName];\n var pluginIndex = EventPluginOrder.indexOf(pluginName);\n !(pluginIndex > -1) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginRegistry: Cannot inject event plugins that do not exist in ' + 'the plugin ordering, `%s`.', pluginName) : invariant(false) : undefined;\n if (EventPluginRegistry.plugins[pluginIndex]) {\n continue;\n }\n !PluginModule.extractEvents ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginRegistry: Event plugins must implement an `extractEvents` ' + 'method, but `%s` does not.', pluginName) : invariant(false) : undefined;\n EventPluginRegistry.plugins[pluginIndex] = PluginModule;\n var publishedEvents = PluginModule.eventTypes;\n for (var eventName in publishedEvents) {\n !publishEventForPlugin(publishedEvents[eventName], PluginModule, eventName) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginRegistry: Failed to publish event `%s` for plugin `%s`.', eventName, pluginName) : invariant(false) : undefined;\n }\n }\n}\n\n/**\n * Publishes an event so that it can be dispatched by the supplied plugin.\n *\n * @param {object} dispatchConfig Dispatch configuration for the event.\n * @param {object} PluginModule Plugin publishing the event.\n * @return {boolean} True if the event was successfully published.\n * @private\n */\nfunction publishEventForPlugin(dispatchConfig, PluginModule, eventName) {\n !!EventPluginRegistry.eventNameDispatchConfigs.hasOwnProperty(eventName) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginHub: More than one plugin attempted to publish the same ' + 'event name, `%s`.', eventName) : invariant(false) : undefined;\n EventPluginRegistry.eventNameDispatchConfigs[eventName] = dispatchConfig;\n\n var phasedRegistrationNames = dispatchConfig.phasedRegistrationNames;\n if (phasedRegistrationNames) {\n for (var phaseName in phasedRegistrationNames) {\n if (phasedRegistrationNames.hasOwnProperty(phaseName)) {\n var phasedRegistrationName = phasedRegistrationNames[phaseName];\n publishRegistrationName(phasedRegistrationName, PluginModule, eventName);\n }\n }\n return true;\n } else if (dispatchConfig.registrationName) {\n publishRegistrationName(dispatchConfig.registrationName, PluginModule, eventName);\n return true;\n }\n return false;\n}\n\n/**\n * Publishes a registration name that is used to identify dispatched events and\n * can be used with `EventPluginHub.putListener` to register listeners.\n *\n * @param {string} registrationName Registration name to add.\n * @param {object} PluginModule Plugin publishing the event.\n * @private\n */\nfunction publishRegistrationName(registrationName, PluginModule, eventName) {\n !!EventPluginRegistry.registrationNameModules[registrationName] ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginHub: More than one plugin attempted to publish the same ' + 'registration name, `%s`.', registrationName) : invariant(false) : undefined;\n EventPluginRegistry.registrationNameModules[registrationName] = PluginModule;\n EventPluginRegistry.registrationNameDependencies[registrationName] = PluginModule.eventTypes[eventName].dependencies;\n}\n\n/**\n * Registers plugins so that they can extract and dispatch events.\n *\n * @see {EventPluginHub}\n */\nvar EventPluginRegistry = {\n\n /**\n * Ordered list of injected plugins.\n */\n plugins: [],\n\n /**\n * Mapping from event name to dispatch config\n */\n eventNameDispatchConfigs: {},\n\n /**\n * Mapping from registration name to plugin module\n */\n registrationNameModules: {},\n\n /**\n * Mapping from registration name to event name\n */\n registrationNameDependencies: {},\n\n /**\n * Injects an ordering of plugins (by plugin name). This allows the ordering\n * to be decoupled from injection of the actual plugins so that ordering is\n * always deterministic regardless of packaging, on-the-fly injection, etc.\n *\n * @param {array} InjectedEventPluginOrder\n * @internal\n * @see {EventPluginHub.injection.injectEventPluginOrder}\n */\n injectEventPluginOrder: function (InjectedEventPluginOrder) {\n !!EventPluginOrder ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginRegistry: Cannot inject event plugin ordering more than ' + 'once. You are likely trying to load more than one copy of React.') : invariant(false) : undefined;\n // Clone the ordering so it cannot be dynamically mutated.\n EventPluginOrder = Array.prototype.slice.call(InjectedEventPluginOrder);\n recomputePluginOrdering();\n },\n\n /**\n * Injects plugins to be used by `EventPluginHub`. The plugin names must be\n * in the ordering injected by `injectEventPluginOrder`.\n *\n * Plugins can be injected as part of page initialization or on-the-fly.\n *\n * @param {object} injectedNamesToPlugins Map from names to plugin modules.\n * @internal\n * @see {EventPluginHub.injection.injectEventPluginsByName}\n */\n injectEventPluginsByName: function (injectedNamesToPlugins) {\n var isOrderingDirty = false;\n for (var pluginName in injectedNamesToPlugins) {\n if (!injectedNamesToPlugins.hasOwnProperty(pluginName)) {\n continue;\n }\n var PluginModule = injectedNamesToPlugins[pluginName];\n if (!namesToPlugins.hasOwnProperty(pluginName) || namesToPlugins[pluginName] !== PluginModule) {\n !!namesToPlugins[pluginName] ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginRegistry: Cannot inject two different event plugins ' + 'using the same name, `%s`.', pluginName) : invariant(false) : undefined;\n namesToPlugins[pluginName] = PluginModule;\n isOrderingDirty = true;\n }\n }\n if (isOrderingDirty) {\n recomputePluginOrdering();\n }\n },\n\n /**\n * Looks up the plugin for the supplied event.\n *\n * @param {object} event A synthetic event.\n * @return {?object} The plugin that created the supplied event.\n * @internal\n */\n getPluginModuleForEvent: function (event) {\n var dispatchConfig = event.dispatchConfig;\n if (dispatchConfig.registrationName) {\n return EventPluginRegistry.registrationNameModules[dispatchConfig.registrationName] || null;\n }\n for (var phase in dispatchConfig.phasedRegistrationNames) {\n if (!dispatchConfig.phasedRegistrationNames.hasOwnProperty(phase)) {\n continue;\n }\n var PluginModule = EventPluginRegistry.registrationNameModules[dispatchConfig.phasedRegistrationNames[phase]];\n if (PluginModule) {\n return PluginModule;\n }\n }\n return null;\n },\n\n /**\n * Exposed for unit testing.\n * @private\n */\n _resetEventPlugins: function () {\n EventPluginOrder = null;\n for (var pluginName in namesToPlugins) {\n if (namesToPlugins.hasOwnProperty(pluginName)) {\n delete namesToPlugins[pluginName];\n }\n }\n EventPluginRegistry.plugins.length = 0;\n\n var eventNameDispatchConfigs = EventPluginRegistry.eventNameDispatchConfigs;\n for (var eventName in eventNameDispatchConfigs) {\n if (eventNameDispatchConfigs.hasOwnProperty(eventName)) {\n delete eventNameDispatchConfigs[eventName];\n }\n }\n\n var registrationNameModules = EventPluginRegistry.registrationNameModules;\n for (var registrationName in registrationNameModules) {\n if (registrationNameModules.hasOwnProperty(registrationName)) {\n delete registrationNameModules[registrationName];\n }\n }\n }\n\n};\n\nmodule.exports = EventPluginRegistry;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/EventPluginRegistry.js\n ** module id = 31\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule EventPluginUtils\n */\n\n'use strict';\n\nvar EventConstants = require('./EventConstants');\nvar ReactErrorUtils = require('./ReactErrorUtils');\n\nvar invariant = require('fbjs/lib/invariant');\nvar warning = require('fbjs/lib/warning');\n\n/**\n * Injected dependencies:\n */\n\n/**\n * - `Mount`: [required] Module that can convert between React dom IDs and\n * actual node references.\n */\nvar injection = {\n Mount: null,\n injectMount: function (InjectedMount) {\n injection.Mount = InjectedMount;\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(InjectedMount && InjectedMount.getNode && InjectedMount.getID, 'EventPluginUtils.injection.injectMount(...): Injected Mount ' + 'module is missing getNode or getID.') : undefined;\n }\n }\n};\n\nvar topLevelTypes = EventConstants.topLevelTypes;\n\nfunction isEndish(topLevelType) {\n return topLevelType === topLevelTypes.topMouseUp || topLevelType === topLevelTypes.topTouchEnd || topLevelType === topLevelTypes.topTouchCancel;\n}\n\nfunction isMoveish(topLevelType) {\n return topLevelType === topLevelTypes.topMouseMove || topLevelType === topLevelTypes.topTouchMove;\n}\nfunction isStartish(topLevelType) {\n return topLevelType === topLevelTypes.topMouseDown || topLevelType === topLevelTypes.topTouchStart;\n}\n\nvar validateEventDispatches;\nif (process.env.NODE_ENV !== 'production') {\n validateEventDispatches = function (event) {\n var dispatchListeners = event._dispatchListeners;\n var dispatchIDs = event._dispatchIDs;\n\n var listenersIsArr = Array.isArray(dispatchListeners);\n var idsIsArr = Array.isArray(dispatchIDs);\n var IDsLen = idsIsArr ? dispatchIDs.length : dispatchIDs ? 1 : 0;\n var listenersLen = listenersIsArr ? dispatchListeners.length : dispatchListeners ? 1 : 0;\n\n process.env.NODE_ENV !== 'production' ? warning(idsIsArr === listenersIsArr && IDsLen === listenersLen, 'EventPluginUtils: Invalid `event`.') : undefined;\n };\n}\n\n/**\n * Dispatch the event to the listener.\n * @param {SyntheticEvent} event SyntheticEvent to handle\n * @param {boolean} simulated If the event is simulated (changes exn behavior)\n * @param {function} listener Application-level callback\n * @param {string} domID DOM id to pass to the callback.\n */\nfunction executeDispatch(event, simulated, listener, domID) {\n var type = event.type || 'unknown-event';\n event.currentTarget = injection.Mount.getNode(domID);\n if (simulated) {\n ReactErrorUtils.invokeGuardedCallbackWithCatch(type, listener, event, domID);\n } else {\n ReactErrorUtils.invokeGuardedCallback(type, listener, event, domID);\n }\n event.currentTarget = null;\n}\n\n/**\n * Standard/simple iteration through an event's collected dispatches.\n */\nfunction executeDispatchesInOrder(event, simulated) {\n var dispatchListeners = event._dispatchListeners;\n var dispatchIDs = event._dispatchIDs;\n if (process.env.NODE_ENV !== 'production') {\n validateEventDispatches(event);\n }\n if (Array.isArray(dispatchListeners)) {\n for (var i = 0; i < dispatchListeners.length; i++) {\n if (event.isPropagationStopped()) {\n break;\n }\n // Listeners and IDs are two parallel arrays that are always in sync.\n executeDispatch(event, simulated, dispatchListeners[i], dispatchIDs[i]);\n }\n } else if (dispatchListeners) {\n executeDispatch(event, simulated, dispatchListeners, dispatchIDs);\n }\n event._dispatchListeners = null;\n event._dispatchIDs = null;\n}\n\n/**\n * Standard/simple iteration through an event's collected dispatches, but stops\n * at the first dispatch execution returning true, and returns that id.\n *\n * @return {?string} id of the first dispatch execution who's listener returns\n * true, or null if no listener returned true.\n */\nfunction executeDispatchesInOrderStopAtTrueImpl(event) {\n var dispatchListeners = event._dispatchListeners;\n var dispatchIDs = event._dispatchIDs;\n if (process.env.NODE_ENV !== 'production') {\n validateEventDispatches(event);\n }\n if (Array.isArray(dispatchListeners)) {\n for (var i = 0; i < dispatchListeners.length; i++) {\n if (event.isPropagationStopped()) {\n break;\n }\n // Listeners and IDs are two parallel arrays that are always in sync.\n if (dispatchListeners[i](event, dispatchIDs[i])) {\n return dispatchIDs[i];\n }\n }\n } else if (dispatchListeners) {\n if (dispatchListeners(event, dispatchIDs)) {\n return dispatchIDs;\n }\n }\n return null;\n}\n\n/**\n * @see executeDispatchesInOrderStopAtTrueImpl\n */\nfunction executeDispatchesInOrderStopAtTrue(event) {\n var ret = executeDispatchesInOrderStopAtTrueImpl(event);\n event._dispatchIDs = null;\n event._dispatchListeners = null;\n return ret;\n}\n\n/**\n * Execution of a \"direct\" dispatch - there must be at most one dispatch\n * accumulated on the event or it is considered an error. It doesn't really make\n * sense for an event with multiple dispatches (bubbled) to keep track of the\n * return values at each dispatch execution, but it does tend to make sense when\n * dealing with \"direct\" dispatches.\n *\n * @return {*} The return value of executing the single dispatch.\n */\nfunction executeDirectDispatch(event) {\n if (process.env.NODE_ENV !== 'production') {\n validateEventDispatches(event);\n }\n var dispatchListener = event._dispatchListeners;\n var dispatchID = event._dispatchIDs;\n !!Array.isArray(dispatchListener) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'executeDirectDispatch(...): Invalid `event`.') : invariant(false) : undefined;\n var res = dispatchListener ? dispatchListener(event, dispatchID) : null;\n event._dispatchListeners = null;\n event._dispatchIDs = null;\n return res;\n}\n\n/**\n * @param {SyntheticEvent} event\n * @return {boolean} True iff number of dispatches accumulated is greater than 0.\n */\nfunction hasDispatches(event) {\n return !!event._dispatchListeners;\n}\n\n/**\n * General utilities that are useful in creating custom Event Plugins.\n */\nvar EventPluginUtils = {\n isEndish: isEndish,\n isMoveish: isMoveish,\n isStartish: isStartish,\n\n executeDirectDispatch: executeDirectDispatch,\n executeDispatchesInOrder: executeDispatchesInOrder,\n executeDispatchesInOrderStopAtTrue: executeDispatchesInOrderStopAtTrue,\n hasDispatches: hasDispatches,\n\n getNode: function (id) {\n return injection.Mount.getNode(id);\n },\n getID: function (node) {\n return injection.Mount.getID(node);\n },\n\n injection: injection\n};\n\nmodule.exports = EventPluginUtils;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/EventPluginUtils.js\n ** module id = 32\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactErrorUtils\n * @typechecks\n */\n\n'use strict';\n\nvar caughtError = null;\n\n/**\n * Call a function while guarding against errors that happens within it.\n *\n * @param {?String} name of the guard to use for logging or debugging\n * @param {Function} func The function to invoke\n * @param {*} a First argument\n * @param {*} b Second argument\n */\nfunction invokeGuardedCallback(name, func, a, b) {\n try {\n return func(a, b);\n } catch (x) {\n if (caughtError === null) {\n caughtError = x;\n }\n return undefined;\n }\n}\n\nvar ReactErrorUtils = {\n invokeGuardedCallback: invokeGuardedCallback,\n\n /**\n * Invoked by ReactTestUtils.Simulate so that any errors thrown by the event\n * handler are sure to be rethrown by rethrowCaughtError.\n */\n invokeGuardedCallbackWithCatch: invokeGuardedCallback,\n\n /**\n * During execution of guarded functions we will capture the first error which\n * we will rethrow to be handled by the top level error handler.\n */\n rethrowCaughtError: function () {\n if (caughtError) {\n var error = caughtError;\n caughtError = null;\n throw error;\n }\n }\n};\n\nif (process.env.NODE_ENV !== 'production') {\n /**\n * To help development we can get better devtools integration by simulating a\n * real browser event.\n */\n if (typeof window !== 'undefined' && typeof window.dispatchEvent === 'function' && typeof document !== 'undefined' && typeof document.createEvent === 'function') {\n var fakeNode = document.createElement('react');\n ReactErrorUtils.invokeGuardedCallback = function (name, func, a, b) {\n var boundFunc = func.bind(null, a, b);\n var evtType = 'react-' + name;\n fakeNode.addEventListener(evtType, boundFunc, false);\n var evt = document.createEvent('Event');\n evt.initEvent(evtType, false, false);\n fakeNode.dispatchEvent(evt);\n fakeNode.removeEventListener(evtType, boundFunc, false);\n };\n }\n}\n\nmodule.exports = ReactErrorUtils;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactErrorUtils.js\n ** module id = 33\n ** module chunks = 0 1\n **/","/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule accumulateInto\n */\n\n'use strict';\n\nvar invariant = require('fbjs/lib/invariant');\n\n/**\n *\n * Accumulates items that must not be null or undefined into the first one. This\n * is used to conserve memory by avoiding array allocations, and thus sacrifices\n * API cleanness. Since `current` can be null before being passed in and not\n * null after this function, make sure to assign it back to `current`:\n *\n * `a = accumulateInto(a, b);`\n *\n * This API should be sparingly used. Try `accumulate` for something cleaner.\n *\n * @return {*|array<*>} An accumulation of items.\n */\n\nfunction accumulateInto(current, next) {\n !(next != null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'accumulateInto(...): Accumulated items must not be null or undefined.') : invariant(false) : undefined;\n if (current == null) {\n return next;\n }\n\n // Both are not empty. Warning: Never call x.concat(y) when you are not\n // certain that x is an Array (x could be a string with concat method).\n var currentIsArray = Array.isArray(current);\n var nextIsArray = Array.isArray(next);\n\n if (currentIsArray && nextIsArray) {\n current.push.apply(current, next);\n return current;\n }\n\n if (currentIsArray) {\n current.push(next);\n return current;\n }\n\n if (nextIsArray) {\n // A bit too dangerous to mutate `next`.\n return [current].concat(next);\n }\n\n return [current, next];\n}\n\nmodule.exports = accumulateInto;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/accumulateInto.js\n ** module id = 34\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule forEachAccumulated\n */\n\n'use strict';\n\n/**\n * @param {array} arr an \"accumulation\" of items which is either an Array or\n * a single item. Useful when paired with the `accumulate` module. This is a\n * simple utility that allows us to reason about a collection of items, but\n * handling the case when there is exactly one item (and we do not need to\n * allocate an array).\n */\nvar forEachAccumulated = function (arr, cb, scope) {\n if (Array.isArray(arr)) {\n arr.forEach(cb, scope);\n } else if (arr) {\n cb.call(scope, arr);\n }\n};\n\nmodule.exports = forEachAccumulated;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/forEachAccumulated.js\n ** module id = 35\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactEventEmitterMixin\n */\n\n'use strict';\n\nvar EventPluginHub = require('./EventPluginHub');\n\nfunction runEventQueueInBatch(events) {\n EventPluginHub.enqueueEvents(events);\n EventPluginHub.processEventQueue(false);\n}\n\nvar ReactEventEmitterMixin = {\n\n /**\n * Streams a fired top-level event to `EventPluginHub` where plugins have the\n * opportunity to create `ReactEvent`s to be dispatched.\n *\n * @param {string} topLevelType Record from `EventConstants`.\n * @param {object} topLevelTarget The listening component root node.\n * @param {string} topLevelTargetID ID of `topLevelTarget`.\n * @param {object} nativeEvent Native environment event.\n */\n handleTopLevel: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) {\n var events = EventPluginHub.extractEvents(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget);\n runEventQueueInBatch(events);\n }\n};\n\nmodule.exports = ReactEventEmitterMixin;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactEventEmitterMixin.js\n ** module id = 36\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ViewportMetrics\n */\n\n'use strict';\n\nvar ViewportMetrics = {\n\n currentScrollLeft: 0,\n\n currentScrollTop: 0,\n\n refreshScrollValues: function (scrollPosition) {\n ViewportMetrics.currentScrollLeft = scrollPosition.x;\n ViewportMetrics.currentScrollTop = scrollPosition.y;\n }\n\n};\n\nmodule.exports = ViewportMetrics;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ViewportMetrics.js\n ** module id = 37\n ** module chunks = 0 1\n **/","/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule Object.assign\n */\n\n// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.assign\n\n'use strict';\n\nfunction assign(target, sources) {\n if (target == null) {\n throw new TypeError('Object.assign target cannot be null or undefined');\n }\n\n var to = Object(target);\n var hasOwnProperty = Object.prototype.hasOwnProperty;\n\n for (var nextIndex = 1; nextIndex < arguments.length; nextIndex++) {\n var nextSource = arguments[nextIndex];\n if (nextSource == null) {\n continue;\n }\n\n var from = Object(nextSource);\n\n // We don't currently support accessors nor proxies. Therefore this\n // copy cannot throw. If we ever supported this then we must handle\n // exceptions and side-effects. We don't support symbols so they won't\n // be transferred.\n\n for (var key in from) {\n if (hasOwnProperty.call(from, key)) {\n to[key] = from[key];\n }\n }\n }\n\n return to;\n}\n\nmodule.exports = assign;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/Object.assign.js\n ** module id = 38\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule isEventSupported\n */\n\n'use strict';\n\nvar ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');\n\nvar useHasFeature;\nif (ExecutionEnvironment.canUseDOM) {\n useHasFeature = document.implementation && document.implementation.hasFeature &&\n // always returns true in newer browsers as per the standard.\n // @see http://dom.spec.whatwg.org/#dom-domimplementation-hasfeature\n document.implementation.hasFeature('', '') !== true;\n}\n\n/**\n * Checks if an event is supported in the current execution environment.\n *\n * NOTE: This will not work correctly for non-generic events such as `change`,\n * `reset`, `load`, `error`, and `select`.\n *\n * Borrows from Modernizr.\n *\n * @param {string} eventNameSuffix Event name, e.g. \"click\".\n * @param {?boolean} capture Check if the capture phase is supported.\n * @return {boolean} True if the event is supported.\n * @internal\n * @license Modernizr 3.0.0pre (Custom Build) | MIT\n */\nfunction isEventSupported(eventNameSuffix, capture) {\n if (!ExecutionEnvironment.canUseDOM || capture && !('addEventListener' in document)) {\n return false;\n }\n\n var eventName = 'on' + eventNameSuffix;\n var isSupported = (eventName in document);\n\n if (!isSupported) {\n var element = document.createElement('div');\n element.setAttribute(eventName, 'return;');\n isSupported = typeof element[eventName] === 'function';\n }\n\n if (!isSupported && useHasFeature && eventNameSuffix === 'wheel') {\n // This is the only way to test support for the `wheel` event in IE9+.\n isSupported = document.implementation.hasFeature('Events.wheel', '3.0');\n }\n\n return isSupported;\n}\n\nmodule.exports = isEventSupported;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/isEventSupported.js\n ** module id = 39\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactDOMFeatureFlags\n */\n\n'use strict';\n\nvar ReactDOMFeatureFlags = {\n useCreateElement: false\n};\n\nmodule.exports = ReactDOMFeatureFlags;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactDOMFeatureFlags.js\n ** module id = 40\n ** module chunks = 0 1\n **/","/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactElement\n */\n\n'use strict';\n\nvar ReactCurrentOwner = require('./ReactCurrentOwner');\n\nvar assign = require('./Object.assign');\nvar canDefineProperty = require('./canDefineProperty');\n\n// The Symbol used to tag the ReactElement type. If there is no native Symbol\n// nor polyfill, then a plain number is used for performance.\nvar REACT_ELEMENT_TYPE = typeof Symbol === 'function' && Symbol['for'] && Symbol['for']('react.element') || 0xeac7;\n\nvar RESERVED_PROPS = {\n key: true,\n ref: true,\n __self: true,\n __source: true\n};\n\n/**\n * Base constructor for all React elements. This is only used to make this\n * work with a dynamic instanceof check. Nothing should live on this prototype.\n *\n * @param {*} type\n * @param {*} key\n * @param {string|object} ref\n * @param {*} self A *temporary* helper to detect places where `this` is\n * different from the `owner` when React.createElement is called, so that we\n * can warn. We want to get rid of owner and replace string `ref`s with arrow\n * functions, and as long as `this` and owner are the same, there will be no\n * change in behavior.\n * @param {*} source An annotation object (added by a transpiler or otherwise)\n * indicating filename, line number, and/or other information.\n * @param {*} owner\n * @param {*} props\n * @internal\n */\nvar ReactElement = function (type, key, ref, self, source, owner, props) {\n var element = {\n // This tag allow us to uniquely identify this as a React Element\n $$typeof: REACT_ELEMENT_TYPE,\n\n // Built-in properties that belong on the element\n type: type,\n key: key,\n ref: ref,\n props: props,\n\n // Record the component responsible for creating this element.\n _owner: owner\n };\n\n if (process.env.NODE_ENV !== 'production') {\n // The validation flag is currently mutative. We put it on\n // an external backing store so that we can freeze the whole object.\n // This can be replaced with a WeakMap once they are implemented in\n // commonly used development environments.\n element._store = {};\n\n // To make comparing ReactElements easier for testing purposes, we make\n // the validation flag non-enumerable (where possible, which should\n // include every environment we run tests in), so the test framework\n // ignores it.\n if (canDefineProperty) {\n Object.defineProperty(element._store, 'validated', {\n configurable: false,\n enumerable: false,\n writable: true,\n value: false\n });\n // self and source are DEV only properties.\n Object.defineProperty(element, '_self', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: self\n });\n // Two elements created in two different places should be considered\n // equal for testing purposes and therefore we hide it from enumeration.\n Object.defineProperty(element, '_source', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: source\n });\n } else {\n element._store.validated = false;\n element._self = self;\n element._source = source;\n }\n Object.freeze(element.props);\n Object.freeze(element);\n }\n\n return element;\n};\n\nReactElement.createElement = function (type, config, children) {\n var propName;\n\n // Reserved names are extracted\n var props = {};\n\n var key = null;\n var ref = null;\n var self = null;\n var source = null;\n\n if (config != null) {\n ref = config.ref === undefined ? null : config.ref;\n key = config.key === undefined ? null : '' + config.key;\n self = config.__self === undefined ? null : config.__self;\n source = config.__source === undefined ? null : config.__source;\n // Remaining properties are added to a new props object\n for (propName in config) {\n if (config.hasOwnProperty(propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n props[propName] = config[propName];\n }\n }\n }\n\n // Children can be more than one argument, and those are transferred onto\n // the newly allocated props object.\n var childrenLength = arguments.length - 2;\n if (childrenLength === 1) {\n props.children = children;\n } else if (childrenLength > 1) {\n var childArray = Array(childrenLength);\n for (var i = 0; i < childrenLength; i++) {\n childArray[i] = arguments[i + 2];\n }\n props.children = childArray;\n }\n\n // Resolve default props\n if (type && type.defaultProps) {\n var defaultProps = type.defaultProps;\n for (propName in defaultProps) {\n if (typeof props[propName] === 'undefined') {\n props[propName] = defaultProps[propName];\n }\n }\n }\n\n return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);\n};\n\nReactElement.createFactory = function (type) {\n var factory = ReactElement.createElement.bind(null, type);\n // Expose the type on the factory and the prototype so that it can be\n // easily accessed on elements. E.g. `<Foo />.type === Foo`.\n // This should not be named `constructor` since this may not be the function\n // that created the element, and it may not even be a constructor.\n // Legacy hook TODO: Warn if this is accessed\n factory.type = type;\n return factory;\n};\n\nReactElement.cloneAndReplaceKey = function (oldElement, newKey) {\n var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props);\n\n return newElement;\n};\n\nReactElement.cloneAndReplaceProps = function (oldElement, newProps) {\n var newElement = ReactElement(oldElement.type, oldElement.key, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, newProps);\n\n if (process.env.NODE_ENV !== 'production') {\n // If the key on the original is valid, then the clone is valid\n newElement._store.validated = oldElement._store.validated;\n }\n\n return newElement;\n};\n\nReactElement.cloneElement = function (element, config, children) {\n var propName;\n\n // Original props are copied\n var props = assign({}, element.props);\n\n // Reserved names are extracted\n var key = element.key;\n var ref = element.ref;\n // Self is preserved since the owner is preserved.\n var self = element._self;\n // Source is preserved since cloneElement is unlikely to be targeted by a\n // transpiler, and the original source is probably a better indicator of the\n // true owner.\n var source = element._source;\n\n // Owner will be preserved, unless ref is overridden\n var owner = element._owner;\n\n if (config != null) {\n if (config.ref !== undefined) {\n // Silently steal the ref from the parent.\n ref = config.ref;\n owner = ReactCurrentOwner.current;\n }\n if (config.key !== undefined) {\n key = '' + config.key;\n }\n // Remaining properties override existing props\n for (propName in config) {\n if (config.hasOwnProperty(propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n props[propName] = config[propName];\n }\n }\n }\n\n // Children can be more than one argument, and those are transferred onto\n // the newly allocated props object.\n var childrenLength = arguments.length - 2;\n if (childrenLength === 1) {\n props.children = children;\n } else if (childrenLength > 1) {\n var childArray = Array(childrenLength);\n for (var i = 0; i < childrenLength; i++) {\n childArray[i] = arguments[i + 2];\n }\n props.children = childArray;\n }\n\n return ReactElement(element.type, key, ref, self, source, owner, props);\n};\n\n/**\n * @param {?object} object\n * @return {boolean} True if `object` is a valid component.\n * @final\n */\nReactElement.isValidElement = function (object) {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n};\n\nmodule.exports = ReactElement;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactElement.js\n ** module id = 41\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule canDefineProperty\n */\n\n'use strict';\n\nvar canDefineProperty = false;\nif (process.env.NODE_ENV !== 'production') {\n try {\n Object.defineProperty({}, 'x', { get: function () {} });\n canDefineProperty = true;\n } catch (x) {\n // IE will fail on defineProperty\n }\n}\n\nmodule.exports = canDefineProperty;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/canDefineProperty.js\n ** module id = 42\n ** module chunks = 0 1\n **/","/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactEmptyComponentRegistry\n */\n\n'use strict';\n\n// This registry keeps track of the React IDs of the components that rendered to\n// `null` (in reality a placeholder such as `noscript`)\nvar nullComponentIDsRegistry = {};\n\n/**\n * @param {string} id Component's `_rootNodeID`.\n * @return {boolean} True if the component is rendered to null.\n */\nfunction isNullComponentID(id) {\n return !!nullComponentIDsRegistry[id];\n}\n\n/**\n * Mark the component as having rendered to null.\n * @param {string} id Component's `_rootNodeID`.\n */\nfunction registerNullComponentID(id) {\n nullComponentIDsRegistry[id] = true;\n}\n\n/**\n * Unmark the component as having rendered to null: it renders to something now.\n * @param {string} id Component's `_rootNodeID`.\n */\nfunction deregisterNullComponentID(id) {\n delete nullComponentIDsRegistry[id];\n}\n\nvar ReactEmptyComponentRegistry = {\n isNullComponentID: isNullComponentID,\n registerNullComponentID: registerNullComponentID,\n deregisterNullComponentID: deregisterNullComponentID\n};\n\nmodule.exports = ReactEmptyComponentRegistry;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactEmptyComponentRegistry.js\n ** module id = 43\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactInstanceHandles\n * @typechecks static-only\n */\n\n'use strict';\n\nvar ReactRootIndex = require('./ReactRootIndex');\n\nvar invariant = require('fbjs/lib/invariant');\n\nvar SEPARATOR = '.';\nvar SEPARATOR_LENGTH = SEPARATOR.length;\n\n/**\n * Maximum depth of traversals before we consider the possibility of a bad ID.\n */\nvar MAX_TREE_DEPTH = 10000;\n\n/**\n * Creates a DOM ID prefix to use when mounting React components.\n *\n * @param {number} index A unique integer\n * @return {string} React root ID.\n * @internal\n */\nfunction getReactRootIDString(index) {\n return SEPARATOR + index.toString(36);\n}\n\n/**\n * Checks if a character in the supplied ID is a separator or the end.\n *\n * @param {string} id A React DOM ID.\n * @param {number} index Index of the character to check.\n * @return {boolean} True if the character is a separator or end of the ID.\n * @private\n */\nfunction isBoundary(id, index) {\n return id.charAt(index) === SEPARATOR || index === id.length;\n}\n\n/**\n * Checks if the supplied string is a valid React DOM ID.\n *\n * @param {string} id A React DOM ID, maybe.\n * @return {boolean} True if the string is a valid React DOM ID.\n * @private\n */\nfunction isValidID(id) {\n return id === '' || id.charAt(0) === SEPARATOR && id.charAt(id.length - 1) !== SEPARATOR;\n}\n\n/**\n * Checks if the first ID is an ancestor of or equal to the second ID.\n *\n * @param {string} ancestorID\n * @param {string} descendantID\n * @return {boolean} True if `ancestorID` is an ancestor of `descendantID`.\n * @internal\n */\nfunction isAncestorIDOf(ancestorID, descendantID) {\n return descendantID.indexOf(ancestorID) === 0 && isBoundary(descendantID, ancestorID.length);\n}\n\n/**\n * Gets the parent ID of the supplied React DOM ID, `id`.\n *\n * @param {string} id ID of a component.\n * @return {string} ID of the parent, or an empty string.\n * @private\n */\nfunction getParentID(id) {\n return id ? id.substr(0, id.lastIndexOf(SEPARATOR)) : '';\n}\n\n/**\n * Gets the next DOM ID on the tree path from the supplied `ancestorID` to the\n * supplied `destinationID`. If they are equal, the ID is returned.\n *\n * @param {string} ancestorID ID of an ancestor node of `destinationID`.\n * @param {string} destinationID ID of the destination node.\n * @return {string} Next ID on the path from `ancestorID` to `destinationID`.\n * @private\n */\nfunction getNextDescendantID(ancestorID, destinationID) {\n !(isValidID(ancestorID) && isValidID(destinationID)) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'getNextDescendantID(%s, %s): Received an invalid React DOM ID.', ancestorID, destinationID) : invariant(false) : undefined;\n !isAncestorIDOf(ancestorID, destinationID) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'getNextDescendantID(...): React has made an invalid assumption about ' + 'the DOM hierarchy. Expected `%s` to be an ancestor of `%s`.', ancestorID, destinationID) : invariant(false) : undefined;\n if (ancestorID === destinationID) {\n return ancestorID;\n }\n // Skip over the ancestor and the immediate separator. Traverse until we hit\n // another separator or we reach the end of `destinationID`.\n var start = ancestorID.length + SEPARATOR_LENGTH;\n var i;\n for (i = start; i < destinationID.length; i++) {\n if (isBoundary(destinationID, i)) {\n break;\n }\n }\n return destinationID.substr(0, i);\n}\n\n/**\n * Gets the nearest common ancestor ID of two IDs.\n *\n * Using this ID scheme, the nearest common ancestor ID is the longest common\n * prefix of the two IDs that immediately preceded a \"marker\" in both strings.\n *\n * @param {string} oneID\n * @param {string} twoID\n * @return {string} Nearest common ancestor ID, or the empty string if none.\n * @private\n */\nfunction getFirstCommonAncestorID(oneID, twoID) {\n var minLength = Math.min(oneID.length, twoID.length);\n if (minLength === 0) {\n return '';\n }\n var lastCommonMarkerIndex = 0;\n // Use `<=` to traverse until the \"EOL\" of the shorter string.\n for (var i = 0; i <= minLength; i++) {\n if (isBoundary(oneID, i) && isBoundary(twoID, i)) {\n lastCommonMarkerIndex = i;\n } else if (oneID.charAt(i) !== twoID.charAt(i)) {\n break;\n }\n }\n var longestCommonID = oneID.substr(0, lastCommonMarkerIndex);\n !isValidID(longestCommonID) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'getFirstCommonAncestorID(%s, %s): Expected a valid React DOM ID: %s', oneID, twoID, longestCommonID) : invariant(false) : undefined;\n return longestCommonID;\n}\n\n/**\n * Traverses the parent path between two IDs (either up or down). The IDs must\n * not be the same, and there must exist a parent path between them. If the\n * callback returns `false`, traversal is stopped.\n *\n * @param {?string} start ID at which to start traversal.\n * @param {?string} stop ID at which to end traversal.\n * @param {function} cb Callback to invoke each ID with.\n * @param {*} arg Argument to invoke the callback with.\n * @param {?boolean} skipFirst Whether or not to skip the first node.\n * @param {?boolean} skipLast Whether or not to skip the last node.\n * @private\n */\nfunction traverseParentPath(start, stop, cb, arg, skipFirst, skipLast) {\n start = start || '';\n stop = stop || '';\n !(start !== stop) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'traverseParentPath(...): Cannot traverse from and to the same ID, `%s`.', start) : invariant(false) : undefined;\n var traverseUp = isAncestorIDOf(stop, start);\n !(traverseUp || isAncestorIDOf(start, stop)) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'traverseParentPath(%s, %s, ...): Cannot traverse from two IDs that do ' + 'not have a parent path.', start, stop) : invariant(false) : undefined;\n // Traverse from `start` to `stop` one depth at a time.\n var depth = 0;\n var traverse = traverseUp ? getParentID : getNextDescendantID;\n for (var id = start;; /* until break */id = traverse(id, stop)) {\n var ret;\n if ((!skipFirst || id !== start) && (!skipLast || id !== stop)) {\n ret = cb(id, traverseUp, arg);\n }\n if (ret === false || id === stop) {\n // Only break //after// visiting `stop`.\n break;\n }\n !(depth++ < MAX_TREE_DEPTH) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'traverseParentPath(%s, %s, ...): Detected an infinite loop while ' + 'traversing the React DOM ID tree. This may be due to malformed IDs: %s', start, stop, id) : invariant(false) : undefined;\n }\n}\n\n/**\n * Manages the IDs assigned to DOM representations of React components. This\n * uses a specific scheme in order to traverse the DOM efficiently (e.g. in\n * order to simulate events).\n *\n * @internal\n */\nvar ReactInstanceHandles = {\n\n /**\n * Constructs a React root ID\n * @return {string} A React root ID.\n */\n createReactRootID: function () {\n return getReactRootIDString(ReactRootIndex.createReactRootIndex());\n },\n\n /**\n * Constructs a React ID by joining a root ID with a name.\n *\n * @param {string} rootID Root ID of a parent component.\n * @param {string} name A component's name (as flattened children).\n * @return {string} A React ID.\n * @internal\n */\n createReactID: function (rootID, name) {\n return rootID + name;\n },\n\n /**\n * Gets the DOM ID of the React component that is the root of the tree that\n * contains the React component with the supplied DOM ID.\n *\n * @param {string} id DOM ID of a React component.\n * @return {?string} DOM ID of the React component that is the root.\n * @internal\n */\n getReactRootIDFromNodeID: function (id) {\n if (id && id.charAt(0) === SEPARATOR && id.length > 1) {\n var index = id.indexOf(SEPARATOR, 1);\n return index > -1 ? id.substr(0, index) : id;\n }\n return null;\n },\n\n /**\n * Traverses the ID hierarchy and invokes the supplied `cb` on any IDs that\n * should would receive a `mouseEnter` or `mouseLeave` event.\n *\n * NOTE: Does not invoke the callback on the nearest common ancestor because\n * nothing \"entered\" or \"left\" that element.\n *\n * @param {string} leaveID ID being left.\n * @param {string} enterID ID being entered.\n * @param {function} cb Callback to invoke on each entered/left ID.\n * @param {*} upArg Argument to invoke the callback with on left IDs.\n * @param {*} downArg Argument to invoke the callback with on entered IDs.\n * @internal\n */\n traverseEnterLeave: function (leaveID, enterID, cb, upArg, downArg) {\n var ancestorID = getFirstCommonAncestorID(leaveID, enterID);\n if (ancestorID !== leaveID) {\n traverseParentPath(leaveID, ancestorID, cb, upArg, false, true);\n }\n if (ancestorID !== enterID) {\n traverseParentPath(ancestorID, enterID, cb, downArg, true, false);\n }\n },\n\n /**\n * Simulates the traversal of a two-phase, capture/bubble event dispatch.\n *\n * NOTE: This traversal happens on IDs without touching the DOM.\n *\n * @param {string} targetID ID of the target node.\n * @param {function} cb Callback to invoke.\n * @param {*} arg Argument to invoke the callback with.\n * @internal\n */\n traverseTwoPhase: function (targetID, cb, arg) {\n if (targetID) {\n traverseParentPath('', targetID, cb, arg, true, false);\n traverseParentPath(targetID, '', cb, arg, false, true);\n }\n },\n\n /**\n * Same as `traverseTwoPhase` but skips the `targetID`.\n */\n traverseTwoPhaseSkipTarget: function (targetID, cb, arg) {\n if (targetID) {\n traverseParentPath('', targetID, cb, arg, true, true);\n traverseParentPath(targetID, '', cb, arg, true, true);\n }\n },\n\n /**\n * Traverse a node ID, calling the supplied `cb` for each ancestor ID. For\n * example, passing `.0.$row-0.1` would result in `cb` getting called\n * with `.0`, `.0.$row-0`, and `.0.$row-0.1`.\n *\n * NOTE: This traversal happens on IDs without touching the DOM.\n *\n * @param {string} targetID ID of the target node.\n * @param {function} cb Callback to invoke.\n * @param {*} arg Argument to invoke the callback with.\n * @internal\n */\n traverseAncestors: function (targetID, cb, arg) {\n traverseParentPath('', targetID, cb, arg, true, false);\n },\n\n getFirstCommonAncestorID: getFirstCommonAncestorID,\n\n /**\n * Exposed for unit testing.\n * @private\n */\n _getNextDescendantID: getNextDescendantID,\n\n isAncestorIDOf: isAncestorIDOf,\n\n SEPARATOR: SEPARATOR\n\n};\n\nmodule.exports = ReactInstanceHandles;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactInstanceHandles.js\n ** module id = 44\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactRootIndex\n * @typechecks\n */\n\n'use strict';\n\nvar ReactRootIndexInjection = {\n /**\n * @param {function} _createReactRootIndex\n */\n injectCreateReactRootIndex: function (_createReactRootIndex) {\n ReactRootIndex.createReactRootIndex = _createReactRootIndex;\n }\n};\n\nvar ReactRootIndex = {\n createReactRootIndex: null,\n injection: ReactRootIndexInjection\n};\n\nmodule.exports = ReactRootIndex;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactRootIndex.js\n ** module id = 45\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactInstanceMap\n */\n\n'use strict';\n\n/**\n * `ReactInstanceMap` maintains a mapping from a public facing stateful\n * instance (key) and the internal representation (value). This allows public\n * methods to accept the user facing instance as an argument and map them back\n * to internal methods.\n */\n\n// TODO: Replace this with ES6: var ReactInstanceMap = new Map();\nvar ReactInstanceMap = {\n\n /**\n * This API should be called `delete` but we'd have to make sure to always\n * transform these to strings for IE support. When this transform is fully\n * supported we can rename it.\n */\n remove: function (key) {\n key._reactInternalInstance = undefined;\n },\n\n get: function (key) {\n return key._reactInternalInstance;\n },\n\n has: function (key) {\n return key._reactInternalInstance !== undefined;\n },\n\n set: function (key, value) {\n key._reactInternalInstance = value;\n }\n\n};\n\nmodule.exports = ReactInstanceMap;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactInstanceMap.js\n ** module id = 46\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactMarkupChecksum\n */\n\n'use strict';\n\nvar adler32 = require('./adler32');\n\nvar TAG_END = /\\/?>/;\n\nvar ReactMarkupChecksum = {\n CHECKSUM_ATTR_NAME: 'data-react-checksum',\n\n /**\n * @param {string} markup Markup string\n * @return {string} Markup string with checksum attribute attached\n */\n addChecksumToMarkup: function (markup) {\n var checksum = adler32(markup);\n\n // Add checksum (handle both parent tags and self-closing tags)\n return markup.replace(TAG_END, ' ' + ReactMarkupChecksum.CHECKSUM_ATTR_NAME + '=\"' + checksum + '\"$&');\n },\n\n /**\n * @param {string} markup to use\n * @param {DOMElement} element root React element\n * @returns {boolean} whether or not the markup is the same\n */\n canReuseMarkup: function (markup, element) {\n var existingChecksum = element.getAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME);\n existingChecksum = existingChecksum && parseInt(existingChecksum, 10);\n var markupChecksum = adler32(markup);\n return markupChecksum === existingChecksum;\n }\n};\n\nmodule.exports = ReactMarkupChecksum;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactMarkupChecksum.js\n ** module id = 47\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule adler32\n */\n\n'use strict';\n\nvar MOD = 65521;\n\n// adler32 is not cryptographically strong, and is only used to sanity check that\n// markup generated on the server matches the markup generated on the client.\n// This implementation (a modified version of the SheetJS version) has been optimized\n// for our use case, at the expense of conforming to the adler32 specification\n// for non-ascii inputs.\nfunction adler32(data) {\n var a = 1;\n var b = 0;\n var i = 0;\n var l = data.length;\n var m = l & ~0x3;\n while (i < m) {\n for (; i < Math.min(i + 4096, m); i += 4) {\n b += (a += data.charCodeAt(i)) + (a += data.charCodeAt(i + 1)) + (a += data.charCodeAt(i + 2)) + (a += data.charCodeAt(i + 3));\n }\n a %= MOD;\n b %= MOD;\n }\n for (; i < l; i++) {\n b += a += data.charCodeAt(i);\n }\n a %= MOD;\n b %= MOD;\n return a | b << 16;\n}\n\nmodule.exports = adler32;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/adler32.js\n ** module id = 48\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactReconciler\n */\n\n'use strict';\n\nvar ReactRef = require('./ReactRef');\n\n/**\n * Helper to call ReactRef.attachRefs with this composite component, split out\n * to avoid allocations in the transaction mount-ready queue.\n */\nfunction attachRefs() {\n ReactRef.attachRefs(this, this._currentElement);\n}\n\nvar ReactReconciler = {\n\n /**\n * Initializes the component, renders markup, and registers event listeners.\n *\n * @param {ReactComponent} internalInstance\n * @param {string} rootID DOM ID of the root node.\n * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction\n * @return {?string} Rendered markup to be inserted into the DOM.\n * @final\n * @internal\n */\n mountComponent: function (internalInstance, rootID, transaction, context) {\n var markup = internalInstance.mountComponent(rootID, transaction, context);\n if (internalInstance._currentElement && internalInstance._currentElement.ref != null) {\n transaction.getReactMountReady().enqueue(attachRefs, internalInstance);\n }\n return markup;\n },\n\n /**\n * Releases any resources allocated by `mountComponent`.\n *\n * @final\n * @internal\n */\n unmountComponent: function (internalInstance) {\n ReactRef.detachRefs(internalInstance, internalInstance._currentElement);\n internalInstance.unmountComponent();\n },\n\n /**\n * Update a component using a new element.\n *\n * @param {ReactComponent} internalInstance\n * @param {ReactElement} nextElement\n * @param {ReactReconcileTransaction} transaction\n * @param {object} context\n * @internal\n */\n receiveComponent: function (internalInstance, nextElement, transaction, context) {\n var prevElement = internalInstance._currentElement;\n\n if (nextElement === prevElement && context === internalInstance._context) {\n // Since elements are immutable after the owner is rendered,\n // we can do a cheap identity compare here to determine if this is a\n // superfluous reconcile. It's possible for state to be mutable but such\n // change should trigger an update of the owner which would recreate\n // the element. We explicitly check for the existence of an owner since\n // it's possible for an element created outside a composite to be\n // deeply mutated and reused.\n\n // TODO: Bailing out early is just a perf optimization right?\n // TODO: Removing the return statement should affect correctness?\n return;\n }\n\n var refsChanged = ReactRef.shouldUpdateRefs(prevElement, nextElement);\n\n if (refsChanged) {\n ReactRef.detachRefs(internalInstance, prevElement);\n }\n\n internalInstance.receiveComponent(nextElement, transaction, context);\n\n if (refsChanged && internalInstance._currentElement && internalInstance._currentElement.ref != null) {\n transaction.getReactMountReady().enqueue(attachRefs, internalInstance);\n }\n },\n\n /**\n * Flush any dirty changes in a component.\n *\n * @param {ReactComponent} internalInstance\n * @param {ReactReconcileTransaction} transaction\n * @internal\n */\n performUpdateIfNecessary: function (internalInstance, transaction) {\n internalInstance.performUpdateIfNecessary(transaction);\n }\n\n};\n\nmodule.exports = ReactReconciler;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactReconciler.js\n ** module id = 49\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactRef\n */\n\n'use strict';\n\nvar ReactOwner = require('./ReactOwner');\n\nvar ReactRef = {};\n\nfunction attachRef(ref, component, owner) {\n if (typeof ref === 'function') {\n ref(component.getPublicInstance());\n } else {\n // Legacy ref\n ReactOwner.addComponentAsRefTo(component, ref, owner);\n }\n}\n\nfunction detachRef(ref, component, owner) {\n if (typeof ref === 'function') {\n ref(null);\n } else {\n // Legacy ref\n ReactOwner.removeComponentAsRefFrom(component, ref, owner);\n }\n}\n\nReactRef.attachRefs = function (instance, element) {\n if (element === null || element === false) {\n return;\n }\n var ref = element.ref;\n if (ref != null) {\n attachRef(ref, instance, element._owner);\n }\n};\n\nReactRef.shouldUpdateRefs = function (prevElement, nextElement) {\n // If either the owner or a `ref` has changed, make sure the newest owner\n // has stored a reference to `this`, and the previous owner (if different)\n // has forgotten the reference to `this`. We use the element instead\n // of the public this.props because the post processing cannot determine\n // a ref. The ref conceptually lives on the element.\n\n // TODO: Should this even be possible? The owner cannot change because\n // it's forbidden by shouldUpdateReactComponent. The ref can change\n // if you swap the keys of but not the refs. Reconsider where this check\n // is made. It probably belongs where the key checking and\n // instantiateReactComponent is done.\n\n var prevEmpty = prevElement === null || prevElement === false;\n var nextEmpty = nextElement === null || nextElement === false;\n\n return(\n // This has a few false positives w/r/t empty components.\n prevEmpty || nextEmpty || nextElement._owner !== prevElement._owner || nextElement.ref !== prevElement.ref\n );\n};\n\nReactRef.detachRefs = function (instance, element) {\n if (element === null || element === false) {\n return;\n }\n var ref = element.ref;\n if (ref != null) {\n detachRef(ref, instance, element._owner);\n }\n};\n\nmodule.exports = ReactRef;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactRef.js\n ** module id = 50\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactOwner\n */\n\n'use strict';\n\nvar invariant = require('fbjs/lib/invariant');\n\n/**\n * ReactOwners are capable of storing references to owned components.\n *\n * All components are capable of //being// referenced by owner components, but\n * only ReactOwner components are capable of //referencing// owned components.\n * The named reference is known as a \"ref\".\n *\n * Refs are available when mounted and updated during reconciliation.\n *\n * var MyComponent = React.createClass({\n * render: function() {\n * return (\n * <div onClick={this.handleClick}>\n * <CustomComponent ref=\"custom\" />\n * </div>\n * );\n * },\n * handleClick: function() {\n * this.refs.custom.handleClick();\n * },\n * componentDidMount: function() {\n * this.refs.custom.initialize();\n * }\n * });\n *\n * Refs should rarely be used. When refs are used, they should only be done to\n * control data that is not handled by React's data flow.\n *\n * @class ReactOwner\n */\nvar ReactOwner = {\n\n /**\n * @param {?object} object\n * @return {boolean} True if `object` is a valid owner.\n * @final\n */\n isValidOwner: function (object) {\n return !!(object && typeof object.attachRef === 'function' && typeof object.detachRef === 'function');\n },\n\n /**\n * Adds a component by ref to an owner component.\n *\n * @param {ReactComponent} component Component to reference.\n * @param {string} ref Name by which to refer to the component.\n * @param {ReactOwner} owner Component on which to record the ref.\n * @final\n * @internal\n */\n addComponentAsRefTo: function (component, ref, owner) {\n !ReactOwner.isValidOwner(owner) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'addComponentAsRefTo(...): Only a ReactOwner can have refs. You might ' + 'be adding a ref to a component that was not created inside a component\\'s ' + '`render` method, or you have multiple copies of React loaded ' + '(details: https://fb.me/react-refs-must-have-owner).') : invariant(false) : undefined;\n owner.attachRef(ref, component);\n },\n\n /**\n * Removes a component by ref from an owner component.\n *\n * @param {ReactComponent} component Component to dereference.\n * @param {string} ref Name of the ref to remove.\n * @param {ReactOwner} owner Component on which the ref is recorded.\n * @final\n * @internal\n */\n removeComponentAsRefFrom: function (component, ref, owner) {\n !ReactOwner.isValidOwner(owner) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'removeComponentAsRefFrom(...): Only a ReactOwner can have refs. You might ' + 'be removing a ref to a component that was not created inside a component\\'s ' + '`render` method, or you have multiple copies of React loaded ' + '(details: https://fb.me/react-refs-must-have-owner).') : invariant(false) : undefined;\n // Check that `component` is still the current ref because we do not want to\n // detach the ref if another component stole it.\n if (owner.getPublicInstance().refs[ref] === component.getPublicInstance()) {\n owner.detachRef(ref);\n }\n }\n\n};\n\nmodule.exports = ReactOwner;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactOwner.js\n ** module id = 51\n ** module chunks = 0 1\n **/","/**\n * Copyright 2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactUpdateQueue\n */\n\n'use strict';\n\nvar ReactCurrentOwner = require('./ReactCurrentOwner');\nvar ReactElement = require('./ReactElement');\nvar ReactInstanceMap = require('./ReactInstanceMap');\nvar ReactUpdates = require('./ReactUpdates');\n\nvar assign = require('./Object.assign');\nvar invariant = require('fbjs/lib/invariant');\nvar warning = require('fbjs/lib/warning');\n\nfunction enqueueUpdate(internalInstance) {\n ReactUpdates.enqueueUpdate(internalInstance);\n}\n\nfunction getInternalInstanceReadyForUpdate(publicInstance, callerName) {\n var internalInstance = ReactInstanceMap.get(publicInstance);\n if (!internalInstance) {\n if (process.env.NODE_ENV !== 'production') {\n // Only warn when we have a callerName. Otherwise we should be silent.\n // We're probably calling from enqueueCallback. We don't want to warn\n // there because we already warned for the corresponding lifecycle method.\n process.env.NODE_ENV !== 'production' ? warning(!callerName, '%s(...): Can only update a mounted or mounting component. ' + 'This usually means you called %s() on an unmounted component. ' + 'This is a no-op. Please check the code for the %s component.', callerName, callerName, publicInstance.constructor.displayName) : undefined;\n }\n return null;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(ReactCurrentOwner.current == null, '%s(...): Cannot update during an existing state transition ' + '(such as within `render`). Render methods should be a pure function ' + 'of props and state.', callerName) : undefined;\n }\n\n return internalInstance;\n}\n\n/**\n * ReactUpdateQueue allows for state updates to be scheduled into a later\n * reconciliation step.\n */\nvar ReactUpdateQueue = {\n\n /**\n * Checks whether or not this composite component is mounted.\n * @param {ReactClass} publicInstance The instance we want to test.\n * @return {boolean} True if mounted, false otherwise.\n * @protected\n * @final\n */\n isMounted: function (publicInstance) {\n if (process.env.NODE_ENV !== 'production') {\n var owner = ReactCurrentOwner.current;\n if (owner !== null) {\n process.env.NODE_ENV !== 'production' ? warning(owner._warnedAboutRefsInRender, '%s is accessing isMounted inside its render() function. ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', owner.getName() || 'A component') : undefined;\n owner._warnedAboutRefsInRender = true;\n }\n }\n var internalInstance = ReactInstanceMap.get(publicInstance);\n if (internalInstance) {\n // During componentWillMount and render this will still be null but after\n // that will always render to something. At least for now. So we can use\n // this hack.\n return !!internalInstance._renderedComponent;\n } else {\n return false;\n }\n },\n\n /**\n * Enqueue a callback that will be executed after all the pending updates\n * have processed.\n *\n * @param {ReactClass} publicInstance The instance to use as `this` context.\n * @param {?function} callback Called after state is updated.\n * @internal\n */\n enqueueCallback: function (publicInstance, callback) {\n !(typeof callback === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'enqueueCallback(...): You called `setProps`, `replaceProps`, ' + '`setState`, `replaceState`, or `forceUpdate` with a callback that ' + 'isn\\'t callable.') : invariant(false) : undefined;\n var internalInstance = getInternalInstanceReadyForUpdate(publicInstance);\n\n // Previously we would throw an error if we didn't have an internal\n // instance. Since we want to make it a no-op instead, we mirror the same\n // behavior we have in other enqueue* methods.\n // We also need to ignore callbacks in componentWillMount. See\n // enqueueUpdates.\n if (!internalInstance) {\n return null;\n }\n\n if (internalInstance._pendingCallbacks) {\n internalInstance._pendingCallbacks.push(callback);\n } else {\n internalInstance._pendingCallbacks = [callback];\n }\n // TODO: The callback here is ignored when setState is called from\n // componentWillMount. Either fix it or disallow doing so completely in\n // favor of getInitialState. Alternatively, we can disallow\n // componentWillMount during server-side rendering.\n enqueueUpdate(internalInstance);\n },\n\n enqueueCallbackInternal: function (internalInstance, callback) {\n !(typeof callback === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'enqueueCallback(...): You called `setProps`, `replaceProps`, ' + '`setState`, `replaceState`, or `forceUpdate` with a callback that ' + 'isn\\'t callable.') : invariant(false) : undefined;\n if (internalInstance._pendingCallbacks) {\n internalInstance._pendingCallbacks.push(callback);\n } else {\n internalInstance._pendingCallbacks = [callback];\n }\n enqueueUpdate(internalInstance);\n },\n\n /**\n * Forces an update. This should only be invoked when it is known with\n * certainty that we are **not** in a DOM transaction.\n *\n * You may want to call this when you know that some deeper aspect of the\n * component's state has changed but `setState` was not called.\n *\n * This will not invoke `shouldComponentUpdate`, but it will invoke\n * `componentWillUpdate` and `componentDidUpdate`.\n *\n * @param {ReactClass} publicInstance The instance that should rerender.\n * @internal\n */\n enqueueForceUpdate: function (publicInstance) {\n var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'forceUpdate');\n\n if (!internalInstance) {\n return;\n }\n\n internalInstance._pendingForceUpdate = true;\n\n enqueueUpdate(internalInstance);\n },\n\n /**\n * Replaces all of the state. Always use this or `setState` to mutate state.\n * You should treat `this.state` as immutable.\n *\n * There is no guarantee that `this.state` will be immediately updated, so\n * accessing `this.state` after calling this method may return the old value.\n *\n * @param {ReactClass} publicInstance The instance that should rerender.\n * @param {object} completeState Next state.\n * @internal\n */\n enqueueReplaceState: function (publicInstance, completeState) {\n var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'replaceState');\n\n if (!internalInstance) {\n return;\n }\n\n internalInstance._pendingStateQueue = [completeState];\n internalInstance._pendingReplaceState = true;\n\n enqueueUpdate(internalInstance);\n },\n\n /**\n * Sets a subset of the state. This only exists because _pendingState is\n * internal. This provides a merging strategy that is not available to deep\n * properties which is confusing. TODO: Expose pendingState or don't use it\n * during the merge.\n *\n * @param {ReactClass} publicInstance The instance that should rerender.\n * @param {object} partialState Next partial state to be merged with state.\n * @internal\n */\n enqueueSetState: function (publicInstance, partialState) {\n var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'setState');\n\n if (!internalInstance) {\n return;\n }\n\n var queue = internalInstance._pendingStateQueue || (internalInstance._pendingStateQueue = []);\n queue.push(partialState);\n\n enqueueUpdate(internalInstance);\n },\n\n /**\n * Sets a subset of the props.\n *\n * @param {ReactClass} publicInstance The instance that should rerender.\n * @param {object} partialProps Subset of the next props.\n * @internal\n */\n enqueueSetProps: function (publicInstance, partialProps) {\n var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'setProps');\n if (!internalInstance) {\n return;\n }\n ReactUpdateQueue.enqueueSetPropsInternal(internalInstance, partialProps);\n },\n\n enqueueSetPropsInternal: function (internalInstance, partialProps) {\n var topLevelWrapper = internalInstance._topLevelWrapper;\n !topLevelWrapper ? process.env.NODE_ENV !== 'production' ? invariant(false, 'setProps(...): You called `setProps` on a ' + 'component with a parent. This is an anti-pattern since props will ' + 'get reactively updated when rendered. Instead, change the owner\\'s ' + '`render` method to pass the correct value as props to the component ' + 'where it is created.') : invariant(false) : undefined;\n\n // Merge with the pending element if it exists, otherwise with existing\n // element props.\n var wrapElement = topLevelWrapper._pendingElement || topLevelWrapper._currentElement;\n var element = wrapElement.props;\n var props = assign({}, element.props, partialProps);\n topLevelWrapper._pendingElement = ReactElement.cloneAndReplaceProps(wrapElement, ReactElement.cloneAndReplaceProps(element, props));\n\n enqueueUpdate(topLevelWrapper);\n },\n\n /**\n * Replaces all of the props.\n *\n * @param {ReactClass} publicInstance The instance that should rerender.\n * @param {object} props New props.\n * @internal\n */\n enqueueReplaceProps: function (publicInstance, props) {\n var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'replaceProps');\n if (!internalInstance) {\n return;\n }\n ReactUpdateQueue.enqueueReplacePropsInternal(internalInstance, props);\n },\n\n enqueueReplacePropsInternal: function (internalInstance, props) {\n var topLevelWrapper = internalInstance._topLevelWrapper;\n !topLevelWrapper ? process.env.NODE_ENV !== 'production' ? invariant(false, 'replaceProps(...): You called `replaceProps` on a ' + 'component with a parent. This is an anti-pattern since props will ' + 'get reactively updated when rendered. Instead, change the owner\\'s ' + '`render` method to pass the correct value as props to the component ' + 'where it is created.') : invariant(false) : undefined;\n\n // Merge with the pending element if it exists, otherwise with existing\n // element props.\n var wrapElement = topLevelWrapper._pendingElement || topLevelWrapper._currentElement;\n var element = wrapElement.props;\n topLevelWrapper._pendingElement = ReactElement.cloneAndReplaceProps(wrapElement, ReactElement.cloneAndReplaceProps(element, props));\n\n enqueueUpdate(topLevelWrapper);\n },\n\n enqueueElementInternal: function (internalInstance, newElement) {\n internalInstance._pendingElement = newElement;\n enqueueUpdate(internalInstance);\n }\n\n};\n\nmodule.exports = ReactUpdateQueue;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactUpdateQueue.js\n ** module id = 52\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactUpdates\n */\n\n'use strict';\n\nvar CallbackQueue = require('./CallbackQueue');\nvar PooledClass = require('./PooledClass');\nvar ReactPerf = require('./ReactPerf');\nvar ReactReconciler = require('./ReactReconciler');\nvar Transaction = require('./Transaction');\n\nvar assign = require('./Object.assign');\nvar invariant = require('fbjs/lib/invariant');\n\nvar dirtyComponents = [];\nvar asapCallbackQueue = CallbackQueue.getPooled();\nvar asapEnqueued = false;\n\nvar batchingStrategy = null;\n\nfunction ensureInjected() {\n !(ReactUpdates.ReactReconcileTransaction && batchingStrategy) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactUpdates: must inject a reconcile transaction class and batching ' + 'strategy') : invariant(false) : undefined;\n}\n\nvar NESTED_UPDATES = {\n initialize: function () {\n this.dirtyComponentsLength = dirtyComponents.length;\n },\n close: function () {\n if (this.dirtyComponentsLength !== dirtyComponents.length) {\n // Additional updates were enqueued by componentDidUpdate handlers or\n // similar; before our own UPDATE_QUEUEING wrapper closes, we want to run\n // these new updates so that if A's componentDidUpdate calls setState on\n // B, B will update before the callback A's updater provided when calling\n // setState.\n dirtyComponents.splice(0, this.dirtyComponentsLength);\n flushBatchedUpdates();\n } else {\n dirtyComponents.length = 0;\n }\n }\n};\n\nvar UPDATE_QUEUEING = {\n initialize: function () {\n this.callbackQueue.reset();\n },\n close: function () {\n this.callbackQueue.notifyAll();\n }\n};\n\nvar TRANSACTION_WRAPPERS = [NESTED_UPDATES, UPDATE_QUEUEING];\n\nfunction ReactUpdatesFlushTransaction() {\n this.reinitializeTransaction();\n this.dirtyComponentsLength = null;\n this.callbackQueue = CallbackQueue.getPooled();\n this.reconcileTransaction = ReactUpdates.ReactReconcileTransaction.getPooled( /* forceHTML */false);\n}\n\nassign(ReactUpdatesFlushTransaction.prototype, Transaction.Mixin, {\n getTransactionWrappers: function () {\n return TRANSACTION_WRAPPERS;\n },\n\n destructor: function () {\n this.dirtyComponentsLength = null;\n CallbackQueue.release(this.callbackQueue);\n this.callbackQueue = null;\n ReactUpdates.ReactReconcileTransaction.release(this.reconcileTransaction);\n this.reconcileTransaction = null;\n },\n\n perform: function (method, scope, a) {\n // Essentially calls `this.reconcileTransaction.perform(method, scope, a)`\n // with this transaction's wrappers around it.\n return Transaction.Mixin.perform.call(this, this.reconcileTransaction.perform, this.reconcileTransaction, method, scope, a);\n }\n});\n\nPooledClass.addPoolingTo(ReactUpdatesFlushTransaction);\n\nfunction batchedUpdates(callback, a, b, c, d, e) {\n ensureInjected();\n batchingStrategy.batchedUpdates(callback, a, b, c, d, e);\n}\n\n/**\n * Array comparator for ReactComponents by mount ordering.\n *\n * @param {ReactComponent} c1 first component you're comparing\n * @param {ReactComponent} c2 second component you're comparing\n * @return {number} Return value usable by Array.prototype.sort().\n */\nfunction mountOrderComparator(c1, c2) {\n return c1._mountOrder - c2._mountOrder;\n}\n\nfunction runBatchedUpdates(transaction) {\n var len = transaction.dirtyComponentsLength;\n !(len === dirtyComponents.length) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Expected flush transaction\\'s stored dirty-components length (%s) to ' + 'match dirty-components array length (%s).', len, dirtyComponents.length) : invariant(false) : undefined;\n\n // Since reconciling a component higher in the owner hierarchy usually (not\n // always -- see shouldComponentUpdate()) will reconcile children, reconcile\n // them before their children by sorting the array.\n dirtyComponents.sort(mountOrderComparator);\n\n for (var i = 0; i < len; i++) {\n // If a component is unmounted before pending changes apply, it will still\n // be here, but we assume that it has cleared its _pendingCallbacks and\n // that performUpdateIfNecessary is a noop.\n var component = dirtyComponents[i];\n\n // If performUpdateIfNecessary happens to enqueue any new updates, we\n // shouldn't execute the callbacks until the next render happens, so\n // stash the callbacks first\n var callbacks = component._pendingCallbacks;\n component._pendingCallbacks = null;\n\n ReactReconciler.performUpdateIfNecessary(component, transaction.reconcileTransaction);\n\n if (callbacks) {\n for (var j = 0; j < callbacks.length; j++) {\n transaction.callbackQueue.enqueue(callbacks[j], component.getPublicInstance());\n }\n }\n }\n}\n\nvar flushBatchedUpdates = function () {\n // ReactUpdatesFlushTransaction's wrappers will clear the dirtyComponents\n // array and perform any updates enqueued by mount-ready handlers (i.e.,\n // componentDidUpdate) but we need to check here too in order to catch\n // updates enqueued by setState callbacks and asap calls.\n while (dirtyComponents.length || asapEnqueued) {\n if (dirtyComponents.length) {\n var transaction = ReactUpdatesFlushTransaction.getPooled();\n transaction.perform(runBatchedUpdates, null, transaction);\n ReactUpdatesFlushTransaction.release(transaction);\n }\n\n if (asapEnqueued) {\n asapEnqueued = false;\n var queue = asapCallbackQueue;\n asapCallbackQueue = CallbackQueue.getPooled();\n queue.notifyAll();\n CallbackQueue.release(queue);\n }\n }\n};\nflushBatchedUpdates = ReactPerf.measure('ReactUpdates', 'flushBatchedUpdates', flushBatchedUpdates);\n\n/**\n * Mark a component as needing a rerender, adding an optional callback to a\n * list of functions which will be executed once the rerender occurs.\n */\nfunction enqueueUpdate(component) {\n ensureInjected();\n\n // Various parts of our code (such as ReactCompositeComponent's\n // _renderValidatedComponent) assume that calls to render aren't nested;\n // verify that that's the case. (This is called by each top-level update\n // function, like setProps, setState, forceUpdate, etc.; creation and\n // destruction of top-level components is guarded in ReactMount.)\n\n if (!batchingStrategy.isBatchingUpdates) {\n batchingStrategy.batchedUpdates(enqueueUpdate, component);\n return;\n }\n\n dirtyComponents.push(component);\n}\n\n/**\n * Enqueue a callback to be run at the end of the current batching cycle. Throws\n * if no updates are currently being performed.\n */\nfunction asap(callback, context) {\n !batchingStrategy.isBatchingUpdates ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactUpdates.asap: Can\\'t enqueue an asap callback in a context where' + 'updates are not being batched.') : invariant(false) : undefined;\n asapCallbackQueue.enqueue(callback, context);\n asapEnqueued = true;\n}\n\nvar ReactUpdatesInjection = {\n injectReconcileTransaction: function (ReconcileTransaction) {\n !ReconcileTransaction ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactUpdates: must provide a reconcile transaction class') : invariant(false) : undefined;\n ReactUpdates.ReactReconcileTransaction = ReconcileTransaction;\n },\n\n injectBatchingStrategy: function (_batchingStrategy) {\n !_batchingStrategy ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactUpdates: must provide a batching strategy') : invariant(false) : undefined;\n !(typeof _batchingStrategy.batchedUpdates === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactUpdates: must provide a batchedUpdates() function') : invariant(false) : undefined;\n !(typeof _batchingStrategy.isBatchingUpdates === 'boolean') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactUpdates: must provide an isBatchingUpdates boolean attribute') : invariant(false) : undefined;\n batchingStrategy = _batchingStrategy;\n }\n};\n\nvar ReactUpdates = {\n /**\n * React references `ReactReconcileTransaction` using this property in order\n * to allow dependency injection.\n *\n * @internal\n */\n ReactReconcileTransaction: null,\n\n batchedUpdates: batchedUpdates,\n enqueueUpdate: enqueueUpdate,\n flushBatchedUpdates: flushBatchedUpdates,\n injection: ReactUpdatesInjection,\n asap: asap\n};\n\nmodule.exports = ReactUpdates;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactUpdates.js\n ** module id = 53\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule CallbackQueue\n */\n\n'use strict';\n\nvar PooledClass = require('./PooledClass');\n\nvar assign = require('./Object.assign');\nvar invariant = require('fbjs/lib/invariant');\n\n/**\n * A specialized pseudo-event module to help keep track of components waiting to\n * be notified when their DOM representations are available for use.\n *\n * This implements `PooledClass`, so you should never need to instantiate this.\n * Instead, use `CallbackQueue.getPooled()`.\n *\n * @class ReactMountReady\n * @implements PooledClass\n * @internal\n */\nfunction CallbackQueue() {\n this._callbacks = null;\n this._contexts = null;\n}\n\nassign(CallbackQueue.prototype, {\n\n /**\n * Enqueues a callback to be invoked when `notifyAll` is invoked.\n *\n * @param {function} callback Invoked when `notifyAll` is invoked.\n * @param {?object} context Context to call `callback` with.\n * @internal\n */\n enqueue: function (callback, context) {\n this._callbacks = this._callbacks || [];\n this._contexts = this._contexts || [];\n this._callbacks.push(callback);\n this._contexts.push(context);\n },\n\n /**\n * Invokes all enqueued callbacks and clears the queue. This is invoked after\n * the DOM representation of a component has been created or updated.\n *\n * @internal\n */\n notifyAll: function () {\n var callbacks = this._callbacks;\n var contexts = this._contexts;\n if (callbacks) {\n !(callbacks.length === contexts.length) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Mismatched list of contexts in callback queue') : invariant(false) : undefined;\n this._callbacks = null;\n this._contexts = null;\n for (var i = 0; i < callbacks.length; i++) {\n callbacks[i].call(contexts[i]);\n }\n callbacks.length = 0;\n contexts.length = 0;\n }\n },\n\n /**\n * Resets the internal queue.\n *\n * @internal\n */\n reset: function () {\n this._callbacks = null;\n this._contexts = null;\n },\n\n /**\n * `PooledClass` looks for this.\n */\n destructor: function () {\n this.reset();\n }\n\n});\n\nPooledClass.addPoolingTo(CallbackQueue);\n\nmodule.exports = CallbackQueue;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/CallbackQueue.js\n ** module id = 54\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule PooledClass\n */\n\n'use strict';\n\nvar invariant = require('fbjs/lib/invariant');\n\n/**\n * Static poolers. Several custom versions for each potential number of\n * arguments. A completely generic pooler is easy to implement, but would\n * require accessing the `arguments` object. In each of these, `this` refers to\n * the Class itself, not an instance. If any others are needed, simply add them\n * here, or in their own files.\n */\nvar oneArgumentPooler = function (copyFieldsFrom) {\n var Klass = this;\n if (Klass.instancePool.length) {\n var instance = Klass.instancePool.pop();\n Klass.call(instance, copyFieldsFrom);\n return instance;\n } else {\n return new Klass(copyFieldsFrom);\n }\n};\n\nvar twoArgumentPooler = function (a1, a2) {\n var Klass = this;\n if (Klass.instancePool.length) {\n var instance = Klass.instancePool.pop();\n Klass.call(instance, a1, a2);\n return instance;\n } else {\n return new Klass(a1, a2);\n }\n};\n\nvar threeArgumentPooler = function (a1, a2, a3) {\n var Klass = this;\n if (Klass.instancePool.length) {\n var instance = Klass.instancePool.pop();\n Klass.call(instance, a1, a2, a3);\n return instance;\n } else {\n return new Klass(a1, a2, a3);\n }\n};\n\nvar fourArgumentPooler = function (a1, a2, a3, a4) {\n var Klass = this;\n if (Klass.instancePool.length) {\n var instance = Klass.instancePool.pop();\n Klass.call(instance, a1, a2, a3, a4);\n return instance;\n } else {\n return new Klass(a1, a2, a3, a4);\n }\n};\n\nvar fiveArgumentPooler = function (a1, a2, a3, a4, a5) {\n var Klass = this;\n if (Klass.instancePool.length) {\n var instance = Klass.instancePool.pop();\n Klass.call(instance, a1, a2, a3, a4, a5);\n return instance;\n } else {\n return new Klass(a1, a2, a3, a4, a5);\n }\n};\n\nvar standardReleaser = function (instance) {\n var Klass = this;\n !(instance instanceof Klass) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Trying to release an instance into a pool of a different type.') : invariant(false) : undefined;\n instance.destructor();\n if (Klass.instancePool.length < Klass.poolSize) {\n Klass.instancePool.push(instance);\n }\n};\n\nvar DEFAULT_POOL_SIZE = 10;\nvar DEFAULT_POOLER = oneArgumentPooler;\n\n/**\n * Augments `CopyConstructor` to be a poolable class, augmenting only the class\n * itself (statically) not adding any prototypical fields. Any CopyConstructor\n * you give this may have a `poolSize` property, and will look for a\n * prototypical `destructor` on instances (optional).\n *\n * @param {Function} CopyConstructor Constructor that can be used to reset.\n * @param {Function} pooler Customizable pooler.\n */\nvar addPoolingTo = function (CopyConstructor, pooler) {\n var NewKlass = CopyConstructor;\n NewKlass.instancePool = [];\n NewKlass.getPooled = pooler || DEFAULT_POOLER;\n if (!NewKlass.poolSize) {\n NewKlass.poolSize = DEFAULT_POOL_SIZE;\n }\n NewKlass.release = standardReleaser;\n return NewKlass;\n};\n\nvar PooledClass = {\n addPoolingTo: addPoolingTo,\n oneArgumentPooler: oneArgumentPooler,\n twoArgumentPooler: twoArgumentPooler,\n threeArgumentPooler: threeArgumentPooler,\n fourArgumentPooler: fourArgumentPooler,\n fiveArgumentPooler: fiveArgumentPooler\n};\n\nmodule.exports = PooledClass;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/PooledClass.js\n ** module id = 55\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule Transaction\n */\n\n'use strict';\n\nvar invariant = require('fbjs/lib/invariant');\n\n/**\n * `Transaction` creates a black box that is able to wrap any method such that\n * certain invariants are maintained before and after the method is invoked\n * (Even if an exception is thrown while invoking the wrapped method). Whoever\n * instantiates a transaction can provide enforcers of the invariants at\n * creation time. The `Transaction` class itself will supply one additional\n * automatic invariant for you - the invariant that any transaction instance\n * should not be run while it is already being run. You would typically create a\n * single instance of a `Transaction` for reuse multiple times, that potentially\n * is used to wrap several different methods. Wrappers are extremely simple -\n * they only require implementing two methods.\n *\n * <pre>\n * wrappers (injected at creation time)\n * + +\n * | |\n * +-----------------|--------|--------------+\n * | v | |\n * | +---------------+ | |\n * | +--| wrapper1 |---|----+ |\n * | | +---------------+ v | |\n * | | +-------------+ | |\n * | | +----| wrapper2 |--------+ |\n * | | | +-------------+ | | |\n * | | | | | |\n * | v v v v | wrapper\n * | +---+ +---+ +---------+ +---+ +---+ | invariants\n * perform(anyMethod) | | | | | | | | | | | | maintained\n * +----------------->|-|---|-|---|-->|anyMethod|---|---|-|---|-|-------->\n * | | | | | | | | | | | |\n * | | | | | | | | | | | |\n * | | | | | | | | | | | |\n * | +---+ +---+ +---------+ +---+ +---+ |\n * | initialize close |\n * +-----------------------------------------+\n * </pre>\n *\n * Use cases:\n * - Preserving the input selection ranges before/after reconciliation.\n * Restoring selection even in the event of an unexpected error.\n * - Deactivating events while rearranging the DOM, preventing blurs/focuses,\n * while guaranteeing that afterwards, the event system is reactivated.\n * - Flushing a queue of collected DOM mutations to the main UI thread after a\n * reconciliation takes place in a worker thread.\n * - Invoking any collected `componentDidUpdate` callbacks after rendering new\n * content.\n * - (Future use case): Wrapping particular flushes of the `ReactWorker` queue\n * to preserve the `scrollTop` (an automatic scroll aware DOM).\n * - (Future use case): Layout calculations before and after DOM updates.\n *\n * Transactional plugin API:\n * - A module that has an `initialize` method that returns any precomputation.\n * - and a `close` method that accepts the precomputation. `close` is invoked\n * when the wrapped process is completed, or has failed.\n *\n * @param {Array<TransactionalWrapper>} transactionWrapper Wrapper modules\n * that implement `initialize` and `close`.\n * @return {Transaction} Single transaction for reuse in thread.\n *\n * @class Transaction\n */\nvar Mixin = {\n /**\n * Sets up this instance so that it is prepared for collecting metrics. Does\n * so such that this setup method may be used on an instance that is already\n * initialized, in a way that does not consume additional memory upon reuse.\n * That can be useful if you decide to make your subclass of this mixin a\n * \"PooledClass\".\n */\n reinitializeTransaction: function () {\n this.transactionWrappers = this.getTransactionWrappers();\n if (this.wrapperInitData) {\n this.wrapperInitData.length = 0;\n } else {\n this.wrapperInitData = [];\n }\n this._isInTransaction = false;\n },\n\n _isInTransaction: false,\n\n /**\n * @abstract\n * @return {Array<TransactionWrapper>} Array of transaction wrappers.\n */\n getTransactionWrappers: null,\n\n isInTransaction: function () {\n return !!this._isInTransaction;\n },\n\n /**\n * Executes the function within a safety window. Use this for the top level\n * methods that result in large amounts of computation/mutations that would\n * need to be safety checked. The optional arguments helps prevent the need\n * to bind in many cases.\n *\n * @param {function} method Member of scope to call.\n * @param {Object} scope Scope to invoke from.\n * @param {Object?=} a Argument to pass to the method.\n * @param {Object?=} b Argument to pass to the method.\n * @param {Object?=} c Argument to pass to the method.\n * @param {Object?=} d Argument to pass to the method.\n * @param {Object?=} e Argument to pass to the method.\n * @param {Object?=} f Argument to pass to the method.\n *\n * @return {*} Return value from `method`.\n */\n perform: function (method, scope, a, b, c, d, e, f) {\n !!this.isInTransaction() ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Transaction.perform(...): Cannot initialize a transaction when there ' + 'is already an outstanding transaction.') : invariant(false) : undefined;\n var errorThrown;\n var ret;\n try {\n this._isInTransaction = true;\n // Catching errors makes debugging more difficult, so we start with\n // errorThrown set to true before setting it to false after calling\n // close -- if it's still set to true in the finally block, it means\n // one of these calls threw.\n errorThrown = true;\n this.initializeAll(0);\n ret = method.call(scope, a, b, c, d, e, f);\n errorThrown = false;\n } finally {\n try {\n if (errorThrown) {\n // If `method` throws, prefer to show that stack trace over any thrown\n // by invoking `closeAll`.\n try {\n this.closeAll(0);\n } catch (err) {}\n } else {\n // Since `method` didn't throw, we don't want to silence the exception\n // here.\n this.closeAll(0);\n }\n } finally {\n this._isInTransaction = false;\n }\n }\n return ret;\n },\n\n initializeAll: function (startIndex) {\n var transactionWrappers = this.transactionWrappers;\n for (var i = startIndex; i < transactionWrappers.length; i++) {\n var wrapper = transactionWrappers[i];\n try {\n // Catching errors makes debugging more difficult, so we start with the\n // OBSERVED_ERROR state before overwriting it with the real return value\n // of initialize -- if it's still set to OBSERVED_ERROR in the finally\n // block, it means wrapper.initialize threw.\n this.wrapperInitData[i] = Transaction.OBSERVED_ERROR;\n this.wrapperInitData[i] = wrapper.initialize ? wrapper.initialize.call(this) : null;\n } finally {\n if (this.wrapperInitData[i] === Transaction.OBSERVED_ERROR) {\n // The initializer for wrapper i threw an error; initialize the\n // remaining wrappers but silence any exceptions from them to ensure\n // that the first error is the one to bubble up.\n try {\n this.initializeAll(i + 1);\n } catch (err) {}\n }\n }\n }\n },\n\n /**\n * Invokes each of `this.transactionWrappers.close[i]` functions, passing into\n * them the respective return values of `this.transactionWrappers.init[i]`\n * (`close`rs that correspond to initializers that failed will not be\n * invoked).\n */\n closeAll: function (startIndex) {\n !this.isInTransaction() ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Transaction.closeAll(): Cannot close transaction when none are open.') : invariant(false) : undefined;\n var transactionWrappers = this.transactionWrappers;\n for (var i = startIndex; i < transactionWrappers.length; i++) {\n var wrapper = transactionWrappers[i];\n var initData = this.wrapperInitData[i];\n var errorThrown;\n try {\n // Catching errors makes debugging more difficult, so we start with\n // errorThrown set to true before setting it to false after calling\n // close -- if it's still set to true in the finally block, it means\n // wrapper.close threw.\n errorThrown = true;\n if (initData !== Transaction.OBSERVED_ERROR && wrapper.close) {\n wrapper.close.call(this, initData);\n }\n errorThrown = false;\n } finally {\n if (errorThrown) {\n // The closer for wrapper i threw an error; close the remaining\n // wrappers but silence any exceptions from them to ensure that the\n // first error is the one to bubble up.\n try {\n this.closeAll(i + 1);\n } catch (e) {}\n }\n }\n }\n this.wrapperInitData.length = 0;\n }\n};\n\nvar Transaction = {\n\n Mixin: Mixin,\n\n /**\n * Token to look for to determine if an error occurred.\n */\n OBSERVED_ERROR: {}\n\n};\n\nmodule.exports = Transaction;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/Transaction.js\n ** module id = 56\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule emptyObject\n */\n\n'use strict';\n\nvar emptyObject = {};\n\nif (process.env.NODE_ENV !== 'production') {\n Object.freeze(emptyObject);\n}\n\nmodule.exports = emptyObject;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/emptyObject.js\n ** module id = 57\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule containsNode\n * @typechecks\n */\n\n'use strict';\n\nvar isTextNode = require('./isTextNode');\n\n/*eslint-disable no-bitwise */\n\n/**\n * Checks if a given DOM node contains or is another DOM node.\n *\n * @param {?DOMNode} outerNode Outer DOM node.\n * @param {?DOMNode} innerNode Inner DOM node.\n * @return {boolean} True if `outerNode` contains or is `innerNode`.\n */\nfunction containsNode(_x, _x2) {\n var _again = true;\n\n _function: while (_again) {\n var outerNode = _x,\n innerNode = _x2;\n _again = false;\n\n if (!outerNode || !innerNode) {\n return false;\n } else if (outerNode === innerNode) {\n return true;\n } else if (isTextNode(outerNode)) {\n return false;\n } else if (isTextNode(innerNode)) {\n _x = outerNode;\n _x2 = innerNode.parentNode;\n _again = true;\n continue _function;\n } else if (outerNode.contains) {\n return outerNode.contains(innerNode);\n } else if (outerNode.compareDocumentPosition) {\n return !!(outerNode.compareDocumentPosition(innerNode) & 16);\n } else {\n return false;\n }\n }\n}\n\nmodule.exports = containsNode;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/containsNode.js\n ** module id = 58\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule isTextNode\n * @typechecks\n */\n\n'use strict';\n\nvar isNode = require('./isNode');\n\n/**\n * @param {*} object The object to check.\n * @return {boolean} Whether or not the object is a DOM text node.\n */\nfunction isTextNode(object) {\n return isNode(object) && object.nodeType == 3;\n}\n\nmodule.exports = isTextNode;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/isTextNode.js\n ** module id = 59\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule isNode\n * @typechecks\n */\n\n/**\n * @param {*} object The object to check.\n * @return {boolean} Whether or not the object is a DOM node.\n */\n'use strict';\n\nfunction isNode(object) {\n return !!(object && (typeof Node === 'function' ? object instanceof Node : typeof object === 'object' && typeof object.nodeType === 'number' && typeof object.nodeName === 'string'));\n}\n\nmodule.exports = isNode;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/isNode.js\n ** module id = 60\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule instantiateReactComponent\n * @typechecks static-only\n */\n\n'use strict';\n\nvar ReactCompositeComponent = require('./ReactCompositeComponent');\nvar ReactEmptyComponent = require('./ReactEmptyComponent');\nvar ReactNativeComponent = require('./ReactNativeComponent');\n\nvar assign = require('./Object.assign');\nvar invariant = require('fbjs/lib/invariant');\nvar warning = require('fbjs/lib/warning');\n\n// To avoid a cyclic dependency, we create the final class in this module\nvar ReactCompositeComponentWrapper = function () {};\nassign(ReactCompositeComponentWrapper.prototype, ReactCompositeComponent.Mixin, {\n _instantiateReactComponent: instantiateReactComponent\n});\n\nfunction getDeclarationErrorAddendum(owner) {\n if (owner) {\n var name = owner.getName();\n if (name) {\n return ' Check the render method of `' + name + '`.';\n }\n }\n return '';\n}\n\n/**\n * Check if the type reference is a known internal type. I.e. not a user\n * provided composite type.\n *\n * @param {function} type\n * @return {boolean} Returns true if this is a valid internal type.\n */\nfunction isInternalComponentType(type) {\n return typeof type === 'function' && typeof type.prototype !== 'undefined' && typeof type.prototype.mountComponent === 'function' && typeof type.prototype.receiveComponent === 'function';\n}\n\n/**\n * Given a ReactNode, create an instance that will actually be mounted.\n *\n * @param {ReactNode} node\n * @return {object} A new instance of the element's constructor.\n * @protected\n */\nfunction instantiateReactComponent(node) {\n var instance;\n\n if (node === null || node === false) {\n instance = new ReactEmptyComponent(instantiateReactComponent);\n } else if (typeof node === 'object') {\n var element = node;\n !(element && (typeof element.type === 'function' || typeof element.type === 'string')) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Element type is invalid: expected a string (for built-in components) ' + 'or a class/function (for composite components) but got: %s.%s', element.type == null ? element.type : typeof element.type, getDeclarationErrorAddendum(element._owner)) : invariant(false) : undefined;\n\n // Special case string values\n if (typeof element.type === 'string') {\n instance = ReactNativeComponent.createInternalComponent(element);\n } else if (isInternalComponentType(element.type)) {\n // This is temporarily available for custom components that are not string\n // representations. I.e. ART. Once those are updated to use the string\n // representation, we can drop this code path.\n instance = new element.type(element);\n } else {\n instance = new ReactCompositeComponentWrapper();\n }\n } else if (typeof node === 'string' || typeof node === 'number') {\n instance = ReactNativeComponent.createInstanceForText(node);\n } else {\n !false ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Encountered invalid React node of type %s', typeof node) : invariant(false) : undefined;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(typeof instance.construct === 'function' && typeof instance.mountComponent === 'function' && typeof instance.receiveComponent === 'function' && typeof instance.unmountComponent === 'function', 'Only React Components can be mounted.') : undefined;\n }\n\n // Sets up the instance. This can probably just move into the constructor now.\n instance.construct(node);\n\n // These two fields are used by the DOM and ART diffing algorithms\n // respectively. Instead of using expandos on components, we should be\n // storing the state needed by the diffing algorithms elsewhere.\n instance._mountIndex = 0;\n instance._mountImage = null;\n\n if (process.env.NODE_ENV !== 'production') {\n instance._isOwnerNecessary = false;\n instance._warnedAboutRefsInRender = false;\n }\n\n // Internal instances should fully constructed at this point, so they should\n // not get any new fields added to them at this point.\n if (process.env.NODE_ENV !== 'production') {\n if (Object.preventExtensions) {\n Object.preventExtensions(instance);\n }\n }\n\n return instance;\n}\n\nmodule.exports = instantiateReactComponent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/instantiateReactComponent.js\n ** module id = 61\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactCompositeComponent\n */\n\n'use strict';\n\nvar ReactComponentEnvironment = require('./ReactComponentEnvironment');\nvar ReactCurrentOwner = require('./ReactCurrentOwner');\nvar ReactElement = require('./ReactElement');\nvar ReactInstanceMap = require('./ReactInstanceMap');\nvar ReactPerf = require('./ReactPerf');\nvar ReactPropTypeLocations = require('./ReactPropTypeLocations');\nvar ReactPropTypeLocationNames = require('./ReactPropTypeLocationNames');\nvar ReactReconciler = require('./ReactReconciler');\nvar ReactUpdateQueue = require('./ReactUpdateQueue');\n\nvar assign = require('./Object.assign');\nvar emptyObject = require('fbjs/lib/emptyObject');\nvar invariant = require('fbjs/lib/invariant');\nvar shouldUpdateReactComponent = require('./shouldUpdateReactComponent');\nvar warning = require('fbjs/lib/warning');\n\nfunction getDeclarationErrorAddendum(component) {\n var owner = component._currentElement._owner || null;\n if (owner) {\n var name = owner.getName();\n if (name) {\n return ' Check the render method of `' + name + '`.';\n }\n }\n return '';\n}\n\nfunction StatelessComponent(Component) {}\nStatelessComponent.prototype.render = function () {\n var Component = ReactInstanceMap.get(this)._currentElement.type;\n return Component(this.props, this.context, this.updater);\n};\n\n/**\n * ------------------ The Life-Cycle of a Composite Component ------------------\n *\n * - constructor: Initialization of state. The instance is now retained.\n * - componentWillMount\n * - render\n * - [children's constructors]\n * - [children's componentWillMount and render]\n * - [children's componentDidMount]\n * - componentDidMount\n *\n * Update Phases:\n * - componentWillReceiveProps (only called if parent updated)\n * - shouldComponentUpdate\n * - componentWillUpdate\n * - render\n * - [children's constructors or receive props phases]\n * - componentDidUpdate\n *\n * - componentWillUnmount\n * - [children's componentWillUnmount]\n * - [children destroyed]\n * - (destroyed): The instance is now blank, released by React and ready for GC.\n *\n * -----------------------------------------------------------------------------\n */\n\n/**\n * An incrementing ID assigned to each component when it is mounted. This is\n * used to enforce the order in which `ReactUpdates` updates dirty components.\n *\n * @private\n */\nvar nextMountID = 1;\n\n/**\n * @lends {ReactCompositeComponent.prototype}\n */\nvar ReactCompositeComponentMixin = {\n\n /**\n * Base constructor for all composite component.\n *\n * @param {ReactElement} element\n * @final\n * @internal\n */\n construct: function (element) {\n this._currentElement = element;\n this._rootNodeID = null;\n this._instance = null;\n\n // See ReactUpdateQueue\n this._pendingElement = null;\n this._pendingStateQueue = null;\n this._pendingReplaceState = false;\n this._pendingForceUpdate = false;\n\n this._renderedComponent = null;\n\n this._context = null;\n this._mountOrder = 0;\n this._topLevelWrapper = null;\n\n // See ReactUpdates and ReactUpdateQueue.\n this._pendingCallbacks = null;\n },\n\n /**\n * Initializes the component, renders markup, and registers event listeners.\n *\n * @param {string} rootID DOM ID of the root node.\n * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction\n * @return {?string} Rendered markup to be inserted into the DOM.\n * @final\n * @internal\n */\n mountComponent: function (rootID, transaction, context) {\n this._context = context;\n this._mountOrder = nextMountID++;\n this._rootNodeID = rootID;\n\n var publicProps = this._processProps(this._currentElement.props);\n var publicContext = this._processContext(context);\n\n var Component = this._currentElement.type;\n\n // Initialize the public class\n var inst;\n var renderedElement;\n\n // This is a way to detect if Component is a stateless arrow function\n // component, which is not newable. It might not be 100% reliable but is\n // something we can do until we start detecting that Component extends\n // React.Component. We already assume that typeof Component === 'function'.\n var canInstantiate = ('prototype' in Component);\n\n if (canInstantiate) {\n if (process.env.NODE_ENV !== 'production') {\n ReactCurrentOwner.current = this;\n try {\n inst = new Component(publicProps, publicContext, ReactUpdateQueue);\n } finally {\n ReactCurrentOwner.current = null;\n }\n } else {\n inst = new Component(publicProps, publicContext, ReactUpdateQueue);\n }\n }\n\n if (!canInstantiate || inst === null || inst === false || ReactElement.isValidElement(inst)) {\n renderedElement = inst;\n inst = new StatelessComponent(Component);\n }\n\n if (process.env.NODE_ENV !== 'production') {\n // This will throw later in _renderValidatedComponent, but add an early\n // warning now to help debugging\n if (inst.render == null) {\n process.env.NODE_ENV !== 'production' ? warning(false, '%s(...): No `render` method found on the returned component ' + 'instance: you may have forgotten to define `render`, returned ' + 'null/false from a stateless component, or tried to render an ' + 'element whose type is a function that isn\\'t a React component.', Component.displayName || Component.name || 'Component') : undefined;\n } else {\n // We support ES6 inheriting from React.Component, the module pattern,\n // and stateless components, but not ES6 classes that don't extend\n process.env.NODE_ENV !== 'production' ? warning(Component.prototype && Component.prototype.isReactComponent || !canInstantiate || !(inst instanceof Component), '%s(...): React component classes must extend React.Component.', Component.displayName || Component.name || 'Component') : undefined;\n }\n }\n\n // These should be set up in the constructor, but as a convenience for\n // simpler class abstractions, we set them up after the fact.\n inst.props = publicProps;\n inst.context = publicContext;\n inst.refs = emptyObject;\n inst.updater = ReactUpdateQueue;\n\n this._instance = inst;\n\n // Store a reference from the instance back to the internal representation\n ReactInstanceMap.set(inst, this);\n\n if (process.env.NODE_ENV !== 'production') {\n // Since plain JS classes are defined without any special initialization\n // logic, we can not catch common errors early. Therefore, we have to\n // catch them here, at initialization time, instead.\n process.env.NODE_ENV !== 'production' ? warning(!inst.getInitialState || inst.getInitialState.isReactClassApproved, 'getInitialState was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Did you mean to define a state property instead?', this.getName() || 'a component') : undefined;\n process.env.NODE_ENV !== 'production' ? warning(!inst.getDefaultProps || inst.getDefaultProps.isReactClassApproved, 'getDefaultProps was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Use a static property to define defaultProps instead.', this.getName() || 'a component') : undefined;\n process.env.NODE_ENV !== 'production' ? warning(!inst.propTypes, 'propTypes was defined as an instance property on %s. Use a static ' + 'property to define propTypes instead.', this.getName() || 'a component') : undefined;\n process.env.NODE_ENV !== 'production' ? warning(!inst.contextTypes, 'contextTypes was defined as an instance property on %s. Use a ' + 'static property to define contextTypes instead.', this.getName() || 'a component') : undefined;\n process.env.NODE_ENV !== 'production' ? warning(typeof inst.componentShouldUpdate !== 'function', '%s has a method called ' + 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' + 'The name is phrased as a question because the function is ' + 'expected to return a value.', this.getName() || 'A component') : undefined;\n process.env.NODE_ENV !== 'production' ? warning(typeof inst.componentDidUnmount !== 'function', '%s has a method called ' + 'componentDidUnmount(). But there is no such lifecycle method. ' + 'Did you mean componentWillUnmount()?', this.getName() || 'A component') : undefined;\n process.env.NODE_ENV !== 'production' ? warning(typeof inst.componentWillRecieveProps !== 'function', '%s has a method called ' + 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', this.getName() || 'A component') : undefined;\n }\n\n var initialState = inst.state;\n if (initialState === undefined) {\n inst.state = initialState = null;\n }\n !(typeof initialState === 'object' && !Array.isArray(initialState)) ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s.state: must be set to an object or null', this.getName() || 'ReactCompositeComponent') : invariant(false) : undefined;\n\n this._pendingStateQueue = null;\n this._pendingReplaceState = false;\n this._pendingForceUpdate = false;\n\n if (inst.componentWillMount) {\n inst.componentWillMount();\n // When mounting, calls to `setState` by `componentWillMount` will set\n // `this._pendingStateQueue` without triggering a re-render.\n if (this._pendingStateQueue) {\n inst.state = this._processPendingState(inst.props, inst.context);\n }\n }\n\n // If not a stateless component, we now render\n if (renderedElement === undefined) {\n renderedElement = this._renderValidatedComponent();\n }\n\n this._renderedComponent = this._instantiateReactComponent(renderedElement);\n\n var markup = ReactReconciler.mountComponent(this._renderedComponent, rootID, transaction, this._processChildContext(context));\n if (inst.componentDidMount) {\n transaction.getReactMountReady().enqueue(inst.componentDidMount, inst);\n }\n\n return markup;\n },\n\n /**\n * Releases any resources allocated by `mountComponent`.\n *\n * @final\n * @internal\n */\n unmountComponent: function () {\n var inst = this._instance;\n\n if (inst.componentWillUnmount) {\n inst.componentWillUnmount();\n }\n\n ReactReconciler.unmountComponent(this._renderedComponent);\n this._renderedComponent = null;\n this._instance = null;\n\n // Reset pending fields\n // Even if this component is scheduled for another update in ReactUpdates,\n // it would still be ignored because these fields are reset.\n this._pendingStateQueue = null;\n this._pendingReplaceState = false;\n this._pendingForceUpdate = false;\n this._pendingCallbacks = null;\n this._pendingElement = null;\n\n // These fields do not really need to be reset since this object is no\n // longer accessible.\n this._context = null;\n this._rootNodeID = null;\n this._topLevelWrapper = null;\n\n // Delete the reference from the instance to this internal representation\n // which allow the internals to be properly cleaned up even if the user\n // leaks a reference to the public instance.\n ReactInstanceMap.remove(inst);\n\n // Some existing components rely on inst.props even after they've been\n // destroyed (in event handlers).\n // TODO: inst.props = null;\n // TODO: inst.state = null;\n // TODO: inst.context = null;\n },\n\n /**\n * Filters the context object to only contain keys specified in\n * `contextTypes`\n *\n * @param {object} context\n * @return {?object}\n * @private\n */\n _maskContext: function (context) {\n var maskedContext = null;\n var Component = this._currentElement.type;\n var contextTypes = Component.contextTypes;\n if (!contextTypes) {\n return emptyObject;\n }\n maskedContext = {};\n for (var contextName in contextTypes) {\n maskedContext[contextName] = context[contextName];\n }\n return maskedContext;\n },\n\n /**\n * Filters the context object to only contain keys specified in\n * `contextTypes`, and asserts that they are valid.\n *\n * @param {object} context\n * @return {?object}\n * @private\n */\n _processContext: function (context) {\n var maskedContext = this._maskContext(context);\n if (process.env.NODE_ENV !== 'production') {\n var Component = this._currentElement.type;\n if (Component.contextTypes) {\n this._checkPropTypes(Component.contextTypes, maskedContext, ReactPropTypeLocations.context);\n }\n }\n return maskedContext;\n },\n\n /**\n * @param {object} currentContext\n * @return {object}\n * @private\n */\n _processChildContext: function (currentContext) {\n var Component = this._currentElement.type;\n var inst = this._instance;\n var childContext = inst.getChildContext && inst.getChildContext();\n if (childContext) {\n !(typeof Component.childContextTypes === 'object') ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s.getChildContext(): childContextTypes must be defined in order to ' + 'use getChildContext().', this.getName() || 'ReactCompositeComponent') : invariant(false) : undefined;\n if (process.env.NODE_ENV !== 'production') {\n this._checkPropTypes(Component.childContextTypes, childContext, ReactPropTypeLocations.childContext);\n }\n for (var name in childContext) {\n !(name in Component.childContextTypes) ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s.getChildContext(): key \"%s\" is not defined in childContextTypes.', this.getName() || 'ReactCompositeComponent', name) : invariant(false) : undefined;\n }\n return assign({}, currentContext, childContext);\n }\n return currentContext;\n },\n\n /**\n * Processes props by setting default values for unspecified props and\n * asserting that the props are valid. Does not mutate its argument; returns\n * a new props object with defaults merged in.\n *\n * @param {object} newProps\n * @return {object}\n * @private\n */\n _processProps: function (newProps) {\n if (process.env.NODE_ENV !== 'production') {\n var Component = this._currentElement.type;\n if (Component.propTypes) {\n this._checkPropTypes(Component.propTypes, newProps, ReactPropTypeLocations.prop);\n }\n }\n return newProps;\n },\n\n /**\n * Assert that the props are valid\n *\n * @param {object} propTypes Map of prop name to a ReactPropType\n * @param {object} props\n * @param {string} location e.g. \"prop\", \"context\", \"child context\"\n * @private\n */\n _checkPropTypes: function (propTypes, props, location) {\n // TODO: Stop validating prop types here and only use the element\n // validation.\n var componentName = this.getName();\n for (var propName in propTypes) {\n if (propTypes.hasOwnProperty(propName)) {\n var error;\n try {\n // This is intentionally an invariant that gets caught. It's the same\n // behavior as without this statement except with a better message.\n !(typeof propTypes[propName] === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s: %s type `%s` is invalid; it must be a function, usually ' + 'from React.PropTypes.', componentName || 'React class', ReactPropTypeLocationNames[location], propName) : invariant(false) : undefined;\n error = propTypes[propName](props, propName, componentName, location);\n } catch (ex) {\n error = ex;\n }\n if (error instanceof Error) {\n // We may want to extend this logic for similar errors in\n // top-level render calls, so I'm abstracting it away into\n // a function to minimize refactoring in the future\n var addendum = getDeclarationErrorAddendum(this);\n\n if (location === ReactPropTypeLocations.prop) {\n // Preface gives us something to blacklist in warning module\n process.env.NODE_ENV !== 'production' ? warning(false, 'Failed Composite propType: %s%s', error.message, addendum) : undefined;\n } else {\n process.env.NODE_ENV !== 'production' ? warning(false, 'Failed Context Types: %s%s', error.message, addendum) : undefined;\n }\n }\n }\n }\n },\n\n receiveComponent: function (nextElement, transaction, nextContext) {\n var prevElement = this._currentElement;\n var prevContext = this._context;\n\n this._pendingElement = null;\n\n this.updateComponent(transaction, prevElement, nextElement, prevContext, nextContext);\n },\n\n /**\n * If any of `_pendingElement`, `_pendingStateQueue`, or `_pendingForceUpdate`\n * is set, update the component.\n *\n * @param {ReactReconcileTransaction} transaction\n * @internal\n */\n performUpdateIfNecessary: function (transaction) {\n if (this._pendingElement != null) {\n ReactReconciler.receiveComponent(this, this._pendingElement || this._currentElement, transaction, this._context);\n }\n\n if (this._pendingStateQueue !== null || this._pendingForceUpdate) {\n this.updateComponent(transaction, this._currentElement, this._currentElement, this._context, this._context);\n }\n },\n\n /**\n * Perform an update to a mounted component. The componentWillReceiveProps and\n * shouldComponentUpdate methods are called, then (assuming the update isn't\n * skipped) the remaining update lifecycle methods are called and the DOM\n * representation is updated.\n *\n * By default, this implements React's rendering and reconciliation algorithm.\n * Sophisticated clients may wish to override this.\n *\n * @param {ReactReconcileTransaction} transaction\n * @param {ReactElement} prevParentElement\n * @param {ReactElement} nextParentElement\n * @internal\n * @overridable\n */\n updateComponent: function (transaction, prevParentElement, nextParentElement, prevUnmaskedContext, nextUnmaskedContext) {\n var inst = this._instance;\n\n var nextContext = this._context === nextUnmaskedContext ? inst.context : this._processContext(nextUnmaskedContext);\n var nextProps;\n\n // Distinguish between a props update versus a simple state update\n if (prevParentElement === nextParentElement) {\n // Skip checking prop types again -- we don't read inst.props to avoid\n // warning for DOM component props in this upgrade\n nextProps = nextParentElement.props;\n } else {\n nextProps = this._processProps(nextParentElement.props);\n // An update here will schedule an update but immediately set\n // _pendingStateQueue which will ensure that any state updates gets\n // immediately reconciled instead of waiting for the next batch.\n\n if (inst.componentWillReceiveProps) {\n inst.componentWillReceiveProps(nextProps, nextContext);\n }\n }\n\n var nextState = this._processPendingState(nextProps, nextContext);\n\n var shouldUpdate = this._pendingForceUpdate || !inst.shouldComponentUpdate || inst.shouldComponentUpdate(nextProps, nextState, nextContext);\n\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(typeof shouldUpdate !== 'undefined', '%s.shouldComponentUpdate(): Returned undefined instead of a ' + 'boolean value. Make sure to return true or false.', this.getName() || 'ReactCompositeComponent') : undefined;\n }\n\n if (shouldUpdate) {\n this._pendingForceUpdate = false;\n // Will set `this.props`, `this.state` and `this.context`.\n this._performComponentUpdate(nextParentElement, nextProps, nextState, nextContext, transaction, nextUnmaskedContext);\n } else {\n // If it's determined that a component should not update, we still want\n // to set props and state but we shortcut the rest of the update.\n this._currentElement = nextParentElement;\n this._context = nextUnmaskedContext;\n inst.props = nextProps;\n inst.state = nextState;\n inst.context = nextContext;\n }\n },\n\n _processPendingState: function (props, context) {\n var inst = this._instance;\n var queue = this._pendingStateQueue;\n var replace = this._pendingReplaceState;\n this._pendingReplaceState = false;\n this._pendingStateQueue = null;\n\n if (!queue) {\n return inst.state;\n }\n\n if (replace && queue.length === 1) {\n return queue[0];\n }\n\n var nextState = assign({}, replace ? queue[0] : inst.state);\n for (var i = replace ? 1 : 0; i < queue.length; i++) {\n var partial = queue[i];\n assign(nextState, typeof partial === 'function' ? partial.call(inst, nextState, props, context) : partial);\n }\n\n return nextState;\n },\n\n /**\n * Merges new props and state, notifies delegate methods of update and\n * performs update.\n *\n * @param {ReactElement} nextElement Next element\n * @param {object} nextProps Next public object to set as properties.\n * @param {?object} nextState Next object to set as state.\n * @param {?object} nextContext Next public object to set as context.\n * @param {ReactReconcileTransaction} transaction\n * @param {?object} unmaskedContext\n * @private\n */\n _performComponentUpdate: function (nextElement, nextProps, nextState, nextContext, transaction, unmaskedContext) {\n var inst = this._instance;\n\n var hasComponentDidUpdate = Boolean(inst.componentDidUpdate);\n var prevProps;\n var prevState;\n var prevContext;\n if (hasComponentDidUpdate) {\n prevProps = inst.props;\n prevState = inst.state;\n prevContext = inst.context;\n }\n\n if (inst.componentWillUpdate) {\n inst.componentWillUpdate(nextProps, nextState, nextContext);\n }\n\n this._currentElement = nextElement;\n this._context = unmaskedContext;\n inst.props = nextProps;\n inst.state = nextState;\n inst.context = nextContext;\n\n this._updateRenderedComponent(transaction, unmaskedContext);\n\n if (hasComponentDidUpdate) {\n transaction.getReactMountReady().enqueue(inst.componentDidUpdate.bind(inst, prevProps, prevState, prevContext), inst);\n }\n },\n\n /**\n * Call the component's `render` method and update the DOM accordingly.\n *\n * @param {ReactReconcileTransaction} transaction\n * @internal\n */\n _updateRenderedComponent: function (transaction, context) {\n var prevComponentInstance = this._renderedComponent;\n var prevRenderedElement = prevComponentInstance._currentElement;\n var nextRenderedElement = this._renderValidatedComponent();\n if (shouldUpdateReactComponent(prevRenderedElement, nextRenderedElement)) {\n ReactReconciler.receiveComponent(prevComponentInstance, nextRenderedElement, transaction, this._processChildContext(context));\n } else {\n // These two IDs are actually the same! But nothing should rely on that.\n var thisID = this._rootNodeID;\n var prevComponentID = prevComponentInstance._rootNodeID;\n ReactReconciler.unmountComponent(prevComponentInstance);\n\n this._renderedComponent = this._instantiateReactComponent(nextRenderedElement);\n var nextMarkup = ReactReconciler.mountComponent(this._renderedComponent, thisID, transaction, this._processChildContext(context));\n this._replaceNodeWithMarkupByID(prevComponentID, nextMarkup);\n }\n },\n\n /**\n * @protected\n */\n _replaceNodeWithMarkupByID: function (prevComponentID, nextMarkup) {\n ReactComponentEnvironment.replaceNodeWithMarkupByID(prevComponentID, nextMarkup);\n },\n\n /**\n * @protected\n */\n _renderValidatedComponentWithoutOwnerOrContext: function () {\n var inst = this._instance;\n var renderedComponent = inst.render();\n if (process.env.NODE_ENV !== 'production') {\n // We allow auto-mocks to proceed as if they're returning null.\n if (typeof renderedComponent === 'undefined' && inst.render._isMockFunction) {\n // This is probably bad practice. Consider warning here and\n // deprecating this convenience.\n renderedComponent = null;\n }\n }\n\n return renderedComponent;\n },\n\n /**\n * @private\n */\n _renderValidatedComponent: function () {\n var renderedComponent;\n ReactCurrentOwner.current = this;\n try {\n renderedComponent = this._renderValidatedComponentWithoutOwnerOrContext();\n } finally {\n ReactCurrentOwner.current = null;\n }\n !(\n // TODO: An `isValidNode` function would probably be more appropriate\n renderedComponent === null || renderedComponent === false || ReactElement.isValidElement(renderedComponent)) ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s.render(): A valid ReactComponent must be returned. You may have ' + 'returned undefined, an array or some other invalid object.', this.getName() || 'ReactCompositeComponent') : invariant(false) : undefined;\n return renderedComponent;\n },\n\n /**\n * Lazily allocates the refs object and stores `component` as `ref`.\n *\n * @param {string} ref Reference name.\n * @param {component} component Component to store as `ref`.\n * @final\n * @private\n */\n attachRef: function (ref, component) {\n var inst = this.getPublicInstance();\n !(inst != null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Stateless function components cannot have refs.') : invariant(false) : undefined;\n var publicComponentInstance = component.getPublicInstance();\n if (process.env.NODE_ENV !== 'production') {\n var componentName = component && component.getName ? component.getName() : 'a component';\n process.env.NODE_ENV !== 'production' ? warning(publicComponentInstance != null, 'Stateless function components cannot be given refs ' + '(See ref \"%s\" in %s created by %s). ' + 'Attempts to access this ref will fail.', ref, componentName, this.getName()) : undefined;\n }\n var refs = inst.refs === emptyObject ? inst.refs = {} : inst.refs;\n refs[ref] = publicComponentInstance;\n },\n\n /**\n * Detaches a reference name.\n *\n * @param {string} ref Name to dereference.\n * @final\n * @private\n */\n detachRef: function (ref) {\n var refs = this.getPublicInstance().refs;\n delete refs[ref];\n },\n\n /**\n * Get a text description of the component that can be used to identify it\n * in error messages.\n * @return {string} The name or null.\n * @internal\n */\n getName: function () {\n var type = this._currentElement.type;\n var constructor = this._instance && this._instance.constructor;\n return type.displayName || constructor && constructor.displayName || type.name || constructor && constructor.name || null;\n },\n\n /**\n * Get the publicly accessible representation of this component - i.e. what\n * is exposed by refs and returned by render. Can be null for stateless\n * components.\n *\n * @return {ReactComponent} the public component instance.\n * @internal\n */\n getPublicInstance: function () {\n var inst = this._instance;\n if (inst instanceof StatelessComponent) {\n return null;\n }\n return inst;\n },\n\n // Stub\n _instantiateReactComponent: null\n\n};\n\nReactPerf.measureMethods(ReactCompositeComponentMixin, 'ReactCompositeComponent', {\n mountComponent: 'mountComponent',\n updateComponent: 'updateComponent',\n _renderValidatedComponent: '_renderValidatedComponent'\n});\n\nvar ReactCompositeComponent = {\n\n Mixin: ReactCompositeComponentMixin\n\n};\n\nmodule.exports = ReactCompositeComponent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactCompositeComponent.js\n ** module id = 62\n ** module chunks = 0 1\n **/","/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactComponentEnvironment\n */\n\n'use strict';\n\nvar invariant = require('fbjs/lib/invariant');\n\nvar injected = false;\n\nvar ReactComponentEnvironment = {\n\n /**\n * Optionally injectable environment dependent cleanup hook. (server vs.\n * browser etc). Example: A browser system caches DOM nodes based on component\n * ID and must remove that cache entry when this instance is unmounted.\n */\n unmountIDFromEnvironment: null,\n\n /**\n * Optionally injectable hook for swapping out mount images in the middle of\n * the tree.\n */\n replaceNodeWithMarkupByID: null,\n\n /**\n * Optionally injectable hook for processing a queue of child updates. Will\n * later move into MultiChildComponents.\n */\n processChildrenUpdates: null,\n\n injection: {\n injectEnvironment: function (environment) {\n !!injected ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactCompositeComponent: injectEnvironment() can only be called once.') : invariant(false) : undefined;\n ReactComponentEnvironment.unmountIDFromEnvironment = environment.unmountIDFromEnvironment;\n ReactComponentEnvironment.replaceNodeWithMarkupByID = environment.replaceNodeWithMarkupByID;\n ReactComponentEnvironment.processChildrenUpdates = environment.processChildrenUpdates;\n injected = true;\n }\n }\n\n};\n\nmodule.exports = ReactComponentEnvironment;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactComponentEnvironment.js\n ** module id = 63\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactPropTypeLocations\n */\n\n'use strict';\n\nvar keyMirror = require('fbjs/lib/keyMirror');\n\nvar ReactPropTypeLocations = keyMirror({\n prop: null,\n context: null,\n childContext: null\n});\n\nmodule.exports = ReactPropTypeLocations;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactPropTypeLocations.js\n ** module id = 64\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactPropTypeLocationNames\n */\n\n'use strict';\n\nvar ReactPropTypeLocationNames = {};\n\nif (process.env.NODE_ENV !== 'production') {\n ReactPropTypeLocationNames = {\n prop: 'prop',\n context: 'context',\n childContext: 'child context'\n };\n}\n\nmodule.exports = ReactPropTypeLocationNames;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactPropTypeLocationNames.js\n ** module id = 65\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule shouldUpdateReactComponent\n * @typechecks static-only\n */\n\n'use strict';\n\n/**\n * Given a `prevElement` and `nextElement`, determines if the existing\n * instance should be updated as opposed to being destroyed or replaced by a new\n * instance. Both arguments are elements. This ensures that this logic can\n * operate on stateless trees without any backing instance.\n *\n * @param {?object} prevElement\n * @param {?object} nextElement\n * @return {boolean} True if the existing instance should be updated.\n * @protected\n */\nfunction shouldUpdateReactComponent(prevElement, nextElement) {\n var prevEmpty = prevElement === null || prevElement === false;\n var nextEmpty = nextElement === null || nextElement === false;\n if (prevEmpty || nextEmpty) {\n return prevEmpty === nextEmpty;\n }\n\n var prevType = typeof prevElement;\n var nextType = typeof nextElement;\n if (prevType === 'string' || prevType === 'number') {\n return nextType === 'string' || nextType === 'number';\n } else {\n return nextType === 'object' && prevElement.type === nextElement.type && prevElement.key === nextElement.key;\n }\n return false;\n}\n\nmodule.exports = shouldUpdateReactComponent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/shouldUpdateReactComponent.js\n ** module id = 66\n ** module chunks = 0 1\n **/","/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactEmptyComponent\n */\n\n'use strict';\n\nvar ReactElement = require('./ReactElement');\nvar ReactEmptyComponentRegistry = require('./ReactEmptyComponentRegistry');\nvar ReactReconciler = require('./ReactReconciler');\n\nvar assign = require('./Object.assign');\n\nvar placeholderElement;\n\nvar ReactEmptyComponentInjection = {\n injectEmptyComponent: function (component) {\n placeholderElement = ReactElement.createElement(component);\n }\n};\n\nvar ReactEmptyComponent = function (instantiate) {\n this._currentElement = null;\n this._rootNodeID = null;\n this._renderedComponent = instantiate(placeholderElement);\n};\nassign(ReactEmptyComponent.prototype, {\n construct: function (element) {},\n mountComponent: function (rootID, transaction, context) {\n ReactEmptyComponentRegistry.registerNullComponentID(rootID);\n this._rootNodeID = rootID;\n return ReactReconciler.mountComponent(this._renderedComponent, rootID, transaction, context);\n },\n receiveComponent: function () {},\n unmountComponent: function (rootID, transaction, context) {\n ReactReconciler.unmountComponent(this._renderedComponent);\n ReactEmptyComponentRegistry.deregisterNullComponentID(this._rootNodeID);\n this._rootNodeID = null;\n this._renderedComponent = null;\n }\n});\n\nReactEmptyComponent.injection = ReactEmptyComponentInjection;\n\nmodule.exports = ReactEmptyComponent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactEmptyComponent.js\n ** module id = 67\n ** module chunks = 0 1\n **/","/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactNativeComponent\n */\n\n'use strict';\n\nvar assign = require('./Object.assign');\nvar invariant = require('fbjs/lib/invariant');\n\nvar autoGenerateWrapperClass = null;\nvar genericComponentClass = null;\n// This registry keeps track of wrapper classes around native tags.\nvar tagToComponentClass = {};\nvar textComponentClass = null;\n\nvar ReactNativeComponentInjection = {\n // This accepts a class that receives the tag string. This is a catch all\n // that can render any kind of tag.\n injectGenericComponentClass: function (componentClass) {\n genericComponentClass = componentClass;\n },\n // This accepts a text component class that takes the text string to be\n // rendered as props.\n injectTextComponentClass: function (componentClass) {\n textComponentClass = componentClass;\n },\n // This accepts a keyed object with classes as values. Each key represents a\n // tag. That particular tag will use this class instead of the generic one.\n injectComponentClasses: function (componentClasses) {\n assign(tagToComponentClass, componentClasses);\n }\n};\n\n/**\n * Get a composite component wrapper class for a specific tag.\n *\n * @param {ReactElement} element The tag for which to get the class.\n * @return {function} The React class constructor function.\n */\nfunction getComponentClassForElement(element) {\n if (typeof element.type === 'function') {\n return element.type;\n }\n var tag = element.type;\n var componentClass = tagToComponentClass[tag];\n if (componentClass == null) {\n tagToComponentClass[tag] = componentClass = autoGenerateWrapperClass(tag);\n }\n return componentClass;\n}\n\n/**\n * Get a native internal component class for a specific tag.\n *\n * @param {ReactElement} element The element to create.\n * @return {function} The internal class constructor function.\n */\nfunction createInternalComponent(element) {\n !genericComponentClass ? process.env.NODE_ENV !== 'production' ? invariant(false, 'There is no registered component for the tag %s', element.type) : invariant(false) : undefined;\n return new genericComponentClass(element.type, element.props);\n}\n\n/**\n * @param {ReactText} text\n * @return {ReactComponent}\n */\nfunction createInstanceForText(text) {\n return new textComponentClass(text);\n}\n\n/**\n * @param {ReactComponent} component\n * @return {boolean}\n */\nfunction isTextComponent(component) {\n return component instanceof textComponentClass;\n}\n\nvar ReactNativeComponent = {\n getComponentClassForElement: getComponentClassForElement,\n createInternalComponent: createInternalComponent,\n createInstanceForText: createInstanceForText,\n isTextComponent: isTextComponent,\n injection: ReactNativeComponentInjection\n};\n\nmodule.exports = ReactNativeComponent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactNativeComponent.js\n ** module id = 68\n ** module chunks = 0 1\n **/","/**\n * Copyright 2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule validateDOMNesting\n */\n\n'use strict';\n\nvar assign = require('./Object.assign');\nvar emptyFunction = require('fbjs/lib/emptyFunction');\nvar warning = require('fbjs/lib/warning');\n\nvar validateDOMNesting = emptyFunction;\n\nif (process.env.NODE_ENV !== 'production') {\n // This validation code was written based on the HTML5 parsing spec:\n // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope\n //\n // Note: this does not catch all invalid nesting, nor does it try to (as it's\n // not clear what practical benefit doing so provides); instead, we warn only\n // for cases where the parser will give a parse tree differing from what React\n // intended. For example, <b><div></div></b> is invalid but we don't warn\n // because it still parses correctly; we do warn for other cases like nested\n // <p> tags where the beginning of the second element implicitly closes the\n // first, causing a confusing mess.\n\n // https://html.spec.whatwg.org/multipage/syntax.html#special\n var specialTags = ['address', 'applet', 'area', 'article', 'aside', 'base', 'basefont', 'bgsound', 'blockquote', 'body', 'br', 'button', 'caption', 'center', 'col', 'colgroup', 'dd', 'details', 'dir', 'div', 'dl', 'dt', 'embed', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'frame', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'iframe', 'img', 'input', 'isindex', 'li', 'link', 'listing', 'main', 'marquee', 'menu', 'menuitem', 'meta', 'nav', 'noembed', 'noframes', 'noscript', 'object', 'ol', 'p', 'param', 'plaintext', 'pre', 'script', 'section', 'select', 'source', 'style', 'summary', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'title', 'tr', 'track', 'ul', 'wbr', 'xmp'];\n\n // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope\n var inScopeTags = ['applet', 'caption', 'html', 'table', 'td', 'th', 'marquee', 'object', 'template',\n\n // https://html.spec.whatwg.org/multipage/syntax.html#html-integration-point\n // TODO: Distinguish by namespace here -- for <title>, including it here\n // errs on the side of fewer warnings\n 'foreignObject', 'desc', 'title'];\n\n // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-button-scope\n var buttonScopeTags = inScopeTags.concat(['button']);\n\n // https://html.spec.whatwg.org/multipage/syntax.html#generate-implied-end-tags\n var impliedEndTags = ['dd', 'dt', 'li', 'option', 'optgroup', 'p', 'rp', 'rt'];\n\n var emptyAncestorInfo = {\n parentTag: null,\n\n formTag: null,\n aTagInScope: null,\n buttonTagInScope: null,\n nobrTagInScope: null,\n pTagInButtonScope: null,\n\n listItemTagAutoclosing: null,\n dlItemTagAutoclosing: null\n };\n\n var updatedAncestorInfo = function (oldInfo, tag, instance) {\n var ancestorInfo = assign({}, oldInfo || emptyAncestorInfo);\n var info = { tag: tag, instance: instance };\n\n if (inScopeTags.indexOf(tag) !== -1) {\n ancestorInfo.aTagInScope = null;\n ancestorInfo.buttonTagInScope = null;\n ancestorInfo.nobrTagInScope = null;\n }\n if (buttonScopeTags.indexOf(tag) !== -1) {\n ancestorInfo.pTagInButtonScope = null;\n }\n\n // See rules for 'li', 'dd', 'dt' start tags in\n // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody\n if (specialTags.indexOf(tag) !== -1 && tag !== 'address' && tag !== 'div' && tag !== 'p') {\n ancestorInfo.listItemTagAutoclosing = null;\n ancestorInfo.dlItemTagAutoclosing = null;\n }\n\n ancestorInfo.parentTag = info;\n\n if (tag === 'form') {\n ancestorInfo.formTag = info;\n }\n if (tag === 'a') {\n ancestorInfo.aTagInScope = info;\n }\n if (tag === 'button') {\n ancestorInfo.buttonTagInScope = info;\n }\n if (tag === 'nobr') {\n ancestorInfo.nobrTagInScope = info;\n }\n if (tag === 'p') {\n ancestorInfo.pTagInButtonScope = info;\n }\n if (tag === 'li') {\n ancestorInfo.listItemTagAutoclosing = info;\n }\n if (tag === 'dd' || tag === 'dt') {\n ancestorInfo.dlItemTagAutoclosing = info;\n }\n\n return ancestorInfo;\n };\n\n /**\n * Returns whether\n */\n var isTagValidWithParent = function (tag, parentTag) {\n // First, let's check if we're in an unusual parsing mode...\n switch (parentTag) {\n // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inselect\n case 'select':\n return tag === 'option' || tag === 'optgroup' || tag === '#text';\n case 'optgroup':\n return tag === 'option' || tag === '#text';\n // Strictly speaking, seeing an <option> doesn't mean we're in a <select>\n // but\n case 'option':\n return tag === '#text';\n\n // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intd\n // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incaption\n // No special behavior since these rules fall back to \"in body\" mode for\n // all except special table nodes which cause bad parsing behavior anyway.\n\n // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intr\n case 'tr':\n return tag === 'th' || tag === 'td' || tag === 'style' || tag === 'script' || tag === 'template';\n\n // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intbody\n case 'tbody':\n case 'thead':\n case 'tfoot':\n return tag === 'tr' || tag === 'style' || tag === 'script' || tag === 'template';\n\n // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incolgroup\n case 'colgroup':\n return tag === 'col' || tag === 'template';\n\n // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intable\n case 'table':\n return tag === 'caption' || tag === 'colgroup' || tag === 'tbody' || tag === 'tfoot' || tag === 'thead' || tag === 'style' || tag === 'script' || tag === 'template';\n\n // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inhead\n case 'head':\n return tag === 'base' || tag === 'basefont' || tag === 'bgsound' || tag === 'link' || tag === 'meta' || tag === 'title' || tag === 'noscript' || tag === 'noframes' || tag === 'style' || tag === 'script' || tag === 'template';\n\n // https://html.spec.whatwg.org/multipage/semantics.html#the-html-element\n case 'html':\n return tag === 'head' || tag === 'body';\n }\n\n // Probably in the \"in body\" parsing mode, so we outlaw only tag combos\n // where the parsing rules cause implicit opens or closes to be added.\n // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody\n switch (tag) {\n case 'h1':\n case 'h2':\n case 'h3':\n case 'h4':\n case 'h5':\n case 'h6':\n return parentTag !== 'h1' && parentTag !== 'h2' && parentTag !== 'h3' && parentTag !== 'h4' && parentTag !== 'h5' && parentTag !== 'h6';\n\n case 'rp':\n case 'rt':\n return impliedEndTags.indexOf(parentTag) === -1;\n\n case 'caption':\n case 'col':\n case 'colgroup':\n case 'frame':\n case 'head':\n case 'tbody':\n case 'td':\n case 'tfoot':\n case 'th':\n case 'thead':\n case 'tr':\n // These tags are only valid with a few parents that have special child\n // parsing rules -- if we're down here, then none of those matched and\n // so we allow it only if we don't know what the parent is, as all other\n // cases are invalid.\n return parentTag == null;\n }\n\n return true;\n };\n\n /**\n * Returns whether\n */\n var findInvalidAncestorForTag = function (tag, ancestorInfo) {\n switch (tag) {\n case 'address':\n case 'article':\n case 'aside':\n case 'blockquote':\n case 'center':\n case 'details':\n case 'dialog':\n case 'dir':\n case 'div':\n case 'dl':\n case 'fieldset':\n case 'figcaption':\n case 'figure':\n case 'footer':\n case 'header':\n case 'hgroup':\n case 'main':\n case 'menu':\n case 'nav':\n case 'ol':\n case 'p':\n case 'section':\n case 'summary':\n case 'ul':\n\n case 'pre':\n case 'listing':\n\n case 'table':\n\n case 'hr':\n\n case 'xmp':\n\n case 'h1':\n case 'h2':\n case 'h3':\n case 'h4':\n case 'h5':\n case 'h6':\n return ancestorInfo.pTagInButtonScope;\n\n case 'form':\n return ancestorInfo.formTag || ancestorInfo.pTagInButtonScope;\n\n case 'li':\n return ancestorInfo.listItemTagAutoclosing;\n\n case 'dd':\n case 'dt':\n return ancestorInfo.dlItemTagAutoclosing;\n\n case 'button':\n return ancestorInfo.buttonTagInScope;\n\n case 'a':\n // Spec says something about storing a list of markers, but it sounds\n // equivalent to this check.\n return ancestorInfo.aTagInScope;\n\n case 'nobr':\n return ancestorInfo.nobrTagInScope;\n }\n\n return null;\n };\n\n /**\n * Given a ReactCompositeComponent instance, return a list of its recursive\n * owners, starting at the root and ending with the instance itself.\n */\n var findOwnerStack = function (instance) {\n if (!instance) {\n return [];\n }\n\n var stack = [];\n /*eslint-disable space-after-keywords */\n do {\n /*eslint-enable space-after-keywords */\n stack.push(instance);\n } while (instance = instance._currentElement._owner);\n stack.reverse();\n return stack;\n };\n\n var didWarn = {};\n\n validateDOMNesting = function (childTag, childInstance, ancestorInfo) {\n ancestorInfo = ancestorInfo || emptyAncestorInfo;\n var parentInfo = ancestorInfo.parentTag;\n var parentTag = parentInfo && parentInfo.tag;\n\n var invalidParent = isTagValidWithParent(childTag, parentTag) ? null : parentInfo;\n var invalidAncestor = invalidParent ? null : findInvalidAncestorForTag(childTag, ancestorInfo);\n var problematic = invalidParent || invalidAncestor;\n\n if (problematic) {\n var ancestorTag = problematic.tag;\n var ancestorInstance = problematic.instance;\n\n var childOwner = childInstance && childInstance._currentElement._owner;\n var ancestorOwner = ancestorInstance && ancestorInstance._currentElement._owner;\n\n var childOwners = findOwnerStack(childOwner);\n var ancestorOwners = findOwnerStack(ancestorOwner);\n\n var minStackLen = Math.min(childOwners.length, ancestorOwners.length);\n var i;\n\n var deepestCommon = -1;\n for (i = 0; i < minStackLen; i++) {\n if (childOwners[i] === ancestorOwners[i]) {\n deepestCommon = i;\n } else {\n break;\n }\n }\n\n var UNKNOWN = '(unknown)';\n var childOwnerNames = childOwners.slice(deepestCommon + 1).map(function (inst) {\n return inst.getName() || UNKNOWN;\n });\n var ancestorOwnerNames = ancestorOwners.slice(deepestCommon + 1).map(function (inst) {\n return inst.getName() || UNKNOWN;\n });\n var ownerInfo = [].concat(\n // If the parent and child instances have a common owner ancestor, start\n // with that -- otherwise we just start with the parent's owners.\n deepestCommon !== -1 ? childOwners[deepestCommon].getName() || UNKNOWN : [], ancestorOwnerNames, ancestorTag,\n // If we're warning about an invalid (non-parent) ancestry, add '...'\n invalidAncestor ? ['...'] : [], childOwnerNames, childTag).join(' > ');\n\n var warnKey = !!invalidParent + '|' + childTag + '|' + ancestorTag + '|' + ownerInfo;\n if (didWarn[warnKey]) {\n return;\n }\n didWarn[warnKey] = true;\n\n if (invalidParent) {\n var info = '';\n if (ancestorTag === 'table' && childTag === 'tr') {\n info += ' Add a <tbody> to your code to match the DOM tree generated by ' + 'the browser.';\n }\n process.env.NODE_ENV !== 'production' ? warning(false, 'validateDOMNesting(...): <%s> cannot appear as a child of <%s>. ' + 'See %s.%s', childTag, ancestorTag, ownerInfo, info) : undefined;\n } else {\n process.env.NODE_ENV !== 'production' ? warning(false, 'validateDOMNesting(...): <%s> cannot appear as a descendant of ' + '<%s>. See %s.', childTag, ancestorTag, ownerInfo) : undefined;\n }\n }\n };\n\n validateDOMNesting.ancestorInfoContextKey = '__validateDOMNesting_ancestorInfo$' + Math.random().toString(36).slice(2);\n\n validateDOMNesting.updatedAncestorInfo = updatedAncestorInfo;\n\n // For testing\n validateDOMNesting.isTagValidInContext = function (tag, ancestorInfo) {\n ancestorInfo = ancestorInfo || emptyAncestorInfo;\n var parentInfo = ancestorInfo.parentTag;\n var parentTag = parentInfo && parentInfo.tag;\n return isTagValidWithParent(tag, parentTag) && !findInvalidAncestorForTag(tag, ancestorInfo);\n };\n}\n\nmodule.exports = validateDOMNesting;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/validateDOMNesting.js\n ** module id = 69\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactDefaultInjection\n */\n\n'use strict';\n\nvar BeforeInputEventPlugin = require('./BeforeInputEventPlugin');\nvar ChangeEventPlugin = require('./ChangeEventPlugin');\nvar ClientReactRootIndex = require('./ClientReactRootIndex');\nvar DefaultEventPluginOrder = require('./DefaultEventPluginOrder');\nvar EnterLeaveEventPlugin = require('./EnterLeaveEventPlugin');\nvar ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');\nvar HTMLDOMPropertyConfig = require('./HTMLDOMPropertyConfig');\nvar ReactBrowserComponentMixin = require('./ReactBrowserComponentMixin');\nvar ReactComponentBrowserEnvironment = require('./ReactComponentBrowserEnvironment');\nvar ReactDefaultBatchingStrategy = require('./ReactDefaultBatchingStrategy');\nvar ReactDOMComponent = require('./ReactDOMComponent');\nvar ReactDOMTextComponent = require('./ReactDOMTextComponent');\nvar ReactEventListener = require('./ReactEventListener');\nvar ReactInjection = require('./ReactInjection');\nvar ReactInstanceHandles = require('./ReactInstanceHandles');\nvar ReactMount = require('./ReactMount');\nvar ReactReconcileTransaction = require('./ReactReconcileTransaction');\nvar SelectEventPlugin = require('./SelectEventPlugin');\nvar ServerReactRootIndex = require('./ServerReactRootIndex');\nvar SimpleEventPlugin = require('./SimpleEventPlugin');\nvar SVGDOMPropertyConfig = require('./SVGDOMPropertyConfig');\n\nvar alreadyInjected = false;\n\nfunction inject() {\n if (alreadyInjected) {\n // TODO: This is currently true because these injections are shared between\n // the client and the server package. They should be built independently\n // and not share any injection state. Then this problem will be solved.\n return;\n }\n alreadyInjected = true;\n\n ReactInjection.EventEmitter.injectReactEventListener(ReactEventListener);\n\n /**\n * Inject modules for resolving DOM hierarchy and plugin ordering.\n */\n ReactInjection.EventPluginHub.injectEventPluginOrder(DefaultEventPluginOrder);\n ReactInjection.EventPluginHub.injectInstanceHandle(ReactInstanceHandles);\n ReactInjection.EventPluginHub.injectMount(ReactMount);\n\n /**\n * Some important event plugins included by default (without having to require\n * them).\n */\n ReactInjection.EventPluginHub.injectEventPluginsByName({\n SimpleEventPlugin: SimpleEventPlugin,\n EnterLeaveEventPlugin: EnterLeaveEventPlugin,\n ChangeEventPlugin: ChangeEventPlugin,\n SelectEventPlugin: SelectEventPlugin,\n BeforeInputEventPlugin: BeforeInputEventPlugin\n });\n\n ReactInjection.NativeComponent.injectGenericComponentClass(ReactDOMComponent);\n\n ReactInjection.NativeComponent.injectTextComponentClass(ReactDOMTextComponent);\n\n ReactInjection.Class.injectMixin(ReactBrowserComponentMixin);\n\n ReactInjection.DOMProperty.injectDOMPropertyConfig(HTMLDOMPropertyConfig);\n ReactInjection.DOMProperty.injectDOMPropertyConfig(SVGDOMPropertyConfig);\n\n ReactInjection.EmptyComponent.injectEmptyComponent('noscript');\n\n ReactInjection.Updates.injectReconcileTransaction(ReactReconcileTransaction);\n ReactInjection.Updates.injectBatchingStrategy(ReactDefaultBatchingStrategy);\n\n ReactInjection.RootIndex.injectCreateReactRootIndex(ExecutionEnvironment.canUseDOM ? ClientReactRootIndex.createReactRootIndex : ServerReactRootIndex.createReactRootIndex);\n\n ReactInjection.Component.injectEnvironment(ReactComponentBrowserEnvironment);\n\n if (process.env.NODE_ENV !== 'production') {\n var url = ExecutionEnvironment.canUseDOM && window.location.href || '';\n if (/[?&]react_perf\\b/.test(url)) {\n var ReactDefaultPerf = require('./ReactDefaultPerf');\n ReactDefaultPerf.start();\n }\n }\n}\n\nmodule.exports = {\n inject: inject\n};\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactDefaultInjection.js\n ** module id = 70\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015 Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule BeforeInputEventPlugin\n * @typechecks static-only\n */\n\n'use strict';\n\nvar EventConstants = require('./EventConstants');\nvar EventPropagators = require('./EventPropagators');\nvar ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');\nvar FallbackCompositionState = require('./FallbackCompositionState');\nvar SyntheticCompositionEvent = require('./SyntheticCompositionEvent');\nvar SyntheticInputEvent = require('./SyntheticInputEvent');\n\nvar keyOf = require('fbjs/lib/keyOf');\n\nvar END_KEYCODES = [9, 13, 27, 32]; // Tab, Return, Esc, Space\nvar START_KEYCODE = 229;\n\nvar canUseCompositionEvent = ExecutionEnvironment.canUseDOM && 'CompositionEvent' in window;\n\nvar documentMode = null;\nif (ExecutionEnvironment.canUseDOM && 'documentMode' in document) {\n documentMode = document.documentMode;\n}\n\n// Webkit offers a very useful `textInput` event that can be used to\n// directly represent `beforeInput`. The IE `textinput` event is not as\n// useful, so we don't use it.\nvar canUseTextInputEvent = ExecutionEnvironment.canUseDOM && 'TextEvent' in window && !documentMode && !isPresto();\n\n// In IE9+, we have access to composition events, but the data supplied\n// by the native compositionend event may be incorrect. Japanese ideographic\n// spaces, for instance (\\u3000) are not recorded correctly.\nvar useFallbackCompositionData = ExecutionEnvironment.canUseDOM && (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11);\n\n/**\n * Opera <= 12 includes TextEvent in window, but does not fire\n * text input events. Rely on keypress instead.\n */\nfunction isPresto() {\n var opera = window.opera;\n return typeof opera === 'object' && typeof opera.version === 'function' && parseInt(opera.version(), 10) <= 12;\n}\n\nvar SPACEBAR_CODE = 32;\nvar SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE);\n\nvar topLevelTypes = EventConstants.topLevelTypes;\n\n// Events and their corresponding property names.\nvar eventTypes = {\n beforeInput: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onBeforeInput: null }),\n captured: keyOf({ onBeforeInputCapture: null })\n },\n dependencies: [topLevelTypes.topCompositionEnd, topLevelTypes.topKeyPress, topLevelTypes.topTextInput, topLevelTypes.topPaste]\n },\n compositionEnd: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onCompositionEnd: null }),\n captured: keyOf({ onCompositionEndCapture: null })\n },\n dependencies: [topLevelTypes.topBlur, topLevelTypes.topCompositionEnd, topLevelTypes.topKeyDown, topLevelTypes.topKeyPress, topLevelTypes.topKeyUp, topLevelTypes.topMouseDown]\n },\n compositionStart: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onCompositionStart: null }),\n captured: keyOf({ onCompositionStartCapture: null })\n },\n dependencies: [topLevelTypes.topBlur, topLevelTypes.topCompositionStart, topLevelTypes.topKeyDown, topLevelTypes.topKeyPress, topLevelTypes.topKeyUp, topLevelTypes.topMouseDown]\n },\n compositionUpdate: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onCompositionUpdate: null }),\n captured: keyOf({ onCompositionUpdateCapture: null })\n },\n dependencies: [topLevelTypes.topBlur, topLevelTypes.topCompositionUpdate, topLevelTypes.topKeyDown, topLevelTypes.topKeyPress, topLevelTypes.topKeyUp, topLevelTypes.topMouseDown]\n }\n};\n\n// Track whether we've ever handled a keypress on the space key.\nvar hasSpaceKeypress = false;\n\n/**\n * Return whether a native keypress event is assumed to be a command.\n * This is required because Firefox fires `keypress` events for key commands\n * (cut, copy, select-all, etc.) even though no character is inserted.\n */\nfunction isKeypressCommand(nativeEvent) {\n return (nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) &&\n // ctrlKey && altKey is equivalent to AltGr, and is not a command.\n !(nativeEvent.ctrlKey && nativeEvent.altKey);\n}\n\n/**\n * Translate native top level events into event types.\n *\n * @param {string} topLevelType\n * @return {object}\n */\nfunction getCompositionEventType(topLevelType) {\n switch (topLevelType) {\n case topLevelTypes.topCompositionStart:\n return eventTypes.compositionStart;\n case topLevelTypes.topCompositionEnd:\n return eventTypes.compositionEnd;\n case topLevelTypes.topCompositionUpdate:\n return eventTypes.compositionUpdate;\n }\n}\n\n/**\n * Does our fallback best-guess model think this event signifies that\n * composition has begun?\n *\n * @param {string} topLevelType\n * @param {object} nativeEvent\n * @return {boolean}\n */\nfunction isFallbackCompositionStart(topLevelType, nativeEvent) {\n return topLevelType === topLevelTypes.topKeyDown && nativeEvent.keyCode === START_KEYCODE;\n}\n\n/**\n * Does our fallback mode think that this event is the end of composition?\n *\n * @param {string} topLevelType\n * @param {object} nativeEvent\n * @return {boolean}\n */\nfunction isFallbackCompositionEnd(topLevelType, nativeEvent) {\n switch (topLevelType) {\n case topLevelTypes.topKeyUp:\n // Command keys insert or clear IME input.\n return END_KEYCODES.indexOf(nativeEvent.keyCode) !== -1;\n case topLevelTypes.topKeyDown:\n // Expect IME keyCode on each keydown. If we get any other\n // code we must have exited earlier.\n return nativeEvent.keyCode !== START_KEYCODE;\n case topLevelTypes.topKeyPress:\n case topLevelTypes.topMouseDown:\n case topLevelTypes.topBlur:\n // Events are not possible without cancelling IME.\n return true;\n default:\n return false;\n }\n}\n\n/**\n * Google Input Tools provides composition data via a CustomEvent,\n * with the `data` property populated in the `detail` object. If this\n * is available on the event object, use it. If not, this is a plain\n * composition event and we have nothing special to extract.\n *\n * @param {object} nativeEvent\n * @return {?string}\n */\nfunction getDataFromCustomEvent(nativeEvent) {\n var detail = nativeEvent.detail;\n if (typeof detail === 'object' && 'data' in detail) {\n return detail.data;\n }\n return null;\n}\n\n// Track the current IME composition fallback object, if any.\nvar currentComposition = null;\n\n/**\n * @param {string} topLevelType Record from `EventConstants`.\n * @param {DOMEventTarget} topLevelTarget The listening component root node.\n * @param {string} topLevelTargetID ID of `topLevelTarget`.\n * @param {object} nativeEvent Native browser event.\n * @return {?object} A SyntheticCompositionEvent.\n */\nfunction extractCompositionEvent(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) {\n var eventType;\n var fallbackData;\n\n if (canUseCompositionEvent) {\n eventType = getCompositionEventType(topLevelType);\n } else if (!currentComposition) {\n if (isFallbackCompositionStart(topLevelType, nativeEvent)) {\n eventType = eventTypes.compositionStart;\n }\n } else if (isFallbackCompositionEnd(topLevelType, nativeEvent)) {\n eventType = eventTypes.compositionEnd;\n }\n\n if (!eventType) {\n return null;\n }\n\n if (useFallbackCompositionData) {\n // The current composition is stored statically and must not be\n // overwritten while composition continues.\n if (!currentComposition && eventType === eventTypes.compositionStart) {\n currentComposition = FallbackCompositionState.getPooled(topLevelTarget);\n } else if (eventType === eventTypes.compositionEnd) {\n if (currentComposition) {\n fallbackData = currentComposition.getData();\n }\n }\n }\n\n var event = SyntheticCompositionEvent.getPooled(eventType, topLevelTargetID, nativeEvent, nativeEventTarget);\n\n if (fallbackData) {\n // Inject data generated from fallback path into the synthetic event.\n // This matches the property of native CompositionEventInterface.\n event.data = fallbackData;\n } else {\n var customData = getDataFromCustomEvent(nativeEvent);\n if (customData !== null) {\n event.data = customData;\n }\n }\n\n EventPropagators.accumulateTwoPhaseDispatches(event);\n return event;\n}\n\n/**\n * @param {string} topLevelType Record from `EventConstants`.\n * @param {object} nativeEvent Native browser event.\n * @return {?string} The string corresponding to this `beforeInput` event.\n */\nfunction getNativeBeforeInputChars(topLevelType, nativeEvent) {\n switch (topLevelType) {\n case topLevelTypes.topCompositionEnd:\n return getDataFromCustomEvent(nativeEvent);\n case topLevelTypes.topKeyPress:\n /**\n * If native `textInput` events are available, our goal is to make\n * use of them. However, there is a special case: the spacebar key.\n * In Webkit, preventing default on a spacebar `textInput` event\n * cancels character insertion, but it *also* causes the browser\n * to fall back to its default spacebar behavior of scrolling the\n * page.\n *\n * Tracking at:\n * https://code.google.com/p/chromium/issues/detail?id=355103\n *\n * To avoid this issue, use the keypress event as if no `textInput`\n * event is available.\n */\n var which = nativeEvent.which;\n if (which !== SPACEBAR_CODE) {\n return null;\n }\n\n hasSpaceKeypress = true;\n return SPACEBAR_CHAR;\n\n case topLevelTypes.topTextInput:\n // Record the characters to be added to the DOM.\n var chars = nativeEvent.data;\n\n // If it's a spacebar character, assume that we have already handled\n // it at the keypress level and bail immediately. Android Chrome\n // doesn't give us keycodes, so we need to blacklist it.\n if (chars === SPACEBAR_CHAR && hasSpaceKeypress) {\n return null;\n }\n\n return chars;\n\n default:\n // For other native event types, do nothing.\n return null;\n }\n}\n\n/**\n * For browsers that do not provide the `textInput` event, extract the\n * appropriate string to use for SyntheticInputEvent.\n *\n * @param {string} topLevelType Record from `EventConstants`.\n * @param {object} nativeEvent Native browser event.\n * @return {?string} The fallback string for this `beforeInput` event.\n */\nfunction getFallbackBeforeInputChars(topLevelType, nativeEvent) {\n // If we are currently composing (IME) and using a fallback to do so,\n // try to extract the composed characters from the fallback object.\n if (currentComposition) {\n if (topLevelType === topLevelTypes.topCompositionEnd || isFallbackCompositionEnd(topLevelType, nativeEvent)) {\n var chars = currentComposition.getData();\n FallbackCompositionState.release(currentComposition);\n currentComposition = null;\n return chars;\n }\n return null;\n }\n\n switch (topLevelType) {\n case topLevelTypes.topPaste:\n // If a paste event occurs after a keypress, throw out the input\n // chars. Paste events should not lead to BeforeInput events.\n return null;\n case topLevelTypes.topKeyPress:\n /**\n * As of v27, Firefox may fire keypress events even when no character\n * will be inserted. A few possibilities:\n *\n * - `which` is `0`. Arrow keys, Esc key, etc.\n *\n * - `which` is the pressed key code, but no char is available.\n * Ex: 'AltGr + d` in Polish. There is no modified character for\n * this key combination and no character is inserted into the\n * document, but FF fires the keypress for char code `100` anyway.\n * No `input` event will occur.\n *\n * - `which` is the pressed key code, but a command combination is\n * being used. Ex: `Cmd+C`. No character is inserted, and no\n * `input` event will occur.\n */\n if (nativeEvent.which && !isKeypressCommand(nativeEvent)) {\n return String.fromCharCode(nativeEvent.which);\n }\n return null;\n case topLevelTypes.topCompositionEnd:\n return useFallbackCompositionData ? null : nativeEvent.data;\n default:\n return null;\n }\n}\n\n/**\n * Extract a SyntheticInputEvent for `beforeInput`, based on either native\n * `textInput` or fallback behavior.\n *\n * @param {string} topLevelType Record from `EventConstants`.\n * @param {DOMEventTarget} topLevelTarget The listening component root node.\n * @param {string} topLevelTargetID ID of `topLevelTarget`.\n * @param {object} nativeEvent Native browser event.\n * @return {?object} A SyntheticInputEvent.\n */\nfunction extractBeforeInputEvent(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) {\n var chars;\n\n if (canUseTextInputEvent) {\n chars = getNativeBeforeInputChars(topLevelType, nativeEvent);\n } else {\n chars = getFallbackBeforeInputChars(topLevelType, nativeEvent);\n }\n\n // If no characters are being inserted, no BeforeInput event should\n // be fired.\n if (!chars) {\n return null;\n }\n\n var event = SyntheticInputEvent.getPooled(eventTypes.beforeInput, topLevelTargetID, nativeEvent, nativeEventTarget);\n\n event.data = chars;\n EventPropagators.accumulateTwoPhaseDispatches(event);\n return event;\n}\n\n/**\n * Create an `onBeforeInput` event to match\n * http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105/#events-inputevents.\n *\n * This event plugin is based on the native `textInput` event\n * available in Chrome, Safari, Opera, and IE. This event fires after\n * `onKeyPress` and `onCompositionEnd`, but before `onInput`.\n *\n * `beforeInput` is spec'd but not implemented in any browsers, and\n * the `input` event does not provide any useful information about what has\n * actually been added, contrary to the spec. Thus, `textInput` is the best\n * available event to identify the characters that have actually been inserted\n * into the target node.\n *\n * This plugin is also responsible for emitting `composition` events, thus\n * allowing us to share composition fallback code for both `beforeInput` and\n * `composition` event types.\n */\nvar BeforeInputEventPlugin = {\n\n eventTypes: eventTypes,\n\n /**\n * @param {string} topLevelType Record from `EventConstants`.\n * @param {DOMEventTarget} topLevelTarget The listening component root node.\n * @param {string} topLevelTargetID ID of `topLevelTarget`.\n * @param {object} nativeEvent Native browser event.\n * @return {*} An accumulation of synthetic events.\n * @see {EventPluginHub.extractEvents}\n */\n extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) {\n return [extractCompositionEvent(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget), extractBeforeInputEvent(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget)];\n }\n};\n\nmodule.exports = BeforeInputEventPlugin;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/BeforeInputEventPlugin.js\n ** module id = 71\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule EventPropagators\n */\n\n'use strict';\n\nvar EventConstants = require('./EventConstants');\nvar EventPluginHub = require('./EventPluginHub');\n\nvar warning = require('fbjs/lib/warning');\n\nvar accumulateInto = require('./accumulateInto');\nvar forEachAccumulated = require('./forEachAccumulated');\n\nvar PropagationPhases = EventConstants.PropagationPhases;\nvar getListener = EventPluginHub.getListener;\n\n/**\n * Some event types have a notion of different registration names for different\n * \"phases\" of propagation. This finds listeners by a given phase.\n */\nfunction listenerAtPhase(id, event, propagationPhase) {\n var registrationName = event.dispatchConfig.phasedRegistrationNames[propagationPhase];\n return getListener(id, registrationName);\n}\n\n/**\n * Tags a `SyntheticEvent` with dispatched listeners. Creating this function\n * here, allows us to not have to bind or create functions for each event.\n * Mutating the event's members allows us to not have to create a wrapping\n * \"dispatch\" object that pairs the event with the listener.\n */\nfunction accumulateDirectionalDispatches(domID, upwards, event) {\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(domID, 'Dispatching id must not be null') : undefined;\n }\n var phase = upwards ? PropagationPhases.bubbled : PropagationPhases.captured;\n var listener = listenerAtPhase(domID, event, phase);\n if (listener) {\n event._dispatchListeners = accumulateInto(event._dispatchListeners, listener);\n event._dispatchIDs = accumulateInto(event._dispatchIDs, domID);\n }\n}\n\n/**\n * Collect dispatches (must be entirely collected before dispatching - see unit\n * tests). Lazily allocate the array to conserve memory. We must loop through\n * each event and perform the traversal for each one. We cannot perform a\n * single traversal for the entire collection of events because each event may\n * have a different target.\n */\nfunction accumulateTwoPhaseDispatchesSingle(event) {\n if (event && event.dispatchConfig.phasedRegistrationNames) {\n EventPluginHub.injection.getInstanceHandle().traverseTwoPhase(event.dispatchMarker, accumulateDirectionalDispatches, event);\n }\n}\n\n/**\n * Same as `accumulateTwoPhaseDispatchesSingle`, but skips over the targetID.\n */\nfunction accumulateTwoPhaseDispatchesSingleSkipTarget(event) {\n if (event && event.dispatchConfig.phasedRegistrationNames) {\n EventPluginHub.injection.getInstanceHandle().traverseTwoPhaseSkipTarget(event.dispatchMarker, accumulateDirectionalDispatches, event);\n }\n}\n\n/**\n * Accumulates without regard to direction, does not look for phased\n * registration names. Same as `accumulateDirectDispatchesSingle` but without\n * requiring that the `dispatchMarker` be the same as the dispatched ID.\n */\nfunction accumulateDispatches(id, ignoredDirection, event) {\n if (event && event.dispatchConfig.registrationName) {\n var registrationName = event.dispatchConfig.registrationName;\n var listener = getListener(id, registrationName);\n if (listener) {\n event._dispatchListeners = accumulateInto(event._dispatchListeners, listener);\n event._dispatchIDs = accumulateInto(event._dispatchIDs, id);\n }\n }\n}\n\n/**\n * Accumulates dispatches on an `SyntheticEvent`, but only for the\n * `dispatchMarker`.\n * @param {SyntheticEvent} event\n */\nfunction accumulateDirectDispatchesSingle(event) {\n if (event && event.dispatchConfig.registrationName) {\n accumulateDispatches(event.dispatchMarker, null, event);\n }\n}\n\nfunction accumulateTwoPhaseDispatches(events) {\n forEachAccumulated(events, accumulateTwoPhaseDispatchesSingle);\n}\n\nfunction accumulateTwoPhaseDispatchesSkipTarget(events) {\n forEachAccumulated(events, accumulateTwoPhaseDispatchesSingleSkipTarget);\n}\n\nfunction accumulateEnterLeaveDispatches(leave, enter, fromID, toID) {\n EventPluginHub.injection.getInstanceHandle().traverseEnterLeave(fromID, toID, accumulateDispatches, leave, enter);\n}\n\nfunction accumulateDirectDispatches(events) {\n forEachAccumulated(events, accumulateDirectDispatchesSingle);\n}\n\n/**\n * A small set of propagation patterns, each of which will accept a small amount\n * of information, and generate a set of \"dispatch ready event objects\" - which\n * are sets of events that have already been annotated with a set of dispatched\n * listener functions/ids. The API is designed this way to discourage these\n * propagation strategies from actually executing the dispatches, since we\n * always want to collect the entire set of dispatches before executing event a\n * single one.\n *\n * @constructor EventPropagators\n */\nvar EventPropagators = {\n accumulateTwoPhaseDispatches: accumulateTwoPhaseDispatches,\n accumulateTwoPhaseDispatchesSkipTarget: accumulateTwoPhaseDispatchesSkipTarget,\n accumulateDirectDispatches: accumulateDirectDispatches,\n accumulateEnterLeaveDispatches: accumulateEnterLeaveDispatches\n};\n\nmodule.exports = EventPropagators;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/EventPropagators.js\n ** module id = 72\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule FallbackCompositionState\n * @typechecks static-only\n */\n\n'use strict';\n\nvar PooledClass = require('./PooledClass');\n\nvar assign = require('./Object.assign');\nvar getTextContentAccessor = require('./getTextContentAccessor');\n\n/**\n * This helper class stores information about text content of a target node,\n * allowing comparison of content before and after a given event.\n *\n * Identify the node where selection currently begins, then observe\n * both its text content and its current position in the DOM. Since the\n * browser may natively replace the target node during composition, we can\n * use its position to find its replacement.\n *\n * @param {DOMEventTarget} root\n */\nfunction FallbackCompositionState(root) {\n this._root = root;\n this._startText = this.getText();\n this._fallbackText = null;\n}\n\nassign(FallbackCompositionState.prototype, {\n destructor: function () {\n this._root = null;\n this._startText = null;\n this._fallbackText = null;\n },\n\n /**\n * Get current text of input.\n *\n * @return {string}\n */\n getText: function () {\n if ('value' in this._root) {\n return this._root.value;\n }\n return this._root[getTextContentAccessor()];\n },\n\n /**\n * Determine the differing substring between the initially stored\n * text content and the current content.\n *\n * @return {string}\n */\n getData: function () {\n if (this._fallbackText) {\n return this._fallbackText;\n }\n\n var start;\n var startValue = this._startText;\n var startLength = startValue.length;\n var end;\n var endValue = this.getText();\n var endLength = endValue.length;\n\n for (start = 0; start < startLength; start++) {\n if (startValue[start] !== endValue[start]) {\n break;\n }\n }\n\n var minEnd = startLength - start;\n for (end = 1; end <= minEnd; end++) {\n if (startValue[startLength - end] !== endValue[endLength - end]) {\n break;\n }\n }\n\n var sliceTail = end > 1 ? 1 - end : undefined;\n this._fallbackText = endValue.slice(start, sliceTail);\n return this._fallbackText;\n }\n});\n\nPooledClass.addPoolingTo(FallbackCompositionState);\n\nmodule.exports = FallbackCompositionState;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/FallbackCompositionState.js\n ** module id = 73\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule getTextContentAccessor\n */\n\n'use strict';\n\nvar ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');\n\nvar contentKey = null;\n\n/**\n * Gets the key used to access text content on a DOM node.\n *\n * @return {?string} Key used to access text content.\n * @internal\n */\nfunction getTextContentAccessor() {\n if (!contentKey && ExecutionEnvironment.canUseDOM) {\n // Prefer textContent to innerText because many browsers support both but\n // SVG <text> elements don't support innerText even when <div> does.\n contentKey = 'textContent' in document.documentElement ? 'textContent' : 'innerText';\n }\n return contentKey;\n}\n\nmodule.exports = getTextContentAccessor;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/getTextContentAccessor.js\n ** module id = 74\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule SyntheticCompositionEvent\n * @typechecks static-only\n */\n\n'use strict';\n\nvar SyntheticEvent = require('./SyntheticEvent');\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/DOM-Level-3-Events/#events-compositionevents\n */\nvar CompositionEventInterface = {\n data: null\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticUIEvent}\n */\nfunction SyntheticCompositionEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticEvent.augmentClass(SyntheticCompositionEvent, CompositionEventInterface);\n\nmodule.exports = SyntheticCompositionEvent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/SyntheticCompositionEvent.js\n ** module id = 75\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule SyntheticEvent\n * @typechecks static-only\n */\n\n'use strict';\n\nvar PooledClass = require('./PooledClass');\n\nvar assign = require('./Object.assign');\nvar emptyFunction = require('fbjs/lib/emptyFunction');\nvar warning = require('fbjs/lib/warning');\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\nvar EventInterface = {\n type: null,\n // currentTarget is set when dispatching; no use in copying it here\n currentTarget: emptyFunction.thatReturnsNull,\n eventPhase: null,\n bubbles: null,\n cancelable: null,\n timeStamp: function (event) {\n return event.timeStamp || Date.now();\n },\n defaultPrevented: null,\n isTrusted: null\n};\n\n/**\n * Synthetic events are dispatched by event plugins, typically in response to a\n * top-level event delegation handler.\n *\n * These systems should generally use pooling to reduce the frequency of garbage\n * collection. The system should check `isPersistent` to determine whether the\n * event should be released into the pool after being dispatched. Users that\n * need a persisted event should invoke `persist`.\n *\n * Synthetic events (and subclasses) implement the DOM Level 3 Events API by\n * normalizing browser quirks. Subclasses do not necessarily have to implement a\n * DOM interface; custom application-specific events can also subclass this.\n *\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n */\nfunction SyntheticEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n this.dispatchConfig = dispatchConfig;\n this.dispatchMarker = dispatchMarker;\n this.nativeEvent = nativeEvent;\n this.target = nativeEventTarget;\n this.currentTarget = nativeEventTarget;\n\n var Interface = this.constructor.Interface;\n for (var propName in Interface) {\n if (!Interface.hasOwnProperty(propName)) {\n continue;\n }\n var normalize = Interface[propName];\n if (normalize) {\n this[propName] = normalize(nativeEvent);\n } else {\n this[propName] = nativeEvent[propName];\n }\n }\n\n var defaultPrevented = nativeEvent.defaultPrevented != null ? nativeEvent.defaultPrevented : nativeEvent.returnValue === false;\n if (defaultPrevented) {\n this.isDefaultPrevented = emptyFunction.thatReturnsTrue;\n } else {\n this.isDefaultPrevented = emptyFunction.thatReturnsFalse;\n }\n this.isPropagationStopped = emptyFunction.thatReturnsFalse;\n}\n\nassign(SyntheticEvent.prototype, {\n\n preventDefault: function () {\n this.defaultPrevented = true;\n var event = this.nativeEvent;\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(event, 'This synthetic event is reused for performance reasons. If you\\'re ' + 'seeing this, you\\'re calling `preventDefault` on a ' + 'released/nullified synthetic event. This is a no-op. See ' + 'https://fb.me/react-event-pooling for more information.') : undefined;\n }\n if (!event) {\n return;\n }\n\n if (event.preventDefault) {\n event.preventDefault();\n } else {\n event.returnValue = false;\n }\n this.isDefaultPrevented = emptyFunction.thatReturnsTrue;\n },\n\n stopPropagation: function () {\n var event = this.nativeEvent;\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(event, 'This synthetic event is reused for performance reasons. If you\\'re ' + 'seeing this, you\\'re calling `stopPropagation` on a ' + 'released/nullified synthetic event. This is a no-op. See ' + 'https://fb.me/react-event-pooling for more information.') : undefined;\n }\n if (!event) {\n return;\n }\n\n if (event.stopPropagation) {\n event.stopPropagation();\n } else {\n event.cancelBubble = true;\n }\n this.isPropagationStopped = emptyFunction.thatReturnsTrue;\n },\n\n /**\n * We release all dispatched `SyntheticEvent`s after each event loop, adding\n * them back into the pool. This allows a way to hold onto a reference that\n * won't be added back into the pool.\n */\n persist: function () {\n this.isPersistent = emptyFunction.thatReturnsTrue;\n },\n\n /**\n * Checks if this event should be released back into the pool.\n *\n * @return {boolean} True if this should not be released, false otherwise.\n */\n isPersistent: emptyFunction.thatReturnsFalse,\n\n /**\n * `PooledClass` looks for `destructor` on each instance it releases.\n */\n destructor: function () {\n var Interface = this.constructor.Interface;\n for (var propName in Interface) {\n this[propName] = null;\n }\n this.dispatchConfig = null;\n this.dispatchMarker = null;\n this.nativeEvent = null;\n }\n\n});\n\nSyntheticEvent.Interface = EventInterface;\n\n/**\n * Helper to reduce boilerplate when creating subclasses.\n *\n * @param {function} Class\n * @param {?object} Interface\n */\nSyntheticEvent.augmentClass = function (Class, Interface) {\n var Super = this;\n\n var prototype = Object.create(Super.prototype);\n assign(prototype, Class.prototype);\n Class.prototype = prototype;\n Class.prototype.constructor = Class;\n\n Class.Interface = assign({}, Super.Interface, Interface);\n Class.augmentClass = Super.augmentClass;\n\n PooledClass.addPoolingTo(Class, PooledClass.fourArgumentPooler);\n};\n\nPooledClass.addPoolingTo(SyntheticEvent, PooledClass.fourArgumentPooler);\n\nmodule.exports = SyntheticEvent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/SyntheticEvent.js\n ** module id = 76\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule SyntheticInputEvent\n * @typechecks static-only\n */\n\n'use strict';\n\nvar SyntheticEvent = require('./SyntheticEvent');\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105\n * /#events-inputevents\n */\nvar InputEventInterface = {\n data: null\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticUIEvent}\n */\nfunction SyntheticInputEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticEvent.augmentClass(SyntheticInputEvent, InputEventInterface);\n\nmodule.exports = SyntheticInputEvent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/SyntheticInputEvent.js\n ** module id = 77\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule keyOf\n */\n\n/**\n * Allows extraction of a minified key. Let's the build system minify keys\n * without losing the ability to dynamically use key strings as values\n * themselves. Pass in an object with a single key/val pair and it will return\n * you the string key of that single record. Suppose you want to grab the\n * value for a key 'className' inside of an object. Key/val minification may\n * have aliased that key to be 'xa12'. keyOf({className: null}) will return\n * 'xa12' in that case. Resolve keys you want to use once at startup time, then\n * reuse those resolutions.\n */\n\"use strict\";\n\nvar keyOf = function (oneKeyObj) {\n var key;\n for (key in oneKeyObj) {\n if (!oneKeyObj.hasOwnProperty(key)) {\n continue;\n }\n return key;\n }\n return null;\n};\n\nmodule.exports = keyOf;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/keyOf.js\n ** module id = 78\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ChangeEventPlugin\n */\n\n'use strict';\n\nvar EventConstants = require('./EventConstants');\nvar EventPluginHub = require('./EventPluginHub');\nvar EventPropagators = require('./EventPropagators');\nvar ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');\nvar ReactUpdates = require('./ReactUpdates');\nvar SyntheticEvent = require('./SyntheticEvent');\n\nvar getEventTarget = require('./getEventTarget');\nvar isEventSupported = require('./isEventSupported');\nvar isTextInputElement = require('./isTextInputElement');\nvar keyOf = require('fbjs/lib/keyOf');\n\nvar topLevelTypes = EventConstants.topLevelTypes;\n\nvar eventTypes = {\n change: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onChange: null }),\n captured: keyOf({ onChangeCapture: null })\n },\n dependencies: [topLevelTypes.topBlur, topLevelTypes.topChange, topLevelTypes.topClick, topLevelTypes.topFocus, topLevelTypes.topInput, topLevelTypes.topKeyDown, topLevelTypes.topKeyUp, topLevelTypes.topSelectionChange]\n }\n};\n\n/**\n * For IE shims\n */\nvar activeElement = null;\nvar activeElementID = null;\nvar activeElementValue = null;\nvar activeElementValueProp = null;\n\n/**\n * SECTION: handle `change` event\n */\nfunction shouldUseChangeEvent(elem) {\n var nodeName = elem.nodeName && elem.nodeName.toLowerCase();\n return nodeName === 'select' || nodeName === 'input' && elem.type === 'file';\n}\n\nvar doesChangeEventBubble = false;\nif (ExecutionEnvironment.canUseDOM) {\n // See `handleChange` comment below\n doesChangeEventBubble = isEventSupported('change') && (!('documentMode' in document) || document.documentMode > 8);\n}\n\nfunction manualDispatchChangeEvent(nativeEvent) {\n var event = SyntheticEvent.getPooled(eventTypes.change, activeElementID, nativeEvent, getEventTarget(nativeEvent));\n EventPropagators.accumulateTwoPhaseDispatches(event);\n\n // If change and propertychange bubbled, we'd just bind to it like all the\n // other events and have it go through ReactBrowserEventEmitter. Since it\n // doesn't, we manually listen for the events and so we have to enqueue and\n // process the abstract event manually.\n //\n // Batching is necessary here in order to ensure that all event handlers run\n // before the next rerender (including event handlers attached to ancestor\n // elements instead of directly on the input). Without this, controlled\n // components don't work properly in conjunction with event bubbling because\n // the component is rerendered and the value reverted before all the event\n // handlers can run. See https://github.com/facebook/react/issues/708.\n ReactUpdates.batchedUpdates(runEventInBatch, event);\n}\n\nfunction runEventInBatch(event) {\n EventPluginHub.enqueueEvents(event);\n EventPluginHub.processEventQueue(false);\n}\n\nfunction startWatchingForChangeEventIE8(target, targetID) {\n activeElement = target;\n activeElementID = targetID;\n activeElement.attachEvent('onchange', manualDispatchChangeEvent);\n}\n\nfunction stopWatchingForChangeEventIE8() {\n if (!activeElement) {\n return;\n }\n activeElement.detachEvent('onchange', manualDispatchChangeEvent);\n activeElement = null;\n activeElementID = null;\n}\n\nfunction getTargetIDForChangeEvent(topLevelType, topLevelTarget, topLevelTargetID) {\n if (topLevelType === topLevelTypes.topChange) {\n return topLevelTargetID;\n }\n}\nfunction handleEventsForChangeEventIE8(topLevelType, topLevelTarget, topLevelTargetID) {\n if (topLevelType === topLevelTypes.topFocus) {\n // stopWatching() should be a noop here but we call it just in case we\n // missed a blur event somehow.\n stopWatchingForChangeEventIE8();\n startWatchingForChangeEventIE8(topLevelTarget, topLevelTargetID);\n } else if (topLevelType === topLevelTypes.topBlur) {\n stopWatchingForChangeEventIE8();\n }\n}\n\n/**\n * SECTION: handle `input` event\n */\nvar isInputEventSupported = false;\nif (ExecutionEnvironment.canUseDOM) {\n // IE9 claims to support the input event but fails to trigger it when\n // deleting text, so we ignore its input events\n isInputEventSupported = isEventSupported('input') && (!('documentMode' in document) || document.documentMode > 9);\n}\n\n/**\n * (For old IE.) Replacement getter/setter for the `value` property that gets\n * set on the active element.\n */\nvar newValueProp = {\n get: function () {\n return activeElementValueProp.get.call(this);\n },\n set: function (val) {\n // Cast to a string so we can do equality checks.\n activeElementValue = '' + val;\n activeElementValueProp.set.call(this, val);\n }\n};\n\n/**\n * (For old IE.) Starts tracking propertychange events on the passed-in element\n * and override the value property so that we can distinguish user events from\n * value changes in JS.\n */\nfunction startWatchingForValueChange(target, targetID) {\n activeElement = target;\n activeElementID = targetID;\n activeElementValue = target.value;\n activeElementValueProp = Object.getOwnPropertyDescriptor(target.constructor.prototype, 'value');\n\n // Not guarded in a canDefineProperty check: IE8 supports defineProperty only\n // on DOM elements\n Object.defineProperty(activeElement, 'value', newValueProp);\n activeElement.attachEvent('onpropertychange', handlePropertyChange);\n}\n\n/**\n * (For old IE.) Removes the event listeners from the currently-tracked element,\n * if any exists.\n */\nfunction stopWatchingForValueChange() {\n if (!activeElement) {\n return;\n }\n\n // delete restores the original property definition\n delete activeElement.value;\n activeElement.detachEvent('onpropertychange', handlePropertyChange);\n\n activeElement = null;\n activeElementID = null;\n activeElementValue = null;\n activeElementValueProp = null;\n}\n\n/**\n * (For old IE.) Handles a propertychange event, sending a `change` event if\n * the value of the active element has changed.\n */\nfunction handlePropertyChange(nativeEvent) {\n if (nativeEvent.propertyName !== 'value') {\n return;\n }\n var value = nativeEvent.srcElement.value;\n if (value === activeElementValue) {\n return;\n }\n activeElementValue = value;\n\n manualDispatchChangeEvent(nativeEvent);\n}\n\n/**\n * If a `change` event should be fired, returns the target's ID.\n */\nfunction getTargetIDForInputEvent(topLevelType, topLevelTarget, topLevelTargetID) {\n if (topLevelType === topLevelTypes.topInput) {\n // In modern browsers (i.e., not IE8 or IE9), the input event is exactly\n // what we want so fall through here and trigger an abstract event\n return topLevelTargetID;\n }\n}\n\n// For IE8 and IE9.\nfunction handleEventsForInputEventIE(topLevelType, topLevelTarget, topLevelTargetID) {\n if (topLevelType === topLevelTypes.topFocus) {\n // In IE8, we can capture almost all .value changes by adding a\n // propertychange handler and looking for events with propertyName\n // equal to 'value'\n // In IE9, propertychange fires for most input events but is buggy and\n // doesn't fire when text is deleted, but conveniently, selectionchange\n // appears to fire in all of the remaining cases so we catch those and\n // forward the event if the value has changed\n // In either case, we don't want to call the event handler if the value\n // is changed from JS so we redefine a setter for `.value` that updates\n // our activeElementValue variable, allowing us to ignore those changes\n //\n // stopWatching() should be a noop here but we call it just in case we\n // missed a blur event somehow.\n stopWatchingForValueChange();\n startWatchingForValueChange(topLevelTarget, topLevelTargetID);\n } else if (topLevelType === topLevelTypes.topBlur) {\n stopWatchingForValueChange();\n }\n}\n\n// For IE8 and IE9.\nfunction getTargetIDForInputEventIE(topLevelType, topLevelTarget, topLevelTargetID) {\n if (topLevelType === topLevelTypes.topSelectionChange || topLevelType === topLevelTypes.topKeyUp || topLevelType === topLevelTypes.topKeyDown) {\n // On the selectionchange event, the target is just document which isn't\n // helpful for us so just check activeElement instead.\n //\n // 99% of the time, keydown and keyup aren't necessary. IE8 fails to fire\n // propertychange on the first input event after setting `value` from a\n // script and fires only keydown, keypress, keyup. Catching keyup usually\n // gets it and catching keydown lets us fire an event for the first\n // keystroke if user does a key repeat (it'll be a little delayed: right\n // before the second keystroke). Other input methods (e.g., paste) seem to\n // fire selectionchange normally.\n if (activeElement && activeElement.value !== activeElementValue) {\n activeElementValue = activeElement.value;\n return activeElementID;\n }\n }\n}\n\n/**\n * SECTION: handle `click` event\n */\nfunction shouldUseClickEvent(elem) {\n // Use the `click` event to detect changes to checkbox and radio inputs.\n // This approach works across all browsers, whereas `change` does not fire\n // until `blur` in IE8.\n return elem.nodeName && elem.nodeName.toLowerCase() === 'input' && (elem.type === 'checkbox' || elem.type === 'radio');\n}\n\nfunction getTargetIDForClickEvent(topLevelType, topLevelTarget, topLevelTargetID) {\n if (topLevelType === topLevelTypes.topClick) {\n return topLevelTargetID;\n }\n}\n\n/**\n * This plugin creates an `onChange` event that normalizes change events\n * across form elements. This event fires at a time when it's possible to\n * change the element's value without seeing a flicker.\n *\n * Supported elements are:\n * - input (see `isTextInputElement`)\n * - textarea\n * - select\n */\nvar ChangeEventPlugin = {\n\n eventTypes: eventTypes,\n\n /**\n * @param {string} topLevelType Record from `EventConstants`.\n * @param {DOMEventTarget} topLevelTarget The listening component root node.\n * @param {string} topLevelTargetID ID of `topLevelTarget`.\n * @param {object} nativeEvent Native browser event.\n * @return {*} An accumulation of synthetic events.\n * @see {EventPluginHub.extractEvents}\n */\n extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) {\n\n var getTargetIDFunc, handleEventFunc;\n if (shouldUseChangeEvent(topLevelTarget)) {\n if (doesChangeEventBubble) {\n getTargetIDFunc = getTargetIDForChangeEvent;\n } else {\n handleEventFunc = handleEventsForChangeEventIE8;\n }\n } else if (isTextInputElement(topLevelTarget)) {\n if (isInputEventSupported) {\n getTargetIDFunc = getTargetIDForInputEvent;\n } else {\n getTargetIDFunc = getTargetIDForInputEventIE;\n handleEventFunc = handleEventsForInputEventIE;\n }\n } else if (shouldUseClickEvent(topLevelTarget)) {\n getTargetIDFunc = getTargetIDForClickEvent;\n }\n\n if (getTargetIDFunc) {\n var targetID = getTargetIDFunc(topLevelType, topLevelTarget, topLevelTargetID);\n if (targetID) {\n var event = SyntheticEvent.getPooled(eventTypes.change, targetID, nativeEvent, nativeEventTarget);\n event.type = 'change';\n EventPropagators.accumulateTwoPhaseDispatches(event);\n return event;\n }\n }\n\n if (handleEventFunc) {\n handleEventFunc(topLevelType, topLevelTarget, topLevelTargetID);\n }\n }\n\n};\n\nmodule.exports = ChangeEventPlugin;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ChangeEventPlugin.js\n ** module id = 79\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule getEventTarget\n * @typechecks static-only\n */\n\n'use strict';\n\n/**\n * Gets the target node from a native browser event by accounting for\n * inconsistencies in browser DOM APIs.\n *\n * @param {object} nativeEvent Native browser event.\n * @return {DOMEventTarget} Target node.\n */\nfunction getEventTarget(nativeEvent) {\n var target = nativeEvent.target || nativeEvent.srcElement || window;\n // Safari may fire events on text nodes (Node.TEXT_NODE is 3).\n // @see http://www.quirksmode.org/js/events_properties.html\n return target.nodeType === 3 ? target.parentNode : target;\n}\n\nmodule.exports = getEventTarget;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/getEventTarget.js\n ** module id = 80\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule isTextInputElement\n */\n\n'use strict';\n\n/**\n * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary\n */\nvar supportedInputTypes = {\n 'color': true,\n 'date': true,\n 'datetime': true,\n 'datetime-local': true,\n 'email': true,\n 'month': true,\n 'number': true,\n 'password': true,\n 'range': true,\n 'search': true,\n 'tel': true,\n 'text': true,\n 'time': true,\n 'url': true,\n 'week': true\n};\n\nfunction isTextInputElement(elem) {\n var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();\n return nodeName && (nodeName === 'input' && supportedInputTypes[elem.type] || nodeName === 'textarea');\n}\n\nmodule.exports = isTextInputElement;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/isTextInputElement.js\n ** module id = 81\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ClientReactRootIndex\n * @typechecks\n */\n\n'use strict';\n\nvar nextReactRootIndex = 0;\n\nvar ClientReactRootIndex = {\n createReactRootIndex: function () {\n return nextReactRootIndex++;\n }\n};\n\nmodule.exports = ClientReactRootIndex;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ClientReactRootIndex.js\n ** module id = 82\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule DefaultEventPluginOrder\n */\n\n'use strict';\n\nvar keyOf = require('fbjs/lib/keyOf');\n\n/**\n * Module that is injectable into `EventPluginHub`, that specifies a\n * deterministic ordering of `EventPlugin`s. A convenient way to reason about\n * plugins, without having to package every one of them. This is better than\n * having plugins be ordered in the same order that they are injected because\n * that ordering would be influenced by the packaging order.\n * `ResponderEventPlugin` must occur before `SimpleEventPlugin` so that\n * preventing default on events is convenient in `SimpleEventPlugin` handlers.\n */\nvar DefaultEventPluginOrder = [keyOf({ ResponderEventPlugin: null }), keyOf({ SimpleEventPlugin: null }), keyOf({ TapEventPlugin: null }), keyOf({ EnterLeaveEventPlugin: null }), keyOf({ ChangeEventPlugin: null }), keyOf({ SelectEventPlugin: null }), keyOf({ BeforeInputEventPlugin: null })];\n\nmodule.exports = DefaultEventPluginOrder;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/DefaultEventPluginOrder.js\n ** module id = 83\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule EnterLeaveEventPlugin\n * @typechecks static-only\n */\n\n'use strict';\n\nvar EventConstants = require('./EventConstants');\nvar EventPropagators = require('./EventPropagators');\nvar SyntheticMouseEvent = require('./SyntheticMouseEvent');\n\nvar ReactMount = require('./ReactMount');\nvar keyOf = require('fbjs/lib/keyOf');\n\nvar topLevelTypes = EventConstants.topLevelTypes;\nvar getFirstReactDOM = ReactMount.getFirstReactDOM;\n\nvar eventTypes = {\n mouseEnter: {\n registrationName: keyOf({ onMouseEnter: null }),\n dependencies: [topLevelTypes.topMouseOut, topLevelTypes.topMouseOver]\n },\n mouseLeave: {\n registrationName: keyOf({ onMouseLeave: null }),\n dependencies: [topLevelTypes.topMouseOut, topLevelTypes.topMouseOver]\n }\n};\n\nvar extractedEvents = [null, null];\n\nvar EnterLeaveEventPlugin = {\n\n eventTypes: eventTypes,\n\n /**\n * For almost every interaction we care about, there will be both a top-level\n * `mouseover` and `mouseout` event that occurs. Only use `mouseout` so that\n * we do not extract duplicate events. However, moving the mouse into the\n * browser from outside will not fire a `mouseout` event. In this case, we use\n * the `mouseover` top-level event.\n *\n * @param {string} topLevelType Record from `EventConstants`.\n * @param {DOMEventTarget} topLevelTarget The listening component root node.\n * @param {string} topLevelTargetID ID of `topLevelTarget`.\n * @param {object} nativeEvent Native browser event.\n * @return {*} An accumulation of synthetic events.\n * @see {EventPluginHub.extractEvents}\n */\n extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) {\n if (topLevelType === topLevelTypes.topMouseOver && (nativeEvent.relatedTarget || nativeEvent.fromElement)) {\n return null;\n }\n if (topLevelType !== topLevelTypes.topMouseOut && topLevelType !== topLevelTypes.topMouseOver) {\n // Must not be a mouse in or mouse out - ignoring.\n return null;\n }\n\n var win;\n if (topLevelTarget.window === topLevelTarget) {\n // `topLevelTarget` is probably a window object.\n win = topLevelTarget;\n } else {\n // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8.\n var doc = topLevelTarget.ownerDocument;\n if (doc) {\n win = doc.defaultView || doc.parentWindow;\n } else {\n win = window;\n }\n }\n\n var from;\n var to;\n var fromID = '';\n var toID = '';\n if (topLevelType === topLevelTypes.topMouseOut) {\n from = topLevelTarget;\n fromID = topLevelTargetID;\n to = getFirstReactDOM(nativeEvent.relatedTarget || nativeEvent.toElement);\n if (to) {\n toID = ReactMount.getID(to);\n } else {\n to = win;\n }\n to = to || win;\n } else {\n from = win;\n to = topLevelTarget;\n toID = topLevelTargetID;\n }\n\n if (from === to) {\n // Nothing pertains to our managed components.\n return null;\n }\n\n var leave = SyntheticMouseEvent.getPooled(eventTypes.mouseLeave, fromID, nativeEvent, nativeEventTarget);\n leave.type = 'mouseleave';\n leave.target = from;\n leave.relatedTarget = to;\n\n var enter = SyntheticMouseEvent.getPooled(eventTypes.mouseEnter, toID, nativeEvent, nativeEventTarget);\n enter.type = 'mouseenter';\n enter.target = to;\n enter.relatedTarget = from;\n\n EventPropagators.accumulateEnterLeaveDispatches(leave, enter, fromID, toID);\n\n extractedEvents[0] = leave;\n extractedEvents[1] = enter;\n\n return extractedEvents;\n }\n\n};\n\nmodule.exports = EnterLeaveEventPlugin;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/EnterLeaveEventPlugin.js\n ** module id = 84\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule SyntheticMouseEvent\n * @typechecks static-only\n */\n\n'use strict';\n\nvar SyntheticUIEvent = require('./SyntheticUIEvent');\nvar ViewportMetrics = require('./ViewportMetrics');\n\nvar getEventModifierState = require('./getEventModifierState');\n\n/**\n * @interface MouseEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\nvar MouseEventInterface = {\n screenX: null,\n screenY: null,\n clientX: null,\n clientY: null,\n ctrlKey: null,\n shiftKey: null,\n altKey: null,\n metaKey: null,\n getModifierState: getEventModifierState,\n button: function (event) {\n // Webkit, Firefox, IE9+\n // which: 1 2 3\n // button: 0 1 2 (standard)\n var button = event.button;\n if ('which' in event) {\n return button;\n }\n // IE<9\n // which: undefined\n // button: 0 0 0\n // button: 1 4 2 (onmouseup)\n return button === 2 ? 2 : button === 4 ? 1 : 0;\n },\n buttons: null,\n relatedTarget: function (event) {\n return event.relatedTarget || (event.fromElement === event.srcElement ? event.toElement : event.fromElement);\n },\n // \"Proprietary\" Interface.\n pageX: function (event) {\n return 'pageX' in event ? event.pageX : event.clientX + ViewportMetrics.currentScrollLeft;\n },\n pageY: function (event) {\n return 'pageY' in event ? event.pageY : event.clientY + ViewportMetrics.currentScrollTop;\n }\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticUIEvent}\n */\nfunction SyntheticMouseEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticUIEvent.augmentClass(SyntheticMouseEvent, MouseEventInterface);\n\nmodule.exports = SyntheticMouseEvent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/SyntheticMouseEvent.js\n ** module id = 85\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule SyntheticUIEvent\n * @typechecks static-only\n */\n\n'use strict';\n\nvar SyntheticEvent = require('./SyntheticEvent');\n\nvar getEventTarget = require('./getEventTarget');\n\n/**\n * @interface UIEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\nvar UIEventInterface = {\n view: function (event) {\n if (event.view) {\n return event.view;\n }\n\n var target = getEventTarget(event);\n if (target != null && target.window === target) {\n // target is a window object\n return target;\n }\n\n var doc = target.ownerDocument;\n // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8.\n if (doc) {\n return doc.defaultView || doc.parentWindow;\n } else {\n return window;\n }\n },\n detail: function (event) {\n return event.detail || 0;\n }\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticEvent}\n */\nfunction SyntheticUIEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticEvent.augmentClass(SyntheticUIEvent, UIEventInterface);\n\nmodule.exports = SyntheticUIEvent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/SyntheticUIEvent.js\n ** module id = 86\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule getEventModifierState\n * @typechecks static-only\n */\n\n'use strict';\n\n/**\n * Translation from modifier key to the associated property in the event.\n * @see http://www.w3.org/TR/DOM-Level-3-Events/#keys-Modifiers\n */\n\nvar modifierKeyToProp = {\n 'Alt': 'altKey',\n 'Control': 'ctrlKey',\n 'Meta': 'metaKey',\n 'Shift': 'shiftKey'\n};\n\n// IE8 does not implement getModifierState so we simply map it to the only\n// modifier keys exposed by the event itself, does not support Lock-keys.\n// Currently, all major browsers except Chrome seems to support Lock-keys.\nfunction modifierStateGetter(keyArg) {\n var syntheticEvent = this;\n var nativeEvent = syntheticEvent.nativeEvent;\n if (nativeEvent.getModifierState) {\n return nativeEvent.getModifierState(keyArg);\n }\n var keyProp = modifierKeyToProp[keyArg];\n return keyProp ? !!nativeEvent[keyProp] : false;\n}\n\nfunction getEventModifierState(nativeEvent) {\n return modifierStateGetter;\n}\n\nmodule.exports = getEventModifierState;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/getEventModifierState.js\n ** module id = 87\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule HTMLDOMPropertyConfig\n */\n\n'use strict';\n\nvar DOMProperty = require('./DOMProperty');\nvar ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');\n\nvar MUST_USE_ATTRIBUTE = DOMProperty.injection.MUST_USE_ATTRIBUTE;\nvar MUST_USE_PROPERTY = DOMProperty.injection.MUST_USE_PROPERTY;\nvar HAS_BOOLEAN_VALUE = DOMProperty.injection.HAS_BOOLEAN_VALUE;\nvar HAS_SIDE_EFFECTS = DOMProperty.injection.HAS_SIDE_EFFECTS;\nvar HAS_NUMERIC_VALUE = DOMProperty.injection.HAS_NUMERIC_VALUE;\nvar HAS_POSITIVE_NUMERIC_VALUE = DOMProperty.injection.HAS_POSITIVE_NUMERIC_VALUE;\nvar HAS_OVERLOADED_BOOLEAN_VALUE = DOMProperty.injection.HAS_OVERLOADED_BOOLEAN_VALUE;\n\nvar hasSVG;\nif (ExecutionEnvironment.canUseDOM) {\n var implementation = document.implementation;\n hasSVG = implementation && implementation.hasFeature && implementation.hasFeature('http://www.w3.org/TR/SVG11/feature#BasicStructure', '1.1');\n}\n\nvar HTMLDOMPropertyConfig = {\n isCustomAttribute: RegExp.prototype.test.bind(/^(data|aria)-[a-z_][a-z\\d_.\\-]*$/),\n Properties: {\n /**\n * Standard Properties\n */\n accept: null,\n acceptCharset: null,\n accessKey: null,\n action: null,\n allowFullScreen: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE,\n allowTransparency: MUST_USE_ATTRIBUTE,\n alt: null,\n async: HAS_BOOLEAN_VALUE,\n autoComplete: null,\n // autoFocus is polyfilled/normalized by AutoFocusUtils\n // autoFocus: HAS_BOOLEAN_VALUE,\n autoPlay: HAS_BOOLEAN_VALUE,\n capture: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE,\n cellPadding: null,\n cellSpacing: null,\n charSet: MUST_USE_ATTRIBUTE,\n challenge: MUST_USE_ATTRIBUTE,\n checked: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,\n classID: MUST_USE_ATTRIBUTE,\n // To set className on SVG elements, it's necessary to use .setAttribute;\n // this works on HTML elements too in all browsers except IE8. Conveniently,\n // IE8 doesn't support SVG and so we can simply use the attribute in\n // browsers that support SVG and the property in browsers that don't,\n // regardless of whether the element is HTML or SVG.\n className: hasSVG ? MUST_USE_ATTRIBUTE : MUST_USE_PROPERTY,\n cols: MUST_USE_ATTRIBUTE | HAS_POSITIVE_NUMERIC_VALUE,\n colSpan: null,\n content: null,\n contentEditable: null,\n contextMenu: MUST_USE_ATTRIBUTE,\n controls: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,\n coords: null,\n crossOrigin: null,\n data: null, // For `<object />` acts as `src`.\n dateTime: MUST_USE_ATTRIBUTE,\n 'default': HAS_BOOLEAN_VALUE,\n defer: HAS_BOOLEAN_VALUE,\n dir: null,\n disabled: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE,\n download: HAS_OVERLOADED_BOOLEAN_VALUE,\n draggable: null,\n encType: null,\n form: MUST_USE_ATTRIBUTE,\n formAction: MUST_USE_ATTRIBUTE,\n formEncType: MUST_USE_ATTRIBUTE,\n formMethod: MUST_USE_ATTRIBUTE,\n formNoValidate: HAS_BOOLEAN_VALUE,\n formTarget: MUST_USE_ATTRIBUTE,\n frameBorder: MUST_USE_ATTRIBUTE,\n headers: null,\n height: MUST_USE_ATTRIBUTE,\n hidden: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE,\n high: null,\n href: null,\n hrefLang: null,\n htmlFor: null,\n httpEquiv: null,\n icon: null,\n id: MUST_USE_PROPERTY,\n inputMode: MUST_USE_ATTRIBUTE,\n integrity: null,\n is: MUST_USE_ATTRIBUTE,\n keyParams: MUST_USE_ATTRIBUTE,\n keyType: MUST_USE_ATTRIBUTE,\n kind: null,\n label: null,\n lang: null,\n list: MUST_USE_ATTRIBUTE,\n loop: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,\n low: null,\n manifest: MUST_USE_ATTRIBUTE,\n marginHeight: null,\n marginWidth: null,\n max: null,\n maxLength: MUST_USE_ATTRIBUTE,\n media: MUST_USE_ATTRIBUTE,\n mediaGroup: null,\n method: null,\n min: null,\n minLength: MUST_USE_ATTRIBUTE,\n multiple: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,\n muted: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,\n name: null,\n nonce: MUST_USE_ATTRIBUTE,\n noValidate: HAS_BOOLEAN_VALUE,\n open: HAS_BOOLEAN_VALUE,\n optimum: null,\n pattern: null,\n placeholder: null,\n poster: null,\n preload: null,\n radioGroup: null,\n readOnly: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,\n rel: null,\n required: HAS_BOOLEAN_VALUE,\n reversed: HAS_BOOLEAN_VALUE,\n role: MUST_USE_ATTRIBUTE,\n rows: MUST_USE_ATTRIBUTE | HAS_POSITIVE_NUMERIC_VALUE,\n rowSpan: null,\n sandbox: null,\n scope: null,\n scoped: HAS_BOOLEAN_VALUE,\n scrolling: null,\n seamless: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE,\n selected: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,\n shape: null,\n size: MUST_USE_ATTRIBUTE | HAS_POSITIVE_NUMERIC_VALUE,\n sizes: MUST_USE_ATTRIBUTE,\n span: HAS_POSITIVE_NUMERIC_VALUE,\n spellCheck: null,\n src: null,\n srcDoc: MUST_USE_PROPERTY,\n srcLang: null,\n srcSet: MUST_USE_ATTRIBUTE,\n start: HAS_NUMERIC_VALUE,\n step: null,\n style: null,\n summary: null,\n tabIndex: null,\n target: null,\n title: null,\n type: null,\n useMap: null,\n value: MUST_USE_PROPERTY | HAS_SIDE_EFFECTS,\n width: MUST_USE_ATTRIBUTE,\n wmode: MUST_USE_ATTRIBUTE,\n wrap: null,\n\n /**\n * RDFa Properties\n */\n about: MUST_USE_ATTRIBUTE,\n datatype: MUST_USE_ATTRIBUTE,\n inlist: MUST_USE_ATTRIBUTE,\n prefix: MUST_USE_ATTRIBUTE,\n // property is also supported for OpenGraph in meta tags.\n property: MUST_USE_ATTRIBUTE,\n resource: MUST_USE_ATTRIBUTE,\n 'typeof': MUST_USE_ATTRIBUTE,\n vocab: MUST_USE_ATTRIBUTE,\n\n /**\n * Non-standard Properties\n */\n // autoCapitalize and autoCorrect are supported in Mobile Safari for\n // keyboard hints.\n autoCapitalize: null,\n autoCorrect: null,\n // autoSave allows WebKit/Blink to persist values of input fields on page reloads\n autoSave: null,\n // color is for Safari mask-icon link\n color: null,\n // itemProp, itemScope, itemType are for\n // Microdata support. See http://schema.org/docs/gs.html\n itemProp: MUST_USE_ATTRIBUTE,\n itemScope: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE,\n itemType: MUST_USE_ATTRIBUTE,\n // itemID and itemRef are for Microdata support as well but\n // only specified in the the WHATWG spec document. See\n // https://html.spec.whatwg.org/multipage/microdata.html#microdata-dom-api\n itemID: MUST_USE_ATTRIBUTE,\n itemRef: MUST_USE_ATTRIBUTE,\n // results show looking glass icon and recent searches on input\n // search fields in WebKit/Blink\n results: null,\n // IE-only attribute that specifies security restrictions on an iframe\n // as an alternative to the sandbox attribute on IE<10\n security: MUST_USE_ATTRIBUTE,\n // IE-only attribute that controls focus behavior\n unselectable: MUST_USE_ATTRIBUTE\n },\n DOMAttributeNames: {\n acceptCharset: 'accept-charset',\n className: 'class',\n htmlFor: 'for',\n httpEquiv: 'http-equiv'\n },\n DOMPropertyNames: {\n autoCapitalize: 'autocapitalize',\n autoComplete: 'autocomplete',\n autoCorrect: 'autocorrect',\n autoFocus: 'autofocus',\n autoPlay: 'autoplay',\n autoSave: 'autosave',\n // `encoding` is equivalent to `enctype`, IE8 lacks an `enctype` setter.\n // http://www.w3.org/TR/html5/forms.html#dom-fs-encoding\n encType: 'encoding',\n hrefLang: 'hreflang',\n radioGroup: 'radiogroup',\n spellCheck: 'spellcheck',\n srcDoc: 'srcdoc',\n srcSet: 'srcset'\n }\n};\n\nmodule.exports = HTMLDOMPropertyConfig;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/HTMLDOMPropertyConfig.js\n ** module id = 88\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactBrowserComponentMixin\n */\n\n'use strict';\n\nvar ReactInstanceMap = require('./ReactInstanceMap');\n\nvar findDOMNode = require('./findDOMNode');\nvar warning = require('fbjs/lib/warning');\n\nvar didWarnKey = '_getDOMNodeDidWarn';\n\nvar ReactBrowserComponentMixin = {\n /**\n * Returns the DOM node rendered by this component.\n *\n * @return {DOMElement} The root node of this component.\n * @final\n * @protected\n */\n getDOMNode: function () {\n process.env.NODE_ENV !== 'production' ? warning(this.constructor[didWarnKey], '%s.getDOMNode(...) is deprecated. Please use ' + 'ReactDOM.findDOMNode(instance) instead.', ReactInstanceMap.get(this).getName() || this.tagName || 'Unknown') : undefined;\n this.constructor[didWarnKey] = true;\n return findDOMNode(this);\n }\n};\n\nmodule.exports = ReactBrowserComponentMixin;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactBrowserComponentMixin.js\n ** module id = 89\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule findDOMNode\n * @typechecks static-only\n */\n\n'use strict';\n\nvar ReactCurrentOwner = require('./ReactCurrentOwner');\nvar ReactInstanceMap = require('./ReactInstanceMap');\nvar ReactMount = require('./ReactMount');\n\nvar invariant = require('fbjs/lib/invariant');\nvar warning = require('fbjs/lib/warning');\n\n/**\n * Returns the DOM node rendered by this element.\n *\n * @param {ReactComponent|DOMElement} componentOrElement\n * @return {?DOMElement} The root node of this element.\n */\nfunction findDOMNode(componentOrElement) {\n if (process.env.NODE_ENV !== 'production') {\n var owner = ReactCurrentOwner.current;\n if (owner !== null) {\n process.env.NODE_ENV !== 'production' ? warning(owner._warnedAboutRefsInRender, '%s is accessing getDOMNode or findDOMNode inside its render(). ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', owner.getName() || 'A component') : undefined;\n owner._warnedAboutRefsInRender = true;\n }\n }\n if (componentOrElement == null) {\n return null;\n }\n if (componentOrElement.nodeType === 1) {\n return componentOrElement;\n }\n if (ReactInstanceMap.has(componentOrElement)) {\n return ReactMount.getNodeFromInstance(componentOrElement);\n }\n !(componentOrElement.render == null || typeof componentOrElement.render !== 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'findDOMNode was called on an unmounted component.') : invariant(false) : undefined;\n !false ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Element appears to be neither ReactComponent nor DOMNode (keys: %s)', Object.keys(componentOrElement)) : invariant(false) : undefined;\n}\n\nmodule.exports = findDOMNode;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/findDOMNode.js\n ** module id = 90\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactDefaultBatchingStrategy\n */\n\n'use strict';\n\nvar ReactUpdates = require('./ReactUpdates');\nvar Transaction = require('./Transaction');\n\nvar assign = require('./Object.assign');\nvar emptyFunction = require('fbjs/lib/emptyFunction');\n\nvar RESET_BATCHED_UPDATES = {\n initialize: emptyFunction,\n close: function () {\n ReactDefaultBatchingStrategy.isBatchingUpdates = false;\n }\n};\n\nvar FLUSH_BATCHED_UPDATES = {\n initialize: emptyFunction,\n close: ReactUpdates.flushBatchedUpdates.bind(ReactUpdates)\n};\n\nvar TRANSACTION_WRAPPERS = [FLUSH_BATCHED_UPDATES, RESET_BATCHED_UPDATES];\n\nfunction ReactDefaultBatchingStrategyTransaction() {\n this.reinitializeTransaction();\n}\n\nassign(ReactDefaultBatchingStrategyTransaction.prototype, Transaction.Mixin, {\n getTransactionWrappers: function () {\n return TRANSACTION_WRAPPERS;\n }\n});\n\nvar transaction = new ReactDefaultBatchingStrategyTransaction();\n\nvar ReactDefaultBatchingStrategy = {\n isBatchingUpdates: false,\n\n /**\n * Call the provided function in a context within which calls to `setState`\n * and friends are batched such that components aren't updated unnecessarily.\n */\n batchedUpdates: function (callback, a, b, c, d, e) {\n var alreadyBatchingUpdates = ReactDefaultBatchingStrategy.isBatchingUpdates;\n\n ReactDefaultBatchingStrategy.isBatchingUpdates = true;\n\n // The code is written this way to avoid extra allocations\n if (alreadyBatchingUpdates) {\n callback(a, b, c, d, e);\n } else {\n transaction.perform(callback, null, a, b, c, d, e);\n }\n }\n};\n\nmodule.exports = ReactDefaultBatchingStrategy;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactDefaultBatchingStrategy.js\n ** module id = 91\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactDOMComponent\n * @typechecks static-only\n */\n\n/* global hasOwnProperty:true */\n\n'use strict';\n\nvar AutoFocusUtils = require('./AutoFocusUtils');\nvar CSSPropertyOperations = require('./CSSPropertyOperations');\nvar DOMProperty = require('./DOMProperty');\nvar DOMPropertyOperations = require('./DOMPropertyOperations');\nvar EventConstants = require('./EventConstants');\nvar ReactBrowserEventEmitter = require('./ReactBrowserEventEmitter');\nvar ReactComponentBrowserEnvironment = require('./ReactComponentBrowserEnvironment');\nvar ReactDOMButton = require('./ReactDOMButton');\nvar ReactDOMInput = require('./ReactDOMInput');\nvar ReactDOMOption = require('./ReactDOMOption');\nvar ReactDOMSelect = require('./ReactDOMSelect');\nvar ReactDOMTextarea = require('./ReactDOMTextarea');\nvar ReactMount = require('./ReactMount');\nvar ReactMultiChild = require('./ReactMultiChild');\nvar ReactPerf = require('./ReactPerf');\nvar ReactUpdateQueue = require('./ReactUpdateQueue');\n\nvar assign = require('./Object.assign');\nvar canDefineProperty = require('./canDefineProperty');\nvar escapeTextContentForBrowser = require('./escapeTextContentForBrowser');\nvar invariant = require('fbjs/lib/invariant');\nvar isEventSupported = require('./isEventSupported');\nvar keyOf = require('fbjs/lib/keyOf');\nvar setInnerHTML = require('./setInnerHTML');\nvar setTextContent = require('./setTextContent');\nvar shallowEqual = require('fbjs/lib/shallowEqual');\nvar validateDOMNesting = require('./validateDOMNesting');\nvar warning = require('fbjs/lib/warning');\n\nvar deleteListener = ReactBrowserEventEmitter.deleteListener;\nvar listenTo = ReactBrowserEventEmitter.listenTo;\nvar registrationNameModules = ReactBrowserEventEmitter.registrationNameModules;\n\n// For quickly matching children type, to test if can be treated as content.\nvar CONTENT_TYPES = { 'string': true, 'number': true };\n\nvar CHILDREN = keyOf({ children: null });\nvar STYLE = keyOf({ style: null });\nvar HTML = keyOf({ __html: null });\n\nvar ELEMENT_NODE_TYPE = 1;\n\nfunction getDeclarationErrorAddendum(internalInstance) {\n if (internalInstance) {\n var owner = internalInstance._currentElement._owner || null;\n if (owner) {\n var name = owner.getName();\n if (name) {\n return ' This DOM node was rendered by `' + name + '`.';\n }\n }\n }\n return '';\n}\n\nvar legacyPropsDescriptor;\nif (process.env.NODE_ENV !== 'production') {\n legacyPropsDescriptor = {\n props: {\n enumerable: false,\n get: function () {\n var component = this._reactInternalComponent;\n process.env.NODE_ENV !== 'production' ? warning(false, 'ReactDOMComponent: Do not access .props of a DOM node; instead, ' + 'recreate the props as `render` did originally or read the DOM ' + 'properties/attributes directly from this node (e.g., ' + 'this.refs.box.className).%s', getDeclarationErrorAddendum(component)) : undefined;\n return component._currentElement.props;\n }\n }\n };\n}\n\nfunction legacyGetDOMNode() {\n if (process.env.NODE_ENV !== 'production') {\n var component = this._reactInternalComponent;\n process.env.NODE_ENV !== 'production' ? warning(false, 'ReactDOMComponent: Do not access .getDOMNode() of a DOM node; ' + 'instead, use the node directly.%s', getDeclarationErrorAddendum(component)) : undefined;\n }\n return this;\n}\n\nfunction legacyIsMounted() {\n var component = this._reactInternalComponent;\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(false, 'ReactDOMComponent: Do not access .isMounted() of a DOM node.%s', getDeclarationErrorAddendum(component)) : undefined;\n }\n return !!component;\n}\n\nfunction legacySetStateEtc() {\n if (process.env.NODE_ENV !== 'production') {\n var component = this._reactInternalComponent;\n process.env.NODE_ENV !== 'production' ? warning(false, 'ReactDOMComponent: Do not access .setState(), .replaceState(), or ' + '.forceUpdate() of a DOM node. This is a no-op.%s', getDeclarationErrorAddendum(component)) : undefined;\n }\n}\n\nfunction legacySetProps(partialProps, callback) {\n var component = this._reactInternalComponent;\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(false, 'ReactDOMComponent: Do not access .setProps() of a DOM node. ' + 'Instead, call ReactDOM.render again at the top level.%s', getDeclarationErrorAddendum(component)) : undefined;\n }\n if (!component) {\n return;\n }\n ReactUpdateQueue.enqueueSetPropsInternal(component, partialProps);\n if (callback) {\n ReactUpdateQueue.enqueueCallbackInternal(component, callback);\n }\n}\n\nfunction legacyReplaceProps(partialProps, callback) {\n var component = this._reactInternalComponent;\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(false, 'ReactDOMComponent: Do not access .replaceProps() of a DOM node. ' + 'Instead, call ReactDOM.render again at the top level.%s', getDeclarationErrorAddendum(component)) : undefined;\n }\n if (!component) {\n return;\n }\n ReactUpdateQueue.enqueueReplacePropsInternal(component, partialProps);\n if (callback) {\n ReactUpdateQueue.enqueueCallbackInternal(component, callback);\n }\n}\n\nfunction friendlyStringify(obj) {\n if (typeof obj === 'object') {\n if (Array.isArray(obj)) {\n return '[' + obj.map(friendlyStringify).join(', ') + ']';\n } else {\n var pairs = [];\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n var keyEscaped = /^[a-z$_][\\w$_]*$/i.test(key) ? key : JSON.stringify(key);\n pairs.push(keyEscaped + ': ' + friendlyStringify(obj[key]));\n }\n }\n return '{' + pairs.join(', ') + '}';\n }\n } else if (typeof obj === 'string') {\n return JSON.stringify(obj);\n } else if (typeof obj === 'function') {\n return '[function object]';\n }\n // Differs from JSON.stringify in that undefined becauses undefined and that\n // inf and nan don't become null\n return String(obj);\n}\n\nvar styleMutationWarning = {};\n\nfunction checkAndWarnForMutatedStyle(style1, style2, component) {\n if (style1 == null || style2 == null) {\n return;\n }\n if (shallowEqual(style1, style2)) {\n return;\n }\n\n var componentName = component._tag;\n var owner = component._currentElement._owner;\n var ownerName;\n if (owner) {\n ownerName = owner.getName();\n }\n\n var hash = ownerName + '|' + componentName;\n\n if (styleMutationWarning.hasOwnProperty(hash)) {\n return;\n }\n\n styleMutationWarning[hash] = true;\n\n process.env.NODE_ENV !== 'production' ? warning(false, '`%s` was passed a style object that has previously been mutated. ' + 'Mutating `style` is deprecated. Consider cloning it beforehand. Check ' + 'the `render` %s. Previous style: %s. Mutated style: %s.', componentName, owner ? 'of `' + ownerName + '`' : 'using <' + componentName + '>', friendlyStringify(style1), friendlyStringify(style2)) : undefined;\n}\n\n/**\n * @param {object} component\n * @param {?object} props\n */\nfunction assertValidProps(component, props) {\n if (!props) {\n return;\n }\n // Note the use of `==` which checks for null or undefined.\n if (process.env.NODE_ENV !== 'production') {\n if (voidElementTags[component._tag]) {\n process.env.NODE_ENV !== 'production' ? warning(props.children == null && props.dangerouslySetInnerHTML == null, '%s is a void element tag and must not have `children` or ' + 'use `props.dangerouslySetInnerHTML`.%s', component._tag, component._currentElement._owner ? ' Check the render method of ' + component._currentElement._owner.getName() + '.' : '') : undefined;\n }\n }\n if (props.dangerouslySetInnerHTML != null) {\n !(props.children == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Can only set one of `children` or `props.dangerouslySetInnerHTML`.') : invariant(false) : undefined;\n !(typeof props.dangerouslySetInnerHTML === 'object' && HTML in props.dangerouslySetInnerHTML) ? process.env.NODE_ENV !== 'production' ? invariant(false, '`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. ' + 'Please visit https://fb.me/react-invariant-dangerously-set-inner-html ' + 'for more information.') : invariant(false) : undefined;\n }\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(props.innerHTML == null, 'Directly setting property `innerHTML` is not permitted. ' + 'For more information, lookup documentation on `dangerouslySetInnerHTML`.') : undefined;\n process.env.NODE_ENV !== 'production' ? warning(!props.contentEditable || props.children == null, 'A component is `contentEditable` and contains `children` managed by ' + 'React. It is now your responsibility to guarantee that none of ' + 'those nodes are unexpectedly modified or duplicated. This is ' + 'probably not intentional.') : undefined;\n }\n !(props.style == null || typeof props.style === 'object') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'The `style` prop expects a mapping from style properties to values, ' + 'not a string. For example, style={{marginRight: spacing + \\'em\\'}} when ' + 'using JSX.%s', getDeclarationErrorAddendum(component)) : invariant(false) : undefined;\n}\n\nfunction enqueuePutListener(id, registrationName, listener, transaction) {\n if (process.env.NODE_ENV !== 'production') {\n // IE8 has no API for event capturing and the `onScroll` event doesn't\n // bubble.\n process.env.NODE_ENV !== 'production' ? warning(registrationName !== 'onScroll' || isEventSupported('scroll', true), 'This browser doesn\\'t support the `onScroll` event') : undefined;\n }\n var container = ReactMount.findReactContainerForID(id);\n if (container) {\n var doc = container.nodeType === ELEMENT_NODE_TYPE ? container.ownerDocument : container;\n listenTo(registrationName, doc);\n }\n transaction.getReactMountReady().enqueue(putListener, {\n id: id,\n registrationName: registrationName,\n listener: listener\n });\n}\n\nfunction putListener() {\n var listenerToPut = this;\n ReactBrowserEventEmitter.putListener(listenerToPut.id, listenerToPut.registrationName, listenerToPut.listener);\n}\n\n// There are so many media events, it makes sense to just\n// maintain a list rather than create a `trapBubbledEvent` for each\nvar mediaEvents = {\n topAbort: 'abort',\n topCanPlay: 'canplay',\n topCanPlayThrough: 'canplaythrough',\n topDurationChange: 'durationchange',\n topEmptied: 'emptied',\n topEncrypted: 'encrypted',\n topEnded: 'ended',\n topError: 'error',\n topLoadedData: 'loadeddata',\n topLoadedMetadata: 'loadedmetadata',\n topLoadStart: 'loadstart',\n topPause: 'pause',\n topPlay: 'play',\n topPlaying: 'playing',\n topProgress: 'progress',\n topRateChange: 'ratechange',\n topSeeked: 'seeked',\n topSeeking: 'seeking',\n topStalled: 'stalled',\n topSuspend: 'suspend',\n topTimeUpdate: 'timeupdate',\n topVolumeChange: 'volumechange',\n topWaiting: 'waiting'\n};\n\nfunction trapBubbledEventsLocal() {\n var inst = this;\n // If a component renders to null or if another component fatals and causes\n // the state of the tree to be corrupted, `node` here can be null.\n !inst._rootNodeID ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Must be mounted to trap events') : invariant(false) : undefined;\n var node = ReactMount.getNode(inst._rootNodeID);\n !node ? process.env.NODE_ENV !== 'production' ? invariant(false, 'trapBubbledEvent(...): Requires node to be rendered.') : invariant(false) : undefined;\n\n switch (inst._tag) {\n case 'iframe':\n inst._wrapperState.listeners = [ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topLoad, 'load', node)];\n break;\n case 'video':\n case 'audio':\n\n inst._wrapperState.listeners = [];\n // create listener for each media event\n for (var event in mediaEvents) {\n if (mediaEvents.hasOwnProperty(event)) {\n inst._wrapperState.listeners.push(ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes[event], mediaEvents[event], node));\n }\n }\n\n break;\n case 'img':\n inst._wrapperState.listeners = [ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topError, 'error', node), ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topLoad, 'load', node)];\n break;\n case 'form':\n inst._wrapperState.listeners = [ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topReset, 'reset', node), ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topSubmit, 'submit', node)];\n break;\n }\n}\n\nfunction mountReadyInputWrapper() {\n ReactDOMInput.mountReadyWrapper(this);\n}\n\nfunction postUpdateSelectWrapper() {\n ReactDOMSelect.postUpdateWrapper(this);\n}\n\n// For HTML, certain tags should omit their close tag. We keep a whitelist for\n// those special cased tags.\n\nvar omittedCloseTags = {\n 'area': true,\n 'base': true,\n 'br': true,\n 'col': true,\n 'embed': true,\n 'hr': true,\n 'img': true,\n 'input': true,\n 'keygen': true,\n 'link': true,\n 'meta': true,\n 'param': true,\n 'source': true,\n 'track': true,\n 'wbr': true\n};\n\n// NOTE: menuitem's close tag should be omitted, but that causes problems.\nvar newlineEatingTags = {\n 'listing': true,\n 'pre': true,\n 'textarea': true\n};\n\n// For HTML, certain tags cannot have children. This has the same purpose as\n// `omittedCloseTags` except that `menuitem` should still have its closing tag.\n\nvar voidElementTags = assign({\n 'menuitem': true\n}, omittedCloseTags);\n\n// We accept any tag to be rendered but since this gets injected into arbitrary\n// HTML, we want to make sure that it's a safe tag.\n// http://www.w3.org/TR/REC-xml/#NT-Name\n\nvar VALID_TAG_REGEX = /^[a-zA-Z][a-zA-Z:_\\.\\-\\d]*$/; // Simplified subset\nvar validatedTagCache = {};\nvar hasOwnProperty = ({}).hasOwnProperty;\n\nfunction validateDangerousTag(tag) {\n if (!hasOwnProperty.call(validatedTagCache, tag)) {\n !VALID_TAG_REGEX.test(tag) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Invalid tag: %s', tag) : invariant(false) : undefined;\n validatedTagCache[tag] = true;\n }\n}\n\nfunction processChildContextDev(context, inst) {\n // Pass down our tag name to child components for validation purposes\n context = assign({}, context);\n var info = context[validateDOMNesting.ancestorInfoContextKey];\n context[validateDOMNesting.ancestorInfoContextKey] = validateDOMNesting.updatedAncestorInfo(info, inst._tag, inst);\n return context;\n}\n\nfunction isCustomComponent(tagName, props) {\n return tagName.indexOf('-') >= 0 || props.is != null;\n}\n\n/**\n * Creates a new React class that is idempotent and capable of containing other\n * React components. It accepts event listeners and DOM properties that are\n * valid according to `DOMProperty`.\n *\n * - Event listeners: `onClick`, `onMouseDown`, etc.\n * - DOM properties: `className`, `name`, `title`, etc.\n *\n * The `style` property functions differently from the DOM API. It accepts an\n * object mapping of style properties to values.\n *\n * @constructor ReactDOMComponent\n * @extends ReactMultiChild\n */\nfunction ReactDOMComponent(tag) {\n validateDangerousTag(tag);\n this._tag = tag.toLowerCase();\n this._renderedChildren = null;\n this._previousStyle = null;\n this._previousStyleCopy = null;\n this._rootNodeID = null;\n this._wrapperState = null;\n this._topLevelWrapper = null;\n this._nodeWithLegacyProperties = null;\n if (process.env.NODE_ENV !== 'production') {\n this._unprocessedContextDev = null;\n this._processedContextDev = null;\n }\n}\n\nReactDOMComponent.displayName = 'ReactDOMComponent';\n\nReactDOMComponent.Mixin = {\n\n construct: function (element) {\n this._currentElement = element;\n },\n\n /**\n * Generates root tag markup then recurses. This method has side effects and\n * is not idempotent.\n *\n * @internal\n * @param {string} rootID The root DOM ID for this node.\n * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction\n * @param {object} context\n * @return {string} The computed markup.\n */\n mountComponent: function (rootID, transaction, context) {\n this._rootNodeID = rootID;\n\n var props = this._currentElement.props;\n\n switch (this._tag) {\n case 'iframe':\n case 'img':\n case 'form':\n case 'video':\n case 'audio':\n this._wrapperState = {\n listeners: null\n };\n transaction.getReactMountReady().enqueue(trapBubbledEventsLocal, this);\n break;\n case 'button':\n props = ReactDOMButton.getNativeProps(this, props, context);\n break;\n case 'input':\n ReactDOMInput.mountWrapper(this, props, context);\n props = ReactDOMInput.getNativeProps(this, props, context);\n break;\n case 'option':\n ReactDOMOption.mountWrapper(this, props, context);\n props = ReactDOMOption.getNativeProps(this, props, context);\n break;\n case 'select':\n ReactDOMSelect.mountWrapper(this, props, context);\n props = ReactDOMSelect.getNativeProps(this, props, context);\n context = ReactDOMSelect.processChildContext(this, props, context);\n break;\n case 'textarea':\n ReactDOMTextarea.mountWrapper(this, props, context);\n props = ReactDOMTextarea.getNativeProps(this, props, context);\n break;\n }\n\n assertValidProps(this, props);\n if (process.env.NODE_ENV !== 'production') {\n if (context[validateDOMNesting.ancestorInfoContextKey]) {\n validateDOMNesting(this._tag, this, context[validateDOMNesting.ancestorInfoContextKey]);\n }\n }\n\n if (process.env.NODE_ENV !== 'production') {\n this._unprocessedContextDev = context;\n this._processedContextDev = processChildContextDev(context, this);\n context = this._processedContextDev;\n }\n\n var mountImage;\n if (transaction.useCreateElement) {\n var ownerDocument = context[ReactMount.ownerDocumentContextKey];\n var el = ownerDocument.createElement(this._currentElement.type);\n DOMPropertyOperations.setAttributeForID(el, this._rootNodeID);\n // Populate node cache\n ReactMount.getID(el);\n this._updateDOMProperties({}, props, transaction, el);\n this._createInitialChildren(transaction, props, context, el);\n mountImage = el;\n } else {\n var tagOpen = this._createOpenTagMarkupAndPutListeners(transaction, props);\n var tagContent = this._createContentMarkup(transaction, props, context);\n if (!tagContent && omittedCloseTags[this._tag]) {\n mountImage = tagOpen + '/>';\n } else {\n mountImage = tagOpen + '>' + tagContent + '</' + this._currentElement.type + '>';\n }\n }\n\n switch (this._tag) {\n case 'input':\n transaction.getReactMountReady().enqueue(mountReadyInputWrapper, this);\n // falls through\n case 'button':\n case 'select':\n case 'textarea':\n if (props.autoFocus) {\n transaction.getReactMountReady().enqueue(AutoFocusUtils.focusDOMComponent, this);\n }\n break;\n }\n\n return mountImage;\n },\n\n /**\n * Creates markup for the open tag and all attributes.\n *\n * This method has side effects because events get registered.\n *\n * Iterating over object properties is faster than iterating over arrays.\n * @see http://jsperf.com/obj-vs-arr-iteration\n *\n * @private\n * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction\n * @param {object} props\n * @return {string} Markup of opening tag.\n */\n _createOpenTagMarkupAndPutListeners: function (transaction, props) {\n var ret = '<' + this._currentElement.type;\n\n for (var propKey in props) {\n if (!props.hasOwnProperty(propKey)) {\n continue;\n }\n var propValue = props[propKey];\n if (propValue == null) {\n continue;\n }\n if (registrationNameModules.hasOwnProperty(propKey)) {\n if (propValue) {\n enqueuePutListener(this._rootNodeID, propKey, propValue, transaction);\n }\n } else {\n if (propKey === STYLE) {\n if (propValue) {\n if (process.env.NODE_ENV !== 'production') {\n // See `_updateDOMProperties`. style block\n this._previousStyle = propValue;\n }\n propValue = this._previousStyleCopy = assign({}, props.style);\n }\n propValue = CSSPropertyOperations.createMarkupForStyles(propValue);\n }\n var markup = null;\n if (this._tag != null && isCustomComponent(this._tag, props)) {\n if (propKey !== CHILDREN) {\n markup = DOMPropertyOperations.createMarkupForCustomAttribute(propKey, propValue);\n }\n } else {\n markup = DOMPropertyOperations.createMarkupForProperty(propKey, propValue);\n }\n if (markup) {\n ret += ' ' + markup;\n }\n }\n }\n\n // For static pages, no need to put React ID and checksum. Saves lots of\n // bytes.\n if (transaction.renderToStaticMarkup) {\n return ret;\n }\n\n var markupForID = DOMPropertyOperations.createMarkupForID(this._rootNodeID);\n return ret + ' ' + markupForID;\n },\n\n /**\n * Creates markup for the content between the tags.\n *\n * @private\n * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction\n * @param {object} props\n * @param {object} context\n * @return {string} Content markup.\n */\n _createContentMarkup: function (transaction, props, context) {\n var ret = '';\n\n // Intentional use of != to avoid catching zero/false.\n var innerHTML = props.dangerouslySetInnerHTML;\n if (innerHTML != null) {\n if (innerHTML.__html != null) {\n ret = innerHTML.__html;\n }\n } else {\n var contentToUse = CONTENT_TYPES[typeof props.children] ? props.children : null;\n var childrenToUse = contentToUse != null ? null : props.children;\n if (contentToUse != null) {\n // TODO: Validate that text is allowed as a child of this node\n ret = escapeTextContentForBrowser(contentToUse);\n } else if (childrenToUse != null) {\n var mountImages = this.mountChildren(childrenToUse, transaction, context);\n ret = mountImages.join('');\n }\n }\n if (newlineEatingTags[this._tag] && ret.charAt(0) === '\\n') {\n // text/html ignores the first character in these tags if it's a newline\n // Prefer to break application/xml over text/html (for now) by adding\n // a newline specifically to get eaten by the parser. (Alternately for\n // textareas, replacing \"^\\n\" with \"\\r\\n\" doesn't get eaten, and the first\n // \\r is normalized out by HTMLTextAreaElement#value.)\n // See: <http://www.w3.org/TR/html-polyglot/#newlines-in-textarea-and-pre>\n // See: <http://www.w3.org/TR/html5/syntax.html#element-restrictions>\n // See: <http://www.w3.org/TR/html5/syntax.html#newlines>\n // See: Parsing of \"textarea\" \"listing\" and \"pre\" elements\n // from <http://www.w3.org/TR/html5/syntax.html#parsing-main-inbody>\n return '\\n' + ret;\n } else {\n return ret;\n }\n },\n\n _createInitialChildren: function (transaction, props, context, el) {\n // Intentional use of != to avoid catching zero/false.\n var innerHTML = props.dangerouslySetInnerHTML;\n if (innerHTML != null) {\n if (innerHTML.__html != null) {\n setInnerHTML(el, innerHTML.__html);\n }\n } else {\n var contentToUse = CONTENT_TYPES[typeof props.children] ? props.children : null;\n var childrenToUse = contentToUse != null ? null : props.children;\n if (contentToUse != null) {\n // TODO: Validate that text is allowed as a child of this node\n setTextContent(el, contentToUse);\n } else if (childrenToUse != null) {\n var mountImages = this.mountChildren(childrenToUse, transaction, context);\n for (var i = 0; i < mountImages.length; i++) {\n el.appendChild(mountImages[i]);\n }\n }\n }\n },\n\n /**\n * Receives a next element and updates the component.\n *\n * @internal\n * @param {ReactElement} nextElement\n * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction\n * @param {object} context\n */\n receiveComponent: function (nextElement, transaction, context) {\n var prevElement = this._currentElement;\n this._currentElement = nextElement;\n this.updateComponent(transaction, prevElement, nextElement, context);\n },\n\n /**\n * Updates a native DOM component after it has already been allocated and\n * attached to the DOM. Reconciles the root DOM node, then recurses.\n *\n * @param {ReactReconcileTransaction} transaction\n * @param {ReactElement} prevElement\n * @param {ReactElement} nextElement\n * @internal\n * @overridable\n */\n updateComponent: function (transaction, prevElement, nextElement, context) {\n var lastProps = prevElement.props;\n var nextProps = this._currentElement.props;\n\n switch (this._tag) {\n case 'button':\n lastProps = ReactDOMButton.getNativeProps(this, lastProps);\n nextProps = ReactDOMButton.getNativeProps(this, nextProps);\n break;\n case 'input':\n ReactDOMInput.updateWrapper(this);\n lastProps = ReactDOMInput.getNativeProps(this, lastProps);\n nextProps = ReactDOMInput.getNativeProps(this, nextProps);\n break;\n case 'option':\n lastProps = ReactDOMOption.getNativeProps(this, lastProps);\n nextProps = ReactDOMOption.getNativeProps(this, nextProps);\n break;\n case 'select':\n lastProps = ReactDOMSelect.getNativeProps(this, lastProps);\n nextProps = ReactDOMSelect.getNativeProps(this, nextProps);\n break;\n case 'textarea':\n ReactDOMTextarea.updateWrapper(this);\n lastProps = ReactDOMTextarea.getNativeProps(this, lastProps);\n nextProps = ReactDOMTextarea.getNativeProps(this, nextProps);\n break;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n // If the context is reference-equal to the old one, pass down the same\n // processed object so the update bailout in ReactReconciler behaves\n // correctly (and identically in dev and prod). See #5005.\n if (this._unprocessedContextDev !== context) {\n this._unprocessedContextDev = context;\n this._processedContextDev = processChildContextDev(context, this);\n }\n context = this._processedContextDev;\n }\n\n assertValidProps(this, nextProps);\n this._updateDOMProperties(lastProps, nextProps, transaction, null);\n this._updateDOMChildren(lastProps, nextProps, transaction, context);\n\n if (!canDefineProperty && this._nodeWithLegacyProperties) {\n this._nodeWithLegacyProperties.props = nextProps;\n }\n\n if (this._tag === 'select') {\n // <select> value update needs to occur after <option> children\n // reconciliation\n transaction.getReactMountReady().enqueue(postUpdateSelectWrapper, this);\n }\n },\n\n /**\n * Reconciles the properties by detecting differences in property values and\n * updating the DOM as necessary. This function is probably the single most\n * critical path for performance optimization.\n *\n * TODO: Benchmark whether checking for changed values in memory actually\n * improves performance (especially statically positioned elements).\n * TODO: Benchmark the effects of putting this at the top since 99% of props\n * do not change for a given reconciliation.\n * TODO: Benchmark areas that can be improved with caching.\n *\n * @private\n * @param {object} lastProps\n * @param {object} nextProps\n * @param {ReactReconcileTransaction} transaction\n * @param {?DOMElement} node\n */\n _updateDOMProperties: function (lastProps, nextProps, transaction, node) {\n var propKey;\n var styleName;\n var styleUpdates;\n for (propKey in lastProps) {\n if (nextProps.hasOwnProperty(propKey) || !lastProps.hasOwnProperty(propKey)) {\n continue;\n }\n if (propKey === STYLE) {\n var lastStyle = this._previousStyleCopy;\n for (styleName in lastStyle) {\n if (lastStyle.hasOwnProperty(styleName)) {\n styleUpdates = styleUpdates || {};\n styleUpdates[styleName] = '';\n }\n }\n this._previousStyleCopy = null;\n } else if (registrationNameModules.hasOwnProperty(propKey)) {\n if (lastProps[propKey]) {\n // Only call deleteListener if there was a listener previously or\n // else willDeleteListener gets called when there wasn't actually a\n // listener (e.g., onClick={null})\n deleteListener(this._rootNodeID, propKey);\n }\n } else if (DOMProperty.properties[propKey] || DOMProperty.isCustomAttribute(propKey)) {\n if (!node) {\n node = ReactMount.getNode(this._rootNodeID);\n }\n DOMPropertyOperations.deleteValueForProperty(node, propKey);\n }\n }\n for (propKey in nextProps) {\n var nextProp = nextProps[propKey];\n var lastProp = propKey === STYLE ? this._previousStyleCopy : lastProps[propKey];\n if (!nextProps.hasOwnProperty(propKey) || nextProp === lastProp) {\n continue;\n }\n if (propKey === STYLE) {\n if (nextProp) {\n if (process.env.NODE_ENV !== 'production') {\n checkAndWarnForMutatedStyle(this._previousStyleCopy, this._previousStyle, this);\n this._previousStyle = nextProp;\n }\n nextProp = this._previousStyleCopy = assign({}, nextProp);\n } else {\n this._previousStyleCopy = null;\n }\n if (lastProp) {\n // Unset styles on `lastProp` but not on `nextProp`.\n for (styleName in lastProp) {\n if (lastProp.hasOwnProperty(styleName) && (!nextProp || !nextProp.hasOwnProperty(styleName))) {\n styleUpdates = styleUpdates || {};\n styleUpdates[styleName] = '';\n }\n }\n // Update styles that changed since `lastProp`.\n for (styleName in nextProp) {\n if (nextProp.hasOwnProperty(styleName) && lastProp[styleName] !== nextProp[styleName]) {\n styleUpdates = styleUpdates || {};\n styleUpdates[styleName] = nextProp[styleName];\n }\n }\n } else {\n // Relies on `updateStylesByID` not mutating `styleUpdates`.\n styleUpdates = nextProp;\n }\n } else if (registrationNameModules.hasOwnProperty(propKey)) {\n if (nextProp) {\n enqueuePutListener(this._rootNodeID, propKey, nextProp, transaction);\n } else if (lastProp) {\n deleteListener(this._rootNodeID, propKey);\n }\n } else if (isCustomComponent(this._tag, nextProps)) {\n if (!node) {\n node = ReactMount.getNode(this._rootNodeID);\n }\n if (propKey === CHILDREN) {\n nextProp = null;\n }\n DOMPropertyOperations.setValueForAttribute(node, propKey, nextProp);\n } else if (DOMProperty.properties[propKey] || DOMProperty.isCustomAttribute(propKey)) {\n if (!node) {\n node = ReactMount.getNode(this._rootNodeID);\n }\n // If we're updating to null or undefined, we should remove the property\n // from the DOM node instead of inadvertantly setting to a string. This\n // brings us in line with the same behavior we have on initial render.\n if (nextProp != null) {\n DOMPropertyOperations.setValueForProperty(node, propKey, nextProp);\n } else {\n DOMPropertyOperations.deleteValueForProperty(node, propKey);\n }\n }\n }\n if (styleUpdates) {\n if (!node) {\n node = ReactMount.getNode(this._rootNodeID);\n }\n CSSPropertyOperations.setValueForStyles(node, styleUpdates);\n }\n },\n\n /**\n * Reconciles the children with the various properties that affect the\n * children content.\n *\n * @param {object} lastProps\n * @param {object} nextProps\n * @param {ReactReconcileTransaction} transaction\n * @param {object} context\n */\n _updateDOMChildren: function (lastProps, nextProps, transaction, context) {\n var lastContent = CONTENT_TYPES[typeof lastProps.children] ? lastProps.children : null;\n var nextContent = CONTENT_TYPES[typeof nextProps.children] ? nextProps.children : null;\n\n var lastHtml = lastProps.dangerouslySetInnerHTML && lastProps.dangerouslySetInnerHTML.__html;\n var nextHtml = nextProps.dangerouslySetInnerHTML && nextProps.dangerouslySetInnerHTML.__html;\n\n // Note the use of `!=` which checks for null or undefined.\n var lastChildren = lastContent != null ? null : lastProps.children;\n var nextChildren = nextContent != null ? null : nextProps.children;\n\n // If we're switching from children to content/html or vice versa, remove\n // the old content\n var lastHasContentOrHtml = lastContent != null || lastHtml != null;\n var nextHasContentOrHtml = nextContent != null || nextHtml != null;\n if (lastChildren != null && nextChildren == null) {\n this.updateChildren(null, transaction, context);\n } else if (lastHasContentOrHtml && !nextHasContentOrHtml) {\n this.updateTextContent('');\n }\n\n if (nextContent != null) {\n if (lastContent !== nextContent) {\n this.updateTextContent('' + nextContent);\n }\n } else if (nextHtml != null) {\n if (lastHtml !== nextHtml) {\n this.updateMarkup('' + nextHtml);\n }\n } else if (nextChildren != null) {\n this.updateChildren(nextChildren, transaction, context);\n }\n },\n\n /**\n * Destroys all event registrations for this instance. Does not remove from\n * the DOM. That must be done by the parent.\n *\n * @internal\n */\n unmountComponent: function () {\n switch (this._tag) {\n case 'iframe':\n case 'img':\n case 'form':\n case 'video':\n case 'audio':\n var listeners = this._wrapperState.listeners;\n if (listeners) {\n for (var i = 0; i < listeners.length; i++) {\n listeners[i].remove();\n }\n }\n break;\n case 'input':\n ReactDOMInput.unmountWrapper(this);\n break;\n case 'html':\n case 'head':\n case 'body':\n /**\n * Components like <html> <head> and <body> can't be removed or added\n * easily in a cross-browser way, however it's valuable to be able to\n * take advantage of React's reconciliation for styling and <title>\n * management. So we just document it and throw in dangerous cases.\n */\n !false ? process.env.NODE_ENV !== 'production' ? invariant(false, '<%s> tried to unmount. Because of cross-browser quirks it is ' + 'impossible to unmount some top-level components (eg <html>, ' + '<head>, and <body>) reliably and efficiently. To fix this, have a ' + 'single top-level component that never unmounts render these ' + 'elements.', this._tag) : invariant(false) : undefined;\n break;\n }\n\n this.unmountChildren();\n ReactBrowserEventEmitter.deleteAllListeners(this._rootNodeID);\n ReactComponentBrowserEnvironment.unmountIDFromEnvironment(this._rootNodeID);\n this._rootNodeID = null;\n this._wrapperState = null;\n if (this._nodeWithLegacyProperties) {\n var node = this._nodeWithLegacyProperties;\n node._reactInternalComponent = null;\n this._nodeWithLegacyProperties = null;\n }\n },\n\n getPublicInstance: function () {\n if (!this._nodeWithLegacyProperties) {\n var node = ReactMount.getNode(this._rootNodeID);\n\n node._reactInternalComponent = this;\n node.getDOMNode = legacyGetDOMNode;\n node.isMounted = legacyIsMounted;\n node.setState = legacySetStateEtc;\n node.replaceState = legacySetStateEtc;\n node.forceUpdate = legacySetStateEtc;\n node.setProps = legacySetProps;\n node.replaceProps = legacyReplaceProps;\n\n if (process.env.NODE_ENV !== 'production') {\n if (canDefineProperty) {\n Object.defineProperties(node, legacyPropsDescriptor);\n } else {\n // updateComponent will update this property on subsequent renders\n node.props = this._currentElement.props;\n }\n } else {\n // updateComponent will update this property on subsequent renders\n node.props = this._currentElement.props;\n }\n\n this._nodeWithLegacyProperties = node;\n }\n return this._nodeWithLegacyProperties;\n }\n\n};\n\nReactPerf.measureMethods(ReactDOMComponent, 'ReactDOMComponent', {\n mountComponent: 'mountComponent',\n updateComponent: 'updateComponent'\n});\n\nassign(ReactDOMComponent.prototype, ReactDOMComponent.Mixin, ReactMultiChild.Mixin);\n\nmodule.exports = ReactDOMComponent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactDOMComponent.js\n ** module id = 92\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule AutoFocusUtils\n * @typechecks static-only\n */\n\n'use strict';\n\nvar ReactMount = require('./ReactMount');\n\nvar findDOMNode = require('./findDOMNode');\nvar focusNode = require('fbjs/lib/focusNode');\n\nvar Mixin = {\n componentDidMount: function () {\n if (this.props.autoFocus) {\n focusNode(findDOMNode(this));\n }\n }\n};\n\nvar AutoFocusUtils = {\n Mixin: Mixin,\n\n focusDOMComponent: function () {\n focusNode(ReactMount.getNode(this._rootNodeID));\n }\n};\n\nmodule.exports = AutoFocusUtils;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/AutoFocusUtils.js\n ** module id = 93\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule focusNode\n */\n\n'use strict';\n\n/**\n * @param {DOMElement} node input/textarea to focus\n */\nfunction focusNode(node) {\n // IE8 can throw \"Can't move focus to the control because it is invisible,\n // not enabled, or of a type that does not accept the focus.\" for all kinds of\n // reasons that are too expensive and fragile to test.\n try {\n node.focus();\n } catch (e) {}\n}\n\nmodule.exports = focusNode;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/focusNode.js\n ** module id = 94\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule CSSPropertyOperations\n * @typechecks static-only\n */\n\n'use strict';\n\nvar CSSProperty = require('./CSSProperty');\nvar ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');\nvar ReactPerf = require('./ReactPerf');\n\nvar camelizeStyleName = require('fbjs/lib/camelizeStyleName');\nvar dangerousStyleValue = require('./dangerousStyleValue');\nvar hyphenateStyleName = require('fbjs/lib/hyphenateStyleName');\nvar memoizeStringOnly = require('fbjs/lib/memoizeStringOnly');\nvar warning = require('fbjs/lib/warning');\n\nvar processStyleName = memoizeStringOnly(function (styleName) {\n return hyphenateStyleName(styleName);\n});\n\nvar hasShorthandPropertyBug = false;\nvar styleFloatAccessor = 'cssFloat';\nif (ExecutionEnvironment.canUseDOM) {\n var tempStyle = document.createElement('div').style;\n try {\n // IE8 throws \"Invalid argument.\" if resetting shorthand style properties.\n tempStyle.font = '';\n } catch (e) {\n hasShorthandPropertyBug = true;\n }\n // IE8 only supports accessing cssFloat (standard) as styleFloat\n if (document.documentElement.style.cssFloat === undefined) {\n styleFloatAccessor = 'styleFloat';\n }\n}\n\nif (process.env.NODE_ENV !== 'production') {\n // 'msTransform' is correct, but the other prefixes should be capitalized\n var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/;\n\n // style values shouldn't contain a semicolon\n var badStyleValueWithSemicolonPattern = /;\\s*$/;\n\n var warnedStyleNames = {};\n var warnedStyleValues = {};\n\n var warnHyphenatedStyleName = function (name) {\n if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {\n return;\n }\n\n warnedStyleNames[name] = true;\n process.env.NODE_ENV !== 'production' ? warning(false, 'Unsupported style property %s. Did you mean %s?', name, camelizeStyleName(name)) : undefined;\n };\n\n var warnBadVendoredStyleName = function (name) {\n if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {\n return;\n }\n\n warnedStyleNames[name] = true;\n process.env.NODE_ENV !== 'production' ? warning(false, 'Unsupported vendor-prefixed style property %s. Did you mean %s?', name, name.charAt(0).toUpperCase() + name.slice(1)) : undefined;\n };\n\n var warnStyleValueWithSemicolon = function (name, value) {\n if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) {\n return;\n }\n\n warnedStyleValues[value] = true;\n process.env.NODE_ENV !== 'production' ? warning(false, 'Style property values shouldn\\'t contain a semicolon. ' + 'Try \"%s: %s\" instead.', name, value.replace(badStyleValueWithSemicolonPattern, '')) : undefined;\n };\n\n /**\n * @param {string} name\n * @param {*} value\n */\n var warnValidStyle = function (name, value) {\n if (name.indexOf('-') > -1) {\n warnHyphenatedStyleName(name);\n } else if (badVendoredStyleNamePattern.test(name)) {\n warnBadVendoredStyleName(name);\n } else if (badStyleValueWithSemicolonPattern.test(value)) {\n warnStyleValueWithSemicolon(name, value);\n }\n };\n}\n\n/**\n * Operations for dealing with CSS properties.\n */\nvar CSSPropertyOperations = {\n\n /**\n * Serializes a mapping of style properties for use as inline styles:\n *\n * > createMarkupForStyles({width: '200px', height: 0})\n * \"width:200px;height:0;\"\n *\n * Undefined values are ignored so that declarative programming is easier.\n * The result should be HTML-escaped before insertion into the DOM.\n *\n * @param {object} styles\n * @return {?string}\n */\n createMarkupForStyles: function (styles) {\n var serialized = '';\n for (var styleName in styles) {\n if (!styles.hasOwnProperty(styleName)) {\n continue;\n }\n var styleValue = styles[styleName];\n if (process.env.NODE_ENV !== 'production') {\n warnValidStyle(styleName, styleValue);\n }\n if (styleValue != null) {\n serialized += processStyleName(styleName) + ':';\n serialized += dangerousStyleValue(styleName, styleValue) + ';';\n }\n }\n return serialized || null;\n },\n\n /**\n * Sets the value for multiple styles on a node. If a value is specified as\n * '' (empty string), the corresponding style property will be unset.\n *\n * @param {DOMElement} node\n * @param {object} styles\n */\n setValueForStyles: function (node, styles) {\n var style = node.style;\n for (var styleName in styles) {\n if (!styles.hasOwnProperty(styleName)) {\n continue;\n }\n if (process.env.NODE_ENV !== 'production') {\n warnValidStyle(styleName, styles[styleName]);\n }\n var styleValue = dangerousStyleValue(styleName, styles[styleName]);\n if (styleName === 'float') {\n styleName = styleFloatAccessor;\n }\n if (styleValue) {\n style[styleName] = styleValue;\n } else {\n var expansion = hasShorthandPropertyBug && CSSProperty.shorthandPropertyExpansions[styleName];\n if (expansion) {\n // Shorthand property that IE8 won't like unsetting, so unset each\n // component to placate it\n for (var individualStyleName in expansion) {\n style[individualStyleName] = '';\n }\n } else {\n style[styleName] = '';\n }\n }\n }\n }\n\n};\n\nReactPerf.measureMethods(CSSPropertyOperations, 'CSSPropertyOperations', {\n setValueForStyles: 'setValueForStyles'\n});\n\nmodule.exports = CSSPropertyOperations;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/CSSPropertyOperations.js\n ** module id = 95\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule CSSProperty\n */\n\n'use strict';\n\n/**\n * CSS properties which accept numbers but are not in units of \"px\".\n */\nvar isUnitlessNumber = {\n animationIterationCount: true,\n boxFlex: true,\n boxFlexGroup: true,\n boxOrdinalGroup: true,\n columnCount: true,\n flex: true,\n flexGrow: true,\n flexPositive: true,\n flexShrink: true,\n flexNegative: true,\n flexOrder: true,\n fontWeight: true,\n lineClamp: true,\n lineHeight: true,\n opacity: true,\n order: true,\n orphans: true,\n tabSize: true,\n widows: true,\n zIndex: true,\n zoom: true,\n\n // SVG-related properties\n fillOpacity: true,\n stopOpacity: true,\n strokeDashoffset: true,\n strokeOpacity: true,\n strokeWidth: true\n};\n\n/**\n * @param {string} prefix vendor-specific prefix, eg: Webkit\n * @param {string} key style name, eg: transitionDuration\n * @return {string} style name prefixed with `prefix`, properly camelCased, eg:\n * WebkitTransitionDuration\n */\nfunction prefixKey(prefix, key) {\n return prefix + key.charAt(0).toUpperCase() + key.substring(1);\n}\n\n/**\n * Support style names that may come passed in prefixed by adding permutations\n * of vendor prefixes.\n */\nvar prefixes = ['Webkit', 'ms', 'Moz', 'O'];\n\n// Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an\n// infinite loop, because it iterates over the newly added props too.\nObject.keys(isUnitlessNumber).forEach(function (prop) {\n prefixes.forEach(function (prefix) {\n isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop];\n });\n});\n\n/**\n * Most style properties can be unset by doing .style[prop] = '' but IE8\n * doesn't like doing that with shorthand properties so for the properties that\n * IE8 breaks on, which are listed here, we instead unset each of the\n * individual properties. See http://bugs.jquery.com/ticket/12385.\n * The 4-value 'clock' properties like margin, padding, border-width seem to\n * behave without any problems. Curiously, list-style works too without any\n * special prodding.\n */\nvar shorthandPropertyExpansions = {\n background: {\n backgroundAttachment: true,\n backgroundColor: true,\n backgroundImage: true,\n backgroundPositionX: true,\n backgroundPositionY: true,\n backgroundRepeat: true\n },\n backgroundPosition: {\n backgroundPositionX: true,\n backgroundPositionY: true\n },\n border: {\n borderWidth: true,\n borderStyle: true,\n borderColor: true\n },\n borderBottom: {\n borderBottomWidth: true,\n borderBottomStyle: true,\n borderBottomColor: true\n },\n borderLeft: {\n borderLeftWidth: true,\n borderLeftStyle: true,\n borderLeftColor: true\n },\n borderRight: {\n borderRightWidth: true,\n borderRightStyle: true,\n borderRightColor: true\n },\n borderTop: {\n borderTopWidth: true,\n borderTopStyle: true,\n borderTopColor: true\n },\n font: {\n fontStyle: true,\n fontVariant: true,\n fontWeight: true,\n fontSize: true,\n lineHeight: true,\n fontFamily: true\n },\n outline: {\n outlineWidth: true,\n outlineStyle: true,\n outlineColor: true\n }\n};\n\nvar CSSProperty = {\n isUnitlessNumber: isUnitlessNumber,\n shorthandPropertyExpansions: shorthandPropertyExpansions\n};\n\nmodule.exports = CSSProperty;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/CSSProperty.js\n ** module id = 96\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule camelizeStyleName\n * @typechecks\n */\n\n'use strict';\n\nvar camelize = require('./camelize');\n\nvar msPattern = /^-ms-/;\n\n/**\n * Camelcases a hyphenated CSS property name, for example:\n *\n * > camelizeStyleName('background-color')\n * < \"backgroundColor\"\n * > camelizeStyleName('-moz-transition')\n * < \"MozTransition\"\n * > camelizeStyleName('-ms-transition')\n * < \"msTransition\"\n *\n * As Andi Smith suggests\n * (http://www.andismith.com/blog/2012/02/modernizr-prefixed/), an `-ms` prefix\n * is converted to lowercase `ms`.\n *\n * @param {string} string\n * @return {string}\n */\nfunction camelizeStyleName(string) {\n return camelize(string.replace(msPattern, 'ms-'));\n}\n\nmodule.exports = camelizeStyleName;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/camelizeStyleName.js\n ** module id = 97\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule camelize\n * @typechecks\n */\n\n\"use strict\";\n\nvar _hyphenPattern = /-(.)/g;\n\n/**\n * Camelcases a hyphenated string, for example:\n *\n * > camelize('background-color')\n * < \"backgroundColor\"\n *\n * @param {string} string\n * @return {string}\n */\nfunction camelize(string) {\n return string.replace(_hyphenPattern, function (_, character) {\n return character.toUpperCase();\n });\n}\n\nmodule.exports = camelize;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/camelize.js\n ** module id = 98\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule dangerousStyleValue\n * @typechecks static-only\n */\n\n'use strict';\n\nvar CSSProperty = require('./CSSProperty');\n\nvar isUnitlessNumber = CSSProperty.isUnitlessNumber;\n\n/**\n * Convert a value into the proper css writable value. The style name `name`\n * should be logical (no hyphens), as specified\n * in `CSSProperty.isUnitlessNumber`.\n *\n * @param {string} name CSS property name such as `topMargin`.\n * @param {*} value CSS property value such as `10px`.\n * @return {string} Normalized style value with dimensions applied.\n */\nfunction dangerousStyleValue(name, value) {\n // Note that we've removed escapeTextForBrowser() calls here since the\n // whole string will be escaped when the attribute is injected into\n // the markup. If you provide unsafe user data here they can inject\n // arbitrary CSS which may be problematic (I couldn't repro this):\n // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet\n // http://www.thespanner.co.uk/2007/11/26/ultimate-xss-css-injection/\n // This is not an XSS hole but instead a potential CSS injection issue\n // which has lead to a greater discussion about how we're going to\n // trust URLs moving forward. See #2115901\n\n var isEmpty = value == null || typeof value === 'boolean' || value === '';\n if (isEmpty) {\n return '';\n }\n\n var isNonNumeric = isNaN(value);\n if (isNonNumeric || value === 0 || isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name]) {\n return '' + value; // cast to string\n }\n\n if (typeof value === 'string') {\n value = value.trim();\n }\n return value + 'px';\n}\n\nmodule.exports = dangerousStyleValue;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/dangerousStyleValue.js\n ** module id = 99\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule hyphenateStyleName\n * @typechecks\n */\n\n'use strict';\n\nvar hyphenate = require('./hyphenate');\n\nvar msPattern = /^ms-/;\n\n/**\n * Hyphenates a camelcased CSS property name, for example:\n *\n * > hyphenateStyleName('backgroundColor')\n * < \"background-color\"\n * > hyphenateStyleName('MozTransition')\n * < \"-moz-transition\"\n * > hyphenateStyleName('msTransition')\n * < \"-ms-transition\"\n *\n * As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix\n * is converted to `-ms-`.\n *\n * @param {string} string\n * @return {string}\n */\nfunction hyphenateStyleName(string) {\n return hyphenate(string).replace(msPattern, '-ms-');\n}\n\nmodule.exports = hyphenateStyleName;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/hyphenateStyleName.js\n ** module id = 100\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule hyphenate\n * @typechecks\n */\n\n'use strict';\n\nvar _uppercasePattern = /([A-Z])/g;\n\n/**\n * Hyphenates a camelcased string, for example:\n *\n * > hyphenate('backgroundColor')\n * < \"background-color\"\n *\n * For CSS style names, use `hyphenateStyleName` instead which works properly\n * with all vendor prefixes, including `ms`.\n *\n * @param {string} string\n * @return {string}\n */\nfunction hyphenate(string) {\n return string.replace(_uppercasePattern, '-$1').toLowerCase();\n}\n\nmodule.exports = hyphenate;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/hyphenate.js\n ** module id = 101\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule memoizeStringOnly\n * @typechecks static-only\n */\n\n'use strict';\n\n/**\n * Memoizes the return value of a function that accepts one string argument.\n *\n * @param {function} callback\n * @return {function}\n */\nfunction memoizeStringOnly(callback) {\n var cache = {};\n return function (string) {\n if (!cache.hasOwnProperty(string)) {\n cache[string] = callback.call(this, string);\n }\n return cache[string];\n };\n}\n\nmodule.exports = memoizeStringOnly;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/memoizeStringOnly.js\n ** module id = 102\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactDOMButton\n */\n\n'use strict';\n\nvar mouseListenerNames = {\n onClick: true,\n onDoubleClick: true,\n onMouseDown: true,\n onMouseMove: true,\n onMouseUp: true,\n\n onClickCapture: true,\n onDoubleClickCapture: true,\n onMouseDownCapture: true,\n onMouseMoveCapture: true,\n onMouseUpCapture: true\n};\n\n/**\n * Implements a <button> native component that does not receive mouse events\n * when `disabled` is set.\n */\nvar ReactDOMButton = {\n getNativeProps: function (inst, props, context) {\n if (!props.disabled) {\n return props;\n }\n\n // Copy the props, except the mouse listeners\n var nativeProps = {};\n for (var key in props) {\n if (props.hasOwnProperty(key) && !mouseListenerNames[key]) {\n nativeProps[key] = props[key];\n }\n }\n\n return nativeProps;\n }\n};\n\nmodule.exports = ReactDOMButton;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactDOMButton.js\n ** module id = 103\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactDOMInput\n */\n\n'use strict';\n\nvar ReactDOMIDOperations = require('./ReactDOMIDOperations');\nvar LinkedValueUtils = require('./LinkedValueUtils');\nvar ReactMount = require('./ReactMount');\nvar ReactUpdates = require('./ReactUpdates');\n\nvar assign = require('./Object.assign');\nvar invariant = require('fbjs/lib/invariant');\n\nvar instancesByReactID = {};\n\nfunction forceUpdateIfMounted() {\n if (this._rootNodeID) {\n // DOM component is still mounted; update\n ReactDOMInput.updateWrapper(this);\n }\n}\n\n/**\n * Implements an <input> native component that allows setting these optional\n * props: `checked`, `value`, `defaultChecked`, and `defaultValue`.\n *\n * If `checked` or `value` are not supplied (or null/undefined), user actions\n * that affect the checked state or value will trigger updates to the element.\n *\n * If they are supplied (and not null/undefined), the rendered element will not\n * trigger updates to the element. Instead, the props must change in order for\n * the rendered element to be updated.\n *\n * The rendered element will be initialized as unchecked (or `defaultChecked`)\n * with an empty value (or `defaultValue`).\n *\n * @see http://www.w3.org/TR/2012/WD-html5-20121025/the-input-element.html\n */\nvar ReactDOMInput = {\n getNativeProps: function (inst, props, context) {\n var value = LinkedValueUtils.getValue(props);\n var checked = LinkedValueUtils.getChecked(props);\n\n var nativeProps = assign({}, props, {\n defaultChecked: undefined,\n defaultValue: undefined,\n value: value != null ? value : inst._wrapperState.initialValue,\n checked: checked != null ? checked : inst._wrapperState.initialChecked,\n onChange: inst._wrapperState.onChange\n });\n\n return nativeProps;\n },\n\n mountWrapper: function (inst, props) {\n if (process.env.NODE_ENV !== 'production') {\n LinkedValueUtils.checkPropTypes('input', props, inst._currentElement._owner);\n }\n\n var defaultValue = props.defaultValue;\n inst._wrapperState = {\n initialChecked: props.defaultChecked || false,\n initialValue: defaultValue != null ? defaultValue : null,\n onChange: _handleChange.bind(inst)\n };\n },\n\n mountReadyWrapper: function (inst) {\n // Can't be in mountWrapper or else server rendering leaks.\n instancesByReactID[inst._rootNodeID] = inst;\n },\n\n unmountWrapper: function (inst) {\n delete instancesByReactID[inst._rootNodeID];\n },\n\n updateWrapper: function (inst) {\n var props = inst._currentElement.props;\n\n // TODO: Shouldn't this be getChecked(props)?\n var checked = props.checked;\n if (checked != null) {\n ReactDOMIDOperations.updatePropertyByID(inst._rootNodeID, 'checked', checked || false);\n }\n\n var value = LinkedValueUtils.getValue(props);\n if (value != null) {\n // Cast `value` to a string to ensure the value is set correctly. While\n // browsers typically do this as necessary, jsdom doesn't.\n ReactDOMIDOperations.updatePropertyByID(inst._rootNodeID, 'value', '' + value);\n }\n }\n};\n\nfunction _handleChange(event) {\n var props = this._currentElement.props;\n\n var returnValue = LinkedValueUtils.executeOnChange(props, event);\n\n // Here we use asap to wait until all updates have propagated, which\n // is important when using controlled components within layers:\n // https://github.com/facebook/react/issues/1698\n ReactUpdates.asap(forceUpdateIfMounted, this);\n\n var name = props.name;\n if (props.type === 'radio' && name != null) {\n var rootNode = ReactMount.getNode(this._rootNodeID);\n var queryRoot = rootNode;\n\n while (queryRoot.parentNode) {\n queryRoot = queryRoot.parentNode;\n }\n\n // If `rootNode.form` was non-null, then we could try `form.elements`,\n // but that sometimes behaves strangely in IE8. We could also try using\n // `form.getElementsByName`, but that will only return direct children\n // and won't include inputs that use the HTML5 `form=` attribute. Since\n // the input might not even be in a form, let's just use the global\n // `querySelectorAll` to ensure we don't miss anything.\n var group = queryRoot.querySelectorAll('input[name=' + JSON.stringify('' + name) + '][type=\"radio\"]');\n\n for (var i = 0; i < group.length; i++) {\n var otherNode = group[i];\n if (otherNode === rootNode || otherNode.form !== rootNode.form) {\n continue;\n }\n // This will throw if radio buttons rendered by different copies of React\n // and the same name are rendered into the same form (same as #1939).\n // That's probably okay; we don't support it just as we don't support\n // mixing React with non-React.\n var otherID = ReactMount.getID(otherNode);\n !otherID ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactDOMInput: Mixing React and non-React radio inputs with the ' + 'same `name` is not supported.') : invariant(false) : undefined;\n var otherInstance = instancesByReactID[otherID];\n !otherInstance ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactDOMInput: Unknown radio button ID %s.', otherID) : invariant(false) : undefined;\n // If this is a controlled radio button group, forcing the input that\n // was previously checked to update will cause it to be come re-checked\n // as appropriate.\n ReactUpdates.asap(forceUpdateIfMounted, otherInstance);\n }\n }\n\n return returnValue;\n}\n\nmodule.exports = ReactDOMInput;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactDOMInput.js\n ** module id = 104\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule LinkedValueUtils\n * @typechecks static-only\n */\n\n'use strict';\n\nvar ReactPropTypes = require('./ReactPropTypes');\nvar ReactPropTypeLocations = require('./ReactPropTypeLocations');\n\nvar invariant = require('fbjs/lib/invariant');\nvar warning = require('fbjs/lib/warning');\n\nvar hasReadOnlyValue = {\n 'button': true,\n 'checkbox': true,\n 'image': true,\n 'hidden': true,\n 'radio': true,\n 'reset': true,\n 'submit': true\n};\n\nfunction _assertSingleLink(inputProps) {\n !(inputProps.checkedLink == null || inputProps.valueLink == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Cannot provide a checkedLink and a valueLink. If you want to use ' + 'checkedLink, you probably don\\'t want to use valueLink and vice versa.') : invariant(false) : undefined;\n}\nfunction _assertValueLink(inputProps) {\n _assertSingleLink(inputProps);\n !(inputProps.value == null && inputProps.onChange == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Cannot provide a valueLink and a value or onChange event. If you want ' + 'to use value or onChange, you probably don\\'t want to use valueLink.') : invariant(false) : undefined;\n}\n\nfunction _assertCheckedLink(inputProps) {\n _assertSingleLink(inputProps);\n !(inputProps.checked == null && inputProps.onChange == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Cannot provide a checkedLink and a checked property or onChange event. ' + 'If you want to use checked or onChange, you probably don\\'t want to ' + 'use checkedLink') : invariant(false) : undefined;\n}\n\nvar propTypes = {\n value: function (props, propName, componentName) {\n if (!props[propName] || hasReadOnlyValue[props.type] || props.onChange || props.readOnly || props.disabled) {\n return null;\n }\n return new Error('You provided a `value` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultValue`. Otherwise, ' + 'set either `onChange` or `readOnly`.');\n },\n checked: function (props, propName, componentName) {\n if (!props[propName] || props.onChange || props.readOnly || props.disabled) {\n return null;\n }\n return new Error('You provided a `checked` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultChecked`. Otherwise, ' + 'set either `onChange` or `readOnly`.');\n },\n onChange: ReactPropTypes.func\n};\n\nvar loggedTypeFailures = {};\nfunction getDeclarationErrorAddendum(owner) {\n if (owner) {\n var name = owner.getName();\n if (name) {\n return ' Check the render method of `' + name + '`.';\n }\n }\n return '';\n}\n\n/**\n * Provide a linked `value` attribute for controlled forms. You should not use\n * this outside of the ReactDOM controlled form components.\n */\nvar LinkedValueUtils = {\n checkPropTypes: function (tagName, props, owner) {\n for (var propName in propTypes) {\n if (propTypes.hasOwnProperty(propName)) {\n var error = propTypes[propName](props, propName, tagName, ReactPropTypeLocations.prop);\n }\n if (error instanceof Error && !(error.message in loggedTypeFailures)) {\n // Only monitor this failure once because there tends to be a lot of the\n // same error.\n loggedTypeFailures[error.message] = true;\n\n var addendum = getDeclarationErrorAddendum(owner);\n process.env.NODE_ENV !== 'production' ? warning(false, 'Failed form propType: %s%s', error.message, addendum) : undefined;\n }\n }\n },\n\n /**\n * @param {object} inputProps Props for form component\n * @return {*} current value of the input either from value prop or link.\n */\n getValue: function (inputProps) {\n if (inputProps.valueLink) {\n _assertValueLink(inputProps);\n return inputProps.valueLink.value;\n }\n return inputProps.value;\n },\n\n /**\n * @param {object} inputProps Props for form component\n * @return {*} current checked status of the input either from checked prop\n * or link.\n */\n getChecked: function (inputProps) {\n if (inputProps.checkedLink) {\n _assertCheckedLink(inputProps);\n return inputProps.checkedLink.value;\n }\n return inputProps.checked;\n },\n\n /**\n * @param {object} inputProps Props for form component\n * @param {SyntheticEvent} event change event to handle\n */\n executeOnChange: function (inputProps, event) {\n if (inputProps.valueLink) {\n _assertValueLink(inputProps);\n return inputProps.valueLink.requestChange(event.target.value);\n } else if (inputProps.checkedLink) {\n _assertCheckedLink(inputProps);\n return inputProps.checkedLink.requestChange(event.target.checked);\n } else if (inputProps.onChange) {\n return inputProps.onChange.call(undefined, event);\n }\n }\n};\n\nmodule.exports = LinkedValueUtils;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/LinkedValueUtils.js\n ** module id = 105\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactPropTypes\n */\n\n'use strict';\n\nvar ReactElement = require('./ReactElement');\nvar ReactPropTypeLocationNames = require('./ReactPropTypeLocationNames');\n\nvar emptyFunction = require('fbjs/lib/emptyFunction');\nvar getIteratorFn = require('./getIteratorFn');\n\n/**\n * Collection of methods that allow declaration and validation of props that are\n * supplied to React components. Example usage:\n *\n * var Props = require('ReactPropTypes');\n * var MyArticle = React.createClass({\n * propTypes: {\n * // An optional string prop named \"description\".\n * description: Props.string,\n *\n * // A required enum prop named \"category\".\n * category: Props.oneOf(['News','Photos']).isRequired,\n *\n * // A prop named \"dialog\" that requires an instance of Dialog.\n * dialog: Props.instanceOf(Dialog).isRequired\n * },\n * render: function() { ... }\n * });\n *\n * A more formal specification of how these methods are used:\n *\n * type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...)\n * decl := ReactPropTypes.{type}(.isRequired)?\n *\n * Each and every declaration produces a function with the same signature. This\n * allows the creation of custom validation functions. For example:\n *\n * var MyLink = React.createClass({\n * propTypes: {\n * // An optional string or URI prop named \"href\".\n * href: function(props, propName, componentName) {\n * var propValue = props[propName];\n * if (propValue != null && typeof propValue !== 'string' &&\n * !(propValue instanceof URI)) {\n * return new Error(\n * 'Expected a string or an URI for ' + propName + ' in ' +\n * componentName\n * );\n * }\n * }\n * },\n * render: function() {...}\n * });\n *\n * @internal\n */\n\nvar ANONYMOUS = '<<anonymous>>';\n\nvar ReactPropTypes = {\n array: createPrimitiveTypeChecker('array'),\n bool: createPrimitiveTypeChecker('boolean'),\n func: createPrimitiveTypeChecker('function'),\n number: createPrimitiveTypeChecker('number'),\n object: createPrimitiveTypeChecker('object'),\n string: createPrimitiveTypeChecker('string'),\n\n any: createAnyTypeChecker(),\n arrayOf: createArrayOfTypeChecker,\n element: createElementTypeChecker(),\n instanceOf: createInstanceTypeChecker,\n node: createNodeChecker(),\n objectOf: createObjectOfTypeChecker,\n oneOf: createEnumTypeChecker,\n oneOfType: createUnionTypeChecker,\n shape: createShapeTypeChecker\n};\n\nfunction createChainableTypeChecker(validate) {\n function checkType(isRequired, props, propName, componentName, location, propFullName) {\n componentName = componentName || ANONYMOUS;\n propFullName = propFullName || propName;\n if (props[propName] == null) {\n var locationName = ReactPropTypeLocationNames[location];\n if (isRequired) {\n return new Error('Required ' + locationName + ' `' + propFullName + '` was not specified in ' + ('`' + componentName + '`.'));\n }\n return null;\n } else {\n return validate(props, propName, componentName, location, propFullName);\n }\n }\n\n var chainedCheckType = checkType.bind(null, false);\n chainedCheckType.isRequired = checkType.bind(null, true);\n\n return chainedCheckType;\n}\n\nfunction createPrimitiveTypeChecker(expectedType) {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== expectedType) {\n var locationName = ReactPropTypeLocationNames[location];\n // `propValue` being instance of, say, date/regexp, pass the 'object'\n // check, but we can offer a more precise error message here rather than\n // 'of type `object`'.\n var preciseType = getPreciseType(propValue);\n\n return new Error('Invalid ' + locationName + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n}\n\nfunction createAnyTypeChecker() {\n return createChainableTypeChecker(emptyFunction.thatReturns(null));\n}\n\nfunction createArrayOfTypeChecker(typeChecker) {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n if (!Array.isArray(propValue)) {\n var locationName = ReactPropTypeLocationNames[location];\n var propType = getPropType(propValue);\n return new Error('Invalid ' + locationName + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.'));\n }\n for (var i = 0; i < propValue.length; i++) {\n var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']');\n if (error instanceof Error) {\n return error;\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n}\n\nfunction createElementTypeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n if (!ReactElement.isValidElement(props[propName])) {\n var locationName = ReactPropTypeLocationNames[location];\n return new Error('Invalid ' + locationName + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a single ReactElement.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n}\n\nfunction createInstanceTypeChecker(expectedClass) {\n function validate(props, propName, componentName, location, propFullName) {\n if (!(props[propName] instanceof expectedClass)) {\n var locationName = ReactPropTypeLocationNames[location];\n var expectedClassName = expectedClass.name || ANONYMOUS;\n var actualClassName = getClassName(props[propName]);\n return new Error('Invalid ' + locationName + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n}\n\nfunction createEnumTypeChecker(expectedValues) {\n if (!Array.isArray(expectedValues)) {\n return createChainableTypeChecker(function () {\n return new Error('Invalid argument supplied to oneOf, expected an instance of array.');\n });\n }\n\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n for (var i = 0; i < expectedValues.length; i++) {\n if (propValue === expectedValues[i]) {\n return null;\n }\n }\n\n var locationName = ReactPropTypeLocationNames[location];\n var valuesString = JSON.stringify(expectedValues);\n return new Error('Invalid ' + locationName + ' `' + propFullName + '` of value `' + propValue + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.'));\n }\n return createChainableTypeChecker(validate);\n}\n\nfunction createObjectOfTypeChecker(typeChecker) {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n var locationName = ReactPropTypeLocationNames[location];\n return new Error('Invalid ' + locationName + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.'));\n }\n for (var key in propValue) {\n if (propValue.hasOwnProperty(key)) {\n var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key);\n if (error instanceof Error) {\n return error;\n }\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n}\n\nfunction createUnionTypeChecker(arrayOfTypeCheckers) {\n if (!Array.isArray(arrayOfTypeCheckers)) {\n return createChainableTypeChecker(function () {\n return new Error('Invalid argument supplied to oneOfType, expected an instance of array.');\n });\n }\n\n function validate(props, propName, componentName, location, propFullName) {\n for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n var checker = arrayOfTypeCheckers[i];\n if (checker(props, propName, componentName, location, propFullName) == null) {\n return null;\n }\n }\n\n var locationName = ReactPropTypeLocationNames[location];\n return new Error('Invalid ' + locationName + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`.'));\n }\n return createChainableTypeChecker(validate);\n}\n\nfunction createNodeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n if (!isNode(props[propName])) {\n var locationName = ReactPropTypeLocationNames[location];\n return new Error('Invalid ' + locationName + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n}\n\nfunction createShapeTypeChecker(shapeTypes) {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n var locationName = ReactPropTypeLocationNames[location];\n return new Error('Invalid ' + locationName + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));\n }\n for (var key in shapeTypes) {\n var checker = shapeTypes[key];\n if (!checker) {\n continue;\n }\n var error = checker(propValue, key, componentName, location, propFullName + '.' + key);\n if (error) {\n return error;\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n}\n\nfunction isNode(propValue) {\n switch (typeof propValue) {\n case 'number':\n case 'string':\n case 'undefined':\n return true;\n case 'boolean':\n return !propValue;\n case 'object':\n if (Array.isArray(propValue)) {\n return propValue.every(isNode);\n }\n if (propValue === null || ReactElement.isValidElement(propValue)) {\n return true;\n }\n\n var iteratorFn = getIteratorFn(propValue);\n if (iteratorFn) {\n var iterator = iteratorFn.call(propValue);\n var step;\n if (iteratorFn !== propValue.entries) {\n while (!(step = iterator.next()).done) {\n if (!isNode(step.value)) {\n return false;\n }\n }\n } else {\n // Iterator will provide entry [k,v] tuples rather than values.\n while (!(step = iterator.next()).done) {\n var entry = step.value;\n if (entry) {\n if (!isNode(entry[1])) {\n return false;\n }\n }\n }\n }\n } else {\n return false;\n }\n\n return true;\n default:\n return false;\n }\n}\n\n// Equivalent of `typeof` but with special handling for array and regexp.\nfunction getPropType(propValue) {\n var propType = typeof propValue;\n if (Array.isArray(propValue)) {\n return 'array';\n }\n if (propValue instanceof RegExp) {\n // Old webkits (at least until Android 4.0) return 'function' rather than\n // 'object' for typeof a RegExp. We'll normalize this here so that /bla/\n // passes PropTypes.object.\n return 'object';\n }\n return propType;\n}\n\n// This handles more types than `getPropType`. Only used for error messages.\n// See `createPrimitiveTypeChecker`.\nfunction getPreciseType(propValue) {\n var propType = getPropType(propValue);\n if (propType === 'object') {\n if (propValue instanceof Date) {\n return 'date';\n } else if (propValue instanceof RegExp) {\n return 'regexp';\n }\n }\n return propType;\n}\n\n// Returns class name of the object, if any.\nfunction getClassName(propValue) {\n if (!propValue.constructor || !propValue.constructor.name) {\n return '<<anonymous>>';\n }\n return propValue.constructor.name;\n}\n\nmodule.exports = ReactPropTypes;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactPropTypes.js\n ** module id = 106\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule getIteratorFn\n * @typechecks static-only\n */\n\n'use strict';\n\n/* global Symbol */\nvar ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec.\n\n/**\n * Returns the iterator method function contained on the iterable object.\n *\n * Be sure to invoke the function with the iterable as context:\n *\n * var iteratorFn = getIteratorFn(myIterable);\n * if (iteratorFn) {\n * var iterator = iteratorFn.call(myIterable);\n * ...\n * }\n *\n * @param {?object} maybeIterable\n * @return {?function}\n */\nfunction getIteratorFn(maybeIterable) {\n var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);\n if (typeof iteratorFn === 'function') {\n return iteratorFn;\n }\n}\n\nmodule.exports = getIteratorFn;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/getIteratorFn.js\n ** module id = 107\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactDOMOption\n */\n\n'use strict';\n\nvar ReactChildren = require('./ReactChildren');\nvar ReactDOMSelect = require('./ReactDOMSelect');\n\nvar assign = require('./Object.assign');\nvar warning = require('fbjs/lib/warning');\n\nvar valueContextKey = ReactDOMSelect.valueContextKey;\n\n/**\n * Implements an <option> native component that warns when `selected` is set.\n */\nvar ReactDOMOption = {\n mountWrapper: function (inst, props, context) {\n // TODO (yungsters): Remove support for `selected` in <option>.\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(props.selected == null, 'Use the `defaultValue` or `value` props on <select> instead of ' + 'setting `selected` on <option>.') : undefined;\n }\n\n // Look up whether this option is 'selected' via context\n var selectValue = context[valueContextKey];\n\n // If context key is null (e.g., no specified value or after initial mount)\n // or missing (e.g., for <datalist>), we don't change props.selected\n var selected = null;\n if (selectValue != null) {\n selected = false;\n if (Array.isArray(selectValue)) {\n // multiple\n for (var i = 0; i < selectValue.length; i++) {\n if ('' + selectValue[i] === '' + props.value) {\n selected = true;\n break;\n }\n }\n } else {\n selected = '' + selectValue === '' + props.value;\n }\n }\n\n inst._wrapperState = { selected: selected };\n },\n\n getNativeProps: function (inst, props, context) {\n var nativeProps = assign({ selected: undefined, children: undefined }, props);\n\n // Read state only from initial mount because <select> updates value\n // manually; we need the initial state only for server rendering\n if (inst._wrapperState.selected != null) {\n nativeProps.selected = inst._wrapperState.selected;\n }\n\n var content = '';\n\n // Flatten children and warn if they aren't strings or numbers;\n // invalid types are ignored.\n ReactChildren.forEach(props.children, function (child) {\n if (child == null) {\n return;\n }\n if (typeof child === 'string' || typeof child === 'number') {\n content += child;\n } else {\n process.env.NODE_ENV !== 'production' ? warning(false, 'Only strings and numbers are supported as <option> children.') : undefined;\n }\n });\n\n nativeProps.children = content;\n return nativeProps;\n }\n\n};\n\nmodule.exports = ReactDOMOption;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactDOMOption.js\n ** module id = 108\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactChildren\n */\n\n'use strict';\n\nvar PooledClass = require('./PooledClass');\nvar ReactElement = require('./ReactElement');\n\nvar emptyFunction = require('fbjs/lib/emptyFunction');\nvar traverseAllChildren = require('./traverseAllChildren');\n\nvar twoArgumentPooler = PooledClass.twoArgumentPooler;\nvar fourArgumentPooler = PooledClass.fourArgumentPooler;\n\nvar userProvidedKeyEscapeRegex = /\\/(?!\\/)/g;\nfunction escapeUserProvidedKey(text) {\n return ('' + text).replace(userProvidedKeyEscapeRegex, '//');\n}\n\n/**\n * PooledClass representing the bookkeeping associated with performing a child\n * traversal. Allows avoiding binding callbacks.\n *\n * @constructor ForEachBookKeeping\n * @param {!function} forEachFunction Function to perform traversal with.\n * @param {?*} forEachContext Context to perform context with.\n */\nfunction ForEachBookKeeping(forEachFunction, forEachContext) {\n this.func = forEachFunction;\n this.context = forEachContext;\n this.count = 0;\n}\nForEachBookKeeping.prototype.destructor = function () {\n this.func = null;\n this.context = null;\n this.count = 0;\n};\nPooledClass.addPoolingTo(ForEachBookKeeping, twoArgumentPooler);\n\nfunction forEachSingleChild(bookKeeping, child, name) {\n var func = bookKeeping.func;\n var context = bookKeeping.context;\n\n func.call(context, child, bookKeeping.count++);\n}\n\n/**\n * Iterates through children that are typically specified as `props.children`.\n *\n * The provided forEachFunc(child, index) will be called for each\n * leaf child.\n *\n * @param {?*} children Children tree container.\n * @param {function(*, int)} forEachFunc\n * @param {*} forEachContext Context for forEachContext.\n */\nfunction forEachChildren(children, forEachFunc, forEachContext) {\n if (children == null) {\n return children;\n }\n var traverseContext = ForEachBookKeeping.getPooled(forEachFunc, forEachContext);\n traverseAllChildren(children, forEachSingleChild, traverseContext);\n ForEachBookKeeping.release(traverseContext);\n}\n\n/**\n * PooledClass representing the bookkeeping associated with performing a child\n * mapping. Allows avoiding binding callbacks.\n *\n * @constructor MapBookKeeping\n * @param {!*} mapResult Object containing the ordered map of results.\n * @param {!function} mapFunction Function to perform mapping with.\n * @param {?*} mapContext Context to perform mapping with.\n */\nfunction MapBookKeeping(mapResult, keyPrefix, mapFunction, mapContext) {\n this.result = mapResult;\n this.keyPrefix = keyPrefix;\n this.func = mapFunction;\n this.context = mapContext;\n this.count = 0;\n}\nMapBookKeeping.prototype.destructor = function () {\n this.result = null;\n this.keyPrefix = null;\n this.func = null;\n this.context = null;\n this.count = 0;\n};\nPooledClass.addPoolingTo(MapBookKeeping, fourArgumentPooler);\n\nfunction mapSingleChildIntoContext(bookKeeping, child, childKey) {\n var result = bookKeeping.result;\n var keyPrefix = bookKeeping.keyPrefix;\n var func = bookKeeping.func;\n var context = bookKeeping.context;\n\n var mappedChild = func.call(context, child, bookKeeping.count++);\n if (Array.isArray(mappedChild)) {\n mapIntoWithKeyPrefixInternal(mappedChild, result, childKey, emptyFunction.thatReturnsArgument);\n } else if (mappedChild != null) {\n if (ReactElement.isValidElement(mappedChild)) {\n mappedChild = ReactElement.cloneAndReplaceKey(mappedChild,\n // Keep both the (mapped) and old keys if they differ, just as\n // traverseAllChildren used to do for objects as children\n keyPrefix + (mappedChild !== child ? escapeUserProvidedKey(mappedChild.key || '') + '/' : '') + childKey);\n }\n result.push(mappedChild);\n }\n}\n\nfunction mapIntoWithKeyPrefixInternal(children, array, prefix, func, context) {\n var escapedPrefix = '';\n if (prefix != null) {\n escapedPrefix = escapeUserProvidedKey(prefix) + '/';\n }\n var traverseContext = MapBookKeeping.getPooled(array, escapedPrefix, func, context);\n traverseAllChildren(children, mapSingleChildIntoContext, traverseContext);\n MapBookKeeping.release(traverseContext);\n}\n\n/**\n * Maps children that are typically specified as `props.children`.\n *\n * The provided mapFunction(child, key, index) will be called for each\n * leaf child.\n *\n * @param {?*} children Children tree container.\n * @param {function(*, int)} func The map function.\n * @param {*} context Context for mapFunction.\n * @return {object} Object containing the ordered map of results.\n */\nfunction mapChildren(children, func, context) {\n if (children == null) {\n return children;\n }\n var result = [];\n mapIntoWithKeyPrefixInternal(children, result, null, func, context);\n return result;\n}\n\nfunction forEachSingleChildDummy(traverseContext, child, name) {\n return null;\n}\n\n/**\n * Count the number of children that are typically specified as\n * `props.children`.\n *\n * @param {?*} children Children tree container.\n * @return {number} The number of children.\n */\nfunction countChildren(children, context) {\n return traverseAllChildren(children, forEachSingleChildDummy, null);\n}\n\n/**\n * Flatten a children object (typically specified as `props.children`) and\n * return an array with appropriately re-keyed children.\n */\nfunction toArray(children) {\n var result = [];\n mapIntoWithKeyPrefixInternal(children, result, null, emptyFunction.thatReturnsArgument);\n return result;\n}\n\nvar ReactChildren = {\n forEach: forEachChildren,\n map: mapChildren,\n mapIntoWithKeyPrefixInternal: mapIntoWithKeyPrefixInternal,\n count: countChildren,\n toArray: toArray\n};\n\nmodule.exports = ReactChildren;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactChildren.js\n ** module id = 109\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule traverseAllChildren\n */\n\n'use strict';\n\nvar ReactCurrentOwner = require('./ReactCurrentOwner');\nvar ReactElement = require('./ReactElement');\nvar ReactInstanceHandles = require('./ReactInstanceHandles');\n\nvar getIteratorFn = require('./getIteratorFn');\nvar invariant = require('fbjs/lib/invariant');\nvar warning = require('fbjs/lib/warning');\n\nvar SEPARATOR = ReactInstanceHandles.SEPARATOR;\nvar SUBSEPARATOR = ':';\n\n/**\n * TODO: Test that a single child and an array with one item have the same key\n * pattern.\n */\n\nvar userProvidedKeyEscaperLookup = {\n '=': '=0',\n '.': '=1',\n ':': '=2'\n};\n\nvar userProvidedKeyEscapeRegex = /[=.:]/g;\n\nvar didWarnAboutMaps = false;\n\nfunction userProvidedKeyEscaper(match) {\n return userProvidedKeyEscaperLookup[match];\n}\n\n/**\n * Generate a key string that identifies a component within a set.\n *\n * @param {*} component A component that could contain a manual key.\n * @param {number} index Index that is used if a manual key is not provided.\n * @return {string}\n */\nfunction getComponentKey(component, index) {\n if (component && component.key != null) {\n // Explicit key\n return wrapUserProvidedKey(component.key);\n }\n // Implicit key determined by the index in the set\n return index.toString(36);\n}\n\n/**\n * Escape a component key so that it is safe to use in a reactid.\n *\n * @param {*} text Component key to be escaped.\n * @return {string} An escaped string.\n */\nfunction escapeUserProvidedKey(text) {\n return ('' + text).replace(userProvidedKeyEscapeRegex, userProvidedKeyEscaper);\n}\n\n/**\n * Wrap a `key` value explicitly provided by the user to distinguish it from\n * implicitly-generated keys generated by a component's index in its parent.\n *\n * @param {string} key Value of a user-provided `key` attribute\n * @return {string}\n */\nfunction wrapUserProvidedKey(key) {\n return '$' + escapeUserProvidedKey(key);\n}\n\n/**\n * @param {?*} children Children tree container.\n * @param {!string} nameSoFar Name of the key path so far.\n * @param {!function} callback Callback to invoke with each child found.\n * @param {?*} traverseContext Used to pass information throughout the traversal\n * process.\n * @return {!number} The number of children in this subtree.\n */\nfunction traverseAllChildrenImpl(children, nameSoFar, callback, traverseContext) {\n var type = typeof children;\n\n if (type === 'undefined' || type === 'boolean') {\n // All of the above are perceived as null.\n children = null;\n }\n\n if (children === null || type === 'string' || type === 'number' || ReactElement.isValidElement(children)) {\n callback(traverseContext, children,\n // If it's the only child, treat the name as if it was wrapped in an array\n // so that it's consistent if the number of children grows.\n nameSoFar === '' ? SEPARATOR + getComponentKey(children, 0) : nameSoFar);\n return 1;\n }\n\n var child;\n var nextName;\n var subtreeCount = 0; // Count of children found in the current subtree.\n var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR;\n\n if (Array.isArray(children)) {\n for (var i = 0; i < children.length; i++) {\n child = children[i];\n nextName = nextNamePrefix + getComponentKey(child, i);\n subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);\n }\n } else {\n var iteratorFn = getIteratorFn(children);\n if (iteratorFn) {\n var iterator = iteratorFn.call(children);\n var step;\n if (iteratorFn !== children.entries) {\n var ii = 0;\n while (!(step = iterator.next()).done) {\n child = step.value;\n nextName = nextNamePrefix + getComponentKey(child, ii++);\n subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);\n }\n } else {\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(didWarnAboutMaps, 'Using Maps as children is not yet fully supported. It is an ' + 'experimental feature that might be removed. Convert it to a ' + 'sequence / iterable of keyed ReactElements instead.') : undefined;\n didWarnAboutMaps = true;\n }\n // Iterator will provide entry [k,v] tuples rather than values.\n while (!(step = iterator.next()).done) {\n var entry = step.value;\n if (entry) {\n child = entry[1];\n nextName = nextNamePrefix + wrapUserProvidedKey(entry[0]) + SUBSEPARATOR + getComponentKey(child, 0);\n subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);\n }\n }\n }\n } else if (type === 'object') {\n var addendum = '';\n if (process.env.NODE_ENV !== 'production') {\n addendum = ' If you meant to render a collection of children, use an array ' + 'instead or wrap the object using createFragment(object) from the ' + 'React add-ons.';\n if (children._isReactElement) {\n addendum = ' It looks like you\\'re using an element created by a different ' + 'version of React. Make sure to use only one copy of React.';\n }\n if (ReactCurrentOwner.current) {\n var name = ReactCurrentOwner.current.getName();\n if (name) {\n addendum += ' Check the render method of `' + name + '`.';\n }\n }\n }\n var childrenString = String(children);\n !false ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Objects are not valid as a React child (found: %s).%s', childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString, addendum) : invariant(false) : undefined;\n }\n }\n\n return subtreeCount;\n}\n\n/**\n * Traverses children that are typically specified as `props.children`, but\n * might also be specified through attributes:\n *\n * - `traverseAllChildren(this.props.children, ...)`\n * - `traverseAllChildren(this.props.leftPanelChildren, ...)`\n *\n * The `traverseContext` is an optional argument that is passed through the\n * entire traversal. It can be used to store accumulations or anything else that\n * the callback might find relevant.\n *\n * @param {?*} children Children tree object.\n * @param {!function} callback To invoke upon traversing each child.\n * @param {?*} traverseContext Context for traversal.\n * @return {!number} The number of children in this subtree.\n */\nfunction traverseAllChildren(children, callback, traverseContext) {\n if (children == null) {\n return 0;\n }\n\n return traverseAllChildrenImpl(children, '', callback, traverseContext);\n}\n\nmodule.exports = traverseAllChildren;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/traverseAllChildren.js\n ** module id = 110\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactDOMSelect\n */\n\n'use strict';\n\nvar LinkedValueUtils = require('./LinkedValueUtils');\nvar ReactMount = require('./ReactMount');\nvar ReactUpdates = require('./ReactUpdates');\n\nvar assign = require('./Object.assign');\nvar warning = require('fbjs/lib/warning');\n\nvar valueContextKey = '__ReactDOMSelect_value$' + Math.random().toString(36).slice(2);\n\nfunction updateOptionsIfPendingUpdateAndMounted() {\n if (this._rootNodeID && this._wrapperState.pendingUpdate) {\n this._wrapperState.pendingUpdate = false;\n\n var props = this._currentElement.props;\n var value = LinkedValueUtils.getValue(props);\n\n if (value != null) {\n updateOptions(this, props, value);\n }\n }\n}\n\nfunction getDeclarationErrorAddendum(owner) {\n if (owner) {\n var name = owner.getName();\n if (name) {\n return ' Check the render method of `' + name + '`.';\n }\n }\n return '';\n}\n\nvar valuePropNames = ['value', 'defaultValue'];\n\n/**\n * Validation function for `value` and `defaultValue`.\n * @private\n */\nfunction checkSelectPropTypes(inst, props) {\n var owner = inst._currentElement._owner;\n LinkedValueUtils.checkPropTypes('select', props, owner);\n\n for (var i = 0; i < valuePropNames.length; i++) {\n var propName = valuePropNames[i];\n if (props[propName] == null) {\n continue;\n }\n if (props.multiple) {\n process.env.NODE_ENV !== 'production' ? warning(Array.isArray(props[propName]), 'The `%s` prop supplied to <select> must be an array if ' + '`multiple` is true.%s', propName, getDeclarationErrorAddendum(owner)) : undefined;\n } else {\n process.env.NODE_ENV !== 'production' ? warning(!Array.isArray(props[propName]), 'The `%s` prop supplied to <select> must be a scalar ' + 'value if `multiple` is false.%s', propName, getDeclarationErrorAddendum(owner)) : undefined;\n }\n }\n}\n\n/**\n * @param {ReactDOMComponent} inst\n * @param {boolean} multiple\n * @param {*} propValue A stringable (with `multiple`, a list of stringables).\n * @private\n */\nfunction updateOptions(inst, multiple, propValue) {\n var selectedValue, i;\n var options = ReactMount.getNode(inst._rootNodeID).options;\n\n if (multiple) {\n selectedValue = {};\n for (i = 0; i < propValue.length; i++) {\n selectedValue['' + propValue[i]] = true;\n }\n for (i = 0; i < options.length; i++) {\n var selected = selectedValue.hasOwnProperty(options[i].value);\n if (options[i].selected !== selected) {\n options[i].selected = selected;\n }\n }\n } else {\n // Do not set `select.value` as exact behavior isn't consistent across all\n // browsers for all cases.\n selectedValue = '' + propValue;\n for (i = 0; i < options.length; i++) {\n if (options[i].value === selectedValue) {\n options[i].selected = true;\n return;\n }\n }\n if (options.length) {\n options[0].selected = true;\n }\n }\n}\n\n/**\n * Implements a <select> native component that allows optionally setting the\n * props `value` and `defaultValue`. If `multiple` is false, the prop must be a\n * stringable. If `multiple` is true, the prop must be an array of stringables.\n *\n * If `value` is not supplied (or null/undefined), user actions that change the\n * selected option will trigger updates to the rendered options.\n *\n * If it is supplied (and not null/undefined), the rendered options will not\n * update in response to user actions. Instead, the `value` prop must change in\n * order for the rendered options to update.\n *\n * If `defaultValue` is provided, any options with the supplied values will be\n * selected.\n */\nvar ReactDOMSelect = {\n valueContextKey: valueContextKey,\n\n getNativeProps: function (inst, props, context) {\n return assign({}, props, {\n onChange: inst._wrapperState.onChange,\n value: undefined\n });\n },\n\n mountWrapper: function (inst, props) {\n if (process.env.NODE_ENV !== 'production') {\n checkSelectPropTypes(inst, props);\n }\n\n var value = LinkedValueUtils.getValue(props);\n inst._wrapperState = {\n pendingUpdate: false,\n initialValue: value != null ? value : props.defaultValue,\n onChange: _handleChange.bind(inst),\n wasMultiple: Boolean(props.multiple)\n };\n },\n\n processChildContext: function (inst, props, context) {\n // Pass down initial value so initial generated markup has correct\n // `selected` attributes\n var childContext = assign({}, context);\n childContext[valueContextKey] = inst._wrapperState.initialValue;\n return childContext;\n },\n\n postUpdateWrapper: function (inst) {\n var props = inst._currentElement.props;\n\n // After the initial mount, we control selected-ness manually so don't pass\n // the context value down\n inst._wrapperState.initialValue = undefined;\n\n var wasMultiple = inst._wrapperState.wasMultiple;\n inst._wrapperState.wasMultiple = Boolean(props.multiple);\n\n var value = LinkedValueUtils.getValue(props);\n if (value != null) {\n inst._wrapperState.pendingUpdate = false;\n updateOptions(inst, Boolean(props.multiple), value);\n } else if (wasMultiple !== Boolean(props.multiple)) {\n // For simplicity, reapply `defaultValue` if `multiple` is toggled.\n if (props.defaultValue != null) {\n updateOptions(inst, Boolean(props.multiple), props.defaultValue);\n } else {\n // Revert the select back to its default unselected state.\n updateOptions(inst, Boolean(props.multiple), props.multiple ? [] : '');\n }\n }\n }\n};\n\nfunction _handleChange(event) {\n var props = this._currentElement.props;\n var returnValue = LinkedValueUtils.executeOnChange(props, event);\n\n this._wrapperState.pendingUpdate = true;\n ReactUpdates.asap(updateOptionsIfPendingUpdateAndMounted, this);\n return returnValue;\n}\n\nmodule.exports = ReactDOMSelect;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactDOMSelect.js\n ** module id = 111\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactDOMTextarea\n */\n\n'use strict';\n\nvar LinkedValueUtils = require('./LinkedValueUtils');\nvar ReactDOMIDOperations = require('./ReactDOMIDOperations');\nvar ReactUpdates = require('./ReactUpdates');\n\nvar assign = require('./Object.assign');\nvar invariant = require('fbjs/lib/invariant');\nvar warning = require('fbjs/lib/warning');\n\nfunction forceUpdateIfMounted() {\n if (this._rootNodeID) {\n // DOM component is still mounted; update\n ReactDOMTextarea.updateWrapper(this);\n }\n}\n\n/**\n * Implements a <textarea> native component that allows setting `value`, and\n * `defaultValue`. This differs from the traditional DOM API because value is\n * usually set as PCDATA children.\n *\n * If `value` is not supplied (or null/undefined), user actions that affect the\n * value will trigger updates to the element.\n *\n * If `value` is supplied (and not null/undefined), the rendered element will\n * not trigger updates to the element. Instead, the `value` prop must change in\n * order for the rendered element to be updated.\n *\n * The rendered element will be initialized with an empty value, the prop\n * `defaultValue` if specified, or the children content (deprecated).\n */\nvar ReactDOMTextarea = {\n getNativeProps: function (inst, props, context) {\n !(props.dangerouslySetInnerHTML == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, '`dangerouslySetInnerHTML` does not make sense on <textarea>.') : invariant(false) : undefined;\n\n // Always set children to the same thing. In IE9, the selection range will\n // get reset if `textContent` is mutated.\n var nativeProps = assign({}, props, {\n defaultValue: undefined,\n value: undefined,\n children: inst._wrapperState.initialValue,\n onChange: inst._wrapperState.onChange\n });\n\n return nativeProps;\n },\n\n mountWrapper: function (inst, props) {\n if (process.env.NODE_ENV !== 'production') {\n LinkedValueUtils.checkPropTypes('textarea', props, inst._currentElement._owner);\n }\n\n var defaultValue = props.defaultValue;\n // TODO (yungsters): Remove support for children content in <textarea>.\n var children = props.children;\n if (children != null) {\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(false, 'Use the `defaultValue` or `value` props instead of setting ' + 'children on <textarea>.') : undefined;\n }\n !(defaultValue == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'If you supply `defaultValue` on a <textarea>, do not pass children.') : invariant(false) : undefined;\n if (Array.isArray(children)) {\n !(children.length <= 1) ? process.env.NODE_ENV !== 'production' ? invariant(false, '<textarea> can only have at most one child.') : invariant(false) : undefined;\n children = children[0];\n }\n\n defaultValue = '' + children;\n }\n if (defaultValue == null) {\n defaultValue = '';\n }\n var value = LinkedValueUtils.getValue(props);\n\n inst._wrapperState = {\n // We save the initial value so that `ReactDOMComponent` doesn't update\n // `textContent` (unnecessary since we update value).\n // The initial value can be a boolean or object so that's why it's\n // forced to be a string.\n initialValue: '' + (value != null ? value : defaultValue),\n onChange: _handleChange.bind(inst)\n };\n },\n\n updateWrapper: function (inst) {\n var props = inst._currentElement.props;\n var value = LinkedValueUtils.getValue(props);\n if (value != null) {\n // Cast `value` to a string to ensure the value is set correctly. While\n // browsers typically do this as necessary, jsdom doesn't.\n ReactDOMIDOperations.updatePropertyByID(inst._rootNodeID, 'value', '' + value);\n }\n }\n};\n\nfunction _handleChange(event) {\n var props = this._currentElement.props;\n var returnValue = LinkedValueUtils.executeOnChange(props, event);\n ReactUpdates.asap(forceUpdateIfMounted, this);\n return returnValue;\n}\n\nmodule.exports = ReactDOMTextarea;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactDOMTextarea.js\n ** module id = 112\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactMultiChild\n * @typechecks static-only\n */\n\n'use strict';\n\nvar ReactComponentEnvironment = require('./ReactComponentEnvironment');\nvar ReactMultiChildUpdateTypes = require('./ReactMultiChildUpdateTypes');\n\nvar ReactCurrentOwner = require('./ReactCurrentOwner');\nvar ReactReconciler = require('./ReactReconciler');\nvar ReactChildReconciler = require('./ReactChildReconciler');\n\nvar flattenChildren = require('./flattenChildren');\n\n/**\n * Updating children of a component may trigger recursive updates. The depth is\n * used to batch recursive updates to render markup more efficiently.\n *\n * @type {number}\n * @private\n */\nvar updateDepth = 0;\n\n/**\n * Queue of update configuration objects.\n *\n * Each object has a `type` property that is in `ReactMultiChildUpdateTypes`.\n *\n * @type {array<object>}\n * @private\n */\nvar updateQueue = [];\n\n/**\n * Queue of markup to be rendered.\n *\n * @type {array<string>}\n * @private\n */\nvar markupQueue = [];\n\n/**\n * Enqueues markup to be rendered and inserted at a supplied index.\n *\n * @param {string} parentID ID of the parent component.\n * @param {string} markup Markup that renders into an element.\n * @param {number} toIndex Destination index.\n * @private\n */\nfunction enqueueInsertMarkup(parentID, markup, toIndex) {\n // NOTE: Null values reduce hidden classes.\n updateQueue.push({\n parentID: parentID,\n parentNode: null,\n type: ReactMultiChildUpdateTypes.INSERT_MARKUP,\n markupIndex: markupQueue.push(markup) - 1,\n content: null,\n fromIndex: null,\n toIndex: toIndex\n });\n}\n\n/**\n * Enqueues moving an existing element to another index.\n *\n * @param {string} parentID ID of the parent component.\n * @param {number} fromIndex Source index of the existing element.\n * @param {number} toIndex Destination index of the element.\n * @private\n */\nfunction enqueueMove(parentID, fromIndex, toIndex) {\n // NOTE: Null values reduce hidden classes.\n updateQueue.push({\n parentID: parentID,\n parentNode: null,\n type: ReactMultiChildUpdateTypes.MOVE_EXISTING,\n markupIndex: null,\n content: null,\n fromIndex: fromIndex,\n toIndex: toIndex\n });\n}\n\n/**\n * Enqueues removing an element at an index.\n *\n * @param {string} parentID ID of the parent component.\n * @param {number} fromIndex Index of the element to remove.\n * @private\n */\nfunction enqueueRemove(parentID, fromIndex) {\n // NOTE: Null values reduce hidden classes.\n updateQueue.push({\n parentID: parentID,\n parentNode: null,\n type: ReactMultiChildUpdateTypes.REMOVE_NODE,\n markupIndex: null,\n content: null,\n fromIndex: fromIndex,\n toIndex: null\n });\n}\n\n/**\n * Enqueues setting the markup of a node.\n *\n * @param {string} parentID ID of the parent component.\n * @param {string} markup Markup that renders into an element.\n * @private\n */\nfunction enqueueSetMarkup(parentID, markup) {\n // NOTE: Null values reduce hidden classes.\n updateQueue.push({\n parentID: parentID,\n parentNode: null,\n type: ReactMultiChildUpdateTypes.SET_MARKUP,\n markupIndex: null,\n content: markup,\n fromIndex: null,\n toIndex: null\n });\n}\n\n/**\n * Enqueues setting the text content.\n *\n * @param {string} parentID ID of the parent component.\n * @param {string} textContent Text content to set.\n * @private\n */\nfunction enqueueTextContent(parentID, textContent) {\n // NOTE: Null values reduce hidden classes.\n updateQueue.push({\n parentID: parentID,\n parentNode: null,\n type: ReactMultiChildUpdateTypes.TEXT_CONTENT,\n markupIndex: null,\n content: textContent,\n fromIndex: null,\n toIndex: null\n });\n}\n\n/**\n * Processes any enqueued updates.\n *\n * @private\n */\nfunction processQueue() {\n if (updateQueue.length) {\n ReactComponentEnvironment.processChildrenUpdates(updateQueue, markupQueue);\n clearQueue();\n }\n}\n\n/**\n * Clears any enqueued updates.\n *\n * @private\n */\nfunction clearQueue() {\n updateQueue.length = 0;\n markupQueue.length = 0;\n}\n\n/**\n * ReactMultiChild are capable of reconciling multiple children.\n *\n * @class ReactMultiChild\n * @internal\n */\nvar ReactMultiChild = {\n\n /**\n * Provides common functionality for components that must reconcile multiple\n * children. This is used by `ReactDOMComponent` to mount, update, and\n * unmount child components.\n *\n * @lends {ReactMultiChild.prototype}\n */\n Mixin: {\n\n _reconcilerInstantiateChildren: function (nestedChildren, transaction, context) {\n if (process.env.NODE_ENV !== 'production') {\n if (this._currentElement) {\n try {\n ReactCurrentOwner.current = this._currentElement._owner;\n return ReactChildReconciler.instantiateChildren(nestedChildren, transaction, context);\n } finally {\n ReactCurrentOwner.current = null;\n }\n }\n }\n return ReactChildReconciler.instantiateChildren(nestedChildren, transaction, context);\n },\n\n _reconcilerUpdateChildren: function (prevChildren, nextNestedChildrenElements, transaction, context) {\n var nextChildren;\n if (process.env.NODE_ENV !== 'production') {\n if (this._currentElement) {\n try {\n ReactCurrentOwner.current = this._currentElement._owner;\n nextChildren = flattenChildren(nextNestedChildrenElements);\n } finally {\n ReactCurrentOwner.current = null;\n }\n return ReactChildReconciler.updateChildren(prevChildren, nextChildren, transaction, context);\n }\n }\n nextChildren = flattenChildren(nextNestedChildrenElements);\n return ReactChildReconciler.updateChildren(prevChildren, nextChildren, transaction, context);\n },\n\n /**\n * Generates a \"mount image\" for each of the supplied children. In the case\n * of `ReactDOMComponent`, a mount image is a string of markup.\n *\n * @param {?object} nestedChildren Nested child maps.\n * @return {array} An array of mounted representations.\n * @internal\n */\n mountChildren: function (nestedChildren, transaction, context) {\n var children = this._reconcilerInstantiateChildren(nestedChildren, transaction, context);\n this._renderedChildren = children;\n var mountImages = [];\n var index = 0;\n for (var name in children) {\n if (children.hasOwnProperty(name)) {\n var child = children[name];\n // Inlined for performance, see `ReactInstanceHandles.createReactID`.\n var rootID = this._rootNodeID + name;\n var mountImage = ReactReconciler.mountComponent(child, rootID, transaction, context);\n child._mountIndex = index++;\n mountImages.push(mountImage);\n }\n }\n return mountImages;\n },\n\n /**\n * Replaces any rendered children with a text content string.\n *\n * @param {string} nextContent String of content.\n * @internal\n */\n updateTextContent: function (nextContent) {\n updateDepth++;\n var errorThrown = true;\n try {\n var prevChildren = this._renderedChildren;\n // Remove any rendered children.\n ReactChildReconciler.unmountChildren(prevChildren);\n // TODO: The setTextContent operation should be enough\n for (var name in prevChildren) {\n if (prevChildren.hasOwnProperty(name)) {\n this._unmountChild(prevChildren[name]);\n }\n }\n // Set new text content.\n this.setTextContent(nextContent);\n errorThrown = false;\n } finally {\n updateDepth--;\n if (!updateDepth) {\n if (errorThrown) {\n clearQueue();\n } else {\n processQueue();\n }\n }\n }\n },\n\n /**\n * Replaces any rendered children with a markup string.\n *\n * @param {string} nextMarkup String of markup.\n * @internal\n */\n updateMarkup: function (nextMarkup) {\n updateDepth++;\n var errorThrown = true;\n try {\n var prevChildren = this._renderedChildren;\n // Remove any rendered children.\n ReactChildReconciler.unmountChildren(prevChildren);\n for (var name in prevChildren) {\n if (prevChildren.hasOwnProperty(name)) {\n this._unmountChildByName(prevChildren[name], name);\n }\n }\n this.setMarkup(nextMarkup);\n errorThrown = false;\n } finally {\n updateDepth--;\n if (!updateDepth) {\n if (errorThrown) {\n clearQueue();\n } else {\n processQueue();\n }\n }\n }\n },\n\n /**\n * Updates the rendered children with new children.\n *\n * @param {?object} nextNestedChildrenElements Nested child element maps.\n * @param {ReactReconcileTransaction} transaction\n * @internal\n */\n updateChildren: function (nextNestedChildrenElements, transaction, context) {\n updateDepth++;\n var errorThrown = true;\n try {\n this._updateChildren(nextNestedChildrenElements, transaction, context);\n errorThrown = false;\n } finally {\n updateDepth--;\n if (!updateDepth) {\n if (errorThrown) {\n clearQueue();\n } else {\n processQueue();\n }\n }\n }\n },\n\n /**\n * Improve performance by isolating this hot code path from the try/catch\n * block in `updateChildren`.\n *\n * @param {?object} nextNestedChildrenElements Nested child element maps.\n * @param {ReactReconcileTransaction} transaction\n * @final\n * @protected\n */\n _updateChildren: function (nextNestedChildrenElements, transaction, context) {\n var prevChildren = this._renderedChildren;\n var nextChildren = this._reconcilerUpdateChildren(prevChildren, nextNestedChildrenElements, transaction, context);\n this._renderedChildren = nextChildren;\n if (!nextChildren && !prevChildren) {\n return;\n }\n var name;\n // `nextIndex` will increment for each child in `nextChildren`, but\n // `lastIndex` will be the last index visited in `prevChildren`.\n var lastIndex = 0;\n var nextIndex = 0;\n for (name in nextChildren) {\n if (!nextChildren.hasOwnProperty(name)) {\n continue;\n }\n var prevChild = prevChildren && prevChildren[name];\n var nextChild = nextChildren[name];\n if (prevChild === nextChild) {\n this.moveChild(prevChild, nextIndex, lastIndex);\n lastIndex = Math.max(prevChild._mountIndex, lastIndex);\n prevChild._mountIndex = nextIndex;\n } else {\n if (prevChild) {\n // Update `lastIndex` before `_mountIndex` gets unset by unmounting.\n lastIndex = Math.max(prevChild._mountIndex, lastIndex);\n this._unmountChild(prevChild);\n }\n // The child must be instantiated before it's mounted.\n this._mountChildByNameAtIndex(nextChild, name, nextIndex, transaction, context);\n }\n nextIndex++;\n }\n // Remove children that are no longer present.\n for (name in prevChildren) {\n if (prevChildren.hasOwnProperty(name) && !(nextChildren && nextChildren.hasOwnProperty(name))) {\n this._unmountChild(prevChildren[name]);\n }\n }\n },\n\n /**\n * Unmounts all rendered children. This should be used to clean up children\n * when this component is unmounted.\n *\n * @internal\n */\n unmountChildren: function () {\n var renderedChildren = this._renderedChildren;\n ReactChildReconciler.unmountChildren(renderedChildren);\n this._renderedChildren = null;\n },\n\n /**\n * Moves a child component to the supplied index.\n *\n * @param {ReactComponent} child Component to move.\n * @param {number} toIndex Destination index of the element.\n * @param {number} lastIndex Last index visited of the siblings of `child`.\n * @protected\n */\n moveChild: function (child, toIndex, lastIndex) {\n // If the index of `child` is less than `lastIndex`, then it needs to\n // be moved. Otherwise, we do not need to move it because a child will be\n // inserted or moved before `child`.\n if (child._mountIndex < lastIndex) {\n enqueueMove(this._rootNodeID, child._mountIndex, toIndex);\n }\n },\n\n /**\n * Creates a child component.\n *\n * @param {ReactComponent} child Component to create.\n * @param {string} mountImage Markup to insert.\n * @protected\n */\n createChild: function (child, mountImage) {\n enqueueInsertMarkup(this._rootNodeID, mountImage, child._mountIndex);\n },\n\n /**\n * Removes a child component.\n *\n * @param {ReactComponent} child Child to remove.\n * @protected\n */\n removeChild: function (child) {\n enqueueRemove(this._rootNodeID, child._mountIndex);\n },\n\n /**\n * Sets this text content string.\n *\n * @param {string} textContent Text content to set.\n * @protected\n */\n setTextContent: function (textContent) {\n enqueueTextContent(this._rootNodeID, textContent);\n },\n\n /**\n * Sets this markup string.\n *\n * @param {string} markup Markup to set.\n * @protected\n */\n setMarkup: function (markup) {\n enqueueSetMarkup(this._rootNodeID, markup);\n },\n\n /**\n * Mounts a child with the supplied name.\n *\n * NOTE: This is part of `updateChildren` and is here for readability.\n *\n * @param {ReactComponent} child Component to mount.\n * @param {string} name Name of the child.\n * @param {number} index Index at which to insert the child.\n * @param {ReactReconcileTransaction} transaction\n * @private\n */\n _mountChildByNameAtIndex: function (child, name, index, transaction, context) {\n // Inlined for performance, see `ReactInstanceHandles.createReactID`.\n var rootID = this._rootNodeID + name;\n var mountImage = ReactReconciler.mountComponent(child, rootID, transaction, context);\n child._mountIndex = index;\n this.createChild(child, mountImage);\n },\n\n /**\n * Unmounts a rendered child.\n *\n * NOTE: This is part of `updateChildren` and is here for readability.\n *\n * @param {ReactComponent} child Component to unmount.\n * @private\n */\n _unmountChild: function (child) {\n this.removeChild(child);\n child._mountIndex = null;\n }\n\n }\n\n};\n\nmodule.exports = ReactMultiChild;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactMultiChild.js\n ** module id = 113\n ** module chunks = 0 1\n **/","/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactChildReconciler\n * @typechecks static-only\n */\n\n'use strict';\n\nvar ReactReconciler = require('./ReactReconciler');\n\nvar instantiateReactComponent = require('./instantiateReactComponent');\nvar shouldUpdateReactComponent = require('./shouldUpdateReactComponent');\nvar traverseAllChildren = require('./traverseAllChildren');\nvar warning = require('fbjs/lib/warning');\n\nfunction instantiateChild(childInstances, child, name) {\n // We found a component instance.\n var keyUnique = childInstances[name] === undefined;\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(keyUnique, 'flattenChildren(...): Encountered two children with the same key, ' + '`%s`. Child keys must be unique; when two children share a key, only ' + 'the first child will be used.', name) : undefined;\n }\n if (child != null && keyUnique) {\n childInstances[name] = instantiateReactComponent(child, null);\n }\n}\n\n/**\n * ReactChildReconciler provides helpers for initializing or updating a set of\n * children. Its output is suitable for passing it onto ReactMultiChild which\n * does diffed reordering and insertion.\n */\nvar ReactChildReconciler = {\n /**\n * Generates a \"mount image\" for each of the supplied children. In the case\n * of `ReactDOMComponent`, a mount image is a string of markup.\n *\n * @param {?object} nestedChildNodes Nested child maps.\n * @return {?object} A set of child instances.\n * @internal\n */\n instantiateChildren: function (nestedChildNodes, transaction, context) {\n if (nestedChildNodes == null) {\n return null;\n }\n var childInstances = {};\n traverseAllChildren(nestedChildNodes, instantiateChild, childInstances);\n return childInstances;\n },\n\n /**\n * Updates the rendered children and returns a new set of children.\n *\n * @param {?object} prevChildren Previously initialized set of children.\n * @param {?object} nextChildren Flat child element maps.\n * @param {ReactReconcileTransaction} transaction\n * @param {object} context\n * @return {?object} A new set of child instances.\n * @internal\n */\n updateChildren: function (prevChildren, nextChildren, transaction, context) {\n // We currently don't have a way to track moves here but if we use iterators\n // instead of for..in we can zip the iterators and check if an item has\n // moved.\n // TODO: If nothing has changed, return the prevChildren object so that we\n // can quickly bailout if nothing has changed.\n if (!nextChildren && !prevChildren) {\n return null;\n }\n var name;\n for (name in nextChildren) {\n if (!nextChildren.hasOwnProperty(name)) {\n continue;\n }\n var prevChild = prevChildren && prevChildren[name];\n var prevElement = prevChild && prevChild._currentElement;\n var nextElement = nextChildren[name];\n if (prevChild != null && shouldUpdateReactComponent(prevElement, nextElement)) {\n ReactReconciler.receiveComponent(prevChild, nextElement, transaction, context);\n nextChildren[name] = prevChild;\n } else {\n if (prevChild) {\n ReactReconciler.unmountComponent(prevChild, name);\n }\n // The child must be instantiated before it's mounted.\n var nextChildInstance = instantiateReactComponent(nextElement, null);\n nextChildren[name] = nextChildInstance;\n }\n }\n // Unmount children that are no longer present.\n for (name in prevChildren) {\n if (prevChildren.hasOwnProperty(name) && !(nextChildren && nextChildren.hasOwnProperty(name))) {\n ReactReconciler.unmountComponent(prevChildren[name]);\n }\n }\n return nextChildren;\n },\n\n /**\n * Unmounts all rendered children. This should be used to clean up children\n * when this component is unmounted.\n *\n * @param {?object} renderedChildren Previously initialized set of children.\n * @internal\n */\n unmountChildren: function (renderedChildren) {\n for (var name in renderedChildren) {\n if (renderedChildren.hasOwnProperty(name)) {\n var renderedChild = renderedChildren[name];\n ReactReconciler.unmountComponent(renderedChild);\n }\n }\n }\n\n};\n\nmodule.exports = ReactChildReconciler;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactChildReconciler.js\n ** module id = 114\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule flattenChildren\n */\n\n'use strict';\n\nvar traverseAllChildren = require('./traverseAllChildren');\nvar warning = require('fbjs/lib/warning');\n\n/**\n * @param {function} traverseContext Context passed through traversal.\n * @param {?ReactComponent} child React child component.\n * @param {!string} name String name of key path to child.\n */\nfunction flattenSingleChildIntoContext(traverseContext, child, name) {\n // We found a component instance.\n var result = traverseContext;\n var keyUnique = result[name] === undefined;\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(keyUnique, 'flattenChildren(...): Encountered two children with the same key, ' + '`%s`. Child keys must be unique; when two children share a key, only ' + 'the first child will be used.', name) : undefined;\n }\n if (keyUnique && child != null) {\n result[name] = child;\n }\n}\n\n/**\n * Flattens children that are typically specified as `props.children`. Any null\n * children will not be included in the resulting object.\n * @return {!object} flattened children keyed by name.\n */\nfunction flattenChildren(children) {\n if (children == null) {\n return children;\n }\n var result = {};\n traverseAllChildren(children, flattenSingleChildIntoContext, result);\n return result;\n}\n\nmodule.exports = flattenChildren;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/flattenChildren.js\n ** module id = 115\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule shallowEqual\n * @typechecks\n * \n */\n\n'use strict';\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\n/**\n * Performs equality by iterating through keys on an object and returning false\n * when any key has values which are not strictly equal between the arguments.\n * Returns true when the values of all keys are strictly equal.\n */\nfunction shallowEqual(objA, objB) {\n if (objA === objB) {\n return true;\n }\n\n if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {\n return false;\n }\n\n var keysA = Object.keys(objA);\n var keysB = Object.keys(objB);\n\n if (keysA.length !== keysB.length) {\n return false;\n }\n\n // Test for A's keys different from B.\n var bHasOwnProperty = hasOwnProperty.bind(objB);\n for (var i = 0; i < keysA.length; i++) {\n if (!bHasOwnProperty(keysA[i]) || objA[keysA[i]] !== objB[keysA[i]]) {\n return false;\n }\n }\n\n return true;\n}\n\nmodule.exports = shallowEqual;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/shallowEqual.js\n ** module id = 116\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactEventListener\n * @typechecks static-only\n */\n\n'use strict';\n\nvar EventListener = require('fbjs/lib/EventListener');\nvar ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');\nvar PooledClass = require('./PooledClass');\nvar ReactInstanceHandles = require('./ReactInstanceHandles');\nvar ReactMount = require('./ReactMount');\nvar ReactUpdates = require('./ReactUpdates');\n\nvar assign = require('./Object.assign');\nvar getEventTarget = require('./getEventTarget');\nvar getUnboundedScrollPosition = require('fbjs/lib/getUnboundedScrollPosition');\n\nvar DOCUMENT_FRAGMENT_NODE_TYPE = 11;\n\n/**\n * Finds the parent React component of `node`.\n *\n * @param {*} node\n * @return {?DOMEventTarget} Parent container, or `null` if the specified node\n * is not nested.\n */\nfunction findParent(node) {\n // TODO: It may be a good idea to cache this to prevent unnecessary DOM\n // traversal, but caching is difficult to do correctly without using a\n // mutation observer to listen for all DOM changes.\n var nodeID = ReactMount.getID(node);\n var rootID = ReactInstanceHandles.getReactRootIDFromNodeID(nodeID);\n var container = ReactMount.findReactContainerForID(rootID);\n var parent = ReactMount.getFirstReactDOM(container);\n return parent;\n}\n\n// Used to store ancestor hierarchy in top level callback\nfunction TopLevelCallbackBookKeeping(topLevelType, nativeEvent) {\n this.topLevelType = topLevelType;\n this.nativeEvent = nativeEvent;\n this.ancestors = [];\n}\nassign(TopLevelCallbackBookKeeping.prototype, {\n destructor: function () {\n this.topLevelType = null;\n this.nativeEvent = null;\n this.ancestors.length = 0;\n }\n});\nPooledClass.addPoolingTo(TopLevelCallbackBookKeeping, PooledClass.twoArgumentPooler);\n\nfunction handleTopLevelImpl(bookKeeping) {\n // TODO: Re-enable event.path handling\n //\n // if (bookKeeping.nativeEvent.path && bookKeeping.nativeEvent.path.length > 1) {\n // // New browsers have a path attribute on native events\n // handleTopLevelWithPath(bookKeeping);\n // } else {\n // // Legacy browsers don't have a path attribute on native events\n // handleTopLevelWithoutPath(bookKeeping);\n // }\n\n void handleTopLevelWithPath; // temporarily unused\n handleTopLevelWithoutPath(bookKeeping);\n}\n\n// Legacy browsers don't have a path attribute on native events\nfunction handleTopLevelWithoutPath(bookKeeping) {\n var topLevelTarget = ReactMount.getFirstReactDOM(getEventTarget(bookKeeping.nativeEvent)) || window;\n\n // Loop through the hierarchy, in case there's any nested components.\n // It's important that we build the array of ancestors before calling any\n // event handlers, because event handlers can modify the DOM, leading to\n // inconsistencies with ReactMount's node cache. See #1105.\n var ancestor = topLevelTarget;\n while (ancestor) {\n bookKeeping.ancestors.push(ancestor);\n ancestor = findParent(ancestor);\n }\n\n for (var i = 0; i < bookKeeping.ancestors.length; i++) {\n topLevelTarget = bookKeeping.ancestors[i];\n var topLevelTargetID = ReactMount.getID(topLevelTarget) || '';\n ReactEventListener._handleTopLevel(bookKeeping.topLevelType, topLevelTarget, topLevelTargetID, bookKeeping.nativeEvent, getEventTarget(bookKeeping.nativeEvent));\n }\n}\n\n// New browsers have a path attribute on native events\nfunction handleTopLevelWithPath(bookKeeping) {\n var path = bookKeeping.nativeEvent.path;\n var currentNativeTarget = path[0];\n var eventsFired = 0;\n for (var i = 0; i < path.length; i++) {\n var currentPathElement = path[i];\n if (currentPathElement.nodeType === DOCUMENT_FRAGMENT_NODE_TYPE) {\n currentNativeTarget = path[i + 1];\n }\n // TODO: slow\n var reactParent = ReactMount.getFirstReactDOM(currentPathElement);\n if (reactParent === currentPathElement) {\n var currentPathElementID = ReactMount.getID(currentPathElement);\n var newRootID = ReactInstanceHandles.getReactRootIDFromNodeID(currentPathElementID);\n bookKeeping.ancestors.push(currentPathElement);\n\n var topLevelTargetID = ReactMount.getID(currentPathElement) || '';\n eventsFired++;\n ReactEventListener._handleTopLevel(bookKeeping.topLevelType, currentPathElement, topLevelTargetID, bookKeeping.nativeEvent, currentNativeTarget);\n\n // Jump to the root of this React render tree\n while (currentPathElementID !== newRootID) {\n i++;\n currentPathElement = path[i];\n currentPathElementID = ReactMount.getID(currentPathElement);\n }\n }\n }\n if (eventsFired === 0) {\n ReactEventListener._handleTopLevel(bookKeeping.topLevelType, window, '', bookKeeping.nativeEvent, getEventTarget(bookKeeping.nativeEvent));\n }\n}\n\nfunction scrollValueMonitor(cb) {\n var scrollPosition = getUnboundedScrollPosition(window);\n cb(scrollPosition);\n}\n\nvar ReactEventListener = {\n _enabled: true,\n _handleTopLevel: null,\n\n WINDOW_HANDLE: ExecutionEnvironment.canUseDOM ? window : null,\n\n setHandleTopLevel: function (handleTopLevel) {\n ReactEventListener._handleTopLevel = handleTopLevel;\n },\n\n setEnabled: function (enabled) {\n ReactEventListener._enabled = !!enabled;\n },\n\n isEnabled: function () {\n return ReactEventListener._enabled;\n },\n\n /**\n * Traps top-level events by using event bubbling.\n *\n * @param {string} topLevelType Record from `EventConstants`.\n * @param {string} handlerBaseName Event name (e.g. \"click\").\n * @param {object} handle Element on which to attach listener.\n * @return {?object} An object with a remove function which will forcefully\n * remove the listener.\n * @internal\n */\n trapBubbledEvent: function (topLevelType, handlerBaseName, handle) {\n var element = handle;\n if (!element) {\n return null;\n }\n return EventListener.listen(element, handlerBaseName, ReactEventListener.dispatchEvent.bind(null, topLevelType));\n },\n\n /**\n * Traps a top-level event by using event capturing.\n *\n * @param {string} topLevelType Record from `EventConstants`.\n * @param {string} handlerBaseName Event name (e.g. \"click\").\n * @param {object} handle Element on which to attach listener.\n * @return {?object} An object with a remove function which will forcefully\n * remove the listener.\n * @internal\n */\n trapCapturedEvent: function (topLevelType, handlerBaseName, handle) {\n var element = handle;\n if (!element) {\n return null;\n }\n return EventListener.capture(element, handlerBaseName, ReactEventListener.dispatchEvent.bind(null, topLevelType));\n },\n\n monitorScrollValue: function (refresh) {\n var callback = scrollValueMonitor.bind(null, refresh);\n EventListener.listen(window, 'scroll', callback);\n },\n\n dispatchEvent: function (topLevelType, nativeEvent) {\n if (!ReactEventListener._enabled) {\n return;\n }\n\n var bookKeeping = TopLevelCallbackBookKeeping.getPooled(topLevelType, nativeEvent);\n try {\n // Event queue being processed in the same cycle allows\n // `preventDefault`.\n ReactUpdates.batchedUpdates(handleTopLevelImpl, bookKeeping);\n } finally {\n TopLevelCallbackBookKeeping.release(bookKeeping);\n }\n }\n};\n\nmodule.exports = ReactEventListener;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactEventListener.js\n ** module id = 117\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule EventListener\n * @typechecks\n */\n\n'use strict';\n\nvar emptyFunction = require('./emptyFunction');\n\n/**\n * Upstream version of event listener. Does not take into account specific\n * nature of platform.\n */\nvar EventListener = {\n /**\n * Listen to DOM events during the bubble phase.\n *\n * @param {DOMEventTarget} target DOM element to register listener on.\n * @param {string} eventType Event type, e.g. 'click' or 'mouseover'.\n * @param {function} callback Callback function.\n * @return {object} Object with a `remove` method.\n */\n listen: function (target, eventType, callback) {\n if (target.addEventListener) {\n target.addEventListener(eventType, callback, false);\n return {\n remove: function () {\n target.removeEventListener(eventType, callback, false);\n }\n };\n } else if (target.attachEvent) {\n target.attachEvent('on' + eventType, callback);\n return {\n remove: function () {\n target.detachEvent('on' + eventType, callback);\n }\n };\n }\n },\n\n /**\n * Listen to DOM events during the capture phase.\n *\n * @param {DOMEventTarget} target DOM element to register listener on.\n * @param {string} eventType Event type, e.g. 'click' or 'mouseover'.\n * @param {function} callback Callback function.\n * @return {object} Object with a `remove` method.\n */\n capture: function (target, eventType, callback) {\n if (target.addEventListener) {\n target.addEventListener(eventType, callback, true);\n return {\n remove: function () {\n target.removeEventListener(eventType, callback, true);\n }\n };\n } else {\n if (process.env.NODE_ENV !== 'production') {\n console.error('Attempted to listen to events during the capture phase on a ' + 'browser that does not support the capture phase. Your application ' + 'will not receive some events.');\n }\n return {\n remove: emptyFunction\n };\n }\n },\n\n registerDefault: function () {}\n};\n\nmodule.exports = EventListener;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/EventListener.js\n ** module id = 118\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule getUnboundedScrollPosition\n * @typechecks\n */\n\n'use strict';\n\n/**\n * Gets the scroll position of the supplied element or window.\n *\n * The return values are unbounded, unlike `getScrollPosition`. This means they\n * may be negative or exceed the element boundaries (which is possible using\n * inertial scrolling).\n *\n * @param {DOMWindow|DOMElement} scrollable\n * @return {object} Map with `x` and `y` keys.\n */\nfunction getUnboundedScrollPosition(scrollable) {\n if (scrollable === window) {\n return {\n x: window.pageXOffset || document.documentElement.scrollLeft,\n y: window.pageYOffset || document.documentElement.scrollTop\n };\n }\n return {\n x: scrollable.scrollLeft,\n y: scrollable.scrollTop\n };\n}\n\nmodule.exports = getUnboundedScrollPosition;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/getUnboundedScrollPosition.js\n ** module id = 119\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactInjection\n */\n\n'use strict';\n\nvar DOMProperty = require('./DOMProperty');\nvar EventPluginHub = require('./EventPluginHub');\nvar ReactComponentEnvironment = require('./ReactComponentEnvironment');\nvar ReactClass = require('./ReactClass');\nvar ReactEmptyComponent = require('./ReactEmptyComponent');\nvar ReactBrowserEventEmitter = require('./ReactBrowserEventEmitter');\nvar ReactNativeComponent = require('./ReactNativeComponent');\nvar ReactPerf = require('./ReactPerf');\nvar ReactRootIndex = require('./ReactRootIndex');\nvar ReactUpdates = require('./ReactUpdates');\n\nvar ReactInjection = {\n Component: ReactComponentEnvironment.injection,\n Class: ReactClass.injection,\n DOMProperty: DOMProperty.injection,\n EmptyComponent: ReactEmptyComponent.injection,\n EventPluginHub: EventPluginHub.injection,\n EventEmitter: ReactBrowserEventEmitter.injection,\n NativeComponent: ReactNativeComponent.injection,\n Perf: ReactPerf.injection,\n RootIndex: ReactRootIndex.injection,\n Updates: ReactUpdates.injection\n};\n\nmodule.exports = ReactInjection;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactInjection.js\n ** module id = 120\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactClass\n */\n\n'use strict';\n\nvar ReactComponent = require('./ReactComponent');\nvar ReactElement = require('./ReactElement');\nvar ReactPropTypeLocations = require('./ReactPropTypeLocations');\nvar ReactPropTypeLocationNames = require('./ReactPropTypeLocationNames');\nvar ReactNoopUpdateQueue = require('./ReactNoopUpdateQueue');\n\nvar assign = require('./Object.assign');\nvar emptyObject = require('fbjs/lib/emptyObject');\nvar invariant = require('fbjs/lib/invariant');\nvar keyMirror = require('fbjs/lib/keyMirror');\nvar keyOf = require('fbjs/lib/keyOf');\nvar warning = require('fbjs/lib/warning');\n\nvar MIXINS_KEY = keyOf({ mixins: null });\n\n/**\n * Policies that describe methods in `ReactClassInterface`.\n */\nvar SpecPolicy = keyMirror({\n /**\n * These methods may be defined only once by the class specification or mixin.\n */\n DEFINE_ONCE: null,\n /**\n * These methods may be defined by both the class specification and mixins.\n * Subsequent definitions will be chained. These methods must return void.\n */\n DEFINE_MANY: null,\n /**\n * These methods are overriding the base class.\n */\n OVERRIDE_BASE: null,\n /**\n * These methods are similar to DEFINE_MANY, except we assume they return\n * objects. We try to merge the keys of the return values of all the mixed in\n * functions. If there is a key conflict we throw.\n */\n DEFINE_MANY_MERGED: null\n});\n\nvar injectedMixins = [];\n\nvar warnedSetProps = false;\nfunction warnSetProps() {\n if (!warnedSetProps) {\n warnedSetProps = true;\n process.env.NODE_ENV !== 'production' ? warning(false, 'setProps(...) and replaceProps(...) are deprecated. ' + 'Instead, call render again at the top level.') : undefined;\n }\n}\n\n/**\n * Composite components are higher-level components that compose other composite\n * or native components.\n *\n * To create a new type of `ReactClass`, pass a specification of\n * your new class to `React.createClass`. The only requirement of your class\n * specification is that you implement a `render` method.\n *\n * var MyComponent = React.createClass({\n * render: function() {\n * return <div>Hello World</div>;\n * }\n * });\n *\n * The class specification supports a specific protocol of methods that have\n * special meaning (e.g. `render`). See `ReactClassInterface` for\n * more the comprehensive protocol. Any other properties and methods in the\n * class specification will be available on the prototype.\n *\n * @interface ReactClassInterface\n * @internal\n */\nvar ReactClassInterface = {\n\n /**\n * An array of Mixin objects to include when defining your component.\n *\n * @type {array}\n * @optional\n */\n mixins: SpecPolicy.DEFINE_MANY,\n\n /**\n * An object containing properties and methods that should be defined on\n * the component's constructor instead of its prototype (static methods).\n *\n * @type {object}\n * @optional\n */\n statics: SpecPolicy.DEFINE_MANY,\n\n /**\n * Definition of prop types for this component.\n *\n * @type {object}\n * @optional\n */\n propTypes: SpecPolicy.DEFINE_MANY,\n\n /**\n * Definition of context types for this component.\n *\n * @type {object}\n * @optional\n */\n contextTypes: SpecPolicy.DEFINE_MANY,\n\n /**\n * Definition of context types this component sets for its children.\n *\n * @type {object}\n * @optional\n */\n childContextTypes: SpecPolicy.DEFINE_MANY,\n\n // ==== Definition methods ====\n\n /**\n * Invoked when the component is mounted. Values in the mapping will be set on\n * `this.props` if that prop is not specified (i.e. using an `in` check).\n *\n * This method is invoked before `getInitialState` and therefore cannot rely\n * on `this.state` or use `this.setState`.\n *\n * @return {object}\n * @optional\n */\n getDefaultProps: SpecPolicy.DEFINE_MANY_MERGED,\n\n /**\n * Invoked once before the component is mounted. The return value will be used\n * as the initial value of `this.state`.\n *\n * getInitialState: function() {\n * return {\n * isOn: false,\n * fooBaz: new BazFoo()\n * }\n * }\n *\n * @return {object}\n * @optional\n */\n getInitialState: SpecPolicy.DEFINE_MANY_MERGED,\n\n /**\n * @return {object}\n * @optional\n */\n getChildContext: SpecPolicy.DEFINE_MANY_MERGED,\n\n /**\n * Uses props from `this.props` and state from `this.state` to render the\n * structure of the component.\n *\n * No guarantees are made about when or how often this method is invoked, so\n * it must not have side effects.\n *\n * render: function() {\n * var name = this.props.name;\n * return <div>Hello, {name}!</div>;\n * }\n *\n * @return {ReactComponent}\n * @nosideeffects\n * @required\n */\n render: SpecPolicy.DEFINE_ONCE,\n\n // ==== Delegate methods ====\n\n /**\n * Invoked when the component is initially created and about to be mounted.\n * This may have side effects, but any external subscriptions or data created\n * by this method must be cleaned up in `componentWillUnmount`.\n *\n * @optional\n */\n componentWillMount: SpecPolicy.DEFINE_MANY,\n\n /**\n * Invoked when the component has been mounted and has a DOM representation.\n * However, there is no guarantee that the DOM node is in the document.\n *\n * Use this as an opportunity to operate on the DOM when the component has\n * been mounted (initialized and rendered) for the first time.\n *\n * @param {DOMElement} rootNode DOM element representing the component.\n * @optional\n */\n componentDidMount: SpecPolicy.DEFINE_MANY,\n\n /**\n * Invoked before the component receives new props.\n *\n * Use this as an opportunity to react to a prop transition by updating the\n * state using `this.setState`. Current props are accessed via `this.props`.\n *\n * componentWillReceiveProps: function(nextProps, nextContext) {\n * this.setState({\n * likesIncreasing: nextProps.likeCount > this.props.likeCount\n * });\n * }\n *\n * NOTE: There is no equivalent `componentWillReceiveState`. An incoming prop\n * transition may cause a state change, but the opposite is not true. If you\n * need it, you are probably looking for `componentWillUpdate`.\n *\n * @param {object} nextProps\n * @optional\n */\n componentWillReceiveProps: SpecPolicy.DEFINE_MANY,\n\n /**\n * Invoked while deciding if the component should be updated as a result of\n * receiving new props, state and/or context.\n *\n * Use this as an opportunity to `return false` when you're certain that the\n * transition to the new props/state/context will not require a component\n * update.\n *\n * shouldComponentUpdate: function(nextProps, nextState, nextContext) {\n * return !equal(nextProps, this.props) ||\n * !equal(nextState, this.state) ||\n * !equal(nextContext, this.context);\n * }\n *\n * @param {object} nextProps\n * @param {?object} nextState\n * @param {?object} nextContext\n * @return {boolean} True if the component should update.\n * @optional\n */\n shouldComponentUpdate: SpecPolicy.DEFINE_ONCE,\n\n /**\n * Invoked when the component is about to update due to a transition from\n * `this.props`, `this.state` and `this.context` to `nextProps`, `nextState`\n * and `nextContext`.\n *\n * Use this as an opportunity to perform preparation before an update occurs.\n *\n * NOTE: You **cannot** use `this.setState()` in this method.\n *\n * @param {object} nextProps\n * @param {?object} nextState\n * @param {?object} nextContext\n * @param {ReactReconcileTransaction} transaction\n * @optional\n */\n componentWillUpdate: SpecPolicy.DEFINE_MANY,\n\n /**\n * Invoked when the component's DOM representation has been updated.\n *\n * Use this as an opportunity to operate on the DOM when the component has\n * been updated.\n *\n * @param {object} prevProps\n * @param {?object} prevState\n * @param {?object} prevContext\n * @param {DOMElement} rootNode DOM element representing the component.\n * @optional\n */\n componentDidUpdate: SpecPolicy.DEFINE_MANY,\n\n /**\n * Invoked when the component is about to be removed from its parent and have\n * its DOM representation destroyed.\n *\n * Use this as an opportunity to deallocate any external resources.\n *\n * NOTE: There is no `componentDidUnmount` since your component will have been\n * destroyed by that point.\n *\n * @optional\n */\n componentWillUnmount: SpecPolicy.DEFINE_MANY,\n\n // ==== Advanced methods ====\n\n /**\n * Updates the component's currently mounted DOM representation.\n *\n * By default, this implements React's rendering and reconciliation algorithm.\n * Sophisticated clients may wish to override this.\n *\n * @param {ReactReconcileTransaction} transaction\n * @internal\n * @overridable\n */\n updateComponent: SpecPolicy.OVERRIDE_BASE\n\n};\n\n/**\n * Mapping from class specification keys to special processing functions.\n *\n * Although these are declared like instance properties in the specification\n * when defining classes using `React.createClass`, they are actually static\n * and are accessible on the constructor instead of the prototype. Despite\n * being static, they must be defined outside of the \"statics\" key under\n * which all other static methods are defined.\n */\nvar RESERVED_SPEC_KEYS = {\n displayName: function (Constructor, displayName) {\n Constructor.displayName = displayName;\n },\n mixins: function (Constructor, mixins) {\n if (mixins) {\n for (var i = 0; i < mixins.length; i++) {\n mixSpecIntoComponent(Constructor, mixins[i]);\n }\n }\n },\n childContextTypes: function (Constructor, childContextTypes) {\n if (process.env.NODE_ENV !== 'production') {\n validateTypeDef(Constructor, childContextTypes, ReactPropTypeLocations.childContext);\n }\n Constructor.childContextTypes = assign({}, Constructor.childContextTypes, childContextTypes);\n },\n contextTypes: function (Constructor, contextTypes) {\n if (process.env.NODE_ENV !== 'production') {\n validateTypeDef(Constructor, contextTypes, ReactPropTypeLocations.context);\n }\n Constructor.contextTypes = assign({}, Constructor.contextTypes, contextTypes);\n },\n /**\n * Special case getDefaultProps which should move into statics but requires\n * automatic merging.\n */\n getDefaultProps: function (Constructor, getDefaultProps) {\n if (Constructor.getDefaultProps) {\n Constructor.getDefaultProps = createMergedResultFunction(Constructor.getDefaultProps, getDefaultProps);\n } else {\n Constructor.getDefaultProps = getDefaultProps;\n }\n },\n propTypes: function (Constructor, propTypes) {\n if (process.env.NODE_ENV !== 'production') {\n validateTypeDef(Constructor, propTypes, ReactPropTypeLocations.prop);\n }\n Constructor.propTypes = assign({}, Constructor.propTypes, propTypes);\n },\n statics: function (Constructor, statics) {\n mixStaticSpecIntoComponent(Constructor, statics);\n },\n autobind: function () {} };\n\n// noop\nfunction validateTypeDef(Constructor, typeDef, location) {\n for (var propName in typeDef) {\n if (typeDef.hasOwnProperty(propName)) {\n // use a warning instead of an invariant so components\n // don't show up in prod but not in __DEV__\n process.env.NODE_ENV !== 'production' ? warning(typeof typeDef[propName] === 'function', '%s: %s type `%s` is invalid; it must be a function, usually from ' + 'React.PropTypes.', Constructor.displayName || 'ReactClass', ReactPropTypeLocationNames[location], propName) : undefined;\n }\n }\n}\n\nfunction validateMethodOverride(proto, name) {\n var specPolicy = ReactClassInterface.hasOwnProperty(name) ? ReactClassInterface[name] : null;\n\n // Disallow overriding of base class methods unless explicitly allowed.\n if (ReactClassMixin.hasOwnProperty(name)) {\n !(specPolicy === SpecPolicy.OVERRIDE_BASE) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClassInterface: You are attempting to override ' + '`%s` from your class specification. Ensure that your method names ' + 'do not overlap with React methods.', name) : invariant(false) : undefined;\n }\n\n // Disallow defining methods more than once unless explicitly allowed.\n if (proto.hasOwnProperty(name)) {\n !(specPolicy === SpecPolicy.DEFINE_MANY || specPolicy === SpecPolicy.DEFINE_MANY_MERGED) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClassInterface: You are attempting to define ' + '`%s` on your component more than once. This conflict may be due ' + 'to a mixin.', name) : invariant(false) : undefined;\n }\n}\n\n/**\n * Mixin helper which handles policy validation and reserved\n * specification keys when building React classses.\n */\nfunction mixSpecIntoComponent(Constructor, spec) {\n if (!spec) {\n return;\n }\n\n !(typeof spec !== 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClass: You\\'re attempting to ' + 'use a component class as a mixin. Instead, just use a regular object.') : invariant(false) : undefined;\n !!ReactElement.isValidElement(spec) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClass: You\\'re attempting to ' + 'use a component as a mixin. Instead, just use a regular object.') : invariant(false) : undefined;\n\n var proto = Constructor.prototype;\n\n // By handling mixins before any other properties, we ensure the same\n // chaining order is applied to methods with DEFINE_MANY policy, whether\n // mixins are listed before or after these methods in the spec.\n if (spec.hasOwnProperty(MIXINS_KEY)) {\n RESERVED_SPEC_KEYS.mixins(Constructor, spec.mixins);\n }\n\n for (var name in spec) {\n if (!spec.hasOwnProperty(name)) {\n continue;\n }\n\n if (name === MIXINS_KEY) {\n // We have already handled mixins in a special case above.\n continue;\n }\n\n var property = spec[name];\n validateMethodOverride(proto, name);\n\n if (RESERVED_SPEC_KEYS.hasOwnProperty(name)) {\n RESERVED_SPEC_KEYS[name](Constructor, property);\n } else {\n // Setup methods on prototype:\n // The following member methods should not be automatically bound:\n // 1. Expected ReactClass methods (in the \"interface\").\n // 2. Overridden methods (that were mixed in).\n var isReactClassMethod = ReactClassInterface.hasOwnProperty(name);\n var isAlreadyDefined = proto.hasOwnProperty(name);\n var isFunction = typeof property === 'function';\n var shouldAutoBind = isFunction && !isReactClassMethod && !isAlreadyDefined && spec.autobind !== false;\n\n if (shouldAutoBind) {\n if (!proto.__reactAutoBindMap) {\n proto.__reactAutoBindMap = {};\n }\n proto.__reactAutoBindMap[name] = property;\n proto[name] = property;\n } else {\n if (isAlreadyDefined) {\n var specPolicy = ReactClassInterface[name];\n\n // These cases should already be caught by validateMethodOverride.\n !(isReactClassMethod && (specPolicy === SpecPolicy.DEFINE_MANY_MERGED || specPolicy === SpecPolicy.DEFINE_MANY)) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClass: Unexpected spec policy %s for key %s ' + 'when mixing in component specs.', specPolicy, name) : invariant(false) : undefined;\n\n // For methods which are defined more than once, call the existing\n // methods before calling the new property, merging if appropriate.\n if (specPolicy === SpecPolicy.DEFINE_MANY_MERGED) {\n proto[name] = createMergedResultFunction(proto[name], property);\n } else if (specPolicy === SpecPolicy.DEFINE_MANY) {\n proto[name] = createChainedFunction(proto[name], property);\n }\n } else {\n proto[name] = property;\n if (process.env.NODE_ENV !== 'production') {\n // Add verbose displayName to the function, which helps when looking\n // at profiling tools.\n if (typeof property === 'function' && spec.displayName) {\n proto[name].displayName = spec.displayName + '_' + name;\n }\n }\n }\n }\n }\n }\n}\n\nfunction mixStaticSpecIntoComponent(Constructor, statics) {\n if (!statics) {\n return;\n }\n for (var name in statics) {\n var property = statics[name];\n if (!statics.hasOwnProperty(name)) {\n continue;\n }\n\n var isReserved = (name in RESERVED_SPEC_KEYS);\n !!isReserved ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClass: You are attempting to define a reserved ' + 'property, `%s`, that shouldn\\'t be on the \"statics\" key. Define it ' + 'as an instance property instead; it will still be accessible on the ' + 'constructor.', name) : invariant(false) : undefined;\n\n var isInherited = (name in Constructor);\n !!isInherited ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClass: You are attempting to define ' + '`%s` on your component more than once. This conflict may be ' + 'due to a mixin.', name) : invariant(false) : undefined;\n Constructor[name] = property;\n }\n}\n\n/**\n * Merge two objects, but throw if both contain the same key.\n *\n * @param {object} one The first object, which is mutated.\n * @param {object} two The second object\n * @return {object} one after it has been mutated to contain everything in two.\n */\nfunction mergeIntoWithNoDuplicateKeys(one, two) {\n !(one && two && typeof one === 'object' && typeof two === 'object') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects.') : invariant(false) : undefined;\n\n for (var key in two) {\n if (two.hasOwnProperty(key)) {\n !(one[key] === undefined) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'mergeIntoWithNoDuplicateKeys(): ' + 'Tried to merge two objects with the same key: `%s`. This conflict ' + 'may be due to a mixin; in particular, this may be caused by two ' + 'getInitialState() or getDefaultProps() methods returning objects ' + 'with clashing keys.', key) : invariant(false) : undefined;\n one[key] = two[key];\n }\n }\n return one;\n}\n\n/**\n * Creates a function that invokes two functions and merges their return values.\n *\n * @param {function} one Function to invoke first.\n * @param {function} two Function to invoke second.\n * @return {function} Function that invokes the two argument functions.\n * @private\n */\nfunction createMergedResultFunction(one, two) {\n return function mergedResult() {\n var a = one.apply(this, arguments);\n var b = two.apply(this, arguments);\n if (a == null) {\n return b;\n } else if (b == null) {\n return a;\n }\n var c = {};\n mergeIntoWithNoDuplicateKeys(c, a);\n mergeIntoWithNoDuplicateKeys(c, b);\n return c;\n };\n}\n\n/**\n * Creates a function that invokes two functions and ignores their return vales.\n *\n * @param {function} one Function to invoke first.\n * @param {function} two Function to invoke second.\n * @return {function} Function that invokes the two argument functions.\n * @private\n */\nfunction createChainedFunction(one, two) {\n return function chainedFunction() {\n one.apply(this, arguments);\n two.apply(this, arguments);\n };\n}\n\n/**\n * Binds a method to the component.\n *\n * @param {object} component Component whose method is going to be bound.\n * @param {function} method Method to be bound.\n * @return {function} The bound method.\n */\nfunction bindAutoBindMethod(component, method) {\n var boundMethod = method.bind(component);\n if (process.env.NODE_ENV !== 'production') {\n boundMethod.__reactBoundContext = component;\n boundMethod.__reactBoundMethod = method;\n boundMethod.__reactBoundArguments = null;\n var componentName = component.constructor.displayName;\n var _bind = boundMethod.bind;\n /* eslint-disable block-scoped-var, no-undef */\n boundMethod.bind = function (newThis) {\n for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n // User is trying to bind() an autobound method; we effectively will\n // ignore the value of \"this\" that the user is trying to use, so\n // let's warn.\n if (newThis !== component && newThis !== null) {\n process.env.NODE_ENV !== 'production' ? warning(false, 'bind(): React component methods may only be bound to the ' + 'component instance. See %s', componentName) : undefined;\n } else if (!args.length) {\n process.env.NODE_ENV !== 'production' ? warning(false, 'bind(): You are binding a component method to the component. ' + 'React does this for you automatically in a high-performance ' + 'way, so you can safely remove this call. See %s', componentName) : undefined;\n return boundMethod;\n }\n var reboundMethod = _bind.apply(boundMethod, arguments);\n reboundMethod.__reactBoundContext = component;\n reboundMethod.__reactBoundMethod = method;\n reboundMethod.__reactBoundArguments = args;\n return reboundMethod;\n /* eslint-enable */\n };\n }\n return boundMethod;\n}\n\n/**\n * Binds all auto-bound methods in a component.\n *\n * @param {object} component Component whose method is going to be bound.\n */\nfunction bindAutoBindMethods(component) {\n for (var autoBindKey in component.__reactAutoBindMap) {\n if (component.__reactAutoBindMap.hasOwnProperty(autoBindKey)) {\n var method = component.__reactAutoBindMap[autoBindKey];\n component[autoBindKey] = bindAutoBindMethod(component, method);\n }\n }\n}\n\n/**\n * Add more to the ReactClass base class. These are all legacy features and\n * therefore not already part of the modern ReactComponent.\n */\nvar ReactClassMixin = {\n\n /**\n * TODO: This will be deprecated because state should always keep a consistent\n * type signature and the only use case for this, is to avoid that.\n */\n replaceState: function (newState, callback) {\n this.updater.enqueueReplaceState(this, newState);\n if (callback) {\n this.updater.enqueueCallback(this, callback);\n }\n },\n\n /**\n * Checks whether or not this composite component is mounted.\n * @return {boolean} True if mounted, false otherwise.\n * @protected\n * @final\n */\n isMounted: function () {\n return this.updater.isMounted(this);\n },\n\n /**\n * Sets a subset of the props.\n *\n * @param {object} partialProps Subset of the next props.\n * @param {?function} callback Called after props are updated.\n * @final\n * @public\n * @deprecated\n */\n setProps: function (partialProps, callback) {\n if (process.env.NODE_ENV !== 'production') {\n warnSetProps();\n }\n this.updater.enqueueSetProps(this, partialProps);\n if (callback) {\n this.updater.enqueueCallback(this, callback);\n }\n },\n\n /**\n * Replace all the props.\n *\n * @param {object} newProps Subset of the next props.\n * @param {?function} callback Called after props are updated.\n * @final\n * @public\n * @deprecated\n */\n replaceProps: function (newProps, callback) {\n if (process.env.NODE_ENV !== 'production') {\n warnSetProps();\n }\n this.updater.enqueueReplaceProps(this, newProps);\n if (callback) {\n this.updater.enqueueCallback(this, callback);\n }\n }\n};\n\nvar ReactClassComponent = function () {};\nassign(ReactClassComponent.prototype, ReactComponent.prototype, ReactClassMixin);\n\n/**\n * Module for creating composite components.\n *\n * @class ReactClass\n */\nvar ReactClass = {\n\n /**\n * Creates a composite component class given a class specification.\n *\n * @param {object} spec Class specification (which must define `render`).\n * @return {function} Component constructor function.\n * @public\n */\n createClass: function (spec) {\n var Constructor = function (props, context, updater) {\n // This constructor is overridden by mocks. The argument is used\n // by mocks to assert on what gets mounted.\n\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(this instanceof Constructor, 'Something is calling a React component directly. Use a factory or ' + 'JSX instead. See: https://fb.me/react-legacyfactory') : undefined;\n }\n\n // Wire up auto-binding\n if (this.__reactAutoBindMap) {\n bindAutoBindMethods(this);\n }\n\n this.props = props;\n this.context = context;\n this.refs = emptyObject;\n this.updater = updater || ReactNoopUpdateQueue;\n\n this.state = null;\n\n // ReactClasses doesn't have constructors. Instead, they use the\n // getInitialState and componentWillMount methods for initialization.\n\n var initialState = this.getInitialState ? this.getInitialState() : null;\n if (process.env.NODE_ENV !== 'production') {\n // We allow auto-mocks to proceed as if they're returning null.\n if (typeof initialState === 'undefined' && this.getInitialState._isMockFunction) {\n // This is probably bad practice. Consider warning here and\n // deprecating this convenience.\n initialState = null;\n }\n }\n !(typeof initialState === 'object' && !Array.isArray(initialState)) ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s.getInitialState(): must return an object or null', Constructor.displayName || 'ReactCompositeComponent') : invariant(false) : undefined;\n\n this.state = initialState;\n };\n Constructor.prototype = new ReactClassComponent();\n Constructor.prototype.constructor = Constructor;\n\n injectedMixins.forEach(mixSpecIntoComponent.bind(null, Constructor));\n\n mixSpecIntoComponent(Constructor, spec);\n\n // Initialize the defaultProps property after all mixins have been merged.\n if (Constructor.getDefaultProps) {\n Constructor.defaultProps = Constructor.getDefaultProps();\n }\n\n if (process.env.NODE_ENV !== 'production') {\n // This is a tag to indicate that the use of these method names is ok,\n // since it's used with createClass. If it's not, then it's likely a\n // mistake so we'll warn you to use the static property, property\n // initializer or constructor respectively.\n if (Constructor.getDefaultProps) {\n Constructor.getDefaultProps.isReactClassApproved = {};\n }\n if (Constructor.prototype.getInitialState) {\n Constructor.prototype.getInitialState.isReactClassApproved = {};\n }\n }\n\n !Constructor.prototype.render ? process.env.NODE_ENV !== 'production' ? invariant(false, 'createClass(...): Class specification must implement a `render` method.') : invariant(false) : undefined;\n\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(!Constructor.prototype.componentShouldUpdate, '%s has a method called ' + 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' + 'The name is phrased as a question because the function is ' + 'expected to return a value.', spec.displayName || 'A component') : undefined;\n process.env.NODE_ENV !== 'production' ? warning(!Constructor.prototype.componentWillRecieveProps, '%s has a method called ' + 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', spec.displayName || 'A component') : undefined;\n }\n\n // Reduce time spent doing lookups by setting these on the prototype.\n for (var methodName in ReactClassInterface) {\n if (!Constructor.prototype[methodName]) {\n Constructor.prototype[methodName] = null;\n }\n }\n\n return Constructor;\n },\n\n injection: {\n injectMixin: function (mixin) {\n injectedMixins.push(mixin);\n }\n }\n\n};\n\nmodule.exports = ReactClass;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactClass.js\n ** module id = 121\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactComponent\n */\n\n'use strict';\n\nvar ReactNoopUpdateQueue = require('./ReactNoopUpdateQueue');\n\nvar canDefineProperty = require('./canDefineProperty');\nvar emptyObject = require('fbjs/lib/emptyObject');\nvar invariant = require('fbjs/lib/invariant');\nvar warning = require('fbjs/lib/warning');\n\n/**\n * Base class helpers for the updating state of a component.\n */\nfunction ReactComponent(props, context, updater) {\n this.props = props;\n this.context = context;\n this.refs = emptyObject;\n // We initialize the default updater but the real one gets injected by the\n // renderer.\n this.updater = updater || ReactNoopUpdateQueue;\n}\n\nReactComponent.prototype.isReactComponent = {};\n\n/**\n * Sets a subset of the state. Always use this to mutate\n * state. You should treat `this.state` as immutable.\n *\n * There is no guarantee that `this.state` will be immediately updated, so\n * accessing `this.state` after calling this method may return the old value.\n *\n * There is no guarantee that calls to `setState` will run synchronously,\n * as they may eventually be batched together. You can provide an optional\n * callback that will be executed when the call to setState is actually\n * completed.\n *\n * When a function is provided to setState, it will be called at some point in\n * the future (not synchronously). It will be called with the up to date\n * component arguments (state, props, context). These values can be different\n * from this.* because your function may be called after receiveProps but before\n * shouldComponentUpdate, and this new state, props, and context will not yet be\n * assigned to this.\n *\n * @param {object|function} partialState Next partial state or function to\n * produce next partial state to be merged with current state.\n * @param {?function} callback Called after state is updated.\n * @final\n * @protected\n */\nReactComponent.prototype.setState = function (partialState, callback) {\n !(typeof partialState === 'object' || typeof partialState === 'function' || partialState == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'setState(...): takes an object of state variables to update or a ' + 'function which returns an object of state variables.') : invariant(false) : undefined;\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(partialState != null, 'setState(...): You passed an undefined or null state object; ' + 'instead, use forceUpdate().') : undefined;\n }\n this.updater.enqueueSetState(this, partialState);\n if (callback) {\n this.updater.enqueueCallback(this, callback);\n }\n};\n\n/**\n * Forces an update. This should only be invoked when it is known with\n * certainty that we are **not** in a DOM transaction.\n *\n * You may want to call this when you know that some deeper aspect of the\n * component's state has changed but `setState` was not called.\n *\n * This will not invoke `shouldComponentUpdate`, but it will invoke\n * `componentWillUpdate` and `componentDidUpdate`.\n *\n * @param {?function} callback Called after update is complete.\n * @final\n * @protected\n */\nReactComponent.prototype.forceUpdate = function (callback) {\n this.updater.enqueueForceUpdate(this);\n if (callback) {\n this.updater.enqueueCallback(this, callback);\n }\n};\n\n/**\n * Deprecated APIs. These APIs used to exist on classic React classes but since\n * we would like to deprecate them, we're not going to move them over to this\n * modern base class. Instead, we define a getter that warns if it's accessed.\n */\nif (process.env.NODE_ENV !== 'production') {\n var deprecatedAPIs = {\n getDOMNode: ['getDOMNode', 'Use ReactDOM.findDOMNode(component) instead.'],\n isMounted: ['isMounted', 'Instead, make sure to clean up subscriptions and pending requests in ' + 'componentWillUnmount to prevent memory leaks.'],\n replaceProps: ['replaceProps', 'Instead, call render again at the top level.'],\n replaceState: ['replaceState', 'Refactor your code to use setState instead (see ' + 'https://github.com/facebook/react/issues/3236).'],\n setProps: ['setProps', 'Instead, call render again at the top level.']\n };\n var defineDeprecationWarning = function (methodName, info) {\n if (canDefineProperty) {\n Object.defineProperty(ReactComponent.prototype, methodName, {\n get: function () {\n process.env.NODE_ENV !== 'production' ? warning(false, '%s(...) is deprecated in plain JavaScript React classes. %s', info[0], info[1]) : undefined;\n return undefined;\n }\n });\n }\n };\n for (var fnName in deprecatedAPIs) {\n if (deprecatedAPIs.hasOwnProperty(fnName)) {\n defineDeprecationWarning(fnName, deprecatedAPIs[fnName]);\n }\n }\n}\n\nmodule.exports = ReactComponent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactComponent.js\n ** module id = 122\n ** module chunks = 0 1\n **/","/**\n * Copyright 2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactNoopUpdateQueue\n */\n\n'use strict';\n\nvar warning = require('fbjs/lib/warning');\n\nfunction warnTDZ(publicInstance, callerName) {\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(false, '%s(...): Can only update a mounted or mounting component. ' + 'This usually means you called %s() on an unmounted component. ' + 'This is a no-op. Please check the code for the %s component.', callerName, callerName, publicInstance.constructor && publicInstance.constructor.displayName || '') : undefined;\n }\n}\n\n/**\n * This is the abstract API for an update queue.\n */\nvar ReactNoopUpdateQueue = {\n\n /**\n * Checks whether or not this composite component is mounted.\n * @param {ReactClass} publicInstance The instance we want to test.\n * @return {boolean} True if mounted, false otherwise.\n * @protected\n * @final\n */\n isMounted: function (publicInstance) {\n return false;\n },\n\n /**\n * Enqueue a callback that will be executed after all the pending updates\n * have processed.\n *\n * @param {ReactClass} publicInstance The instance to use as `this` context.\n * @param {?function} callback Called after state is updated.\n * @internal\n */\n enqueueCallback: function (publicInstance, callback) {},\n\n /**\n * Forces an update. This should only be invoked when it is known with\n * certainty that we are **not** in a DOM transaction.\n *\n * You may want to call this when you know that some deeper aspect of the\n * component's state has changed but `setState` was not called.\n *\n * This will not invoke `shouldComponentUpdate`, but it will invoke\n * `componentWillUpdate` and `componentDidUpdate`.\n *\n * @param {ReactClass} publicInstance The instance that should rerender.\n * @internal\n */\n enqueueForceUpdate: function (publicInstance) {\n warnTDZ(publicInstance, 'forceUpdate');\n },\n\n /**\n * Replaces all of the state. Always use this or `setState` to mutate state.\n * You should treat `this.state` as immutable.\n *\n * There is no guarantee that `this.state` will be immediately updated, so\n * accessing `this.state` after calling this method may return the old value.\n *\n * @param {ReactClass} publicInstance The instance that should rerender.\n * @param {object} completeState Next state.\n * @internal\n */\n enqueueReplaceState: function (publicInstance, completeState) {\n warnTDZ(publicInstance, 'replaceState');\n },\n\n /**\n * Sets a subset of the state. This only exists because _pendingState is\n * internal. This provides a merging strategy that is not available to deep\n * properties which is confusing. TODO: Expose pendingState or don't use it\n * during the merge.\n *\n * @param {ReactClass} publicInstance The instance that should rerender.\n * @param {object} partialState Next partial state to be merged with state.\n * @internal\n */\n enqueueSetState: function (publicInstance, partialState) {\n warnTDZ(publicInstance, 'setState');\n },\n\n /**\n * Sets a subset of the props.\n *\n * @param {ReactClass} publicInstance The instance that should rerender.\n * @param {object} partialProps Subset of the next props.\n * @internal\n */\n enqueueSetProps: function (publicInstance, partialProps) {\n warnTDZ(publicInstance, 'setProps');\n },\n\n /**\n * Replaces all of the props.\n *\n * @param {ReactClass} publicInstance The instance that should rerender.\n * @param {object} props New props.\n * @internal\n */\n enqueueReplaceProps: function (publicInstance, props) {\n warnTDZ(publicInstance, 'replaceProps');\n }\n\n};\n\nmodule.exports = ReactNoopUpdateQueue;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactNoopUpdateQueue.js\n ** module id = 123\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactReconcileTransaction\n * @typechecks static-only\n */\n\n'use strict';\n\nvar CallbackQueue = require('./CallbackQueue');\nvar PooledClass = require('./PooledClass');\nvar ReactBrowserEventEmitter = require('./ReactBrowserEventEmitter');\nvar ReactDOMFeatureFlags = require('./ReactDOMFeatureFlags');\nvar ReactInputSelection = require('./ReactInputSelection');\nvar Transaction = require('./Transaction');\n\nvar assign = require('./Object.assign');\n\n/**\n * Ensures that, when possible, the selection range (currently selected text\n * input) is not disturbed by performing the transaction.\n */\nvar SELECTION_RESTORATION = {\n /**\n * @return {Selection} Selection information.\n */\n initialize: ReactInputSelection.getSelectionInformation,\n /**\n * @param {Selection} sel Selection information returned from `initialize`.\n */\n close: ReactInputSelection.restoreSelection\n};\n\n/**\n * Suppresses events (blur/focus) that could be inadvertently dispatched due to\n * high level DOM manipulations (like temporarily removing a text input from the\n * DOM).\n */\nvar EVENT_SUPPRESSION = {\n /**\n * @return {boolean} The enabled status of `ReactBrowserEventEmitter` before\n * the reconciliation.\n */\n initialize: function () {\n var currentlyEnabled = ReactBrowserEventEmitter.isEnabled();\n ReactBrowserEventEmitter.setEnabled(false);\n return currentlyEnabled;\n },\n\n /**\n * @param {boolean} previouslyEnabled Enabled status of\n * `ReactBrowserEventEmitter` before the reconciliation occurred. `close`\n * restores the previous value.\n */\n close: function (previouslyEnabled) {\n ReactBrowserEventEmitter.setEnabled(previouslyEnabled);\n }\n};\n\n/**\n * Provides a queue for collecting `componentDidMount` and\n * `componentDidUpdate` callbacks during the the transaction.\n */\nvar ON_DOM_READY_QUEUEING = {\n /**\n * Initializes the internal `onDOMReady` queue.\n */\n initialize: function () {\n this.reactMountReady.reset();\n },\n\n /**\n * After DOM is flushed, invoke all registered `onDOMReady` callbacks.\n */\n close: function () {\n this.reactMountReady.notifyAll();\n }\n};\n\n/**\n * Executed within the scope of the `Transaction` instance. Consider these as\n * being member methods, but with an implied ordering while being isolated from\n * each other.\n */\nvar TRANSACTION_WRAPPERS = [SELECTION_RESTORATION, EVENT_SUPPRESSION, ON_DOM_READY_QUEUEING];\n\n/**\n * Currently:\n * - The order that these are listed in the transaction is critical:\n * - Suppresses events.\n * - Restores selection range.\n *\n * Future:\n * - Restore document/overflow scroll positions that were unintentionally\n * modified via DOM insertions above the top viewport boundary.\n * - Implement/integrate with customized constraint based layout system and keep\n * track of which dimensions must be remeasured.\n *\n * @class ReactReconcileTransaction\n */\nfunction ReactReconcileTransaction(forceHTML) {\n this.reinitializeTransaction();\n // Only server-side rendering really needs this option (see\n // `ReactServerRendering`), but server-side uses\n // `ReactServerRenderingTransaction` instead. This option is here so that it's\n // accessible and defaults to false when `ReactDOMComponent` and\n // `ReactTextComponent` checks it in `mountComponent`.`\n this.renderToStaticMarkup = false;\n this.reactMountReady = CallbackQueue.getPooled(null);\n this.useCreateElement = !forceHTML && ReactDOMFeatureFlags.useCreateElement;\n}\n\nvar Mixin = {\n /**\n * @see Transaction\n * @abstract\n * @final\n * @return {array<object>} List of operation wrap procedures.\n * TODO: convert to array<TransactionWrapper>\n */\n getTransactionWrappers: function () {\n return TRANSACTION_WRAPPERS;\n },\n\n /**\n * @return {object} The queue to collect `onDOMReady` callbacks with.\n */\n getReactMountReady: function () {\n return this.reactMountReady;\n },\n\n /**\n * `PooledClass` looks for this, and will invoke this before allowing this\n * instance to be reused.\n */\n destructor: function () {\n CallbackQueue.release(this.reactMountReady);\n this.reactMountReady = null;\n }\n};\n\nassign(ReactReconcileTransaction.prototype, Transaction.Mixin, Mixin);\n\nPooledClass.addPoolingTo(ReactReconcileTransaction);\n\nmodule.exports = ReactReconcileTransaction;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactReconcileTransaction.js\n ** module id = 124\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactInputSelection\n */\n\n'use strict';\n\nvar ReactDOMSelection = require('./ReactDOMSelection');\n\nvar containsNode = require('fbjs/lib/containsNode');\nvar focusNode = require('fbjs/lib/focusNode');\nvar getActiveElement = require('fbjs/lib/getActiveElement');\n\nfunction isInDocument(node) {\n return containsNode(document.documentElement, node);\n}\n\n/**\n * @ReactInputSelection: React input selection module. Based on Selection.js,\n * but modified to be suitable for react and has a couple of bug fixes (doesn't\n * assume buttons have range selections allowed).\n * Input selection module for React.\n */\nvar ReactInputSelection = {\n\n hasSelectionCapabilities: function (elem) {\n var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();\n return nodeName && (nodeName === 'input' && elem.type === 'text' || nodeName === 'textarea' || elem.contentEditable === 'true');\n },\n\n getSelectionInformation: function () {\n var focusedElem = getActiveElement();\n return {\n focusedElem: focusedElem,\n selectionRange: ReactInputSelection.hasSelectionCapabilities(focusedElem) ? ReactInputSelection.getSelection(focusedElem) : null\n };\n },\n\n /**\n * @restoreSelection: If any selection information was potentially lost,\n * restore it. This is useful when performing operations that could remove dom\n * nodes and place them back in, resulting in focus being lost.\n */\n restoreSelection: function (priorSelectionInformation) {\n var curFocusedElem = getActiveElement();\n var priorFocusedElem = priorSelectionInformation.focusedElem;\n var priorSelectionRange = priorSelectionInformation.selectionRange;\n if (curFocusedElem !== priorFocusedElem && isInDocument(priorFocusedElem)) {\n if (ReactInputSelection.hasSelectionCapabilities(priorFocusedElem)) {\n ReactInputSelection.setSelection(priorFocusedElem, priorSelectionRange);\n }\n focusNode(priorFocusedElem);\n }\n },\n\n /**\n * @getSelection: Gets the selection bounds of a focused textarea, input or\n * contentEditable node.\n * -@input: Look up selection bounds of this input\n * -@return {start: selectionStart, end: selectionEnd}\n */\n getSelection: function (input) {\n var selection;\n\n if ('selectionStart' in input) {\n // Modern browser with input or textarea.\n selection = {\n start: input.selectionStart,\n end: input.selectionEnd\n };\n } else if (document.selection && (input.nodeName && input.nodeName.toLowerCase() === 'input')) {\n // IE8 input.\n var range = document.selection.createRange();\n // There can only be one selection per document in IE, so it must\n // be in our element.\n if (range.parentElement() === input) {\n selection = {\n start: -range.moveStart('character', -input.value.length),\n end: -range.moveEnd('character', -input.value.length)\n };\n }\n } else {\n // Content editable or old IE textarea.\n selection = ReactDOMSelection.getOffsets(input);\n }\n\n return selection || { start: 0, end: 0 };\n },\n\n /**\n * @setSelection: Sets the selection bounds of a textarea or input and focuses\n * the input.\n * -@input Set selection bounds of this input or textarea\n * -@offsets Object of same form that is returned from get*\n */\n setSelection: function (input, offsets) {\n var start = offsets.start;\n var end = offsets.end;\n if (typeof end === 'undefined') {\n end = start;\n }\n\n if ('selectionStart' in input) {\n input.selectionStart = start;\n input.selectionEnd = Math.min(end, input.value.length);\n } else if (document.selection && (input.nodeName && input.nodeName.toLowerCase() === 'input')) {\n var range = input.createTextRange();\n range.collapse(true);\n range.moveStart('character', start);\n range.moveEnd('character', end - start);\n range.select();\n } else {\n ReactDOMSelection.setOffsets(input, offsets);\n }\n }\n};\n\nmodule.exports = ReactInputSelection;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactInputSelection.js\n ** module id = 125\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactDOMSelection\n */\n\n'use strict';\n\nvar ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');\n\nvar getNodeForCharacterOffset = require('./getNodeForCharacterOffset');\nvar getTextContentAccessor = require('./getTextContentAccessor');\n\n/**\n * While `isCollapsed` is available on the Selection object and `collapsed`\n * is available on the Range object, IE11 sometimes gets them wrong.\n * If the anchor/focus nodes and offsets are the same, the range is collapsed.\n */\nfunction isCollapsed(anchorNode, anchorOffset, focusNode, focusOffset) {\n return anchorNode === focusNode && anchorOffset === focusOffset;\n}\n\n/**\n * Get the appropriate anchor and focus node/offset pairs for IE.\n *\n * The catch here is that IE's selection API doesn't provide information\n * about whether the selection is forward or backward, so we have to\n * behave as though it's always forward.\n *\n * IE text differs from modern selection in that it behaves as though\n * block elements end with a new line. This means character offsets will\n * differ between the two APIs.\n *\n * @param {DOMElement} node\n * @return {object}\n */\nfunction getIEOffsets(node) {\n var selection = document.selection;\n var selectedRange = selection.createRange();\n var selectedLength = selectedRange.text.length;\n\n // Duplicate selection so we can move range without breaking user selection.\n var fromStart = selectedRange.duplicate();\n fromStart.moveToElementText(node);\n fromStart.setEndPoint('EndToStart', selectedRange);\n\n var startOffset = fromStart.text.length;\n var endOffset = startOffset + selectedLength;\n\n return {\n start: startOffset,\n end: endOffset\n };\n}\n\n/**\n * @param {DOMElement} node\n * @return {?object}\n */\nfunction getModernOffsets(node) {\n var selection = window.getSelection && window.getSelection();\n\n if (!selection || selection.rangeCount === 0) {\n return null;\n }\n\n var anchorNode = selection.anchorNode;\n var anchorOffset = selection.anchorOffset;\n var focusNode = selection.focusNode;\n var focusOffset = selection.focusOffset;\n\n var currentRange = selection.getRangeAt(0);\n\n // In Firefox, range.startContainer and range.endContainer can be \"anonymous\n // divs\", e.g. the up/down buttons on an <input type=\"number\">. Anonymous\n // divs do not seem to expose properties, triggering a \"Permission denied\n // error\" if any of its properties are accessed. The only seemingly possible\n // way to avoid erroring is to access a property that typically works for\n // non-anonymous divs and catch any error that may otherwise arise. See\n // https://bugzilla.mozilla.org/show_bug.cgi?id=208427\n try {\n /* eslint-disable no-unused-expressions */\n currentRange.startContainer.nodeType;\n currentRange.endContainer.nodeType;\n /* eslint-enable no-unused-expressions */\n } catch (e) {\n return null;\n }\n\n // If the node and offset values are the same, the selection is collapsed.\n // `Selection.isCollapsed` is available natively, but IE sometimes gets\n // this value wrong.\n var isSelectionCollapsed = isCollapsed(selection.anchorNode, selection.anchorOffset, selection.focusNode, selection.focusOffset);\n\n var rangeLength = isSelectionCollapsed ? 0 : currentRange.toString().length;\n\n var tempRange = currentRange.cloneRange();\n tempRange.selectNodeContents(node);\n tempRange.setEnd(currentRange.startContainer, currentRange.startOffset);\n\n var isTempRangeCollapsed = isCollapsed(tempRange.startContainer, tempRange.startOffset, tempRange.endContainer, tempRange.endOffset);\n\n var start = isTempRangeCollapsed ? 0 : tempRange.toString().length;\n var end = start + rangeLength;\n\n // Detect whether the selection is backward.\n var detectionRange = document.createRange();\n detectionRange.setStart(anchorNode, anchorOffset);\n detectionRange.setEnd(focusNode, focusOffset);\n var isBackward = detectionRange.collapsed;\n\n return {\n start: isBackward ? end : start,\n end: isBackward ? start : end\n };\n}\n\n/**\n * @param {DOMElement|DOMTextNode} node\n * @param {object} offsets\n */\nfunction setIEOffsets(node, offsets) {\n var range = document.selection.createRange().duplicate();\n var start, end;\n\n if (typeof offsets.end === 'undefined') {\n start = offsets.start;\n end = start;\n } else if (offsets.start > offsets.end) {\n start = offsets.end;\n end = offsets.start;\n } else {\n start = offsets.start;\n end = offsets.end;\n }\n\n range.moveToElementText(node);\n range.moveStart('character', start);\n range.setEndPoint('EndToStart', range);\n range.moveEnd('character', end - start);\n range.select();\n}\n\n/**\n * In modern non-IE browsers, we can support both forward and backward\n * selections.\n *\n * Note: IE10+ supports the Selection object, but it does not support\n * the `extend` method, which means that even in modern IE, it's not possible\n * to programatically create a backward selection. Thus, for all IE\n * versions, we use the old IE API to create our selections.\n *\n * @param {DOMElement|DOMTextNode} node\n * @param {object} offsets\n */\nfunction setModernOffsets(node, offsets) {\n if (!window.getSelection) {\n return;\n }\n\n var selection = window.getSelection();\n var length = node[getTextContentAccessor()].length;\n var start = Math.min(offsets.start, length);\n var end = typeof offsets.end === 'undefined' ? start : Math.min(offsets.end, length);\n\n // IE 11 uses modern selection, but doesn't support the extend method.\n // Flip backward selections, so we can set with a single range.\n if (!selection.extend && start > end) {\n var temp = end;\n end = start;\n start = temp;\n }\n\n var startMarker = getNodeForCharacterOffset(node, start);\n var endMarker = getNodeForCharacterOffset(node, end);\n\n if (startMarker && endMarker) {\n var range = document.createRange();\n range.setStart(startMarker.node, startMarker.offset);\n selection.removeAllRanges();\n\n if (start > end) {\n selection.addRange(range);\n selection.extend(endMarker.node, endMarker.offset);\n } else {\n range.setEnd(endMarker.node, endMarker.offset);\n selection.addRange(range);\n }\n }\n}\n\nvar useIEOffsets = ExecutionEnvironment.canUseDOM && 'selection' in document && !('getSelection' in window);\n\nvar ReactDOMSelection = {\n /**\n * @param {DOMElement} node\n */\n getOffsets: useIEOffsets ? getIEOffsets : getModernOffsets,\n\n /**\n * @param {DOMElement|DOMTextNode} node\n * @param {object} offsets\n */\n setOffsets: useIEOffsets ? setIEOffsets : setModernOffsets\n};\n\nmodule.exports = ReactDOMSelection;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactDOMSelection.js\n ** module id = 126\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule getNodeForCharacterOffset\n */\n\n'use strict';\n\n/**\n * Given any node return the first leaf node without children.\n *\n * @param {DOMElement|DOMTextNode} node\n * @return {DOMElement|DOMTextNode}\n */\nfunction getLeafNode(node) {\n while (node && node.firstChild) {\n node = node.firstChild;\n }\n return node;\n}\n\n/**\n * Get the next sibling within a container. This will walk up the\n * DOM if a node's siblings have been exhausted.\n *\n * @param {DOMElement|DOMTextNode} node\n * @return {?DOMElement|DOMTextNode}\n */\nfunction getSiblingNode(node) {\n while (node) {\n if (node.nextSibling) {\n return node.nextSibling;\n }\n node = node.parentNode;\n }\n}\n\n/**\n * Get object describing the nodes which contain characters at offset.\n *\n * @param {DOMElement|DOMTextNode} root\n * @param {number} offset\n * @return {?object}\n */\nfunction getNodeForCharacterOffset(root, offset) {\n var node = getLeafNode(root);\n var nodeStart = 0;\n var nodeEnd = 0;\n\n while (node) {\n if (node.nodeType === 3) {\n nodeEnd = nodeStart + node.textContent.length;\n\n if (nodeStart <= offset && nodeEnd >= offset) {\n return {\n node: node,\n offset: offset - nodeStart\n };\n }\n\n nodeStart = nodeEnd;\n }\n\n node = getLeafNode(getSiblingNode(node));\n }\n}\n\nmodule.exports = getNodeForCharacterOffset;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/getNodeForCharacterOffset.js\n ** module id = 127\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule getActiveElement\n * @typechecks\n */\n\n/**\n * Same as document.activeElement but wraps in a try-catch block. In IE it is\n * not safe to call document.activeElement if there is nothing focused.\n *\n * The activeElement will be null only if the document or document body is not yet defined.\n */\n'use strict';\n\nfunction getActiveElement() /*?DOMElement*/{\n if (typeof document === 'undefined') {\n return null;\n }\n\n try {\n return document.activeElement || document.body;\n } catch (e) {\n return document.body;\n }\n}\n\nmodule.exports = getActiveElement;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/getActiveElement.js\n ** module id = 128\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule SelectEventPlugin\n */\n\n'use strict';\n\nvar EventConstants = require('./EventConstants');\nvar EventPropagators = require('./EventPropagators');\nvar ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');\nvar ReactInputSelection = require('./ReactInputSelection');\nvar SyntheticEvent = require('./SyntheticEvent');\n\nvar getActiveElement = require('fbjs/lib/getActiveElement');\nvar isTextInputElement = require('./isTextInputElement');\nvar keyOf = require('fbjs/lib/keyOf');\nvar shallowEqual = require('fbjs/lib/shallowEqual');\n\nvar topLevelTypes = EventConstants.topLevelTypes;\n\nvar skipSelectionChangeEvent = ExecutionEnvironment.canUseDOM && 'documentMode' in document && document.documentMode <= 11;\n\nvar eventTypes = {\n select: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onSelect: null }),\n captured: keyOf({ onSelectCapture: null })\n },\n dependencies: [topLevelTypes.topBlur, topLevelTypes.topContextMenu, topLevelTypes.topFocus, topLevelTypes.topKeyDown, topLevelTypes.topMouseDown, topLevelTypes.topMouseUp, topLevelTypes.topSelectionChange]\n }\n};\n\nvar activeElement = null;\nvar activeElementID = null;\nvar lastSelection = null;\nvar mouseDown = false;\n\n// Track whether a listener exists for this plugin. If none exist, we do\n// not extract events.\nvar hasListener = false;\nvar ON_SELECT_KEY = keyOf({ onSelect: null });\n\n/**\n * Get an object which is a unique representation of the current selection.\n *\n * The return value will not be consistent across nodes or browsers, but\n * two identical selections on the same node will return identical objects.\n *\n * @param {DOMElement} node\n * @return {object}\n */\nfunction getSelection(node) {\n if ('selectionStart' in node && ReactInputSelection.hasSelectionCapabilities(node)) {\n return {\n start: node.selectionStart,\n end: node.selectionEnd\n };\n } else if (window.getSelection) {\n var selection = window.getSelection();\n return {\n anchorNode: selection.anchorNode,\n anchorOffset: selection.anchorOffset,\n focusNode: selection.focusNode,\n focusOffset: selection.focusOffset\n };\n } else if (document.selection) {\n var range = document.selection.createRange();\n return {\n parentElement: range.parentElement(),\n text: range.text,\n top: range.boundingTop,\n left: range.boundingLeft\n };\n }\n}\n\n/**\n * Poll selection to see whether it's changed.\n *\n * @param {object} nativeEvent\n * @return {?SyntheticEvent}\n */\nfunction constructSelectEvent(nativeEvent, nativeEventTarget) {\n // Ensure we have the right element, and that the user is not dragging a\n // selection (this matches native `select` event behavior). In HTML5, select\n // fires only on input and textarea thus if there's no focused element we\n // won't dispatch.\n if (mouseDown || activeElement == null || activeElement !== getActiveElement()) {\n return null;\n }\n\n // Only fire when selection has actually changed.\n var currentSelection = getSelection(activeElement);\n if (!lastSelection || !shallowEqual(lastSelection, currentSelection)) {\n lastSelection = currentSelection;\n\n var syntheticEvent = SyntheticEvent.getPooled(eventTypes.select, activeElementID, nativeEvent, nativeEventTarget);\n\n syntheticEvent.type = 'select';\n syntheticEvent.target = activeElement;\n\n EventPropagators.accumulateTwoPhaseDispatches(syntheticEvent);\n\n return syntheticEvent;\n }\n\n return null;\n}\n\n/**\n * This plugin creates an `onSelect` event that normalizes select events\n * across form elements.\n *\n * Supported elements are:\n * - input (see `isTextInputElement`)\n * - textarea\n * - contentEditable\n *\n * This differs from native browser implementations in the following ways:\n * - Fires on contentEditable fields as well as inputs.\n * - Fires for collapsed selection.\n * - Fires after user input.\n */\nvar SelectEventPlugin = {\n\n eventTypes: eventTypes,\n\n /**\n * @param {string} topLevelType Record from `EventConstants`.\n * @param {DOMEventTarget} topLevelTarget The listening component root node.\n * @param {string} topLevelTargetID ID of `topLevelTarget`.\n * @param {object} nativeEvent Native browser event.\n * @return {*} An accumulation of synthetic events.\n * @see {EventPluginHub.extractEvents}\n */\n extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) {\n if (!hasListener) {\n return null;\n }\n\n switch (topLevelType) {\n // Track the input node that has focus.\n case topLevelTypes.topFocus:\n if (isTextInputElement(topLevelTarget) || topLevelTarget.contentEditable === 'true') {\n activeElement = topLevelTarget;\n activeElementID = topLevelTargetID;\n lastSelection = null;\n }\n break;\n case topLevelTypes.topBlur:\n activeElement = null;\n activeElementID = null;\n lastSelection = null;\n break;\n\n // Don't fire the event while the user is dragging. This matches the\n // semantics of the native select event.\n case topLevelTypes.topMouseDown:\n mouseDown = true;\n break;\n case topLevelTypes.topContextMenu:\n case topLevelTypes.topMouseUp:\n mouseDown = false;\n return constructSelectEvent(nativeEvent, nativeEventTarget);\n\n // Chrome and IE fire non-standard event when selection is changed (and\n // sometimes when it hasn't). IE's event fires out of order with respect\n // to key and input events on deletion, so we discard it.\n //\n // Firefox doesn't support selectionchange, so check selection status\n // after each key entry. The selection changes after keydown and before\n // keyup, but we check on keydown as well in the case of holding down a\n // key, when multiple keydown events are fired but only one keyup is.\n // This is also our approach for IE handling, for the reason above.\n case topLevelTypes.topSelectionChange:\n if (skipSelectionChangeEvent) {\n break;\n }\n // falls through\n case topLevelTypes.topKeyDown:\n case topLevelTypes.topKeyUp:\n return constructSelectEvent(nativeEvent, nativeEventTarget);\n }\n\n return null;\n },\n\n didPutListener: function (id, registrationName, listener) {\n if (registrationName === ON_SELECT_KEY) {\n hasListener = true;\n }\n }\n};\n\nmodule.exports = SelectEventPlugin;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/SelectEventPlugin.js\n ** module id = 129\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ServerReactRootIndex\n * @typechecks\n */\n\n'use strict';\n\n/**\n * Size of the reactRoot ID space. We generate random numbers for React root\n * IDs and if there's a collision the events and DOM update system will\n * get confused. In the future we need a way to generate GUIDs but for\n * now this will work on a smaller scale.\n */\nvar GLOBAL_MOUNT_POINT_MAX = Math.pow(2, 53);\n\nvar ServerReactRootIndex = {\n createReactRootIndex: function () {\n return Math.ceil(Math.random() * GLOBAL_MOUNT_POINT_MAX);\n }\n};\n\nmodule.exports = ServerReactRootIndex;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ServerReactRootIndex.js\n ** module id = 130\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule SimpleEventPlugin\n */\n\n'use strict';\n\nvar EventConstants = require('./EventConstants');\nvar EventListener = require('fbjs/lib/EventListener');\nvar EventPropagators = require('./EventPropagators');\nvar ReactMount = require('./ReactMount');\nvar SyntheticClipboardEvent = require('./SyntheticClipboardEvent');\nvar SyntheticEvent = require('./SyntheticEvent');\nvar SyntheticFocusEvent = require('./SyntheticFocusEvent');\nvar SyntheticKeyboardEvent = require('./SyntheticKeyboardEvent');\nvar SyntheticMouseEvent = require('./SyntheticMouseEvent');\nvar SyntheticDragEvent = require('./SyntheticDragEvent');\nvar SyntheticTouchEvent = require('./SyntheticTouchEvent');\nvar SyntheticUIEvent = require('./SyntheticUIEvent');\nvar SyntheticWheelEvent = require('./SyntheticWheelEvent');\n\nvar emptyFunction = require('fbjs/lib/emptyFunction');\nvar getEventCharCode = require('./getEventCharCode');\nvar invariant = require('fbjs/lib/invariant');\nvar keyOf = require('fbjs/lib/keyOf');\n\nvar topLevelTypes = EventConstants.topLevelTypes;\n\nvar eventTypes = {\n abort: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onAbort: true }),\n captured: keyOf({ onAbortCapture: true })\n }\n },\n blur: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onBlur: true }),\n captured: keyOf({ onBlurCapture: true })\n }\n },\n canPlay: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onCanPlay: true }),\n captured: keyOf({ onCanPlayCapture: true })\n }\n },\n canPlayThrough: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onCanPlayThrough: true }),\n captured: keyOf({ onCanPlayThroughCapture: true })\n }\n },\n click: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onClick: true }),\n captured: keyOf({ onClickCapture: true })\n }\n },\n contextMenu: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onContextMenu: true }),\n captured: keyOf({ onContextMenuCapture: true })\n }\n },\n copy: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onCopy: true }),\n captured: keyOf({ onCopyCapture: true })\n }\n },\n cut: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onCut: true }),\n captured: keyOf({ onCutCapture: true })\n }\n },\n doubleClick: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onDoubleClick: true }),\n captured: keyOf({ onDoubleClickCapture: true })\n }\n },\n drag: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onDrag: true }),\n captured: keyOf({ onDragCapture: true })\n }\n },\n dragEnd: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onDragEnd: true }),\n captured: keyOf({ onDragEndCapture: true })\n }\n },\n dragEnter: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onDragEnter: true }),\n captured: keyOf({ onDragEnterCapture: true })\n }\n },\n dragExit: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onDragExit: true }),\n captured: keyOf({ onDragExitCapture: true })\n }\n },\n dragLeave: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onDragLeave: true }),\n captured: keyOf({ onDragLeaveCapture: true })\n }\n },\n dragOver: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onDragOver: true }),\n captured: keyOf({ onDragOverCapture: true })\n }\n },\n dragStart: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onDragStart: true }),\n captured: keyOf({ onDragStartCapture: true })\n }\n },\n drop: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onDrop: true }),\n captured: keyOf({ onDropCapture: true })\n }\n },\n durationChange: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onDurationChange: true }),\n captured: keyOf({ onDurationChangeCapture: true })\n }\n },\n emptied: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onEmptied: true }),\n captured: keyOf({ onEmptiedCapture: true })\n }\n },\n encrypted: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onEncrypted: true }),\n captured: keyOf({ onEncryptedCapture: true })\n }\n },\n ended: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onEnded: true }),\n captured: keyOf({ onEndedCapture: true })\n }\n },\n error: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onError: true }),\n captured: keyOf({ onErrorCapture: true })\n }\n },\n focus: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onFocus: true }),\n captured: keyOf({ onFocusCapture: true })\n }\n },\n input: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onInput: true }),\n captured: keyOf({ onInputCapture: true })\n }\n },\n keyDown: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onKeyDown: true }),\n captured: keyOf({ onKeyDownCapture: true })\n }\n },\n keyPress: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onKeyPress: true }),\n captured: keyOf({ onKeyPressCapture: true })\n }\n },\n keyUp: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onKeyUp: true }),\n captured: keyOf({ onKeyUpCapture: true })\n }\n },\n load: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onLoad: true }),\n captured: keyOf({ onLoadCapture: true })\n }\n },\n loadedData: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onLoadedData: true }),\n captured: keyOf({ onLoadedDataCapture: true })\n }\n },\n loadedMetadata: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onLoadedMetadata: true }),\n captured: keyOf({ onLoadedMetadataCapture: true })\n }\n },\n loadStart: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onLoadStart: true }),\n captured: keyOf({ onLoadStartCapture: true })\n }\n },\n // Note: We do not allow listening to mouseOver events. Instead, use the\n // onMouseEnter/onMouseLeave created by `EnterLeaveEventPlugin`.\n mouseDown: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onMouseDown: true }),\n captured: keyOf({ onMouseDownCapture: true })\n }\n },\n mouseMove: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onMouseMove: true }),\n captured: keyOf({ onMouseMoveCapture: true })\n }\n },\n mouseOut: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onMouseOut: true }),\n captured: keyOf({ onMouseOutCapture: true })\n }\n },\n mouseOver: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onMouseOver: true }),\n captured: keyOf({ onMouseOverCapture: true })\n }\n },\n mouseUp: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onMouseUp: true }),\n captured: keyOf({ onMouseUpCapture: true })\n }\n },\n paste: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onPaste: true }),\n captured: keyOf({ onPasteCapture: true })\n }\n },\n pause: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onPause: true }),\n captured: keyOf({ onPauseCapture: true })\n }\n },\n play: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onPlay: true }),\n captured: keyOf({ onPlayCapture: true })\n }\n },\n playing: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onPlaying: true }),\n captured: keyOf({ onPlayingCapture: true })\n }\n },\n progress: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onProgress: true }),\n captured: keyOf({ onProgressCapture: true })\n }\n },\n rateChange: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onRateChange: true }),\n captured: keyOf({ onRateChangeCapture: true })\n }\n },\n reset: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onReset: true }),\n captured: keyOf({ onResetCapture: true })\n }\n },\n scroll: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onScroll: true }),\n captured: keyOf({ onScrollCapture: true })\n }\n },\n seeked: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onSeeked: true }),\n captured: keyOf({ onSeekedCapture: true })\n }\n },\n seeking: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onSeeking: true }),\n captured: keyOf({ onSeekingCapture: true })\n }\n },\n stalled: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onStalled: true }),\n captured: keyOf({ onStalledCapture: true })\n }\n },\n submit: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onSubmit: true }),\n captured: keyOf({ onSubmitCapture: true })\n }\n },\n suspend: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onSuspend: true }),\n captured: keyOf({ onSuspendCapture: true })\n }\n },\n timeUpdate: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onTimeUpdate: true }),\n captured: keyOf({ onTimeUpdateCapture: true })\n }\n },\n touchCancel: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onTouchCancel: true }),\n captured: keyOf({ onTouchCancelCapture: true })\n }\n },\n touchEnd: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onTouchEnd: true }),\n captured: keyOf({ onTouchEndCapture: true })\n }\n },\n touchMove: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onTouchMove: true }),\n captured: keyOf({ onTouchMoveCapture: true })\n }\n },\n touchStart: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onTouchStart: true }),\n captured: keyOf({ onTouchStartCapture: true })\n }\n },\n volumeChange: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onVolumeChange: true }),\n captured: keyOf({ onVolumeChangeCapture: true })\n }\n },\n waiting: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onWaiting: true }),\n captured: keyOf({ onWaitingCapture: true })\n }\n },\n wheel: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onWheel: true }),\n captured: keyOf({ onWheelCapture: true })\n }\n }\n};\n\nvar topLevelEventsToDispatchConfig = {\n topAbort: eventTypes.abort,\n topBlur: eventTypes.blur,\n topCanPlay: eventTypes.canPlay,\n topCanPlayThrough: eventTypes.canPlayThrough,\n topClick: eventTypes.click,\n topContextMenu: eventTypes.contextMenu,\n topCopy: eventTypes.copy,\n topCut: eventTypes.cut,\n topDoubleClick: eventTypes.doubleClick,\n topDrag: eventTypes.drag,\n topDragEnd: eventTypes.dragEnd,\n topDragEnter: eventTypes.dragEnter,\n topDragExit: eventTypes.dragExit,\n topDragLeave: eventTypes.dragLeave,\n topDragOver: eventTypes.dragOver,\n topDragStart: eventTypes.dragStart,\n topDrop: eventTypes.drop,\n topDurationChange: eventTypes.durationChange,\n topEmptied: eventTypes.emptied,\n topEncrypted: eventTypes.encrypted,\n topEnded: eventTypes.ended,\n topError: eventTypes.error,\n topFocus: eventTypes.focus,\n topInput: eventTypes.input,\n topKeyDown: eventTypes.keyDown,\n topKeyPress: eventTypes.keyPress,\n topKeyUp: eventTypes.keyUp,\n topLoad: eventTypes.load,\n topLoadedData: eventTypes.loadedData,\n topLoadedMetadata: eventTypes.loadedMetadata,\n topLoadStart: eventTypes.loadStart,\n topMouseDown: eventTypes.mouseDown,\n topMouseMove: eventTypes.mouseMove,\n topMouseOut: eventTypes.mouseOut,\n topMouseOver: eventTypes.mouseOver,\n topMouseUp: eventTypes.mouseUp,\n topPaste: eventTypes.paste,\n topPause: eventTypes.pause,\n topPlay: eventTypes.play,\n topPlaying: eventTypes.playing,\n topProgress: eventTypes.progress,\n topRateChange: eventTypes.rateChange,\n topReset: eventTypes.reset,\n topScroll: eventTypes.scroll,\n topSeeked: eventTypes.seeked,\n topSeeking: eventTypes.seeking,\n topStalled: eventTypes.stalled,\n topSubmit: eventTypes.submit,\n topSuspend: eventTypes.suspend,\n topTimeUpdate: eventTypes.timeUpdate,\n topTouchCancel: eventTypes.touchCancel,\n topTouchEnd: eventTypes.touchEnd,\n topTouchMove: eventTypes.touchMove,\n topTouchStart: eventTypes.touchStart,\n topVolumeChange: eventTypes.volumeChange,\n topWaiting: eventTypes.waiting,\n topWheel: eventTypes.wheel\n};\n\nfor (var type in topLevelEventsToDispatchConfig) {\n topLevelEventsToDispatchConfig[type].dependencies = [type];\n}\n\nvar ON_CLICK_KEY = keyOf({ onClick: null });\nvar onClickListeners = {};\n\nvar SimpleEventPlugin = {\n\n eventTypes: eventTypes,\n\n /**\n * @param {string} topLevelType Record from `EventConstants`.\n * @param {DOMEventTarget} topLevelTarget The listening component root node.\n * @param {string} topLevelTargetID ID of `topLevelTarget`.\n * @param {object} nativeEvent Native browser event.\n * @return {*} An accumulation of synthetic events.\n * @see {EventPluginHub.extractEvents}\n */\n extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) {\n var dispatchConfig = topLevelEventsToDispatchConfig[topLevelType];\n if (!dispatchConfig) {\n return null;\n }\n var EventConstructor;\n switch (topLevelType) {\n case topLevelTypes.topAbort:\n case topLevelTypes.topCanPlay:\n case topLevelTypes.topCanPlayThrough:\n case topLevelTypes.topDurationChange:\n case topLevelTypes.topEmptied:\n case topLevelTypes.topEncrypted:\n case topLevelTypes.topEnded:\n case topLevelTypes.topError:\n case topLevelTypes.topInput:\n case topLevelTypes.topLoad:\n case topLevelTypes.topLoadedData:\n case topLevelTypes.topLoadedMetadata:\n case topLevelTypes.topLoadStart:\n case topLevelTypes.topPause:\n case topLevelTypes.topPlay:\n case topLevelTypes.topPlaying:\n case topLevelTypes.topProgress:\n case topLevelTypes.topRateChange:\n case topLevelTypes.topReset:\n case topLevelTypes.topSeeked:\n case topLevelTypes.topSeeking:\n case topLevelTypes.topStalled:\n case topLevelTypes.topSubmit:\n case topLevelTypes.topSuspend:\n case topLevelTypes.topTimeUpdate:\n case topLevelTypes.topVolumeChange:\n case topLevelTypes.topWaiting:\n // HTML Events\n // @see http://www.w3.org/TR/html5/index.html#events-0\n EventConstructor = SyntheticEvent;\n break;\n case topLevelTypes.topKeyPress:\n // FireFox creates a keypress event for function keys too. This removes\n // the unwanted keypress events. Enter is however both printable and\n // non-printable. One would expect Tab to be as well (but it isn't).\n if (getEventCharCode(nativeEvent) === 0) {\n return null;\n }\n /* falls through */\n case topLevelTypes.topKeyDown:\n case topLevelTypes.topKeyUp:\n EventConstructor = SyntheticKeyboardEvent;\n break;\n case topLevelTypes.topBlur:\n case topLevelTypes.topFocus:\n EventConstructor = SyntheticFocusEvent;\n break;\n case topLevelTypes.topClick:\n // Firefox creates a click event on right mouse clicks. This removes the\n // unwanted click events.\n if (nativeEvent.button === 2) {\n return null;\n }\n /* falls through */\n case topLevelTypes.topContextMenu:\n case topLevelTypes.topDoubleClick:\n case topLevelTypes.topMouseDown:\n case topLevelTypes.topMouseMove:\n case topLevelTypes.topMouseOut:\n case topLevelTypes.topMouseOver:\n case topLevelTypes.topMouseUp:\n EventConstructor = SyntheticMouseEvent;\n break;\n case topLevelTypes.topDrag:\n case topLevelTypes.topDragEnd:\n case topLevelTypes.topDragEnter:\n case topLevelTypes.topDragExit:\n case topLevelTypes.topDragLeave:\n case topLevelTypes.topDragOver:\n case topLevelTypes.topDragStart:\n case topLevelTypes.topDrop:\n EventConstructor = SyntheticDragEvent;\n break;\n case topLevelTypes.topTouchCancel:\n case topLevelTypes.topTouchEnd:\n case topLevelTypes.topTouchMove:\n case topLevelTypes.topTouchStart:\n EventConstructor = SyntheticTouchEvent;\n break;\n case topLevelTypes.topScroll:\n EventConstructor = SyntheticUIEvent;\n break;\n case topLevelTypes.topWheel:\n EventConstructor = SyntheticWheelEvent;\n break;\n case topLevelTypes.topCopy:\n case topLevelTypes.topCut:\n case topLevelTypes.topPaste:\n EventConstructor = SyntheticClipboardEvent;\n break;\n }\n !EventConstructor ? process.env.NODE_ENV !== 'production' ? invariant(false, 'SimpleEventPlugin: Unhandled event type, `%s`.', topLevelType) : invariant(false) : undefined;\n var event = EventConstructor.getPooled(dispatchConfig, topLevelTargetID, nativeEvent, nativeEventTarget);\n EventPropagators.accumulateTwoPhaseDispatches(event);\n return event;\n },\n\n didPutListener: function (id, registrationName, listener) {\n // Mobile Safari does not fire properly bubble click events on\n // non-interactive elements, which means delegated click listeners do not\n // fire. The workaround for this bug involves attaching an empty click\n // listener on the target node.\n if (registrationName === ON_CLICK_KEY) {\n var node = ReactMount.getNode(id);\n if (!onClickListeners[id]) {\n onClickListeners[id] = EventListener.listen(node, 'click', emptyFunction);\n }\n }\n },\n\n willDeleteListener: function (id, registrationName) {\n if (registrationName === ON_CLICK_KEY) {\n onClickListeners[id].remove();\n delete onClickListeners[id];\n }\n }\n\n};\n\nmodule.exports = SimpleEventPlugin;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/SimpleEventPlugin.js\n ** module id = 131\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule SyntheticClipboardEvent\n * @typechecks static-only\n */\n\n'use strict';\n\nvar SyntheticEvent = require('./SyntheticEvent');\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/clipboard-apis/\n */\nvar ClipboardEventInterface = {\n clipboardData: function (event) {\n return 'clipboardData' in event ? event.clipboardData : window.clipboardData;\n }\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticUIEvent}\n */\nfunction SyntheticClipboardEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticEvent.augmentClass(SyntheticClipboardEvent, ClipboardEventInterface);\n\nmodule.exports = SyntheticClipboardEvent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/SyntheticClipboardEvent.js\n ** module id = 132\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule SyntheticFocusEvent\n * @typechecks static-only\n */\n\n'use strict';\n\nvar SyntheticUIEvent = require('./SyntheticUIEvent');\n\n/**\n * @interface FocusEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\nvar FocusEventInterface = {\n relatedTarget: null\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticUIEvent}\n */\nfunction SyntheticFocusEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticUIEvent.augmentClass(SyntheticFocusEvent, FocusEventInterface);\n\nmodule.exports = SyntheticFocusEvent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/SyntheticFocusEvent.js\n ** module id = 133\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule SyntheticKeyboardEvent\n * @typechecks static-only\n */\n\n'use strict';\n\nvar SyntheticUIEvent = require('./SyntheticUIEvent');\n\nvar getEventCharCode = require('./getEventCharCode');\nvar getEventKey = require('./getEventKey');\nvar getEventModifierState = require('./getEventModifierState');\n\n/**\n * @interface KeyboardEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\nvar KeyboardEventInterface = {\n key: getEventKey,\n location: null,\n ctrlKey: null,\n shiftKey: null,\n altKey: null,\n metaKey: null,\n repeat: null,\n locale: null,\n getModifierState: getEventModifierState,\n // Legacy Interface\n charCode: function (event) {\n // `charCode` is the result of a KeyPress event and represents the value of\n // the actual printable character.\n\n // KeyPress is deprecated, but its replacement is not yet final and not\n // implemented in any major browser. Only KeyPress has charCode.\n if (event.type === 'keypress') {\n return getEventCharCode(event);\n }\n return 0;\n },\n keyCode: function (event) {\n // `keyCode` is the result of a KeyDown/Up event and represents the value of\n // physical keyboard key.\n\n // The actual meaning of the value depends on the users' keyboard layout\n // which cannot be detected. Assuming that it is a US keyboard layout\n // provides a surprisingly accurate mapping for US and European users.\n // Due to this, it is left to the user to implement at this time.\n if (event.type === 'keydown' || event.type === 'keyup') {\n return event.keyCode;\n }\n return 0;\n },\n which: function (event) {\n // `which` is an alias for either `keyCode` or `charCode` depending on the\n // type of the event.\n if (event.type === 'keypress') {\n return getEventCharCode(event);\n }\n if (event.type === 'keydown' || event.type === 'keyup') {\n return event.keyCode;\n }\n return 0;\n }\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticUIEvent}\n */\nfunction SyntheticKeyboardEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticUIEvent.augmentClass(SyntheticKeyboardEvent, KeyboardEventInterface);\n\nmodule.exports = SyntheticKeyboardEvent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/SyntheticKeyboardEvent.js\n ** module id = 134\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule getEventCharCode\n * @typechecks static-only\n */\n\n'use strict';\n\n/**\n * `charCode` represents the actual \"character code\" and is safe to use with\n * `String.fromCharCode`. As such, only keys that correspond to printable\n * characters produce a valid `charCode`, the only exception to this is Enter.\n * The Tab-key is considered non-printable and does not have a `charCode`,\n * presumably because it does not produce a tab-character in browsers.\n *\n * @param {object} nativeEvent Native browser event.\n * @return {number} Normalized `charCode` property.\n */\nfunction getEventCharCode(nativeEvent) {\n var charCode;\n var keyCode = nativeEvent.keyCode;\n\n if ('charCode' in nativeEvent) {\n charCode = nativeEvent.charCode;\n\n // FF does not set `charCode` for the Enter-key, check against `keyCode`.\n if (charCode === 0 && keyCode === 13) {\n charCode = 13;\n }\n } else {\n // IE8 does not implement `charCode`, but `keyCode` has the correct value.\n charCode = keyCode;\n }\n\n // Some non-printable keys are reported in `charCode`/`keyCode`, discard them.\n // Must not discard the (non-)printable Enter-key.\n if (charCode >= 32 || charCode === 13) {\n return charCode;\n }\n\n return 0;\n}\n\nmodule.exports = getEventCharCode;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/getEventCharCode.js\n ** module id = 135\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule getEventKey\n * @typechecks static-only\n */\n\n'use strict';\n\nvar getEventCharCode = require('./getEventCharCode');\n\n/**\n * Normalization of deprecated HTML5 `key` values\n * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names\n */\nvar normalizeKey = {\n 'Esc': 'Escape',\n 'Spacebar': ' ',\n 'Left': 'ArrowLeft',\n 'Up': 'ArrowUp',\n 'Right': 'ArrowRight',\n 'Down': 'ArrowDown',\n 'Del': 'Delete',\n 'Win': 'OS',\n 'Menu': 'ContextMenu',\n 'Apps': 'ContextMenu',\n 'Scroll': 'ScrollLock',\n 'MozPrintableKey': 'Unidentified'\n};\n\n/**\n * Translation from legacy `keyCode` to HTML5 `key`\n * Only special keys supported, all others depend on keyboard layout or browser\n * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names\n */\nvar translateToKey = {\n 8: 'Backspace',\n 9: 'Tab',\n 12: 'Clear',\n 13: 'Enter',\n 16: 'Shift',\n 17: 'Control',\n 18: 'Alt',\n 19: 'Pause',\n 20: 'CapsLock',\n 27: 'Escape',\n 32: ' ',\n 33: 'PageUp',\n 34: 'PageDown',\n 35: 'End',\n 36: 'Home',\n 37: 'ArrowLeft',\n 38: 'ArrowUp',\n 39: 'ArrowRight',\n 40: 'ArrowDown',\n 45: 'Insert',\n 46: 'Delete',\n 112: 'F1', 113: 'F2', 114: 'F3', 115: 'F4', 116: 'F5', 117: 'F6',\n 118: 'F7', 119: 'F8', 120: 'F9', 121: 'F10', 122: 'F11', 123: 'F12',\n 144: 'NumLock',\n 145: 'ScrollLock',\n 224: 'Meta'\n};\n\n/**\n * @param {object} nativeEvent Native browser event.\n * @return {string} Normalized `key` property.\n */\nfunction getEventKey(nativeEvent) {\n if (nativeEvent.key) {\n // Normalize inconsistent values reported by browsers due to\n // implementations of a working draft specification.\n\n // FireFox implements `key` but returns `MozPrintableKey` for all\n // printable characters (normalized to `Unidentified`), ignore it.\n var key = normalizeKey[nativeEvent.key] || nativeEvent.key;\n if (key !== 'Unidentified') {\n return key;\n }\n }\n\n // Browser does not implement `key`, polyfill as much of it as we can.\n if (nativeEvent.type === 'keypress') {\n var charCode = getEventCharCode(nativeEvent);\n\n // The enter-key is technically both printable and non-printable and can\n // thus be captured by `keypress`, no other non-printable key should.\n return charCode === 13 ? 'Enter' : String.fromCharCode(charCode);\n }\n if (nativeEvent.type === 'keydown' || nativeEvent.type === 'keyup') {\n // While user keyboard layout determines the actual meaning of each\n // `keyCode` value, almost all function keys have a universal value.\n return translateToKey[nativeEvent.keyCode] || 'Unidentified';\n }\n return '';\n}\n\nmodule.exports = getEventKey;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/getEventKey.js\n ** module id = 136\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule SyntheticDragEvent\n * @typechecks static-only\n */\n\n'use strict';\n\nvar SyntheticMouseEvent = require('./SyntheticMouseEvent');\n\n/**\n * @interface DragEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\nvar DragEventInterface = {\n dataTransfer: null\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticUIEvent}\n */\nfunction SyntheticDragEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n SyntheticMouseEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticMouseEvent.augmentClass(SyntheticDragEvent, DragEventInterface);\n\nmodule.exports = SyntheticDragEvent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/SyntheticDragEvent.js\n ** module id = 137\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule SyntheticTouchEvent\n * @typechecks static-only\n */\n\n'use strict';\n\nvar SyntheticUIEvent = require('./SyntheticUIEvent');\n\nvar getEventModifierState = require('./getEventModifierState');\n\n/**\n * @interface TouchEvent\n * @see http://www.w3.org/TR/touch-events/\n */\nvar TouchEventInterface = {\n touches: null,\n targetTouches: null,\n changedTouches: null,\n altKey: null,\n metaKey: null,\n ctrlKey: null,\n shiftKey: null,\n getModifierState: getEventModifierState\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticUIEvent}\n */\nfunction SyntheticTouchEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticUIEvent.augmentClass(SyntheticTouchEvent, TouchEventInterface);\n\nmodule.exports = SyntheticTouchEvent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/SyntheticTouchEvent.js\n ** module id = 138\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule SyntheticWheelEvent\n * @typechecks static-only\n */\n\n'use strict';\n\nvar SyntheticMouseEvent = require('./SyntheticMouseEvent');\n\n/**\n * @interface WheelEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\nvar WheelEventInterface = {\n deltaX: function (event) {\n return 'deltaX' in event ? event.deltaX :\n // Fallback to `wheelDeltaX` for Webkit and normalize (right is positive).\n 'wheelDeltaX' in event ? -event.wheelDeltaX : 0;\n },\n deltaY: function (event) {\n return 'deltaY' in event ? event.deltaY :\n // Fallback to `wheelDeltaY` for Webkit and normalize (down is positive).\n 'wheelDeltaY' in event ? -event.wheelDeltaY :\n // Fallback to `wheelDelta` for IE<9 and normalize (down is positive).\n 'wheelDelta' in event ? -event.wheelDelta : 0;\n },\n deltaZ: null,\n\n // Browsers without \"deltaMode\" is reporting in raw wheel delta where one\n // notch on the scroll is always +/- 120, roughly equivalent to pixels.\n // A good approximation of DOM_DELTA_LINE (1) is 5% of viewport size or\n // ~40 pixels, for DOM_DELTA_SCREEN (2) it is 87.5% of viewport size.\n deltaMode: null\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticMouseEvent}\n */\nfunction SyntheticWheelEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n SyntheticMouseEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticMouseEvent.augmentClass(SyntheticWheelEvent, WheelEventInterface);\n\nmodule.exports = SyntheticWheelEvent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/SyntheticWheelEvent.js\n ** module id = 139\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule SVGDOMPropertyConfig\n */\n\n'use strict';\n\nvar DOMProperty = require('./DOMProperty');\n\nvar MUST_USE_ATTRIBUTE = DOMProperty.injection.MUST_USE_ATTRIBUTE;\n\nvar NS = {\n xlink: 'http://www.w3.org/1999/xlink',\n xml: 'http://www.w3.org/XML/1998/namespace'\n};\n\nvar SVGDOMPropertyConfig = {\n Properties: {\n clipPath: MUST_USE_ATTRIBUTE,\n cx: MUST_USE_ATTRIBUTE,\n cy: MUST_USE_ATTRIBUTE,\n d: MUST_USE_ATTRIBUTE,\n dx: MUST_USE_ATTRIBUTE,\n dy: MUST_USE_ATTRIBUTE,\n fill: MUST_USE_ATTRIBUTE,\n fillOpacity: MUST_USE_ATTRIBUTE,\n fontFamily: MUST_USE_ATTRIBUTE,\n fontSize: MUST_USE_ATTRIBUTE,\n fx: MUST_USE_ATTRIBUTE,\n fy: MUST_USE_ATTRIBUTE,\n gradientTransform: MUST_USE_ATTRIBUTE,\n gradientUnits: MUST_USE_ATTRIBUTE,\n markerEnd: MUST_USE_ATTRIBUTE,\n markerMid: MUST_USE_ATTRIBUTE,\n markerStart: MUST_USE_ATTRIBUTE,\n offset: MUST_USE_ATTRIBUTE,\n opacity: MUST_USE_ATTRIBUTE,\n patternContentUnits: MUST_USE_ATTRIBUTE,\n patternUnits: MUST_USE_ATTRIBUTE,\n points: MUST_USE_ATTRIBUTE,\n preserveAspectRatio: MUST_USE_ATTRIBUTE,\n r: MUST_USE_ATTRIBUTE,\n rx: MUST_USE_ATTRIBUTE,\n ry: MUST_USE_ATTRIBUTE,\n spreadMethod: MUST_USE_ATTRIBUTE,\n stopColor: MUST_USE_ATTRIBUTE,\n stopOpacity: MUST_USE_ATTRIBUTE,\n stroke: MUST_USE_ATTRIBUTE,\n strokeDasharray: MUST_USE_ATTRIBUTE,\n strokeLinecap: MUST_USE_ATTRIBUTE,\n strokeOpacity: MUST_USE_ATTRIBUTE,\n strokeWidth: MUST_USE_ATTRIBUTE,\n textAnchor: MUST_USE_ATTRIBUTE,\n transform: MUST_USE_ATTRIBUTE,\n version: MUST_USE_ATTRIBUTE,\n viewBox: MUST_USE_ATTRIBUTE,\n x1: MUST_USE_ATTRIBUTE,\n x2: MUST_USE_ATTRIBUTE,\n x: MUST_USE_ATTRIBUTE,\n xlinkActuate: MUST_USE_ATTRIBUTE,\n xlinkArcrole: MUST_USE_ATTRIBUTE,\n xlinkHref: MUST_USE_ATTRIBUTE,\n xlinkRole: MUST_USE_ATTRIBUTE,\n xlinkShow: MUST_USE_ATTRIBUTE,\n xlinkTitle: MUST_USE_ATTRIBUTE,\n xlinkType: MUST_USE_ATTRIBUTE,\n xmlBase: MUST_USE_ATTRIBUTE,\n xmlLang: MUST_USE_ATTRIBUTE,\n xmlSpace: MUST_USE_ATTRIBUTE,\n y1: MUST_USE_ATTRIBUTE,\n y2: MUST_USE_ATTRIBUTE,\n y: MUST_USE_ATTRIBUTE\n },\n DOMAttributeNamespaces: {\n xlinkActuate: NS.xlink,\n xlinkArcrole: NS.xlink,\n xlinkHref: NS.xlink,\n xlinkRole: NS.xlink,\n xlinkShow: NS.xlink,\n xlinkTitle: NS.xlink,\n xlinkType: NS.xlink,\n xmlBase: NS.xml,\n xmlLang: NS.xml,\n xmlSpace: NS.xml\n },\n DOMAttributeNames: {\n clipPath: 'clip-path',\n fillOpacity: 'fill-opacity',\n fontFamily: 'font-family',\n fontSize: 'font-size',\n gradientTransform: 'gradientTransform',\n gradientUnits: 'gradientUnits',\n markerEnd: 'marker-end',\n markerMid: 'marker-mid',\n markerStart: 'marker-start',\n patternContentUnits: 'patternContentUnits',\n patternUnits: 'patternUnits',\n preserveAspectRatio: 'preserveAspectRatio',\n spreadMethod: 'spreadMethod',\n stopColor: 'stop-color',\n stopOpacity: 'stop-opacity',\n strokeDasharray: 'stroke-dasharray',\n strokeLinecap: 'stroke-linecap',\n strokeOpacity: 'stroke-opacity',\n strokeWidth: 'stroke-width',\n textAnchor: 'text-anchor',\n viewBox: 'viewBox',\n xlinkActuate: 'xlink:actuate',\n xlinkArcrole: 'xlink:arcrole',\n xlinkHref: 'xlink:href',\n xlinkRole: 'xlink:role',\n xlinkShow: 'xlink:show',\n xlinkTitle: 'xlink:title',\n xlinkType: 'xlink:type',\n xmlBase: 'xml:base',\n xmlLang: 'xml:lang',\n xmlSpace: 'xml:space'\n }\n};\n\nmodule.exports = SVGDOMPropertyConfig;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/SVGDOMPropertyConfig.js\n ** module id = 140\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactDefaultPerf\n * @typechecks static-only\n */\n\n'use strict';\n\nvar DOMProperty = require('./DOMProperty');\nvar ReactDefaultPerfAnalysis = require('./ReactDefaultPerfAnalysis');\nvar ReactMount = require('./ReactMount');\nvar ReactPerf = require('./ReactPerf');\n\nvar performanceNow = require('fbjs/lib/performanceNow');\n\nfunction roundFloat(val) {\n return Math.floor(val * 100) / 100;\n}\n\nfunction addValue(obj, key, val) {\n obj[key] = (obj[key] || 0) + val;\n}\n\nvar ReactDefaultPerf = {\n _allMeasurements: [], // last item in the list is the current one\n _mountStack: [0],\n _injected: false,\n\n start: function () {\n if (!ReactDefaultPerf._injected) {\n ReactPerf.injection.injectMeasure(ReactDefaultPerf.measure);\n }\n\n ReactDefaultPerf._allMeasurements.length = 0;\n ReactPerf.enableMeasure = true;\n },\n\n stop: function () {\n ReactPerf.enableMeasure = false;\n },\n\n getLastMeasurements: function () {\n return ReactDefaultPerf._allMeasurements;\n },\n\n printExclusive: function (measurements) {\n measurements = measurements || ReactDefaultPerf._allMeasurements;\n var summary = ReactDefaultPerfAnalysis.getExclusiveSummary(measurements);\n console.table(summary.map(function (item) {\n return {\n 'Component class name': item.componentName,\n 'Total inclusive time (ms)': roundFloat(item.inclusive),\n 'Exclusive mount time (ms)': roundFloat(item.exclusive),\n 'Exclusive render time (ms)': roundFloat(item.render),\n 'Mount time per instance (ms)': roundFloat(item.exclusive / item.count),\n 'Render time per instance (ms)': roundFloat(item.render / item.count),\n 'Instances': item.count\n };\n }));\n // TODO: ReactDefaultPerfAnalysis.getTotalTime() does not return the correct\n // number.\n },\n\n printInclusive: function (measurements) {\n measurements = measurements || ReactDefaultPerf._allMeasurements;\n var summary = ReactDefaultPerfAnalysis.getInclusiveSummary(measurements);\n console.table(summary.map(function (item) {\n return {\n 'Owner > component': item.componentName,\n 'Inclusive time (ms)': roundFloat(item.time),\n 'Instances': item.count\n };\n }));\n console.log('Total time:', ReactDefaultPerfAnalysis.getTotalTime(measurements).toFixed(2) + ' ms');\n },\n\n getMeasurementsSummaryMap: function (measurements) {\n var summary = ReactDefaultPerfAnalysis.getInclusiveSummary(measurements, true);\n return summary.map(function (item) {\n return {\n 'Owner > component': item.componentName,\n 'Wasted time (ms)': item.time,\n 'Instances': item.count\n };\n });\n },\n\n printWasted: function (measurements) {\n measurements = measurements || ReactDefaultPerf._allMeasurements;\n console.table(ReactDefaultPerf.getMeasurementsSummaryMap(measurements));\n console.log('Total time:', ReactDefaultPerfAnalysis.getTotalTime(measurements).toFixed(2) + ' ms');\n },\n\n printDOM: function (measurements) {\n measurements = measurements || ReactDefaultPerf._allMeasurements;\n var summary = ReactDefaultPerfAnalysis.getDOMSummary(measurements);\n console.table(summary.map(function (item) {\n var result = {};\n result[DOMProperty.ID_ATTRIBUTE_NAME] = item.id;\n result.type = item.type;\n result.args = JSON.stringify(item.args);\n return result;\n }));\n console.log('Total time:', ReactDefaultPerfAnalysis.getTotalTime(measurements).toFixed(2) + ' ms');\n },\n\n _recordWrite: function (id, fnName, totalTime, args) {\n // TODO: totalTime isn't that useful since it doesn't count paints/reflows\n var writes = ReactDefaultPerf._allMeasurements[ReactDefaultPerf._allMeasurements.length - 1].writes;\n writes[id] = writes[id] || [];\n writes[id].push({\n type: fnName,\n time: totalTime,\n args: args\n });\n },\n\n measure: function (moduleName, fnName, func) {\n return function () {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n var totalTime;\n var rv;\n var start;\n\n if (fnName === '_renderNewRootComponent' || fnName === 'flushBatchedUpdates') {\n // A \"measurement\" is a set of metrics recorded for each flush. We want\n // to group the metrics for a given flush together so we can look at the\n // components that rendered and the DOM operations that actually\n // happened to determine the amount of \"wasted work\" performed.\n ReactDefaultPerf._allMeasurements.push({\n exclusive: {},\n inclusive: {},\n render: {},\n counts: {},\n writes: {},\n displayNames: {},\n totalTime: 0,\n created: {}\n });\n start = performanceNow();\n rv = func.apply(this, args);\n ReactDefaultPerf._allMeasurements[ReactDefaultPerf._allMeasurements.length - 1].totalTime = performanceNow() - start;\n return rv;\n } else if (fnName === '_mountImageIntoNode' || moduleName === 'ReactBrowserEventEmitter' || moduleName === 'ReactDOMIDOperations' || moduleName === 'CSSPropertyOperations' || moduleName === 'DOMChildrenOperations' || moduleName === 'DOMPropertyOperations') {\n start = performanceNow();\n rv = func.apply(this, args);\n totalTime = performanceNow() - start;\n\n if (fnName === '_mountImageIntoNode') {\n var mountID = ReactMount.getID(args[1]);\n ReactDefaultPerf._recordWrite(mountID, fnName, totalTime, args[0]);\n } else if (fnName === 'dangerouslyProcessChildrenUpdates') {\n // special format\n args[0].forEach(function (update) {\n var writeArgs = {};\n if (update.fromIndex !== null) {\n writeArgs.fromIndex = update.fromIndex;\n }\n if (update.toIndex !== null) {\n writeArgs.toIndex = update.toIndex;\n }\n if (update.textContent !== null) {\n writeArgs.textContent = update.textContent;\n }\n if (update.markupIndex !== null) {\n writeArgs.markup = args[1][update.markupIndex];\n }\n ReactDefaultPerf._recordWrite(update.parentID, update.type, totalTime, writeArgs);\n });\n } else {\n // basic format\n var id = args[0];\n if (typeof id === 'object') {\n id = ReactMount.getID(args[0]);\n }\n ReactDefaultPerf._recordWrite(id, fnName, totalTime, Array.prototype.slice.call(args, 1));\n }\n return rv;\n } else if (moduleName === 'ReactCompositeComponent' && (fnName === 'mountComponent' || fnName === 'updateComponent' || // TODO: receiveComponent()?\n fnName === '_renderValidatedComponent')) {\n\n if (this._currentElement.type === ReactMount.TopLevelWrapper) {\n return func.apply(this, args);\n }\n\n var rootNodeID = fnName === 'mountComponent' ? args[0] : this._rootNodeID;\n var isRender = fnName === '_renderValidatedComponent';\n var isMount = fnName === 'mountComponent';\n\n var mountStack = ReactDefaultPerf._mountStack;\n var entry = ReactDefaultPerf._allMeasurements[ReactDefaultPerf._allMeasurements.length - 1];\n\n if (isRender) {\n addValue(entry.counts, rootNodeID, 1);\n } else if (isMount) {\n entry.created[rootNodeID] = true;\n mountStack.push(0);\n }\n\n start = performanceNow();\n rv = func.apply(this, args);\n totalTime = performanceNow() - start;\n\n if (isRender) {\n addValue(entry.render, rootNodeID, totalTime);\n } else if (isMount) {\n var subMountTime = mountStack.pop();\n mountStack[mountStack.length - 1] += totalTime;\n addValue(entry.exclusive, rootNodeID, totalTime - subMountTime);\n addValue(entry.inclusive, rootNodeID, totalTime);\n } else {\n addValue(entry.inclusive, rootNodeID, totalTime);\n }\n\n entry.displayNames[rootNodeID] = {\n current: this.getName(),\n owner: this._currentElement._owner ? this._currentElement._owner.getName() : '<root>'\n };\n\n return rv;\n } else {\n return func.apply(this, args);\n }\n };\n }\n};\n\nmodule.exports = ReactDefaultPerf;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactDefaultPerf.js\n ** module id = 141\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactDefaultPerfAnalysis\n */\n\n'use strict';\n\nvar assign = require('./Object.assign');\n\n// Don't try to save users less than 1.2ms (a number I made up)\nvar DONT_CARE_THRESHOLD = 1.2;\nvar DOM_OPERATION_TYPES = {\n '_mountImageIntoNode': 'set innerHTML',\n INSERT_MARKUP: 'set innerHTML',\n MOVE_EXISTING: 'move',\n REMOVE_NODE: 'remove',\n SET_MARKUP: 'set innerHTML',\n TEXT_CONTENT: 'set textContent',\n 'setValueForProperty': 'update attribute',\n 'setValueForAttribute': 'update attribute',\n 'deleteValueForProperty': 'remove attribute',\n 'dangerouslyReplaceNodeWithMarkupByID': 'replace'\n};\n\nfunction getTotalTime(measurements) {\n // TODO: return number of DOM ops? could be misleading.\n // TODO: measure dropped frames after reconcile?\n // TODO: log total time of each reconcile and the top-level component\n // class that triggered it.\n var totalTime = 0;\n for (var i = 0; i < measurements.length; i++) {\n var measurement = measurements[i];\n totalTime += measurement.totalTime;\n }\n return totalTime;\n}\n\nfunction getDOMSummary(measurements) {\n var items = [];\n measurements.forEach(function (measurement) {\n Object.keys(measurement.writes).forEach(function (id) {\n measurement.writes[id].forEach(function (write) {\n items.push({\n id: id,\n type: DOM_OPERATION_TYPES[write.type] || write.type,\n args: write.args\n });\n });\n });\n });\n return items;\n}\n\nfunction getExclusiveSummary(measurements) {\n var candidates = {};\n var displayName;\n\n for (var i = 0; i < measurements.length; i++) {\n var measurement = measurements[i];\n var allIDs = assign({}, measurement.exclusive, measurement.inclusive);\n\n for (var id in allIDs) {\n displayName = measurement.displayNames[id].current;\n\n candidates[displayName] = candidates[displayName] || {\n componentName: displayName,\n inclusive: 0,\n exclusive: 0,\n render: 0,\n count: 0\n };\n if (measurement.render[id]) {\n candidates[displayName].render += measurement.render[id];\n }\n if (measurement.exclusive[id]) {\n candidates[displayName].exclusive += measurement.exclusive[id];\n }\n if (measurement.inclusive[id]) {\n candidates[displayName].inclusive += measurement.inclusive[id];\n }\n if (measurement.counts[id]) {\n candidates[displayName].count += measurement.counts[id];\n }\n }\n }\n\n // Now make a sorted array with the results.\n var arr = [];\n for (displayName in candidates) {\n if (candidates[displayName].exclusive >= DONT_CARE_THRESHOLD) {\n arr.push(candidates[displayName]);\n }\n }\n\n arr.sort(function (a, b) {\n return b.exclusive - a.exclusive;\n });\n\n return arr;\n}\n\nfunction getInclusiveSummary(measurements, onlyClean) {\n var candidates = {};\n var inclusiveKey;\n\n for (var i = 0; i < measurements.length; i++) {\n var measurement = measurements[i];\n var allIDs = assign({}, measurement.exclusive, measurement.inclusive);\n var cleanComponents;\n\n if (onlyClean) {\n cleanComponents = getUnchangedComponents(measurement);\n }\n\n for (var id in allIDs) {\n if (onlyClean && !cleanComponents[id]) {\n continue;\n }\n\n var displayName = measurement.displayNames[id];\n\n // Inclusive time is not useful for many components without knowing where\n // they are instantiated. So we aggregate inclusive time with both the\n // owner and current displayName as the key.\n inclusiveKey = displayName.owner + ' > ' + displayName.current;\n\n candidates[inclusiveKey] = candidates[inclusiveKey] || {\n componentName: inclusiveKey,\n time: 0,\n count: 0\n };\n\n if (measurement.inclusive[id]) {\n candidates[inclusiveKey].time += measurement.inclusive[id];\n }\n if (measurement.counts[id]) {\n candidates[inclusiveKey].count += measurement.counts[id];\n }\n }\n }\n\n // Now make a sorted array with the results.\n var arr = [];\n for (inclusiveKey in candidates) {\n if (candidates[inclusiveKey].time >= DONT_CARE_THRESHOLD) {\n arr.push(candidates[inclusiveKey]);\n }\n }\n\n arr.sort(function (a, b) {\n return b.time - a.time;\n });\n\n return arr;\n}\n\nfunction getUnchangedComponents(measurement) {\n // For a given reconcile, look at which components did not actually\n // render anything to the DOM and return a mapping of their ID to\n // the amount of time it took to render the entire subtree.\n var cleanComponents = {};\n var dirtyLeafIDs = Object.keys(measurement.writes);\n var allIDs = assign({}, measurement.exclusive, measurement.inclusive);\n\n for (var id in allIDs) {\n var isDirty = false;\n // For each component that rendered, see if a component that triggered\n // a DOM op is in its subtree.\n for (var i = 0; i < dirtyLeafIDs.length; i++) {\n if (dirtyLeafIDs[i].indexOf(id) === 0) {\n isDirty = true;\n break;\n }\n }\n // check if component newly created\n if (measurement.created[id]) {\n isDirty = true;\n }\n if (!isDirty && measurement.counts[id] > 0) {\n cleanComponents[id] = true;\n }\n }\n return cleanComponents;\n}\n\nvar ReactDefaultPerfAnalysis = {\n getExclusiveSummary: getExclusiveSummary,\n getInclusiveSummary: getInclusiveSummary,\n getDOMSummary: getDOMSummary,\n getTotalTime: getTotalTime\n};\n\nmodule.exports = ReactDefaultPerfAnalysis;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactDefaultPerfAnalysis.js\n ** module id = 142\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule performanceNow\n * @typechecks\n */\n\n'use strict';\n\nvar performance = require('./performance');\nvar curPerformance = performance;\n\n/**\n * Detect if we can use `window.performance.now()` and gracefully fallback to\n * `Date.now()` if it doesn't exist. We need to support Firefox < 15 for now\n * because of Facebook's testing infrastructure.\n */\nif (!curPerformance || !curPerformance.now) {\n curPerformance = Date;\n}\n\nvar performanceNow = curPerformance.now.bind(curPerformance);\n\nmodule.exports = performanceNow;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/performanceNow.js\n ** module id = 143\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule performance\n * @typechecks\n */\n\n'use strict';\n\nvar ExecutionEnvironment = require('./ExecutionEnvironment');\n\nvar performance;\n\nif (ExecutionEnvironment.canUseDOM) {\n performance = window.performance || window.msPerformance || window.webkitPerformance;\n}\n\nmodule.exports = performance || {};\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/performance.js\n ** module id = 144\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactVersion\n */\n\n'use strict';\n\nmodule.exports = '0.14.3';\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactVersion.js\n ** module id = 145\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n* @providesModule renderSubtreeIntoContainer\n*/\n\n'use strict';\n\nvar ReactMount = require('./ReactMount');\n\nmodule.exports = ReactMount.renderSubtreeIntoContainer;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/renderSubtreeIntoContainer.js\n ** module id = 146\n ** module chunks = 0 1\n **/","'use strict';\n\nmodule.exports = require('./lib/React');\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/react.js\n ** module id = 147\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule React\n */\n\n'use strict';\n\nvar ReactDOM = require('./ReactDOM');\nvar ReactDOMServer = require('./ReactDOMServer');\nvar ReactIsomorphic = require('./ReactIsomorphic');\n\nvar assign = require('./Object.assign');\nvar deprecated = require('./deprecated');\n\n// `version` will be added here by ReactIsomorphic.\nvar React = {};\n\nassign(React, ReactIsomorphic);\n\nassign(React, {\n // ReactDOM\n findDOMNode: deprecated('findDOMNode', 'ReactDOM', 'react-dom', ReactDOM, ReactDOM.findDOMNode),\n render: deprecated('render', 'ReactDOM', 'react-dom', ReactDOM, ReactDOM.render),\n unmountComponentAtNode: deprecated('unmountComponentAtNode', 'ReactDOM', 'react-dom', ReactDOM, ReactDOM.unmountComponentAtNode),\n\n // ReactDOMServer\n renderToString: deprecated('renderToString', 'ReactDOMServer', 'react-dom/server', ReactDOMServer, ReactDOMServer.renderToString),\n renderToStaticMarkup: deprecated('renderToStaticMarkup', 'ReactDOMServer', 'react-dom/server', ReactDOMServer, ReactDOMServer.renderToStaticMarkup)\n});\n\nReact.__SECRET_DOM_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ReactDOM;\nReact.__SECRET_DOM_SERVER_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ReactDOMServer;\n\nmodule.exports = React;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/React.js\n ** module id = 148\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactDOMServer\n */\n\n'use strict';\n\nvar ReactDefaultInjection = require('./ReactDefaultInjection');\nvar ReactServerRendering = require('./ReactServerRendering');\nvar ReactVersion = require('./ReactVersion');\n\nReactDefaultInjection.inject();\n\nvar ReactDOMServer = {\n renderToString: ReactServerRendering.renderToString,\n renderToStaticMarkup: ReactServerRendering.renderToStaticMarkup,\n version: ReactVersion\n};\n\nmodule.exports = ReactDOMServer;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactDOMServer.js\n ** module id = 149\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @typechecks static-only\n * @providesModule ReactServerRendering\n */\n'use strict';\n\nvar ReactDefaultBatchingStrategy = require('./ReactDefaultBatchingStrategy');\nvar ReactElement = require('./ReactElement');\nvar ReactInstanceHandles = require('./ReactInstanceHandles');\nvar ReactMarkupChecksum = require('./ReactMarkupChecksum');\nvar ReactServerBatchingStrategy = require('./ReactServerBatchingStrategy');\nvar ReactServerRenderingTransaction = require('./ReactServerRenderingTransaction');\nvar ReactUpdates = require('./ReactUpdates');\n\nvar emptyObject = require('fbjs/lib/emptyObject');\nvar instantiateReactComponent = require('./instantiateReactComponent');\nvar invariant = require('fbjs/lib/invariant');\n\n/**\n * @param {ReactElement} element\n * @return {string} the HTML markup\n */\nfunction renderToString(element) {\n !ReactElement.isValidElement(element) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'renderToString(): You must pass a valid ReactElement.') : invariant(false) : undefined;\n\n var transaction;\n try {\n ReactUpdates.injection.injectBatchingStrategy(ReactServerBatchingStrategy);\n\n var id = ReactInstanceHandles.createReactRootID();\n transaction = ReactServerRenderingTransaction.getPooled(false);\n\n return transaction.perform(function () {\n var componentInstance = instantiateReactComponent(element, null);\n var markup = componentInstance.mountComponent(id, transaction, emptyObject);\n return ReactMarkupChecksum.addChecksumToMarkup(markup);\n }, null);\n } finally {\n ReactServerRenderingTransaction.release(transaction);\n // Revert to the DOM batching strategy since these two renderers\n // currently share these stateful modules.\n ReactUpdates.injection.injectBatchingStrategy(ReactDefaultBatchingStrategy);\n }\n}\n\n/**\n * @param {ReactElement} element\n * @return {string} the HTML markup, without the extra React ID and checksum\n * (for generating static pages)\n */\nfunction renderToStaticMarkup(element) {\n !ReactElement.isValidElement(element) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'renderToStaticMarkup(): You must pass a valid ReactElement.') : invariant(false) : undefined;\n\n var transaction;\n try {\n ReactUpdates.injection.injectBatchingStrategy(ReactServerBatchingStrategy);\n\n var id = ReactInstanceHandles.createReactRootID();\n transaction = ReactServerRenderingTransaction.getPooled(true);\n\n return transaction.perform(function () {\n var componentInstance = instantiateReactComponent(element, null);\n return componentInstance.mountComponent(id, transaction, emptyObject);\n }, null);\n } finally {\n ReactServerRenderingTransaction.release(transaction);\n // Revert to the DOM batching strategy since these two renderers\n // currently share these stateful modules.\n ReactUpdates.injection.injectBatchingStrategy(ReactDefaultBatchingStrategy);\n }\n}\n\nmodule.exports = {\n renderToString: renderToString,\n renderToStaticMarkup: renderToStaticMarkup\n};\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactServerRendering.js\n ** module id = 150\n ** module chunks = 0 1\n **/","/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactServerBatchingStrategy\n * @typechecks\n */\n\n'use strict';\n\nvar ReactServerBatchingStrategy = {\n isBatchingUpdates: false,\n batchedUpdates: function (callback) {\n // Don't do anything here. During the server rendering we don't want to\n // schedule any updates. We will simply ignore them.\n }\n};\n\nmodule.exports = ReactServerBatchingStrategy;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactServerBatchingStrategy.js\n ** module id = 151\n ** module chunks = 0 1\n **/","/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactServerRenderingTransaction\n * @typechecks\n */\n\n'use strict';\n\nvar PooledClass = require('./PooledClass');\nvar CallbackQueue = require('./CallbackQueue');\nvar Transaction = require('./Transaction');\n\nvar assign = require('./Object.assign');\nvar emptyFunction = require('fbjs/lib/emptyFunction');\n\n/**\n * Provides a `CallbackQueue` queue for collecting `onDOMReady` callbacks\n * during the performing of the transaction.\n */\nvar ON_DOM_READY_QUEUEING = {\n /**\n * Initializes the internal `onDOMReady` queue.\n */\n initialize: function () {\n this.reactMountReady.reset();\n },\n\n close: emptyFunction\n};\n\n/**\n * Executed within the scope of the `Transaction` instance. Consider these as\n * being member methods, but with an implied ordering while being isolated from\n * each other.\n */\nvar TRANSACTION_WRAPPERS = [ON_DOM_READY_QUEUEING];\n\n/**\n * @class ReactServerRenderingTransaction\n * @param {boolean} renderToStaticMarkup\n */\nfunction ReactServerRenderingTransaction(renderToStaticMarkup) {\n this.reinitializeTransaction();\n this.renderToStaticMarkup = renderToStaticMarkup;\n this.reactMountReady = CallbackQueue.getPooled(null);\n this.useCreateElement = false;\n}\n\nvar Mixin = {\n /**\n * @see Transaction\n * @abstract\n * @final\n * @return {array} Empty list of operation wrap procedures.\n */\n getTransactionWrappers: function () {\n return TRANSACTION_WRAPPERS;\n },\n\n /**\n * @return {object} The queue to collect `onDOMReady` callbacks with.\n */\n getReactMountReady: function () {\n return this.reactMountReady;\n },\n\n /**\n * `PooledClass` looks for this, and will invoke this before allowing this\n * instance to be reused.\n */\n destructor: function () {\n CallbackQueue.release(this.reactMountReady);\n this.reactMountReady = null;\n }\n};\n\nassign(ReactServerRenderingTransaction.prototype, Transaction.Mixin, Mixin);\n\nPooledClass.addPoolingTo(ReactServerRenderingTransaction);\n\nmodule.exports = ReactServerRenderingTransaction;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactServerRenderingTransaction.js\n ** module id = 152\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactIsomorphic\n */\n\n'use strict';\n\nvar ReactChildren = require('./ReactChildren');\nvar ReactComponent = require('./ReactComponent');\nvar ReactClass = require('./ReactClass');\nvar ReactDOMFactories = require('./ReactDOMFactories');\nvar ReactElement = require('./ReactElement');\nvar ReactElementValidator = require('./ReactElementValidator');\nvar ReactPropTypes = require('./ReactPropTypes');\nvar ReactVersion = require('./ReactVersion');\n\nvar assign = require('./Object.assign');\nvar onlyChild = require('./onlyChild');\n\nvar createElement = ReactElement.createElement;\nvar createFactory = ReactElement.createFactory;\nvar cloneElement = ReactElement.cloneElement;\n\nif (process.env.NODE_ENV !== 'production') {\n createElement = ReactElementValidator.createElement;\n createFactory = ReactElementValidator.createFactory;\n cloneElement = ReactElementValidator.cloneElement;\n}\n\nvar React = {\n\n // Modern\n\n Children: {\n map: ReactChildren.map,\n forEach: ReactChildren.forEach,\n count: ReactChildren.count,\n toArray: ReactChildren.toArray,\n only: onlyChild\n },\n\n Component: ReactComponent,\n\n createElement: createElement,\n cloneElement: cloneElement,\n isValidElement: ReactElement.isValidElement,\n\n // Classic\n\n PropTypes: ReactPropTypes,\n createClass: ReactClass.createClass,\n createFactory: createFactory,\n createMixin: function (mixin) {\n // Currently a noop. Will be used to validate and trace mixins.\n return mixin;\n },\n\n // This looks DOM specific but these are actually isomorphic helpers\n // since they are just generating DOM strings.\n DOM: ReactDOMFactories,\n\n version: ReactVersion,\n\n // Hook for JSX spread, don't use this for anything else.\n __spread: assign\n};\n\nmodule.exports = React;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactIsomorphic.js\n ** module id = 153\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactDOMFactories\n * @typechecks static-only\n */\n\n'use strict';\n\nvar ReactElement = require('./ReactElement');\nvar ReactElementValidator = require('./ReactElementValidator');\n\nvar mapObject = require('fbjs/lib/mapObject');\n\n/**\n * Create a factory that creates HTML tag elements.\n *\n * @param {string} tag Tag name (e.g. `div`).\n * @private\n */\nfunction createDOMFactory(tag) {\n if (process.env.NODE_ENV !== 'production') {\n return ReactElementValidator.createFactory(tag);\n }\n return ReactElement.createFactory(tag);\n}\n\n/**\n * Creates a mapping from supported HTML tags to `ReactDOMComponent` classes.\n * This is also accessible via `React.DOM`.\n *\n * @public\n */\nvar ReactDOMFactories = mapObject({\n a: 'a',\n abbr: 'abbr',\n address: 'address',\n area: 'area',\n article: 'article',\n aside: 'aside',\n audio: 'audio',\n b: 'b',\n base: 'base',\n bdi: 'bdi',\n bdo: 'bdo',\n big: 'big',\n blockquote: 'blockquote',\n body: 'body',\n br: 'br',\n button: 'button',\n canvas: 'canvas',\n caption: 'caption',\n cite: 'cite',\n code: 'code',\n col: 'col',\n colgroup: 'colgroup',\n data: 'data',\n datalist: 'datalist',\n dd: 'dd',\n del: 'del',\n details: 'details',\n dfn: 'dfn',\n dialog: 'dialog',\n div: 'div',\n dl: 'dl',\n dt: 'dt',\n em: 'em',\n embed: 'embed',\n fieldset: 'fieldset',\n figcaption: 'figcaption',\n figure: 'figure',\n footer: 'footer',\n form: 'form',\n h1: 'h1',\n h2: 'h2',\n h3: 'h3',\n h4: 'h4',\n h5: 'h5',\n h6: 'h6',\n head: 'head',\n header: 'header',\n hgroup: 'hgroup',\n hr: 'hr',\n html: 'html',\n i: 'i',\n iframe: 'iframe',\n img: 'img',\n input: 'input',\n ins: 'ins',\n kbd: 'kbd',\n keygen: 'keygen',\n label: 'label',\n legend: 'legend',\n li: 'li',\n link: 'link',\n main: 'main',\n map: 'map',\n mark: 'mark',\n menu: 'menu',\n menuitem: 'menuitem',\n meta: 'meta',\n meter: 'meter',\n nav: 'nav',\n noscript: 'noscript',\n object: 'object',\n ol: 'ol',\n optgroup: 'optgroup',\n option: 'option',\n output: 'output',\n p: 'p',\n param: 'param',\n picture: 'picture',\n pre: 'pre',\n progress: 'progress',\n q: 'q',\n rp: 'rp',\n rt: 'rt',\n ruby: 'ruby',\n s: 's',\n samp: 'samp',\n script: 'script',\n section: 'section',\n select: 'select',\n small: 'small',\n source: 'source',\n span: 'span',\n strong: 'strong',\n style: 'style',\n sub: 'sub',\n summary: 'summary',\n sup: 'sup',\n table: 'table',\n tbody: 'tbody',\n td: 'td',\n textarea: 'textarea',\n tfoot: 'tfoot',\n th: 'th',\n thead: 'thead',\n time: 'time',\n title: 'title',\n tr: 'tr',\n track: 'track',\n u: 'u',\n ul: 'ul',\n 'var': 'var',\n video: 'video',\n wbr: 'wbr',\n\n // SVG\n circle: 'circle',\n clipPath: 'clipPath',\n defs: 'defs',\n ellipse: 'ellipse',\n g: 'g',\n image: 'image',\n line: 'line',\n linearGradient: 'linearGradient',\n mask: 'mask',\n path: 'path',\n pattern: 'pattern',\n polygon: 'polygon',\n polyline: 'polyline',\n radialGradient: 'radialGradient',\n rect: 'rect',\n stop: 'stop',\n svg: 'svg',\n text: 'text',\n tspan: 'tspan'\n\n}, createDOMFactory);\n\nmodule.exports = ReactDOMFactories;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactDOMFactories.js\n ** module id = 154\n ** module chunks = 0 1\n **/","/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactElementValidator\n */\n\n/**\n * ReactElementValidator provides a wrapper around a element factory\n * which validates the props passed to the element. This is intended to be\n * used only in DEV and could be replaced by a static type checker for languages\n * that support it.\n */\n\n'use strict';\n\nvar ReactElement = require('./ReactElement');\nvar ReactPropTypeLocations = require('./ReactPropTypeLocations');\nvar ReactPropTypeLocationNames = require('./ReactPropTypeLocationNames');\nvar ReactCurrentOwner = require('./ReactCurrentOwner');\n\nvar canDefineProperty = require('./canDefineProperty');\nvar getIteratorFn = require('./getIteratorFn');\nvar invariant = require('fbjs/lib/invariant');\nvar warning = require('fbjs/lib/warning');\n\nfunction getDeclarationErrorAddendum() {\n if (ReactCurrentOwner.current) {\n var name = ReactCurrentOwner.current.getName();\n if (name) {\n return ' Check the render method of `' + name + '`.';\n }\n }\n return '';\n}\n\n/**\n * Warn if there's no key explicitly set on dynamic arrays of children or\n * object keys are not valid. This allows us to keep track of children between\n * updates.\n */\nvar ownerHasKeyUseWarning = {};\n\nvar loggedTypeFailures = {};\n\n/**\n * Warn if the element doesn't have an explicit key assigned to it.\n * This element is in an array. The array could grow and shrink or be\n * reordered. All children that haven't already been validated are required to\n * have a \"key\" property assigned to it.\n *\n * @internal\n * @param {ReactElement} element Element that requires a key.\n * @param {*} parentType element's parent's type.\n */\nfunction validateExplicitKey(element, parentType) {\n if (!element._store || element._store.validated || element.key != null) {\n return;\n }\n element._store.validated = true;\n\n var addenda = getAddendaForKeyUse('uniqueKey', element, parentType);\n if (addenda === null) {\n // we already showed the warning\n return;\n }\n process.env.NODE_ENV !== 'production' ? warning(false, 'Each child in an array or iterator should have a unique \"key\" prop.' + '%s%s%s', addenda.parentOrOwner || '', addenda.childOwner || '', addenda.url || '') : undefined;\n}\n\n/**\n * Shared warning and monitoring code for the key warnings.\n *\n * @internal\n * @param {string} messageType A key used for de-duping warnings.\n * @param {ReactElement} element Component that requires a key.\n * @param {*} parentType element's parent's type.\n * @returns {?object} A set of addenda to use in the warning message, or null\n * if the warning has already been shown before (and shouldn't be shown again).\n */\nfunction getAddendaForKeyUse(messageType, element, parentType) {\n var addendum = getDeclarationErrorAddendum();\n if (!addendum) {\n var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name;\n if (parentName) {\n addendum = ' Check the top-level render call using <' + parentName + '>.';\n }\n }\n\n var memoizer = ownerHasKeyUseWarning[messageType] || (ownerHasKeyUseWarning[messageType] = {});\n if (memoizer[addendum]) {\n return null;\n }\n memoizer[addendum] = true;\n\n var addenda = {\n parentOrOwner: addendum,\n url: ' See https://fb.me/react-warning-keys for more information.',\n childOwner: null\n };\n\n // Usually the current owner is the offender, but if it accepts children as a\n // property, it may be the creator of the child that's responsible for\n // assigning it a key.\n if (element && element._owner && element._owner !== ReactCurrentOwner.current) {\n // Give the component that originally created this child.\n addenda.childOwner = ' It was passed a child from ' + element._owner.getName() + '.';\n }\n\n return addenda;\n}\n\n/**\n * Ensure that every element either is passed in a static location, in an\n * array with an explicit keys property defined, or in an object literal\n * with valid key property.\n *\n * @internal\n * @param {ReactNode} node Statically passed child of any type.\n * @param {*} parentType node's parent's type.\n */\nfunction validateChildKeys(node, parentType) {\n if (typeof node !== 'object') {\n return;\n }\n if (Array.isArray(node)) {\n for (var i = 0; i < node.length; i++) {\n var child = node[i];\n if (ReactElement.isValidElement(child)) {\n validateExplicitKey(child, parentType);\n }\n }\n } else if (ReactElement.isValidElement(node)) {\n // This element was passed in a valid location.\n if (node._store) {\n node._store.validated = true;\n }\n } else if (node) {\n var iteratorFn = getIteratorFn(node);\n // Entry iterators provide implicit keys.\n if (iteratorFn) {\n if (iteratorFn !== node.entries) {\n var iterator = iteratorFn.call(node);\n var step;\n while (!(step = iterator.next()).done) {\n if (ReactElement.isValidElement(step.value)) {\n validateExplicitKey(step.value, parentType);\n }\n }\n }\n }\n }\n}\n\n/**\n * Assert that the props are valid\n *\n * @param {string} componentName Name of the component for error messages.\n * @param {object} propTypes Map of prop name to a ReactPropType\n * @param {object} props\n * @param {string} location e.g. \"prop\", \"context\", \"child context\"\n * @private\n */\nfunction checkPropTypes(componentName, propTypes, props, location) {\n for (var propName in propTypes) {\n if (propTypes.hasOwnProperty(propName)) {\n var error;\n // Prop type validation may throw. In case they do, we don't want to\n // fail the render phase where it didn't fail before. So we log it.\n // After these have been cleaned up, we'll let them throw.\n try {\n // This is intentionally an invariant that gets caught. It's the same\n // behavior as without this statement except with a better message.\n !(typeof propTypes[propName] === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s: %s type `%s` is invalid; it must be a function, usually from ' + 'React.PropTypes.', componentName || 'React class', ReactPropTypeLocationNames[location], propName) : invariant(false) : undefined;\n error = propTypes[propName](props, propName, componentName, location);\n } catch (ex) {\n error = ex;\n }\n process.env.NODE_ENV !== 'production' ? warning(!error || error instanceof Error, '%s: type specification of %s `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', ReactPropTypeLocationNames[location], propName, typeof error) : undefined;\n if (error instanceof Error && !(error.message in loggedTypeFailures)) {\n // Only monitor this failure once because there tends to be a lot of the\n // same error.\n loggedTypeFailures[error.message] = true;\n\n var addendum = getDeclarationErrorAddendum();\n process.env.NODE_ENV !== 'production' ? warning(false, 'Failed propType: %s%s', error.message, addendum) : undefined;\n }\n }\n }\n}\n\n/**\n * Given an element, validate that its props follow the propTypes definition,\n * provided by the type.\n *\n * @param {ReactElement} element\n */\nfunction validatePropTypes(element) {\n var componentClass = element.type;\n if (typeof componentClass !== 'function') {\n return;\n }\n var name = componentClass.displayName || componentClass.name;\n if (componentClass.propTypes) {\n checkPropTypes(name, componentClass.propTypes, element.props, ReactPropTypeLocations.prop);\n }\n if (typeof componentClass.getDefaultProps === 'function') {\n process.env.NODE_ENV !== 'production' ? warning(componentClass.getDefaultProps.isReactClassApproved, 'getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.') : undefined;\n }\n}\n\nvar ReactElementValidator = {\n\n createElement: function (type, props, children) {\n var validType = typeof type === 'string' || typeof type === 'function';\n // We warn in this case but don't throw. We expect the element creation to\n // succeed and there will likely be errors in render.\n process.env.NODE_ENV !== 'production' ? warning(validType, 'React.createElement: type should not be null, undefined, boolean, or ' + 'number. It should be a string (for DOM elements) or a ReactClass ' + '(for composite components).%s', getDeclarationErrorAddendum()) : undefined;\n\n var element = ReactElement.createElement.apply(this, arguments);\n\n // The result can be nullish if a mock or a custom function is used.\n // TODO: Drop this when these are no longer allowed as the type argument.\n if (element == null) {\n return element;\n }\n\n // Skip key warning if the type isn't valid since our key validation logic\n // doesn't expect a non-string/function type and can throw confusing errors.\n // We don't want exception behavior to differ between dev and prod.\n // (Rendering will throw with a helpful message and as soon as the type is\n // fixed, the key warnings will appear.)\n if (validType) {\n for (var i = 2; i < arguments.length; i++) {\n validateChildKeys(arguments[i], type);\n }\n }\n\n validatePropTypes(element);\n\n return element;\n },\n\n createFactory: function (type) {\n var validatedFactory = ReactElementValidator.createElement.bind(null, type);\n // Legacy hook TODO: Warn if this is accessed\n validatedFactory.type = type;\n\n if (process.env.NODE_ENV !== 'production') {\n if (canDefineProperty) {\n Object.defineProperty(validatedFactory, 'type', {\n enumerable: false,\n get: function () {\n process.env.NODE_ENV !== 'production' ? warning(false, 'Factory.type is deprecated. Access the class directly ' + 'before passing it to createFactory.') : undefined;\n Object.defineProperty(this, 'type', {\n value: type\n });\n return type;\n }\n });\n }\n }\n\n return validatedFactory;\n },\n\n cloneElement: function (element, props, children) {\n var newElement = ReactElement.cloneElement.apply(this, arguments);\n for (var i = 2; i < arguments.length; i++) {\n validateChildKeys(arguments[i], newElement.type);\n }\n validatePropTypes(newElement);\n return newElement;\n }\n\n};\n\nmodule.exports = ReactElementValidator;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactElementValidator.js\n ** module id = 155\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule mapObject\n */\n\n'use strict';\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\n/**\n * Executes the provided `callback` once for each enumerable own property in the\n * object and constructs a new object from the results. The `callback` is\n * invoked with three arguments:\n *\n * - the property value\n * - the property name\n * - the object being traversed\n *\n * Properties that are added after the call to `mapObject` will not be visited\n * by `callback`. If the values of existing properties are changed, the value\n * passed to `callback` will be the value at the time `mapObject` visits them.\n * Properties that are deleted before being visited are not visited.\n *\n * @grep function objectMap()\n * @grep function objMap()\n *\n * @param {?object} object\n * @param {function} callback\n * @param {*} context\n * @return {?object}\n */\nfunction mapObject(object, callback, context) {\n if (!object) {\n return null;\n }\n var result = {};\n for (var name in object) {\n if (hasOwnProperty.call(object, name)) {\n result[name] = callback.call(context, object[name], name, object);\n }\n }\n return result;\n}\n\nmodule.exports = mapObject;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/mapObject.js\n ** module id = 156\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule onlyChild\n */\n'use strict';\n\nvar ReactElement = require('./ReactElement');\n\nvar invariant = require('fbjs/lib/invariant');\n\n/**\n * Returns the first child in a collection of children and verifies that there\n * is only one child in the collection. The current implementation of this\n * function assumes that a single child gets passed without a wrapper, but the\n * purpose of this helper function is to abstract away the particular structure\n * of children.\n *\n * @param {?object} children Child collection structure.\n * @return {ReactComponent} The first and only `ReactComponent` contained in the\n * structure.\n */\nfunction onlyChild(children) {\n !ReactElement.isValidElement(children) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'onlyChild must be passed a children with exactly one child.') : invariant(false) : undefined;\n return children;\n}\n\nmodule.exports = onlyChild;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/onlyChild.js\n ** module id = 157\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule deprecated\n */\n\n'use strict';\n\nvar assign = require('./Object.assign');\nvar warning = require('fbjs/lib/warning');\n\n/**\n * This will log a single deprecation notice per function and forward the call\n * on to the new API.\n *\n * @param {string} fnName The name of the function\n * @param {string} newModule The module that fn will exist in\n * @param {string} newPackage The module that fn will exist in\n * @param {*} ctx The context this forwarded call should run in\n * @param {function} fn The function to forward on to\n * @return {function} The function that will warn once and then call fn\n */\nfunction deprecated(fnName, newModule, newPackage, ctx, fn) {\n var warned = false;\n if (process.env.NODE_ENV !== 'production') {\n var newFn = function () {\n process.env.NODE_ENV !== 'production' ? warning(warned,\n // Require examples in this string must be split to prevent React's\n // build tools from mistaking them for real requires.\n // Otherwise the build tools will attempt to build a '%s' module.\n 'React.%s is deprecated. Please use %s.%s from require' + '(\\'%s\\') ' + 'instead.', fnName, newModule, fnName, newPackage) : undefined;\n warned = true;\n return fn.apply(ctx, arguments);\n };\n // We need to make sure all properties of the original fn are copied over.\n // In particular, this is needed to support PropTypes\n return assign(newFn, fn);\n }\n\n return fn;\n}\n\nmodule.exports = deprecated;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/deprecated.js\n ** module id = 158\n ** module chunks = 0 1\n **/","import React from 'react';\nimport _ from 'underscore';\nimport $ from 'jquery';\nimport Input from './components/Input';\nimport Icon from './components/Icon';\nimport InputError from './components/InputError';\nimport {getQueryVariable} from './components/Utils';\n\nexport class LoginComponent extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n username: null,\n password: null,\n errorVisible: false,\n errorMessage: '登录失败, 请联系管理员'\n };\n }\n\n saveAndContinue = (event) => {\n event.preventDefault();\n let data = {\n username: this.state.username,\n password: this.state.password,\n continue: decodeURIComponent(getQueryVariable('continue'))\n }, self = this;\n\n $.post('/login/', data).done(function(result) {\n let res = JSON.parse(result);\n if (res.r) {\n self.setState({\n errorVisible: true,\n errorMessage: res.message\n });\n } else {\n window.location = res.continue;\n }\n });\n };\n\n handleUsernameInput = (event) => {\n this.setState({\n username: event.target.value\n });\n };\n\n handlePasswordInput = (event) => {\n this.setState({\n password: event.target.value\n });\n };\n\n render() {\n return (\n <div className=\"create_account_screen\">\n <div className=\"create_account_form\">\n <h1>登录CODE</h1>\n <form onSubmit={this.saveAndContinue}>\n\n <Input\n text=\"用户名\"\n ref=\"username\"\n type=\"text\"\n defaultValue={this.state.username}\n value={this.state.username}\n onChange={this.handleUsernameInput}\n />\n\n <Input\n text=\"密码\"\n type=\"password\"\n ref=\"text\"\n defaultValue={this.state.username}\n value={this.state.passsword}\n onChange={this.handlePasswordInput}\n />\n\n <InputError\n visible={this.state.errorVisible}\n errorMessage={this.state.errorMessage}\n />\n\n <button\n type=\"submit\"\n className=\"button button_wide\">\n 登录\n </button>\n </form>\n </div>\n </div>\n );\n }\n}\n\nexport default class Login extends React.Component {\n render() {\n return (\n <div className=\"application_wrapper\">\n <div className=\"application_routeHandler\">\n <LoginComponent/>\n </div>\n </div>\n );\n }\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./hub/static/jsx/signin.jsx\n **/","// Underscore.js 1.8.3\n// http://underscorejs.org\n// (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n// Underscore may be freely distributed under the MIT license.\n\n(function() {\n\n // Baseline setup\n // --------------\n\n // Establish the root object, `window` in the browser, or `exports` on the server.\n var root = this;\n\n // Save the previous value of the `_` variable.\n var previousUnderscore = root._;\n\n // Save bytes in the minified (but not gzipped) version:\n var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;\n\n // Create quick reference variables for speed access to core prototypes.\n var\n push = ArrayProto.push,\n slice = ArrayProto.slice,\n toString = ObjProto.toString,\n hasOwnProperty = ObjProto.hasOwnProperty;\n\n // All **ECMAScript 5** native function implementations that we hope to use\n // are declared here.\n var\n nativeIsArray = Array.isArray,\n nativeKeys = Object.keys,\n nativeBind = FuncProto.bind,\n nativeCreate = Object.create;\n\n // Naked function reference for surrogate-prototype-swapping.\n var Ctor = function(){};\n\n // Create a safe reference to the Underscore object for use below.\n var _ = function(obj) {\n if (obj instanceof _) return obj;\n if (!(this instanceof _)) return new _(obj);\n this._wrapped = obj;\n };\n\n // Export the Underscore object for **Node.js**, with\n // backwards-compatibility for the old `require()` API. If we're in\n // the browser, add `_` as a global object.\n if (typeof exports !== 'undefined') {\n if (typeof module !== 'undefined' && module.exports) {\n exports = module.exports = _;\n }\n exports._ = _;\n } else {\n root._ = _;\n }\n\n // Current version.\n _.VERSION = '1.8.3';\n\n // Internal function that returns an efficient (for current engines) version\n // of the passed-in callback, to be repeatedly applied in other Underscore\n // functions.\n var optimizeCb = function(func, context, argCount) {\n if (context === void 0) return func;\n switch (argCount == null ? 3 : argCount) {\n case 1: return function(value) {\n return func.call(context, value);\n };\n case 2: return function(value, other) {\n return func.call(context, value, other);\n };\n case 3: return function(value, index, collection) {\n return func.call(context, value, index, collection);\n };\n case 4: return function(accumulator, value, index, collection) {\n return func.call(context, accumulator, value, index, collection);\n };\n }\n return function() {\n return func.apply(context, arguments);\n };\n };\n\n // A mostly-internal function to generate callbacks that can be applied\n // to each element in a collection, returning the desired result — either\n // identity, an arbitrary callback, a property matcher, or a property accessor.\n var cb = function(value, context, argCount) {\n if (value == null) return _.identity;\n if (_.isFunction(value)) return optimizeCb(value, context, argCount);\n if (_.isObject(value)) return _.matcher(value);\n return _.property(value);\n };\n _.iteratee = function(value, context) {\n return cb(value, context, Infinity);\n };\n\n // An internal function for creating assigner functions.\n var createAssigner = function(keysFunc, undefinedOnly) {\n return function(obj) {\n var length = arguments.length;\n if (length < 2 || obj == null) return obj;\n for (var index = 1; index < length; index++) {\n var source = arguments[index],\n keys = keysFunc(source),\n l = keys.length;\n for (var i = 0; i < l; i++) {\n var key = keys[i];\n if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key];\n }\n }\n return obj;\n };\n };\n\n // An internal function for creating a new object that inherits from another.\n var baseCreate = function(prototype) {\n if (!_.isObject(prototype)) return {};\n if (nativeCreate) return nativeCreate(prototype);\n Ctor.prototype = prototype;\n var result = new Ctor;\n Ctor.prototype = null;\n return result;\n };\n\n var property = function(key) {\n return function(obj) {\n return obj == null ? void 0 : obj[key];\n };\n };\n\n // Helper for collection methods to determine whether a collection\n // should be iterated as an array or as an object\n // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength\n // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094\n var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;\n var getLength = property('length');\n var isArrayLike = function(collection) {\n var length = getLength(collection);\n return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;\n };\n\n // Collection Functions\n // --------------------\n\n // The cornerstone, an `each` implementation, aka `forEach`.\n // Handles raw objects in addition to array-likes. Treats all\n // sparse array-likes as if they were dense.\n _.each = _.forEach = function(obj, iteratee, context) {\n iteratee = optimizeCb(iteratee, context);\n var i, length;\n if (isArrayLike(obj)) {\n for (i = 0, length = obj.length; i < length; i++) {\n iteratee(obj[i], i, obj);\n }\n } else {\n var keys = _.keys(obj);\n for (i = 0, length = keys.length; i < length; i++) {\n iteratee(obj[keys[i]], keys[i], obj);\n }\n }\n return obj;\n };\n\n // Return the results of applying the iteratee to each element.\n _.map = _.collect = function(obj, iteratee, context) {\n iteratee = cb(iteratee, context);\n var keys = !isArrayLike(obj) && _.keys(obj),\n length = (keys || obj).length,\n results = Array(length);\n for (var index = 0; index < length; index++) {\n var currentKey = keys ? keys[index] : index;\n results[index] = iteratee(obj[currentKey], currentKey, obj);\n }\n return results;\n };\n\n // Create a reducing function iterating left or right.\n function createReduce(dir) {\n // Optimized iterator function as using arguments.length\n // in the main function will deoptimize the, see #1991.\n function iterator(obj, iteratee, memo, keys, index, length) {\n for (; index >= 0 && index < length; index += dir) {\n var currentKey = keys ? keys[index] : index;\n memo = iteratee(memo, obj[currentKey], currentKey, obj);\n }\n return memo;\n }\n\n return function(obj, iteratee, memo, context) {\n iteratee = optimizeCb(iteratee, context, 4);\n var keys = !isArrayLike(obj) && _.keys(obj),\n length = (keys || obj).length,\n index = dir > 0 ? 0 : length - 1;\n // Determine the initial value if none is provided.\n if (arguments.length < 3) {\n memo = obj[keys ? keys[index] : index];\n index += dir;\n }\n return iterator(obj, iteratee, memo, keys, index, length);\n };\n }\n\n // **Reduce** builds up a single result from a list of values, aka `inject`,\n // or `foldl`.\n _.reduce = _.foldl = _.inject = createReduce(1);\n\n // The right-associative version of reduce, also known as `foldr`.\n _.reduceRight = _.foldr = createReduce(-1);\n\n // Return the first value which passes a truth test. Aliased as `detect`.\n _.find = _.detect = function(obj, predicate, context) {\n var key;\n if (isArrayLike(obj)) {\n key = _.findIndex(obj, predicate, context);\n } else {\n key = _.findKey(obj, predicate, context);\n }\n if (key !== void 0 && key !== -1) return obj[key];\n };\n\n // Return all the elements that pass a truth test.\n // Aliased as `select`.\n _.filter = _.select = function(obj, predicate, context) {\n var results = [];\n predicate = cb(predicate, context);\n _.each(obj, function(value, index, list) {\n if (predicate(value, index, list)) results.push(value);\n });\n return results;\n };\n\n // Return all the elements for which a truth test fails.\n _.reject = function(obj, predicate, context) {\n return _.filter(obj, _.negate(cb(predicate)), context);\n };\n\n // Determine whether all of the elements match a truth test.\n // Aliased as `all`.\n _.every = _.all = function(obj, predicate, context) {\n predicate = cb(predicate, context);\n var keys = !isArrayLike(obj) && _.keys(obj),\n length = (keys || obj).length;\n for (var index = 0; index < length; index++) {\n var currentKey = keys ? keys[index] : index;\n if (!predicate(obj[currentKey], currentKey, obj)) return false;\n }\n return true;\n };\n\n // Determine if at least one element in the object matches a truth test.\n // Aliased as `any`.\n _.some = _.any = function(obj, predicate, context) {\n predicate = cb(predicate, context);\n var keys = !isArrayLike(obj) && _.keys(obj),\n length = (keys || obj).length;\n for (var index = 0; index < length; index++) {\n var currentKey = keys ? keys[index] : index;\n if (predicate(obj[currentKey], currentKey, obj)) return true;\n }\n return false;\n };\n\n // Determine if the array or object contains a given item (using `===`).\n // Aliased as `includes` and `include`.\n _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) {\n if (!isArrayLike(obj)) obj = _.values(obj);\n if (typeof fromIndex != 'number' || guard) fromIndex = 0;\n return _.indexOf(obj, item, fromIndex) >= 0;\n };\n\n // Invoke a method (with arguments) on every item in a collection.\n _.invoke = function(obj, method) {\n var args = slice.call(arguments, 2);\n var isFunc = _.isFunction(method);\n return _.map(obj, function(value) {\n var func = isFunc ? method : value[method];\n return func == null ? func : func.apply(value, args);\n });\n };\n\n // Convenience version of a common use case of `map`: fetching a property.\n _.pluck = function(obj, key) {\n return _.map(obj, _.property(key));\n };\n\n // Convenience version of a common use case of `filter`: selecting only objects\n // containing specific `key:value` pairs.\n _.where = function(obj, attrs) {\n return _.filter(obj, _.matcher(attrs));\n };\n\n // Convenience version of a common use case of `find`: getting the first object\n // containing specific `key:value` pairs.\n _.findWhere = function(obj, attrs) {\n return _.find(obj, _.matcher(attrs));\n };\n\n // Return the maximum element (or element-based computation).\n _.max = function(obj, iteratee, context) {\n var result = -Infinity, lastComputed = -Infinity,\n value, computed;\n if (iteratee == null && obj != null) {\n obj = isArrayLike(obj) ? obj : _.values(obj);\n for (var i = 0, length = obj.length; i < length; i++) {\n value = obj[i];\n if (value > result) {\n result = value;\n }\n }\n } else {\n iteratee = cb(iteratee, context);\n _.each(obj, function(value, index, list) {\n computed = iteratee(value, index, list);\n if (computed > lastComputed || computed === -Infinity && result === -Infinity) {\n result = value;\n lastComputed = computed;\n }\n });\n }\n return result;\n };\n\n // Return the minimum element (or element-based computation).\n _.min = function(obj, iteratee, context) {\n var result = Infinity, lastComputed = Infinity,\n value, computed;\n if (iteratee == null && obj != null) {\n obj = isArrayLike(obj) ? obj : _.values(obj);\n for (var i = 0, length = obj.length; i < length; i++) {\n value = obj[i];\n if (value < result) {\n result = value;\n }\n }\n } else {\n iteratee = cb(iteratee, context);\n _.each(obj, function(value, index, list) {\n computed = iteratee(value, index, list);\n if (computed < lastComputed || computed === Infinity && result === Infinity) {\n result = value;\n lastComputed = computed;\n }\n });\n }\n return result;\n };\n\n // Shuffle a collection, using the modern version of the\n // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).\n _.shuffle = function(obj) {\n var set = isArrayLike(obj) ? obj : _.values(obj);\n var length = set.length;\n var shuffled = Array(length);\n for (var index = 0, rand; index < length; index++) {\n rand = _.random(0, index);\n if (rand !== index) shuffled[index] = shuffled[rand];\n shuffled[rand] = set[index];\n }\n return shuffled;\n };\n\n // Sample **n** random values from a collection.\n // If **n** is not specified, returns a single random element.\n // The internal `guard` argument allows it to work with `map`.\n _.sample = function(obj, n, guard) {\n if (n == null || guard) {\n if (!isArrayLike(obj)) obj = _.values(obj);\n return obj[_.random(obj.length - 1)];\n }\n return _.shuffle(obj).slice(0, Math.max(0, n));\n };\n\n // Sort the object's values by a criterion produced by an iteratee.\n _.sortBy = function(obj, iteratee, context) {\n iteratee = cb(iteratee, context);\n return _.pluck(_.map(obj, function(value, index, list) {\n return {\n value: value,\n index: index,\n criteria: iteratee(value, index, list)\n };\n }).sort(function(left, right) {\n var a = left.criteria;\n var b = right.criteria;\n if (a !== b) {\n if (a > b || a === void 0) return 1;\n if (a < b || b === void 0) return -1;\n }\n return left.index - right.index;\n }), 'value');\n };\n\n // An internal function used for aggregate \"group by\" operations.\n var group = function(behavior) {\n return function(obj, iteratee, context) {\n var result = {};\n iteratee = cb(iteratee, context);\n _.each(obj, function(value, index) {\n var key = iteratee(value, index, obj);\n behavior(result, value, key);\n });\n return result;\n };\n };\n\n // Groups the object's values by a criterion. Pass either a string attribute\n // to group by, or a function that returns the criterion.\n _.groupBy = group(function(result, value, key) {\n if (_.has(result, key)) result[key].push(value); else result[key] = [value];\n });\n\n // Indexes the object's values by a criterion, similar to `groupBy`, but for\n // when you know that your index values will be unique.\n _.indexBy = group(function(result, value, key) {\n result[key] = value;\n });\n\n // Counts instances of an object that group by a certain criterion. Pass\n // either a string attribute to count by, or a function that returns the\n // criterion.\n _.countBy = group(function(result, value, key) {\n if (_.has(result, key)) result[key]++; else result[key] = 1;\n });\n\n // Safely create a real, live array from anything iterable.\n _.toArray = function(obj) {\n if (!obj) return [];\n if (_.isArray(obj)) return slice.call(obj);\n if (isArrayLike(obj)) return _.map(obj, _.identity);\n return _.values(obj);\n };\n\n // Return the number of elements in an object.\n _.size = function(obj) {\n if (obj == null) return 0;\n return isArrayLike(obj) ? obj.length : _.keys(obj).length;\n };\n\n // Split a collection into two arrays: one whose elements all satisfy the given\n // predicate, and one whose elements all do not satisfy the predicate.\n _.partition = function(obj, predicate, context) {\n predicate = cb(predicate, context);\n var pass = [], fail = [];\n _.each(obj, function(value, key, obj) {\n (predicate(value, key, obj) ? pass : fail).push(value);\n });\n return [pass, fail];\n };\n\n // Array Functions\n // ---------------\n\n // Get the first element of an array. Passing **n** will return the first N\n // values in the array. Aliased as `head` and `take`. The **guard** check\n // allows it to work with `_.map`.\n _.first = _.head = _.take = function(array, n, guard) {\n if (array == null) return void 0;\n if (n == null || guard) return array[0];\n return _.initial(array, array.length - n);\n };\n\n // Returns everything but the last entry of the array. Especially useful on\n // the arguments object. Passing **n** will return all the values in\n // the array, excluding the last N.\n _.initial = function(array, n, guard) {\n return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));\n };\n\n // Get the last element of an array. Passing **n** will return the last N\n // values in the array.\n _.last = function(array, n, guard) {\n if (array == null) return void 0;\n if (n == null || guard) return array[array.length - 1];\n return _.rest(array, Math.max(0, array.length - n));\n };\n\n // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.\n // Especially useful on the arguments object. Passing an **n** will return\n // the rest N values in the array.\n _.rest = _.tail = _.drop = function(array, n, guard) {\n return slice.call(array, n == null || guard ? 1 : n);\n };\n\n // Trim out all falsy values from an array.\n _.compact = function(array) {\n return _.filter(array, _.identity);\n };\n\n // Internal implementation of a recursive `flatten` function.\n var flatten = function(input, shallow, strict, startIndex) {\n var output = [], idx = 0;\n for (var i = startIndex || 0, length = getLength(input); i < length; i++) {\n var value = input[i];\n if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) {\n //flatten current level of array or arguments object\n if (!shallow) value = flatten(value, shallow, strict);\n var j = 0, len = value.length;\n output.length += len;\n while (j < len) {\n output[idx++] = value[j++];\n }\n } else if (!strict) {\n output[idx++] = value;\n }\n }\n return output;\n };\n\n // Flatten out an array, either recursively (by default), or just one level.\n _.flatten = function(array, shallow) {\n return flatten(array, shallow, false);\n };\n\n // Return a version of the array that does not contain the specified value(s).\n _.without = function(array) {\n return _.difference(array, slice.call(arguments, 1));\n };\n\n // Produce a duplicate-free version of the array. If the array has already\n // been sorted, you have the option of using a faster algorithm.\n // Aliased as `unique`.\n _.uniq = _.unique = function(array, isSorted, iteratee, context) {\n if (!_.isBoolean(isSorted)) {\n context = iteratee;\n iteratee = isSorted;\n isSorted = false;\n }\n if (iteratee != null) iteratee = cb(iteratee, context);\n var result = [];\n var seen = [];\n for (var i = 0, length = getLength(array); i < length; i++) {\n var value = array[i],\n computed = iteratee ? iteratee(value, i, array) : value;\n if (isSorted) {\n if (!i || seen !== computed) result.push(value);\n seen = computed;\n } else if (iteratee) {\n if (!_.contains(seen, computed)) {\n seen.push(computed);\n result.push(value);\n }\n } else if (!_.contains(result, value)) {\n result.push(value);\n }\n }\n return result;\n };\n\n // Produce an array that contains the union: each distinct element from all of\n // the passed-in arrays.\n _.union = function() {\n return _.uniq(flatten(arguments, true, true));\n };\n\n // Produce an array that contains every item shared between all the\n // passed-in arrays.\n _.intersection = function(array) {\n var result = [];\n var argsLength = arguments.length;\n for (var i = 0, length = getLength(array); i < length; i++) {\n var item = array[i];\n if (_.contains(result, item)) continue;\n for (var j = 1; j < argsLength; j++) {\n if (!_.contains(arguments[j], item)) break;\n }\n if (j === argsLength) result.push(item);\n }\n return result;\n };\n\n // Take the difference between one array and a number of other arrays.\n // Only the elements present in just the first array will remain.\n _.difference = function(array) {\n var rest = flatten(arguments, true, true, 1);\n return _.filter(array, function(value){\n return !_.contains(rest, value);\n });\n };\n\n // Zip together multiple lists into a single array -- elements that share\n // an index go together.\n _.zip = function() {\n return _.unzip(arguments);\n };\n\n // Complement of _.zip. Unzip accepts an array of arrays and groups\n // each array's elements on shared indices\n _.unzip = function(array) {\n var length = array && _.max(array, getLength).length || 0;\n var result = Array(length);\n\n for (var index = 0; index < length; index++) {\n result[index] = _.pluck(array, index);\n }\n return result;\n };\n\n // Converts lists into objects. Pass either a single array of `[key, value]`\n // pairs, or two parallel arrays of the same length -- one of keys, and one of\n // the corresponding values.\n _.object = function(list, values) {\n var result = {};\n for (var i = 0, length = getLength(list); i < length; i++) {\n if (values) {\n result[list[i]] = values[i];\n } else {\n result[list[i][0]] = list[i][1];\n }\n }\n return result;\n };\n\n // Generator function to create the findIndex and findLastIndex functions\n function createPredicateIndexFinder(dir) {\n return function(array, predicate, context) {\n predicate = cb(predicate, context);\n var length = getLength(array);\n var index = dir > 0 ? 0 : length - 1;\n for (; index >= 0 && index < length; index += dir) {\n if (predicate(array[index], index, array)) return index;\n }\n return -1;\n };\n }\n\n // Returns the first index on an array-like that passes a predicate test\n _.findIndex = createPredicateIndexFinder(1);\n _.findLastIndex = createPredicateIndexFinder(-1);\n\n // Use a comparator function to figure out the smallest index at which\n // an object should be inserted so as to maintain order. Uses binary search.\n _.sortedIndex = function(array, obj, iteratee, context) {\n iteratee = cb(iteratee, context, 1);\n var value = iteratee(obj);\n var low = 0, high = getLength(array);\n while (low < high) {\n var mid = Math.floor((low + high) / 2);\n if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;\n }\n return low;\n };\n\n // Generator function to create the indexOf and lastIndexOf functions\n function createIndexFinder(dir, predicateFind, sortedIndex) {\n return function(array, item, idx) {\n var i = 0, length = getLength(array);\n if (typeof idx == 'number') {\n if (dir > 0) {\n i = idx >= 0 ? idx : Math.max(idx + length, i);\n } else {\n length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;\n }\n } else if (sortedIndex && idx && length) {\n idx = sortedIndex(array, item);\n return array[idx] === item ? idx : -1;\n }\n if (item !== item) {\n idx = predicateFind(slice.call(array, i, length), _.isNaN);\n return idx >= 0 ? idx + i : -1;\n }\n for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {\n if (array[idx] === item) return idx;\n }\n return -1;\n };\n }\n\n // Return the position of the first occurrence of an item in an array,\n // or -1 if the item is not included in the array.\n // If the array is large and already in sort order, pass `true`\n // for **isSorted** to use binary search.\n _.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex);\n _.lastIndexOf = createIndexFinder(-1, _.findLastIndex);\n\n // Generate an integer Array containing an arithmetic progression. A port of\n // the native Python `range()` function. See\n // [the Python documentation](http://docs.python.org/library/functions.html#range).\n _.range = function(start, stop, step) {\n if (stop == null) {\n stop = start || 0;\n start = 0;\n }\n step = step || 1;\n\n var length = Math.max(Math.ceil((stop - start) / step), 0);\n var range = Array(length);\n\n for (var idx = 0; idx < length; idx++, start += step) {\n range[idx] = start;\n }\n\n return range;\n };\n\n // Function (ahem) Functions\n // ------------------\n\n // Determines whether to execute a function as a constructor\n // or a normal function with the provided arguments\n var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) {\n if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);\n var self = baseCreate(sourceFunc.prototype);\n var result = sourceFunc.apply(self, args);\n if (_.isObject(result)) return result;\n return self;\n };\n\n // Create a function bound to a given object (assigning `this`, and arguments,\n // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if\n // available.\n _.bind = function(func, context) {\n if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));\n if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');\n var args = slice.call(arguments, 2);\n var bound = function() {\n return executeBound(func, bound, context, this, args.concat(slice.call(arguments)));\n };\n return bound;\n };\n\n // Partially apply a function by creating a version that has had some of its\n // arguments pre-filled, without changing its dynamic `this` context. _ acts\n // as a placeholder, allowing any combination of arguments to be pre-filled.\n _.partial = function(func) {\n var boundArgs = slice.call(arguments, 1);\n var bound = function() {\n var position = 0, length = boundArgs.length;\n var args = Array(length);\n for (var i = 0; i < length; i++) {\n args[i] = boundArgs[i] === _ ? arguments[position++] : boundArgs[i];\n }\n while (position < arguments.length) args.push(arguments[position++]);\n return executeBound(func, bound, this, this, args);\n };\n return bound;\n };\n\n // Bind a number of an object's methods to that object. Remaining arguments\n // are the method names to be bound. Useful for ensuring that all callbacks\n // defined on an object belong to it.\n _.bindAll = function(obj) {\n var i, length = arguments.length, key;\n if (length <= 1) throw new Error('bindAll must be passed function names');\n for (i = 1; i < length; i++) {\n key = arguments[i];\n obj[key] = _.bind(obj[key], obj);\n }\n return obj;\n };\n\n // Memoize an expensive function by storing its results.\n _.memoize = function(func, hasher) {\n var memoize = function(key) {\n var cache = memoize.cache;\n var address = '' + (hasher ? hasher.apply(this, arguments) : key);\n if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);\n return cache[address];\n };\n memoize.cache = {};\n return memoize;\n };\n\n // Delays a function for the given number of milliseconds, and then calls\n // it with the arguments supplied.\n _.delay = function(func, wait) {\n var args = slice.call(arguments, 2);\n return setTimeout(function(){\n return func.apply(null, args);\n }, wait);\n };\n\n // Defers a function, scheduling it to run after the current call stack has\n // cleared.\n _.defer = _.partial(_.delay, _, 1);\n\n // Returns a function, that, when invoked, will only be triggered at most once\n // during a given window of time. Normally, the throttled function will run\n // as much as it can, without ever going more than once per `wait` duration;\n // but if you'd like to disable the execution on the leading edge, pass\n // `{leading: false}`. To disable execution on the trailing edge, ditto.\n _.throttle = function(func, wait, options) {\n var context, args, result;\n var timeout = null;\n var previous = 0;\n if (!options) options = {};\n var later = function() {\n previous = options.leading === false ? 0 : _.now();\n timeout = null;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n };\n return function() {\n var now = _.now();\n if (!previous && options.leading === false) previous = now;\n var remaining = wait - (now - previous);\n context = this;\n args = arguments;\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = now;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n } else if (!timeout && options.trailing !== false) {\n timeout = setTimeout(later, remaining);\n }\n return result;\n };\n };\n\n // Returns a function, that, as long as it continues to be invoked, will not\n // be triggered. The function will be called after it stops being called for\n // N milliseconds. If `immediate` is passed, trigger the function on the\n // leading edge, instead of the trailing.\n _.debounce = function(func, wait, immediate) {\n var timeout, args, context, timestamp, result;\n\n var later = function() {\n var last = _.now() - timestamp;\n\n if (last < wait && last >= 0) {\n timeout = setTimeout(later, wait - last);\n } else {\n timeout = null;\n if (!immediate) {\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n }\n }\n };\n\n return function() {\n context = this;\n args = arguments;\n timestamp = _.now();\n var callNow = immediate && !timeout;\n if (!timeout) timeout = setTimeout(later, wait);\n if (callNow) {\n result = func.apply(context, args);\n context = args = null;\n }\n\n return result;\n };\n };\n\n // Returns the first function passed as an argument to the second,\n // allowing you to adjust arguments, run code before and after, and\n // conditionally execute the original function.\n _.wrap = function(func, wrapper) {\n return _.partial(wrapper, func);\n };\n\n // Returns a negated version of the passed-in predicate.\n _.negate = function(predicate) {\n return function() {\n return !predicate.apply(this, arguments);\n };\n };\n\n // Returns a function that is the composition of a list of functions, each\n // consuming the return value of the function that follows.\n _.compose = function() {\n var args = arguments;\n var start = args.length - 1;\n return function() {\n var i = start;\n var result = args[start].apply(this, arguments);\n while (i--) result = args[i].call(this, result);\n return result;\n };\n };\n\n // Returns a function that will only be executed on and after the Nth call.\n _.after = function(times, func) {\n return function() {\n if (--times < 1) {\n return func.apply(this, arguments);\n }\n };\n };\n\n // Returns a function that will only be executed up to (but not including) the Nth call.\n _.before = function(times, func) {\n var memo;\n return function() {\n if (--times > 0) {\n memo = func.apply(this, arguments);\n }\n if (times <= 1) func = null;\n return memo;\n };\n };\n\n // Returns a function that will be executed at most one time, no matter how\n // often you call it. Useful for lazy initialization.\n _.once = _.partial(_.before, 2);\n\n // Object Functions\n // ----------------\n\n // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.\n var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');\n var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',\n 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];\n\n function collectNonEnumProps(obj, keys) {\n var nonEnumIdx = nonEnumerableProps.length;\n var constructor = obj.constructor;\n var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto;\n\n // Constructor is a special case.\n var prop = 'constructor';\n if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop);\n\n while (nonEnumIdx--) {\n prop = nonEnumerableProps[nonEnumIdx];\n if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) {\n keys.push(prop);\n }\n }\n }\n\n // Retrieve the names of an object's own properties.\n // Delegates to **ECMAScript 5**'s native `Object.keys`\n _.keys = function(obj) {\n if (!_.isObject(obj)) return [];\n if (nativeKeys) return nativeKeys(obj);\n var keys = [];\n for (var key in obj) if (_.has(obj, key)) keys.push(key);\n // Ahem, IE < 9.\n if (hasEnumBug) collectNonEnumProps(obj, keys);\n return keys;\n };\n\n // Retrieve all the property names of an object.\n _.allKeys = function(obj) {\n if (!_.isObject(obj)) return [];\n var keys = [];\n for (var key in obj) keys.push(key);\n // Ahem, IE < 9.\n if (hasEnumBug) collectNonEnumProps(obj, keys);\n return keys;\n };\n\n // Retrieve the values of an object's properties.\n _.values = function(obj) {\n var keys = _.keys(obj);\n var length = keys.length;\n var values = Array(length);\n for (var i = 0; i < length; i++) {\n values[i] = obj[keys[i]];\n }\n return values;\n };\n\n // Returns the results of applying the iteratee to each element of the object\n // In contrast to _.map it returns an object\n _.mapObject = function(obj, iteratee, context) {\n iteratee = cb(iteratee, context);\n var keys = _.keys(obj),\n length = keys.length,\n results = {},\n currentKey;\n for (var index = 0; index < length; index++) {\n currentKey = keys[index];\n results[currentKey] = iteratee(obj[currentKey], currentKey, obj);\n }\n return results;\n };\n\n // Convert an object into a list of `[key, value]` pairs.\n _.pairs = function(obj) {\n var keys = _.keys(obj);\n var length = keys.length;\n var pairs = Array(length);\n for (var i = 0; i < length; i++) {\n pairs[i] = [keys[i], obj[keys[i]]];\n }\n return pairs;\n };\n\n // Invert the keys and values of an object. The values must be serializable.\n _.invert = function(obj) {\n var result = {};\n var keys = _.keys(obj);\n for (var i = 0, length = keys.length; i < length; i++) {\n result[obj[keys[i]]] = keys[i];\n }\n return result;\n };\n\n // Return a sorted list of the function names available on the object.\n // Aliased as `methods`\n _.functions = _.methods = function(obj) {\n var names = [];\n for (var key in obj) {\n if (_.isFunction(obj[key])) names.push(key);\n }\n return names.sort();\n };\n\n // Extend a given object with all the properties in passed-in object(s).\n _.extend = createAssigner(_.allKeys);\n\n // Assigns a given object with all the own properties in the passed-in object(s)\n // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)\n _.extendOwn = _.assign = createAssigner(_.keys);\n\n // Returns the first key on an object that passes a predicate test\n _.findKey = function(obj, predicate, context) {\n predicate = cb(predicate, context);\n var keys = _.keys(obj), key;\n for (var i = 0, length = keys.length; i < length; i++) {\n key = keys[i];\n if (predicate(obj[key], key, obj)) return key;\n }\n };\n\n // Return a copy of the object only containing the whitelisted properties.\n _.pick = function(object, oiteratee, context) {\n var result = {}, obj = object, iteratee, keys;\n if (obj == null) return result;\n if (_.isFunction(oiteratee)) {\n keys = _.allKeys(obj);\n iteratee = optimizeCb(oiteratee, context);\n } else {\n keys = flatten(arguments, false, false, 1);\n iteratee = function(value, key, obj) { return key in obj; };\n obj = Object(obj);\n }\n for (var i = 0, length = keys.length; i < length; i++) {\n var key = keys[i];\n var value = obj[key];\n if (iteratee(value, key, obj)) result[key] = value;\n }\n return result;\n };\n\n // Return a copy of the object without the blacklisted properties.\n _.omit = function(obj, iteratee, context) {\n if (_.isFunction(iteratee)) {\n iteratee = _.negate(iteratee);\n } else {\n var keys = _.map(flatten(arguments, false, false, 1), String);\n iteratee = function(value, key) {\n return !_.contains(keys, key);\n };\n }\n return _.pick(obj, iteratee, context);\n };\n\n // Fill in a given object with default properties.\n _.defaults = createAssigner(_.allKeys, true);\n\n // Creates an object that inherits from the given prototype object.\n // If additional properties are provided then they will be added to the\n // created object.\n _.create = function(prototype, props) {\n var result = baseCreate(prototype);\n if (props) _.extendOwn(result, props);\n return result;\n };\n\n // Create a (shallow-cloned) duplicate of an object.\n _.clone = function(obj) {\n if (!_.isObject(obj)) return obj;\n return _.isArray(obj) ? obj.slice() : _.extend({}, obj);\n };\n\n // Invokes interceptor with the obj, and then returns obj.\n // The primary purpose of this method is to \"tap into\" a method chain, in\n // order to perform operations on intermediate results within the chain.\n _.tap = function(obj, interceptor) {\n interceptor(obj);\n return obj;\n };\n\n // Returns whether an object has a given set of `key:value` pairs.\n _.isMatch = function(object, attrs) {\n var keys = _.keys(attrs), length = keys.length;\n if (object == null) return !length;\n var obj = Object(object);\n for (var i = 0; i < length; i++) {\n var key = keys[i];\n if (attrs[key] !== obj[key] || !(key in obj)) return false;\n }\n return true;\n };\n\n\n // Internal recursive comparison function for `isEqual`.\n var eq = function(a, b, aStack, bStack) {\n // Identical objects are equal. `0 === -0`, but they aren't identical.\n // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).\n if (a === b) return a !== 0 || 1 / a === 1 / b;\n // A strict comparison is necessary because `null == undefined`.\n if (a == null || b == null) return a === b;\n // Unwrap any wrapped objects.\n if (a instanceof _) a = a._wrapped;\n if (b instanceof _) b = b._wrapped;\n // Compare `[[Class]]` names.\n var className = toString.call(a);\n if (className !== toString.call(b)) return false;\n switch (className) {\n // Strings, numbers, regular expressions, dates, and booleans are compared by value.\n case '[object RegExp]':\n // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')\n case '[object String]':\n // Primitives and their corresponding object wrappers are equivalent; thus, `\"5\"` is\n // equivalent to `new String(\"5\")`.\n return '' + a === '' + b;\n case '[object Number]':\n // `NaN`s are equivalent, but non-reflexive.\n // Object(NaN) is equivalent to NaN\n if (+a !== +a) return +b !== +b;\n // An `egal` comparison is performed for other numeric values.\n return +a === 0 ? 1 / +a === 1 / b : +a === +b;\n case '[object Date]':\n case '[object Boolean]':\n // Coerce dates and booleans to numeric primitive values. Dates are compared by their\n // millisecond representations. Note that invalid dates with millisecond representations\n // of `NaN` are not equivalent.\n return +a === +b;\n }\n\n var areArrays = className === '[object Array]';\n if (!areArrays) {\n if (typeof a != 'object' || typeof b != 'object') return false;\n\n // Objects with different constructors are not equivalent, but `Object`s or `Array`s\n // from different frames are.\n var aCtor = a.constructor, bCtor = b.constructor;\n if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor &&\n _.isFunction(bCtor) && bCtor instanceof bCtor)\n && ('constructor' in a && 'constructor' in b)) {\n return false;\n }\n }\n // Assume equality for cyclic structures. The algorithm for detecting cyclic\n // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.\n\n // Initializing stack of traversed objects.\n // It's done here since we only need them for objects and arrays comparison.\n aStack = aStack || [];\n bStack = bStack || [];\n var length = aStack.length;\n while (length--) {\n // Linear search. Performance is inversely proportional to the number of\n // unique nested structures.\n if (aStack[length] === a) return bStack[length] === b;\n }\n\n // Add the first object to the stack of traversed objects.\n aStack.push(a);\n bStack.push(b);\n\n // Recursively compare objects and arrays.\n if (areArrays) {\n // Compare array lengths to determine if a deep comparison is necessary.\n length = a.length;\n if (length !== b.length) return false;\n // Deep compare the contents, ignoring non-numeric properties.\n while (length--) {\n if (!eq(a[length], b[length], aStack, bStack)) return false;\n }\n } else {\n // Deep compare objects.\n var keys = _.keys(a), key;\n length = keys.length;\n // Ensure that both objects contain the same number of properties before comparing deep equality.\n if (_.keys(b).length !== length) return false;\n while (length--) {\n // Deep compare each member\n key = keys[length];\n if (!(_.has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;\n }\n }\n // Remove the first object from the stack of traversed objects.\n aStack.pop();\n bStack.pop();\n return true;\n };\n\n // Perform a deep comparison to check if two objects are equal.\n _.isEqual = function(a, b) {\n return eq(a, b);\n };\n\n // Is a given array, string, or object empty?\n // An \"empty\" object has no enumerable own-properties.\n _.isEmpty = function(obj) {\n if (obj == null) return true;\n if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0;\n return _.keys(obj).length === 0;\n };\n\n // Is a given value a DOM element?\n _.isElement = function(obj) {\n return !!(obj && obj.nodeType === 1);\n };\n\n // Is a given value an array?\n // Delegates to ECMA5's native Array.isArray\n _.isArray = nativeIsArray || function(obj) {\n return toString.call(obj) === '[object Array]';\n };\n\n // Is a given variable an object?\n _.isObject = function(obj) {\n var type = typeof obj;\n return type === 'function' || type === 'object' && !!obj;\n };\n\n // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError.\n _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) {\n _['is' + name] = function(obj) {\n return toString.call(obj) === '[object ' + name + ']';\n };\n });\n\n // Define a fallback version of the method in browsers (ahem, IE < 9), where\n // there isn't any inspectable \"Arguments\" type.\n if (!_.isArguments(arguments)) {\n _.isArguments = function(obj) {\n return _.has(obj, 'callee');\n };\n }\n\n // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8,\n // IE 11 (#1621), and in Safari 8 (#1929).\n if (typeof /./ != 'function' && typeof Int8Array != 'object') {\n _.isFunction = function(obj) {\n return typeof obj == 'function' || false;\n };\n }\n\n // Is a given object a finite number?\n _.isFinite = function(obj) {\n return isFinite(obj) && !isNaN(parseFloat(obj));\n };\n\n // Is the given value `NaN`? (NaN is the only number which does not equal itself).\n _.isNaN = function(obj) {\n return _.isNumber(obj) && obj !== +obj;\n };\n\n // Is a given value a boolean?\n _.isBoolean = function(obj) {\n return obj === true || obj === false || toString.call(obj) === '[object Boolean]';\n };\n\n // Is a given value equal to null?\n _.isNull = function(obj) {\n return obj === null;\n };\n\n // Is a given variable undefined?\n _.isUndefined = function(obj) {\n return obj === void 0;\n };\n\n // Shortcut function for checking if an object has a given property directly\n // on itself (in other words, not on a prototype).\n _.has = function(obj, key) {\n return obj != null && hasOwnProperty.call(obj, key);\n };\n\n // Utility Functions\n // -----------------\n\n // Run Underscore.js in *noConflict* mode, returning the `_` variable to its\n // previous owner. Returns a reference to the Underscore object.\n _.noConflict = function() {\n root._ = previousUnderscore;\n return this;\n };\n\n // Keep the identity function around for default iteratees.\n _.identity = function(value) {\n return value;\n };\n\n // Predicate-generating functions. Often useful outside of Underscore.\n _.constant = function(value) {\n return function() {\n return value;\n };\n };\n\n _.noop = function(){};\n\n _.property = property;\n\n // Generates a function for a given object that returns a given property.\n _.propertyOf = function(obj) {\n return obj == null ? function(){} : function(key) {\n return obj[key];\n };\n };\n\n // Returns a predicate for checking whether an object has a given set of\n // `key:value` pairs.\n _.matcher = _.matches = function(attrs) {\n attrs = _.extendOwn({}, attrs);\n return function(obj) {\n return _.isMatch(obj, attrs);\n };\n };\n\n // Run a function **n** times.\n _.times = function(n, iteratee, context) {\n var accum = Array(Math.max(0, n));\n iteratee = optimizeCb(iteratee, context, 1);\n for (var i = 0; i < n; i++) accum[i] = iteratee(i);\n return accum;\n };\n\n // Return a random integer between min and max (inclusive).\n _.random = function(min, max) {\n if (max == null) {\n max = min;\n min = 0;\n }\n return min + Math.floor(Math.random() * (max - min + 1));\n };\n\n // A (possibly faster) way to get the current timestamp as an integer.\n _.now = Date.now || function() {\n return new Date().getTime();\n };\n\n // List of HTML entities for escaping.\n var escapeMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '`': '`'\n };\n var unescapeMap = _.invert(escapeMap);\n\n // Functions for escaping and unescaping strings to/from HTML interpolation.\n var createEscaper = function(map) {\n var escaper = function(match) {\n return map[match];\n };\n // Regexes for identifying a key that needs to be escaped\n var source = '(?:' + _.keys(map).join('|') + ')';\n var testRegexp = RegExp(source);\n var replaceRegexp = RegExp(source, 'g');\n return function(string) {\n string = string == null ? '' : '' + string;\n return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;\n };\n };\n _.escape = createEscaper(escapeMap);\n _.unescape = createEscaper(unescapeMap);\n\n // If the value of the named `property` is a function then invoke it with the\n // `object` as context; otherwise, return it.\n _.result = function(object, property, fallback) {\n var value = object == null ? void 0 : object[property];\n if (value === void 0) {\n value = fallback;\n }\n return _.isFunction(value) ? value.call(object) : value;\n };\n\n // Generate a unique integer id (unique within the entire client session).\n // Useful for temporary DOM ids.\n var idCounter = 0;\n _.uniqueId = function(prefix) {\n var id = ++idCounter + '';\n return prefix ? prefix + id : id;\n };\n\n // By default, Underscore uses ERB-style template delimiters, change the\n // following template settings to use alternative delimiters.\n _.templateSettings = {\n evaluate : /<%([\\s\\S]+?)%>/g,\n interpolate : /<%=([\\s\\S]+?)%>/g,\n escape : /<%-([\\s\\S]+?)%>/g\n };\n\n // When customizing `templateSettings`, if you don't want to define an\n // interpolation, evaluation or escaping regex, we need one that is\n // guaranteed not to match.\n var noMatch = /(.)^/;\n\n // Certain characters need to be escaped so that they can be put into a\n // string literal.\n var escapes = {\n \"'\": \"'\",\n '\\\\': '\\\\',\n '\\r': 'r',\n '\\n': 'n',\n '\\u2028': 'u2028',\n '\\u2029': 'u2029'\n };\n\n var escaper = /\\\\|'|\\r|\\n|\\u2028|\\u2029/g;\n\n var escapeChar = function(match) {\n return '\\\\' + escapes[match];\n };\n\n // JavaScript micro-templating, similar to John Resig's implementation.\n // Underscore templating handles arbitrary delimiters, preserves whitespace,\n // and correctly escapes quotes within interpolated code.\n // NB: `oldSettings` only exists for backwards compatibility.\n _.template = function(text, settings, oldSettings) {\n if (!settings && oldSettings) settings = oldSettings;\n settings = _.defaults({}, settings, _.templateSettings);\n\n // Combine delimiters into one regular expression via alternation.\n var matcher = RegExp([\n (settings.escape || noMatch).source,\n (settings.interpolate || noMatch).source,\n (settings.evaluate || noMatch).source\n ].join('|') + '|$', 'g');\n\n // Compile the template source, escaping string literals appropriately.\n var index = 0;\n var source = \"__p+='\";\n text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {\n source += text.slice(index, offset).replace(escaper, escapeChar);\n index = offset + match.length;\n\n if (escape) {\n source += \"'+\\n((__t=(\" + escape + \"))==null?'':_.escape(__t))+\\n'\";\n } else if (interpolate) {\n source += \"'+\\n((__t=(\" + interpolate + \"))==null?'':__t)+\\n'\";\n } else if (evaluate) {\n source += \"';\\n\" + evaluate + \"\\n__p+='\";\n }\n\n // Adobe VMs need the match returned to produce the correct offest.\n return match;\n });\n source += \"';\\n\";\n\n // If a variable is not specified, place data values in local scope.\n if (!settings.variable) source = 'with(obj||{}){\\n' + source + '}\\n';\n\n source = \"var __t,__p='',__j=Array.prototype.join,\" +\n \"print=function(){__p+=__j.call(arguments,'');};\\n\" +\n source + 'return __p;\\n';\n\n try {\n var render = new Function(settings.variable || 'obj', '_', source);\n } catch (e) {\n e.source = source;\n throw e;\n }\n\n var template = function(data) {\n return render.call(this, data, _);\n };\n\n // Provide the compiled source as a convenience for precompilation.\n var argument = settings.variable || 'obj';\n template.source = 'function(' + argument + '){\\n' + source + '}';\n\n return template;\n };\n\n // Add a \"chain\" function. Start chaining a wrapped Underscore object.\n _.chain = function(obj) {\n var instance = _(obj);\n instance._chain = true;\n return instance;\n };\n\n // OOP\n // ---------------\n // If Underscore is called as a function, it returns a wrapped object that\n // can be used OO-style. This wrapper holds altered versions of all the\n // underscore functions. Wrapped objects may be chained.\n\n // Helper function to continue chaining intermediate results.\n var result = function(instance, obj) {\n return instance._chain ? _(obj).chain() : obj;\n };\n\n // Add your own custom functions to the Underscore object.\n _.mixin = function(obj) {\n _.each(_.functions(obj), function(name) {\n var func = _[name] = obj[name];\n _.prototype[name] = function() {\n var args = [this._wrapped];\n push.apply(args, arguments);\n return result(this, func.apply(_, args));\n };\n });\n };\n\n // Add all of the Underscore functions to the wrapper object.\n _.mixin(_);\n\n // Add all mutator Array functions to the wrapper.\n _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {\n var method = ArrayProto[name];\n _.prototype[name] = function() {\n var obj = this._wrapped;\n method.apply(obj, arguments);\n if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];\n return result(this, obj);\n };\n });\n\n // Add all accessor Array functions to the wrapper.\n _.each(['concat', 'join', 'slice'], function(name) {\n var method = ArrayProto[name];\n _.prototype[name] = function() {\n return result(this, method.apply(this._wrapped, arguments));\n };\n });\n\n // Extracts the result from a wrapped and chained object.\n _.prototype.value = function() {\n return this._wrapped;\n };\n\n // Provide unwrapping proxy for some methods used in engine operations\n // such as arithmetic and JSON stringification.\n _.prototype.valueOf = _.prototype.toJSON = _.prototype.value;\n\n _.prototype.toString = function() {\n return '' + this._wrapped;\n };\n\n // AMD registration happens at the end for compatibility with AMD loaders\n // that may not enforce next-turn semantics on modules. Even though general\n // practice for AMD registration is to be anonymous, underscore registers\n // as a named module because, like jQuery, it is a base library that is\n // popular enough to be bundled in a third party lib, but not be part of\n // an AMD load request. Those cases could generate an error when an\n // anonymous define() is called outside of a loader request.\n if (typeof define === 'function' && define.amd) {\n define('underscore', [], function() {\n return _;\n });\n }\n}.call(this));\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/underscore/underscore.js\n ** module id = 160\n ** module chunks = 0 1\n **/","import React from 'react';\nimport _ from 'underscore';\nimport Icon from './Icon';\nimport InputError from './InputError';\nimport PasswordValidator from './PasswordValidator';\nimport classNames from 'classnames/bind';\n\nlet cx = classNames.bind({});\n\nexport default class Input extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n valid: (this.props.isValid && this.props.isValid()) || true,\n empty: _.isEmpty(this.props.value),\n focus: false,\n value: null,\n iconsVisible: !this.props.validator,\n errorMessage: this.props.emptyMessage,\n validator: this.props.validator,\n validatorVisible: false,\n type: this.props.type,\n minCharacters: this.props.minCharacters,\n requireCapitals: this.props.requireCapitals,\n requireNumbers: this.props.requireNumbers,\n forbiddenWords: this.props.forbiddenWords,\n isValidatorValid: {\n minChars: false,\n capitalLetters: false,\n numbers: false,\n words: false,\n all: false\n },\n allValidatorValid: false\n };\n }\n\n handleChange = (event) => {\n this.setState({\n value: event.target.value,\n empty: _.isEmpty(event.target.value)\n });\n\n if (this.props.validator) {\n this.checkRules(event.target.value)\n };\n\n if (this.props.validate) {\n this.validateInput(event.target.value);\n }\n\n if (this.props.onChange) {\n this.props.onChange(event);\n }\n }\n\n validateInput = (value) => {\n // trigger custom validation method in the parent component\n if (this.props.validate && this.props.validate(value)){\n this.setState({\n valid: true,\n errorVisible: false\n });\n } else {\n this.setState({\n valid: false,\n errorMessage: !_.isEmpty(value) ? this.props.errorMessage : this.props.emptyMessage\n });\n }\n\n };\n\n componentWillReceiveProps = (newProps) => {\n // perform update only when new value exists and not empty\n if (newProps.value) {\n if(!_.isUndefined(newProps.value) && newProps.value.length > 0) {\n if (this.props.validate) {\n this.validateInput(newProps.value);\n }\n this.setState({\n value: newProps.value,\n empty: _.isEmpty(newProps.value)\n });\n }\n }\n };\n\n isValid() {\n if (this.props.validate) {\n if (_.isEmpty(this.state.value) || !this.props.validate(this.state.value)) {\n this.setState({\n valid: false,\n errorVisible: true\n });\n }\n }\n\n return this.state.valid;\n }\n\n handleFocus = (event) => {\n this.setState({\n focus: true,\n validatorVisible: true\n });\n\n if (this.props.validator) {\n this.setState({\n errorVisible: false\n });\n }\n }\n\n handleBlur = (event) => {\n this.setState({\n focus: false,\n errorVisible: !this.state.valid,\n validatorVisible: false\n });\n }\n\n mouseEnterError() {\n this.setState({\n errorVisible: true\n });\n }\n\n hideError() {\n this.setState({\n errorVisible: false,\n validatorVisible: false\n });\n }\n\n // validator function\n checkRules = (value) => {\n var validData = {\n minChars: !_.isEmpty(value) ? value.length >= parseInt(this.state.minCharacters): false,\n capitalLetters: !_.isEmpty(value) ? this.countCapitals(value): false,\n numbers: !_.isEmpty(value) ? this.countNumbers(value) > 0 : false,\n words: !_.isEmpty(value) ? !this.checkWords(value) : false\n };\n var allValid = (validData.minChars && validData.capitalLetters && validData.numbers && validData.words);\n\n this.setState({\n isValidatorValid: validData,\n allValidatorValid: allValid,\n valid: allValid\n });\n };\n\n countCapitals = (value) => {\n return value.replace(/[^A-Z]/g, \"\").length;\n };\n\n countNumbers = (value) => {\n return /\\d/.test(value);\n };\n\n checkWords = (value) => {\n return _.some(this.state.forbiddenWords, function (word) {\n var matched = (word === value) ? true : \"\";\n return matched\n });\n };\n\n render() {\n\n var inputGroupClasses = cx({\n 'input_group': true,\n 'input_valid': this.state.valid,\n 'input_error': !this.state.valid,\n 'input_empty': this.state.empty,\n 'input_hasValue': !this.state.empty,\n 'input_focused': this.state.focus,\n 'input_unfocused': !this.state.focus\n });\n\n var validator;\n\n if (this.state.validator) {\n validator =\n <PasswordValidator\n ref=\"passwordValidator\"\n visible={this.state.validatorVisible}\n name={this.props.text}\n value={this.state.value}\n validData={this.state.isValidatorValid}\n valid={this.state.allValidatorValid}\n forbiddenWords={this.state.forbiddenWords}\n minCharacters={this.props.minCharacters}\n requireCapitals={this.props.requireCapitals}\n requireNumbers={this.props.requireNumbers}\n />\n };\n\n return (\n <div className={inputGroupClasses}>\n\n <label className=\"input_label\" htmlFor={this.props.text}>\n <span className=\"label_text\">{this.props.text}</span>\n </label>\n\n <input\n {...this.props}\n placeholder={this.props.placeholder}\n className=\"input\"\n id={this.props.text}\n defaultValue={this.props.defaultValue}\n value={this.state.value}\n onChange={this.handleChange}\n onFocus={this.handleFocus}\n onBlur={this.handleBlur}\n autoComplete=\"off\"\n />\n\n <InputError\n visible={this.state.errorVisible}\n errorMessage={this.state.errorMessage}\n />\n\n <div className=\"validationIcons\">\n <i className=\"input_error_icon\" onMouseEnter={this.mouseEnterError}> <Icon type=\"circle_error\"/> </i>\n <i className=\"input_valid_icon\"> <Icon type=\"circle_tick\"/> </i>\n </div>\n\n {validator}\n\n </div>\n );\n }\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./hub/static/jsx/components/Input.jsx\n **/","import React from 'react';\n\nexport default class Icon extends React.Component {\n\n render() {\n switch(this.props.type) {\n\n case 'circle_error':\n return (\n <svg viewBox=\"0 0 20 20\">\n <path d=\"M10,0.982c4.973,0,9.018,4.046,9.018,9.018S14.973,19.018,10,19.018S0.982,14.973,0.982,10\n S5.027,0.982,10,0.982 M10,0C4.477,0,0,4.477,0,10c0,5.523,4.477,10,10,10s10-4.477,10-10C20,4.477,15.523,0,10,0L10,0z M9,5.703\n V5.441h2.5v0.262l-0.66,5.779H9.66L9,5.703z M9.44,12.951h1.621v1.491H9.44V12.951z\"/>\n </svg>\n )\n\n case 'circle_tick':\n return (\n <svg viewBox=\"0 0 23 23\">\n <path d=\"M11.5,23C5.2,23,0,17.8,0,11.5S5.2,0,11.5,0S23,5.2,23,11.5S17.8,23,11.5,23z M11.5,1C5.7,1,1,5.7,1,11.5S5.7,22,11.5,22\n S22,17.3,22,11.5S17.3,1,11.5,1z M10.4,15.2l6.7-7c0.2-0.2,0.2-0.5,0-0.7c-0.2-0.2-0.5-0.2-0.7,0L10,14.2L7,11\n c-0.2-0.2-0.5-0.2-0.7,0c-0.2,0.2-0.2,0.5,0,0.7l3.4,3.5c0.1,0.1,0.2,0.1,0.3,0.1S10.3,15.3,10.4,15.2z\"/>\n </svg>\n )\n\n case 'circle_tick_filled':\n return (\n <svg viewBox=\"0 0 20 20\">\n <path fill=\"#4FB07F\" d=\"M9.5,0C14.7,0,19,4.3,19,9.5S14.7,19,9.5,19S0,14.7,0,9.5S4.3,0,9.5,0z\"/>\n <path fill=\"#FFFFFF\" d=\"M8.7,12.9c-0.1,0-0.2,0-0.3-0.1l-2.4-2.5c-0.1-0.1-0.1-0.4,0-0.5c0.1-0.2,0.4-0.2,0.5,0L8.7,12l4.6-5\n c0.1-0.1,0.4-0.1,0.5,0c0.1,0.2,0.1,0.4,0,0.5L9,12.8C9,12.8,8.9,12.9,8.7,12.9C8.8,12.9,8.8,12.9,8.7,12.9z\"/>\n </svg>\n )\n\n case 'guthub':\n return (\n <svg viewBox=\"0 0 34 34\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" fill=\"#191717\" d=\"M32.6,16.3c0,7.2-4.7,13.3-11.1,15.5c-0.8,0.2-1.1-0.3-1.1-0.8\n c0-0.5,0-2.3,0-4.5c0-1.5-0.5-2.5-1.1-3c3.6-0.4,7.4-1.8,7.4-8c0-1.8-0.6-3.2-1.7-4.4c0.2-0.4,0.7-2.1-0.2-4.3c0,0-1.4-0.4-4.5,1.7\n c-1.3-0.4-2.7-0.5-4.1-0.5c-1.4,0-2.8,0.2-4.1,0.5C9.1,6.3,7.7,6.8,7.7,6.8C6.8,9,7.4,10.7,7.6,11.1c-1,1.1-1.7,2.6-1.7,4.4\n c0,6.2,3.8,7.6,7.4,8.1c-0.5,0.4-0.9,1.1-1,2.2c-0.9,0.4-3.3,1.1-4.7-1.4c0,0-0.9-1.6-2.5-1.7c0,0-1.6,0-0.1,1c0,0,1.1,0.5,1.8,2.4\n c0,0,1,3.2,5.5,2.2c0,1.4,0,2.4,0,2.8c0,0.4-0.3,0.9-1.1,0.8C4.7,29.6,0,23.5,0,16.3C0,7.3,7.3,0,16.3,0C25.3,0,32.6,7.3,32.6,16.3z\n \"/>\n </svg>\n )\n }\n }\n}\n\n\n/** WEBPACK FOOTER **\n ** ./hub/static/jsx/components/Icon.jsx\n **/","import React from 'react';\nimport _ from 'underscore';\nimport classNames from 'classnames/bind';\n\nlet cx = classNames.bind({});\n\nexport default class InputError extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n message: 'Input is invalid'\n };\n }\n\n render() {\n var errorClass = cx({\n 'error_container': true,\n 'visible': this.props.visible,\n 'invisible': !this.props.visible\n });\n\n return (\n <div className={errorClass}>\n <span>{this.props.errorMessage}</span>\n </div>\n )\n }\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./hub/static/jsx/components/InputError.jsx\n **/","/*!\n Copyright (c) 2015 Jed Watson.\n Licensed under the MIT License (MIT), see\n http://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = '';\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (!arg) continue;\n\n\t\t\tvar argType = typeof arg;\n\n\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\tclasses += ' ' + (this && this[arg] || arg);\n\t\t\t} else if (Array.isArray(arg)) {\n\t\t\t\tclasses += ' ' + classNames.apply(this, arg);\n\t\t\t} else if (argType === 'object') {\n\t\t\t\tfor (var key in arg) {\n\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\tclasses += ' ' + (this && this[key] || key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn classes.substr(1);\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/classnames/bind.js\n ** module id = 165\n ** module chunks = 0 1\n **/","import React from 'react';\nimport _ from 'underscore';\nimport Icon from './Icon';\nimport classNames from 'classnames/bind';\n\nlet cx = classNames.bind({});\n\nexport default class PasswordValidator extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n value: null,\n minCharacters: this.props.minCharacters,\n requireCapitals: this.props.requireCapitals,\n requireNumbers: this.props.requireNumbers,\n forbiddenWords: this.props.forbiddenWords,\n name: this.props.name\n }\n }\n\n render() {\n var validatorClass = cx({\n 'password_validator': true,\n 'visible': this.props.visible,\n 'invisible': !this.props.visible\n });\n\n var forbiddenWords = this.state.forbiddenWords.map(function(word, i) {\n return (\n <span key={i} className=\"bad_word\">\n \"{word}\"\n </span>\n )\n });\n\n var validatorTitle;\n\n if (this.props.valid) {\n validatorTitle =\n <h4 className=\"validator_title valid\">\n {this.props.name} IS OK\n </h4>\n } else {\n validatorTitle =\n <h4 className=\"validator_title invalid\">\n {this.props.name} RULES\n </h4>\n }\n\n return (\n <div className={validatorClass}>\n <div className=\"validator_container\">\n {validatorTitle}\n <ul className=\"rules_list\">\n <li className={cx({'valid': this.props.validData.minChars})}>\n <i className=\"icon_valid\"> <Icon type=\"circle_tick_filled\"/> </i>\n <i className=\"icon_invalid\"> <Icon type=\"circle_error\"/> </i>\n <span className=\"error_message\">{this.state.minCharacters} characters minimum</span>\n </li>\n\n <li className={cx({'valid': this.props.validData.capitalLetters})}>\n <i className=\"icon_valid\"> <Icon type=\"circle_tick_filled\"/> </i>\n <i className=\"icon_invalid\"> <Icon type=\"circle_error\"/> </i>\n <span className=\"error_message\">Contains at least {this.state.requireCapitals} capital letter</span>\n </li>\n\n <li className={cx({'valid': this.props.validData.numbers})}>\n <i className=\"icon_valid\"> <Icon type=\"circle_tick_filled\"/> </i>\n <i className=\"icon_invalid\"> <Icon type=\"circle_error\"/> </i>\n <span className=\"error_message\">Contains at least {this.state.requireNumbers} number</span>\n </li>\n\n <li className={cx({'valid': this.props.validData.words})}>\n <i className=\"icon_valid\"> <Icon type=\"circle_tick_filled\"/> </i>\n <i className=\"icon_invalid\"> <Icon type=\"circle_error\"/> </i>\n <span className=\"error_message\">Can't be {forbiddenWords}</span>\n </li>\n </ul>\n </div>\n </div>\n )\n }\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./hub/static/jsx/components/PasswordValidator.jsx\n **/","export function getQueryVariable(variable)\n{\n var query = window.location.search.substring(1);\n var vars = query.split(\"&\");\n for (var i=0;i<vars.length;i++) {\n var pair = vars[i].split(\"=\");\n if(pair[0] == variable){return pair[1];}\n }\n return '/';\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./hub/static/jsx/components/Utils.jsx\n **/"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/js/mod/raven.js b/dist/js/mod/raven.js new file mode 100644 index 0000000..33218bc --- /dev/null +++ b/dist/js/mod/raven.js @@ -0,0 +1,2292 @@ + +/* @source lib/oz.js */; + +/** + * OzJS: microkernel for modular javascript + * compatible with AMD (Asynchronous Module Definition) + * see http://ozjs.org for details + * + * Copyright (C) 2010-2012, Dexter.Yy, MIT License + * vim: et:ts=4:sw=4:sts=4 + */ +(function(){ + +var window = this, + _toString = Object.prototype.toString, + _RE_PLUGIN = /(.*)!(.+)/, + _RE_DEPS = /\Wrequire\((['"]).+?\1\)/g, //' + _RE_SUFFIX = /\.(js|json)$/, + _RE_RELPATH = /^\.+?\/.+/, + _RE_DOT = /(^|\/)\.\//g, + _RE_ALIAS_IN_MID = /^([\w\-]+)\//, + _builtin_mods = { "require": 1, "exports": 1, "module": 1, "host": 1, "finish": 1 }, + + _config = { + mods: {} + }, + _scripts = {}, + _delays = {}, + _refers = {}, + _waitings = {}, + _latest_mod, + _scope, + _resets = {}, + + forEach = Array.prototype.forEach || function(fn, sc){ + for(var i = 0, l = this.length; i < l; i++){ + if (i in this) + fn.call(sc, this[i], i, this); + } + }; + +/** + * @public define / register a module and its meta information + * @param {string} module name. optional as unique module in a script file + * @param {string[]} dependencies + * @param {function} module code, execute only once on the first call + * + * @note + * + * define('', [""], func) + * define([""], func) + * define('', func) + * define(func) + * + * define('', "") + * define('', [""], "") + * define('', [""]) + * + */ +function define(name, deps, block){ + var is_remote = typeof block === 'string'; + if (!block) { + if (deps) { + if (isArray(deps)) { + block = filesuffix(realname(basename(name))); + } else { + block = deps; + deps = null; + } + } else { + block = name; + name = ""; + } + if (typeof name !== 'string') { + deps = name; + name = ""; + } else { + is_remote = typeof block === 'string'; + if (!is_remote && !deps) { + deps = seek(block); + } + } + } + name = name && realname(name); + var mod = name && _config.mods[name]; + if (!_config.debug && mod && mod.name + && (is_remote && mod.loaded == 2 || mod.exports)) { + return; + } + if (is_remote && _config.enable_ozma) { + deps = null; + } + var host = isWindow(this) ? this : window; + mod = _config.mods[name] = { + name: name, + url: mod && mod.url, + host: host, + deps: deps || [] + }; + if (name === "") { // capture anonymous module + _latest_mod = mod; + } + if (typeof block !== 'string') { + mod.block = block; + mod.loaded = 2; + } else { // remote module + var alias = _config.aliases; + if (alias) { + block = block.replace(/\{(\w+)\}/g, function(e1, e2){ + return alias[e2] || ""; + }); + } + mod.url = block; + } + if (mod.block && !isFunction(mod.block)) { // json module + mod.exports = block; + } +} + +/** + * @public run a code block its dependencies + * @param {string[]} [module name] dependencies + * @param {function} + */ +function require(deps, block, _self_mod) { + if (typeof deps === 'string') { + if (!block) { + return (_config.mods[realname(basename(deps, _scope))] + || {}).exports; + } + deps = [deps]; + } else if (!block) { + block = deps; + deps = seek(block); + } + var host = isWindow(this) ? this : window; + if (!_self_mod) { + _self_mod = { url: _scope && _scope.url }; + } + var m, remotes = 0, // counter for remote scripts + list = scan.call(host, deps, _self_mod); // calculate dependencies, find all required modules + for (var i = 0, l = list.length; i < l; i++) { + m = list[i]; + if (m.is_reset) { + m = _config.mods[m.name]; + } + if (m.url && m.loaded !== 2) { // remote module + remotes++; + m.loaded = 1; // status: loading + fetch(m, function(){ + this.loaded = 2; // status: loaded + var lm = _latest_mod; + if (lm) { // capture anonymous module + lm.name = this.name; + lm.url = this.url; + _config.mods[this.name] = lm; + _latest_mod = null; + } + // loaded all modules, calculate dependencies all over again + if (--remotes <= 0) { + require.call(host, deps, block, _self_mod); + } + }); + } + } + if (!remotes) { + _self_mod.deps = deps; + _self_mod.host = host; + _self_mod.block = block; + setTimeout(function(){ + tidy(deps, _self_mod); + list.push(_self_mod); + exec(list.reverse()); + }, 0); + } +} + +/** + * @private execute modules in a sequence of dependency + * @param {object[]} [module object] + */ +var exec = function(list){ + var mod, mid, tid, result, isAsync, deps, + depObjs, exportObj, moduleObj, rmod, + wt = _waitings; + while (mod = list.pop()) { + if (mod.is_reset) { + rmod = clone(_config.mods[mod.name]); + rmod.host = mod.host; + rmod.newname = mod.newname; + mod = rmod; + if (!_resets[mod.newname]) { + _resets[mod.newname] = []; + } + _resets[mod.newname].push(mod); + mod.exports = undefined; + } else if (mod.name) { + mod = _config.mods[mod.name] || mod; + } + if (!mod.block || !mod.running && mod.exports !== undefined) { + continue; + } + depObjs = []; + exportObj = {}; // for "exports" module + moduleObj = { id: mod.name, filename: mod.url, exports: exportObj }; + deps = mod.deps.slice(); + deps[mod.block.hiddenDeps ? 'unshift' : 'push']("require", "exports", "module"); + for (var i = 0, l = deps.length; i < l; i++) { + mid = deps[i]; + switch(mid) { + case 'require': + depObjs.push(require); + break; + case 'exports': + depObjs.push(exportObj); + break; + case 'module': + depObjs.push(moduleObj); + break; + case 'host': // deprecated + depObjs.push(mod.host); + break; + case 'finish': // execute asynchronously + tid = mod.name; + if (!wt[tid]) // for delay execute + wt[tid] = [list]; + else + wt[tid].push(list); + depObjs.push(function(result){ + // HACK: no guarantee that this function will be invoked after while() loop termination in Chrome/Safari + setTimeout(function(){ + // 'mod' equal to 'list[list.length-1]' + if (result !== undefined) { + mod.exports = result; + } + if (!wt[tid]) + return; + forEach.call(wt[tid], function(list){ + this(list); + }, exec); + delete wt[tid]; + mod.running = 0; + }, 0); + }); + isAsync = 1; + break; + default: + depObjs.push(( + (_resets[mid] || []).pop() + || _config.mods[realname(mid)] + || {} + ).exports); + break; + } + } + if (!mod.running) { + // execute module code. arguments: [dep1, dep2, ..., require, exports, module] + _scope = mod; + result = mod.block.apply(mod.host, depObjs) || null; + _scope = false; + exportObj = moduleObj.exports; + mod.exports = result !== undefined ? result : exportObj; // use empty exportObj for "finish" + for (var v in exportObj) { + if (v) { + mod.exports = exportObj; + } + break; + } + } + if (isAsync) { // skip, wait for finish() + mod.running = 1; + break; + } + } +}; + +/** + * @private observer for script loader, prevent duplicate requests + * @param {object} module object + * @param {function} callback + */ +var fetch = function(m, cb){ + var url = m.url, + observers = _scripts[url]; + if (!observers) { + var mname = m.name, delays = _delays; + if (m.deps && m.deps.length && delays[mname] !== 1) { + delays[mname] = [m.deps.length, cb]; + forEach.call(m.deps, function(dep){ + var d = _config.mods[realname(dep)]; + if (this[dep] !== 1 && d.url && d.loaded !== 2) { + if (!this[dep]) { + this[dep] = []; + } + this[dep].push(m); + } else { + delays[mname][0]--; + } + }, _refers); + if (delays[mname][0] > 0) { + return; + } else { + delays[mname] = 1; + } + } + observers = _scripts[url] = [[cb, m]]; + var true_url = /^\w+:\/\//.test(url) ? url + : (_config.enable_ozma && _config.distUrl || _config.baseUrl || '') + + (_config.enableAutoSuffix ? namesuffix(url) : url); + getScript.call(m.host || this, true_url, function(){ + forEach.call(observers, function(args){ + args[0].call(args[1]); + }); + _scripts[url] = 1; + if (_refers[mname] && _refers[mname] !== 1) { + forEach.call(_refers[mname], function(dm){ + var b = this[dm.name]; + if (--b[0] <= 0) { + this[dm.name] = 1; + fetch(dm, b[1]); + } + }, delays); + _refers[mname] = 1; + } + }); + } else if (observers === 1) { + cb.call(m); + } else { + observers.push([cb, m]); + } +}; + +/** + * @private search and sequence all dependencies, based on DFS + * @param {string[]} a set of module names + * @param {object[]} + * @param {object[]} a sequence of modules, for recursion + * @return {object[]} a sequence of modules + */ +function scan(m, file_mod, list){ + list = list || []; + if (!m[0]) { + return list; + } + var deps, + history = list.history; + if (!history) { + history = list.history = {}; + } + if (m[1]) { + deps = m; + m = false; + } else { + var truename, + _mid = m[0], + plugin = _RE_PLUGIN.exec(_mid); + if (plugin) { + _mid = plugin[2]; + plugin = plugin[1]; + } + var mid = realname(_mid); + if (!_config.mods[mid] && !_builtin_mods[mid]) { + var true_mid = realname(basename(_mid, file_mod)); + if (mid !== true_mid) { + _config.mods[file_mod.url + ':' + mid] = true_mid; + mid = true_mid; + } + if (!_config.mods[true_mid]) { + define(true_mid, filesuffix(true_mid)); + } + } + m = file_mod = _config.mods[mid]; + if (m) { + if (plugin === "new") { + m = { + is_reset: true, + deps: m.deps, + name: mid, + newname: plugin + "!" + mid, + host: this + }; + } else { + truename = m.name; + } + if (history[truename]) { + return list; + } + } else { + return list; + } + if (!history[truename]) { + deps = m.deps || []; + // find require information within the code + // for server-side style module + //deps = deps.concat(seek(m)); + if (truename) { + history[truename] = true; + } + } else { + deps = []; + } + } + for (var i = deps.length - 1; i >= 0; i--) { + if (!history[deps[i]]) { + scan.call(this, [deps[i]], file_mod, list); + } + } + if (m) { + tidy(deps, m); + list.push(m); + } + return list; +} + +/** + * @experiment + * @private analyse module code + * to find out dependencies which have no explicit declaration + * @param {object} module object + */ +function seek(block){ + var hdeps = block.hiddenDeps || []; + if (!block.hiddenDeps) { + var code = block.toString(), + h = null; + hdeps = block.hiddenDeps = []; + while (h = _RE_DEPS.exec(code)) { + hdeps.push(h[0].slice(10, -2)); + } + } + return hdeps.slice(); +} + +function tidy(deps, m){ + forEach.call(deps.slice(), function(dep, i){ + var true_mid = this[m.url + ':' + realname(dep)]; + if (typeof true_mid === 'string') { + deps[i] = true_mid; + } + }, _config.mods); +} + +function config(opt){ + for (var i in opt) { + if (i === 'aliases') { + if (!_config[i]) { + _config[i] = {}; + } + for (var j in opt[i]) { + _config[i][j] = opt[i][j]; + } + var mods = _config.mods; + for (var k in mods) { + mods[k].name = realname(k); + mods[mods[k].name] = mods[k]; + } + } else { + _config[i] = opt[i]; + } + } +} + +/** + * @note naming pattern: + * _g_src.js + * _g_combo.js + * + * jquery.js + * jquery_pack.js + * + * _yy_src.pack.js + * _yy_combo.js + * + * _yy_bak.pack.js + * _yy_bak.pack_pack.js + */ +function namesuffix(file){ + return file.replace(/(.+?)(_src.*)?(\.\w+)$/, function($0, $1, $2, $3){ + return $1 + ($2 && '_combo' || '_pack') + $3; + }); +} + +function filesuffix(mid){ + return _RE_SUFFIX.test(mid) ? mid : mid + '.js'; +} + +function realname(mid){ + var alias = _config.aliases; + if (alias) { + mid = mid.replace(_RE_ALIAS_IN_MID, function(e1, e2){ + return alias[e2] || (e2 + '/'); + }); + } + return mid; +} + +function basename(mid, file_mod){ + var rel_path = _RE_RELPATH.exec(mid); + if (rel_path && file_mod) { // resolve relative path in Module ID + mid = (file_mod.url || '').replace(/[^\/]+$/, '') + rel_path[0]; + } + return resolvename(mid); +} + +function resolvename(url){ + url = url.replace(_RE_DOT, '$1'); + var dots, dots_n, url_dup = url, RE_DOTS = /(\.\.\/)+/g; + while (dots = (RE_DOTS.exec(url_dup) || [])[0]) { + dots_n = dots.match(/\.\.\//g).length; + dots = dots.replace(/\./, '\\.'); + url = url.replace(new RegExp('([^/\\.]+/){' + dots_n + '}' + dots), ''); + } + return url.replace(/\/\//g, '/'); +} + +/** + * @public non-blocking script loader + * @param {string} + * @param {object} config + */ +function getScript(url, op){ + var doc = isWindow(this) ? this.document : document, + s = doc.createElement("script"); + s.type = "text/javascript"; + s.async = "async"; //for firefox3.6 + if (!op) + op = {}; + else if (isFunction(op)) + op = { callback: op }; + if (op.charset) + s.charset = op.charset; + s.src = url; + var h = doc.getElementsByTagName("head")[0]; + s.onload = s.onreadystatechange = function(__, isAbort){ + if ( isAbort || !s.readyState || /loaded|complete/.test(s.readyState) ) { + s.onload = s.onreadystatechange = null; + if (h && s.parentNode) { + h.removeChild(s); + } + s = undefined; + if (!isAbort && op.callback) { + op.callback(); + } + } + }; + h.insertBefore(s, h.firstChild); +} + +function isFunction(obj) { + return _toString.call(obj) === "[object Function]"; +} + +function isArray(obj) { + return _toString.call(obj) === "[object Array]"; +} + +function isWindow(obj) { + return "setInterval" in obj; +} + +function clone(obj) { // be careful of using `delete` + function NewObj(){} + NewObj.prototype = obj; + return new NewObj(); +} + +var oz = { + define: define, + require: require, + config: config, + seek: seek, + fetch: fetch, + realname: realname, + basename: basename, + filesuffix: filesuffix, + namesuffix: namesuffix, + // non-core + _getScript: getScript, + _clone: clone, + _forEach: forEach, + _isFunction: isFunction, + _isWindow: isWindow +}; + +require.config = config; +define.amd = {}; + +if (!window.window) { // for nodejs + exports.oz = oz; + exports._config = _config; + // hook for build tool + for (var i in oz) { + exports[i] = oz[i]; + } + var hooking = function(fname){ + return function(){ return exports[fname].apply(this, arguments); }; + }; + exec = hooking('exec'); + fetch = hooking('fetch'); + require = hooking('require'); + require.config = config; +} else { + window.oz = oz; + window.define = define; + window.require = require; +} + +})(); + +require.config({ enable_ozma: true }); + + +/* @source lib/raven-1.0.8.js */; + +/*! Raven.js 1.0.8 | github.com/getsentry/raven-js */ + +/* + * Includes TraceKit + * https://github.com/getsentry/TraceKit + * + * Copyright 2013 Matt Robenolt and other contributors + * Released under the BSD license + * https://github.com/getsentry/raven-js/blob/master/LICENSE + * + */ +/* + TraceKit - Cross brower stack traces - github.com/occ/TraceKit + MIT license +*/ + +;(function(window, undefined) { + + +var TraceKit = {}; +var _oldTraceKit = window.TraceKit; + +// global reference to slice +var _slice = [].slice; +var UNKNOWN_FUNCTION = '?'; + + +/** + * _has, a better form of hasOwnProperty + * Example: _has(MainHostObject, property) === true/false + * + * @param {Object} host object to check property + * @param {string} key to check + */ +function _has(object, key) { + return Object.prototype.hasOwnProperty.call(object, key); +} + +function _isUndefined(what) { + return typeof what === 'undefined'; +} + +/** + * TraceKit.noConflict: Export TraceKit out to another variable + * Example: var TK = TraceKit.noConflict() + */ +TraceKit.noConflict = function noConflict() { + window.TraceKit = _oldTraceKit; + return TraceKit; +}; + +/** + * TraceKit.wrap: Wrap any function in a TraceKit reporter + * Example: func = TraceKit.wrap(func); + * + * @param {Function} func Function to be wrapped + * @return {Function} The wrapped func + */ +TraceKit.wrap = function traceKitWrapper(func) { + function wrapped() { + try { + return func.apply(this, arguments); + } catch (e) { + TraceKit.report(e); + throw e; + } + } + return wrapped; +}; + +/** + * TraceKit.report: cross-browser processing of unhandled exceptions + * + * Syntax: + * TraceKit.report.subscribe(function(stackInfo) { ... }) + * TraceKit.report.unsubscribe(function(stackInfo) { ... }) + * TraceKit.report(exception) + * try { ...code... } catch(ex) { TraceKit.report(ex); } + * + * Supports: + * - Firefox: full stack trace with line numbers, plus column number + * on top frame; column number is not guaranteed + * - Opera: full stack trace with line and column numbers + * - Chrome: full stack trace with line and column numbers + * - Safari: line and column number for the top frame only; some frames + * may be missing, and column number is not guaranteed + * - IE: line and column number for the top frame only; some frames + * may be missing, and column number is not guaranteed + * + * In theory, TraceKit should work on all of the following versions: + * - IE5.5+ (only 8.0 tested) + * - Firefox 0.9+ (only 3.5+ tested) + * - Opera 7+ (only 10.50 tested; versions 9 and earlier may require + * Exceptions Have Stacktrace to be enabled in opera:config) + * - Safari 3+ (only 4+ tested) + * - Chrome 1+ (only 5+ tested) + * - Konqueror 3.5+ (untested) + * + * Requires TraceKit.computeStackTrace. + * + * Tries to catch all unhandled exceptions and report them to the + * subscribed handlers. Please note that TraceKit.report will rethrow the + * exception. This is REQUIRED in order to get a useful stack trace in IE. + * If the exception does not reach the top of the browser, you will only + * get a stack trace from the point where TraceKit.report was called. + * + * Handlers receive a stackInfo object as described in the + * TraceKit.computeStackTrace docs. + */ +TraceKit.report = (function reportModuleWrapper() { + var handlers = [], + lastException = null, + lastExceptionStack = null; + + /** + * Add a crash handler. + * @param {Function} handler + */ + function subscribe(handler) { + handlers.push(handler); + } + + /** + * Remove a crash handler. + * @param {Function} handler + */ + function unsubscribe(handler) { + for (var i = handlers.length - 1; i >= 0; --i) { + if (handlers[i] === handler) { + handlers.splice(i, 1); + } + } + } + + /** + * Dispatch stack information to all handlers. + * @param {Object.<string, *>} stack + */ + function notifyHandlers(stack, windowError) { + var exception = null; + if (windowError && !TraceKit.collectWindowErrors) { + return; + } + for (var i in handlers) { + if (_has(handlers, i)) { + try { + handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2))); + } catch (inner) { + exception = inner; + } + } + } + + if (exception) { + throw exception; + } + } + + var _oldOnerrorHandler = window.onerror; + + /** + * Ensures all global unhandled exceptions are recorded. + * Supported by Gecko and IE. + * @param {string} message Error message. + * @param {string} url URL of script that generated the exception. + * @param {(number|string)} lineNo The line number at which the error + * occurred. + */ + window.onerror = function traceKitWindowOnError(message, url, lineNo) { + var stack = null; + + if (lastExceptionStack) { + TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(lastExceptionStack, url, lineNo, message); + stack = lastExceptionStack; + lastExceptionStack = null; + lastException = null; + } else { + var location = { + 'url': url, + 'line': lineNo + }; + location.func = TraceKit.computeStackTrace.guessFunctionName(location.url, location.line); + location.context = TraceKit.computeStackTrace.gatherContext(location.url, location.line); + stack = { + 'mode': 'onerror', + 'message': message, + 'url': document.location.href, + 'stack': [location], + 'useragent': navigator.userAgent + }; + } + + notifyHandlers(stack, 'from window.onerror'); + + if (_oldOnerrorHandler) { + return _oldOnerrorHandler.apply(this, arguments); + } + + return false; + }; + + /** + * Reports an unhandled Error to TraceKit. + * @param {Error} ex + */ + function report(ex) { + var args = _slice.call(arguments, 1); + if (lastExceptionStack) { + if (lastException === ex) { + return; // already caught by an inner catch block, ignore + } else { + var s = lastExceptionStack; + lastExceptionStack = null; + lastException = null; + notifyHandlers.apply(null, [s, null].concat(args)); + } + } + + var stack = TraceKit.computeStackTrace(ex); + lastExceptionStack = stack; + lastException = ex; + + // If the stack trace is incomplete, wait for 2 seconds for + // slow slow IE to see if onerror occurs or not before reporting + // this exception; otherwise, we will end up with an incomplete + // stack trace + window.setTimeout(function () { + if (lastException === ex) { + lastExceptionStack = null; + lastException = null; + notifyHandlers.apply(null, [stack, null].concat(args)); + } + }, (stack.incomplete ? 2000 : 0)); + + throw ex; // re-throw to propagate to the top level (and cause window.onerror) + } + + report.subscribe = subscribe; + report.unsubscribe = unsubscribe; + return report; +}()); + +/** + * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript + * + * Syntax: + * s = TraceKit.computeStackTrace.ofCaller([depth]) + * s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below) + * Returns: + * s.name - exception name + * s.message - exception message + * s.stack[i].url - JavaScript or HTML file URL + * s.stack[i].func - function name, or empty for anonymous functions (if guessing did not work) + * s.stack[i].args - arguments passed to the function, if known + * s.stack[i].line - line number, if known + * s.stack[i].column - column number, if known + * s.stack[i].context - an array of source code lines; the middle element corresponds to the correct line# + * s.mode - 'stack', 'stacktrace', 'multiline', 'callers', 'onerror', or 'failed' -- method used to collect the stack trace + * + * Supports: + * - Firefox: full stack trace with line numbers and unreliable column + * number on top frame + * - Opera 10: full stack trace with line and column numbers + * - Opera 9-: full stack trace with line numbers + * - Chrome: full stack trace with line and column numbers + * - Safari: line and column number for the topmost stacktrace element + * only + * - IE: no line numbers whatsoever + * + * Tries to guess names of anonymous functions by looking for assignments + * in the source code. In IE and Safari, we have to guess source file names + * by searching for function bodies inside all page scripts. This will not + * work for scripts that are loaded cross-domain. + * Here be dragons: some function names may be guessed incorrectly, and + * duplicate functions may be mismatched. + * + * TraceKit.computeStackTrace should only be used for tracing purposes. + * Logging of unhandled exceptions should be done with TraceKit.report, + * which builds on top of TraceKit.computeStackTrace and provides better + * IE support by utilizing the window.onerror event to retrieve information + * about the top of the stack. + * + * Note: In IE and Safari, no stack trace is recorded on the Error object, + * so computeStackTrace instead walks its *own* chain of callers. + * This means that: + * * in Safari, some methods may be missing from the stack trace; + * * in IE, the topmost function in the stack trace will always be the + * caller of computeStackTrace. + * + * This is okay for tracing (because you are likely to be calling + * computeStackTrace from the function you want to be the topmost element + * of the stack trace anyway), but not okay for logging unhandled + * exceptions (because your catch block will likely be far away from the + * inner function that actually caused the exception). + * + * Tracing example: + * function trace(message) { + * var stackInfo = TraceKit.computeStackTrace.ofCaller(); + * var data = message + "\n"; + * for(var i in stackInfo.stack) { + * var item = stackInfo.stack[i]; + * data += (item.func || '[anonymous]') + "() in " + item.url + ":" + (item.line || '0') + "\n"; + * } + * if (window.console) + * console.info(data); + * else + * alert(data); + * } + */ +TraceKit.computeStackTrace = (function computeStackTraceWrapper() { + var debug = false, + sourceCache = {}; + + /** + * Attempts to retrieve source code via XMLHttpRequest, which is used + * to look up anonymous function names. + * @param {string} url URL of source code. + * @return {string} Source contents. + */ + function loadSource(url) { + if (!TraceKit.remoteFetching) { //Only attempt request if remoteFetching is on. + return ''; + } + try { + function getXHR() { + try { + return new window.XMLHttpRequest(); + } catch (e) { + // explicitly bubble up the exception if not found + return new window.ActiveXObject('Microsoft.XMLHTTP'); + } + } + + var request = getXHR(); + request.open('GET', url, false); + request.send(''); + return request.responseText; + } catch (e) { + return ''; + } + } + + /** + * Retrieves source code from the source code cache. + * @param {string} url URL of source code. + * @return {Array.<string>} Source contents. + */ + function getSource(url) { + if (!_has(sourceCache, url)) { + // URL needs to be able to fetched within the acceptable domain. Otherwise, + // cross-domain errors will be triggered. + var source = ''; + if (url.indexOf(document.domain) !== -1) { + source = loadSource(url); + } + sourceCache[url] = source ? source.split('\n') : []; + } + + return sourceCache[url]; + } + + /** + * Tries to use an externally loaded copy of source code to determine + * the name of a function by looking at the name of the variable it was + * assigned to, if any. + * @param {string} url URL of source code. + * @param {(string|number)} lineNo Line number in source code. + * @return {string} The function name, if discoverable. + */ + function guessFunctionName(url, lineNo) { + var reFunctionArgNames = /function ([^(]*)\(([^)]*)\)/, + reGuessFunction = /['"]?([0-9A-Za-z$_]+)['"]?\s*[:=]\s*(function|eval|new Function)/, + line = '', + maxLines = 10, + source = getSource(url), + m; + + if (!source.length) { + return UNKNOWN_FUNCTION; + } + + // Walk backwards from the first line in the function until we find the line which + // matches the pattern above, which is the function definition + for (var i = 0; i < maxLines; ++i) { + line = source[lineNo - i] + line; + + if (!_isUndefined(line)) { + if ((m = reGuessFunction.exec(line))) { + return m[1]; + } else if ((m = reFunctionArgNames.exec(line))) { + return m[1]; + } + } + } + + return UNKNOWN_FUNCTION; + } + + /** + * Retrieves the surrounding lines from where an exception occurred. + * @param {string} url URL of source code. + * @param {(string|number)} line Line number in source code to centre + * around for context. + * @return {?Array.<string>} Lines of source code. + */ + function gatherContext(url, line) { + var source = getSource(url); + + if (!source.length) { + return null; + } + + var context = [], + // linesBefore & linesAfter are inclusive with the offending line. + // if linesOfContext is even, there will be one extra line + // *before* the offending line. + linesBefore = Math.floor(TraceKit.linesOfContext / 2), + // Add one extra line if linesOfContext is odd + linesAfter = linesBefore + (TraceKit.linesOfContext % 2), + start = Math.max(0, line - linesBefore - 1), + end = Math.min(source.length, line + linesAfter - 1); + + line -= 1; // convert to 0-based index + + for (var i = start; i < end; ++i) { + if (!_isUndefined(source[i])) { + context.push(source[i]); + } + } + + return context.length > 0 ? context : null; + } + + /** + * Escapes special characters, except for whitespace, in a string to be + * used inside a regular expression as a string literal. + * @param {string} text The string. + * @return {string} The escaped string literal. + */ + function escapeRegExp(text) { + return text.replace(/[\-\[\]{}()*+?.,\\\^$|#]/g, '\\$&'); + } + + /** + * Escapes special characters in a string to be used inside a regular + * expression as a string literal. Also ensures that HTML entities will + * be matched the same as their literal friends. + * @param {string} body The string. + * @return {string} The escaped string. + */ + function escapeCodeAsRegExpForMatchingInsideHTML(body) { + return escapeRegExp(body).replace('<', '(?:<|<)').replace('>', '(?:>|>)').replace('&', '(?:&|&)').replace('"', '(?:"|")').replace(/\s+/g, '\\s+'); + } + + /** + * Determines where a code fragment occurs in the source code. + * @param {RegExp} re The function definition. + * @param {Array.<string>} urls A list of URLs to search. + * @return {?Object.<string, (string|number)>} An object containing + * the url, line, and column number of the defined function. + */ + function findSourceInUrls(re, urls) { + var source, m; + for (var i = 0, j = urls.length; i < j; ++i) { + // console.log('searching', urls[i]); + if ((source = getSource(urls[i])).length) { + source = source.join('\n'); + if ((m = re.exec(source))) { + // console.log('Found function in ' + urls[i]); + + return { + 'url': urls[i], + 'line': source.substring(0, m.index).split('\n').length, + 'column': m.index - source.lastIndexOf('\n', m.index) - 1 + }; + } + } + } + + // console.log('no match'); + + return null; + } + + /** + * Determines at which column a code fragment occurs on a line of the + * source code. + * @param {string} fragment The code fragment. + * @param {string} url The URL to search. + * @param {(string|number)} line The line number to examine. + * @return {?number} The column number. + */ + function findSourceInLine(fragment, url, line) { + var source = getSource(url), + re = new RegExp('\\b' + escapeRegExp(fragment) + '\\b'), + m; + + line -= 1; + + if (source && source.length > line && (m = re.exec(source[line]))) { + return m.index; + } + + return null; + } + + /** + * Determines where a function was defined within the source code. + * @param {(Function|string)} func A function reference or serialized + * function definition. + * @return {?Object.<string, (string|number)>} An object containing + * the url, line, and column number of the defined function. + */ + function findSourceByFunctionBody(func) { + var urls = [window.location.href], + scripts = document.getElementsByTagName('script'), + body, + code = '' + func, + codeRE = /^function(?:\s+([\w$]+))?\s*\(([\w\s,]*)\)\s*\{\s*(\S[\s\S]*\S)\s*\}\s*$/, + eventRE = /^function on([\w$]+)\s*\(event\)\s*\{\s*(\S[\s\S]*\S)\s*\}\s*$/, + re, + parts, + result; + + for (var i = 0; i < scripts.length; ++i) { + var script = scripts[i]; + if (script.src) { + urls.push(script.src); + } + } + + if (!(parts = codeRE.exec(code))) { + re = new RegExp(escapeRegExp(code).replace(/\s+/g, '\\s+')); + } + + // not sure if this is really necessary, but I don’t have a test + // corpus large enough to confirm that and it was in the original. + else { + var name = parts[1] ? '\\s+' + parts[1] : '', + args = parts[2].split(',').join('\\s*,\\s*'); + + body = escapeRegExp(parts[3]).replace(/;$/, ';?'); // semicolon is inserted if the function ends with a comment.replace(/\s+/g, '\\s+'); + re = new RegExp('function' + name + '\\s*\\(\\s*' + args + '\\s*\\)\\s*{\\s*' + body + '\\s*}'); + } + + // look for a normal function definition + if ((result = findSourceInUrls(re, urls))) { + return result; + } + + // look for an old-school event handler function + if ((parts = eventRE.exec(code))) { + var event = parts[1]; + body = escapeCodeAsRegExpForMatchingInsideHTML(parts[2]); + + // look for a function defined in HTML as an onXXX handler + re = new RegExp('on' + event + '=[\\\'"]\\s*' + body + '\\s*[\\\'"]', 'i'); + + if ((result = findSourceInUrls(re, urls[0]))) { + return result; + } + + // look for ??? + re = new RegExp(body); + + if ((result = findSourceInUrls(re, urls))) { + return result; + } + } + + return null; + } + + // Contents of Exception in various browsers. + // + // SAFARI: + // ex.message = Can't find variable: qq + // ex.line = 59 + // ex.sourceId = 580238192 + // ex.sourceURL = http://... + // ex.expressionBeginOffset = 96 + // ex.expressionCaretOffset = 98 + // ex.expressionEndOffset = 98 + // ex.name = ReferenceError + // + // FIREFOX: + // ex.message = qq is not defined + // ex.fileName = http://... + // ex.lineNumber = 59 + // ex.stack = ...stack trace... (see the example below) + // ex.name = ReferenceError + // + // CHROME: + // ex.message = qq is not defined + // ex.name = ReferenceError + // ex.type = not_defined + // ex.arguments = ['aa'] + // ex.stack = ...stack trace... + // + // INTERNET EXPLORER: + // ex.message = ... + // ex.name = ReferenceError + // + // OPERA: + // ex.message = ...message... (see the example below) + // ex.name = ReferenceError + // ex.opera#sourceloc = 11 (pretty much useless, duplicates the info in ex.message) + // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace' + + /** + * Computes stack trace information from the stack property. + * Chrome and Gecko use this property. + * @param {Error} ex + * @return {?Object.<string, *>} Stack trace information. + */ + function computeStackTraceFromStackProp(ex) { + if (!ex.stack) { + return null; + } + + var chrome = /^\s*at (?:((?:\[object object\])?\S+) )?\(?((?:file|http|https):.*?):(\d+)(?::(\d+))?\)?\s*$/i, + gecko = /^\s*(\S*)(?:\((.*?)\))?@((?:file|http|https).*?):(\d+)(?::(\d+))?\s*$/i, + lines = ex.stack.split('\n'), + stack = [], + parts, + element, + reference = /^(.*) is undefined$/.exec(ex.message); + + for (var i = 0, j = lines.length; i < j; ++i) { + if ((parts = gecko.exec(lines[i]))) { + element = { + 'url': parts[3], + 'func': parts[1] || UNKNOWN_FUNCTION, + 'args': parts[2] ? parts[2].split(',') : '', + 'line': +parts[4], + 'column': parts[5] ? +parts[5] : null + }; + } else if ((parts = chrome.exec(lines[i]))) { + element = { + 'url': parts[2], + 'func': parts[1] || UNKNOWN_FUNCTION, + 'line': +parts[3], + 'column': parts[4] ? +parts[4] : null + }; + } else { + continue; + } + + if (!element.func && element.line) { + element.func = guessFunctionName(element.url, element.line); + } + + if (element.line) { + element.context = gatherContext(element.url, element.line); + } + + stack.push(element); + } + + if (stack[0] && stack[0].line && !stack[0].column && reference) { + stack[0].column = findSourceInLine(reference[1], stack[0].url, stack[0].line); + } + + if (!stack.length) { + return null; + } + + return { + 'mode': 'stack', + 'name': ex.name, + 'message': ex.message, + 'url': document.location.href, + 'stack': stack, + 'useragent': navigator.userAgent + }; + } + + /** + * Computes stack trace information from the stacktrace property. + * Opera 10 uses this property. + * @param {Error} ex + * @return {?Object.<string, *>} Stack trace information. + */ + function computeStackTraceFromStacktraceProp(ex) { + // Access and store the stacktrace property before doing ANYTHING + // else to it because Opera is not very good at providing it + // reliably in other circumstances. + var stacktrace = ex.stacktrace; + + var testRE = / line (\d+), column (\d+) in (?:<anonymous function: ([^>]+)>|([^\)]+))\((.*)\) in (.*):\s*$/i, + lines = stacktrace.split('\n'), + stack = [], + parts; + + for (var i = 0, j = lines.length; i < j; i += 2) { + if ((parts = testRE.exec(lines[i]))) { + var element = { + 'line': +parts[1], + 'column': +parts[2], + 'func': parts[3] || parts[4], + 'args': parts[5] ? parts[5].split(',') : [], + 'url': parts[6] + }; + + if (!element.func && element.line) { + element.func = guessFunctionName(element.url, element.line); + } + if (element.line) { + try { + element.context = gatherContext(element.url, element.line); + } catch (exc) {} + } + + if (!element.context) { + element.context = [lines[i + 1]]; + } + + stack.push(element); + } + } + + if (!stack.length) { + return null; + } + + return { + 'mode': 'stacktrace', + 'name': ex.name, + 'message': ex.message, + 'url': document.location.href, + 'stack': stack, + 'useragent': navigator.userAgent + }; + } + + /** + * NOT TESTED. + * Computes stack trace information from an error message that includes + * the stack trace. + * Opera 9 and earlier use this method if the option to show stack + * traces is turned on in opera:config. + * @param {Error} ex + * @return {?Object.<string, *>} Stack information. + */ + function computeStackTraceFromOperaMultiLineMessage(ex) { + // Opera includes a stack trace into the exception message. An example is: + // + // Statement on line 3: Undefined variable: undefinedFunc + // Backtrace: + // Line 3 of linked script file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.js: In function zzz + // undefinedFunc(a); + // Line 7 of inline#1 script in file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.html: In function yyy + // zzz(x, y, z); + // Line 3 of inline#1 script in file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.html: In function xxx + // yyy(a, a, a); + // Line 1 of function script + // try { xxx('hi'); return false; } catch(ex) { TraceKit.report(ex); } + // ... + + var lines = ex.message.split('\n'); + if (lines.length < 4) { + return null; + } + + var lineRE1 = /^\s*Line (\d+) of linked script ((?:file|http|https)\S+)(?:: in function (\S+))?\s*$/i, + lineRE2 = /^\s*Line (\d+) of inline#(\d+) script in ((?:file|http|https)\S+)(?:: in function (\S+))?\s*$/i, + lineRE3 = /^\s*Line (\d+) of function script\s*$/i, + stack = [], + scripts = document.getElementsByTagName('script'), + inlineScriptBlocks = [], + parts, + i, + len, + source; + + for (i in scripts) { + if (_has(scripts, i) && !scripts[i].src) { + inlineScriptBlocks.push(scripts[i]); + } + } + + for (i = 2, len = lines.length; i < len; i += 2) { + var item = null; + if ((parts = lineRE1.exec(lines[i]))) { + item = { + 'url': parts[2], + 'func': parts[3], + 'line': +parts[1] + }; + } else if ((parts = lineRE2.exec(lines[i]))) { + item = { + 'url': parts[3], + 'func': parts[4] + }; + var relativeLine = (+parts[1]); // relative to the start of the <SCRIPT> block + var script = inlineScriptBlocks[parts[2] - 1]; + if (script) { + source = getSource(item.url); + if (source) { + source = source.join('\n'); + var pos = source.indexOf(script.innerText); + if (pos >= 0) { + item.line = relativeLine + source.substring(0, pos).split('\n').length; + } + } + } + } else if ((parts = lineRE3.exec(lines[i]))) { + var url = window.location.href.replace(/#.*$/, ''), + line = parts[1]; + var re = new RegExp(escapeCodeAsRegExpForMatchingInsideHTML(lines[i + 1])); + source = findSourceInUrls(re, [url]); + item = { + 'url': url, + 'line': source ? source.line : line, + 'func': '' + }; + } + + if (item) { + if (!item.func) { + item.func = guessFunctionName(item.url, item.line); + } + var context = gatherContext(item.url, item.line); + var midline = (context ? context[Math.floor(context.length / 2)] : null); + if (context && midline.replace(/^\s*/, '') === lines[i + 1].replace(/^\s*/, '')) { + item.context = context; + } else { + // if (context) alert("Context mismatch. Correct midline:\n" + lines[i+1] + "\n\nMidline:\n" + midline + "\n\nContext:\n" + context.join("\n") + "\n\nURL:\n" + item.url); + item.context = [lines[i + 1]]; + } + stack.push(item); + } + } + if (!stack.length) { + return null; // could not parse multiline exception message as Opera stack trace + } + + return { + 'mode': 'multiline', + 'name': ex.name, + 'message': lines[0], + 'url': document.location.href, + 'stack': stack, + 'useragent': navigator.userAgent + }; + } + + /** + * Adds information about the first frame to incomplete stack traces. + * Safari and IE require this to get complete data on the first frame. + * @param {Object.<string, *>} stackInfo Stack trace information from + * one of the compute* methods. + * @param {string} url The URL of the script that caused an error. + * @param {(number|string)} lineNo The line number of the script that + * caused an error. + * @param {string=} message The error generated by the browser, which + * hopefully contains the name of the object that caused the error. + * @return {boolean} Whether or not the stack information was + * augmented. + */ + function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) { + var initial = { + 'url': url, + 'line': lineNo + }; + + if (initial.url && initial.line) { + stackInfo.incomplete = false; + + if (!initial.func) { + initial.func = guessFunctionName(initial.url, initial.line); + } + + if (!initial.context) { + initial.context = gatherContext(initial.url, initial.line); + } + + var reference = / '([^']+)' /.exec(message); + if (reference) { + initial.column = findSourceInLine(reference[1], initial.url, initial.line); + } + + if (stackInfo.stack.length > 0) { + if (stackInfo.stack[0].url === initial.url) { + if (stackInfo.stack[0].line === initial.line) { + return false; // already in stack trace + } else if (!stackInfo.stack[0].line && stackInfo.stack[0].func === initial.func) { + stackInfo.stack[0].line = initial.line; + stackInfo.stack[0].context = initial.context; + return false; + } + } + } + + stackInfo.stack.unshift(initial); + stackInfo.partial = true; + return true; + } else { + stackInfo.incomplete = true; + } + + return false; + } + + /** + * Computes stack trace information by walking the arguments.caller + * chain at the time the exception occurred. This will cause earlier + * frames to be missed but is the only way to get any stack trace in + * Safari and IE. The top frame is restored by + * {@link augmentStackTraceWithInitialElement}. + * @param {Error} ex + * @return {?Object.<string, *>} Stack trace information. + */ + function computeStackTraceByWalkingCallerChain(ex, depth) { + var functionName = /function\s+([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?\s*\(/i, + stack = [], + funcs = {}, + recursion = false, + parts, + item, + source; + + for (var curr = computeStackTraceByWalkingCallerChain.caller; curr && !recursion; curr = curr.caller) { + if (curr === computeStackTrace || curr === TraceKit.report) { + // console.log('skipping internal function'); + continue; + } + + item = { + 'url': null, + 'func': UNKNOWN_FUNCTION, + 'line': null, + 'column': null + }; + + if (curr.name) { + item.func = curr.name; + } else if ((parts = functionName.exec(curr.toString()))) { + item.func = parts[1]; + } + + if ((source = findSourceByFunctionBody(curr))) { + item.url = source.url; + item.line = source.line; + + if (item.func === UNKNOWN_FUNCTION) { + item.func = guessFunctionName(item.url, item.line); + } + + var reference = / '([^']+)' /.exec(ex.message || ex.description); + if (reference) { + item.column = findSourceInLine(reference[1], source.url, source.line); + } + } + + if (funcs['' + curr]) { + recursion = true; + }else{ + funcs['' + curr] = true; + } + + stack.push(item); + } + + if (depth) { + // console.log('depth is ' + depth); + // console.log('stack is ' + stack.length); + stack.splice(0, depth); + } + + var result = { + 'mode': 'callers', + 'name': ex.name, + 'message': ex.message, + 'url': document.location.href, + 'stack': stack, + 'useragent': navigator.userAgent + }; + augmentStackTraceWithInitialElement(result, ex.sourceURL || ex.fileName, ex.line || ex.lineNumber, ex.message || ex.description); + return result; + } + + /** + * Computes a stack trace for an exception. + * @param {Error} ex + * @param {(string|number)=} depth + */ + function computeStackTrace(ex, depth) { + var stack = null; + depth = (depth == null ? 0 : +depth); + + try { + // This must be tried first because Opera 10 *destroys* + // its stacktrace property if you try to access the stack + // property first!! + stack = computeStackTraceFromStacktraceProp(ex); + if (stack) { + return stack; + } + } catch (e) { + if (debug) { + throw e; + } + } + + try { + stack = computeStackTraceFromStackProp(ex); + if (stack) { + return stack; + } + } catch (e) { + if (debug) { + throw e; + } + } + + try { + stack = computeStackTraceFromOperaMultiLineMessage(ex); + if (stack) { + return stack; + } + } catch (e) { + if (debug) { + throw e; + } + } + + try { + stack = computeStackTraceByWalkingCallerChain(ex, depth + 1); + if (stack) { + return stack; + } + } catch (e) { + if (debug) { + throw e; + } + } + + return { + 'mode': 'failed' + }; + } + + /** + * Logs a stacktrace starting from the previous call and working down. + * @param {(number|string)=} depth How many frames deep to trace. + * @return {Object.<string, *>} Stack trace information. + */ + function computeStackTraceOfCaller(depth) { + depth = (depth == null ? 0 : +depth) + 1; // "+ 1" because "ofCaller" should drop one frame + try { + throw new Error(); + } catch (ex) { + return computeStackTrace(ex, depth + 1); + } + + return null; + } + + computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement; + computeStackTrace.guessFunctionName = guessFunctionName; + computeStackTrace.gatherContext = gatherContext; + computeStackTrace.ofCaller = computeStackTraceOfCaller; + + return computeStackTrace; +}()); + +/** + * Extends support for global error handling for asynchronous browser + * functions. Adopted from Closure Library's errorhandler.js + */ +(function extendToAsynchronousCallbacks() { + var _helper = function _helper(fnName) { + var originalFn = window[fnName]; + window[fnName] = function traceKitAsyncExtension() { + // Make a copy of the arguments + var args = _slice.call(arguments); + var originalCallback = args[0]; + if (typeof (originalCallback) === 'function') { + args[0] = TraceKit.wrap(originalCallback); + } + // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it + // also only supports 2 argument and doesn't care what "this" is, so we + // can just call the original function directly. + if (originalFn.apply) { + return originalFn.apply(this, args); + } else { + return originalFn(args[0], args[1]); + } + }; + }; + + _helper('setTimeout'); + _helper('setInterval'); +}()); + +/** + * Extended support for backtraces and global error handling for most + * asynchronous jQuery functions. + */ +(function traceKitAsyncForjQuery($) { + + // quit if jQuery isn't on the page + if (!$) { + return; + } + + var _oldEventAdd = $.event.add; + $.event.add = function traceKitEventAdd(elem, types, handler, data, selector) { + var _handler; + + if (handler.handler) { + _handler = handler.handler; + handler.handler = TraceKit.wrap(handler.handler); + } else { + _handler = handler; + handler = TraceKit.wrap(handler); + } + + // If the handler we are attaching doesn’t have the same guid as + // the original, it will never be removed when someone tries to + // unbind the original function later. Technically as a result of + // this our guids are no longer globally unique, but whatever, that + // never hurt anybody RIGHT?! + if (_handler.guid) { + handler.guid = _handler.guid; + } else { + handler.guid = _handler.guid = $.guid++; + } + + return _oldEventAdd.call(this, elem, types, handler, data, selector); + }; + + var _oldReady = $.fn.ready; + $.fn.ready = function traceKitjQueryReadyWrapper(fn) { + return _oldReady.call(this, TraceKit.wrap(fn)); + }; + + var _oldAjax = $.ajax; + $.ajax = function traceKitAjaxWrapper(url, options) { + var keys = ['complete', 'error', 'success'], key; + + // Taken from https://github.com/jquery/jquery/blob/eee2eaf1d7a189d99106423a4206c224ebd5b848/src/ajax.js#L311-L318 + // If url is an object, simulate pre-1.5 signature + if (typeof url === 'object') { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + while(key = keys.pop()) { + if ($.isFunction(options[key])) { + options[key] = TraceKit.wrap(options[key]); + } + } + + try { + return _oldAjax.call(this, url, options); + } catch (e) { + TraceKit.report(e); + throw e; + } + }; + +}(window.jQuery)); + +//Default options: +if (!TraceKit.remoteFetching) { + TraceKit.remoteFetching = true; +} +if (!TraceKit.collectWindowErrors) { + TraceKit.collectWindowErrors = true; +} +if (!TraceKit.linesOfContext || TraceKit.linesOfContext < 1) { + // 5 lines before, the offending line, 5 lines after + TraceKit.linesOfContext = 11; +} + + + +// Export to global object +window.TraceKit = TraceKit; + +}(window)); +;(function(window, undefined){ +'use strict'; + +// First, check for JSON support +// If there is no JSON, we no-op the core features of Raven +// since JSON is required to encode the payload +var _Raven = window.Raven, + hasJSON = !isUndefined(window.JSON), + globalServer, + globalUser, + globalKey, + globalProject, + globalOptions = { + logger: 'javascript', + ignoreErrors: [], + ignoreUrls: [] + }; + +var TK = TraceKit.noConflict(); + +// Disable Tracekit's remote fetching by default +TK.remoteFetching = false; + +/* + * The core Raven singleton + * + * @this {Raven} + */ +var Raven = { + VERSION: '1.0.8', + + /* + * Allow multiple versions of Raven to be installed. + * Strip Raven from the global context and returns the instance. + * + * @return {Raven} + */ + noConflict: function() { + window.Raven = _Raven; + return Raven; + }, + + /* + * Configure Raven with a DSN and extra options + * + * @param {string} dsn The public Sentry DSN + * @param {object} options Optional set of of global options [optional] + * @return {Raven} + */ + config: function(dsn, options) { + var uri = parseUri(dsn), + lastSlash = uri.path.lastIndexOf('/'), + path = uri.path.substr(1, lastSlash); + + if (options && options.ignoreErrors && window.console && console.warn) { + console.warn('DeprecationWarning: `ignoreErrors` is going to be removed soon.'); + } + + // merge in options + if (options) { + each(options, function(key, value){ + globalOptions[key] = value; + }); + } + + // "Script error." is hard coded into browsers for errors that it can't read. + // this is the result of a script being pulled in from an external domain and CORS. + globalOptions.ignoreErrors.push('Script error.'); + + globalKey = uri.user; + globalProject = ~~uri.path.substr(lastSlash + 1); + + // assemble the endpoint from the uri pieces + globalServer = '//' + uri.host + + (uri.port ? ':' + uri.port : '') + + '/' + path + 'api/' + globalProject + '/store/'; + + if (uri.protocol) { + globalServer = uri.protocol + ':' + globalServer; + } + + if (globalOptions.fetchContext) { + TK.remoteFetching = true; + } + + // return for chaining + return Raven; + }, + + /* + * Installs a global window.onerror error handler + * to capture and report uncaught exceptions. + * At this point, install() is required to be called due + * to the way TraceKit is set up. + * + * @return {Raven} + */ + install: function() { + if (!isSetup()) return; + + TK.report.subscribe(handleStackInfo); + + return Raven; + }, + + /* + * Wrap code within a context so Raven can capture errors + * reliably across domains that is executed immediately. + * + * @param {object} options A specific set of options for this context [optional] + * @param {function} func The callback to be immediately executed within the context + * @param {array} args An array of arguments to be called with the callback [optional] + */ + context: function(options, func, args) { + if (isFunction(options)) { + args = func || []; + func = options; + options = undefined; + } + + Raven.wrap(options, func).apply(this, args); + }, + + /* + * Wrap code within a context and returns back a new function to be executed + * + * @param {object} options A specific set of options for this context [optional] + * @param {function} func The function to be wrapped in a new context + * @return {function} The newly wrapped functions with a context + */ + wrap: function(options, func) { + // options is optional + if (isFunction(options)) { + func = options; + options = undefined; + } + + return function() { + try { + func.apply(this, arguments); + } catch(e) { + Raven.captureException(e, options); + throw e; + } + }; + }, + + /* + * Uninstalls the global error handler. + * + * @return {Raven} + */ + uninstall: function() { + TK.report.unsubscribe(handleStackInfo); + + return Raven; + }, + + /* + * Manually capture an exception and send it over to Sentry + * + * @param {error} ex An exception to be logged + * @param {object} options A specific set of options for this error [optional] + * @return {Raven} + */ + captureException: function(ex, options) { + // If a string is passed through, recall as a message + if (typeof ex === 'string') { + return Raven.captureMessage(ex, options); + } + + // TraceKit.report will re-raise any exception passed to it, + // which means you have to wrap it in try/catch. Instead, we + // can wrap it here and only re-raise if TraceKit.report + // raises an exception different from the one we asked to + // report on. + try { + TK.report(ex, options); + } catch(ex1) { + if(ex !== ex1) { + throw ex1; + } + } + + return Raven; + }, + + /* + * Manually send a message to Sentry + * + * @param {string} msg A plain message to be captured in Sentry + * @param {object} options A specific set of options for this message [optional] + * @return {Raven} + */ + captureMessage: function(msg, options) { + // Fire away! + send( + arrayMerge({ + message: msg + }, options) + ); + + return Raven; + }, + + /* + * Set/clear a user to be sent along with the payload. + * + * @param {object} user An object representing user data [optional] + * @return {Raven} + */ + setUser: function(user) { + globalUser = user; + + return Raven; + } +}; + +var uriKeys = 'source protocol authority userInfo user password host port relative path directory file query anchor'.split(' '), + uriPattern = /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/; + +/**** Private functions ****/ +function parseUri(str) { + var m = uriPattern.exec(str), + uri = {}, + i = 14; + + while (i--) uri[uriKeys[i]] = m[i] || ''; + + return uri; +} + +function isUndefined(what) { + return typeof what === 'undefined'; +} + +function isFunction(what) { + return typeof what === 'function'; +} + +function each(obj, callback) { + var i, j; + + if (isUndefined(obj.length)) { + for (i in obj) { + if (obj.hasOwnProperty(i)) { + callback.call(null, i, obj[i]); + } + } + } else { + for (i = 0, j = obj.length; i < j; i++) { + callback.call(null, i, obj[i]); + } + } +} + +var cachedAuth; + +function getAuthQueryString() { + if (cachedAuth) return cachedAuth; + + var qs = [ + 'sentry_version=2.0', + 'sentry_client=raven-js/' + Raven.VERSION + ]; + if (globalKey) { + qs.push('sentry_key=' + globalKey); + } + + cachedAuth = '?' + qs.join('&'); + return cachedAuth; +} + +function handleStackInfo(stackInfo, options) { + var frames = [], + i = 0, + j, frame; + + if (stackInfo.stack && (j = stackInfo.stack.length)) { + for (; i < j; i++) { + frame = normalizeFrame(stackInfo.stack[i]); + if (frame) { + frames.push(frame); + } + } + } + + processException( + stackInfo.name, + stackInfo.message, + stackInfo.url, + stackInfo.lineno, + frames, + options + ); +} + +function normalizeFrame(frame) { + if (!frame.url) return; + + // normalize the frames data + var normalized = { + filename: frame.url, + lineno: frame.line, + colno: frame.column, + 'function': frame.func || '?' + }, context = extractContextFromFrame(frame); + + if (context) { + var i = 3, keys = ['pre_context', 'context_line', 'post_context']; + while (i--) normalized[keys[i]] = context[i]; + } + + normalized.in_app = !/(Raven|TraceKit)\./.test(normalized['function']); + + return normalized; +} + +function extractContextFromFrame(frame) { + // immediately check if we should even attempt to parse a context + if (!frame.context || !globalOptions.fetchContext) return; + + var context = frame.context, + pivot = ~~(context.length / 2), + i = context.length, isMinified = false; + + while (i--) { + // We're making a guess to see if the source is minified or not. + // To do that, we make the assumption if *any* of the lines passed + // in are greater than 300 characters long, we bail. + // Sentry will see that there isn't a context + if (context[i].length > 300) { + isMinified = true; + break; + } + } + + if (isMinified) { + // The source is minified and we don't know which column. Fuck it. + if (isUndefined(frame.column)) return; + + // If the source is minified and has a frame column + // we take a chunk of the offending line to hopefully shed some light + return [ + [], // no pre_context + context[pivot].substr(frame.column, 50), // grab 50 characters, starting at the offending column + [] // no post_context + ]; + } + + return [ + context.slice(0, pivot), // pre_context + context[pivot], // context_line + context.slice(pivot + 1) // post_context + ]; +} + +function processException(type, message, fileurl, lineno, frames, options) { + var stacktrace, label, i; + + // IE8 really doesn't have Array.prototype.indexOf + // Filter out a message that matches our ignore list + i = globalOptions.ignoreErrors.length; + while (i--) { + if (message === globalOptions.ignoreErrors[i]) { + return; + } + } + + if (frames && frames.length) { + stacktrace = {frames: frames}; + fileurl = fileurl || frames[0].filename; + } else if (fileurl) { + stacktrace = { + frames: [{ + filename: fileurl, + lineno: lineno + }] + }; + } + + i = globalOptions.ignoreUrls.length; + while (i--) { + if (globalOptions.ignoreUrls[i].test(fileurl)) { + return; + } + } + + label = lineno ? message + ' at ' + lineno : message; + + // Fire away! + send( + arrayMerge({ + 'sentry.interfaces.Exception': { + type: type, + value: message + }, + 'sentry.interfaces.Stacktrace': stacktrace, + culprit: fileurl, + message: label + }, options) + ); +} + +function arrayMerge(arr1, arr2) { + if (!arr2) { + return arr1; + } + each(arr2, function(key, value){ + arr1[key] = value; + }); + return arr1; +} + +function getHttpData() { + var http = { + url: window.location.href, + headers: { + 'User-Agent': navigator.userAgent + } + }; + + if (window.document.referrer) { + http.headers.Referer = window.document.referrer; + } + + return http; +} + +function send(data) { + if (!isSetup()) return; + + data = arrayMerge({ + project: globalProject, + logger: globalOptions.logger, + site: globalOptions.site, + platform: 'javascript', + 'sentry.interfaces.Http': getHttpData() + }, data); + + if (globalUser) data['sentry.interfaces.User'] = globalUser; + + if (isFunction(globalOptions.dataCallback)) { + data = globalOptions.dataCallback(data); + } + + makeRequest(data); +} + +function makeRequest(data) { + new Image().src = globalServer + getAuthQueryString() + '&sentry_data=' + encodeURIComponent(JSON.stringify(data)); +} + +function isSetup() { + if (!hasJSON) return false; // needs JSON support + if (!globalServer) { + if (window.console && console.error) { + console.error("Error: Raven has not been configured."); + } + return false; + } + return true; +} + +// Expose Raven to the world +window.Raven = Raven; + +// AMD +if (typeof define === 'function' && define.amd) { + define('raven', [], function() { return Raven; }); +} + +})(window); + +/* @source */; + +require.config({ + baseUrl: '/js/' +}); +define('raven', 'lib/raven-1.0.8.js'); + +require( + ['raven'], + function(Raven) { + // app.yaml + var sentry_dsn = "http://dda66d28e34741e6ba430d44deebbeba@onimaru-stable.intra.douban.com/10"; + var options = { + includePaths: [/https?:\/\/code\.dapps\.douban\.com/] + }; + Raven.config(sentry_dsn, options).install(); + } +) diff --git a/dist/js/mod/register.js b/dist/js/mod/register.js new file mode 100644 index 0000000..731e2a4 --- /dev/null +++ b/dist/js/mod/register.js @@ -0,0 +1,22160 @@ +webpackJsonp([1],[ +/* 0 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + + var _reactDom = __webpack_require__(1); + + var _reactDom2 = _interopRequireDefault(_reactDom); + + var _react = __webpack_require__(147); + + var _react2 = _interopRequireDefault(_react); + + var _signup = __webpack_require__(168); + + var _signup2 = _interopRequireDefault(_signup); + + _reactDom2['default'].render(_react2['default'].createElement(_signup2['default'], null), document.getElementById('main')); + +/***/ }, +/* 1 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + module.exports = __webpack_require__(2); + + +/***/ }, +/* 2 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactDOM + */ + + /* globals __REACT_DEVTOOLS_GLOBAL_HOOK__*/ + + 'use strict'; + + var ReactCurrentOwner = __webpack_require__(4); + var ReactDOMTextComponent = __webpack_require__(5); + var ReactDefaultInjection = __webpack_require__(70); + var ReactInstanceHandles = __webpack_require__(44); + var ReactMount = __webpack_require__(27); + var ReactPerf = __webpack_require__(17); + var ReactReconciler = __webpack_require__(49); + var ReactUpdates = __webpack_require__(53); + var ReactVersion = __webpack_require__(145); + + var findDOMNode = __webpack_require__(90); + var renderSubtreeIntoContainer = __webpack_require__(146); + var warning = __webpack_require__(24); + + ReactDefaultInjection.inject(); + + var render = ReactPerf.measure('React', 'render', ReactMount.render); + + var React = { + findDOMNode: findDOMNode, + render: render, + unmountComponentAtNode: ReactMount.unmountComponentAtNode, + version: ReactVersion, + + /* eslint-disable camelcase */ + unstable_batchedUpdates: ReactUpdates.batchedUpdates, + unstable_renderSubtreeIntoContainer: renderSubtreeIntoContainer + }; + + // Inject the runtime into a devtools global hook regardless of browser. + // Allows for debugging when the hook is injected on the page. + /* eslint-enable camelcase */ + if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.inject === 'function') { + __REACT_DEVTOOLS_GLOBAL_HOOK__.inject({ + CurrentOwner: ReactCurrentOwner, + InstanceHandles: ReactInstanceHandles, + Mount: ReactMount, + Reconciler: ReactReconciler, + TextComponent: ReactDOMTextComponent + }); + } + + if (process.env.NODE_ENV !== 'production') { + var ExecutionEnvironment = __webpack_require__(8); + if (ExecutionEnvironment.canUseDOM && window.top === window.self) { + + // First check if devtools is not installed + if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined') { + // If we're in Chrome or Firefox, provide a download link if not installed. + if (navigator.userAgent.indexOf('Chrome') > -1 && navigator.userAgent.indexOf('Edge') === -1 || navigator.userAgent.indexOf('Firefox') > -1) { + console.debug('Download the React DevTools for a better development experience: ' + 'https://fb.me/react-devtools'); + } + } + + // If we're in IE8, check to see if we are in compatibility mode and provide + // information on preventing compatibility mode + var ieCompatibilityMode = document.documentMode && document.documentMode < 8; + + process.env.NODE_ENV !== 'production' ? warning(!ieCompatibilityMode, 'Internet Explorer is running in compatibility mode; please add the ' + 'following tag to your HTML to prevent this from happening: ' + '<meta http-equiv="X-UA-Compatible" content="IE=edge" />') : undefined; + + var expectedFeatures = [ + // shims + Array.isArray, Array.prototype.every, Array.prototype.forEach, Array.prototype.indexOf, Array.prototype.map, Date.now, Function.prototype.bind, Object.keys, String.prototype.split, String.prototype.trim, + + // shams + Object.create, Object.freeze]; + + for (var i = 0; i < expectedFeatures.length; i++) { + if (!expectedFeatures[i]) { + console.error('One or more ES5 shim/shams expected by React are not available: ' + 'https://fb.me/react-warning-polyfills'); + break; + } + } + } + } + + module.exports = React; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 3 */ +/***/ function(module, exports) { + + // shim for using process in browser + + var process = module.exports = {}; + var queue = []; + var draining = false; + var currentQueue; + var queueIndex = -1; + + function cleanUpNextTick() { + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } + } + + function drainQueue() { + if (draining) { + return; + } + var timeout = setTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + clearTimeout(timeout); + } + + process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + setTimeout(drainQueue, 0); + } + }; + + // v8 likes predictible objects + function Item(fun, array) { + this.fun = fun; + this.array = array; + } + Item.prototype.run = function () { + this.fun.apply(null, this.array); + }; + process.title = 'browser'; + process.browser = true; + process.env = {}; + process.argv = []; + process.version = ''; // empty string to avoid regexp issues + process.versions = {}; + + function noop() {} + + process.on = noop; + process.addListener = noop; + process.once = noop; + process.off = noop; + process.removeListener = noop; + process.removeAllListeners = noop; + process.emit = noop; + + process.binding = function (name) { + throw new Error('process.binding is not supported'); + }; + + process.cwd = function () { return '/' }; + process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); + }; + process.umask = function() { return 0; }; + + +/***/ }, +/* 4 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactCurrentOwner + */ + + 'use strict'; + + /** + * Keeps track of the current owner. + * + * The current owner is the component who should own any components that are + * currently being constructed. + */ + var ReactCurrentOwner = { + + /** + * @internal + * @type {ReactComponent} + */ + current: null + + }; + + module.exports = ReactCurrentOwner; + +/***/ }, +/* 5 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactDOMTextComponent + * @typechecks static-only + */ + + 'use strict'; + + var DOMChildrenOperations = __webpack_require__(6); + var DOMPropertyOperations = __webpack_require__(21); + var ReactComponentBrowserEnvironment = __webpack_require__(25); + var ReactMount = __webpack_require__(27); + + var assign = __webpack_require__(38); + var escapeTextContentForBrowser = __webpack_require__(20); + var setTextContent = __webpack_require__(19); + var validateDOMNesting = __webpack_require__(69); + + /** + * Text nodes violate a couple assumptions that React makes about components: + * + * - When mounting text into the DOM, adjacent text nodes are merged. + * - Text nodes cannot be assigned a React root ID. + * + * This component is used to wrap strings in elements so that they can undergo + * the same reconciliation that is applied to elements. + * + * TODO: Investigate representing React components in the DOM with text nodes. + * + * @class ReactDOMTextComponent + * @extends ReactComponent + * @internal + */ + var ReactDOMTextComponent = function (props) { + // This constructor and its argument is currently used by mocks. + }; + + assign(ReactDOMTextComponent.prototype, { + + /** + * @param {ReactText} text + * @internal + */ + construct: function (text) { + // TODO: This is really a ReactText (ReactNode), not a ReactElement + this._currentElement = text; + this._stringText = '' + text; + + // Properties + this._rootNodeID = null; + this._mountIndex = 0; + }, + + /** + * Creates the markup for this text node. This node is not intended to have + * any features besides containing text content. + * + * @param {string} rootID DOM ID of the root node. + * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction + * @return {string} Markup for this text node. + * @internal + */ + mountComponent: function (rootID, transaction, context) { + if (process.env.NODE_ENV !== 'production') { + if (context[validateDOMNesting.ancestorInfoContextKey]) { + validateDOMNesting('span', null, context[validateDOMNesting.ancestorInfoContextKey]); + } + } + + this._rootNodeID = rootID; + if (transaction.useCreateElement) { + var ownerDocument = context[ReactMount.ownerDocumentContextKey]; + var el = ownerDocument.createElement('span'); + DOMPropertyOperations.setAttributeForID(el, rootID); + // Populate node cache + ReactMount.getID(el); + setTextContent(el, this._stringText); + return el; + } else { + var escapedText = escapeTextContentForBrowser(this._stringText); + + if (transaction.renderToStaticMarkup) { + // Normally we'd wrap this in a `span` for the reasons stated above, but + // since this is a situation where React won't take over (static pages), + // we can simply return the text as it is. + return escapedText; + } + + return '<span ' + DOMPropertyOperations.createMarkupForID(rootID) + '>' + escapedText + '</span>'; + } + }, + + /** + * Updates this component by updating the text content. + * + * @param {ReactText} nextText The next text content + * @param {ReactReconcileTransaction} transaction + * @internal + */ + receiveComponent: function (nextText, transaction) { + if (nextText !== this._currentElement) { + this._currentElement = nextText; + var nextStringText = '' + nextText; + if (nextStringText !== this._stringText) { + // TODO: Save this as pending props and use performUpdateIfNecessary + // and/or updateComponent to do the actual update for consistency with + // other component types? + this._stringText = nextStringText; + var node = ReactMount.getNode(this._rootNodeID); + DOMChildrenOperations.updateTextContent(node, nextStringText); + } + } + }, + + unmountComponent: function () { + ReactComponentBrowserEnvironment.unmountIDFromEnvironment(this._rootNodeID); + } + + }); + + module.exports = ReactDOMTextComponent; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 6 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule DOMChildrenOperations + * @typechecks static-only + */ + + 'use strict'; + + var Danger = __webpack_require__(7); + var ReactMultiChildUpdateTypes = __webpack_require__(15); + var ReactPerf = __webpack_require__(17); + + var setInnerHTML = __webpack_require__(18); + var setTextContent = __webpack_require__(19); + var invariant = __webpack_require__(12); + + /** + * Inserts `childNode` as a child of `parentNode` at the `index`. + * + * @param {DOMElement} parentNode Parent node in which to insert. + * @param {DOMElement} childNode Child node to insert. + * @param {number} index Index at which to insert the child. + * @internal + */ + function insertChildAt(parentNode, childNode, index) { + // By exploiting arrays returning `undefined` for an undefined index, we can + // rely exclusively on `insertBefore(node, null)` instead of also using + // `appendChild(node)`. However, using `undefined` is not allowed by all + // browsers so we must replace it with `null`. + + // fix render order error in safari + // IE8 will throw error when index out of list size. + var beforeChild = index >= parentNode.childNodes.length ? null : parentNode.childNodes.item(index); + + parentNode.insertBefore(childNode, beforeChild); + } + + /** + * Operations for updating with DOM children. + */ + var DOMChildrenOperations = { + + dangerouslyReplaceNodeWithMarkup: Danger.dangerouslyReplaceNodeWithMarkup, + + updateTextContent: setTextContent, + + /** + * Updates a component's children by processing a series of updates. The + * update configurations are each expected to have a `parentNode` property. + * + * @param {array<object>} updates List of update configurations. + * @param {array<string>} markupList List of markup strings. + * @internal + */ + processUpdates: function (updates, markupList) { + var update; + // Mapping from parent IDs to initial child orderings. + var initialChildren = null; + // List of children that will be moved or removed. + var updatedChildren = null; + + for (var i = 0; i < updates.length; i++) { + update = updates[i]; + if (update.type === ReactMultiChildUpdateTypes.MOVE_EXISTING || update.type === ReactMultiChildUpdateTypes.REMOVE_NODE) { + var updatedIndex = update.fromIndex; + var updatedChild = update.parentNode.childNodes[updatedIndex]; + var parentID = update.parentID; + + !updatedChild ? process.env.NODE_ENV !== 'production' ? invariant(false, 'processUpdates(): Unable to find child %s of element. This ' + 'probably means the DOM was unexpectedly mutated (e.g., by the ' + 'browser), usually due to forgetting a <tbody> when using tables, ' + 'nesting tags like <form>, <p>, or <a>, or using non-SVG elements ' + 'in an <svg> parent. Try inspecting the child nodes of the element ' + 'with React ID `%s`.', updatedIndex, parentID) : invariant(false) : undefined; + + initialChildren = initialChildren || {}; + initialChildren[parentID] = initialChildren[parentID] || []; + initialChildren[parentID][updatedIndex] = updatedChild; + + updatedChildren = updatedChildren || []; + updatedChildren.push(updatedChild); + } + } + + var renderedMarkup; + // markupList is either a list of markup or just a list of elements + if (markupList.length && typeof markupList[0] === 'string') { + renderedMarkup = Danger.dangerouslyRenderMarkup(markupList); + } else { + renderedMarkup = markupList; + } + + // Remove updated children first so that `toIndex` is consistent. + if (updatedChildren) { + for (var j = 0; j < updatedChildren.length; j++) { + updatedChildren[j].parentNode.removeChild(updatedChildren[j]); + } + } + + for (var k = 0; k < updates.length; k++) { + update = updates[k]; + switch (update.type) { + case ReactMultiChildUpdateTypes.INSERT_MARKUP: + insertChildAt(update.parentNode, renderedMarkup[update.markupIndex], update.toIndex); + break; + case ReactMultiChildUpdateTypes.MOVE_EXISTING: + insertChildAt(update.parentNode, initialChildren[update.parentID][update.fromIndex], update.toIndex); + break; + case ReactMultiChildUpdateTypes.SET_MARKUP: + setInnerHTML(update.parentNode, update.content); + break; + case ReactMultiChildUpdateTypes.TEXT_CONTENT: + setTextContent(update.parentNode, update.content); + break; + case ReactMultiChildUpdateTypes.REMOVE_NODE: + // Already removed by the for-loop above. + break; + } + } + } + + }; + + ReactPerf.measureMethods(DOMChildrenOperations, 'DOMChildrenOperations', { + updateTextContent: 'updateTextContent' + }); + + module.exports = DOMChildrenOperations; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 7 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule Danger + * @typechecks static-only + */ + + 'use strict'; + + var ExecutionEnvironment = __webpack_require__(8); + + var createNodesFromMarkup = __webpack_require__(9); + var emptyFunction = __webpack_require__(14); + var getMarkupWrap = __webpack_require__(13); + var invariant = __webpack_require__(12); + + var OPEN_TAG_NAME_EXP = /^(<[^ \/>]+)/; + var RESULT_INDEX_ATTR = 'data-danger-index'; + + /** + * Extracts the `nodeName` from a string of markup. + * + * NOTE: Extracting the `nodeName` does not require a regular expression match + * because we make assumptions about React-generated markup (i.e. there are no + * spaces surrounding the opening tag and there is at least one attribute). + * + * @param {string} markup String of markup. + * @return {string} Node name of the supplied markup. + * @see http://jsperf.com/extract-nodename + */ + function getNodeName(markup) { + return markup.substring(1, markup.indexOf(' ')); + } + + var Danger = { + + /** + * Renders markup into an array of nodes. The markup is expected to render + * into a list of root nodes. Also, the length of `resultList` and + * `markupList` should be the same. + * + * @param {array<string>} markupList List of markup strings to render. + * @return {array<DOMElement>} List of rendered nodes. + * @internal + */ + dangerouslyRenderMarkup: function (markupList) { + !ExecutionEnvironment.canUseDOM ? process.env.NODE_ENV !== 'production' ? invariant(false, 'dangerouslyRenderMarkup(...): Cannot render markup in a worker ' + 'thread. Make sure `window` and `document` are available globally ' + 'before requiring React when unit testing or use ' + 'ReactDOMServer.renderToString for server rendering.') : invariant(false) : undefined; + var nodeName; + var markupByNodeName = {}; + // Group markup by `nodeName` if a wrap is necessary, else by '*'. + for (var i = 0; i < markupList.length; i++) { + !markupList[i] ? process.env.NODE_ENV !== 'production' ? invariant(false, 'dangerouslyRenderMarkup(...): Missing markup.') : invariant(false) : undefined; + nodeName = getNodeName(markupList[i]); + nodeName = getMarkupWrap(nodeName) ? nodeName : '*'; + markupByNodeName[nodeName] = markupByNodeName[nodeName] || []; + markupByNodeName[nodeName][i] = markupList[i]; + } + var resultList = []; + var resultListAssignmentCount = 0; + for (nodeName in markupByNodeName) { + if (!markupByNodeName.hasOwnProperty(nodeName)) { + continue; + } + var markupListByNodeName = markupByNodeName[nodeName]; + + // This for-in loop skips the holes of the sparse array. The order of + // iteration should follow the order of assignment, which happens to match + // numerical index order, but we don't rely on that. + var resultIndex; + for (resultIndex in markupListByNodeName) { + if (markupListByNodeName.hasOwnProperty(resultIndex)) { + var markup = markupListByNodeName[resultIndex]; + + // Push the requested markup with an additional RESULT_INDEX_ATTR + // attribute. If the markup does not start with a < character, it + // will be discarded below (with an appropriate console.error). + markupListByNodeName[resultIndex] = markup.replace(OPEN_TAG_NAME_EXP, + // This index will be parsed back out below. + '$1 ' + RESULT_INDEX_ATTR + '="' + resultIndex + '" '); + } + } + + // Render each group of markup with similar wrapping `nodeName`. + var renderNodes = createNodesFromMarkup(markupListByNodeName.join(''), emptyFunction // Do nothing special with <script> tags. + ); + + for (var j = 0; j < renderNodes.length; ++j) { + var renderNode = renderNodes[j]; + if (renderNode.hasAttribute && renderNode.hasAttribute(RESULT_INDEX_ATTR)) { + + resultIndex = +renderNode.getAttribute(RESULT_INDEX_ATTR); + renderNode.removeAttribute(RESULT_INDEX_ATTR); + + !!resultList.hasOwnProperty(resultIndex) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Danger: Assigning to an already-occupied result index.') : invariant(false) : undefined; + + resultList[resultIndex] = renderNode; + + // This should match resultList.length and markupList.length when + // we're done. + resultListAssignmentCount += 1; + } else if (process.env.NODE_ENV !== 'production') { + console.error('Danger: Discarding unexpected node:', renderNode); + } + } + } + + // Although resultList was populated out of order, it should now be a dense + // array. + !(resultListAssignmentCount === resultList.length) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Danger: Did not assign to every index of resultList.') : invariant(false) : undefined; + + !(resultList.length === markupList.length) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Danger: Expected markup to render %s nodes, but rendered %s.', markupList.length, resultList.length) : invariant(false) : undefined; + + return resultList; + }, + + /** + * Replaces a node with a string of markup at its current position within its + * parent. The markup must render into a single root node. + * + * @param {DOMElement} oldChild Child node to replace. + * @param {string} markup Markup to render in place of the child node. + * @internal + */ + dangerouslyReplaceNodeWithMarkup: function (oldChild, markup) { + !ExecutionEnvironment.canUseDOM ? process.env.NODE_ENV !== 'production' ? invariant(false, 'dangerouslyReplaceNodeWithMarkup(...): Cannot render markup in a ' + 'worker thread. Make sure `window` and `document` are available ' + 'globally before requiring React when unit testing or use ' + 'ReactDOMServer.renderToString() for server rendering.') : invariant(false) : undefined; + !markup ? process.env.NODE_ENV !== 'production' ? invariant(false, 'dangerouslyReplaceNodeWithMarkup(...): Missing markup.') : invariant(false) : undefined; + !(oldChild.tagName.toLowerCase() !== 'html') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'dangerouslyReplaceNodeWithMarkup(...): Cannot replace markup of the ' + '<html> node. This is because browser quirks make this unreliable ' + 'and/or slow. If you want to render to the root you must use ' + 'server rendering. See ReactDOMServer.renderToString().') : invariant(false) : undefined; + + var newChild; + if (typeof markup === 'string') { + newChild = createNodesFromMarkup(markup, emptyFunction)[0]; + } else { + newChild = markup; + } + oldChild.parentNode.replaceChild(newChild, oldChild); + } + + }; + + module.exports = Danger; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 8 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ExecutionEnvironment + */ + + 'use strict'; + + var canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement); + + /** + * Simple, lightweight module assisting with the detection and context of + * Worker. Helps avoid circular dependencies and allows code to reason about + * whether or not they are in a Worker, even if they never include the main + * `ReactWorker` dependency. + */ + var ExecutionEnvironment = { + + canUseDOM: canUseDOM, + + canUseWorkers: typeof Worker !== 'undefined', + + canUseEventListeners: canUseDOM && !!(window.addEventListener || window.attachEvent), + + canUseViewport: canUseDOM && !!window.screen, + + isInWorker: !canUseDOM // For now, this is true - might change in the future. + + }; + + module.exports = ExecutionEnvironment; + +/***/ }, +/* 9 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule createNodesFromMarkup + * @typechecks + */ + + /*eslint-disable fb-www/unsafe-html*/ + + 'use strict'; + + var ExecutionEnvironment = __webpack_require__(8); + + var createArrayFromMixed = __webpack_require__(10); + var getMarkupWrap = __webpack_require__(13); + var invariant = __webpack_require__(12); + + /** + * Dummy container used to render all markup. + */ + var dummyNode = ExecutionEnvironment.canUseDOM ? document.createElement('div') : null; + + /** + * Pattern used by `getNodeName`. + */ + var nodeNamePattern = /^\s*<(\w+)/; + + /** + * Extracts the `nodeName` of the first element in a string of markup. + * + * @param {string} markup String of markup. + * @return {?string} Node name of the supplied markup. + */ + function getNodeName(markup) { + var nodeNameMatch = markup.match(nodeNamePattern); + return nodeNameMatch && nodeNameMatch[1].toLowerCase(); + } + + /** + * Creates an array containing the nodes rendered from the supplied markup. The + * optionally supplied `handleScript` function will be invoked once for each + * <script> element that is rendered. If no `handleScript` function is supplied, + * an exception is thrown if any <script> elements are rendered. + * + * @param {string} markup A string of valid HTML markup. + * @param {?function} handleScript Invoked once for each rendered <script>. + * @return {array<DOMElement|DOMTextNode>} An array of rendered nodes. + */ + function createNodesFromMarkup(markup, handleScript) { + var node = dummyNode; + !!!dummyNode ? process.env.NODE_ENV !== 'production' ? invariant(false, 'createNodesFromMarkup dummy not initialized') : invariant(false) : undefined; + var nodeName = getNodeName(markup); + + var wrap = nodeName && getMarkupWrap(nodeName); + if (wrap) { + node.innerHTML = wrap[1] + markup + wrap[2]; + + var wrapDepth = wrap[0]; + while (wrapDepth--) { + node = node.lastChild; + } + } else { + node.innerHTML = markup; + } + + var scripts = node.getElementsByTagName('script'); + if (scripts.length) { + !handleScript ? process.env.NODE_ENV !== 'production' ? invariant(false, 'createNodesFromMarkup(...): Unexpected <script> element rendered.') : invariant(false) : undefined; + createArrayFromMixed(scripts).forEach(handleScript); + } + + var nodes = createArrayFromMixed(node.childNodes); + while (node.lastChild) { + node.removeChild(node.lastChild); + } + return nodes; + } + + module.exports = createNodesFromMarkup; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 10 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule createArrayFromMixed + * @typechecks + */ + + 'use strict'; + + var toArray = __webpack_require__(11); + + /** + * Perform a heuristic test to determine if an object is "array-like". + * + * A monk asked Joshu, a Zen master, "Has a dog Buddha nature?" + * Joshu replied: "Mu." + * + * This function determines if its argument has "array nature": it returns + * true if the argument is an actual array, an `arguments' object, or an + * HTMLCollection (e.g. node.childNodes or node.getElementsByTagName()). + * + * It will return false for other array-like objects like Filelist. + * + * @param {*} obj + * @return {boolean} + */ + function hasArrayNature(obj) { + return( + // not null/false + !!obj && ( + // arrays are objects, NodeLists are functions in Safari + typeof obj == 'object' || typeof obj == 'function') && + // quacks like an array + 'length' in obj && + // not window + !('setInterval' in obj) && + // no DOM node should be considered an array-like + // a 'select' element has 'length' and 'item' properties on IE8 + typeof obj.nodeType != 'number' && ( + // a real array + Array.isArray(obj) || + // arguments + 'callee' in obj || + // HTMLCollection/NodeList + 'item' in obj) + ); + } + + /** + * Ensure that the argument is an array by wrapping it in an array if it is not. + * Creates a copy of the argument if it is already an array. + * + * This is mostly useful idiomatically: + * + * var createArrayFromMixed = require('createArrayFromMixed'); + * + * function takesOneOrMoreThings(things) { + * things = createArrayFromMixed(things); + * ... + * } + * + * This allows you to treat `things' as an array, but accept scalars in the API. + * + * If you need to convert an array-like object, like `arguments`, into an array + * use toArray instead. + * + * @param {*} obj + * @return {array} + */ + function createArrayFromMixed(obj) { + if (!hasArrayNature(obj)) { + return [obj]; + } else if (Array.isArray(obj)) { + return obj.slice(); + } else { + return toArray(obj); + } + } + + module.exports = createArrayFromMixed; + +/***/ }, +/* 11 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule toArray + * @typechecks + */ + + 'use strict'; + + var invariant = __webpack_require__(12); + + /** + * Convert array-like objects to arrays. + * + * This API assumes the caller knows the contents of the data type. For less + * well defined inputs use createArrayFromMixed. + * + * @param {object|function|filelist} obj + * @return {array} + */ + function toArray(obj) { + var length = obj.length; + + // Some browse builtin objects can report typeof 'function' (e.g. NodeList in + // old versions of Safari). + !(!Array.isArray(obj) && (typeof obj === 'object' || typeof obj === 'function')) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'toArray: Array-like object expected') : invariant(false) : undefined; + + !(typeof length === 'number') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'toArray: Object needs a length property') : invariant(false) : undefined; + + !(length === 0 || length - 1 in obj) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'toArray: Object should have keys for indices') : invariant(false) : undefined; + + // Old IE doesn't give collections access to hasOwnProperty. Assume inputs + // without method will throw during the slice call and skip straight to the + // fallback. + if (obj.hasOwnProperty) { + try { + return Array.prototype.slice.call(obj); + } catch (e) { + // IE < 9 does not support Array#slice on collections objects + } + } + + // Fall back to copying key by key. This assumes all keys have a value, + // so will not preserve sparsely populated inputs. + var ret = Array(length); + for (var ii = 0; ii < length; ii++) { + ret[ii] = obj[ii]; + } + return ret; + } + + module.exports = toArray; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 12 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule invariant + */ + + 'use strict'; + + /** + * Use invariant() to assert state which your program assumes to be true. + * + * Provide sprintf-style format (only %s is supported) and arguments + * to provide information about what broke and what you were + * expecting. + * + * The invariant message will be stripped in production, but the invariant + * will remain to ensure logic does not differ in production. + */ + + var invariant = function (condition, format, a, b, c, d, e, f) { + if (process.env.NODE_ENV !== 'production') { + if (format === undefined) { + throw new Error('invariant requires an error message argument'); + } + } + + if (!condition) { + var error; + if (format === undefined) { + error = new Error('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.'); + } else { + var args = [a, b, c, d, e, f]; + var argIndex = 0; + error = new Error('Invariant Violation: ' + format.replace(/%s/g, function () { + return args[argIndex++]; + })); + } + + error.framesToPop = 1; // we don't care about invariant's own frame + throw error; + } + }; + + module.exports = invariant; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 13 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule getMarkupWrap + */ + + /*eslint-disable fb-www/unsafe-html */ + + 'use strict'; + + var ExecutionEnvironment = __webpack_require__(8); + + var invariant = __webpack_require__(12); + + /** + * Dummy container used to detect which wraps are necessary. + */ + var dummyNode = ExecutionEnvironment.canUseDOM ? document.createElement('div') : null; + + /** + * Some browsers cannot use `innerHTML` to render certain elements standalone, + * so we wrap them, render the wrapped nodes, then extract the desired node. + * + * In IE8, certain elements cannot render alone, so wrap all elements ('*'). + */ + + var shouldWrap = {}; + + var selectWrap = [1, '<select multiple="true">', '</select>']; + var tableWrap = [1, '<table>', '</table>']; + var trWrap = [3, '<table><tbody><tr>', '</tr></tbody></table>']; + + var svgWrap = [1, '<svg xmlns="http://www.w3.org/2000/svg">', '</svg>']; + + var markupWrap = { + '*': [1, '?<div>', '</div>'], + + 'area': [1, '<map>', '</map>'], + 'col': [2, '<table><tbody></tbody><colgroup>', '</colgroup></table>'], + 'legend': [1, '<fieldset>', '</fieldset>'], + 'param': [1, '<object>', '</object>'], + 'tr': [2, '<table><tbody>', '</tbody></table>'], + + 'optgroup': selectWrap, + 'option': selectWrap, + + 'caption': tableWrap, + 'colgroup': tableWrap, + 'tbody': tableWrap, + 'tfoot': tableWrap, + 'thead': tableWrap, + + 'td': trWrap, + 'th': trWrap + }; + + // Initialize the SVG elements since we know they'll always need to be wrapped + // consistently. If they are created inside a <div> they will be initialized in + // the wrong namespace (and will not display). + var svgElements = ['circle', 'clipPath', 'defs', 'ellipse', 'g', 'image', 'line', 'linearGradient', 'mask', 'path', 'pattern', 'polygon', 'polyline', 'radialGradient', 'rect', 'stop', 'text', 'tspan']; + svgElements.forEach(function (nodeName) { + markupWrap[nodeName] = svgWrap; + shouldWrap[nodeName] = true; + }); + + /** + * Gets the markup wrap configuration for the supplied `nodeName`. + * + * NOTE: This lazily detects which wraps are necessary for the current browser. + * + * @param {string} nodeName Lowercase `nodeName`. + * @return {?array} Markup wrap configuration, if applicable. + */ + function getMarkupWrap(nodeName) { + !!!dummyNode ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Markup wrapping node not initialized') : invariant(false) : undefined; + if (!markupWrap.hasOwnProperty(nodeName)) { + nodeName = '*'; + } + if (!shouldWrap.hasOwnProperty(nodeName)) { + if (nodeName === '*') { + dummyNode.innerHTML = '<link />'; + } else { + dummyNode.innerHTML = '<' + nodeName + '></' + nodeName + '>'; + } + shouldWrap[nodeName] = !dummyNode.firstChild; + } + return shouldWrap[nodeName] ? markupWrap[nodeName] : null; + } + + module.exports = getMarkupWrap; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 14 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule emptyFunction + */ + + "use strict"; + + function makeEmptyFunction(arg) { + return function () { + return arg; + }; + } + + /** + * This function accepts and discards inputs; it has no side effects. This is + * primarily useful idiomatically for overridable function endpoints which + * always need to be callable, since JS lacks a null-call idiom ala Cocoa. + */ + function emptyFunction() {} + + emptyFunction.thatReturns = makeEmptyFunction; + emptyFunction.thatReturnsFalse = makeEmptyFunction(false); + emptyFunction.thatReturnsTrue = makeEmptyFunction(true); + emptyFunction.thatReturnsNull = makeEmptyFunction(null); + emptyFunction.thatReturnsThis = function () { + return this; + }; + emptyFunction.thatReturnsArgument = function (arg) { + return arg; + }; + + module.exports = emptyFunction; + +/***/ }, +/* 15 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactMultiChildUpdateTypes + */ + + 'use strict'; + + var keyMirror = __webpack_require__(16); + + /** + * When a component's children are updated, a series of update configuration + * objects are created in order to batch and serialize the required changes. + * + * Enumerates all the possible types of update configurations. + * + * @internal + */ + var ReactMultiChildUpdateTypes = keyMirror({ + INSERT_MARKUP: null, + MOVE_EXISTING: null, + REMOVE_NODE: null, + SET_MARKUP: null, + TEXT_CONTENT: null + }); + + module.exports = ReactMultiChildUpdateTypes; + +/***/ }, +/* 16 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule keyMirror + * @typechecks static-only + */ + + 'use strict'; + + var invariant = __webpack_require__(12); + + /** + * Constructs an enumeration with keys equal to their value. + * + * For example: + * + * var COLORS = keyMirror({blue: null, red: null}); + * var myColor = COLORS.blue; + * var isColorValid = !!COLORS[myColor]; + * + * The last line could not be performed if the values of the generated enum were + * not equal to their keys. + * + * Input: {key1: val1, key2: val2} + * Output: {key1: key1, key2: key2} + * + * @param {object} obj + * @return {object} + */ + var keyMirror = function (obj) { + var ret = {}; + var key; + !(obj instanceof Object && !Array.isArray(obj)) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'keyMirror(...): Argument must be an object.') : invariant(false) : undefined; + for (key in obj) { + if (!obj.hasOwnProperty(key)) { + continue; + } + ret[key] = key; + } + return ret; + }; + + module.exports = keyMirror; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 17 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactPerf + * @typechecks static-only + */ + + 'use strict'; + + /** + * ReactPerf is a general AOP system designed to measure performance. This + * module only has the hooks: see ReactDefaultPerf for the analysis tool. + */ + var ReactPerf = { + /** + * Boolean to enable/disable measurement. Set to false by default to prevent + * accidental logging and perf loss. + */ + enableMeasure: false, + + /** + * Holds onto the measure function in use. By default, don't measure + * anything, but we'll override this if we inject a measure function. + */ + storedMeasure: _noMeasure, + + /** + * @param {object} object + * @param {string} objectName + * @param {object<string>} methodNames + */ + measureMethods: function (object, objectName, methodNames) { + if (process.env.NODE_ENV !== 'production') { + for (var key in methodNames) { + if (!methodNames.hasOwnProperty(key)) { + continue; + } + object[key] = ReactPerf.measure(objectName, methodNames[key], object[key]); + } + } + }, + + /** + * Use this to wrap methods you want to measure. Zero overhead in production. + * + * @param {string} objName + * @param {string} fnName + * @param {function} func + * @return {function} + */ + measure: function (objName, fnName, func) { + if (process.env.NODE_ENV !== 'production') { + var measuredFunc = null; + var wrapper = function () { + if (ReactPerf.enableMeasure) { + if (!measuredFunc) { + measuredFunc = ReactPerf.storedMeasure(objName, fnName, func); + } + return measuredFunc.apply(this, arguments); + } + return func.apply(this, arguments); + }; + wrapper.displayName = objName + '_' + fnName; + return wrapper; + } + return func; + }, + + injection: { + /** + * @param {function} measure + */ + injectMeasure: function (measure) { + ReactPerf.storedMeasure = measure; + } + } + }; + + /** + * Simply passes through the measured function, without measuring it. + * + * @param {string} objName + * @param {string} fnName + * @param {function} func + * @return {function} + */ + function _noMeasure(objName, fnName, func) { + return func; + } + + module.exports = ReactPerf; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 18 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule setInnerHTML + */ + + /* globals MSApp */ + + 'use strict'; + + var ExecutionEnvironment = __webpack_require__(8); + + var WHITESPACE_TEST = /^[ \r\n\t\f]/; + var NONVISIBLE_TEST = /<(!--|link|noscript|meta|script|style)[ \r\n\t\f\/>]/; + + /** + * Set the innerHTML property of a node, ensuring that whitespace is preserved + * even in IE8. + * + * @param {DOMElement} node + * @param {string} html + * @internal + */ + var setInnerHTML = function (node, html) { + node.innerHTML = html; + }; + + // Win8 apps: Allow all html to be inserted + if (typeof MSApp !== 'undefined' && MSApp.execUnsafeLocalFunction) { + setInnerHTML = function (node, html) { + MSApp.execUnsafeLocalFunction(function () { + node.innerHTML = html; + }); + }; + } + + if (ExecutionEnvironment.canUseDOM) { + // IE8: When updating a just created node with innerHTML only leading + // whitespace is removed. When updating an existing node with innerHTML + // whitespace in root TextNodes is also collapsed. + // @see quirksmode.org/bugreports/archives/2004/11/innerhtml_and_t.html + + // Feature detection; only IE8 is known to behave improperly like this. + var testElement = document.createElement('div'); + testElement.innerHTML = ' '; + if (testElement.innerHTML === '') { + setInnerHTML = function (node, html) { + // Magic theory: IE8 supposedly differentiates between added and updated + // nodes when processing innerHTML, innerHTML on updated nodes suffers + // from worse whitespace behavior. Re-adding a node like this triggers + // the initial and more favorable whitespace behavior. + // TODO: What to do on a detached node? + if (node.parentNode) { + node.parentNode.replaceChild(node, node); + } + + // We also implement a workaround for non-visible tags disappearing into + // thin air on IE8, this only happens if there is no visible text + // in-front of the non-visible tags. Piggyback on the whitespace fix + // and simply check if any non-visible tags appear in the source. + if (WHITESPACE_TEST.test(html) || html[0] === '<' && NONVISIBLE_TEST.test(html)) { + // Recover leading whitespace by temporarily prepending any character. + // \uFEFF has the potential advantage of being zero-width/invisible. + // UglifyJS drops U+FEFF chars when parsing, so use String.fromCharCode + // in hopes that this is preserved even if "\uFEFF" is transformed to + // the actual Unicode character (by Babel, for example). + // https://github.com/mishoo/UglifyJS2/blob/v2.4.20/lib/parse.js#L216 + node.innerHTML = String.fromCharCode(0xFEFF) + html; + + // deleteData leaves an empty `TextNode` which offsets the index of all + // children. Definitely want to avoid this. + var textNode = node.firstChild; + if (textNode.data.length === 1) { + node.removeChild(textNode); + } else { + textNode.deleteData(0, 1); + } + } else { + node.innerHTML = html; + } + }; + } + } + + module.exports = setInnerHTML; + +/***/ }, +/* 19 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule setTextContent + */ + + 'use strict'; + + var ExecutionEnvironment = __webpack_require__(8); + var escapeTextContentForBrowser = __webpack_require__(20); + var setInnerHTML = __webpack_require__(18); + + /** + * Set the textContent property of a node, ensuring that whitespace is preserved + * even in IE8. innerText is a poor substitute for textContent and, among many + * issues, inserts <br> instead of the literal newline chars. innerHTML behaves + * as it should. + * + * @param {DOMElement} node + * @param {string} text + * @internal + */ + var setTextContent = function (node, text) { + node.textContent = text; + }; + + if (ExecutionEnvironment.canUseDOM) { + if (!('textContent' in document.documentElement)) { + setTextContent = function (node, text) { + setInnerHTML(node, escapeTextContentForBrowser(text)); + }; + } + } + + module.exports = setTextContent; + +/***/ }, +/* 20 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule escapeTextContentForBrowser + */ + + 'use strict'; + + var ESCAPE_LOOKUP = { + '&': '&', + '>': '>', + '<': '<', + '"': '"', + '\'': ''' + }; + + var ESCAPE_REGEX = /[&><"']/g; + + function escaper(match) { + return ESCAPE_LOOKUP[match]; + } + + /** + * Escapes text to prevent scripting attacks. + * + * @param {*} text Text value to escape. + * @return {string} An escaped string. + */ + function escapeTextContentForBrowser(text) { + return ('' + text).replace(ESCAPE_REGEX, escaper); + } + + module.exports = escapeTextContentForBrowser; + +/***/ }, +/* 21 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule DOMPropertyOperations + * @typechecks static-only + */ + + 'use strict'; + + var DOMProperty = __webpack_require__(22); + var ReactPerf = __webpack_require__(17); + + var quoteAttributeValueForBrowser = __webpack_require__(23); + var warning = __webpack_require__(24); + + // Simplified subset + var VALID_ATTRIBUTE_NAME_REGEX = /^[a-zA-Z_][\w\.\-]*$/; + var illegalAttributeNameCache = {}; + var validatedAttributeNameCache = {}; + + function isAttributeNameSafe(attributeName) { + if (validatedAttributeNameCache.hasOwnProperty(attributeName)) { + return true; + } + if (illegalAttributeNameCache.hasOwnProperty(attributeName)) { + return false; + } + if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) { + validatedAttributeNameCache[attributeName] = true; + return true; + } + illegalAttributeNameCache[attributeName] = true; + process.env.NODE_ENV !== 'production' ? warning(false, 'Invalid attribute name: `%s`', attributeName) : undefined; + return false; + } + + function shouldIgnoreValue(propertyInfo, value) { + return value == null || propertyInfo.hasBooleanValue && !value || propertyInfo.hasNumericValue && isNaN(value) || propertyInfo.hasPositiveNumericValue && value < 1 || propertyInfo.hasOverloadedBooleanValue && value === false; + } + + if (process.env.NODE_ENV !== 'production') { + var reactProps = { + children: true, + dangerouslySetInnerHTML: true, + key: true, + ref: true + }; + var warnedProperties = {}; + + var warnUnknownProperty = function (name) { + if (reactProps.hasOwnProperty(name) && reactProps[name] || warnedProperties.hasOwnProperty(name) && warnedProperties[name]) { + return; + } + + warnedProperties[name] = true; + var lowerCasedName = name.toLowerCase(); + + // data-* attributes should be lowercase; suggest the lowercase version + var standardName = DOMProperty.isCustomAttribute(lowerCasedName) ? lowerCasedName : DOMProperty.getPossibleStandardName.hasOwnProperty(lowerCasedName) ? DOMProperty.getPossibleStandardName[lowerCasedName] : null; + + // For now, only warn when we have a suggested correction. This prevents + // logging too much when using transferPropsTo. + process.env.NODE_ENV !== 'production' ? warning(standardName == null, 'Unknown DOM property %s. Did you mean %s?', name, standardName) : undefined; + }; + } + + /** + * Operations for dealing with DOM properties. + */ + var DOMPropertyOperations = { + + /** + * Creates markup for the ID property. + * + * @param {string} id Unescaped ID. + * @return {string} Markup string. + */ + createMarkupForID: function (id) { + return DOMProperty.ID_ATTRIBUTE_NAME + '=' + quoteAttributeValueForBrowser(id); + }, + + setAttributeForID: function (node, id) { + node.setAttribute(DOMProperty.ID_ATTRIBUTE_NAME, id); + }, + + /** + * Creates markup for a property. + * + * @param {string} name + * @param {*} value + * @return {?string} Markup string, or null if the property was invalid. + */ + createMarkupForProperty: function (name, value) { + var propertyInfo = DOMProperty.properties.hasOwnProperty(name) ? DOMProperty.properties[name] : null; + if (propertyInfo) { + if (shouldIgnoreValue(propertyInfo, value)) { + return ''; + } + var attributeName = propertyInfo.attributeName; + if (propertyInfo.hasBooleanValue || propertyInfo.hasOverloadedBooleanValue && value === true) { + return attributeName + '=""'; + } + return attributeName + '=' + quoteAttributeValueForBrowser(value); + } else if (DOMProperty.isCustomAttribute(name)) { + if (value == null) { + return ''; + } + return name + '=' + quoteAttributeValueForBrowser(value); + } else if (process.env.NODE_ENV !== 'production') { + warnUnknownProperty(name); + } + return null; + }, + + /** + * Creates markup for a custom property. + * + * @param {string} name + * @param {*} value + * @return {string} Markup string, or empty string if the property was invalid. + */ + createMarkupForCustomAttribute: function (name, value) { + if (!isAttributeNameSafe(name) || value == null) { + return ''; + } + return name + '=' + quoteAttributeValueForBrowser(value); + }, + + /** + * Sets the value for a property on a node. + * + * @param {DOMElement} node + * @param {string} name + * @param {*} value + */ + setValueForProperty: function (node, name, value) { + var propertyInfo = DOMProperty.properties.hasOwnProperty(name) ? DOMProperty.properties[name] : null; + if (propertyInfo) { + var mutationMethod = propertyInfo.mutationMethod; + if (mutationMethod) { + mutationMethod(node, value); + } else if (shouldIgnoreValue(propertyInfo, value)) { + this.deleteValueForProperty(node, name); + } else if (propertyInfo.mustUseAttribute) { + var attributeName = propertyInfo.attributeName; + var namespace = propertyInfo.attributeNamespace; + // `setAttribute` with objects becomes only `[object]` in IE8/9, + // ('' + value) makes it output the correct toString()-value. + if (namespace) { + node.setAttributeNS(namespace, attributeName, '' + value); + } else if (propertyInfo.hasBooleanValue || propertyInfo.hasOverloadedBooleanValue && value === true) { + node.setAttribute(attributeName, ''); + } else { + node.setAttribute(attributeName, '' + value); + } + } else { + var propName = propertyInfo.propertyName; + // Must explicitly cast values for HAS_SIDE_EFFECTS-properties to the + // property type before comparing; only `value` does and is string. + if (!propertyInfo.hasSideEffects || '' + node[propName] !== '' + value) { + // Contrary to `setAttribute`, object properties are properly + // `toString`ed by IE8/9. + node[propName] = value; + } + } + } else if (DOMProperty.isCustomAttribute(name)) { + DOMPropertyOperations.setValueForAttribute(node, name, value); + } else if (process.env.NODE_ENV !== 'production') { + warnUnknownProperty(name); + } + }, + + setValueForAttribute: function (node, name, value) { + if (!isAttributeNameSafe(name)) { + return; + } + if (value == null) { + node.removeAttribute(name); + } else { + node.setAttribute(name, '' + value); + } + }, + + /** + * Deletes the value for a property on a node. + * + * @param {DOMElement} node + * @param {string} name + */ + deleteValueForProperty: function (node, name) { + var propertyInfo = DOMProperty.properties.hasOwnProperty(name) ? DOMProperty.properties[name] : null; + if (propertyInfo) { + var mutationMethod = propertyInfo.mutationMethod; + if (mutationMethod) { + mutationMethod(node, undefined); + } else if (propertyInfo.mustUseAttribute) { + node.removeAttribute(propertyInfo.attributeName); + } else { + var propName = propertyInfo.propertyName; + var defaultValue = DOMProperty.getDefaultValueForProperty(node.nodeName, propName); + if (!propertyInfo.hasSideEffects || '' + node[propName] !== defaultValue) { + node[propName] = defaultValue; + } + } + } else if (DOMProperty.isCustomAttribute(name)) { + node.removeAttribute(name); + } else if (process.env.NODE_ENV !== 'production') { + warnUnknownProperty(name); + } + } + + }; + + ReactPerf.measureMethods(DOMPropertyOperations, 'DOMPropertyOperations', { + setValueForProperty: 'setValueForProperty', + setValueForAttribute: 'setValueForAttribute', + deleteValueForProperty: 'deleteValueForProperty' + }); + + module.exports = DOMPropertyOperations; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 22 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule DOMProperty + * @typechecks static-only + */ + + 'use strict'; + + var invariant = __webpack_require__(12); + + function checkMask(value, bitmask) { + return (value & bitmask) === bitmask; + } + + var DOMPropertyInjection = { + /** + * Mapping from normalized, camelcased property names to a configuration that + * specifies how the associated DOM property should be accessed or rendered. + */ + MUST_USE_ATTRIBUTE: 0x1, + MUST_USE_PROPERTY: 0x2, + HAS_SIDE_EFFECTS: 0x4, + HAS_BOOLEAN_VALUE: 0x8, + HAS_NUMERIC_VALUE: 0x10, + HAS_POSITIVE_NUMERIC_VALUE: 0x20 | 0x10, + HAS_OVERLOADED_BOOLEAN_VALUE: 0x40, + + /** + * Inject some specialized knowledge about the DOM. This takes a config object + * with the following properties: + * + * isCustomAttribute: function that given an attribute name will return true + * if it can be inserted into the DOM verbatim. Useful for data-* or aria-* + * attributes where it's impossible to enumerate all of the possible + * attribute names, + * + * Properties: object mapping DOM property name to one of the + * DOMPropertyInjection constants or null. If your attribute isn't in here, + * it won't get written to the DOM. + * + * DOMAttributeNames: object mapping React attribute name to the DOM + * attribute name. Attribute names not specified use the **lowercase** + * normalized name. + * + * DOMAttributeNamespaces: object mapping React attribute name to the DOM + * attribute namespace URL. (Attribute names not specified use no namespace.) + * + * DOMPropertyNames: similar to DOMAttributeNames but for DOM properties. + * Property names not specified use the normalized name. + * + * DOMMutationMethods: Properties that require special mutation methods. If + * `value` is undefined, the mutation method should unset the property. + * + * @param {object} domPropertyConfig the config as described above. + */ + injectDOMPropertyConfig: function (domPropertyConfig) { + var Injection = DOMPropertyInjection; + var Properties = domPropertyConfig.Properties || {}; + var DOMAttributeNamespaces = domPropertyConfig.DOMAttributeNamespaces || {}; + var DOMAttributeNames = domPropertyConfig.DOMAttributeNames || {}; + var DOMPropertyNames = domPropertyConfig.DOMPropertyNames || {}; + var DOMMutationMethods = domPropertyConfig.DOMMutationMethods || {}; + + if (domPropertyConfig.isCustomAttribute) { + DOMProperty._isCustomAttributeFunctions.push(domPropertyConfig.isCustomAttribute); + } + + for (var propName in Properties) { + !!DOMProperty.properties.hasOwnProperty(propName) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'injectDOMPropertyConfig(...): You\'re trying to inject DOM property ' + '\'%s\' which has already been injected. You may be accidentally ' + 'injecting the same DOM property config twice, or you may be ' + 'injecting two configs that have conflicting property names.', propName) : invariant(false) : undefined; + + var lowerCased = propName.toLowerCase(); + var propConfig = Properties[propName]; + + var propertyInfo = { + attributeName: lowerCased, + attributeNamespace: null, + propertyName: propName, + mutationMethod: null, + + mustUseAttribute: checkMask(propConfig, Injection.MUST_USE_ATTRIBUTE), + mustUseProperty: checkMask(propConfig, Injection.MUST_USE_PROPERTY), + hasSideEffects: checkMask(propConfig, Injection.HAS_SIDE_EFFECTS), + hasBooleanValue: checkMask(propConfig, Injection.HAS_BOOLEAN_VALUE), + hasNumericValue: checkMask(propConfig, Injection.HAS_NUMERIC_VALUE), + hasPositiveNumericValue: checkMask(propConfig, Injection.HAS_POSITIVE_NUMERIC_VALUE), + hasOverloadedBooleanValue: checkMask(propConfig, Injection.HAS_OVERLOADED_BOOLEAN_VALUE) + }; + + !(!propertyInfo.mustUseAttribute || !propertyInfo.mustUseProperty) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'DOMProperty: Cannot require using both attribute and property: %s', propName) : invariant(false) : undefined; + !(propertyInfo.mustUseProperty || !propertyInfo.hasSideEffects) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'DOMProperty: Properties that have side effects must use property: %s', propName) : invariant(false) : undefined; + !(propertyInfo.hasBooleanValue + propertyInfo.hasNumericValue + propertyInfo.hasOverloadedBooleanValue <= 1) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'DOMProperty: Value can be one of boolean, overloaded boolean, or ' + 'numeric value, but not a combination: %s', propName) : invariant(false) : undefined; + + if (process.env.NODE_ENV !== 'production') { + DOMProperty.getPossibleStandardName[lowerCased] = propName; + } + + if (DOMAttributeNames.hasOwnProperty(propName)) { + var attributeName = DOMAttributeNames[propName]; + propertyInfo.attributeName = attributeName; + if (process.env.NODE_ENV !== 'production') { + DOMProperty.getPossibleStandardName[attributeName] = propName; + } + } + + if (DOMAttributeNamespaces.hasOwnProperty(propName)) { + propertyInfo.attributeNamespace = DOMAttributeNamespaces[propName]; + } + + if (DOMPropertyNames.hasOwnProperty(propName)) { + propertyInfo.propertyName = DOMPropertyNames[propName]; + } + + if (DOMMutationMethods.hasOwnProperty(propName)) { + propertyInfo.mutationMethod = DOMMutationMethods[propName]; + } + + DOMProperty.properties[propName] = propertyInfo; + } + } + }; + var defaultValueCache = {}; + + /** + * DOMProperty exports lookup objects that can be used like functions: + * + * > DOMProperty.isValid['id'] + * true + * > DOMProperty.isValid['foobar'] + * undefined + * + * Although this may be confusing, it performs better in general. + * + * @see http://jsperf.com/key-exists + * @see http://jsperf.com/key-missing + */ + var DOMProperty = { + + ID_ATTRIBUTE_NAME: 'data-reactid', + + /** + * Map from property "standard name" to an object with info about how to set + * the property in the DOM. Each object contains: + * + * attributeName: + * Used when rendering markup or with `*Attribute()`. + * attributeNamespace + * propertyName: + * Used on DOM node instances. (This includes properties that mutate due to + * external factors.) + * mutationMethod: + * If non-null, used instead of the property or `setAttribute()` after + * initial render. + * mustUseAttribute: + * Whether the property must be accessed and mutated using `*Attribute()`. + * (This includes anything that fails `<propName> in <element>`.) + * mustUseProperty: + * Whether the property must be accessed and mutated as an object property. + * hasSideEffects: + * Whether or not setting a value causes side effects such as triggering + * resources to be loaded or text selection changes. If true, we read from + * the DOM before updating to ensure that the value is only set if it has + * changed. + * hasBooleanValue: + * Whether the property should be removed when set to a falsey value. + * hasNumericValue: + * Whether the property must be numeric or parse as a numeric and should be + * removed when set to a falsey value. + * hasPositiveNumericValue: + * Whether the property must be positive numeric or parse as a positive + * numeric and should be removed when set to a falsey value. + * hasOverloadedBooleanValue: + * Whether the property can be used as a flag as well as with a value. + * Removed when strictly equal to false; present without a value when + * strictly equal to true; present with a value otherwise. + */ + properties: {}, + + /** + * Mapping from lowercase property names to the properly cased version, used + * to warn in the case of missing properties. Available only in __DEV__. + * @type {Object} + */ + getPossibleStandardName: process.env.NODE_ENV !== 'production' ? {} : null, + + /** + * All of the isCustomAttribute() functions that have been injected. + */ + _isCustomAttributeFunctions: [], + + /** + * Checks whether a property name is a custom attribute. + * @method + */ + isCustomAttribute: function (attributeName) { + for (var i = 0; i < DOMProperty._isCustomAttributeFunctions.length; i++) { + var isCustomAttributeFn = DOMProperty._isCustomAttributeFunctions[i]; + if (isCustomAttributeFn(attributeName)) { + return true; + } + } + return false; + }, + + /** + * Returns the default property value for a DOM property (i.e., not an + * attribute). Most default values are '' or false, but not all. Worse yet, + * some (in particular, `type`) vary depending on the type of element. + * + * TODO: Is it better to grab all the possible properties when creating an + * element to avoid having to create the same element twice? + */ + getDefaultValueForProperty: function (nodeName, prop) { + var nodeDefaults = defaultValueCache[nodeName]; + var testElement; + if (!nodeDefaults) { + defaultValueCache[nodeName] = nodeDefaults = {}; + } + if (!(prop in nodeDefaults)) { + testElement = document.createElement(nodeName); + nodeDefaults[prop] = testElement[prop]; + } + return nodeDefaults[prop]; + }, + + injection: DOMPropertyInjection + }; + + module.exports = DOMProperty; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 23 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule quoteAttributeValueForBrowser + */ + + 'use strict'; + + var escapeTextContentForBrowser = __webpack_require__(20); + + /** + * Escapes attribute value to prevent scripting attacks. + * + * @param {*} value Value to escape. + * @return {string} An escaped string. + */ + function quoteAttributeValueForBrowser(value) { + return '"' + escapeTextContentForBrowser(value) + '"'; + } + + module.exports = quoteAttributeValueForBrowser; + +/***/ }, +/* 24 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2014-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule warning + */ + + 'use strict'; + + var emptyFunction = __webpack_require__(14); + + /** + * Similar to invariant but only logs a warning if the condition is not met. + * This can be used to log issues in development environments in critical + * paths. Removing the logging code for production environments will keep the + * same logic and follow the same code paths. + */ + + var warning = emptyFunction; + + if (process.env.NODE_ENV !== 'production') { + warning = function (condition, format) { + for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { + args[_key - 2] = arguments[_key]; + } + + if (format === undefined) { + throw new Error('`warning(condition, format, ...args)` requires a warning ' + 'message argument'); + } + + if (format.indexOf('Failed Composite propType: ') === 0) { + return; // Ignore CompositeComponent proptype check. + } + + if (!condition) { + var argIndex = 0; + var message = 'Warning: ' + format.replace(/%s/g, function () { + return args[argIndex++]; + }); + if (typeof console !== 'undefined') { + console.error(message); + } + try { + // --- Welcome to debugging React --- + // This error was thrown as a convenience so that you can use this stack + // to find the callsite that caused this warning to fire. + throw new Error(message); + } catch (x) {} + } + }; + } + + module.exports = warning; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 25 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactComponentBrowserEnvironment + */ + + 'use strict'; + + var ReactDOMIDOperations = __webpack_require__(26); + var ReactMount = __webpack_require__(27); + + /** + * Abstracts away all functionality of the reconciler that requires knowledge of + * the browser context. TODO: These callers should be refactored to avoid the + * need for this injection. + */ + var ReactComponentBrowserEnvironment = { + + processChildrenUpdates: ReactDOMIDOperations.dangerouslyProcessChildrenUpdates, + + replaceNodeWithMarkupByID: ReactDOMIDOperations.dangerouslyReplaceNodeWithMarkupByID, + + /** + * If a particular environment requires that some resources be cleaned up, + * specify this in the injected Mixin. In the DOM, we would likely want to + * purge any cached node ID lookups. + * + * @private + */ + unmountIDFromEnvironment: function (rootNodeID) { + ReactMount.purgeID(rootNodeID); + } + + }; + + module.exports = ReactComponentBrowserEnvironment; + +/***/ }, +/* 26 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactDOMIDOperations + * @typechecks static-only + */ + + 'use strict'; + + var DOMChildrenOperations = __webpack_require__(6); + var DOMPropertyOperations = __webpack_require__(21); + var ReactMount = __webpack_require__(27); + var ReactPerf = __webpack_require__(17); + + var invariant = __webpack_require__(12); + + /** + * Errors for properties that should not be updated with `updatePropertyByID()`. + * + * @type {object} + * @private + */ + var INVALID_PROPERTY_ERRORS = { + dangerouslySetInnerHTML: '`dangerouslySetInnerHTML` must be set using `updateInnerHTMLByID()`.', + style: '`style` must be set using `updateStylesByID()`.' + }; + + /** + * Operations used to process updates to DOM nodes. + */ + var ReactDOMIDOperations = { + + /** + * Updates a DOM node with new property values. This should only be used to + * update DOM properties in `DOMProperty`. + * + * @param {string} id ID of the node to update. + * @param {string} name A valid property name, see `DOMProperty`. + * @param {*} value New value of the property. + * @internal + */ + updatePropertyByID: function (id, name, value) { + var node = ReactMount.getNode(id); + !!INVALID_PROPERTY_ERRORS.hasOwnProperty(name) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'updatePropertyByID(...): %s', INVALID_PROPERTY_ERRORS[name]) : invariant(false) : undefined; + + // If we're updating to null or undefined, we should remove the property + // from the DOM node instead of inadvertantly setting to a string. This + // brings us in line with the same behavior we have on initial render. + if (value != null) { + DOMPropertyOperations.setValueForProperty(node, name, value); + } else { + DOMPropertyOperations.deleteValueForProperty(node, name); + } + }, + + /** + * Replaces a DOM node that exists in the document with markup. + * + * @param {string} id ID of child to be replaced. + * @param {string} markup Dangerous markup to inject in place of child. + * @internal + * @see {Danger.dangerouslyReplaceNodeWithMarkup} + */ + dangerouslyReplaceNodeWithMarkupByID: function (id, markup) { + var node = ReactMount.getNode(id); + DOMChildrenOperations.dangerouslyReplaceNodeWithMarkup(node, markup); + }, + + /** + * Updates a component's children by processing a series of updates. + * + * @param {array<object>} updates List of update configurations. + * @param {array<string>} markup List of markup strings. + * @internal + */ + dangerouslyProcessChildrenUpdates: function (updates, markup) { + for (var i = 0; i < updates.length; i++) { + updates[i].parentNode = ReactMount.getNode(updates[i].parentID); + } + DOMChildrenOperations.processUpdates(updates, markup); + } + }; + + ReactPerf.measureMethods(ReactDOMIDOperations, 'ReactDOMIDOperations', { + dangerouslyReplaceNodeWithMarkupByID: 'dangerouslyReplaceNodeWithMarkupByID', + dangerouslyProcessChildrenUpdates: 'dangerouslyProcessChildrenUpdates' + }); + + module.exports = ReactDOMIDOperations; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 27 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactMount + */ + + 'use strict'; + + var DOMProperty = __webpack_require__(22); + var ReactBrowserEventEmitter = __webpack_require__(28); + var ReactCurrentOwner = __webpack_require__(4); + var ReactDOMFeatureFlags = __webpack_require__(40); + var ReactElement = __webpack_require__(41); + var ReactEmptyComponentRegistry = __webpack_require__(43); + var ReactInstanceHandles = __webpack_require__(44); + var ReactInstanceMap = __webpack_require__(46); + var ReactMarkupChecksum = __webpack_require__(47); + var ReactPerf = __webpack_require__(17); + var ReactReconciler = __webpack_require__(49); + var ReactUpdateQueue = __webpack_require__(52); + var ReactUpdates = __webpack_require__(53); + + var assign = __webpack_require__(38); + var emptyObject = __webpack_require__(57); + var containsNode = __webpack_require__(58); + var instantiateReactComponent = __webpack_require__(61); + var invariant = __webpack_require__(12); + var setInnerHTML = __webpack_require__(18); + var shouldUpdateReactComponent = __webpack_require__(66); + var validateDOMNesting = __webpack_require__(69); + var warning = __webpack_require__(24); + + var ATTR_NAME = DOMProperty.ID_ATTRIBUTE_NAME; + var nodeCache = {}; + + var ELEMENT_NODE_TYPE = 1; + var DOC_NODE_TYPE = 9; + var DOCUMENT_FRAGMENT_NODE_TYPE = 11; + + var ownerDocumentContextKey = '__ReactMount_ownerDocument$' + Math.random().toString(36).slice(2); + + /** Mapping from reactRootID to React component instance. */ + var instancesByReactRootID = {}; + + /** Mapping from reactRootID to `container` nodes. */ + var containersByReactRootID = {}; + + if (process.env.NODE_ENV !== 'production') { + /** __DEV__-only mapping from reactRootID to root elements. */ + var rootElementsByReactRootID = {}; + } + + // Used to store breadth-first search state in findComponentRoot. + var findComponentRootReusableArray = []; + + /** + * Finds the index of the first character + * that's not common between the two given strings. + * + * @return {number} the index of the character where the strings diverge + */ + function firstDifferenceIndex(string1, string2) { + var minLen = Math.min(string1.length, string2.length); + for (var i = 0; i < minLen; i++) { + if (string1.charAt(i) !== string2.charAt(i)) { + return i; + } + } + return string1.length === string2.length ? -1 : minLen; + } + + /** + * @param {DOMElement|DOMDocument} container DOM element that may contain + * a React component + * @return {?*} DOM element that may have the reactRoot ID, or null. + */ + function getReactRootElementInContainer(container) { + if (!container) { + return null; + } + + if (container.nodeType === DOC_NODE_TYPE) { + return container.documentElement; + } else { + return container.firstChild; + } + } + + /** + * @param {DOMElement} container DOM element that may contain a React component. + * @return {?string} A "reactRoot" ID, if a React component is rendered. + */ + function getReactRootID(container) { + var rootElement = getReactRootElementInContainer(container); + return rootElement && ReactMount.getID(rootElement); + } + + /** + * Accessing node[ATTR_NAME] or calling getAttribute(ATTR_NAME) on a form + * element can return its control whose name or ID equals ATTR_NAME. All + * DOM nodes support `getAttributeNode` but this can also get called on + * other objects so just return '' if we're given something other than a + * DOM node (such as window). + * + * @param {?DOMElement|DOMWindow|DOMDocument|DOMTextNode} node DOM node. + * @return {string} ID of the supplied `domNode`. + */ + function getID(node) { + var id = internalGetID(node); + if (id) { + if (nodeCache.hasOwnProperty(id)) { + var cached = nodeCache[id]; + if (cached !== node) { + !!isValid(cached, id) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactMount: Two valid but unequal nodes with the same `%s`: %s', ATTR_NAME, id) : invariant(false) : undefined; + + nodeCache[id] = node; + } + } else { + nodeCache[id] = node; + } + } + + return id; + } + + function internalGetID(node) { + // If node is something like a window, document, or text node, none of + // which support attributes or a .getAttribute method, gracefully return + // the empty string, as if the attribute were missing. + return node && node.getAttribute && node.getAttribute(ATTR_NAME) || ''; + } + + /** + * Sets the React-specific ID of the given node. + * + * @param {DOMElement} node The DOM node whose ID will be set. + * @param {string} id The value of the ID attribute. + */ + function setID(node, id) { + var oldID = internalGetID(node); + if (oldID !== id) { + delete nodeCache[oldID]; + } + node.setAttribute(ATTR_NAME, id); + nodeCache[id] = node; + } + + /** + * Finds the node with the supplied React-generated DOM ID. + * + * @param {string} id A React-generated DOM ID. + * @return {DOMElement} DOM node with the suppled `id`. + * @internal + */ + function getNode(id) { + if (!nodeCache.hasOwnProperty(id) || !isValid(nodeCache[id], id)) { + nodeCache[id] = ReactMount.findReactNodeByID(id); + } + return nodeCache[id]; + } + + /** + * Finds the node with the supplied public React instance. + * + * @param {*} instance A public React instance. + * @return {?DOMElement} DOM node with the suppled `id`. + * @internal + */ + function getNodeFromInstance(instance) { + var id = ReactInstanceMap.get(instance)._rootNodeID; + if (ReactEmptyComponentRegistry.isNullComponentID(id)) { + return null; + } + if (!nodeCache.hasOwnProperty(id) || !isValid(nodeCache[id], id)) { + nodeCache[id] = ReactMount.findReactNodeByID(id); + } + return nodeCache[id]; + } + + /** + * A node is "valid" if it is contained by a currently mounted container. + * + * This means that the node does not have to be contained by a document in + * order to be considered valid. + * + * @param {?DOMElement} node The candidate DOM node. + * @param {string} id The expected ID of the node. + * @return {boolean} Whether the node is contained by a mounted container. + */ + function isValid(node, id) { + if (node) { + !(internalGetID(node) === id) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactMount: Unexpected modification of `%s`', ATTR_NAME) : invariant(false) : undefined; + + var container = ReactMount.findReactContainerForID(id); + if (container && containsNode(container, node)) { + return true; + } + } + + return false; + } + + /** + * Causes the cache to forget about one React-specific ID. + * + * @param {string} id The ID to forget. + */ + function purgeID(id) { + delete nodeCache[id]; + } + + var deepestNodeSoFar = null; + function findDeepestCachedAncestorImpl(ancestorID) { + var ancestor = nodeCache[ancestorID]; + if (ancestor && isValid(ancestor, ancestorID)) { + deepestNodeSoFar = ancestor; + } else { + // This node isn't populated in the cache, so presumably none of its + // descendants are. Break out of the loop. + return false; + } + } + + /** + * Return the deepest cached node whose ID is a prefix of `targetID`. + */ + function findDeepestCachedAncestor(targetID) { + deepestNodeSoFar = null; + ReactInstanceHandles.traverseAncestors(targetID, findDeepestCachedAncestorImpl); + + var foundNode = deepestNodeSoFar; + deepestNodeSoFar = null; + return foundNode; + } + + /** + * Mounts this component and inserts it into the DOM. + * + * @param {ReactComponent} componentInstance The instance to mount. + * @param {string} rootID DOM ID of the root node. + * @param {DOMElement} container DOM element to mount into. + * @param {ReactReconcileTransaction} transaction + * @param {boolean} shouldReuseMarkup If true, do not insert markup + */ + function mountComponentIntoNode(componentInstance, rootID, container, transaction, shouldReuseMarkup, context) { + if (ReactDOMFeatureFlags.useCreateElement) { + context = assign({}, context); + if (container.nodeType === DOC_NODE_TYPE) { + context[ownerDocumentContextKey] = container; + } else { + context[ownerDocumentContextKey] = container.ownerDocument; + } + } + if (process.env.NODE_ENV !== 'production') { + if (context === emptyObject) { + context = {}; + } + var tag = container.nodeName.toLowerCase(); + context[validateDOMNesting.ancestorInfoContextKey] = validateDOMNesting.updatedAncestorInfo(null, tag, null); + } + var markup = ReactReconciler.mountComponent(componentInstance, rootID, transaction, context); + componentInstance._renderedComponent._topLevelWrapper = componentInstance; + ReactMount._mountImageIntoNode(markup, container, shouldReuseMarkup, transaction); + } + + /** + * Batched mount. + * + * @param {ReactComponent} componentInstance The instance to mount. + * @param {string} rootID DOM ID of the root node. + * @param {DOMElement} container DOM element to mount into. + * @param {boolean} shouldReuseMarkup If true, do not insert markup + */ + function batchedMountComponentIntoNode(componentInstance, rootID, container, shouldReuseMarkup, context) { + var transaction = ReactUpdates.ReactReconcileTransaction.getPooled( + /* forceHTML */shouldReuseMarkup); + transaction.perform(mountComponentIntoNode, null, componentInstance, rootID, container, transaction, shouldReuseMarkup, context); + ReactUpdates.ReactReconcileTransaction.release(transaction); + } + + /** + * Unmounts a component and removes it from the DOM. + * + * @param {ReactComponent} instance React component instance. + * @param {DOMElement} container DOM element to unmount from. + * @final + * @internal + * @see {ReactMount.unmountComponentAtNode} + */ + function unmountComponentFromNode(instance, container) { + ReactReconciler.unmountComponent(instance); + + if (container.nodeType === DOC_NODE_TYPE) { + container = container.documentElement; + } + + // http://jsperf.com/emptying-a-node + while (container.lastChild) { + container.removeChild(container.lastChild); + } + } + + /** + * True if the supplied DOM node has a direct React-rendered child that is + * not a React root element. Useful for warning in `render`, + * `unmountComponentAtNode`, etc. + * + * @param {?DOMElement} node The candidate DOM node. + * @return {boolean} True if the DOM element contains a direct child that was + * rendered by React but is not a root element. + * @internal + */ + function hasNonRootReactChild(node) { + var reactRootID = getReactRootID(node); + return reactRootID ? reactRootID !== ReactInstanceHandles.getReactRootIDFromNodeID(reactRootID) : false; + } + + /** + * Returns the first (deepest) ancestor of a node which is rendered by this copy + * of React. + */ + function findFirstReactDOMImpl(node) { + // This node might be from another React instance, so we make sure not to + // examine the node cache here + for (; node && node.parentNode !== node; node = node.parentNode) { + if (node.nodeType !== 1) { + // Not a DOMElement, therefore not a React component + continue; + } + var nodeID = internalGetID(node); + if (!nodeID) { + continue; + } + var reactRootID = ReactInstanceHandles.getReactRootIDFromNodeID(nodeID); + + // If containersByReactRootID contains the container we find by crawling up + // the tree, we know that this instance of React rendered the node. + // nb. isValid's strategy (with containsNode) does not work because render + // trees may be nested and we don't want a false positive in that case. + var current = node; + var lastID; + do { + lastID = internalGetID(current); + current = current.parentNode; + if (current == null) { + // The passed-in node has been detached from the container it was + // originally rendered into. + return null; + } + } while (lastID !== reactRootID); + + if (current === containersByReactRootID[reactRootID]) { + return node; + } + } + return null; + } + + /** + * Temporary (?) hack so that we can store all top-level pending updates on + * composites instead of having to worry about different types of components + * here. + */ + var TopLevelWrapper = function () {}; + TopLevelWrapper.prototype.isReactComponent = {}; + if (process.env.NODE_ENV !== 'production') { + TopLevelWrapper.displayName = 'TopLevelWrapper'; + } + TopLevelWrapper.prototype.render = function () { + // this.props is actually a ReactElement + return this.props; + }; + + /** + * Mounting is the process of initializing a React component by creating its + * representative DOM elements and inserting them into a supplied `container`. + * Any prior content inside `container` is destroyed in the process. + * + * ReactMount.render( + * component, + * document.getElementById('container') + * ); + * + * <div id="container"> <-- Supplied `container`. + * <div data-reactid=".3"> <-- Rendered reactRoot of React + * // ... component. + * </div> + * </div> + * + * Inside of `container`, the first element rendered is the "reactRoot". + */ + var ReactMount = { + + TopLevelWrapper: TopLevelWrapper, + + /** Exposed for debugging purposes **/ + _instancesByReactRootID: instancesByReactRootID, + + /** + * This is a hook provided to support rendering React components while + * ensuring that the apparent scroll position of its `container` does not + * change. + * + * @param {DOMElement} container The `container` being rendered into. + * @param {function} renderCallback This must be called once to do the render. + */ + scrollMonitor: function (container, renderCallback) { + renderCallback(); + }, + + /** + * Take a component that's already mounted into the DOM and replace its props + * @param {ReactComponent} prevComponent component instance already in the DOM + * @param {ReactElement} nextElement component instance to render + * @param {DOMElement} container container to render into + * @param {?function} callback function triggered on completion + */ + _updateRootComponent: function (prevComponent, nextElement, container, callback) { + ReactMount.scrollMonitor(container, function () { + ReactUpdateQueue.enqueueElementInternal(prevComponent, nextElement); + if (callback) { + ReactUpdateQueue.enqueueCallbackInternal(prevComponent, callback); + } + }); + + if (process.env.NODE_ENV !== 'production') { + // Record the root element in case it later gets transplanted. + rootElementsByReactRootID[getReactRootID(container)] = getReactRootElementInContainer(container); + } + + return prevComponent; + }, + + /** + * Register a component into the instance map and starts scroll value + * monitoring + * @param {ReactComponent} nextComponent component instance to render + * @param {DOMElement} container container to render into + * @return {string} reactRoot ID prefix + */ + _registerComponent: function (nextComponent, container) { + !(container && (container.nodeType === ELEMENT_NODE_TYPE || container.nodeType === DOC_NODE_TYPE || container.nodeType === DOCUMENT_FRAGMENT_NODE_TYPE)) ? process.env.NODE_ENV !== 'production' ? invariant(false, '_registerComponent(...): Target container is not a DOM element.') : invariant(false) : undefined; + + ReactBrowserEventEmitter.ensureScrollValueMonitoring(); + + var reactRootID = ReactMount.registerContainer(container); + instancesByReactRootID[reactRootID] = nextComponent; + return reactRootID; + }, + + /** + * Render a new component into the DOM. + * @param {ReactElement} nextElement element to render + * @param {DOMElement} container container to render into + * @param {boolean} shouldReuseMarkup if we should skip the markup insertion + * @return {ReactComponent} nextComponent + */ + _renderNewRootComponent: function (nextElement, container, shouldReuseMarkup, context) { + // Various parts of our code (such as ReactCompositeComponent's + // _renderValidatedComponent) assume that calls to render aren't nested; + // verify that that's the case. + process.env.NODE_ENV !== 'production' ? warning(ReactCurrentOwner.current == null, '_renderNewRootComponent(): Render methods should be a pure function ' + 'of props and state; triggering nested component updates from ' + 'render is not allowed. If necessary, trigger nested updates in ' + 'componentDidUpdate. Check the render method of %s.', ReactCurrentOwner.current && ReactCurrentOwner.current.getName() || 'ReactCompositeComponent') : undefined; + + var componentInstance = instantiateReactComponent(nextElement, null); + var reactRootID = ReactMount._registerComponent(componentInstance, container); + + // The initial render is synchronous but any updates that happen during + // rendering, in componentWillMount or componentDidMount, will be batched + // according to the current batching strategy. + + ReactUpdates.batchedUpdates(batchedMountComponentIntoNode, componentInstance, reactRootID, container, shouldReuseMarkup, context); + + if (process.env.NODE_ENV !== 'production') { + // Record the root element in case it later gets transplanted. + rootElementsByReactRootID[reactRootID] = getReactRootElementInContainer(container); + } + + return componentInstance; + }, + + /** + * Renders a React component into the DOM in the supplied `container`. + * + * If the React component was previously rendered into `container`, this will + * perform an update on it and only mutate the DOM as necessary to reflect the + * latest React component. + * + * @param {ReactComponent} parentComponent The conceptual parent of this render tree. + * @param {ReactElement} nextElement Component element to render. + * @param {DOMElement} container DOM element to render into. + * @param {?function} callback function triggered on completion + * @return {ReactComponent} Component instance rendered in `container`. + */ + renderSubtreeIntoContainer: function (parentComponent, nextElement, container, callback) { + !(parentComponent != null && parentComponent._reactInternalInstance != null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'parentComponent must be a valid React Component') : invariant(false) : undefined; + return ReactMount._renderSubtreeIntoContainer(parentComponent, nextElement, container, callback); + }, + + _renderSubtreeIntoContainer: function (parentComponent, nextElement, container, callback) { + !ReactElement.isValidElement(nextElement) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactDOM.render(): Invalid component element.%s', typeof nextElement === 'string' ? ' Instead of passing an element string, make sure to instantiate ' + 'it by passing it to React.createElement.' : typeof nextElement === 'function' ? ' Instead of passing a component class, make sure to instantiate ' + 'it by passing it to React.createElement.' : + // Check if it quacks like an element + nextElement != null && nextElement.props !== undefined ? ' This may be caused by unintentionally loading two independent ' + 'copies of React.' : '') : invariant(false) : undefined; + + process.env.NODE_ENV !== 'production' ? warning(!container || !container.tagName || container.tagName.toUpperCase() !== 'BODY', 'render(): Rendering components directly into document.body is ' + 'discouraged, since its children are often manipulated by third-party ' + 'scripts and browser extensions. This may lead to subtle ' + 'reconciliation issues. Try rendering into a container element created ' + 'for your app.') : undefined; + + var nextWrappedElement = new ReactElement(TopLevelWrapper, null, null, null, null, null, nextElement); + + var prevComponent = instancesByReactRootID[getReactRootID(container)]; + + if (prevComponent) { + var prevWrappedElement = prevComponent._currentElement; + var prevElement = prevWrappedElement.props; + if (shouldUpdateReactComponent(prevElement, nextElement)) { + var publicInst = prevComponent._renderedComponent.getPublicInstance(); + var updatedCallback = callback && function () { + callback.call(publicInst); + }; + ReactMount._updateRootComponent(prevComponent, nextWrappedElement, container, updatedCallback); + return publicInst; + } else { + ReactMount.unmountComponentAtNode(container); + } + } + + var reactRootElement = getReactRootElementInContainer(container); + var containerHasReactMarkup = reactRootElement && !!internalGetID(reactRootElement); + var containerHasNonRootReactChild = hasNonRootReactChild(container); + + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(!containerHasNonRootReactChild, 'render(...): Replacing React-rendered children with a new root ' + 'component. If you intended to update the children of this node, ' + 'you should instead have the existing children update their state ' + 'and render the new components instead of calling ReactDOM.render.') : undefined; + + if (!containerHasReactMarkup || reactRootElement.nextSibling) { + var rootElementSibling = reactRootElement; + while (rootElementSibling) { + if (internalGetID(rootElementSibling)) { + process.env.NODE_ENV !== 'production' ? warning(false, 'render(): Target node has markup rendered by React, but there ' + 'are unrelated nodes as well. This is most commonly caused by ' + 'white-space inserted around server-rendered markup.') : undefined; + break; + } + rootElementSibling = rootElementSibling.nextSibling; + } + } + } + + var shouldReuseMarkup = containerHasReactMarkup && !prevComponent && !containerHasNonRootReactChild; + var component = ReactMount._renderNewRootComponent(nextWrappedElement, container, shouldReuseMarkup, parentComponent != null ? parentComponent._reactInternalInstance._processChildContext(parentComponent._reactInternalInstance._context) : emptyObject)._renderedComponent.getPublicInstance(); + if (callback) { + callback.call(component); + } + return component; + }, + + /** + * Renders a React component into the DOM in the supplied `container`. + * + * If the React component was previously rendered into `container`, this will + * perform an update on it and only mutate the DOM as necessary to reflect the + * latest React component. + * + * @param {ReactElement} nextElement Component element to render. + * @param {DOMElement} container DOM element to render into. + * @param {?function} callback function triggered on completion + * @return {ReactComponent} Component instance rendered in `container`. + */ + render: function (nextElement, container, callback) { + return ReactMount._renderSubtreeIntoContainer(null, nextElement, container, callback); + }, + + /** + * Registers a container node into which React components will be rendered. + * This also creates the "reactRoot" ID that will be assigned to the element + * rendered within. + * + * @param {DOMElement} container DOM element to register as a container. + * @return {string} The "reactRoot" ID of elements rendered within. + */ + registerContainer: function (container) { + var reactRootID = getReactRootID(container); + if (reactRootID) { + // If one exists, make sure it is a valid "reactRoot" ID. + reactRootID = ReactInstanceHandles.getReactRootIDFromNodeID(reactRootID); + } + if (!reactRootID) { + // No valid "reactRoot" ID found, create one. + reactRootID = ReactInstanceHandles.createReactRootID(); + } + containersByReactRootID[reactRootID] = container; + return reactRootID; + }, + + /** + * Unmounts and destroys the React component rendered in the `container`. + * + * @param {DOMElement} container DOM element containing a React component. + * @return {boolean} True if a component was found in and unmounted from + * `container` + */ + unmountComponentAtNode: function (container) { + // Various parts of our code (such as ReactCompositeComponent's + // _renderValidatedComponent) assume that calls to render aren't nested; + // verify that that's the case. (Strictly speaking, unmounting won't cause a + // render but we still don't expect to be in a render call here.) + process.env.NODE_ENV !== 'production' ? warning(ReactCurrentOwner.current == null, 'unmountComponentAtNode(): Render methods should be a pure function ' + 'of props and state; triggering nested component updates from render ' + 'is not allowed. If necessary, trigger nested updates in ' + 'componentDidUpdate. Check the render method of %s.', ReactCurrentOwner.current && ReactCurrentOwner.current.getName() || 'ReactCompositeComponent') : undefined; + + !(container && (container.nodeType === ELEMENT_NODE_TYPE || container.nodeType === DOC_NODE_TYPE || container.nodeType === DOCUMENT_FRAGMENT_NODE_TYPE)) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'unmountComponentAtNode(...): Target container is not a DOM element.') : invariant(false) : undefined; + + var reactRootID = getReactRootID(container); + var component = instancesByReactRootID[reactRootID]; + if (!component) { + // Check if the node being unmounted was rendered by React, but isn't a + // root node. + var containerHasNonRootReactChild = hasNonRootReactChild(container); + + // Check if the container itself is a React root node. + var containerID = internalGetID(container); + var isContainerReactRoot = containerID && containerID === ReactInstanceHandles.getReactRootIDFromNodeID(containerID); + + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(!containerHasNonRootReactChild, 'unmountComponentAtNode(): The node you\'re attempting to unmount ' + 'was rendered by React and is not a top-level container. %s', isContainerReactRoot ? 'You may have accidentally passed in a React root node instead ' + 'of its container.' : 'Instead, have the parent component update its state and ' + 'rerender in order to remove this component.') : undefined; + } + + return false; + } + ReactUpdates.batchedUpdates(unmountComponentFromNode, component, container); + delete instancesByReactRootID[reactRootID]; + delete containersByReactRootID[reactRootID]; + if (process.env.NODE_ENV !== 'production') { + delete rootElementsByReactRootID[reactRootID]; + } + return true; + }, + + /** + * Finds the container DOM element that contains React component to which the + * supplied DOM `id` belongs. + * + * @param {string} id The ID of an element rendered by a React component. + * @return {?DOMElement} DOM element that contains the `id`. + */ + findReactContainerForID: function (id) { + var reactRootID = ReactInstanceHandles.getReactRootIDFromNodeID(id); + var container = containersByReactRootID[reactRootID]; + + if (process.env.NODE_ENV !== 'production') { + var rootElement = rootElementsByReactRootID[reactRootID]; + if (rootElement && rootElement.parentNode !== container) { + process.env.NODE_ENV !== 'production' ? warning( + // Call internalGetID here because getID calls isValid which calls + // findReactContainerForID (this function). + internalGetID(rootElement) === reactRootID, 'ReactMount: Root element ID differed from reactRootID.') : undefined; + var containerChild = container.firstChild; + if (containerChild && reactRootID === internalGetID(containerChild)) { + // If the container has a new child with the same ID as the old + // root element, then rootElementsByReactRootID[reactRootID] is + // just stale and needs to be updated. The case that deserves a + // warning is when the container is empty. + rootElementsByReactRootID[reactRootID] = containerChild; + } else { + process.env.NODE_ENV !== 'production' ? warning(false, 'ReactMount: Root element has been removed from its original ' + 'container. New container: %s', rootElement.parentNode) : undefined; + } + } + } + + return container; + }, + + /** + * Finds an element rendered by React with the supplied ID. + * + * @param {string} id ID of a DOM node in the React component. + * @return {DOMElement} Root DOM node of the React component. + */ + findReactNodeByID: function (id) { + var reactRoot = ReactMount.findReactContainerForID(id); + return ReactMount.findComponentRoot(reactRoot, id); + }, + + /** + * Traverses up the ancestors of the supplied node to find a node that is a + * DOM representation of a React component rendered by this copy of React. + * + * @param {*} node + * @return {?DOMEventTarget} + * @internal + */ + getFirstReactDOM: function (node) { + return findFirstReactDOMImpl(node); + }, + + /** + * Finds a node with the supplied `targetID` inside of the supplied + * `ancestorNode`. Exploits the ID naming scheme to perform the search + * quickly. + * + * @param {DOMEventTarget} ancestorNode Search from this root. + * @pararm {string} targetID ID of the DOM representation of the component. + * @return {DOMEventTarget} DOM node with the supplied `targetID`. + * @internal + */ + findComponentRoot: function (ancestorNode, targetID) { + var firstChildren = findComponentRootReusableArray; + var childIndex = 0; + + var deepestAncestor = findDeepestCachedAncestor(targetID) || ancestorNode; + + if (process.env.NODE_ENV !== 'production') { + // This will throw on the next line; give an early warning + process.env.NODE_ENV !== 'production' ? warning(deepestAncestor != null, 'React can\'t find the root component node for data-reactid value ' + '`%s`. If you\'re seeing this message, it probably means that ' + 'you\'ve loaded two copies of React on the page. At this time, only ' + 'a single copy of React can be loaded at a time.', targetID) : undefined; + } + + firstChildren[0] = deepestAncestor.firstChild; + firstChildren.length = 1; + + while (childIndex < firstChildren.length) { + var child = firstChildren[childIndex++]; + var targetChild; + + while (child) { + var childID = ReactMount.getID(child); + if (childID) { + // Even if we find the node we're looking for, we finish looping + // through its siblings to ensure they're cached so that we don't have + // to revisit this node again. Otherwise, we make n^2 calls to getID + // when visiting the many children of a single node in order. + + if (targetID === childID) { + targetChild = child; + } else if (ReactInstanceHandles.isAncestorIDOf(childID, targetID)) { + // If we find a child whose ID is an ancestor of the given ID, + // then we can be sure that we only want to search the subtree + // rooted at this child, so we can throw out the rest of the + // search state. + firstChildren.length = childIndex = 0; + firstChildren.push(child.firstChild); + } + } else { + // If this child had no ID, then there's a chance that it was + // injected automatically by the browser, as when a `<table>` + // element sprouts an extra `<tbody>` child as a side effect of + // `.innerHTML` parsing. Optimistically continue down this + // branch, but not before examining the other siblings. + firstChildren.push(child.firstChild); + } + + child = child.nextSibling; + } + + if (targetChild) { + // Emptying firstChildren/findComponentRootReusableArray is + // not necessary for correctness, but it helps the GC reclaim + // any nodes that were left at the end of the search. + firstChildren.length = 0; + + return targetChild; + } + } + + firstChildren.length = 0; + + true ? process.env.NODE_ENV !== 'production' ? invariant(false, 'findComponentRoot(..., %s): Unable to find element. This probably ' + 'means the DOM was unexpectedly mutated (e.g., by the browser), ' + 'usually due to forgetting a <tbody> when using tables, nesting tags ' + 'like <form>, <p>, or <a>, or using non-SVG elements in an <svg> ' + 'parent. ' + 'Try inspecting the child nodes of the element with React ID `%s`.', targetID, ReactMount.getID(ancestorNode)) : invariant(false) : undefined; + }, + + _mountImageIntoNode: function (markup, container, shouldReuseMarkup, transaction) { + !(container && (container.nodeType === ELEMENT_NODE_TYPE || container.nodeType === DOC_NODE_TYPE || container.nodeType === DOCUMENT_FRAGMENT_NODE_TYPE)) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'mountComponentIntoNode(...): Target container is not valid.') : invariant(false) : undefined; + + if (shouldReuseMarkup) { + var rootElement = getReactRootElementInContainer(container); + if (ReactMarkupChecksum.canReuseMarkup(markup, rootElement)) { + return; + } else { + var checksum = rootElement.getAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME); + rootElement.removeAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME); + + var rootMarkup = rootElement.outerHTML; + rootElement.setAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME, checksum); + + var normalizedMarkup = markup; + if (process.env.NODE_ENV !== 'production') { + // because rootMarkup is retrieved from the DOM, various normalizations + // will have occurred which will not be present in `markup`. Here, + // insert markup into a <div> or <iframe> depending on the container + // type to perform the same normalizations before comparing. + var normalizer; + if (container.nodeType === ELEMENT_NODE_TYPE) { + normalizer = document.createElement('div'); + normalizer.innerHTML = markup; + normalizedMarkup = normalizer.innerHTML; + } else { + normalizer = document.createElement('iframe'); + document.body.appendChild(normalizer); + normalizer.contentDocument.write(markup); + normalizedMarkup = normalizer.contentDocument.documentElement.outerHTML; + document.body.removeChild(normalizer); + } + } + + var diffIndex = firstDifferenceIndex(normalizedMarkup, rootMarkup); + var difference = ' (client) ' + normalizedMarkup.substring(diffIndex - 20, diffIndex + 20) + '\n (server) ' + rootMarkup.substring(diffIndex - 20, diffIndex + 20); + + !(container.nodeType !== DOC_NODE_TYPE) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'You\'re trying to render a component to the document using ' + 'server rendering but the checksum was invalid. This usually ' + 'means you rendered a different component type or props on ' + 'the client from the one on the server, or your render() ' + 'methods are impure. React cannot handle this case due to ' + 'cross-browser quirks by rendering at the document root. You ' + 'should look for environment dependent code in your components ' + 'and ensure the props are the same client and server side:\n%s', difference) : invariant(false) : undefined; + + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(false, 'React attempted to reuse markup in a container but the ' + 'checksum was invalid. This generally means that you are ' + 'using server rendering and the markup generated on the ' + 'server was not what the client was expecting. React injected ' + 'new markup to compensate which works but you have lost many ' + 'of the benefits of server rendering. Instead, figure out ' + 'why the markup being generated is different on the client ' + 'or server:\n%s', difference) : undefined; + } + } + } + + !(container.nodeType !== DOC_NODE_TYPE) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'You\'re trying to render a component to the document but ' + 'you didn\'t use server rendering. We can\'t do this ' + 'without using server rendering due to cross-browser quirks. ' + 'See ReactDOMServer.renderToString() for server rendering.') : invariant(false) : undefined; + + if (transaction.useCreateElement) { + while (container.lastChild) { + container.removeChild(container.lastChild); + } + container.appendChild(markup); + } else { + setInnerHTML(container, markup); + } + }, + + ownerDocumentContextKey: ownerDocumentContextKey, + + /** + * React ID utilities. + */ + + getReactRootID: getReactRootID, + + getID: getID, + + setID: setID, + + getNode: getNode, + + getNodeFromInstance: getNodeFromInstance, + + isValid: isValid, + + purgeID: purgeID + }; + + ReactPerf.measureMethods(ReactMount, 'ReactMount', { + _renderNewRootComponent: '_renderNewRootComponent', + _mountImageIntoNode: '_mountImageIntoNode' + }); + + module.exports = ReactMount; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 28 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactBrowserEventEmitter + * @typechecks static-only + */ + + 'use strict'; + + var EventConstants = __webpack_require__(29); + var EventPluginHub = __webpack_require__(30); + var EventPluginRegistry = __webpack_require__(31); + var ReactEventEmitterMixin = __webpack_require__(36); + var ReactPerf = __webpack_require__(17); + var ViewportMetrics = __webpack_require__(37); + + var assign = __webpack_require__(38); + var isEventSupported = __webpack_require__(39); + + /** + * Summary of `ReactBrowserEventEmitter` event handling: + * + * - Top-level delegation is used to trap most native browser events. This + * may only occur in the main thread and is the responsibility of + * ReactEventListener, which is injected and can therefore support pluggable + * event sources. This is the only work that occurs in the main thread. + * + * - We normalize and de-duplicate events to account for browser quirks. This + * may be done in the worker thread. + * + * - Forward these native events (with the associated top-level type used to + * trap it) to `EventPluginHub`, which in turn will ask plugins if they want + * to extract any synthetic events. + * + * - The `EventPluginHub` will then process each event by annotating them with + * "dispatches", a sequence of listeners and IDs that care about that event. + * + * - The `EventPluginHub` then dispatches the events. + * + * Overview of React and the event system: + * + * +------------+ . + * | DOM | . + * +------------+ . + * | . + * v . + * +------------+ . + * | ReactEvent | . + * | Listener | . + * +------------+ . +-----------+ + * | . +--------+|SimpleEvent| + * | . | |Plugin | + * +-----|------+ . v +-----------+ + * | | | . +--------------+ +------------+ + * | +-----------.--->|EventPluginHub| | Event | + * | | . | | +-----------+ | Propagators| + * | ReactEvent | . | | |TapEvent | |------------| + * | Emitter | . | |<---+|Plugin | |other plugin| + * | | . | | +-----------+ | utilities | + * | +-----------.--->| | +------------+ + * | | | . +--------------+ + * +-----|------+ . ^ +-----------+ + * | . | |Enter/Leave| + * + . +-------+|Plugin | + * +-------------+ . +-----------+ + * | application | . + * |-------------| . + * | | . + * | | . + * +-------------+ . + * . + * React Core . General Purpose Event Plugin System + */ + + var alreadyListeningTo = {}; + var isMonitoringScrollValue = false; + var reactTopListenersCounter = 0; + + // For events like 'submit' which don't consistently bubble (which we trap at a + // lower node than `document`), binding at `document` would cause duplicate + // events so we don't include them here + var topEventMapping = { + topAbort: 'abort', + topBlur: 'blur', + topCanPlay: 'canplay', + topCanPlayThrough: 'canplaythrough', + topChange: 'change', + topClick: 'click', + topCompositionEnd: 'compositionend', + topCompositionStart: 'compositionstart', + topCompositionUpdate: 'compositionupdate', + topContextMenu: 'contextmenu', + topCopy: 'copy', + topCut: 'cut', + topDoubleClick: 'dblclick', + topDrag: 'drag', + topDragEnd: 'dragend', + topDragEnter: 'dragenter', + topDragExit: 'dragexit', + topDragLeave: 'dragleave', + topDragOver: 'dragover', + topDragStart: 'dragstart', + topDrop: 'drop', + topDurationChange: 'durationchange', + topEmptied: 'emptied', + topEncrypted: 'encrypted', + topEnded: 'ended', + topError: 'error', + topFocus: 'focus', + topInput: 'input', + topKeyDown: 'keydown', + topKeyPress: 'keypress', + topKeyUp: 'keyup', + topLoadedData: 'loadeddata', + topLoadedMetadata: 'loadedmetadata', + topLoadStart: 'loadstart', + topMouseDown: 'mousedown', + topMouseMove: 'mousemove', + topMouseOut: 'mouseout', + topMouseOver: 'mouseover', + topMouseUp: 'mouseup', + topPaste: 'paste', + topPause: 'pause', + topPlay: 'play', + topPlaying: 'playing', + topProgress: 'progress', + topRateChange: 'ratechange', + topScroll: 'scroll', + topSeeked: 'seeked', + topSeeking: 'seeking', + topSelectionChange: 'selectionchange', + topStalled: 'stalled', + topSuspend: 'suspend', + topTextInput: 'textInput', + topTimeUpdate: 'timeupdate', + topTouchCancel: 'touchcancel', + topTouchEnd: 'touchend', + topTouchMove: 'touchmove', + topTouchStart: 'touchstart', + topVolumeChange: 'volumechange', + topWaiting: 'waiting', + topWheel: 'wheel' + }; + + /** + * To ensure no conflicts with other potential React instances on the page + */ + var topListenersIDKey = '_reactListenersID' + String(Math.random()).slice(2); + + function getListeningForDocument(mountAt) { + // In IE8, `mountAt` is a host object and doesn't have `hasOwnProperty` + // directly. + if (!Object.prototype.hasOwnProperty.call(mountAt, topListenersIDKey)) { + mountAt[topListenersIDKey] = reactTopListenersCounter++; + alreadyListeningTo[mountAt[topListenersIDKey]] = {}; + } + return alreadyListeningTo[mountAt[topListenersIDKey]]; + } + + /** + * `ReactBrowserEventEmitter` is used to attach top-level event listeners. For + * example: + * + * ReactBrowserEventEmitter.putListener('myID', 'onClick', myFunction); + * + * This would allocate a "registration" of `('onClick', myFunction)` on 'myID'. + * + * @internal + */ + var ReactBrowserEventEmitter = assign({}, ReactEventEmitterMixin, { + + /** + * Injectable event backend + */ + ReactEventListener: null, + + injection: { + /** + * @param {object} ReactEventListener + */ + injectReactEventListener: function (ReactEventListener) { + ReactEventListener.setHandleTopLevel(ReactBrowserEventEmitter.handleTopLevel); + ReactBrowserEventEmitter.ReactEventListener = ReactEventListener; + } + }, + + /** + * Sets whether or not any created callbacks should be enabled. + * + * @param {boolean} enabled True if callbacks should be enabled. + */ + setEnabled: function (enabled) { + if (ReactBrowserEventEmitter.ReactEventListener) { + ReactBrowserEventEmitter.ReactEventListener.setEnabled(enabled); + } + }, + + /** + * @return {boolean} True if callbacks are enabled. + */ + isEnabled: function () { + return !!(ReactBrowserEventEmitter.ReactEventListener && ReactBrowserEventEmitter.ReactEventListener.isEnabled()); + }, + + /** + * We listen for bubbled touch events on the document object. + * + * Firefox v8.01 (and possibly others) exhibited strange behavior when + * mounting `onmousemove` events at some node that was not the document + * element. The symptoms were that if your mouse is not moving over something + * contained within that mount point (for example on the background) the + * top-level listeners for `onmousemove` won't be called. However, if you + * register the `mousemove` on the document object, then it will of course + * catch all `mousemove`s. This along with iOS quirks, justifies restricting + * top-level listeners to the document object only, at least for these + * movement types of events and possibly all events. + * + * @see http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html + * + * Also, `keyup`/`keypress`/`keydown` do not bubble to the window on IE, but + * they bubble to document. + * + * @param {string} registrationName Name of listener (e.g. `onClick`). + * @param {object} contentDocumentHandle Document which owns the container + */ + listenTo: function (registrationName, contentDocumentHandle) { + var mountAt = contentDocumentHandle; + var isListening = getListeningForDocument(mountAt); + var dependencies = EventPluginRegistry.registrationNameDependencies[registrationName]; + + var topLevelTypes = EventConstants.topLevelTypes; + for (var i = 0; i < dependencies.length; i++) { + var dependency = dependencies[i]; + if (!(isListening.hasOwnProperty(dependency) && isListening[dependency])) { + if (dependency === topLevelTypes.topWheel) { + if (isEventSupported('wheel')) { + ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelTypes.topWheel, 'wheel', mountAt); + } else if (isEventSupported('mousewheel')) { + ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelTypes.topWheel, 'mousewheel', mountAt); + } else { + // Firefox needs to capture a different mouse scroll event. + // @see http://www.quirksmode.org/dom/events/tests/scroll.html + ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelTypes.topWheel, 'DOMMouseScroll', mountAt); + } + } else if (dependency === topLevelTypes.topScroll) { + + if (isEventSupported('scroll', true)) { + ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(topLevelTypes.topScroll, 'scroll', mountAt); + } else { + ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelTypes.topScroll, 'scroll', ReactBrowserEventEmitter.ReactEventListener.WINDOW_HANDLE); + } + } else if (dependency === topLevelTypes.topFocus || dependency === topLevelTypes.topBlur) { + + if (isEventSupported('focus', true)) { + ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(topLevelTypes.topFocus, 'focus', mountAt); + ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(topLevelTypes.topBlur, 'blur', mountAt); + } else if (isEventSupported('focusin')) { + // IE has `focusin` and `focusout` events which bubble. + // @see http://www.quirksmode.org/blog/archives/2008/04/delegating_the.html + ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelTypes.topFocus, 'focusin', mountAt); + ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelTypes.topBlur, 'focusout', mountAt); + } + + // to make sure blur and focus event listeners are only attached once + isListening[topLevelTypes.topBlur] = true; + isListening[topLevelTypes.topFocus] = true; + } else if (topEventMapping.hasOwnProperty(dependency)) { + ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(dependency, topEventMapping[dependency], mountAt); + } + + isListening[dependency] = true; + } + } + }, + + trapBubbledEvent: function (topLevelType, handlerBaseName, handle) { + return ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelType, handlerBaseName, handle); + }, + + trapCapturedEvent: function (topLevelType, handlerBaseName, handle) { + return ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(topLevelType, handlerBaseName, handle); + }, + + /** + * Listens to window scroll and resize events. We cache scroll values so that + * application code can access them without triggering reflows. + * + * NOTE: Scroll events do not bubble. + * + * @see http://www.quirksmode.org/dom/events/scroll.html + */ + ensureScrollValueMonitoring: function () { + if (!isMonitoringScrollValue) { + var refresh = ViewportMetrics.refreshScrollValues; + ReactBrowserEventEmitter.ReactEventListener.monitorScrollValue(refresh); + isMonitoringScrollValue = true; + } + }, + + eventNameDispatchConfigs: EventPluginHub.eventNameDispatchConfigs, + + registrationNameModules: EventPluginHub.registrationNameModules, + + putListener: EventPluginHub.putListener, + + getListener: EventPluginHub.getListener, + + deleteListener: EventPluginHub.deleteListener, + + deleteAllListeners: EventPluginHub.deleteAllListeners + + }); + + ReactPerf.measureMethods(ReactBrowserEventEmitter, 'ReactBrowserEventEmitter', { + putListener: 'putListener', + deleteListener: 'deleteListener' + }); + + module.exports = ReactBrowserEventEmitter; + +/***/ }, +/* 29 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule EventConstants + */ + + 'use strict'; + + var keyMirror = __webpack_require__(16); + + var PropagationPhases = keyMirror({ bubbled: null, captured: null }); + + /** + * Types of raw signals from the browser caught at the top level. + */ + var topLevelTypes = keyMirror({ + topAbort: null, + topBlur: null, + topCanPlay: null, + topCanPlayThrough: null, + topChange: null, + topClick: null, + topCompositionEnd: null, + topCompositionStart: null, + topCompositionUpdate: null, + topContextMenu: null, + topCopy: null, + topCut: null, + topDoubleClick: null, + topDrag: null, + topDragEnd: null, + topDragEnter: null, + topDragExit: null, + topDragLeave: null, + topDragOver: null, + topDragStart: null, + topDrop: null, + topDurationChange: null, + topEmptied: null, + topEncrypted: null, + topEnded: null, + topError: null, + topFocus: null, + topInput: null, + topKeyDown: null, + topKeyPress: null, + topKeyUp: null, + topLoad: null, + topLoadedData: null, + topLoadedMetadata: null, + topLoadStart: null, + topMouseDown: null, + topMouseMove: null, + topMouseOut: null, + topMouseOver: null, + topMouseUp: null, + topPaste: null, + topPause: null, + topPlay: null, + topPlaying: null, + topProgress: null, + topRateChange: null, + topReset: null, + topScroll: null, + topSeeked: null, + topSeeking: null, + topSelectionChange: null, + topStalled: null, + topSubmit: null, + topSuspend: null, + topTextInput: null, + topTimeUpdate: null, + topTouchCancel: null, + topTouchEnd: null, + topTouchMove: null, + topTouchStart: null, + topVolumeChange: null, + topWaiting: null, + topWheel: null + }); + + var EventConstants = { + topLevelTypes: topLevelTypes, + PropagationPhases: PropagationPhases + }; + + module.exports = EventConstants; + +/***/ }, +/* 30 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule EventPluginHub + */ + + 'use strict'; + + var EventPluginRegistry = __webpack_require__(31); + var EventPluginUtils = __webpack_require__(32); + var ReactErrorUtils = __webpack_require__(33); + + var accumulateInto = __webpack_require__(34); + var forEachAccumulated = __webpack_require__(35); + var invariant = __webpack_require__(12); + var warning = __webpack_require__(24); + + /** + * Internal store for event listeners + */ + var listenerBank = {}; + + /** + * Internal queue of events that have accumulated their dispatches and are + * waiting to have their dispatches executed. + */ + var eventQueue = null; + + /** + * Dispatches an event and releases it back into the pool, unless persistent. + * + * @param {?object} event Synthetic event to be dispatched. + * @param {boolean} simulated If the event is simulated (changes exn behavior) + * @private + */ + var executeDispatchesAndRelease = function (event, simulated) { + if (event) { + EventPluginUtils.executeDispatchesInOrder(event, simulated); + + if (!event.isPersistent()) { + event.constructor.release(event); + } + } + }; + var executeDispatchesAndReleaseSimulated = function (e) { + return executeDispatchesAndRelease(e, true); + }; + var executeDispatchesAndReleaseTopLevel = function (e) { + return executeDispatchesAndRelease(e, false); + }; + + /** + * - `InstanceHandle`: [required] Module that performs logical traversals of DOM + * hierarchy given ids of the logical DOM elements involved. + */ + var InstanceHandle = null; + + function validateInstanceHandle() { + var valid = InstanceHandle && InstanceHandle.traverseTwoPhase && InstanceHandle.traverseEnterLeave; + process.env.NODE_ENV !== 'production' ? warning(valid, 'InstanceHandle not injected before use!') : undefined; + } + + /** + * This is a unified interface for event plugins to be installed and configured. + * + * Event plugins can implement the following properties: + * + * `extractEvents` {function(string, DOMEventTarget, string, object): *} + * Required. When a top-level event is fired, this method is expected to + * extract synthetic events that will in turn be queued and dispatched. + * + * `eventTypes` {object} + * Optional, plugins that fire events must publish a mapping of registration + * names that are used to register listeners. Values of this mapping must + * be objects that contain `registrationName` or `phasedRegistrationNames`. + * + * `executeDispatch` {function(object, function, string)} + * Optional, allows plugins to override how an event gets dispatched. By + * default, the listener is simply invoked. + * + * Each plugin that is injected into `EventsPluginHub` is immediately operable. + * + * @public + */ + var EventPluginHub = { + + /** + * Methods for injecting dependencies. + */ + injection: { + + /** + * @param {object} InjectedMount + * @public + */ + injectMount: EventPluginUtils.injection.injectMount, + + /** + * @param {object} InjectedInstanceHandle + * @public + */ + injectInstanceHandle: function (InjectedInstanceHandle) { + InstanceHandle = InjectedInstanceHandle; + if (process.env.NODE_ENV !== 'production') { + validateInstanceHandle(); + } + }, + + getInstanceHandle: function () { + if (process.env.NODE_ENV !== 'production') { + validateInstanceHandle(); + } + return InstanceHandle; + }, + + /** + * @param {array} InjectedEventPluginOrder + * @public + */ + injectEventPluginOrder: EventPluginRegistry.injectEventPluginOrder, + + /** + * @param {object} injectedNamesToPlugins Map from names to plugin modules. + */ + injectEventPluginsByName: EventPluginRegistry.injectEventPluginsByName + + }, + + eventNameDispatchConfigs: EventPluginRegistry.eventNameDispatchConfigs, + + registrationNameModules: EventPluginRegistry.registrationNameModules, + + /** + * Stores `listener` at `listenerBank[registrationName][id]`. Is idempotent. + * + * @param {string} id ID of the DOM element. + * @param {string} registrationName Name of listener (e.g. `onClick`). + * @param {?function} listener The callback to store. + */ + putListener: function (id, registrationName, listener) { + !(typeof listener === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Expected %s listener to be a function, instead got type %s', registrationName, typeof listener) : invariant(false) : undefined; + + var bankForRegistrationName = listenerBank[registrationName] || (listenerBank[registrationName] = {}); + bankForRegistrationName[id] = listener; + + var PluginModule = EventPluginRegistry.registrationNameModules[registrationName]; + if (PluginModule && PluginModule.didPutListener) { + PluginModule.didPutListener(id, registrationName, listener); + } + }, + + /** + * @param {string} id ID of the DOM element. + * @param {string} registrationName Name of listener (e.g. `onClick`). + * @return {?function} The stored callback. + */ + getListener: function (id, registrationName) { + var bankForRegistrationName = listenerBank[registrationName]; + return bankForRegistrationName && bankForRegistrationName[id]; + }, + + /** + * Deletes a listener from the registration bank. + * + * @param {string} id ID of the DOM element. + * @param {string} registrationName Name of listener (e.g. `onClick`). + */ + deleteListener: function (id, registrationName) { + var PluginModule = EventPluginRegistry.registrationNameModules[registrationName]; + if (PluginModule && PluginModule.willDeleteListener) { + PluginModule.willDeleteListener(id, registrationName); + } + + var bankForRegistrationName = listenerBank[registrationName]; + // TODO: This should never be null -- when is it? + if (bankForRegistrationName) { + delete bankForRegistrationName[id]; + } + }, + + /** + * Deletes all listeners for the DOM element with the supplied ID. + * + * @param {string} id ID of the DOM element. + */ + deleteAllListeners: function (id) { + for (var registrationName in listenerBank) { + if (!listenerBank[registrationName][id]) { + continue; + } + + var PluginModule = EventPluginRegistry.registrationNameModules[registrationName]; + if (PluginModule && PluginModule.willDeleteListener) { + PluginModule.willDeleteListener(id, registrationName); + } + + delete listenerBank[registrationName][id]; + } + }, + + /** + * Allows registered plugins an opportunity to extract events from top-level + * native browser events. + * + * @param {string} topLevelType Record from `EventConstants`. + * @param {DOMEventTarget} topLevelTarget The listening component root node. + * @param {string} topLevelTargetID ID of `topLevelTarget`. + * @param {object} nativeEvent Native browser event. + * @return {*} An accumulation of synthetic events. + * @internal + */ + extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) { + var events; + var plugins = EventPluginRegistry.plugins; + for (var i = 0; i < plugins.length; i++) { + // Not every plugin in the ordering may be loaded at runtime. + var possiblePlugin = plugins[i]; + if (possiblePlugin) { + var extractedEvents = possiblePlugin.extractEvents(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget); + if (extractedEvents) { + events = accumulateInto(events, extractedEvents); + } + } + } + return events; + }, + + /** + * Enqueues a synthetic event that should be dispatched when + * `processEventQueue` is invoked. + * + * @param {*} events An accumulation of synthetic events. + * @internal + */ + enqueueEvents: function (events) { + if (events) { + eventQueue = accumulateInto(eventQueue, events); + } + }, + + /** + * Dispatches all synthetic events on the event queue. + * + * @internal + */ + processEventQueue: function (simulated) { + // Set `eventQueue` to null before processing it so that we can tell if more + // events get enqueued while processing. + var processingEventQueue = eventQueue; + eventQueue = null; + if (simulated) { + forEachAccumulated(processingEventQueue, executeDispatchesAndReleaseSimulated); + } else { + forEachAccumulated(processingEventQueue, executeDispatchesAndReleaseTopLevel); + } + !!eventQueue ? process.env.NODE_ENV !== 'production' ? invariant(false, 'processEventQueue(): Additional events were enqueued while processing ' + 'an event queue. Support for this has not yet been implemented.') : invariant(false) : undefined; + // This would be a good time to rethrow if any of the event handlers threw. + ReactErrorUtils.rethrowCaughtError(); + }, + + /** + * These are needed for tests only. Do not use! + */ + __purge: function () { + listenerBank = {}; + }, + + __getListenerBank: function () { + return listenerBank; + } + + }; + + module.exports = EventPluginHub; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 31 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule EventPluginRegistry + * @typechecks static-only + */ + + 'use strict'; + + var invariant = __webpack_require__(12); + + /** + * Injectable ordering of event plugins. + */ + var EventPluginOrder = null; + + /** + * Injectable mapping from names to event plugin modules. + */ + var namesToPlugins = {}; + + /** + * Recomputes the plugin list using the injected plugins and plugin ordering. + * + * @private + */ + function recomputePluginOrdering() { + if (!EventPluginOrder) { + // Wait until an `EventPluginOrder` is injected. + return; + } + for (var pluginName in namesToPlugins) { + var PluginModule = namesToPlugins[pluginName]; + var pluginIndex = EventPluginOrder.indexOf(pluginName); + !(pluginIndex > -1) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginRegistry: Cannot inject event plugins that do not exist in ' + 'the plugin ordering, `%s`.', pluginName) : invariant(false) : undefined; + if (EventPluginRegistry.plugins[pluginIndex]) { + continue; + } + !PluginModule.extractEvents ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginRegistry: Event plugins must implement an `extractEvents` ' + 'method, but `%s` does not.', pluginName) : invariant(false) : undefined; + EventPluginRegistry.plugins[pluginIndex] = PluginModule; + var publishedEvents = PluginModule.eventTypes; + for (var eventName in publishedEvents) { + !publishEventForPlugin(publishedEvents[eventName], PluginModule, eventName) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginRegistry: Failed to publish event `%s` for plugin `%s`.', eventName, pluginName) : invariant(false) : undefined; + } + } + } + + /** + * Publishes an event so that it can be dispatched by the supplied plugin. + * + * @param {object} dispatchConfig Dispatch configuration for the event. + * @param {object} PluginModule Plugin publishing the event. + * @return {boolean} True if the event was successfully published. + * @private + */ + function publishEventForPlugin(dispatchConfig, PluginModule, eventName) { + !!EventPluginRegistry.eventNameDispatchConfigs.hasOwnProperty(eventName) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginHub: More than one plugin attempted to publish the same ' + 'event name, `%s`.', eventName) : invariant(false) : undefined; + EventPluginRegistry.eventNameDispatchConfigs[eventName] = dispatchConfig; + + var phasedRegistrationNames = dispatchConfig.phasedRegistrationNames; + if (phasedRegistrationNames) { + for (var phaseName in phasedRegistrationNames) { + if (phasedRegistrationNames.hasOwnProperty(phaseName)) { + var phasedRegistrationName = phasedRegistrationNames[phaseName]; + publishRegistrationName(phasedRegistrationName, PluginModule, eventName); + } + } + return true; + } else if (dispatchConfig.registrationName) { + publishRegistrationName(dispatchConfig.registrationName, PluginModule, eventName); + return true; + } + return false; + } + + /** + * Publishes a registration name that is used to identify dispatched events and + * can be used with `EventPluginHub.putListener` to register listeners. + * + * @param {string} registrationName Registration name to add. + * @param {object} PluginModule Plugin publishing the event. + * @private + */ + function publishRegistrationName(registrationName, PluginModule, eventName) { + !!EventPluginRegistry.registrationNameModules[registrationName] ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginHub: More than one plugin attempted to publish the same ' + 'registration name, `%s`.', registrationName) : invariant(false) : undefined; + EventPluginRegistry.registrationNameModules[registrationName] = PluginModule; + EventPluginRegistry.registrationNameDependencies[registrationName] = PluginModule.eventTypes[eventName].dependencies; + } + + /** + * Registers plugins so that they can extract and dispatch events. + * + * @see {EventPluginHub} + */ + var EventPluginRegistry = { + + /** + * Ordered list of injected plugins. + */ + plugins: [], + + /** + * Mapping from event name to dispatch config + */ + eventNameDispatchConfigs: {}, + + /** + * Mapping from registration name to plugin module + */ + registrationNameModules: {}, + + /** + * Mapping from registration name to event name + */ + registrationNameDependencies: {}, + + /** + * Injects an ordering of plugins (by plugin name). This allows the ordering + * to be decoupled from injection of the actual plugins so that ordering is + * always deterministic regardless of packaging, on-the-fly injection, etc. + * + * @param {array} InjectedEventPluginOrder + * @internal + * @see {EventPluginHub.injection.injectEventPluginOrder} + */ + injectEventPluginOrder: function (InjectedEventPluginOrder) { + !!EventPluginOrder ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginRegistry: Cannot inject event plugin ordering more than ' + 'once. You are likely trying to load more than one copy of React.') : invariant(false) : undefined; + // Clone the ordering so it cannot be dynamically mutated. + EventPluginOrder = Array.prototype.slice.call(InjectedEventPluginOrder); + recomputePluginOrdering(); + }, + + /** + * Injects plugins to be used by `EventPluginHub`. The plugin names must be + * in the ordering injected by `injectEventPluginOrder`. + * + * Plugins can be injected as part of page initialization or on-the-fly. + * + * @param {object} injectedNamesToPlugins Map from names to plugin modules. + * @internal + * @see {EventPluginHub.injection.injectEventPluginsByName} + */ + injectEventPluginsByName: function (injectedNamesToPlugins) { + var isOrderingDirty = false; + for (var pluginName in injectedNamesToPlugins) { + if (!injectedNamesToPlugins.hasOwnProperty(pluginName)) { + continue; + } + var PluginModule = injectedNamesToPlugins[pluginName]; + if (!namesToPlugins.hasOwnProperty(pluginName) || namesToPlugins[pluginName] !== PluginModule) { + !!namesToPlugins[pluginName] ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginRegistry: Cannot inject two different event plugins ' + 'using the same name, `%s`.', pluginName) : invariant(false) : undefined; + namesToPlugins[pluginName] = PluginModule; + isOrderingDirty = true; + } + } + if (isOrderingDirty) { + recomputePluginOrdering(); + } + }, + + /** + * Looks up the plugin for the supplied event. + * + * @param {object} event A synthetic event. + * @return {?object} The plugin that created the supplied event. + * @internal + */ + getPluginModuleForEvent: function (event) { + var dispatchConfig = event.dispatchConfig; + if (dispatchConfig.registrationName) { + return EventPluginRegistry.registrationNameModules[dispatchConfig.registrationName] || null; + } + for (var phase in dispatchConfig.phasedRegistrationNames) { + if (!dispatchConfig.phasedRegistrationNames.hasOwnProperty(phase)) { + continue; + } + var PluginModule = EventPluginRegistry.registrationNameModules[dispatchConfig.phasedRegistrationNames[phase]]; + if (PluginModule) { + return PluginModule; + } + } + return null; + }, + + /** + * Exposed for unit testing. + * @private + */ + _resetEventPlugins: function () { + EventPluginOrder = null; + for (var pluginName in namesToPlugins) { + if (namesToPlugins.hasOwnProperty(pluginName)) { + delete namesToPlugins[pluginName]; + } + } + EventPluginRegistry.plugins.length = 0; + + var eventNameDispatchConfigs = EventPluginRegistry.eventNameDispatchConfigs; + for (var eventName in eventNameDispatchConfigs) { + if (eventNameDispatchConfigs.hasOwnProperty(eventName)) { + delete eventNameDispatchConfigs[eventName]; + } + } + + var registrationNameModules = EventPluginRegistry.registrationNameModules; + for (var registrationName in registrationNameModules) { + if (registrationNameModules.hasOwnProperty(registrationName)) { + delete registrationNameModules[registrationName]; + } + } + } + + }; + + module.exports = EventPluginRegistry; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 32 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule EventPluginUtils + */ + + 'use strict'; + + var EventConstants = __webpack_require__(29); + var ReactErrorUtils = __webpack_require__(33); + + var invariant = __webpack_require__(12); + var warning = __webpack_require__(24); + + /** + * Injected dependencies: + */ + + /** + * - `Mount`: [required] Module that can convert between React dom IDs and + * actual node references. + */ + var injection = { + Mount: null, + injectMount: function (InjectedMount) { + injection.Mount = InjectedMount; + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(InjectedMount && InjectedMount.getNode && InjectedMount.getID, 'EventPluginUtils.injection.injectMount(...): Injected Mount ' + 'module is missing getNode or getID.') : undefined; + } + } + }; + + var topLevelTypes = EventConstants.topLevelTypes; + + function isEndish(topLevelType) { + return topLevelType === topLevelTypes.topMouseUp || topLevelType === topLevelTypes.topTouchEnd || topLevelType === topLevelTypes.topTouchCancel; + } + + function isMoveish(topLevelType) { + return topLevelType === topLevelTypes.topMouseMove || topLevelType === topLevelTypes.topTouchMove; + } + function isStartish(topLevelType) { + return topLevelType === topLevelTypes.topMouseDown || topLevelType === topLevelTypes.topTouchStart; + } + + var validateEventDispatches; + if (process.env.NODE_ENV !== 'production') { + validateEventDispatches = function (event) { + var dispatchListeners = event._dispatchListeners; + var dispatchIDs = event._dispatchIDs; + + var listenersIsArr = Array.isArray(dispatchListeners); + var idsIsArr = Array.isArray(dispatchIDs); + var IDsLen = idsIsArr ? dispatchIDs.length : dispatchIDs ? 1 : 0; + var listenersLen = listenersIsArr ? dispatchListeners.length : dispatchListeners ? 1 : 0; + + process.env.NODE_ENV !== 'production' ? warning(idsIsArr === listenersIsArr && IDsLen === listenersLen, 'EventPluginUtils: Invalid `event`.') : undefined; + }; + } + + /** + * Dispatch the event to the listener. + * @param {SyntheticEvent} event SyntheticEvent to handle + * @param {boolean} simulated If the event is simulated (changes exn behavior) + * @param {function} listener Application-level callback + * @param {string} domID DOM id to pass to the callback. + */ + function executeDispatch(event, simulated, listener, domID) { + var type = event.type || 'unknown-event'; + event.currentTarget = injection.Mount.getNode(domID); + if (simulated) { + ReactErrorUtils.invokeGuardedCallbackWithCatch(type, listener, event, domID); + } else { + ReactErrorUtils.invokeGuardedCallback(type, listener, event, domID); + } + event.currentTarget = null; + } + + /** + * Standard/simple iteration through an event's collected dispatches. + */ + function executeDispatchesInOrder(event, simulated) { + var dispatchListeners = event._dispatchListeners; + var dispatchIDs = event._dispatchIDs; + if (process.env.NODE_ENV !== 'production') { + validateEventDispatches(event); + } + if (Array.isArray(dispatchListeners)) { + for (var i = 0; i < dispatchListeners.length; i++) { + if (event.isPropagationStopped()) { + break; + } + // Listeners and IDs are two parallel arrays that are always in sync. + executeDispatch(event, simulated, dispatchListeners[i], dispatchIDs[i]); + } + } else if (dispatchListeners) { + executeDispatch(event, simulated, dispatchListeners, dispatchIDs); + } + event._dispatchListeners = null; + event._dispatchIDs = null; + } + + /** + * Standard/simple iteration through an event's collected dispatches, but stops + * at the first dispatch execution returning true, and returns that id. + * + * @return {?string} id of the first dispatch execution who's listener returns + * true, or null if no listener returned true. + */ + function executeDispatchesInOrderStopAtTrueImpl(event) { + var dispatchListeners = event._dispatchListeners; + var dispatchIDs = event._dispatchIDs; + if (process.env.NODE_ENV !== 'production') { + validateEventDispatches(event); + } + if (Array.isArray(dispatchListeners)) { + for (var i = 0; i < dispatchListeners.length; i++) { + if (event.isPropagationStopped()) { + break; + } + // Listeners and IDs are two parallel arrays that are always in sync. + if (dispatchListeners[i](event, dispatchIDs[i])) { + return dispatchIDs[i]; + } + } + } else if (dispatchListeners) { + if (dispatchListeners(event, dispatchIDs)) { + return dispatchIDs; + } + } + return null; + } + + /** + * @see executeDispatchesInOrderStopAtTrueImpl + */ + function executeDispatchesInOrderStopAtTrue(event) { + var ret = executeDispatchesInOrderStopAtTrueImpl(event); + event._dispatchIDs = null; + event._dispatchListeners = null; + return ret; + } + + /** + * Execution of a "direct" dispatch - there must be at most one dispatch + * accumulated on the event or it is considered an error. It doesn't really make + * sense for an event with multiple dispatches (bubbled) to keep track of the + * return values at each dispatch execution, but it does tend to make sense when + * dealing with "direct" dispatches. + * + * @return {*} The return value of executing the single dispatch. + */ + function executeDirectDispatch(event) { + if (process.env.NODE_ENV !== 'production') { + validateEventDispatches(event); + } + var dispatchListener = event._dispatchListeners; + var dispatchID = event._dispatchIDs; + !!Array.isArray(dispatchListener) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'executeDirectDispatch(...): Invalid `event`.') : invariant(false) : undefined; + var res = dispatchListener ? dispatchListener(event, dispatchID) : null; + event._dispatchListeners = null; + event._dispatchIDs = null; + return res; + } + + /** + * @param {SyntheticEvent} event + * @return {boolean} True iff number of dispatches accumulated is greater than 0. + */ + function hasDispatches(event) { + return !!event._dispatchListeners; + } + + /** + * General utilities that are useful in creating custom Event Plugins. + */ + var EventPluginUtils = { + isEndish: isEndish, + isMoveish: isMoveish, + isStartish: isStartish, + + executeDirectDispatch: executeDirectDispatch, + executeDispatchesInOrder: executeDispatchesInOrder, + executeDispatchesInOrderStopAtTrue: executeDispatchesInOrderStopAtTrue, + hasDispatches: hasDispatches, + + getNode: function (id) { + return injection.Mount.getNode(id); + }, + getID: function (node) { + return injection.Mount.getID(node); + }, + + injection: injection + }; + + module.exports = EventPluginUtils; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 33 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactErrorUtils + * @typechecks + */ + + 'use strict'; + + var caughtError = null; + + /** + * Call a function while guarding against errors that happens within it. + * + * @param {?String} name of the guard to use for logging or debugging + * @param {Function} func The function to invoke + * @param {*} a First argument + * @param {*} b Second argument + */ + function invokeGuardedCallback(name, func, a, b) { + try { + return func(a, b); + } catch (x) { + if (caughtError === null) { + caughtError = x; + } + return undefined; + } + } + + var ReactErrorUtils = { + invokeGuardedCallback: invokeGuardedCallback, + + /** + * Invoked by ReactTestUtils.Simulate so that any errors thrown by the event + * handler are sure to be rethrown by rethrowCaughtError. + */ + invokeGuardedCallbackWithCatch: invokeGuardedCallback, + + /** + * During execution of guarded functions we will capture the first error which + * we will rethrow to be handled by the top level error handler. + */ + rethrowCaughtError: function () { + if (caughtError) { + var error = caughtError; + caughtError = null; + throw error; + } + } + }; + + if (process.env.NODE_ENV !== 'production') { + /** + * To help development we can get better devtools integration by simulating a + * real browser event. + */ + if (typeof window !== 'undefined' && typeof window.dispatchEvent === 'function' && typeof document !== 'undefined' && typeof document.createEvent === 'function') { + var fakeNode = document.createElement('react'); + ReactErrorUtils.invokeGuardedCallback = function (name, func, a, b) { + var boundFunc = func.bind(null, a, b); + var evtType = 'react-' + name; + fakeNode.addEventListener(evtType, boundFunc, false); + var evt = document.createEvent('Event'); + evt.initEvent(evtType, false, false); + fakeNode.dispatchEvent(evt); + fakeNode.removeEventListener(evtType, boundFunc, false); + }; + } + } + + module.exports = ReactErrorUtils; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 34 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2014-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule accumulateInto + */ + + 'use strict'; + + var invariant = __webpack_require__(12); + + /** + * + * Accumulates items that must not be null or undefined into the first one. This + * is used to conserve memory by avoiding array allocations, and thus sacrifices + * API cleanness. Since `current` can be null before being passed in and not + * null after this function, make sure to assign it back to `current`: + * + * `a = accumulateInto(a, b);` + * + * This API should be sparingly used. Try `accumulate` for something cleaner. + * + * @return {*|array<*>} An accumulation of items. + */ + + function accumulateInto(current, next) { + !(next != null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'accumulateInto(...): Accumulated items must not be null or undefined.') : invariant(false) : undefined; + if (current == null) { + return next; + } + + // Both are not empty. Warning: Never call x.concat(y) when you are not + // certain that x is an Array (x could be a string with concat method). + var currentIsArray = Array.isArray(current); + var nextIsArray = Array.isArray(next); + + if (currentIsArray && nextIsArray) { + current.push.apply(current, next); + return current; + } + + if (currentIsArray) { + current.push(next); + return current; + } + + if (nextIsArray) { + // A bit too dangerous to mutate `next`. + return [current].concat(next); + } + + return [current, next]; + } + + module.exports = accumulateInto; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 35 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule forEachAccumulated + */ + + 'use strict'; + + /** + * @param {array} arr an "accumulation" of items which is either an Array or + * a single item. Useful when paired with the `accumulate` module. This is a + * simple utility that allows us to reason about a collection of items, but + * handling the case when there is exactly one item (and we do not need to + * allocate an array). + */ + var forEachAccumulated = function (arr, cb, scope) { + if (Array.isArray(arr)) { + arr.forEach(cb, scope); + } else if (arr) { + cb.call(scope, arr); + } + }; + + module.exports = forEachAccumulated; + +/***/ }, +/* 36 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactEventEmitterMixin + */ + + 'use strict'; + + var EventPluginHub = __webpack_require__(30); + + function runEventQueueInBatch(events) { + EventPluginHub.enqueueEvents(events); + EventPluginHub.processEventQueue(false); + } + + var ReactEventEmitterMixin = { + + /** + * Streams a fired top-level event to `EventPluginHub` where plugins have the + * opportunity to create `ReactEvent`s to be dispatched. + * + * @param {string} topLevelType Record from `EventConstants`. + * @param {object} topLevelTarget The listening component root node. + * @param {string} topLevelTargetID ID of `topLevelTarget`. + * @param {object} nativeEvent Native environment event. + */ + handleTopLevel: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) { + var events = EventPluginHub.extractEvents(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget); + runEventQueueInBatch(events); + } + }; + + module.exports = ReactEventEmitterMixin; + +/***/ }, +/* 37 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ViewportMetrics + */ + + 'use strict'; + + var ViewportMetrics = { + + currentScrollLeft: 0, + + currentScrollTop: 0, + + refreshScrollValues: function (scrollPosition) { + ViewportMetrics.currentScrollLeft = scrollPosition.x; + ViewportMetrics.currentScrollTop = scrollPosition.y; + } + + }; + + module.exports = ViewportMetrics; + +/***/ }, +/* 38 */ +/***/ function(module, exports) { + + /** + * Copyright 2014-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule Object.assign + */ + + // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.assign + + 'use strict'; + + function assign(target, sources) { + if (target == null) { + throw new TypeError('Object.assign target cannot be null or undefined'); + } + + var to = Object(target); + var hasOwnProperty = Object.prototype.hasOwnProperty; + + for (var nextIndex = 1; nextIndex < arguments.length; nextIndex++) { + var nextSource = arguments[nextIndex]; + if (nextSource == null) { + continue; + } + + var from = Object(nextSource); + + // We don't currently support accessors nor proxies. Therefore this + // copy cannot throw. If we ever supported this then we must handle + // exceptions and side-effects. We don't support symbols so they won't + // be transferred. + + for (var key in from) { + if (hasOwnProperty.call(from, key)) { + to[key] = from[key]; + } + } + } + + return to; + } + + module.exports = assign; + +/***/ }, +/* 39 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule isEventSupported + */ + + 'use strict'; + + var ExecutionEnvironment = __webpack_require__(8); + + var useHasFeature; + if (ExecutionEnvironment.canUseDOM) { + useHasFeature = document.implementation && document.implementation.hasFeature && + // always returns true in newer browsers as per the standard. + // @see http://dom.spec.whatwg.org/#dom-domimplementation-hasfeature + document.implementation.hasFeature('', '') !== true; + } + + /** + * Checks if an event is supported in the current execution environment. + * + * NOTE: This will not work correctly for non-generic events such as `change`, + * `reset`, `load`, `error`, and `select`. + * + * Borrows from Modernizr. + * + * @param {string} eventNameSuffix Event name, e.g. "click". + * @param {?boolean} capture Check if the capture phase is supported. + * @return {boolean} True if the event is supported. + * @internal + * @license Modernizr 3.0.0pre (Custom Build) | MIT + */ + function isEventSupported(eventNameSuffix, capture) { + if (!ExecutionEnvironment.canUseDOM || capture && !('addEventListener' in document)) { + return false; + } + + var eventName = 'on' + eventNameSuffix; + var isSupported = (eventName in document); + + if (!isSupported) { + var element = document.createElement('div'); + element.setAttribute(eventName, 'return;'); + isSupported = typeof element[eventName] === 'function'; + } + + if (!isSupported && useHasFeature && eventNameSuffix === 'wheel') { + // This is the only way to test support for the `wheel` event in IE9+. + isSupported = document.implementation.hasFeature('Events.wheel', '3.0'); + } + + return isSupported; + } + + module.exports = isEventSupported; + +/***/ }, +/* 40 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactDOMFeatureFlags + */ + + 'use strict'; + + var ReactDOMFeatureFlags = { + useCreateElement: false + }; + + module.exports = ReactDOMFeatureFlags; + +/***/ }, +/* 41 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2014-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactElement + */ + + 'use strict'; + + var ReactCurrentOwner = __webpack_require__(4); + + var assign = __webpack_require__(38); + var canDefineProperty = __webpack_require__(42); + + // The Symbol used to tag the ReactElement type. If there is no native Symbol + // nor polyfill, then a plain number is used for performance. + var REACT_ELEMENT_TYPE = typeof Symbol === 'function' && Symbol['for'] && Symbol['for']('react.element') || 0xeac7; + + var RESERVED_PROPS = { + key: true, + ref: true, + __self: true, + __source: true + }; + + /** + * Base constructor for all React elements. This is only used to make this + * work with a dynamic instanceof check. Nothing should live on this prototype. + * + * @param {*} type + * @param {*} key + * @param {string|object} ref + * @param {*} self A *temporary* helper to detect places where `this` is + * different from the `owner` when React.createElement is called, so that we + * can warn. We want to get rid of owner and replace string `ref`s with arrow + * functions, and as long as `this` and owner are the same, there will be no + * change in behavior. + * @param {*} source An annotation object (added by a transpiler or otherwise) + * indicating filename, line number, and/or other information. + * @param {*} owner + * @param {*} props + * @internal + */ + var ReactElement = function (type, key, ref, self, source, owner, props) { + var element = { + // This tag allow us to uniquely identify this as a React Element + $$typeof: REACT_ELEMENT_TYPE, + + // Built-in properties that belong on the element + type: type, + key: key, + ref: ref, + props: props, + + // Record the component responsible for creating this element. + _owner: owner + }; + + if (process.env.NODE_ENV !== 'production') { + // The validation flag is currently mutative. We put it on + // an external backing store so that we can freeze the whole object. + // This can be replaced with a WeakMap once they are implemented in + // commonly used development environments. + element._store = {}; + + // To make comparing ReactElements easier for testing purposes, we make + // the validation flag non-enumerable (where possible, which should + // include every environment we run tests in), so the test framework + // ignores it. + if (canDefineProperty) { + Object.defineProperty(element._store, 'validated', { + configurable: false, + enumerable: false, + writable: true, + value: false + }); + // self and source are DEV only properties. + Object.defineProperty(element, '_self', { + configurable: false, + enumerable: false, + writable: false, + value: self + }); + // Two elements created in two different places should be considered + // equal for testing purposes and therefore we hide it from enumeration. + Object.defineProperty(element, '_source', { + configurable: false, + enumerable: false, + writable: false, + value: source + }); + } else { + element._store.validated = false; + element._self = self; + element._source = source; + } + Object.freeze(element.props); + Object.freeze(element); + } + + return element; + }; + + ReactElement.createElement = function (type, config, children) { + var propName; + + // Reserved names are extracted + var props = {}; + + var key = null; + var ref = null; + var self = null; + var source = null; + + if (config != null) { + ref = config.ref === undefined ? null : config.ref; + key = config.key === undefined ? null : '' + config.key; + self = config.__self === undefined ? null : config.__self; + source = config.__source === undefined ? null : config.__source; + // Remaining properties are added to a new props object + for (propName in config) { + if (config.hasOwnProperty(propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { + props[propName] = config[propName]; + } + } + } + + // Children can be more than one argument, and those are transferred onto + // the newly allocated props object. + var childrenLength = arguments.length - 2; + if (childrenLength === 1) { + props.children = children; + } else if (childrenLength > 1) { + var childArray = Array(childrenLength); + for (var i = 0; i < childrenLength; i++) { + childArray[i] = arguments[i + 2]; + } + props.children = childArray; + } + + // Resolve default props + if (type && type.defaultProps) { + var defaultProps = type.defaultProps; + for (propName in defaultProps) { + if (typeof props[propName] === 'undefined') { + props[propName] = defaultProps[propName]; + } + } + } + + return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props); + }; + + ReactElement.createFactory = function (type) { + var factory = ReactElement.createElement.bind(null, type); + // Expose the type on the factory and the prototype so that it can be + // easily accessed on elements. E.g. `<Foo />.type === Foo`. + // This should not be named `constructor` since this may not be the function + // that created the element, and it may not even be a constructor. + // Legacy hook TODO: Warn if this is accessed + factory.type = type; + return factory; + }; + + ReactElement.cloneAndReplaceKey = function (oldElement, newKey) { + var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props); + + return newElement; + }; + + ReactElement.cloneAndReplaceProps = function (oldElement, newProps) { + var newElement = ReactElement(oldElement.type, oldElement.key, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, newProps); + + if (process.env.NODE_ENV !== 'production') { + // If the key on the original is valid, then the clone is valid + newElement._store.validated = oldElement._store.validated; + } + + return newElement; + }; + + ReactElement.cloneElement = function (element, config, children) { + var propName; + + // Original props are copied + var props = assign({}, element.props); + + // Reserved names are extracted + var key = element.key; + var ref = element.ref; + // Self is preserved since the owner is preserved. + var self = element._self; + // Source is preserved since cloneElement is unlikely to be targeted by a + // transpiler, and the original source is probably a better indicator of the + // true owner. + var source = element._source; + + // Owner will be preserved, unless ref is overridden + var owner = element._owner; + + if (config != null) { + if (config.ref !== undefined) { + // Silently steal the ref from the parent. + ref = config.ref; + owner = ReactCurrentOwner.current; + } + if (config.key !== undefined) { + key = '' + config.key; + } + // Remaining properties override existing props + for (propName in config) { + if (config.hasOwnProperty(propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { + props[propName] = config[propName]; + } + } + } + + // Children can be more than one argument, and those are transferred onto + // the newly allocated props object. + var childrenLength = arguments.length - 2; + if (childrenLength === 1) { + props.children = children; + } else if (childrenLength > 1) { + var childArray = Array(childrenLength); + for (var i = 0; i < childrenLength; i++) { + childArray[i] = arguments[i + 2]; + } + props.children = childArray; + } + + return ReactElement(element.type, key, ref, self, source, owner, props); + }; + + /** + * @param {?object} object + * @return {boolean} True if `object` is a valid component. + * @final + */ + ReactElement.isValidElement = function (object) { + return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; + }; + + module.exports = ReactElement; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 42 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule canDefineProperty + */ + + 'use strict'; + + var canDefineProperty = false; + if (process.env.NODE_ENV !== 'production') { + try { + Object.defineProperty({}, 'x', { get: function () {} }); + canDefineProperty = true; + } catch (x) { + // IE will fail on defineProperty + } + } + + module.exports = canDefineProperty; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 43 */ +/***/ function(module, exports) { + + /** + * Copyright 2014-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactEmptyComponentRegistry + */ + + 'use strict'; + + // This registry keeps track of the React IDs of the components that rendered to + // `null` (in reality a placeholder such as `noscript`) + var nullComponentIDsRegistry = {}; + + /** + * @param {string} id Component's `_rootNodeID`. + * @return {boolean} True if the component is rendered to null. + */ + function isNullComponentID(id) { + return !!nullComponentIDsRegistry[id]; + } + + /** + * Mark the component as having rendered to null. + * @param {string} id Component's `_rootNodeID`. + */ + function registerNullComponentID(id) { + nullComponentIDsRegistry[id] = true; + } + + /** + * Unmark the component as having rendered to null: it renders to something now. + * @param {string} id Component's `_rootNodeID`. + */ + function deregisterNullComponentID(id) { + delete nullComponentIDsRegistry[id]; + } + + var ReactEmptyComponentRegistry = { + isNullComponentID: isNullComponentID, + registerNullComponentID: registerNullComponentID, + deregisterNullComponentID: deregisterNullComponentID + }; + + module.exports = ReactEmptyComponentRegistry; + +/***/ }, +/* 44 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactInstanceHandles + * @typechecks static-only + */ + + 'use strict'; + + var ReactRootIndex = __webpack_require__(45); + + var invariant = __webpack_require__(12); + + var SEPARATOR = '.'; + var SEPARATOR_LENGTH = SEPARATOR.length; + + /** + * Maximum depth of traversals before we consider the possibility of a bad ID. + */ + var MAX_TREE_DEPTH = 10000; + + /** + * Creates a DOM ID prefix to use when mounting React components. + * + * @param {number} index A unique integer + * @return {string} React root ID. + * @internal + */ + function getReactRootIDString(index) { + return SEPARATOR + index.toString(36); + } + + /** + * Checks if a character in the supplied ID is a separator or the end. + * + * @param {string} id A React DOM ID. + * @param {number} index Index of the character to check. + * @return {boolean} True if the character is a separator or end of the ID. + * @private + */ + function isBoundary(id, index) { + return id.charAt(index) === SEPARATOR || index === id.length; + } + + /** + * Checks if the supplied string is a valid React DOM ID. + * + * @param {string} id A React DOM ID, maybe. + * @return {boolean} True if the string is a valid React DOM ID. + * @private + */ + function isValidID(id) { + return id === '' || id.charAt(0) === SEPARATOR && id.charAt(id.length - 1) !== SEPARATOR; + } + + /** + * Checks if the first ID is an ancestor of or equal to the second ID. + * + * @param {string} ancestorID + * @param {string} descendantID + * @return {boolean} True if `ancestorID` is an ancestor of `descendantID`. + * @internal + */ + function isAncestorIDOf(ancestorID, descendantID) { + return descendantID.indexOf(ancestorID) === 0 && isBoundary(descendantID, ancestorID.length); + } + + /** + * Gets the parent ID of the supplied React DOM ID, `id`. + * + * @param {string} id ID of a component. + * @return {string} ID of the parent, or an empty string. + * @private + */ + function getParentID(id) { + return id ? id.substr(0, id.lastIndexOf(SEPARATOR)) : ''; + } + + /** + * Gets the next DOM ID on the tree path from the supplied `ancestorID` to the + * supplied `destinationID`. If they are equal, the ID is returned. + * + * @param {string} ancestorID ID of an ancestor node of `destinationID`. + * @param {string} destinationID ID of the destination node. + * @return {string} Next ID on the path from `ancestorID` to `destinationID`. + * @private + */ + function getNextDescendantID(ancestorID, destinationID) { + !(isValidID(ancestorID) && isValidID(destinationID)) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'getNextDescendantID(%s, %s): Received an invalid React DOM ID.', ancestorID, destinationID) : invariant(false) : undefined; + !isAncestorIDOf(ancestorID, destinationID) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'getNextDescendantID(...): React has made an invalid assumption about ' + 'the DOM hierarchy. Expected `%s` to be an ancestor of `%s`.', ancestorID, destinationID) : invariant(false) : undefined; + if (ancestorID === destinationID) { + return ancestorID; + } + // Skip over the ancestor and the immediate separator. Traverse until we hit + // another separator or we reach the end of `destinationID`. + var start = ancestorID.length + SEPARATOR_LENGTH; + var i; + for (i = start; i < destinationID.length; i++) { + if (isBoundary(destinationID, i)) { + break; + } + } + return destinationID.substr(0, i); + } + + /** + * Gets the nearest common ancestor ID of two IDs. + * + * Using this ID scheme, the nearest common ancestor ID is the longest common + * prefix of the two IDs that immediately preceded a "marker" in both strings. + * + * @param {string} oneID + * @param {string} twoID + * @return {string} Nearest common ancestor ID, or the empty string if none. + * @private + */ + function getFirstCommonAncestorID(oneID, twoID) { + var minLength = Math.min(oneID.length, twoID.length); + if (minLength === 0) { + return ''; + } + var lastCommonMarkerIndex = 0; + // Use `<=` to traverse until the "EOL" of the shorter string. + for (var i = 0; i <= minLength; i++) { + if (isBoundary(oneID, i) && isBoundary(twoID, i)) { + lastCommonMarkerIndex = i; + } else if (oneID.charAt(i) !== twoID.charAt(i)) { + break; + } + } + var longestCommonID = oneID.substr(0, lastCommonMarkerIndex); + !isValidID(longestCommonID) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'getFirstCommonAncestorID(%s, %s): Expected a valid React DOM ID: %s', oneID, twoID, longestCommonID) : invariant(false) : undefined; + return longestCommonID; + } + + /** + * Traverses the parent path between two IDs (either up or down). The IDs must + * not be the same, and there must exist a parent path between them. If the + * callback returns `false`, traversal is stopped. + * + * @param {?string} start ID at which to start traversal. + * @param {?string} stop ID at which to end traversal. + * @param {function} cb Callback to invoke each ID with. + * @param {*} arg Argument to invoke the callback with. + * @param {?boolean} skipFirst Whether or not to skip the first node. + * @param {?boolean} skipLast Whether or not to skip the last node. + * @private + */ + function traverseParentPath(start, stop, cb, arg, skipFirst, skipLast) { + start = start || ''; + stop = stop || ''; + !(start !== stop) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'traverseParentPath(...): Cannot traverse from and to the same ID, `%s`.', start) : invariant(false) : undefined; + var traverseUp = isAncestorIDOf(stop, start); + !(traverseUp || isAncestorIDOf(start, stop)) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'traverseParentPath(%s, %s, ...): Cannot traverse from two IDs that do ' + 'not have a parent path.', start, stop) : invariant(false) : undefined; + // Traverse from `start` to `stop` one depth at a time. + var depth = 0; + var traverse = traverseUp ? getParentID : getNextDescendantID; + for (var id = start;; /* until break */id = traverse(id, stop)) { + var ret; + if ((!skipFirst || id !== start) && (!skipLast || id !== stop)) { + ret = cb(id, traverseUp, arg); + } + if (ret === false || id === stop) { + // Only break //after// visiting `stop`. + break; + } + !(depth++ < MAX_TREE_DEPTH) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'traverseParentPath(%s, %s, ...): Detected an infinite loop while ' + 'traversing the React DOM ID tree. This may be due to malformed IDs: %s', start, stop, id) : invariant(false) : undefined; + } + } + + /** + * Manages the IDs assigned to DOM representations of React components. This + * uses a specific scheme in order to traverse the DOM efficiently (e.g. in + * order to simulate events). + * + * @internal + */ + var ReactInstanceHandles = { + + /** + * Constructs a React root ID + * @return {string} A React root ID. + */ + createReactRootID: function () { + return getReactRootIDString(ReactRootIndex.createReactRootIndex()); + }, + + /** + * Constructs a React ID by joining a root ID with a name. + * + * @param {string} rootID Root ID of a parent component. + * @param {string} name A component's name (as flattened children). + * @return {string} A React ID. + * @internal + */ + createReactID: function (rootID, name) { + return rootID + name; + }, + + /** + * Gets the DOM ID of the React component that is the root of the tree that + * contains the React component with the supplied DOM ID. + * + * @param {string} id DOM ID of a React component. + * @return {?string} DOM ID of the React component that is the root. + * @internal + */ + getReactRootIDFromNodeID: function (id) { + if (id && id.charAt(0) === SEPARATOR && id.length > 1) { + var index = id.indexOf(SEPARATOR, 1); + return index > -1 ? id.substr(0, index) : id; + } + return null; + }, + + /** + * Traverses the ID hierarchy and invokes the supplied `cb` on any IDs that + * should would receive a `mouseEnter` or `mouseLeave` event. + * + * NOTE: Does not invoke the callback on the nearest common ancestor because + * nothing "entered" or "left" that element. + * + * @param {string} leaveID ID being left. + * @param {string} enterID ID being entered. + * @param {function} cb Callback to invoke on each entered/left ID. + * @param {*} upArg Argument to invoke the callback with on left IDs. + * @param {*} downArg Argument to invoke the callback with on entered IDs. + * @internal + */ + traverseEnterLeave: function (leaveID, enterID, cb, upArg, downArg) { + var ancestorID = getFirstCommonAncestorID(leaveID, enterID); + if (ancestorID !== leaveID) { + traverseParentPath(leaveID, ancestorID, cb, upArg, false, true); + } + if (ancestorID !== enterID) { + traverseParentPath(ancestorID, enterID, cb, downArg, true, false); + } + }, + + /** + * Simulates the traversal of a two-phase, capture/bubble event dispatch. + * + * NOTE: This traversal happens on IDs without touching the DOM. + * + * @param {string} targetID ID of the target node. + * @param {function} cb Callback to invoke. + * @param {*} arg Argument to invoke the callback with. + * @internal + */ + traverseTwoPhase: function (targetID, cb, arg) { + if (targetID) { + traverseParentPath('', targetID, cb, arg, true, false); + traverseParentPath(targetID, '', cb, arg, false, true); + } + }, + + /** + * Same as `traverseTwoPhase` but skips the `targetID`. + */ + traverseTwoPhaseSkipTarget: function (targetID, cb, arg) { + if (targetID) { + traverseParentPath('', targetID, cb, arg, true, true); + traverseParentPath(targetID, '', cb, arg, true, true); + } + }, + + /** + * Traverse a node ID, calling the supplied `cb` for each ancestor ID. For + * example, passing `.0.$row-0.1` would result in `cb` getting called + * with `.0`, `.0.$row-0`, and `.0.$row-0.1`. + * + * NOTE: This traversal happens on IDs without touching the DOM. + * + * @param {string} targetID ID of the target node. + * @param {function} cb Callback to invoke. + * @param {*} arg Argument to invoke the callback with. + * @internal + */ + traverseAncestors: function (targetID, cb, arg) { + traverseParentPath('', targetID, cb, arg, true, false); + }, + + getFirstCommonAncestorID: getFirstCommonAncestorID, + + /** + * Exposed for unit testing. + * @private + */ + _getNextDescendantID: getNextDescendantID, + + isAncestorIDOf: isAncestorIDOf, + + SEPARATOR: SEPARATOR + + }; + + module.exports = ReactInstanceHandles; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 45 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactRootIndex + * @typechecks + */ + + 'use strict'; + + var ReactRootIndexInjection = { + /** + * @param {function} _createReactRootIndex + */ + injectCreateReactRootIndex: function (_createReactRootIndex) { + ReactRootIndex.createReactRootIndex = _createReactRootIndex; + } + }; + + var ReactRootIndex = { + createReactRootIndex: null, + injection: ReactRootIndexInjection + }; + + module.exports = ReactRootIndex; + +/***/ }, +/* 46 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactInstanceMap + */ + + 'use strict'; + + /** + * `ReactInstanceMap` maintains a mapping from a public facing stateful + * instance (key) and the internal representation (value). This allows public + * methods to accept the user facing instance as an argument and map them back + * to internal methods. + */ + + // TODO: Replace this with ES6: var ReactInstanceMap = new Map(); + var ReactInstanceMap = { + + /** + * This API should be called `delete` but we'd have to make sure to always + * transform these to strings for IE support. When this transform is fully + * supported we can rename it. + */ + remove: function (key) { + key._reactInternalInstance = undefined; + }, + + get: function (key) { + return key._reactInternalInstance; + }, + + has: function (key) { + return key._reactInternalInstance !== undefined; + }, + + set: function (key, value) { + key._reactInternalInstance = value; + } + + }; + + module.exports = ReactInstanceMap; + +/***/ }, +/* 47 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactMarkupChecksum + */ + + 'use strict'; + + var adler32 = __webpack_require__(48); + + var TAG_END = /\/?>/; + + var ReactMarkupChecksum = { + CHECKSUM_ATTR_NAME: 'data-react-checksum', + + /** + * @param {string} markup Markup string + * @return {string} Markup string with checksum attribute attached + */ + addChecksumToMarkup: function (markup) { + var checksum = adler32(markup); + + // Add checksum (handle both parent tags and self-closing tags) + return markup.replace(TAG_END, ' ' + ReactMarkupChecksum.CHECKSUM_ATTR_NAME + '="' + checksum + '"$&'); + }, + + /** + * @param {string} markup to use + * @param {DOMElement} element root React element + * @returns {boolean} whether or not the markup is the same + */ + canReuseMarkup: function (markup, element) { + var existingChecksum = element.getAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME); + existingChecksum = existingChecksum && parseInt(existingChecksum, 10); + var markupChecksum = adler32(markup); + return markupChecksum === existingChecksum; + } + }; + + module.exports = ReactMarkupChecksum; + +/***/ }, +/* 48 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule adler32 + */ + + 'use strict'; + + var MOD = 65521; + + // adler32 is not cryptographically strong, and is only used to sanity check that + // markup generated on the server matches the markup generated on the client. + // This implementation (a modified version of the SheetJS version) has been optimized + // for our use case, at the expense of conforming to the adler32 specification + // for non-ascii inputs. + function adler32(data) { + var a = 1; + var b = 0; + var i = 0; + var l = data.length; + var m = l & ~0x3; + while (i < m) { + for (; i < Math.min(i + 4096, m); i += 4) { + b += (a += data.charCodeAt(i)) + (a += data.charCodeAt(i + 1)) + (a += data.charCodeAt(i + 2)) + (a += data.charCodeAt(i + 3)); + } + a %= MOD; + b %= MOD; + } + for (; i < l; i++) { + b += a += data.charCodeAt(i); + } + a %= MOD; + b %= MOD; + return a | b << 16; + } + + module.exports = adler32; + +/***/ }, +/* 49 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactReconciler + */ + + 'use strict'; + + var ReactRef = __webpack_require__(50); + + /** + * Helper to call ReactRef.attachRefs with this composite component, split out + * to avoid allocations in the transaction mount-ready queue. + */ + function attachRefs() { + ReactRef.attachRefs(this, this._currentElement); + } + + var ReactReconciler = { + + /** + * Initializes the component, renders markup, and registers event listeners. + * + * @param {ReactComponent} internalInstance + * @param {string} rootID DOM ID of the root node. + * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction + * @return {?string} Rendered markup to be inserted into the DOM. + * @final + * @internal + */ + mountComponent: function (internalInstance, rootID, transaction, context) { + var markup = internalInstance.mountComponent(rootID, transaction, context); + if (internalInstance._currentElement && internalInstance._currentElement.ref != null) { + transaction.getReactMountReady().enqueue(attachRefs, internalInstance); + } + return markup; + }, + + /** + * Releases any resources allocated by `mountComponent`. + * + * @final + * @internal + */ + unmountComponent: function (internalInstance) { + ReactRef.detachRefs(internalInstance, internalInstance._currentElement); + internalInstance.unmountComponent(); + }, + + /** + * Update a component using a new element. + * + * @param {ReactComponent} internalInstance + * @param {ReactElement} nextElement + * @param {ReactReconcileTransaction} transaction + * @param {object} context + * @internal + */ + receiveComponent: function (internalInstance, nextElement, transaction, context) { + var prevElement = internalInstance._currentElement; + + if (nextElement === prevElement && context === internalInstance._context) { + // Since elements are immutable after the owner is rendered, + // we can do a cheap identity compare here to determine if this is a + // superfluous reconcile. It's possible for state to be mutable but such + // change should trigger an update of the owner which would recreate + // the element. We explicitly check for the existence of an owner since + // it's possible for an element created outside a composite to be + // deeply mutated and reused. + + // TODO: Bailing out early is just a perf optimization right? + // TODO: Removing the return statement should affect correctness? + return; + } + + var refsChanged = ReactRef.shouldUpdateRefs(prevElement, nextElement); + + if (refsChanged) { + ReactRef.detachRefs(internalInstance, prevElement); + } + + internalInstance.receiveComponent(nextElement, transaction, context); + + if (refsChanged && internalInstance._currentElement && internalInstance._currentElement.ref != null) { + transaction.getReactMountReady().enqueue(attachRefs, internalInstance); + } + }, + + /** + * Flush any dirty changes in a component. + * + * @param {ReactComponent} internalInstance + * @param {ReactReconcileTransaction} transaction + * @internal + */ + performUpdateIfNecessary: function (internalInstance, transaction) { + internalInstance.performUpdateIfNecessary(transaction); + } + + }; + + module.exports = ReactReconciler; + +/***/ }, +/* 50 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactRef + */ + + 'use strict'; + + var ReactOwner = __webpack_require__(51); + + var ReactRef = {}; + + function attachRef(ref, component, owner) { + if (typeof ref === 'function') { + ref(component.getPublicInstance()); + } else { + // Legacy ref + ReactOwner.addComponentAsRefTo(component, ref, owner); + } + } + + function detachRef(ref, component, owner) { + if (typeof ref === 'function') { + ref(null); + } else { + // Legacy ref + ReactOwner.removeComponentAsRefFrom(component, ref, owner); + } + } + + ReactRef.attachRefs = function (instance, element) { + if (element === null || element === false) { + return; + } + var ref = element.ref; + if (ref != null) { + attachRef(ref, instance, element._owner); + } + }; + + ReactRef.shouldUpdateRefs = function (prevElement, nextElement) { + // If either the owner or a `ref` has changed, make sure the newest owner + // has stored a reference to `this`, and the previous owner (if different) + // has forgotten the reference to `this`. We use the element instead + // of the public this.props because the post processing cannot determine + // a ref. The ref conceptually lives on the element. + + // TODO: Should this even be possible? The owner cannot change because + // it's forbidden by shouldUpdateReactComponent. The ref can change + // if you swap the keys of but not the refs. Reconsider where this check + // is made. It probably belongs where the key checking and + // instantiateReactComponent is done. + + var prevEmpty = prevElement === null || prevElement === false; + var nextEmpty = nextElement === null || nextElement === false; + + return( + // This has a few false positives w/r/t empty components. + prevEmpty || nextEmpty || nextElement._owner !== prevElement._owner || nextElement.ref !== prevElement.ref + ); + }; + + ReactRef.detachRefs = function (instance, element) { + if (element === null || element === false) { + return; + } + var ref = element.ref; + if (ref != null) { + detachRef(ref, instance, element._owner); + } + }; + + module.exports = ReactRef; + +/***/ }, +/* 51 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactOwner + */ + + 'use strict'; + + var invariant = __webpack_require__(12); + + /** + * ReactOwners are capable of storing references to owned components. + * + * All components are capable of //being// referenced by owner components, but + * only ReactOwner components are capable of //referencing// owned components. + * The named reference is known as a "ref". + * + * Refs are available when mounted and updated during reconciliation. + * + * var MyComponent = React.createClass({ + * render: function() { + * return ( + * <div onClick={this.handleClick}> + * <CustomComponent ref="custom" /> + * </div> + * ); + * }, + * handleClick: function() { + * this.refs.custom.handleClick(); + * }, + * componentDidMount: function() { + * this.refs.custom.initialize(); + * } + * }); + * + * Refs should rarely be used. When refs are used, they should only be done to + * control data that is not handled by React's data flow. + * + * @class ReactOwner + */ + var ReactOwner = { + + /** + * @param {?object} object + * @return {boolean} True if `object` is a valid owner. + * @final + */ + isValidOwner: function (object) { + return !!(object && typeof object.attachRef === 'function' && typeof object.detachRef === 'function'); + }, + + /** + * Adds a component by ref to an owner component. + * + * @param {ReactComponent} component Component to reference. + * @param {string} ref Name by which to refer to the component. + * @param {ReactOwner} owner Component on which to record the ref. + * @final + * @internal + */ + addComponentAsRefTo: function (component, ref, owner) { + !ReactOwner.isValidOwner(owner) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'addComponentAsRefTo(...): Only a ReactOwner can have refs. You might ' + 'be adding a ref to a component that was not created inside a component\'s ' + '`render` method, or you have multiple copies of React loaded ' + '(details: https://fb.me/react-refs-must-have-owner).') : invariant(false) : undefined; + owner.attachRef(ref, component); + }, + + /** + * Removes a component by ref from an owner component. + * + * @param {ReactComponent} component Component to dereference. + * @param {string} ref Name of the ref to remove. + * @param {ReactOwner} owner Component on which the ref is recorded. + * @final + * @internal + */ + removeComponentAsRefFrom: function (component, ref, owner) { + !ReactOwner.isValidOwner(owner) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'removeComponentAsRefFrom(...): Only a ReactOwner can have refs. You might ' + 'be removing a ref to a component that was not created inside a component\'s ' + '`render` method, or you have multiple copies of React loaded ' + '(details: https://fb.me/react-refs-must-have-owner).') : invariant(false) : undefined; + // Check that `component` is still the current ref because we do not want to + // detach the ref if another component stole it. + if (owner.getPublicInstance().refs[ref] === component.getPublicInstance()) { + owner.detachRef(ref); + } + } + + }; + + module.exports = ReactOwner; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 52 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactUpdateQueue + */ + + 'use strict'; + + var ReactCurrentOwner = __webpack_require__(4); + var ReactElement = __webpack_require__(41); + var ReactInstanceMap = __webpack_require__(46); + var ReactUpdates = __webpack_require__(53); + + var assign = __webpack_require__(38); + var invariant = __webpack_require__(12); + var warning = __webpack_require__(24); + + function enqueueUpdate(internalInstance) { + ReactUpdates.enqueueUpdate(internalInstance); + } + + function getInternalInstanceReadyForUpdate(publicInstance, callerName) { + var internalInstance = ReactInstanceMap.get(publicInstance); + if (!internalInstance) { + if (process.env.NODE_ENV !== 'production') { + // Only warn when we have a callerName. Otherwise we should be silent. + // We're probably calling from enqueueCallback. We don't want to warn + // there because we already warned for the corresponding lifecycle method. + process.env.NODE_ENV !== 'production' ? warning(!callerName, '%s(...): Can only update a mounted or mounting component. ' + 'This usually means you called %s() on an unmounted component. ' + 'This is a no-op. Please check the code for the %s component.', callerName, callerName, publicInstance.constructor.displayName) : undefined; + } + return null; + } + + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(ReactCurrentOwner.current == null, '%s(...): Cannot update during an existing state transition ' + '(such as within `render`). Render methods should be a pure function ' + 'of props and state.', callerName) : undefined; + } + + return internalInstance; + } + + /** + * ReactUpdateQueue allows for state updates to be scheduled into a later + * reconciliation step. + */ + var ReactUpdateQueue = { + + /** + * Checks whether or not this composite component is mounted. + * @param {ReactClass} publicInstance The instance we want to test. + * @return {boolean} True if mounted, false otherwise. + * @protected + * @final + */ + isMounted: function (publicInstance) { + if (process.env.NODE_ENV !== 'production') { + var owner = ReactCurrentOwner.current; + if (owner !== null) { + process.env.NODE_ENV !== 'production' ? warning(owner._warnedAboutRefsInRender, '%s is accessing isMounted inside its render() function. ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', owner.getName() || 'A component') : undefined; + owner._warnedAboutRefsInRender = true; + } + } + var internalInstance = ReactInstanceMap.get(publicInstance); + if (internalInstance) { + // During componentWillMount and render this will still be null but after + // that will always render to something. At least for now. So we can use + // this hack. + return !!internalInstance._renderedComponent; + } else { + return false; + } + }, + + /** + * Enqueue a callback that will be executed after all the pending updates + * have processed. + * + * @param {ReactClass} publicInstance The instance to use as `this` context. + * @param {?function} callback Called after state is updated. + * @internal + */ + enqueueCallback: function (publicInstance, callback) { + !(typeof callback === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'enqueueCallback(...): You called `setProps`, `replaceProps`, ' + '`setState`, `replaceState`, or `forceUpdate` with a callback that ' + 'isn\'t callable.') : invariant(false) : undefined; + var internalInstance = getInternalInstanceReadyForUpdate(publicInstance); + + // Previously we would throw an error if we didn't have an internal + // instance. Since we want to make it a no-op instead, we mirror the same + // behavior we have in other enqueue* methods. + // We also need to ignore callbacks in componentWillMount. See + // enqueueUpdates. + if (!internalInstance) { + return null; + } + + if (internalInstance._pendingCallbacks) { + internalInstance._pendingCallbacks.push(callback); + } else { + internalInstance._pendingCallbacks = [callback]; + } + // TODO: The callback here is ignored when setState is called from + // componentWillMount. Either fix it or disallow doing so completely in + // favor of getInitialState. Alternatively, we can disallow + // componentWillMount during server-side rendering. + enqueueUpdate(internalInstance); + }, + + enqueueCallbackInternal: function (internalInstance, callback) { + !(typeof callback === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'enqueueCallback(...): You called `setProps`, `replaceProps`, ' + '`setState`, `replaceState`, or `forceUpdate` with a callback that ' + 'isn\'t callable.') : invariant(false) : undefined; + if (internalInstance._pendingCallbacks) { + internalInstance._pendingCallbacks.push(callback); + } else { + internalInstance._pendingCallbacks = [callback]; + } + enqueueUpdate(internalInstance); + }, + + /** + * Forces an update. This should only be invoked when it is known with + * certainty that we are **not** in a DOM transaction. + * + * You may want to call this when you know that some deeper aspect of the + * component's state has changed but `setState` was not called. + * + * This will not invoke `shouldComponentUpdate`, but it will invoke + * `componentWillUpdate` and `componentDidUpdate`. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @internal + */ + enqueueForceUpdate: function (publicInstance) { + var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'forceUpdate'); + + if (!internalInstance) { + return; + } + + internalInstance._pendingForceUpdate = true; + + enqueueUpdate(internalInstance); + }, + + /** + * Replaces all of the state. Always use this or `setState` to mutate state. + * You should treat `this.state` as immutable. + * + * There is no guarantee that `this.state` will be immediately updated, so + * accessing `this.state` after calling this method may return the old value. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {object} completeState Next state. + * @internal + */ + enqueueReplaceState: function (publicInstance, completeState) { + var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'replaceState'); + + if (!internalInstance) { + return; + } + + internalInstance._pendingStateQueue = [completeState]; + internalInstance._pendingReplaceState = true; + + enqueueUpdate(internalInstance); + }, + + /** + * Sets a subset of the state. This only exists because _pendingState is + * internal. This provides a merging strategy that is not available to deep + * properties which is confusing. TODO: Expose pendingState or don't use it + * during the merge. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {object} partialState Next partial state to be merged with state. + * @internal + */ + enqueueSetState: function (publicInstance, partialState) { + var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'setState'); + + if (!internalInstance) { + return; + } + + var queue = internalInstance._pendingStateQueue || (internalInstance._pendingStateQueue = []); + queue.push(partialState); + + enqueueUpdate(internalInstance); + }, + + /** + * Sets a subset of the props. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {object} partialProps Subset of the next props. + * @internal + */ + enqueueSetProps: function (publicInstance, partialProps) { + var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'setProps'); + if (!internalInstance) { + return; + } + ReactUpdateQueue.enqueueSetPropsInternal(internalInstance, partialProps); + }, + + enqueueSetPropsInternal: function (internalInstance, partialProps) { + var topLevelWrapper = internalInstance._topLevelWrapper; + !topLevelWrapper ? process.env.NODE_ENV !== 'production' ? invariant(false, 'setProps(...): You called `setProps` on a ' + 'component with a parent. This is an anti-pattern since props will ' + 'get reactively updated when rendered. Instead, change the owner\'s ' + '`render` method to pass the correct value as props to the component ' + 'where it is created.') : invariant(false) : undefined; + + // Merge with the pending element if it exists, otherwise with existing + // element props. + var wrapElement = topLevelWrapper._pendingElement || topLevelWrapper._currentElement; + var element = wrapElement.props; + var props = assign({}, element.props, partialProps); + topLevelWrapper._pendingElement = ReactElement.cloneAndReplaceProps(wrapElement, ReactElement.cloneAndReplaceProps(element, props)); + + enqueueUpdate(topLevelWrapper); + }, + + /** + * Replaces all of the props. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {object} props New props. + * @internal + */ + enqueueReplaceProps: function (publicInstance, props) { + var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'replaceProps'); + if (!internalInstance) { + return; + } + ReactUpdateQueue.enqueueReplacePropsInternal(internalInstance, props); + }, + + enqueueReplacePropsInternal: function (internalInstance, props) { + var topLevelWrapper = internalInstance._topLevelWrapper; + !topLevelWrapper ? process.env.NODE_ENV !== 'production' ? invariant(false, 'replaceProps(...): You called `replaceProps` on a ' + 'component with a parent. This is an anti-pattern since props will ' + 'get reactively updated when rendered. Instead, change the owner\'s ' + '`render` method to pass the correct value as props to the component ' + 'where it is created.') : invariant(false) : undefined; + + // Merge with the pending element if it exists, otherwise with existing + // element props. + var wrapElement = topLevelWrapper._pendingElement || topLevelWrapper._currentElement; + var element = wrapElement.props; + topLevelWrapper._pendingElement = ReactElement.cloneAndReplaceProps(wrapElement, ReactElement.cloneAndReplaceProps(element, props)); + + enqueueUpdate(topLevelWrapper); + }, + + enqueueElementInternal: function (internalInstance, newElement) { + internalInstance._pendingElement = newElement; + enqueueUpdate(internalInstance); + } + + }; + + module.exports = ReactUpdateQueue; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 53 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactUpdates + */ + + 'use strict'; + + var CallbackQueue = __webpack_require__(54); + var PooledClass = __webpack_require__(55); + var ReactPerf = __webpack_require__(17); + var ReactReconciler = __webpack_require__(49); + var Transaction = __webpack_require__(56); + + var assign = __webpack_require__(38); + var invariant = __webpack_require__(12); + + var dirtyComponents = []; + var asapCallbackQueue = CallbackQueue.getPooled(); + var asapEnqueued = false; + + var batchingStrategy = null; + + function ensureInjected() { + !(ReactUpdates.ReactReconcileTransaction && batchingStrategy) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactUpdates: must inject a reconcile transaction class and batching ' + 'strategy') : invariant(false) : undefined; + } + + var NESTED_UPDATES = { + initialize: function () { + this.dirtyComponentsLength = dirtyComponents.length; + }, + close: function () { + if (this.dirtyComponentsLength !== dirtyComponents.length) { + // Additional updates were enqueued by componentDidUpdate handlers or + // similar; before our own UPDATE_QUEUEING wrapper closes, we want to run + // these new updates so that if A's componentDidUpdate calls setState on + // B, B will update before the callback A's updater provided when calling + // setState. + dirtyComponents.splice(0, this.dirtyComponentsLength); + flushBatchedUpdates(); + } else { + dirtyComponents.length = 0; + } + } + }; + + var UPDATE_QUEUEING = { + initialize: function () { + this.callbackQueue.reset(); + }, + close: function () { + this.callbackQueue.notifyAll(); + } + }; + + var TRANSACTION_WRAPPERS = [NESTED_UPDATES, UPDATE_QUEUEING]; + + function ReactUpdatesFlushTransaction() { + this.reinitializeTransaction(); + this.dirtyComponentsLength = null; + this.callbackQueue = CallbackQueue.getPooled(); + this.reconcileTransaction = ReactUpdates.ReactReconcileTransaction.getPooled( /* forceHTML */false); + } + + assign(ReactUpdatesFlushTransaction.prototype, Transaction.Mixin, { + getTransactionWrappers: function () { + return TRANSACTION_WRAPPERS; + }, + + destructor: function () { + this.dirtyComponentsLength = null; + CallbackQueue.release(this.callbackQueue); + this.callbackQueue = null; + ReactUpdates.ReactReconcileTransaction.release(this.reconcileTransaction); + this.reconcileTransaction = null; + }, + + perform: function (method, scope, a) { + // Essentially calls `this.reconcileTransaction.perform(method, scope, a)` + // with this transaction's wrappers around it. + return Transaction.Mixin.perform.call(this, this.reconcileTransaction.perform, this.reconcileTransaction, method, scope, a); + } + }); + + PooledClass.addPoolingTo(ReactUpdatesFlushTransaction); + + function batchedUpdates(callback, a, b, c, d, e) { + ensureInjected(); + batchingStrategy.batchedUpdates(callback, a, b, c, d, e); + } + + /** + * Array comparator for ReactComponents by mount ordering. + * + * @param {ReactComponent} c1 first component you're comparing + * @param {ReactComponent} c2 second component you're comparing + * @return {number} Return value usable by Array.prototype.sort(). + */ + function mountOrderComparator(c1, c2) { + return c1._mountOrder - c2._mountOrder; + } + + function runBatchedUpdates(transaction) { + var len = transaction.dirtyComponentsLength; + !(len === dirtyComponents.length) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Expected flush transaction\'s stored dirty-components length (%s) to ' + 'match dirty-components array length (%s).', len, dirtyComponents.length) : invariant(false) : undefined; + + // Since reconciling a component higher in the owner hierarchy usually (not + // always -- see shouldComponentUpdate()) will reconcile children, reconcile + // them before their children by sorting the array. + dirtyComponents.sort(mountOrderComparator); + + for (var i = 0; i < len; i++) { + // If a component is unmounted before pending changes apply, it will still + // be here, but we assume that it has cleared its _pendingCallbacks and + // that performUpdateIfNecessary is a noop. + var component = dirtyComponents[i]; + + // If performUpdateIfNecessary happens to enqueue any new updates, we + // shouldn't execute the callbacks until the next render happens, so + // stash the callbacks first + var callbacks = component._pendingCallbacks; + component._pendingCallbacks = null; + + ReactReconciler.performUpdateIfNecessary(component, transaction.reconcileTransaction); + + if (callbacks) { + for (var j = 0; j < callbacks.length; j++) { + transaction.callbackQueue.enqueue(callbacks[j], component.getPublicInstance()); + } + } + } + } + + var flushBatchedUpdates = function () { + // ReactUpdatesFlushTransaction's wrappers will clear the dirtyComponents + // array and perform any updates enqueued by mount-ready handlers (i.e., + // componentDidUpdate) but we need to check here too in order to catch + // updates enqueued by setState callbacks and asap calls. + while (dirtyComponents.length || asapEnqueued) { + if (dirtyComponents.length) { + var transaction = ReactUpdatesFlushTransaction.getPooled(); + transaction.perform(runBatchedUpdates, null, transaction); + ReactUpdatesFlushTransaction.release(transaction); + } + + if (asapEnqueued) { + asapEnqueued = false; + var queue = asapCallbackQueue; + asapCallbackQueue = CallbackQueue.getPooled(); + queue.notifyAll(); + CallbackQueue.release(queue); + } + } + }; + flushBatchedUpdates = ReactPerf.measure('ReactUpdates', 'flushBatchedUpdates', flushBatchedUpdates); + + /** + * Mark a component as needing a rerender, adding an optional callback to a + * list of functions which will be executed once the rerender occurs. + */ + function enqueueUpdate(component) { + ensureInjected(); + + // Various parts of our code (such as ReactCompositeComponent's + // _renderValidatedComponent) assume that calls to render aren't nested; + // verify that that's the case. (This is called by each top-level update + // function, like setProps, setState, forceUpdate, etc.; creation and + // destruction of top-level components is guarded in ReactMount.) + + if (!batchingStrategy.isBatchingUpdates) { + batchingStrategy.batchedUpdates(enqueueUpdate, component); + return; + } + + dirtyComponents.push(component); + } + + /** + * Enqueue a callback to be run at the end of the current batching cycle. Throws + * if no updates are currently being performed. + */ + function asap(callback, context) { + !batchingStrategy.isBatchingUpdates ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactUpdates.asap: Can\'t enqueue an asap callback in a context where' + 'updates are not being batched.') : invariant(false) : undefined; + asapCallbackQueue.enqueue(callback, context); + asapEnqueued = true; + } + + var ReactUpdatesInjection = { + injectReconcileTransaction: function (ReconcileTransaction) { + !ReconcileTransaction ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactUpdates: must provide a reconcile transaction class') : invariant(false) : undefined; + ReactUpdates.ReactReconcileTransaction = ReconcileTransaction; + }, + + injectBatchingStrategy: function (_batchingStrategy) { + !_batchingStrategy ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactUpdates: must provide a batching strategy') : invariant(false) : undefined; + !(typeof _batchingStrategy.batchedUpdates === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactUpdates: must provide a batchedUpdates() function') : invariant(false) : undefined; + !(typeof _batchingStrategy.isBatchingUpdates === 'boolean') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactUpdates: must provide an isBatchingUpdates boolean attribute') : invariant(false) : undefined; + batchingStrategy = _batchingStrategy; + } + }; + + var ReactUpdates = { + /** + * React references `ReactReconcileTransaction` using this property in order + * to allow dependency injection. + * + * @internal + */ + ReactReconcileTransaction: null, + + batchedUpdates: batchedUpdates, + enqueueUpdate: enqueueUpdate, + flushBatchedUpdates: flushBatchedUpdates, + injection: ReactUpdatesInjection, + asap: asap + }; + + module.exports = ReactUpdates; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 54 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule CallbackQueue + */ + + 'use strict'; + + var PooledClass = __webpack_require__(55); + + var assign = __webpack_require__(38); + var invariant = __webpack_require__(12); + + /** + * A specialized pseudo-event module to help keep track of components waiting to + * be notified when their DOM representations are available for use. + * + * This implements `PooledClass`, so you should never need to instantiate this. + * Instead, use `CallbackQueue.getPooled()`. + * + * @class ReactMountReady + * @implements PooledClass + * @internal + */ + function CallbackQueue() { + this._callbacks = null; + this._contexts = null; + } + + assign(CallbackQueue.prototype, { + + /** + * Enqueues a callback to be invoked when `notifyAll` is invoked. + * + * @param {function} callback Invoked when `notifyAll` is invoked. + * @param {?object} context Context to call `callback` with. + * @internal + */ + enqueue: function (callback, context) { + this._callbacks = this._callbacks || []; + this._contexts = this._contexts || []; + this._callbacks.push(callback); + this._contexts.push(context); + }, + + /** + * Invokes all enqueued callbacks and clears the queue. This is invoked after + * the DOM representation of a component has been created or updated. + * + * @internal + */ + notifyAll: function () { + var callbacks = this._callbacks; + var contexts = this._contexts; + if (callbacks) { + !(callbacks.length === contexts.length) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Mismatched list of contexts in callback queue') : invariant(false) : undefined; + this._callbacks = null; + this._contexts = null; + for (var i = 0; i < callbacks.length; i++) { + callbacks[i].call(contexts[i]); + } + callbacks.length = 0; + contexts.length = 0; + } + }, + + /** + * Resets the internal queue. + * + * @internal + */ + reset: function () { + this._callbacks = null; + this._contexts = null; + }, + + /** + * `PooledClass` looks for this. + */ + destructor: function () { + this.reset(); + } + + }); + + PooledClass.addPoolingTo(CallbackQueue); + + module.exports = CallbackQueue; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 55 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule PooledClass + */ + + 'use strict'; + + var invariant = __webpack_require__(12); + + /** + * Static poolers. Several custom versions for each potential number of + * arguments. A completely generic pooler is easy to implement, but would + * require accessing the `arguments` object. In each of these, `this` refers to + * the Class itself, not an instance. If any others are needed, simply add them + * here, or in their own files. + */ + var oneArgumentPooler = function (copyFieldsFrom) { + var Klass = this; + if (Klass.instancePool.length) { + var instance = Klass.instancePool.pop(); + Klass.call(instance, copyFieldsFrom); + return instance; + } else { + return new Klass(copyFieldsFrom); + } + }; + + var twoArgumentPooler = function (a1, a2) { + var Klass = this; + if (Klass.instancePool.length) { + var instance = Klass.instancePool.pop(); + Klass.call(instance, a1, a2); + return instance; + } else { + return new Klass(a1, a2); + } + }; + + var threeArgumentPooler = function (a1, a2, a3) { + var Klass = this; + if (Klass.instancePool.length) { + var instance = Klass.instancePool.pop(); + Klass.call(instance, a1, a2, a3); + return instance; + } else { + return new Klass(a1, a2, a3); + } + }; + + var fourArgumentPooler = function (a1, a2, a3, a4) { + var Klass = this; + if (Klass.instancePool.length) { + var instance = Klass.instancePool.pop(); + Klass.call(instance, a1, a2, a3, a4); + return instance; + } else { + return new Klass(a1, a2, a3, a4); + } + }; + + var fiveArgumentPooler = function (a1, a2, a3, a4, a5) { + var Klass = this; + if (Klass.instancePool.length) { + var instance = Klass.instancePool.pop(); + Klass.call(instance, a1, a2, a3, a4, a5); + return instance; + } else { + return new Klass(a1, a2, a3, a4, a5); + } + }; + + var standardReleaser = function (instance) { + var Klass = this; + !(instance instanceof Klass) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Trying to release an instance into a pool of a different type.') : invariant(false) : undefined; + instance.destructor(); + if (Klass.instancePool.length < Klass.poolSize) { + Klass.instancePool.push(instance); + } + }; + + var DEFAULT_POOL_SIZE = 10; + var DEFAULT_POOLER = oneArgumentPooler; + + /** + * Augments `CopyConstructor` to be a poolable class, augmenting only the class + * itself (statically) not adding any prototypical fields. Any CopyConstructor + * you give this may have a `poolSize` property, and will look for a + * prototypical `destructor` on instances (optional). + * + * @param {Function} CopyConstructor Constructor that can be used to reset. + * @param {Function} pooler Customizable pooler. + */ + var addPoolingTo = function (CopyConstructor, pooler) { + var NewKlass = CopyConstructor; + NewKlass.instancePool = []; + NewKlass.getPooled = pooler || DEFAULT_POOLER; + if (!NewKlass.poolSize) { + NewKlass.poolSize = DEFAULT_POOL_SIZE; + } + NewKlass.release = standardReleaser; + return NewKlass; + }; + + var PooledClass = { + addPoolingTo: addPoolingTo, + oneArgumentPooler: oneArgumentPooler, + twoArgumentPooler: twoArgumentPooler, + threeArgumentPooler: threeArgumentPooler, + fourArgumentPooler: fourArgumentPooler, + fiveArgumentPooler: fiveArgumentPooler + }; + + module.exports = PooledClass; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 56 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule Transaction + */ + + 'use strict'; + + var invariant = __webpack_require__(12); + + /** + * `Transaction` creates a black box that is able to wrap any method such that + * certain invariants are maintained before and after the method is invoked + * (Even if an exception is thrown while invoking the wrapped method). Whoever + * instantiates a transaction can provide enforcers of the invariants at + * creation time. The `Transaction` class itself will supply one additional + * automatic invariant for you - the invariant that any transaction instance + * should not be run while it is already being run. You would typically create a + * single instance of a `Transaction` for reuse multiple times, that potentially + * is used to wrap several different methods. Wrappers are extremely simple - + * they only require implementing two methods. + * + * <pre> + * wrappers (injected at creation time) + * + + + * | | + * +-----------------|--------|--------------+ + * | v | | + * | +---------------+ | | + * | +--| wrapper1 |---|----+ | + * | | +---------------+ v | | + * | | +-------------+ | | + * | | +----| wrapper2 |--------+ | + * | | | +-------------+ | | | + * | | | | | | + * | v v v v | wrapper + * | +---+ +---+ +---------+ +---+ +---+ | invariants + * perform(anyMethod) | | | | | | | | | | | | maintained + * +----------------->|-|---|-|---|-->|anyMethod|---|---|-|---|-|--------> + * | | | | | | | | | | | | + * | | | | | | | | | | | | + * | | | | | | | | | | | | + * | +---+ +---+ +---------+ +---+ +---+ | + * | initialize close | + * +-----------------------------------------+ + * </pre> + * + * Use cases: + * - Preserving the input selection ranges before/after reconciliation. + * Restoring selection even in the event of an unexpected error. + * - Deactivating events while rearranging the DOM, preventing blurs/focuses, + * while guaranteeing that afterwards, the event system is reactivated. + * - Flushing a queue of collected DOM mutations to the main UI thread after a + * reconciliation takes place in a worker thread. + * - Invoking any collected `componentDidUpdate` callbacks after rendering new + * content. + * - (Future use case): Wrapping particular flushes of the `ReactWorker` queue + * to preserve the `scrollTop` (an automatic scroll aware DOM). + * - (Future use case): Layout calculations before and after DOM updates. + * + * Transactional plugin API: + * - A module that has an `initialize` method that returns any precomputation. + * - and a `close` method that accepts the precomputation. `close` is invoked + * when the wrapped process is completed, or has failed. + * + * @param {Array<TransactionalWrapper>} transactionWrapper Wrapper modules + * that implement `initialize` and `close`. + * @return {Transaction} Single transaction for reuse in thread. + * + * @class Transaction + */ + var Mixin = { + /** + * Sets up this instance so that it is prepared for collecting metrics. Does + * so such that this setup method may be used on an instance that is already + * initialized, in a way that does not consume additional memory upon reuse. + * That can be useful if you decide to make your subclass of this mixin a + * "PooledClass". + */ + reinitializeTransaction: function () { + this.transactionWrappers = this.getTransactionWrappers(); + if (this.wrapperInitData) { + this.wrapperInitData.length = 0; + } else { + this.wrapperInitData = []; + } + this._isInTransaction = false; + }, + + _isInTransaction: false, + + /** + * @abstract + * @return {Array<TransactionWrapper>} Array of transaction wrappers. + */ + getTransactionWrappers: null, + + isInTransaction: function () { + return !!this._isInTransaction; + }, + + /** + * Executes the function within a safety window. Use this for the top level + * methods that result in large amounts of computation/mutations that would + * need to be safety checked. The optional arguments helps prevent the need + * to bind in many cases. + * + * @param {function} method Member of scope to call. + * @param {Object} scope Scope to invoke from. + * @param {Object?=} a Argument to pass to the method. + * @param {Object?=} b Argument to pass to the method. + * @param {Object?=} c Argument to pass to the method. + * @param {Object?=} d Argument to pass to the method. + * @param {Object?=} e Argument to pass to the method. + * @param {Object?=} f Argument to pass to the method. + * + * @return {*} Return value from `method`. + */ + perform: function (method, scope, a, b, c, d, e, f) { + !!this.isInTransaction() ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Transaction.perform(...): Cannot initialize a transaction when there ' + 'is already an outstanding transaction.') : invariant(false) : undefined; + var errorThrown; + var ret; + try { + this._isInTransaction = true; + // Catching errors makes debugging more difficult, so we start with + // errorThrown set to true before setting it to false after calling + // close -- if it's still set to true in the finally block, it means + // one of these calls threw. + errorThrown = true; + this.initializeAll(0); + ret = method.call(scope, a, b, c, d, e, f); + errorThrown = false; + } finally { + try { + if (errorThrown) { + // If `method` throws, prefer to show that stack trace over any thrown + // by invoking `closeAll`. + try { + this.closeAll(0); + } catch (err) {} + } else { + // Since `method` didn't throw, we don't want to silence the exception + // here. + this.closeAll(0); + } + } finally { + this._isInTransaction = false; + } + } + return ret; + }, + + initializeAll: function (startIndex) { + var transactionWrappers = this.transactionWrappers; + for (var i = startIndex; i < transactionWrappers.length; i++) { + var wrapper = transactionWrappers[i]; + try { + // Catching errors makes debugging more difficult, so we start with the + // OBSERVED_ERROR state before overwriting it with the real return value + // of initialize -- if it's still set to OBSERVED_ERROR in the finally + // block, it means wrapper.initialize threw. + this.wrapperInitData[i] = Transaction.OBSERVED_ERROR; + this.wrapperInitData[i] = wrapper.initialize ? wrapper.initialize.call(this) : null; + } finally { + if (this.wrapperInitData[i] === Transaction.OBSERVED_ERROR) { + // The initializer for wrapper i threw an error; initialize the + // remaining wrappers but silence any exceptions from them to ensure + // that the first error is the one to bubble up. + try { + this.initializeAll(i + 1); + } catch (err) {} + } + } + } + }, + + /** + * Invokes each of `this.transactionWrappers.close[i]` functions, passing into + * them the respective return values of `this.transactionWrappers.init[i]` + * (`close`rs that correspond to initializers that failed will not be + * invoked). + */ + closeAll: function (startIndex) { + !this.isInTransaction() ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Transaction.closeAll(): Cannot close transaction when none are open.') : invariant(false) : undefined; + var transactionWrappers = this.transactionWrappers; + for (var i = startIndex; i < transactionWrappers.length; i++) { + var wrapper = transactionWrappers[i]; + var initData = this.wrapperInitData[i]; + var errorThrown; + try { + // Catching errors makes debugging more difficult, so we start with + // errorThrown set to true before setting it to false after calling + // close -- if it's still set to true in the finally block, it means + // wrapper.close threw. + errorThrown = true; + if (initData !== Transaction.OBSERVED_ERROR && wrapper.close) { + wrapper.close.call(this, initData); + } + errorThrown = false; + } finally { + if (errorThrown) { + // The closer for wrapper i threw an error; close the remaining + // wrappers but silence any exceptions from them to ensure that the + // first error is the one to bubble up. + try { + this.closeAll(i + 1); + } catch (e) {} + } + } + } + this.wrapperInitData.length = 0; + } + }; + + var Transaction = { + + Mixin: Mixin, + + /** + * Token to look for to determine if an error occurred. + */ + OBSERVED_ERROR: {} + + }; + + module.exports = Transaction; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 57 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule emptyObject + */ + + 'use strict'; + + var emptyObject = {}; + + if (process.env.NODE_ENV !== 'production') { + Object.freeze(emptyObject); + } + + module.exports = emptyObject; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 58 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule containsNode + * @typechecks + */ + + 'use strict'; + + var isTextNode = __webpack_require__(59); + + /*eslint-disable no-bitwise */ + + /** + * Checks if a given DOM node contains or is another DOM node. + * + * @param {?DOMNode} outerNode Outer DOM node. + * @param {?DOMNode} innerNode Inner DOM node. + * @return {boolean} True if `outerNode` contains or is `innerNode`. + */ + function containsNode(_x, _x2) { + var _again = true; + + _function: while (_again) { + var outerNode = _x, + innerNode = _x2; + _again = false; + + if (!outerNode || !innerNode) { + return false; + } else if (outerNode === innerNode) { + return true; + } else if (isTextNode(outerNode)) { + return false; + } else if (isTextNode(innerNode)) { + _x = outerNode; + _x2 = innerNode.parentNode; + _again = true; + continue _function; + } else if (outerNode.contains) { + return outerNode.contains(innerNode); + } else if (outerNode.compareDocumentPosition) { + return !!(outerNode.compareDocumentPosition(innerNode) & 16); + } else { + return false; + } + } + } + + module.exports = containsNode; + +/***/ }, +/* 59 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule isTextNode + * @typechecks + */ + + 'use strict'; + + var isNode = __webpack_require__(60); + + /** + * @param {*} object The object to check. + * @return {boolean} Whether or not the object is a DOM text node. + */ + function isTextNode(object) { + return isNode(object) && object.nodeType == 3; + } + + module.exports = isTextNode; + +/***/ }, +/* 60 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule isNode + * @typechecks + */ + + /** + * @param {*} object The object to check. + * @return {boolean} Whether or not the object is a DOM node. + */ + 'use strict'; + + function isNode(object) { + return !!(object && (typeof Node === 'function' ? object instanceof Node : typeof object === 'object' && typeof object.nodeType === 'number' && typeof object.nodeName === 'string')); + } + + module.exports = isNode; + +/***/ }, +/* 61 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule instantiateReactComponent + * @typechecks static-only + */ + + 'use strict'; + + var ReactCompositeComponent = __webpack_require__(62); + var ReactEmptyComponent = __webpack_require__(67); + var ReactNativeComponent = __webpack_require__(68); + + var assign = __webpack_require__(38); + var invariant = __webpack_require__(12); + var warning = __webpack_require__(24); + + // To avoid a cyclic dependency, we create the final class in this module + var ReactCompositeComponentWrapper = function () {}; + assign(ReactCompositeComponentWrapper.prototype, ReactCompositeComponent.Mixin, { + _instantiateReactComponent: instantiateReactComponent + }); + + function getDeclarationErrorAddendum(owner) { + if (owner) { + var name = owner.getName(); + if (name) { + return ' Check the render method of `' + name + '`.'; + } + } + return ''; + } + + /** + * Check if the type reference is a known internal type. I.e. not a user + * provided composite type. + * + * @param {function} type + * @return {boolean} Returns true if this is a valid internal type. + */ + function isInternalComponentType(type) { + return typeof type === 'function' && typeof type.prototype !== 'undefined' && typeof type.prototype.mountComponent === 'function' && typeof type.prototype.receiveComponent === 'function'; + } + + /** + * Given a ReactNode, create an instance that will actually be mounted. + * + * @param {ReactNode} node + * @return {object} A new instance of the element's constructor. + * @protected + */ + function instantiateReactComponent(node) { + var instance; + + if (node === null || node === false) { + instance = new ReactEmptyComponent(instantiateReactComponent); + } else if (typeof node === 'object') { + var element = node; + !(element && (typeof element.type === 'function' || typeof element.type === 'string')) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Element type is invalid: expected a string (for built-in components) ' + 'or a class/function (for composite components) but got: %s.%s', element.type == null ? element.type : typeof element.type, getDeclarationErrorAddendum(element._owner)) : invariant(false) : undefined; + + // Special case string values + if (typeof element.type === 'string') { + instance = ReactNativeComponent.createInternalComponent(element); + } else if (isInternalComponentType(element.type)) { + // This is temporarily available for custom components that are not string + // representations. I.e. ART. Once those are updated to use the string + // representation, we can drop this code path. + instance = new element.type(element); + } else { + instance = new ReactCompositeComponentWrapper(); + } + } else if (typeof node === 'string' || typeof node === 'number') { + instance = ReactNativeComponent.createInstanceForText(node); + } else { + true ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Encountered invalid React node of type %s', typeof node) : invariant(false) : undefined; + } + + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(typeof instance.construct === 'function' && typeof instance.mountComponent === 'function' && typeof instance.receiveComponent === 'function' && typeof instance.unmountComponent === 'function', 'Only React Components can be mounted.') : undefined; + } + + // Sets up the instance. This can probably just move into the constructor now. + instance.construct(node); + + // These two fields are used by the DOM and ART diffing algorithms + // respectively. Instead of using expandos on components, we should be + // storing the state needed by the diffing algorithms elsewhere. + instance._mountIndex = 0; + instance._mountImage = null; + + if (process.env.NODE_ENV !== 'production') { + instance._isOwnerNecessary = false; + instance._warnedAboutRefsInRender = false; + } + + // Internal instances should fully constructed at this point, so they should + // not get any new fields added to them at this point. + if (process.env.NODE_ENV !== 'production') { + if (Object.preventExtensions) { + Object.preventExtensions(instance); + } + } + + return instance; + } + + module.exports = instantiateReactComponent; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 62 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactCompositeComponent + */ + + 'use strict'; + + var ReactComponentEnvironment = __webpack_require__(63); + var ReactCurrentOwner = __webpack_require__(4); + var ReactElement = __webpack_require__(41); + var ReactInstanceMap = __webpack_require__(46); + var ReactPerf = __webpack_require__(17); + var ReactPropTypeLocations = __webpack_require__(64); + var ReactPropTypeLocationNames = __webpack_require__(65); + var ReactReconciler = __webpack_require__(49); + var ReactUpdateQueue = __webpack_require__(52); + + var assign = __webpack_require__(38); + var emptyObject = __webpack_require__(57); + var invariant = __webpack_require__(12); + var shouldUpdateReactComponent = __webpack_require__(66); + var warning = __webpack_require__(24); + + function getDeclarationErrorAddendum(component) { + var owner = component._currentElement._owner || null; + if (owner) { + var name = owner.getName(); + if (name) { + return ' Check the render method of `' + name + '`.'; + } + } + return ''; + } + + function StatelessComponent(Component) {} + StatelessComponent.prototype.render = function () { + var Component = ReactInstanceMap.get(this)._currentElement.type; + return Component(this.props, this.context, this.updater); + }; + + /** + * ------------------ The Life-Cycle of a Composite Component ------------------ + * + * - constructor: Initialization of state. The instance is now retained. + * - componentWillMount + * - render + * - [children's constructors] + * - [children's componentWillMount and render] + * - [children's componentDidMount] + * - componentDidMount + * + * Update Phases: + * - componentWillReceiveProps (only called if parent updated) + * - shouldComponentUpdate + * - componentWillUpdate + * - render + * - [children's constructors or receive props phases] + * - componentDidUpdate + * + * - componentWillUnmount + * - [children's componentWillUnmount] + * - [children destroyed] + * - (destroyed): The instance is now blank, released by React and ready for GC. + * + * ----------------------------------------------------------------------------- + */ + + /** + * An incrementing ID assigned to each component when it is mounted. This is + * used to enforce the order in which `ReactUpdates` updates dirty components. + * + * @private + */ + var nextMountID = 1; + + /** + * @lends {ReactCompositeComponent.prototype} + */ + var ReactCompositeComponentMixin = { + + /** + * Base constructor for all composite component. + * + * @param {ReactElement} element + * @final + * @internal + */ + construct: function (element) { + this._currentElement = element; + this._rootNodeID = null; + this._instance = null; + + // See ReactUpdateQueue + this._pendingElement = null; + this._pendingStateQueue = null; + this._pendingReplaceState = false; + this._pendingForceUpdate = false; + + this._renderedComponent = null; + + this._context = null; + this._mountOrder = 0; + this._topLevelWrapper = null; + + // See ReactUpdates and ReactUpdateQueue. + this._pendingCallbacks = null; + }, + + /** + * Initializes the component, renders markup, and registers event listeners. + * + * @param {string} rootID DOM ID of the root node. + * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction + * @return {?string} Rendered markup to be inserted into the DOM. + * @final + * @internal + */ + mountComponent: function (rootID, transaction, context) { + this._context = context; + this._mountOrder = nextMountID++; + this._rootNodeID = rootID; + + var publicProps = this._processProps(this._currentElement.props); + var publicContext = this._processContext(context); + + var Component = this._currentElement.type; + + // Initialize the public class + var inst; + var renderedElement; + + // This is a way to detect if Component is a stateless arrow function + // component, which is not newable. It might not be 100% reliable but is + // something we can do until we start detecting that Component extends + // React.Component. We already assume that typeof Component === 'function'. + var canInstantiate = ('prototype' in Component); + + if (canInstantiate) { + if (process.env.NODE_ENV !== 'production') { + ReactCurrentOwner.current = this; + try { + inst = new Component(publicProps, publicContext, ReactUpdateQueue); + } finally { + ReactCurrentOwner.current = null; + } + } else { + inst = new Component(publicProps, publicContext, ReactUpdateQueue); + } + } + + if (!canInstantiate || inst === null || inst === false || ReactElement.isValidElement(inst)) { + renderedElement = inst; + inst = new StatelessComponent(Component); + } + + if (process.env.NODE_ENV !== 'production') { + // This will throw later in _renderValidatedComponent, but add an early + // warning now to help debugging + if (inst.render == null) { + process.env.NODE_ENV !== 'production' ? warning(false, '%s(...): No `render` method found on the returned component ' + 'instance: you may have forgotten to define `render`, returned ' + 'null/false from a stateless component, or tried to render an ' + 'element whose type is a function that isn\'t a React component.', Component.displayName || Component.name || 'Component') : undefined; + } else { + // We support ES6 inheriting from React.Component, the module pattern, + // and stateless components, but not ES6 classes that don't extend + process.env.NODE_ENV !== 'production' ? warning(Component.prototype && Component.prototype.isReactComponent || !canInstantiate || !(inst instanceof Component), '%s(...): React component classes must extend React.Component.', Component.displayName || Component.name || 'Component') : undefined; + } + } + + // These should be set up in the constructor, but as a convenience for + // simpler class abstractions, we set them up after the fact. + inst.props = publicProps; + inst.context = publicContext; + inst.refs = emptyObject; + inst.updater = ReactUpdateQueue; + + this._instance = inst; + + // Store a reference from the instance back to the internal representation + ReactInstanceMap.set(inst, this); + + if (process.env.NODE_ENV !== 'production') { + // Since plain JS classes are defined without any special initialization + // logic, we can not catch common errors early. Therefore, we have to + // catch them here, at initialization time, instead. + process.env.NODE_ENV !== 'production' ? warning(!inst.getInitialState || inst.getInitialState.isReactClassApproved, 'getInitialState was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Did you mean to define a state property instead?', this.getName() || 'a component') : undefined; + process.env.NODE_ENV !== 'production' ? warning(!inst.getDefaultProps || inst.getDefaultProps.isReactClassApproved, 'getDefaultProps was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Use a static property to define defaultProps instead.', this.getName() || 'a component') : undefined; + process.env.NODE_ENV !== 'production' ? warning(!inst.propTypes, 'propTypes was defined as an instance property on %s. Use a static ' + 'property to define propTypes instead.', this.getName() || 'a component') : undefined; + process.env.NODE_ENV !== 'production' ? warning(!inst.contextTypes, 'contextTypes was defined as an instance property on %s. Use a ' + 'static property to define contextTypes instead.', this.getName() || 'a component') : undefined; + process.env.NODE_ENV !== 'production' ? warning(typeof inst.componentShouldUpdate !== 'function', '%s has a method called ' + 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' + 'The name is phrased as a question because the function is ' + 'expected to return a value.', this.getName() || 'A component') : undefined; + process.env.NODE_ENV !== 'production' ? warning(typeof inst.componentDidUnmount !== 'function', '%s has a method called ' + 'componentDidUnmount(). But there is no such lifecycle method. ' + 'Did you mean componentWillUnmount()?', this.getName() || 'A component') : undefined; + process.env.NODE_ENV !== 'production' ? warning(typeof inst.componentWillRecieveProps !== 'function', '%s has a method called ' + 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', this.getName() || 'A component') : undefined; + } + + var initialState = inst.state; + if (initialState === undefined) { + inst.state = initialState = null; + } + !(typeof initialState === 'object' && !Array.isArray(initialState)) ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s.state: must be set to an object or null', this.getName() || 'ReactCompositeComponent') : invariant(false) : undefined; + + this._pendingStateQueue = null; + this._pendingReplaceState = false; + this._pendingForceUpdate = false; + + if (inst.componentWillMount) { + inst.componentWillMount(); + // When mounting, calls to `setState` by `componentWillMount` will set + // `this._pendingStateQueue` without triggering a re-render. + if (this._pendingStateQueue) { + inst.state = this._processPendingState(inst.props, inst.context); + } + } + + // If not a stateless component, we now render + if (renderedElement === undefined) { + renderedElement = this._renderValidatedComponent(); + } + + this._renderedComponent = this._instantiateReactComponent(renderedElement); + + var markup = ReactReconciler.mountComponent(this._renderedComponent, rootID, transaction, this._processChildContext(context)); + if (inst.componentDidMount) { + transaction.getReactMountReady().enqueue(inst.componentDidMount, inst); + } + + return markup; + }, + + /** + * Releases any resources allocated by `mountComponent`. + * + * @final + * @internal + */ + unmountComponent: function () { + var inst = this._instance; + + if (inst.componentWillUnmount) { + inst.componentWillUnmount(); + } + + ReactReconciler.unmountComponent(this._renderedComponent); + this._renderedComponent = null; + this._instance = null; + + // Reset pending fields + // Even if this component is scheduled for another update in ReactUpdates, + // it would still be ignored because these fields are reset. + this._pendingStateQueue = null; + this._pendingReplaceState = false; + this._pendingForceUpdate = false; + this._pendingCallbacks = null; + this._pendingElement = null; + + // These fields do not really need to be reset since this object is no + // longer accessible. + this._context = null; + this._rootNodeID = null; + this._topLevelWrapper = null; + + // Delete the reference from the instance to this internal representation + // which allow the internals to be properly cleaned up even if the user + // leaks a reference to the public instance. + ReactInstanceMap.remove(inst); + + // Some existing components rely on inst.props even after they've been + // destroyed (in event handlers). + // TODO: inst.props = null; + // TODO: inst.state = null; + // TODO: inst.context = null; + }, + + /** + * Filters the context object to only contain keys specified in + * `contextTypes` + * + * @param {object} context + * @return {?object} + * @private + */ + _maskContext: function (context) { + var maskedContext = null; + var Component = this._currentElement.type; + var contextTypes = Component.contextTypes; + if (!contextTypes) { + return emptyObject; + } + maskedContext = {}; + for (var contextName in contextTypes) { + maskedContext[contextName] = context[contextName]; + } + return maskedContext; + }, + + /** + * Filters the context object to only contain keys specified in + * `contextTypes`, and asserts that they are valid. + * + * @param {object} context + * @return {?object} + * @private + */ + _processContext: function (context) { + var maskedContext = this._maskContext(context); + if (process.env.NODE_ENV !== 'production') { + var Component = this._currentElement.type; + if (Component.contextTypes) { + this._checkPropTypes(Component.contextTypes, maskedContext, ReactPropTypeLocations.context); + } + } + return maskedContext; + }, + + /** + * @param {object} currentContext + * @return {object} + * @private + */ + _processChildContext: function (currentContext) { + var Component = this._currentElement.type; + var inst = this._instance; + var childContext = inst.getChildContext && inst.getChildContext(); + if (childContext) { + !(typeof Component.childContextTypes === 'object') ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s.getChildContext(): childContextTypes must be defined in order to ' + 'use getChildContext().', this.getName() || 'ReactCompositeComponent') : invariant(false) : undefined; + if (process.env.NODE_ENV !== 'production') { + this._checkPropTypes(Component.childContextTypes, childContext, ReactPropTypeLocations.childContext); + } + for (var name in childContext) { + !(name in Component.childContextTypes) ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s.getChildContext(): key "%s" is not defined in childContextTypes.', this.getName() || 'ReactCompositeComponent', name) : invariant(false) : undefined; + } + return assign({}, currentContext, childContext); + } + return currentContext; + }, + + /** + * Processes props by setting default values for unspecified props and + * asserting that the props are valid. Does not mutate its argument; returns + * a new props object with defaults merged in. + * + * @param {object} newProps + * @return {object} + * @private + */ + _processProps: function (newProps) { + if (process.env.NODE_ENV !== 'production') { + var Component = this._currentElement.type; + if (Component.propTypes) { + this._checkPropTypes(Component.propTypes, newProps, ReactPropTypeLocations.prop); + } + } + return newProps; + }, + + /** + * Assert that the props are valid + * + * @param {object} propTypes Map of prop name to a ReactPropType + * @param {object} props + * @param {string} location e.g. "prop", "context", "child context" + * @private + */ + _checkPropTypes: function (propTypes, props, location) { + // TODO: Stop validating prop types here and only use the element + // validation. + var componentName = this.getName(); + for (var propName in propTypes) { + if (propTypes.hasOwnProperty(propName)) { + var error; + try { + // This is intentionally an invariant that gets caught. It's the same + // behavior as without this statement except with a better message. + !(typeof propTypes[propName] === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s: %s type `%s` is invalid; it must be a function, usually ' + 'from React.PropTypes.', componentName || 'React class', ReactPropTypeLocationNames[location], propName) : invariant(false) : undefined; + error = propTypes[propName](props, propName, componentName, location); + } catch (ex) { + error = ex; + } + if (error instanceof Error) { + // We may want to extend this logic for similar errors in + // top-level render calls, so I'm abstracting it away into + // a function to minimize refactoring in the future + var addendum = getDeclarationErrorAddendum(this); + + if (location === ReactPropTypeLocations.prop) { + // Preface gives us something to blacklist in warning module + process.env.NODE_ENV !== 'production' ? warning(false, 'Failed Composite propType: %s%s', error.message, addendum) : undefined; + } else { + process.env.NODE_ENV !== 'production' ? warning(false, 'Failed Context Types: %s%s', error.message, addendum) : undefined; + } + } + } + } + }, + + receiveComponent: function (nextElement, transaction, nextContext) { + var prevElement = this._currentElement; + var prevContext = this._context; + + this._pendingElement = null; + + this.updateComponent(transaction, prevElement, nextElement, prevContext, nextContext); + }, + + /** + * If any of `_pendingElement`, `_pendingStateQueue`, or `_pendingForceUpdate` + * is set, update the component. + * + * @param {ReactReconcileTransaction} transaction + * @internal + */ + performUpdateIfNecessary: function (transaction) { + if (this._pendingElement != null) { + ReactReconciler.receiveComponent(this, this._pendingElement || this._currentElement, transaction, this._context); + } + + if (this._pendingStateQueue !== null || this._pendingForceUpdate) { + this.updateComponent(transaction, this._currentElement, this._currentElement, this._context, this._context); + } + }, + + /** + * Perform an update to a mounted component. The componentWillReceiveProps and + * shouldComponentUpdate methods are called, then (assuming the update isn't + * skipped) the remaining update lifecycle methods are called and the DOM + * representation is updated. + * + * By default, this implements React's rendering and reconciliation algorithm. + * Sophisticated clients may wish to override this. + * + * @param {ReactReconcileTransaction} transaction + * @param {ReactElement} prevParentElement + * @param {ReactElement} nextParentElement + * @internal + * @overridable + */ + updateComponent: function (transaction, prevParentElement, nextParentElement, prevUnmaskedContext, nextUnmaskedContext) { + var inst = this._instance; + + var nextContext = this._context === nextUnmaskedContext ? inst.context : this._processContext(nextUnmaskedContext); + var nextProps; + + // Distinguish between a props update versus a simple state update + if (prevParentElement === nextParentElement) { + // Skip checking prop types again -- we don't read inst.props to avoid + // warning for DOM component props in this upgrade + nextProps = nextParentElement.props; + } else { + nextProps = this._processProps(nextParentElement.props); + // An update here will schedule an update but immediately set + // _pendingStateQueue which will ensure that any state updates gets + // immediately reconciled instead of waiting for the next batch. + + if (inst.componentWillReceiveProps) { + inst.componentWillReceiveProps(nextProps, nextContext); + } + } + + var nextState = this._processPendingState(nextProps, nextContext); + + var shouldUpdate = this._pendingForceUpdate || !inst.shouldComponentUpdate || inst.shouldComponentUpdate(nextProps, nextState, nextContext); + + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(typeof shouldUpdate !== 'undefined', '%s.shouldComponentUpdate(): Returned undefined instead of a ' + 'boolean value. Make sure to return true or false.', this.getName() || 'ReactCompositeComponent') : undefined; + } + + if (shouldUpdate) { + this._pendingForceUpdate = false; + // Will set `this.props`, `this.state` and `this.context`. + this._performComponentUpdate(nextParentElement, nextProps, nextState, nextContext, transaction, nextUnmaskedContext); + } else { + // If it's determined that a component should not update, we still want + // to set props and state but we shortcut the rest of the update. + this._currentElement = nextParentElement; + this._context = nextUnmaskedContext; + inst.props = nextProps; + inst.state = nextState; + inst.context = nextContext; + } + }, + + _processPendingState: function (props, context) { + var inst = this._instance; + var queue = this._pendingStateQueue; + var replace = this._pendingReplaceState; + this._pendingReplaceState = false; + this._pendingStateQueue = null; + + if (!queue) { + return inst.state; + } + + if (replace && queue.length === 1) { + return queue[0]; + } + + var nextState = assign({}, replace ? queue[0] : inst.state); + for (var i = replace ? 1 : 0; i < queue.length; i++) { + var partial = queue[i]; + assign(nextState, typeof partial === 'function' ? partial.call(inst, nextState, props, context) : partial); + } + + return nextState; + }, + + /** + * Merges new props and state, notifies delegate methods of update and + * performs update. + * + * @param {ReactElement} nextElement Next element + * @param {object} nextProps Next public object to set as properties. + * @param {?object} nextState Next object to set as state. + * @param {?object} nextContext Next public object to set as context. + * @param {ReactReconcileTransaction} transaction + * @param {?object} unmaskedContext + * @private + */ + _performComponentUpdate: function (nextElement, nextProps, nextState, nextContext, transaction, unmaskedContext) { + var inst = this._instance; + + var hasComponentDidUpdate = Boolean(inst.componentDidUpdate); + var prevProps; + var prevState; + var prevContext; + if (hasComponentDidUpdate) { + prevProps = inst.props; + prevState = inst.state; + prevContext = inst.context; + } + + if (inst.componentWillUpdate) { + inst.componentWillUpdate(nextProps, nextState, nextContext); + } + + this._currentElement = nextElement; + this._context = unmaskedContext; + inst.props = nextProps; + inst.state = nextState; + inst.context = nextContext; + + this._updateRenderedComponent(transaction, unmaskedContext); + + if (hasComponentDidUpdate) { + transaction.getReactMountReady().enqueue(inst.componentDidUpdate.bind(inst, prevProps, prevState, prevContext), inst); + } + }, + + /** + * Call the component's `render` method and update the DOM accordingly. + * + * @param {ReactReconcileTransaction} transaction + * @internal + */ + _updateRenderedComponent: function (transaction, context) { + var prevComponentInstance = this._renderedComponent; + var prevRenderedElement = prevComponentInstance._currentElement; + var nextRenderedElement = this._renderValidatedComponent(); + if (shouldUpdateReactComponent(prevRenderedElement, nextRenderedElement)) { + ReactReconciler.receiveComponent(prevComponentInstance, nextRenderedElement, transaction, this._processChildContext(context)); + } else { + // These two IDs are actually the same! But nothing should rely on that. + var thisID = this._rootNodeID; + var prevComponentID = prevComponentInstance._rootNodeID; + ReactReconciler.unmountComponent(prevComponentInstance); + + this._renderedComponent = this._instantiateReactComponent(nextRenderedElement); + var nextMarkup = ReactReconciler.mountComponent(this._renderedComponent, thisID, transaction, this._processChildContext(context)); + this._replaceNodeWithMarkupByID(prevComponentID, nextMarkup); + } + }, + + /** + * @protected + */ + _replaceNodeWithMarkupByID: function (prevComponentID, nextMarkup) { + ReactComponentEnvironment.replaceNodeWithMarkupByID(prevComponentID, nextMarkup); + }, + + /** + * @protected + */ + _renderValidatedComponentWithoutOwnerOrContext: function () { + var inst = this._instance; + var renderedComponent = inst.render(); + if (process.env.NODE_ENV !== 'production') { + // We allow auto-mocks to proceed as if they're returning null. + if (typeof renderedComponent === 'undefined' && inst.render._isMockFunction) { + // This is probably bad practice. Consider warning here and + // deprecating this convenience. + renderedComponent = null; + } + } + + return renderedComponent; + }, + + /** + * @private + */ + _renderValidatedComponent: function () { + var renderedComponent; + ReactCurrentOwner.current = this; + try { + renderedComponent = this._renderValidatedComponentWithoutOwnerOrContext(); + } finally { + ReactCurrentOwner.current = null; + } + !( + // TODO: An `isValidNode` function would probably be more appropriate + renderedComponent === null || renderedComponent === false || ReactElement.isValidElement(renderedComponent)) ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s.render(): A valid ReactComponent must be returned. You may have ' + 'returned undefined, an array or some other invalid object.', this.getName() || 'ReactCompositeComponent') : invariant(false) : undefined; + return renderedComponent; + }, + + /** + * Lazily allocates the refs object and stores `component` as `ref`. + * + * @param {string} ref Reference name. + * @param {component} component Component to store as `ref`. + * @final + * @private + */ + attachRef: function (ref, component) { + var inst = this.getPublicInstance(); + !(inst != null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Stateless function components cannot have refs.') : invariant(false) : undefined; + var publicComponentInstance = component.getPublicInstance(); + if (process.env.NODE_ENV !== 'production') { + var componentName = component && component.getName ? component.getName() : 'a component'; + process.env.NODE_ENV !== 'production' ? warning(publicComponentInstance != null, 'Stateless function components cannot be given refs ' + '(See ref "%s" in %s created by %s). ' + 'Attempts to access this ref will fail.', ref, componentName, this.getName()) : undefined; + } + var refs = inst.refs === emptyObject ? inst.refs = {} : inst.refs; + refs[ref] = publicComponentInstance; + }, + + /** + * Detaches a reference name. + * + * @param {string} ref Name to dereference. + * @final + * @private + */ + detachRef: function (ref) { + var refs = this.getPublicInstance().refs; + delete refs[ref]; + }, + + /** + * Get a text description of the component that can be used to identify it + * in error messages. + * @return {string} The name or null. + * @internal + */ + getName: function () { + var type = this._currentElement.type; + var constructor = this._instance && this._instance.constructor; + return type.displayName || constructor && constructor.displayName || type.name || constructor && constructor.name || null; + }, + + /** + * Get the publicly accessible representation of this component - i.e. what + * is exposed by refs and returned by render. Can be null for stateless + * components. + * + * @return {ReactComponent} the public component instance. + * @internal + */ + getPublicInstance: function () { + var inst = this._instance; + if (inst instanceof StatelessComponent) { + return null; + } + return inst; + }, + + // Stub + _instantiateReactComponent: null + + }; + + ReactPerf.measureMethods(ReactCompositeComponentMixin, 'ReactCompositeComponent', { + mountComponent: 'mountComponent', + updateComponent: 'updateComponent', + _renderValidatedComponent: '_renderValidatedComponent' + }); + + var ReactCompositeComponent = { + + Mixin: ReactCompositeComponentMixin + + }; + + module.exports = ReactCompositeComponent; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 63 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2014-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactComponentEnvironment + */ + + 'use strict'; + + var invariant = __webpack_require__(12); + + var injected = false; + + var ReactComponentEnvironment = { + + /** + * Optionally injectable environment dependent cleanup hook. (server vs. + * browser etc). Example: A browser system caches DOM nodes based on component + * ID and must remove that cache entry when this instance is unmounted. + */ + unmountIDFromEnvironment: null, + + /** + * Optionally injectable hook for swapping out mount images in the middle of + * the tree. + */ + replaceNodeWithMarkupByID: null, + + /** + * Optionally injectable hook for processing a queue of child updates. Will + * later move into MultiChildComponents. + */ + processChildrenUpdates: null, + + injection: { + injectEnvironment: function (environment) { + !!injected ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactCompositeComponent: injectEnvironment() can only be called once.') : invariant(false) : undefined; + ReactComponentEnvironment.unmountIDFromEnvironment = environment.unmountIDFromEnvironment; + ReactComponentEnvironment.replaceNodeWithMarkupByID = environment.replaceNodeWithMarkupByID; + ReactComponentEnvironment.processChildrenUpdates = environment.processChildrenUpdates; + injected = true; + } + } + + }; + + module.exports = ReactComponentEnvironment; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 64 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactPropTypeLocations + */ + + 'use strict'; + + var keyMirror = __webpack_require__(16); + + var ReactPropTypeLocations = keyMirror({ + prop: null, + context: null, + childContext: null + }); + + module.exports = ReactPropTypeLocations; + +/***/ }, +/* 65 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactPropTypeLocationNames + */ + + 'use strict'; + + var ReactPropTypeLocationNames = {}; + + if (process.env.NODE_ENV !== 'production') { + ReactPropTypeLocationNames = { + prop: 'prop', + context: 'context', + childContext: 'child context' + }; + } + + module.exports = ReactPropTypeLocationNames; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 66 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule shouldUpdateReactComponent + * @typechecks static-only + */ + + 'use strict'; + + /** + * Given a `prevElement` and `nextElement`, determines if the existing + * instance should be updated as opposed to being destroyed or replaced by a new + * instance. Both arguments are elements. This ensures that this logic can + * operate on stateless trees without any backing instance. + * + * @param {?object} prevElement + * @param {?object} nextElement + * @return {boolean} True if the existing instance should be updated. + * @protected + */ + function shouldUpdateReactComponent(prevElement, nextElement) { + var prevEmpty = prevElement === null || prevElement === false; + var nextEmpty = nextElement === null || nextElement === false; + if (prevEmpty || nextEmpty) { + return prevEmpty === nextEmpty; + } + + var prevType = typeof prevElement; + var nextType = typeof nextElement; + if (prevType === 'string' || prevType === 'number') { + return nextType === 'string' || nextType === 'number'; + } else { + return nextType === 'object' && prevElement.type === nextElement.type && prevElement.key === nextElement.key; + } + return false; + } + + module.exports = shouldUpdateReactComponent; + +/***/ }, +/* 67 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2014-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactEmptyComponent + */ + + 'use strict'; + + var ReactElement = __webpack_require__(41); + var ReactEmptyComponentRegistry = __webpack_require__(43); + var ReactReconciler = __webpack_require__(49); + + var assign = __webpack_require__(38); + + var placeholderElement; + + var ReactEmptyComponentInjection = { + injectEmptyComponent: function (component) { + placeholderElement = ReactElement.createElement(component); + } + }; + + var ReactEmptyComponent = function (instantiate) { + this._currentElement = null; + this._rootNodeID = null; + this._renderedComponent = instantiate(placeholderElement); + }; + assign(ReactEmptyComponent.prototype, { + construct: function (element) {}, + mountComponent: function (rootID, transaction, context) { + ReactEmptyComponentRegistry.registerNullComponentID(rootID); + this._rootNodeID = rootID; + return ReactReconciler.mountComponent(this._renderedComponent, rootID, transaction, context); + }, + receiveComponent: function () {}, + unmountComponent: function (rootID, transaction, context) { + ReactReconciler.unmountComponent(this._renderedComponent); + ReactEmptyComponentRegistry.deregisterNullComponentID(this._rootNodeID); + this._rootNodeID = null; + this._renderedComponent = null; + } + }); + + ReactEmptyComponent.injection = ReactEmptyComponentInjection; + + module.exports = ReactEmptyComponent; + +/***/ }, +/* 68 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2014-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactNativeComponent + */ + + 'use strict'; + + var assign = __webpack_require__(38); + var invariant = __webpack_require__(12); + + var autoGenerateWrapperClass = null; + var genericComponentClass = null; + // This registry keeps track of wrapper classes around native tags. + var tagToComponentClass = {}; + var textComponentClass = null; + + var ReactNativeComponentInjection = { + // This accepts a class that receives the tag string. This is a catch all + // that can render any kind of tag. + injectGenericComponentClass: function (componentClass) { + genericComponentClass = componentClass; + }, + // This accepts a text component class that takes the text string to be + // rendered as props. + injectTextComponentClass: function (componentClass) { + textComponentClass = componentClass; + }, + // This accepts a keyed object with classes as values. Each key represents a + // tag. That particular tag will use this class instead of the generic one. + injectComponentClasses: function (componentClasses) { + assign(tagToComponentClass, componentClasses); + } + }; + + /** + * Get a composite component wrapper class for a specific tag. + * + * @param {ReactElement} element The tag for which to get the class. + * @return {function} The React class constructor function. + */ + function getComponentClassForElement(element) { + if (typeof element.type === 'function') { + return element.type; + } + var tag = element.type; + var componentClass = tagToComponentClass[tag]; + if (componentClass == null) { + tagToComponentClass[tag] = componentClass = autoGenerateWrapperClass(tag); + } + return componentClass; + } + + /** + * Get a native internal component class for a specific tag. + * + * @param {ReactElement} element The element to create. + * @return {function} The internal class constructor function. + */ + function createInternalComponent(element) { + !genericComponentClass ? process.env.NODE_ENV !== 'production' ? invariant(false, 'There is no registered component for the tag %s', element.type) : invariant(false) : undefined; + return new genericComponentClass(element.type, element.props); + } + + /** + * @param {ReactText} text + * @return {ReactComponent} + */ + function createInstanceForText(text) { + return new textComponentClass(text); + } + + /** + * @param {ReactComponent} component + * @return {boolean} + */ + function isTextComponent(component) { + return component instanceof textComponentClass; + } + + var ReactNativeComponent = { + getComponentClassForElement: getComponentClassForElement, + createInternalComponent: createInternalComponent, + createInstanceForText: createInstanceForText, + isTextComponent: isTextComponent, + injection: ReactNativeComponentInjection + }; + + module.exports = ReactNativeComponent; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 69 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule validateDOMNesting + */ + + 'use strict'; + + var assign = __webpack_require__(38); + var emptyFunction = __webpack_require__(14); + var warning = __webpack_require__(24); + + var validateDOMNesting = emptyFunction; + + if (process.env.NODE_ENV !== 'production') { + // This validation code was written based on the HTML5 parsing spec: + // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope + // + // Note: this does not catch all invalid nesting, nor does it try to (as it's + // not clear what practical benefit doing so provides); instead, we warn only + // for cases where the parser will give a parse tree differing from what React + // intended. For example, <b><div></div></b> is invalid but we don't warn + // because it still parses correctly; we do warn for other cases like nested + // <p> tags where the beginning of the second element implicitly closes the + // first, causing a confusing mess. + + // https://html.spec.whatwg.org/multipage/syntax.html#special + var specialTags = ['address', 'applet', 'area', 'article', 'aside', 'base', 'basefont', 'bgsound', 'blockquote', 'body', 'br', 'button', 'caption', 'center', 'col', 'colgroup', 'dd', 'details', 'dir', 'div', 'dl', 'dt', 'embed', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'frame', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'iframe', 'img', 'input', 'isindex', 'li', 'link', 'listing', 'main', 'marquee', 'menu', 'menuitem', 'meta', 'nav', 'noembed', 'noframes', 'noscript', 'object', 'ol', 'p', 'param', 'plaintext', 'pre', 'script', 'section', 'select', 'source', 'style', 'summary', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'title', 'tr', 'track', 'ul', 'wbr', 'xmp']; + + // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope + var inScopeTags = ['applet', 'caption', 'html', 'table', 'td', 'th', 'marquee', 'object', 'template', + + // https://html.spec.whatwg.org/multipage/syntax.html#html-integration-point + // TODO: Distinguish by namespace here -- for <title>, including it here + // errs on the side of fewer warnings + 'foreignObject', 'desc', 'title']; + + // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-button-scope + var buttonScopeTags = inScopeTags.concat(['button']); + + // https://html.spec.whatwg.org/multipage/syntax.html#generate-implied-end-tags + var impliedEndTags = ['dd', 'dt', 'li', 'option', 'optgroup', 'p', 'rp', 'rt']; + + var emptyAncestorInfo = { + parentTag: null, + + formTag: null, + aTagInScope: null, + buttonTagInScope: null, + nobrTagInScope: null, + pTagInButtonScope: null, + + listItemTagAutoclosing: null, + dlItemTagAutoclosing: null + }; + + var updatedAncestorInfo = function (oldInfo, tag, instance) { + var ancestorInfo = assign({}, oldInfo || emptyAncestorInfo); + var info = { tag: tag, instance: instance }; + + if (inScopeTags.indexOf(tag) !== -1) { + ancestorInfo.aTagInScope = null; + ancestorInfo.buttonTagInScope = null; + ancestorInfo.nobrTagInScope = null; + } + if (buttonScopeTags.indexOf(tag) !== -1) { + ancestorInfo.pTagInButtonScope = null; + } + + // See rules for 'li', 'dd', 'dt' start tags in + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody + if (specialTags.indexOf(tag) !== -1 && tag !== 'address' && tag !== 'div' && tag !== 'p') { + ancestorInfo.listItemTagAutoclosing = null; + ancestorInfo.dlItemTagAutoclosing = null; + } + + ancestorInfo.parentTag = info; + + if (tag === 'form') { + ancestorInfo.formTag = info; + } + if (tag === 'a') { + ancestorInfo.aTagInScope = info; + } + if (tag === 'button') { + ancestorInfo.buttonTagInScope = info; + } + if (tag === 'nobr') { + ancestorInfo.nobrTagInScope = info; + } + if (tag === 'p') { + ancestorInfo.pTagInButtonScope = info; + } + if (tag === 'li') { + ancestorInfo.listItemTagAutoclosing = info; + } + if (tag === 'dd' || tag === 'dt') { + ancestorInfo.dlItemTagAutoclosing = info; + } + + return ancestorInfo; + }; + + /** + * Returns whether + */ + var isTagValidWithParent = function (tag, parentTag) { + // First, let's check if we're in an unusual parsing mode... + switch (parentTag) { + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inselect + case 'select': + return tag === 'option' || tag === 'optgroup' || tag === '#text'; + case 'optgroup': + return tag === 'option' || tag === '#text'; + // Strictly speaking, seeing an <option> doesn't mean we're in a <select> + // but + case 'option': + return tag === '#text'; + + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intd + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incaption + // No special behavior since these rules fall back to "in body" mode for + // all except special table nodes which cause bad parsing behavior anyway. + + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intr + case 'tr': + return tag === 'th' || tag === 'td' || tag === 'style' || tag === 'script' || tag === 'template'; + + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intbody + case 'tbody': + case 'thead': + case 'tfoot': + return tag === 'tr' || tag === 'style' || tag === 'script' || tag === 'template'; + + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incolgroup + case 'colgroup': + return tag === 'col' || tag === 'template'; + + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intable + case 'table': + return tag === 'caption' || tag === 'colgroup' || tag === 'tbody' || tag === 'tfoot' || tag === 'thead' || tag === 'style' || tag === 'script' || tag === 'template'; + + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inhead + case 'head': + return tag === 'base' || tag === 'basefont' || tag === 'bgsound' || tag === 'link' || tag === 'meta' || tag === 'title' || tag === 'noscript' || tag === 'noframes' || tag === 'style' || tag === 'script' || tag === 'template'; + + // https://html.spec.whatwg.org/multipage/semantics.html#the-html-element + case 'html': + return tag === 'head' || tag === 'body'; + } + + // Probably in the "in body" parsing mode, so we outlaw only tag combos + // where the parsing rules cause implicit opens or closes to be added. + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody + switch (tag) { + case 'h1': + case 'h2': + case 'h3': + case 'h4': + case 'h5': + case 'h6': + return parentTag !== 'h1' && parentTag !== 'h2' && parentTag !== 'h3' && parentTag !== 'h4' && parentTag !== 'h5' && parentTag !== 'h6'; + + case 'rp': + case 'rt': + return impliedEndTags.indexOf(parentTag) === -1; + + case 'caption': + case 'col': + case 'colgroup': + case 'frame': + case 'head': + case 'tbody': + case 'td': + case 'tfoot': + case 'th': + case 'thead': + case 'tr': + // These tags are only valid with a few parents that have special child + // parsing rules -- if we're down here, then none of those matched and + // so we allow it only if we don't know what the parent is, as all other + // cases are invalid. + return parentTag == null; + } + + return true; + }; + + /** + * Returns whether + */ + var findInvalidAncestorForTag = function (tag, ancestorInfo) { + switch (tag) { + case 'address': + case 'article': + case 'aside': + case 'blockquote': + case 'center': + case 'details': + case 'dialog': + case 'dir': + case 'div': + case 'dl': + case 'fieldset': + case 'figcaption': + case 'figure': + case 'footer': + case 'header': + case 'hgroup': + case 'main': + case 'menu': + case 'nav': + case 'ol': + case 'p': + case 'section': + case 'summary': + case 'ul': + + case 'pre': + case 'listing': + + case 'table': + + case 'hr': + + case 'xmp': + + case 'h1': + case 'h2': + case 'h3': + case 'h4': + case 'h5': + case 'h6': + return ancestorInfo.pTagInButtonScope; + + case 'form': + return ancestorInfo.formTag || ancestorInfo.pTagInButtonScope; + + case 'li': + return ancestorInfo.listItemTagAutoclosing; + + case 'dd': + case 'dt': + return ancestorInfo.dlItemTagAutoclosing; + + case 'button': + return ancestorInfo.buttonTagInScope; + + case 'a': + // Spec says something about storing a list of markers, but it sounds + // equivalent to this check. + return ancestorInfo.aTagInScope; + + case 'nobr': + return ancestorInfo.nobrTagInScope; + } + + return null; + }; + + /** + * Given a ReactCompositeComponent instance, return a list of its recursive + * owners, starting at the root and ending with the instance itself. + */ + var findOwnerStack = function (instance) { + if (!instance) { + return []; + } + + var stack = []; + /*eslint-disable space-after-keywords */ + do { + /*eslint-enable space-after-keywords */ + stack.push(instance); + } while (instance = instance._currentElement._owner); + stack.reverse(); + return stack; + }; + + var didWarn = {}; + + validateDOMNesting = function (childTag, childInstance, ancestorInfo) { + ancestorInfo = ancestorInfo || emptyAncestorInfo; + var parentInfo = ancestorInfo.parentTag; + var parentTag = parentInfo && parentInfo.tag; + + var invalidParent = isTagValidWithParent(childTag, parentTag) ? null : parentInfo; + var invalidAncestor = invalidParent ? null : findInvalidAncestorForTag(childTag, ancestorInfo); + var problematic = invalidParent || invalidAncestor; + + if (problematic) { + var ancestorTag = problematic.tag; + var ancestorInstance = problematic.instance; + + var childOwner = childInstance && childInstance._currentElement._owner; + var ancestorOwner = ancestorInstance && ancestorInstance._currentElement._owner; + + var childOwners = findOwnerStack(childOwner); + var ancestorOwners = findOwnerStack(ancestorOwner); + + var minStackLen = Math.min(childOwners.length, ancestorOwners.length); + var i; + + var deepestCommon = -1; + for (i = 0; i < minStackLen; i++) { + if (childOwners[i] === ancestorOwners[i]) { + deepestCommon = i; + } else { + break; + } + } + + var UNKNOWN = '(unknown)'; + var childOwnerNames = childOwners.slice(deepestCommon + 1).map(function (inst) { + return inst.getName() || UNKNOWN; + }); + var ancestorOwnerNames = ancestorOwners.slice(deepestCommon + 1).map(function (inst) { + return inst.getName() || UNKNOWN; + }); + var ownerInfo = [].concat( + // If the parent and child instances have a common owner ancestor, start + // with that -- otherwise we just start with the parent's owners. + deepestCommon !== -1 ? childOwners[deepestCommon].getName() || UNKNOWN : [], ancestorOwnerNames, ancestorTag, + // If we're warning about an invalid (non-parent) ancestry, add '...' + invalidAncestor ? ['...'] : [], childOwnerNames, childTag).join(' > '); + + var warnKey = !!invalidParent + '|' + childTag + '|' + ancestorTag + '|' + ownerInfo; + if (didWarn[warnKey]) { + return; + } + didWarn[warnKey] = true; + + if (invalidParent) { + var info = ''; + if (ancestorTag === 'table' && childTag === 'tr') { + info += ' Add a <tbody> to your code to match the DOM tree generated by ' + 'the browser.'; + } + process.env.NODE_ENV !== 'production' ? warning(false, 'validateDOMNesting(...): <%s> cannot appear as a child of <%s>. ' + 'See %s.%s', childTag, ancestorTag, ownerInfo, info) : undefined; + } else { + process.env.NODE_ENV !== 'production' ? warning(false, 'validateDOMNesting(...): <%s> cannot appear as a descendant of ' + '<%s>. See %s.', childTag, ancestorTag, ownerInfo) : undefined; + } + } + }; + + validateDOMNesting.ancestorInfoContextKey = '__validateDOMNesting_ancestorInfo$' + Math.random().toString(36).slice(2); + + validateDOMNesting.updatedAncestorInfo = updatedAncestorInfo; + + // For testing + validateDOMNesting.isTagValidInContext = function (tag, ancestorInfo) { + ancestorInfo = ancestorInfo || emptyAncestorInfo; + var parentInfo = ancestorInfo.parentTag; + var parentTag = parentInfo && parentInfo.tag; + return isTagValidWithParent(tag, parentTag) && !findInvalidAncestorForTag(tag, ancestorInfo); + }; + } + + module.exports = validateDOMNesting; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 70 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactDefaultInjection + */ + + 'use strict'; + + var BeforeInputEventPlugin = __webpack_require__(71); + var ChangeEventPlugin = __webpack_require__(79); + var ClientReactRootIndex = __webpack_require__(82); + var DefaultEventPluginOrder = __webpack_require__(83); + var EnterLeaveEventPlugin = __webpack_require__(84); + var ExecutionEnvironment = __webpack_require__(8); + var HTMLDOMPropertyConfig = __webpack_require__(88); + var ReactBrowserComponentMixin = __webpack_require__(89); + var ReactComponentBrowserEnvironment = __webpack_require__(25); + var ReactDefaultBatchingStrategy = __webpack_require__(91); + var ReactDOMComponent = __webpack_require__(92); + var ReactDOMTextComponent = __webpack_require__(5); + var ReactEventListener = __webpack_require__(117); + var ReactInjection = __webpack_require__(120); + var ReactInstanceHandles = __webpack_require__(44); + var ReactMount = __webpack_require__(27); + var ReactReconcileTransaction = __webpack_require__(124); + var SelectEventPlugin = __webpack_require__(129); + var ServerReactRootIndex = __webpack_require__(130); + var SimpleEventPlugin = __webpack_require__(131); + var SVGDOMPropertyConfig = __webpack_require__(140); + + var alreadyInjected = false; + + function inject() { + if (alreadyInjected) { + // TODO: This is currently true because these injections are shared between + // the client and the server package. They should be built independently + // and not share any injection state. Then this problem will be solved. + return; + } + alreadyInjected = true; + + ReactInjection.EventEmitter.injectReactEventListener(ReactEventListener); + + /** + * Inject modules for resolving DOM hierarchy and plugin ordering. + */ + ReactInjection.EventPluginHub.injectEventPluginOrder(DefaultEventPluginOrder); + ReactInjection.EventPluginHub.injectInstanceHandle(ReactInstanceHandles); + ReactInjection.EventPluginHub.injectMount(ReactMount); + + /** + * Some important event plugins included by default (without having to require + * them). + */ + ReactInjection.EventPluginHub.injectEventPluginsByName({ + SimpleEventPlugin: SimpleEventPlugin, + EnterLeaveEventPlugin: EnterLeaveEventPlugin, + ChangeEventPlugin: ChangeEventPlugin, + SelectEventPlugin: SelectEventPlugin, + BeforeInputEventPlugin: BeforeInputEventPlugin + }); + + ReactInjection.NativeComponent.injectGenericComponentClass(ReactDOMComponent); + + ReactInjection.NativeComponent.injectTextComponentClass(ReactDOMTextComponent); + + ReactInjection.Class.injectMixin(ReactBrowserComponentMixin); + + ReactInjection.DOMProperty.injectDOMPropertyConfig(HTMLDOMPropertyConfig); + ReactInjection.DOMProperty.injectDOMPropertyConfig(SVGDOMPropertyConfig); + + ReactInjection.EmptyComponent.injectEmptyComponent('noscript'); + + ReactInjection.Updates.injectReconcileTransaction(ReactReconcileTransaction); + ReactInjection.Updates.injectBatchingStrategy(ReactDefaultBatchingStrategy); + + ReactInjection.RootIndex.injectCreateReactRootIndex(ExecutionEnvironment.canUseDOM ? ClientReactRootIndex.createReactRootIndex : ServerReactRootIndex.createReactRootIndex); + + ReactInjection.Component.injectEnvironment(ReactComponentBrowserEnvironment); + + if (process.env.NODE_ENV !== 'production') { + var url = ExecutionEnvironment.canUseDOM && window.location.href || ''; + if (/[?&]react_perf\b/.test(url)) { + var ReactDefaultPerf = __webpack_require__(141); + ReactDefaultPerf.start(); + } + } + } + + module.exports = { + inject: inject + }; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 71 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015 Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule BeforeInputEventPlugin + * @typechecks static-only + */ + + 'use strict'; + + var EventConstants = __webpack_require__(29); + var EventPropagators = __webpack_require__(72); + var ExecutionEnvironment = __webpack_require__(8); + var FallbackCompositionState = __webpack_require__(73); + var SyntheticCompositionEvent = __webpack_require__(75); + var SyntheticInputEvent = __webpack_require__(77); + + var keyOf = __webpack_require__(78); + + var END_KEYCODES = [9, 13, 27, 32]; // Tab, Return, Esc, Space + var START_KEYCODE = 229; + + var canUseCompositionEvent = ExecutionEnvironment.canUseDOM && 'CompositionEvent' in window; + + var documentMode = null; + if (ExecutionEnvironment.canUseDOM && 'documentMode' in document) { + documentMode = document.documentMode; + } + + // Webkit offers a very useful `textInput` event that can be used to + // directly represent `beforeInput`. The IE `textinput` event is not as + // useful, so we don't use it. + var canUseTextInputEvent = ExecutionEnvironment.canUseDOM && 'TextEvent' in window && !documentMode && !isPresto(); + + // In IE9+, we have access to composition events, but the data supplied + // by the native compositionend event may be incorrect. Japanese ideographic + // spaces, for instance (\u3000) are not recorded correctly. + var useFallbackCompositionData = ExecutionEnvironment.canUseDOM && (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11); + + /** + * Opera <= 12 includes TextEvent in window, but does not fire + * text input events. Rely on keypress instead. + */ + function isPresto() { + var opera = window.opera; + return typeof opera === 'object' && typeof opera.version === 'function' && parseInt(opera.version(), 10) <= 12; + } + + var SPACEBAR_CODE = 32; + var SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE); + + var topLevelTypes = EventConstants.topLevelTypes; + + // Events and their corresponding property names. + var eventTypes = { + beforeInput: { + phasedRegistrationNames: { + bubbled: keyOf({ onBeforeInput: null }), + captured: keyOf({ onBeforeInputCapture: null }) + }, + dependencies: [topLevelTypes.topCompositionEnd, topLevelTypes.topKeyPress, topLevelTypes.topTextInput, topLevelTypes.topPaste] + }, + compositionEnd: { + phasedRegistrationNames: { + bubbled: keyOf({ onCompositionEnd: null }), + captured: keyOf({ onCompositionEndCapture: null }) + }, + dependencies: [topLevelTypes.topBlur, topLevelTypes.topCompositionEnd, topLevelTypes.topKeyDown, topLevelTypes.topKeyPress, topLevelTypes.topKeyUp, topLevelTypes.topMouseDown] + }, + compositionStart: { + phasedRegistrationNames: { + bubbled: keyOf({ onCompositionStart: null }), + captured: keyOf({ onCompositionStartCapture: null }) + }, + dependencies: [topLevelTypes.topBlur, topLevelTypes.topCompositionStart, topLevelTypes.topKeyDown, topLevelTypes.topKeyPress, topLevelTypes.topKeyUp, topLevelTypes.topMouseDown] + }, + compositionUpdate: { + phasedRegistrationNames: { + bubbled: keyOf({ onCompositionUpdate: null }), + captured: keyOf({ onCompositionUpdateCapture: null }) + }, + dependencies: [topLevelTypes.topBlur, topLevelTypes.topCompositionUpdate, topLevelTypes.topKeyDown, topLevelTypes.topKeyPress, topLevelTypes.topKeyUp, topLevelTypes.topMouseDown] + } + }; + + // Track whether we've ever handled a keypress on the space key. + var hasSpaceKeypress = false; + + /** + * Return whether a native keypress event is assumed to be a command. + * This is required because Firefox fires `keypress` events for key commands + * (cut, copy, select-all, etc.) even though no character is inserted. + */ + function isKeypressCommand(nativeEvent) { + return (nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) && + // ctrlKey && altKey is equivalent to AltGr, and is not a command. + !(nativeEvent.ctrlKey && nativeEvent.altKey); + } + + /** + * Translate native top level events into event types. + * + * @param {string} topLevelType + * @return {object} + */ + function getCompositionEventType(topLevelType) { + switch (topLevelType) { + case topLevelTypes.topCompositionStart: + return eventTypes.compositionStart; + case topLevelTypes.topCompositionEnd: + return eventTypes.compositionEnd; + case topLevelTypes.topCompositionUpdate: + return eventTypes.compositionUpdate; + } + } + + /** + * Does our fallback best-guess model think this event signifies that + * composition has begun? + * + * @param {string} topLevelType + * @param {object} nativeEvent + * @return {boolean} + */ + function isFallbackCompositionStart(topLevelType, nativeEvent) { + return topLevelType === topLevelTypes.topKeyDown && nativeEvent.keyCode === START_KEYCODE; + } + + /** + * Does our fallback mode think that this event is the end of composition? + * + * @param {string} topLevelType + * @param {object} nativeEvent + * @return {boolean} + */ + function isFallbackCompositionEnd(topLevelType, nativeEvent) { + switch (topLevelType) { + case topLevelTypes.topKeyUp: + // Command keys insert or clear IME input. + return END_KEYCODES.indexOf(nativeEvent.keyCode) !== -1; + case topLevelTypes.topKeyDown: + // Expect IME keyCode on each keydown. If we get any other + // code we must have exited earlier. + return nativeEvent.keyCode !== START_KEYCODE; + case topLevelTypes.topKeyPress: + case topLevelTypes.topMouseDown: + case topLevelTypes.topBlur: + // Events are not possible without cancelling IME. + return true; + default: + return false; + } + } + + /** + * Google Input Tools provides composition data via a CustomEvent, + * with the `data` property populated in the `detail` object. If this + * is available on the event object, use it. If not, this is a plain + * composition event and we have nothing special to extract. + * + * @param {object} nativeEvent + * @return {?string} + */ + function getDataFromCustomEvent(nativeEvent) { + var detail = nativeEvent.detail; + if (typeof detail === 'object' && 'data' in detail) { + return detail.data; + } + return null; + } + + // Track the current IME composition fallback object, if any. + var currentComposition = null; + + /** + * @param {string} topLevelType Record from `EventConstants`. + * @param {DOMEventTarget} topLevelTarget The listening component root node. + * @param {string} topLevelTargetID ID of `topLevelTarget`. + * @param {object} nativeEvent Native browser event. + * @return {?object} A SyntheticCompositionEvent. + */ + function extractCompositionEvent(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) { + var eventType; + var fallbackData; + + if (canUseCompositionEvent) { + eventType = getCompositionEventType(topLevelType); + } else if (!currentComposition) { + if (isFallbackCompositionStart(topLevelType, nativeEvent)) { + eventType = eventTypes.compositionStart; + } + } else if (isFallbackCompositionEnd(topLevelType, nativeEvent)) { + eventType = eventTypes.compositionEnd; + } + + if (!eventType) { + return null; + } + + if (useFallbackCompositionData) { + // The current composition is stored statically and must not be + // overwritten while composition continues. + if (!currentComposition && eventType === eventTypes.compositionStart) { + currentComposition = FallbackCompositionState.getPooled(topLevelTarget); + } else if (eventType === eventTypes.compositionEnd) { + if (currentComposition) { + fallbackData = currentComposition.getData(); + } + } + } + + var event = SyntheticCompositionEvent.getPooled(eventType, topLevelTargetID, nativeEvent, nativeEventTarget); + + if (fallbackData) { + // Inject data generated from fallback path into the synthetic event. + // This matches the property of native CompositionEventInterface. + event.data = fallbackData; + } else { + var customData = getDataFromCustomEvent(nativeEvent); + if (customData !== null) { + event.data = customData; + } + } + + EventPropagators.accumulateTwoPhaseDispatches(event); + return event; + } + + /** + * @param {string} topLevelType Record from `EventConstants`. + * @param {object} nativeEvent Native browser event. + * @return {?string} The string corresponding to this `beforeInput` event. + */ + function getNativeBeforeInputChars(topLevelType, nativeEvent) { + switch (topLevelType) { + case topLevelTypes.topCompositionEnd: + return getDataFromCustomEvent(nativeEvent); + case topLevelTypes.topKeyPress: + /** + * If native `textInput` events are available, our goal is to make + * use of them. However, there is a special case: the spacebar key. + * In Webkit, preventing default on a spacebar `textInput` event + * cancels character insertion, but it *also* causes the browser + * to fall back to its default spacebar behavior of scrolling the + * page. + * + * Tracking at: + * https://code.google.com/p/chromium/issues/detail?id=355103 + * + * To avoid this issue, use the keypress event as if no `textInput` + * event is available. + */ + var which = nativeEvent.which; + if (which !== SPACEBAR_CODE) { + return null; + } + + hasSpaceKeypress = true; + return SPACEBAR_CHAR; + + case topLevelTypes.topTextInput: + // Record the characters to be added to the DOM. + var chars = nativeEvent.data; + + // If it's a spacebar character, assume that we have already handled + // it at the keypress level and bail immediately. Android Chrome + // doesn't give us keycodes, so we need to blacklist it. + if (chars === SPACEBAR_CHAR && hasSpaceKeypress) { + return null; + } + + return chars; + + default: + // For other native event types, do nothing. + return null; + } + } + + /** + * For browsers that do not provide the `textInput` event, extract the + * appropriate string to use for SyntheticInputEvent. + * + * @param {string} topLevelType Record from `EventConstants`. + * @param {object} nativeEvent Native browser event. + * @return {?string} The fallback string for this `beforeInput` event. + */ + function getFallbackBeforeInputChars(topLevelType, nativeEvent) { + // If we are currently composing (IME) and using a fallback to do so, + // try to extract the composed characters from the fallback object. + if (currentComposition) { + if (topLevelType === topLevelTypes.topCompositionEnd || isFallbackCompositionEnd(topLevelType, nativeEvent)) { + var chars = currentComposition.getData(); + FallbackCompositionState.release(currentComposition); + currentComposition = null; + return chars; + } + return null; + } + + switch (topLevelType) { + case topLevelTypes.topPaste: + // If a paste event occurs after a keypress, throw out the input + // chars. Paste events should not lead to BeforeInput events. + return null; + case topLevelTypes.topKeyPress: + /** + * As of v27, Firefox may fire keypress events even when no character + * will be inserted. A few possibilities: + * + * - `which` is `0`. Arrow keys, Esc key, etc. + * + * - `which` is the pressed key code, but no char is available. + * Ex: 'AltGr + d` in Polish. There is no modified character for + * this key combination and no character is inserted into the + * document, but FF fires the keypress for char code `100` anyway. + * No `input` event will occur. + * + * - `which` is the pressed key code, but a command combination is + * being used. Ex: `Cmd+C`. No character is inserted, and no + * `input` event will occur. + */ + if (nativeEvent.which && !isKeypressCommand(nativeEvent)) { + return String.fromCharCode(nativeEvent.which); + } + return null; + case topLevelTypes.topCompositionEnd: + return useFallbackCompositionData ? null : nativeEvent.data; + default: + return null; + } + } + + /** + * Extract a SyntheticInputEvent for `beforeInput`, based on either native + * `textInput` or fallback behavior. + * + * @param {string} topLevelType Record from `EventConstants`. + * @param {DOMEventTarget} topLevelTarget The listening component root node. + * @param {string} topLevelTargetID ID of `topLevelTarget`. + * @param {object} nativeEvent Native browser event. + * @return {?object} A SyntheticInputEvent. + */ + function extractBeforeInputEvent(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) { + var chars; + + if (canUseTextInputEvent) { + chars = getNativeBeforeInputChars(topLevelType, nativeEvent); + } else { + chars = getFallbackBeforeInputChars(topLevelType, nativeEvent); + } + + // If no characters are being inserted, no BeforeInput event should + // be fired. + if (!chars) { + return null; + } + + var event = SyntheticInputEvent.getPooled(eventTypes.beforeInput, topLevelTargetID, nativeEvent, nativeEventTarget); + + event.data = chars; + EventPropagators.accumulateTwoPhaseDispatches(event); + return event; + } + + /** + * Create an `onBeforeInput` event to match + * http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105/#events-inputevents. + * + * This event plugin is based on the native `textInput` event + * available in Chrome, Safari, Opera, and IE. This event fires after + * `onKeyPress` and `onCompositionEnd`, but before `onInput`. + * + * `beforeInput` is spec'd but not implemented in any browsers, and + * the `input` event does not provide any useful information about what has + * actually been added, contrary to the spec. Thus, `textInput` is the best + * available event to identify the characters that have actually been inserted + * into the target node. + * + * This plugin is also responsible for emitting `composition` events, thus + * allowing us to share composition fallback code for both `beforeInput` and + * `composition` event types. + */ + var BeforeInputEventPlugin = { + + eventTypes: eventTypes, + + /** + * @param {string} topLevelType Record from `EventConstants`. + * @param {DOMEventTarget} topLevelTarget The listening component root node. + * @param {string} topLevelTargetID ID of `topLevelTarget`. + * @param {object} nativeEvent Native browser event. + * @return {*} An accumulation of synthetic events. + * @see {EventPluginHub.extractEvents} + */ + extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) { + return [extractCompositionEvent(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget), extractBeforeInputEvent(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget)]; + } + }; + + module.exports = BeforeInputEventPlugin; + +/***/ }, +/* 72 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule EventPropagators + */ + + 'use strict'; + + var EventConstants = __webpack_require__(29); + var EventPluginHub = __webpack_require__(30); + + var warning = __webpack_require__(24); + + var accumulateInto = __webpack_require__(34); + var forEachAccumulated = __webpack_require__(35); + + var PropagationPhases = EventConstants.PropagationPhases; + var getListener = EventPluginHub.getListener; + + /** + * Some event types have a notion of different registration names for different + * "phases" of propagation. This finds listeners by a given phase. + */ + function listenerAtPhase(id, event, propagationPhase) { + var registrationName = event.dispatchConfig.phasedRegistrationNames[propagationPhase]; + return getListener(id, registrationName); + } + + /** + * Tags a `SyntheticEvent` with dispatched listeners. Creating this function + * here, allows us to not have to bind or create functions for each event. + * Mutating the event's members allows us to not have to create a wrapping + * "dispatch" object that pairs the event with the listener. + */ + function accumulateDirectionalDispatches(domID, upwards, event) { + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(domID, 'Dispatching id must not be null') : undefined; + } + var phase = upwards ? PropagationPhases.bubbled : PropagationPhases.captured; + var listener = listenerAtPhase(domID, event, phase); + if (listener) { + event._dispatchListeners = accumulateInto(event._dispatchListeners, listener); + event._dispatchIDs = accumulateInto(event._dispatchIDs, domID); + } + } + + /** + * Collect dispatches (must be entirely collected before dispatching - see unit + * tests). Lazily allocate the array to conserve memory. We must loop through + * each event and perform the traversal for each one. We cannot perform a + * single traversal for the entire collection of events because each event may + * have a different target. + */ + function accumulateTwoPhaseDispatchesSingle(event) { + if (event && event.dispatchConfig.phasedRegistrationNames) { + EventPluginHub.injection.getInstanceHandle().traverseTwoPhase(event.dispatchMarker, accumulateDirectionalDispatches, event); + } + } + + /** + * Same as `accumulateTwoPhaseDispatchesSingle`, but skips over the targetID. + */ + function accumulateTwoPhaseDispatchesSingleSkipTarget(event) { + if (event && event.dispatchConfig.phasedRegistrationNames) { + EventPluginHub.injection.getInstanceHandle().traverseTwoPhaseSkipTarget(event.dispatchMarker, accumulateDirectionalDispatches, event); + } + } + + /** + * Accumulates without regard to direction, does not look for phased + * registration names. Same as `accumulateDirectDispatchesSingle` but without + * requiring that the `dispatchMarker` be the same as the dispatched ID. + */ + function accumulateDispatches(id, ignoredDirection, event) { + if (event && event.dispatchConfig.registrationName) { + var registrationName = event.dispatchConfig.registrationName; + var listener = getListener(id, registrationName); + if (listener) { + event._dispatchListeners = accumulateInto(event._dispatchListeners, listener); + event._dispatchIDs = accumulateInto(event._dispatchIDs, id); + } + } + } + + /** + * Accumulates dispatches on an `SyntheticEvent`, but only for the + * `dispatchMarker`. + * @param {SyntheticEvent} event + */ + function accumulateDirectDispatchesSingle(event) { + if (event && event.dispatchConfig.registrationName) { + accumulateDispatches(event.dispatchMarker, null, event); + } + } + + function accumulateTwoPhaseDispatches(events) { + forEachAccumulated(events, accumulateTwoPhaseDispatchesSingle); + } + + function accumulateTwoPhaseDispatchesSkipTarget(events) { + forEachAccumulated(events, accumulateTwoPhaseDispatchesSingleSkipTarget); + } + + function accumulateEnterLeaveDispatches(leave, enter, fromID, toID) { + EventPluginHub.injection.getInstanceHandle().traverseEnterLeave(fromID, toID, accumulateDispatches, leave, enter); + } + + function accumulateDirectDispatches(events) { + forEachAccumulated(events, accumulateDirectDispatchesSingle); + } + + /** + * A small set of propagation patterns, each of which will accept a small amount + * of information, and generate a set of "dispatch ready event objects" - which + * are sets of events that have already been annotated with a set of dispatched + * listener functions/ids. The API is designed this way to discourage these + * propagation strategies from actually executing the dispatches, since we + * always want to collect the entire set of dispatches before executing event a + * single one. + * + * @constructor EventPropagators + */ + var EventPropagators = { + accumulateTwoPhaseDispatches: accumulateTwoPhaseDispatches, + accumulateTwoPhaseDispatchesSkipTarget: accumulateTwoPhaseDispatchesSkipTarget, + accumulateDirectDispatches: accumulateDirectDispatches, + accumulateEnterLeaveDispatches: accumulateEnterLeaveDispatches + }; + + module.exports = EventPropagators; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 73 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule FallbackCompositionState + * @typechecks static-only + */ + + 'use strict'; + + var PooledClass = __webpack_require__(55); + + var assign = __webpack_require__(38); + var getTextContentAccessor = __webpack_require__(74); + + /** + * This helper class stores information about text content of a target node, + * allowing comparison of content before and after a given event. + * + * Identify the node where selection currently begins, then observe + * both its text content and its current position in the DOM. Since the + * browser may natively replace the target node during composition, we can + * use its position to find its replacement. + * + * @param {DOMEventTarget} root + */ + function FallbackCompositionState(root) { + this._root = root; + this._startText = this.getText(); + this._fallbackText = null; + } + + assign(FallbackCompositionState.prototype, { + destructor: function () { + this._root = null; + this._startText = null; + this._fallbackText = null; + }, + + /** + * Get current text of input. + * + * @return {string} + */ + getText: function () { + if ('value' in this._root) { + return this._root.value; + } + return this._root[getTextContentAccessor()]; + }, + + /** + * Determine the differing substring between the initially stored + * text content and the current content. + * + * @return {string} + */ + getData: function () { + if (this._fallbackText) { + return this._fallbackText; + } + + var start; + var startValue = this._startText; + var startLength = startValue.length; + var end; + var endValue = this.getText(); + var endLength = endValue.length; + + for (start = 0; start < startLength; start++) { + if (startValue[start] !== endValue[start]) { + break; + } + } + + var minEnd = startLength - start; + for (end = 1; end <= minEnd; end++) { + if (startValue[startLength - end] !== endValue[endLength - end]) { + break; + } + } + + var sliceTail = end > 1 ? 1 - end : undefined; + this._fallbackText = endValue.slice(start, sliceTail); + return this._fallbackText; + } + }); + + PooledClass.addPoolingTo(FallbackCompositionState); + + module.exports = FallbackCompositionState; + +/***/ }, +/* 74 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule getTextContentAccessor + */ + + 'use strict'; + + var ExecutionEnvironment = __webpack_require__(8); + + var contentKey = null; + + /** + * Gets the key used to access text content on a DOM node. + * + * @return {?string} Key used to access text content. + * @internal + */ + function getTextContentAccessor() { + if (!contentKey && ExecutionEnvironment.canUseDOM) { + // Prefer textContent to innerText because many browsers support both but + // SVG <text> elements don't support innerText even when <div> does. + contentKey = 'textContent' in document.documentElement ? 'textContent' : 'innerText'; + } + return contentKey; + } + + module.exports = getTextContentAccessor; + +/***/ }, +/* 75 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule SyntheticCompositionEvent + * @typechecks static-only + */ + + 'use strict'; + + var SyntheticEvent = __webpack_require__(76); + + /** + * @interface Event + * @see http://www.w3.org/TR/DOM-Level-3-Events/#events-compositionevents + */ + var CompositionEventInterface = { + data: null + }; + + /** + * @param {object} dispatchConfig Configuration used to dispatch this event. + * @param {string} dispatchMarker Marker identifying the event target. + * @param {object} nativeEvent Native browser event. + * @extends {SyntheticUIEvent} + */ + function SyntheticCompositionEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) { + SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget); + } + + SyntheticEvent.augmentClass(SyntheticCompositionEvent, CompositionEventInterface); + + module.exports = SyntheticCompositionEvent; + +/***/ }, +/* 76 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule SyntheticEvent + * @typechecks static-only + */ + + 'use strict'; + + var PooledClass = __webpack_require__(55); + + var assign = __webpack_require__(38); + var emptyFunction = __webpack_require__(14); + var warning = __webpack_require__(24); + + /** + * @interface Event + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ + var EventInterface = { + type: null, + // currentTarget is set when dispatching; no use in copying it here + currentTarget: emptyFunction.thatReturnsNull, + eventPhase: null, + bubbles: null, + cancelable: null, + timeStamp: function (event) { + return event.timeStamp || Date.now(); + }, + defaultPrevented: null, + isTrusted: null + }; + + /** + * Synthetic events are dispatched by event plugins, typically in response to a + * top-level event delegation handler. + * + * These systems should generally use pooling to reduce the frequency of garbage + * collection. The system should check `isPersistent` to determine whether the + * event should be released into the pool after being dispatched. Users that + * need a persisted event should invoke `persist`. + * + * Synthetic events (and subclasses) implement the DOM Level 3 Events API by + * normalizing browser quirks. Subclasses do not necessarily have to implement a + * DOM interface; custom application-specific events can also subclass this. + * + * @param {object} dispatchConfig Configuration used to dispatch this event. + * @param {string} dispatchMarker Marker identifying the event target. + * @param {object} nativeEvent Native browser event. + */ + function SyntheticEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) { + this.dispatchConfig = dispatchConfig; + this.dispatchMarker = dispatchMarker; + this.nativeEvent = nativeEvent; + this.target = nativeEventTarget; + this.currentTarget = nativeEventTarget; + + var Interface = this.constructor.Interface; + for (var propName in Interface) { + if (!Interface.hasOwnProperty(propName)) { + continue; + } + var normalize = Interface[propName]; + if (normalize) { + this[propName] = normalize(nativeEvent); + } else { + this[propName] = nativeEvent[propName]; + } + } + + var defaultPrevented = nativeEvent.defaultPrevented != null ? nativeEvent.defaultPrevented : nativeEvent.returnValue === false; + if (defaultPrevented) { + this.isDefaultPrevented = emptyFunction.thatReturnsTrue; + } else { + this.isDefaultPrevented = emptyFunction.thatReturnsFalse; + } + this.isPropagationStopped = emptyFunction.thatReturnsFalse; + } + + assign(SyntheticEvent.prototype, { + + preventDefault: function () { + this.defaultPrevented = true; + var event = this.nativeEvent; + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(event, 'This synthetic event is reused for performance reasons. If you\'re ' + 'seeing this, you\'re calling `preventDefault` on a ' + 'released/nullified synthetic event. This is a no-op. See ' + 'https://fb.me/react-event-pooling for more information.') : undefined; + } + if (!event) { + return; + } + + if (event.preventDefault) { + event.preventDefault(); + } else { + event.returnValue = false; + } + this.isDefaultPrevented = emptyFunction.thatReturnsTrue; + }, + + stopPropagation: function () { + var event = this.nativeEvent; + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(event, 'This synthetic event is reused for performance reasons. If you\'re ' + 'seeing this, you\'re calling `stopPropagation` on a ' + 'released/nullified synthetic event. This is a no-op. See ' + 'https://fb.me/react-event-pooling for more information.') : undefined; + } + if (!event) { + return; + } + + if (event.stopPropagation) { + event.stopPropagation(); + } else { + event.cancelBubble = true; + } + this.isPropagationStopped = emptyFunction.thatReturnsTrue; + }, + + /** + * We release all dispatched `SyntheticEvent`s after each event loop, adding + * them back into the pool. This allows a way to hold onto a reference that + * won't be added back into the pool. + */ + persist: function () { + this.isPersistent = emptyFunction.thatReturnsTrue; + }, + + /** + * Checks if this event should be released back into the pool. + * + * @return {boolean} True if this should not be released, false otherwise. + */ + isPersistent: emptyFunction.thatReturnsFalse, + + /** + * `PooledClass` looks for `destructor` on each instance it releases. + */ + destructor: function () { + var Interface = this.constructor.Interface; + for (var propName in Interface) { + this[propName] = null; + } + this.dispatchConfig = null; + this.dispatchMarker = null; + this.nativeEvent = null; + } + + }); + + SyntheticEvent.Interface = EventInterface; + + /** + * Helper to reduce boilerplate when creating subclasses. + * + * @param {function} Class + * @param {?object} Interface + */ + SyntheticEvent.augmentClass = function (Class, Interface) { + var Super = this; + + var prototype = Object.create(Super.prototype); + assign(prototype, Class.prototype); + Class.prototype = prototype; + Class.prototype.constructor = Class; + + Class.Interface = assign({}, Super.Interface, Interface); + Class.augmentClass = Super.augmentClass; + + PooledClass.addPoolingTo(Class, PooledClass.fourArgumentPooler); + }; + + PooledClass.addPoolingTo(SyntheticEvent, PooledClass.fourArgumentPooler); + + module.exports = SyntheticEvent; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 77 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule SyntheticInputEvent + * @typechecks static-only + */ + + 'use strict'; + + var SyntheticEvent = __webpack_require__(76); + + /** + * @interface Event + * @see http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105 + * /#events-inputevents + */ + var InputEventInterface = { + data: null + }; + + /** + * @param {object} dispatchConfig Configuration used to dispatch this event. + * @param {string} dispatchMarker Marker identifying the event target. + * @param {object} nativeEvent Native browser event. + * @extends {SyntheticUIEvent} + */ + function SyntheticInputEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) { + SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget); + } + + SyntheticEvent.augmentClass(SyntheticInputEvent, InputEventInterface); + + module.exports = SyntheticInputEvent; + +/***/ }, +/* 78 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule keyOf + */ + + /** + * Allows extraction of a minified key. Let's the build system minify keys + * without losing the ability to dynamically use key strings as values + * themselves. Pass in an object with a single key/val pair and it will return + * you the string key of that single record. Suppose you want to grab the + * value for a key 'className' inside of an object. Key/val minification may + * have aliased that key to be 'xa12'. keyOf({className: null}) will return + * 'xa12' in that case. Resolve keys you want to use once at startup time, then + * reuse those resolutions. + */ + "use strict"; + + var keyOf = function (oneKeyObj) { + var key; + for (key in oneKeyObj) { + if (!oneKeyObj.hasOwnProperty(key)) { + continue; + } + return key; + } + return null; + }; + + module.exports = keyOf; + +/***/ }, +/* 79 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ChangeEventPlugin + */ + + 'use strict'; + + var EventConstants = __webpack_require__(29); + var EventPluginHub = __webpack_require__(30); + var EventPropagators = __webpack_require__(72); + var ExecutionEnvironment = __webpack_require__(8); + var ReactUpdates = __webpack_require__(53); + var SyntheticEvent = __webpack_require__(76); + + var getEventTarget = __webpack_require__(80); + var isEventSupported = __webpack_require__(39); + var isTextInputElement = __webpack_require__(81); + var keyOf = __webpack_require__(78); + + var topLevelTypes = EventConstants.topLevelTypes; + + var eventTypes = { + change: { + phasedRegistrationNames: { + bubbled: keyOf({ onChange: null }), + captured: keyOf({ onChangeCapture: null }) + }, + dependencies: [topLevelTypes.topBlur, topLevelTypes.topChange, topLevelTypes.topClick, topLevelTypes.topFocus, topLevelTypes.topInput, topLevelTypes.topKeyDown, topLevelTypes.topKeyUp, topLevelTypes.topSelectionChange] + } + }; + + /** + * For IE shims + */ + var activeElement = null; + var activeElementID = null; + var activeElementValue = null; + var activeElementValueProp = null; + + /** + * SECTION: handle `change` event + */ + function shouldUseChangeEvent(elem) { + var nodeName = elem.nodeName && elem.nodeName.toLowerCase(); + return nodeName === 'select' || nodeName === 'input' && elem.type === 'file'; + } + + var doesChangeEventBubble = false; + if (ExecutionEnvironment.canUseDOM) { + // See `handleChange` comment below + doesChangeEventBubble = isEventSupported('change') && (!('documentMode' in document) || document.documentMode > 8); + } + + function manualDispatchChangeEvent(nativeEvent) { + var event = SyntheticEvent.getPooled(eventTypes.change, activeElementID, nativeEvent, getEventTarget(nativeEvent)); + EventPropagators.accumulateTwoPhaseDispatches(event); + + // If change and propertychange bubbled, we'd just bind to it like all the + // other events and have it go through ReactBrowserEventEmitter. Since it + // doesn't, we manually listen for the events and so we have to enqueue and + // process the abstract event manually. + // + // Batching is necessary here in order to ensure that all event handlers run + // before the next rerender (including event handlers attached to ancestor + // elements instead of directly on the input). Without this, controlled + // components don't work properly in conjunction with event bubbling because + // the component is rerendered and the value reverted before all the event + // handlers can run. See https://github.com/facebook/react/issues/708. + ReactUpdates.batchedUpdates(runEventInBatch, event); + } + + function runEventInBatch(event) { + EventPluginHub.enqueueEvents(event); + EventPluginHub.processEventQueue(false); + } + + function startWatchingForChangeEventIE8(target, targetID) { + activeElement = target; + activeElementID = targetID; + activeElement.attachEvent('onchange', manualDispatchChangeEvent); + } + + function stopWatchingForChangeEventIE8() { + if (!activeElement) { + return; + } + activeElement.detachEvent('onchange', manualDispatchChangeEvent); + activeElement = null; + activeElementID = null; + } + + function getTargetIDForChangeEvent(topLevelType, topLevelTarget, topLevelTargetID) { + if (topLevelType === topLevelTypes.topChange) { + return topLevelTargetID; + } + } + function handleEventsForChangeEventIE8(topLevelType, topLevelTarget, topLevelTargetID) { + if (topLevelType === topLevelTypes.topFocus) { + // stopWatching() should be a noop here but we call it just in case we + // missed a blur event somehow. + stopWatchingForChangeEventIE8(); + startWatchingForChangeEventIE8(topLevelTarget, topLevelTargetID); + } else if (topLevelType === topLevelTypes.topBlur) { + stopWatchingForChangeEventIE8(); + } + } + + /** + * SECTION: handle `input` event + */ + var isInputEventSupported = false; + if (ExecutionEnvironment.canUseDOM) { + // IE9 claims to support the input event but fails to trigger it when + // deleting text, so we ignore its input events + isInputEventSupported = isEventSupported('input') && (!('documentMode' in document) || document.documentMode > 9); + } + + /** + * (For old IE.) Replacement getter/setter for the `value` property that gets + * set on the active element. + */ + var newValueProp = { + get: function () { + return activeElementValueProp.get.call(this); + }, + set: function (val) { + // Cast to a string so we can do equality checks. + activeElementValue = '' + val; + activeElementValueProp.set.call(this, val); + } + }; + + /** + * (For old IE.) Starts tracking propertychange events on the passed-in element + * and override the value property so that we can distinguish user events from + * value changes in JS. + */ + function startWatchingForValueChange(target, targetID) { + activeElement = target; + activeElementID = targetID; + activeElementValue = target.value; + activeElementValueProp = Object.getOwnPropertyDescriptor(target.constructor.prototype, 'value'); + + // Not guarded in a canDefineProperty check: IE8 supports defineProperty only + // on DOM elements + Object.defineProperty(activeElement, 'value', newValueProp); + activeElement.attachEvent('onpropertychange', handlePropertyChange); + } + + /** + * (For old IE.) Removes the event listeners from the currently-tracked element, + * if any exists. + */ + function stopWatchingForValueChange() { + if (!activeElement) { + return; + } + + // delete restores the original property definition + delete activeElement.value; + activeElement.detachEvent('onpropertychange', handlePropertyChange); + + activeElement = null; + activeElementID = null; + activeElementValue = null; + activeElementValueProp = null; + } + + /** + * (For old IE.) Handles a propertychange event, sending a `change` event if + * the value of the active element has changed. + */ + function handlePropertyChange(nativeEvent) { + if (nativeEvent.propertyName !== 'value') { + return; + } + var value = nativeEvent.srcElement.value; + if (value === activeElementValue) { + return; + } + activeElementValue = value; + + manualDispatchChangeEvent(nativeEvent); + } + + /** + * If a `change` event should be fired, returns the target's ID. + */ + function getTargetIDForInputEvent(topLevelType, topLevelTarget, topLevelTargetID) { + if (topLevelType === topLevelTypes.topInput) { + // In modern browsers (i.e., not IE8 or IE9), the input event is exactly + // what we want so fall through here and trigger an abstract event + return topLevelTargetID; + } + } + + // For IE8 and IE9. + function handleEventsForInputEventIE(topLevelType, topLevelTarget, topLevelTargetID) { + if (topLevelType === topLevelTypes.topFocus) { + // In IE8, we can capture almost all .value changes by adding a + // propertychange handler and looking for events with propertyName + // equal to 'value' + // In IE9, propertychange fires for most input events but is buggy and + // doesn't fire when text is deleted, but conveniently, selectionchange + // appears to fire in all of the remaining cases so we catch those and + // forward the event if the value has changed + // In either case, we don't want to call the event handler if the value + // is changed from JS so we redefine a setter for `.value` that updates + // our activeElementValue variable, allowing us to ignore those changes + // + // stopWatching() should be a noop here but we call it just in case we + // missed a blur event somehow. + stopWatchingForValueChange(); + startWatchingForValueChange(topLevelTarget, topLevelTargetID); + } else if (topLevelType === topLevelTypes.topBlur) { + stopWatchingForValueChange(); + } + } + + // For IE8 and IE9. + function getTargetIDForInputEventIE(topLevelType, topLevelTarget, topLevelTargetID) { + if (topLevelType === topLevelTypes.topSelectionChange || topLevelType === topLevelTypes.topKeyUp || topLevelType === topLevelTypes.topKeyDown) { + // On the selectionchange event, the target is just document which isn't + // helpful for us so just check activeElement instead. + // + // 99% of the time, keydown and keyup aren't necessary. IE8 fails to fire + // propertychange on the first input event after setting `value` from a + // script and fires only keydown, keypress, keyup. Catching keyup usually + // gets it and catching keydown lets us fire an event for the first + // keystroke if user does a key repeat (it'll be a little delayed: right + // before the second keystroke). Other input methods (e.g., paste) seem to + // fire selectionchange normally. + if (activeElement && activeElement.value !== activeElementValue) { + activeElementValue = activeElement.value; + return activeElementID; + } + } + } + + /** + * SECTION: handle `click` event + */ + function shouldUseClickEvent(elem) { + // Use the `click` event to detect changes to checkbox and radio inputs. + // This approach works across all browsers, whereas `change` does not fire + // until `blur` in IE8. + return elem.nodeName && elem.nodeName.toLowerCase() === 'input' && (elem.type === 'checkbox' || elem.type === 'radio'); + } + + function getTargetIDForClickEvent(topLevelType, topLevelTarget, topLevelTargetID) { + if (topLevelType === topLevelTypes.topClick) { + return topLevelTargetID; + } + } + + /** + * This plugin creates an `onChange` event that normalizes change events + * across form elements. This event fires at a time when it's possible to + * change the element's value without seeing a flicker. + * + * Supported elements are: + * - input (see `isTextInputElement`) + * - textarea + * - select + */ + var ChangeEventPlugin = { + + eventTypes: eventTypes, + + /** + * @param {string} topLevelType Record from `EventConstants`. + * @param {DOMEventTarget} topLevelTarget The listening component root node. + * @param {string} topLevelTargetID ID of `topLevelTarget`. + * @param {object} nativeEvent Native browser event. + * @return {*} An accumulation of synthetic events. + * @see {EventPluginHub.extractEvents} + */ + extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) { + + var getTargetIDFunc, handleEventFunc; + if (shouldUseChangeEvent(topLevelTarget)) { + if (doesChangeEventBubble) { + getTargetIDFunc = getTargetIDForChangeEvent; + } else { + handleEventFunc = handleEventsForChangeEventIE8; + } + } else if (isTextInputElement(topLevelTarget)) { + if (isInputEventSupported) { + getTargetIDFunc = getTargetIDForInputEvent; + } else { + getTargetIDFunc = getTargetIDForInputEventIE; + handleEventFunc = handleEventsForInputEventIE; + } + } else if (shouldUseClickEvent(topLevelTarget)) { + getTargetIDFunc = getTargetIDForClickEvent; + } + + if (getTargetIDFunc) { + var targetID = getTargetIDFunc(topLevelType, topLevelTarget, topLevelTargetID); + if (targetID) { + var event = SyntheticEvent.getPooled(eventTypes.change, targetID, nativeEvent, nativeEventTarget); + event.type = 'change'; + EventPropagators.accumulateTwoPhaseDispatches(event); + return event; + } + } + + if (handleEventFunc) { + handleEventFunc(topLevelType, topLevelTarget, topLevelTargetID); + } + } + + }; + + module.exports = ChangeEventPlugin; + +/***/ }, +/* 80 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule getEventTarget + * @typechecks static-only + */ + + 'use strict'; + + /** + * Gets the target node from a native browser event by accounting for + * inconsistencies in browser DOM APIs. + * + * @param {object} nativeEvent Native browser event. + * @return {DOMEventTarget} Target node. + */ + function getEventTarget(nativeEvent) { + var target = nativeEvent.target || nativeEvent.srcElement || window; + // Safari may fire events on text nodes (Node.TEXT_NODE is 3). + // @see http://www.quirksmode.org/js/events_properties.html + return target.nodeType === 3 ? target.parentNode : target; + } + + module.exports = getEventTarget; + +/***/ }, +/* 81 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule isTextInputElement + */ + + 'use strict'; + + /** + * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary + */ + var supportedInputTypes = { + 'color': true, + 'date': true, + 'datetime': true, + 'datetime-local': true, + 'email': true, + 'month': true, + 'number': true, + 'password': true, + 'range': true, + 'search': true, + 'tel': true, + 'text': true, + 'time': true, + 'url': true, + 'week': true + }; + + function isTextInputElement(elem) { + var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase(); + return nodeName && (nodeName === 'input' && supportedInputTypes[elem.type] || nodeName === 'textarea'); + } + + module.exports = isTextInputElement; + +/***/ }, +/* 82 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ClientReactRootIndex + * @typechecks + */ + + 'use strict'; + + var nextReactRootIndex = 0; + + var ClientReactRootIndex = { + createReactRootIndex: function () { + return nextReactRootIndex++; + } + }; + + module.exports = ClientReactRootIndex; + +/***/ }, +/* 83 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule DefaultEventPluginOrder + */ + + 'use strict'; + + var keyOf = __webpack_require__(78); + + /** + * Module that is injectable into `EventPluginHub`, that specifies a + * deterministic ordering of `EventPlugin`s. A convenient way to reason about + * plugins, without having to package every one of them. This is better than + * having plugins be ordered in the same order that they are injected because + * that ordering would be influenced by the packaging order. + * `ResponderEventPlugin` must occur before `SimpleEventPlugin` so that + * preventing default on events is convenient in `SimpleEventPlugin` handlers. + */ + var DefaultEventPluginOrder = [keyOf({ ResponderEventPlugin: null }), keyOf({ SimpleEventPlugin: null }), keyOf({ TapEventPlugin: null }), keyOf({ EnterLeaveEventPlugin: null }), keyOf({ ChangeEventPlugin: null }), keyOf({ SelectEventPlugin: null }), keyOf({ BeforeInputEventPlugin: null })]; + + module.exports = DefaultEventPluginOrder; + +/***/ }, +/* 84 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule EnterLeaveEventPlugin + * @typechecks static-only + */ + + 'use strict'; + + var EventConstants = __webpack_require__(29); + var EventPropagators = __webpack_require__(72); + var SyntheticMouseEvent = __webpack_require__(85); + + var ReactMount = __webpack_require__(27); + var keyOf = __webpack_require__(78); + + var topLevelTypes = EventConstants.topLevelTypes; + var getFirstReactDOM = ReactMount.getFirstReactDOM; + + var eventTypes = { + mouseEnter: { + registrationName: keyOf({ onMouseEnter: null }), + dependencies: [topLevelTypes.topMouseOut, topLevelTypes.topMouseOver] + }, + mouseLeave: { + registrationName: keyOf({ onMouseLeave: null }), + dependencies: [topLevelTypes.topMouseOut, topLevelTypes.topMouseOver] + } + }; + + var extractedEvents = [null, null]; + + var EnterLeaveEventPlugin = { + + eventTypes: eventTypes, + + /** + * For almost every interaction we care about, there will be both a top-level + * `mouseover` and `mouseout` event that occurs. Only use `mouseout` so that + * we do not extract duplicate events. However, moving the mouse into the + * browser from outside will not fire a `mouseout` event. In this case, we use + * the `mouseover` top-level event. + * + * @param {string} topLevelType Record from `EventConstants`. + * @param {DOMEventTarget} topLevelTarget The listening component root node. + * @param {string} topLevelTargetID ID of `topLevelTarget`. + * @param {object} nativeEvent Native browser event. + * @return {*} An accumulation of synthetic events. + * @see {EventPluginHub.extractEvents} + */ + extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) { + if (topLevelType === topLevelTypes.topMouseOver && (nativeEvent.relatedTarget || nativeEvent.fromElement)) { + return null; + } + if (topLevelType !== topLevelTypes.topMouseOut && topLevelType !== topLevelTypes.topMouseOver) { + // Must not be a mouse in or mouse out - ignoring. + return null; + } + + var win; + if (topLevelTarget.window === topLevelTarget) { + // `topLevelTarget` is probably a window object. + win = topLevelTarget; + } else { + // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8. + var doc = topLevelTarget.ownerDocument; + if (doc) { + win = doc.defaultView || doc.parentWindow; + } else { + win = window; + } + } + + var from; + var to; + var fromID = ''; + var toID = ''; + if (topLevelType === topLevelTypes.topMouseOut) { + from = topLevelTarget; + fromID = topLevelTargetID; + to = getFirstReactDOM(nativeEvent.relatedTarget || nativeEvent.toElement); + if (to) { + toID = ReactMount.getID(to); + } else { + to = win; + } + to = to || win; + } else { + from = win; + to = topLevelTarget; + toID = topLevelTargetID; + } + + if (from === to) { + // Nothing pertains to our managed components. + return null; + } + + var leave = SyntheticMouseEvent.getPooled(eventTypes.mouseLeave, fromID, nativeEvent, nativeEventTarget); + leave.type = 'mouseleave'; + leave.target = from; + leave.relatedTarget = to; + + var enter = SyntheticMouseEvent.getPooled(eventTypes.mouseEnter, toID, nativeEvent, nativeEventTarget); + enter.type = 'mouseenter'; + enter.target = to; + enter.relatedTarget = from; + + EventPropagators.accumulateEnterLeaveDispatches(leave, enter, fromID, toID); + + extractedEvents[0] = leave; + extractedEvents[1] = enter; + + return extractedEvents; + } + + }; + + module.exports = EnterLeaveEventPlugin; + +/***/ }, +/* 85 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule SyntheticMouseEvent + * @typechecks static-only + */ + + 'use strict'; + + var SyntheticUIEvent = __webpack_require__(86); + var ViewportMetrics = __webpack_require__(37); + + var getEventModifierState = __webpack_require__(87); + + /** + * @interface MouseEvent + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ + var MouseEventInterface = { + screenX: null, + screenY: null, + clientX: null, + clientY: null, + ctrlKey: null, + shiftKey: null, + altKey: null, + metaKey: null, + getModifierState: getEventModifierState, + button: function (event) { + // Webkit, Firefox, IE9+ + // which: 1 2 3 + // button: 0 1 2 (standard) + var button = event.button; + if ('which' in event) { + return button; + } + // IE<9 + // which: undefined + // button: 0 0 0 + // button: 1 4 2 (onmouseup) + return button === 2 ? 2 : button === 4 ? 1 : 0; + }, + buttons: null, + relatedTarget: function (event) { + return event.relatedTarget || (event.fromElement === event.srcElement ? event.toElement : event.fromElement); + }, + // "Proprietary" Interface. + pageX: function (event) { + return 'pageX' in event ? event.pageX : event.clientX + ViewportMetrics.currentScrollLeft; + }, + pageY: function (event) { + return 'pageY' in event ? event.pageY : event.clientY + ViewportMetrics.currentScrollTop; + } + }; + + /** + * @param {object} dispatchConfig Configuration used to dispatch this event. + * @param {string} dispatchMarker Marker identifying the event target. + * @param {object} nativeEvent Native browser event. + * @extends {SyntheticUIEvent} + */ + function SyntheticMouseEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) { + SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget); + } + + SyntheticUIEvent.augmentClass(SyntheticMouseEvent, MouseEventInterface); + + module.exports = SyntheticMouseEvent; + +/***/ }, +/* 86 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule SyntheticUIEvent + * @typechecks static-only + */ + + 'use strict'; + + var SyntheticEvent = __webpack_require__(76); + + var getEventTarget = __webpack_require__(80); + + /** + * @interface UIEvent + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ + var UIEventInterface = { + view: function (event) { + if (event.view) { + return event.view; + } + + var target = getEventTarget(event); + if (target != null && target.window === target) { + // target is a window object + return target; + } + + var doc = target.ownerDocument; + // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8. + if (doc) { + return doc.defaultView || doc.parentWindow; + } else { + return window; + } + }, + detail: function (event) { + return event.detail || 0; + } + }; + + /** + * @param {object} dispatchConfig Configuration used to dispatch this event. + * @param {string} dispatchMarker Marker identifying the event target. + * @param {object} nativeEvent Native browser event. + * @extends {SyntheticEvent} + */ + function SyntheticUIEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) { + SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget); + } + + SyntheticEvent.augmentClass(SyntheticUIEvent, UIEventInterface); + + module.exports = SyntheticUIEvent; + +/***/ }, +/* 87 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule getEventModifierState + * @typechecks static-only + */ + + 'use strict'; + + /** + * Translation from modifier key to the associated property in the event. + * @see http://www.w3.org/TR/DOM-Level-3-Events/#keys-Modifiers + */ + + var modifierKeyToProp = { + 'Alt': 'altKey', + 'Control': 'ctrlKey', + 'Meta': 'metaKey', + 'Shift': 'shiftKey' + }; + + // IE8 does not implement getModifierState so we simply map it to the only + // modifier keys exposed by the event itself, does not support Lock-keys. + // Currently, all major browsers except Chrome seems to support Lock-keys. + function modifierStateGetter(keyArg) { + var syntheticEvent = this; + var nativeEvent = syntheticEvent.nativeEvent; + if (nativeEvent.getModifierState) { + return nativeEvent.getModifierState(keyArg); + } + var keyProp = modifierKeyToProp[keyArg]; + return keyProp ? !!nativeEvent[keyProp] : false; + } + + function getEventModifierState(nativeEvent) { + return modifierStateGetter; + } + + module.exports = getEventModifierState; + +/***/ }, +/* 88 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule HTMLDOMPropertyConfig + */ + + 'use strict'; + + var DOMProperty = __webpack_require__(22); + var ExecutionEnvironment = __webpack_require__(8); + + var MUST_USE_ATTRIBUTE = DOMProperty.injection.MUST_USE_ATTRIBUTE; + var MUST_USE_PROPERTY = DOMProperty.injection.MUST_USE_PROPERTY; + var HAS_BOOLEAN_VALUE = DOMProperty.injection.HAS_BOOLEAN_VALUE; + var HAS_SIDE_EFFECTS = DOMProperty.injection.HAS_SIDE_EFFECTS; + var HAS_NUMERIC_VALUE = DOMProperty.injection.HAS_NUMERIC_VALUE; + var HAS_POSITIVE_NUMERIC_VALUE = DOMProperty.injection.HAS_POSITIVE_NUMERIC_VALUE; + var HAS_OVERLOADED_BOOLEAN_VALUE = DOMProperty.injection.HAS_OVERLOADED_BOOLEAN_VALUE; + + var hasSVG; + if (ExecutionEnvironment.canUseDOM) { + var implementation = document.implementation; + hasSVG = implementation && implementation.hasFeature && implementation.hasFeature('http://www.w3.org/TR/SVG11/feature#BasicStructure', '1.1'); + } + + var HTMLDOMPropertyConfig = { + isCustomAttribute: RegExp.prototype.test.bind(/^(data|aria)-[a-z_][a-z\d_.\-]*$/), + Properties: { + /** + * Standard Properties + */ + accept: null, + acceptCharset: null, + accessKey: null, + action: null, + allowFullScreen: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE, + allowTransparency: MUST_USE_ATTRIBUTE, + alt: null, + async: HAS_BOOLEAN_VALUE, + autoComplete: null, + // autoFocus is polyfilled/normalized by AutoFocusUtils + // autoFocus: HAS_BOOLEAN_VALUE, + autoPlay: HAS_BOOLEAN_VALUE, + capture: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE, + cellPadding: null, + cellSpacing: null, + charSet: MUST_USE_ATTRIBUTE, + challenge: MUST_USE_ATTRIBUTE, + checked: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE, + classID: MUST_USE_ATTRIBUTE, + // To set className on SVG elements, it's necessary to use .setAttribute; + // this works on HTML elements too in all browsers except IE8. Conveniently, + // IE8 doesn't support SVG and so we can simply use the attribute in + // browsers that support SVG and the property in browsers that don't, + // regardless of whether the element is HTML or SVG. + className: hasSVG ? MUST_USE_ATTRIBUTE : MUST_USE_PROPERTY, + cols: MUST_USE_ATTRIBUTE | HAS_POSITIVE_NUMERIC_VALUE, + colSpan: null, + content: null, + contentEditable: null, + contextMenu: MUST_USE_ATTRIBUTE, + controls: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE, + coords: null, + crossOrigin: null, + data: null, // For `<object />` acts as `src`. + dateTime: MUST_USE_ATTRIBUTE, + 'default': HAS_BOOLEAN_VALUE, + defer: HAS_BOOLEAN_VALUE, + dir: null, + disabled: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE, + download: HAS_OVERLOADED_BOOLEAN_VALUE, + draggable: null, + encType: null, + form: MUST_USE_ATTRIBUTE, + formAction: MUST_USE_ATTRIBUTE, + formEncType: MUST_USE_ATTRIBUTE, + formMethod: MUST_USE_ATTRIBUTE, + formNoValidate: HAS_BOOLEAN_VALUE, + formTarget: MUST_USE_ATTRIBUTE, + frameBorder: MUST_USE_ATTRIBUTE, + headers: null, + height: MUST_USE_ATTRIBUTE, + hidden: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE, + high: null, + href: null, + hrefLang: null, + htmlFor: null, + httpEquiv: null, + icon: null, + id: MUST_USE_PROPERTY, + inputMode: MUST_USE_ATTRIBUTE, + integrity: null, + is: MUST_USE_ATTRIBUTE, + keyParams: MUST_USE_ATTRIBUTE, + keyType: MUST_USE_ATTRIBUTE, + kind: null, + label: null, + lang: null, + list: MUST_USE_ATTRIBUTE, + loop: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE, + low: null, + manifest: MUST_USE_ATTRIBUTE, + marginHeight: null, + marginWidth: null, + max: null, + maxLength: MUST_USE_ATTRIBUTE, + media: MUST_USE_ATTRIBUTE, + mediaGroup: null, + method: null, + min: null, + minLength: MUST_USE_ATTRIBUTE, + multiple: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE, + muted: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE, + name: null, + nonce: MUST_USE_ATTRIBUTE, + noValidate: HAS_BOOLEAN_VALUE, + open: HAS_BOOLEAN_VALUE, + optimum: null, + pattern: null, + placeholder: null, + poster: null, + preload: null, + radioGroup: null, + readOnly: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE, + rel: null, + required: HAS_BOOLEAN_VALUE, + reversed: HAS_BOOLEAN_VALUE, + role: MUST_USE_ATTRIBUTE, + rows: MUST_USE_ATTRIBUTE | HAS_POSITIVE_NUMERIC_VALUE, + rowSpan: null, + sandbox: null, + scope: null, + scoped: HAS_BOOLEAN_VALUE, + scrolling: null, + seamless: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE, + selected: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE, + shape: null, + size: MUST_USE_ATTRIBUTE | HAS_POSITIVE_NUMERIC_VALUE, + sizes: MUST_USE_ATTRIBUTE, + span: HAS_POSITIVE_NUMERIC_VALUE, + spellCheck: null, + src: null, + srcDoc: MUST_USE_PROPERTY, + srcLang: null, + srcSet: MUST_USE_ATTRIBUTE, + start: HAS_NUMERIC_VALUE, + step: null, + style: null, + summary: null, + tabIndex: null, + target: null, + title: null, + type: null, + useMap: null, + value: MUST_USE_PROPERTY | HAS_SIDE_EFFECTS, + width: MUST_USE_ATTRIBUTE, + wmode: MUST_USE_ATTRIBUTE, + wrap: null, + + /** + * RDFa Properties + */ + about: MUST_USE_ATTRIBUTE, + datatype: MUST_USE_ATTRIBUTE, + inlist: MUST_USE_ATTRIBUTE, + prefix: MUST_USE_ATTRIBUTE, + // property is also supported for OpenGraph in meta tags. + property: MUST_USE_ATTRIBUTE, + resource: MUST_USE_ATTRIBUTE, + 'typeof': MUST_USE_ATTRIBUTE, + vocab: MUST_USE_ATTRIBUTE, + + /** + * Non-standard Properties + */ + // autoCapitalize and autoCorrect are supported in Mobile Safari for + // keyboard hints. + autoCapitalize: null, + autoCorrect: null, + // autoSave allows WebKit/Blink to persist values of input fields on page reloads + autoSave: null, + // color is for Safari mask-icon link + color: null, + // itemProp, itemScope, itemType are for + // Microdata support. See http://schema.org/docs/gs.html + itemProp: MUST_USE_ATTRIBUTE, + itemScope: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE, + itemType: MUST_USE_ATTRIBUTE, + // itemID and itemRef are for Microdata support as well but + // only specified in the the WHATWG spec document. See + // https://html.spec.whatwg.org/multipage/microdata.html#microdata-dom-api + itemID: MUST_USE_ATTRIBUTE, + itemRef: MUST_USE_ATTRIBUTE, + // results show looking glass icon and recent searches on input + // search fields in WebKit/Blink + results: null, + // IE-only attribute that specifies security restrictions on an iframe + // as an alternative to the sandbox attribute on IE<10 + security: MUST_USE_ATTRIBUTE, + // IE-only attribute that controls focus behavior + unselectable: MUST_USE_ATTRIBUTE + }, + DOMAttributeNames: { + acceptCharset: 'accept-charset', + className: 'class', + htmlFor: 'for', + httpEquiv: 'http-equiv' + }, + DOMPropertyNames: { + autoCapitalize: 'autocapitalize', + autoComplete: 'autocomplete', + autoCorrect: 'autocorrect', + autoFocus: 'autofocus', + autoPlay: 'autoplay', + autoSave: 'autosave', + // `encoding` is equivalent to `enctype`, IE8 lacks an `enctype` setter. + // http://www.w3.org/TR/html5/forms.html#dom-fs-encoding + encType: 'encoding', + hrefLang: 'hreflang', + radioGroup: 'radiogroup', + spellCheck: 'spellcheck', + srcDoc: 'srcdoc', + srcSet: 'srcset' + } + }; + + module.exports = HTMLDOMPropertyConfig; + +/***/ }, +/* 89 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactBrowserComponentMixin + */ + + 'use strict'; + + var ReactInstanceMap = __webpack_require__(46); + + var findDOMNode = __webpack_require__(90); + var warning = __webpack_require__(24); + + var didWarnKey = '_getDOMNodeDidWarn'; + + var ReactBrowserComponentMixin = { + /** + * Returns the DOM node rendered by this component. + * + * @return {DOMElement} The root node of this component. + * @final + * @protected + */ + getDOMNode: function () { + process.env.NODE_ENV !== 'production' ? warning(this.constructor[didWarnKey], '%s.getDOMNode(...) is deprecated. Please use ' + 'ReactDOM.findDOMNode(instance) instead.', ReactInstanceMap.get(this).getName() || this.tagName || 'Unknown') : undefined; + this.constructor[didWarnKey] = true; + return findDOMNode(this); + } + }; + + module.exports = ReactBrowserComponentMixin; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 90 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule findDOMNode + * @typechecks static-only + */ + + 'use strict'; + + var ReactCurrentOwner = __webpack_require__(4); + var ReactInstanceMap = __webpack_require__(46); + var ReactMount = __webpack_require__(27); + + var invariant = __webpack_require__(12); + var warning = __webpack_require__(24); + + /** + * Returns the DOM node rendered by this element. + * + * @param {ReactComponent|DOMElement} componentOrElement + * @return {?DOMElement} The root node of this element. + */ + function findDOMNode(componentOrElement) { + if (process.env.NODE_ENV !== 'production') { + var owner = ReactCurrentOwner.current; + if (owner !== null) { + process.env.NODE_ENV !== 'production' ? warning(owner._warnedAboutRefsInRender, '%s is accessing getDOMNode or findDOMNode inside its render(). ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', owner.getName() || 'A component') : undefined; + owner._warnedAboutRefsInRender = true; + } + } + if (componentOrElement == null) { + return null; + } + if (componentOrElement.nodeType === 1) { + return componentOrElement; + } + if (ReactInstanceMap.has(componentOrElement)) { + return ReactMount.getNodeFromInstance(componentOrElement); + } + !(componentOrElement.render == null || typeof componentOrElement.render !== 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'findDOMNode was called on an unmounted component.') : invariant(false) : undefined; + true ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Element appears to be neither ReactComponent nor DOMNode (keys: %s)', Object.keys(componentOrElement)) : invariant(false) : undefined; + } + + module.exports = findDOMNode; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 91 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactDefaultBatchingStrategy + */ + + 'use strict'; + + var ReactUpdates = __webpack_require__(53); + var Transaction = __webpack_require__(56); + + var assign = __webpack_require__(38); + var emptyFunction = __webpack_require__(14); + + var RESET_BATCHED_UPDATES = { + initialize: emptyFunction, + close: function () { + ReactDefaultBatchingStrategy.isBatchingUpdates = false; + } + }; + + var FLUSH_BATCHED_UPDATES = { + initialize: emptyFunction, + close: ReactUpdates.flushBatchedUpdates.bind(ReactUpdates) + }; + + var TRANSACTION_WRAPPERS = [FLUSH_BATCHED_UPDATES, RESET_BATCHED_UPDATES]; + + function ReactDefaultBatchingStrategyTransaction() { + this.reinitializeTransaction(); + } + + assign(ReactDefaultBatchingStrategyTransaction.prototype, Transaction.Mixin, { + getTransactionWrappers: function () { + return TRANSACTION_WRAPPERS; + } + }); + + var transaction = new ReactDefaultBatchingStrategyTransaction(); + + var ReactDefaultBatchingStrategy = { + isBatchingUpdates: false, + + /** + * Call the provided function in a context within which calls to `setState` + * and friends are batched such that components aren't updated unnecessarily. + */ + batchedUpdates: function (callback, a, b, c, d, e) { + var alreadyBatchingUpdates = ReactDefaultBatchingStrategy.isBatchingUpdates; + + ReactDefaultBatchingStrategy.isBatchingUpdates = true; + + // The code is written this way to avoid extra allocations + if (alreadyBatchingUpdates) { + callback(a, b, c, d, e); + } else { + transaction.perform(callback, null, a, b, c, d, e); + } + } + }; + + module.exports = ReactDefaultBatchingStrategy; + +/***/ }, +/* 92 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactDOMComponent + * @typechecks static-only + */ + + /* global hasOwnProperty:true */ + + 'use strict'; + + var AutoFocusUtils = __webpack_require__(93); + var CSSPropertyOperations = __webpack_require__(95); + var DOMProperty = __webpack_require__(22); + var DOMPropertyOperations = __webpack_require__(21); + var EventConstants = __webpack_require__(29); + var ReactBrowserEventEmitter = __webpack_require__(28); + var ReactComponentBrowserEnvironment = __webpack_require__(25); + var ReactDOMButton = __webpack_require__(103); + var ReactDOMInput = __webpack_require__(104); + var ReactDOMOption = __webpack_require__(108); + var ReactDOMSelect = __webpack_require__(111); + var ReactDOMTextarea = __webpack_require__(112); + var ReactMount = __webpack_require__(27); + var ReactMultiChild = __webpack_require__(113); + var ReactPerf = __webpack_require__(17); + var ReactUpdateQueue = __webpack_require__(52); + + var assign = __webpack_require__(38); + var canDefineProperty = __webpack_require__(42); + var escapeTextContentForBrowser = __webpack_require__(20); + var invariant = __webpack_require__(12); + var isEventSupported = __webpack_require__(39); + var keyOf = __webpack_require__(78); + var setInnerHTML = __webpack_require__(18); + var setTextContent = __webpack_require__(19); + var shallowEqual = __webpack_require__(116); + var validateDOMNesting = __webpack_require__(69); + var warning = __webpack_require__(24); + + var deleteListener = ReactBrowserEventEmitter.deleteListener; + var listenTo = ReactBrowserEventEmitter.listenTo; + var registrationNameModules = ReactBrowserEventEmitter.registrationNameModules; + + // For quickly matching children type, to test if can be treated as content. + var CONTENT_TYPES = { 'string': true, 'number': true }; + + var CHILDREN = keyOf({ children: null }); + var STYLE = keyOf({ style: null }); + var HTML = keyOf({ __html: null }); + + var ELEMENT_NODE_TYPE = 1; + + function getDeclarationErrorAddendum(internalInstance) { + if (internalInstance) { + var owner = internalInstance._currentElement._owner || null; + if (owner) { + var name = owner.getName(); + if (name) { + return ' This DOM node was rendered by `' + name + '`.'; + } + } + } + return ''; + } + + var legacyPropsDescriptor; + if (process.env.NODE_ENV !== 'production') { + legacyPropsDescriptor = { + props: { + enumerable: false, + get: function () { + var component = this._reactInternalComponent; + process.env.NODE_ENV !== 'production' ? warning(false, 'ReactDOMComponent: Do not access .props of a DOM node; instead, ' + 'recreate the props as `render` did originally or read the DOM ' + 'properties/attributes directly from this node (e.g., ' + 'this.refs.box.className).%s', getDeclarationErrorAddendum(component)) : undefined; + return component._currentElement.props; + } + } + }; + } + + function legacyGetDOMNode() { + if (process.env.NODE_ENV !== 'production') { + var component = this._reactInternalComponent; + process.env.NODE_ENV !== 'production' ? warning(false, 'ReactDOMComponent: Do not access .getDOMNode() of a DOM node; ' + 'instead, use the node directly.%s', getDeclarationErrorAddendum(component)) : undefined; + } + return this; + } + + function legacyIsMounted() { + var component = this._reactInternalComponent; + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(false, 'ReactDOMComponent: Do not access .isMounted() of a DOM node.%s', getDeclarationErrorAddendum(component)) : undefined; + } + return !!component; + } + + function legacySetStateEtc() { + if (process.env.NODE_ENV !== 'production') { + var component = this._reactInternalComponent; + process.env.NODE_ENV !== 'production' ? warning(false, 'ReactDOMComponent: Do not access .setState(), .replaceState(), or ' + '.forceUpdate() of a DOM node. This is a no-op.%s', getDeclarationErrorAddendum(component)) : undefined; + } + } + + function legacySetProps(partialProps, callback) { + var component = this._reactInternalComponent; + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(false, 'ReactDOMComponent: Do not access .setProps() of a DOM node. ' + 'Instead, call ReactDOM.render again at the top level.%s', getDeclarationErrorAddendum(component)) : undefined; + } + if (!component) { + return; + } + ReactUpdateQueue.enqueueSetPropsInternal(component, partialProps); + if (callback) { + ReactUpdateQueue.enqueueCallbackInternal(component, callback); + } + } + + function legacyReplaceProps(partialProps, callback) { + var component = this._reactInternalComponent; + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(false, 'ReactDOMComponent: Do not access .replaceProps() of a DOM node. ' + 'Instead, call ReactDOM.render again at the top level.%s', getDeclarationErrorAddendum(component)) : undefined; + } + if (!component) { + return; + } + ReactUpdateQueue.enqueueReplacePropsInternal(component, partialProps); + if (callback) { + ReactUpdateQueue.enqueueCallbackInternal(component, callback); + } + } + + function friendlyStringify(obj) { + if (typeof obj === 'object') { + if (Array.isArray(obj)) { + return '[' + obj.map(friendlyStringify).join(', ') + ']'; + } else { + var pairs = []; + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + var keyEscaped = /^[a-z$_][\w$_]*$/i.test(key) ? key : JSON.stringify(key); + pairs.push(keyEscaped + ': ' + friendlyStringify(obj[key])); + } + } + return '{' + pairs.join(', ') + '}'; + } + } else if (typeof obj === 'string') { + return JSON.stringify(obj); + } else if (typeof obj === 'function') { + return '[function object]'; + } + // Differs from JSON.stringify in that undefined becauses undefined and that + // inf and nan don't become null + return String(obj); + } + + var styleMutationWarning = {}; + + function checkAndWarnForMutatedStyle(style1, style2, component) { + if (style1 == null || style2 == null) { + return; + } + if (shallowEqual(style1, style2)) { + return; + } + + var componentName = component._tag; + var owner = component._currentElement._owner; + var ownerName; + if (owner) { + ownerName = owner.getName(); + } + + var hash = ownerName + '|' + componentName; + + if (styleMutationWarning.hasOwnProperty(hash)) { + return; + } + + styleMutationWarning[hash] = true; + + process.env.NODE_ENV !== 'production' ? warning(false, '`%s` was passed a style object that has previously been mutated. ' + 'Mutating `style` is deprecated. Consider cloning it beforehand. Check ' + 'the `render` %s. Previous style: %s. Mutated style: %s.', componentName, owner ? 'of `' + ownerName + '`' : 'using <' + componentName + '>', friendlyStringify(style1), friendlyStringify(style2)) : undefined; + } + + /** + * @param {object} component + * @param {?object} props + */ + function assertValidProps(component, props) { + if (!props) { + return; + } + // Note the use of `==` which checks for null or undefined. + if (process.env.NODE_ENV !== 'production') { + if (voidElementTags[component._tag]) { + process.env.NODE_ENV !== 'production' ? warning(props.children == null && props.dangerouslySetInnerHTML == null, '%s is a void element tag and must not have `children` or ' + 'use `props.dangerouslySetInnerHTML`.%s', component._tag, component._currentElement._owner ? ' Check the render method of ' + component._currentElement._owner.getName() + '.' : '') : undefined; + } + } + if (props.dangerouslySetInnerHTML != null) { + !(props.children == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Can only set one of `children` or `props.dangerouslySetInnerHTML`.') : invariant(false) : undefined; + !(typeof props.dangerouslySetInnerHTML === 'object' && HTML in props.dangerouslySetInnerHTML) ? process.env.NODE_ENV !== 'production' ? invariant(false, '`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. ' + 'Please visit https://fb.me/react-invariant-dangerously-set-inner-html ' + 'for more information.') : invariant(false) : undefined; + } + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(props.innerHTML == null, 'Directly setting property `innerHTML` is not permitted. ' + 'For more information, lookup documentation on `dangerouslySetInnerHTML`.') : undefined; + process.env.NODE_ENV !== 'production' ? warning(!props.contentEditable || props.children == null, 'A component is `contentEditable` and contains `children` managed by ' + 'React. It is now your responsibility to guarantee that none of ' + 'those nodes are unexpectedly modified or duplicated. This is ' + 'probably not intentional.') : undefined; + } + !(props.style == null || typeof props.style === 'object') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'The `style` prop expects a mapping from style properties to values, ' + 'not a string. For example, style={{marginRight: spacing + \'em\'}} when ' + 'using JSX.%s', getDeclarationErrorAddendum(component)) : invariant(false) : undefined; + } + + function enqueuePutListener(id, registrationName, listener, transaction) { + if (process.env.NODE_ENV !== 'production') { + // IE8 has no API for event capturing and the `onScroll` event doesn't + // bubble. + process.env.NODE_ENV !== 'production' ? warning(registrationName !== 'onScroll' || isEventSupported('scroll', true), 'This browser doesn\'t support the `onScroll` event') : undefined; + } + var container = ReactMount.findReactContainerForID(id); + if (container) { + var doc = container.nodeType === ELEMENT_NODE_TYPE ? container.ownerDocument : container; + listenTo(registrationName, doc); + } + transaction.getReactMountReady().enqueue(putListener, { + id: id, + registrationName: registrationName, + listener: listener + }); + } + + function putListener() { + var listenerToPut = this; + ReactBrowserEventEmitter.putListener(listenerToPut.id, listenerToPut.registrationName, listenerToPut.listener); + } + + // There are so many media events, it makes sense to just + // maintain a list rather than create a `trapBubbledEvent` for each + var mediaEvents = { + topAbort: 'abort', + topCanPlay: 'canplay', + topCanPlayThrough: 'canplaythrough', + topDurationChange: 'durationchange', + topEmptied: 'emptied', + topEncrypted: 'encrypted', + topEnded: 'ended', + topError: 'error', + topLoadedData: 'loadeddata', + topLoadedMetadata: 'loadedmetadata', + topLoadStart: 'loadstart', + topPause: 'pause', + topPlay: 'play', + topPlaying: 'playing', + topProgress: 'progress', + topRateChange: 'ratechange', + topSeeked: 'seeked', + topSeeking: 'seeking', + topStalled: 'stalled', + topSuspend: 'suspend', + topTimeUpdate: 'timeupdate', + topVolumeChange: 'volumechange', + topWaiting: 'waiting' + }; + + function trapBubbledEventsLocal() { + var inst = this; + // If a component renders to null or if another component fatals and causes + // the state of the tree to be corrupted, `node` here can be null. + !inst._rootNodeID ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Must be mounted to trap events') : invariant(false) : undefined; + var node = ReactMount.getNode(inst._rootNodeID); + !node ? process.env.NODE_ENV !== 'production' ? invariant(false, 'trapBubbledEvent(...): Requires node to be rendered.') : invariant(false) : undefined; + + switch (inst._tag) { + case 'iframe': + inst._wrapperState.listeners = [ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topLoad, 'load', node)]; + break; + case 'video': + case 'audio': + + inst._wrapperState.listeners = []; + // create listener for each media event + for (var event in mediaEvents) { + if (mediaEvents.hasOwnProperty(event)) { + inst._wrapperState.listeners.push(ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes[event], mediaEvents[event], node)); + } + } + + break; + case 'img': + inst._wrapperState.listeners = [ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topError, 'error', node), ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topLoad, 'load', node)]; + break; + case 'form': + inst._wrapperState.listeners = [ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topReset, 'reset', node), ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topSubmit, 'submit', node)]; + break; + } + } + + function mountReadyInputWrapper() { + ReactDOMInput.mountReadyWrapper(this); + } + + function postUpdateSelectWrapper() { + ReactDOMSelect.postUpdateWrapper(this); + } + + // For HTML, certain tags should omit their close tag. We keep a whitelist for + // those special cased tags. + + var omittedCloseTags = { + 'area': true, + 'base': true, + 'br': true, + 'col': true, + 'embed': true, + 'hr': true, + 'img': true, + 'input': true, + 'keygen': true, + 'link': true, + 'meta': true, + 'param': true, + 'source': true, + 'track': true, + 'wbr': true + }; + + // NOTE: menuitem's close tag should be omitted, but that causes problems. + var newlineEatingTags = { + 'listing': true, + 'pre': true, + 'textarea': true + }; + + // For HTML, certain tags cannot have children. This has the same purpose as + // `omittedCloseTags` except that `menuitem` should still have its closing tag. + + var voidElementTags = assign({ + 'menuitem': true + }, omittedCloseTags); + + // We accept any tag to be rendered but since this gets injected into arbitrary + // HTML, we want to make sure that it's a safe tag. + // http://www.w3.org/TR/REC-xml/#NT-Name + + var VALID_TAG_REGEX = /^[a-zA-Z][a-zA-Z:_\.\-\d]*$/; // Simplified subset + var validatedTagCache = {}; + var hasOwnProperty = ({}).hasOwnProperty; + + function validateDangerousTag(tag) { + if (!hasOwnProperty.call(validatedTagCache, tag)) { + !VALID_TAG_REGEX.test(tag) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Invalid tag: %s', tag) : invariant(false) : undefined; + validatedTagCache[tag] = true; + } + } + + function processChildContextDev(context, inst) { + // Pass down our tag name to child components for validation purposes + context = assign({}, context); + var info = context[validateDOMNesting.ancestorInfoContextKey]; + context[validateDOMNesting.ancestorInfoContextKey] = validateDOMNesting.updatedAncestorInfo(info, inst._tag, inst); + return context; + } + + function isCustomComponent(tagName, props) { + return tagName.indexOf('-') >= 0 || props.is != null; + } + + /** + * Creates a new React class that is idempotent and capable of containing other + * React components. It accepts event listeners and DOM properties that are + * valid according to `DOMProperty`. + * + * - Event listeners: `onClick`, `onMouseDown`, etc. + * - DOM properties: `className`, `name`, `title`, etc. + * + * The `style` property functions differently from the DOM API. It accepts an + * object mapping of style properties to values. + * + * @constructor ReactDOMComponent + * @extends ReactMultiChild + */ + function ReactDOMComponent(tag) { + validateDangerousTag(tag); + this._tag = tag.toLowerCase(); + this._renderedChildren = null; + this._previousStyle = null; + this._previousStyleCopy = null; + this._rootNodeID = null; + this._wrapperState = null; + this._topLevelWrapper = null; + this._nodeWithLegacyProperties = null; + if (process.env.NODE_ENV !== 'production') { + this._unprocessedContextDev = null; + this._processedContextDev = null; + } + } + + ReactDOMComponent.displayName = 'ReactDOMComponent'; + + ReactDOMComponent.Mixin = { + + construct: function (element) { + this._currentElement = element; + }, + + /** + * Generates root tag markup then recurses. This method has side effects and + * is not idempotent. + * + * @internal + * @param {string} rootID The root DOM ID for this node. + * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction + * @param {object} context + * @return {string} The computed markup. + */ + mountComponent: function (rootID, transaction, context) { + this._rootNodeID = rootID; + + var props = this._currentElement.props; + + switch (this._tag) { + case 'iframe': + case 'img': + case 'form': + case 'video': + case 'audio': + this._wrapperState = { + listeners: null + }; + transaction.getReactMountReady().enqueue(trapBubbledEventsLocal, this); + break; + case 'button': + props = ReactDOMButton.getNativeProps(this, props, context); + break; + case 'input': + ReactDOMInput.mountWrapper(this, props, context); + props = ReactDOMInput.getNativeProps(this, props, context); + break; + case 'option': + ReactDOMOption.mountWrapper(this, props, context); + props = ReactDOMOption.getNativeProps(this, props, context); + break; + case 'select': + ReactDOMSelect.mountWrapper(this, props, context); + props = ReactDOMSelect.getNativeProps(this, props, context); + context = ReactDOMSelect.processChildContext(this, props, context); + break; + case 'textarea': + ReactDOMTextarea.mountWrapper(this, props, context); + props = ReactDOMTextarea.getNativeProps(this, props, context); + break; + } + + assertValidProps(this, props); + if (process.env.NODE_ENV !== 'production') { + if (context[validateDOMNesting.ancestorInfoContextKey]) { + validateDOMNesting(this._tag, this, context[validateDOMNesting.ancestorInfoContextKey]); + } + } + + if (process.env.NODE_ENV !== 'production') { + this._unprocessedContextDev = context; + this._processedContextDev = processChildContextDev(context, this); + context = this._processedContextDev; + } + + var mountImage; + if (transaction.useCreateElement) { + var ownerDocument = context[ReactMount.ownerDocumentContextKey]; + var el = ownerDocument.createElement(this._currentElement.type); + DOMPropertyOperations.setAttributeForID(el, this._rootNodeID); + // Populate node cache + ReactMount.getID(el); + this._updateDOMProperties({}, props, transaction, el); + this._createInitialChildren(transaction, props, context, el); + mountImage = el; + } else { + var tagOpen = this._createOpenTagMarkupAndPutListeners(transaction, props); + var tagContent = this._createContentMarkup(transaction, props, context); + if (!tagContent && omittedCloseTags[this._tag]) { + mountImage = tagOpen + '/>'; + } else { + mountImage = tagOpen + '>' + tagContent + '</' + this._currentElement.type + '>'; + } + } + + switch (this._tag) { + case 'input': + transaction.getReactMountReady().enqueue(mountReadyInputWrapper, this); + // falls through + case 'button': + case 'select': + case 'textarea': + if (props.autoFocus) { + transaction.getReactMountReady().enqueue(AutoFocusUtils.focusDOMComponent, this); + } + break; + } + + return mountImage; + }, + + /** + * Creates markup for the open tag and all attributes. + * + * This method has side effects because events get registered. + * + * Iterating over object properties is faster than iterating over arrays. + * @see http://jsperf.com/obj-vs-arr-iteration + * + * @private + * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction + * @param {object} props + * @return {string} Markup of opening tag. + */ + _createOpenTagMarkupAndPutListeners: function (transaction, props) { + var ret = '<' + this._currentElement.type; + + for (var propKey in props) { + if (!props.hasOwnProperty(propKey)) { + continue; + } + var propValue = props[propKey]; + if (propValue == null) { + continue; + } + if (registrationNameModules.hasOwnProperty(propKey)) { + if (propValue) { + enqueuePutListener(this._rootNodeID, propKey, propValue, transaction); + } + } else { + if (propKey === STYLE) { + if (propValue) { + if (process.env.NODE_ENV !== 'production') { + // See `_updateDOMProperties`. style block + this._previousStyle = propValue; + } + propValue = this._previousStyleCopy = assign({}, props.style); + } + propValue = CSSPropertyOperations.createMarkupForStyles(propValue); + } + var markup = null; + if (this._tag != null && isCustomComponent(this._tag, props)) { + if (propKey !== CHILDREN) { + markup = DOMPropertyOperations.createMarkupForCustomAttribute(propKey, propValue); + } + } else { + markup = DOMPropertyOperations.createMarkupForProperty(propKey, propValue); + } + if (markup) { + ret += ' ' + markup; + } + } + } + + // For static pages, no need to put React ID and checksum. Saves lots of + // bytes. + if (transaction.renderToStaticMarkup) { + return ret; + } + + var markupForID = DOMPropertyOperations.createMarkupForID(this._rootNodeID); + return ret + ' ' + markupForID; + }, + + /** + * Creates markup for the content between the tags. + * + * @private + * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction + * @param {object} props + * @param {object} context + * @return {string} Content markup. + */ + _createContentMarkup: function (transaction, props, context) { + var ret = ''; + + // Intentional use of != to avoid catching zero/false. + var innerHTML = props.dangerouslySetInnerHTML; + if (innerHTML != null) { + if (innerHTML.__html != null) { + ret = innerHTML.__html; + } + } else { + var contentToUse = CONTENT_TYPES[typeof props.children] ? props.children : null; + var childrenToUse = contentToUse != null ? null : props.children; + if (contentToUse != null) { + // TODO: Validate that text is allowed as a child of this node + ret = escapeTextContentForBrowser(contentToUse); + } else if (childrenToUse != null) { + var mountImages = this.mountChildren(childrenToUse, transaction, context); + ret = mountImages.join(''); + } + } + if (newlineEatingTags[this._tag] && ret.charAt(0) === '\n') { + // text/html ignores the first character in these tags if it's a newline + // Prefer to break application/xml over text/html (for now) by adding + // a newline specifically to get eaten by the parser. (Alternately for + // textareas, replacing "^\n" with "\r\n" doesn't get eaten, and the first + // \r is normalized out by HTMLTextAreaElement#value.) + // See: <http://www.w3.org/TR/html-polyglot/#newlines-in-textarea-and-pre> + // See: <http://www.w3.org/TR/html5/syntax.html#element-restrictions> + // See: <http://www.w3.org/TR/html5/syntax.html#newlines> + // See: Parsing of "textarea" "listing" and "pre" elements + // from <http://www.w3.org/TR/html5/syntax.html#parsing-main-inbody> + return '\n' + ret; + } else { + return ret; + } + }, + + _createInitialChildren: function (transaction, props, context, el) { + // Intentional use of != to avoid catching zero/false. + var innerHTML = props.dangerouslySetInnerHTML; + if (innerHTML != null) { + if (innerHTML.__html != null) { + setInnerHTML(el, innerHTML.__html); + } + } else { + var contentToUse = CONTENT_TYPES[typeof props.children] ? props.children : null; + var childrenToUse = contentToUse != null ? null : props.children; + if (contentToUse != null) { + // TODO: Validate that text is allowed as a child of this node + setTextContent(el, contentToUse); + } else if (childrenToUse != null) { + var mountImages = this.mountChildren(childrenToUse, transaction, context); + for (var i = 0; i < mountImages.length; i++) { + el.appendChild(mountImages[i]); + } + } + } + }, + + /** + * Receives a next element and updates the component. + * + * @internal + * @param {ReactElement} nextElement + * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction + * @param {object} context + */ + receiveComponent: function (nextElement, transaction, context) { + var prevElement = this._currentElement; + this._currentElement = nextElement; + this.updateComponent(transaction, prevElement, nextElement, context); + }, + + /** + * Updates a native DOM component after it has already been allocated and + * attached to the DOM. Reconciles the root DOM node, then recurses. + * + * @param {ReactReconcileTransaction} transaction + * @param {ReactElement} prevElement + * @param {ReactElement} nextElement + * @internal + * @overridable + */ + updateComponent: function (transaction, prevElement, nextElement, context) { + var lastProps = prevElement.props; + var nextProps = this._currentElement.props; + + switch (this._tag) { + case 'button': + lastProps = ReactDOMButton.getNativeProps(this, lastProps); + nextProps = ReactDOMButton.getNativeProps(this, nextProps); + break; + case 'input': + ReactDOMInput.updateWrapper(this); + lastProps = ReactDOMInput.getNativeProps(this, lastProps); + nextProps = ReactDOMInput.getNativeProps(this, nextProps); + break; + case 'option': + lastProps = ReactDOMOption.getNativeProps(this, lastProps); + nextProps = ReactDOMOption.getNativeProps(this, nextProps); + break; + case 'select': + lastProps = ReactDOMSelect.getNativeProps(this, lastProps); + nextProps = ReactDOMSelect.getNativeProps(this, nextProps); + break; + case 'textarea': + ReactDOMTextarea.updateWrapper(this); + lastProps = ReactDOMTextarea.getNativeProps(this, lastProps); + nextProps = ReactDOMTextarea.getNativeProps(this, nextProps); + break; + } + + if (process.env.NODE_ENV !== 'production') { + // If the context is reference-equal to the old one, pass down the same + // processed object so the update bailout in ReactReconciler behaves + // correctly (and identically in dev and prod). See #5005. + if (this._unprocessedContextDev !== context) { + this._unprocessedContextDev = context; + this._processedContextDev = processChildContextDev(context, this); + } + context = this._processedContextDev; + } + + assertValidProps(this, nextProps); + this._updateDOMProperties(lastProps, nextProps, transaction, null); + this._updateDOMChildren(lastProps, nextProps, transaction, context); + + if (!canDefineProperty && this._nodeWithLegacyProperties) { + this._nodeWithLegacyProperties.props = nextProps; + } + + if (this._tag === 'select') { + // <select> value update needs to occur after <option> children + // reconciliation + transaction.getReactMountReady().enqueue(postUpdateSelectWrapper, this); + } + }, + + /** + * Reconciles the properties by detecting differences in property values and + * updating the DOM as necessary. This function is probably the single most + * critical path for performance optimization. + * + * TODO: Benchmark whether checking for changed values in memory actually + * improves performance (especially statically positioned elements). + * TODO: Benchmark the effects of putting this at the top since 99% of props + * do not change for a given reconciliation. + * TODO: Benchmark areas that can be improved with caching. + * + * @private + * @param {object} lastProps + * @param {object} nextProps + * @param {ReactReconcileTransaction} transaction + * @param {?DOMElement} node + */ + _updateDOMProperties: function (lastProps, nextProps, transaction, node) { + var propKey; + var styleName; + var styleUpdates; + for (propKey in lastProps) { + if (nextProps.hasOwnProperty(propKey) || !lastProps.hasOwnProperty(propKey)) { + continue; + } + if (propKey === STYLE) { + var lastStyle = this._previousStyleCopy; + for (styleName in lastStyle) { + if (lastStyle.hasOwnProperty(styleName)) { + styleUpdates = styleUpdates || {}; + styleUpdates[styleName] = ''; + } + } + this._previousStyleCopy = null; + } else if (registrationNameModules.hasOwnProperty(propKey)) { + if (lastProps[propKey]) { + // Only call deleteListener if there was a listener previously or + // else willDeleteListener gets called when there wasn't actually a + // listener (e.g., onClick={null}) + deleteListener(this._rootNodeID, propKey); + } + } else if (DOMProperty.properties[propKey] || DOMProperty.isCustomAttribute(propKey)) { + if (!node) { + node = ReactMount.getNode(this._rootNodeID); + } + DOMPropertyOperations.deleteValueForProperty(node, propKey); + } + } + for (propKey in nextProps) { + var nextProp = nextProps[propKey]; + var lastProp = propKey === STYLE ? this._previousStyleCopy : lastProps[propKey]; + if (!nextProps.hasOwnProperty(propKey) || nextProp === lastProp) { + continue; + } + if (propKey === STYLE) { + if (nextProp) { + if (process.env.NODE_ENV !== 'production') { + checkAndWarnForMutatedStyle(this._previousStyleCopy, this._previousStyle, this); + this._previousStyle = nextProp; + } + nextProp = this._previousStyleCopy = assign({}, nextProp); + } else { + this._previousStyleCopy = null; + } + if (lastProp) { + // Unset styles on `lastProp` but not on `nextProp`. + for (styleName in lastProp) { + if (lastProp.hasOwnProperty(styleName) && (!nextProp || !nextProp.hasOwnProperty(styleName))) { + styleUpdates = styleUpdates || {}; + styleUpdates[styleName] = ''; + } + } + // Update styles that changed since `lastProp`. + for (styleName in nextProp) { + if (nextProp.hasOwnProperty(styleName) && lastProp[styleName] !== nextProp[styleName]) { + styleUpdates = styleUpdates || {}; + styleUpdates[styleName] = nextProp[styleName]; + } + } + } else { + // Relies on `updateStylesByID` not mutating `styleUpdates`. + styleUpdates = nextProp; + } + } else if (registrationNameModules.hasOwnProperty(propKey)) { + if (nextProp) { + enqueuePutListener(this._rootNodeID, propKey, nextProp, transaction); + } else if (lastProp) { + deleteListener(this._rootNodeID, propKey); + } + } else if (isCustomComponent(this._tag, nextProps)) { + if (!node) { + node = ReactMount.getNode(this._rootNodeID); + } + if (propKey === CHILDREN) { + nextProp = null; + } + DOMPropertyOperations.setValueForAttribute(node, propKey, nextProp); + } else if (DOMProperty.properties[propKey] || DOMProperty.isCustomAttribute(propKey)) { + if (!node) { + node = ReactMount.getNode(this._rootNodeID); + } + // If we're updating to null or undefined, we should remove the property + // from the DOM node instead of inadvertantly setting to a string. This + // brings us in line with the same behavior we have on initial render. + if (nextProp != null) { + DOMPropertyOperations.setValueForProperty(node, propKey, nextProp); + } else { + DOMPropertyOperations.deleteValueForProperty(node, propKey); + } + } + } + if (styleUpdates) { + if (!node) { + node = ReactMount.getNode(this._rootNodeID); + } + CSSPropertyOperations.setValueForStyles(node, styleUpdates); + } + }, + + /** + * Reconciles the children with the various properties that affect the + * children content. + * + * @param {object} lastProps + * @param {object} nextProps + * @param {ReactReconcileTransaction} transaction + * @param {object} context + */ + _updateDOMChildren: function (lastProps, nextProps, transaction, context) { + var lastContent = CONTENT_TYPES[typeof lastProps.children] ? lastProps.children : null; + var nextContent = CONTENT_TYPES[typeof nextProps.children] ? nextProps.children : null; + + var lastHtml = lastProps.dangerouslySetInnerHTML && lastProps.dangerouslySetInnerHTML.__html; + var nextHtml = nextProps.dangerouslySetInnerHTML && nextProps.dangerouslySetInnerHTML.__html; + + // Note the use of `!=` which checks for null or undefined. + var lastChildren = lastContent != null ? null : lastProps.children; + var nextChildren = nextContent != null ? null : nextProps.children; + + // If we're switching from children to content/html or vice versa, remove + // the old content + var lastHasContentOrHtml = lastContent != null || lastHtml != null; + var nextHasContentOrHtml = nextContent != null || nextHtml != null; + if (lastChildren != null && nextChildren == null) { + this.updateChildren(null, transaction, context); + } else if (lastHasContentOrHtml && !nextHasContentOrHtml) { + this.updateTextContent(''); + } + + if (nextContent != null) { + if (lastContent !== nextContent) { + this.updateTextContent('' + nextContent); + } + } else if (nextHtml != null) { + if (lastHtml !== nextHtml) { + this.updateMarkup('' + nextHtml); + } + } else if (nextChildren != null) { + this.updateChildren(nextChildren, transaction, context); + } + }, + + /** + * Destroys all event registrations for this instance. Does not remove from + * the DOM. That must be done by the parent. + * + * @internal + */ + unmountComponent: function () { + switch (this._tag) { + case 'iframe': + case 'img': + case 'form': + case 'video': + case 'audio': + var listeners = this._wrapperState.listeners; + if (listeners) { + for (var i = 0; i < listeners.length; i++) { + listeners[i].remove(); + } + } + break; + case 'input': + ReactDOMInput.unmountWrapper(this); + break; + case 'html': + case 'head': + case 'body': + /** + * Components like <html> <head> and <body> can't be removed or added + * easily in a cross-browser way, however it's valuable to be able to + * take advantage of React's reconciliation for styling and <title> + * management. So we just document it and throw in dangerous cases. + */ + true ? process.env.NODE_ENV !== 'production' ? invariant(false, '<%s> tried to unmount. Because of cross-browser quirks it is ' + 'impossible to unmount some top-level components (eg <html>, ' + '<head>, and <body>) reliably and efficiently. To fix this, have a ' + 'single top-level component that never unmounts render these ' + 'elements.', this._tag) : invariant(false) : undefined; + break; + } + + this.unmountChildren(); + ReactBrowserEventEmitter.deleteAllListeners(this._rootNodeID); + ReactComponentBrowserEnvironment.unmountIDFromEnvironment(this._rootNodeID); + this._rootNodeID = null; + this._wrapperState = null; + if (this._nodeWithLegacyProperties) { + var node = this._nodeWithLegacyProperties; + node._reactInternalComponent = null; + this._nodeWithLegacyProperties = null; + } + }, + + getPublicInstance: function () { + if (!this._nodeWithLegacyProperties) { + var node = ReactMount.getNode(this._rootNodeID); + + node._reactInternalComponent = this; + node.getDOMNode = legacyGetDOMNode; + node.isMounted = legacyIsMounted; + node.setState = legacySetStateEtc; + node.replaceState = legacySetStateEtc; + node.forceUpdate = legacySetStateEtc; + node.setProps = legacySetProps; + node.replaceProps = legacyReplaceProps; + + if (process.env.NODE_ENV !== 'production') { + if (canDefineProperty) { + Object.defineProperties(node, legacyPropsDescriptor); + } else { + // updateComponent will update this property on subsequent renders + node.props = this._currentElement.props; + } + } else { + // updateComponent will update this property on subsequent renders + node.props = this._currentElement.props; + } + + this._nodeWithLegacyProperties = node; + } + return this._nodeWithLegacyProperties; + } + + }; + + ReactPerf.measureMethods(ReactDOMComponent, 'ReactDOMComponent', { + mountComponent: 'mountComponent', + updateComponent: 'updateComponent' + }); + + assign(ReactDOMComponent.prototype, ReactDOMComponent.Mixin, ReactMultiChild.Mixin); + + module.exports = ReactDOMComponent; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 93 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule AutoFocusUtils + * @typechecks static-only + */ + + 'use strict'; + + var ReactMount = __webpack_require__(27); + + var findDOMNode = __webpack_require__(90); + var focusNode = __webpack_require__(94); + + var Mixin = { + componentDidMount: function () { + if (this.props.autoFocus) { + focusNode(findDOMNode(this)); + } + } + }; + + var AutoFocusUtils = { + Mixin: Mixin, + + focusDOMComponent: function () { + focusNode(ReactMount.getNode(this._rootNodeID)); + } + }; + + module.exports = AutoFocusUtils; + +/***/ }, +/* 94 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule focusNode + */ + + 'use strict'; + + /** + * @param {DOMElement} node input/textarea to focus + */ + function focusNode(node) { + // IE8 can throw "Can't move focus to the control because it is invisible, + // not enabled, or of a type that does not accept the focus." for all kinds of + // reasons that are too expensive and fragile to test. + try { + node.focus(); + } catch (e) {} + } + + module.exports = focusNode; + +/***/ }, +/* 95 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule CSSPropertyOperations + * @typechecks static-only + */ + + 'use strict'; + + var CSSProperty = __webpack_require__(96); + var ExecutionEnvironment = __webpack_require__(8); + var ReactPerf = __webpack_require__(17); + + var camelizeStyleName = __webpack_require__(97); + var dangerousStyleValue = __webpack_require__(99); + var hyphenateStyleName = __webpack_require__(100); + var memoizeStringOnly = __webpack_require__(102); + var warning = __webpack_require__(24); + + var processStyleName = memoizeStringOnly(function (styleName) { + return hyphenateStyleName(styleName); + }); + + var hasShorthandPropertyBug = false; + var styleFloatAccessor = 'cssFloat'; + if (ExecutionEnvironment.canUseDOM) { + var tempStyle = document.createElement('div').style; + try { + // IE8 throws "Invalid argument." if resetting shorthand style properties. + tempStyle.font = ''; + } catch (e) { + hasShorthandPropertyBug = true; + } + // IE8 only supports accessing cssFloat (standard) as styleFloat + if (document.documentElement.style.cssFloat === undefined) { + styleFloatAccessor = 'styleFloat'; + } + } + + if (process.env.NODE_ENV !== 'production') { + // 'msTransform' is correct, but the other prefixes should be capitalized + var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/; + + // style values shouldn't contain a semicolon + var badStyleValueWithSemicolonPattern = /;\s*$/; + + var warnedStyleNames = {}; + var warnedStyleValues = {}; + + var warnHyphenatedStyleName = function (name) { + if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) { + return; + } + + warnedStyleNames[name] = true; + process.env.NODE_ENV !== 'production' ? warning(false, 'Unsupported style property %s. Did you mean %s?', name, camelizeStyleName(name)) : undefined; + }; + + var warnBadVendoredStyleName = function (name) { + if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) { + return; + } + + warnedStyleNames[name] = true; + process.env.NODE_ENV !== 'production' ? warning(false, 'Unsupported vendor-prefixed style property %s. Did you mean %s?', name, name.charAt(0).toUpperCase() + name.slice(1)) : undefined; + }; + + var warnStyleValueWithSemicolon = function (name, value) { + if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) { + return; + } + + warnedStyleValues[value] = true; + process.env.NODE_ENV !== 'production' ? warning(false, 'Style property values shouldn\'t contain a semicolon. ' + 'Try "%s: %s" instead.', name, value.replace(badStyleValueWithSemicolonPattern, '')) : undefined; + }; + + /** + * @param {string} name + * @param {*} value + */ + var warnValidStyle = function (name, value) { + if (name.indexOf('-') > -1) { + warnHyphenatedStyleName(name); + } else if (badVendoredStyleNamePattern.test(name)) { + warnBadVendoredStyleName(name); + } else if (badStyleValueWithSemicolonPattern.test(value)) { + warnStyleValueWithSemicolon(name, value); + } + }; + } + + /** + * Operations for dealing with CSS properties. + */ + var CSSPropertyOperations = { + + /** + * Serializes a mapping of style properties for use as inline styles: + * + * > createMarkupForStyles({width: '200px', height: 0}) + * "width:200px;height:0;" + * + * Undefined values are ignored so that declarative programming is easier. + * The result should be HTML-escaped before insertion into the DOM. + * + * @param {object} styles + * @return {?string} + */ + createMarkupForStyles: function (styles) { + var serialized = ''; + for (var styleName in styles) { + if (!styles.hasOwnProperty(styleName)) { + continue; + } + var styleValue = styles[styleName]; + if (process.env.NODE_ENV !== 'production') { + warnValidStyle(styleName, styleValue); + } + if (styleValue != null) { + serialized += processStyleName(styleName) + ':'; + serialized += dangerousStyleValue(styleName, styleValue) + ';'; + } + } + return serialized || null; + }, + + /** + * Sets the value for multiple styles on a node. If a value is specified as + * '' (empty string), the corresponding style property will be unset. + * + * @param {DOMElement} node + * @param {object} styles + */ + setValueForStyles: function (node, styles) { + var style = node.style; + for (var styleName in styles) { + if (!styles.hasOwnProperty(styleName)) { + continue; + } + if (process.env.NODE_ENV !== 'production') { + warnValidStyle(styleName, styles[styleName]); + } + var styleValue = dangerousStyleValue(styleName, styles[styleName]); + if (styleName === 'float') { + styleName = styleFloatAccessor; + } + if (styleValue) { + style[styleName] = styleValue; + } else { + var expansion = hasShorthandPropertyBug && CSSProperty.shorthandPropertyExpansions[styleName]; + if (expansion) { + // Shorthand property that IE8 won't like unsetting, so unset each + // component to placate it + for (var individualStyleName in expansion) { + style[individualStyleName] = ''; + } + } else { + style[styleName] = ''; + } + } + } + } + + }; + + ReactPerf.measureMethods(CSSPropertyOperations, 'CSSPropertyOperations', { + setValueForStyles: 'setValueForStyles' + }); + + module.exports = CSSPropertyOperations; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 96 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule CSSProperty + */ + + 'use strict'; + + /** + * CSS properties which accept numbers but are not in units of "px". + */ + var isUnitlessNumber = { + animationIterationCount: true, + boxFlex: true, + boxFlexGroup: true, + boxOrdinalGroup: true, + columnCount: true, + flex: true, + flexGrow: true, + flexPositive: true, + flexShrink: true, + flexNegative: true, + flexOrder: true, + fontWeight: true, + lineClamp: true, + lineHeight: true, + opacity: true, + order: true, + orphans: true, + tabSize: true, + widows: true, + zIndex: true, + zoom: true, + + // SVG-related properties + fillOpacity: true, + stopOpacity: true, + strokeDashoffset: true, + strokeOpacity: true, + strokeWidth: true + }; + + /** + * @param {string} prefix vendor-specific prefix, eg: Webkit + * @param {string} key style name, eg: transitionDuration + * @return {string} style name prefixed with `prefix`, properly camelCased, eg: + * WebkitTransitionDuration + */ + function prefixKey(prefix, key) { + return prefix + key.charAt(0).toUpperCase() + key.substring(1); + } + + /** + * Support style names that may come passed in prefixed by adding permutations + * of vendor prefixes. + */ + var prefixes = ['Webkit', 'ms', 'Moz', 'O']; + + // Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an + // infinite loop, because it iterates over the newly added props too. + Object.keys(isUnitlessNumber).forEach(function (prop) { + prefixes.forEach(function (prefix) { + isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop]; + }); + }); + + /** + * Most style properties can be unset by doing .style[prop] = '' but IE8 + * doesn't like doing that with shorthand properties so for the properties that + * IE8 breaks on, which are listed here, we instead unset each of the + * individual properties. See http://bugs.jquery.com/ticket/12385. + * The 4-value 'clock' properties like margin, padding, border-width seem to + * behave without any problems. Curiously, list-style works too without any + * special prodding. + */ + var shorthandPropertyExpansions = { + background: { + backgroundAttachment: true, + backgroundColor: true, + backgroundImage: true, + backgroundPositionX: true, + backgroundPositionY: true, + backgroundRepeat: true + }, + backgroundPosition: { + backgroundPositionX: true, + backgroundPositionY: true + }, + border: { + borderWidth: true, + borderStyle: true, + borderColor: true + }, + borderBottom: { + borderBottomWidth: true, + borderBottomStyle: true, + borderBottomColor: true + }, + borderLeft: { + borderLeftWidth: true, + borderLeftStyle: true, + borderLeftColor: true + }, + borderRight: { + borderRightWidth: true, + borderRightStyle: true, + borderRightColor: true + }, + borderTop: { + borderTopWidth: true, + borderTopStyle: true, + borderTopColor: true + }, + font: { + fontStyle: true, + fontVariant: true, + fontWeight: true, + fontSize: true, + lineHeight: true, + fontFamily: true + }, + outline: { + outlineWidth: true, + outlineStyle: true, + outlineColor: true + } + }; + + var CSSProperty = { + isUnitlessNumber: isUnitlessNumber, + shorthandPropertyExpansions: shorthandPropertyExpansions + }; + + module.exports = CSSProperty; + +/***/ }, +/* 97 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule camelizeStyleName + * @typechecks + */ + + 'use strict'; + + var camelize = __webpack_require__(98); + + var msPattern = /^-ms-/; + + /** + * Camelcases a hyphenated CSS property name, for example: + * + * > camelizeStyleName('background-color') + * < "backgroundColor" + * > camelizeStyleName('-moz-transition') + * < "MozTransition" + * > camelizeStyleName('-ms-transition') + * < "msTransition" + * + * As Andi Smith suggests + * (http://www.andismith.com/blog/2012/02/modernizr-prefixed/), an `-ms` prefix + * is converted to lowercase `ms`. + * + * @param {string} string + * @return {string} + */ + function camelizeStyleName(string) { + return camelize(string.replace(msPattern, 'ms-')); + } + + module.exports = camelizeStyleName; + +/***/ }, +/* 98 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule camelize + * @typechecks + */ + + "use strict"; + + var _hyphenPattern = /-(.)/g; + + /** + * Camelcases a hyphenated string, for example: + * + * > camelize('background-color') + * < "backgroundColor" + * + * @param {string} string + * @return {string} + */ + function camelize(string) { + return string.replace(_hyphenPattern, function (_, character) { + return character.toUpperCase(); + }); + } + + module.exports = camelize; + +/***/ }, +/* 99 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule dangerousStyleValue + * @typechecks static-only + */ + + 'use strict'; + + var CSSProperty = __webpack_require__(96); + + var isUnitlessNumber = CSSProperty.isUnitlessNumber; + + /** + * Convert a value into the proper css writable value. The style name `name` + * should be logical (no hyphens), as specified + * in `CSSProperty.isUnitlessNumber`. + * + * @param {string} name CSS property name such as `topMargin`. + * @param {*} value CSS property value such as `10px`. + * @return {string} Normalized style value with dimensions applied. + */ + function dangerousStyleValue(name, value) { + // Note that we've removed escapeTextForBrowser() calls here since the + // whole string will be escaped when the attribute is injected into + // the markup. If you provide unsafe user data here they can inject + // arbitrary CSS which may be problematic (I couldn't repro this): + // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet + // http://www.thespanner.co.uk/2007/11/26/ultimate-xss-css-injection/ + // This is not an XSS hole but instead a potential CSS injection issue + // which has lead to a greater discussion about how we're going to + // trust URLs moving forward. See #2115901 + + var isEmpty = value == null || typeof value === 'boolean' || value === ''; + if (isEmpty) { + return ''; + } + + var isNonNumeric = isNaN(value); + if (isNonNumeric || value === 0 || isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name]) { + return '' + value; // cast to string + } + + if (typeof value === 'string') { + value = value.trim(); + } + return value + 'px'; + } + + module.exports = dangerousStyleValue; + +/***/ }, +/* 100 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule hyphenateStyleName + * @typechecks + */ + + 'use strict'; + + var hyphenate = __webpack_require__(101); + + var msPattern = /^ms-/; + + /** + * Hyphenates a camelcased CSS property name, for example: + * + * > hyphenateStyleName('backgroundColor') + * < "background-color" + * > hyphenateStyleName('MozTransition') + * < "-moz-transition" + * > hyphenateStyleName('msTransition') + * < "-ms-transition" + * + * As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix + * is converted to `-ms-`. + * + * @param {string} string + * @return {string} + */ + function hyphenateStyleName(string) { + return hyphenate(string).replace(msPattern, '-ms-'); + } + + module.exports = hyphenateStyleName; + +/***/ }, +/* 101 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule hyphenate + * @typechecks + */ + + 'use strict'; + + var _uppercasePattern = /([A-Z])/g; + + /** + * Hyphenates a camelcased string, for example: + * + * > hyphenate('backgroundColor') + * < "background-color" + * + * For CSS style names, use `hyphenateStyleName` instead which works properly + * with all vendor prefixes, including `ms`. + * + * @param {string} string + * @return {string} + */ + function hyphenate(string) { + return string.replace(_uppercasePattern, '-$1').toLowerCase(); + } + + module.exports = hyphenate; + +/***/ }, +/* 102 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule memoizeStringOnly + * @typechecks static-only + */ + + 'use strict'; + + /** + * Memoizes the return value of a function that accepts one string argument. + * + * @param {function} callback + * @return {function} + */ + function memoizeStringOnly(callback) { + var cache = {}; + return function (string) { + if (!cache.hasOwnProperty(string)) { + cache[string] = callback.call(this, string); + } + return cache[string]; + }; + } + + module.exports = memoizeStringOnly; + +/***/ }, +/* 103 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactDOMButton + */ + + 'use strict'; + + var mouseListenerNames = { + onClick: true, + onDoubleClick: true, + onMouseDown: true, + onMouseMove: true, + onMouseUp: true, + + onClickCapture: true, + onDoubleClickCapture: true, + onMouseDownCapture: true, + onMouseMoveCapture: true, + onMouseUpCapture: true + }; + + /** + * Implements a <button> native component that does not receive mouse events + * when `disabled` is set. + */ + var ReactDOMButton = { + getNativeProps: function (inst, props, context) { + if (!props.disabled) { + return props; + } + + // Copy the props, except the mouse listeners + var nativeProps = {}; + for (var key in props) { + if (props.hasOwnProperty(key) && !mouseListenerNames[key]) { + nativeProps[key] = props[key]; + } + } + + return nativeProps; + } + }; + + module.exports = ReactDOMButton; + +/***/ }, +/* 104 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactDOMInput + */ + + 'use strict'; + + var ReactDOMIDOperations = __webpack_require__(26); + var LinkedValueUtils = __webpack_require__(105); + var ReactMount = __webpack_require__(27); + var ReactUpdates = __webpack_require__(53); + + var assign = __webpack_require__(38); + var invariant = __webpack_require__(12); + + var instancesByReactID = {}; + + function forceUpdateIfMounted() { + if (this._rootNodeID) { + // DOM component is still mounted; update + ReactDOMInput.updateWrapper(this); + } + } + + /** + * Implements an <input> native component that allows setting these optional + * props: `checked`, `value`, `defaultChecked`, and `defaultValue`. + * + * If `checked` or `value` are not supplied (or null/undefined), user actions + * that affect the checked state or value will trigger updates to the element. + * + * If they are supplied (and not null/undefined), the rendered element will not + * trigger updates to the element. Instead, the props must change in order for + * the rendered element to be updated. + * + * The rendered element will be initialized as unchecked (or `defaultChecked`) + * with an empty value (or `defaultValue`). + * + * @see http://www.w3.org/TR/2012/WD-html5-20121025/the-input-element.html + */ + var ReactDOMInput = { + getNativeProps: function (inst, props, context) { + var value = LinkedValueUtils.getValue(props); + var checked = LinkedValueUtils.getChecked(props); + + var nativeProps = assign({}, props, { + defaultChecked: undefined, + defaultValue: undefined, + value: value != null ? value : inst._wrapperState.initialValue, + checked: checked != null ? checked : inst._wrapperState.initialChecked, + onChange: inst._wrapperState.onChange + }); + + return nativeProps; + }, + + mountWrapper: function (inst, props) { + if (process.env.NODE_ENV !== 'production') { + LinkedValueUtils.checkPropTypes('input', props, inst._currentElement._owner); + } + + var defaultValue = props.defaultValue; + inst._wrapperState = { + initialChecked: props.defaultChecked || false, + initialValue: defaultValue != null ? defaultValue : null, + onChange: _handleChange.bind(inst) + }; + }, + + mountReadyWrapper: function (inst) { + // Can't be in mountWrapper or else server rendering leaks. + instancesByReactID[inst._rootNodeID] = inst; + }, + + unmountWrapper: function (inst) { + delete instancesByReactID[inst._rootNodeID]; + }, + + updateWrapper: function (inst) { + var props = inst._currentElement.props; + + // TODO: Shouldn't this be getChecked(props)? + var checked = props.checked; + if (checked != null) { + ReactDOMIDOperations.updatePropertyByID(inst._rootNodeID, 'checked', checked || false); + } + + var value = LinkedValueUtils.getValue(props); + if (value != null) { + // Cast `value` to a string to ensure the value is set correctly. While + // browsers typically do this as necessary, jsdom doesn't. + ReactDOMIDOperations.updatePropertyByID(inst._rootNodeID, 'value', '' + value); + } + } + }; + + function _handleChange(event) { + var props = this._currentElement.props; + + var returnValue = LinkedValueUtils.executeOnChange(props, event); + + // Here we use asap to wait until all updates have propagated, which + // is important when using controlled components within layers: + // https://github.com/facebook/react/issues/1698 + ReactUpdates.asap(forceUpdateIfMounted, this); + + var name = props.name; + if (props.type === 'radio' && name != null) { + var rootNode = ReactMount.getNode(this._rootNodeID); + var queryRoot = rootNode; + + while (queryRoot.parentNode) { + queryRoot = queryRoot.parentNode; + } + + // If `rootNode.form` was non-null, then we could try `form.elements`, + // but that sometimes behaves strangely in IE8. We could also try using + // `form.getElementsByName`, but that will only return direct children + // and won't include inputs that use the HTML5 `form=` attribute. Since + // the input might not even be in a form, let's just use the global + // `querySelectorAll` to ensure we don't miss anything. + var group = queryRoot.querySelectorAll('input[name=' + JSON.stringify('' + name) + '][type="radio"]'); + + for (var i = 0; i < group.length; i++) { + var otherNode = group[i]; + if (otherNode === rootNode || otherNode.form !== rootNode.form) { + continue; + } + // This will throw if radio buttons rendered by different copies of React + // and the same name are rendered into the same form (same as #1939). + // That's probably okay; we don't support it just as we don't support + // mixing React with non-React. + var otherID = ReactMount.getID(otherNode); + !otherID ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactDOMInput: Mixing React and non-React radio inputs with the ' + 'same `name` is not supported.') : invariant(false) : undefined; + var otherInstance = instancesByReactID[otherID]; + !otherInstance ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactDOMInput: Unknown radio button ID %s.', otherID) : invariant(false) : undefined; + // If this is a controlled radio button group, forcing the input that + // was previously checked to update will cause it to be come re-checked + // as appropriate. + ReactUpdates.asap(forceUpdateIfMounted, otherInstance); + } + } + + return returnValue; + } + + module.exports = ReactDOMInput; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 105 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule LinkedValueUtils + * @typechecks static-only + */ + + 'use strict'; + + var ReactPropTypes = __webpack_require__(106); + var ReactPropTypeLocations = __webpack_require__(64); + + var invariant = __webpack_require__(12); + var warning = __webpack_require__(24); + + var hasReadOnlyValue = { + 'button': true, + 'checkbox': true, + 'image': true, + 'hidden': true, + 'radio': true, + 'reset': true, + 'submit': true + }; + + function _assertSingleLink(inputProps) { + !(inputProps.checkedLink == null || inputProps.valueLink == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Cannot provide a checkedLink and a valueLink. If you want to use ' + 'checkedLink, you probably don\'t want to use valueLink and vice versa.') : invariant(false) : undefined; + } + function _assertValueLink(inputProps) { + _assertSingleLink(inputProps); + !(inputProps.value == null && inputProps.onChange == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Cannot provide a valueLink and a value or onChange event. If you want ' + 'to use value or onChange, you probably don\'t want to use valueLink.') : invariant(false) : undefined; + } + + function _assertCheckedLink(inputProps) { + _assertSingleLink(inputProps); + !(inputProps.checked == null && inputProps.onChange == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Cannot provide a checkedLink and a checked property or onChange event. ' + 'If you want to use checked or onChange, you probably don\'t want to ' + 'use checkedLink') : invariant(false) : undefined; + } + + var propTypes = { + value: function (props, propName, componentName) { + if (!props[propName] || hasReadOnlyValue[props.type] || props.onChange || props.readOnly || props.disabled) { + return null; + } + return new Error('You provided a `value` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultValue`. Otherwise, ' + 'set either `onChange` or `readOnly`.'); + }, + checked: function (props, propName, componentName) { + if (!props[propName] || props.onChange || props.readOnly || props.disabled) { + return null; + } + return new Error('You provided a `checked` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultChecked`. Otherwise, ' + 'set either `onChange` or `readOnly`.'); + }, + onChange: ReactPropTypes.func + }; + + var loggedTypeFailures = {}; + function getDeclarationErrorAddendum(owner) { + if (owner) { + var name = owner.getName(); + if (name) { + return ' Check the render method of `' + name + '`.'; + } + } + return ''; + } + + /** + * Provide a linked `value` attribute for controlled forms. You should not use + * this outside of the ReactDOM controlled form components. + */ + var LinkedValueUtils = { + checkPropTypes: function (tagName, props, owner) { + for (var propName in propTypes) { + if (propTypes.hasOwnProperty(propName)) { + var error = propTypes[propName](props, propName, tagName, ReactPropTypeLocations.prop); + } + if (error instanceof Error && !(error.message in loggedTypeFailures)) { + // Only monitor this failure once because there tends to be a lot of the + // same error. + loggedTypeFailures[error.message] = true; + + var addendum = getDeclarationErrorAddendum(owner); + process.env.NODE_ENV !== 'production' ? warning(false, 'Failed form propType: %s%s', error.message, addendum) : undefined; + } + } + }, + + /** + * @param {object} inputProps Props for form component + * @return {*} current value of the input either from value prop or link. + */ + getValue: function (inputProps) { + if (inputProps.valueLink) { + _assertValueLink(inputProps); + return inputProps.valueLink.value; + } + return inputProps.value; + }, + + /** + * @param {object} inputProps Props for form component + * @return {*} current checked status of the input either from checked prop + * or link. + */ + getChecked: function (inputProps) { + if (inputProps.checkedLink) { + _assertCheckedLink(inputProps); + return inputProps.checkedLink.value; + } + return inputProps.checked; + }, + + /** + * @param {object} inputProps Props for form component + * @param {SyntheticEvent} event change event to handle + */ + executeOnChange: function (inputProps, event) { + if (inputProps.valueLink) { + _assertValueLink(inputProps); + return inputProps.valueLink.requestChange(event.target.value); + } else if (inputProps.checkedLink) { + _assertCheckedLink(inputProps); + return inputProps.checkedLink.requestChange(event.target.checked); + } else if (inputProps.onChange) { + return inputProps.onChange.call(undefined, event); + } + } + }; + + module.exports = LinkedValueUtils; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 106 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactPropTypes + */ + + 'use strict'; + + var ReactElement = __webpack_require__(41); + var ReactPropTypeLocationNames = __webpack_require__(65); + + var emptyFunction = __webpack_require__(14); + var getIteratorFn = __webpack_require__(107); + + /** + * Collection of methods that allow declaration and validation of props that are + * supplied to React components. Example usage: + * + * var Props = require('ReactPropTypes'); + * var MyArticle = React.createClass({ + * propTypes: { + * // An optional string prop named "description". + * description: Props.string, + * + * // A required enum prop named "category". + * category: Props.oneOf(['News','Photos']).isRequired, + * + * // A prop named "dialog" that requires an instance of Dialog. + * dialog: Props.instanceOf(Dialog).isRequired + * }, + * render: function() { ... } + * }); + * + * A more formal specification of how these methods are used: + * + * type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...) + * decl := ReactPropTypes.{type}(.isRequired)? + * + * Each and every declaration produces a function with the same signature. This + * allows the creation of custom validation functions. For example: + * + * var MyLink = React.createClass({ + * propTypes: { + * // An optional string or URI prop named "href". + * href: function(props, propName, componentName) { + * var propValue = props[propName]; + * if (propValue != null && typeof propValue !== 'string' && + * !(propValue instanceof URI)) { + * return new Error( + * 'Expected a string or an URI for ' + propName + ' in ' + + * componentName + * ); + * } + * } + * }, + * render: function() {...} + * }); + * + * @internal + */ + + var ANONYMOUS = '<<anonymous>>'; + + var ReactPropTypes = { + array: createPrimitiveTypeChecker('array'), + bool: createPrimitiveTypeChecker('boolean'), + func: createPrimitiveTypeChecker('function'), + number: createPrimitiveTypeChecker('number'), + object: createPrimitiveTypeChecker('object'), + string: createPrimitiveTypeChecker('string'), + + any: createAnyTypeChecker(), + arrayOf: createArrayOfTypeChecker, + element: createElementTypeChecker(), + instanceOf: createInstanceTypeChecker, + node: createNodeChecker(), + objectOf: createObjectOfTypeChecker, + oneOf: createEnumTypeChecker, + oneOfType: createUnionTypeChecker, + shape: createShapeTypeChecker + }; + + function createChainableTypeChecker(validate) { + function checkType(isRequired, props, propName, componentName, location, propFullName) { + componentName = componentName || ANONYMOUS; + propFullName = propFullName || propName; + if (props[propName] == null) { + var locationName = ReactPropTypeLocationNames[location]; + if (isRequired) { + return new Error('Required ' + locationName + ' `' + propFullName + '` was not specified in ' + ('`' + componentName + '`.')); + } + return null; + } else { + return validate(props, propName, componentName, location, propFullName); + } + } + + var chainedCheckType = checkType.bind(null, false); + chainedCheckType.isRequired = checkType.bind(null, true); + + return chainedCheckType; + } + + function createPrimitiveTypeChecker(expectedType) { + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + var propType = getPropType(propValue); + if (propType !== expectedType) { + var locationName = ReactPropTypeLocationNames[location]; + // `propValue` being instance of, say, date/regexp, pass the 'object' + // check, but we can offer a more precise error message here rather than + // 'of type `object`'. + var preciseType = getPreciseType(propValue); + + return new Error('Invalid ' + locationName + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.')); + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createAnyTypeChecker() { + return createChainableTypeChecker(emptyFunction.thatReturns(null)); + } + + function createArrayOfTypeChecker(typeChecker) { + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + if (!Array.isArray(propValue)) { + var locationName = ReactPropTypeLocationNames[location]; + var propType = getPropType(propValue); + return new Error('Invalid ' + locationName + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.')); + } + for (var i = 0; i < propValue.length; i++) { + var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']'); + if (error instanceof Error) { + return error; + } + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createElementTypeChecker() { + function validate(props, propName, componentName, location, propFullName) { + if (!ReactElement.isValidElement(props[propName])) { + var locationName = ReactPropTypeLocationNames[location]; + return new Error('Invalid ' + locationName + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a single ReactElement.')); + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createInstanceTypeChecker(expectedClass) { + function validate(props, propName, componentName, location, propFullName) { + if (!(props[propName] instanceof expectedClass)) { + var locationName = ReactPropTypeLocationNames[location]; + var expectedClassName = expectedClass.name || ANONYMOUS; + var actualClassName = getClassName(props[propName]); + return new Error('Invalid ' + locationName + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.')); + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createEnumTypeChecker(expectedValues) { + if (!Array.isArray(expectedValues)) { + return createChainableTypeChecker(function () { + return new Error('Invalid argument supplied to oneOf, expected an instance of array.'); + }); + } + + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + for (var i = 0; i < expectedValues.length; i++) { + if (propValue === expectedValues[i]) { + return null; + } + } + + var locationName = ReactPropTypeLocationNames[location]; + var valuesString = JSON.stringify(expectedValues); + return new Error('Invalid ' + locationName + ' `' + propFullName + '` of value `' + propValue + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.')); + } + return createChainableTypeChecker(validate); + } + + function createObjectOfTypeChecker(typeChecker) { + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + var propType = getPropType(propValue); + if (propType !== 'object') { + var locationName = ReactPropTypeLocationNames[location]; + return new Error('Invalid ' + locationName + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.')); + } + for (var key in propValue) { + if (propValue.hasOwnProperty(key)) { + var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key); + if (error instanceof Error) { + return error; + } + } + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createUnionTypeChecker(arrayOfTypeCheckers) { + if (!Array.isArray(arrayOfTypeCheckers)) { + return createChainableTypeChecker(function () { + return new Error('Invalid argument supplied to oneOfType, expected an instance of array.'); + }); + } + + function validate(props, propName, componentName, location, propFullName) { + for (var i = 0; i < arrayOfTypeCheckers.length; i++) { + var checker = arrayOfTypeCheckers[i]; + if (checker(props, propName, componentName, location, propFullName) == null) { + return null; + } + } + + var locationName = ReactPropTypeLocationNames[location]; + return new Error('Invalid ' + locationName + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`.')); + } + return createChainableTypeChecker(validate); + } + + function createNodeChecker() { + function validate(props, propName, componentName, location, propFullName) { + if (!isNode(props[propName])) { + var locationName = ReactPropTypeLocationNames[location]; + return new Error('Invalid ' + locationName + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.')); + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createShapeTypeChecker(shapeTypes) { + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + var propType = getPropType(propValue); + if (propType !== 'object') { + var locationName = ReactPropTypeLocationNames[location]; + return new Error('Invalid ' + locationName + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.')); + } + for (var key in shapeTypes) { + var checker = shapeTypes[key]; + if (!checker) { + continue; + } + var error = checker(propValue, key, componentName, location, propFullName + '.' + key); + if (error) { + return error; + } + } + return null; + } + return createChainableTypeChecker(validate); + } + + function isNode(propValue) { + switch (typeof propValue) { + case 'number': + case 'string': + case 'undefined': + return true; + case 'boolean': + return !propValue; + case 'object': + if (Array.isArray(propValue)) { + return propValue.every(isNode); + } + if (propValue === null || ReactElement.isValidElement(propValue)) { + return true; + } + + var iteratorFn = getIteratorFn(propValue); + if (iteratorFn) { + var iterator = iteratorFn.call(propValue); + var step; + if (iteratorFn !== propValue.entries) { + while (!(step = iterator.next()).done) { + if (!isNode(step.value)) { + return false; + } + } + } else { + // Iterator will provide entry [k,v] tuples rather than values. + while (!(step = iterator.next()).done) { + var entry = step.value; + if (entry) { + if (!isNode(entry[1])) { + return false; + } + } + } + } + } else { + return false; + } + + return true; + default: + return false; + } + } + + // Equivalent of `typeof` but with special handling for array and regexp. + function getPropType(propValue) { + var propType = typeof propValue; + if (Array.isArray(propValue)) { + return 'array'; + } + if (propValue instanceof RegExp) { + // Old webkits (at least until Android 4.0) return 'function' rather than + // 'object' for typeof a RegExp. We'll normalize this here so that /bla/ + // passes PropTypes.object. + return 'object'; + } + return propType; + } + + // This handles more types than `getPropType`. Only used for error messages. + // See `createPrimitiveTypeChecker`. + function getPreciseType(propValue) { + var propType = getPropType(propValue); + if (propType === 'object') { + if (propValue instanceof Date) { + return 'date'; + } else if (propValue instanceof RegExp) { + return 'regexp'; + } + } + return propType; + } + + // Returns class name of the object, if any. + function getClassName(propValue) { + if (!propValue.constructor || !propValue.constructor.name) { + return '<<anonymous>>'; + } + return propValue.constructor.name; + } + + module.exports = ReactPropTypes; + +/***/ }, +/* 107 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule getIteratorFn + * @typechecks static-only + */ + + 'use strict'; + + /* global Symbol */ + var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; + var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec. + + /** + * Returns the iterator method function contained on the iterable object. + * + * Be sure to invoke the function with the iterable as context: + * + * var iteratorFn = getIteratorFn(myIterable); + * if (iteratorFn) { + * var iterator = iteratorFn.call(myIterable); + * ... + * } + * + * @param {?object} maybeIterable + * @return {?function} + */ + function getIteratorFn(maybeIterable) { + var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]); + if (typeof iteratorFn === 'function') { + return iteratorFn; + } + } + + module.exports = getIteratorFn; + +/***/ }, +/* 108 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactDOMOption + */ + + 'use strict'; + + var ReactChildren = __webpack_require__(109); + var ReactDOMSelect = __webpack_require__(111); + + var assign = __webpack_require__(38); + var warning = __webpack_require__(24); + + var valueContextKey = ReactDOMSelect.valueContextKey; + + /** + * Implements an <option> native component that warns when `selected` is set. + */ + var ReactDOMOption = { + mountWrapper: function (inst, props, context) { + // TODO (yungsters): Remove support for `selected` in <option>. + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(props.selected == null, 'Use the `defaultValue` or `value` props on <select> instead of ' + 'setting `selected` on <option>.') : undefined; + } + + // Look up whether this option is 'selected' via context + var selectValue = context[valueContextKey]; + + // If context key is null (e.g., no specified value or after initial mount) + // or missing (e.g., for <datalist>), we don't change props.selected + var selected = null; + if (selectValue != null) { + selected = false; + if (Array.isArray(selectValue)) { + // multiple + for (var i = 0; i < selectValue.length; i++) { + if ('' + selectValue[i] === '' + props.value) { + selected = true; + break; + } + } + } else { + selected = '' + selectValue === '' + props.value; + } + } + + inst._wrapperState = { selected: selected }; + }, + + getNativeProps: function (inst, props, context) { + var nativeProps = assign({ selected: undefined, children: undefined }, props); + + // Read state only from initial mount because <select> updates value + // manually; we need the initial state only for server rendering + if (inst._wrapperState.selected != null) { + nativeProps.selected = inst._wrapperState.selected; + } + + var content = ''; + + // Flatten children and warn if they aren't strings or numbers; + // invalid types are ignored. + ReactChildren.forEach(props.children, function (child) { + if (child == null) { + return; + } + if (typeof child === 'string' || typeof child === 'number') { + content += child; + } else { + process.env.NODE_ENV !== 'production' ? warning(false, 'Only strings and numbers are supported as <option> children.') : undefined; + } + }); + + nativeProps.children = content; + return nativeProps; + } + + }; + + module.exports = ReactDOMOption; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 109 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactChildren + */ + + 'use strict'; + + var PooledClass = __webpack_require__(55); + var ReactElement = __webpack_require__(41); + + var emptyFunction = __webpack_require__(14); + var traverseAllChildren = __webpack_require__(110); + + var twoArgumentPooler = PooledClass.twoArgumentPooler; + var fourArgumentPooler = PooledClass.fourArgumentPooler; + + var userProvidedKeyEscapeRegex = /\/(?!\/)/g; + function escapeUserProvidedKey(text) { + return ('' + text).replace(userProvidedKeyEscapeRegex, '//'); + } + + /** + * PooledClass representing the bookkeeping associated with performing a child + * traversal. Allows avoiding binding callbacks. + * + * @constructor ForEachBookKeeping + * @param {!function} forEachFunction Function to perform traversal with. + * @param {?*} forEachContext Context to perform context with. + */ + function ForEachBookKeeping(forEachFunction, forEachContext) { + this.func = forEachFunction; + this.context = forEachContext; + this.count = 0; + } + ForEachBookKeeping.prototype.destructor = function () { + this.func = null; + this.context = null; + this.count = 0; + }; + PooledClass.addPoolingTo(ForEachBookKeeping, twoArgumentPooler); + + function forEachSingleChild(bookKeeping, child, name) { + var func = bookKeeping.func; + var context = bookKeeping.context; + + func.call(context, child, bookKeeping.count++); + } + + /** + * Iterates through children that are typically specified as `props.children`. + * + * The provided forEachFunc(child, index) will be called for each + * leaf child. + * + * @param {?*} children Children tree container. + * @param {function(*, int)} forEachFunc + * @param {*} forEachContext Context for forEachContext. + */ + function forEachChildren(children, forEachFunc, forEachContext) { + if (children == null) { + return children; + } + var traverseContext = ForEachBookKeeping.getPooled(forEachFunc, forEachContext); + traverseAllChildren(children, forEachSingleChild, traverseContext); + ForEachBookKeeping.release(traverseContext); + } + + /** + * PooledClass representing the bookkeeping associated with performing a child + * mapping. Allows avoiding binding callbacks. + * + * @constructor MapBookKeeping + * @param {!*} mapResult Object containing the ordered map of results. + * @param {!function} mapFunction Function to perform mapping with. + * @param {?*} mapContext Context to perform mapping with. + */ + function MapBookKeeping(mapResult, keyPrefix, mapFunction, mapContext) { + this.result = mapResult; + this.keyPrefix = keyPrefix; + this.func = mapFunction; + this.context = mapContext; + this.count = 0; + } + MapBookKeeping.prototype.destructor = function () { + this.result = null; + this.keyPrefix = null; + this.func = null; + this.context = null; + this.count = 0; + }; + PooledClass.addPoolingTo(MapBookKeeping, fourArgumentPooler); + + function mapSingleChildIntoContext(bookKeeping, child, childKey) { + var result = bookKeeping.result; + var keyPrefix = bookKeeping.keyPrefix; + var func = bookKeeping.func; + var context = bookKeeping.context; + + var mappedChild = func.call(context, child, bookKeeping.count++); + if (Array.isArray(mappedChild)) { + mapIntoWithKeyPrefixInternal(mappedChild, result, childKey, emptyFunction.thatReturnsArgument); + } else if (mappedChild != null) { + if (ReactElement.isValidElement(mappedChild)) { + mappedChild = ReactElement.cloneAndReplaceKey(mappedChild, + // Keep both the (mapped) and old keys if they differ, just as + // traverseAllChildren used to do for objects as children + keyPrefix + (mappedChild !== child ? escapeUserProvidedKey(mappedChild.key || '') + '/' : '') + childKey); + } + result.push(mappedChild); + } + } + + function mapIntoWithKeyPrefixInternal(children, array, prefix, func, context) { + var escapedPrefix = ''; + if (prefix != null) { + escapedPrefix = escapeUserProvidedKey(prefix) + '/'; + } + var traverseContext = MapBookKeeping.getPooled(array, escapedPrefix, func, context); + traverseAllChildren(children, mapSingleChildIntoContext, traverseContext); + MapBookKeeping.release(traverseContext); + } + + /** + * Maps children that are typically specified as `props.children`. + * + * The provided mapFunction(child, key, index) will be called for each + * leaf child. + * + * @param {?*} children Children tree container. + * @param {function(*, int)} func The map function. + * @param {*} context Context for mapFunction. + * @return {object} Object containing the ordered map of results. + */ + function mapChildren(children, func, context) { + if (children == null) { + return children; + } + var result = []; + mapIntoWithKeyPrefixInternal(children, result, null, func, context); + return result; + } + + function forEachSingleChildDummy(traverseContext, child, name) { + return null; + } + + /** + * Count the number of children that are typically specified as + * `props.children`. + * + * @param {?*} children Children tree container. + * @return {number} The number of children. + */ + function countChildren(children, context) { + return traverseAllChildren(children, forEachSingleChildDummy, null); + } + + /** + * Flatten a children object (typically specified as `props.children`) and + * return an array with appropriately re-keyed children. + */ + function toArray(children) { + var result = []; + mapIntoWithKeyPrefixInternal(children, result, null, emptyFunction.thatReturnsArgument); + return result; + } + + var ReactChildren = { + forEach: forEachChildren, + map: mapChildren, + mapIntoWithKeyPrefixInternal: mapIntoWithKeyPrefixInternal, + count: countChildren, + toArray: toArray + }; + + module.exports = ReactChildren; + +/***/ }, +/* 110 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule traverseAllChildren + */ + + 'use strict'; + + var ReactCurrentOwner = __webpack_require__(4); + var ReactElement = __webpack_require__(41); + var ReactInstanceHandles = __webpack_require__(44); + + var getIteratorFn = __webpack_require__(107); + var invariant = __webpack_require__(12); + var warning = __webpack_require__(24); + + var SEPARATOR = ReactInstanceHandles.SEPARATOR; + var SUBSEPARATOR = ':'; + + /** + * TODO: Test that a single child and an array with one item have the same key + * pattern. + */ + + var userProvidedKeyEscaperLookup = { + '=': '=0', + '.': '=1', + ':': '=2' + }; + + var userProvidedKeyEscapeRegex = /[=.:]/g; + + var didWarnAboutMaps = false; + + function userProvidedKeyEscaper(match) { + return userProvidedKeyEscaperLookup[match]; + } + + /** + * Generate a key string that identifies a component within a set. + * + * @param {*} component A component that could contain a manual key. + * @param {number} index Index that is used if a manual key is not provided. + * @return {string} + */ + function getComponentKey(component, index) { + if (component && component.key != null) { + // Explicit key + return wrapUserProvidedKey(component.key); + } + // Implicit key determined by the index in the set + return index.toString(36); + } + + /** + * Escape a component key so that it is safe to use in a reactid. + * + * @param {*} text Component key to be escaped. + * @return {string} An escaped string. + */ + function escapeUserProvidedKey(text) { + return ('' + text).replace(userProvidedKeyEscapeRegex, userProvidedKeyEscaper); + } + + /** + * Wrap a `key` value explicitly provided by the user to distinguish it from + * implicitly-generated keys generated by a component's index in its parent. + * + * @param {string} key Value of a user-provided `key` attribute + * @return {string} + */ + function wrapUserProvidedKey(key) { + return '$' + escapeUserProvidedKey(key); + } + + /** + * @param {?*} children Children tree container. + * @param {!string} nameSoFar Name of the key path so far. + * @param {!function} callback Callback to invoke with each child found. + * @param {?*} traverseContext Used to pass information throughout the traversal + * process. + * @return {!number} The number of children in this subtree. + */ + function traverseAllChildrenImpl(children, nameSoFar, callback, traverseContext) { + var type = typeof children; + + if (type === 'undefined' || type === 'boolean') { + // All of the above are perceived as null. + children = null; + } + + if (children === null || type === 'string' || type === 'number' || ReactElement.isValidElement(children)) { + callback(traverseContext, children, + // If it's the only child, treat the name as if it was wrapped in an array + // so that it's consistent if the number of children grows. + nameSoFar === '' ? SEPARATOR + getComponentKey(children, 0) : nameSoFar); + return 1; + } + + var child; + var nextName; + var subtreeCount = 0; // Count of children found in the current subtree. + var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR; + + if (Array.isArray(children)) { + for (var i = 0; i < children.length; i++) { + child = children[i]; + nextName = nextNamePrefix + getComponentKey(child, i); + subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext); + } + } else { + var iteratorFn = getIteratorFn(children); + if (iteratorFn) { + var iterator = iteratorFn.call(children); + var step; + if (iteratorFn !== children.entries) { + var ii = 0; + while (!(step = iterator.next()).done) { + child = step.value; + nextName = nextNamePrefix + getComponentKey(child, ii++); + subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext); + } + } else { + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(didWarnAboutMaps, 'Using Maps as children is not yet fully supported. It is an ' + 'experimental feature that might be removed. Convert it to a ' + 'sequence / iterable of keyed ReactElements instead.') : undefined; + didWarnAboutMaps = true; + } + // Iterator will provide entry [k,v] tuples rather than values. + while (!(step = iterator.next()).done) { + var entry = step.value; + if (entry) { + child = entry[1]; + nextName = nextNamePrefix + wrapUserProvidedKey(entry[0]) + SUBSEPARATOR + getComponentKey(child, 0); + subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext); + } + } + } + } else if (type === 'object') { + var addendum = ''; + if (process.env.NODE_ENV !== 'production') { + addendum = ' If you meant to render a collection of children, use an array ' + 'instead or wrap the object using createFragment(object) from the ' + 'React add-ons.'; + if (children._isReactElement) { + addendum = ' It looks like you\'re using an element created by a different ' + 'version of React. Make sure to use only one copy of React.'; + } + if (ReactCurrentOwner.current) { + var name = ReactCurrentOwner.current.getName(); + if (name) { + addendum += ' Check the render method of `' + name + '`.'; + } + } + } + var childrenString = String(children); + true ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Objects are not valid as a React child (found: %s).%s', childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString, addendum) : invariant(false) : undefined; + } + } + + return subtreeCount; + } + + /** + * Traverses children that are typically specified as `props.children`, but + * might also be specified through attributes: + * + * - `traverseAllChildren(this.props.children, ...)` + * - `traverseAllChildren(this.props.leftPanelChildren, ...)` + * + * The `traverseContext` is an optional argument that is passed through the + * entire traversal. It can be used to store accumulations or anything else that + * the callback might find relevant. + * + * @param {?*} children Children tree object. + * @param {!function} callback To invoke upon traversing each child. + * @param {?*} traverseContext Context for traversal. + * @return {!number} The number of children in this subtree. + */ + function traverseAllChildren(children, callback, traverseContext) { + if (children == null) { + return 0; + } + + return traverseAllChildrenImpl(children, '', callback, traverseContext); + } + + module.exports = traverseAllChildren; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 111 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactDOMSelect + */ + + 'use strict'; + + var LinkedValueUtils = __webpack_require__(105); + var ReactMount = __webpack_require__(27); + var ReactUpdates = __webpack_require__(53); + + var assign = __webpack_require__(38); + var warning = __webpack_require__(24); + + var valueContextKey = '__ReactDOMSelect_value$' + Math.random().toString(36).slice(2); + + function updateOptionsIfPendingUpdateAndMounted() { + if (this._rootNodeID && this._wrapperState.pendingUpdate) { + this._wrapperState.pendingUpdate = false; + + var props = this._currentElement.props; + var value = LinkedValueUtils.getValue(props); + + if (value != null) { + updateOptions(this, props, value); + } + } + } + + function getDeclarationErrorAddendum(owner) { + if (owner) { + var name = owner.getName(); + if (name) { + return ' Check the render method of `' + name + '`.'; + } + } + return ''; + } + + var valuePropNames = ['value', 'defaultValue']; + + /** + * Validation function for `value` and `defaultValue`. + * @private + */ + function checkSelectPropTypes(inst, props) { + var owner = inst._currentElement._owner; + LinkedValueUtils.checkPropTypes('select', props, owner); + + for (var i = 0; i < valuePropNames.length; i++) { + var propName = valuePropNames[i]; + if (props[propName] == null) { + continue; + } + if (props.multiple) { + process.env.NODE_ENV !== 'production' ? warning(Array.isArray(props[propName]), 'The `%s` prop supplied to <select> must be an array if ' + '`multiple` is true.%s', propName, getDeclarationErrorAddendum(owner)) : undefined; + } else { + process.env.NODE_ENV !== 'production' ? warning(!Array.isArray(props[propName]), 'The `%s` prop supplied to <select> must be a scalar ' + 'value if `multiple` is false.%s', propName, getDeclarationErrorAddendum(owner)) : undefined; + } + } + } + + /** + * @param {ReactDOMComponent} inst + * @param {boolean} multiple + * @param {*} propValue A stringable (with `multiple`, a list of stringables). + * @private + */ + function updateOptions(inst, multiple, propValue) { + var selectedValue, i; + var options = ReactMount.getNode(inst._rootNodeID).options; + + if (multiple) { + selectedValue = {}; + for (i = 0; i < propValue.length; i++) { + selectedValue['' + propValue[i]] = true; + } + for (i = 0; i < options.length; i++) { + var selected = selectedValue.hasOwnProperty(options[i].value); + if (options[i].selected !== selected) { + options[i].selected = selected; + } + } + } else { + // Do not set `select.value` as exact behavior isn't consistent across all + // browsers for all cases. + selectedValue = '' + propValue; + for (i = 0; i < options.length; i++) { + if (options[i].value === selectedValue) { + options[i].selected = true; + return; + } + } + if (options.length) { + options[0].selected = true; + } + } + } + + /** + * Implements a <select> native component that allows optionally setting the + * props `value` and `defaultValue`. If `multiple` is false, the prop must be a + * stringable. If `multiple` is true, the prop must be an array of stringables. + * + * If `value` is not supplied (or null/undefined), user actions that change the + * selected option will trigger updates to the rendered options. + * + * If it is supplied (and not null/undefined), the rendered options will not + * update in response to user actions. Instead, the `value` prop must change in + * order for the rendered options to update. + * + * If `defaultValue` is provided, any options with the supplied values will be + * selected. + */ + var ReactDOMSelect = { + valueContextKey: valueContextKey, + + getNativeProps: function (inst, props, context) { + return assign({}, props, { + onChange: inst._wrapperState.onChange, + value: undefined + }); + }, + + mountWrapper: function (inst, props) { + if (process.env.NODE_ENV !== 'production') { + checkSelectPropTypes(inst, props); + } + + var value = LinkedValueUtils.getValue(props); + inst._wrapperState = { + pendingUpdate: false, + initialValue: value != null ? value : props.defaultValue, + onChange: _handleChange.bind(inst), + wasMultiple: Boolean(props.multiple) + }; + }, + + processChildContext: function (inst, props, context) { + // Pass down initial value so initial generated markup has correct + // `selected` attributes + var childContext = assign({}, context); + childContext[valueContextKey] = inst._wrapperState.initialValue; + return childContext; + }, + + postUpdateWrapper: function (inst) { + var props = inst._currentElement.props; + + // After the initial mount, we control selected-ness manually so don't pass + // the context value down + inst._wrapperState.initialValue = undefined; + + var wasMultiple = inst._wrapperState.wasMultiple; + inst._wrapperState.wasMultiple = Boolean(props.multiple); + + var value = LinkedValueUtils.getValue(props); + if (value != null) { + inst._wrapperState.pendingUpdate = false; + updateOptions(inst, Boolean(props.multiple), value); + } else if (wasMultiple !== Boolean(props.multiple)) { + // For simplicity, reapply `defaultValue` if `multiple` is toggled. + if (props.defaultValue != null) { + updateOptions(inst, Boolean(props.multiple), props.defaultValue); + } else { + // Revert the select back to its default unselected state. + updateOptions(inst, Boolean(props.multiple), props.multiple ? [] : ''); + } + } + } + }; + + function _handleChange(event) { + var props = this._currentElement.props; + var returnValue = LinkedValueUtils.executeOnChange(props, event); + + this._wrapperState.pendingUpdate = true; + ReactUpdates.asap(updateOptionsIfPendingUpdateAndMounted, this); + return returnValue; + } + + module.exports = ReactDOMSelect; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 112 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactDOMTextarea + */ + + 'use strict'; + + var LinkedValueUtils = __webpack_require__(105); + var ReactDOMIDOperations = __webpack_require__(26); + var ReactUpdates = __webpack_require__(53); + + var assign = __webpack_require__(38); + var invariant = __webpack_require__(12); + var warning = __webpack_require__(24); + + function forceUpdateIfMounted() { + if (this._rootNodeID) { + // DOM component is still mounted; update + ReactDOMTextarea.updateWrapper(this); + } + } + + /** + * Implements a <textarea> native component that allows setting `value`, and + * `defaultValue`. This differs from the traditional DOM API because value is + * usually set as PCDATA children. + * + * If `value` is not supplied (or null/undefined), user actions that affect the + * value will trigger updates to the element. + * + * If `value` is supplied (and not null/undefined), the rendered element will + * not trigger updates to the element. Instead, the `value` prop must change in + * order for the rendered element to be updated. + * + * The rendered element will be initialized with an empty value, the prop + * `defaultValue` if specified, or the children content (deprecated). + */ + var ReactDOMTextarea = { + getNativeProps: function (inst, props, context) { + !(props.dangerouslySetInnerHTML == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, '`dangerouslySetInnerHTML` does not make sense on <textarea>.') : invariant(false) : undefined; + + // Always set children to the same thing. In IE9, the selection range will + // get reset if `textContent` is mutated. + var nativeProps = assign({}, props, { + defaultValue: undefined, + value: undefined, + children: inst._wrapperState.initialValue, + onChange: inst._wrapperState.onChange + }); + + return nativeProps; + }, + + mountWrapper: function (inst, props) { + if (process.env.NODE_ENV !== 'production') { + LinkedValueUtils.checkPropTypes('textarea', props, inst._currentElement._owner); + } + + var defaultValue = props.defaultValue; + // TODO (yungsters): Remove support for children content in <textarea>. + var children = props.children; + if (children != null) { + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(false, 'Use the `defaultValue` or `value` props instead of setting ' + 'children on <textarea>.') : undefined; + } + !(defaultValue == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'If you supply `defaultValue` on a <textarea>, do not pass children.') : invariant(false) : undefined; + if (Array.isArray(children)) { + !(children.length <= 1) ? process.env.NODE_ENV !== 'production' ? invariant(false, '<textarea> can only have at most one child.') : invariant(false) : undefined; + children = children[0]; + } + + defaultValue = '' + children; + } + if (defaultValue == null) { + defaultValue = ''; + } + var value = LinkedValueUtils.getValue(props); + + inst._wrapperState = { + // We save the initial value so that `ReactDOMComponent` doesn't update + // `textContent` (unnecessary since we update value). + // The initial value can be a boolean or object so that's why it's + // forced to be a string. + initialValue: '' + (value != null ? value : defaultValue), + onChange: _handleChange.bind(inst) + }; + }, + + updateWrapper: function (inst) { + var props = inst._currentElement.props; + var value = LinkedValueUtils.getValue(props); + if (value != null) { + // Cast `value` to a string to ensure the value is set correctly. While + // browsers typically do this as necessary, jsdom doesn't. + ReactDOMIDOperations.updatePropertyByID(inst._rootNodeID, 'value', '' + value); + } + } + }; + + function _handleChange(event) { + var props = this._currentElement.props; + var returnValue = LinkedValueUtils.executeOnChange(props, event); + ReactUpdates.asap(forceUpdateIfMounted, this); + return returnValue; + } + + module.exports = ReactDOMTextarea; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 113 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactMultiChild + * @typechecks static-only + */ + + 'use strict'; + + var ReactComponentEnvironment = __webpack_require__(63); + var ReactMultiChildUpdateTypes = __webpack_require__(15); + + var ReactCurrentOwner = __webpack_require__(4); + var ReactReconciler = __webpack_require__(49); + var ReactChildReconciler = __webpack_require__(114); + + var flattenChildren = __webpack_require__(115); + + /** + * Updating children of a component may trigger recursive updates. The depth is + * used to batch recursive updates to render markup more efficiently. + * + * @type {number} + * @private + */ + var updateDepth = 0; + + /** + * Queue of update configuration objects. + * + * Each object has a `type` property that is in `ReactMultiChildUpdateTypes`. + * + * @type {array<object>} + * @private + */ + var updateQueue = []; + + /** + * Queue of markup to be rendered. + * + * @type {array<string>} + * @private + */ + var markupQueue = []; + + /** + * Enqueues markup to be rendered and inserted at a supplied index. + * + * @param {string} parentID ID of the parent component. + * @param {string} markup Markup that renders into an element. + * @param {number} toIndex Destination index. + * @private + */ + function enqueueInsertMarkup(parentID, markup, toIndex) { + // NOTE: Null values reduce hidden classes. + updateQueue.push({ + parentID: parentID, + parentNode: null, + type: ReactMultiChildUpdateTypes.INSERT_MARKUP, + markupIndex: markupQueue.push(markup) - 1, + content: null, + fromIndex: null, + toIndex: toIndex + }); + } + + /** + * Enqueues moving an existing element to another index. + * + * @param {string} parentID ID of the parent component. + * @param {number} fromIndex Source index of the existing element. + * @param {number} toIndex Destination index of the element. + * @private + */ + function enqueueMove(parentID, fromIndex, toIndex) { + // NOTE: Null values reduce hidden classes. + updateQueue.push({ + parentID: parentID, + parentNode: null, + type: ReactMultiChildUpdateTypes.MOVE_EXISTING, + markupIndex: null, + content: null, + fromIndex: fromIndex, + toIndex: toIndex + }); + } + + /** + * Enqueues removing an element at an index. + * + * @param {string} parentID ID of the parent component. + * @param {number} fromIndex Index of the element to remove. + * @private + */ + function enqueueRemove(parentID, fromIndex) { + // NOTE: Null values reduce hidden classes. + updateQueue.push({ + parentID: parentID, + parentNode: null, + type: ReactMultiChildUpdateTypes.REMOVE_NODE, + markupIndex: null, + content: null, + fromIndex: fromIndex, + toIndex: null + }); + } + + /** + * Enqueues setting the markup of a node. + * + * @param {string} parentID ID of the parent component. + * @param {string} markup Markup that renders into an element. + * @private + */ + function enqueueSetMarkup(parentID, markup) { + // NOTE: Null values reduce hidden classes. + updateQueue.push({ + parentID: parentID, + parentNode: null, + type: ReactMultiChildUpdateTypes.SET_MARKUP, + markupIndex: null, + content: markup, + fromIndex: null, + toIndex: null + }); + } + + /** + * Enqueues setting the text content. + * + * @param {string} parentID ID of the parent component. + * @param {string} textContent Text content to set. + * @private + */ + function enqueueTextContent(parentID, textContent) { + // NOTE: Null values reduce hidden classes. + updateQueue.push({ + parentID: parentID, + parentNode: null, + type: ReactMultiChildUpdateTypes.TEXT_CONTENT, + markupIndex: null, + content: textContent, + fromIndex: null, + toIndex: null + }); + } + + /** + * Processes any enqueued updates. + * + * @private + */ + function processQueue() { + if (updateQueue.length) { + ReactComponentEnvironment.processChildrenUpdates(updateQueue, markupQueue); + clearQueue(); + } + } + + /** + * Clears any enqueued updates. + * + * @private + */ + function clearQueue() { + updateQueue.length = 0; + markupQueue.length = 0; + } + + /** + * ReactMultiChild are capable of reconciling multiple children. + * + * @class ReactMultiChild + * @internal + */ + var ReactMultiChild = { + + /** + * Provides common functionality for components that must reconcile multiple + * children. This is used by `ReactDOMComponent` to mount, update, and + * unmount child components. + * + * @lends {ReactMultiChild.prototype} + */ + Mixin: { + + _reconcilerInstantiateChildren: function (nestedChildren, transaction, context) { + if (process.env.NODE_ENV !== 'production') { + if (this._currentElement) { + try { + ReactCurrentOwner.current = this._currentElement._owner; + return ReactChildReconciler.instantiateChildren(nestedChildren, transaction, context); + } finally { + ReactCurrentOwner.current = null; + } + } + } + return ReactChildReconciler.instantiateChildren(nestedChildren, transaction, context); + }, + + _reconcilerUpdateChildren: function (prevChildren, nextNestedChildrenElements, transaction, context) { + var nextChildren; + if (process.env.NODE_ENV !== 'production') { + if (this._currentElement) { + try { + ReactCurrentOwner.current = this._currentElement._owner; + nextChildren = flattenChildren(nextNestedChildrenElements); + } finally { + ReactCurrentOwner.current = null; + } + return ReactChildReconciler.updateChildren(prevChildren, nextChildren, transaction, context); + } + } + nextChildren = flattenChildren(nextNestedChildrenElements); + return ReactChildReconciler.updateChildren(prevChildren, nextChildren, transaction, context); + }, + + /** + * Generates a "mount image" for each of the supplied children. In the case + * of `ReactDOMComponent`, a mount image is a string of markup. + * + * @param {?object} nestedChildren Nested child maps. + * @return {array} An array of mounted representations. + * @internal + */ + mountChildren: function (nestedChildren, transaction, context) { + var children = this._reconcilerInstantiateChildren(nestedChildren, transaction, context); + this._renderedChildren = children; + var mountImages = []; + var index = 0; + for (var name in children) { + if (children.hasOwnProperty(name)) { + var child = children[name]; + // Inlined for performance, see `ReactInstanceHandles.createReactID`. + var rootID = this._rootNodeID + name; + var mountImage = ReactReconciler.mountComponent(child, rootID, transaction, context); + child._mountIndex = index++; + mountImages.push(mountImage); + } + } + return mountImages; + }, + + /** + * Replaces any rendered children with a text content string. + * + * @param {string} nextContent String of content. + * @internal + */ + updateTextContent: function (nextContent) { + updateDepth++; + var errorThrown = true; + try { + var prevChildren = this._renderedChildren; + // Remove any rendered children. + ReactChildReconciler.unmountChildren(prevChildren); + // TODO: The setTextContent operation should be enough + for (var name in prevChildren) { + if (prevChildren.hasOwnProperty(name)) { + this._unmountChild(prevChildren[name]); + } + } + // Set new text content. + this.setTextContent(nextContent); + errorThrown = false; + } finally { + updateDepth--; + if (!updateDepth) { + if (errorThrown) { + clearQueue(); + } else { + processQueue(); + } + } + } + }, + + /** + * Replaces any rendered children with a markup string. + * + * @param {string} nextMarkup String of markup. + * @internal + */ + updateMarkup: function (nextMarkup) { + updateDepth++; + var errorThrown = true; + try { + var prevChildren = this._renderedChildren; + // Remove any rendered children. + ReactChildReconciler.unmountChildren(prevChildren); + for (var name in prevChildren) { + if (prevChildren.hasOwnProperty(name)) { + this._unmountChildByName(prevChildren[name], name); + } + } + this.setMarkup(nextMarkup); + errorThrown = false; + } finally { + updateDepth--; + if (!updateDepth) { + if (errorThrown) { + clearQueue(); + } else { + processQueue(); + } + } + } + }, + + /** + * Updates the rendered children with new children. + * + * @param {?object} nextNestedChildrenElements Nested child element maps. + * @param {ReactReconcileTransaction} transaction + * @internal + */ + updateChildren: function (nextNestedChildrenElements, transaction, context) { + updateDepth++; + var errorThrown = true; + try { + this._updateChildren(nextNestedChildrenElements, transaction, context); + errorThrown = false; + } finally { + updateDepth--; + if (!updateDepth) { + if (errorThrown) { + clearQueue(); + } else { + processQueue(); + } + } + } + }, + + /** + * Improve performance by isolating this hot code path from the try/catch + * block in `updateChildren`. + * + * @param {?object} nextNestedChildrenElements Nested child element maps. + * @param {ReactReconcileTransaction} transaction + * @final + * @protected + */ + _updateChildren: function (nextNestedChildrenElements, transaction, context) { + var prevChildren = this._renderedChildren; + var nextChildren = this._reconcilerUpdateChildren(prevChildren, nextNestedChildrenElements, transaction, context); + this._renderedChildren = nextChildren; + if (!nextChildren && !prevChildren) { + return; + } + var name; + // `nextIndex` will increment for each child in `nextChildren`, but + // `lastIndex` will be the last index visited in `prevChildren`. + var lastIndex = 0; + var nextIndex = 0; + for (name in nextChildren) { + if (!nextChildren.hasOwnProperty(name)) { + continue; + } + var prevChild = prevChildren && prevChildren[name]; + var nextChild = nextChildren[name]; + if (prevChild === nextChild) { + this.moveChild(prevChild, nextIndex, lastIndex); + lastIndex = Math.max(prevChild._mountIndex, lastIndex); + prevChild._mountIndex = nextIndex; + } else { + if (prevChild) { + // Update `lastIndex` before `_mountIndex` gets unset by unmounting. + lastIndex = Math.max(prevChild._mountIndex, lastIndex); + this._unmountChild(prevChild); + } + // The child must be instantiated before it's mounted. + this._mountChildByNameAtIndex(nextChild, name, nextIndex, transaction, context); + } + nextIndex++; + } + // Remove children that are no longer present. + for (name in prevChildren) { + if (prevChildren.hasOwnProperty(name) && !(nextChildren && nextChildren.hasOwnProperty(name))) { + this._unmountChild(prevChildren[name]); + } + } + }, + + /** + * Unmounts all rendered children. This should be used to clean up children + * when this component is unmounted. + * + * @internal + */ + unmountChildren: function () { + var renderedChildren = this._renderedChildren; + ReactChildReconciler.unmountChildren(renderedChildren); + this._renderedChildren = null; + }, + + /** + * Moves a child component to the supplied index. + * + * @param {ReactComponent} child Component to move. + * @param {number} toIndex Destination index of the element. + * @param {number} lastIndex Last index visited of the siblings of `child`. + * @protected + */ + moveChild: function (child, toIndex, lastIndex) { + // If the index of `child` is less than `lastIndex`, then it needs to + // be moved. Otherwise, we do not need to move it because a child will be + // inserted or moved before `child`. + if (child._mountIndex < lastIndex) { + enqueueMove(this._rootNodeID, child._mountIndex, toIndex); + } + }, + + /** + * Creates a child component. + * + * @param {ReactComponent} child Component to create. + * @param {string} mountImage Markup to insert. + * @protected + */ + createChild: function (child, mountImage) { + enqueueInsertMarkup(this._rootNodeID, mountImage, child._mountIndex); + }, + + /** + * Removes a child component. + * + * @param {ReactComponent} child Child to remove. + * @protected + */ + removeChild: function (child) { + enqueueRemove(this._rootNodeID, child._mountIndex); + }, + + /** + * Sets this text content string. + * + * @param {string} textContent Text content to set. + * @protected + */ + setTextContent: function (textContent) { + enqueueTextContent(this._rootNodeID, textContent); + }, + + /** + * Sets this markup string. + * + * @param {string} markup Markup to set. + * @protected + */ + setMarkup: function (markup) { + enqueueSetMarkup(this._rootNodeID, markup); + }, + + /** + * Mounts a child with the supplied name. + * + * NOTE: This is part of `updateChildren` and is here for readability. + * + * @param {ReactComponent} child Component to mount. + * @param {string} name Name of the child. + * @param {number} index Index at which to insert the child. + * @param {ReactReconcileTransaction} transaction + * @private + */ + _mountChildByNameAtIndex: function (child, name, index, transaction, context) { + // Inlined for performance, see `ReactInstanceHandles.createReactID`. + var rootID = this._rootNodeID + name; + var mountImage = ReactReconciler.mountComponent(child, rootID, transaction, context); + child._mountIndex = index; + this.createChild(child, mountImage); + }, + + /** + * Unmounts a rendered child. + * + * NOTE: This is part of `updateChildren` and is here for readability. + * + * @param {ReactComponent} child Component to unmount. + * @private + */ + _unmountChild: function (child) { + this.removeChild(child); + child._mountIndex = null; + } + + } + + }; + + module.exports = ReactMultiChild; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 114 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2014-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactChildReconciler + * @typechecks static-only + */ + + 'use strict'; + + var ReactReconciler = __webpack_require__(49); + + var instantiateReactComponent = __webpack_require__(61); + var shouldUpdateReactComponent = __webpack_require__(66); + var traverseAllChildren = __webpack_require__(110); + var warning = __webpack_require__(24); + + function instantiateChild(childInstances, child, name) { + // We found a component instance. + var keyUnique = childInstances[name] === undefined; + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(keyUnique, 'flattenChildren(...): Encountered two children with the same key, ' + '`%s`. Child keys must be unique; when two children share a key, only ' + 'the first child will be used.', name) : undefined; + } + if (child != null && keyUnique) { + childInstances[name] = instantiateReactComponent(child, null); + } + } + + /** + * ReactChildReconciler provides helpers for initializing or updating a set of + * children. Its output is suitable for passing it onto ReactMultiChild which + * does diffed reordering and insertion. + */ + var ReactChildReconciler = { + /** + * Generates a "mount image" for each of the supplied children. In the case + * of `ReactDOMComponent`, a mount image is a string of markup. + * + * @param {?object} nestedChildNodes Nested child maps. + * @return {?object} A set of child instances. + * @internal + */ + instantiateChildren: function (nestedChildNodes, transaction, context) { + if (nestedChildNodes == null) { + return null; + } + var childInstances = {}; + traverseAllChildren(nestedChildNodes, instantiateChild, childInstances); + return childInstances; + }, + + /** + * Updates the rendered children and returns a new set of children. + * + * @param {?object} prevChildren Previously initialized set of children. + * @param {?object} nextChildren Flat child element maps. + * @param {ReactReconcileTransaction} transaction + * @param {object} context + * @return {?object} A new set of child instances. + * @internal + */ + updateChildren: function (prevChildren, nextChildren, transaction, context) { + // We currently don't have a way to track moves here but if we use iterators + // instead of for..in we can zip the iterators and check if an item has + // moved. + // TODO: If nothing has changed, return the prevChildren object so that we + // can quickly bailout if nothing has changed. + if (!nextChildren && !prevChildren) { + return null; + } + var name; + for (name in nextChildren) { + if (!nextChildren.hasOwnProperty(name)) { + continue; + } + var prevChild = prevChildren && prevChildren[name]; + var prevElement = prevChild && prevChild._currentElement; + var nextElement = nextChildren[name]; + if (prevChild != null && shouldUpdateReactComponent(prevElement, nextElement)) { + ReactReconciler.receiveComponent(prevChild, nextElement, transaction, context); + nextChildren[name] = prevChild; + } else { + if (prevChild) { + ReactReconciler.unmountComponent(prevChild, name); + } + // The child must be instantiated before it's mounted. + var nextChildInstance = instantiateReactComponent(nextElement, null); + nextChildren[name] = nextChildInstance; + } + } + // Unmount children that are no longer present. + for (name in prevChildren) { + if (prevChildren.hasOwnProperty(name) && !(nextChildren && nextChildren.hasOwnProperty(name))) { + ReactReconciler.unmountComponent(prevChildren[name]); + } + } + return nextChildren; + }, + + /** + * Unmounts all rendered children. This should be used to clean up children + * when this component is unmounted. + * + * @param {?object} renderedChildren Previously initialized set of children. + * @internal + */ + unmountChildren: function (renderedChildren) { + for (var name in renderedChildren) { + if (renderedChildren.hasOwnProperty(name)) { + var renderedChild = renderedChildren[name]; + ReactReconciler.unmountComponent(renderedChild); + } + } + } + + }; + + module.exports = ReactChildReconciler; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 115 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule flattenChildren + */ + + 'use strict'; + + var traverseAllChildren = __webpack_require__(110); + var warning = __webpack_require__(24); + + /** + * @param {function} traverseContext Context passed through traversal. + * @param {?ReactComponent} child React child component. + * @param {!string} name String name of key path to child. + */ + function flattenSingleChildIntoContext(traverseContext, child, name) { + // We found a component instance. + var result = traverseContext; + var keyUnique = result[name] === undefined; + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(keyUnique, 'flattenChildren(...): Encountered two children with the same key, ' + '`%s`. Child keys must be unique; when two children share a key, only ' + 'the first child will be used.', name) : undefined; + } + if (keyUnique && child != null) { + result[name] = child; + } + } + + /** + * Flattens children that are typically specified as `props.children`. Any null + * children will not be included in the resulting object. + * @return {!object} flattened children keyed by name. + */ + function flattenChildren(children) { + if (children == null) { + return children; + } + var result = {}; + traverseAllChildren(children, flattenSingleChildIntoContext, result); + return result; + } + + module.exports = flattenChildren; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 116 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule shallowEqual + * @typechecks + * + */ + + 'use strict'; + + var hasOwnProperty = Object.prototype.hasOwnProperty; + + /** + * Performs equality by iterating through keys on an object and returning false + * when any key has values which are not strictly equal between the arguments. + * Returns true when the values of all keys are strictly equal. + */ + function shallowEqual(objA, objB) { + if (objA === objB) { + return true; + } + + if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) { + return false; + } + + var keysA = Object.keys(objA); + var keysB = Object.keys(objB); + + if (keysA.length !== keysB.length) { + return false; + } + + // Test for A's keys different from B. + var bHasOwnProperty = hasOwnProperty.bind(objB); + for (var i = 0; i < keysA.length; i++) { + if (!bHasOwnProperty(keysA[i]) || objA[keysA[i]] !== objB[keysA[i]]) { + return false; + } + } + + return true; + } + + module.exports = shallowEqual; + +/***/ }, +/* 117 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactEventListener + * @typechecks static-only + */ + + 'use strict'; + + var EventListener = __webpack_require__(118); + var ExecutionEnvironment = __webpack_require__(8); + var PooledClass = __webpack_require__(55); + var ReactInstanceHandles = __webpack_require__(44); + var ReactMount = __webpack_require__(27); + var ReactUpdates = __webpack_require__(53); + + var assign = __webpack_require__(38); + var getEventTarget = __webpack_require__(80); + var getUnboundedScrollPosition = __webpack_require__(119); + + var DOCUMENT_FRAGMENT_NODE_TYPE = 11; + + /** + * Finds the parent React component of `node`. + * + * @param {*} node + * @return {?DOMEventTarget} Parent container, or `null` if the specified node + * is not nested. + */ + function findParent(node) { + // TODO: It may be a good idea to cache this to prevent unnecessary DOM + // traversal, but caching is difficult to do correctly without using a + // mutation observer to listen for all DOM changes. + var nodeID = ReactMount.getID(node); + var rootID = ReactInstanceHandles.getReactRootIDFromNodeID(nodeID); + var container = ReactMount.findReactContainerForID(rootID); + var parent = ReactMount.getFirstReactDOM(container); + return parent; + } + + // Used to store ancestor hierarchy in top level callback + function TopLevelCallbackBookKeeping(topLevelType, nativeEvent) { + this.topLevelType = topLevelType; + this.nativeEvent = nativeEvent; + this.ancestors = []; + } + assign(TopLevelCallbackBookKeeping.prototype, { + destructor: function () { + this.topLevelType = null; + this.nativeEvent = null; + this.ancestors.length = 0; + } + }); + PooledClass.addPoolingTo(TopLevelCallbackBookKeeping, PooledClass.twoArgumentPooler); + + function handleTopLevelImpl(bookKeeping) { + // TODO: Re-enable event.path handling + // + // if (bookKeeping.nativeEvent.path && bookKeeping.nativeEvent.path.length > 1) { + // // New browsers have a path attribute on native events + // handleTopLevelWithPath(bookKeeping); + // } else { + // // Legacy browsers don't have a path attribute on native events + // handleTopLevelWithoutPath(bookKeeping); + // } + + void handleTopLevelWithPath; // temporarily unused + handleTopLevelWithoutPath(bookKeeping); + } + + // Legacy browsers don't have a path attribute on native events + function handleTopLevelWithoutPath(bookKeeping) { + var topLevelTarget = ReactMount.getFirstReactDOM(getEventTarget(bookKeeping.nativeEvent)) || window; + + // Loop through the hierarchy, in case there's any nested components. + // It's important that we build the array of ancestors before calling any + // event handlers, because event handlers can modify the DOM, leading to + // inconsistencies with ReactMount's node cache. See #1105. + var ancestor = topLevelTarget; + while (ancestor) { + bookKeeping.ancestors.push(ancestor); + ancestor = findParent(ancestor); + } + + for (var i = 0; i < bookKeeping.ancestors.length; i++) { + topLevelTarget = bookKeeping.ancestors[i]; + var topLevelTargetID = ReactMount.getID(topLevelTarget) || ''; + ReactEventListener._handleTopLevel(bookKeeping.topLevelType, topLevelTarget, topLevelTargetID, bookKeeping.nativeEvent, getEventTarget(bookKeeping.nativeEvent)); + } + } + + // New browsers have a path attribute on native events + function handleTopLevelWithPath(bookKeeping) { + var path = bookKeeping.nativeEvent.path; + var currentNativeTarget = path[0]; + var eventsFired = 0; + for (var i = 0; i < path.length; i++) { + var currentPathElement = path[i]; + if (currentPathElement.nodeType === DOCUMENT_FRAGMENT_NODE_TYPE) { + currentNativeTarget = path[i + 1]; + } + // TODO: slow + var reactParent = ReactMount.getFirstReactDOM(currentPathElement); + if (reactParent === currentPathElement) { + var currentPathElementID = ReactMount.getID(currentPathElement); + var newRootID = ReactInstanceHandles.getReactRootIDFromNodeID(currentPathElementID); + bookKeeping.ancestors.push(currentPathElement); + + var topLevelTargetID = ReactMount.getID(currentPathElement) || ''; + eventsFired++; + ReactEventListener._handleTopLevel(bookKeeping.topLevelType, currentPathElement, topLevelTargetID, bookKeeping.nativeEvent, currentNativeTarget); + + // Jump to the root of this React render tree + while (currentPathElementID !== newRootID) { + i++; + currentPathElement = path[i]; + currentPathElementID = ReactMount.getID(currentPathElement); + } + } + } + if (eventsFired === 0) { + ReactEventListener._handleTopLevel(bookKeeping.topLevelType, window, '', bookKeeping.nativeEvent, getEventTarget(bookKeeping.nativeEvent)); + } + } + + function scrollValueMonitor(cb) { + var scrollPosition = getUnboundedScrollPosition(window); + cb(scrollPosition); + } + + var ReactEventListener = { + _enabled: true, + _handleTopLevel: null, + + WINDOW_HANDLE: ExecutionEnvironment.canUseDOM ? window : null, + + setHandleTopLevel: function (handleTopLevel) { + ReactEventListener._handleTopLevel = handleTopLevel; + }, + + setEnabled: function (enabled) { + ReactEventListener._enabled = !!enabled; + }, + + isEnabled: function () { + return ReactEventListener._enabled; + }, + + /** + * Traps top-level events by using event bubbling. + * + * @param {string} topLevelType Record from `EventConstants`. + * @param {string} handlerBaseName Event name (e.g. "click"). + * @param {object} handle Element on which to attach listener. + * @return {?object} An object with a remove function which will forcefully + * remove the listener. + * @internal + */ + trapBubbledEvent: function (topLevelType, handlerBaseName, handle) { + var element = handle; + if (!element) { + return null; + } + return EventListener.listen(element, handlerBaseName, ReactEventListener.dispatchEvent.bind(null, topLevelType)); + }, + + /** + * Traps a top-level event by using event capturing. + * + * @param {string} topLevelType Record from `EventConstants`. + * @param {string} handlerBaseName Event name (e.g. "click"). + * @param {object} handle Element on which to attach listener. + * @return {?object} An object with a remove function which will forcefully + * remove the listener. + * @internal + */ + trapCapturedEvent: function (topLevelType, handlerBaseName, handle) { + var element = handle; + if (!element) { + return null; + } + return EventListener.capture(element, handlerBaseName, ReactEventListener.dispatchEvent.bind(null, topLevelType)); + }, + + monitorScrollValue: function (refresh) { + var callback = scrollValueMonitor.bind(null, refresh); + EventListener.listen(window, 'scroll', callback); + }, + + dispatchEvent: function (topLevelType, nativeEvent) { + if (!ReactEventListener._enabled) { + return; + } + + var bookKeeping = TopLevelCallbackBookKeeping.getPooled(topLevelType, nativeEvent); + try { + // Event queue being processed in the same cycle allows + // `preventDefault`. + ReactUpdates.batchedUpdates(handleTopLevelImpl, bookKeeping); + } finally { + TopLevelCallbackBookKeeping.release(bookKeeping); + } + } + }; + + module.exports = ReactEventListener; + +/***/ }, +/* 118 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule EventListener + * @typechecks + */ + + 'use strict'; + + var emptyFunction = __webpack_require__(14); + + /** + * Upstream version of event listener. Does not take into account specific + * nature of platform. + */ + var EventListener = { + /** + * Listen to DOM events during the bubble phase. + * + * @param {DOMEventTarget} target DOM element to register listener on. + * @param {string} eventType Event type, e.g. 'click' or 'mouseover'. + * @param {function} callback Callback function. + * @return {object} Object with a `remove` method. + */ + listen: function (target, eventType, callback) { + if (target.addEventListener) { + target.addEventListener(eventType, callback, false); + return { + remove: function () { + target.removeEventListener(eventType, callback, false); + } + }; + } else if (target.attachEvent) { + target.attachEvent('on' + eventType, callback); + return { + remove: function () { + target.detachEvent('on' + eventType, callback); + } + }; + } + }, + + /** + * Listen to DOM events during the capture phase. + * + * @param {DOMEventTarget} target DOM element to register listener on. + * @param {string} eventType Event type, e.g. 'click' or 'mouseover'. + * @param {function} callback Callback function. + * @return {object} Object with a `remove` method. + */ + capture: function (target, eventType, callback) { + if (target.addEventListener) { + target.addEventListener(eventType, callback, true); + return { + remove: function () { + target.removeEventListener(eventType, callback, true); + } + }; + } else { + if (process.env.NODE_ENV !== 'production') { + console.error('Attempted to listen to events during the capture phase on a ' + 'browser that does not support the capture phase. Your application ' + 'will not receive some events.'); + } + return { + remove: emptyFunction + }; + } + }, + + registerDefault: function () {} + }; + + module.exports = EventListener; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 119 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule getUnboundedScrollPosition + * @typechecks + */ + + 'use strict'; + + /** + * Gets the scroll position of the supplied element or window. + * + * The return values are unbounded, unlike `getScrollPosition`. This means they + * may be negative or exceed the element boundaries (which is possible using + * inertial scrolling). + * + * @param {DOMWindow|DOMElement} scrollable + * @return {object} Map with `x` and `y` keys. + */ + function getUnboundedScrollPosition(scrollable) { + if (scrollable === window) { + return { + x: window.pageXOffset || document.documentElement.scrollLeft, + y: window.pageYOffset || document.documentElement.scrollTop + }; + } + return { + x: scrollable.scrollLeft, + y: scrollable.scrollTop + }; + } + + module.exports = getUnboundedScrollPosition; + +/***/ }, +/* 120 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactInjection + */ + + 'use strict'; + + var DOMProperty = __webpack_require__(22); + var EventPluginHub = __webpack_require__(30); + var ReactComponentEnvironment = __webpack_require__(63); + var ReactClass = __webpack_require__(121); + var ReactEmptyComponent = __webpack_require__(67); + var ReactBrowserEventEmitter = __webpack_require__(28); + var ReactNativeComponent = __webpack_require__(68); + var ReactPerf = __webpack_require__(17); + var ReactRootIndex = __webpack_require__(45); + var ReactUpdates = __webpack_require__(53); + + var ReactInjection = { + Component: ReactComponentEnvironment.injection, + Class: ReactClass.injection, + DOMProperty: DOMProperty.injection, + EmptyComponent: ReactEmptyComponent.injection, + EventPluginHub: EventPluginHub.injection, + EventEmitter: ReactBrowserEventEmitter.injection, + NativeComponent: ReactNativeComponent.injection, + Perf: ReactPerf.injection, + RootIndex: ReactRootIndex.injection, + Updates: ReactUpdates.injection + }; + + module.exports = ReactInjection; + +/***/ }, +/* 121 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactClass + */ + + 'use strict'; + + var ReactComponent = __webpack_require__(122); + var ReactElement = __webpack_require__(41); + var ReactPropTypeLocations = __webpack_require__(64); + var ReactPropTypeLocationNames = __webpack_require__(65); + var ReactNoopUpdateQueue = __webpack_require__(123); + + var assign = __webpack_require__(38); + var emptyObject = __webpack_require__(57); + var invariant = __webpack_require__(12); + var keyMirror = __webpack_require__(16); + var keyOf = __webpack_require__(78); + var warning = __webpack_require__(24); + + var MIXINS_KEY = keyOf({ mixins: null }); + + /** + * Policies that describe methods in `ReactClassInterface`. + */ + var SpecPolicy = keyMirror({ + /** + * These methods may be defined only once by the class specification or mixin. + */ + DEFINE_ONCE: null, + /** + * These methods may be defined by both the class specification and mixins. + * Subsequent definitions will be chained. These methods must return void. + */ + DEFINE_MANY: null, + /** + * These methods are overriding the base class. + */ + OVERRIDE_BASE: null, + /** + * These methods are similar to DEFINE_MANY, except we assume they return + * objects. We try to merge the keys of the return values of all the mixed in + * functions. If there is a key conflict we throw. + */ + DEFINE_MANY_MERGED: null + }); + + var injectedMixins = []; + + var warnedSetProps = false; + function warnSetProps() { + if (!warnedSetProps) { + warnedSetProps = true; + process.env.NODE_ENV !== 'production' ? warning(false, 'setProps(...) and replaceProps(...) are deprecated. ' + 'Instead, call render again at the top level.') : undefined; + } + } + + /** + * Composite components are higher-level components that compose other composite + * or native components. + * + * To create a new type of `ReactClass`, pass a specification of + * your new class to `React.createClass`. The only requirement of your class + * specification is that you implement a `render` method. + * + * var MyComponent = React.createClass({ + * render: function() { + * return <div>Hello World</div>; + * } + * }); + * + * The class specification supports a specific protocol of methods that have + * special meaning (e.g. `render`). See `ReactClassInterface` for + * more the comprehensive protocol. Any other properties and methods in the + * class specification will be available on the prototype. + * + * @interface ReactClassInterface + * @internal + */ + var ReactClassInterface = { + + /** + * An array of Mixin objects to include when defining your component. + * + * @type {array} + * @optional + */ + mixins: SpecPolicy.DEFINE_MANY, + + /** + * An object containing properties and methods that should be defined on + * the component's constructor instead of its prototype (static methods). + * + * @type {object} + * @optional + */ + statics: SpecPolicy.DEFINE_MANY, + + /** + * Definition of prop types for this component. + * + * @type {object} + * @optional + */ + propTypes: SpecPolicy.DEFINE_MANY, + + /** + * Definition of context types for this component. + * + * @type {object} + * @optional + */ + contextTypes: SpecPolicy.DEFINE_MANY, + + /** + * Definition of context types this component sets for its children. + * + * @type {object} + * @optional + */ + childContextTypes: SpecPolicy.DEFINE_MANY, + + // ==== Definition methods ==== + + /** + * Invoked when the component is mounted. Values in the mapping will be set on + * `this.props` if that prop is not specified (i.e. using an `in` check). + * + * This method is invoked before `getInitialState` and therefore cannot rely + * on `this.state` or use `this.setState`. + * + * @return {object} + * @optional + */ + getDefaultProps: SpecPolicy.DEFINE_MANY_MERGED, + + /** + * Invoked once before the component is mounted. The return value will be used + * as the initial value of `this.state`. + * + * getInitialState: function() { + * return { + * isOn: false, + * fooBaz: new BazFoo() + * } + * } + * + * @return {object} + * @optional + */ + getInitialState: SpecPolicy.DEFINE_MANY_MERGED, + + /** + * @return {object} + * @optional + */ + getChildContext: SpecPolicy.DEFINE_MANY_MERGED, + + /** + * Uses props from `this.props` and state from `this.state` to render the + * structure of the component. + * + * No guarantees are made about when or how often this method is invoked, so + * it must not have side effects. + * + * render: function() { + * var name = this.props.name; + * return <div>Hello, {name}!</div>; + * } + * + * @return {ReactComponent} + * @nosideeffects + * @required + */ + render: SpecPolicy.DEFINE_ONCE, + + // ==== Delegate methods ==== + + /** + * Invoked when the component is initially created and about to be mounted. + * This may have side effects, but any external subscriptions or data created + * by this method must be cleaned up in `componentWillUnmount`. + * + * @optional + */ + componentWillMount: SpecPolicy.DEFINE_MANY, + + /** + * Invoked when the component has been mounted and has a DOM representation. + * However, there is no guarantee that the DOM node is in the document. + * + * Use this as an opportunity to operate on the DOM when the component has + * been mounted (initialized and rendered) for the first time. + * + * @param {DOMElement} rootNode DOM element representing the component. + * @optional + */ + componentDidMount: SpecPolicy.DEFINE_MANY, + + /** + * Invoked before the component receives new props. + * + * Use this as an opportunity to react to a prop transition by updating the + * state using `this.setState`. Current props are accessed via `this.props`. + * + * componentWillReceiveProps: function(nextProps, nextContext) { + * this.setState({ + * likesIncreasing: nextProps.likeCount > this.props.likeCount + * }); + * } + * + * NOTE: There is no equivalent `componentWillReceiveState`. An incoming prop + * transition may cause a state change, but the opposite is not true. If you + * need it, you are probably looking for `componentWillUpdate`. + * + * @param {object} nextProps + * @optional + */ + componentWillReceiveProps: SpecPolicy.DEFINE_MANY, + + /** + * Invoked while deciding if the component should be updated as a result of + * receiving new props, state and/or context. + * + * Use this as an opportunity to `return false` when you're certain that the + * transition to the new props/state/context will not require a component + * update. + * + * shouldComponentUpdate: function(nextProps, nextState, nextContext) { + * return !equal(nextProps, this.props) || + * !equal(nextState, this.state) || + * !equal(nextContext, this.context); + * } + * + * @param {object} nextProps + * @param {?object} nextState + * @param {?object} nextContext + * @return {boolean} True if the component should update. + * @optional + */ + shouldComponentUpdate: SpecPolicy.DEFINE_ONCE, + + /** + * Invoked when the component is about to update due to a transition from + * `this.props`, `this.state` and `this.context` to `nextProps`, `nextState` + * and `nextContext`. + * + * Use this as an opportunity to perform preparation before an update occurs. + * + * NOTE: You **cannot** use `this.setState()` in this method. + * + * @param {object} nextProps + * @param {?object} nextState + * @param {?object} nextContext + * @param {ReactReconcileTransaction} transaction + * @optional + */ + componentWillUpdate: SpecPolicy.DEFINE_MANY, + + /** + * Invoked when the component's DOM representation has been updated. + * + * Use this as an opportunity to operate on the DOM when the component has + * been updated. + * + * @param {object} prevProps + * @param {?object} prevState + * @param {?object} prevContext + * @param {DOMElement} rootNode DOM element representing the component. + * @optional + */ + componentDidUpdate: SpecPolicy.DEFINE_MANY, + + /** + * Invoked when the component is about to be removed from its parent and have + * its DOM representation destroyed. + * + * Use this as an opportunity to deallocate any external resources. + * + * NOTE: There is no `componentDidUnmount` since your component will have been + * destroyed by that point. + * + * @optional + */ + componentWillUnmount: SpecPolicy.DEFINE_MANY, + + // ==== Advanced methods ==== + + /** + * Updates the component's currently mounted DOM representation. + * + * By default, this implements React's rendering and reconciliation algorithm. + * Sophisticated clients may wish to override this. + * + * @param {ReactReconcileTransaction} transaction + * @internal + * @overridable + */ + updateComponent: SpecPolicy.OVERRIDE_BASE + + }; + + /** + * Mapping from class specification keys to special processing functions. + * + * Although these are declared like instance properties in the specification + * when defining classes using `React.createClass`, they are actually static + * and are accessible on the constructor instead of the prototype. Despite + * being static, they must be defined outside of the "statics" key under + * which all other static methods are defined. + */ + var RESERVED_SPEC_KEYS = { + displayName: function (Constructor, displayName) { + Constructor.displayName = displayName; + }, + mixins: function (Constructor, mixins) { + if (mixins) { + for (var i = 0; i < mixins.length; i++) { + mixSpecIntoComponent(Constructor, mixins[i]); + } + } + }, + childContextTypes: function (Constructor, childContextTypes) { + if (process.env.NODE_ENV !== 'production') { + validateTypeDef(Constructor, childContextTypes, ReactPropTypeLocations.childContext); + } + Constructor.childContextTypes = assign({}, Constructor.childContextTypes, childContextTypes); + }, + contextTypes: function (Constructor, contextTypes) { + if (process.env.NODE_ENV !== 'production') { + validateTypeDef(Constructor, contextTypes, ReactPropTypeLocations.context); + } + Constructor.contextTypes = assign({}, Constructor.contextTypes, contextTypes); + }, + /** + * Special case getDefaultProps which should move into statics but requires + * automatic merging. + */ + getDefaultProps: function (Constructor, getDefaultProps) { + if (Constructor.getDefaultProps) { + Constructor.getDefaultProps = createMergedResultFunction(Constructor.getDefaultProps, getDefaultProps); + } else { + Constructor.getDefaultProps = getDefaultProps; + } + }, + propTypes: function (Constructor, propTypes) { + if (process.env.NODE_ENV !== 'production') { + validateTypeDef(Constructor, propTypes, ReactPropTypeLocations.prop); + } + Constructor.propTypes = assign({}, Constructor.propTypes, propTypes); + }, + statics: function (Constructor, statics) { + mixStaticSpecIntoComponent(Constructor, statics); + }, + autobind: function () {} }; + + // noop + function validateTypeDef(Constructor, typeDef, location) { + for (var propName in typeDef) { + if (typeDef.hasOwnProperty(propName)) { + // use a warning instead of an invariant so components + // don't show up in prod but not in __DEV__ + process.env.NODE_ENV !== 'production' ? warning(typeof typeDef[propName] === 'function', '%s: %s type `%s` is invalid; it must be a function, usually from ' + 'React.PropTypes.', Constructor.displayName || 'ReactClass', ReactPropTypeLocationNames[location], propName) : undefined; + } + } + } + + function validateMethodOverride(proto, name) { + var specPolicy = ReactClassInterface.hasOwnProperty(name) ? ReactClassInterface[name] : null; + + // Disallow overriding of base class methods unless explicitly allowed. + if (ReactClassMixin.hasOwnProperty(name)) { + !(specPolicy === SpecPolicy.OVERRIDE_BASE) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClassInterface: You are attempting to override ' + '`%s` from your class specification. Ensure that your method names ' + 'do not overlap with React methods.', name) : invariant(false) : undefined; + } + + // Disallow defining methods more than once unless explicitly allowed. + if (proto.hasOwnProperty(name)) { + !(specPolicy === SpecPolicy.DEFINE_MANY || specPolicy === SpecPolicy.DEFINE_MANY_MERGED) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClassInterface: You are attempting to define ' + '`%s` on your component more than once. This conflict may be due ' + 'to a mixin.', name) : invariant(false) : undefined; + } + } + + /** + * Mixin helper which handles policy validation and reserved + * specification keys when building React classses. + */ + function mixSpecIntoComponent(Constructor, spec) { + if (!spec) { + return; + } + + !(typeof spec !== 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClass: You\'re attempting to ' + 'use a component class as a mixin. Instead, just use a regular object.') : invariant(false) : undefined; + !!ReactElement.isValidElement(spec) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClass: You\'re attempting to ' + 'use a component as a mixin. Instead, just use a regular object.') : invariant(false) : undefined; + + var proto = Constructor.prototype; + + // By handling mixins before any other properties, we ensure the same + // chaining order is applied to methods with DEFINE_MANY policy, whether + // mixins are listed before or after these methods in the spec. + if (spec.hasOwnProperty(MIXINS_KEY)) { + RESERVED_SPEC_KEYS.mixins(Constructor, spec.mixins); + } + + for (var name in spec) { + if (!spec.hasOwnProperty(name)) { + continue; + } + + if (name === MIXINS_KEY) { + // We have already handled mixins in a special case above. + continue; + } + + var property = spec[name]; + validateMethodOverride(proto, name); + + if (RESERVED_SPEC_KEYS.hasOwnProperty(name)) { + RESERVED_SPEC_KEYS[name](Constructor, property); + } else { + // Setup methods on prototype: + // The following member methods should not be automatically bound: + // 1. Expected ReactClass methods (in the "interface"). + // 2. Overridden methods (that were mixed in). + var isReactClassMethod = ReactClassInterface.hasOwnProperty(name); + var isAlreadyDefined = proto.hasOwnProperty(name); + var isFunction = typeof property === 'function'; + var shouldAutoBind = isFunction && !isReactClassMethod && !isAlreadyDefined && spec.autobind !== false; + + if (shouldAutoBind) { + if (!proto.__reactAutoBindMap) { + proto.__reactAutoBindMap = {}; + } + proto.__reactAutoBindMap[name] = property; + proto[name] = property; + } else { + if (isAlreadyDefined) { + var specPolicy = ReactClassInterface[name]; + + // These cases should already be caught by validateMethodOverride. + !(isReactClassMethod && (specPolicy === SpecPolicy.DEFINE_MANY_MERGED || specPolicy === SpecPolicy.DEFINE_MANY)) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClass: Unexpected spec policy %s for key %s ' + 'when mixing in component specs.', specPolicy, name) : invariant(false) : undefined; + + // For methods which are defined more than once, call the existing + // methods before calling the new property, merging if appropriate. + if (specPolicy === SpecPolicy.DEFINE_MANY_MERGED) { + proto[name] = createMergedResultFunction(proto[name], property); + } else if (specPolicy === SpecPolicy.DEFINE_MANY) { + proto[name] = createChainedFunction(proto[name], property); + } + } else { + proto[name] = property; + if (process.env.NODE_ENV !== 'production') { + // Add verbose displayName to the function, which helps when looking + // at profiling tools. + if (typeof property === 'function' && spec.displayName) { + proto[name].displayName = spec.displayName + '_' + name; + } + } + } + } + } + } + } + + function mixStaticSpecIntoComponent(Constructor, statics) { + if (!statics) { + return; + } + for (var name in statics) { + var property = statics[name]; + if (!statics.hasOwnProperty(name)) { + continue; + } + + var isReserved = (name in RESERVED_SPEC_KEYS); + !!isReserved ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClass: You are attempting to define a reserved ' + 'property, `%s`, that shouldn\'t be on the "statics" key. Define it ' + 'as an instance property instead; it will still be accessible on the ' + 'constructor.', name) : invariant(false) : undefined; + + var isInherited = (name in Constructor); + !!isInherited ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClass: You are attempting to define ' + '`%s` on your component more than once. This conflict may be ' + 'due to a mixin.', name) : invariant(false) : undefined; + Constructor[name] = property; + } + } + + /** + * Merge two objects, but throw if both contain the same key. + * + * @param {object} one The first object, which is mutated. + * @param {object} two The second object + * @return {object} one after it has been mutated to contain everything in two. + */ + function mergeIntoWithNoDuplicateKeys(one, two) { + !(one && two && typeof one === 'object' && typeof two === 'object') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects.') : invariant(false) : undefined; + + for (var key in two) { + if (two.hasOwnProperty(key)) { + !(one[key] === undefined) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'mergeIntoWithNoDuplicateKeys(): ' + 'Tried to merge two objects with the same key: `%s`. This conflict ' + 'may be due to a mixin; in particular, this may be caused by two ' + 'getInitialState() or getDefaultProps() methods returning objects ' + 'with clashing keys.', key) : invariant(false) : undefined; + one[key] = two[key]; + } + } + return one; + } + + /** + * Creates a function that invokes two functions and merges their return values. + * + * @param {function} one Function to invoke first. + * @param {function} two Function to invoke second. + * @return {function} Function that invokes the two argument functions. + * @private + */ + function createMergedResultFunction(one, two) { + return function mergedResult() { + var a = one.apply(this, arguments); + var b = two.apply(this, arguments); + if (a == null) { + return b; + } else if (b == null) { + return a; + } + var c = {}; + mergeIntoWithNoDuplicateKeys(c, a); + mergeIntoWithNoDuplicateKeys(c, b); + return c; + }; + } + + /** + * Creates a function that invokes two functions and ignores their return vales. + * + * @param {function} one Function to invoke first. + * @param {function} two Function to invoke second. + * @return {function} Function that invokes the two argument functions. + * @private + */ + function createChainedFunction(one, two) { + return function chainedFunction() { + one.apply(this, arguments); + two.apply(this, arguments); + }; + } + + /** + * Binds a method to the component. + * + * @param {object} component Component whose method is going to be bound. + * @param {function} method Method to be bound. + * @return {function} The bound method. + */ + function bindAutoBindMethod(component, method) { + var boundMethod = method.bind(component); + if (process.env.NODE_ENV !== 'production') { + boundMethod.__reactBoundContext = component; + boundMethod.__reactBoundMethod = method; + boundMethod.__reactBoundArguments = null; + var componentName = component.constructor.displayName; + var _bind = boundMethod.bind; + /* eslint-disable block-scoped-var, no-undef */ + boundMethod.bind = function (newThis) { + for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + // User is trying to bind() an autobound method; we effectively will + // ignore the value of "this" that the user is trying to use, so + // let's warn. + if (newThis !== component && newThis !== null) { + process.env.NODE_ENV !== 'production' ? warning(false, 'bind(): React component methods may only be bound to the ' + 'component instance. See %s', componentName) : undefined; + } else if (!args.length) { + process.env.NODE_ENV !== 'production' ? warning(false, 'bind(): You are binding a component method to the component. ' + 'React does this for you automatically in a high-performance ' + 'way, so you can safely remove this call. See %s', componentName) : undefined; + return boundMethod; + } + var reboundMethod = _bind.apply(boundMethod, arguments); + reboundMethod.__reactBoundContext = component; + reboundMethod.__reactBoundMethod = method; + reboundMethod.__reactBoundArguments = args; + return reboundMethod; + /* eslint-enable */ + }; + } + return boundMethod; + } + + /** + * Binds all auto-bound methods in a component. + * + * @param {object} component Component whose method is going to be bound. + */ + function bindAutoBindMethods(component) { + for (var autoBindKey in component.__reactAutoBindMap) { + if (component.__reactAutoBindMap.hasOwnProperty(autoBindKey)) { + var method = component.__reactAutoBindMap[autoBindKey]; + component[autoBindKey] = bindAutoBindMethod(component, method); + } + } + } + + /** + * Add more to the ReactClass base class. These are all legacy features and + * therefore not already part of the modern ReactComponent. + */ + var ReactClassMixin = { + + /** + * TODO: This will be deprecated because state should always keep a consistent + * type signature and the only use case for this, is to avoid that. + */ + replaceState: function (newState, callback) { + this.updater.enqueueReplaceState(this, newState); + if (callback) { + this.updater.enqueueCallback(this, callback); + } + }, + + /** + * Checks whether or not this composite component is mounted. + * @return {boolean} True if mounted, false otherwise. + * @protected + * @final + */ + isMounted: function () { + return this.updater.isMounted(this); + }, + + /** + * Sets a subset of the props. + * + * @param {object} partialProps Subset of the next props. + * @param {?function} callback Called after props are updated. + * @final + * @public + * @deprecated + */ + setProps: function (partialProps, callback) { + if (process.env.NODE_ENV !== 'production') { + warnSetProps(); + } + this.updater.enqueueSetProps(this, partialProps); + if (callback) { + this.updater.enqueueCallback(this, callback); + } + }, + + /** + * Replace all the props. + * + * @param {object} newProps Subset of the next props. + * @param {?function} callback Called after props are updated. + * @final + * @public + * @deprecated + */ + replaceProps: function (newProps, callback) { + if (process.env.NODE_ENV !== 'production') { + warnSetProps(); + } + this.updater.enqueueReplaceProps(this, newProps); + if (callback) { + this.updater.enqueueCallback(this, callback); + } + } + }; + + var ReactClassComponent = function () {}; + assign(ReactClassComponent.prototype, ReactComponent.prototype, ReactClassMixin); + + /** + * Module for creating composite components. + * + * @class ReactClass + */ + var ReactClass = { + + /** + * Creates a composite component class given a class specification. + * + * @param {object} spec Class specification (which must define `render`). + * @return {function} Component constructor function. + * @public + */ + createClass: function (spec) { + var Constructor = function (props, context, updater) { + // This constructor is overridden by mocks. The argument is used + // by mocks to assert on what gets mounted. + + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(this instanceof Constructor, 'Something is calling a React component directly. Use a factory or ' + 'JSX instead. See: https://fb.me/react-legacyfactory') : undefined; + } + + // Wire up auto-binding + if (this.__reactAutoBindMap) { + bindAutoBindMethods(this); + } + + this.props = props; + this.context = context; + this.refs = emptyObject; + this.updater = updater || ReactNoopUpdateQueue; + + this.state = null; + + // ReactClasses doesn't have constructors. Instead, they use the + // getInitialState and componentWillMount methods for initialization. + + var initialState = this.getInitialState ? this.getInitialState() : null; + if (process.env.NODE_ENV !== 'production') { + // We allow auto-mocks to proceed as if they're returning null. + if (typeof initialState === 'undefined' && this.getInitialState._isMockFunction) { + // This is probably bad practice. Consider warning here and + // deprecating this convenience. + initialState = null; + } + } + !(typeof initialState === 'object' && !Array.isArray(initialState)) ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s.getInitialState(): must return an object or null', Constructor.displayName || 'ReactCompositeComponent') : invariant(false) : undefined; + + this.state = initialState; + }; + Constructor.prototype = new ReactClassComponent(); + Constructor.prototype.constructor = Constructor; + + injectedMixins.forEach(mixSpecIntoComponent.bind(null, Constructor)); + + mixSpecIntoComponent(Constructor, spec); + + // Initialize the defaultProps property after all mixins have been merged. + if (Constructor.getDefaultProps) { + Constructor.defaultProps = Constructor.getDefaultProps(); + } + + if (process.env.NODE_ENV !== 'production') { + // This is a tag to indicate that the use of these method names is ok, + // since it's used with createClass. If it's not, then it's likely a + // mistake so we'll warn you to use the static property, property + // initializer or constructor respectively. + if (Constructor.getDefaultProps) { + Constructor.getDefaultProps.isReactClassApproved = {}; + } + if (Constructor.prototype.getInitialState) { + Constructor.prototype.getInitialState.isReactClassApproved = {}; + } + } + + !Constructor.prototype.render ? process.env.NODE_ENV !== 'production' ? invariant(false, 'createClass(...): Class specification must implement a `render` method.') : invariant(false) : undefined; + + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(!Constructor.prototype.componentShouldUpdate, '%s has a method called ' + 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' + 'The name is phrased as a question because the function is ' + 'expected to return a value.', spec.displayName || 'A component') : undefined; + process.env.NODE_ENV !== 'production' ? warning(!Constructor.prototype.componentWillRecieveProps, '%s has a method called ' + 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', spec.displayName || 'A component') : undefined; + } + + // Reduce time spent doing lookups by setting these on the prototype. + for (var methodName in ReactClassInterface) { + if (!Constructor.prototype[methodName]) { + Constructor.prototype[methodName] = null; + } + } + + return Constructor; + }, + + injection: { + injectMixin: function (mixin) { + injectedMixins.push(mixin); + } + } + + }; + + module.exports = ReactClass; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 122 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactComponent + */ + + 'use strict'; + + var ReactNoopUpdateQueue = __webpack_require__(123); + + var canDefineProperty = __webpack_require__(42); + var emptyObject = __webpack_require__(57); + var invariant = __webpack_require__(12); + var warning = __webpack_require__(24); + + /** + * Base class helpers for the updating state of a component. + */ + function ReactComponent(props, context, updater) { + this.props = props; + this.context = context; + this.refs = emptyObject; + // We initialize the default updater but the real one gets injected by the + // renderer. + this.updater = updater || ReactNoopUpdateQueue; + } + + ReactComponent.prototype.isReactComponent = {}; + + /** + * Sets a subset of the state. Always use this to mutate + * state. You should treat `this.state` as immutable. + * + * There is no guarantee that `this.state` will be immediately updated, so + * accessing `this.state` after calling this method may return the old value. + * + * There is no guarantee that calls to `setState` will run synchronously, + * as they may eventually be batched together. You can provide an optional + * callback that will be executed when the call to setState is actually + * completed. + * + * When a function is provided to setState, it will be called at some point in + * the future (not synchronously). It will be called with the up to date + * component arguments (state, props, context). These values can be different + * from this.* because your function may be called after receiveProps but before + * shouldComponentUpdate, and this new state, props, and context will not yet be + * assigned to this. + * + * @param {object|function} partialState Next partial state or function to + * produce next partial state to be merged with current state. + * @param {?function} callback Called after state is updated. + * @final + * @protected + */ + ReactComponent.prototype.setState = function (partialState, callback) { + !(typeof partialState === 'object' || typeof partialState === 'function' || partialState == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'setState(...): takes an object of state variables to update or a ' + 'function which returns an object of state variables.') : invariant(false) : undefined; + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(partialState != null, 'setState(...): You passed an undefined or null state object; ' + 'instead, use forceUpdate().') : undefined; + } + this.updater.enqueueSetState(this, partialState); + if (callback) { + this.updater.enqueueCallback(this, callback); + } + }; + + /** + * Forces an update. This should only be invoked when it is known with + * certainty that we are **not** in a DOM transaction. + * + * You may want to call this when you know that some deeper aspect of the + * component's state has changed but `setState` was not called. + * + * This will not invoke `shouldComponentUpdate`, but it will invoke + * `componentWillUpdate` and `componentDidUpdate`. + * + * @param {?function} callback Called after update is complete. + * @final + * @protected + */ + ReactComponent.prototype.forceUpdate = function (callback) { + this.updater.enqueueForceUpdate(this); + if (callback) { + this.updater.enqueueCallback(this, callback); + } + }; + + /** + * Deprecated APIs. These APIs used to exist on classic React classes but since + * we would like to deprecate them, we're not going to move them over to this + * modern base class. Instead, we define a getter that warns if it's accessed. + */ + if (process.env.NODE_ENV !== 'production') { + var deprecatedAPIs = { + getDOMNode: ['getDOMNode', 'Use ReactDOM.findDOMNode(component) instead.'], + isMounted: ['isMounted', 'Instead, make sure to clean up subscriptions and pending requests in ' + 'componentWillUnmount to prevent memory leaks.'], + replaceProps: ['replaceProps', 'Instead, call render again at the top level.'], + replaceState: ['replaceState', 'Refactor your code to use setState instead (see ' + 'https://github.com/facebook/react/issues/3236).'], + setProps: ['setProps', 'Instead, call render again at the top level.'] + }; + var defineDeprecationWarning = function (methodName, info) { + if (canDefineProperty) { + Object.defineProperty(ReactComponent.prototype, methodName, { + get: function () { + process.env.NODE_ENV !== 'production' ? warning(false, '%s(...) is deprecated in plain JavaScript React classes. %s', info[0], info[1]) : undefined; + return undefined; + } + }); + } + }; + for (var fnName in deprecatedAPIs) { + if (deprecatedAPIs.hasOwnProperty(fnName)) { + defineDeprecationWarning(fnName, deprecatedAPIs[fnName]); + } + } + } + + module.exports = ReactComponent; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 123 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactNoopUpdateQueue + */ + + 'use strict'; + + var warning = __webpack_require__(24); + + function warnTDZ(publicInstance, callerName) { + if (process.env.NODE_ENV !== 'production') { + process.env.NODE_ENV !== 'production' ? warning(false, '%s(...): Can only update a mounted or mounting component. ' + 'This usually means you called %s() on an unmounted component. ' + 'This is a no-op. Please check the code for the %s component.', callerName, callerName, publicInstance.constructor && publicInstance.constructor.displayName || '') : undefined; + } + } + + /** + * This is the abstract API for an update queue. + */ + var ReactNoopUpdateQueue = { + + /** + * Checks whether or not this composite component is mounted. + * @param {ReactClass} publicInstance The instance we want to test. + * @return {boolean} True if mounted, false otherwise. + * @protected + * @final + */ + isMounted: function (publicInstance) { + return false; + }, + + /** + * Enqueue a callback that will be executed after all the pending updates + * have processed. + * + * @param {ReactClass} publicInstance The instance to use as `this` context. + * @param {?function} callback Called after state is updated. + * @internal + */ + enqueueCallback: function (publicInstance, callback) {}, + + /** + * Forces an update. This should only be invoked when it is known with + * certainty that we are **not** in a DOM transaction. + * + * You may want to call this when you know that some deeper aspect of the + * component's state has changed but `setState` was not called. + * + * This will not invoke `shouldComponentUpdate`, but it will invoke + * `componentWillUpdate` and `componentDidUpdate`. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @internal + */ + enqueueForceUpdate: function (publicInstance) { + warnTDZ(publicInstance, 'forceUpdate'); + }, + + /** + * Replaces all of the state. Always use this or `setState` to mutate state. + * You should treat `this.state` as immutable. + * + * There is no guarantee that `this.state` will be immediately updated, so + * accessing `this.state` after calling this method may return the old value. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {object} completeState Next state. + * @internal + */ + enqueueReplaceState: function (publicInstance, completeState) { + warnTDZ(publicInstance, 'replaceState'); + }, + + /** + * Sets a subset of the state. This only exists because _pendingState is + * internal. This provides a merging strategy that is not available to deep + * properties which is confusing. TODO: Expose pendingState or don't use it + * during the merge. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {object} partialState Next partial state to be merged with state. + * @internal + */ + enqueueSetState: function (publicInstance, partialState) { + warnTDZ(publicInstance, 'setState'); + }, + + /** + * Sets a subset of the props. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {object} partialProps Subset of the next props. + * @internal + */ + enqueueSetProps: function (publicInstance, partialProps) { + warnTDZ(publicInstance, 'setProps'); + }, + + /** + * Replaces all of the props. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {object} props New props. + * @internal + */ + enqueueReplaceProps: function (publicInstance, props) { + warnTDZ(publicInstance, 'replaceProps'); + } + + }; + + module.exports = ReactNoopUpdateQueue; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 124 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactReconcileTransaction + * @typechecks static-only + */ + + 'use strict'; + + var CallbackQueue = __webpack_require__(54); + var PooledClass = __webpack_require__(55); + var ReactBrowserEventEmitter = __webpack_require__(28); + var ReactDOMFeatureFlags = __webpack_require__(40); + var ReactInputSelection = __webpack_require__(125); + var Transaction = __webpack_require__(56); + + var assign = __webpack_require__(38); + + /** + * Ensures that, when possible, the selection range (currently selected text + * input) is not disturbed by performing the transaction. + */ + var SELECTION_RESTORATION = { + /** + * @return {Selection} Selection information. + */ + initialize: ReactInputSelection.getSelectionInformation, + /** + * @param {Selection} sel Selection information returned from `initialize`. + */ + close: ReactInputSelection.restoreSelection + }; + + /** + * Suppresses events (blur/focus) that could be inadvertently dispatched due to + * high level DOM manipulations (like temporarily removing a text input from the + * DOM). + */ + var EVENT_SUPPRESSION = { + /** + * @return {boolean} The enabled status of `ReactBrowserEventEmitter` before + * the reconciliation. + */ + initialize: function () { + var currentlyEnabled = ReactBrowserEventEmitter.isEnabled(); + ReactBrowserEventEmitter.setEnabled(false); + return currentlyEnabled; + }, + + /** + * @param {boolean} previouslyEnabled Enabled status of + * `ReactBrowserEventEmitter` before the reconciliation occurred. `close` + * restores the previous value. + */ + close: function (previouslyEnabled) { + ReactBrowserEventEmitter.setEnabled(previouslyEnabled); + } + }; + + /** + * Provides a queue for collecting `componentDidMount` and + * `componentDidUpdate` callbacks during the the transaction. + */ + var ON_DOM_READY_QUEUEING = { + /** + * Initializes the internal `onDOMReady` queue. + */ + initialize: function () { + this.reactMountReady.reset(); + }, + + /** + * After DOM is flushed, invoke all registered `onDOMReady` callbacks. + */ + close: function () { + this.reactMountReady.notifyAll(); + } + }; + + /** + * Executed within the scope of the `Transaction` instance. Consider these as + * being member methods, but with an implied ordering while being isolated from + * each other. + */ + var TRANSACTION_WRAPPERS = [SELECTION_RESTORATION, EVENT_SUPPRESSION, ON_DOM_READY_QUEUEING]; + + /** + * Currently: + * - The order that these are listed in the transaction is critical: + * - Suppresses events. + * - Restores selection range. + * + * Future: + * - Restore document/overflow scroll positions that were unintentionally + * modified via DOM insertions above the top viewport boundary. + * - Implement/integrate with customized constraint based layout system and keep + * track of which dimensions must be remeasured. + * + * @class ReactReconcileTransaction + */ + function ReactReconcileTransaction(forceHTML) { + this.reinitializeTransaction(); + // Only server-side rendering really needs this option (see + // `ReactServerRendering`), but server-side uses + // `ReactServerRenderingTransaction` instead. This option is here so that it's + // accessible and defaults to false when `ReactDOMComponent` and + // `ReactTextComponent` checks it in `mountComponent`.` + this.renderToStaticMarkup = false; + this.reactMountReady = CallbackQueue.getPooled(null); + this.useCreateElement = !forceHTML && ReactDOMFeatureFlags.useCreateElement; + } + + var Mixin = { + /** + * @see Transaction + * @abstract + * @final + * @return {array<object>} List of operation wrap procedures. + * TODO: convert to array<TransactionWrapper> + */ + getTransactionWrappers: function () { + return TRANSACTION_WRAPPERS; + }, + + /** + * @return {object} The queue to collect `onDOMReady` callbacks with. + */ + getReactMountReady: function () { + return this.reactMountReady; + }, + + /** + * `PooledClass` looks for this, and will invoke this before allowing this + * instance to be reused. + */ + destructor: function () { + CallbackQueue.release(this.reactMountReady); + this.reactMountReady = null; + } + }; + + assign(ReactReconcileTransaction.prototype, Transaction.Mixin, Mixin); + + PooledClass.addPoolingTo(ReactReconcileTransaction); + + module.exports = ReactReconcileTransaction; + +/***/ }, +/* 125 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactInputSelection + */ + + 'use strict'; + + var ReactDOMSelection = __webpack_require__(126); + + var containsNode = __webpack_require__(58); + var focusNode = __webpack_require__(94); + var getActiveElement = __webpack_require__(128); + + function isInDocument(node) { + return containsNode(document.documentElement, node); + } + + /** + * @ReactInputSelection: React input selection module. Based on Selection.js, + * but modified to be suitable for react and has a couple of bug fixes (doesn't + * assume buttons have range selections allowed). + * Input selection module for React. + */ + var ReactInputSelection = { + + hasSelectionCapabilities: function (elem) { + var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase(); + return nodeName && (nodeName === 'input' && elem.type === 'text' || nodeName === 'textarea' || elem.contentEditable === 'true'); + }, + + getSelectionInformation: function () { + var focusedElem = getActiveElement(); + return { + focusedElem: focusedElem, + selectionRange: ReactInputSelection.hasSelectionCapabilities(focusedElem) ? ReactInputSelection.getSelection(focusedElem) : null + }; + }, + + /** + * @restoreSelection: If any selection information was potentially lost, + * restore it. This is useful when performing operations that could remove dom + * nodes and place them back in, resulting in focus being lost. + */ + restoreSelection: function (priorSelectionInformation) { + var curFocusedElem = getActiveElement(); + var priorFocusedElem = priorSelectionInformation.focusedElem; + var priorSelectionRange = priorSelectionInformation.selectionRange; + if (curFocusedElem !== priorFocusedElem && isInDocument(priorFocusedElem)) { + if (ReactInputSelection.hasSelectionCapabilities(priorFocusedElem)) { + ReactInputSelection.setSelection(priorFocusedElem, priorSelectionRange); + } + focusNode(priorFocusedElem); + } + }, + + /** + * @getSelection: Gets the selection bounds of a focused textarea, input or + * contentEditable node. + * -@input: Look up selection bounds of this input + * -@return {start: selectionStart, end: selectionEnd} + */ + getSelection: function (input) { + var selection; + + if ('selectionStart' in input) { + // Modern browser with input or textarea. + selection = { + start: input.selectionStart, + end: input.selectionEnd + }; + } else if (document.selection && (input.nodeName && input.nodeName.toLowerCase() === 'input')) { + // IE8 input. + var range = document.selection.createRange(); + // There can only be one selection per document in IE, so it must + // be in our element. + if (range.parentElement() === input) { + selection = { + start: -range.moveStart('character', -input.value.length), + end: -range.moveEnd('character', -input.value.length) + }; + } + } else { + // Content editable or old IE textarea. + selection = ReactDOMSelection.getOffsets(input); + } + + return selection || { start: 0, end: 0 }; + }, + + /** + * @setSelection: Sets the selection bounds of a textarea or input and focuses + * the input. + * -@input Set selection bounds of this input or textarea + * -@offsets Object of same form that is returned from get* + */ + setSelection: function (input, offsets) { + var start = offsets.start; + var end = offsets.end; + if (typeof end === 'undefined') { + end = start; + } + + if ('selectionStart' in input) { + input.selectionStart = start; + input.selectionEnd = Math.min(end, input.value.length); + } else if (document.selection && (input.nodeName && input.nodeName.toLowerCase() === 'input')) { + var range = input.createTextRange(); + range.collapse(true); + range.moveStart('character', start); + range.moveEnd('character', end - start); + range.select(); + } else { + ReactDOMSelection.setOffsets(input, offsets); + } + } + }; + + module.exports = ReactInputSelection; + +/***/ }, +/* 126 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactDOMSelection + */ + + 'use strict'; + + var ExecutionEnvironment = __webpack_require__(8); + + var getNodeForCharacterOffset = __webpack_require__(127); + var getTextContentAccessor = __webpack_require__(74); + + /** + * While `isCollapsed` is available on the Selection object and `collapsed` + * is available on the Range object, IE11 sometimes gets them wrong. + * If the anchor/focus nodes and offsets are the same, the range is collapsed. + */ + function isCollapsed(anchorNode, anchorOffset, focusNode, focusOffset) { + return anchorNode === focusNode && anchorOffset === focusOffset; + } + + /** + * Get the appropriate anchor and focus node/offset pairs for IE. + * + * The catch here is that IE's selection API doesn't provide information + * about whether the selection is forward or backward, so we have to + * behave as though it's always forward. + * + * IE text differs from modern selection in that it behaves as though + * block elements end with a new line. This means character offsets will + * differ between the two APIs. + * + * @param {DOMElement} node + * @return {object} + */ + function getIEOffsets(node) { + var selection = document.selection; + var selectedRange = selection.createRange(); + var selectedLength = selectedRange.text.length; + + // Duplicate selection so we can move range without breaking user selection. + var fromStart = selectedRange.duplicate(); + fromStart.moveToElementText(node); + fromStart.setEndPoint('EndToStart', selectedRange); + + var startOffset = fromStart.text.length; + var endOffset = startOffset + selectedLength; + + return { + start: startOffset, + end: endOffset + }; + } + + /** + * @param {DOMElement} node + * @return {?object} + */ + function getModernOffsets(node) { + var selection = window.getSelection && window.getSelection(); + + if (!selection || selection.rangeCount === 0) { + return null; + } + + var anchorNode = selection.anchorNode; + var anchorOffset = selection.anchorOffset; + var focusNode = selection.focusNode; + var focusOffset = selection.focusOffset; + + var currentRange = selection.getRangeAt(0); + + // In Firefox, range.startContainer and range.endContainer can be "anonymous + // divs", e.g. the up/down buttons on an <input type="number">. Anonymous + // divs do not seem to expose properties, triggering a "Permission denied + // error" if any of its properties are accessed. The only seemingly possible + // way to avoid erroring is to access a property that typically works for + // non-anonymous divs and catch any error that may otherwise arise. See + // https://bugzilla.mozilla.org/show_bug.cgi?id=208427 + try { + /* eslint-disable no-unused-expressions */ + currentRange.startContainer.nodeType; + currentRange.endContainer.nodeType; + /* eslint-enable no-unused-expressions */ + } catch (e) { + return null; + } + + // If the node and offset values are the same, the selection is collapsed. + // `Selection.isCollapsed` is available natively, but IE sometimes gets + // this value wrong. + var isSelectionCollapsed = isCollapsed(selection.anchorNode, selection.anchorOffset, selection.focusNode, selection.focusOffset); + + var rangeLength = isSelectionCollapsed ? 0 : currentRange.toString().length; + + var tempRange = currentRange.cloneRange(); + tempRange.selectNodeContents(node); + tempRange.setEnd(currentRange.startContainer, currentRange.startOffset); + + var isTempRangeCollapsed = isCollapsed(tempRange.startContainer, tempRange.startOffset, tempRange.endContainer, tempRange.endOffset); + + var start = isTempRangeCollapsed ? 0 : tempRange.toString().length; + var end = start + rangeLength; + + // Detect whether the selection is backward. + var detectionRange = document.createRange(); + detectionRange.setStart(anchorNode, anchorOffset); + detectionRange.setEnd(focusNode, focusOffset); + var isBackward = detectionRange.collapsed; + + return { + start: isBackward ? end : start, + end: isBackward ? start : end + }; + } + + /** + * @param {DOMElement|DOMTextNode} node + * @param {object} offsets + */ + function setIEOffsets(node, offsets) { + var range = document.selection.createRange().duplicate(); + var start, end; + + if (typeof offsets.end === 'undefined') { + start = offsets.start; + end = start; + } else if (offsets.start > offsets.end) { + start = offsets.end; + end = offsets.start; + } else { + start = offsets.start; + end = offsets.end; + } + + range.moveToElementText(node); + range.moveStart('character', start); + range.setEndPoint('EndToStart', range); + range.moveEnd('character', end - start); + range.select(); + } + + /** + * In modern non-IE browsers, we can support both forward and backward + * selections. + * + * Note: IE10+ supports the Selection object, but it does not support + * the `extend` method, which means that even in modern IE, it's not possible + * to programatically create a backward selection. Thus, for all IE + * versions, we use the old IE API to create our selections. + * + * @param {DOMElement|DOMTextNode} node + * @param {object} offsets + */ + function setModernOffsets(node, offsets) { + if (!window.getSelection) { + return; + } + + var selection = window.getSelection(); + var length = node[getTextContentAccessor()].length; + var start = Math.min(offsets.start, length); + var end = typeof offsets.end === 'undefined' ? start : Math.min(offsets.end, length); + + // IE 11 uses modern selection, but doesn't support the extend method. + // Flip backward selections, so we can set with a single range. + if (!selection.extend && start > end) { + var temp = end; + end = start; + start = temp; + } + + var startMarker = getNodeForCharacterOffset(node, start); + var endMarker = getNodeForCharacterOffset(node, end); + + if (startMarker && endMarker) { + var range = document.createRange(); + range.setStart(startMarker.node, startMarker.offset); + selection.removeAllRanges(); + + if (start > end) { + selection.addRange(range); + selection.extend(endMarker.node, endMarker.offset); + } else { + range.setEnd(endMarker.node, endMarker.offset); + selection.addRange(range); + } + } + } + + var useIEOffsets = ExecutionEnvironment.canUseDOM && 'selection' in document && !('getSelection' in window); + + var ReactDOMSelection = { + /** + * @param {DOMElement} node + */ + getOffsets: useIEOffsets ? getIEOffsets : getModernOffsets, + + /** + * @param {DOMElement|DOMTextNode} node + * @param {object} offsets + */ + setOffsets: useIEOffsets ? setIEOffsets : setModernOffsets + }; + + module.exports = ReactDOMSelection; + +/***/ }, +/* 127 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule getNodeForCharacterOffset + */ + + 'use strict'; + + /** + * Given any node return the first leaf node without children. + * + * @param {DOMElement|DOMTextNode} node + * @return {DOMElement|DOMTextNode} + */ + function getLeafNode(node) { + while (node && node.firstChild) { + node = node.firstChild; + } + return node; + } + + /** + * Get the next sibling within a container. This will walk up the + * DOM if a node's siblings have been exhausted. + * + * @param {DOMElement|DOMTextNode} node + * @return {?DOMElement|DOMTextNode} + */ + function getSiblingNode(node) { + while (node) { + if (node.nextSibling) { + return node.nextSibling; + } + node = node.parentNode; + } + } + + /** + * Get object describing the nodes which contain characters at offset. + * + * @param {DOMElement|DOMTextNode} root + * @param {number} offset + * @return {?object} + */ + function getNodeForCharacterOffset(root, offset) { + var node = getLeafNode(root); + var nodeStart = 0; + var nodeEnd = 0; + + while (node) { + if (node.nodeType === 3) { + nodeEnd = nodeStart + node.textContent.length; + + if (nodeStart <= offset && nodeEnd >= offset) { + return { + node: node, + offset: offset - nodeStart + }; + } + + nodeStart = nodeEnd; + } + + node = getLeafNode(getSiblingNode(node)); + } + } + + module.exports = getNodeForCharacterOffset; + +/***/ }, +/* 128 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule getActiveElement + * @typechecks + */ + + /** + * Same as document.activeElement but wraps in a try-catch block. In IE it is + * not safe to call document.activeElement if there is nothing focused. + * + * The activeElement will be null only if the document or document body is not yet defined. + */ + 'use strict'; + + function getActiveElement() /*?DOMElement*/{ + if (typeof document === 'undefined') { + return null; + } + + try { + return document.activeElement || document.body; + } catch (e) { + return document.body; + } + } + + module.exports = getActiveElement; + +/***/ }, +/* 129 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule SelectEventPlugin + */ + + 'use strict'; + + var EventConstants = __webpack_require__(29); + var EventPropagators = __webpack_require__(72); + var ExecutionEnvironment = __webpack_require__(8); + var ReactInputSelection = __webpack_require__(125); + var SyntheticEvent = __webpack_require__(76); + + var getActiveElement = __webpack_require__(128); + var isTextInputElement = __webpack_require__(81); + var keyOf = __webpack_require__(78); + var shallowEqual = __webpack_require__(116); + + var topLevelTypes = EventConstants.topLevelTypes; + + var skipSelectionChangeEvent = ExecutionEnvironment.canUseDOM && 'documentMode' in document && document.documentMode <= 11; + + var eventTypes = { + select: { + phasedRegistrationNames: { + bubbled: keyOf({ onSelect: null }), + captured: keyOf({ onSelectCapture: null }) + }, + dependencies: [topLevelTypes.topBlur, topLevelTypes.topContextMenu, topLevelTypes.topFocus, topLevelTypes.topKeyDown, topLevelTypes.topMouseDown, topLevelTypes.topMouseUp, topLevelTypes.topSelectionChange] + } + }; + + var activeElement = null; + var activeElementID = null; + var lastSelection = null; + var mouseDown = false; + + // Track whether a listener exists for this plugin. If none exist, we do + // not extract events. + var hasListener = false; + var ON_SELECT_KEY = keyOf({ onSelect: null }); + + /** + * Get an object which is a unique representation of the current selection. + * + * The return value will not be consistent across nodes or browsers, but + * two identical selections on the same node will return identical objects. + * + * @param {DOMElement} node + * @return {object} + */ + function getSelection(node) { + if ('selectionStart' in node && ReactInputSelection.hasSelectionCapabilities(node)) { + return { + start: node.selectionStart, + end: node.selectionEnd + }; + } else if (window.getSelection) { + var selection = window.getSelection(); + return { + anchorNode: selection.anchorNode, + anchorOffset: selection.anchorOffset, + focusNode: selection.focusNode, + focusOffset: selection.focusOffset + }; + } else if (document.selection) { + var range = document.selection.createRange(); + return { + parentElement: range.parentElement(), + text: range.text, + top: range.boundingTop, + left: range.boundingLeft + }; + } + } + + /** + * Poll selection to see whether it's changed. + * + * @param {object} nativeEvent + * @return {?SyntheticEvent} + */ + function constructSelectEvent(nativeEvent, nativeEventTarget) { + // Ensure we have the right element, and that the user is not dragging a + // selection (this matches native `select` event behavior). In HTML5, select + // fires only on input and textarea thus if there's no focused element we + // won't dispatch. + if (mouseDown || activeElement == null || activeElement !== getActiveElement()) { + return null; + } + + // Only fire when selection has actually changed. + var currentSelection = getSelection(activeElement); + if (!lastSelection || !shallowEqual(lastSelection, currentSelection)) { + lastSelection = currentSelection; + + var syntheticEvent = SyntheticEvent.getPooled(eventTypes.select, activeElementID, nativeEvent, nativeEventTarget); + + syntheticEvent.type = 'select'; + syntheticEvent.target = activeElement; + + EventPropagators.accumulateTwoPhaseDispatches(syntheticEvent); + + return syntheticEvent; + } + + return null; + } + + /** + * This plugin creates an `onSelect` event that normalizes select events + * across form elements. + * + * Supported elements are: + * - input (see `isTextInputElement`) + * - textarea + * - contentEditable + * + * This differs from native browser implementations in the following ways: + * - Fires on contentEditable fields as well as inputs. + * - Fires for collapsed selection. + * - Fires after user input. + */ + var SelectEventPlugin = { + + eventTypes: eventTypes, + + /** + * @param {string} topLevelType Record from `EventConstants`. + * @param {DOMEventTarget} topLevelTarget The listening component root node. + * @param {string} topLevelTargetID ID of `topLevelTarget`. + * @param {object} nativeEvent Native browser event. + * @return {*} An accumulation of synthetic events. + * @see {EventPluginHub.extractEvents} + */ + extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) { + if (!hasListener) { + return null; + } + + switch (topLevelType) { + // Track the input node that has focus. + case topLevelTypes.topFocus: + if (isTextInputElement(topLevelTarget) || topLevelTarget.contentEditable === 'true') { + activeElement = topLevelTarget; + activeElementID = topLevelTargetID; + lastSelection = null; + } + break; + case topLevelTypes.topBlur: + activeElement = null; + activeElementID = null; + lastSelection = null; + break; + + // Don't fire the event while the user is dragging. This matches the + // semantics of the native select event. + case topLevelTypes.topMouseDown: + mouseDown = true; + break; + case topLevelTypes.topContextMenu: + case topLevelTypes.topMouseUp: + mouseDown = false; + return constructSelectEvent(nativeEvent, nativeEventTarget); + + // Chrome and IE fire non-standard event when selection is changed (and + // sometimes when it hasn't). IE's event fires out of order with respect + // to key and input events on deletion, so we discard it. + // + // Firefox doesn't support selectionchange, so check selection status + // after each key entry. The selection changes after keydown and before + // keyup, but we check on keydown as well in the case of holding down a + // key, when multiple keydown events are fired but only one keyup is. + // This is also our approach for IE handling, for the reason above. + case topLevelTypes.topSelectionChange: + if (skipSelectionChangeEvent) { + break; + } + // falls through + case topLevelTypes.topKeyDown: + case topLevelTypes.topKeyUp: + return constructSelectEvent(nativeEvent, nativeEventTarget); + } + + return null; + }, + + didPutListener: function (id, registrationName, listener) { + if (registrationName === ON_SELECT_KEY) { + hasListener = true; + } + } + }; + + module.exports = SelectEventPlugin; + +/***/ }, +/* 130 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ServerReactRootIndex + * @typechecks + */ + + 'use strict'; + + /** + * Size of the reactRoot ID space. We generate random numbers for React root + * IDs and if there's a collision the events and DOM update system will + * get confused. In the future we need a way to generate GUIDs but for + * now this will work on a smaller scale. + */ + var GLOBAL_MOUNT_POINT_MAX = Math.pow(2, 53); + + var ServerReactRootIndex = { + createReactRootIndex: function () { + return Math.ceil(Math.random() * GLOBAL_MOUNT_POINT_MAX); + } + }; + + module.exports = ServerReactRootIndex; + +/***/ }, +/* 131 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule SimpleEventPlugin + */ + + 'use strict'; + + var EventConstants = __webpack_require__(29); + var EventListener = __webpack_require__(118); + var EventPropagators = __webpack_require__(72); + var ReactMount = __webpack_require__(27); + var SyntheticClipboardEvent = __webpack_require__(132); + var SyntheticEvent = __webpack_require__(76); + var SyntheticFocusEvent = __webpack_require__(133); + var SyntheticKeyboardEvent = __webpack_require__(134); + var SyntheticMouseEvent = __webpack_require__(85); + var SyntheticDragEvent = __webpack_require__(137); + var SyntheticTouchEvent = __webpack_require__(138); + var SyntheticUIEvent = __webpack_require__(86); + var SyntheticWheelEvent = __webpack_require__(139); + + var emptyFunction = __webpack_require__(14); + var getEventCharCode = __webpack_require__(135); + var invariant = __webpack_require__(12); + var keyOf = __webpack_require__(78); + + var topLevelTypes = EventConstants.topLevelTypes; + + var eventTypes = { + abort: { + phasedRegistrationNames: { + bubbled: keyOf({ onAbort: true }), + captured: keyOf({ onAbortCapture: true }) + } + }, + blur: { + phasedRegistrationNames: { + bubbled: keyOf({ onBlur: true }), + captured: keyOf({ onBlurCapture: true }) + } + }, + canPlay: { + phasedRegistrationNames: { + bubbled: keyOf({ onCanPlay: true }), + captured: keyOf({ onCanPlayCapture: true }) + } + }, + canPlayThrough: { + phasedRegistrationNames: { + bubbled: keyOf({ onCanPlayThrough: true }), + captured: keyOf({ onCanPlayThroughCapture: true }) + } + }, + click: { + phasedRegistrationNames: { + bubbled: keyOf({ onClick: true }), + captured: keyOf({ onClickCapture: true }) + } + }, + contextMenu: { + phasedRegistrationNames: { + bubbled: keyOf({ onContextMenu: true }), + captured: keyOf({ onContextMenuCapture: true }) + } + }, + copy: { + phasedRegistrationNames: { + bubbled: keyOf({ onCopy: true }), + captured: keyOf({ onCopyCapture: true }) + } + }, + cut: { + phasedRegistrationNames: { + bubbled: keyOf({ onCut: true }), + captured: keyOf({ onCutCapture: true }) + } + }, + doubleClick: { + phasedRegistrationNames: { + bubbled: keyOf({ onDoubleClick: true }), + captured: keyOf({ onDoubleClickCapture: true }) + } + }, + drag: { + phasedRegistrationNames: { + bubbled: keyOf({ onDrag: true }), + captured: keyOf({ onDragCapture: true }) + } + }, + dragEnd: { + phasedRegistrationNames: { + bubbled: keyOf({ onDragEnd: true }), + captured: keyOf({ onDragEndCapture: true }) + } + }, + dragEnter: { + phasedRegistrationNames: { + bubbled: keyOf({ onDragEnter: true }), + captured: keyOf({ onDragEnterCapture: true }) + } + }, + dragExit: { + phasedRegistrationNames: { + bubbled: keyOf({ onDragExit: true }), + captured: keyOf({ onDragExitCapture: true }) + } + }, + dragLeave: { + phasedRegistrationNames: { + bubbled: keyOf({ onDragLeave: true }), + captured: keyOf({ onDragLeaveCapture: true }) + } + }, + dragOver: { + phasedRegistrationNames: { + bubbled: keyOf({ onDragOver: true }), + captured: keyOf({ onDragOverCapture: true }) + } + }, + dragStart: { + phasedRegistrationNames: { + bubbled: keyOf({ onDragStart: true }), + captured: keyOf({ onDragStartCapture: true }) + } + }, + drop: { + phasedRegistrationNames: { + bubbled: keyOf({ onDrop: true }), + captured: keyOf({ onDropCapture: true }) + } + }, + durationChange: { + phasedRegistrationNames: { + bubbled: keyOf({ onDurationChange: true }), + captured: keyOf({ onDurationChangeCapture: true }) + } + }, + emptied: { + phasedRegistrationNames: { + bubbled: keyOf({ onEmptied: true }), + captured: keyOf({ onEmptiedCapture: true }) + } + }, + encrypted: { + phasedRegistrationNames: { + bubbled: keyOf({ onEncrypted: true }), + captured: keyOf({ onEncryptedCapture: true }) + } + }, + ended: { + phasedRegistrationNames: { + bubbled: keyOf({ onEnded: true }), + captured: keyOf({ onEndedCapture: true }) + } + }, + error: { + phasedRegistrationNames: { + bubbled: keyOf({ onError: true }), + captured: keyOf({ onErrorCapture: true }) + } + }, + focus: { + phasedRegistrationNames: { + bubbled: keyOf({ onFocus: true }), + captured: keyOf({ onFocusCapture: true }) + } + }, + input: { + phasedRegistrationNames: { + bubbled: keyOf({ onInput: true }), + captured: keyOf({ onInputCapture: true }) + } + }, + keyDown: { + phasedRegistrationNames: { + bubbled: keyOf({ onKeyDown: true }), + captured: keyOf({ onKeyDownCapture: true }) + } + }, + keyPress: { + phasedRegistrationNames: { + bubbled: keyOf({ onKeyPress: true }), + captured: keyOf({ onKeyPressCapture: true }) + } + }, + keyUp: { + phasedRegistrationNames: { + bubbled: keyOf({ onKeyUp: true }), + captured: keyOf({ onKeyUpCapture: true }) + } + }, + load: { + phasedRegistrationNames: { + bubbled: keyOf({ onLoad: true }), + captured: keyOf({ onLoadCapture: true }) + } + }, + loadedData: { + phasedRegistrationNames: { + bubbled: keyOf({ onLoadedData: true }), + captured: keyOf({ onLoadedDataCapture: true }) + } + }, + loadedMetadata: { + phasedRegistrationNames: { + bubbled: keyOf({ onLoadedMetadata: true }), + captured: keyOf({ onLoadedMetadataCapture: true }) + } + }, + loadStart: { + phasedRegistrationNames: { + bubbled: keyOf({ onLoadStart: true }), + captured: keyOf({ onLoadStartCapture: true }) + } + }, + // Note: We do not allow listening to mouseOver events. Instead, use the + // onMouseEnter/onMouseLeave created by `EnterLeaveEventPlugin`. + mouseDown: { + phasedRegistrationNames: { + bubbled: keyOf({ onMouseDown: true }), + captured: keyOf({ onMouseDownCapture: true }) + } + }, + mouseMove: { + phasedRegistrationNames: { + bubbled: keyOf({ onMouseMove: true }), + captured: keyOf({ onMouseMoveCapture: true }) + } + }, + mouseOut: { + phasedRegistrationNames: { + bubbled: keyOf({ onMouseOut: true }), + captured: keyOf({ onMouseOutCapture: true }) + } + }, + mouseOver: { + phasedRegistrationNames: { + bubbled: keyOf({ onMouseOver: true }), + captured: keyOf({ onMouseOverCapture: true }) + } + }, + mouseUp: { + phasedRegistrationNames: { + bubbled: keyOf({ onMouseUp: true }), + captured: keyOf({ onMouseUpCapture: true }) + } + }, + paste: { + phasedRegistrationNames: { + bubbled: keyOf({ onPaste: true }), + captured: keyOf({ onPasteCapture: true }) + } + }, + pause: { + phasedRegistrationNames: { + bubbled: keyOf({ onPause: true }), + captured: keyOf({ onPauseCapture: true }) + } + }, + play: { + phasedRegistrationNames: { + bubbled: keyOf({ onPlay: true }), + captured: keyOf({ onPlayCapture: true }) + } + }, + playing: { + phasedRegistrationNames: { + bubbled: keyOf({ onPlaying: true }), + captured: keyOf({ onPlayingCapture: true }) + } + }, + progress: { + phasedRegistrationNames: { + bubbled: keyOf({ onProgress: true }), + captured: keyOf({ onProgressCapture: true }) + } + }, + rateChange: { + phasedRegistrationNames: { + bubbled: keyOf({ onRateChange: true }), + captured: keyOf({ onRateChangeCapture: true }) + } + }, + reset: { + phasedRegistrationNames: { + bubbled: keyOf({ onReset: true }), + captured: keyOf({ onResetCapture: true }) + } + }, + scroll: { + phasedRegistrationNames: { + bubbled: keyOf({ onScroll: true }), + captured: keyOf({ onScrollCapture: true }) + } + }, + seeked: { + phasedRegistrationNames: { + bubbled: keyOf({ onSeeked: true }), + captured: keyOf({ onSeekedCapture: true }) + } + }, + seeking: { + phasedRegistrationNames: { + bubbled: keyOf({ onSeeking: true }), + captured: keyOf({ onSeekingCapture: true }) + } + }, + stalled: { + phasedRegistrationNames: { + bubbled: keyOf({ onStalled: true }), + captured: keyOf({ onStalledCapture: true }) + } + }, + submit: { + phasedRegistrationNames: { + bubbled: keyOf({ onSubmit: true }), + captured: keyOf({ onSubmitCapture: true }) + } + }, + suspend: { + phasedRegistrationNames: { + bubbled: keyOf({ onSuspend: true }), + captured: keyOf({ onSuspendCapture: true }) + } + }, + timeUpdate: { + phasedRegistrationNames: { + bubbled: keyOf({ onTimeUpdate: true }), + captured: keyOf({ onTimeUpdateCapture: true }) + } + }, + touchCancel: { + phasedRegistrationNames: { + bubbled: keyOf({ onTouchCancel: true }), + captured: keyOf({ onTouchCancelCapture: true }) + } + }, + touchEnd: { + phasedRegistrationNames: { + bubbled: keyOf({ onTouchEnd: true }), + captured: keyOf({ onTouchEndCapture: true }) + } + }, + touchMove: { + phasedRegistrationNames: { + bubbled: keyOf({ onTouchMove: true }), + captured: keyOf({ onTouchMoveCapture: true }) + } + }, + touchStart: { + phasedRegistrationNames: { + bubbled: keyOf({ onTouchStart: true }), + captured: keyOf({ onTouchStartCapture: true }) + } + }, + volumeChange: { + phasedRegistrationNames: { + bubbled: keyOf({ onVolumeChange: true }), + captured: keyOf({ onVolumeChangeCapture: true }) + } + }, + waiting: { + phasedRegistrationNames: { + bubbled: keyOf({ onWaiting: true }), + captured: keyOf({ onWaitingCapture: true }) + } + }, + wheel: { + phasedRegistrationNames: { + bubbled: keyOf({ onWheel: true }), + captured: keyOf({ onWheelCapture: true }) + } + } + }; + + var topLevelEventsToDispatchConfig = { + topAbort: eventTypes.abort, + topBlur: eventTypes.blur, + topCanPlay: eventTypes.canPlay, + topCanPlayThrough: eventTypes.canPlayThrough, + topClick: eventTypes.click, + topContextMenu: eventTypes.contextMenu, + topCopy: eventTypes.copy, + topCut: eventTypes.cut, + topDoubleClick: eventTypes.doubleClick, + topDrag: eventTypes.drag, + topDragEnd: eventTypes.dragEnd, + topDragEnter: eventTypes.dragEnter, + topDragExit: eventTypes.dragExit, + topDragLeave: eventTypes.dragLeave, + topDragOver: eventTypes.dragOver, + topDragStart: eventTypes.dragStart, + topDrop: eventTypes.drop, + topDurationChange: eventTypes.durationChange, + topEmptied: eventTypes.emptied, + topEncrypted: eventTypes.encrypted, + topEnded: eventTypes.ended, + topError: eventTypes.error, + topFocus: eventTypes.focus, + topInput: eventTypes.input, + topKeyDown: eventTypes.keyDown, + topKeyPress: eventTypes.keyPress, + topKeyUp: eventTypes.keyUp, + topLoad: eventTypes.load, + topLoadedData: eventTypes.loadedData, + topLoadedMetadata: eventTypes.loadedMetadata, + topLoadStart: eventTypes.loadStart, + topMouseDown: eventTypes.mouseDown, + topMouseMove: eventTypes.mouseMove, + topMouseOut: eventTypes.mouseOut, + topMouseOver: eventTypes.mouseOver, + topMouseUp: eventTypes.mouseUp, + topPaste: eventTypes.paste, + topPause: eventTypes.pause, + topPlay: eventTypes.play, + topPlaying: eventTypes.playing, + topProgress: eventTypes.progress, + topRateChange: eventTypes.rateChange, + topReset: eventTypes.reset, + topScroll: eventTypes.scroll, + topSeeked: eventTypes.seeked, + topSeeking: eventTypes.seeking, + topStalled: eventTypes.stalled, + topSubmit: eventTypes.submit, + topSuspend: eventTypes.suspend, + topTimeUpdate: eventTypes.timeUpdate, + topTouchCancel: eventTypes.touchCancel, + topTouchEnd: eventTypes.touchEnd, + topTouchMove: eventTypes.touchMove, + topTouchStart: eventTypes.touchStart, + topVolumeChange: eventTypes.volumeChange, + topWaiting: eventTypes.waiting, + topWheel: eventTypes.wheel + }; + + for (var type in topLevelEventsToDispatchConfig) { + topLevelEventsToDispatchConfig[type].dependencies = [type]; + } + + var ON_CLICK_KEY = keyOf({ onClick: null }); + var onClickListeners = {}; + + var SimpleEventPlugin = { + + eventTypes: eventTypes, + + /** + * @param {string} topLevelType Record from `EventConstants`. + * @param {DOMEventTarget} topLevelTarget The listening component root node. + * @param {string} topLevelTargetID ID of `topLevelTarget`. + * @param {object} nativeEvent Native browser event. + * @return {*} An accumulation of synthetic events. + * @see {EventPluginHub.extractEvents} + */ + extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) { + var dispatchConfig = topLevelEventsToDispatchConfig[topLevelType]; + if (!dispatchConfig) { + return null; + } + var EventConstructor; + switch (topLevelType) { + case topLevelTypes.topAbort: + case topLevelTypes.topCanPlay: + case topLevelTypes.topCanPlayThrough: + case topLevelTypes.topDurationChange: + case topLevelTypes.topEmptied: + case topLevelTypes.topEncrypted: + case topLevelTypes.topEnded: + case topLevelTypes.topError: + case topLevelTypes.topInput: + case topLevelTypes.topLoad: + case topLevelTypes.topLoadedData: + case topLevelTypes.topLoadedMetadata: + case topLevelTypes.topLoadStart: + case topLevelTypes.topPause: + case topLevelTypes.topPlay: + case topLevelTypes.topPlaying: + case topLevelTypes.topProgress: + case topLevelTypes.topRateChange: + case topLevelTypes.topReset: + case topLevelTypes.topSeeked: + case topLevelTypes.topSeeking: + case topLevelTypes.topStalled: + case topLevelTypes.topSubmit: + case topLevelTypes.topSuspend: + case topLevelTypes.topTimeUpdate: + case topLevelTypes.topVolumeChange: + case topLevelTypes.topWaiting: + // HTML Events + // @see http://www.w3.org/TR/html5/index.html#events-0 + EventConstructor = SyntheticEvent; + break; + case topLevelTypes.topKeyPress: + // FireFox creates a keypress event for function keys too. This removes + // the unwanted keypress events. Enter is however both printable and + // non-printable. One would expect Tab to be as well (but it isn't). + if (getEventCharCode(nativeEvent) === 0) { + return null; + } + /* falls through */ + case topLevelTypes.topKeyDown: + case topLevelTypes.topKeyUp: + EventConstructor = SyntheticKeyboardEvent; + break; + case topLevelTypes.topBlur: + case topLevelTypes.topFocus: + EventConstructor = SyntheticFocusEvent; + break; + case topLevelTypes.topClick: + // Firefox creates a click event on right mouse clicks. This removes the + // unwanted click events. + if (nativeEvent.button === 2) { + return null; + } + /* falls through */ + case topLevelTypes.topContextMenu: + case topLevelTypes.topDoubleClick: + case topLevelTypes.topMouseDown: + case topLevelTypes.topMouseMove: + case topLevelTypes.topMouseOut: + case topLevelTypes.topMouseOver: + case topLevelTypes.topMouseUp: + EventConstructor = SyntheticMouseEvent; + break; + case topLevelTypes.topDrag: + case topLevelTypes.topDragEnd: + case topLevelTypes.topDragEnter: + case topLevelTypes.topDragExit: + case topLevelTypes.topDragLeave: + case topLevelTypes.topDragOver: + case topLevelTypes.topDragStart: + case topLevelTypes.topDrop: + EventConstructor = SyntheticDragEvent; + break; + case topLevelTypes.topTouchCancel: + case topLevelTypes.topTouchEnd: + case topLevelTypes.topTouchMove: + case topLevelTypes.topTouchStart: + EventConstructor = SyntheticTouchEvent; + break; + case topLevelTypes.topScroll: + EventConstructor = SyntheticUIEvent; + break; + case topLevelTypes.topWheel: + EventConstructor = SyntheticWheelEvent; + break; + case topLevelTypes.topCopy: + case topLevelTypes.topCut: + case topLevelTypes.topPaste: + EventConstructor = SyntheticClipboardEvent; + break; + } + !EventConstructor ? process.env.NODE_ENV !== 'production' ? invariant(false, 'SimpleEventPlugin: Unhandled event type, `%s`.', topLevelType) : invariant(false) : undefined; + var event = EventConstructor.getPooled(dispatchConfig, topLevelTargetID, nativeEvent, nativeEventTarget); + EventPropagators.accumulateTwoPhaseDispatches(event); + return event; + }, + + didPutListener: function (id, registrationName, listener) { + // Mobile Safari does not fire properly bubble click events on + // non-interactive elements, which means delegated click listeners do not + // fire. The workaround for this bug involves attaching an empty click + // listener on the target node. + if (registrationName === ON_CLICK_KEY) { + var node = ReactMount.getNode(id); + if (!onClickListeners[id]) { + onClickListeners[id] = EventListener.listen(node, 'click', emptyFunction); + } + } + }, + + willDeleteListener: function (id, registrationName) { + if (registrationName === ON_CLICK_KEY) { + onClickListeners[id].remove(); + delete onClickListeners[id]; + } + } + + }; + + module.exports = SimpleEventPlugin; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 132 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule SyntheticClipboardEvent + * @typechecks static-only + */ + + 'use strict'; + + var SyntheticEvent = __webpack_require__(76); + + /** + * @interface Event + * @see http://www.w3.org/TR/clipboard-apis/ + */ + var ClipboardEventInterface = { + clipboardData: function (event) { + return 'clipboardData' in event ? event.clipboardData : window.clipboardData; + } + }; + + /** + * @param {object} dispatchConfig Configuration used to dispatch this event. + * @param {string} dispatchMarker Marker identifying the event target. + * @param {object} nativeEvent Native browser event. + * @extends {SyntheticUIEvent} + */ + function SyntheticClipboardEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) { + SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget); + } + + SyntheticEvent.augmentClass(SyntheticClipboardEvent, ClipboardEventInterface); + + module.exports = SyntheticClipboardEvent; + +/***/ }, +/* 133 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule SyntheticFocusEvent + * @typechecks static-only + */ + + 'use strict'; + + var SyntheticUIEvent = __webpack_require__(86); + + /** + * @interface FocusEvent + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ + var FocusEventInterface = { + relatedTarget: null + }; + + /** + * @param {object} dispatchConfig Configuration used to dispatch this event. + * @param {string} dispatchMarker Marker identifying the event target. + * @param {object} nativeEvent Native browser event. + * @extends {SyntheticUIEvent} + */ + function SyntheticFocusEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) { + SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget); + } + + SyntheticUIEvent.augmentClass(SyntheticFocusEvent, FocusEventInterface); + + module.exports = SyntheticFocusEvent; + +/***/ }, +/* 134 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule SyntheticKeyboardEvent + * @typechecks static-only + */ + + 'use strict'; + + var SyntheticUIEvent = __webpack_require__(86); + + var getEventCharCode = __webpack_require__(135); + var getEventKey = __webpack_require__(136); + var getEventModifierState = __webpack_require__(87); + + /** + * @interface KeyboardEvent + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ + var KeyboardEventInterface = { + key: getEventKey, + location: null, + ctrlKey: null, + shiftKey: null, + altKey: null, + metaKey: null, + repeat: null, + locale: null, + getModifierState: getEventModifierState, + // Legacy Interface + charCode: function (event) { + // `charCode` is the result of a KeyPress event and represents the value of + // the actual printable character. + + // KeyPress is deprecated, but its replacement is not yet final and not + // implemented in any major browser. Only KeyPress has charCode. + if (event.type === 'keypress') { + return getEventCharCode(event); + } + return 0; + }, + keyCode: function (event) { + // `keyCode` is the result of a KeyDown/Up event and represents the value of + // physical keyboard key. + + // The actual meaning of the value depends on the users' keyboard layout + // which cannot be detected. Assuming that it is a US keyboard layout + // provides a surprisingly accurate mapping for US and European users. + // Due to this, it is left to the user to implement at this time. + if (event.type === 'keydown' || event.type === 'keyup') { + return event.keyCode; + } + return 0; + }, + which: function (event) { + // `which` is an alias for either `keyCode` or `charCode` depending on the + // type of the event. + if (event.type === 'keypress') { + return getEventCharCode(event); + } + if (event.type === 'keydown' || event.type === 'keyup') { + return event.keyCode; + } + return 0; + } + }; + + /** + * @param {object} dispatchConfig Configuration used to dispatch this event. + * @param {string} dispatchMarker Marker identifying the event target. + * @param {object} nativeEvent Native browser event. + * @extends {SyntheticUIEvent} + */ + function SyntheticKeyboardEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) { + SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget); + } + + SyntheticUIEvent.augmentClass(SyntheticKeyboardEvent, KeyboardEventInterface); + + module.exports = SyntheticKeyboardEvent; + +/***/ }, +/* 135 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule getEventCharCode + * @typechecks static-only + */ + + 'use strict'; + + /** + * `charCode` represents the actual "character code" and is safe to use with + * `String.fromCharCode`. As such, only keys that correspond to printable + * characters produce a valid `charCode`, the only exception to this is Enter. + * The Tab-key is considered non-printable and does not have a `charCode`, + * presumably because it does not produce a tab-character in browsers. + * + * @param {object} nativeEvent Native browser event. + * @return {number} Normalized `charCode` property. + */ + function getEventCharCode(nativeEvent) { + var charCode; + var keyCode = nativeEvent.keyCode; + + if ('charCode' in nativeEvent) { + charCode = nativeEvent.charCode; + + // FF does not set `charCode` for the Enter-key, check against `keyCode`. + if (charCode === 0 && keyCode === 13) { + charCode = 13; + } + } else { + // IE8 does not implement `charCode`, but `keyCode` has the correct value. + charCode = keyCode; + } + + // Some non-printable keys are reported in `charCode`/`keyCode`, discard them. + // Must not discard the (non-)printable Enter-key. + if (charCode >= 32 || charCode === 13) { + return charCode; + } + + return 0; + } + + module.exports = getEventCharCode; + +/***/ }, +/* 136 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule getEventKey + * @typechecks static-only + */ + + 'use strict'; + + var getEventCharCode = __webpack_require__(135); + + /** + * Normalization of deprecated HTML5 `key` values + * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names + */ + var normalizeKey = { + 'Esc': 'Escape', + 'Spacebar': ' ', + 'Left': 'ArrowLeft', + 'Up': 'ArrowUp', + 'Right': 'ArrowRight', + 'Down': 'ArrowDown', + 'Del': 'Delete', + 'Win': 'OS', + 'Menu': 'ContextMenu', + 'Apps': 'ContextMenu', + 'Scroll': 'ScrollLock', + 'MozPrintableKey': 'Unidentified' + }; + + /** + * Translation from legacy `keyCode` to HTML5 `key` + * Only special keys supported, all others depend on keyboard layout or browser + * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names + */ + var translateToKey = { + 8: 'Backspace', + 9: 'Tab', + 12: 'Clear', + 13: 'Enter', + 16: 'Shift', + 17: 'Control', + 18: 'Alt', + 19: 'Pause', + 20: 'CapsLock', + 27: 'Escape', + 32: ' ', + 33: 'PageUp', + 34: 'PageDown', + 35: 'End', + 36: 'Home', + 37: 'ArrowLeft', + 38: 'ArrowUp', + 39: 'ArrowRight', + 40: 'ArrowDown', + 45: 'Insert', + 46: 'Delete', + 112: 'F1', 113: 'F2', 114: 'F3', 115: 'F4', 116: 'F5', 117: 'F6', + 118: 'F7', 119: 'F8', 120: 'F9', 121: 'F10', 122: 'F11', 123: 'F12', + 144: 'NumLock', + 145: 'ScrollLock', + 224: 'Meta' + }; + + /** + * @param {object} nativeEvent Native browser event. + * @return {string} Normalized `key` property. + */ + function getEventKey(nativeEvent) { + if (nativeEvent.key) { + // Normalize inconsistent values reported by browsers due to + // implementations of a working draft specification. + + // FireFox implements `key` but returns `MozPrintableKey` for all + // printable characters (normalized to `Unidentified`), ignore it. + var key = normalizeKey[nativeEvent.key] || nativeEvent.key; + if (key !== 'Unidentified') { + return key; + } + } + + // Browser does not implement `key`, polyfill as much of it as we can. + if (nativeEvent.type === 'keypress') { + var charCode = getEventCharCode(nativeEvent); + + // The enter-key is technically both printable and non-printable and can + // thus be captured by `keypress`, no other non-printable key should. + return charCode === 13 ? 'Enter' : String.fromCharCode(charCode); + } + if (nativeEvent.type === 'keydown' || nativeEvent.type === 'keyup') { + // While user keyboard layout determines the actual meaning of each + // `keyCode` value, almost all function keys have a universal value. + return translateToKey[nativeEvent.keyCode] || 'Unidentified'; + } + return ''; + } + + module.exports = getEventKey; + +/***/ }, +/* 137 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule SyntheticDragEvent + * @typechecks static-only + */ + + 'use strict'; + + var SyntheticMouseEvent = __webpack_require__(85); + + /** + * @interface DragEvent + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ + var DragEventInterface = { + dataTransfer: null + }; + + /** + * @param {object} dispatchConfig Configuration used to dispatch this event. + * @param {string} dispatchMarker Marker identifying the event target. + * @param {object} nativeEvent Native browser event. + * @extends {SyntheticUIEvent} + */ + function SyntheticDragEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) { + SyntheticMouseEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget); + } + + SyntheticMouseEvent.augmentClass(SyntheticDragEvent, DragEventInterface); + + module.exports = SyntheticDragEvent; + +/***/ }, +/* 138 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule SyntheticTouchEvent + * @typechecks static-only + */ + + 'use strict'; + + var SyntheticUIEvent = __webpack_require__(86); + + var getEventModifierState = __webpack_require__(87); + + /** + * @interface TouchEvent + * @see http://www.w3.org/TR/touch-events/ + */ + var TouchEventInterface = { + touches: null, + targetTouches: null, + changedTouches: null, + altKey: null, + metaKey: null, + ctrlKey: null, + shiftKey: null, + getModifierState: getEventModifierState + }; + + /** + * @param {object} dispatchConfig Configuration used to dispatch this event. + * @param {string} dispatchMarker Marker identifying the event target. + * @param {object} nativeEvent Native browser event. + * @extends {SyntheticUIEvent} + */ + function SyntheticTouchEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) { + SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget); + } + + SyntheticUIEvent.augmentClass(SyntheticTouchEvent, TouchEventInterface); + + module.exports = SyntheticTouchEvent; + +/***/ }, +/* 139 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule SyntheticWheelEvent + * @typechecks static-only + */ + + 'use strict'; + + var SyntheticMouseEvent = __webpack_require__(85); + + /** + * @interface WheelEvent + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ + var WheelEventInterface = { + deltaX: function (event) { + return 'deltaX' in event ? event.deltaX : + // Fallback to `wheelDeltaX` for Webkit and normalize (right is positive). + 'wheelDeltaX' in event ? -event.wheelDeltaX : 0; + }, + deltaY: function (event) { + return 'deltaY' in event ? event.deltaY : + // Fallback to `wheelDeltaY` for Webkit and normalize (down is positive). + 'wheelDeltaY' in event ? -event.wheelDeltaY : + // Fallback to `wheelDelta` for IE<9 and normalize (down is positive). + 'wheelDelta' in event ? -event.wheelDelta : 0; + }, + deltaZ: null, + + // Browsers without "deltaMode" is reporting in raw wheel delta where one + // notch on the scroll is always +/- 120, roughly equivalent to pixels. + // A good approximation of DOM_DELTA_LINE (1) is 5% of viewport size or + // ~40 pixels, for DOM_DELTA_SCREEN (2) it is 87.5% of viewport size. + deltaMode: null + }; + + /** + * @param {object} dispatchConfig Configuration used to dispatch this event. + * @param {string} dispatchMarker Marker identifying the event target. + * @param {object} nativeEvent Native browser event. + * @extends {SyntheticMouseEvent} + */ + function SyntheticWheelEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) { + SyntheticMouseEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget); + } + + SyntheticMouseEvent.augmentClass(SyntheticWheelEvent, WheelEventInterface); + + module.exports = SyntheticWheelEvent; + +/***/ }, +/* 140 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule SVGDOMPropertyConfig + */ + + 'use strict'; + + var DOMProperty = __webpack_require__(22); + + var MUST_USE_ATTRIBUTE = DOMProperty.injection.MUST_USE_ATTRIBUTE; + + var NS = { + xlink: 'http://www.w3.org/1999/xlink', + xml: 'http://www.w3.org/XML/1998/namespace' + }; + + var SVGDOMPropertyConfig = { + Properties: { + clipPath: MUST_USE_ATTRIBUTE, + cx: MUST_USE_ATTRIBUTE, + cy: MUST_USE_ATTRIBUTE, + d: MUST_USE_ATTRIBUTE, + dx: MUST_USE_ATTRIBUTE, + dy: MUST_USE_ATTRIBUTE, + fill: MUST_USE_ATTRIBUTE, + fillOpacity: MUST_USE_ATTRIBUTE, + fontFamily: MUST_USE_ATTRIBUTE, + fontSize: MUST_USE_ATTRIBUTE, + fx: MUST_USE_ATTRIBUTE, + fy: MUST_USE_ATTRIBUTE, + gradientTransform: MUST_USE_ATTRIBUTE, + gradientUnits: MUST_USE_ATTRIBUTE, + markerEnd: MUST_USE_ATTRIBUTE, + markerMid: MUST_USE_ATTRIBUTE, + markerStart: MUST_USE_ATTRIBUTE, + offset: MUST_USE_ATTRIBUTE, + opacity: MUST_USE_ATTRIBUTE, + patternContentUnits: MUST_USE_ATTRIBUTE, + patternUnits: MUST_USE_ATTRIBUTE, + points: MUST_USE_ATTRIBUTE, + preserveAspectRatio: MUST_USE_ATTRIBUTE, + r: MUST_USE_ATTRIBUTE, + rx: MUST_USE_ATTRIBUTE, + ry: MUST_USE_ATTRIBUTE, + spreadMethod: MUST_USE_ATTRIBUTE, + stopColor: MUST_USE_ATTRIBUTE, + stopOpacity: MUST_USE_ATTRIBUTE, + stroke: MUST_USE_ATTRIBUTE, + strokeDasharray: MUST_USE_ATTRIBUTE, + strokeLinecap: MUST_USE_ATTRIBUTE, + strokeOpacity: MUST_USE_ATTRIBUTE, + strokeWidth: MUST_USE_ATTRIBUTE, + textAnchor: MUST_USE_ATTRIBUTE, + transform: MUST_USE_ATTRIBUTE, + version: MUST_USE_ATTRIBUTE, + viewBox: MUST_USE_ATTRIBUTE, + x1: MUST_USE_ATTRIBUTE, + x2: MUST_USE_ATTRIBUTE, + x: MUST_USE_ATTRIBUTE, + xlinkActuate: MUST_USE_ATTRIBUTE, + xlinkArcrole: MUST_USE_ATTRIBUTE, + xlinkHref: MUST_USE_ATTRIBUTE, + xlinkRole: MUST_USE_ATTRIBUTE, + xlinkShow: MUST_USE_ATTRIBUTE, + xlinkTitle: MUST_USE_ATTRIBUTE, + xlinkType: MUST_USE_ATTRIBUTE, + xmlBase: MUST_USE_ATTRIBUTE, + xmlLang: MUST_USE_ATTRIBUTE, + xmlSpace: MUST_USE_ATTRIBUTE, + y1: MUST_USE_ATTRIBUTE, + y2: MUST_USE_ATTRIBUTE, + y: MUST_USE_ATTRIBUTE + }, + DOMAttributeNamespaces: { + xlinkActuate: NS.xlink, + xlinkArcrole: NS.xlink, + xlinkHref: NS.xlink, + xlinkRole: NS.xlink, + xlinkShow: NS.xlink, + xlinkTitle: NS.xlink, + xlinkType: NS.xlink, + xmlBase: NS.xml, + xmlLang: NS.xml, + xmlSpace: NS.xml + }, + DOMAttributeNames: { + clipPath: 'clip-path', + fillOpacity: 'fill-opacity', + fontFamily: 'font-family', + fontSize: 'font-size', + gradientTransform: 'gradientTransform', + gradientUnits: 'gradientUnits', + markerEnd: 'marker-end', + markerMid: 'marker-mid', + markerStart: 'marker-start', + patternContentUnits: 'patternContentUnits', + patternUnits: 'patternUnits', + preserveAspectRatio: 'preserveAspectRatio', + spreadMethod: 'spreadMethod', + stopColor: 'stop-color', + stopOpacity: 'stop-opacity', + strokeDasharray: 'stroke-dasharray', + strokeLinecap: 'stroke-linecap', + strokeOpacity: 'stroke-opacity', + strokeWidth: 'stroke-width', + textAnchor: 'text-anchor', + viewBox: 'viewBox', + xlinkActuate: 'xlink:actuate', + xlinkArcrole: 'xlink:arcrole', + xlinkHref: 'xlink:href', + xlinkRole: 'xlink:role', + xlinkShow: 'xlink:show', + xlinkTitle: 'xlink:title', + xlinkType: 'xlink:type', + xmlBase: 'xml:base', + xmlLang: 'xml:lang', + xmlSpace: 'xml:space' + } + }; + + module.exports = SVGDOMPropertyConfig; + +/***/ }, +/* 141 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactDefaultPerf + * @typechecks static-only + */ + + 'use strict'; + + var DOMProperty = __webpack_require__(22); + var ReactDefaultPerfAnalysis = __webpack_require__(142); + var ReactMount = __webpack_require__(27); + var ReactPerf = __webpack_require__(17); + + var performanceNow = __webpack_require__(143); + + function roundFloat(val) { + return Math.floor(val * 100) / 100; + } + + function addValue(obj, key, val) { + obj[key] = (obj[key] || 0) + val; + } + + var ReactDefaultPerf = { + _allMeasurements: [], // last item in the list is the current one + _mountStack: [0], + _injected: false, + + start: function () { + if (!ReactDefaultPerf._injected) { + ReactPerf.injection.injectMeasure(ReactDefaultPerf.measure); + } + + ReactDefaultPerf._allMeasurements.length = 0; + ReactPerf.enableMeasure = true; + }, + + stop: function () { + ReactPerf.enableMeasure = false; + }, + + getLastMeasurements: function () { + return ReactDefaultPerf._allMeasurements; + }, + + printExclusive: function (measurements) { + measurements = measurements || ReactDefaultPerf._allMeasurements; + var summary = ReactDefaultPerfAnalysis.getExclusiveSummary(measurements); + console.table(summary.map(function (item) { + return { + 'Component class name': item.componentName, + 'Total inclusive time (ms)': roundFloat(item.inclusive), + 'Exclusive mount time (ms)': roundFloat(item.exclusive), + 'Exclusive render time (ms)': roundFloat(item.render), + 'Mount time per instance (ms)': roundFloat(item.exclusive / item.count), + 'Render time per instance (ms)': roundFloat(item.render / item.count), + 'Instances': item.count + }; + })); + // TODO: ReactDefaultPerfAnalysis.getTotalTime() does not return the correct + // number. + }, + + printInclusive: function (measurements) { + measurements = measurements || ReactDefaultPerf._allMeasurements; + var summary = ReactDefaultPerfAnalysis.getInclusiveSummary(measurements); + console.table(summary.map(function (item) { + return { + 'Owner > component': item.componentName, + 'Inclusive time (ms)': roundFloat(item.time), + 'Instances': item.count + }; + })); + console.log('Total time:', ReactDefaultPerfAnalysis.getTotalTime(measurements).toFixed(2) + ' ms'); + }, + + getMeasurementsSummaryMap: function (measurements) { + var summary = ReactDefaultPerfAnalysis.getInclusiveSummary(measurements, true); + return summary.map(function (item) { + return { + 'Owner > component': item.componentName, + 'Wasted time (ms)': item.time, + 'Instances': item.count + }; + }); + }, + + printWasted: function (measurements) { + measurements = measurements || ReactDefaultPerf._allMeasurements; + console.table(ReactDefaultPerf.getMeasurementsSummaryMap(measurements)); + console.log('Total time:', ReactDefaultPerfAnalysis.getTotalTime(measurements).toFixed(2) + ' ms'); + }, + + printDOM: function (measurements) { + measurements = measurements || ReactDefaultPerf._allMeasurements; + var summary = ReactDefaultPerfAnalysis.getDOMSummary(measurements); + console.table(summary.map(function (item) { + var result = {}; + result[DOMProperty.ID_ATTRIBUTE_NAME] = item.id; + result.type = item.type; + result.args = JSON.stringify(item.args); + return result; + })); + console.log('Total time:', ReactDefaultPerfAnalysis.getTotalTime(measurements).toFixed(2) + ' ms'); + }, + + _recordWrite: function (id, fnName, totalTime, args) { + // TODO: totalTime isn't that useful since it doesn't count paints/reflows + var writes = ReactDefaultPerf._allMeasurements[ReactDefaultPerf._allMeasurements.length - 1].writes; + writes[id] = writes[id] || []; + writes[id].push({ + type: fnName, + time: totalTime, + args: args + }); + }, + + measure: function (moduleName, fnName, func) { + return function () { + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + var totalTime; + var rv; + var start; + + if (fnName === '_renderNewRootComponent' || fnName === 'flushBatchedUpdates') { + // A "measurement" is a set of metrics recorded for each flush. We want + // to group the metrics for a given flush together so we can look at the + // components that rendered and the DOM operations that actually + // happened to determine the amount of "wasted work" performed. + ReactDefaultPerf._allMeasurements.push({ + exclusive: {}, + inclusive: {}, + render: {}, + counts: {}, + writes: {}, + displayNames: {}, + totalTime: 0, + created: {} + }); + start = performanceNow(); + rv = func.apply(this, args); + ReactDefaultPerf._allMeasurements[ReactDefaultPerf._allMeasurements.length - 1].totalTime = performanceNow() - start; + return rv; + } else if (fnName === '_mountImageIntoNode' || moduleName === 'ReactBrowserEventEmitter' || moduleName === 'ReactDOMIDOperations' || moduleName === 'CSSPropertyOperations' || moduleName === 'DOMChildrenOperations' || moduleName === 'DOMPropertyOperations') { + start = performanceNow(); + rv = func.apply(this, args); + totalTime = performanceNow() - start; + + if (fnName === '_mountImageIntoNode') { + var mountID = ReactMount.getID(args[1]); + ReactDefaultPerf._recordWrite(mountID, fnName, totalTime, args[0]); + } else if (fnName === 'dangerouslyProcessChildrenUpdates') { + // special format + args[0].forEach(function (update) { + var writeArgs = {}; + if (update.fromIndex !== null) { + writeArgs.fromIndex = update.fromIndex; + } + if (update.toIndex !== null) { + writeArgs.toIndex = update.toIndex; + } + if (update.textContent !== null) { + writeArgs.textContent = update.textContent; + } + if (update.markupIndex !== null) { + writeArgs.markup = args[1][update.markupIndex]; + } + ReactDefaultPerf._recordWrite(update.parentID, update.type, totalTime, writeArgs); + }); + } else { + // basic format + var id = args[0]; + if (typeof id === 'object') { + id = ReactMount.getID(args[0]); + } + ReactDefaultPerf._recordWrite(id, fnName, totalTime, Array.prototype.slice.call(args, 1)); + } + return rv; + } else if (moduleName === 'ReactCompositeComponent' && (fnName === 'mountComponent' || fnName === 'updateComponent' || // TODO: receiveComponent()? + fnName === '_renderValidatedComponent')) { + + if (this._currentElement.type === ReactMount.TopLevelWrapper) { + return func.apply(this, args); + } + + var rootNodeID = fnName === 'mountComponent' ? args[0] : this._rootNodeID; + var isRender = fnName === '_renderValidatedComponent'; + var isMount = fnName === 'mountComponent'; + + var mountStack = ReactDefaultPerf._mountStack; + var entry = ReactDefaultPerf._allMeasurements[ReactDefaultPerf._allMeasurements.length - 1]; + + if (isRender) { + addValue(entry.counts, rootNodeID, 1); + } else if (isMount) { + entry.created[rootNodeID] = true; + mountStack.push(0); + } + + start = performanceNow(); + rv = func.apply(this, args); + totalTime = performanceNow() - start; + + if (isRender) { + addValue(entry.render, rootNodeID, totalTime); + } else if (isMount) { + var subMountTime = mountStack.pop(); + mountStack[mountStack.length - 1] += totalTime; + addValue(entry.exclusive, rootNodeID, totalTime - subMountTime); + addValue(entry.inclusive, rootNodeID, totalTime); + } else { + addValue(entry.inclusive, rootNodeID, totalTime); + } + + entry.displayNames[rootNodeID] = { + current: this.getName(), + owner: this._currentElement._owner ? this._currentElement._owner.getName() : '<root>' + }; + + return rv; + } else { + return func.apply(this, args); + } + }; + } + }; + + module.exports = ReactDefaultPerf; + +/***/ }, +/* 142 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactDefaultPerfAnalysis + */ + + 'use strict'; + + var assign = __webpack_require__(38); + + // Don't try to save users less than 1.2ms (a number I made up) + var DONT_CARE_THRESHOLD = 1.2; + var DOM_OPERATION_TYPES = { + '_mountImageIntoNode': 'set innerHTML', + INSERT_MARKUP: 'set innerHTML', + MOVE_EXISTING: 'move', + REMOVE_NODE: 'remove', + SET_MARKUP: 'set innerHTML', + TEXT_CONTENT: 'set textContent', + 'setValueForProperty': 'update attribute', + 'setValueForAttribute': 'update attribute', + 'deleteValueForProperty': 'remove attribute', + 'dangerouslyReplaceNodeWithMarkupByID': 'replace' + }; + + function getTotalTime(measurements) { + // TODO: return number of DOM ops? could be misleading. + // TODO: measure dropped frames after reconcile? + // TODO: log total time of each reconcile and the top-level component + // class that triggered it. + var totalTime = 0; + for (var i = 0; i < measurements.length; i++) { + var measurement = measurements[i]; + totalTime += measurement.totalTime; + } + return totalTime; + } + + function getDOMSummary(measurements) { + var items = []; + measurements.forEach(function (measurement) { + Object.keys(measurement.writes).forEach(function (id) { + measurement.writes[id].forEach(function (write) { + items.push({ + id: id, + type: DOM_OPERATION_TYPES[write.type] || write.type, + args: write.args + }); + }); + }); + }); + return items; + } + + function getExclusiveSummary(measurements) { + var candidates = {}; + var displayName; + + for (var i = 0; i < measurements.length; i++) { + var measurement = measurements[i]; + var allIDs = assign({}, measurement.exclusive, measurement.inclusive); + + for (var id in allIDs) { + displayName = measurement.displayNames[id].current; + + candidates[displayName] = candidates[displayName] || { + componentName: displayName, + inclusive: 0, + exclusive: 0, + render: 0, + count: 0 + }; + if (measurement.render[id]) { + candidates[displayName].render += measurement.render[id]; + } + if (measurement.exclusive[id]) { + candidates[displayName].exclusive += measurement.exclusive[id]; + } + if (measurement.inclusive[id]) { + candidates[displayName].inclusive += measurement.inclusive[id]; + } + if (measurement.counts[id]) { + candidates[displayName].count += measurement.counts[id]; + } + } + } + + // Now make a sorted array with the results. + var arr = []; + for (displayName in candidates) { + if (candidates[displayName].exclusive >= DONT_CARE_THRESHOLD) { + arr.push(candidates[displayName]); + } + } + + arr.sort(function (a, b) { + return b.exclusive - a.exclusive; + }); + + return arr; + } + + function getInclusiveSummary(measurements, onlyClean) { + var candidates = {}; + var inclusiveKey; + + for (var i = 0; i < measurements.length; i++) { + var measurement = measurements[i]; + var allIDs = assign({}, measurement.exclusive, measurement.inclusive); + var cleanComponents; + + if (onlyClean) { + cleanComponents = getUnchangedComponents(measurement); + } + + for (var id in allIDs) { + if (onlyClean && !cleanComponents[id]) { + continue; + } + + var displayName = measurement.displayNames[id]; + + // Inclusive time is not useful for many components without knowing where + // they are instantiated. So we aggregate inclusive time with both the + // owner and current displayName as the key. + inclusiveKey = displayName.owner + ' > ' + displayName.current; + + candidates[inclusiveKey] = candidates[inclusiveKey] || { + componentName: inclusiveKey, + time: 0, + count: 0 + }; + + if (measurement.inclusive[id]) { + candidates[inclusiveKey].time += measurement.inclusive[id]; + } + if (measurement.counts[id]) { + candidates[inclusiveKey].count += measurement.counts[id]; + } + } + } + + // Now make a sorted array with the results. + var arr = []; + for (inclusiveKey in candidates) { + if (candidates[inclusiveKey].time >= DONT_CARE_THRESHOLD) { + arr.push(candidates[inclusiveKey]); + } + } + + arr.sort(function (a, b) { + return b.time - a.time; + }); + + return arr; + } + + function getUnchangedComponents(measurement) { + // For a given reconcile, look at which components did not actually + // render anything to the DOM and return a mapping of their ID to + // the amount of time it took to render the entire subtree. + var cleanComponents = {}; + var dirtyLeafIDs = Object.keys(measurement.writes); + var allIDs = assign({}, measurement.exclusive, measurement.inclusive); + + for (var id in allIDs) { + var isDirty = false; + // For each component that rendered, see if a component that triggered + // a DOM op is in its subtree. + for (var i = 0; i < dirtyLeafIDs.length; i++) { + if (dirtyLeafIDs[i].indexOf(id) === 0) { + isDirty = true; + break; + } + } + // check if component newly created + if (measurement.created[id]) { + isDirty = true; + } + if (!isDirty && measurement.counts[id] > 0) { + cleanComponents[id] = true; + } + } + return cleanComponents; + } + + var ReactDefaultPerfAnalysis = { + getExclusiveSummary: getExclusiveSummary, + getInclusiveSummary: getInclusiveSummary, + getDOMSummary: getDOMSummary, + getTotalTime: getTotalTime + }; + + module.exports = ReactDefaultPerfAnalysis; + +/***/ }, +/* 143 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule performanceNow + * @typechecks + */ + + 'use strict'; + + var performance = __webpack_require__(144); + var curPerformance = performance; + + /** + * Detect if we can use `window.performance.now()` and gracefully fallback to + * `Date.now()` if it doesn't exist. We need to support Firefox < 15 for now + * because of Facebook's testing infrastructure. + */ + if (!curPerformance || !curPerformance.now) { + curPerformance = Date; + } + + var performanceNow = curPerformance.now.bind(curPerformance); + + module.exports = performanceNow; + +/***/ }, +/* 144 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule performance + * @typechecks + */ + + 'use strict'; + + var ExecutionEnvironment = __webpack_require__(8); + + var performance; + + if (ExecutionEnvironment.canUseDOM) { + performance = window.performance || window.msPerformance || window.webkitPerformance; + } + + module.exports = performance || {}; + +/***/ }, +/* 145 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactVersion + */ + + 'use strict'; + + module.exports = '0.14.3'; + +/***/ }, +/* 146 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule renderSubtreeIntoContainer + */ + + 'use strict'; + + var ReactMount = __webpack_require__(27); + + module.exports = ReactMount.renderSubtreeIntoContainer; + +/***/ }, +/* 147 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + module.exports = __webpack_require__(148); + + +/***/ }, +/* 148 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule React + */ + + 'use strict'; + + var ReactDOM = __webpack_require__(2); + var ReactDOMServer = __webpack_require__(149); + var ReactIsomorphic = __webpack_require__(153); + + var assign = __webpack_require__(38); + var deprecated = __webpack_require__(158); + + // `version` will be added here by ReactIsomorphic. + var React = {}; + + assign(React, ReactIsomorphic); + + assign(React, { + // ReactDOM + findDOMNode: deprecated('findDOMNode', 'ReactDOM', 'react-dom', ReactDOM, ReactDOM.findDOMNode), + render: deprecated('render', 'ReactDOM', 'react-dom', ReactDOM, ReactDOM.render), + unmountComponentAtNode: deprecated('unmountComponentAtNode', 'ReactDOM', 'react-dom', ReactDOM, ReactDOM.unmountComponentAtNode), + + // ReactDOMServer + renderToString: deprecated('renderToString', 'ReactDOMServer', 'react-dom/server', ReactDOMServer, ReactDOMServer.renderToString), + renderToStaticMarkup: deprecated('renderToStaticMarkup', 'ReactDOMServer', 'react-dom/server', ReactDOMServer, ReactDOMServer.renderToStaticMarkup) + }); + + React.__SECRET_DOM_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ReactDOM; + React.__SECRET_DOM_SERVER_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ReactDOMServer; + + module.exports = React; + +/***/ }, +/* 149 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactDOMServer + */ + + 'use strict'; + + var ReactDefaultInjection = __webpack_require__(70); + var ReactServerRendering = __webpack_require__(150); + var ReactVersion = __webpack_require__(145); + + ReactDefaultInjection.inject(); + + var ReactDOMServer = { + renderToString: ReactServerRendering.renderToString, + renderToStaticMarkup: ReactServerRendering.renderToStaticMarkup, + version: ReactVersion + }; + + module.exports = ReactDOMServer; + +/***/ }, +/* 150 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @typechecks static-only + * @providesModule ReactServerRendering + */ + 'use strict'; + + var ReactDefaultBatchingStrategy = __webpack_require__(91); + var ReactElement = __webpack_require__(41); + var ReactInstanceHandles = __webpack_require__(44); + var ReactMarkupChecksum = __webpack_require__(47); + var ReactServerBatchingStrategy = __webpack_require__(151); + var ReactServerRenderingTransaction = __webpack_require__(152); + var ReactUpdates = __webpack_require__(53); + + var emptyObject = __webpack_require__(57); + var instantiateReactComponent = __webpack_require__(61); + var invariant = __webpack_require__(12); + + /** + * @param {ReactElement} element + * @return {string} the HTML markup + */ + function renderToString(element) { + !ReactElement.isValidElement(element) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'renderToString(): You must pass a valid ReactElement.') : invariant(false) : undefined; + + var transaction; + try { + ReactUpdates.injection.injectBatchingStrategy(ReactServerBatchingStrategy); + + var id = ReactInstanceHandles.createReactRootID(); + transaction = ReactServerRenderingTransaction.getPooled(false); + + return transaction.perform(function () { + var componentInstance = instantiateReactComponent(element, null); + var markup = componentInstance.mountComponent(id, transaction, emptyObject); + return ReactMarkupChecksum.addChecksumToMarkup(markup); + }, null); + } finally { + ReactServerRenderingTransaction.release(transaction); + // Revert to the DOM batching strategy since these two renderers + // currently share these stateful modules. + ReactUpdates.injection.injectBatchingStrategy(ReactDefaultBatchingStrategy); + } + } + + /** + * @param {ReactElement} element + * @return {string} the HTML markup, without the extra React ID and checksum + * (for generating static pages) + */ + function renderToStaticMarkup(element) { + !ReactElement.isValidElement(element) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'renderToStaticMarkup(): You must pass a valid ReactElement.') : invariant(false) : undefined; + + var transaction; + try { + ReactUpdates.injection.injectBatchingStrategy(ReactServerBatchingStrategy); + + var id = ReactInstanceHandles.createReactRootID(); + transaction = ReactServerRenderingTransaction.getPooled(true); + + return transaction.perform(function () { + var componentInstance = instantiateReactComponent(element, null); + return componentInstance.mountComponent(id, transaction, emptyObject); + }, null); + } finally { + ReactServerRenderingTransaction.release(transaction); + // Revert to the DOM batching strategy since these two renderers + // currently share these stateful modules. + ReactUpdates.injection.injectBatchingStrategy(ReactDefaultBatchingStrategy); + } + } + + module.exports = { + renderToString: renderToString, + renderToStaticMarkup: renderToStaticMarkup + }; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 151 */ +/***/ function(module, exports) { + + /** + * Copyright 2014-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactServerBatchingStrategy + * @typechecks + */ + + 'use strict'; + + var ReactServerBatchingStrategy = { + isBatchingUpdates: false, + batchedUpdates: function (callback) { + // Don't do anything here. During the server rendering we don't want to + // schedule any updates. We will simply ignore them. + } + }; + + module.exports = ReactServerBatchingStrategy; + +/***/ }, +/* 152 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Copyright 2014-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactServerRenderingTransaction + * @typechecks + */ + + 'use strict'; + + var PooledClass = __webpack_require__(55); + var CallbackQueue = __webpack_require__(54); + var Transaction = __webpack_require__(56); + + var assign = __webpack_require__(38); + var emptyFunction = __webpack_require__(14); + + /** + * Provides a `CallbackQueue` queue for collecting `onDOMReady` callbacks + * during the performing of the transaction. + */ + var ON_DOM_READY_QUEUEING = { + /** + * Initializes the internal `onDOMReady` queue. + */ + initialize: function () { + this.reactMountReady.reset(); + }, + + close: emptyFunction + }; + + /** + * Executed within the scope of the `Transaction` instance. Consider these as + * being member methods, but with an implied ordering while being isolated from + * each other. + */ + var TRANSACTION_WRAPPERS = [ON_DOM_READY_QUEUEING]; + + /** + * @class ReactServerRenderingTransaction + * @param {boolean} renderToStaticMarkup + */ + function ReactServerRenderingTransaction(renderToStaticMarkup) { + this.reinitializeTransaction(); + this.renderToStaticMarkup = renderToStaticMarkup; + this.reactMountReady = CallbackQueue.getPooled(null); + this.useCreateElement = false; + } + + var Mixin = { + /** + * @see Transaction + * @abstract + * @final + * @return {array} Empty list of operation wrap procedures. + */ + getTransactionWrappers: function () { + return TRANSACTION_WRAPPERS; + }, + + /** + * @return {object} The queue to collect `onDOMReady` callbacks with. + */ + getReactMountReady: function () { + return this.reactMountReady; + }, + + /** + * `PooledClass` looks for this, and will invoke this before allowing this + * instance to be reused. + */ + destructor: function () { + CallbackQueue.release(this.reactMountReady); + this.reactMountReady = null; + } + }; + + assign(ReactServerRenderingTransaction.prototype, Transaction.Mixin, Mixin); + + PooledClass.addPoolingTo(ReactServerRenderingTransaction); + + module.exports = ReactServerRenderingTransaction; + +/***/ }, +/* 153 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactIsomorphic + */ + + 'use strict'; + + var ReactChildren = __webpack_require__(109); + var ReactComponent = __webpack_require__(122); + var ReactClass = __webpack_require__(121); + var ReactDOMFactories = __webpack_require__(154); + var ReactElement = __webpack_require__(41); + var ReactElementValidator = __webpack_require__(155); + var ReactPropTypes = __webpack_require__(106); + var ReactVersion = __webpack_require__(145); + + var assign = __webpack_require__(38); + var onlyChild = __webpack_require__(157); + + var createElement = ReactElement.createElement; + var createFactory = ReactElement.createFactory; + var cloneElement = ReactElement.cloneElement; + + if (process.env.NODE_ENV !== 'production') { + createElement = ReactElementValidator.createElement; + createFactory = ReactElementValidator.createFactory; + cloneElement = ReactElementValidator.cloneElement; + } + + var React = { + + // Modern + + Children: { + map: ReactChildren.map, + forEach: ReactChildren.forEach, + count: ReactChildren.count, + toArray: ReactChildren.toArray, + only: onlyChild + }, + + Component: ReactComponent, + + createElement: createElement, + cloneElement: cloneElement, + isValidElement: ReactElement.isValidElement, + + // Classic + + PropTypes: ReactPropTypes, + createClass: ReactClass.createClass, + createFactory: createFactory, + createMixin: function (mixin) { + // Currently a noop. Will be used to validate and trace mixins. + return mixin; + }, + + // This looks DOM specific but these are actually isomorphic helpers + // since they are just generating DOM strings. + DOM: ReactDOMFactories, + + version: ReactVersion, + + // Hook for JSX spread, don't use this for anything else. + __spread: assign + }; + + module.exports = React; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 154 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactDOMFactories + * @typechecks static-only + */ + + 'use strict'; + + var ReactElement = __webpack_require__(41); + var ReactElementValidator = __webpack_require__(155); + + var mapObject = __webpack_require__(156); + + /** + * Create a factory that creates HTML tag elements. + * + * @param {string} tag Tag name (e.g. `div`). + * @private + */ + function createDOMFactory(tag) { + if (process.env.NODE_ENV !== 'production') { + return ReactElementValidator.createFactory(tag); + } + return ReactElement.createFactory(tag); + } + + /** + * Creates a mapping from supported HTML tags to `ReactDOMComponent` classes. + * This is also accessible via `React.DOM`. + * + * @public + */ + var ReactDOMFactories = mapObject({ + a: 'a', + abbr: 'abbr', + address: 'address', + area: 'area', + article: 'article', + aside: 'aside', + audio: 'audio', + b: 'b', + base: 'base', + bdi: 'bdi', + bdo: 'bdo', + big: 'big', + blockquote: 'blockquote', + body: 'body', + br: 'br', + button: 'button', + canvas: 'canvas', + caption: 'caption', + cite: 'cite', + code: 'code', + col: 'col', + colgroup: 'colgroup', + data: 'data', + datalist: 'datalist', + dd: 'dd', + del: 'del', + details: 'details', + dfn: 'dfn', + dialog: 'dialog', + div: 'div', + dl: 'dl', + dt: 'dt', + em: 'em', + embed: 'embed', + fieldset: 'fieldset', + figcaption: 'figcaption', + figure: 'figure', + footer: 'footer', + form: 'form', + h1: 'h1', + h2: 'h2', + h3: 'h3', + h4: 'h4', + h5: 'h5', + h6: 'h6', + head: 'head', + header: 'header', + hgroup: 'hgroup', + hr: 'hr', + html: 'html', + i: 'i', + iframe: 'iframe', + img: 'img', + input: 'input', + ins: 'ins', + kbd: 'kbd', + keygen: 'keygen', + label: 'label', + legend: 'legend', + li: 'li', + link: 'link', + main: 'main', + map: 'map', + mark: 'mark', + menu: 'menu', + menuitem: 'menuitem', + meta: 'meta', + meter: 'meter', + nav: 'nav', + noscript: 'noscript', + object: 'object', + ol: 'ol', + optgroup: 'optgroup', + option: 'option', + output: 'output', + p: 'p', + param: 'param', + picture: 'picture', + pre: 'pre', + progress: 'progress', + q: 'q', + rp: 'rp', + rt: 'rt', + ruby: 'ruby', + s: 's', + samp: 'samp', + script: 'script', + section: 'section', + select: 'select', + small: 'small', + source: 'source', + span: 'span', + strong: 'strong', + style: 'style', + sub: 'sub', + summary: 'summary', + sup: 'sup', + table: 'table', + tbody: 'tbody', + td: 'td', + textarea: 'textarea', + tfoot: 'tfoot', + th: 'th', + thead: 'thead', + time: 'time', + title: 'title', + tr: 'tr', + track: 'track', + u: 'u', + ul: 'ul', + 'var': 'var', + video: 'video', + wbr: 'wbr', + + // SVG + circle: 'circle', + clipPath: 'clipPath', + defs: 'defs', + ellipse: 'ellipse', + g: 'g', + image: 'image', + line: 'line', + linearGradient: 'linearGradient', + mask: 'mask', + path: 'path', + pattern: 'pattern', + polygon: 'polygon', + polyline: 'polyline', + radialGradient: 'radialGradient', + rect: 'rect', + stop: 'stop', + svg: 'svg', + text: 'text', + tspan: 'tspan' + + }, createDOMFactory); + + module.exports = ReactDOMFactories; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 155 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2014-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactElementValidator + */ + + /** + * ReactElementValidator provides a wrapper around a element factory + * which validates the props passed to the element. This is intended to be + * used only in DEV and could be replaced by a static type checker for languages + * that support it. + */ + + 'use strict'; + + var ReactElement = __webpack_require__(41); + var ReactPropTypeLocations = __webpack_require__(64); + var ReactPropTypeLocationNames = __webpack_require__(65); + var ReactCurrentOwner = __webpack_require__(4); + + var canDefineProperty = __webpack_require__(42); + var getIteratorFn = __webpack_require__(107); + var invariant = __webpack_require__(12); + var warning = __webpack_require__(24); + + function getDeclarationErrorAddendum() { + if (ReactCurrentOwner.current) { + var name = ReactCurrentOwner.current.getName(); + if (name) { + return ' Check the render method of `' + name + '`.'; + } + } + return ''; + } + + /** + * Warn if there's no key explicitly set on dynamic arrays of children or + * object keys are not valid. This allows us to keep track of children between + * updates. + */ + var ownerHasKeyUseWarning = {}; + + var loggedTypeFailures = {}; + + /** + * Warn if the element doesn't have an explicit key assigned to it. + * This element is in an array. The array could grow and shrink or be + * reordered. All children that haven't already been validated are required to + * have a "key" property assigned to it. + * + * @internal + * @param {ReactElement} element Element that requires a key. + * @param {*} parentType element's parent's type. + */ + function validateExplicitKey(element, parentType) { + if (!element._store || element._store.validated || element.key != null) { + return; + } + element._store.validated = true; + + var addenda = getAddendaForKeyUse('uniqueKey', element, parentType); + if (addenda === null) { + // we already showed the warning + return; + } + process.env.NODE_ENV !== 'production' ? warning(false, 'Each child in an array or iterator should have a unique "key" prop.' + '%s%s%s', addenda.parentOrOwner || '', addenda.childOwner || '', addenda.url || '') : undefined; + } + + /** + * Shared warning and monitoring code for the key warnings. + * + * @internal + * @param {string} messageType A key used for de-duping warnings. + * @param {ReactElement} element Component that requires a key. + * @param {*} parentType element's parent's type. + * @returns {?object} A set of addenda to use in the warning message, or null + * if the warning has already been shown before (and shouldn't be shown again). + */ + function getAddendaForKeyUse(messageType, element, parentType) { + var addendum = getDeclarationErrorAddendum(); + if (!addendum) { + var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name; + if (parentName) { + addendum = ' Check the top-level render call using <' + parentName + '>.'; + } + } + + var memoizer = ownerHasKeyUseWarning[messageType] || (ownerHasKeyUseWarning[messageType] = {}); + if (memoizer[addendum]) { + return null; + } + memoizer[addendum] = true; + + var addenda = { + parentOrOwner: addendum, + url: ' See https://fb.me/react-warning-keys for more information.', + childOwner: null + }; + + // Usually the current owner is the offender, but if it accepts children as a + // property, it may be the creator of the child that's responsible for + // assigning it a key. + if (element && element._owner && element._owner !== ReactCurrentOwner.current) { + // Give the component that originally created this child. + addenda.childOwner = ' It was passed a child from ' + element._owner.getName() + '.'; + } + + return addenda; + } + + /** + * Ensure that every element either is passed in a static location, in an + * array with an explicit keys property defined, or in an object literal + * with valid key property. + * + * @internal + * @param {ReactNode} node Statically passed child of any type. + * @param {*} parentType node's parent's type. + */ + function validateChildKeys(node, parentType) { + if (typeof node !== 'object') { + return; + } + if (Array.isArray(node)) { + for (var i = 0; i < node.length; i++) { + var child = node[i]; + if (ReactElement.isValidElement(child)) { + validateExplicitKey(child, parentType); + } + } + } else if (ReactElement.isValidElement(node)) { + // This element was passed in a valid location. + if (node._store) { + node._store.validated = true; + } + } else if (node) { + var iteratorFn = getIteratorFn(node); + // Entry iterators provide implicit keys. + if (iteratorFn) { + if (iteratorFn !== node.entries) { + var iterator = iteratorFn.call(node); + var step; + while (!(step = iterator.next()).done) { + if (ReactElement.isValidElement(step.value)) { + validateExplicitKey(step.value, parentType); + } + } + } + } + } + } + + /** + * Assert that the props are valid + * + * @param {string} componentName Name of the component for error messages. + * @param {object} propTypes Map of prop name to a ReactPropType + * @param {object} props + * @param {string} location e.g. "prop", "context", "child context" + * @private + */ + function checkPropTypes(componentName, propTypes, props, location) { + for (var propName in propTypes) { + if (propTypes.hasOwnProperty(propName)) { + var error; + // Prop type validation may throw. In case they do, we don't want to + // fail the render phase where it didn't fail before. So we log it. + // After these have been cleaned up, we'll let them throw. + try { + // This is intentionally an invariant that gets caught. It's the same + // behavior as without this statement except with a better message. + !(typeof propTypes[propName] === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s: %s type `%s` is invalid; it must be a function, usually from ' + 'React.PropTypes.', componentName || 'React class', ReactPropTypeLocationNames[location], propName) : invariant(false) : undefined; + error = propTypes[propName](props, propName, componentName, location); + } catch (ex) { + error = ex; + } + process.env.NODE_ENV !== 'production' ? warning(!error || error instanceof Error, '%s: type specification of %s `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', ReactPropTypeLocationNames[location], propName, typeof error) : undefined; + if (error instanceof Error && !(error.message in loggedTypeFailures)) { + // Only monitor this failure once because there tends to be a lot of the + // same error. + loggedTypeFailures[error.message] = true; + + var addendum = getDeclarationErrorAddendum(); + process.env.NODE_ENV !== 'production' ? warning(false, 'Failed propType: %s%s', error.message, addendum) : undefined; + } + } + } + } + + /** + * Given an element, validate that its props follow the propTypes definition, + * provided by the type. + * + * @param {ReactElement} element + */ + function validatePropTypes(element) { + var componentClass = element.type; + if (typeof componentClass !== 'function') { + return; + } + var name = componentClass.displayName || componentClass.name; + if (componentClass.propTypes) { + checkPropTypes(name, componentClass.propTypes, element.props, ReactPropTypeLocations.prop); + } + if (typeof componentClass.getDefaultProps === 'function') { + process.env.NODE_ENV !== 'production' ? warning(componentClass.getDefaultProps.isReactClassApproved, 'getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.') : undefined; + } + } + + var ReactElementValidator = { + + createElement: function (type, props, children) { + var validType = typeof type === 'string' || typeof type === 'function'; + // We warn in this case but don't throw. We expect the element creation to + // succeed and there will likely be errors in render. + process.env.NODE_ENV !== 'production' ? warning(validType, 'React.createElement: type should not be null, undefined, boolean, or ' + 'number. It should be a string (for DOM elements) or a ReactClass ' + '(for composite components).%s', getDeclarationErrorAddendum()) : undefined; + + var element = ReactElement.createElement.apply(this, arguments); + + // The result can be nullish if a mock or a custom function is used. + // TODO: Drop this when these are no longer allowed as the type argument. + if (element == null) { + return element; + } + + // Skip key warning if the type isn't valid since our key validation logic + // doesn't expect a non-string/function type and can throw confusing errors. + // We don't want exception behavior to differ between dev and prod. + // (Rendering will throw with a helpful message and as soon as the type is + // fixed, the key warnings will appear.) + if (validType) { + for (var i = 2; i < arguments.length; i++) { + validateChildKeys(arguments[i], type); + } + } + + validatePropTypes(element); + + return element; + }, + + createFactory: function (type) { + var validatedFactory = ReactElementValidator.createElement.bind(null, type); + // Legacy hook TODO: Warn if this is accessed + validatedFactory.type = type; + + if (process.env.NODE_ENV !== 'production') { + if (canDefineProperty) { + Object.defineProperty(validatedFactory, 'type', { + enumerable: false, + get: function () { + process.env.NODE_ENV !== 'production' ? warning(false, 'Factory.type is deprecated. Access the class directly ' + 'before passing it to createFactory.') : undefined; + Object.defineProperty(this, 'type', { + value: type + }); + return type; + } + }); + } + } + + return validatedFactory; + }, + + cloneElement: function (element, props, children) { + var newElement = ReactElement.cloneElement.apply(this, arguments); + for (var i = 2; i < arguments.length; i++) { + validateChildKeys(arguments[i], newElement.type); + } + validatePropTypes(newElement); + return newElement; + } + + }; + + module.exports = ReactElementValidator; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 156 */ +/***/ function(module, exports) { + + /** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule mapObject + */ + + 'use strict'; + + var hasOwnProperty = Object.prototype.hasOwnProperty; + + /** + * Executes the provided `callback` once for each enumerable own property in the + * object and constructs a new object from the results. The `callback` is + * invoked with three arguments: + * + * - the property value + * - the property name + * - the object being traversed + * + * Properties that are added after the call to `mapObject` will not be visited + * by `callback`. If the values of existing properties are changed, the value + * passed to `callback` will be the value at the time `mapObject` visits them. + * Properties that are deleted before being visited are not visited. + * + * @grep function objectMap() + * @grep function objMap() + * + * @param {?object} object + * @param {function} callback + * @param {*} context + * @return {?object} + */ + function mapObject(object, callback, context) { + if (!object) { + return null; + } + var result = {}; + for (var name in object) { + if (hasOwnProperty.call(object, name)) { + result[name] = callback.call(context, object[name], name, object); + } + } + return result; + } + + module.exports = mapObject; + +/***/ }, +/* 157 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule onlyChild + */ + 'use strict'; + + var ReactElement = __webpack_require__(41); + + var invariant = __webpack_require__(12); + + /** + * Returns the first child in a collection of children and verifies that there + * is only one child in the collection. The current implementation of this + * function assumes that a single child gets passed without a wrapper, but the + * purpose of this helper function is to abstract away the particular structure + * of children. + * + * @param {?object} children Child collection structure. + * @return {ReactComponent} The first and only `ReactComponent` contained in the + * structure. + */ + function onlyChild(children) { + !ReactElement.isValidElement(children) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'onlyChild must be passed a children with exactly one child.') : invariant(false) : undefined; + return children; + } + + module.exports = onlyChild; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 158 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) {/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule deprecated + */ + + 'use strict'; + + var assign = __webpack_require__(38); + var warning = __webpack_require__(24); + + /** + * This will log a single deprecation notice per function and forward the call + * on to the new API. + * + * @param {string} fnName The name of the function + * @param {string} newModule The module that fn will exist in + * @param {string} newPackage The module that fn will exist in + * @param {*} ctx The context this forwarded call should run in + * @param {function} fn The function to forward on to + * @return {function} The function that will warn once and then call fn + */ + function deprecated(fnName, newModule, newPackage, ctx, fn) { + var warned = false; + if (process.env.NODE_ENV !== 'production') { + var newFn = function () { + process.env.NODE_ENV !== 'production' ? warning(warned, + // Require examples in this string must be split to prevent React's + // build tools from mistaking them for real requires. + // Otherwise the build tools will attempt to build a '%s' module. + 'React.%s is deprecated. Please use %s.%s from require' + '(\'%s\') ' + 'instead.', fnName, newModule, fnName, newPackage) : undefined; + warned = true; + return fn.apply(ctx, arguments); + }; + // We need to make sure all properties of the original fn are copied over. + // In particular, this is needed to support PropTypes + return assign(newFn, fn); + } + + return fn; + } + + module.exports = deprecated; + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3))) + +/***/ }, +/* 159 */, +/* 160 */ +/***/ function(module, exports, __webpack_require__) { + + var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// Underscore.js 1.8.3 + // http://underscorejs.org + // (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + // Underscore may be freely distributed under the MIT license. + + (function() { + + // Baseline setup + // -------------- + + // Establish the root object, `window` in the browser, or `exports` on the server. + var root = this; + + // Save the previous value of the `_` variable. + var previousUnderscore = root._; + + // Save bytes in the minified (but not gzipped) version: + var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype; + + // Create quick reference variables for speed access to core prototypes. + var + push = ArrayProto.push, + slice = ArrayProto.slice, + toString = ObjProto.toString, + hasOwnProperty = ObjProto.hasOwnProperty; + + // All **ECMAScript 5** native function implementations that we hope to use + // are declared here. + var + nativeIsArray = Array.isArray, + nativeKeys = Object.keys, + nativeBind = FuncProto.bind, + nativeCreate = Object.create; + + // Naked function reference for surrogate-prototype-swapping. + var Ctor = function(){}; + + // Create a safe reference to the Underscore object for use below. + var _ = function(obj) { + if (obj instanceof _) return obj; + if (!(this instanceof _)) return new _(obj); + this._wrapped = obj; + }; + + // Export the Underscore object for **Node.js**, with + // backwards-compatibility for the old `require()` API. If we're in + // the browser, add `_` as a global object. + if (true) { + if (typeof module !== 'undefined' && module.exports) { + exports = module.exports = _; + } + exports._ = _; + } else { + root._ = _; + } + + // Current version. + _.VERSION = '1.8.3'; + + // Internal function that returns an efficient (for current engines) version + // of the passed-in callback, to be repeatedly applied in other Underscore + // functions. + var optimizeCb = function(func, context, argCount) { + if (context === void 0) return func; + switch (argCount == null ? 3 : argCount) { + case 1: return function(value) { + return func.call(context, value); + }; + case 2: return function(value, other) { + return func.call(context, value, other); + }; + case 3: return function(value, index, collection) { + return func.call(context, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(context, accumulator, value, index, collection); + }; + } + return function() { + return func.apply(context, arguments); + }; + }; + + // A mostly-internal function to generate callbacks that can be applied + // to each element in a collection, returning the desired result — either + // identity, an arbitrary callback, a property matcher, or a property accessor. + var cb = function(value, context, argCount) { + if (value == null) return _.identity; + if (_.isFunction(value)) return optimizeCb(value, context, argCount); + if (_.isObject(value)) return _.matcher(value); + return _.property(value); + }; + _.iteratee = function(value, context) { + return cb(value, context, Infinity); + }; + + // An internal function for creating assigner functions. + var createAssigner = function(keysFunc, undefinedOnly) { + return function(obj) { + var length = arguments.length; + if (length < 2 || obj == null) return obj; + for (var index = 1; index < length; index++) { + var source = arguments[index], + keys = keysFunc(source), + l = keys.length; + for (var i = 0; i < l; i++) { + var key = keys[i]; + if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key]; + } + } + return obj; + }; + }; + + // An internal function for creating a new object that inherits from another. + var baseCreate = function(prototype) { + if (!_.isObject(prototype)) return {}; + if (nativeCreate) return nativeCreate(prototype); + Ctor.prototype = prototype; + var result = new Ctor; + Ctor.prototype = null; + return result; + }; + + var property = function(key) { + return function(obj) { + return obj == null ? void 0 : obj[key]; + }; + }; + + // Helper for collection methods to determine whether a collection + // should be iterated as an array or as an object + // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength + // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094 + var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; + var getLength = property('length'); + var isArrayLike = function(collection) { + var length = getLength(collection); + return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX; + }; + + // Collection Functions + // -------------------- + + // The cornerstone, an `each` implementation, aka `forEach`. + // Handles raw objects in addition to array-likes. Treats all + // sparse array-likes as if they were dense. + _.each = _.forEach = function(obj, iteratee, context) { + iteratee = optimizeCb(iteratee, context); + var i, length; + if (isArrayLike(obj)) { + for (i = 0, length = obj.length; i < length; i++) { + iteratee(obj[i], i, obj); + } + } else { + var keys = _.keys(obj); + for (i = 0, length = keys.length; i < length; i++) { + iteratee(obj[keys[i]], keys[i], obj); + } + } + return obj; + }; + + // Return the results of applying the iteratee to each element. + _.map = _.collect = function(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length, + results = Array(length); + for (var index = 0; index < length; index++) { + var currentKey = keys ? keys[index] : index; + results[index] = iteratee(obj[currentKey], currentKey, obj); + } + return results; + }; + + // Create a reducing function iterating left or right. + function createReduce(dir) { + // Optimized iterator function as using arguments.length + // in the main function will deoptimize the, see #1991. + function iterator(obj, iteratee, memo, keys, index, length) { + for (; index >= 0 && index < length; index += dir) { + var currentKey = keys ? keys[index] : index; + memo = iteratee(memo, obj[currentKey], currentKey, obj); + } + return memo; + } + + return function(obj, iteratee, memo, context) { + iteratee = optimizeCb(iteratee, context, 4); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length, + index = dir > 0 ? 0 : length - 1; + // Determine the initial value if none is provided. + if (arguments.length < 3) { + memo = obj[keys ? keys[index] : index]; + index += dir; + } + return iterator(obj, iteratee, memo, keys, index, length); + }; + } + + // **Reduce** builds up a single result from a list of values, aka `inject`, + // or `foldl`. + _.reduce = _.foldl = _.inject = createReduce(1); + + // The right-associative version of reduce, also known as `foldr`. + _.reduceRight = _.foldr = createReduce(-1); + + // Return the first value which passes a truth test. Aliased as `detect`. + _.find = _.detect = function(obj, predicate, context) { + var key; + if (isArrayLike(obj)) { + key = _.findIndex(obj, predicate, context); + } else { + key = _.findKey(obj, predicate, context); + } + if (key !== void 0 && key !== -1) return obj[key]; + }; + + // Return all the elements that pass a truth test. + // Aliased as `select`. + _.filter = _.select = function(obj, predicate, context) { + var results = []; + predicate = cb(predicate, context); + _.each(obj, function(value, index, list) { + if (predicate(value, index, list)) results.push(value); + }); + return results; + }; + + // Return all the elements for which a truth test fails. + _.reject = function(obj, predicate, context) { + return _.filter(obj, _.negate(cb(predicate)), context); + }; + + // Determine whether all of the elements match a truth test. + // Aliased as `all`. + _.every = _.all = function(obj, predicate, context) { + predicate = cb(predicate, context); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = keys ? keys[index] : index; + if (!predicate(obj[currentKey], currentKey, obj)) return false; + } + return true; + }; + + // Determine if at least one element in the object matches a truth test. + // Aliased as `any`. + _.some = _.any = function(obj, predicate, context) { + predicate = cb(predicate, context); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = keys ? keys[index] : index; + if (predicate(obj[currentKey], currentKey, obj)) return true; + } + return false; + }; + + // Determine if the array or object contains a given item (using `===`). + // Aliased as `includes` and `include`. + _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) { + if (!isArrayLike(obj)) obj = _.values(obj); + if (typeof fromIndex != 'number' || guard) fromIndex = 0; + return _.indexOf(obj, item, fromIndex) >= 0; + }; + + // Invoke a method (with arguments) on every item in a collection. + _.invoke = function(obj, method) { + var args = slice.call(arguments, 2); + var isFunc = _.isFunction(method); + return _.map(obj, function(value) { + var func = isFunc ? method : value[method]; + return func == null ? func : func.apply(value, args); + }); + }; + + // Convenience version of a common use case of `map`: fetching a property. + _.pluck = function(obj, key) { + return _.map(obj, _.property(key)); + }; + + // Convenience version of a common use case of `filter`: selecting only objects + // containing specific `key:value` pairs. + _.where = function(obj, attrs) { + return _.filter(obj, _.matcher(attrs)); + }; + + // Convenience version of a common use case of `find`: getting the first object + // containing specific `key:value` pairs. + _.findWhere = function(obj, attrs) { + return _.find(obj, _.matcher(attrs)); + }; + + // Return the maximum element (or element-based computation). + _.max = function(obj, iteratee, context) { + var result = -Infinity, lastComputed = -Infinity, + value, computed; + if (iteratee == null && obj != null) { + obj = isArrayLike(obj) ? obj : _.values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value > result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + _.each(obj, function(value, index, list) { + computed = iteratee(value, index, list); + if (computed > lastComputed || computed === -Infinity && result === -Infinity) { + result = value; + lastComputed = computed; + } + }); + } + return result; + }; + + // Return the minimum element (or element-based computation). + _.min = function(obj, iteratee, context) { + var result = Infinity, lastComputed = Infinity, + value, computed; + if (iteratee == null && obj != null) { + obj = isArrayLike(obj) ? obj : _.values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value < result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + _.each(obj, function(value, index, list) { + computed = iteratee(value, index, list); + if (computed < lastComputed || computed === Infinity && result === Infinity) { + result = value; + lastComputed = computed; + } + }); + } + return result; + }; + + // Shuffle a collection, using the modern version of the + // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle). + _.shuffle = function(obj) { + var set = isArrayLike(obj) ? obj : _.values(obj); + var length = set.length; + var shuffled = Array(length); + for (var index = 0, rand; index < length; index++) { + rand = _.random(0, index); + if (rand !== index) shuffled[index] = shuffled[rand]; + shuffled[rand] = set[index]; + } + return shuffled; + }; + + // Sample **n** random values from a collection. + // If **n** is not specified, returns a single random element. + // The internal `guard` argument allows it to work with `map`. + _.sample = function(obj, n, guard) { + if (n == null || guard) { + if (!isArrayLike(obj)) obj = _.values(obj); + return obj[_.random(obj.length - 1)]; + } + return _.shuffle(obj).slice(0, Math.max(0, n)); + }; + + // Sort the object's values by a criterion produced by an iteratee. + _.sortBy = function(obj, iteratee, context) { + iteratee = cb(iteratee, context); + return _.pluck(_.map(obj, function(value, index, list) { + return { + value: value, + index: index, + criteria: iteratee(value, index, list) + }; + }).sort(function(left, right) { + var a = left.criteria; + var b = right.criteria; + if (a !== b) { + if (a > b || a === void 0) return 1; + if (a < b || b === void 0) return -1; + } + return left.index - right.index; + }), 'value'); + }; + + // An internal function used for aggregate "group by" operations. + var group = function(behavior) { + return function(obj, iteratee, context) { + var result = {}; + iteratee = cb(iteratee, context); + _.each(obj, function(value, index) { + var key = iteratee(value, index, obj); + behavior(result, value, key); + }); + return result; + }; + }; + + // Groups the object's values by a criterion. Pass either a string attribute + // to group by, or a function that returns the criterion. + _.groupBy = group(function(result, value, key) { + if (_.has(result, key)) result[key].push(value); else result[key] = [value]; + }); + + // Indexes the object's values by a criterion, similar to `groupBy`, but for + // when you know that your index values will be unique. + _.indexBy = group(function(result, value, key) { + result[key] = value; + }); + + // Counts instances of an object that group by a certain criterion. Pass + // either a string attribute to count by, or a function that returns the + // criterion. + _.countBy = group(function(result, value, key) { + if (_.has(result, key)) result[key]++; else result[key] = 1; + }); + + // Safely create a real, live array from anything iterable. + _.toArray = function(obj) { + if (!obj) return []; + if (_.isArray(obj)) return slice.call(obj); + if (isArrayLike(obj)) return _.map(obj, _.identity); + return _.values(obj); + }; + + // Return the number of elements in an object. + _.size = function(obj) { + if (obj == null) return 0; + return isArrayLike(obj) ? obj.length : _.keys(obj).length; + }; + + // Split a collection into two arrays: one whose elements all satisfy the given + // predicate, and one whose elements all do not satisfy the predicate. + _.partition = function(obj, predicate, context) { + predicate = cb(predicate, context); + var pass = [], fail = []; + _.each(obj, function(value, key, obj) { + (predicate(value, key, obj) ? pass : fail).push(value); + }); + return [pass, fail]; + }; + + // Array Functions + // --------------- + + // Get the first element of an array. Passing **n** will return the first N + // values in the array. Aliased as `head` and `take`. The **guard** check + // allows it to work with `_.map`. + _.first = _.head = _.take = function(array, n, guard) { + if (array == null) return void 0; + if (n == null || guard) return array[0]; + return _.initial(array, array.length - n); + }; + + // Returns everything but the last entry of the array. Especially useful on + // the arguments object. Passing **n** will return all the values in + // the array, excluding the last N. + _.initial = function(array, n, guard) { + return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n))); + }; + + // Get the last element of an array. Passing **n** will return the last N + // values in the array. + _.last = function(array, n, guard) { + if (array == null) return void 0; + if (n == null || guard) return array[array.length - 1]; + return _.rest(array, Math.max(0, array.length - n)); + }; + + // Returns everything but the first entry of the array. Aliased as `tail` and `drop`. + // Especially useful on the arguments object. Passing an **n** will return + // the rest N values in the array. + _.rest = _.tail = _.drop = function(array, n, guard) { + return slice.call(array, n == null || guard ? 1 : n); + }; + + // Trim out all falsy values from an array. + _.compact = function(array) { + return _.filter(array, _.identity); + }; + + // Internal implementation of a recursive `flatten` function. + var flatten = function(input, shallow, strict, startIndex) { + var output = [], idx = 0; + for (var i = startIndex || 0, length = getLength(input); i < length; i++) { + var value = input[i]; + if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) { + //flatten current level of array or arguments object + if (!shallow) value = flatten(value, shallow, strict); + var j = 0, len = value.length; + output.length += len; + while (j < len) { + output[idx++] = value[j++]; + } + } else if (!strict) { + output[idx++] = value; + } + } + return output; + }; + + // Flatten out an array, either recursively (by default), or just one level. + _.flatten = function(array, shallow) { + return flatten(array, shallow, false); + }; + + // Return a version of the array that does not contain the specified value(s). + _.without = function(array) { + return _.difference(array, slice.call(arguments, 1)); + }; + + // Produce a duplicate-free version of the array. If the array has already + // been sorted, you have the option of using a faster algorithm. + // Aliased as `unique`. + _.uniq = _.unique = function(array, isSorted, iteratee, context) { + if (!_.isBoolean(isSorted)) { + context = iteratee; + iteratee = isSorted; + isSorted = false; + } + if (iteratee != null) iteratee = cb(iteratee, context); + var result = []; + var seen = []; + for (var i = 0, length = getLength(array); i < length; i++) { + var value = array[i], + computed = iteratee ? iteratee(value, i, array) : value; + if (isSorted) { + if (!i || seen !== computed) result.push(value); + seen = computed; + } else if (iteratee) { + if (!_.contains(seen, computed)) { + seen.push(computed); + result.push(value); + } + } else if (!_.contains(result, value)) { + result.push(value); + } + } + return result; + }; + + // Produce an array that contains the union: each distinct element from all of + // the passed-in arrays. + _.union = function() { + return _.uniq(flatten(arguments, true, true)); + }; + + // Produce an array that contains every item shared between all the + // passed-in arrays. + _.intersection = function(array) { + var result = []; + var argsLength = arguments.length; + for (var i = 0, length = getLength(array); i < length; i++) { + var item = array[i]; + if (_.contains(result, item)) continue; + for (var j = 1; j < argsLength; j++) { + if (!_.contains(arguments[j], item)) break; + } + if (j === argsLength) result.push(item); + } + return result; + }; + + // Take the difference between one array and a number of other arrays. + // Only the elements present in just the first array will remain. + _.difference = function(array) { + var rest = flatten(arguments, true, true, 1); + return _.filter(array, function(value){ + return !_.contains(rest, value); + }); + }; + + // Zip together multiple lists into a single array -- elements that share + // an index go together. + _.zip = function() { + return _.unzip(arguments); + }; + + // Complement of _.zip. Unzip accepts an array of arrays and groups + // each array's elements on shared indices + _.unzip = function(array) { + var length = array && _.max(array, getLength).length || 0; + var result = Array(length); + + for (var index = 0; index < length; index++) { + result[index] = _.pluck(array, index); + } + return result; + }; + + // Converts lists into objects. Pass either a single array of `[key, value]` + // pairs, or two parallel arrays of the same length -- one of keys, and one of + // the corresponding values. + _.object = function(list, values) { + var result = {}; + for (var i = 0, length = getLength(list); i < length; i++) { + if (values) { + result[list[i]] = values[i]; + } else { + result[list[i][0]] = list[i][1]; + } + } + return result; + }; + + // Generator function to create the findIndex and findLastIndex functions + function createPredicateIndexFinder(dir) { + return function(array, predicate, context) { + predicate = cb(predicate, context); + var length = getLength(array); + var index = dir > 0 ? 0 : length - 1; + for (; index >= 0 && index < length; index += dir) { + if (predicate(array[index], index, array)) return index; + } + return -1; + }; + } + + // Returns the first index on an array-like that passes a predicate test + _.findIndex = createPredicateIndexFinder(1); + _.findLastIndex = createPredicateIndexFinder(-1); + + // Use a comparator function to figure out the smallest index at which + // an object should be inserted so as to maintain order. Uses binary search. + _.sortedIndex = function(array, obj, iteratee, context) { + iteratee = cb(iteratee, context, 1); + var value = iteratee(obj); + var low = 0, high = getLength(array); + while (low < high) { + var mid = Math.floor((low + high) / 2); + if (iteratee(array[mid]) < value) low = mid + 1; else high = mid; + } + return low; + }; + + // Generator function to create the indexOf and lastIndexOf functions + function createIndexFinder(dir, predicateFind, sortedIndex) { + return function(array, item, idx) { + var i = 0, length = getLength(array); + if (typeof idx == 'number') { + if (dir > 0) { + i = idx >= 0 ? idx : Math.max(idx + length, i); + } else { + length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1; + } + } else if (sortedIndex && idx && length) { + idx = sortedIndex(array, item); + return array[idx] === item ? idx : -1; + } + if (item !== item) { + idx = predicateFind(slice.call(array, i, length), _.isNaN); + return idx >= 0 ? idx + i : -1; + } + for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) { + if (array[idx] === item) return idx; + } + return -1; + }; + } + + // Return the position of the first occurrence of an item in an array, + // or -1 if the item is not included in the array. + // If the array is large and already in sort order, pass `true` + // for **isSorted** to use binary search. + _.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex); + _.lastIndexOf = createIndexFinder(-1, _.findLastIndex); + + // Generate an integer Array containing an arithmetic progression. A port of + // the native Python `range()` function. See + // [the Python documentation](http://docs.python.org/library/functions.html#range). + _.range = function(start, stop, step) { + if (stop == null) { + stop = start || 0; + start = 0; + } + step = step || 1; + + var length = Math.max(Math.ceil((stop - start) / step), 0); + var range = Array(length); + + for (var idx = 0; idx < length; idx++, start += step) { + range[idx] = start; + } + + return range; + }; + + // Function (ahem) Functions + // ------------------ + + // Determines whether to execute a function as a constructor + // or a normal function with the provided arguments + var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) { + if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args); + var self = baseCreate(sourceFunc.prototype); + var result = sourceFunc.apply(self, args); + if (_.isObject(result)) return result; + return self; + }; + + // Create a function bound to a given object (assigning `this`, and arguments, + // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if + // available. + _.bind = function(func, context) { + if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1)); + if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function'); + var args = slice.call(arguments, 2); + var bound = function() { + return executeBound(func, bound, context, this, args.concat(slice.call(arguments))); + }; + return bound; + }; + + // Partially apply a function by creating a version that has had some of its + // arguments pre-filled, without changing its dynamic `this` context. _ acts + // as a placeholder, allowing any combination of arguments to be pre-filled. + _.partial = function(func) { + var boundArgs = slice.call(arguments, 1); + var bound = function() { + var position = 0, length = boundArgs.length; + var args = Array(length); + for (var i = 0; i < length; i++) { + args[i] = boundArgs[i] === _ ? arguments[position++] : boundArgs[i]; + } + while (position < arguments.length) args.push(arguments[position++]); + return executeBound(func, bound, this, this, args); + }; + return bound; + }; + + // Bind a number of an object's methods to that object. Remaining arguments + // are the method names to be bound. Useful for ensuring that all callbacks + // defined on an object belong to it. + _.bindAll = function(obj) { + var i, length = arguments.length, key; + if (length <= 1) throw new Error('bindAll must be passed function names'); + for (i = 1; i < length; i++) { + key = arguments[i]; + obj[key] = _.bind(obj[key], obj); + } + return obj; + }; + + // Memoize an expensive function by storing its results. + _.memoize = function(func, hasher) { + var memoize = function(key) { + var cache = memoize.cache; + var address = '' + (hasher ? hasher.apply(this, arguments) : key); + if (!_.has(cache, address)) cache[address] = func.apply(this, arguments); + return cache[address]; + }; + memoize.cache = {}; + return memoize; + }; + + // Delays a function for the given number of milliseconds, and then calls + // it with the arguments supplied. + _.delay = function(func, wait) { + var args = slice.call(arguments, 2); + return setTimeout(function(){ + return func.apply(null, args); + }, wait); + }; + + // Defers a function, scheduling it to run after the current call stack has + // cleared. + _.defer = _.partial(_.delay, _, 1); + + // Returns a function, that, when invoked, will only be triggered at most once + // during a given window of time. Normally, the throttled function will run + // as much as it can, without ever going more than once per `wait` duration; + // but if you'd like to disable the execution on the leading edge, pass + // `{leading: false}`. To disable execution on the trailing edge, ditto. + _.throttle = function(func, wait, options) { + var context, args, result; + var timeout = null; + var previous = 0; + if (!options) options = {}; + var later = function() { + previous = options.leading === false ? 0 : _.now(); + timeout = null; + result = func.apply(context, args); + if (!timeout) context = args = null; + }; + return function() { + var now = _.now(); + if (!previous && options.leading === false) previous = now; + var remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + previous = now; + result = func.apply(context, args); + if (!timeout) context = args = null; + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; + }; + + // Returns a function, that, as long as it continues to be invoked, will not + // be triggered. The function will be called after it stops being called for + // N milliseconds. If `immediate` is passed, trigger the function on the + // leading edge, instead of the trailing. + _.debounce = function(func, wait, immediate) { + var timeout, args, context, timestamp, result; + + var later = function() { + var last = _.now() - timestamp; + + if (last < wait && last >= 0) { + timeout = setTimeout(later, wait - last); + } else { + timeout = null; + if (!immediate) { + result = func.apply(context, args); + if (!timeout) context = args = null; + } + } + }; + + return function() { + context = this; + args = arguments; + timestamp = _.now(); + var callNow = immediate && !timeout; + if (!timeout) timeout = setTimeout(later, wait); + if (callNow) { + result = func.apply(context, args); + context = args = null; + } + + return result; + }; + }; + + // Returns the first function passed as an argument to the second, + // allowing you to adjust arguments, run code before and after, and + // conditionally execute the original function. + _.wrap = function(func, wrapper) { + return _.partial(wrapper, func); + }; + + // Returns a negated version of the passed-in predicate. + _.negate = function(predicate) { + return function() { + return !predicate.apply(this, arguments); + }; + }; + + // Returns a function that is the composition of a list of functions, each + // consuming the return value of the function that follows. + _.compose = function() { + var args = arguments; + var start = args.length - 1; + return function() { + var i = start; + var result = args[start].apply(this, arguments); + while (i--) result = args[i].call(this, result); + return result; + }; + }; + + // Returns a function that will only be executed on and after the Nth call. + _.after = function(times, func) { + return function() { + if (--times < 1) { + return func.apply(this, arguments); + } + }; + }; + + // Returns a function that will only be executed up to (but not including) the Nth call. + _.before = function(times, func) { + var memo; + return function() { + if (--times > 0) { + memo = func.apply(this, arguments); + } + if (times <= 1) func = null; + return memo; + }; + }; + + // Returns a function that will be executed at most one time, no matter how + // often you call it. Useful for lazy initialization. + _.once = _.partial(_.before, 2); + + // Object Functions + // ---------------- + + // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed. + var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString'); + var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString', + 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; + + function collectNonEnumProps(obj, keys) { + var nonEnumIdx = nonEnumerableProps.length; + var constructor = obj.constructor; + var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto; + + // Constructor is a special case. + var prop = 'constructor'; + if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop); + + while (nonEnumIdx--) { + prop = nonEnumerableProps[nonEnumIdx]; + if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) { + keys.push(prop); + } + } + } + + // Retrieve the names of an object's own properties. + // Delegates to **ECMAScript 5**'s native `Object.keys` + _.keys = function(obj) { + if (!_.isObject(obj)) return []; + if (nativeKeys) return nativeKeys(obj); + var keys = []; + for (var key in obj) if (_.has(obj, key)) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; + }; + + // Retrieve all the property names of an object. + _.allKeys = function(obj) { + if (!_.isObject(obj)) return []; + var keys = []; + for (var key in obj) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; + }; + + // Retrieve the values of an object's properties. + _.values = function(obj) { + var keys = _.keys(obj); + var length = keys.length; + var values = Array(length); + for (var i = 0; i < length; i++) { + values[i] = obj[keys[i]]; + } + return values; + }; + + // Returns the results of applying the iteratee to each element of the object + // In contrast to _.map it returns an object + _.mapObject = function(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var keys = _.keys(obj), + length = keys.length, + results = {}, + currentKey; + for (var index = 0; index < length; index++) { + currentKey = keys[index]; + results[currentKey] = iteratee(obj[currentKey], currentKey, obj); + } + return results; + }; + + // Convert an object into a list of `[key, value]` pairs. + _.pairs = function(obj) { + var keys = _.keys(obj); + var length = keys.length; + var pairs = Array(length); + for (var i = 0; i < length; i++) { + pairs[i] = [keys[i], obj[keys[i]]]; + } + return pairs; + }; + + // Invert the keys and values of an object. The values must be serializable. + _.invert = function(obj) { + var result = {}; + var keys = _.keys(obj); + for (var i = 0, length = keys.length; i < length; i++) { + result[obj[keys[i]]] = keys[i]; + } + return result; + }; + + // Return a sorted list of the function names available on the object. + // Aliased as `methods` + _.functions = _.methods = function(obj) { + var names = []; + for (var key in obj) { + if (_.isFunction(obj[key])) names.push(key); + } + return names.sort(); + }; + + // Extend a given object with all the properties in passed-in object(s). + _.extend = createAssigner(_.allKeys); + + // Assigns a given object with all the own properties in the passed-in object(s) + // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) + _.extendOwn = _.assign = createAssigner(_.keys); + + // Returns the first key on an object that passes a predicate test + _.findKey = function(obj, predicate, context) { + predicate = cb(predicate, context); + var keys = _.keys(obj), key; + for (var i = 0, length = keys.length; i < length; i++) { + key = keys[i]; + if (predicate(obj[key], key, obj)) return key; + } + }; + + // Return a copy of the object only containing the whitelisted properties. + _.pick = function(object, oiteratee, context) { + var result = {}, obj = object, iteratee, keys; + if (obj == null) return result; + if (_.isFunction(oiteratee)) { + keys = _.allKeys(obj); + iteratee = optimizeCb(oiteratee, context); + } else { + keys = flatten(arguments, false, false, 1); + iteratee = function(value, key, obj) { return key in obj; }; + obj = Object(obj); + } + for (var i = 0, length = keys.length; i < length; i++) { + var key = keys[i]; + var value = obj[key]; + if (iteratee(value, key, obj)) result[key] = value; + } + return result; + }; + + // Return a copy of the object without the blacklisted properties. + _.omit = function(obj, iteratee, context) { + if (_.isFunction(iteratee)) { + iteratee = _.negate(iteratee); + } else { + var keys = _.map(flatten(arguments, false, false, 1), String); + iteratee = function(value, key) { + return !_.contains(keys, key); + }; + } + return _.pick(obj, iteratee, context); + }; + + // Fill in a given object with default properties. + _.defaults = createAssigner(_.allKeys, true); + + // Creates an object that inherits from the given prototype object. + // If additional properties are provided then they will be added to the + // created object. + _.create = function(prototype, props) { + var result = baseCreate(prototype); + if (props) _.extendOwn(result, props); + return result; + }; + + // Create a (shallow-cloned) duplicate of an object. + _.clone = function(obj) { + if (!_.isObject(obj)) return obj; + return _.isArray(obj) ? obj.slice() : _.extend({}, obj); + }; + + // Invokes interceptor with the obj, and then returns obj. + // The primary purpose of this method is to "tap into" a method chain, in + // order to perform operations on intermediate results within the chain. + _.tap = function(obj, interceptor) { + interceptor(obj); + return obj; + }; + + // Returns whether an object has a given set of `key:value` pairs. + _.isMatch = function(object, attrs) { + var keys = _.keys(attrs), length = keys.length; + if (object == null) return !length; + var obj = Object(object); + for (var i = 0; i < length; i++) { + var key = keys[i]; + if (attrs[key] !== obj[key] || !(key in obj)) return false; + } + return true; + }; + + + // Internal recursive comparison function for `isEqual`. + var eq = function(a, b, aStack, bStack) { + // Identical objects are equal. `0 === -0`, but they aren't identical. + // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal). + if (a === b) return a !== 0 || 1 / a === 1 / b; + // A strict comparison is necessary because `null == undefined`. + if (a == null || b == null) return a === b; + // Unwrap any wrapped objects. + if (a instanceof _) a = a._wrapped; + if (b instanceof _) b = b._wrapped; + // Compare `[[Class]]` names. + var className = toString.call(a); + if (className !== toString.call(b)) return false; + switch (className) { + // Strings, numbers, regular expressions, dates, and booleans are compared by value. + case '[object RegExp]': + // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i') + case '[object String]': + // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is + // equivalent to `new String("5")`. + return '' + a === '' + b; + case '[object Number]': + // `NaN`s are equivalent, but non-reflexive. + // Object(NaN) is equivalent to NaN + if (+a !== +a) return +b !== +b; + // An `egal` comparison is performed for other numeric values. + return +a === 0 ? 1 / +a === 1 / b : +a === +b; + case '[object Date]': + case '[object Boolean]': + // Coerce dates and booleans to numeric primitive values. Dates are compared by their + // millisecond representations. Note that invalid dates with millisecond representations + // of `NaN` are not equivalent. + return +a === +b; + } + + var areArrays = className === '[object Array]'; + if (!areArrays) { + if (typeof a != 'object' || typeof b != 'object') return false; + + // Objects with different constructors are not equivalent, but `Object`s or `Array`s + // from different frames are. + var aCtor = a.constructor, bCtor = b.constructor; + if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor && + _.isFunction(bCtor) && bCtor instanceof bCtor) + && ('constructor' in a && 'constructor' in b)) { + return false; + } + } + // Assume equality for cyclic structures. The algorithm for detecting cyclic + // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. + + // Initializing stack of traversed objects. + // It's done here since we only need them for objects and arrays comparison. + aStack = aStack || []; + bStack = bStack || []; + var length = aStack.length; + while (length--) { + // Linear search. Performance is inversely proportional to the number of + // unique nested structures. + if (aStack[length] === a) return bStack[length] === b; + } + + // Add the first object to the stack of traversed objects. + aStack.push(a); + bStack.push(b); + + // Recursively compare objects and arrays. + if (areArrays) { + // Compare array lengths to determine if a deep comparison is necessary. + length = a.length; + if (length !== b.length) return false; + // Deep compare the contents, ignoring non-numeric properties. + while (length--) { + if (!eq(a[length], b[length], aStack, bStack)) return false; + } + } else { + // Deep compare objects. + var keys = _.keys(a), key; + length = keys.length; + // Ensure that both objects contain the same number of properties before comparing deep equality. + if (_.keys(b).length !== length) return false; + while (length--) { + // Deep compare each member + key = keys[length]; + if (!(_.has(b, key) && eq(a[key], b[key], aStack, bStack))) return false; + } + } + // Remove the first object from the stack of traversed objects. + aStack.pop(); + bStack.pop(); + return true; + }; + + // Perform a deep comparison to check if two objects are equal. + _.isEqual = function(a, b) { + return eq(a, b); + }; + + // Is a given array, string, or object empty? + // An "empty" object has no enumerable own-properties. + _.isEmpty = function(obj) { + if (obj == null) return true; + if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0; + return _.keys(obj).length === 0; + }; + + // Is a given value a DOM element? + _.isElement = function(obj) { + return !!(obj && obj.nodeType === 1); + }; + + // Is a given value an array? + // Delegates to ECMA5's native Array.isArray + _.isArray = nativeIsArray || function(obj) { + return toString.call(obj) === '[object Array]'; + }; + + // Is a given variable an object? + _.isObject = function(obj) { + var type = typeof obj; + return type === 'function' || type === 'object' && !!obj; + }; + + // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError. + _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) { + _['is' + name] = function(obj) { + return toString.call(obj) === '[object ' + name + ']'; + }; + }); + + // Define a fallback version of the method in browsers (ahem, IE < 9), where + // there isn't any inspectable "Arguments" type. + if (!_.isArguments(arguments)) { + _.isArguments = function(obj) { + return _.has(obj, 'callee'); + }; + } + + // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8, + // IE 11 (#1621), and in Safari 8 (#1929). + if (typeof /./ != 'function' && typeof Int8Array != 'object') { + _.isFunction = function(obj) { + return typeof obj == 'function' || false; + }; + } + + // Is a given object a finite number? + _.isFinite = function(obj) { + return isFinite(obj) && !isNaN(parseFloat(obj)); + }; + + // Is the given value `NaN`? (NaN is the only number which does not equal itself). + _.isNaN = function(obj) { + return _.isNumber(obj) && obj !== +obj; + }; + + // Is a given value a boolean? + _.isBoolean = function(obj) { + return obj === true || obj === false || toString.call(obj) === '[object Boolean]'; + }; + + // Is a given value equal to null? + _.isNull = function(obj) { + return obj === null; + }; + + // Is a given variable undefined? + _.isUndefined = function(obj) { + return obj === void 0; + }; + + // Shortcut function for checking if an object has a given property directly + // on itself (in other words, not on a prototype). + _.has = function(obj, key) { + return obj != null && hasOwnProperty.call(obj, key); + }; + + // Utility Functions + // ----------------- + + // Run Underscore.js in *noConflict* mode, returning the `_` variable to its + // previous owner. Returns a reference to the Underscore object. + _.noConflict = function() { + root._ = previousUnderscore; + return this; + }; + + // Keep the identity function around for default iteratees. + _.identity = function(value) { + return value; + }; + + // Predicate-generating functions. Often useful outside of Underscore. + _.constant = function(value) { + return function() { + return value; + }; + }; + + _.noop = function(){}; + + _.property = property; + + // Generates a function for a given object that returns a given property. + _.propertyOf = function(obj) { + return obj == null ? function(){} : function(key) { + return obj[key]; + }; + }; + + // Returns a predicate for checking whether an object has a given set of + // `key:value` pairs. + _.matcher = _.matches = function(attrs) { + attrs = _.extendOwn({}, attrs); + return function(obj) { + return _.isMatch(obj, attrs); + }; + }; + + // Run a function **n** times. + _.times = function(n, iteratee, context) { + var accum = Array(Math.max(0, n)); + iteratee = optimizeCb(iteratee, context, 1); + for (var i = 0; i < n; i++) accum[i] = iteratee(i); + return accum; + }; + + // Return a random integer between min and max (inclusive). + _.random = function(min, max) { + if (max == null) { + max = min; + min = 0; + } + return min + Math.floor(Math.random() * (max - min + 1)); + }; + + // A (possibly faster) way to get the current timestamp as an integer. + _.now = Date.now || function() { + return new Date().getTime(); + }; + + // List of HTML entities for escaping. + var escapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`' + }; + var unescapeMap = _.invert(escapeMap); + + // Functions for escaping and unescaping strings to/from HTML interpolation. + var createEscaper = function(map) { + var escaper = function(match) { + return map[match]; + }; + // Regexes for identifying a key that needs to be escaped + var source = '(?:' + _.keys(map).join('|') + ')'; + var testRegexp = RegExp(source); + var replaceRegexp = RegExp(source, 'g'); + return function(string) { + string = string == null ? '' : '' + string; + return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string; + }; + }; + _.escape = createEscaper(escapeMap); + _.unescape = createEscaper(unescapeMap); + + // If the value of the named `property` is a function then invoke it with the + // `object` as context; otherwise, return it. + _.result = function(object, property, fallback) { + var value = object == null ? void 0 : object[property]; + if (value === void 0) { + value = fallback; + } + return _.isFunction(value) ? value.call(object) : value; + }; + + // Generate a unique integer id (unique within the entire client session). + // Useful for temporary DOM ids. + var idCounter = 0; + _.uniqueId = function(prefix) { + var id = ++idCounter + ''; + return prefix ? prefix + id : id; + }; + + // By default, Underscore uses ERB-style template delimiters, change the + // following template settings to use alternative delimiters. + _.templateSettings = { + evaluate : /<%([\s\S]+?)%>/g, + interpolate : /<%=([\s\S]+?)%>/g, + escape : /<%-([\s\S]+?)%>/g + }; + + // When customizing `templateSettings`, if you don't want to define an + // interpolation, evaluation or escaping regex, we need one that is + // guaranteed not to match. + var noMatch = /(.)^/; + + // Certain characters need to be escaped so that they can be put into a + // string literal. + var escapes = { + "'": "'", + '\\': '\\', + '\r': 'r', + '\n': 'n', + '\u2028': 'u2028', + '\u2029': 'u2029' + }; + + var escaper = /\\|'|\r|\n|\u2028|\u2029/g; + + var escapeChar = function(match) { + return '\\' + escapes[match]; + }; + + // JavaScript micro-templating, similar to John Resig's implementation. + // Underscore templating handles arbitrary delimiters, preserves whitespace, + // and correctly escapes quotes within interpolated code. + // NB: `oldSettings` only exists for backwards compatibility. + _.template = function(text, settings, oldSettings) { + if (!settings && oldSettings) settings = oldSettings; + settings = _.defaults({}, settings, _.templateSettings); + + // Combine delimiters into one regular expression via alternation. + var matcher = RegExp([ + (settings.escape || noMatch).source, + (settings.interpolate || noMatch).source, + (settings.evaluate || noMatch).source + ].join('|') + '|$', 'g'); + + // Compile the template source, escaping string literals appropriately. + var index = 0; + var source = "__p+='"; + text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { + source += text.slice(index, offset).replace(escaper, escapeChar); + index = offset + match.length; + + if (escape) { + source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; + } else if (interpolate) { + source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; + } else if (evaluate) { + source += "';\n" + evaluate + "\n__p+='"; + } + + // Adobe VMs need the match returned to produce the correct offest. + return match; + }); + source += "';\n"; + + // If a variable is not specified, place data values in local scope. + if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n'; + + source = "var __t,__p='',__j=Array.prototype.join," + + "print=function(){__p+=__j.call(arguments,'');};\n" + + source + 'return __p;\n'; + + try { + var render = new Function(settings.variable || 'obj', '_', source); + } catch (e) { + e.source = source; + throw e; + } + + var template = function(data) { + return render.call(this, data, _); + }; + + // Provide the compiled source as a convenience for precompilation. + var argument = settings.variable || 'obj'; + template.source = 'function(' + argument + '){\n' + source + '}'; + + return template; + }; + + // Add a "chain" function. Start chaining a wrapped Underscore object. + _.chain = function(obj) { + var instance = _(obj); + instance._chain = true; + return instance; + }; + + // OOP + // --------------- + // If Underscore is called as a function, it returns a wrapped object that + // can be used OO-style. This wrapper holds altered versions of all the + // underscore functions. Wrapped objects may be chained. + + // Helper function to continue chaining intermediate results. + var result = function(instance, obj) { + return instance._chain ? _(obj).chain() : obj; + }; + + // Add your own custom functions to the Underscore object. + _.mixin = function(obj) { + _.each(_.functions(obj), function(name) { + var func = _[name] = obj[name]; + _.prototype[name] = function() { + var args = [this._wrapped]; + push.apply(args, arguments); + return result(this, func.apply(_, args)); + }; + }); + }; + + // Add all of the Underscore functions to the wrapper object. + _.mixin(_); + + // Add all mutator Array functions to the wrapper. + _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { + var method = ArrayProto[name]; + _.prototype[name] = function() { + var obj = this._wrapped; + method.apply(obj, arguments); + if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0]; + return result(this, obj); + }; + }); + + // Add all accessor Array functions to the wrapper. + _.each(['concat', 'join', 'slice'], function(name) { + var method = ArrayProto[name]; + _.prototype[name] = function() { + return result(this, method.apply(this._wrapped, arguments)); + }; + }); + + // Extracts the result from a wrapped and chained object. + _.prototype.value = function() { + return this._wrapped; + }; + + // Provide unwrapping proxy for some methods used in engine operations + // such as arithmetic and JSON stringification. + _.prototype.valueOf = _.prototype.toJSON = _.prototype.value; + + _.prototype.toString = function() { + return '' + this._wrapped; + }; + + // AMD registration happens at the end for compatibility with AMD loaders + // that may not enforce next-turn semantics on modules. Even though general + // practice for AMD registration is to be anonymous, underscore registers + // as a named module because, like jQuery, it is a base library that is + // popular enough to be bundled in a third party lib, but not be part of + // an AMD load request. Those cases could generate an error when an + // anonymous define() is called outside of a loader request. + if (true) { + !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function() { + return _; + }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + } + }.call(this)); + + +/***/ }, +/* 161 */, +/* 162 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, '__esModule', { + value: true + }); + + var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + + var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + + var _react = __webpack_require__(147); + + var _react2 = _interopRequireDefault(_react); + + var _underscore = __webpack_require__(160); + + var _underscore2 = _interopRequireDefault(_underscore); + + var _Icon = __webpack_require__(163); + + var _Icon2 = _interopRequireDefault(_Icon); + + var _InputError = __webpack_require__(164); + + var _InputError2 = _interopRequireDefault(_InputError); + + var _PasswordValidator = __webpack_require__(166); + + var _PasswordValidator2 = _interopRequireDefault(_PasswordValidator); + + var _classnamesBind = __webpack_require__(165); + + var _classnamesBind2 = _interopRequireDefault(_classnamesBind); + + var cx = _classnamesBind2['default'].bind({}); + + var Input = (function (_React$Component) { + _inherits(Input, _React$Component); + + function Input(props) { + var _this = this; + + _classCallCheck(this, Input); + + _get(Object.getPrototypeOf(Input.prototype), 'constructor', this).call(this, props); + + this.handleChange = function (event) { + _this.setState({ + value: event.target.value, + empty: _underscore2['default'].isEmpty(event.target.value) + }); + + if (_this.props.validator) { + _this.checkRules(event.target.value); + }; + + if (_this.props.validate) { + _this.validateInput(event.target.value); + } + + if (_this.props.onChange) { + _this.props.onChange(event); + } + }; + + this.validateInput = function (value) { + // trigger custom validation method in the parent component + if (_this.props.validate && _this.props.validate(value)) { + _this.setState({ + valid: true, + errorVisible: false + }); + } else { + _this.setState({ + valid: false, + errorMessage: !_underscore2['default'].isEmpty(value) ? _this.props.errorMessage : _this.props.emptyMessage + }); + } + }; + + this.componentWillReceiveProps = function (newProps) { + // perform update only when new value exists and not empty + if (newProps.value) { + if (!_underscore2['default'].isUndefined(newProps.value) && newProps.value.length > 0) { + if (_this.props.validate) { + _this.validateInput(newProps.value); + } + _this.setState({ + value: newProps.value, + empty: _underscore2['default'].isEmpty(newProps.value) + }); + } + } + }; + + this.handleFocus = function (event) { + _this.setState({ + focus: true, + validatorVisible: true + }); + + if (_this.props.validator) { + _this.setState({ + errorVisible: false + }); + } + }; + + this.handleBlur = function (event) { + _this.setState({ + focus: false, + errorVisible: !_this.state.valid, + validatorVisible: false + }); + }; + + this.checkRules = function (value) { + var validData = { + minChars: !_underscore2['default'].isEmpty(value) ? value.length >= parseInt(_this.state.minCharacters) : false, + capitalLetters: !_underscore2['default'].isEmpty(value) ? _this.countCapitals(value) : false, + numbers: !_underscore2['default'].isEmpty(value) ? _this.countNumbers(value) > 0 : false, + words: !_underscore2['default'].isEmpty(value) ? !_this.checkWords(value) : false + }; + var allValid = validData.minChars && validData.capitalLetters && validData.numbers && validData.words; + + _this.setState({ + isValidatorValid: validData, + allValidatorValid: allValid, + valid: allValid + }); + }; + + this.countCapitals = function (value) { + return value.replace(/[^A-Z]/g, "").length; + }; + + this.countNumbers = function (value) { + return (/\d/.test(value) + ); + }; + + this.checkWords = function (value) { + return _underscore2['default'].some(_this.state.forbiddenWords, function (word) { + var matched = word === value ? true : ""; + return matched; + }); + }; + + this.state = { + valid: this.props.isValid && this.props.isValid() || true, + empty: _underscore2['default'].isEmpty(this.props.value), + focus: false, + value: null, + iconsVisible: !this.props.validator, + errorMessage: this.props.emptyMessage, + validator: this.props.validator, + validatorVisible: false, + type: this.props.type, + minCharacters: this.props.minCharacters, + requireCapitals: this.props.requireCapitals, + requireNumbers: this.props.requireNumbers, + forbiddenWords: this.props.forbiddenWords, + isValidatorValid: { + minChars: false, + capitalLetters: false, + numbers: false, + words: false, + all: false + }, + allValidatorValid: false + }; + } + + _createClass(Input, [{ + key: 'isValid', + value: function isValid() { + if (this.props.validate) { + if (_underscore2['default'].isEmpty(this.state.value) || !this.props.validate(this.state.value)) { + this.setState({ + valid: false, + errorVisible: true + }); + } + } + + return this.state.valid; + } + }, { + key: 'mouseEnterError', + value: function mouseEnterError() { + this.setState({ + errorVisible: true + }); + } + }, { + key: 'hideError', + value: function hideError() { + this.setState({ + errorVisible: false, + validatorVisible: false + }); + } + + // validator function + }, { + key: 'render', + value: function render() { + + var inputGroupClasses = cx({ + 'input_group': true, + 'input_valid': this.state.valid, + 'input_error': !this.state.valid, + 'input_empty': this.state.empty, + 'input_hasValue': !this.state.empty, + 'input_focused': this.state.focus, + 'input_unfocused': !this.state.focus + }); + + var validator; + + if (this.state.validator) { + validator = _react2['default'].createElement(_PasswordValidator2['default'], { + ref: 'passwordValidator', + visible: this.state.validatorVisible, + name: this.props.text, + value: this.state.value, + validData: this.state.isValidatorValid, + valid: this.state.allValidatorValid, + forbiddenWords: this.state.forbiddenWords, + minCharacters: this.props.minCharacters, + requireCapitals: this.props.requireCapitals, + requireNumbers: this.props.requireNumbers + }); + }; + + return _react2['default'].createElement( + 'div', + { className: inputGroupClasses }, + _react2['default'].createElement( + 'label', + { className: 'input_label', htmlFor: this.props.text }, + _react2['default'].createElement( + 'span', + { className: 'label_text' }, + this.props.text + ) + ), + _react2['default'].createElement('input', _extends({}, this.props, { + placeholder: this.props.placeholder, + className: 'input', + id: this.props.text, + defaultValue: this.props.defaultValue, + value: this.state.value, + onChange: this.handleChange, + onFocus: this.handleFocus, + onBlur: this.handleBlur, + autoComplete: 'off' + })), + _react2['default'].createElement(_InputError2['default'], { + visible: this.state.errorVisible, + errorMessage: this.state.errorMessage + }), + _react2['default'].createElement( + 'div', + { className: 'validationIcons' }, + _react2['default'].createElement( + 'i', + { className: 'input_error_icon', onMouseEnter: this.mouseEnterError }, + ' ', + _react2['default'].createElement(_Icon2['default'], { type: 'circle_error' }), + ' ' + ), + _react2['default'].createElement( + 'i', + { className: 'input_valid_icon' }, + ' ', + _react2['default'].createElement(_Icon2['default'], { type: 'circle_tick' }), + ' ' + ) + ), + validator + ); + } + }]); + + return Input; + })(_react2['default'].Component); + + exports['default'] = Input; + ; + module.exports = exports['default']; + +/***/ }, +/* 163 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, '__esModule', { + value: true + }); + + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + + var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + + var _react = __webpack_require__(147); + + var _react2 = _interopRequireDefault(_react); + + var Icon = (function (_React$Component) { + _inherits(Icon, _React$Component); + + function Icon() { + _classCallCheck(this, Icon); + + _get(Object.getPrototypeOf(Icon.prototype), 'constructor', this).apply(this, arguments); + } + + _createClass(Icon, [{ + key: 'render', + value: function render() { + switch (this.props.type) { + + case 'circle_error': + return _react2['default'].createElement( + 'svg', + { viewBox: '0 0 20 20' }, + _react2['default'].createElement('path', { d: 'M10,0.982c4.973,0,9.018,4.046,9.018,9.018S14.973,19.018,10,19.018S0.982,14.973,0.982,10 S5.027,0.982,10,0.982 M10,0C4.477,0,0,4.477,0,10c0,5.523,4.477,10,10,10s10-4.477,10-10C20,4.477,15.523,0,10,0L10,0z M9,5.703 V5.441h2.5v0.262l-0.66,5.779H9.66L9,5.703z M9.44,12.951h1.621v1.491H9.44V12.951z' }) + ); + + case 'circle_tick': + return _react2['default'].createElement( + 'svg', + { viewBox: '0 0 23 23' }, + _react2['default'].createElement('path', { d: 'M11.5,23C5.2,23,0,17.8,0,11.5S5.2,0,11.5,0S23,5.2,23,11.5S17.8,23,11.5,23z M11.5,1C5.7,1,1,5.7,1,11.5S5.7,22,11.5,22 S22,17.3,22,11.5S17.3,1,11.5,1z M10.4,15.2l6.7-7c0.2-0.2,0.2-0.5,0-0.7c-0.2-0.2-0.5-0.2-0.7,0L10,14.2L7,11 c-0.2-0.2-0.5-0.2-0.7,0c-0.2,0.2-0.2,0.5,0,0.7l3.4,3.5c0.1,0.1,0.2,0.1,0.3,0.1S10.3,15.3,10.4,15.2z' }) + ); + + case 'circle_tick_filled': + return _react2['default'].createElement( + 'svg', + { viewBox: '0 0 20 20' }, + _react2['default'].createElement('path', { fill: '#4FB07F', d: 'M9.5,0C14.7,0,19,4.3,19,9.5S14.7,19,9.5,19S0,14.7,0,9.5S4.3,0,9.5,0z' }), + _react2['default'].createElement('path', { fill: '#FFFFFF', d: 'M8.7,12.9c-0.1,0-0.2,0-0.3-0.1l-2.4-2.5c-0.1-0.1-0.1-0.4,0-0.5c0.1-0.2,0.4-0.2,0.5,0L8.7,12l4.6-5 c0.1-0.1,0.4-0.1,0.5,0c0.1,0.2,0.1,0.4,0,0.5L9,12.8C9,12.8,8.9,12.9,8.7,12.9C8.8,12.9,8.8,12.9,8.7,12.9z' }) + ); + + case 'guthub': + return _react2['default'].createElement( + 'svg', + { viewBox: '0 0 34 34' }, + _react2['default'].createElement('path', { 'fill-rule': 'evenodd', 'clip-rule': 'evenodd', fill: '#191717', d: 'M32.6,16.3c0,7.2-4.7,13.3-11.1,15.5c-0.8,0.2-1.1-0.3-1.1-0.8 c0-0.5,0-2.3,0-4.5c0-1.5-0.5-2.5-1.1-3c3.6-0.4,7.4-1.8,7.4-8c0-1.8-0.6-3.2-1.7-4.4c0.2-0.4,0.7-2.1-0.2-4.3c0,0-1.4-0.4-4.5,1.7 c-1.3-0.4-2.7-0.5-4.1-0.5c-1.4,0-2.8,0.2-4.1,0.5C9.1,6.3,7.7,6.8,7.7,6.8C6.8,9,7.4,10.7,7.6,11.1c-1,1.1-1.7,2.6-1.7,4.4 c0,6.2,3.8,7.6,7.4,8.1c-0.5,0.4-0.9,1.1-1,2.2c-0.9,0.4-3.3,1.1-4.7-1.4c0,0-0.9-1.6-2.5-1.7c0,0-1.6,0-0.1,1c0,0,1.1,0.5,1.8,2.4 c0,0,1,3.2,5.5,2.2c0,1.4,0,2.4,0,2.8c0,0.4-0.3,0.9-1.1,0.8C4.7,29.6,0,23.5,0,16.3C0,7.3,7.3,0,16.3,0C25.3,0,32.6,7.3,32.6,16.3z ' }) + ); + } + } + }]); + + return Icon; + })(_react2['default'].Component); + + exports['default'] = Icon; + module.exports = exports['default']; + +/***/ }, +/* 164 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, '__esModule', { + value: true + }); + + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + + var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + + var _react = __webpack_require__(147); + + var _react2 = _interopRequireDefault(_react); + + var _underscore = __webpack_require__(160); + + var _underscore2 = _interopRequireDefault(_underscore); + + var _classnamesBind = __webpack_require__(165); + + var _classnamesBind2 = _interopRequireDefault(_classnamesBind); + + var cx = _classnamesBind2['default'].bind({}); + + var InputError = (function (_React$Component) { + _inherits(InputError, _React$Component); + + function InputError(props) { + _classCallCheck(this, InputError); + + _get(Object.getPrototypeOf(InputError.prototype), 'constructor', this).call(this, props); + this.state = { + message: 'Input is invalid' + }; + } + + _createClass(InputError, [{ + key: 'render', + value: function render() { + var errorClass = cx({ + 'error_container': true, + 'visible': this.props.visible, + 'invisible': !this.props.visible + }); + + return _react2['default'].createElement( + 'div', + { className: errorClass }, + _react2['default'].createElement( + 'span', + null, + this.props.errorMessage + ) + ); + } + }]); + + return InputError; + })(_react2['default'].Component); + + exports['default'] = InputError; + module.exports = exports['default']; + +/***/ }, +/* 165 */ +/***/ function(module, exports, __webpack_require__) { + + var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! + Copyright (c) 2015 Jed Watson. + Licensed under the MIT License (MIT), see + http://jedwatson.github.io/classnames + */ + /* global define */ + + (function () { + 'use strict'; + + var hasOwn = {}.hasOwnProperty; + + function classNames () { + var classes = ''; + + for (var i = 0; i < arguments.length; i++) { + var arg = arguments[i]; + if (!arg) continue; + + var argType = typeof arg; + + if (argType === 'string' || argType === 'number') { + classes += ' ' + (this && this[arg] || arg); + } else if (Array.isArray(arg)) { + classes += ' ' + classNames.apply(this, arg); + } else if (argType === 'object') { + for (var key in arg) { + if (hasOwn.call(arg, key) && arg[key]) { + classes += ' ' + (this && this[key] || key); + } + } + } + } + + return classes.substr(1); + } + + if (typeof module !== 'undefined' && module.exports) { + module.exports = classNames; + } else if (true) { + // register as 'classnames', consistent with npm package name + !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function () { + return classNames; + }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + } else { + window.classNames = classNames; + } + }()); + + +/***/ }, +/* 166 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, '__esModule', { + value: true + }); + + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + + var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + + var _react = __webpack_require__(147); + + var _react2 = _interopRequireDefault(_react); + + var _underscore = __webpack_require__(160); + + var _underscore2 = _interopRequireDefault(_underscore); + + var _Icon = __webpack_require__(163); + + var _Icon2 = _interopRequireDefault(_Icon); + + var _classnamesBind = __webpack_require__(165); + + var _classnamesBind2 = _interopRequireDefault(_classnamesBind); + + var cx = _classnamesBind2['default'].bind({}); + + var PasswordValidator = (function (_React$Component) { + _inherits(PasswordValidator, _React$Component); + + function PasswordValidator(props) { + _classCallCheck(this, PasswordValidator); + + _get(Object.getPrototypeOf(PasswordValidator.prototype), 'constructor', this).call(this, props); + this.state = { + value: null, + minCharacters: this.props.minCharacters, + requireCapitals: this.props.requireCapitals, + requireNumbers: this.props.requireNumbers, + forbiddenWords: this.props.forbiddenWords, + name: this.props.name + }; + } + + _createClass(PasswordValidator, [{ + key: 'render', + value: function render() { + var validatorClass = cx({ + 'password_validator': true, + 'visible': this.props.visible, + 'invisible': !this.props.visible + }); + + var forbiddenWords = this.state.forbiddenWords.map(function (word, i) { + return _react2['default'].createElement( + 'span', + { key: i, className: 'bad_word' }, + '"', + word, + '"' + ); + }); + + var validatorTitle; + + if (this.props.valid) { + validatorTitle = _react2['default'].createElement( + 'h4', + { className: 'validator_title valid' }, + this.props.name, + ' IS OK' + ); + } else { + validatorTitle = _react2['default'].createElement( + 'h4', + { className: 'validator_title invalid' }, + this.props.name, + ' RULES' + ); + } + + return _react2['default'].createElement( + 'div', + { className: validatorClass }, + _react2['default'].createElement( + 'div', + { className: 'validator_container' }, + validatorTitle, + _react2['default'].createElement( + 'ul', + { className: 'rules_list' }, + _react2['default'].createElement( + 'li', + { className: cx({ 'valid': this.props.validData.minChars }) }, + _react2['default'].createElement( + 'i', + { className: 'icon_valid' }, + ' ', + _react2['default'].createElement(_Icon2['default'], { type: 'circle_tick_filled' }), + ' ' + ), + _react2['default'].createElement( + 'i', + { className: 'icon_invalid' }, + ' ', + _react2['default'].createElement(_Icon2['default'], { type: 'circle_error' }), + ' ' + ), + _react2['default'].createElement( + 'span', + { className: 'error_message' }, + this.state.minCharacters, + ' characters minimum' + ) + ), + _react2['default'].createElement( + 'li', + { className: cx({ 'valid': this.props.validData.capitalLetters }) }, + _react2['default'].createElement( + 'i', + { className: 'icon_valid' }, + ' ', + _react2['default'].createElement(_Icon2['default'], { type: 'circle_tick_filled' }), + ' ' + ), + _react2['default'].createElement( + 'i', + { className: 'icon_invalid' }, + ' ', + _react2['default'].createElement(_Icon2['default'], { type: 'circle_error' }), + ' ' + ), + _react2['default'].createElement( + 'span', + { className: 'error_message' }, + 'Contains at least ', + this.state.requireCapitals, + ' capital letter' + ) + ), + _react2['default'].createElement( + 'li', + { className: cx({ 'valid': this.props.validData.numbers }) }, + _react2['default'].createElement( + 'i', + { className: 'icon_valid' }, + ' ', + _react2['default'].createElement(_Icon2['default'], { type: 'circle_tick_filled' }), + ' ' + ), + _react2['default'].createElement( + 'i', + { className: 'icon_invalid' }, + ' ', + _react2['default'].createElement(_Icon2['default'], { type: 'circle_error' }), + ' ' + ), + _react2['default'].createElement( + 'span', + { className: 'error_message' }, + 'Contains at least ', + this.state.requireNumbers, + ' number' + ) + ), + _react2['default'].createElement( + 'li', + { className: cx({ 'valid': this.props.validData.words }) }, + _react2['default'].createElement( + 'i', + { className: 'icon_valid' }, + ' ', + _react2['default'].createElement(_Icon2['default'], { type: 'circle_tick_filled' }), + ' ' + ), + _react2['default'].createElement( + 'i', + { className: 'icon_invalid' }, + ' ', + _react2['default'].createElement(_Icon2['default'], { type: 'circle_error' }), + ' ' + ), + _react2['default'].createElement( + 'span', + { className: 'error_message' }, + 'Can\'t be ', + forbiddenWords + ) + ) + ) + ) + ); + } + }]); + + return PasswordValidator; + })(_react2['default'].Component); + + exports['default'] = PasswordValidator; + module.exports = exports['default']; + +/***/ }, +/* 167 */ +/***/ function(module, exports) { + + "use strict"; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.getQueryVariable = getQueryVariable; + + function getQueryVariable(variable) { + var query = window.location.search.substring(1); + var vars = query.split("&"); + for (var i = 0; i < vars.length; i++) { + var pair = vars[i].split("="); + if (pair[0] == variable) { + return pair[1]; + } + } + return '/'; + } + +/***/ }, +/* 168 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, '__esModule', { + value: true + }); + + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + + var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + + function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + + var _react = __webpack_require__(147); + + var _react2 = _interopRequireDefault(_react); + + var _underscore = __webpack_require__(160); + + var _underscore2 = _interopRequireDefault(_underscore); + + var _jquery = __webpack_require__(161); + + var _jquery2 = _interopRequireDefault(_jquery); + + var _componentsInput = __webpack_require__(162); + + var _componentsInput2 = _interopRequireDefault(_componentsInput); + + var _componentsIcon = __webpack_require__(163); + + var _componentsIcon2 = _interopRequireDefault(_componentsIcon); + + var _componentsInputError = __webpack_require__(164); + + var _componentsInputError2 = _interopRequireDefault(_componentsInputError); + + var _componentsUtils = __webpack_require__(167); + + var RegisterComponent = (function (_React$Component) { + _inherits(RegisterComponent, _React$Component); + + function RegisterComponent(props) { + var _this = this; + + _classCallCheck(this, RegisterComponent); + + _get(Object.getPrototypeOf(RegisterComponent.prototype), 'constructor', this).call(this, props); + + this.handlePasswordInput = function (event) { + if (!_underscore2['default'].isEmpty(_this.state.confirmPassword)) { + _this.refs.passwordConfirm.isValid(); + }; + _this.refs.passwordConfirm.hideError(); + _this.setState({ + password: event.target.value + }); + }; + + this.handleConfirmPasswordInput = function (event) { + _this.setState({ + confirmPassword: event.target.value + }); + }; + + this.saveAndContinue = function (event) { + event.preventDefault(); + + var canProceed = _this.validateEmail(_this.state.email) && _this.refs.password.isValid() && _this.refs.passwordConfirm.isValid(); + + if (canProceed) { + (function () { + var data = { + email: _this.state.email, + password: _this.state.password + }, + self = _this, + visible = undefined; + + _jquery2['default'].post('/register/', data).done(function (result) { + var res = JSON.parse(result); + if (res.r) { + self.setState({ + errorVisible: true, + errorMessage: res.message + }); + } else { + var next = decodeURIComponent((0, _componentsUtils.getQueryVariable)('continue')); + window.location = next; + } + }); + })(); + } else { + _this.refs.email.isValid(); + _this.refs.password.isValid(); + _this.refs.passwordConfirm.isValid(); + } + }; + + this.isConfirmedPassword = function (event) { + return event == _this.state.password; + }; + + this.handleEmailInput = function (event) { + _this.setState({ + email: event.target.value + }); + }; + + this.validateEmail = function (event) { + // from http://stackoverflow.com/questions/46155/validate-email-address-in-javascript + var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; + return re.test(event); + }; + + this.isEmpty = function (value) { + return !_underscore2['default'].isEmpty(value); + }; + + this.updateStatesValue = function (value) { + _this.setState({ + statesValue: value + }); + }; + + this.state = { + email: null, + password: null, + confirmPassword: null, + forbiddenWords: ["password", "user", "username"], + errorVisible: false, + errorMessage: '注册失败, 请联系管理员' + }; + } + + _createClass(RegisterComponent, [{ + key: 'render', + value: function render() { + return _react2['default'].createElement( + 'div', + { className: 'create_account_screen' }, + _react2['default'].createElement( + 'div', + { className: 'create_account_form' }, + _react2['default'].createElement( + 'h1', + null, + '创建新用户' + ), + _react2['default'].createElement( + 'p', + null, + '开启CODE之旅.' + ), + _react2['default'].createElement( + 'form', + { onSubmit: this.saveAndContinue }, + _react2['default'].createElement(_componentsInput2['default'], { + text: '邮箱地址', + ref: 'email', + type: 'text', + defaultValue: this.state.email, + validate: this.validateEmail, + value: this.state.email, + onChange: this.handleEmailInput, + errorMessage: 'Email格式错误', + emptyMessage: 'Email不能为空', + errorVisible: this.state.showEmailError + }), + _react2['default'].createElement(_componentsInput2['default'], { + text: '密码', + type: 'password', + ref: 'password', + validator: 'true', + minCharacters: '8', + requireCapitals: '1', + requireNumbers: '1', + forbiddenWords: this.state.forbiddenWords, + value: this.state.passsword, + emptyMessage: '密码输入错误', + onChange: this.handlePasswordInput + }), + _react2['default'].createElement(_componentsInput2['default'], { + text: '确认密码', + ref: 'passwordConfirm', + type: 'password', + validate: this.isConfirmedPassword, + value: this.state.confirmPassword, + onChange: this.handleConfirmPasswordInput, + emptyMessage: '密码为必选', + errorMessage: '2次输入的密码不相同, 请确认' + }), + _react2['default'].createElement(_componentsInputError2['default'], { + visible: this.state.errorVisible, + errorMessage: this.state.errorMessage + }), + _react2['default'].createElement( + 'button', + { + type: 'submit', + className: 'button button_wide' }, + '创建' + ) + ) + ) + ); + } + }]); + + return RegisterComponent; + })(_react2['default'].Component); + + exports.RegisterComponent = RegisterComponent; + + var Register = (function (_React$Component2) { + _inherits(Register, _React$Component2); + + function Register() { + _classCallCheck(this, Register); + + _get(Object.getPrototypeOf(Register.prototype), 'constructor', this).apply(this, arguments); + } + + _createClass(Register, [{ + key: 'render', + value: function render() { + return _react2['default'].createElement( + 'div', + { className: 'application_wrapper' }, + _react2['default'].createElement( + 'div', + { className: 'application_routeHandler' }, + _react2['default'].createElement(RegisterComponent, null) + ) + ); + } + }]); + + return Register; + })(_react2['default'].Component); + + exports['default'] = Register; + +/***/ } +]); +//# sourceMappingURL=register.js.map \ No newline at end of file diff --git a/dist/js/mod/register.js.map b/dist/js/mod/register.js.map new file mode 100644 index 0000000..38e6bcb --- /dev/null +++ b/dist/js/mod/register.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./hub/static/jsx/register.jsx","webpack:///./~/react-dom/index.js?f91c","webpack:///./~/react/lib/ReactDOM.js?b76f","webpack:///(webpack)/~/node-libs-browser/~/process/browser.js?6f0e","webpack:///./~/react/lib/ReactCurrentOwner.js?61db","webpack:///./~/react/lib/ReactDOMTextComponent.js?8b6e","webpack:///./~/react/lib/DOMChildrenOperations.js?8e2a","webpack:///./~/react/lib/Danger.js?f653","webpack:///./~/react/~/fbjs/lib/ExecutionEnvironment.js?2035","webpack:///./~/react/~/fbjs/lib/createNodesFromMarkup.js?f183","webpack:///./~/react/~/fbjs/lib/createArrayFromMixed.js?9dc3","webpack:///./~/react/~/fbjs/lib/toArray.js?6a21","webpack:///./~/react/~/fbjs/lib/invariant.js?568c","webpack:///./~/react/~/fbjs/lib/getMarkupWrap.js?522e","webpack:///./~/react/~/fbjs/lib/emptyFunction.js?bcf9","webpack:///./~/react/lib/ReactMultiChildUpdateTypes.js?d4a0","webpack:///./~/react/~/fbjs/lib/keyMirror.js?741f","webpack:///./~/react/lib/ReactPerf.js?ef93","webpack:///./~/react/lib/setInnerHTML.js?38eb","webpack:///./~/react/lib/setTextContent.js?e257","webpack:///./~/react/lib/escapeTextContentForBrowser.js?9b98","webpack:///./~/react/lib/DOMPropertyOperations.js?930e","webpack:///./~/react/lib/DOMProperty.js?827c","webpack:///./~/react/lib/quoteAttributeValueForBrowser.js?459e","webpack:///./~/react/~/fbjs/lib/warning.js?0260","webpack:///./~/react/lib/ReactComponentBrowserEnvironment.js?c882","webpack:///./~/react/lib/ReactDOMIDOperations.js?efce","webpack:///./~/react/lib/ReactMount.js?2f23","webpack:///./~/react/lib/ReactBrowserEventEmitter.js?9c0a","webpack:///./~/react/lib/EventConstants.js?41f3","webpack:///./~/react/lib/EventPluginHub.js?c6b1","webpack:///./~/react/lib/EventPluginRegistry.js?4190","webpack:///./~/react/lib/EventPluginUtils.js?0958","webpack:///./~/react/lib/ReactErrorUtils.js?6b31","webpack:///./~/react/lib/accumulateInto.js?b434","webpack:///./~/react/lib/forEachAccumulated.js?b898","webpack:///./~/react/lib/ReactEventEmitterMixin.js?8a20","webpack:///./~/react/lib/ViewportMetrics.js?eb12","webpack:///./~/react/lib/Object.assign.js?4a55","webpack:///./~/react/lib/isEventSupported.js?be9a","webpack:///./~/react/lib/ReactDOMFeatureFlags.js?756f","webpack:///./~/react/lib/ReactElement.js?ab2f","webpack:///./~/react/lib/canDefineProperty.js?e9a0","webpack:///./~/react/lib/ReactEmptyComponentRegistry.js?2383","webpack:///./~/react/lib/ReactInstanceHandles.js?776d","webpack:///./~/react/lib/ReactRootIndex.js?ade8","webpack:///./~/react/lib/ReactInstanceMap.js?a83e","webpack:///./~/react/lib/ReactMarkupChecksum.js?0d75","webpack:///./~/react/lib/adler32.js?f32a","webpack:///./~/react/lib/ReactReconciler.js?6bfa","webpack:///./~/react/lib/ReactRef.js?7333","webpack:///./~/react/lib/ReactOwner.js?40e0","webpack:///./~/react/lib/ReactUpdateQueue.js?fd2c","webpack:///./~/react/lib/ReactUpdates.js?ce09","webpack:///./~/react/lib/CallbackQueue.js?bea8","webpack:///./~/react/lib/PooledClass.js?c29a","webpack:///./~/react/lib/Transaction.js?6dff","webpack:///./~/react/~/fbjs/lib/emptyObject.js?2c63","webpack:///./~/react/~/fbjs/lib/containsNode.js?4397","webpack:///./~/react/~/fbjs/lib/isTextNode.js?dcbb","webpack:///./~/react/~/fbjs/lib/isNode.js?d4c4","webpack:///./~/react/lib/instantiateReactComponent.js?75da","webpack:///./~/react/lib/ReactCompositeComponent.js?cd59","webpack:///./~/react/lib/ReactComponentEnvironment.js?1a40","webpack:///./~/react/lib/ReactPropTypeLocations.js?bc16","webpack:///./~/react/lib/ReactPropTypeLocationNames.js?7dd9","webpack:///./~/react/lib/shouldUpdateReactComponent.js?c0e1","webpack:///./~/react/lib/ReactEmptyComponent.js?b7b9","webpack:///./~/react/lib/ReactNativeComponent.js?cf5b","webpack:///./~/react/lib/validateDOMNesting.js?d9ad","webpack:///./~/react/lib/ReactDefaultInjection.js?3d36","webpack:///./~/react/lib/BeforeInputEventPlugin.js?87a5","webpack:///./~/react/lib/EventPropagators.js?d7c3","webpack:///./~/react/lib/FallbackCompositionState.js?9096","webpack:///./~/react/lib/getTextContentAccessor.js?165c","webpack:///./~/react/lib/SyntheticCompositionEvent.js?0a93","webpack:///./~/react/lib/SyntheticEvent.js?66c3","webpack:///./~/react/lib/SyntheticInputEvent.js?60ca","webpack:///./~/react/~/fbjs/lib/keyOf.js?65e9","webpack:///./~/react/lib/ChangeEventPlugin.js?e8a9","webpack:///./~/react/lib/getEventTarget.js?ec01","webpack:///./~/react/lib/isTextInputElement.js?ec60","webpack:///./~/react/lib/ClientReactRootIndex.js?570d","webpack:///./~/react/lib/DefaultEventPluginOrder.js?3d21","webpack:///./~/react/lib/EnterLeaveEventPlugin.js?5f5f","webpack:///./~/react/lib/SyntheticMouseEvent.js?5b2d","webpack:///./~/react/lib/SyntheticUIEvent.js?0511","webpack:///./~/react/lib/getEventModifierState.js?ce5c","webpack:///./~/react/lib/HTMLDOMPropertyConfig.js?d228","webpack:///./~/react/lib/ReactBrowserComponentMixin.js?863c","webpack:///./~/react/lib/findDOMNode.js?ec3f","webpack:///./~/react/lib/ReactDefaultBatchingStrategy.js?ef70","webpack:///./~/react/lib/ReactDOMComponent.js?1302","webpack:///./~/react/lib/AutoFocusUtils.js?e582","webpack:///./~/react/~/fbjs/lib/focusNode.js?40cb","webpack:///./~/react/lib/CSSPropertyOperations.js?222a","webpack:///./~/react/lib/CSSProperty.js?bbb1","webpack:///./~/react/~/fbjs/lib/camelizeStyleName.js?f471","webpack:///./~/react/~/fbjs/lib/camelize.js?4c11","webpack:///./~/react/lib/dangerousStyleValue.js?a8dd","webpack:///./~/react/~/fbjs/lib/hyphenateStyleName.js?a841","webpack:///./~/react/~/fbjs/lib/hyphenate.js?603e","webpack:///./~/react/~/fbjs/lib/memoizeStringOnly.js?85a1","webpack:///./~/react/lib/ReactDOMButton.js?38df","webpack:///./~/react/lib/ReactDOMInput.js?9d21","webpack:///./~/react/lib/LinkedValueUtils.js?813d","webpack:///./~/react/lib/ReactPropTypes.js?3c83","webpack:///./~/react/lib/getIteratorFn.js?1507","webpack:///./~/react/lib/ReactDOMOption.js?9449","webpack:///./~/react/lib/ReactChildren.js?4f05","webpack:///./~/react/lib/traverseAllChildren.js?56de","webpack:///./~/react/lib/ReactDOMSelect.js?9e06","webpack:///./~/react/lib/ReactDOMTextarea.js?ee2b","webpack:///./~/react/lib/ReactMultiChild.js?c87d","webpack:///./~/react/lib/ReactChildReconciler.js?ff46","webpack:///./~/react/lib/flattenChildren.js?0d06","webpack:///./~/react/~/fbjs/lib/shallowEqual.js?e187","webpack:///./~/react/lib/ReactEventListener.js?2365","webpack:///./~/react/~/fbjs/lib/EventListener.js?fc63","webpack:///./~/react/~/fbjs/lib/getUnboundedScrollPosition.js?beb0","webpack:///./~/react/lib/ReactInjection.js?1366","webpack:///./~/react/lib/ReactClass.js?0d74","webpack:///./~/react/lib/ReactComponent.js?702a","webpack:///./~/react/lib/ReactNoopUpdateQueue.js?ad0b","webpack:///./~/react/lib/ReactReconcileTransaction.js?9178","webpack:///./~/react/lib/ReactInputSelection.js?76e1","webpack:///./~/react/lib/ReactDOMSelection.js?fe14","webpack:///./~/react/lib/getNodeForCharacterOffset.js?c1de","webpack:///./~/react/~/fbjs/lib/getActiveElement.js?690f","webpack:///./~/react/lib/SelectEventPlugin.js?9763","webpack:///./~/react/lib/ServerReactRootIndex.js?0345","webpack:///./~/react/lib/SimpleEventPlugin.js?6065","webpack:///./~/react/lib/SyntheticClipboardEvent.js?2b3d","webpack:///./~/react/lib/SyntheticFocusEvent.js?a7dc","webpack:///./~/react/lib/SyntheticKeyboardEvent.js?ec44","webpack:///./~/react/lib/getEventCharCode.js?9d81","webpack:///./~/react/lib/getEventKey.js?666a","webpack:///./~/react/lib/SyntheticDragEvent.js?39dc","webpack:///./~/react/lib/SyntheticTouchEvent.js?c035","webpack:///./~/react/lib/SyntheticWheelEvent.js?c8d4","webpack:///./~/react/lib/SVGDOMPropertyConfig.js?ef35","webpack:///./~/react/lib/ReactDefaultPerf.js?5540","webpack:///./~/react/lib/ReactDefaultPerfAnalysis.js?221c","webpack:///./~/react/~/fbjs/lib/performanceNow.js?a0fc","webpack:///./~/react/~/fbjs/lib/performance.js?36da","webpack:///./~/react/lib/ReactVersion.js?c083","webpack:///./~/react/lib/renderSubtreeIntoContainer.js?8abc","webpack:///./~/react/react.js?3d67","webpack:///./~/react/lib/React.js?24ef","webpack:///./~/react/lib/ReactDOMServer.js?51e1","webpack:///./~/react/lib/ReactServerRendering.js?9368","webpack:///./~/react/lib/ReactServerBatchingStrategy.js?4093","webpack:///./~/react/lib/ReactServerRenderingTransaction.js?b78a","webpack:///./~/react/lib/ReactIsomorphic.js?7cc6","webpack:///./~/react/lib/ReactDOMFactories.js?5a92","webpack:///./~/react/lib/ReactElementValidator.js?a599","webpack:///./~/react/~/fbjs/lib/mapObject.js?ddb5","webpack:///./~/react/lib/onlyChild.js?27e3","webpack:///./~/react/lib/deprecated.js?c9fb","webpack:///./~/underscore/underscore.js?31a5","webpack:///./hub/static/jsx/components/Input.jsx?98f9","webpack:///./hub/static/jsx/components/Icon.jsx?b76e","webpack:///./hub/static/jsx/components/InputError.jsx?73f7","webpack:///./~/classnames/bind.js?bb51","webpack:///./hub/static/jsx/components/PasswordValidator.jsx?d6c4","webpack:///./hub/static/jsx/components/Utils.jsx?e0af","webpack:///./hub/static/jsx/signup.jsx"],"names":[],"mappings":";;;;;;;;qCAAqB,CAAW;;;;kCACd,GAAO;;;;mCACJ,GAAU;;;;AAE/B,uBAAS,MAAM,CAAC,2DAAW,EAAE,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,C;;;;;;ACJ7D;;AAEA;;;;;;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,+HAA8H;;AAE9H;AACA;AACA;;AAEA;AACA;;AAEA,oBAAmB,6BAA6B;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wB;;;;;;;AC3FA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,wBAAuB,sBAAsB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB;AACrB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,4BAA2B;AAC3B;AACA;AACA;AACA,6BAA4B,UAAU;;;;;;;AC1FtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAY;AACZ;AACA;;AAEA;;AAEA,oC;;;;;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,cAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,0DAA0D;AACvE,eAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,UAAU;AACvB,cAAa,0BAA0B;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA,EAAC;;AAED,wC;;;;;;;AC9HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,WAAW;AACtB,YAAW,WAAW;AACtB,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,cAAa,cAAc;AAC3B,cAAa,cAAc;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,oBAAmB,oBAAoB;AACvC;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA,sBAAqB,4BAA4B;AACjD;AACA;AACA;;AAEA,oBAAmB,oBAAoB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,EAAC;;AAED,wC;;;;;;;AChIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,aAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa,cAAc;AAC3B,eAAc,kBAAkB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAmB,uBAAuB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,sBAAqB,wBAAwB;AAC7C;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,WAAW;AACxB,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;;AAEA,yB;;;;;;;AChJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,uC;;;;;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,aAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,UAAU;AACrB,aAAY,8BAA8B;AAC1C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,wC;;;;;;;ACnFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,EAAE;AACb,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,EAAE;AACb,aAAY;AACZ;AACA;AACA;AACA;AACA,IAAG;AACH;AACA,IAAG;AACH;AACA;AACA;;AAEA,uC;;;;;;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,yBAAyB;AACpC,aAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA,mBAAkB,aAAa;AAC/B;AACA;AACA;AACA;;AAEA,0B;;;;;;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,sDAAqD;AACrD,MAAK;AACL;AACA;AACA;AACA;AACA,QAAO;AACP;;AAEA,2BAA0B;AAC1B;AACA;AACA;;AAEA,4B;;;;;;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;AAED;AACA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,aAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA,gC;;;;;;;AC9FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,8CAA6C;AAC7C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gC;;;;;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;AAED,6C;;;;;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,8BAA6B,sBAAsB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA,eAAc;AACd,eAAc;AACd;AACA,YAAW,OAAO;AAClB,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,4B;;;;;;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,eAAe;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,SAAS;AACtB,eAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,gBAAe,SAAS;AACxB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,SAAS;AACpB,aAAY;AACZ;AACA;AACA;AACA;;AAEA,4B;;;;;;;AC/FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW,WAAW;AACtB,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,wBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;;AAEA,+B;;;;;;ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,WAAW;AACtB,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iC;;;;;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,cAAa;AACb,aAAY;AACZ,aAAY;AACZ,eAAc;AACd,gBAAe;AACf;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,EAAE;AACb,aAAY,OAAO;AACnB;AACA;AACA;AACA;;AAEA,8C;;;;;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,8CAA6C;AAC7C;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAa,OAAO;AACpB,eAAc,OAAO;AACrB;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,EAAE;AACf,eAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,EAAE;AACf,eAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,WAAW;AACxB,cAAa,OAAO;AACpB,cAAa,EAAE;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA;AACA,QAAO;AACP;AACA;AACA,2CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA,MAAK;AACL;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,WAAW;AACxB,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA,MAAK;AACL;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,EAAC;;AAED,wC;;;;;;;AChOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA4C;AAC5C,+BAA8B;AAC9B;AACA,iBAAgB;;AAEhB;AACA;AACA;AACA,aAAY;AACZ;AACA,sEAAqE;;AAErE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAmB,oDAAoD;AACvE;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA,8B;;;;;;;ACzOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,YAAW,EAAE;AACb,aAAY,OAAO;AACnB;AACA;AACA;AACA;;AAEA,gD;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,uFAAsF,aAAa;AACnG;AACA;;AAEA;AACA;AACA;;AAEA;AACA,cAAa;AACb;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA,0B;;;;;;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,mD;;;;;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,WAAU;AACV;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,EAAE;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA,YAAW;AACX;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,cAAc;AAC3B,cAAa,cAAc;AAC3B;AACA;AACA;AACA,oBAAmB,oBAAoB;AACvC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,EAAC;;AAED,uC;;;;;;;AC7FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAY,OAAO;AACnB;AACA;AACA;AACA,kBAAiB,YAAY;AAC7B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW,uBAAuB;AAClC;AACA,aAAY,GAAG;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA,YAAW,WAAW;AACtB,aAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,8CAA8C;AACzD,aAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,WAAW;AACtB,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,aAAY,WAAW;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,EAAE;AACb,aAAY,YAAY;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,YAAY;AACvB,YAAW,OAAO;AAClB,aAAY,QAAQ;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,eAAe;AAC1B,YAAW,OAAO;AAClB,YAAW,WAAW;AACtB,YAAW,0BAA0B;AACrC,YAAW,QAAQ;AACnB;AACA;AACA;AACA,wBAAuB;AACvB;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,eAAe;AAC1B,YAAW,OAAO;AAClB,YAAW,WAAW;AACtB,YAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,eAAe;AAC1B,YAAW,WAAW;AACtB;AACA;AACA,UAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAW,YAAY;AACvB,aAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAQ,kCAAkC;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa,WAAW;AACxB,cAAa,SAAS;AACtB;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,cAAa,eAAe;AAC5B,cAAa,aAAa;AAC1B,cAAa,WAAW;AACxB,cAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,eAAe;AAC5B,cAAa,WAAW;AACxB,eAAc,OAAO;AACrB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,cAAa,aAAa;AAC1B,cAAa,WAAW;AACxB,cAAa,QAAQ;AACrB,eAAc,eAAe;AAC7B;AACA;AACA;AACA;AACA;AACA,qLAAoL;;AAEpL;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,eAAe;AAC5B,cAAa,aAAa;AAC1B,cAAa,WAAW;AACxB,cAAa,UAAU;AACvB,eAAc,eAAe;AAC7B;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,aAAa;AAC1B,cAAa,WAAW;AACxB,cAAa,UAAU;AACvB,eAAc,eAAe;AAC7B;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,cAAa,WAAW;AACxB,eAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,WAAW;AACxB,eAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oLAAmL;;AAEnL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,eAAc,YAAY;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,OAAO;AACpB,eAAc,WAAW;AACzB;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,EAAE;AACf,eAAc;AACd;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,cAAa,eAAe;AAC5B,eAAc,OAAO;AACrB,eAAc,eAAe;AAC7B;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,2CAA0C;AAC1C;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,EAAC;;AAED,6B;;;;;;;ACj1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAwC;;AAExC;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA,eAAc,QAAQ;AACtB;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAmB,yBAAyB;AAC5C;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA,YAAW;AACX;AACA;AACA;AACA;AACA,UAAS;;AAET;AACA;AACA,YAAW;AACX;AACA;AACA,UAAS;;AAET;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA,EAAC;;AAED;AACA;AACA;AACA,EAAC;;AAED,2C;;;;;;ACnUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,oCAAmC,gCAAgC;;AAEnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;AAED;AACA;AACA;AACA;;AAEA,iC;;;;;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,QAAQ;AACnB,YAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,uBAAsB;AACtB;AACA;AACA;AACA,oBAAmB;AACnB;AACA;AACA;AACA;AACA,yBAAwB;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,gBAAe,OAAO;AACtB;AACA;AACA;;AAEA;AACA,gBAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA,gBAAe,MAAM;AACrB;AACA;AACA;;AAEA;AACA,gBAAe,OAAO;AACtB;AACA;;AAEA,IAAG;;AAEH;;AAEA;;AAEA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,UAAU;AACvB;AACA;AACA;;AAEA,yGAAwG;AACxG;;AAEA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,eAAc,UAAU;AACxB;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,eAAe;AAC5B,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,eAAc,EAAE;AAChB;AACA;AACA;AACA;AACA;AACA,oBAAmB,oBAAoB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,EAAE;AACf;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;;AAEA,iC;;;;;;;ACtRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,aAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,+BAA8B;;AAE9B;AACA;AACA;AACA,8BAA6B;;AAE7B;AACA;AACA;AACA,mCAAkC;;AAElC;AACA;AACA;AACA;AACA;AACA,cAAa,MAAM;AACnB;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,OAAO;AACpB,eAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,sC;;;;;;;AC3NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,YAAW,eAAe;AAC1B,YAAW,QAAQ;AACnB,YAAW,SAAS;AACpB,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAmB,8BAA8B;AACjD;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAmB,8BAA8B;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAY,EAAE;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW,eAAe;AAC1B,aAAY,QAAQ;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;;AAEH;AACA;;AAEA,mC;;;;;;;ACzMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,YAAW,QAAQ;AACnB,YAAW,SAAS;AACpB,YAAW,EAAE;AACb,YAAW,EAAE;AACb;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,kC;;;;;;;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA6B;AAC7B;AACA;AACA;AACA,aAAY,WAAW;AACvB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,iC;;;;;;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,YAAW,MAAM;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA,qC;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA,yC;;;;;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,kC;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,0BAAyB,8BAA8B;AACvD;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,yB;;;;;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,SAAS;AACpB,aAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,6CAA4C;AAC5C;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,mC;;;;;;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,uC;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW,EAAE;AACb,YAAW,EAAE;AACb,YAAW,cAAc;AACzB,YAAW,EAAE;AACb;AACA;AACA;AACA;AACA,YAAW,EAAE;AACb;AACA,YAAW,EAAE;AACb,YAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA,oBAAmB,oBAAoB;AACvC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,wBAAuB;;AAEvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA,oBAAmB,oBAAoB;AACvC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,YAAW,QAAQ;AACnB,aAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;;AAEA,+B;;;;;;;ACtPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,6BAA4B,QAAQ,oBAAoB,EAAE;AAC1D;AACA,IAAG;AACH;AACA;AACA;;AAEA,oC;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,YAAW,OAAO;AAClB,aAAY,QAAQ;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,8C;;;;;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,aAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,aAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,aAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,aAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,aAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,aAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB,0BAA0B;AAC3C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,aAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB,gBAAgB;AACjC;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAW,QAAQ;AACnB,YAAW,QAAQ;AACnB,YAAW,SAAS;AACpB,YAAW,EAAE;AACb,YAAW,SAAS;AACpB,YAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAuB;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAc,OAAO;AACrB;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,eAAc,OAAO;AACrB;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,eAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,SAAS;AACtB,cAAa,EAAE;AACf,cAAa,EAAE;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,SAAS;AACtB,cAAa,EAAE;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,SAAS;AACtB,cAAa,EAAE;AACf;AACA;AACA;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,uC;;;;;;;AC7SA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,cAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iC;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;;AAEA,mC;;;;;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA,cAAa,OAAO;AACpB,eAAc,OAAO;AACrB;AACA;AACA;;AAEA;AACA;AACA,IAAG;;AAEH;AACA,cAAa,OAAO;AACpB,cAAa,WAAW;AACxB,gBAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sC;;;;;;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAU,2BAA2B;AACrC;AACA;AACA;AACA;AACA;AACA,SAAQ,OAAO;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA,0B;;;;;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,cAAa,eAAe;AAC5B,cAAa,OAAO;AACpB,cAAa,0DAA0D;AACvE,eAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,eAAe;AAC5B,cAAa,aAAa;AAC1B,cAAa,0BAA0B;AACvC,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,eAAe;AAC5B,cAAa,0BAA0B;AACvC;AACA;AACA;AACA;AACA;;AAEA;;AAEA,kC;;;;;;AC1GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,2B;;;;;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAAyB,iBAAiB;AAC1C;AACA;AACA;AACA,SAAQ;AACR;AACA;AACA,SAAQ;AACR;AACA;AACA;AACA,OAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,cAAa,QAAQ;AACrB,eAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,eAAe;AAC5B,cAAa,OAAO;AACpB,cAAa,WAAW;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,eAAe;AAC5B,cAAa,OAAO;AACpB,cAAa,WAAW;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,6B;;;;;;;AC1FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAa,WAAW;AACxB,eAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,WAAW;AACxB,cAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,WAAW;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,WAAW;AACxB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,WAAW;AACxB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,WAAW;AACxB,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,0BAAyB;AACzB;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,WAAW;AACxB,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;;AAEA,mC;;;;;;;AChQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,kBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,EAAC;;AAED;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,eAAe;AAC1B,YAAW,eAAe;AAC1B,aAAY,OAAO;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,kBAAiB,SAAS;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,sBAAqB,sBAAsB;AAC3C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,2DAA0D;AAC1D;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,+B;;;;;;;AC9NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,cAAa,SAAS;AACtB,cAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB,sBAAsB;AAC3C;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA,EAAC;;AAED;;AAEA,gC;;;;;;;AC5FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,SAAS;AACpB,YAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,8B;;;;;;;ACtHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,4BAA4B;AACvC;AACA,aAAY,YAAY;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;AACA,eAAc,0BAA0B;AACxC;AACA;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,SAAS;AACtB,cAAa,OAAO;AACpB,cAAa,SAAS;AACtB,cAAa,SAAS;AACtB,cAAa,SAAS;AACtB,cAAa,SAAS;AACtB,cAAa,SAAS;AACtB,cAAa,SAAS;AACtB;AACA,eAAc,EAAE;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX,UAAS;AACT;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,6BAA4B,gCAAgC;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,2DAA0D;AAC1D;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA4B,gCAAgC;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,sDAAqD;AACrD;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,8B;;;;;;;ACtOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,8B;;;;;;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,YAAW,SAAS;AACpB,YAAW,SAAS;AACpB,aAAY,QAAQ;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA,MAAK;AACL;AACA,MAAK;AACL;AACA;AACA;AACA;AACA,MAAK;AACL;AACA,MAAK;AACL;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA,+B;;;;;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA,YAAW,EAAE;AACb,aAAY,QAAQ;AACpB;AACA;AACA;AACA;;AAEA,6B;;;;;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW,EAAE;AACb,aAAY,QAAQ;AACpB;AACA;;AAEA;AACA;AACA;;AAEA,yB;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,EAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW,SAAS;AACpB,aAAY,QAAQ;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,UAAU;AACrB,aAAY,OAAO;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;AACH;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,4C;;;;;;;AC/GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW;AACX;AACA;;AAEA;AACA;AACA;AACA,cAAa,aAAa;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,0DAA0D;AACvE,eAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,eAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,eAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA,cAAa,OAAO;AACpB,eAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAsB;AACtB;AACA;AACA,IAAG;;AAEH;AACA;AACA,uEAAsE;AACtE;AACA;AACA,cAAa,OAAO;AACpB,eAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gJAA+I;AAC/I;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,0BAA0B;AACvC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,0BAA0B;AACvC,cAAa,aAAa;AAC1B,cAAa,aAAa;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,8BAA6B;AAC7B,kCAAiC,kBAAkB;AACnD;AACA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,aAAa;AAC1B,cAAa,OAAO;AACpB,cAAa,QAAQ;AACrB,cAAa,QAAQ;AACrB,cAAa,0BAA0B;AACvC,cAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,0BAA0B;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0DAAyD;AACzD;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,eAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,eAAc,eAAe;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,EAAC;;AAED;;AAEA;;AAEA;;AAEA,0C;;;;;;;ACrrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,4C;;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,EAAC;;AAED,yC;;;;;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,6C;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,QAAQ;AACnB,YAAW,QAAQ;AACnB,aAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;;AAEA,6C;;;;;;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAkC;AAClC;AACA;AACA;AACA;AACA,IAAG;AACH,mCAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;AAED;;AAEA,sC;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,aAAa;AACxB,aAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,aAAa;AACxB,aAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW,UAAU;AACrB,aAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA,YAAW,eAAe;AAC1B,aAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,uC;;;;;;;AC7FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,0DAAyD;AACzD;AACA;AACA,wCAAuC;AACvC;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,iCAAgC;AAChC,iBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,kBAAiB,iBAAiB;AAClC;AACA;AACA,UAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qC;;;;;;;AC1WA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,G;;;;;;;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,oCAAmC;AACnC;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,uBAAsB,sBAAsB;AAC5C,wBAAuB,6BAA6B;AACpD,MAAK;AACL;AACA,IAAG;AACH;AACA;AACA,uBAAsB,yBAAyB;AAC/C,wBAAuB,gCAAgC;AACvD,MAAK;AACL;AACA,IAAG;AACH;AACA;AACA,uBAAsB,2BAA2B;AACjD,wBAAuB,kCAAkC;AACzD,MAAK;AACL;AACA,IAAG;AACH;AACA;AACA,uBAAsB,4BAA4B;AAClD,wBAAuB,mCAAmC;AAC1D,MAAK;AACL;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,aAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,YAAW,OAAO;AAClB,YAAW,eAAe;AAC1B,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,aAAY,QAAQ;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,aAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,aAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,eAAe;AAC1B,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,aAAY,QAAQ;AACpB;AACA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,cAAa,OAAO;AACpB,cAAa,eAAe;AAC5B,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,eAAc,EAAE;AAChB,YAAW;AACX;AACA;AACA;AACA;AACA;;AAEA,yC;;;;;;ACpZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,eAAe;AAC1B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,mC;;;;;;;ACtIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,eAAe;AAC1B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,eAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,eAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,oBAAmB,qBAAqB;AACxC;AACA;AACA;AACA;;AAEA;AACA,kBAAiB,eAAe;AAChC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,EAAC;;AAED;;AAEA,2C;;;;;;AC9FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,aAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yC;;;;;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,cAAa;AACb;AACA;AACA;AACA;;AAEA;;AAEA,4C;;;;;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,eAAc,QAAQ;AACtB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,EAAC;;AAED;;AAEA;AACA;AACA;AACA,YAAW,SAAS;AACpB,YAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,8BAA6B;AAC7B;;AAEA;AACA;;AAEA;;AAEA,iC;;;;;;;AChLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,cAAa;AACb;AACA;AACA;AACA;;AAEA;;AAEA,sC;;;;;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA8C,gBAAgB;AAC9D;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wB;;;;;;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,uBAAsB,iBAAiB;AACvC,wBAAuB,wBAAwB;AAC/C,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,cAAa,OAAO;AACpB,cAAa,eAAe;AAC5B,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,eAAc,EAAE;AAChB,YAAW;AACX;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,MAAK;AACL;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,oC;;;;;;AChUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,aAAY,eAAe;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iC;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,qC;;;;;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,uC;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAsC,6BAA6B,UAAU,0BAA0B,UAAU,uBAAuB,UAAU,8BAA8B,UAAU,0BAA0B,UAAU,0BAA0B,UAAU,+BAA+B;;AAEjS,0C;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,8BAA6B,qBAAqB;AAClD;AACA,IAAG;AACH;AACA,8BAA6B,qBAAqB;AAClD;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,eAAe;AAC5B,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,eAAc,EAAE;AAChB,YAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,wC;;;;;;AC3HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;;AAEA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,cAAa;AACb;AACA;AACA;AACA;;AAEA;;AAEA,sC;;;;;;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;;AAEA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,cAAa;AACb;AACA;AACA;AACA;;AAEA;;AAEA,mC;;;;;;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,wC;;;;;;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wC;;;;;;ACvOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,eAAc,WAAW;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,6C;;;;;;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,YAAW,0BAA0B;AACrC,aAAY,YAAY;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,8B;;;;;;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,EAAC;;AAED;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA,+C;;;;;;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,sBAAqB;;AAErB,uBAAsB,iBAAiB;AACvC,oBAAmB,cAAc;AACjC,mBAAkB,eAAe;;AAEjC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uHAAsH;AACtH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,0HAAyH;AACzH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAe,yBAAyB;AACxC;AACA,IAAG;AACH;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,YAAW,OAAO;AAClB,YAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qNAAoN,YAAY;AAChO;AACA;AACA;AACA;AACA;AACA,qOAAoO,+BAA+B;AACnQ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,EAAC;;AAED;AACA;AACA;;AAEA,qDAAoD;AACpD;AACA,yBAAwB;;AAExB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,sBAAqB;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,0DAA0D;AACvE,cAAa,OAAO;AACpB,eAAc,OAAO;AACrB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAkC;AAClC;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,0DAA0D;AACvE,cAAa,OAAO;AACpB,eAAc,OAAO;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,4DAA2D;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,0DAA0D;AACvE,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,eAAc,OAAO;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,wBAAuB,wBAAwB;AAC/C;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,aAAa;AAC1B,cAAa,0DAA0D;AACvE,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,0BAA0B;AACvC,cAAa,aAAa;AAC1B,cAAa,aAAa;AAC1B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,0BAA0B;AACvC,cAAa,YAAY;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,uCAAsC,KAAK;AAC3C;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yDAAwD;AACxD,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,UAAS;AACT;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,0BAA0B;AACvC,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAAyB,sBAAsB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,EAAC;;AAED;;AAEA,oC;;;;;;;ACj8BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iC;;;;;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,YAAW,WAAW;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA,4B;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,EAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,6CAA4C;;AAE5C;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,cAAa,OAAO;AACpB,cAAa,EAAE;AACf;AACA;AACA;AACA;AACA,MAAK;AACL;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iCAAgC,0BAA0B;AAC1D,qBAAoB,SAAS;AAC7B;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,eAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAqE;AACrE;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,WAAW;AACxB,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,EAAC;;AAED,wC;;;;;;;AC9KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,aAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH,EAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,8B;;;;;;AC1IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,aAAY;AACZ;AACA;AACA;AACA;;AAEA,oC;;;;;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,aAAY;AACZ;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA,2B;;;;;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,EAAE;AACb,aAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,uBAAsB;AACtB;;AAEA;AACA;AACA;AACA;AACA;;AAEA,sC;;;;;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,aAAY;AACZ;AACA;AACA;AACA;;AAEA,qC;;;;;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,aAAY;AACZ;AACA;AACA;AACA;;AAEA,4B;;;;;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,YAAW,SAAS;AACpB,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,oC;;;;;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,iC;;;;;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,uCAAsC;AACtC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gCAA+B;AAC/B;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,oBAAmB,kBAAkB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,+BAA8B;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,gC;;;;;;;ACxJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA,cAAa,OAAO;AACpB,eAAc,EAAE;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA,cAAa,OAAO;AACpB,eAAc,EAAE;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA,cAAa,OAAO;AACpB,cAAa,eAAe;AAC5B;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA,mC;;;;;;;ACrIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAQ;AACR,4BAA2B;AAC3B,OAAM;AACN;AACA;AACA;AACA;AACA,8BAA6B,KAAK;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP,2BAA0B;AAC1B,MAAK;AACL;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAmB,sBAAsB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA,oBAAmB,2BAA2B;AAC9C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA,oBAAmB,gCAAgC;AACnD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iC;;;;;;ACnWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,yCAAwC;;AAExC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,QAAQ;AACnB,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gC;;;;;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAuB,wBAAwB;AAC/C;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA,2BAA0B;AAC1B,IAAG;;AAEH;AACA,+BAA8B,2CAA2C;;AAEzE;AACA,iBAAgB;AAChB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,MAAK;;AAEL;AACA;AACA;;AAEA;;AAEA,iC;;;;;;;ACrFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAW,UAAU;AACrB,YAAW,GAAG;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,GAAG;AACd,YAAW,iBAAiB;AAC5B,YAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAW,GAAG;AACd,YAAW,UAAU;AACrB,YAAW,GAAG;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,GAAG;AACd,YAAW,iBAAiB;AAC5B,YAAW,EAAE;AACb,aAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW,GAAG;AACd,aAAY,OAAO;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gC;;;;;;ACrLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,EAAE;AACb,YAAW,OAAO;AAClB,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,EAAE;AACb,aAAY,OAAO;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,aAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA,YAAW,GAAG;AACd,YAAW,QAAQ;AACnB,YAAW,UAAU;AACrB,YAAW,GAAG;AACd;AACA,aAAY,QAAQ;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,wBAAuB;AACvB;;AAEA;AACA,oBAAmB,qBAAqB;AACxC;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2LAA2L,yCAAyC;AACpO;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,GAAG;AACd,YAAW,UAAU;AACrB,YAAW,GAAG;AACd,aAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,sC;;;;;;;AC5LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,kBAAiB,2BAA2B;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;AACA,YAAW,kBAAkB;AAC7B,YAAW,QAAQ;AACnB,YAAW,EAAE;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAe,sBAAsB;AACrC;AACA;AACA,gBAAe,oBAAoB;AACnC;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,gBAAe,oBAAoB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qBAAoB;AACpB;AACA;AACA,MAAK;AACL,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,iCAAgC;AAChC;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iC;;;;;;;AC3LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uCAAsC;AACtC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gCAA+B;AAC/B;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,mC;;;;;;;AChHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,WAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,WAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA,gBAAe,QAAQ;AACvB,iBAAgB,MAAM;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,gBAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,gBAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,gBAAe,QAAQ;AACvB,gBAAe,0BAA0B;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA,gBAAe,QAAQ;AACvB,gBAAe,0BAA0B;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,gBAAe,eAAe;AAC9B,gBAAe,OAAO;AACtB,gBAAe,OAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,gBAAe,eAAe;AAC9B,gBAAe,OAAO;AACtB;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,gBAAe,eAAe;AAC9B;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,gBAAe,OAAO;AACtB;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,gBAAe,OAAO;AACtB;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,gBAAe,eAAe;AAC9B,gBAAe,OAAO;AACtB,gBAAe,OAAO;AACtB,gBAAe,0BAA0B;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,gBAAe,eAAe;AAC9B;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,kC;;;;;;;AC/eA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,wKAAuK;AACvK;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,QAAQ;AACrB,eAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,QAAQ;AACrB,cAAa,QAAQ;AACrB,cAAa,0BAA0B;AACvC,cAAa,OAAO;AACpB,eAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,uC;;;;;;;ACzHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA,YAAW,SAAS;AACpB,YAAW,gBAAgB;AAC3B,YAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,wKAAuK;AACvK;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,kC;;;;;;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,kBAAiB,kBAAkB;AACnC;AACA;AACA;AACA;;AAEA;AACA;;AAEA,+B;;;;;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,YAAW,EAAE;AACb,aAAY,gBAAgB;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;AACD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAM;AACN;AACA;AACA;;AAEA,+BAA8B;AAC9B;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,kBAAiB,kCAAkC;AACnD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAiB,iBAAiB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,eAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,eAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA,qC;;;;;;AClNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,eAAe;AAC5B,cAAa,OAAO;AACpB,cAAa,SAAS;AACtB,eAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,eAAe;AAC5B,cAAa,OAAO;AACpB,cAAa,SAAS;AACtB,eAAc,OAAO;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA,gC;;;;;;;ACnFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,qBAAqB;AAChC,aAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,6C;;;;;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iC;;;;;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAwB,eAAe;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;AAED;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAY;AACZ;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAc;AACd;AACA;AACA;;AAEA;AACA,eAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA6B,KAAK;AAClC;AACA;AACA,eAAc;AACd;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,WAAW;AACxB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,QAAQ;AACrB,cAAa,QAAQ;AACrB,eAAc,QAAQ;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,QAAQ;AACrB,cAAa,QAAQ;AACrB,cAAa,0BAA0B;AACvC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,QAAQ;AACrB,cAAa,QAAQ;AACrB,cAAa,WAAW;AACxB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,0BAA0B;AACvC;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,sBAAqB,mBAAmB;AACxC;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,8CAA6C;AAC7C,IAAG;AACH;AACA;AACA;AACA;AACA,yCAAwC;AACxC,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,sCAAqC;AACrC,IAAG;AACH;AACA;AACA,IAAG;AACH,2BAA0B;;AAE1B;AACA;AACA;AACA;AACA;AACA;AACA,6HAA4H;AAC5H;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,+OAA8O;;AAE9O;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,aAAY,OAAO;AACnB;AACA;AACA;;AAEA;AACA;AACA,+NAA8N;AAC9N;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,SAAS;AACpB,YAAW,SAAS;AACpB,aAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,SAAS;AACpB,YAAW,SAAS;AACpB,aAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,SAAS;AACpB,aAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yFAAwF,aAAa;AACrG;AACA;;AAEA,uDAAsD;AACtD;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,eAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAa,OAAO;AACpB,eAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;;AAEA,6B;;;;;;;AClwBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,gBAAgB;AAC3B;AACA,YAAW,UAAU;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,wIAAuI;AACvI;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,UAAU;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,iC;;;;;;;ACzHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAa,WAAW;AACxB,eAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,cAAa,WAAW;AACxB,cAAa,UAAU;AACvB;AACA;AACA,0DAAyD;;AAEzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,WAAW;AACxB;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,WAAW;AACxB,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,cAAa,WAAW;AACxB,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,WAAW;AACxB,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,cAAa,WAAW;AACxB,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;;AAEA;;AAEA,uC;;;;;;;ACrHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,eAAc,UAAU;AACxB;AACA;AACA;AACA,cAAa,UAAU;AACvB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAc,QAAQ;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA,cAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAc,cAAc;AAC5B;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA,eAAc,OAAO;AACrB;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,4C;;;;;;ACtJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,gBAAe;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA,0BAAyB;AACzB,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA,sC;;;;;;AC3HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,WAAW;AACtB,aAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW,WAAW;AACtB,aAAY;AACZ;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW,uBAAuB;AAClC,YAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,uBAAuB;AAClC,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,cAAa,WAAW;AACxB;AACA;;AAEA;AACA,cAAa,uBAAuB;AACpC,cAAa,OAAO;AACpB;AACA;AACA;;AAEA,oC;;;;;;ACnNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,YAAW,uBAAuB;AAClC,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW,uBAAuB;AAClC,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,uBAAuB;AAClC,YAAW,OAAO;AAClB,aAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,4C;;;;;;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA,mC;;;;;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,uBAAsB,iBAAiB;AACvC,wBAAuB,wBAAwB;AAC/C,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,4BAA2B,iBAAiB;;AAE5C;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,WAAW;AACtB,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,cAAa,OAAO;AACpB,cAAa,eAAe;AAC5B,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,eAAc,EAAE;AAChB,YAAW;AACX;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA,oC;;;;;;ACxMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,uC;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,uBAAsB,gBAAgB;AACtC,wBAAuB,uBAAuB;AAC9C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,eAAe;AACrC,wBAAuB,sBAAsB;AAC7C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,kBAAkB;AACxC,wBAAuB,yBAAyB;AAChD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,yBAAyB;AAC/C,wBAAuB,gCAAgC;AACvD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,gBAAgB;AACtC,wBAAuB,uBAAuB;AAC9C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,sBAAsB;AAC5C,wBAAuB,6BAA6B;AACpD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,eAAe;AACrC,wBAAuB,sBAAsB;AAC7C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,cAAc;AACpC,wBAAuB,qBAAqB;AAC5C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,sBAAsB;AAC5C,wBAAuB,6BAA6B;AACpD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,eAAe;AACrC,wBAAuB,sBAAsB;AAC7C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,kBAAkB;AACxC,wBAAuB,yBAAyB;AAChD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,oBAAoB;AAC1C,wBAAuB,2BAA2B;AAClD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,mBAAmB;AACzC,wBAAuB,0BAA0B;AACjD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,oBAAoB;AAC1C,wBAAuB,2BAA2B;AAClD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,mBAAmB;AACzC,wBAAuB,0BAA0B;AACjD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,oBAAoB;AAC1C,wBAAuB,2BAA2B;AAClD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,eAAe;AACrC,wBAAuB,sBAAsB;AAC7C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,yBAAyB;AAC/C,wBAAuB,gCAAgC;AACvD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,kBAAkB;AACxC,wBAAuB,yBAAyB;AAChD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,oBAAoB;AAC1C,wBAAuB,2BAA2B;AAClD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,gBAAgB;AACtC,wBAAuB,uBAAuB;AAC9C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,gBAAgB;AACtC,wBAAuB,uBAAuB;AAC9C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,gBAAgB;AACtC,wBAAuB,uBAAuB;AAC9C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,gBAAgB;AACtC,wBAAuB,uBAAuB;AAC9C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,kBAAkB;AACxC,wBAAuB,yBAAyB;AAChD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,mBAAmB;AACzC,wBAAuB,0BAA0B;AACjD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,gBAAgB;AACtC,wBAAuB,uBAAuB;AAC9C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,eAAe;AACrC,wBAAuB,sBAAsB;AAC7C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,qBAAqB;AAC3C,wBAAuB,4BAA4B;AACnD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,yBAAyB;AAC/C,wBAAuB,gCAAgC;AACvD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,oBAAoB;AAC1C,wBAAuB,2BAA2B;AAClD;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,uBAAsB,oBAAoB;AAC1C,wBAAuB,2BAA2B;AAClD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,oBAAoB;AAC1C,wBAAuB,2BAA2B;AAClD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,mBAAmB;AACzC,wBAAuB,0BAA0B;AACjD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,oBAAoB;AAC1C,wBAAuB,2BAA2B;AAClD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,kBAAkB;AACxC,wBAAuB,yBAAyB;AAChD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,gBAAgB;AACtC,wBAAuB,uBAAuB;AAC9C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,gBAAgB;AACtC,wBAAuB,uBAAuB;AAC9C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,eAAe;AACrC,wBAAuB,sBAAsB;AAC7C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,kBAAkB;AACxC,wBAAuB,yBAAyB;AAChD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,mBAAmB;AACzC,wBAAuB,0BAA0B;AACjD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,qBAAqB;AAC3C,wBAAuB,4BAA4B;AACnD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,gBAAgB;AACtC,wBAAuB,uBAAuB;AAC9C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,iBAAiB;AACvC,wBAAuB,wBAAwB;AAC/C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,iBAAiB;AACvC,wBAAuB,wBAAwB;AAC/C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,kBAAkB;AACxC,wBAAuB,yBAAyB;AAChD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,kBAAkB;AACxC,wBAAuB,yBAAyB;AAChD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,iBAAiB;AACvC,wBAAuB,wBAAwB;AAC/C;AACA,IAAG;AACH;AACA;AACA,uBAAsB,kBAAkB;AACxC,wBAAuB,yBAAyB;AAChD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,qBAAqB;AAC3C,wBAAuB,4BAA4B;AACnD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,sBAAsB;AAC5C,wBAAuB,6BAA6B;AACpD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,mBAAmB;AACzC,wBAAuB,0BAA0B;AACjD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,oBAAoB;AAC1C,wBAAuB,2BAA2B;AAClD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,qBAAqB;AAC3C,wBAAuB,4BAA4B;AACnD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,uBAAuB;AAC7C,wBAAuB,8BAA8B;AACrD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,kBAAkB;AACxC,wBAAuB,yBAAyB;AAChD;AACA,IAAG;AACH;AACA;AACA,uBAAsB,gBAAgB;AACtC,wBAAuB,uBAAuB;AAC9C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,2BAA0B,gBAAgB;AAC1C;;AAEA;;AAEA;;AAEA;AACA,cAAa,OAAO;AACpB,cAAa,eAAe;AAC5B,cAAa,OAAO;AACpB,cAAa,OAAO;AACpB,eAAc,EAAE;AAChB,YAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,oC;;;;;;;AC1kBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,cAAa;AACb;AACA;AACA;AACA;;AAEA;;AAEA,0C;;;;;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,cAAa;AACb;AACA;AACA;AACA;;AAEA;;AAEA,sC;;;;;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,cAAa;AACb;AACA;AACA;AACA;;AAEA;;AAEA,yC;;;;;;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,aAAY,OAAO;AACnB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,mC;;;;;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW,OAAO;AAClB,aAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,8B;;;;;;ACtGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,cAAa;AACb;AACA;AACA;AACA;;AAEA;;AAEA,qC;;;;;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,cAAa;AACb;AACA;AACA;AACA;;AAEA;;AAEA,sC;;;;;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,cAAa;AACb;AACA;AACA;AACA;;AAEA;;AAEA,sC;;;;;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,uC;;;;;;AC9HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;AACA;AACA,sEAAqE,aAAa;AAClF;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAuB;AACvB,wBAAuB;AACvB,qBAAoB;AACpB,qBAAoB;AACpB,qBAAoB;AACpB,2BAA0B;AAC1B;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW;AACX,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;;AAEA,mC;;;;;;AC5OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAiB,yBAAyB;AAC1C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT,QAAO;AACP,MAAK;AACL,IAAG;AACH;AACA;;AAEA;AACA;AACA;;AAEA,kBAAiB,yBAAyB;AAC1C;AACA,2BAA0B;;AAE1B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;;AAEA,kBAAiB,yBAAyB;AAC1C;AACA,2BAA0B;AAC1B;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAwB;;AAExB;AACA;AACA;AACA;AACA,oBAAmB,yBAAyB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,2C;;;;;;ACtMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,iC;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA,oC;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,2B;;;;;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,wD;;;;;;ACfA;;AAEA;;;;;;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,EAAC;;AAED;AACA;;AAEA,wB;;;;;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,iC;;;;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,YAAW,aAAa;AACxB,aAAY,OAAO;AACnB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW,aAAa;AACxB,aAAY,OAAO;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,G;;;;;;;AClFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,8C;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAc,MAAM;AACpB;AACA;AACA;AACA,IAAG;;AAEH;AACA,eAAc,OAAO;AACrB;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,kD;;;;;;ACtFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,wB;;;;;;;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,EAAC;;AAED,oC;;;;;;;AChLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,aAAa;AACxB,YAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,aAAa;AACxB,YAAW,EAAE;AACb,cAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,gGAA+F;AAC/F;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,UAAU;AACrB,YAAW,EAAE;AACb;AACA;AACA;AACA;AACA;AACA;AACA,oBAAmB,iBAAiB;AACpC;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8IAA6I;AAC7I;AACA,QAAO;AACP;AACA;AACA,uIAAsI;AACtI;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW,aAAa;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB,sBAAsB;AAC3C;AACA;AACA;;AAEA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;AACA;AACA,UAAS;AACT;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA,oBAAmB,sBAAsB;AACzC;AACA;AACA;AACA;AACA;;AAEA;;AAEA,wC;;;;;;;ACxRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,QAAQ;AACnB,YAAW,SAAS;AACpB,YAAW,EAAE;AACb,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,4B;;;;;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,QAAQ;AACnB,aAAY,eAAe;AAC3B;AACA;AACA;AACA;AACA;AACA;;AAEA,4B;;;;;;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,EAAE;AACb,YAAW,SAAS;AACpB,aAAY,SAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,6B;;;;;;;;AC/CA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,0BAAyB,gBAAgB;AACzC;AACA;AACA;AACA,wBAAuB,OAAO;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAsC,YAAY;AAClD;AACA;AACA,MAAK;AACL;AACA,wCAAuC,YAAY;AACnD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAY,8BAA8B;AAC1C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA0C,YAAY;AACtD;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA0C,YAAY;AACtD;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA6B,gBAAgB;AAC7C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA,qDAAoD;AACpD,IAAG;;AAEH;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,2CAA0C;AAC1C,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,6DAA4D,YAAY;AACxE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA8C,YAAY;AAC1D;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,+CAA8C,YAAY;AAC1D;AACA;AACA,sBAAqB,gBAAgB;AACrC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,wBAAuB,gBAAgB;AACvC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,8CAA6C,YAAY;AACzD;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAY,8BAA8B;AAC1C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAsD;AACtD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA0C,0BAA0B;AACpE;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,sBAAqB,cAAc;AACnC;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAqB,YAAY;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAe,YAAY;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO,eAAe;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,sBAAqB,eAAe;AACpC;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAmB,YAAY;AAC/B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAsB;AACtB;AACA,0BAAyB,gBAAgB;AACzC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAmB,YAAY;AAC/B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,0CAAyC,YAAY;AACrD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,0CAAyC,YAAY;AACrD;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAmB;AACnB;AACA;AACA;AACA;AACA,MAAK;AACL;AACA,6CAA4C,mBAAmB;AAC/D;AACA;AACA,0CAAyC,YAAY;AACrD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,sDAAqD;AACrD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAmB,YAAY;AAC/B;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8EAA6E;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,sCAAqC;AACrC;AACA;AACA;;AAEA;AACA;AACA;AACA,2BAA0B;AAC1B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAmB,OAAO;AAC1B;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAe;AACf,eAAc;AACd,eAAc;AACd,iBAAgB;AAChB,iBAAgB;AAChB,iBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,0BAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA4B;;AAE5B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP,sBAAqB;AACrB;;AAEA;AACA;AACA,MAAK;AACL,kBAAiB;;AAEjB;AACA,mDAAkD,EAAE,iBAAiB;;AAErE;AACA,yBAAwB,8BAA8B;AACtD,4BAA2B;;AAE3B;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,mDAAkD,iBAAiB;;AAEnE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA,EAAC;;;;;;;;;;;;;;;;;;;;;;;;;;kCC3gDiB,GAAO;;;;uCACX,GAAY;;;;iCACT,GAAQ;;;;uCACF,GAAc;;;;8CACP,GAAqB;;;;2CAC5B,GAAiB;;;;AAExC,KAAI,EAAE,GAAG,4BAAW,IAAI,CAAC,EAAE,CAAC,CAAC;;KAER,KAAK;eAAL,KAAK;;AACX,cADM,KAAK,CACV,KAAK,EAAE;;;+BADF,KAAK;;AAElB,oCAFa,KAAK,6CAEZ,KAAK,EAAE;;cA0BjB,YAAY,GAAG,UAAC,KAAK,EAAK;AACtB,mBAAK,QAAQ,CAAC;AACV,sBAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK;AACzB,sBAAK,EAAE,wBAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;cACvC,CAAC,CAAC;;AAEH,iBAAI,MAAK,KAAK,CAAC,SAAS,EAAE;AACtB,uBAAK,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;cACtC,CAAC;;AAEF,iBAAI,MAAK,KAAK,CAAC,QAAQ,EAAE;AACrB,uBAAK,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;cAC1C;;AAED,iBAAI,MAAK,KAAK,CAAC,QAAQ,EAAE;AACrB,uBAAK,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;cAC9B;UACJ;;cAED,aAAa,GAAI,UAAC,KAAK,EAAM;;AAEzB,iBAAI,MAAK,KAAK,CAAC,QAAQ,IAAI,MAAK,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAC;AAClD,uBAAK,QAAQ,CAAC;AACV,0BAAK,EAAE,IAAI;AACX,iCAAY,EAAE,KAAK;kBACtB,CAAC,CAAC;cACN,MAAM;AACH,uBAAK,QAAQ,CAAC;AACV,0BAAK,EAAE,KAAK;AACZ,iCAAY,EAAE,CAAC,wBAAE,OAAO,CAAC,KAAK,CAAC,GAAG,MAAK,KAAK,CAAC,YAAY,GAAG,MAAK,KAAK,CAAC,YAAY;kBACtF,CAAC,CAAC;cACN;UAEJ;;cAED,yBAAyB,GAAI,UAAC,QAAQ,EAAM;;AAExC,iBAAI,QAAQ,CAAC,KAAK,EAAE;AAChB,qBAAG,CAAC,wBAAE,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AAC5D,yBAAI,MAAK,KAAK,CAAC,QAAQ,EAAE;AACrB,+BAAK,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;sBACtC;AACD,2BAAK,QAAQ,CAAC;AACV,8BAAK,EAAE,QAAQ,CAAC,KAAK;AACrB,8BAAK,EAAE,wBAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;sBACnC,CAAC,CAAC;kBACN;cACJ;UACJ;;cAeD,WAAW,GAAG,UAAC,KAAK,EAAK;AACrB,mBAAK,QAAQ,CAAC;AACV,sBAAK,EAAE,IAAI;AACX,iCAAgB,EAAE,IAAI;cACzB,CAAC,CAAC;;AAEH,iBAAI,MAAK,KAAK,CAAC,SAAS,EAAE;AACtB,uBAAK,QAAQ,CAAC;AACV,iCAAY,EAAE,KAAK;kBACtB,CAAC,CAAC;cACN;UACJ;;cAED,UAAU,GAAG,UAAC,KAAK,EAAK;AACpB,mBAAK,QAAQ,CAAC;AACV,sBAAK,EAAE,KAAK;AACZ,6BAAY,EAAE,CAAC,MAAK,KAAK,CAAC,KAAK;AAC/B,iCAAgB,EAAE,KAAK;cAC1B,CAAC,CAAC;UACN;;cAgBD,UAAU,GAAI,UAAC,KAAK,EAAM;AACtB,iBAAI,SAAS,GAAG;AACZ,yBAAQ,EAAE,CAAC,wBAAE,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAK,KAAK,CAAC,aAAa,CAAC,GAAE,KAAK;AACvF,+BAAc,EAAE,CAAC,wBAAE,OAAO,CAAC,KAAK,CAAC,GAAG,MAAK,aAAa,CAAC,KAAK,CAAC,GAAE,KAAK;AACpE,wBAAO,EAAE,CAAC,wBAAE,OAAO,CAAC,KAAK,CAAC,GAAG,MAAK,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK;AACjE,sBAAK,EAAE,CAAC,wBAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,MAAK,UAAU,CAAC,KAAK,CAAC,GAAG,KAAK;cAC7D,CAAC;AACF,iBAAI,QAAQ,GAAI,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,cAAc,IAAI,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,KAAM,CAAC;;AAExG,mBAAK,QAAQ,CAAC;AACV,iCAAgB,EAAE,SAAS;AAC3B,kCAAiB,EAAE,QAAQ;AAC3B,sBAAK,EAAE,QAAQ;cAClB,CAAC,CAAC;UACN;;cAED,aAAa,GAAI,UAAC,KAAK,EAAM;AACzB,oBAAO,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;UAC9C;;cAED,YAAY,GAAI,UAAC,KAAK,EAAM;AACxB,oBAAO,KAAI,CAAC,IAAI,CAAC,KAAK,CAAC;eAAC;UAC3B;;cAED,UAAU,GAAI,UAAC,KAAK,EAAM;AACtB,oBAAQ,wBAAE,IAAI,CAAC,MAAK,KAAK,CAAC,cAAc,EAAE,UAAU,IAAI,EAAE;AACtD,qBAAI,OAAO,GAAI,IAAI,KAAK,KAAK,GAAI,IAAI,GAAG,EAAE,CAAC;AAC3C,wBAAO,OAAO;cACjB,CAAC,CAAC;UACN;;AAxJG,aAAI,CAAC,KAAK,GAAG;AACT,kBAAK,EAAG,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,IAAK,IAAI;AAC3D,kBAAK,EAAE,wBAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;AAClC,kBAAK,EAAE,KAAK;AACZ,kBAAK,EAAE,IAAI;AACX,yBAAY,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS;AACnC,yBAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY;AACrC,sBAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;AAC/B,6BAAgB,EAAE,KAAK;AACvB,iBAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;AACrB,0BAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa;AACvC,4BAAe,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe;AAC3C,2BAAc,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc;AACzC,2BAAc,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc;AACzC,6BAAgB,EAAE;AACd,yBAAQ,EAAE,KAAK;AACf,+BAAc,EAAE,KAAK;AACrB,wBAAO,EAAE,KAAK;AACd,sBAAK,EAAE,KAAK;AACZ,oBAAG,EAAE,KAAK;cACb;AACD,8BAAiB,EAAE,KAAK;UAC3B,CAAC;MACL;;kBA1BgB,KAAK;;gBA8Ef,mBAAG;AACN,iBAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;AACrB,qBAAI,wBAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;AACvE,yBAAI,CAAC,QAAQ,CAAC;AACV,8BAAK,EAAE,KAAK;AACZ,qCAAY,EAAE,IAAI;sBACrB,CAAC,CAAC;kBACN;cACJ;;AAED,oBAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;UAC3B;;;gBAuBc,2BAAG;AACd,iBAAI,CAAC,QAAQ,CAAC;AACV,6BAAY,EAAE,IAAI;cACrB,CAAC,CAAC;UACN;;;gBAEQ,qBAAG;AACR,iBAAI,CAAC,QAAQ,CAAC;AACV,6BAAY,EAAE,KAAK;AACnB,iCAAgB,EAAE,KAAK;cAC1B,CAAC,CAAC;UACN;;;;;gBAkCK,kBAAG;;AAEL,iBAAI,iBAAiB,GAAG,EAAE,CAAC;AACvB,8BAAa,EAAM,IAAI;AACvB,8BAAa,EAAM,IAAI,CAAC,KAAK,CAAC,KAAK;AACnC,8BAAa,EAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK;AACpC,8BAAa,EAAM,IAAI,CAAC,KAAK,CAAC,KAAK;AACnC,iCAAgB,EAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK;AACpC,gCAAe,EAAI,IAAI,CAAC,KAAK,CAAC,KAAK;AACnC,kCAAiB,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK;cACvC,CAAC,CAAC;;AAEH,iBAAI,SAAS,CAAC;;AAEd,iBAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;AACtB,0BAAS,GACL;AACJ,wBAAG,EAAC,mBAAmB;AACvB,4BAAO,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAiB;AACrC,yBAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAK;AACtB,0BAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAM;AACxB,8BAAS,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAiB;AACvC,0BAAK,EAAE,IAAI,CAAC,KAAK,CAAC,iBAAkB;AACpC,mCAAc,EAAE,IAAI,CAAC,KAAK,CAAC,cAAe;AAC1C,kCAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAc;AACxC,oCAAe,EAAE,IAAI,CAAC,KAAK,CAAC,eAAgB;AAC5C,mCAAc,EAAE,IAAI,CAAC,KAAK,CAAC,cAAe;mBACpC;cACT,CAAC;;AAEF,oBACQ;;mBAAK,SAAS,EAAE,iBAAkB;iBAElC;;uBAAO,SAAS,EAAC,aAAa,EAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAK;qBACxD;;2BAAM,SAAS,EAAC,YAAY;yBAAE,IAAI,CAAC,KAAK,CAAC,IAAI;sBAAQ;kBAC7C;iBAER,uDACA,IAAI,CAAC,KAAK;AACd,gCAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAY;AACpC,8BAAS,EAAC,OAAO;AACjB,uBAAE,EAAE,IAAI,CAAC,KAAK,CAAC,IAAK;AACpB,iCAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAa;AACtC,0BAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAM;AACxB,6BAAQ,EAAE,IAAI,CAAC,YAAa;AAC5B,4BAAO,EAAE,IAAI,CAAC,WAAY;AAC1B,2BAAM,EAAE,IAAI,CAAC,UAAW;AACxB,iCAAY,EAAC,KAAK;oBACZ;iBAEF;AACJ,4BAAO,EAAE,IAAI,CAAC,KAAK,CAAC,YAAa;AACjC,iCAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAa;mBAChC;iBAEF;;uBAAK,SAAS,EAAC,iBAAiB;qBAChC;;2BAAG,SAAS,EAAC,kBAAkB,EAAC,YAAY,EAAE,IAAI,CAAC,eAAgB;;yBAAE,sDAAM,IAAI,EAAC,cAAc,GAAE;;sBAAK;qBACrG;;2BAAG,SAAS,EAAC,kBAAkB;;yBAAE,sDAAM,IAAI,EAAC,aAAa,GAAE;;sBAAK;kBAC1D;iBAET,SAAS;cAEJ,CACR;UACL;;;YA7NgB,KAAK;IAAS,mBAAM,SAAS;;sBAA7B,KAAK;AA8NzB,EAAC;;;;;;;;;;;;;;;;;;;;;;;kCCvOgB,GAAO;;;;KAEJ,IAAI;aAAJ,IAAI;;YAAJ,IAAI;2BAAJ,IAAI;;gCAAJ,IAAI;;;gBAAJ,IAAI;;YAEjB,kBAAG;AACP,eAAO,IAAI,CAAC,KAAK,CAAC,IAAI;;AAEpB,cAAK,cAAc;AACjB,kBACE;;eAAK,OAAO,EAAC,WAAW;aACxB,2CAAM,CAAC,EAAC,uSAE2E,GAAE;YAC/E,CACP;;AAEH,cAAK,aAAa;AAChB,kBACE;;eAAK,OAAO,EAAC,WAAW;aACxB,2CAAM,CAAC,EAAC,qUAE8F,GAAE;YAClG,CACP;;AAEH,cAAK,oBAAoB;AACvB,kBACE;;eAAK,OAAO,EAAC,WAAW;aACtB,2CAAM,IAAI,EAAC,SAAS,EAAC,CAAC,EAAC,sEAAsE,GAAE;aAC/F,2CAAM,IAAI,EAAC,SAAS,EAAC,CAAC,EAAC,4MACoF,GAAE;YACzG,CACP;;AAEH,cAAK,QAAQ;AACX,kBACE;;eAAK,OAAO,EAAC,WAAW;aACxB,2CAAM,aAAU,SAAS,EAAC,aAAU,SAAS,EAAC,IAAI,EAAC,SAAS,EAAC,CAAC,EAAC,qjBAK5D,GAAE;YACC,CACP;AAAA,QACJ;MACF;;;UA5CkB,IAAI;IAAS,mBAAM,SAAS;;sBAA5B,IAAI;;;;;;;;;;;;;;;;;;;;;;;kCCFP,GAAO;;;;uCACX,GAAY;;;;2CACH,GAAiB;;;;AAExC,KAAI,EAAE,GAAG,4BAAW,IAAI,CAAC,EAAE,CAAC,CAAC;;KAER,UAAU;eAAV,UAAU;;AAChB,cADM,UAAU,CACf,KAAK,EAAE;+BADF,UAAU;;AAEvB,oCAFa,UAAU,6CAEjB,KAAK,EAAE;AACb,aAAI,CAAC,KAAK,GAAG;AACT,oBAAO,EAAE,kBAAkB;UAC9B,CAAC;MACL;;kBANgB,UAAU;;gBAQrB,kBAAG;AACL,iBAAI,UAAU,GAAG,EAAE,CAAC;AAChB,kCAAiB,EAAI,IAAI;AACzB,0BAAS,EAAY,IAAI,CAAC,KAAK,CAAC,OAAO;AACvC,4BAAW,EAAU,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO;cAC3C,CAAC,CAAC;;AAEH,oBACQ;;mBAAK,SAAS,EAAE,UAAW;iBACvB;;;qBAAO,IAAI,CAAC,KAAK,CAAC,YAAY;kBAAQ;cACpC,CACb;UACJ;;;YApBgB,UAAU;IAAS,mBAAM,SAAS;;sBAAlC,UAAU;;;;;;;ACN/B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,iBAAgB;;AAEhB;AACA;;AAEA,kBAAiB,sBAAsB;AACvC;AACA;;AAEA;;AAEA;AACA;AACA,KAAI;AACJ;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA,IAAG;AACH,GAAE;AACF;AACA;AACA,EAAC;;;;;;;;;;;;;;;;;;;;;;;kCC/CiB,GAAO;;;;uCACX,GAAY;;;;iCACT,GAAQ;;;;2CACF,GAAiB;;;;AAExC,KAAI,EAAE,GAAG,4BAAW,IAAI,CAAC,EAAE,CAAC,CAAC;;KAER,iBAAiB;eAAjB,iBAAiB;;AACvB,cADM,iBAAiB,CACtB,KAAK,EAAE;+BADF,iBAAiB;;AAE9B,oCAFa,iBAAiB,6CAExB,KAAK,EAAE;AACb,aAAI,CAAC,KAAK,GAAG;AACT,kBAAK,EAAE,IAAI;AACX,0BAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa;AACvC,4BAAe,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe;AAC3C,2BAAc,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc;AACzC,2BAAc,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc;AACzC,iBAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;UACxB;MACJ;;kBAXgB,iBAAiB;;gBAa5B,kBAAG;AACL,iBAAI,cAAc,GAAG,EAAE,CAAC;AACpB,qCAAoB,EAAI,IAAI;AAC5B,0BAAS,EAAe,IAAI,CAAC,KAAK,CAAC,OAAO;AAC1C,4BAAW,EAAa,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO;cAC9C,CAAC,CAAC;;AAEH,iBAAI,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,UAAS,IAAI,EAAE,CAAC,EAAE;AACjE,wBACQ;;uBAAM,GAAG,EAAE,CAAE,EAAC,SAAS,EAAC,UAAU;;qBAChC,IAAI;;kBACH,CACV;cACJ,CAAC,CAAC;;AAEH,iBAAI,cAAc,CAAC;;AAEnB,iBAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;AAClB,+BAAc,GACV;;uBAAI,SAAS,EAAC,uBAAuB;qBACpC,IAAI,CAAC,KAAK,CAAC,IAAI;;kBACf;cACR,MAAM;AACH,+BAAc,GACV;;uBAAI,SAAS,EAAC,yBAAyB;qBACtC,IAAI,CAAC,KAAK,CAAC,IAAI;;kBACf;cACR;;AAED,oBACQ;;mBAAK,SAAS,EAAE,cAAe;iBAC3B;;uBAAK,SAAS,EAAC,qBAAqB;qBACnC,cAAc;qBACf;;2BAAI,SAAS,EAAC,YAAY;yBACtB;;+BAAI,SAAS,EAAE,EAAE,CAAC,EAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAC,CAAE;6BACxD;;mCAAG,SAAS,EAAC,YAAY;;iCAAE,sDAAM,IAAI,EAAC,oBAAoB,GAAE;;8BAAK;6BACjE;;mCAAG,SAAS,EAAC,cAAc;;iCAAE,sDAAM,IAAI,EAAC,cAAc,GAAE;;8BAAK;6BAC7D;;mCAAM,SAAS,EAAC,eAAe;iCAAE,IAAI,CAAC,KAAK,CAAC,aAAa;;8BAA2B;0BACpF;yBAEL;;+BAAI,SAAS,EAAE,EAAE,CAAC,EAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,cAAc,EAAC,CAAE;6BAC9D;;mCAAG,SAAS,EAAC,YAAY;;iCAAE,sDAAM,IAAI,EAAC,oBAAoB,GAAE;;8BAAK;6BACjE;;mCAAG,SAAS,EAAC,cAAc;;iCAAE,sDAAM,IAAI,EAAC,cAAc,GAAE;;8BAAK;6BAC7D;;mCAAM,SAAS,EAAC,eAAe;;iCAAoB,IAAI,CAAC,KAAK,CAAC,eAAe;;8BAAuB;0BACpG;yBAEL;;+BAAI,SAAS,EAAE,EAAE,CAAC,EAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAC,CAAE;6BACvD;;mCAAG,SAAS,EAAC,YAAY;;iCAAE,sDAAM,IAAI,EAAC,oBAAoB,GAAE;;8BAAK;6BACjE;;mCAAG,SAAS,EAAC,cAAc;;iCAAE,sDAAM,IAAI,EAAC,cAAc,GAAE;;8BAAK;6BAC7D;;mCAAM,SAAS,EAAC,eAAe;;iCAAoB,IAAI,CAAC,KAAK,CAAC,cAAc;;8BAAe;0BAC3F;yBAEL;;+BAAI,SAAS,EAAE,EAAE,CAAC,EAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,EAAC,CAAE;6BACrD;;mCAAG,SAAS,EAAC,YAAY;;iCAAE,sDAAM,IAAI,EAAC,oBAAoB,GAAE;;8BAAK;6BACjE;;mCAAG,SAAS,EAAC,cAAc;;iCAAE,sDAAM,IAAI,EAAC,cAAc,GAAE;;8BAAK;6BAC7D;;mCAAM,SAAS,EAAC,eAAe;;iCAAW,cAAc;8BAAQ;0BAChE;sBACJ;kBACH;cACJ,CACL;UACJ;;;YA1EgB,iBAAiB;IAAS,mBAAM,SAAS;;sBAAzC,iBAAiB;;;;;;;;;;;;;;ACP/B,UAAS,gBAAgB,CAAC,QAAQ,EACzC;AACI,SAAI,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAChD,SAAI,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC5B,UAAK,IAAI,CAAC,GAAC,CAAC,EAAC,CAAC,GAAC,IAAI,CAAC,MAAM,EAAC,CAAC,EAAE,EAAE;AAC5B,aAAI,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC9B,aAAG,IAAI,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAC;AAAC,oBAAO,IAAI,CAAC,CAAC,CAAC,CAAC;UAAC;MAC3C;AACD,YAAO,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;kCCRG,GAAO;;;;uCACX,GAAY;;;;mCACZ,GAAQ;;;;4CACJ,GAAoB;;;;2CACrB,GAAmB;;;;iDACb,GAAyB;;;;4CACjB,GAAoB;;KAEtC,iBAAiB;eAAjB,iBAAiB;;AACf,cADF,iBAAiB,CACd,KAAK,EAAE;;;+BADV,iBAAiB;;AAEtB,oCAFK,iBAAiB,6CAEhB,KAAK,EAAE;;cAWjB,mBAAmB,GAAG,UAAC,KAAK,EAAM;AAC9B,iBAAI,CAAC,wBAAE,OAAO,CAAC,MAAK,KAAK,CAAC,eAAe,CAAC,EAAE;AACxC,uBAAK,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;cACvC,CAAC;AACF,mBAAK,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC;AACtC,mBAAK,QAAQ,CAAC;AACV,yBAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK;cAC/B,CAAC,CAAC;UACN;;cAED,0BAA0B,GAAG,UAAC,KAAK,EAAM;AACrC,mBAAK,QAAQ,CAAC;AACV,gCAAe,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK;cACtC,CAAC,CAAC;UACN;;cAED,eAAe,GAAG,UAAC,KAAK,EAAM;AAC1B,kBAAK,CAAC,cAAc,EAAE,CAAC;;AAEvB,iBAAI,UAAU,GAAG,MAAK,aAAa,CAAC,MAAK,KAAK,CAAC,KAAK,CAAC,IAC1C,MAAK,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,IAC5B,MAAK,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;;AAE/C,iBAAI,UAAU,EAAE;;AACZ,yBAAI,IAAI,GAAG;AACP,8BAAK,EAAE,MAAK,KAAK,CAAC,KAAK;AACvB,iCAAQ,EAAE,MAAK,KAAK,CAAC,QAAQ;sBAChC;yBAAE,IAAI,QAAO;yBAAE,OAAO,aAAC;;AAGxB,yCAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,UAAS,MAAM,EAAE;AAC7C,6BAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC7B,6BAAI,GAAG,CAAC,CAAC,EAAE;AACP,iCAAI,CAAC,QAAQ,CAAC;AACV,6CAAY,EAAE,IAAI;AAClB,6CAAY,EAAE,GAAG,CAAC,OAAO;8BAC5B,CAAC,CAAC;0BACN,MAAM;AACH,iCAAI,IAAI,GAAG,kBAAkB,CAAC,uCAAiB,UAAU,CAAC,CAAC,CAAC;AAC5D,mCAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;0BAC1B;sBACJ,CAAC,CAAC;;cACN,MAAM;AACH,uBAAK,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;AAC1B,uBAAK,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;AAC7B,uBAAK,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;cACvC;UACJ;;cAED,mBAAmB,GAAG,UAAC,KAAK,EAAM;AAC9B,oBAAQ,KAAK,IAAI,MAAK,KAAK,CAAC,QAAQ,CAAE;UACzC;;cAED,gBAAgB,GAAG,UAAC,KAAK,EAAM;AAC3B,mBAAK,QAAQ,CAAC;AACV,sBAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK;cAC5B,CAAC,CAAC;UACN;;cAED,aAAa,GAAG,UAAC,KAAK,EAAM;;AAExB,iBAAI,EAAE,GAAG,2JAA2J,CAAC;AACrK,oBAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;UACzB;;cAED,OAAO,GAAG,UAAC,KAAK,EAAM;AAClB,oBAAO,CAAC,wBAAE,OAAO,CAAC,KAAK,CAAC,CAAC;UAC5B;;cAED,iBAAiB,GAAG,UAAC,KAAK,EAAM;AAC5B,mBAAK,QAAQ,CAAC;AACV,4BAAW,EAAE,KAAK;cACrB,CAAC,CAAC;UACN;;AAnFG,aAAI,CAAC,KAAK,GAAG;AACT,kBAAK,EAAE,IAAI;AACX,qBAAQ,EAAE,IAAI;AACd,4BAAe,EAAE,IAAI;AACrB,2BAAc,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC;AAChD,yBAAY,EAAE,KAAK;AACnB,yBAAY,EAAE,cAAc;UAC/B,CAAC;MACL;;kBAXQ,iBAAiB;;gBAwFpB,kBAAG;AACL,oBACQ;;mBAAK,SAAS,EAAC,uBAAuB;iBAClC;;uBAAK,SAAS,EAAC,qBAAqB;qBAChC;;;;sBAAc;qBACd;;;;sBAAgB;qBACxB;;2BAAM,QAAQ,EAAE,IAAI,CAAC,eAAgB;yBAEjC;AACI,iCAAI,EAAC,MAAM;AACX,gCAAG,EAAC,OAAO;AACX,iCAAI,EAAC,MAAM;AACX,yCAAY,EAAE,IAAI,CAAC,KAAK,CAAC,KAAM;AAC/B,qCAAQ,EAAE,IAAI,CAAC,aAAc;AAC7B,kCAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAM;AACxB,qCAAQ,EAAE,IAAI,CAAC,gBAAiB;AAChC,yCAAY,EAAC,WAAW;AACxB,yCAAY,EAAC,WAAW;AACxB,yCAAY,EAAE,IAAI,CAAC,KAAK,CAAC,cAAe;2BAC1C;yBAEF;AACI,iCAAI,EAAC,IAAI;AACT,iCAAI,EAAC,UAAU;AACf,gCAAG,EAAC,UAAU;AACd,sCAAS,EAAC,MAAM;AAChB,0CAAa,EAAC,GAAG;AACjB,4CAAe,EAAC,GAAG;AACnB,2CAAc,EAAC,GAAG;AAClB,2CAAc,EAAE,IAAI,CAAC,KAAK,CAAC,cAAe;AAC1C,kCAAK,EAAE,IAAI,CAAC,KAAK,CAAC,SAAU;AAC5B,yCAAY,EAAC,QAAQ;AACrB,qCAAQ,EAAE,IAAI,CAAC,mBAAoB;2BACrC;yBAEF;AACI,iCAAI,EAAC,MAAM;AACX,gCAAG,EAAC,iBAAiB;AACrB,iCAAI,EAAC,UAAU;AACf,qCAAQ,EAAE,IAAI,CAAC,mBAAoB;AACnC,kCAAK,EAAE,IAAI,CAAC,KAAK,CAAC,eAAgB;AAClC,qCAAQ,EAAE,IAAI,CAAC,0BAA2B;AAC1C,yCAAY,EAAC,OAAO;AACpB,yCAAY,EAAC,iBAAiB;2BAChC;yBAEF;AACI,oCAAO,EAAE,IAAI,CAAC,KAAK,CAAC,YAAa;AACjC,yCAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAa;2BACxC;yBAEF;;;AACI,qCAAI,EAAC,QAAQ;AACb,0CAAS,EAAC,oBAAoB;;0BAEzB;sBACR;kBACL;cACJ,CACF;UACL;;;YApJQ,iBAAiB;IAAS,mBAAM,SAAS;;;;KAuJjC,QAAQ;eAAR,QAAQ;;cAAR,QAAQ;+BAAR,QAAQ;;oCAAR,QAAQ;;;kBAAR,QAAQ;;gBACnB,kBAAG;AACL,oBACQ;;mBAAK,SAAS,EAAC,qBAAqB;iBAChC;;uBAAK,SAAS,EAAC,0BAA0B;qBACrC,iCAAC,iBAAiB,OAAE;kBAClB;cACJ,CACZ;UACL;;;YATgB,QAAQ;IAAS,mBAAM,SAAS;;sBAAhC,QAAQ,C","file":"register.js","sourcesContent":["import ReactDOM from 'react-dom';\nimport React from 'react';\nimport Register from './signup';\n\nReactDOM.render(<Register/>, document.getElementById('main'));\n\n\n\n/** WEBPACK FOOTER **\n ** ./hub/static/jsx/register.jsx\n **/","'use strict';\n\nmodule.exports = require('react/lib/ReactDOM');\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react-dom/index.js\n ** module id = 1\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactDOM\n */\n\n/* globals __REACT_DEVTOOLS_GLOBAL_HOOK__*/\n\n'use strict';\n\nvar ReactCurrentOwner = require('./ReactCurrentOwner');\nvar ReactDOMTextComponent = require('./ReactDOMTextComponent');\nvar ReactDefaultInjection = require('./ReactDefaultInjection');\nvar ReactInstanceHandles = require('./ReactInstanceHandles');\nvar ReactMount = require('./ReactMount');\nvar ReactPerf = require('./ReactPerf');\nvar ReactReconciler = require('./ReactReconciler');\nvar ReactUpdates = require('./ReactUpdates');\nvar ReactVersion = require('./ReactVersion');\n\nvar findDOMNode = require('./findDOMNode');\nvar renderSubtreeIntoContainer = require('./renderSubtreeIntoContainer');\nvar warning = require('fbjs/lib/warning');\n\nReactDefaultInjection.inject();\n\nvar render = ReactPerf.measure('React', 'render', ReactMount.render);\n\nvar React = {\n findDOMNode: findDOMNode,\n render: render,\n unmountComponentAtNode: ReactMount.unmountComponentAtNode,\n version: ReactVersion,\n\n /* eslint-disable camelcase */\n unstable_batchedUpdates: ReactUpdates.batchedUpdates,\n unstable_renderSubtreeIntoContainer: renderSubtreeIntoContainer\n};\n\n// Inject the runtime into a devtools global hook regardless of browser.\n// Allows for debugging when the hook is injected on the page.\n/* eslint-enable camelcase */\nif (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.inject === 'function') {\n __REACT_DEVTOOLS_GLOBAL_HOOK__.inject({\n CurrentOwner: ReactCurrentOwner,\n InstanceHandles: ReactInstanceHandles,\n Mount: ReactMount,\n Reconciler: ReactReconciler,\n TextComponent: ReactDOMTextComponent\n });\n}\n\nif (process.env.NODE_ENV !== 'production') {\n var ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');\n if (ExecutionEnvironment.canUseDOM && window.top === window.self) {\n\n // First check if devtools is not installed\n if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined') {\n // If we're in Chrome or Firefox, provide a download link if not installed.\n if (navigator.userAgent.indexOf('Chrome') > -1 && navigator.userAgent.indexOf('Edge') === -1 || navigator.userAgent.indexOf('Firefox') > -1) {\n console.debug('Download the React DevTools for a better development experience: ' + 'https://fb.me/react-devtools');\n }\n }\n\n // If we're in IE8, check to see if we are in compatibility mode and provide\n // information on preventing compatibility mode\n var ieCompatibilityMode = document.documentMode && document.documentMode < 8;\n\n process.env.NODE_ENV !== 'production' ? warning(!ieCompatibilityMode, 'Internet Explorer is running in compatibility mode; please add the ' + 'following tag to your HTML to prevent this from happening: ' + '<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />') : undefined;\n\n var expectedFeatures = [\n // shims\n Array.isArray, Array.prototype.every, Array.prototype.forEach, Array.prototype.indexOf, Array.prototype.map, Date.now, Function.prototype.bind, Object.keys, String.prototype.split, String.prototype.trim,\n\n // shams\n Object.create, Object.freeze];\n\n for (var i = 0; i < expectedFeatures.length; i++) {\n if (!expectedFeatures[i]) {\n console.error('One or more ES5 shim/shams expected by React are not available: ' + 'https://fb.me/react-warning-polyfills');\n break;\n }\n }\n }\n}\n\nmodule.exports = React;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactDOM.js\n ** module id = 2\n ** module chunks = 0 1\n **/","// shim for using process in browser\n\nvar process = module.exports = {};\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = setTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n clearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n setTimeout(drainQueue, 0);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** (webpack)/~/node-libs-browser/~/process/browser.js\n ** module id = 3\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactCurrentOwner\n */\n\n'use strict';\n\n/**\n * Keeps track of the current owner.\n *\n * The current owner is the component who should own any components that are\n * currently being constructed.\n */\nvar ReactCurrentOwner = {\n\n /**\n * @internal\n * @type {ReactComponent}\n */\n current: null\n\n};\n\nmodule.exports = ReactCurrentOwner;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactCurrentOwner.js\n ** module id = 4\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactDOMTextComponent\n * @typechecks static-only\n */\n\n'use strict';\n\nvar DOMChildrenOperations = require('./DOMChildrenOperations');\nvar DOMPropertyOperations = require('./DOMPropertyOperations');\nvar ReactComponentBrowserEnvironment = require('./ReactComponentBrowserEnvironment');\nvar ReactMount = require('./ReactMount');\n\nvar assign = require('./Object.assign');\nvar escapeTextContentForBrowser = require('./escapeTextContentForBrowser');\nvar setTextContent = require('./setTextContent');\nvar validateDOMNesting = require('./validateDOMNesting');\n\n/**\n * Text nodes violate a couple assumptions that React makes about components:\n *\n * - When mounting text into the DOM, adjacent text nodes are merged.\n * - Text nodes cannot be assigned a React root ID.\n *\n * This component is used to wrap strings in elements so that they can undergo\n * the same reconciliation that is applied to elements.\n *\n * TODO: Investigate representing React components in the DOM with text nodes.\n *\n * @class ReactDOMTextComponent\n * @extends ReactComponent\n * @internal\n */\nvar ReactDOMTextComponent = function (props) {\n // This constructor and its argument is currently used by mocks.\n};\n\nassign(ReactDOMTextComponent.prototype, {\n\n /**\n * @param {ReactText} text\n * @internal\n */\n construct: function (text) {\n // TODO: This is really a ReactText (ReactNode), not a ReactElement\n this._currentElement = text;\n this._stringText = '' + text;\n\n // Properties\n this._rootNodeID = null;\n this._mountIndex = 0;\n },\n\n /**\n * Creates the markup for this text node. This node is not intended to have\n * any features besides containing text content.\n *\n * @param {string} rootID DOM ID of the root node.\n * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction\n * @return {string} Markup for this text node.\n * @internal\n */\n mountComponent: function (rootID, transaction, context) {\n if (process.env.NODE_ENV !== 'production') {\n if (context[validateDOMNesting.ancestorInfoContextKey]) {\n validateDOMNesting('span', null, context[validateDOMNesting.ancestorInfoContextKey]);\n }\n }\n\n this._rootNodeID = rootID;\n if (transaction.useCreateElement) {\n var ownerDocument = context[ReactMount.ownerDocumentContextKey];\n var el = ownerDocument.createElement('span');\n DOMPropertyOperations.setAttributeForID(el, rootID);\n // Populate node cache\n ReactMount.getID(el);\n setTextContent(el, this._stringText);\n return el;\n } else {\n var escapedText = escapeTextContentForBrowser(this._stringText);\n\n if (transaction.renderToStaticMarkup) {\n // Normally we'd wrap this in a `span` for the reasons stated above, but\n // since this is a situation where React won't take over (static pages),\n // we can simply return the text as it is.\n return escapedText;\n }\n\n return '<span ' + DOMPropertyOperations.createMarkupForID(rootID) + '>' + escapedText + '</span>';\n }\n },\n\n /**\n * Updates this component by updating the text content.\n *\n * @param {ReactText} nextText The next text content\n * @param {ReactReconcileTransaction} transaction\n * @internal\n */\n receiveComponent: function (nextText, transaction) {\n if (nextText !== this._currentElement) {\n this._currentElement = nextText;\n var nextStringText = '' + nextText;\n if (nextStringText !== this._stringText) {\n // TODO: Save this as pending props and use performUpdateIfNecessary\n // and/or updateComponent to do the actual update for consistency with\n // other component types?\n this._stringText = nextStringText;\n var node = ReactMount.getNode(this._rootNodeID);\n DOMChildrenOperations.updateTextContent(node, nextStringText);\n }\n }\n },\n\n unmountComponent: function () {\n ReactComponentBrowserEnvironment.unmountIDFromEnvironment(this._rootNodeID);\n }\n\n});\n\nmodule.exports = ReactDOMTextComponent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactDOMTextComponent.js\n ** module id = 5\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule DOMChildrenOperations\n * @typechecks static-only\n */\n\n'use strict';\n\nvar Danger = require('./Danger');\nvar ReactMultiChildUpdateTypes = require('./ReactMultiChildUpdateTypes');\nvar ReactPerf = require('./ReactPerf');\n\nvar setInnerHTML = require('./setInnerHTML');\nvar setTextContent = require('./setTextContent');\nvar invariant = require('fbjs/lib/invariant');\n\n/**\n * Inserts `childNode` as a child of `parentNode` at the `index`.\n *\n * @param {DOMElement} parentNode Parent node in which to insert.\n * @param {DOMElement} childNode Child node to insert.\n * @param {number} index Index at which to insert the child.\n * @internal\n */\nfunction insertChildAt(parentNode, childNode, index) {\n // By exploiting arrays returning `undefined` for an undefined index, we can\n // rely exclusively on `insertBefore(node, null)` instead of also using\n // `appendChild(node)`. However, using `undefined` is not allowed by all\n // browsers so we must replace it with `null`.\n\n // fix render order error in safari\n // IE8 will throw error when index out of list size.\n var beforeChild = index >= parentNode.childNodes.length ? null : parentNode.childNodes.item(index);\n\n parentNode.insertBefore(childNode, beforeChild);\n}\n\n/**\n * Operations for updating with DOM children.\n */\nvar DOMChildrenOperations = {\n\n dangerouslyReplaceNodeWithMarkup: Danger.dangerouslyReplaceNodeWithMarkup,\n\n updateTextContent: setTextContent,\n\n /**\n * Updates a component's children by processing a series of updates. The\n * update configurations are each expected to have a `parentNode` property.\n *\n * @param {array<object>} updates List of update configurations.\n * @param {array<string>} markupList List of markup strings.\n * @internal\n */\n processUpdates: function (updates, markupList) {\n var update;\n // Mapping from parent IDs to initial child orderings.\n var initialChildren = null;\n // List of children that will be moved or removed.\n var updatedChildren = null;\n\n for (var i = 0; i < updates.length; i++) {\n update = updates[i];\n if (update.type === ReactMultiChildUpdateTypes.MOVE_EXISTING || update.type === ReactMultiChildUpdateTypes.REMOVE_NODE) {\n var updatedIndex = update.fromIndex;\n var updatedChild = update.parentNode.childNodes[updatedIndex];\n var parentID = update.parentID;\n\n !updatedChild ? process.env.NODE_ENV !== 'production' ? invariant(false, 'processUpdates(): Unable to find child %s of element. This ' + 'probably means the DOM was unexpectedly mutated (e.g., by the ' + 'browser), usually due to forgetting a <tbody> when using tables, ' + 'nesting tags like <form>, <p>, or <a>, or using non-SVG elements ' + 'in an <svg> parent. Try inspecting the child nodes of the element ' + 'with React ID `%s`.', updatedIndex, parentID) : invariant(false) : undefined;\n\n initialChildren = initialChildren || {};\n initialChildren[parentID] = initialChildren[parentID] || [];\n initialChildren[parentID][updatedIndex] = updatedChild;\n\n updatedChildren = updatedChildren || [];\n updatedChildren.push(updatedChild);\n }\n }\n\n var renderedMarkup;\n // markupList is either a list of markup or just a list of elements\n if (markupList.length && typeof markupList[0] === 'string') {\n renderedMarkup = Danger.dangerouslyRenderMarkup(markupList);\n } else {\n renderedMarkup = markupList;\n }\n\n // Remove updated children first so that `toIndex` is consistent.\n if (updatedChildren) {\n for (var j = 0; j < updatedChildren.length; j++) {\n updatedChildren[j].parentNode.removeChild(updatedChildren[j]);\n }\n }\n\n for (var k = 0; k < updates.length; k++) {\n update = updates[k];\n switch (update.type) {\n case ReactMultiChildUpdateTypes.INSERT_MARKUP:\n insertChildAt(update.parentNode, renderedMarkup[update.markupIndex], update.toIndex);\n break;\n case ReactMultiChildUpdateTypes.MOVE_EXISTING:\n insertChildAt(update.parentNode, initialChildren[update.parentID][update.fromIndex], update.toIndex);\n break;\n case ReactMultiChildUpdateTypes.SET_MARKUP:\n setInnerHTML(update.parentNode, update.content);\n break;\n case ReactMultiChildUpdateTypes.TEXT_CONTENT:\n setTextContent(update.parentNode, update.content);\n break;\n case ReactMultiChildUpdateTypes.REMOVE_NODE:\n // Already removed by the for-loop above.\n break;\n }\n }\n }\n\n};\n\nReactPerf.measureMethods(DOMChildrenOperations, 'DOMChildrenOperations', {\n updateTextContent: 'updateTextContent'\n});\n\nmodule.exports = DOMChildrenOperations;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/DOMChildrenOperations.js\n ** module id = 6\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule Danger\n * @typechecks static-only\n */\n\n'use strict';\n\nvar ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');\n\nvar createNodesFromMarkup = require('fbjs/lib/createNodesFromMarkup');\nvar emptyFunction = require('fbjs/lib/emptyFunction');\nvar getMarkupWrap = require('fbjs/lib/getMarkupWrap');\nvar invariant = require('fbjs/lib/invariant');\n\nvar OPEN_TAG_NAME_EXP = /^(<[^ \\/>]+)/;\nvar RESULT_INDEX_ATTR = 'data-danger-index';\n\n/**\n * Extracts the `nodeName` from a string of markup.\n *\n * NOTE: Extracting the `nodeName` does not require a regular expression match\n * because we make assumptions about React-generated markup (i.e. there are no\n * spaces surrounding the opening tag and there is at least one attribute).\n *\n * @param {string} markup String of markup.\n * @return {string} Node name of the supplied markup.\n * @see http://jsperf.com/extract-nodename\n */\nfunction getNodeName(markup) {\n return markup.substring(1, markup.indexOf(' '));\n}\n\nvar Danger = {\n\n /**\n * Renders markup into an array of nodes. The markup is expected to render\n * into a list of root nodes. Also, the length of `resultList` and\n * `markupList` should be the same.\n *\n * @param {array<string>} markupList List of markup strings to render.\n * @return {array<DOMElement>} List of rendered nodes.\n * @internal\n */\n dangerouslyRenderMarkup: function (markupList) {\n !ExecutionEnvironment.canUseDOM ? process.env.NODE_ENV !== 'production' ? invariant(false, 'dangerouslyRenderMarkup(...): Cannot render markup in a worker ' + 'thread. Make sure `window` and `document` are available globally ' + 'before requiring React when unit testing or use ' + 'ReactDOMServer.renderToString for server rendering.') : invariant(false) : undefined;\n var nodeName;\n var markupByNodeName = {};\n // Group markup by `nodeName` if a wrap is necessary, else by '*'.\n for (var i = 0; i < markupList.length; i++) {\n !markupList[i] ? process.env.NODE_ENV !== 'production' ? invariant(false, 'dangerouslyRenderMarkup(...): Missing markup.') : invariant(false) : undefined;\n nodeName = getNodeName(markupList[i]);\n nodeName = getMarkupWrap(nodeName) ? nodeName : '*';\n markupByNodeName[nodeName] = markupByNodeName[nodeName] || [];\n markupByNodeName[nodeName][i] = markupList[i];\n }\n var resultList = [];\n var resultListAssignmentCount = 0;\n for (nodeName in markupByNodeName) {\n if (!markupByNodeName.hasOwnProperty(nodeName)) {\n continue;\n }\n var markupListByNodeName = markupByNodeName[nodeName];\n\n // This for-in loop skips the holes of the sparse array. The order of\n // iteration should follow the order of assignment, which happens to match\n // numerical index order, but we don't rely on that.\n var resultIndex;\n for (resultIndex in markupListByNodeName) {\n if (markupListByNodeName.hasOwnProperty(resultIndex)) {\n var markup = markupListByNodeName[resultIndex];\n\n // Push the requested markup with an additional RESULT_INDEX_ATTR\n // attribute. If the markup does not start with a < character, it\n // will be discarded below (with an appropriate console.error).\n markupListByNodeName[resultIndex] = markup.replace(OPEN_TAG_NAME_EXP,\n // This index will be parsed back out below.\n '$1 ' + RESULT_INDEX_ATTR + '=\"' + resultIndex + '\" ');\n }\n }\n\n // Render each group of markup with similar wrapping `nodeName`.\n var renderNodes = createNodesFromMarkup(markupListByNodeName.join(''), emptyFunction // Do nothing special with <script> tags.\n );\n\n for (var j = 0; j < renderNodes.length; ++j) {\n var renderNode = renderNodes[j];\n if (renderNode.hasAttribute && renderNode.hasAttribute(RESULT_INDEX_ATTR)) {\n\n resultIndex = +renderNode.getAttribute(RESULT_INDEX_ATTR);\n renderNode.removeAttribute(RESULT_INDEX_ATTR);\n\n !!resultList.hasOwnProperty(resultIndex) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Danger: Assigning to an already-occupied result index.') : invariant(false) : undefined;\n\n resultList[resultIndex] = renderNode;\n\n // This should match resultList.length and markupList.length when\n // we're done.\n resultListAssignmentCount += 1;\n } else if (process.env.NODE_ENV !== 'production') {\n console.error('Danger: Discarding unexpected node:', renderNode);\n }\n }\n }\n\n // Although resultList was populated out of order, it should now be a dense\n // array.\n !(resultListAssignmentCount === resultList.length) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Danger: Did not assign to every index of resultList.') : invariant(false) : undefined;\n\n !(resultList.length === markupList.length) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Danger: Expected markup to render %s nodes, but rendered %s.', markupList.length, resultList.length) : invariant(false) : undefined;\n\n return resultList;\n },\n\n /**\n * Replaces a node with a string of markup at its current position within its\n * parent. The markup must render into a single root node.\n *\n * @param {DOMElement} oldChild Child node to replace.\n * @param {string} markup Markup to render in place of the child node.\n * @internal\n */\n dangerouslyReplaceNodeWithMarkup: function (oldChild, markup) {\n !ExecutionEnvironment.canUseDOM ? process.env.NODE_ENV !== 'production' ? invariant(false, 'dangerouslyReplaceNodeWithMarkup(...): Cannot render markup in a ' + 'worker thread. Make sure `window` and `document` are available ' + 'globally before requiring React when unit testing or use ' + 'ReactDOMServer.renderToString() for server rendering.') : invariant(false) : undefined;\n !markup ? process.env.NODE_ENV !== 'production' ? invariant(false, 'dangerouslyReplaceNodeWithMarkup(...): Missing markup.') : invariant(false) : undefined;\n !(oldChild.tagName.toLowerCase() !== 'html') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'dangerouslyReplaceNodeWithMarkup(...): Cannot replace markup of the ' + '<html> node. This is because browser quirks make this unreliable ' + 'and/or slow. If you want to render to the root you must use ' + 'server rendering. See ReactDOMServer.renderToString().') : invariant(false) : undefined;\n\n var newChild;\n if (typeof markup === 'string') {\n newChild = createNodesFromMarkup(markup, emptyFunction)[0];\n } else {\n newChild = markup;\n }\n oldChild.parentNode.replaceChild(newChild, oldChild);\n }\n\n};\n\nmodule.exports = Danger;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/Danger.js\n ** module id = 7\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ExecutionEnvironment\n */\n\n'use strict';\n\nvar canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);\n\n/**\n * Simple, lightweight module assisting with the detection and context of\n * Worker. Helps avoid circular dependencies and allows code to reason about\n * whether or not they are in a Worker, even if they never include the main\n * `ReactWorker` dependency.\n */\nvar ExecutionEnvironment = {\n\n canUseDOM: canUseDOM,\n\n canUseWorkers: typeof Worker !== 'undefined',\n\n canUseEventListeners: canUseDOM && !!(window.addEventListener || window.attachEvent),\n\n canUseViewport: canUseDOM && !!window.screen,\n\n isInWorker: !canUseDOM // For now, this is true - might change in the future.\n\n};\n\nmodule.exports = ExecutionEnvironment;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/ExecutionEnvironment.js\n ** module id = 8\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule createNodesFromMarkup\n * @typechecks\n */\n\n/*eslint-disable fb-www/unsafe-html*/\n\n'use strict';\n\nvar ExecutionEnvironment = require('./ExecutionEnvironment');\n\nvar createArrayFromMixed = require('./createArrayFromMixed');\nvar getMarkupWrap = require('./getMarkupWrap');\nvar invariant = require('./invariant');\n\n/**\n * Dummy container used to render all markup.\n */\nvar dummyNode = ExecutionEnvironment.canUseDOM ? document.createElement('div') : null;\n\n/**\n * Pattern used by `getNodeName`.\n */\nvar nodeNamePattern = /^\\s*<(\\w+)/;\n\n/**\n * Extracts the `nodeName` of the first element in a string of markup.\n *\n * @param {string} markup String of markup.\n * @return {?string} Node name of the supplied markup.\n */\nfunction getNodeName(markup) {\n var nodeNameMatch = markup.match(nodeNamePattern);\n return nodeNameMatch && nodeNameMatch[1].toLowerCase();\n}\n\n/**\n * Creates an array containing the nodes rendered from the supplied markup. The\n * optionally supplied `handleScript` function will be invoked once for each\n * <script> element that is rendered. If no `handleScript` function is supplied,\n * an exception is thrown if any <script> elements are rendered.\n *\n * @param {string} markup A string of valid HTML markup.\n * @param {?function} handleScript Invoked once for each rendered <script>.\n * @return {array<DOMElement|DOMTextNode>} An array of rendered nodes.\n */\nfunction createNodesFromMarkup(markup, handleScript) {\n var node = dummyNode;\n !!!dummyNode ? process.env.NODE_ENV !== 'production' ? invariant(false, 'createNodesFromMarkup dummy not initialized') : invariant(false) : undefined;\n var nodeName = getNodeName(markup);\n\n var wrap = nodeName && getMarkupWrap(nodeName);\n if (wrap) {\n node.innerHTML = wrap[1] + markup + wrap[2];\n\n var wrapDepth = wrap[0];\n while (wrapDepth--) {\n node = node.lastChild;\n }\n } else {\n node.innerHTML = markup;\n }\n\n var scripts = node.getElementsByTagName('script');\n if (scripts.length) {\n !handleScript ? process.env.NODE_ENV !== 'production' ? invariant(false, 'createNodesFromMarkup(...): Unexpected <script> element rendered.') : invariant(false) : undefined;\n createArrayFromMixed(scripts).forEach(handleScript);\n }\n\n var nodes = createArrayFromMixed(node.childNodes);\n while (node.lastChild) {\n node.removeChild(node.lastChild);\n }\n return nodes;\n}\n\nmodule.exports = createNodesFromMarkup;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/createNodesFromMarkup.js\n ** module id = 9\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule createArrayFromMixed\n * @typechecks\n */\n\n'use strict';\n\nvar toArray = require('./toArray');\n\n/**\n * Perform a heuristic test to determine if an object is \"array-like\".\n *\n * A monk asked Joshu, a Zen master, \"Has a dog Buddha nature?\"\n * Joshu replied: \"Mu.\"\n *\n * This function determines if its argument has \"array nature\": it returns\n * true if the argument is an actual array, an `arguments' object, or an\n * HTMLCollection (e.g. node.childNodes or node.getElementsByTagName()).\n *\n * It will return false for other array-like objects like Filelist.\n *\n * @param {*} obj\n * @return {boolean}\n */\nfunction hasArrayNature(obj) {\n return(\n // not null/false\n !!obj && (\n // arrays are objects, NodeLists are functions in Safari\n typeof obj == 'object' || typeof obj == 'function') &&\n // quacks like an array\n 'length' in obj &&\n // not window\n !('setInterval' in obj) &&\n // no DOM node should be considered an array-like\n // a 'select' element has 'length' and 'item' properties on IE8\n typeof obj.nodeType != 'number' && (\n // a real array\n Array.isArray(obj) ||\n // arguments\n 'callee' in obj ||\n // HTMLCollection/NodeList\n 'item' in obj)\n );\n}\n\n/**\n * Ensure that the argument is an array by wrapping it in an array if it is not.\n * Creates a copy of the argument if it is already an array.\n *\n * This is mostly useful idiomatically:\n *\n * var createArrayFromMixed = require('createArrayFromMixed');\n *\n * function takesOneOrMoreThings(things) {\n * things = createArrayFromMixed(things);\n * ...\n * }\n *\n * This allows you to treat `things' as an array, but accept scalars in the API.\n *\n * If you need to convert an array-like object, like `arguments`, into an array\n * use toArray instead.\n *\n * @param {*} obj\n * @return {array}\n */\nfunction createArrayFromMixed(obj) {\n if (!hasArrayNature(obj)) {\n return [obj];\n } else if (Array.isArray(obj)) {\n return obj.slice();\n } else {\n return toArray(obj);\n }\n}\n\nmodule.exports = createArrayFromMixed;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/createArrayFromMixed.js\n ** module id = 10\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule toArray\n * @typechecks\n */\n\n'use strict';\n\nvar invariant = require('./invariant');\n\n/**\n * Convert array-like objects to arrays.\n *\n * This API assumes the caller knows the contents of the data type. For less\n * well defined inputs use createArrayFromMixed.\n *\n * @param {object|function|filelist} obj\n * @return {array}\n */\nfunction toArray(obj) {\n var length = obj.length;\n\n // Some browse builtin objects can report typeof 'function' (e.g. NodeList in\n // old versions of Safari).\n !(!Array.isArray(obj) && (typeof obj === 'object' || typeof obj === 'function')) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'toArray: Array-like object expected') : invariant(false) : undefined;\n\n !(typeof length === 'number') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'toArray: Object needs a length property') : invariant(false) : undefined;\n\n !(length === 0 || length - 1 in obj) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'toArray: Object should have keys for indices') : invariant(false) : undefined;\n\n // Old IE doesn't give collections access to hasOwnProperty. Assume inputs\n // without method will throw during the slice call and skip straight to the\n // fallback.\n if (obj.hasOwnProperty) {\n try {\n return Array.prototype.slice.call(obj);\n } catch (e) {\n // IE < 9 does not support Array#slice on collections objects\n }\n }\n\n // Fall back to copying key by key. This assumes all keys have a value,\n // so will not preserve sparsely populated inputs.\n var ret = Array(length);\n for (var ii = 0; ii < length; ii++) {\n ret[ii] = obj[ii];\n }\n return ret;\n}\n\nmodule.exports = toArray;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/toArray.js\n ** module id = 11\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule invariant\n */\n\n'use strict';\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar invariant = function (condition, format, a, b, c, d, e, f) {\n if (process.env.NODE_ENV !== 'production') {\n if (format === undefined) {\n throw new Error('invariant requires an error message argument');\n }\n }\n\n if (!condition) {\n var error;\n if (format === undefined) {\n error = new Error('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.');\n } else {\n var args = [a, b, c, d, e, f];\n var argIndex = 0;\n error = new Error('Invariant Violation: ' + format.replace(/%s/g, function () {\n return args[argIndex++];\n }));\n }\n\n error.framesToPop = 1; // we don't care about invariant's own frame\n throw error;\n }\n};\n\nmodule.exports = invariant;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/invariant.js\n ** module id = 12\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule getMarkupWrap\n */\n\n/*eslint-disable fb-www/unsafe-html */\n\n'use strict';\n\nvar ExecutionEnvironment = require('./ExecutionEnvironment');\n\nvar invariant = require('./invariant');\n\n/**\n * Dummy container used to detect which wraps are necessary.\n */\nvar dummyNode = ExecutionEnvironment.canUseDOM ? document.createElement('div') : null;\n\n/**\n * Some browsers cannot use `innerHTML` to render certain elements standalone,\n * so we wrap them, render the wrapped nodes, then extract the desired node.\n *\n * In IE8, certain elements cannot render alone, so wrap all elements ('*').\n */\n\nvar shouldWrap = {};\n\nvar selectWrap = [1, '<select multiple=\"true\">', '</select>'];\nvar tableWrap = [1, '<table>', '</table>'];\nvar trWrap = [3, '<table><tbody><tr>', '</tr></tbody></table>'];\n\nvar svgWrap = [1, '<svg xmlns=\"http://www.w3.org/2000/svg\">', '</svg>'];\n\nvar markupWrap = {\n '*': [1, '?<div>', '</div>'],\n\n 'area': [1, '<map>', '</map>'],\n 'col': [2, '<table><tbody></tbody><colgroup>', '</colgroup></table>'],\n 'legend': [1, '<fieldset>', '</fieldset>'],\n 'param': [1, '<object>', '</object>'],\n 'tr': [2, '<table><tbody>', '</tbody></table>'],\n\n 'optgroup': selectWrap,\n 'option': selectWrap,\n\n 'caption': tableWrap,\n 'colgroup': tableWrap,\n 'tbody': tableWrap,\n 'tfoot': tableWrap,\n 'thead': tableWrap,\n\n 'td': trWrap,\n 'th': trWrap\n};\n\n// Initialize the SVG elements since we know they'll always need to be wrapped\n// consistently. If they are created inside a <div> they will be initialized in\n// the wrong namespace (and will not display).\nvar svgElements = ['circle', 'clipPath', 'defs', 'ellipse', 'g', 'image', 'line', 'linearGradient', 'mask', 'path', 'pattern', 'polygon', 'polyline', 'radialGradient', 'rect', 'stop', 'text', 'tspan'];\nsvgElements.forEach(function (nodeName) {\n markupWrap[nodeName] = svgWrap;\n shouldWrap[nodeName] = true;\n});\n\n/**\n * Gets the markup wrap configuration for the supplied `nodeName`.\n *\n * NOTE: This lazily detects which wraps are necessary for the current browser.\n *\n * @param {string} nodeName Lowercase `nodeName`.\n * @return {?array} Markup wrap configuration, if applicable.\n */\nfunction getMarkupWrap(nodeName) {\n !!!dummyNode ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Markup wrapping node not initialized') : invariant(false) : undefined;\n if (!markupWrap.hasOwnProperty(nodeName)) {\n nodeName = '*';\n }\n if (!shouldWrap.hasOwnProperty(nodeName)) {\n if (nodeName === '*') {\n dummyNode.innerHTML = '<link />';\n } else {\n dummyNode.innerHTML = '<' + nodeName + '></' + nodeName + '>';\n }\n shouldWrap[nodeName] = !dummyNode.firstChild;\n }\n return shouldWrap[nodeName] ? markupWrap[nodeName] : null;\n}\n\nmodule.exports = getMarkupWrap;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/getMarkupWrap.js\n ** module id = 13\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule emptyFunction\n */\n\n\"use strict\";\n\nfunction makeEmptyFunction(arg) {\n return function () {\n return arg;\n };\n}\n\n/**\n * This function accepts and discards inputs; it has no side effects. This is\n * primarily useful idiomatically for overridable function endpoints which\n * always need to be callable, since JS lacks a null-call idiom ala Cocoa.\n */\nfunction emptyFunction() {}\n\nemptyFunction.thatReturns = makeEmptyFunction;\nemptyFunction.thatReturnsFalse = makeEmptyFunction(false);\nemptyFunction.thatReturnsTrue = makeEmptyFunction(true);\nemptyFunction.thatReturnsNull = makeEmptyFunction(null);\nemptyFunction.thatReturnsThis = function () {\n return this;\n};\nemptyFunction.thatReturnsArgument = function (arg) {\n return arg;\n};\n\nmodule.exports = emptyFunction;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/emptyFunction.js\n ** module id = 14\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactMultiChildUpdateTypes\n */\n\n'use strict';\n\nvar keyMirror = require('fbjs/lib/keyMirror');\n\n/**\n * When a component's children are updated, a series of update configuration\n * objects are created in order to batch and serialize the required changes.\n *\n * Enumerates all the possible types of update configurations.\n *\n * @internal\n */\nvar ReactMultiChildUpdateTypes = keyMirror({\n INSERT_MARKUP: null,\n MOVE_EXISTING: null,\n REMOVE_NODE: null,\n SET_MARKUP: null,\n TEXT_CONTENT: null\n});\n\nmodule.exports = ReactMultiChildUpdateTypes;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactMultiChildUpdateTypes.js\n ** module id = 15\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule keyMirror\n * @typechecks static-only\n */\n\n'use strict';\n\nvar invariant = require('./invariant');\n\n/**\n * Constructs an enumeration with keys equal to their value.\n *\n * For example:\n *\n * var COLORS = keyMirror({blue: null, red: null});\n * var myColor = COLORS.blue;\n * var isColorValid = !!COLORS[myColor];\n *\n * The last line could not be performed if the values of the generated enum were\n * not equal to their keys.\n *\n * Input: {key1: val1, key2: val2}\n * Output: {key1: key1, key2: key2}\n *\n * @param {object} obj\n * @return {object}\n */\nvar keyMirror = function (obj) {\n var ret = {};\n var key;\n !(obj instanceof Object && !Array.isArray(obj)) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'keyMirror(...): Argument must be an object.') : invariant(false) : undefined;\n for (key in obj) {\n if (!obj.hasOwnProperty(key)) {\n continue;\n }\n ret[key] = key;\n }\n return ret;\n};\n\nmodule.exports = keyMirror;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/keyMirror.js\n ** module id = 16\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactPerf\n * @typechecks static-only\n */\n\n'use strict';\n\n/**\n * ReactPerf is a general AOP system designed to measure performance. This\n * module only has the hooks: see ReactDefaultPerf for the analysis tool.\n */\nvar ReactPerf = {\n /**\n * Boolean to enable/disable measurement. Set to false by default to prevent\n * accidental logging and perf loss.\n */\n enableMeasure: false,\n\n /**\n * Holds onto the measure function in use. By default, don't measure\n * anything, but we'll override this if we inject a measure function.\n */\n storedMeasure: _noMeasure,\n\n /**\n * @param {object} object\n * @param {string} objectName\n * @param {object<string>} methodNames\n */\n measureMethods: function (object, objectName, methodNames) {\n if (process.env.NODE_ENV !== 'production') {\n for (var key in methodNames) {\n if (!methodNames.hasOwnProperty(key)) {\n continue;\n }\n object[key] = ReactPerf.measure(objectName, methodNames[key], object[key]);\n }\n }\n },\n\n /**\n * Use this to wrap methods you want to measure. Zero overhead in production.\n *\n * @param {string} objName\n * @param {string} fnName\n * @param {function} func\n * @return {function}\n */\n measure: function (objName, fnName, func) {\n if (process.env.NODE_ENV !== 'production') {\n var measuredFunc = null;\n var wrapper = function () {\n if (ReactPerf.enableMeasure) {\n if (!measuredFunc) {\n measuredFunc = ReactPerf.storedMeasure(objName, fnName, func);\n }\n return measuredFunc.apply(this, arguments);\n }\n return func.apply(this, arguments);\n };\n wrapper.displayName = objName + '_' + fnName;\n return wrapper;\n }\n return func;\n },\n\n injection: {\n /**\n * @param {function} measure\n */\n injectMeasure: function (measure) {\n ReactPerf.storedMeasure = measure;\n }\n }\n};\n\n/**\n * Simply passes through the measured function, without measuring it.\n *\n * @param {string} objName\n * @param {string} fnName\n * @param {function} func\n * @return {function}\n */\nfunction _noMeasure(objName, fnName, func) {\n return func;\n}\n\nmodule.exports = ReactPerf;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactPerf.js\n ** module id = 17\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule setInnerHTML\n */\n\n/* globals MSApp */\n\n'use strict';\n\nvar ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');\n\nvar WHITESPACE_TEST = /^[ \\r\\n\\t\\f]/;\nvar NONVISIBLE_TEST = /<(!--|link|noscript|meta|script|style)[ \\r\\n\\t\\f\\/>]/;\n\n/**\n * Set the innerHTML property of a node, ensuring that whitespace is preserved\n * even in IE8.\n *\n * @param {DOMElement} node\n * @param {string} html\n * @internal\n */\nvar setInnerHTML = function (node, html) {\n node.innerHTML = html;\n};\n\n// Win8 apps: Allow all html to be inserted\nif (typeof MSApp !== 'undefined' && MSApp.execUnsafeLocalFunction) {\n setInnerHTML = function (node, html) {\n MSApp.execUnsafeLocalFunction(function () {\n node.innerHTML = html;\n });\n };\n}\n\nif (ExecutionEnvironment.canUseDOM) {\n // IE8: When updating a just created node with innerHTML only leading\n // whitespace is removed. When updating an existing node with innerHTML\n // whitespace in root TextNodes is also collapsed.\n // @see quirksmode.org/bugreports/archives/2004/11/innerhtml_and_t.html\n\n // Feature detection; only IE8 is known to behave improperly like this.\n var testElement = document.createElement('div');\n testElement.innerHTML = ' ';\n if (testElement.innerHTML === '') {\n setInnerHTML = function (node, html) {\n // Magic theory: IE8 supposedly differentiates between added and updated\n // nodes when processing innerHTML, innerHTML on updated nodes suffers\n // from worse whitespace behavior. Re-adding a node like this triggers\n // the initial and more favorable whitespace behavior.\n // TODO: What to do on a detached node?\n if (node.parentNode) {\n node.parentNode.replaceChild(node, node);\n }\n\n // We also implement a workaround for non-visible tags disappearing into\n // thin air on IE8, this only happens if there is no visible text\n // in-front of the non-visible tags. Piggyback on the whitespace fix\n // and simply check if any non-visible tags appear in the source.\n if (WHITESPACE_TEST.test(html) || html[0] === '<' && NONVISIBLE_TEST.test(html)) {\n // Recover leading whitespace by temporarily prepending any character.\n // \\uFEFF has the potential advantage of being zero-width/invisible.\n // UglifyJS drops U+FEFF chars when parsing, so use String.fromCharCode\n // in hopes that this is preserved even if \"\\uFEFF\" is transformed to\n // the actual Unicode character (by Babel, for example).\n // https://github.com/mishoo/UglifyJS2/blob/v2.4.20/lib/parse.js#L216\n node.innerHTML = String.fromCharCode(0xFEFF) + html;\n\n // deleteData leaves an empty `TextNode` which offsets the index of all\n // children. Definitely want to avoid this.\n var textNode = node.firstChild;\n if (textNode.data.length === 1) {\n node.removeChild(textNode);\n } else {\n textNode.deleteData(0, 1);\n }\n } else {\n node.innerHTML = html;\n }\n };\n }\n}\n\nmodule.exports = setInnerHTML;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/setInnerHTML.js\n ** module id = 18\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule setTextContent\n */\n\n'use strict';\n\nvar ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');\nvar escapeTextContentForBrowser = require('./escapeTextContentForBrowser');\nvar setInnerHTML = require('./setInnerHTML');\n\n/**\n * Set the textContent property of a node, ensuring that whitespace is preserved\n * even in IE8. innerText is a poor substitute for textContent and, among many\n * issues, inserts <br> instead of the literal newline chars. innerHTML behaves\n * as it should.\n *\n * @param {DOMElement} node\n * @param {string} text\n * @internal\n */\nvar setTextContent = function (node, text) {\n node.textContent = text;\n};\n\nif (ExecutionEnvironment.canUseDOM) {\n if (!('textContent' in document.documentElement)) {\n setTextContent = function (node, text) {\n setInnerHTML(node, escapeTextContentForBrowser(text));\n };\n }\n}\n\nmodule.exports = setTextContent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/setTextContent.js\n ** module id = 19\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule escapeTextContentForBrowser\n */\n\n'use strict';\n\nvar ESCAPE_LOOKUP = {\n '&': '&',\n '>': '>',\n '<': '<',\n '\"': '"',\n '\\'': '''\n};\n\nvar ESCAPE_REGEX = /[&><\"']/g;\n\nfunction escaper(match) {\n return ESCAPE_LOOKUP[match];\n}\n\n/**\n * Escapes text to prevent scripting attacks.\n *\n * @param {*} text Text value to escape.\n * @return {string} An escaped string.\n */\nfunction escapeTextContentForBrowser(text) {\n return ('' + text).replace(ESCAPE_REGEX, escaper);\n}\n\nmodule.exports = escapeTextContentForBrowser;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/escapeTextContentForBrowser.js\n ** module id = 20\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule DOMPropertyOperations\n * @typechecks static-only\n */\n\n'use strict';\n\nvar DOMProperty = require('./DOMProperty');\nvar ReactPerf = require('./ReactPerf');\n\nvar quoteAttributeValueForBrowser = require('./quoteAttributeValueForBrowser');\nvar warning = require('fbjs/lib/warning');\n\n// Simplified subset\nvar VALID_ATTRIBUTE_NAME_REGEX = /^[a-zA-Z_][\\w\\.\\-]*$/;\nvar illegalAttributeNameCache = {};\nvar validatedAttributeNameCache = {};\n\nfunction isAttributeNameSafe(attributeName) {\n if (validatedAttributeNameCache.hasOwnProperty(attributeName)) {\n return true;\n }\n if (illegalAttributeNameCache.hasOwnProperty(attributeName)) {\n return false;\n }\n if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) {\n validatedAttributeNameCache[attributeName] = true;\n return true;\n }\n illegalAttributeNameCache[attributeName] = true;\n process.env.NODE_ENV !== 'production' ? warning(false, 'Invalid attribute name: `%s`', attributeName) : undefined;\n return false;\n}\n\nfunction shouldIgnoreValue(propertyInfo, value) {\n return value == null || propertyInfo.hasBooleanValue && !value || propertyInfo.hasNumericValue && isNaN(value) || propertyInfo.hasPositiveNumericValue && value < 1 || propertyInfo.hasOverloadedBooleanValue && value === false;\n}\n\nif (process.env.NODE_ENV !== 'production') {\n var reactProps = {\n children: true,\n dangerouslySetInnerHTML: true,\n key: true,\n ref: true\n };\n var warnedProperties = {};\n\n var warnUnknownProperty = function (name) {\n if (reactProps.hasOwnProperty(name) && reactProps[name] || warnedProperties.hasOwnProperty(name) && warnedProperties[name]) {\n return;\n }\n\n warnedProperties[name] = true;\n var lowerCasedName = name.toLowerCase();\n\n // data-* attributes should be lowercase; suggest the lowercase version\n var standardName = DOMProperty.isCustomAttribute(lowerCasedName) ? lowerCasedName : DOMProperty.getPossibleStandardName.hasOwnProperty(lowerCasedName) ? DOMProperty.getPossibleStandardName[lowerCasedName] : null;\n\n // For now, only warn when we have a suggested correction. This prevents\n // logging too much when using transferPropsTo.\n process.env.NODE_ENV !== 'production' ? warning(standardName == null, 'Unknown DOM property %s. Did you mean %s?', name, standardName) : undefined;\n };\n}\n\n/**\n * Operations for dealing with DOM properties.\n */\nvar DOMPropertyOperations = {\n\n /**\n * Creates markup for the ID property.\n *\n * @param {string} id Unescaped ID.\n * @return {string} Markup string.\n */\n createMarkupForID: function (id) {\n return DOMProperty.ID_ATTRIBUTE_NAME + '=' + quoteAttributeValueForBrowser(id);\n },\n\n setAttributeForID: function (node, id) {\n node.setAttribute(DOMProperty.ID_ATTRIBUTE_NAME, id);\n },\n\n /**\n * Creates markup for a property.\n *\n * @param {string} name\n * @param {*} value\n * @return {?string} Markup string, or null if the property was invalid.\n */\n createMarkupForProperty: function (name, value) {\n var propertyInfo = DOMProperty.properties.hasOwnProperty(name) ? DOMProperty.properties[name] : null;\n if (propertyInfo) {\n if (shouldIgnoreValue(propertyInfo, value)) {\n return '';\n }\n var attributeName = propertyInfo.attributeName;\n if (propertyInfo.hasBooleanValue || propertyInfo.hasOverloadedBooleanValue && value === true) {\n return attributeName + '=\"\"';\n }\n return attributeName + '=' + quoteAttributeValueForBrowser(value);\n } else if (DOMProperty.isCustomAttribute(name)) {\n if (value == null) {\n return '';\n }\n return name + '=' + quoteAttributeValueForBrowser(value);\n } else if (process.env.NODE_ENV !== 'production') {\n warnUnknownProperty(name);\n }\n return null;\n },\n\n /**\n * Creates markup for a custom property.\n *\n * @param {string} name\n * @param {*} value\n * @return {string} Markup string, or empty string if the property was invalid.\n */\n createMarkupForCustomAttribute: function (name, value) {\n if (!isAttributeNameSafe(name) || value == null) {\n return '';\n }\n return name + '=' + quoteAttributeValueForBrowser(value);\n },\n\n /**\n * Sets the value for a property on a node.\n *\n * @param {DOMElement} node\n * @param {string} name\n * @param {*} value\n */\n setValueForProperty: function (node, name, value) {\n var propertyInfo = DOMProperty.properties.hasOwnProperty(name) ? DOMProperty.properties[name] : null;\n if (propertyInfo) {\n var mutationMethod = propertyInfo.mutationMethod;\n if (mutationMethod) {\n mutationMethod(node, value);\n } else if (shouldIgnoreValue(propertyInfo, value)) {\n this.deleteValueForProperty(node, name);\n } else if (propertyInfo.mustUseAttribute) {\n var attributeName = propertyInfo.attributeName;\n var namespace = propertyInfo.attributeNamespace;\n // `setAttribute` with objects becomes only `[object]` in IE8/9,\n // ('' + value) makes it output the correct toString()-value.\n if (namespace) {\n node.setAttributeNS(namespace, attributeName, '' + value);\n } else if (propertyInfo.hasBooleanValue || propertyInfo.hasOverloadedBooleanValue && value === true) {\n node.setAttribute(attributeName, '');\n } else {\n node.setAttribute(attributeName, '' + value);\n }\n } else {\n var propName = propertyInfo.propertyName;\n // Must explicitly cast values for HAS_SIDE_EFFECTS-properties to the\n // property type before comparing; only `value` does and is string.\n if (!propertyInfo.hasSideEffects || '' + node[propName] !== '' + value) {\n // Contrary to `setAttribute`, object properties are properly\n // `toString`ed by IE8/9.\n node[propName] = value;\n }\n }\n } else if (DOMProperty.isCustomAttribute(name)) {\n DOMPropertyOperations.setValueForAttribute(node, name, value);\n } else if (process.env.NODE_ENV !== 'production') {\n warnUnknownProperty(name);\n }\n },\n\n setValueForAttribute: function (node, name, value) {\n if (!isAttributeNameSafe(name)) {\n return;\n }\n if (value == null) {\n node.removeAttribute(name);\n } else {\n node.setAttribute(name, '' + value);\n }\n },\n\n /**\n * Deletes the value for a property on a node.\n *\n * @param {DOMElement} node\n * @param {string} name\n */\n deleteValueForProperty: function (node, name) {\n var propertyInfo = DOMProperty.properties.hasOwnProperty(name) ? DOMProperty.properties[name] : null;\n if (propertyInfo) {\n var mutationMethod = propertyInfo.mutationMethod;\n if (mutationMethod) {\n mutationMethod(node, undefined);\n } else if (propertyInfo.mustUseAttribute) {\n node.removeAttribute(propertyInfo.attributeName);\n } else {\n var propName = propertyInfo.propertyName;\n var defaultValue = DOMProperty.getDefaultValueForProperty(node.nodeName, propName);\n if (!propertyInfo.hasSideEffects || '' + node[propName] !== defaultValue) {\n node[propName] = defaultValue;\n }\n }\n } else if (DOMProperty.isCustomAttribute(name)) {\n node.removeAttribute(name);\n } else if (process.env.NODE_ENV !== 'production') {\n warnUnknownProperty(name);\n }\n }\n\n};\n\nReactPerf.measureMethods(DOMPropertyOperations, 'DOMPropertyOperations', {\n setValueForProperty: 'setValueForProperty',\n setValueForAttribute: 'setValueForAttribute',\n deleteValueForProperty: 'deleteValueForProperty'\n});\n\nmodule.exports = DOMPropertyOperations;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/DOMPropertyOperations.js\n ** module id = 21\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule DOMProperty\n * @typechecks static-only\n */\n\n'use strict';\n\nvar invariant = require('fbjs/lib/invariant');\n\nfunction checkMask(value, bitmask) {\n return (value & bitmask) === bitmask;\n}\n\nvar DOMPropertyInjection = {\n /**\n * Mapping from normalized, camelcased property names to a configuration that\n * specifies how the associated DOM property should be accessed or rendered.\n */\n MUST_USE_ATTRIBUTE: 0x1,\n MUST_USE_PROPERTY: 0x2,\n HAS_SIDE_EFFECTS: 0x4,\n HAS_BOOLEAN_VALUE: 0x8,\n HAS_NUMERIC_VALUE: 0x10,\n HAS_POSITIVE_NUMERIC_VALUE: 0x20 | 0x10,\n HAS_OVERLOADED_BOOLEAN_VALUE: 0x40,\n\n /**\n * Inject some specialized knowledge about the DOM. This takes a config object\n * with the following properties:\n *\n * isCustomAttribute: function that given an attribute name will return true\n * if it can be inserted into the DOM verbatim. Useful for data-* or aria-*\n * attributes where it's impossible to enumerate all of the possible\n * attribute names,\n *\n * Properties: object mapping DOM property name to one of the\n * DOMPropertyInjection constants or null. If your attribute isn't in here,\n * it won't get written to the DOM.\n *\n * DOMAttributeNames: object mapping React attribute name to the DOM\n * attribute name. Attribute names not specified use the **lowercase**\n * normalized name.\n *\n * DOMAttributeNamespaces: object mapping React attribute name to the DOM\n * attribute namespace URL. (Attribute names not specified use no namespace.)\n *\n * DOMPropertyNames: similar to DOMAttributeNames but for DOM properties.\n * Property names not specified use the normalized name.\n *\n * DOMMutationMethods: Properties that require special mutation methods. If\n * `value` is undefined, the mutation method should unset the property.\n *\n * @param {object} domPropertyConfig the config as described above.\n */\n injectDOMPropertyConfig: function (domPropertyConfig) {\n var Injection = DOMPropertyInjection;\n var Properties = domPropertyConfig.Properties || {};\n var DOMAttributeNamespaces = domPropertyConfig.DOMAttributeNamespaces || {};\n var DOMAttributeNames = domPropertyConfig.DOMAttributeNames || {};\n var DOMPropertyNames = domPropertyConfig.DOMPropertyNames || {};\n var DOMMutationMethods = domPropertyConfig.DOMMutationMethods || {};\n\n if (domPropertyConfig.isCustomAttribute) {\n DOMProperty._isCustomAttributeFunctions.push(domPropertyConfig.isCustomAttribute);\n }\n\n for (var propName in Properties) {\n !!DOMProperty.properties.hasOwnProperty(propName) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'injectDOMPropertyConfig(...): You\\'re trying to inject DOM property ' + '\\'%s\\' which has already been injected. You may be accidentally ' + 'injecting the same DOM property config twice, or you may be ' + 'injecting two configs that have conflicting property names.', propName) : invariant(false) : undefined;\n\n var lowerCased = propName.toLowerCase();\n var propConfig = Properties[propName];\n\n var propertyInfo = {\n attributeName: lowerCased,\n attributeNamespace: null,\n propertyName: propName,\n mutationMethod: null,\n\n mustUseAttribute: checkMask(propConfig, Injection.MUST_USE_ATTRIBUTE),\n mustUseProperty: checkMask(propConfig, Injection.MUST_USE_PROPERTY),\n hasSideEffects: checkMask(propConfig, Injection.HAS_SIDE_EFFECTS),\n hasBooleanValue: checkMask(propConfig, Injection.HAS_BOOLEAN_VALUE),\n hasNumericValue: checkMask(propConfig, Injection.HAS_NUMERIC_VALUE),\n hasPositiveNumericValue: checkMask(propConfig, Injection.HAS_POSITIVE_NUMERIC_VALUE),\n hasOverloadedBooleanValue: checkMask(propConfig, Injection.HAS_OVERLOADED_BOOLEAN_VALUE)\n };\n\n !(!propertyInfo.mustUseAttribute || !propertyInfo.mustUseProperty) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'DOMProperty: Cannot require using both attribute and property: %s', propName) : invariant(false) : undefined;\n !(propertyInfo.mustUseProperty || !propertyInfo.hasSideEffects) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'DOMProperty: Properties that have side effects must use property: %s', propName) : invariant(false) : undefined;\n !(propertyInfo.hasBooleanValue + propertyInfo.hasNumericValue + propertyInfo.hasOverloadedBooleanValue <= 1) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'DOMProperty: Value can be one of boolean, overloaded boolean, or ' + 'numeric value, but not a combination: %s', propName) : invariant(false) : undefined;\n\n if (process.env.NODE_ENV !== 'production') {\n DOMProperty.getPossibleStandardName[lowerCased] = propName;\n }\n\n if (DOMAttributeNames.hasOwnProperty(propName)) {\n var attributeName = DOMAttributeNames[propName];\n propertyInfo.attributeName = attributeName;\n if (process.env.NODE_ENV !== 'production') {\n DOMProperty.getPossibleStandardName[attributeName] = propName;\n }\n }\n\n if (DOMAttributeNamespaces.hasOwnProperty(propName)) {\n propertyInfo.attributeNamespace = DOMAttributeNamespaces[propName];\n }\n\n if (DOMPropertyNames.hasOwnProperty(propName)) {\n propertyInfo.propertyName = DOMPropertyNames[propName];\n }\n\n if (DOMMutationMethods.hasOwnProperty(propName)) {\n propertyInfo.mutationMethod = DOMMutationMethods[propName];\n }\n\n DOMProperty.properties[propName] = propertyInfo;\n }\n }\n};\nvar defaultValueCache = {};\n\n/**\n * DOMProperty exports lookup objects that can be used like functions:\n *\n * > DOMProperty.isValid['id']\n * true\n * > DOMProperty.isValid['foobar']\n * undefined\n *\n * Although this may be confusing, it performs better in general.\n *\n * @see http://jsperf.com/key-exists\n * @see http://jsperf.com/key-missing\n */\nvar DOMProperty = {\n\n ID_ATTRIBUTE_NAME: 'data-reactid',\n\n /**\n * Map from property \"standard name\" to an object with info about how to set\n * the property in the DOM. Each object contains:\n *\n * attributeName:\n * Used when rendering markup or with `*Attribute()`.\n * attributeNamespace\n * propertyName:\n * Used on DOM node instances. (This includes properties that mutate due to\n * external factors.)\n * mutationMethod:\n * If non-null, used instead of the property or `setAttribute()` after\n * initial render.\n * mustUseAttribute:\n * Whether the property must be accessed and mutated using `*Attribute()`.\n * (This includes anything that fails `<propName> in <element>`.)\n * mustUseProperty:\n * Whether the property must be accessed and mutated as an object property.\n * hasSideEffects:\n * Whether or not setting a value causes side effects such as triggering\n * resources to be loaded or text selection changes. If true, we read from\n * the DOM before updating to ensure that the value is only set if it has\n * changed.\n * hasBooleanValue:\n * Whether the property should be removed when set to a falsey value.\n * hasNumericValue:\n * Whether the property must be numeric or parse as a numeric and should be\n * removed when set to a falsey value.\n * hasPositiveNumericValue:\n * Whether the property must be positive numeric or parse as a positive\n * numeric and should be removed when set to a falsey value.\n * hasOverloadedBooleanValue:\n * Whether the property can be used as a flag as well as with a value.\n * Removed when strictly equal to false; present without a value when\n * strictly equal to true; present with a value otherwise.\n */\n properties: {},\n\n /**\n * Mapping from lowercase property names to the properly cased version, used\n * to warn in the case of missing properties. Available only in __DEV__.\n * @type {Object}\n */\n getPossibleStandardName: process.env.NODE_ENV !== 'production' ? {} : null,\n\n /**\n * All of the isCustomAttribute() functions that have been injected.\n */\n _isCustomAttributeFunctions: [],\n\n /**\n * Checks whether a property name is a custom attribute.\n * @method\n */\n isCustomAttribute: function (attributeName) {\n for (var i = 0; i < DOMProperty._isCustomAttributeFunctions.length; i++) {\n var isCustomAttributeFn = DOMProperty._isCustomAttributeFunctions[i];\n if (isCustomAttributeFn(attributeName)) {\n return true;\n }\n }\n return false;\n },\n\n /**\n * Returns the default property value for a DOM property (i.e., not an\n * attribute). Most default values are '' or false, but not all. Worse yet,\n * some (in particular, `type`) vary depending on the type of element.\n *\n * TODO: Is it better to grab all the possible properties when creating an\n * element to avoid having to create the same element twice?\n */\n getDefaultValueForProperty: function (nodeName, prop) {\n var nodeDefaults = defaultValueCache[nodeName];\n var testElement;\n if (!nodeDefaults) {\n defaultValueCache[nodeName] = nodeDefaults = {};\n }\n if (!(prop in nodeDefaults)) {\n testElement = document.createElement(nodeName);\n nodeDefaults[prop] = testElement[prop];\n }\n return nodeDefaults[prop];\n },\n\n injection: DOMPropertyInjection\n};\n\nmodule.exports = DOMProperty;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/DOMProperty.js\n ** module id = 22\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule quoteAttributeValueForBrowser\n */\n\n'use strict';\n\nvar escapeTextContentForBrowser = require('./escapeTextContentForBrowser');\n\n/**\n * Escapes attribute value to prevent scripting attacks.\n *\n * @param {*} value Value to escape.\n * @return {string} An escaped string.\n */\nfunction quoteAttributeValueForBrowser(value) {\n return '\"' + escapeTextContentForBrowser(value) + '\"';\n}\n\nmodule.exports = quoteAttributeValueForBrowser;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/quoteAttributeValueForBrowser.js\n ** module id = 23\n ** module chunks = 0 1\n **/","/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule warning\n */\n\n'use strict';\n\nvar emptyFunction = require('./emptyFunction');\n\n/**\n * Similar to invariant but only logs a warning if the condition is not met.\n * This can be used to log issues in development environments in critical\n * paths. Removing the logging code for production environments will keep the\n * same logic and follow the same code paths.\n */\n\nvar warning = emptyFunction;\n\nif (process.env.NODE_ENV !== 'production') {\n warning = function (condition, format) {\n for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n\n if (format === undefined) {\n throw new Error('`warning(condition, format, ...args)` requires a warning ' + 'message argument');\n }\n\n if (format.indexOf('Failed Composite propType: ') === 0) {\n return; // Ignore CompositeComponent proptype check.\n }\n\n if (!condition) {\n var argIndex = 0;\n var message = 'Warning: ' + format.replace(/%s/g, function () {\n return args[argIndex++];\n });\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) {}\n }\n };\n}\n\nmodule.exports = warning;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/warning.js\n ** module id = 24\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactComponentBrowserEnvironment\n */\n\n'use strict';\n\nvar ReactDOMIDOperations = require('./ReactDOMIDOperations');\nvar ReactMount = require('./ReactMount');\n\n/**\n * Abstracts away all functionality of the reconciler that requires knowledge of\n * the browser context. TODO: These callers should be refactored to avoid the\n * need for this injection.\n */\nvar ReactComponentBrowserEnvironment = {\n\n processChildrenUpdates: ReactDOMIDOperations.dangerouslyProcessChildrenUpdates,\n\n replaceNodeWithMarkupByID: ReactDOMIDOperations.dangerouslyReplaceNodeWithMarkupByID,\n\n /**\n * If a particular environment requires that some resources be cleaned up,\n * specify this in the injected Mixin. In the DOM, we would likely want to\n * purge any cached node ID lookups.\n *\n * @private\n */\n unmountIDFromEnvironment: function (rootNodeID) {\n ReactMount.purgeID(rootNodeID);\n }\n\n};\n\nmodule.exports = ReactComponentBrowserEnvironment;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactComponentBrowserEnvironment.js\n ** module id = 25\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactDOMIDOperations\n * @typechecks static-only\n */\n\n'use strict';\n\nvar DOMChildrenOperations = require('./DOMChildrenOperations');\nvar DOMPropertyOperations = require('./DOMPropertyOperations');\nvar ReactMount = require('./ReactMount');\nvar ReactPerf = require('./ReactPerf');\n\nvar invariant = require('fbjs/lib/invariant');\n\n/**\n * Errors for properties that should not be updated with `updatePropertyByID()`.\n *\n * @type {object}\n * @private\n */\nvar INVALID_PROPERTY_ERRORS = {\n dangerouslySetInnerHTML: '`dangerouslySetInnerHTML` must be set using `updateInnerHTMLByID()`.',\n style: '`style` must be set using `updateStylesByID()`.'\n};\n\n/**\n * Operations used to process updates to DOM nodes.\n */\nvar ReactDOMIDOperations = {\n\n /**\n * Updates a DOM node with new property values. This should only be used to\n * update DOM properties in `DOMProperty`.\n *\n * @param {string} id ID of the node to update.\n * @param {string} name A valid property name, see `DOMProperty`.\n * @param {*} value New value of the property.\n * @internal\n */\n updatePropertyByID: function (id, name, value) {\n var node = ReactMount.getNode(id);\n !!INVALID_PROPERTY_ERRORS.hasOwnProperty(name) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'updatePropertyByID(...): %s', INVALID_PROPERTY_ERRORS[name]) : invariant(false) : undefined;\n\n // If we're updating to null or undefined, we should remove the property\n // from the DOM node instead of inadvertantly setting to a string. This\n // brings us in line with the same behavior we have on initial render.\n if (value != null) {\n DOMPropertyOperations.setValueForProperty(node, name, value);\n } else {\n DOMPropertyOperations.deleteValueForProperty(node, name);\n }\n },\n\n /**\n * Replaces a DOM node that exists in the document with markup.\n *\n * @param {string} id ID of child to be replaced.\n * @param {string} markup Dangerous markup to inject in place of child.\n * @internal\n * @see {Danger.dangerouslyReplaceNodeWithMarkup}\n */\n dangerouslyReplaceNodeWithMarkupByID: function (id, markup) {\n var node = ReactMount.getNode(id);\n DOMChildrenOperations.dangerouslyReplaceNodeWithMarkup(node, markup);\n },\n\n /**\n * Updates a component's children by processing a series of updates.\n *\n * @param {array<object>} updates List of update configurations.\n * @param {array<string>} markup List of markup strings.\n * @internal\n */\n dangerouslyProcessChildrenUpdates: function (updates, markup) {\n for (var i = 0; i < updates.length; i++) {\n updates[i].parentNode = ReactMount.getNode(updates[i].parentID);\n }\n DOMChildrenOperations.processUpdates(updates, markup);\n }\n};\n\nReactPerf.measureMethods(ReactDOMIDOperations, 'ReactDOMIDOperations', {\n dangerouslyReplaceNodeWithMarkupByID: 'dangerouslyReplaceNodeWithMarkupByID',\n dangerouslyProcessChildrenUpdates: 'dangerouslyProcessChildrenUpdates'\n});\n\nmodule.exports = ReactDOMIDOperations;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactDOMIDOperations.js\n ** module id = 26\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactMount\n */\n\n'use strict';\n\nvar DOMProperty = require('./DOMProperty');\nvar ReactBrowserEventEmitter = require('./ReactBrowserEventEmitter');\nvar ReactCurrentOwner = require('./ReactCurrentOwner');\nvar ReactDOMFeatureFlags = require('./ReactDOMFeatureFlags');\nvar ReactElement = require('./ReactElement');\nvar ReactEmptyComponentRegistry = require('./ReactEmptyComponentRegistry');\nvar ReactInstanceHandles = require('./ReactInstanceHandles');\nvar ReactInstanceMap = require('./ReactInstanceMap');\nvar ReactMarkupChecksum = require('./ReactMarkupChecksum');\nvar ReactPerf = require('./ReactPerf');\nvar ReactReconciler = require('./ReactReconciler');\nvar ReactUpdateQueue = require('./ReactUpdateQueue');\nvar ReactUpdates = require('./ReactUpdates');\n\nvar assign = require('./Object.assign');\nvar emptyObject = require('fbjs/lib/emptyObject');\nvar containsNode = require('fbjs/lib/containsNode');\nvar instantiateReactComponent = require('./instantiateReactComponent');\nvar invariant = require('fbjs/lib/invariant');\nvar setInnerHTML = require('./setInnerHTML');\nvar shouldUpdateReactComponent = require('./shouldUpdateReactComponent');\nvar validateDOMNesting = require('./validateDOMNesting');\nvar warning = require('fbjs/lib/warning');\n\nvar ATTR_NAME = DOMProperty.ID_ATTRIBUTE_NAME;\nvar nodeCache = {};\n\nvar ELEMENT_NODE_TYPE = 1;\nvar DOC_NODE_TYPE = 9;\nvar DOCUMENT_FRAGMENT_NODE_TYPE = 11;\n\nvar ownerDocumentContextKey = '__ReactMount_ownerDocument$' + Math.random().toString(36).slice(2);\n\n/** Mapping from reactRootID to React component instance. */\nvar instancesByReactRootID = {};\n\n/** Mapping from reactRootID to `container` nodes. */\nvar containersByReactRootID = {};\n\nif (process.env.NODE_ENV !== 'production') {\n /** __DEV__-only mapping from reactRootID to root elements. */\n var rootElementsByReactRootID = {};\n}\n\n// Used to store breadth-first search state in findComponentRoot.\nvar findComponentRootReusableArray = [];\n\n/**\n * Finds the index of the first character\n * that's not common between the two given strings.\n *\n * @return {number} the index of the character where the strings diverge\n */\nfunction firstDifferenceIndex(string1, string2) {\n var minLen = Math.min(string1.length, string2.length);\n for (var i = 0; i < minLen; i++) {\n if (string1.charAt(i) !== string2.charAt(i)) {\n return i;\n }\n }\n return string1.length === string2.length ? -1 : minLen;\n}\n\n/**\n * @param {DOMElement|DOMDocument} container DOM element that may contain\n * a React component\n * @return {?*} DOM element that may have the reactRoot ID, or null.\n */\nfunction getReactRootElementInContainer(container) {\n if (!container) {\n return null;\n }\n\n if (container.nodeType === DOC_NODE_TYPE) {\n return container.documentElement;\n } else {\n return container.firstChild;\n }\n}\n\n/**\n * @param {DOMElement} container DOM element that may contain a React component.\n * @return {?string} A \"reactRoot\" ID, if a React component is rendered.\n */\nfunction getReactRootID(container) {\n var rootElement = getReactRootElementInContainer(container);\n return rootElement && ReactMount.getID(rootElement);\n}\n\n/**\n * Accessing node[ATTR_NAME] or calling getAttribute(ATTR_NAME) on a form\n * element can return its control whose name or ID equals ATTR_NAME. All\n * DOM nodes support `getAttributeNode` but this can also get called on\n * other objects so just return '' if we're given something other than a\n * DOM node (such as window).\n *\n * @param {?DOMElement|DOMWindow|DOMDocument|DOMTextNode} node DOM node.\n * @return {string} ID of the supplied `domNode`.\n */\nfunction getID(node) {\n var id = internalGetID(node);\n if (id) {\n if (nodeCache.hasOwnProperty(id)) {\n var cached = nodeCache[id];\n if (cached !== node) {\n !!isValid(cached, id) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactMount: Two valid but unequal nodes with the same `%s`: %s', ATTR_NAME, id) : invariant(false) : undefined;\n\n nodeCache[id] = node;\n }\n } else {\n nodeCache[id] = node;\n }\n }\n\n return id;\n}\n\nfunction internalGetID(node) {\n // If node is something like a window, document, or text node, none of\n // which support attributes or a .getAttribute method, gracefully return\n // the empty string, as if the attribute were missing.\n return node && node.getAttribute && node.getAttribute(ATTR_NAME) || '';\n}\n\n/**\n * Sets the React-specific ID of the given node.\n *\n * @param {DOMElement} node The DOM node whose ID will be set.\n * @param {string} id The value of the ID attribute.\n */\nfunction setID(node, id) {\n var oldID = internalGetID(node);\n if (oldID !== id) {\n delete nodeCache[oldID];\n }\n node.setAttribute(ATTR_NAME, id);\n nodeCache[id] = node;\n}\n\n/**\n * Finds the node with the supplied React-generated DOM ID.\n *\n * @param {string} id A React-generated DOM ID.\n * @return {DOMElement} DOM node with the suppled `id`.\n * @internal\n */\nfunction getNode(id) {\n if (!nodeCache.hasOwnProperty(id) || !isValid(nodeCache[id], id)) {\n nodeCache[id] = ReactMount.findReactNodeByID(id);\n }\n return nodeCache[id];\n}\n\n/**\n * Finds the node with the supplied public React instance.\n *\n * @param {*} instance A public React instance.\n * @return {?DOMElement} DOM node with the suppled `id`.\n * @internal\n */\nfunction getNodeFromInstance(instance) {\n var id = ReactInstanceMap.get(instance)._rootNodeID;\n if (ReactEmptyComponentRegistry.isNullComponentID(id)) {\n return null;\n }\n if (!nodeCache.hasOwnProperty(id) || !isValid(nodeCache[id], id)) {\n nodeCache[id] = ReactMount.findReactNodeByID(id);\n }\n return nodeCache[id];\n}\n\n/**\n * A node is \"valid\" if it is contained by a currently mounted container.\n *\n * This means that the node does not have to be contained by a document in\n * order to be considered valid.\n *\n * @param {?DOMElement} node The candidate DOM node.\n * @param {string} id The expected ID of the node.\n * @return {boolean} Whether the node is contained by a mounted container.\n */\nfunction isValid(node, id) {\n if (node) {\n !(internalGetID(node) === id) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactMount: Unexpected modification of `%s`', ATTR_NAME) : invariant(false) : undefined;\n\n var container = ReactMount.findReactContainerForID(id);\n if (container && containsNode(container, node)) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Causes the cache to forget about one React-specific ID.\n *\n * @param {string} id The ID to forget.\n */\nfunction purgeID(id) {\n delete nodeCache[id];\n}\n\nvar deepestNodeSoFar = null;\nfunction findDeepestCachedAncestorImpl(ancestorID) {\n var ancestor = nodeCache[ancestorID];\n if (ancestor && isValid(ancestor, ancestorID)) {\n deepestNodeSoFar = ancestor;\n } else {\n // This node isn't populated in the cache, so presumably none of its\n // descendants are. Break out of the loop.\n return false;\n }\n}\n\n/**\n * Return the deepest cached node whose ID is a prefix of `targetID`.\n */\nfunction findDeepestCachedAncestor(targetID) {\n deepestNodeSoFar = null;\n ReactInstanceHandles.traverseAncestors(targetID, findDeepestCachedAncestorImpl);\n\n var foundNode = deepestNodeSoFar;\n deepestNodeSoFar = null;\n return foundNode;\n}\n\n/**\n * Mounts this component and inserts it into the DOM.\n *\n * @param {ReactComponent} componentInstance The instance to mount.\n * @param {string} rootID DOM ID of the root node.\n * @param {DOMElement} container DOM element to mount into.\n * @param {ReactReconcileTransaction} transaction\n * @param {boolean} shouldReuseMarkup If true, do not insert markup\n */\nfunction mountComponentIntoNode(componentInstance, rootID, container, transaction, shouldReuseMarkup, context) {\n if (ReactDOMFeatureFlags.useCreateElement) {\n context = assign({}, context);\n if (container.nodeType === DOC_NODE_TYPE) {\n context[ownerDocumentContextKey] = container;\n } else {\n context[ownerDocumentContextKey] = container.ownerDocument;\n }\n }\n if (process.env.NODE_ENV !== 'production') {\n if (context === emptyObject) {\n context = {};\n }\n var tag = container.nodeName.toLowerCase();\n context[validateDOMNesting.ancestorInfoContextKey] = validateDOMNesting.updatedAncestorInfo(null, tag, null);\n }\n var markup = ReactReconciler.mountComponent(componentInstance, rootID, transaction, context);\n componentInstance._renderedComponent._topLevelWrapper = componentInstance;\n ReactMount._mountImageIntoNode(markup, container, shouldReuseMarkup, transaction);\n}\n\n/**\n * Batched mount.\n *\n * @param {ReactComponent} componentInstance The instance to mount.\n * @param {string} rootID DOM ID of the root node.\n * @param {DOMElement} container DOM element to mount into.\n * @param {boolean} shouldReuseMarkup If true, do not insert markup\n */\nfunction batchedMountComponentIntoNode(componentInstance, rootID, container, shouldReuseMarkup, context) {\n var transaction = ReactUpdates.ReactReconcileTransaction.getPooled(\n /* forceHTML */shouldReuseMarkup);\n transaction.perform(mountComponentIntoNode, null, componentInstance, rootID, container, transaction, shouldReuseMarkup, context);\n ReactUpdates.ReactReconcileTransaction.release(transaction);\n}\n\n/**\n * Unmounts a component and removes it from the DOM.\n *\n * @param {ReactComponent} instance React component instance.\n * @param {DOMElement} container DOM element to unmount from.\n * @final\n * @internal\n * @see {ReactMount.unmountComponentAtNode}\n */\nfunction unmountComponentFromNode(instance, container) {\n ReactReconciler.unmountComponent(instance);\n\n if (container.nodeType === DOC_NODE_TYPE) {\n container = container.documentElement;\n }\n\n // http://jsperf.com/emptying-a-node\n while (container.lastChild) {\n container.removeChild(container.lastChild);\n }\n}\n\n/**\n * True if the supplied DOM node has a direct React-rendered child that is\n * not a React root element. Useful for warning in `render`,\n * `unmountComponentAtNode`, etc.\n *\n * @param {?DOMElement} node The candidate DOM node.\n * @return {boolean} True if the DOM element contains a direct child that was\n * rendered by React but is not a root element.\n * @internal\n */\nfunction hasNonRootReactChild(node) {\n var reactRootID = getReactRootID(node);\n return reactRootID ? reactRootID !== ReactInstanceHandles.getReactRootIDFromNodeID(reactRootID) : false;\n}\n\n/**\n * Returns the first (deepest) ancestor of a node which is rendered by this copy\n * of React.\n */\nfunction findFirstReactDOMImpl(node) {\n // This node might be from another React instance, so we make sure not to\n // examine the node cache here\n for (; node && node.parentNode !== node; node = node.parentNode) {\n if (node.nodeType !== 1) {\n // Not a DOMElement, therefore not a React component\n continue;\n }\n var nodeID = internalGetID(node);\n if (!nodeID) {\n continue;\n }\n var reactRootID = ReactInstanceHandles.getReactRootIDFromNodeID(nodeID);\n\n // If containersByReactRootID contains the container we find by crawling up\n // the tree, we know that this instance of React rendered the node.\n // nb. isValid's strategy (with containsNode) does not work because render\n // trees may be nested and we don't want a false positive in that case.\n var current = node;\n var lastID;\n do {\n lastID = internalGetID(current);\n current = current.parentNode;\n if (current == null) {\n // The passed-in node has been detached from the container it was\n // originally rendered into.\n return null;\n }\n } while (lastID !== reactRootID);\n\n if (current === containersByReactRootID[reactRootID]) {\n return node;\n }\n }\n return null;\n}\n\n/**\n * Temporary (?) hack so that we can store all top-level pending updates on\n * composites instead of having to worry about different types of components\n * here.\n */\nvar TopLevelWrapper = function () {};\nTopLevelWrapper.prototype.isReactComponent = {};\nif (process.env.NODE_ENV !== 'production') {\n TopLevelWrapper.displayName = 'TopLevelWrapper';\n}\nTopLevelWrapper.prototype.render = function () {\n // this.props is actually a ReactElement\n return this.props;\n};\n\n/**\n * Mounting is the process of initializing a React component by creating its\n * representative DOM elements and inserting them into a supplied `container`.\n * Any prior content inside `container` is destroyed in the process.\n *\n * ReactMount.render(\n * component,\n * document.getElementById('container')\n * );\n *\n * <div id=\"container\"> <-- Supplied `container`.\n * <div data-reactid=\".3\"> <-- Rendered reactRoot of React\n * // ... component.\n * </div>\n * </div>\n *\n * Inside of `container`, the first element rendered is the \"reactRoot\".\n */\nvar ReactMount = {\n\n TopLevelWrapper: TopLevelWrapper,\n\n /** Exposed for debugging purposes **/\n _instancesByReactRootID: instancesByReactRootID,\n\n /**\n * This is a hook provided to support rendering React components while\n * ensuring that the apparent scroll position of its `container` does not\n * change.\n *\n * @param {DOMElement} container The `container` being rendered into.\n * @param {function} renderCallback This must be called once to do the render.\n */\n scrollMonitor: function (container, renderCallback) {\n renderCallback();\n },\n\n /**\n * Take a component that's already mounted into the DOM and replace its props\n * @param {ReactComponent} prevComponent component instance already in the DOM\n * @param {ReactElement} nextElement component instance to render\n * @param {DOMElement} container container to render into\n * @param {?function} callback function triggered on completion\n */\n _updateRootComponent: function (prevComponent, nextElement, container, callback) {\n ReactMount.scrollMonitor(container, function () {\n ReactUpdateQueue.enqueueElementInternal(prevComponent, nextElement);\n if (callback) {\n ReactUpdateQueue.enqueueCallbackInternal(prevComponent, callback);\n }\n });\n\n if (process.env.NODE_ENV !== 'production') {\n // Record the root element in case it later gets transplanted.\n rootElementsByReactRootID[getReactRootID(container)] = getReactRootElementInContainer(container);\n }\n\n return prevComponent;\n },\n\n /**\n * Register a component into the instance map and starts scroll value\n * monitoring\n * @param {ReactComponent} nextComponent component instance to render\n * @param {DOMElement} container container to render into\n * @return {string} reactRoot ID prefix\n */\n _registerComponent: function (nextComponent, container) {\n !(container && (container.nodeType === ELEMENT_NODE_TYPE || container.nodeType === DOC_NODE_TYPE || container.nodeType === DOCUMENT_FRAGMENT_NODE_TYPE)) ? process.env.NODE_ENV !== 'production' ? invariant(false, '_registerComponent(...): Target container is not a DOM element.') : invariant(false) : undefined;\n\n ReactBrowserEventEmitter.ensureScrollValueMonitoring();\n\n var reactRootID = ReactMount.registerContainer(container);\n instancesByReactRootID[reactRootID] = nextComponent;\n return reactRootID;\n },\n\n /**\n * Render a new component into the DOM.\n * @param {ReactElement} nextElement element to render\n * @param {DOMElement} container container to render into\n * @param {boolean} shouldReuseMarkup if we should skip the markup insertion\n * @return {ReactComponent} nextComponent\n */\n _renderNewRootComponent: function (nextElement, container, shouldReuseMarkup, context) {\n // Various parts of our code (such as ReactCompositeComponent's\n // _renderValidatedComponent) assume that calls to render aren't nested;\n // verify that that's the case.\n process.env.NODE_ENV !== 'production' ? warning(ReactCurrentOwner.current == null, '_renderNewRootComponent(): Render methods should be a pure function ' + 'of props and state; triggering nested component updates from ' + 'render is not allowed. If necessary, trigger nested updates in ' + 'componentDidUpdate. Check the render method of %s.', ReactCurrentOwner.current && ReactCurrentOwner.current.getName() || 'ReactCompositeComponent') : undefined;\n\n var componentInstance = instantiateReactComponent(nextElement, null);\n var reactRootID = ReactMount._registerComponent(componentInstance, container);\n\n // The initial render is synchronous but any updates that happen during\n // rendering, in componentWillMount or componentDidMount, will be batched\n // according to the current batching strategy.\n\n ReactUpdates.batchedUpdates(batchedMountComponentIntoNode, componentInstance, reactRootID, container, shouldReuseMarkup, context);\n\n if (process.env.NODE_ENV !== 'production') {\n // Record the root element in case it later gets transplanted.\n rootElementsByReactRootID[reactRootID] = getReactRootElementInContainer(container);\n }\n\n return componentInstance;\n },\n\n /**\n * Renders a React component into the DOM in the supplied `container`.\n *\n * If the React component was previously rendered into `container`, this will\n * perform an update on it and only mutate the DOM as necessary to reflect the\n * latest React component.\n *\n * @param {ReactComponent} parentComponent The conceptual parent of this render tree.\n * @param {ReactElement} nextElement Component element to render.\n * @param {DOMElement} container DOM element to render into.\n * @param {?function} callback function triggered on completion\n * @return {ReactComponent} Component instance rendered in `container`.\n */\n renderSubtreeIntoContainer: function (parentComponent, nextElement, container, callback) {\n !(parentComponent != null && parentComponent._reactInternalInstance != null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'parentComponent must be a valid React Component') : invariant(false) : undefined;\n return ReactMount._renderSubtreeIntoContainer(parentComponent, nextElement, container, callback);\n },\n\n _renderSubtreeIntoContainer: function (parentComponent, nextElement, container, callback) {\n !ReactElement.isValidElement(nextElement) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactDOM.render(): Invalid component element.%s', typeof nextElement === 'string' ? ' Instead of passing an element string, make sure to instantiate ' + 'it by passing it to React.createElement.' : typeof nextElement === 'function' ? ' Instead of passing a component class, make sure to instantiate ' + 'it by passing it to React.createElement.' :\n // Check if it quacks like an element\n nextElement != null && nextElement.props !== undefined ? ' This may be caused by unintentionally loading two independent ' + 'copies of React.' : '') : invariant(false) : undefined;\n\n process.env.NODE_ENV !== 'production' ? warning(!container || !container.tagName || container.tagName.toUpperCase() !== 'BODY', 'render(): Rendering components directly into document.body is ' + 'discouraged, since its children are often manipulated by third-party ' + 'scripts and browser extensions. This may lead to subtle ' + 'reconciliation issues. Try rendering into a container element created ' + 'for your app.') : undefined;\n\n var nextWrappedElement = new ReactElement(TopLevelWrapper, null, null, null, null, null, nextElement);\n\n var prevComponent = instancesByReactRootID[getReactRootID(container)];\n\n if (prevComponent) {\n var prevWrappedElement = prevComponent._currentElement;\n var prevElement = prevWrappedElement.props;\n if (shouldUpdateReactComponent(prevElement, nextElement)) {\n var publicInst = prevComponent._renderedComponent.getPublicInstance();\n var updatedCallback = callback && function () {\n callback.call(publicInst);\n };\n ReactMount._updateRootComponent(prevComponent, nextWrappedElement, container, updatedCallback);\n return publicInst;\n } else {\n ReactMount.unmountComponentAtNode(container);\n }\n }\n\n var reactRootElement = getReactRootElementInContainer(container);\n var containerHasReactMarkup = reactRootElement && !!internalGetID(reactRootElement);\n var containerHasNonRootReactChild = hasNonRootReactChild(container);\n\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(!containerHasNonRootReactChild, 'render(...): Replacing React-rendered children with a new root ' + 'component. If you intended to update the children of this node, ' + 'you should instead have the existing children update their state ' + 'and render the new components instead of calling ReactDOM.render.') : undefined;\n\n if (!containerHasReactMarkup || reactRootElement.nextSibling) {\n var rootElementSibling = reactRootElement;\n while (rootElementSibling) {\n if (internalGetID(rootElementSibling)) {\n process.env.NODE_ENV !== 'production' ? warning(false, 'render(): Target node has markup rendered by React, but there ' + 'are unrelated nodes as well. This is most commonly caused by ' + 'white-space inserted around server-rendered markup.') : undefined;\n break;\n }\n rootElementSibling = rootElementSibling.nextSibling;\n }\n }\n }\n\n var shouldReuseMarkup = containerHasReactMarkup && !prevComponent && !containerHasNonRootReactChild;\n var component = ReactMount._renderNewRootComponent(nextWrappedElement, container, shouldReuseMarkup, parentComponent != null ? parentComponent._reactInternalInstance._processChildContext(parentComponent._reactInternalInstance._context) : emptyObject)._renderedComponent.getPublicInstance();\n if (callback) {\n callback.call(component);\n }\n return component;\n },\n\n /**\n * Renders a React component into the DOM in the supplied `container`.\n *\n * If the React component was previously rendered into `container`, this will\n * perform an update on it and only mutate the DOM as necessary to reflect the\n * latest React component.\n *\n * @param {ReactElement} nextElement Component element to render.\n * @param {DOMElement} container DOM element to render into.\n * @param {?function} callback function triggered on completion\n * @return {ReactComponent} Component instance rendered in `container`.\n */\n render: function (nextElement, container, callback) {\n return ReactMount._renderSubtreeIntoContainer(null, nextElement, container, callback);\n },\n\n /**\n * Registers a container node into which React components will be rendered.\n * This also creates the \"reactRoot\" ID that will be assigned to the element\n * rendered within.\n *\n * @param {DOMElement} container DOM element to register as a container.\n * @return {string} The \"reactRoot\" ID of elements rendered within.\n */\n registerContainer: function (container) {\n var reactRootID = getReactRootID(container);\n if (reactRootID) {\n // If one exists, make sure it is a valid \"reactRoot\" ID.\n reactRootID = ReactInstanceHandles.getReactRootIDFromNodeID(reactRootID);\n }\n if (!reactRootID) {\n // No valid \"reactRoot\" ID found, create one.\n reactRootID = ReactInstanceHandles.createReactRootID();\n }\n containersByReactRootID[reactRootID] = container;\n return reactRootID;\n },\n\n /**\n * Unmounts and destroys the React component rendered in the `container`.\n *\n * @param {DOMElement} container DOM element containing a React component.\n * @return {boolean} True if a component was found in and unmounted from\n * `container`\n */\n unmountComponentAtNode: function (container) {\n // Various parts of our code (such as ReactCompositeComponent's\n // _renderValidatedComponent) assume that calls to render aren't nested;\n // verify that that's the case. (Strictly speaking, unmounting won't cause a\n // render but we still don't expect to be in a render call here.)\n process.env.NODE_ENV !== 'production' ? warning(ReactCurrentOwner.current == null, 'unmountComponentAtNode(): Render methods should be a pure function ' + 'of props and state; triggering nested component updates from render ' + 'is not allowed. If necessary, trigger nested updates in ' + 'componentDidUpdate. Check the render method of %s.', ReactCurrentOwner.current && ReactCurrentOwner.current.getName() || 'ReactCompositeComponent') : undefined;\n\n !(container && (container.nodeType === ELEMENT_NODE_TYPE || container.nodeType === DOC_NODE_TYPE || container.nodeType === DOCUMENT_FRAGMENT_NODE_TYPE)) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'unmountComponentAtNode(...): Target container is not a DOM element.') : invariant(false) : undefined;\n\n var reactRootID = getReactRootID(container);\n var component = instancesByReactRootID[reactRootID];\n if (!component) {\n // Check if the node being unmounted was rendered by React, but isn't a\n // root node.\n var containerHasNonRootReactChild = hasNonRootReactChild(container);\n\n // Check if the container itself is a React root node.\n var containerID = internalGetID(container);\n var isContainerReactRoot = containerID && containerID === ReactInstanceHandles.getReactRootIDFromNodeID(containerID);\n\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(!containerHasNonRootReactChild, 'unmountComponentAtNode(): The node you\\'re attempting to unmount ' + 'was rendered by React and is not a top-level container. %s', isContainerReactRoot ? 'You may have accidentally passed in a React root node instead ' + 'of its container.' : 'Instead, have the parent component update its state and ' + 'rerender in order to remove this component.') : undefined;\n }\n\n return false;\n }\n ReactUpdates.batchedUpdates(unmountComponentFromNode, component, container);\n delete instancesByReactRootID[reactRootID];\n delete containersByReactRootID[reactRootID];\n if (process.env.NODE_ENV !== 'production') {\n delete rootElementsByReactRootID[reactRootID];\n }\n return true;\n },\n\n /**\n * Finds the container DOM element that contains React component to which the\n * supplied DOM `id` belongs.\n *\n * @param {string} id The ID of an element rendered by a React component.\n * @return {?DOMElement} DOM element that contains the `id`.\n */\n findReactContainerForID: function (id) {\n var reactRootID = ReactInstanceHandles.getReactRootIDFromNodeID(id);\n var container = containersByReactRootID[reactRootID];\n\n if (process.env.NODE_ENV !== 'production') {\n var rootElement = rootElementsByReactRootID[reactRootID];\n if (rootElement && rootElement.parentNode !== container) {\n process.env.NODE_ENV !== 'production' ? warning(\n // Call internalGetID here because getID calls isValid which calls\n // findReactContainerForID (this function).\n internalGetID(rootElement) === reactRootID, 'ReactMount: Root element ID differed from reactRootID.') : undefined;\n var containerChild = container.firstChild;\n if (containerChild && reactRootID === internalGetID(containerChild)) {\n // If the container has a new child with the same ID as the old\n // root element, then rootElementsByReactRootID[reactRootID] is\n // just stale and needs to be updated. The case that deserves a\n // warning is when the container is empty.\n rootElementsByReactRootID[reactRootID] = containerChild;\n } else {\n process.env.NODE_ENV !== 'production' ? warning(false, 'ReactMount: Root element has been removed from its original ' + 'container. New container: %s', rootElement.parentNode) : undefined;\n }\n }\n }\n\n return container;\n },\n\n /**\n * Finds an element rendered by React with the supplied ID.\n *\n * @param {string} id ID of a DOM node in the React component.\n * @return {DOMElement} Root DOM node of the React component.\n */\n findReactNodeByID: function (id) {\n var reactRoot = ReactMount.findReactContainerForID(id);\n return ReactMount.findComponentRoot(reactRoot, id);\n },\n\n /**\n * Traverses up the ancestors of the supplied node to find a node that is a\n * DOM representation of a React component rendered by this copy of React.\n *\n * @param {*} node\n * @return {?DOMEventTarget}\n * @internal\n */\n getFirstReactDOM: function (node) {\n return findFirstReactDOMImpl(node);\n },\n\n /**\n * Finds a node with the supplied `targetID` inside of the supplied\n * `ancestorNode`. Exploits the ID naming scheme to perform the search\n * quickly.\n *\n * @param {DOMEventTarget} ancestorNode Search from this root.\n * @pararm {string} targetID ID of the DOM representation of the component.\n * @return {DOMEventTarget} DOM node with the supplied `targetID`.\n * @internal\n */\n findComponentRoot: function (ancestorNode, targetID) {\n var firstChildren = findComponentRootReusableArray;\n var childIndex = 0;\n\n var deepestAncestor = findDeepestCachedAncestor(targetID) || ancestorNode;\n\n if (process.env.NODE_ENV !== 'production') {\n // This will throw on the next line; give an early warning\n process.env.NODE_ENV !== 'production' ? warning(deepestAncestor != null, 'React can\\'t find the root component node for data-reactid value ' + '`%s`. If you\\'re seeing this message, it probably means that ' + 'you\\'ve loaded two copies of React on the page. At this time, only ' + 'a single copy of React can be loaded at a time.', targetID) : undefined;\n }\n\n firstChildren[0] = deepestAncestor.firstChild;\n firstChildren.length = 1;\n\n while (childIndex < firstChildren.length) {\n var child = firstChildren[childIndex++];\n var targetChild;\n\n while (child) {\n var childID = ReactMount.getID(child);\n if (childID) {\n // Even if we find the node we're looking for, we finish looping\n // through its siblings to ensure they're cached so that we don't have\n // to revisit this node again. Otherwise, we make n^2 calls to getID\n // when visiting the many children of a single node in order.\n\n if (targetID === childID) {\n targetChild = child;\n } else if (ReactInstanceHandles.isAncestorIDOf(childID, targetID)) {\n // If we find a child whose ID is an ancestor of the given ID,\n // then we can be sure that we only want to search the subtree\n // rooted at this child, so we can throw out the rest of the\n // search state.\n firstChildren.length = childIndex = 0;\n firstChildren.push(child.firstChild);\n }\n } else {\n // If this child had no ID, then there's a chance that it was\n // injected automatically by the browser, as when a `<table>`\n // element sprouts an extra `<tbody>` child as a side effect of\n // `.innerHTML` parsing. Optimistically continue down this\n // branch, but not before examining the other siblings.\n firstChildren.push(child.firstChild);\n }\n\n child = child.nextSibling;\n }\n\n if (targetChild) {\n // Emptying firstChildren/findComponentRootReusableArray is\n // not necessary for correctness, but it helps the GC reclaim\n // any nodes that were left at the end of the search.\n firstChildren.length = 0;\n\n return targetChild;\n }\n }\n\n firstChildren.length = 0;\n\n !false ? process.env.NODE_ENV !== 'production' ? invariant(false, 'findComponentRoot(..., %s): Unable to find element. This probably ' + 'means the DOM was unexpectedly mutated (e.g., by the browser), ' + 'usually due to forgetting a <tbody> when using tables, nesting tags ' + 'like <form>, <p>, or <a>, or using non-SVG elements in an <svg> ' + 'parent. ' + 'Try inspecting the child nodes of the element with React ID `%s`.', targetID, ReactMount.getID(ancestorNode)) : invariant(false) : undefined;\n },\n\n _mountImageIntoNode: function (markup, container, shouldReuseMarkup, transaction) {\n !(container && (container.nodeType === ELEMENT_NODE_TYPE || container.nodeType === DOC_NODE_TYPE || container.nodeType === DOCUMENT_FRAGMENT_NODE_TYPE)) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'mountComponentIntoNode(...): Target container is not valid.') : invariant(false) : undefined;\n\n if (shouldReuseMarkup) {\n var rootElement = getReactRootElementInContainer(container);\n if (ReactMarkupChecksum.canReuseMarkup(markup, rootElement)) {\n return;\n } else {\n var checksum = rootElement.getAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME);\n rootElement.removeAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME);\n\n var rootMarkup = rootElement.outerHTML;\n rootElement.setAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME, checksum);\n\n var normalizedMarkup = markup;\n if (process.env.NODE_ENV !== 'production') {\n // because rootMarkup is retrieved from the DOM, various normalizations\n // will have occurred which will not be present in `markup`. Here,\n // insert markup into a <div> or <iframe> depending on the container\n // type to perform the same normalizations before comparing.\n var normalizer;\n if (container.nodeType === ELEMENT_NODE_TYPE) {\n normalizer = document.createElement('div');\n normalizer.innerHTML = markup;\n normalizedMarkup = normalizer.innerHTML;\n } else {\n normalizer = document.createElement('iframe');\n document.body.appendChild(normalizer);\n normalizer.contentDocument.write(markup);\n normalizedMarkup = normalizer.contentDocument.documentElement.outerHTML;\n document.body.removeChild(normalizer);\n }\n }\n\n var diffIndex = firstDifferenceIndex(normalizedMarkup, rootMarkup);\n var difference = ' (client) ' + normalizedMarkup.substring(diffIndex - 20, diffIndex + 20) + '\\n (server) ' + rootMarkup.substring(diffIndex - 20, diffIndex + 20);\n\n !(container.nodeType !== DOC_NODE_TYPE) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'You\\'re trying to render a component to the document using ' + 'server rendering but the checksum was invalid. This usually ' + 'means you rendered a different component type or props on ' + 'the client from the one on the server, or your render() ' + 'methods are impure. React cannot handle this case due to ' + 'cross-browser quirks by rendering at the document root. You ' + 'should look for environment dependent code in your components ' + 'and ensure the props are the same client and server side:\\n%s', difference) : invariant(false) : undefined;\n\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(false, 'React attempted to reuse markup in a container but the ' + 'checksum was invalid. This generally means that you are ' + 'using server rendering and the markup generated on the ' + 'server was not what the client was expecting. React injected ' + 'new markup to compensate which works but you have lost many ' + 'of the benefits of server rendering. Instead, figure out ' + 'why the markup being generated is different on the client ' + 'or server:\\n%s', difference) : undefined;\n }\n }\n }\n\n !(container.nodeType !== DOC_NODE_TYPE) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'You\\'re trying to render a component to the document but ' + 'you didn\\'t use server rendering. We can\\'t do this ' + 'without using server rendering due to cross-browser quirks. ' + 'See ReactDOMServer.renderToString() for server rendering.') : invariant(false) : undefined;\n\n if (transaction.useCreateElement) {\n while (container.lastChild) {\n container.removeChild(container.lastChild);\n }\n container.appendChild(markup);\n } else {\n setInnerHTML(container, markup);\n }\n },\n\n ownerDocumentContextKey: ownerDocumentContextKey,\n\n /**\n * React ID utilities.\n */\n\n getReactRootID: getReactRootID,\n\n getID: getID,\n\n setID: setID,\n\n getNode: getNode,\n\n getNodeFromInstance: getNodeFromInstance,\n\n isValid: isValid,\n\n purgeID: purgeID\n};\n\nReactPerf.measureMethods(ReactMount, 'ReactMount', {\n _renderNewRootComponent: '_renderNewRootComponent',\n _mountImageIntoNode: '_mountImageIntoNode'\n});\n\nmodule.exports = ReactMount;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactMount.js\n ** module id = 27\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactBrowserEventEmitter\n * @typechecks static-only\n */\n\n'use strict';\n\nvar EventConstants = require('./EventConstants');\nvar EventPluginHub = require('./EventPluginHub');\nvar EventPluginRegistry = require('./EventPluginRegistry');\nvar ReactEventEmitterMixin = require('./ReactEventEmitterMixin');\nvar ReactPerf = require('./ReactPerf');\nvar ViewportMetrics = require('./ViewportMetrics');\n\nvar assign = require('./Object.assign');\nvar isEventSupported = require('./isEventSupported');\n\n/**\n * Summary of `ReactBrowserEventEmitter` event handling:\n *\n * - Top-level delegation is used to trap most native browser events. This\n * may only occur in the main thread and is the responsibility of\n * ReactEventListener, which is injected and can therefore support pluggable\n * event sources. This is the only work that occurs in the main thread.\n *\n * - We normalize and de-duplicate events to account for browser quirks. This\n * may be done in the worker thread.\n *\n * - Forward these native events (with the associated top-level type used to\n * trap it) to `EventPluginHub`, which in turn will ask plugins if they want\n * to extract any synthetic events.\n *\n * - The `EventPluginHub` will then process each event by annotating them with\n * \"dispatches\", a sequence of listeners and IDs that care about that event.\n *\n * - The `EventPluginHub` then dispatches the events.\n *\n * Overview of React and the event system:\n *\n * +------------+ .\n * | DOM | .\n * +------------+ .\n * | .\n * v .\n * +------------+ .\n * | ReactEvent | .\n * | Listener | .\n * +------------+ . +-----------+\n * | . +--------+|SimpleEvent|\n * | . | |Plugin |\n * +-----|------+ . v +-----------+\n * | | | . +--------------+ +------------+\n * | +-----------.--->|EventPluginHub| | Event |\n * | | . | | +-----------+ | Propagators|\n * | ReactEvent | . | | |TapEvent | |------------|\n * | Emitter | . | |<---+|Plugin | |other plugin|\n * | | . | | +-----------+ | utilities |\n * | +-----------.--->| | +------------+\n * | | | . +--------------+\n * +-----|------+ . ^ +-----------+\n * | . | |Enter/Leave|\n * + . +-------+|Plugin |\n * +-------------+ . +-----------+\n * | application | .\n * |-------------| .\n * | | .\n * | | .\n * +-------------+ .\n * .\n * React Core . General Purpose Event Plugin System\n */\n\nvar alreadyListeningTo = {};\nvar isMonitoringScrollValue = false;\nvar reactTopListenersCounter = 0;\n\n// For events like 'submit' which don't consistently bubble (which we trap at a\n// lower node than `document`), binding at `document` would cause duplicate\n// events so we don't include them here\nvar topEventMapping = {\n topAbort: 'abort',\n topBlur: 'blur',\n topCanPlay: 'canplay',\n topCanPlayThrough: 'canplaythrough',\n topChange: 'change',\n topClick: 'click',\n topCompositionEnd: 'compositionend',\n topCompositionStart: 'compositionstart',\n topCompositionUpdate: 'compositionupdate',\n topContextMenu: 'contextmenu',\n topCopy: 'copy',\n topCut: 'cut',\n topDoubleClick: 'dblclick',\n topDrag: 'drag',\n topDragEnd: 'dragend',\n topDragEnter: 'dragenter',\n topDragExit: 'dragexit',\n topDragLeave: 'dragleave',\n topDragOver: 'dragover',\n topDragStart: 'dragstart',\n topDrop: 'drop',\n topDurationChange: 'durationchange',\n topEmptied: 'emptied',\n topEncrypted: 'encrypted',\n topEnded: 'ended',\n topError: 'error',\n topFocus: 'focus',\n topInput: 'input',\n topKeyDown: 'keydown',\n topKeyPress: 'keypress',\n topKeyUp: 'keyup',\n topLoadedData: 'loadeddata',\n topLoadedMetadata: 'loadedmetadata',\n topLoadStart: 'loadstart',\n topMouseDown: 'mousedown',\n topMouseMove: 'mousemove',\n topMouseOut: 'mouseout',\n topMouseOver: 'mouseover',\n topMouseUp: 'mouseup',\n topPaste: 'paste',\n topPause: 'pause',\n topPlay: 'play',\n topPlaying: 'playing',\n topProgress: 'progress',\n topRateChange: 'ratechange',\n topScroll: 'scroll',\n topSeeked: 'seeked',\n topSeeking: 'seeking',\n topSelectionChange: 'selectionchange',\n topStalled: 'stalled',\n topSuspend: 'suspend',\n topTextInput: 'textInput',\n topTimeUpdate: 'timeupdate',\n topTouchCancel: 'touchcancel',\n topTouchEnd: 'touchend',\n topTouchMove: 'touchmove',\n topTouchStart: 'touchstart',\n topVolumeChange: 'volumechange',\n topWaiting: 'waiting',\n topWheel: 'wheel'\n};\n\n/**\n * To ensure no conflicts with other potential React instances on the page\n */\nvar topListenersIDKey = '_reactListenersID' + String(Math.random()).slice(2);\n\nfunction getListeningForDocument(mountAt) {\n // In IE8, `mountAt` is a host object and doesn't have `hasOwnProperty`\n // directly.\n if (!Object.prototype.hasOwnProperty.call(mountAt, topListenersIDKey)) {\n mountAt[topListenersIDKey] = reactTopListenersCounter++;\n alreadyListeningTo[mountAt[topListenersIDKey]] = {};\n }\n return alreadyListeningTo[mountAt[topListenersIDKey]];\n}\n\n/**\n * `ReactBrowserEventEmitter` is used to attach top-level event listeners. For\n * example:\n *\n * ReactBrowserEventEmitter.putListener('myID', 'onClick', myFunction);\n *\n * This would allocate a \"registration\" of `('onClick', myFunction)` on 'myID'.\n *\n * @internal\n */\nvar ReactBrowserEventEmitter = assign({}, ReactEventEmitterMixin, {\n\n /**\n * Injectable event backend\n */\n ReactEventListener: null,\n\n injection: {\n /**\n * @param {object} ReactEventListener\n */\n injectReactEventListener: function (ReactEventListener) {\n ReactEventListener.setHandleTopLevel(ReactBrowserEventEmitter.handleTopLevel);\n ReactBrowserEventEmitter.ReactEventListener = ReactEventListener;\n }\n },\n\n /**\n * Sets whether or not any created callbacks should be enabled.\n *\n * @param {boolean} enabled True if callbacks should be enabled.\n */\n setEnabled: function (enabled) {\n if (ReactBrowserEventEmitter.ReactEventListener) {\n ReactBrowserEventEmitter.ReactEventListener.setEnabled(enabled);\n }\n },\n\n /**\n * @return {boolean} True if callbacks are enabled.\n */\n isEnabled: function () {\n return !!(ReactBrowserEventEmitter.ReactEventListener && ReactBrowserEventEmitter.ReactEventListener.isEnabled());\n },\n\n /**\n * We listen for bubbled touch events on the document object.\n *\n * Firefox v8.01 (and possibly others) exhibited strange behavior when\n * mounting `onmousemove` events at some node that was not the document\n * element. The symptoms were that if your mouse is not moving over something\n * contained within that mount point (for example on the background) the\n * top-level listeners for `onmousemove` won't be called. However, if you\n * register the `mousemove` on the document object, then it will of course\n * catch all `mousemove`s. This along with iOS quirks, justifies restricting\n * top-level listeners to the document object only, at least for these\n * movement types of events and possibly all events.\n *\n * @see http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html\n *\n * Also, `keyup`/`keypress`/`keydown` do not bubble to the window on IE, but\n * they bubble to document.\n *\n * @param {string} registrationName Name of listener (e.g. `onClick`).\n * @param {object} contentDocumentHandle Document which owns the container\n */\n listenTo: function (registrationName, contentDocumentHandle) {\n var mountAt = contentDocumentHandle;\n var isListening = getListeningForDocument(mountAt);\n var dependencies = EventPluginRegistry.registrationNameDependencies[registrationName];\n\n var topLevelTypes = EventConstants.topLevelTypes;\n for (var i = 0; i < dependencies.length; i++) {\n var dependency = dependencies[i];\n if (!(isListening.hasOwnProperty(dependency) && isListening[dependency])) {\n if (dependency === topLevelTypes.topWheel) {\n if (isEventSupported('wheel')) {\n ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelTypes.topWheel, 'wheel', mountAt);\n } else if (isEventSupported('mousewheel')) {\n ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelTypes.topWheel, 'mousewheel', mountAt);\n } else {\n // Firefox needs to capture a different mouse scroll event.\n // @see http://www.quirksmode.org/dom/events/tests/scroll.html\n ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelTypes.topWheel, 'DOMMouseScroll', mountAt);\n }\n } else if (dependency === topLevelTypes.topScroll) {\n\n if (isEventSupported('scroll', true)) {\n ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(topLevelTypes.topScroll, 'scroll', mountAt);\n } else {\n ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelTypes.topScroll, 'scroll', ReactBrowserEventEmitter.ReactEventListener.WINDOW_HANDLE);\n }\n } else if (dependency === topLevelTypes.topFocus || dependency === topLevelTypes.topBlur) {\n\n if (isEventSupported('focus', true)) {\n ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(topLevelTypes.topFocus, 'focus', mountAt);\n ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(topLevelTypes.topBlur, 'blur', mountAt);\n } else if (isEventSupported('focusin')) {\n // IE has `focusin` and `focusout` events which bubble.\n // @see http://www.quirksmode.org/blog/archives/2008/04/delegating_the.html\n ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelTypes.topFocus, 'focusin', mountAt);\n ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelTypes.topBlur, 'focusout', mountAt);\n }\n\n // to make sure blur and focus event listeners are only attached once\n isListening[topLevelTypes.topBlur] = true;\n isListening[topLevelTypes.topFocus] = true;\n } else if (topEventMapping.hasOwnProperty(dependency)) {\n ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(dependency, topEventMapping[dependency], mountAt);\n }\n\n isListening[dependency] = true;\n }\n }\n },\n\n trapBubbledEvent: function (topLevelType, handlerBaseName, handle) {\n return ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelType, handlerBaseName, handle);\n },\n\n trapCapturedEvent: function (topLevelType, handlerBaseName, handle) {\n return ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(topLevelType, handlerBaseName, handle);\n },\n\n /**\n * Listens to window scroll and resize events. We cache scroll values so that\n * application code can access them without triggering reflows.\n *\n * NOTE: Scroll events do not bubble.\n *\n * @see http://www.quirksmode.org/dom/events/scroll.html\n */\n ensureScrollValueMonitoring: function () {\n if (!isMonitoringScrollValue) {\n var refresh = ViewportMetrics.refreshScrollValues;\n ReactBrowserEventEmitter.ReactEventListener.monitorScrollValue(refresh);\n isMonitoringScrollValue = true;\n }\n },\n\n eventNameDispatchConfigs: EventPluginHub.eventNameDispatchConfigs,\n\n registrationNameModules: EventPluginHub.registrationNameModules,\n\n putListener: EventPluginHub.putListener,\n\n getListener: EventPluginHub.getListener,\n\n deleteListener: EventPluginHub.deleteListener,\n\n deleteAllListeners: EventPluginHub.deleteAllListeners\n\n});\n\nReactPerf.measureMethods(ReactBrowserEventEmitter, 'ReactBrowserEventEmitter', {\n putListener: 'putListener',\n deleteListener: 'deleteListener'\n});\n\nmodule.exports = ReactBrowserEventEmitter;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactBrowserEventEmitter.js\n ** module id = 28\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule EventConstants\n */\n\n'use strict';\n\nvar keyMirror = require('fbjs/lib/keyMirror');\n\nvar PropagationPhases = keyMirror({ bubbled: null, captured: null });\n\n/**\n * Types of raw signals from the browser caught at the top level.\n */\nvar topLevelTypes = keyMirror({\n topAbort: null,\n topBlur: null,\n topCanPlay: null,\n topCanPlayThrough: null,\n topChange: null,\n topClick: null,\n topCompositionEnd: null,\n topCompositionStart: null,\n topCompositionUpdate: null,\n topContextMenu: null,\n topCopy: null,\n topCut: null,\n topDoubleClick: null,\n topDrag: null,\n topDragEnd: null,\n topDragEnter: null,\n topDragExit: null,\n topDragLeave: null,\n topDragOver: null,\n topDragStart: null,\n topDrop: null,\n topDurationChange: null,\n topEmptied: null,\n topEncrypted: null,\n topEnded: null,\n topError: null,\n topFocus: null,\n topInput: null,\n topKeyDown: null,\n topKeyPress: null,\n topKeyUp: null,\n topLoad: null,\n topLoadedData: null,\n topLoadedMetadata: null,\n topLoadStart: null,\n topMouseDown: null,\n topMouseMove: null,\n topMouseOut: null,\n topMouseOver: null,\n topMouseUp: null,\n topPaste: null,\n topPause: null,\n topPlay: null,\n topPlaying: null,\n topProgress: null,\n topRateChange: null,\n topReset: null,\n topScroll: null,\n topSeeked: null,\n topSeeking: null,\n topSelectionChange: null,\n topStalled: null,\n topSubmit: null,\n topSuspend: null,\n topTextInput: null,\n topTimeUpdate: null,\n topTouchCancel: null,\n topTouchEnd: null,\n topTouchMove: null,\n topTouchStart: null,\n topVolumeChange: null,\n topWaiting: null,\n topWheel: null\n});\n\nvar EventConstants = {\n topLevelTypes: topLevelTypes,\n PropagationPhases: PropagationPhases\n};\n\nmodule.exports = EventConstants;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/EventConstants.js\n ** module id = 29\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule EventPluginHub\n */\n\n'use strict';\n\nvar EventPluginRegistry = require('./EventPluginRegistry');\nvar EventPluginUtils = require('./EventPluginUtils');\nvar ReactErrorUtils = require('./ReactErrorUtils');\n\nvar accumulateInto = require('./accumulateInto');\nvar forEachAccumulated = require('./forEachAccumulated');\nvar invariant = require('fbjs/lib/invariant');\nvar warning = require('fbjs/lib/warning');\n\n/**\n * Internal store for event listeners\n */\nvar listenerBank = {};\n\n/**\n * Internal queue of events that have accumulated their dispatches and are\n * waiting to have their dispatches executed.\n */\nvar eventQueue = null;\n\n/**\n * Dispatches an event and releases it back into the pool, unless persistent.\n *\n * @param {?object} event Synthetic event to be dispatched.\n * @param {boolean} simulated If the event is simulated (changes exn behavior)\n * @private\n */\nvar executeDispatchesAndRelease = function (event, simulated) {\n if (event) {\n EventPluginUtils.executeDispatchesInOrder(event, simulated);\n\n if (!event.isPersistent()) {\n event.constructor.release(event);\n }\n }\n};\nvar executeDispatchesAndReleaseSimulated = function (e) {\n return executeDispatchesAndRelease(e, true);\n};\nvar executeDispatchesAndReleaseTopLevel = function (e) {\n return executeDispatchesAndRelease(e, false);\n};\n\n/**\n * - `InstanceHandle`: [required] Module that performs logical traversals of DOM\n * hierarchy given ids of the logical DOM elements involved.\n */\nvar InstanceHandle = null;\n\nfunction validateInstanceHandle() {\n var valid = InstanceHandle && InstanceHandle.traverseTwoPhase && InstanceHandle.traverseEnterLeave;\n process.env.NODE_ENV !== 'production' ? warning(valid, 'InstanceHandle not injected before use!') : undefined;\n}\n\n/**\n * This is a unified interface for event plugins to be installed and configured.\n *\n * Event plugins can implement the following properties:\n *\n * `extractEvents` {function(string, DOMEventTarget, string, object): *}\n * Required. When a top-level event is fired, this method is expected to\n * extract synthetic events that will in turn be queued and dispatched.\n *\n * `eventTypes` {object}\n * Optional, plugins that fire events must publish a mapping of registration\n * names that are used to register listeners. Values of this mapping must\n * be objects that contain `registrationName` or `phasedRegistrationNames`.\n *\n * `executeDispatch` {function(object, function, string)}\n * Optional, allows plugins to override how an event gets dispatched. By\n * default, the listener is simply invoked.\n *\n * Each plugin that is injected into `EventsPluginHub` is immediately operable.\n *\n * @public\n */\nvar EventPluginHub = {\n\n /**\n * Methods for injecting dependencies.\n */\n injection: {\n\n /**\n * @param {object} InjectedMount\n * @public\n */\n injectMount: EventPluginUtils.injection.injectMount,\n\n /**\n * @param {object} InjectedInstanceHandle\n * @public\n */\n injectInstanceHandle: function (InjectedInstanceHandle) {\n InstanceHandle = InjectedInstanceHandle;\n if (process.env.NODE_ENV !== 'production') {\n validateInstanceHandle();\n }\n },\n\n getInstanceHandle: function () {\n if (process.env.NODE_ENV !== 'production') {\n validateInstanceHandle();\n }\n return InstanceHandle;\n },\n\n /**\n * @param {array} InjectedEventPluginOrder\n * @public\n */\n injectEventPluginOrder: EventPluginRegistry.injectEventPluginOrder,\n\n /**\n * @param {object} injectedNamesToPlugins Map from names to plugin modules.\n */\n injectEventPluginsByName: EventPluginRegistry.injectEventPluginsByName\n\n },\n\n eventNameDispatchConfigs: EventPluginRegistry.eventNameDispatchConfigs,\n\n registrationNameModules: EventPluginRegistry.registrationNameModules,\n\n /**\n * Stores `listener` at `listenerBank[registrationName][id]`. Is idempotent.\n *\n * @param {string} id ID of the DOM element.\n * @param {string} registrationName Name of listener (e.g. `onClick`).\n * @param {?function} listener The callback to store.\n */\n putListener: function (id, registrationName, listener) {\n !(typeof listener === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Expected %s listener to be a function, instead got type %s', registrationName, typeof listener) : invariant(false) : undefined;\n\n var bankForRegistrationName = listenerBank[registrationName] || (listenerBank[registrationName] = {});\n bankForRegistrationName[id] = listener;\n\n var PluginModule = EventPluginRegistry.registrationNameModules[registrationName];\n if (PluginModule && PluginModule.didPutListener) {\n PluginModule.didPutListener(id, registrationName, listener);\n }\n },\n\n /**\n * @param {string} id ID of the DOM element.\n * @param {string} registrationName Name of listener (e.g. `onClick`).\n * @return {?function} The stored callback.\n */\n getListener: function (id, registrationName) {\n var bankForRegistrationName = listenerBank[registrationName];\n return bankForRegistrationName && bankForRegistrationName[id];\n },\n\n /**\n * Deletes a listener from the registration bank.\n *\n * @param {string} id ID of the DOM element.\n * @param {string} registrationName Name of listener (e.g. `onClick`).\n */\n deleteListener: function (id, registrationName) {\n var PluginModule = EventPluginRegistry.registrationNameModules[registrationName];\n if (PluginModule && PluginModule.willDeleteListener) {\n PluginModule.willDeleteListener(id, registrationName);\n }\n\n var bankForRegistrationName = listenerBank[registrationName];\n // TODO: This should never be null -- when is it?\n if (bankForRegistrationName) {\n delete bankForRegistrationName[id];\n }\n },\n\n /**\n * Deletes all listeners for the DOM element with the supplied ID.\n *\n * @param {string} id ID of the DOM element.\n */\n deleteAllListeners: function (id) {\n for (var registrationName in listenerBank) {\n if (!listenerBank[registrationName][id]) {\n continue;\n }\n\n var PluginModule = EventPluginRegistry.registrationNameModules[registrationName];\n if (PluginModule && PluginModule.willDeleteListener) {\n PluginModule.willDeleteListener(id, registrationName);\n }\n\n delete listenerBank[registrationName][id];\n }\n },\n\n /**\n * Allows registered plugins an opportunity to extract events from top-level\n * native browser events.\n *\n * @param {string} topLevelType Record from `EventConstants`.\n * @param {DOMEventTarget} topLevelTarget The listening component root node.\n * @param {string} topLevelTargetID ID of `topLevelTarget`.\n * @param {object} nativeEvent Native browser event.\n * @return {*} An accumulation of synthetic events.\n * @internal\n */\n extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) {\n var events;\n var plugins = EventPluginRegistry.plugins;\n for (var i = 0; i < plugins.length; i++) {\n // Not every plugin in the ordering may be loaded at runtime.\n var possiblePlugin = plugins[i];\n if (possiblePlugin) {\n var extractedEvents = possiblePlugin.extractEvents(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget);\n if (extractedEvents) {\n events = accumulateInto(events, extractedEvents);\n }\n }\n }\n return events;\n },\n\n /**\n * Enqueues a synthetic event that should be dispatched when\n * `processEventQueue` is invoked.\n *\n * @param {*} events An accumulation of synthetic events.\n * @internal\n */\n enqueueEvents: function (events) {\n if (events) {\n eventQueue = accumulateInto(eventQueue, events);\n }\n },\n\n /**\n * Dispatches all synthetic events on the event queue.\n *\n * @internal\n */\n processEventQueue: function (simulated) {\n // Set `eventQueue` to null before processing it so that we can tell if more\n // events get enqueued while processing.\n var processingEventQueue = eventQueue;\n eventQueue = null;\n if (simulated) {\n forEachAccumulated(processingEventQueue, executeDispatchesAndReleaseSimulated);\n } else {\n forEachAccumulated(processingEventQueue, executeDispatchesAndReleaseTopLevel);\n }\n !!eventQueue ? process.env.NODE_ENV !== 'production' ? invariant(false, 'processEventQueue(): Additional events were enqueued while processing ' + 'an event queue. Support for this has not yet been implemented.') : invariant(false) : undefined;\n // This would be a good time to rethrow if any of the event handlers threw.\n ReactErrorUtils.rethrowCaughtError();\n },\n\n /**\n * These are needed for tests only. Do not use!\n */\n __purge: function () {\n listenerBank = {};\n },\n\n __getListenerBank: function () {\n return listenerBank;\n }\n\n};\n\nmodule.exports = EventPluginHub;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/EventPluginHub.js\n ** module id = 30\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule EventPluginRegistry\n * @typechecks static-only\n */\n\n'use strict';\n\nvar invariant = require('fbjs/lib/invariant');\n\n/**\n * Injectable ordering of event plugins.\n */\nvar EventPluginOrder = null;\n\n/**\n * Injectable mapping from names to event plugin modules.\n */\nvar namesToPlugins = {};\n\n/**\n * Recomputes the plugin list using the injected plugins and plugin ordering.\n *\n * @private\n */\nfunction recomputePluginOrdering() {\n if (!EventPluginOrder) {\n // Wait until an `EventPluginOrder` is injected.\n return;\n }\n for (var pluginName in namesToPlugins) {\n var PluginModule = namesToPlugins[pluginName];\n var pluginIndex = EventPluginOrder.indexOf(pluginName);\n !(pluginIndex > -1) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginRegistry: Cannot inject event plugins that do not exist in ' + 'the plugin ordering, `%s`.', pluginName) : invariant(false) : undefined;\n if (EventPluginRegistry.plugins[pluginIndex]) {\n continue;\n }\n !PluginModule.extractEvents ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginRegistry: Event plugins must implement an `extractEvents` ' + 'method, but `%s` does not.', pluginName) : invariant(false) : undefined;\n EventPluginRegistry.plugins[pluginIndex] = PluginModule;\n var publishedEvents = PluginModule.eventTypes;\n for (var eventName in publishedEvents) {\n !publishEventForPlugin(publishedEvents[eventName], PluginModule, eventName) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginRegistry: Failed to publish event `%s` for plugin `%s`.', eventName, pluginName) : invariant(false) : undefined;\n }\n }\n}\n\n/**\n * Publishes an event so that it can be dispatched by the supplied plugin.\n *\n * @param {object} dispatchConfig Dispatch configuration for the event.\n * @param {object} PluginModule Plugin publishing the event.\n * @return {boolean} True if the event was successfully published.\n * @private\n */\nfunction publishEventForPlugin(dispatchConfig, PluginModule, eventName) {\n !!EventPluginRegistry.eventNameDispatchConfigs.hasOwnProperty(eventName) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginHub: More than one plugin attempted to publish the same ' + 'event name, `%s`.', eventName) : invariant(false) : undefined;\n EventPluginRegistry.eventNameDispatchConfigs[eventName] = dispatchConfig;\n\n var phasedRegistrationNames = dispatchConfig.phasedRegistrationNames;\n if (phasedRegistrationNames) {\n for (var phaseName in phasedRegistrationNames) {\n if (phasedRegistrationNames.hasOwnProperty(phaseName)) {\n var phasedRegistrationName = phasedRegistrationNames[phaseName];\n publishRegistrationName(phasedRegistrationName, PluginModule, eventName);\n }\n }\n return true;\n } else if (dispatchConfig.registrationName) {\n publishRegistrationName(dispatchConfig.registrationName, PluginModule, eventName);\n return true;\n }\n return false;\n}\n\n/**\n * Publishes a registration name that is used to identify dispatched events and\n * can be used with `EventPluginHub.putListener` to register listeners.\n *\n * @param {string} registrationName Registration name to add.\n * @param {object} PluginModule Plugin publishing the event.\n * @private\n */\nfunction publishRegistrationName(registrationName, PluginModule, eventName) {\n !!EventPluginRegistry.registrationNameModules[registrationName] ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginHub: More than one plugin attempted to publish the same ' + 'registration name, `%s`.', registrationName) : invariant(false) : undefined;\n EventPluginRegistry.registrationNameModules[registrationName] = PluginModule;\n EventPluginRegistry.registrationNameDependencies[registrationName] = PluginModule.eventTypes[eventName].dependencies;\n}\n\n/**\n * Registers plugins so that they can extract and dispatch events.\n *\n * @see {EventPluginHub}\n */\nvar EventPluginRegistry = {\n\n /**\n * Ordered list of injected plugins.\n */\n plugins: [],\n\n /**\n * Mapping from event name to dispatch config\n */\n eventNameDispatchConfigs: {},\n\n /**\n * Mapping from registration name to plugin module\n */\n registrationNameModules: {},\n\n /**\n * Mapping from registration name to event name\n */\n registrationNameDependencies: {},\n\n /**\n * Injects an ordering of plugins (by plugin name). This allows the ordering\n * to be decoupled from injection of the actual plugins so that ordering is\n * always deterministic regardless of packaging, on-the-fly injection, etc.\n *\n * @param {array} InjectedEventPluginOrder\n * @internal\n * @see {EventPluginHub.injection.injectEventPluginOrder}\n */\n injectEventPluginOrder: function (InjectedEventPluginOrder) {\n !!EventPluginOrder ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginRegistry: Cannot inject event plugin ordering more than ' + 'once. You are likely trying to load more than one copy of React.') : invariant(false) : undefined;\n // Clone the ordering so it cannot be dynamically mutated.\n EventPluginOrder = Array.prototype.slice.call(InjectedEventPluginOrder);\n recomputePluginOrdering();\n },\n\n /**\n * Injects plugins to be used by `EventPluginHub`. The plugin names must be\n * in the ordering injected by `injectEventPluginOrder`.\n *\n * Plugins can be injected as part of page initialization or on-the-fly.\n *\n * @param {object} injectedNamesToPlugins Map from names to plugin modules.\n * @internal\n * @see {EventPluginHub.injection.injectEventPluginsByName}\n */\n injectEventPluginsByName: function (injectedNamesToPlugins) {\n var isOrderingDirty = false;\n for (var pluginName in injectedNamesToPlugins) {\n if (!injectedNamesToPlugins.hasOwnProperty(pluginName)) {\n continue;\n }\n var PluginModule = injectedNamesToPlugins[pluginName];\n if (!namesToPlugins.hasOwnProperty(pluginName) || namesToPlugins[pluginName] !== PluginModule) {\n !!namesToPlugins[pluginName] ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginRegistry: Cannot inject two different event plugins ' + 'using the same name, `%s`.', pluginName) : invariant(false) : undefined;\n namesToPlugins[pluginName] = PluginModule;\n isOrderingDirty = true;\n }\n }\n if (isOrderingDirty) {\n recomputePluginOrdering();\n }\n },\n\n /**\n * Looks up the plugin for the supplied event.\n *\n * @param {object} event A synthetic event.\n * @return {?object} The plugin that created the supplied event.\n * @internal\n */\n getPluginModuleForEvent: function (event) {\n var dispatchConfig = event.dispatchConfig;\n if (dispatchConfig.registrationName) {\n return EventPluginRegistry.registrationNameModules[dispatchConfig.registrationName] || null;\n }\n for (var phase in dispatchConfig.phasedRegistrationNames) {\n if (!dispatchConfig.phasedRegistrationNames.hasOwnProperty(phase)) {\n continue;\n }\n var PluginModule = EventPluginRegistry.registrationNameModules[dispatchConfig.phasedRegistrationNames[phase]];\n if (PluginModule) {\n return PluginModule;\n }\n }\n return null;\n },\n\n /**\n * Exposed for unit testing.\n * @private\n */\n _resetEventPlugins: function () {\n EventPluginOrder = null;\n for (var pluginName in namesToPlugins) {\n if (namesToPlugins.hasOwnProperty(pluginName)) {\n delete namesToPlugins[pluginName];\n }\n }\n EventPluginRegistry.plugins.length = 0;\n\n var eventNameDispatchConfigs = EventPluginRegistry.eventNameDispatchConfigs;\n for (var eventName in eventNameDispatchConfigs) {\n if (eventNameDispatchConfigs.hasOwnProperty(eventName)) {\n delete eventNameDispatchConfigs[eventName];\n }\n }\n\n var registrationNameModules = EventPluginRegistry.registrationNameModules;\n for (var registrationName in registrationNameModules) {\n if (registrationNameModules.hasOwnProperty(registrationName)) {\n delete registrationNameModules[registrationName];\n }\n }\n }\n\n};\n\nmodule.exports = EventPluginRegistry;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/EventPluginRegistry.js\n ** module id = 31\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule EventPluginUtils\n */\n\n'use strict';\n\nvar EventConstants = require('./EventConstants');\nvar ReactErrorUtils = require('./ReactErrorUtils');\n\nvar invariant = require('fbjs/lib/invariant');\nvar warning = require('fbjs/lib/warning');\n\n/**\n * Injected dependencies:\n */\n\n/**\n * - `Mount`: [required] Module that can convert between React dom IDs and\n * actual node references.\n */\nvar injection = {\n Mount: null,\n injectMount: function (InjectedMount) {\n injection.Mount = InjectedMount;\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(InjectedMount && InjectedMount.getNode && InjectedMount.getID, 'EventPluginUtils.injection.injectMount(...): Injected Mount ' + 'module is missing getNode or getID.') : undefined;\n }\n }\n};\n\nvar topLevelTypes = EventConstants.topLevelTypes;\n\nfunction isEndish(topLevelType) {\n return topLevelType === topLevelTypes.topMouseUp || topLevelType === topLevelTypes.topTouchEnd || topLevelType === topLevelTypes.topTouchCancel;\n}\n\nfunction isMoveish(topLevelType) {\n return topLevelType === topLevelTypes.topMouseMove || topLevelType === topLevelTypes.topTouchMove;\n}\nfunction isStartish(topLevelType) {\n return topLevelType === topLevelTypes.topMouseDown || topLevelType === topLevelTypes.topTouchStart;\n}\n\nvar validateEventDispatches;\nif (process.env.NODE_ENV !== 'production') {\n validateEventDispatches = function (event) {\n var dispatchListeners = event._dispatchListeners;\n var dispatchIDs = event._dispatchIDs;\n\n var listenersIsArr = Array.isArray(dispatchListeners);\n var idsIsArr = Array.isArray(dispatchIDs);\n var IDsLen = idsIsArr ? dispatchIDs.length : dispatchIDs ? 1 : 0;\n var listenersLen = listenersIsArr ? dispatchListeners.length : dispatchListeners ? 1 : 0;\n\n process.env.NODE_ENV !== 'production' ? warning(idsIsArr === listenersIsArr && IDsLen === listenersLen, 'EventPluginUtils: Invalid `event`.') : undefined;\n };\n}\n\n/**\n * Dispatch the event to the listener.\n * @param {SyntheticEvent} event SyntheticEvent to handle\n * @param {boolean} simulated If the event is simulated (changes exn behavior)\n * @param {function} listener Application-level callback\n * @param {string} domID DOM id to pass to the callback.\n */\nfunction executeDispatch(event, simulated, listener, domID) {\n var type = event.type || 'unknown-event';\n event.currentTarget = injection.Mount.getNode(domID);\n if (simulated) {\n ReactErrorUtils.invokeGuardedCallbackWithCatch(type, listener, event, domID);\n } else {\n ReactErrorUtils.invokeGuardedCallback(type, listener, event, domID);\n }\n event.currentTarget = null;\n}\n\n/**\n * Standard/simple iteration through an event's collected dispatches.\n */\nfunction executeDispatchesInOrder(event, simulated) {\n var dispatchListeners = event._dispatchListeners;\n var dispatchIDs = event._dispatchIDs;\n if (process.env.NODE_ENV !== 'production') {\n validateEventDispatches(event);\n }\n if (Array.isArray(dispatchListeners)) {\n for (var i = 0; i < dispatchListeners.length; i++) {\n if (event.isPropagationStopped()) {\n break;\n }\n // Listeners and IDs are two parallel arrays that are always in sync.\n executeDispatch(event, simulated, dispatchListeners[i], dispatchIDs[i]);\n }\n } else if (dispatchListeners) {\n executeDispatch(event, simulated, dispatchListeners, dispatchIDs);\n }\n event._dispatchListeners = null;\n event._dispatchIDs = null;\n}\n\n/**\n * Standard/simple iteration through an event's collected dispatches, but stops\n * at the first dispatch execution returning true, and returns that id.\n *\n * @return {?string} id of the first dispatch execution who's listener returns\n * true, or null if no listener returned true.\n */\nfunction executeDispatchesInOrderStopAtTrueImpl(event) {\n var dispatchListeners = event._dispatchListeners;\n var dispatchIDs = event._dispatchIDs;\n if (process.env.NODE_ENV !== 'production') {\n validateEventDispatches(event);\n }\n if (Array.isArray(dispatchListeners)) {\n for (var i = 0; i < dispatchListeners.length; i++) {\n if (event.isPropagationStopped()) {\n break;\n }\n // Listeners and IDs are two parallel arrays that are always in sync.\n if (dispatchListeners[i](event, dispatchIDs[i])) {\n return dispatchIDs[i];\n }\n }\n } else if (dispatchListeners) {\n if (dispatchListeners(event, dispatchIDs)) {\n return dispatchIDs;\n }\n }\n return null;\n}\n\n/**\n * @see executeDispatchesInOrderStopAtTrueImpl\n */\nfunction executeDispatchesInOrderStopAtTrue(event) {\n var ret = executeDispatchesInOrderStopAtTrueImpl(event);\n event._dispatchIDs = null;\n event._dispatchListeners = null;\n return ret;\n}\n\n/**\n * Execution of a \"direct\" dispatch - there must be at most one dispatch\n * accumulated on the event or it is considered an error. It doesn't really make\n * sense for an event with multiple dispatches (bubbled) to keep track of the\n * return values at each dispatch execution, but it does tend to make sense when\n * dealing with \"direct\" dispatches.\n *\n * @return {*} The return value of executing the single dispatch.\n */\nfunction executeDirectDispatch(event) {\n if (process.env.NODE_ENV !== 'production') {\n validateEventDispatches(event);\n }\n var dispatchListener = event._dispatchListeners;\n var dispatchID = event._dispatchIDs;\n !!Array.isArray(dispatchListener) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'executeDirectDispatch(...): Invalid `event`.') : invariant(false) : undefined;\n var res = dispatchListener ? dispatchListener(event, dispatchID) : null;\n event._dispatchListeners = null;\n event._dispatchIDs = null;\n return res;\n}\n\n/**\n * @param {SyntheticEvent} event\n * @return {boolean} True iff number of dispatches accumulated is greater than 0.\n */\nfunction hasDispatches(event) {\n return !!event._dispatchListeners;\n}\n\n/**\n * General utilities that are useful in creating custom Event Plugins.\n */\nvar EventPluginUtils = {\n isEndish: isEndish,\n isMoveish: isMoveish,\n isStartish: isStartish,\n\n executeDirectDispatch: executeDirectDispatch,\n executeDispatchesInOrder: executeDispatchesInOrder,\n executeDispatchesInOrderStopAtTrue: executeDispatchesInOrderStopAtTrue,\n hasDispatches: hasDispatches,\n\n getNode: function (id) {\n return injection.Mount.getNode(id);\n },\n getID: function (node) {\n return injection.Mount.getID(node);\n },\n\n injection: injection\n};\n\nmodule.exports = EventPluginUtils;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/EventPluginUtils.js\n ** module id = 32\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactErrorUtils\n * @typechecks\n */\n\n'use strict';\n\nvar caughtError = null;\n\n/**\n * Call a function while guarding against errors that happens within it.\n *\n * @param {?String} name of the guard to use for logging or debugging\n * @param {Function} func The function to invoke\n * @param {*} a First argument\n * @param {*} b Second argument\n */\nfunction invokeGuardedCallback(name, func, a, b) {\n try {\n return func(a, b);\n } catch (x) {\n if (caughtError === null) {\n caughtError = x;\n }\n return undefined;\n }\n}\n\nvar ReactErrorUtils = {\n invokeGuardedCallback: invokeGuardedCallback,\n\n /**\n * Invoked by ReactTestUtils.Simulate so that any errors thrown by the event\n * handler are sure to be rethrown by rethrowCaughtError.\n */\n invokeGuardedCallbackWithCatch: invokeGuardedCallback,\n\n /**\n * During execution of guarded functions we will capture the first error which\n * we will rethrow to be handled by the top level error handler.\n */\n rethrowCaughtError: function () {\n if (caughtError) {\n var error = caughtError;\n caughtError = null;\n throw error;\n }\n }\n};\n\nif (process.env.NODE_ENV !== 'production') {\n /**\n * To help development we can get better devtools integration by simulating a\n * real browser event.\n */\n if (typeof window !== 'undefined' && typeof window.dispatchEvent === 'function' && typeof document !== 'undefined' && typeof document.createEvent === 'function') {\n var fakeNode = document.createElement('react');\n ReactErrorUtils.invokeGuardedCallback = function (name, func, a, b) {\n var boundFunc = func.bind(null, a, b);\n var evtType = 'react-' + name;\n fakeNode.addEventListener(evtType, boundFunc, false);\n var evt = document.createEvent('Event');\n evt.initEvent(evtType, false, false);\n fakeNode.dispatchEvent(evt);\n fakeNode.removeEventListener(evtType, boundFunc, false);\n };\n }\n}\n\nmodule.exports = ReactErrorUtils;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactErrorUtils.js\n ** module id = 33\n ** module chunks = 0 1\n **/","/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule accumulateInto\n */\n\n'use strict';\n\nvar invariant = require('fbjs/lib/invariant');\n\n/**\n *\n * Accumulates items that must not be null or undefined into the first one. This\n * is used to conserve memory by avoiding array allocations, and thus sacrifices\n * API cleanness. Since `current` can be null before being passed in and not\n * null after this function, make sure to assign it back to `current`:\n *\n * `a = accumulateInto(a, b);`\n *\n * This API should be sparingly used. Try `accumulate` for something cleaner.\n *\n * @return {*|array<*>} An accumulation of items.\n */\n\nfunction accumulateInto(current, next) {\n !(next != null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'accumulateInto(...): Accumulated items must not be null or undefined.') : invariant(false) : undefined;\n if (current == null) {\n return next;\n }\n\n // Both are not empty. Warning: Never call x.concat(y) when you are not\n // certain that x is an Array (x could be a string with concat method).\n var currentIsArray = Array.isArray(current);\n var nextIsArray = Array.isArray(next);\n\n if (currentIsArray && nextIsArray) {\n current.push.apply(current, next);\n return current;\n }\n\n if (currentIsArray) {\n current.push(next);\n return current;\n }\n\n if (nextIsArray) {\n // A bit too dangerous to mutate `next`.\n return [current].concat(next);\n }\n\n return [current, next];\n}\n\nmodule.exports = accumulateInto;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/accumulateInto.js\n ** module id = 34\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule forEachAccumulated\n */\n\n'use strict';\n\n/**\n * @param {array} arr an \"accumulation\" of items which is either an Array or\n * a single item. Useful when paired with the `accumulate` module. This is a\n * simple utility that allows us to reason about a collection of items, but\n * handling the case when there is exactly one item (and we do not need to\n * allocate an array).\n */\nvar forEachAccumulated = function (arr, cb, scope) {\n if (Array.isArray(arr)) {\n arr.forEach(cb, scope);\n } else if (arr) {\n cb.call(scope, arr);\n }\n};\n\nmodule.exports = forEachAccumulated;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/forEachAccumulated.js\n ** module id = 35\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactEventEmitterMixin\n */\n\n'use strict';\n\nvar EventPluginHub = require('./EventPluginHub');\n\nfunction runEventQueueInBatch(events) {\n EventPluginHub.enqueueEvents(events);\n EventPluginHub.processEventQueue(false);\n}\n\nvar ReactEventEmitterMixin = {\n\n /**\n * Streams a fired top-level event to `EventPluginHub` where plugins have the\n * opportunity to create `ReactEvent`s to be dispatched.\n *\n * @param {string} topLevelType Record from `EventConstants`.\n * @param {object} topLevelTarget The listening component root node.\n * @param {string} topLevelTargetID ID of `topLevelTarget`.\n * @param {object} nativeEvent Native environment event.\n */\n handleTopLevel: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) {\n var events = EventPluginHub.extractEvents(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget);\n runEventQueueInBatch(events);\n }\n};\n\nmodule.exports = ReactEventEmitterMixin;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactEventEmitterMixin.js\n ** module id = 36\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ViewportMetrics\n */\n\n'use strict';\n\nvar ViewportMetrics = {\n\n currentScrollLeft: 0,\n\n currentScrollTop: 0,\n\n refreshScrollValues: function (scrollPosition) {\n ViewportMetrics.currentScrollLeft = scrollPosition.x;\n ViewportMetrics.currentScrollTop = scrollPosition.y;\n }\n\n};\n\nmodule.exports = ViewportMetrics;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ViewportMetrics.js\n ** module id = 37\n ** module chunks = 0 1\n **/","/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule Object.assign\n */\n\n// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.assign\n\n'use strict';\n\nfunction assign(target, sources) {\n if (target == null) {\n throw new TypeError('Object.assign target cannot be null or undefined');\n }\n\n var to = Object(target);\n var hasOwnProperty = Object.prototype.hasOwnProperty;\n\n for (var nextIndex = 1; nextIndex < arguments.length; nextIndex++) {\n var nextSource = arguments[nextIndex];\n if (nextSource == null) {\n continue;\n }\n\n var from = Object(nextSource);\n\n // We don't currently support accessors nor proxies. Therefore this\n // copy cannot throw. If we ever supported this then we must handle\n // exceptions and side-effects. We don't support symbols so they won't\n // be transferred.\n\n for (var key in from) {\n if (hasOwnProperty.call(from, key)) {\n to[key] = from[key];\n }\n }\n }\n\n return to;\n}\n\nmodule.exports = assign;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/Object.assign.js\n ** module id = 38\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule isEventSupported\n */\n\n'use strict';\n\nvar ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');\n\nvar useHasFeature;\nif (ExecutionEnvironment.canUseDOM) {\n useHasFeature = document.implementation && document.implementation.hasFeature &&\n // always returns true in newer browsers as per the standard.\n // @see http://dom.spec.whatwg.org/#dom-domimplementation-hasfeature\n document.implementation.hasFeature('', '') !== true;\n}\n\n/**\n * Checks if an event is supported in the current execution environment.\n *\n * NOTE: This will not work correctly for non-generic events such as `change`,\n * `reset`, `load`, `error`, and `select`.\n *\n * Borrows from Modernizr.\n *\n * @param {string} eventNameSuffix Event name, e.g. \"click\".\n * @param {?boolean} capture Check if the capture phase is supported.\n * @return {boolean} True if the event is supported.\n * @internal\n * @license Modernizr 3.0.0pre (Custom Build) | MIT\n */\nfunction isEventSupported(eventNameSuffix, capture) {\n if (!ExecutionEnvironment.canUseDOM || capture && !('addEventListener' in document)) {\n return false;\n }\n\n var eventName = 'on' + eventNameSuffix;\n var isSupported = (eventName in document);\n\n if (!isSupported) {\n var element = document.createElement('div');\n element.setAttribute(eventName, 'return;');\n isSupported = typeof element[eventName] === 'function';\n }\n\n if (!isSupported && useHasFeature && eventNameSuffix === 'wheel') {\n // This is the only way to test support for the `wheel` event in IE9+.\n isSupported = document.implementation.hasFeature('Events.wheel', '3.0');\n }\n\n return isSupported;\n}\n\nmodule.exports = isEventSupported;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/isEventSupported.js\n ** module id = 39\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactDOMFeatureFlags\n */\n\n'use strict';\n\nvar ReactDOMFeatureFlags = {\n useCreateElement: false\n};\n\nmodule.exports = ReactDOMFeatureFlags;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactDOMFeatureFlags.js\n ** module id = 40\n ** module chunks = 0 1\n **/","/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactElement\n */\n\n'use strict';\n\nvar ReactCurrentOwner = require('./ReactCurrentOwner');\n\nvar assign = require('./Object.assign');\nvar canDefineProperty = require('./canDefineProperty');\n\n// The Symbol used to tag the ReactElement type. If there is no native Symbol\n// nor polyfill, then a plain number is used for performance.\nvar REACT_ELEMENT_TYPE = typeof Symbol === 'function' && Symbol['for'] && Symbol['for']('react.element') || 0xeac7;\n\nvar RESERVED_PROPS = {\n key: true,\n ref: true,\n __self: true,\n __source: true\n};\n\n/**\n * Base constructor for all React elements. This is only used to make this\n * work with a dynamic instanceof check. Nothing should live on this prototype.\n *\n * @param {*} type\n * @param {*} key\n * @param {string|object} ref\n * @param {*} self A *temporary* helper to detect places where `this` is\n * different from the `owner` when React.createElement is called, so that we\n * can warn. We want to get rid of owner and replace string `ref`s with arrow\n * functions, and as long as `this` and owner are the same, there will be no\n * change in behavior.\n * @param {*} source An annotation object (added by a transpiler or otherwise)\n * indicating filename, line number, and/or other information.\n * @param {*} owner\n * @param {*} props\n * @internal\n */\nvar ReactElement = function (type, key, ref, self, source, owner, props) {\n var element = {\n // This tag allow us to uniquely identify this as a React Element\n $$typeof: REACT_ELEMENT_TYPE,\n\n // Built-in properties that belong on the element\n type: type,\n key: key,\n ref: ref,\n props: props,\n\n // Record the component responsible for creating this element.\n _owner: owner\n };\n\n if (process.env.NODE_ENV !== 'production') {\n // The validation flag is currently mutative. We put it on\n // an external backing store so that we can freeze the whole object.\n // This can be replaced with a WeakMap once they are implemented in\n // commonly used development environments.\n element._store = {};\n\n // To make comparing ReactElements easier for testing purposes, we make\n // the validation flag non-enumerable (where possible, which should\n // include every environment we run tests in), so the test framework\n // ignores it.\n if (canDefineProperty) {\n Object.defineProperty(element._store, 'validated', {\n configurable: false,\n enumerable: false,\n writable: true,\n value: false\n });\n // self and source are DEV only properties.\n Object.defineProperty(element, '_self', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: self\n });\n // Two elements created in two different places should be considered\n // equal for testing purposes and therefore we hide it from enumeration.\n Object.defineProperty(element, '_source', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: source\n });\n } else {\n element._store.validated = false;\n element._self = self;\n element._source = source;\n }\n Object.freeze(element.props);\n Object.freeze(element);\n }\n\n return element;\n};\n\nReactElement.createElement = function (type, config, children) {\n var propName;\n\n // Reserved names are extracted\n var props = {};\n\n var key = null;\n var ref = null;\n var self = null;\n var source = null;\n\n if (config != null) {\n ref = config.ref === undefined ? null : config.ref;\n key = config.key === undefined ? null : '' + config.key;\n self = config.__self === undefined ? null : config.__self;\n source = config.__source === undefined ? null : config.__source;\n // Remaining properties are added to a new props object\n for (propName in config) {\n if (config.hasOwnProperty(propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n props[propName] = config[propName];\n }\n }\n }\n\n // Children can be more than one argument, and those are transferred onto\n // the newly allocated props object.\n var childrenLength = arguments.length - 2;\n if (childrenLength === 1) {\n props.children = children;\n } else if (childrenLength > 1) {\n var childArray = Array(childrenLength);\n for (var i = 0; i < childrenLength; i++) {\n childArray[i] = arguments[i + 2];\n }\n props.children = childArray;\n }\n\n // Resolve default props\n if (type && type.defaultProps) {\n var defaultProps = type.defaultProps;\n for (propName in defaultProps) {\n if (typeof props[propName] === 'undefined') {\n props[propName] = defaultProps[propName];\n }\n }\n }\n\n return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);\n};\n\nReactElement.createFactory = function (type) {\n var factory = ReactElement.createElement.bind(null, type);\n // Expose the type on the factory and the prototype so that it can be\n // easily accessed on elements. E.g. `<Foo />.type === Foo`.\n // This should not be named `constructor` since this may not be the function\n // that created the element, and it may not even be a constructor.\n // Legacy hook TODO: Warn if this is accessed\n factory.type = type;\n return factory;\n};\n\nReactElement.cloneAndReplaceKey = function (oldElement, newKey) {\n var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props);\n\n return newElement;\n};\n\nReactElement.cloneAndReplaceProps = function (oldElement, newProps) {\n var newElement = ReactElement(oldElement.type, oldElement.key, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, newProps);\n\n if (process.env.NODE_ENV !== 'production') {\n // If the key on the original is valid, then the clone is valid\n newElement._store.validated = oldElement._store.validated;\n }\n\n return newElement;\n};\n\nReactElement.cloneElement = function (element, config, children) {\n var propName;\n\n // Original props are copied\n var props = assign({}, element.props);\n\n // Reserved names are extracted\n var key = element.key;\n var ref = element.ref;\n // Self is preserved since the owner is preserved.\n var self = element._self;\n // Source is preserved since cloneElement is unlikely to be targeted by a\n // transpiler, and the original source is probably a better indicator of the\n // true owner.\n var source = element._source;\n\n // Owner will be preserved, unless ref is overridden\n var owner = element._owner;\n\n if (config != null) {\n if (config.ref !== undefined) {\n // Silently steal the ref from the parent.\n ref = config.ref;\n owner = ReactCurrentOwner.current;\n }\n if (config.key !== undefined) {\n key = '' + config.key;\n }\n // Remaining properties override existing props\n for (propName in config) {\n if (config.hasOwnProperty(propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n props[propName] = config[propName];\n }\n }\n }\n\n // Children can be more than one argument, and those are transferred onto\n // the newly allocated props object.\n var childrenLength = arguments.length - 2;\n if (childrenLength === 1) {\n props.children = children;\n } else if (childrenLength > 1) {\n var childArray = Array(childrenLength);\n for (var i = 0; i < childrenLength; i++) {\n childArray[i] = arguments[i + 2];\n }\n props.children = childArray;\n }\n\n return ReactElement(element.type, key, ref, self, source, owner, props);\n};\n\n/**\n * @param {?object} object\n * @return {boolean} True if `object` is a valid component.\n * @final\n */\nReactElement.isValidElement = function (object) {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n};\n\nmodule.exports = ReactElement;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactElement.js\n ** module id = 41\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule canDefineProperty\n */\n\n'use strict';\n\nvar canDefineProperty = false;\nif (process.env.NODE_ENV !== 'production') {\n try {\n Object.defineProperty({}, 'x', { get: function () {} });\n canDefineProperty = true;\n } catch (x) {\n // IE will fail on defineProperty\n }\n}\n\nmodule.exports = canDefineProperty;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/canDefineProperty.js\n ** module id = 42\n ** module chunks = 0 1\n **/","/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactEmptyComponentRegistry\n */\n\n'use strict';\n\n// This registry keeps track of the React IDs of the components that rendered to\n// `null` (in reality a placeholder such as `noscript`)\nvar nullComponentIDsRegistry = {};\n\n/**\n * @param {string} id Component's `_rootNodeID`.\n * @return {boolean} True if the component is rendered to null.\n */\nfunction isNullComponentID(id) {\n return !!nullComponentIDsRegistry[id];\n}\n\n/**\n * Mark the component as having rendered to null.\n * @param {string} id Component's `_rootNodeID`.\n */\nfunction registerNullComponentID(id) {\n nullComponentIDsRegistry[id] = true;\n}\n\n/**\n * Unmark the component as having rendered to null: it renders to something now.\n * @param {string} id Component's `_rootNodeID`.\n */\nfunction deregisterNullComponentID(id) {\n delete nullComponentIDsRegistry[id];\n}\n\nvar ReactEmptyComponentRegistry = {\n isNullComponentID: isNullComponentID,\n registerNullComponentID: registerNullComponentID,\n deregisterNullComponentID: deregisterNullComponentID\n};\n\nmodule.exports = ReactEmptyComponentRegistry;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactEmptyComponentRegistry.js\n ** module id = 43\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactInstanceHandles\n * @typechecks static-only\n */\n\n'use strict';\n\nvar ReactRootIndex = require('./ReactRootIndex');\n\nvar invariant = require('fbjs/lib/invariant');\n\nvar SEPARATOR = '.';\nvar SEPARATOR_LENGTH = SEPARATOR.length;\n\n/**\n * Maximum depth of traversals before we consider the possibility of a bad ID.\n */\nvar MAX_TREE_DEPTH = 10000;\n\n/**\n * Creates a DOM ID prefix to use when mounting React components.\n *\n * @param {number} index A unique integer\n * @return {string} React root ID.\n * @internal\n */\nfunction getReactRootIDString(index) {\n return SEPARATOR + index.toString(36);\n}\n\n/**\n * Checks if a character in the supplied ID is a separator or the end.\n *\n * @param {string} id A React DOM ID.\n * @param {number} index Index of the character to check.\n * @return {boolean} True if the character is a separator or end of the ID.\n * @private\n */\nfunction isBoundary(id, index) {\n return id.charAt(index) === SEPARATOR || index === id.length;\n}\n\n/**\n * Checks if the supplied string is a valid React DOM ID.\n *\n * @param {string} id A React DOM ID, maybe.\n * @return {boolean} True if the string is a valid React DOM ID.\n * @private\n */\nfunction isValidID(id) {\n return id === '' || id.charAt(0) === SEPARATOR && id.charAt(id.length - 1) !== SEPARATOR;\n}\n\n/**\n * Checks if the first ID is an ancestor of or equal to the second ID.\n *\n * @param {string} ancestorID\n * @param {string} descendantID\n * @return {boolean} True if `ancestorID` is an ancestor of `descendantID`.\n * @internal\n */\nfunction isAncestorIDOf(ancestorID, descendantID) {\n return descendantID.indexOf(ancestorID) === 0 && isBoundary(descendantID, ancestorID.length);\n}\n\n/**\n * Gets the parent ID of the supplied React DOM ID, `id`.\n *\n * @param {string} id ID of a component.\n * @return {string} ID of the parent, or an empty string.\n * @private\n */\nfunction getParentID(id) {\n return id ? id.substr(0, id.lastIndexOf(SEPARATOR)) : '';\n}\n\n/**\n * Gets the next DOM ID on the tree path from the supplied `ancestorID` to the\n * supplied `destinationID`. If they are equal, the ID is returned.\n *\n * @param {string} ancestorID ID of an ancestor node of `destinationID`.\n * @param {string} destinationID ID of the destination node.\n * @return {string} Next ID on the path from `ancestorID` to `destinationID`.\n * @private\n */\nfunction getNextDescendantID(ancestorID, destinationID) {\n !(isValidID(ancestorID) && isValidID(destinationID)) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'getNextDescendantID(%s, %s): Received an invalid React DOM ID.', ancestorID, destinationID) : invariant(false) : undefined;\n !isAncestorIDOf(ancestorID, destinationID) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'getNextDescendantID(...): React has made an invalid assumption about ' + 'the DOM hierarchy. Expected `%s` to be an ancestor of `%s`.', ancestorID, destinationID) : invariant(false) : undefined;\n if (ancestorID === destinationID) {\n return ancestorID;\n }\n // Skip over the ancestor and the immediate separator. Traverse until we hit\n // another separator or we reach the end of `destinationID`.\n var start = ancestorID.length + SEPARATOR_LENGTH;\n var i;\n for (i = start; i < destinationID.length; i++) {\n if (isBoundary(destinationID, i)) {\n break;\n }\n }\n return destinationID.substr(0, i);\n}\n\n/**\n * Gets the nearest common ancestor ID of two IDs.\n *\n * Using this ID scheme, the nearest common ancestor ID is the longest common\n * prefix of the two IDs that immediately preceded a \"marker\" in both strings.\n *\n * @param {string} oneID\n * @param {string} twoID\n * @return {string} Nearest common ancestor ID, or the empty string if none.\n * @private\n */\nfunction getFirstCommonAncestorID(oneID, twoID) {\n var minLength = Math.min(oneID.length, twoID.length);\n if (minLength === 0) {\n return '';\n }\n var lastCommonMarkerIndex = 0;\n // Use `<=` to traverse until the \"EOL\" of the shorter string.\n for (var i = 0; i <= minLength; i++) {\n if (isBoundary(oneID, i) && isBoundary(twoID, i)) {\n lastCommonMarkerIndex = i;\n } else if (oneID.charAt(i) !== twoID.charAt(i)) {\n break;\n }\n }\n var longestCommonID = oneID.substr(0, lastCommonMarkerIndex);\n !isValidID(longestCommonID) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'getFirstCommonAncestorID(%s, %s): Expected a valid React DOM ID: %s', oneID, twoID, longestCommonID) : invariant(false) : undefined;\n return longestCommonID;\n}\n\n/**\n * Traverses the parent path between two IDs (either up or down). The IDs must\n * not be the same, and there must exist a parent path between them. If the\n * callback returns `false`, traversal is stopped.\n *\n * @param {?string} start ID at which to start traversal.\n * @param {?string} stop ID at which to end traversal.\n * @param {function} cb Callback to invoke each ID with.\n * @param {*} arg Argument to invoke the callback with.\n * @param {?boolean} skipFirst Whether or not to skip the first node.\n * @param {?boolean} skipLast Whether or not to skip the last node.\n * @private\n */\nfunction traverseParentPath(start, stop, cb, arg, skipFirst, skipLast) {\n start = start || '';\n stop = stop || '';\n !(start !== stop) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'traverseParentPath(...): Cannot traverse from and to the same ID, `%s`.', start) : invariant(false) : undefined;\n var traverseUp = isAncestorIDOf(stop, start);\n !(traverseUp || isAncestorIDOf(start, stop)) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'traverseParentPath(%s, %s, ...): Cannot traverse from two IDs that do ' + 'not have a parent path.', start, stop) : invariant(false) : undefined;\n // Traverse from `start` to `stop` one depth at a time.\n var depth = 0;\n var traverse = traverseUp ? getParentID : getNextDescendantID;\n for (var id = start;; /* until break */id = traverse(id, stop)) {\n var ret;\n if ((!skipFirst || id !== start) && (!skipLast || id !== stop)) {\n ret = cb(id, traverseUp, arg);\n }\n if (ret === false || id === stop) {\n // Only break //after// visiting `stop`.\n break;\n }\n !(depth++ < MAX_TREE_DEPTH) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'traverseParentPath(%s, %s, ...): Detected an infinite loop while ' + 'traversing the React DOM ID tree. This may be due to malformed IDs: %s', start, stop, id) : invariant(false) : undefined;\n }\n}\n\n/**\n * Manages the IDs assigned to DOM representations of React components. This\n * uses a specific scheme in order to traverse the DOM efficiently (e.g. in\n * order to simulate events).\n *\n * @internal\n */\nvar ReactInstanceHandles = {\n\n /**\n * Constructs a React root ID\n * @return {string} A React root ID.\n */\n createReactRootID: function () {\n return getReactRootIDString(ReactRootIndex.createReactRootIndex());\n },\n\n /**\n * Constructs a React ID by joining a root ID with a name.\n *\n * @param {string} rootID Root ID of a parent component.\n * @param {string} name A component's name (as flattened children).\n * @return {string} A React ID.\n * @internal\n */\n createReactID: function (rootID, name) {\n return rootID + name;\n },\n\n /**\n * Gets the DOM ID of the React component that is the root of the tree that\n * contains the React component with the supplied DOM ID.\n *\n * @param {string} id DOM ID of a React component.\n * @return {?string} DOM ID of the React component that is the root.\n * @internal\n */\n getReactRootIDFromNodeID: function (id) {\n if (id && id.charAt(0) === SEPARATOR && id.length > 1) {\n var index = id.indexOf(SEPARATOR, 1);\n return index > -1 ? id.substr(0, index) : id;\n }\n return null;\n },\n\n /**\n * Traverses the ID hierarchy and invokes the supplied `cb` on any IDs that\n * should would receive a `mouseEnter` or `mouseLeave` event.\n *\n * NOTE: Does not invoke the callback on the nearest common ancestor because\n * nothing \"entered\" or \"left\" that element.\n *\n * @param {string} leaveID ID being left.\n * @param {string} enterID ID being entered.\n * @param {function} cb Callback to invoke on each entered/left ID.\n * @param {*} upArg Argument to invoke the callback with on left IDs.\n * @param {*} downArg Argument to invoke the callback with on entered IDs.\n * @internal\n */\n traverseEnterLeave: function (leaveID, enterID, cb, upArg, downArg) {\n var ancestorID = getFirstCommonAncestorID(leaveID, enterID);\n if (ancestorID !== leaveID) {\n traverseParentPath(leaveID, ancestorID, cb, upArg, false, true);\n }\n if (ancestorID !== enterID) {\n traverseParentPath(ancestorID, enterID, cb, downArg, true, false);\n }\n },\n\n /**\n * Simulates the traversal of a two-phase, capture/bubble event dispatch.\n *\n * NOTE: This traversal happens on IDs without touching the DOM.\n *\n * @param {string} targetID ID of the target node.\n * @param {function} cb Callback to invoke.\n * @param {*} arg Argument to invoke the callback with.\n * @internal\n */\n traverseTwoPhase: function (targetID, cb, arg) {\n if (targetID) {\n traverseParentPath('', targetID, cb, arg, true, false);\n traverseParentPath(targetID, '', cb, arg, false, true);\n }\n },\n\n /**\n * Same as `traverseTwoPhase` but skips the `targetID`.\n */\n traverseTwoPhaseSkipTarget: function (targetID, cb, arg) {\n if (targetID) {\n traverseParentPath('', targetID, cb, arg, true, true);\n traverseParentPath(targetID, '', cb, arg, true, true);\n }\n },\n\n /**\n * Traverse a node ID, calling the supplied `cb` for each ancestor ID. For\n * example, passing `.0.$row-0.1` would result in `cb` getting called\n * with `.0`, `.0.$row-0`, and `.0.$row-0.1`.\n *\n * NOTE: This traversal happens on IDs without touching the DOM.\n *\n * @param {string} targetID ID of the target node.\n * @param {function} cb Callback to invoke.\n * @param {*} arg Argument to invoke the callback with.\n * @internal\n */\n traverseAncestors: function (targetID, cb, arg) {\n traverseParentPath('', targetID, cb, arg, true, false);\n },\n\n getFirstCommonAncestorID: getFirstCommonAncestorID,\n\n /**\n * Exposed for unit testing.\n * @private\n */\n _getNextDescendantID: getNextDescendantID,\n\n isAncestorIDOf: isAncestorIDOf,\n\n SEPARATOR: SEPARATOR\n\n};\n\nmodule.exports = ReactInstanceHandles;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactInstanceHandles.js\n ** module id = 44\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactRootIndex\n * @typechecks\n */\n\n'use strict';\n\nvar ReactRootIndexInjection = {\n /**\n * @param {function} _createReactRootIndex\n */\n injectCreateReactRootIndex: function (_createReactRootIndex) {\n ReactRootIndex.createReactRootIndex = _createReactRootIndex;\n }\n};\n\nvar ReactRootIndex = {\n createReactRootIndex: null,\n injection: ReactRootIndexInjection\n};\n\nmodule.exports = ReactRootIndex;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactRootIndex.js\n ** module id = 45\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactInstanceMap\n */\n\n'use strict';\n\n/**\n * `ReactInstanceMap` maintains a mapping from a public facing stateful\n * instance (key) and the internal representation (value). This allows public\n * methods to accept the user facing instance as an argument and map them back\n * to internal methods.\n */\n\n// TODO: Replace this with ES6: var ReactInstanceMap = new Map();\nvar ReactInstanceMap = {\n\n /**\n * This API should be called `delete` but we'd have to make sure to always\n * transform these to strings for IE support. When this transform is fully\n * supported we can rename it.\n */\n remove: function (key) {\n key._reactInternalInstance = undefined;\n },\n\n get: function (key) {\n return key._reactInternalInstance;\n },\n\n has: function (key) {\n return key._reactInternalInstance !== undefined;\n },\n\n set: function (key, value) {\n key._reactInternalInstance = value;\n }\n\n};\n\nmodule.exports = ReactInstanceMap;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactInstanceMap.js\n ** module id = 46\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactMarkupChecksum\n */\n\n'use strict';\n\nvar adler32 = require('./adler32');\n\nvar TAG_END = /\\/?>/;\n\nvar ReactMarkupChecksum = {\n CHECKSUM_ATTR_NAME: 'data-react-checksum',\n\n /**\n * @param {string} markup Markup string\n * @return {string} Markup string with checksum attribute attached\n */\n addChecksumToMarkup: function (markup) {\n var checksum = adler32(markup);\n\n // Add checksum (handle both parent tags and self-closing tags)\n return markup.replace(TAG_END, ' ' + ReactMarkupChecksum.CHECKSUM_ATTR_NAME + '=\"' + checksum + '\"$&');\n },\n\n /**\n * @param {string} markup to use\n * @param {DOMElement} element root React element\n * @returns {boolean} whether or not the markup is the same\n */\n canReuseMarkup: function (markup, element) {\n var existingChecksum = element.getAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME);\n existingChecksum = existingChecksum && parseInt(existingChecksum, 10);\n var markupChecksum = adler32(markup);\n return markupChecksum === existingChecksum;\n }\n};\n\nmodule.exports = ReactMarkupChecksum;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactMarkupChecksum.js\n ** module id = 47\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule adler32\n */\n\n'use strict';\n\nvar MOD = 65521;\n\n// adler32 is not cryptographically strong, and is only used to sanity check that\n// markup generated on the server matches the markup generated on the client.\n// This implementation (a modified version of the SheetJS version) has been optimized\n// for our use case, at the expense of conforming to the adler32 specification\n// for non-ascii inputs.\nfunction adler32(data) {\n var a = 1;\n var b = 0;\n var i = 0;\n var l = data.length;\n var m = l & ~0x3;\n while (i < m) {\n for (; i < Math.min(i + 4096, m); i += 4) {\n b += (a += data.charCodeAt(i)) + (a += data.charCodeAt(i + 1)) + (a += data.charCodeAt(i + 2)) + (a += data.charCodeAt(i + 3));\n }\n a %= MOD;\n b %= MOD;\n }\n for (; i < l; i++) {\n b += a += data.charCodeAt(i);\n }\n a %= MOD;\n b %= MOD;\n return a | b << 16;\n}\n\nmodule.exports = adler32;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/adler32.js\n ** module id = 48\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactReconciler\n */\n\n'use strict';\n\nvar ReactRef = require('./ReactRef');\n\n/**\n * Helper to call ReactRef.attachRefs with this composite component, split out\n * to avoid allocations in the transaction mount-ready queue.\n */\nfunction attachRefs() {\n ReactRef.attachRefs(this, this._currentElement);\n}\n\nvar ReactReconciler = {\n\n /**\n * Initializes the component, renders markup, and registers event listeners.\n *\n * @param {ReactComponent} internalInstance\n * @param {string} rootID DOM ID of the root node.\n * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction\n * @return {?string} Rendered markup to be inserted into the DOM.\n * @final\n * @internal\n */\n mountComponent: function (internalInstance, rootID, transaction, context) {\n var markup = internalInstance.mountComponent(rootID, transaction, context);\n if (internalInstance._currentElement && internalInstance._currentElement.ref != null) {\n transaction.getReactMountReady().enqueue(attachRefs, internalInstance);\n }\n return markup;\n },\n\n /**\n * Releases any resources allocated by `mountComponent`.\n *\n * @final\n * @internal\n */\n unmountComponent: function (internalInstance) {\n ReactRef.detachRefs(internalInstance, internalInstance._currentElement);\n internalInstance.unmountComponent();\n },\n\n /**\n * Update a component using a new element.\n *\n * @param {ReactComponent} internalInstance\n * @param {ReactElement} nextElement\n * @param {ReactReconcileTransaction} transaction\n * @param {object} context\n * @internal\n */\n receiveComponent: function (internalInstance, nextElement, transaction, context) {\n var prevElement = internalInstance._currentElement;\n\n if (nextElement === prevElement && context === internalInstance._context) {\n // Since elements are immutable after the owner is rendered,\n // we can do a cheap identity compare here to determine if this is a\n // superfluous reconcile. It's possible for state to be mutable but such\n // change should trigger an update of the owner which would recreate\n // the element. We explicitly check for the existence of an owner since\n // it's possible for an element created outside a composite to be\n // deeply mutated and reused.\n\n // TODO: Bailing out early is just a perf optimization right?\n // TODO: Removing the return statement should affect correctness?\n return;\n }\n\n var refsChanged = ReactRef.shouldUpdateRefs(prevElement, nextElement);\n\n if (refsChanged) {\n ReactRef.detachRefs(internalInstance, prevElement);\n }\n\n internalInstance.receiveComponent(nextElement, transaction, context);\n\n if (refsChanged && internalInstance._currentElement && internalInstance._currentElement.ref != null) {\n transaction.getReactMountReady().enqueue(attachRefs, internalInstance);\n }\n },\n\n /**\n * Flush any dirty changes in a component.\n *\n * @param {ReactComponent} internalInstance\n * @param {ReactReconcileTransaction} transaction\n * @internal\n */\n performUpdateIfNecessary: function (internalInstance, transaction) {\n internalInstance.performUpdateIfNecessary(transaction);\n }\n\n};\n\nmodule.exports = ReactReconciler;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactReconciler.js\n ** module id = 49\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactRef\n */\n\n'use strict';\n\nvar ReactOwner = require('./ReactOwner');\n\nvar ReactRef = {};\n\nfunction attachRef(ref, component, owner) {\n if (typeof ref === 'function') {\n ref(component.getPublicInstance());\n } else {\n // Legacy ref\n ReactOwner.addComponentAsRefTo(component, ref, owner);\n }\n}\n\nfunction detachRef(ref, component, owner) {\n if (typeof ref === 'function') {\n ref(null);\n } else {\n // Legacy ref\n ReactOwner.removeComponentAsRefFrom(component, ref, owner);\n }\n}\n\nReactRef.attachRefs = function (instance, element) {\n if (element === null || element === false) {\n return;\n }\n var ref = element.ref;\n if (ref != null) {\n attachRef(ref, instance, element._owner);\n }\n};\n\nReactRef.shouldUpdateRefs = function (prevElement, nextElement) {\n // If either the owner or a `ref` has changed, make sure the newest owner\n // has stored a reference to `this`, and the previous owner (if different)\n // has forgotten the reference to `this`. We use the element instead\n // of the public this.props because the post processing cannot determine\n // a ref. The ref conceptually lives on the element.\n\n // TODO: Should this even be possible? The owner cannot change because\n // it's forbidden by shouldUpdateReactComponent. The ref can change\n // if you swap the keys of but not the refs. Reconsider where this check\n // is made. It probably belongs where the key checking and\n // instantiateReactComponent is done.\n\n var prevEmpty = prevElement === null || prevElement === false;\n var nextEmpty = nextElement === null || nextElement === false;\n\n return(\n // This has a few false positives w/r/t empty components.\n prevEmpty || nextEmpty || nextElement._owner !== prevElement._owner || nextElement.ref !== prevElement.ref\n );\n};\n\nReactRef.detachRefs = function (instance, element) {\n if (element === null || element === false) {\n return;\n }\n var ref = element.ref;\n if (ref != null) {\n detachRef(ref, instance, element._owner);\n }\n};\n\nmodule.exports = ReactRef;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactRef.js\n ** module id = 50\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactOwner\n */\n\n'use strict';\n\nvar invariant = require('fbjs/lib/invariant');\n\n/**\n * ReactOwners are capable of storing references to owned components.\n *\n * All components are capable of //being// referenced by owner components, but\n * only ReactOwner components are capable of //referencing// owned components.\n * The named reference is known as a \"ref\".\n *\n * Refs are available when mounted and updated during reconciliation.\n *\n * var MyComponent = React.createClass({\n * render: function() {\n * return (\n * <div onClick={this.handleClick}>\n * <CustomComponent ref=\"custom\" />\n * </div>\n * );\n * },\n * handleClick: function() {\n * this.refs.custom.handleClick();\n * },\n * componentDidMount: function() {\n * this.refs.custom.initialize();\n * }\n * });\n *\n * Refs should rarely be used. When refs are used, they should only be done to\n * control data that is not handled by React's data flow.\n *\n * @class ReactOwner\n */\nvar ReactOwner = {\n\n /**\n * @param {?object} object\n * @return {boolean} True if `object` is a valid owner.\n * @final\n */\n isValidOwner: function (object) {\n return !!(object && typeof object.attachRef === 'function' && typeof object.detachRef === 'function');\n },\n\n /**\n * Adds a component by ref to an owner component.\n *\n * @param {ReactComponent} component Component to reference.\n * @param {string} ref Name by which to refer to the component.\n * @param {ReactOwner} owner Component on which to record the ref.\n * @final\n * @internal\n */\n addComponentAsRefTo: function (component, ref, owner) {\n !ReactOwner.isValidOwner(owner) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'addComponentAsRefTo(...): Only a ReactOwner can have refs. You might ' + 'be adding a ref to a component that was not created inside a component\\'s ' + '`render` method, or you have multiple copies of React loaded ' + '(details: https://fb.me/react-refs-must-have-owner).') : invariant(false) : undefined;\n owner.attachRef(ref, component);\n },\n\n /**\n * Removes a component by ref from an owner component.\n *\n * @param {ReactComponent} component Component to dereference.\n * @param {string} ref Name of the ref to remove.\n * @param {ReactOwner} owner Component on which the ref is recorded.\n * @final\n * @internal\n */\n removeComponentAsRefFrom: function (component, ref, owner) {\n !ReactOwner.isValidOwner(owner) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'removeComponentAsRefFrom(...): Only a ReactOwner can have refs. You might ' + 'be removing a ref to a component that was not created inside a component\\'s ' + '`render` method, or you have multiple copies of React loaded ' + '(details: https://fb.me/react-refs-must-have-owner).') : invariant(false) : undefined;\n // Check that `component` is still the current ref because we do not want to\n // detach the ref if another component stole it.\n if (owner.getPublicInstance().refs[ref] === component.getPublicInstance()) {\n owner.detachRef(ref);\n }\n }\n\n};\n\nmodule.exports = ReactOwner;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactOwner.js\n ** module id = 51\n ** module chunks = 0 1\n **/","/**\n * Copyright 2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactUpdateQueue\n */\n\n'use strict';\n\nvar ReactCurrentOwner = require('./ReactCurrentOwner');\nvar ReactElement = require('./ReactElement');\nvar ReactInstanceMap = require('./ReactInstanceMap');\nvar ReactUpdates = require('./ReactUpdates');\n\nvar assign = require('./Object.assign');\nvar invariant = require('fbjs/lib/invariant');\nvar warning = require('fbjs/lib/warning');\n\nfunction enqueueUpdate(internalInstance) {\n ReactUpdates.enqueueUpdate(internalInstance);\n}\n\nfunction getInternalInstanceReadyForUpdate(publicInstance, callerName) {\n var internalInstance = ReactInstanceMap.get(publicInstance);\n if (!internalInstance) {\n if (process.env.NODE_ENV !== 'production') {\n // Only warn when we have a callerName. Otherwise we should be silent.\n // We're probably calling from enqueueCallback. We don't want to warn\n // there because we already warned for the corresponding lifecycle method.\n process.env.NODE_ENV !== 'production' ? warning(!callerName, '%s(...): Can only update a mounted or mounting component. ' + 'This usually means you called %s() on an unmounted component. ' + 'This is a no-op. Please check the code for the %s component.', callerName, callerName, publicInstance.constructor.displayName) : undefined;\n }\n return null;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(ReactCurrentOwner.current == null, '%s(...): Cannot update during an existing state transition ' + '(such as within `render`). Render methods should be a pure function ' + 'of props and state.', callerName) : undefined;\n }\n\n return internalInstance;\n}\n\n/**\n * ReactUpdateQueue allows for state updates to be scheduled into a later\n * reconciliation step.\n */\nvar ReactUpdateQueue = {\n\n /**\n * Checks whether or not this composite component is mounted.\n * @param {ReactClass} publicInstance The instance we want to test.\n * @return {boolean} True if mounted, false otherwise.\n * @protected\n * @final\n */\n isMounted: function (publicInstance) {\n if (process.env.NODE_ENV !== 'production') {\n var owner = ReactCurrentOwner.current;\n if (owner !== null) {\n process.env.NODE_ENV !== 'production' ? warning(owner._warnedAboutRefsInRender, '%s is accessing isMounted inside its render() function. ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', owner.getName() || 'A component') : undefined;\n owner._warnedAboutRefsInRender = true;\n }\n }\n var internalInstance = ReactInstanceMap.get(publicInstance);\n if (internalInstance) {\n // During componentWillMount and render this will still be null but after\n // that will always render to something. At least for now. So we can use\n // this hack.\n return !!internalInstance._renderedComponent;\n } else {\n return false;\n }\n },\n\n /**\n * Enqueue a callback that will be executed after all the pending updates\n * have processed.\n *\n * @param {ReactClass} publicInstance The instance to use as `this` context.\n * @param {?function} callback Called after state is updated.\n * @internal\n */\n enqueueCallback: function (publicInstance, callback) {\n !(typeof callback === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'enqueueCallback(...): You called `setProps`, `replaceProps`, ' + '`setState`, `replaceState`, or `forceUpdate` with a callback that ' + 'isn\\'t callable.') : invariant(false) : undefined;\n var internalInstance = getInternalInstanceReadyForUpdate(publicInstance);\n\n // Previously we would throw an error if we didn't have an internal\n // instance. Since we want to make it a no-op instead, we mirror the same\n // behavior we have in other enqueue* methods.\n // We also need to ignore callbacks in componentWillMount. See\n // enqueueUpdates.\n if (!internalInstance) {\n return null;\n }\n\n if (internalInstance._pendingCallbacks) {\n internalInstance._pendingCallbacks.push(callback);\n } else {\n internalInstance._pendingCallbacks = [callback];\n }\n // TODO: The callback here is ignored when setState is called from\n // componentWillMount. Either fix it or disallow doing so completely in\n // favor of getInitialState. Alternatively, we can disallow\n // componentWillMount during server-side rendering.\n enqueueUpdate(internalInstance);\n },\n\n enqueueCallbackInternal: function (internalInstance, callback) {\n !(typeof callback === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'enqueueCallback(...): You called `setProps`, `replaceProps`, ' + '`setState`, `replaceState`, or `forceUpdate` with a callback that ' + 'isn\\'t callable.') : invariant(false) : undefined;\n if (internalInstance._pendingCallbacks) {\n internalInstance._pendingCallbacks.push(callback);\n } else {\n internalInstance._pendingCallbacks = [callback];\n }\n enqueueUpdate(internalInstance);\n },\n\n /**\n * Forces an update. This should only be invoked when it is known with\n * certainty that we are **not** in a DOM transaction.\n *\n * You may want to call this when you know that some deeper aspect of the\n * component's state has changed but `setState` was not called.\n *\n * This will not invoke `shouldComponentUpdate`, but it will invoke\n * `componentWillUpdate` and `componentDidUpdate`.\n *\n * @param {ReactClass} publicInstance The instance that should rerender.\n * @internal\n */\n enqueueForceUpdate: function (publicInstance) {\n var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'forceUpdate');\n\n if (!internalInstance) {\n return;\n }\n\n internalInstance._pendingForceUpdate = true;\n\n enqueueUpdate(internalInstance);\n },\n\n /**\n * Replaces all of the state. Always use this or `setState` to mutate state.\n * You should treat `this.state` as immutable.\n *\n * There is no guarantee that `this.state` will be immediately updated, so\n * accessing `this.state` after calling this method may return the old value.\n *\n * @param {ReactClass} publicInstance The instance that should rerender.\n * @param {object} completeState Next state.\n * @internal\n */\n enqueueReplaceState: function (publicInstance, completeState) {\n var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'replaceState');\n\n if (!internalInstance) {\n return;\n }\n\n internalInstance._pendingStateQueue = [completeState];\n internalInstance._pendingReplaceState = true;\n\n enqueueUpdate(internalInstance);\n },\n\n /**\n * Sets a subset of the state. This only exists because _pendingState is\n * internal. This provides a merging strategy that is not available to deep\n * properties which is confusing. TODO: Expose pendingState or don't use it\n * during the merge.\n *\n * @param {ReactClass} publicInstance The instance that should rerender.\n * @param {object} partialState Next partial state to be merged with state.\n * @internal\n */\n enqueueSetState: function (publicInstance, partialState) {\n var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'setState');\n\n if (!internalInstance) {\n return;\n }\n\n var queue = internalInstance._pendingStateQueue || (internalInstance._pendingStateQueue = []);\n queue.push(partialState);\n\n enqueueUpdate(internalInstance);\n },\n\n /**\n * Sets a subset of the props.\n *\n * @param {ReactClass} publicInstance The instance that should rerender.\n * @param {object} partialProps Subset of the next props.\n * @internal\n */\n enqueueSetProps: function (publicInstance, partialProps) {\n var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'setProps');\n if (!internalInstance) {\n return;\n }\n ReactUpdateQueue.enqueueSetPropsInternal(internalInstance, partialProps);\n },\n\n enqueueSetPropsInternal: function (internalInstance, partialProps) {\n var topLevelWrapper = internalInstance._topLevelWrapper;\n !topLevelWrapper ? process.env.NODE_ENV !== 'production' ? invariant(false, 'setProps(...): You called `setProps` on a ' + 'component with a parent. This is an anti-pattern since props will ' + 'get reactively updated when rendered. Instead, change the owner\\'s ' + '`render` method to pass the correct value as props to the component ' + 'where it is created.') : invariant(false) : undefined;\n\n // Merge with the pending element if it exists, otherwise with existing\n // element props.\n var wrapElement = topLevelWrapper._pendingElement || topLevelWrapper._currentElement;\n var element = wrapElement.props;\n var props = assign({}, element.props, partialProps);\n topLevelWrapper._pendingElement = ReactElement.cloneAndReplaceProps(wrapElement, ReactElement.cloneAndReplaceProps(element, props));\n\n enqueueUpdate(topLevelWrapper);\n },\n\n /**\n * Replaces all of the props.\n *\n * @param {ReactClass} publicInstance The instance that should rerender.\n * @param {object} props New props.\n * @internal\n */\n enqueueReplaceProps: function (publicInstance, props) {\n var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'replaceProps');\n if (!internalInstance) {\n return;\n }\n ReactUpdateQueue.enqueueReplacePropsInternal(internalInstance, props);\n },\n\n enqueueReplacePropsInternal: function (internalInstance, props) {\n var topLevelWrapper = internalInstance._topLevelWrapper;\n !topLevelWrapper ? process.env.NODE_ENV !== 'production' ? invariant(false, 'replaceProps(...): You called `replaceProps` on a ' + 'component with a parent. This is an anti-pattern since props will ' + 'get reactively updated when rendered. Instead, change the owner\\'s ' + '`render` method to pass the correct value as props to the component ' + 'where it is created.') : invariant(false) : undefined;\n\n // Merge with the pending element if it exists, otherwise with existing\n // element props.\n var wrapElement = topLevelWrapper._pendingElement || topLevelWrapper._currentElement;\n var element = wrapElement.props;\n topLevelWrapper._pendingElement = ReactElement.cloneAndReplaceProps(wrapElement, ReactElement.cloneAndReplaceProps(element, props));\n\n enqueueUpdate(topLevelWrapper);\n },\n\n enqueueElementInternal: function (internalInstance, newElement) {\n internalInstance._pendingElement = newElement;\n enqueueUpdate(internalInstance);\n }\n\n};\n\nmodule.exports = ReactUpdateQueue;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactUpdateQueue.js\n ** module id = 52\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactUpdates\n */\n\n'use strict';\n\nvar CallbackQueue = require('./CallbackQueue');\nvar PooledClass = require('./PooledClass');\nvar ReactPerf = require('./ReactPerf');\nvar ReactReconciler = require('./ReactReconciler');\nvar Transaction = require('./Transaction');\n\nvar assign = require('./Object.assign');\nvar invariant = require('fbjs/lib/invariant');\n\nvar dirtyComponents = [];\nvar asapCallbackQueue = CallbackQueue.getPooled();\nvar asapEnqueued = false;\n\nvar batchingStrategy = null;\n\nfunction ensureInjected() {\n !(ReactUpdates.ReactReconcileTransaction && batchingStrategy) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactUpdates: must inject a reconcile transaction class and batching ' + 'strategy') : invariant(false) : undefined;\n}\n\nvar NESTED_UPDATES = {\n initialize: function () {\n this.dirtyComponentsLength = dirtyComponents.length;\n },\n close: function () {\n if (this.dirtyComponentsLength !== dirtyComponents.length) {\n // Additional updates were enqueued by componentDidUpdate handlers or\n // similar; before our own UPDATE_QUEUEING wrapper closes, we want to run\n // these new updates so that if A's componentDidUpdate calls setState on\n // B, B will update before the callback A's updater provided when calling\n // setState.\n dirtyComponents.splice(0, this.dirtyComponentsLength);\n flushBatchedUpdates();\n } else {\n dirtyComponents.length = 0;\n }\n }\n};\n\nvar UPDATE_QUEUEING = {\n initialize: function () {\n this.callbackQueue.reset();\n },\n close: function () {\n this.callbackQueue.notifyAll();\n }\n};\n\nvar TRANSACTION_WRAPPERS = [NESTED_UPDATES, UPDATE_QUEUEING];\n\nfunction ReactUpdatesFlushTransaction() {\n this.reinitializeTransaction();\n this.dirtyComponentsLength = null;\n this.callbackQueue = CallbackQueue.getPooled();\n this.reconcileTransaction = ReactUpdates.ReactReconcileTransaction.getPooled( /* forceHTML */false);\n}\n\nassign(ReactUpdatesFlushTransaction.prototype, Transaction.Mixin, {\n getTransactionWrappers: function () {\n return TRANSACTION_WRAPPERS;\n },\n\n destructor: function () {\n this.dirtyComponentsLength = null;\n CallbackQueue.release(this.callbackQueue);\n this.callbackQueue = null;\n ReactUpdates.ReactReconcileTransaction.release(this.reconcileTransaction);\n this.reconcileTransaction = null;\n },\n\n perform: function (method, scope, a) {\n // Essentially calls `this.reconcileTransaction.perform(method, scope, a)`\n // with this transaction's wrappers around it.\n return Transaction.Mixin.perform.call(this, this.reconcileTransaction.perform, this.reconcileTransaction, method, scope, a);\n }\n});\n\nPooledClass.addPoolingTo(ReactUpdatesFlushTransaction);\n\nfunction batchedUpdates(callback, a, b, c, d, e) {\n ensureInjected();\n batchingStrategy.batchedUpdates(callback, a, b, c, d, e);\n}\n\n/**\n * Array comparator for ReactComponents by mount ordering.\n *\n * @param {ReactComponent} c1 first component you're comparing\n * @param {ReactComponent} c2 second component you're comparing\n * @return {number} Return value usable by Array.prototype.sort().\n */\nfunction mountOrderComparator(c1, c2) {\n return c1._mountOrder - c2._mountOrder;\n}\n\nfunction runBatchedUpdates(transaction) {\n var len = transaction.dirtyComponentsLength;\n !(len === dirtyComponents.length) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Expected flush transaction\\'s stored dirty-components length (%s) to ' + 'match dirty-components array length (%s).', len, dirtyComponents.length) : invariant(false) : undefined;\n\n // Since reconciling a component higher in the owner hierarchy usually (not\n // always -- see shouldComponentUpdate()) will reconcile children, reconcile\n // them before their children by sorting the array.\n dirtyComponents.sort(mountOrderComparator);\n\n for (var i = 0; i < len; i++) {\n // If a component is unmounted before pending changes apply, it will still\n // be here, but we assume that it has cleared its _pendingCallbacks and\n // that performUpdateIfNecessary is a noop.\n var component = dirtyComponents[i];\n\n // If performUpdateIfNecessary happens to enqueue any new updates, we\n // shouldn't execute the callbacks until the next render happens, so\n // stash the callbacks first\n var callbacks = component._pendingCallbacks;\n component._pendingCallbacks = null;\n\n ReactReconciler.performUpdateIfNecessary(component, transaction.reconcileTransaction);\n\n if (callbacks) {\n for (var j = 0; j < callbacks.length; j++) {\n transaction.callbackQueue.enqueue(callbacks[j], component.getPublicInstance());\n }\n }\n }\n}\n\nvar flushBatchedUpdates = function () {\n // ReactUpdatesFlushTransaction's wrappers will clear the dirtyComponents\n // array and perform any updates enqueued by mount-ready handlers (i.e.,\n // componentDidUpdate) but we need to check here too in order to catch\n // updates enqueued by setState callbacks and asap calls.\n while (dirtyComponents.length || asapEnqueued) {\n if (dirtyComponents.length) {\n var transaction = ReactUpdatesFlushTransaction.getPooled();\n transaction.perform(runBatchedUpdates, null, transaction);\n ReactUpdatesFlushTransaction.release(transaction);\n }\n\n if (asapEnqueued) {\n asapEnqueued = false;\n var queue = asapCallbackQueue;\n asapCallbackQueue = CallbackQueue.getPooled();\n queue.notifyAll();\n CallbackQueue.release(queue);\n }\n }\n};\nflushBatchedUpdates = ReactPerf.measure('ReactUpdates', 'flushBatchedUpdates', flushBatchedUpdates);\n\n/**\n * Mark a component as needing a rerender, adding an optional callback to a\n * list of functions which will be executed once the rerender occurs.\n */\nfunction enqueueUpdate(component) {\n ensureInjected();\n\n // Various parts of our code (such as ReactCompositeComponent's\n // _renderValidatedComponent) assume that calls to render aren't nested;\n // verify that that's the case. (This is called by each top-level update\n // function, like setProps, setState, forceUpdate, etc.; creation and\n // destruction of top-level components is guarded in ReactMount.)\n\n if (!batchingStrategy.isBatchingUpdates) {\n batchingStrategy.batchedUpdates(enqueueUpdate, component);\n return;\n }\n\n dirtyComponents.push(component);\n}\n\n/**\n * Enqueue a callback to be run at the end of the current batching cycle. Throws\n * if no updates are currently being performed.\n */\nfunction asap(callback, context) {\n !batchingStrategy.isBatchingUpdates ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactUpdates.asap: Can\\'t enqueue an asap callback in a context where' + 'updates are not being batched.') : invariant(false) : undefined;\n asapCallbackQueue.enqueue(callback, context);\n asapEnqueued = true;\n}\n\nvar ReactUpdatesInjection = {\n injectReconcileTransaction: function (ReconcileTransaction) {\n !ReconcileTransaction ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactUpdates: must provide a reconcile transaction class') : invariant(false) : undefined;\n ReactUpdates.ReactReconcileTransaction = ReconcileTransaction;\n },\n\n injectBatchingStrategy: function (_batchingStrategy) {\n !_batchingStrategy ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactUpdates: must provide a batching strategy') : invariant(false) : undefined;\n !(typeof _batchingStrategy.batchedUpdates === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactUpdates: must provide a batchedUpdates() function') : invariant(false) : undefined;\n !(typeof _batchingStrategy.isBatchingUpdates === 'boolean') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactUpdates: must provide an isBatchingUpdates boolean attribute') : invariant(false) : undefined;\n batchingStrategy = _batchingStrategy;\n }\n};\n\nvar ReactUpdates = {\n /**\n * React references `ReactReconcileTransaction` using this property in order\n * to allow dependency injection.\n *\n * @internal\n */\n ReactReconcileTransaction: null,\n\n batchedUpdates: batchedUpdates,\n enqueueUpdate: enqueueUpdate,\n flushBatchedUpdates: flushBatchedUpdates,\n injection: ReactUpdatesInjection,\n asap: asap\n};\n\nmodule.exports = ReactUpdates;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactUpdates.js\n ** module id = 53\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule CallbackQueue\n */\n\n'use strict';\n\nvar PooledClass = require('./PooledClass');\n\nvar assign = require('./Object.assign');\nvar invariant = require('fbjs/lib/invariant');\n\n/**\n * A specialized pseudo-event module to help keep track of components waiting to\n * be notified when their DOM representations are available for use.\n *\n * This implements `PooledClass`, so you should never need to instantiate this.\n * Instead, use `CallbackQueue.getPooled()`.\n *\n * @class ReactMountReady\n * @implements PooledClass\n * @internal\n */\nfunction CallbackQueue() {\n this._callbacks = null;\n this._contexts = null;\n}\n\nassign(CallbackQueue.prototype, {\n\n /**\n * Enqueues a callback to be invoked when `notifyAll` is invoked.\n *\n * @param {function} callback Invoked when `notifyAll` is invoked.\n * @param {?object} context Context to call `callback` with.\n * @internal\n */\n enqueue: function (callback, context) {\n this._callbacks = this._callbacks || [];\n this._contexts = this._contexts || [];\n this._callbacks.push(callback);\n this._contexts.push(context);\n },\n\n /**\n * Invokes all enqueued callbacks and clears the queue. This is invoked after\n * the DOM representation of a component has been created or updated.\n *\n * @internal\n */\n notifyAll: function () {\n var callbacks = this._callbacks;\n var contexts = this._contexts;\n if (callbacks) {\n !(callbacks.length === contexts.length) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Mismatched list of contexts in callback queue') : invariant(false) : undefined;\n this._callbacks = null;\n this._contexts = null;\n for (var i = 0; i < callbacks.length; i++) {\n callbacks[i].call(contexts[i]);\n }\n callbacks.length = 0;\n contexts.length = 0;\n }\n },\n\n /**\n * Resets the internal queue.\n *\n * @internal\n */\n reset: function () {\n this._callbacks = null;\n this._contexts = null;\n },\n\n /**\n * `PooledClass` looks for this.\n */\n destructor: function () {\n this.reset();\n }\n\n});\n\nPooledClass.addPoolingTo(CallbackQueue);\n\nmodule.exports = CallbackQueue;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/CallbackQueue.js\n ** module id = 54\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule PooledClass\n */\n\n'use strict';\n\nvar invariant = require('fbjs/lib/invariant');\n\n/**\n * Static poolers. Several custom versions for each potential number of\n * arguments. A completely generic pooler is easy to implement, but would\n * require accessing the `arguments` object. In each of these, `this` refers to\n * the Class itself, not an instance. If any others are needed, simply add them\n * here, or in their own files.\n */\nvar oneArgumentPooler = function (copyFieldsFrom) {\n var Klass = this;\n if (Klass.instancePool.length) {\n var instance = Klass.instancePool.pop();\n Klass.call(instance, copyFieldsFrom);\n return instance;\n } else {\n return new Klass(copyFieldsFrom);\n }\n};\n\nvar twoArgumentPooler = function (a1, a2) {\n var Klass = this;\n if (Klass.instancePool.length) {\n var instance = Klass.instancePool.pop();\n Klass.call(instance, a1, a2);\n return instance;\n } else {\n return new Klass(a1, a2);\n }\n};\n\nvar threeArgumentPooler = function (a1, a2, a3) {\n var Klass = this;\n if (Klass.instancePool.length) {\n var instance = Klass.instancePool.pop();\n Klass.call(instance, a1, a2, a3);\n return instance;\n } else {\n return new Klass(a1, a2, a3);\n }\n};\n\nvar fourArgumentPooler = function (a1, a2, a3, a4) {\n var Klass = this;\n if (Klass.instancePool.length) {\n var instance = Klass.instancePool.pop();\n Klass.call(instance, a1, a2, a3, a4);\n return instance;\n } else {\n return new Klass(a1, a2, a3, a4);\n }\n};\n\nvar fiveArgumentPooler = function (a1, a2, a3, a4, a5) {\n var Klass = this;\n if (Klass.instancePool.length) {\n var instance = Klass.instancePool.pop();\n Klass.call(instance, a1, a2, a3, a4, a5);\n return instance;\n } else {\n return new Klass(a1, a2, a3, a4, a5);\n }\n};\n\nvar standardReleaser = function (instance) {\n var Klass = this;\n !(instance instanceof Klass) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Trying to release an instance into a pool of a different type.') : invariant(false) : undefined;\n instance.destructor();\n if (Klass.instancePool.length < Klass.poolSize) {\n Klass.instancePool.push(instance);\n }\n};\n\nvar DEFAULT_POOL_SIZE = 10;\nvar DEFAULT_POOLER = oneArgumentPooler;\n\n/**\n * Augments `CopyConstructor` to be a poolable class, augmenting only the class\n * itself (statically) not adding any prototypical fields. Any CopyConstructor\n * you give this may have a `poolSize` property, and will look for a\n * prototypical `destructor` on instances (optional).\n *\n * @param {Function} CopyConstructor Constructor that can be used to reset.\n * @param {Function} pooler Customizable pooler.\n */\nvar addPoolingTo = function (CopyConstructor, pooler) {\n var NewKlass = CopyConstructor;\n NewKlass.instancePool = [];\n NewKlass.getPooled = pooler || DEFAULT_POOLER;\n if (!NewKlass.poolSize) {\n NewKlass.poolSize = DEFAULT_POOL_SIZE;\n }\n NewKlass.release = standardReleaser;\n return NewKlass;\n};\n\nvar PooledClass = {\n addPoolingTo: addPoolingTo,\n oneArgumentPooler: oneArgumentPooler,\n twoArgumentPooler: twoArgumentPooler,\n threeArgumentPooler: threeArgumentPooler,\n fourArgumentPooler: fourArgumentPooler,\n fiveArgumentPooler: fiveArgumentPooler\n};\n\nmodule.exports = PooledClass;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/PooledClass.js\n ** module id = 55\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule Transaction\n */\n\n'use strict';\n\nvar invariant = require('fbjs/lib/invariant');\n\n/**\n * `Transaction` creates a black box that is able to wrap any method such that\n * certain invariants are maintained before and after the method is invoked\n * (Even if an exception is thrown while invoking the wrapped method). Whoever\n * instantiates a transaction can provide enforcers of the invariants at\n * creation time. The `Transaction` class itself will supply one additional\n * automatic invariant for you - the invariant that any transaction instance\n * should not be run while it is already being run. You would typically create a\n * single instance of a `Transaction` for reuse multiple times, that potentially\n * is used to wrap several different methods. Wrappers are extremely simple -\n * they only require implementing two methods.\n *\n * <pre>\n * wrappers (injected at creation time)\n * + +\n * | |\n * +-----------------|--------|--------------+\n * | v | |\n * | +---------------+ | |\n * | +--| wrapper1 |---|----+ |\n * | | +---------------+ v | |\n * | | +-------------+ | |\n * | | +----| wrapper2 |--------+ |\n * | | | +-------------+ | | |\n * | | | | | |\n * | v v v v | wrapper\n * | +---+ +---+ +---------+ +---+ +---+ | invariants\n * perform(anyMethod) | | | | | | | | | | | | maintained\n * +----------------->|-|---|-|---|-->|anyMethod|---|---|-|---|-|-------->\n * | | | | | | | | | | | |\n * | | | | | | | | | | | |\n * | | | | | | | | | | | |\n * | +---+ +---+ +---------+ +---+ +---+ |\n * | initialize close |\n * +-----------------------------------------+\n * </pre>\n *\n * Use cases:\n * - Preserving the input selection ranges before/after reconciliation.\n * Restoring selection even in the event of an unexpected error.\n * - Deactivating events while rearranging the DOM, preventing blurs/focuses,\n * while guaranteeing that afterwards, the event system is reactivated.\n * - Flushing a queue of collected DOM mutations to the main UI thread after a\n * reconciliation takes place in a worker thread.\n * - Invoking any collected `componentDidUpdate` callbacks after rendering new\n * content.\n * - (Future use case): Wrapping particular flushes of the `ReactWorker` queue\n * to preserve the `scrollTop` (an automatic scroll aware DOM).\n * - (Future use case): Layout calculations before and after DOM updates.\n *\n * Transactional plugin API:\n * - A module that has an `initialize` method that returns any precomputation.\n * - and a `close` method that accepts the precomputation. `close` is invoked\n * when the wrapped process is completed, or has failed.\n *\n * @param {Array<TransactionalWrapper>} transactionWrapper Wrapper modules\n * that implement `initialize` and `close`.\n * @return {Transaction} Single transaction for reuse in thread.\n *\n * @class Transaction\n */\nvar Mixin = {\n /**\n * Sets up this instance so that it is prepared for collecting metrics. Does\n * so such that this setup method may be used on an instance that is already\n * initialized, in a way that does not consume additional memory upon reuse.\n * That can be useful if you decide to make your subclass of this mixin a\n * \"PooledClass\".\n */\n reinitializeTransaction: function () {\n this.transactionWrappers = this.getTransactionWrappers();\n if (this.wrapperInitData) {\n this.wrapperInitData.length = 0;\n } else {\n this.wrapperInitData = [];\n }\n this._isInTransaction = false;\n },\n\n _isInTransaction: false,\n\n /**\n * @abstract\n * @return {Array<TransactionWrapper>} Array of transaction wrappers.\n */\n getTransactionWrappers: null,\n\n isInTransaction: function () {\n return !!this._isInTransaction;\n },\n\n /**\n * Executes the function within a safety window. Use this for the top level\n * methods that result in large amounts of computation/mutations that would\n * need to be safety checked. The optional arguments helps prevent the need\n * to bind in many cases.\n *\n * @param {function} method Member of scope to call.\n * @param {Object} scope Scope to invoke from.\n * @param {Object?=} a Argument to pass to the method.\n * @param {Object?=} b Argument to pass to the method.\n * @param {Object?=} c Argument to pass to the method.\n * @param {Object?=} d Argument to pass to the method.\n * @param {Object?=} e Argument to pass to the method.\n * @param {Object?=} f Argument to pass to the method.\n *\n * @return {*} Return value from `method`.\n */\n perform: function (method, scope, a, b, c, d, e, f) {\n !!this.isInTransaction() ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Transaction.perform(...): Cannot initialize a transaction when there ' + 'is already an outstanding transaction.') : invariant(false) : undefined;\n var errorThrown;\n var ret;\n try {\n this._isInTransaction = true;\n // Catching errors makes debugging more difficult, so we start with\n // errorThrown set to true before setting it to false after calling\n // close -- if it's still set to true in the finally block, it means\n // one of these calls threw.\n errorThrown = true;\n this.initializeAll(0);\n ret = method.call(scope, a, b, c, d, e, f);\n errorThrown = false;\n } finally {\n try {\n if (errorThrown) {\n // If `method` throws, prefer to show that stack trace over any thrown\n // by invoking `closeAll`.\n try {\n this.closeAll(0);\n } catch (err) {}\n } else {\n // Since `method` didn't throw, we don't want to silence the exception\n // here.\n this.closeAll(0);\n }\n } finally {\n this._isInTransaction = false;\n }\n }\n return ret;\n },\n\n initializeAll: function (startIndex) {\n var transactionWrappers = this.transactionWrappers;\n for (var i = startIndex; i < transactionWrappers.length; i++) {\n var wrapper = transactionWrappers[i];\n try {\n // Catching errors makes debugging more difficult, so we start with the\n // OBSERVED_ERROR state before overwriting it with the real return value\n // of initialize -- if it's still set to OBSERVED_ERROR in the finally\n // block, it means wrapper.initialize threw.\n this.wrapperInitData[i] = Transaction.OBSERVED_ERROR;\n this.wrapperInitData[i] = wrapper.initialize ? wrapper.initialize.call(this) : null;\n } finally {\n if (this.wrapperInitData[i] === Transaction.OBSERVED_ERROR) {\n // The initializer for wrapper i threw an error; initialize the\n // remaining wrappers but silence any exceptions from them to ensure\n // that the first error is the one to bubble up.\n try {\n this.initializeAll(i + 1);\n } catch (err) {}\n }\n }\n }\n },\n\n /**\n * Invokes each of `this.transactionWrappers.close[i]` functions, passing into\n * them the respective return values of `this.transactionWrappers.init[i]`\n * (`close`rs that correspond to initializers that failed will not be\n * invoked).\n */\n closeAll: function (startIndex) {\n !this.isInTransaction() ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Transaction.closeAll(): Cannot close transaction when none are open.') : invariant(false) : undefined;\n var transactionWrappers = this.transactionWrappers;\n for (var i = startIndex; i < transactionWrappers.length; i++) {\n var wrapper = transactionWrappers[i];\n var initData = this.wrapperInitData[i];\n var errorThrown;\n try {\n // Catching errors makes debugging more difficult, so we start with\n // errorThrown set to true before setting it to false after calling\n // close -- if it's still set to true in the finally block, it means\n // wrapper.close threw.\n errorThrown = true;\n if (initData !== Transaction.OBSERVED_ERROR && wrapper.close) {\n wrapper.close.call(this, initData);\n }\n errorThrown = false;\n } finally {\n if (errorThrown) {\n // The closer for wrapper i threw an error; close the remaining\n // wrappers but silence any exceptions from them to ensure that the\n // first error is the one to bubble up.\n try {\n this.closeAll(i + 1);\n } catch (e) {}\n }\n }\n }\n this.wrapperInitData.length = 0;\n }\n};\n\nvar Transaction = {\n\n Mixin: Mixin,\n\n /**\n * Token to look for to determine if an error occurred.\n */\n OBSERVED_ERROR: {}\n\n};\n\nmodule.exports = Transaction;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/Transaction.js\n ** module id = 56\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule emptyObject\n */\n\n'use strict';\n\nvar emptyObject = {};\n\nif (process.env.NODE_ENV !== 'production') {\n Object.freeze(emptyObject);\n}\n\nmodule.exports = emptyObject;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/emptyObject.js\n ** module id = 57\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule containsNode\n * @typechecks\n */\n\n'use strict';\n\nvar isTextNode = require('./isTextNode');\n\n/*eslint-disable no-bitwise */\n\n/**\n * Checks if a given DOM node contains or is another DOM node.\n *\n * @param {?DOMNode} outerNode Outer DOM node.\n * @param {?DOMNode} innerNode Inner DOM node.\n * @return {boolean} True if `outerNode` contains or is `innerNode`.\n */\nfunction containsNode(_x, _x2) {\n var _again = true;\n\n _function: while (_again) {\n var outerNode = _x,\n innerNode = _x2;\n _again = false;\n\n if (!outerNode || !innerNode) {\n return false;\n } else if (outerNode === innerNode) {\n return true;\n } else if (isTextNode(outerNode)) {\n return false;\n } else if (isTextNode(innerNode)) {\n _x = outerNode;\n _x2 = innerNode.parentNode;\n _again = true;\n continue _function;\n } else if (outerNode.contains) {\n return outerNode.contains(innerNode);\n } else if (outerNode.compareDocumentPosition) {\n return !!(outerNode.compareDocumentPosition(innerNode) & 16);\n } else {\n return false;\n }\n }\n}\n\nmodule.exports = containsNode;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/containsNode.js\n ** module id = 58\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule isTextNode\n * @typechecks\n */\n\n'use strict';\n\nvar isNode = require('./isNode');\n\n/**\n * @param {*} object The object to check.\n * @return {boolean} Whether or not the object is a DOM text node.\n */\nfunction isTextNode(object) {\n return isNode(object) && object.nodeType == 3;\n}\n\nmodule.exports = isTextNode;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/isTextNode.js\n ** module id = 59\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule isNode\n * @typechecks\n */\n\n/**\n * @param {*} object The object to check.\n * @return {boolean} Whether or not the object is a DOM node.\n */\n'use strict';\n\nfunction isNode(object) {\n return !!(object && (typeof Node === 'function' ? object instanceof Node : typeof object === 'object' && typeof object.nodeType === 'number' && typeof object.nodeName === 'string'));\n}\n\nmodule.exports = isNode;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/isNode.js\n ** module id = 60\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule instantiateReactComponent\n * @typechecks static-only\n */\n\n'use strict';\n\nvar ReactCompositeComponent = require('./ReactCompositeComponent');\nvar ReactEmptyComponent = require('./ReactEmptyComponent');\nvar ReactNativeComponent = require('./ReactNativeComponent');\n\nvar assign = require('./Object.assign');\nvar invariant = require('fbjs/lib/invariant');\nvar warning = require('fbjs/lib/warning');\n\n// To avoid a cyclic dependency, we create the final class in this module\nvar ReactCompositeComponentWrapper = function () {};\nassign(ReactCompositeComponentWrapper.prototype, ReactCompositeComponent.Mixin, {\n _instantiateReactComponent: instantiateReactComponent\n});\n\nfunction getDeclarationErrorAddendum(owner) {\n if (owner) {\n var name = owner.getName();\n if (name) {\n return ' Check the render method of `' + name + '`.';\n }\n }\n return '';\n}\n\n/**\n * Check if the type reference is a known internal type. I.e. not a user\n * provided composite type.\n *\n * @param {function} type\n * @return {boolean} Returns true if this is a valid internal type.\n */\nfunction isInternalComponentType(type) {\n return typeof type === 'function' && typeof type.prototype !== 'undefined' && typeof type.prototype.mountComponent === 'function' && typeof type.prototype.receiveComponent === 'function';\n}\n\n/**\n * Given a ReactNode, create an instance that will actually be mounted.\n *\n * @param {ReactNode} node\n * @return {object} A new instance of the element's constructor.\n * @protected\n */\nfunction instantiateReactComponent(node) {\n var instance;\n\n if (node === null || node === false) {\n instance = new ReactEmptyComponent(instantiateReactComponent);\n } else if (typeof node === 'object') {\n var element = node;\n !(element && (typeof element.type === 'function' || typeof element.type === 'string')) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Element type is invalid: expected a string (for built-in components) ' + 'or a class/function (for composite components) but got: %s.%s', element.type == null ? element.type : typeof element.type, getDeclarationErrorAddendum(element._owner)) : invariant(false) : undefined;\n\n // Special case string values\n if (typeof element.type === 'string') {\n instance = ReactNativeComponent.createInternalComponent(element);\n } else if (isInternalComponentType(element.type)) {\n // This is temporarily available for custom components that are not string\n // representations. I.e. ART. Once those are updated to use the string\n // representation, we can drop this code path.\n instance = new element.type(element);\n } else {\n instance = new ReactCompositeComponentWrapper();\n }\n } else if (typeof node === 'string' || typeof node === 'number') {\n instance = ReactNativeComponent.createInstanceForText(node);\n } else {\n !false ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Encountered invalid React node of type %s', typeof node) : invariant(false) : undefined;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(typeof instance.construct === 'function' && typeof instance.mountComponent === 'function' && typeof instance.receiveComponent === 'function' && typeof instance.unmountComponent === 'function', 'Only React Components can be mounted.') : undefined;\n }\n\n // Sets up the instance. This can probably just move into the constructor now.\n instance.construct(node);\n\n // These two fields are used by the DOM and ART diffing algorithms\n // respectively. Instead of using expandos on components, we should be\n // storing the state needed by the diffing algorithms elsewhere.\n instance._mountIndex = 0;\n instance._mountImage = null;\n\n if (process.env.NODE_ENV !== 'production') {\n instance._isOwnerNecessary = false;\n instance._warnedAboutRefsInRender = false;\n }\n\n // Internal instances should fully constructed at this point, so they should\n // not get any new fields added to them at this point.\n if (process.env.NODE_ENV !== 'production') {\n if (Object.preventExtensions) {\n Object.preventExtensions(instance);\n }\n }\n\n return instance;\n}\n\nmodule.exports = instantiateReactComponent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/instantiateReactComponent.js\n ** module id = 61\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactCompositeComponent\n */\n\n'use strict';\n\nvar ReactComponentEnvironment = require('./ReactComponentEnvironment');\nvar ReactCurrentOwner = require('./ReactCurrentOwner');\nvar ReactElement = require('./ReactElement');\nvar ReactInstanceMap = require('./ReactInstanceMap');\nvar ReactPerf = require('./ReactPerf');\nvar ReactPropTypeLocations = require('./ReactPropTypeLocations');\nvar ReactPropTypeLocationNames = require('./ReactPropTypeLocationNames');\nvar ReactReconciler = require('./ReactReconciler');\nvar ReactUpdateQueue = require('./ReactUpdateQueue');\n\nvar assign = require('./Object.assign');\nvar emptyObject = require('fbjs/lib/emptyObject');\nvar invariant = require('fbjs/lib/invariant');\nvar shouldUpdateReactComponent = require('./shouldUpdateReactComponent');\nvar warning = require('fbjs/lib/warning');\n\nfunction getDeclarationErrorAddendum(component) {\n var owner = component._currentElement._owner || null;\n if (owner) {\n var name = owner.getName();\n if (name) {\n return ' Check the render method of `' + name + '`.';\n }\n }\n return '';\n}\n\nfunction StatelessComponent(Component) {}\nStatelessComponent.prototype.render = function () {\n var Component = ReactInstanceMap.get(this)._currentElement.type;\n return Component(this.props, this.context, this.updater);\n};\n\n/**\n * ------------------ The Life-Cycle of a Composite Component ------------------\n *\n * - constructor: Initialization of state. The instance is now retained.\n * - componentWillMount\n * - render\n * - [children's constructors]\n * - [children's componentWillMount and render]\n * - [children's componentDidMount]\n * - componentDidMount\n *\n * Update Phases:\n * - componentWillReceiveProps (only called if parent updated)\n * - shouldComponentUpdate\n * - componentWillUpdate\n * - render\n * - [children's constructors or receive props phases]\n * - componentDidUpdate\n *\n * - componentWillUnmount\n * - [children's componentWillUnmount]\n * - [children destroyed]\n * - (destroyed): The instance is now blank, released by React and ready for GC.\n *\n * -----------------------------------------------------------------------------\n */\n\n/**\n * An incrementing ID assigned to each component when it is mounted. This is\n * used to enforce the order in which `ReactUpdates` updates dirty components.\n *\n * @private\n */\nvar nextMountID = 1;\n\n/**\n * @lends {ReactCompositeComponent.prototype}\n */\nvar ReactCompositeComponentMixin = {\n\n /**\n * Base constructor for all composite component.\n *\n * @param {ReactElement} element\n * @final\n * @internal\n */\n construct: function (element) {\n this._currentElement = element;\n this._rootNodeID = null;\n this._instance = null;\n\n // See ReactUpdateQueue\n this._pendingElement = null;\n this._pendingStateQueue = null;\n this._pendingReplaceState = false;\n this._pendingForceUpdate = false;\n\n this._renderedComponent = null;\n\n this._context = null;\n this._mountOrder = 0;\n this._topLevelWrapper = null;\n\n // See ReactUpdates and ReactUpdateQueue.\n this._pendingCallbacks = null;\n },\n\n /**\n * Initializes the component, renders markup, and registers event listeners.\n *\n * @param {string} rootID DOM ID of the root node.\n * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction\n * @return {?string} Rendered markup to be inserted into the DOM.\n * @final\n * @internal\n */\n mountComponent: function (rootID, transaction, context) {\n this._context = context;\n this._mountOrder = nextMountID++;\n this._rootNodeID = rootID;\n\n var publicProps = this._processProps(this._currentElement.props);\n var publicContext = this._processContext(context);\n\n var Component = this._currentElement.type;\n\n // Initialize the public class\n var inst;\n var renderedElement;\n\n // This is a way to detect if Component is a stateless arrow function\n // component, which is not newable. It might not be 100% reliable but is\n // something we can do until we start detecting that Component extends\n // React.Component. We already assume that typeof Component === 'function'.\n var canInstantiate = ('prototype' in Component);\n\n if (canInstantiate) {\n if (process.env.NODE_ENV !== 'production') {\n ReactCurrentOwner.current = this;\n try {\n inst = new Component(publicProps, publicContext, ReactUpdateQueue);\n } finally {\n ReactCurrentOwner.current = null;\n }\n } else {\n inst = new Component(publicProps, publicContext, ReactUpdateQueue);\n }\n }\n\n if (!canInstantiate || inst === null || inst === false || ReactElement.isValidElement(inst)) {\n renderedElement = inst;\n inst = new StatelessComponent(Component);\n }\n\n if (process.env.NODE_ENV !== 'production') {\n // This will throw later in _renderValidatedComponent, but add an early\n // warning now to help debugging\n if (inst.render == null) {\n process.env.NODE_ENV !== 'production' ? warning(false, '%s(...): No `render` method found on the returned component ' + 'instance: you may have forgotten to define `render`, returned ' + 'null/false from a stateless component, or tried to render an ' + 'element whose type is a function that isn\\'t a React component.', Component.displayName || Component.name || 'Component') : undefined;\n } else {\n // We support ES6 inheriting from React.Component, the module pattern,\n // and stateless components, but not ES6 classes that don't extend\n process.env.NODE_ENV !== 'production' ? warning(Component.prototype && Component.prototype.isReactComponent || !canInstantiate || !(inst instanceof Component), '%s(...): React component classes must extend React.Component.', Component.displayName || Component.name || 'Component') : undefined;\n }\n }\n\n // These should be set up in the constructor, but as a convenience for\n // simpler class abstractions, we set them up after the fact.\n inst.props = publicProps;\n inst.context = publicContext;\n inst.refs = emptyObject;\n inst.updater = ReactUpdateQueue;\n\n this._instance = inst;\n\n // Store a reference from the instance back to the internal representation\n ReactInstanceMap.set(inst, this);\n\n if (process.env.NODE_ENV !== 'production') {\n // Since plain JS classes are defined without any special initialization\n // logic, we can not catch common errors early. Therefore, we have to\n // catch them here, at initialization time, instead.\n process.env.NODE_ENV !== 'production' ? warning(!inst.getInitialState || inst.getInitialState.isReactClassApproved, 'getInitialState was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Did you mean to define a state property instead?', this.getName() || 'a component') : undefined;\n process.env.NODE_ENV !== 'production' ? warning(!inst.getDefaultProps || inst.getDefaultProps.isReactClassApproved, 'getDefaultProps was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Use a static property to define defaultProps instead.', this.getName() || 'a component') : undefined;\n process.env.NODE_ENV !== 'production' ? warning(!inst.propTypes, 'propTypes was defined as an instance property on %s. Use a static ' + 'property to define propTypes instead.', this.getName() || 'a component') : undefined;\n process.env.NODE_ENV !== 'production' ? warning(!inst.contextTypes, 'contextTypes was defined as an instance property on %s. Use a ' + 'static property to define contextTypes instead.', this.getName() || 'a component') : undefined;\n process.env.NODE_ENV !== 'production' ? warning(typeof inst.componentShouldUpdate !== 'function', '%s has a method called ' + 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' + 'The name is phrased as a question because the function is ' + 'expected to return a value.', this.getName() || 'A component') : undefined;\n process.env.NODE_ENV !== 'production' ? warning(typeof inst.componentDidUnmount !== 'function', '%s has a method called ' + 'componentDidUnmount(). But there is no such lifecycle method. ' + 'Did you mean componentWillUnmount()?', this.getName() || 'A component') : undefined;\n process.env.NODE_ENV !== 'production' ? warning(typeof inst.componentWillRecieveProps !== 'function', '%s has a method called ' + 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', this.getName() || 'A component') : undefined;\n }\n\n var initialState = inst.state;\n if (initialState === undefined) {\n inst.state = initialState = null;\n }\n !(typeof initialState === 'object' && !Array.isArray(initialState)) ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s.state: must be set to an object or null', this.getName() || 'ReactCompositeComponent') : invariant(false) : undefined;\n\n this._pendingStateQueue = null;\n this._pendingReplaceState = false;\n this._pendingForceUpdate = false;\n\n if (inst.componentWillMount) {\n inst.componentWillMount();\n // When mounting, calls to `setState` by `componentWillMount` will set\n // `this._pendingStateQueue` without triggering a re-render.\n if (this._pendingStateQueue) {\n inst.state = this._processPendingState(inst.props, inst.context);\n }\n }\n\n // If not a stateless component, we now render\n if (renderedElement === undefined) {\n renderedElement = this._renderValidatedComponent();\n }\n\n this._renderedComponent = this._instantiateReactComponent(renderedElement);\n\n var markup = ReactReconciler.mountComponent(this._renderedComponent, rootID, transaction, this._processChildContext(context));\n if (inst.componentDidMount) {\n transaction.getReactMountReady().enqueue(inst.componentDidMount, inst);\n }\n\n return markup;\n },\n\n /**\n * Releases any resources allocated by `mountComponent`.\n *\n * @final\n * @internal\n */\n unmountComponent: function () {\n var inst = this._instance;\n\n if (inst.componentWillUnmount) {\n inst.componentWillUnmount();\n }\n\n ReactReconciler.unmountComponent(this._renderedComponent);\n this._renderedComponent = null;\n this._instance = null;\n\n // Reset pending fields\n // Even if this component is scheduled for another update in ReactUpdates,\n // it would still be ignored because these fields are reset.\n this._pendingStateQueue = null;\n this._pendingReplaceState = false;\n this._pendingForceUpdate = false;\n this._pendingCallbacks = null;\n this._pendingElement = null;\n\n // These fields do not really need to be reset since this object is no\n // longer accessible.\n this._context = null;\n this._rootNodeID = null;\n this._topLevelWrapper = null;\n\n // Delete the reference from the instance to this internal representation\n // which allow the internals to be properly cleaned up even if the user\n // leaks a reference to the public instance.\n ReactInstanceMap.remove(inst);\n\n // Some existing components rely on inst.props even after they've been\n // destroyed (in event handlers).\n // TODO: inst.props = null;\n // TODO: inst.state = null;\n // TODO: inst.context = null;\n },\n\n /**\n * Filters the context object to only contain keys specified in\n * `contextTypes`\n *\n * @param {object} context\n * @return {?object}\n * @private\n */\n _maskContext: function (context) {\n var maskedContext = null;\n var Component = this._currentElement.type;\n var contextTypes = Component.contextTypes;\n if (!contextTypes) {\n return emptyObject;\n }\n maskedContext = {};\n for (var contextName in contextTypes) {\n maskedContext[contextName] = context[contextName];\n }\n return maskedContext;\n },\n\n /**\n * Filters the context object to only contain keys specified in\n * `contextTypes`, and asserts that they are valid.\n *\n * @param {object} context\n * @return {?object}\n * @private\n */\n _processContext: function (context) {\n var maskedContext = this._maskContext(context);\n if (process.env.NODE_ENV !== 'production') {\n var Component = this._currentElement.type;\n if (Component.contextTypes) {\n this._checkPropTypes(Component.contextTypes, maskedContext, ReactPropTypeLocations.context);\n }\n }\n return maskedContext;\n },\n\n /**\n * @param {object} currentContext\n * @return {object}\n * @private\n */\n _processChildContext: function (currentContext) {\n var Component = this._currentElement.type;\n var inst = this._instance;\n var childContext = inst.getChildContext && inst.getChildContext();\n if (childContext) {\n !(typeof Component.childContextTypes === 'object') ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s.getChildContext(): childContextTypes must be defined in order to ' + 'use getChildContext().', this.getName() || 'ReactCompositeComponent') : invariant(false) : undefined;\n if (process.env.NODE_ENV !== 'production') {\n this._checkPropTypes(Component.childContextTypes, childContext, ReactPropTypeLocations.childContext);\n }\n for (var name in childContext) {\n !(name in Component.childContextTypes) ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s.getChildContext(): key \"%s\" is not defined in childContextTypes.', this.getName() || 'ReactCompositeComponent', name) : invariant(false) : undefined;\n }\n return assign({}, currentContext, childContext);\n }\n return currentContext;\n },\n\n /**\n * Processes props by setting default values for unspecified props and\n * asserting that the props are valid. Does not mutate its argument; returns\n * a new props object with defaults merged in.\n *\n * @param {object} newProps\n * @return {object}\n * @private\n */\n _processProps: function (newProps) {\n if (process.env.NODE_ENV !== 'production') {\n var Component = this._currentElement.type;\n if (Component.propTypes) {\n this._checkPropTypes(Component.propTypes, newProps, ReactPropTypeLocations.prop);\n }\n }\n return newProps;\n },\n\n /**\n * Assert that the props are valid\n *\n * @param {object} propTypes Map of prop name to a ReactPropType\n * @param {object} props\n * @param {string} location e.g. \"prop\", \"context\", \"child context\"\n * @private\n */\n _checkPropTypes: function (propTypes, props, location) {\n // TODO: Stop validating prop types here and only use the element\n // validation.\n var componentName = this.getName();\n for (var propName in propTypes) {\n if (propTypes.hasOwnProperty(propName)) {\n var error;\n try {\n // This is intentionally an invariant that gets caught. It's the same\n // behavior as without this statement except with a better message.\n !(typeof propTypes[propName] === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s: %s type `%s` is invalid; it must be a function, usually ' + 'from React.PropTypes.', componentName || 'React class', ReactPropTypeLocationNames[location], propName) : invariant(false) : undefined;\n error = propTypes[propName](props, propName, componentName, location);\n } catch (ex) {\n error = ex;\n }\n if (error instanceof Error) {\n // We may want to extend this logic for similar errors in\n // top-level render calls, so I'm abstracting it away into\n // a function to minimize refactoring in the future\n var addendum = getDeclarationErrorAddendum(this);\n\n if (location === ReactPropTypeLocations.prop) {\n // Preface gives us something to blacklist in warning module\n process.env.NODE_ENV !== 'production' ? warning(false, 'Failed Composite propType: %s%s', error.message, addendum) : undefined;\n } else {\n process.env.NODE_ENV !== 'production' ? warning(false, 'Failed Context Types: %s%s', error.message, addendum) : undefined;\n }\n }\n }\n }\n },\n\n receiveComponent: function (nextElement, transaction, nextContext) {\n var prevElement = this._currentElement;\n var prevContext = this._context;\n\n this._pendingElement = null;\n\n this.updateComponent(transaction, prevElement, nextElement, prevContext, nextContext);\n },\n\n /**\n * If any of `_pendingElement`, `_pendingStateQueue`, or `_pendingForceUpdate`\n * is set, update the component.\n *\n * @param {ReactReconcileTransaction} transaction\n * @internal\n */\n performUpdateIfNecessary: function (transaction) {\n if (this._pendingElement != null) {\n ReactReconciler.receiveComponent(this, this._pendingElement || this._currentElement, transaction, this._context);\n }\n\n if (this._pendingStateQueue !== null || this._pendingForceUpdate) {\n this.updateComponent(transaction, this._currentElement, this._currentElement, this._context, this._context);\n }\n },\n\n /**\n * Perform an update to a mounted component. The componentWillReceiveProps and\n * shouldComponentUpdate methods are called, then (assuming the update isn't\n * skipped) the remaining update lifecycle methods are called and the DOM\n * representation is updated.\n *\n * By default, this implements React's rendering and reconciliation algorithm.\n * Sophisticated clients may wish to override this.\n *\n * @param {ReactReconcileTransaction} transaction\n * @param {ReactElement} prevParentElement\n * @param {ReactElement} nextParentElement\n * @internal\n * @overridable\n */\n updateComponent: function (transaction, prevParentElement, nextParentElement, prevUnmaskedContext, nextUnmaskedContext) {\n var inst = this._instance;\n\n var nextContext = this._context === nextUnmaskedContext ? inst.context : this._processContext(nextUnmaskedContext);\n var nextProps;\n\n // Distinguish between a props update versus a simple state update\n if (prevParentElement === nextParentElement) {\n // Skip checking prop types again -- we don't read inst.props to avoid\n // warning for DOM component props in this upgrade\n nextProps = nextParentElement.props;\n } else {\n nextProps = this._processProps(nextParentElement.props);\n // An update here will schedule an update but immediately set\n // _pendingStateQueue which will ensure that any state updates gets\n // immediately reconciled instead of waiting for the next batch.\n\n if (inst.componentWillReceiveProps) {\n inst.componentWillReceiveProps(nextProps, nextContext);\n }\n }\n\n var nextState = this._processPendingState(nextProps, nextContext);\n\n var shouldUpdate = this._pendingForceUpdate || !inst.shouldComponentUpdate || inst.shouldComponentUpdate(nextProps, nextState, nextContext);\n\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(typeof shouldUpdate !== 'undefined', '%s.shouldComponentUpdate(): Returned undefined instead of a ' + 'boolean value. Make sure to return true or false.', this.getName() || 'ReactCompositeComponent') : undefined;\n }\n\n if (shouldUpdate) {\n this._pendingForceUpdate = false;\n // Will set `this.props`, `this.state` and `this.context`.\n this._performComponentUpdate(nextParentElement, nextProps, nextState, nextContext, transaction, nextUnmaskedContext);\n } else {\n // If it's determined that a component should not update, we still want\n // to set props and state but we shortcut the rest of the update.\n this._currentElement = nextParentElement;\n this._context = nextUnmaskedContext;\n inst.props = nextProps;\n inst.state = nextState;\n inst.context = nextContext;\n }\n },\n\n _processPendingState: function (props, context) {\n var inst = this._instance;\n var queue = this._pendingStateQueue;\n var replace = this._pendingReplaceState;\n this._pendingReplaceState = false;\n this._pendingStateQueue = null;\n\n if (!queue) {\n return inst.state;\n }\n\n if (replace && queue.length === 1) {\n return queue[0];\n }\n\n var nextState = assign({}, replace ? queue[0] : inst.state);\n for (var i = replace ? 1 : 0; i < queue.length; i++) {\n var partial = queue[i];\n assign(nextState, typeof partial === 'function' ? partial.call(inst, nextState, props, context) : partial);\n }\n\n return nextState;\n },\n\n /**\n * Merges new props and state, notifies delegate methods of update and\n * performs update.\n *\n * @param {ReactElement} nextElement Next element\n * @param {object} nextProps Next public object to set as properties.\n * @param {?object} nextState Next object to set as state.\n * @param {?object} nextContext Next public object to set as context.\n * @param {ReactReconcileTransaction} transaction\n * @param {?object} unmaskedContext\n * @private\n */\n _performComponentUpdate: function (nextElement, nextProps, nextState, nextContext, transaction, unmaskedContext) {\n var inst = this._instance;\n\n var hasComponentDidUpdate = Boolean(inst.componentDidUpdate);\n var prevProps;\n var prevState;\n var prevContext;\n if (hasComponentDidUpdate) {\n prevProps = inst.props;\n prevState = inst.state;\n prevContext = inst.context;\n }\n\n if (inst.componentWillUpdate) {\n inst.componentWillUpdate(nextProps, nextState, nextContext);\n }\n\n this._currentElement = nextElement;\n this._context = unmaskedContext;\n inst.props = nextProps;\n inst.state = nextState;\n inst.context = nextContext;\n\n this._updateRenderedComponent(transaction, unmaskedContext);\n\n if (hasComponentDidUpdate) {\n transaction.getReactMountReady().enqueue(inst.componentDidUpdate.bind(inst, prevProps, prevState, prevContext), inst);\n }\n },\n\n /**\n * Call the component's `render` method and update the DOM accordingly.\n *\n * @param {ReactReconcileTransaction} transaction\n * @internal\n */\n _updateRenderedComponent: function (transaction, context) {\n var prevComponentInstance = this._renderedComponent;\n var prevRenderedElement = prevComponentInstance._currentElement;\n var nextRenderedElement = this._renderValidatedComponent();\n if (shouldUpdateReactComponent(prevRenderedElement, nextRenderedElement)) {\n ReactReconciler.receiveComponent(prevComponentInstance, nextRenderedElement, transaction, this._processChildContext(context));\n } else {\n // These two IDs are actually the same! But nothing should rely on that.\n var thisID = this._rootNodeID;\n var prevComponentID = prevComponentInstance._rootNodeID;\n ReactReconciler.unmountComponent(prevComponentInstance);\n\n this._renderedComponent = this._instantiateReactComponent(nextRenderedElement);\n var nextMarkup = ReactReconciler.mountComponent(this._renderedComponent, thisID, transaction, this._processChildContext(context));\n this._replaceNodeWithMarkupByID(prevComponentID, nextMarkup);\n }\n },\n\n /**\n * @protected\n */\n _replaceNodeWithMarkupByID: function (prevComponentID, nextMarkup) {\n ReactComponentEnvironment.replaceNodeWithMarkupByID(prevComponentID, nextMarkup);\n },\n\n /**\n * @protected\n */\n _renderValidatedComponentWithoutOwnerOrContext: function () {\n var inst = this._instance;\n var renderedComponent = inst.render();\n if (process.env.NODE_ENV !== 'production') {\n // We allow auto-mocks to proceed as if they're returning null.\n if (typeof renderedComponent === 'undefined' && inst.render._isMockFunction) {\n // This is probably bad practice. Consider warning here and\n // deprecating this convenience.\n renderedComponent = null;\n }\n }\n\n return renderedComponent;\n },\n\n /**\n * @private\n */\n _renderValidatedComponent: function () {\n var renderedComponent;\n ReactCurrentOwner.current = this;\n try {\n renderedComponent = this._renderValidatedComponentWithoutOwnerOrContext();\n } finally {\n ReactCurrentOwner.current = null;\n }\n !(\n // TODO: An `isValidNode` function would probably be more appropriate\n renderedComponent === null || renderedComponent === false || ReactElement.isValidElement(renderedComponent)) ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s.render(): A valid ReactComponent must be returned. You may have ' + 'returned undefined, an array or some other invalid object.', this.getName() || 'ReactCompositeComponent') : invariant(false) : undefined;\n return renderedComponent;\n },\n\n /**\n * Lazily allocates the refs object and stores `component` as `ref`.\n *\n * @param {string} ref Reference name.\n * @param {component} component Component to store as `ref`.\n * @final\n * @private\n */\n attachRef: function (ref, component) {\n var inst = this.getPublicInstance();\n !(inst != null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Stateless function components cannot have refs.') : invariant(false) : undefined;\n var publicComponentInstance = component.getPublicInstance();\n if (process.env.NODE_ENV !== 'production') {\n var componentName = component && component.getName ? component.getName() : 'a component';\n process.env.NODE_ENV !== 'production' ? warning(publicComponentInstance != null, 'Stateless function components cannot be given refs ' + '(See ref \"%s\" in %s created by %s). ' + 'Attempts to access this ref will fail.', ref, componentName, this.getName()) : undefined;\n }\n var refs = inst.refs === emptyObject ? inst.refs = {} : inst.refs;\n refs[ref] = publicComponentInstance;\n },\n\n /**\n * Detaches a reference name.\n *\n * @param {string} ref Name to dereference.\n * @final\n * @private\n */\n detachRef: function (ref) {\n var refs = this.getPublicInstance().refs;\n delete refs[ref];\n },\n\n /**\n * Get a text description of the component that can be used to identify it\n * in error messages.\n * @return {string} The name or null.\n * @internal\n */\n getName: function () {\n var type = this._currentElement.type;\n var constructor = this._instance && this._instance.constructor;\n return type.displayName || constructor && constructor.displayName || type.name || constructor && constructor.name || null;\n },\n\n /**\n * Get the publicly accessible representation of this component - i.e. what\n * is exposed by refs and returned by render. Can be null for stateless\n * components.\n *\n * @return {ReactComponent} the public component instance.\n * @internal\n */\n getPublicInstance: function () {\n var inst = this._instance;\n if (inst instanceof StatelessComponent) {\n return null;\n }\n return inst;\n },\n\n // Stub\n _instantiateReactComponent: null\n\n};\n\nReactPerf.measureMethods(ReactCompositeComponentMixin, 'ReactCompositeComponent', {\n mountComponent: 'mountComponent',\n updateComponent: 'updateComponent',\n _renderValidatedComponent: '_renderValidatedComponent'\n});\n\nvar ReactCompositeComponent = {\n\n Mixin: ReactCompositeComponentMixin\n\n};\n\nmodule.exports = ReactCompositeComponent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactCompositeComponent.js\n ** module id = 62\n ** module chunks = 0 1\n **/","/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactComponentEnvironment\n */\n\n'use strict';\n\nvar invariant = require('fbjs/lib/invariant');\n\nvar injected = false;\n\nvar ReactComponentEnvironment = {\n\n /**\n * Optionally injectable environment dependent cleanup hook. (server vs.\n * browser etc). Example: A browser system caches DOM nodes based on component\n * ID and must remove that cache entry when this instance is unmounted.\n */\n unmountIDFromEnvironment: null,\n\n /**\n * Optionally injectable hook for swapping out mount images in the middle of\n * the tree.\n */\n replaceNodeWithMarkupByID: null,\n\n /**\n * Optionally injectable hook for processing a queue of child updates. Will\n * later move into MultiChildComponents.\n */\n processChildrenUpdates: null,\n\n injection: {\n injectEnvironment: function (environment) {\n !!injected ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactCompositeComponent: injectEnvironment() can only be called once.') : invariant(false) : undefined;\n ReactComponentEnvironment.unmountIDFromEnvironment = environment.unmountIDFromEnvironment;\n ReactComponentEnvironment.replaceNodeWithMarkupByID = environment.replaceNodeWithMarkupByID;\n ReactComponentEnvironment.processChildrenUpdates = environment.processChildrenUpdates;\n injected = true;\n }\n }\n\n};\n\nmodule.exports = ReactComponentEnvironment;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactComponentEnvironment.js\n ** module id = 63\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactPropTypeLocations\n */\n\n'use strict';\n\nvar keyMirror = require('fbjs/lib/keyMirror');\n\nvar ReactPropTypeLocations = keyMirror({\n prop: null,\n context: null,\n childContext: null\n});\n\nmodule.exports = ReactPropTypeLocations;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactPropTypeLocations.js\n ** module id = 64\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactPropTypeLocationNames\n */\n\n'use strict';\n\nvar ReactPropTypeLocationNames = {};\n\nif (process.env.NODE_ENV !== 'production') {\n ReactPropTypeLocationNames = {\n prop: 'prop',\n context: 'context',\n childContext: 'child context'\n };\n}\n\nmodule.exports = ReactPropTypeLocationNames;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactPropTypeLocationNames.js\n ** module id = 65\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule shouldUpdateReactComponent\n * @typechecks static-only\n */\n\n'use strict';\n\n/**\n * Given a `prevElement` and `nextElement`, determines if the existing\n * instance should be updated as opposed to being destroyed or replaced by a new\n * instance. Both arguments are elements. This ensures that this logic can\n * operate on stateless trees without any backing instance.\n *\n * @param {?object} prevElement\n * @param {?object} nextElement\n * @return {boolean} True if the existing instance should be updated.\n * @protected\n */\nfunction shouldUpdateReactComponent(prevElement, nextElement) {\n var prevEmpty = prevElement === null || prevElement === false;\n var nextEmpty = nextElement === null || nextElement === false;\n if (prevEmpty || nextEmpty) {\n return prevEmpty === nextEmpty;\n }\n\n var prevType = typeof prevElement;\n var nextType = typeof nextElement;\n if (prevType === 'string' || prevType === 'number') {\n return nextType === 'string' || nextType === 'number';\n } else {\n return nextType === 'object' && prevElement.type === nextElement.type && prevElement.key === nextElement.key;\n }\n return false;\n}\n\nmodule.exports = shouldUpdateReactComponent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/shouldUpdateReactComponent.js\n ** module id = 66\n ** module chunks = 0 1\n **/","/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactEmptyComponent\n */\n\n'use strict';\n\nvar ReactElement = require('./ReactElement');\nvar ReactEmptyComponentRegistry = require('./ReactEmptyComponentRegistry');\nvar ReactReconciler = require('./ReactReconciler');\n\nvar assign = require('./Object.assign');\n\nvar placeholderElement;\n\nvar ReactEmptyComponentInjection = {\n injectEmptyComponent: function (component) {\n placeholderElement = ReactElement.createElement(component);\n }\n};\n\nvar ReactEmptyComponent = function (instantiate) {\n this._currentElement = null;\n this._rootNodeID = null;\n this._renderedComponent = instantiate(placeholderElement);\n};\nassign(ReactEmptyComponent.prototype, {\n construct: function (element) {},\n mountComponent: function (rootID, transaction, context) {\n ReactEmptyComponentRegistry.registerNullComponentID(rootID);\n this._rootNodeID = rootID;\n return ReactReconciler.mountComponent(this._renderedComponent, rootID, transaction, context);\n },\n receiveComponent: function () {},\n unmountComponent: function (rootID, transaction, context) {\n ReactReconciler.unmountComponent(this._renderedComponent);\n ReactEmptyComponentRegistry.deregisterNullComponentID(this._rootNodeID);\n this._rootNodeID = null;\n this._renderedComponent = null;\n }\n});\n\nReactEmptyComponent.injection = ReactEmptyComponentInjection;\n\nmodule.exports = ReactEmptyComponent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactEmptyComponent.js\n ** module id = 67\n ** module chunks = 0 1\n **/","/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactNativeComponent\n */\n\n'use strict';\n\nvar assign = require('./Object.assign');\nvar invariant = require('fbjs/lib/invariant');\n\nvar autoGenerateWrapperClass = null;\nvar genericComponentClass = null;\n// This registry keeps track of wrapper classes around native tags.\nvar tagToComponentClass = {};\nvar textComponentClass = null;\n\nvar ReactNativeComponentInjection = {\n // This accepts a class that receives the tag string. This is a catch all\n // that can render any kind of tag.\n injectGenericComponentClass: function (componentClass) {\n genericComponentClass = componentClass;\n },\n // This accepts a text component class that takes the text string to be\n // rendered as props.\n injectTextComponentClass: function (componentClass) {\n textComponentClass = componentClass;\n },\n // This accepts a keyed object with classes as values. Each key represents a\n // tag. That particular tag will use this class instead of the generic one.\n injectComponentClasses: function (componentClasses) {\n assign(tagToComponentClass, componentClasses);\n }\n};\n\n/**\n * Get a composite component wrapper class for a specific tag.\n *\n * @param {ReactElement} element The tag for which to get the class.\n * @return {function} The React class constructor function.\n */\nfunction getComponentClassForElement(element) {\n if (typeof element.type === 'function') {\n return element.type;\n }\n var tag = element.type;\n var componentClass = tagToComponentClass[tag];\n if (componentClass == null) {\n tagToComponentClass[tag] = componentClass = autoGenerateWrapperClass(tag);\n }\n return componentClass;\n}\n\n/**\n * Get a native internal component class for a specific tag.\n *\n * @param {ReactElement} element The element to create.\n * @return {function} The internal class constructor function.\n */\nfunction createInternalComponent(element) {\n !genericComponentClass ? process.env.NODE_ENV !== 'production' ? invariant(false, 'There is no registered component for the tag %s', element.type) : invariant(false) : undefined;\n return new genericComponentClass(element.type, element.props);\n}\n\n/**\n * @param {ReactText} text\n * @return {ReactComponent}\n */\nfunction createInstanceForText(text) {\n return new textComponentClass(text);\n}\n\n/**\n * @param {ReactComponent} component\n * @return {boolean}\n */\nfunction isTextComponent(component) {\n return component instanceof textComponentClass;\n}\n\nvar ReactNativeComponent = {\n getComponentClassForElement: getComponentClassForElement,\n createInternalComponent: createInternalComponent,\n createInstanceForText: createInstanceForText,\n isTextComponent: isTextComponent,\n injection: ReactNativeComponentInjection\n};\n\nmodule.exports = ReactNativeComponent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactNativeComponent.js\n ** module id = 68\n ** module chunks = 0 1\n **/","/**\n * Copyright 2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule validateDOMNesting\n */\n\n'use strict';\n\nvar assign = require('./Object.assign');\nvar emptyFunction = require('fbjs/lib/emptyFunction');\nvar warning = require('fbjs/lib/warning');\n\nvar validateDOMNesting = emptyFunction;\n\nif (process.env.NODE_ENV !== 'production') {\n // This validation code was written based on the HTML5 parsing spec:\n // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope\n //\n // Note: this does not catch all invalid nesting, nor does it try to (as it's\n // not clear what practical benefit doing so provides); instead, we warn only\n // for cases where the parser will give a parse tree differing from what React\n // intended. For example, <b><div></div></b> is invalid but we don't warn\n // because it still parses correctly; we do warn for other cases like nested\n // <p> tags where the beginning of the second element implicitly closes the\n // first, causing a confusing mess.\n\n // https://html.spec.whatwg.org/multipage/syntax.html#special\n var specialTags = ['address', 'applet', 'area', 'article', 'aside', 'base', 'basefont', 'bgsound', 'blockquote', 'body', 'br', 'button', 'caption', 'center', 'col', 'colgroup', 'dd', 'details', 'dir', 'div', 'dl', 'dt', 'embed', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'frame', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'iframe', 'img', 'input', 'isindex', 'li', 'link', 'listing', 'main', 'marquee', 'menu', 'menuitem', 'meta', 'nav', 'noembed', 'noframes', 'noscript', 'object', 'ol', 'p', 'param', 'plaintext', 'pre', 'script', 'section', 'select', 'source', 'style', 'summary', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'title', 'tr', 'track', 'ul', 'wbr', 'xmp'];\n\n // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope\n var inScopeTags = ['applet', 'caption', 'html', 'table', 'td', 'th', 'marquee', 'object', 'template',\n\n // https://html.spec.whatwg.org/multipage/syntax.html#html-integration-point\n // TODO: Distinguish by namespace here -- for <title>, including it here\n // errs on the side of fewer warnings\n 'foreignObject', 'desc', 'title'];\n\n // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-button-scope\n var buttonScopeTags = inScopeTags.concat(['button']);\n\n // https://html.spec.whatwg.org/multipage/syntax.html#generate-implied-end-tags\n var impliedEndTags = ['dd', 'dt', 'li', 'option', 'optgroup', 'p', 'rp', 'rt'];\n\n var emptyAncestorInfo = {\n parentTag: null,\n\n formTag: null,\n aTagInScope: null,\n buttonTagInScope: null,\n nobrTagInScope: null,\n pTagInButtonScope: null,\n\n listItemTagAutoclosing: null,\n dlItemTagAutoclosing: null\n };\n\n var updatedAncestorInfo = function (oldInfo, tag, instance) {\n var ancestorInfo = assign({}, oldInfo || emptyAncestorInfo);\n var info = { tag: tag, instance: instance };\n\n if (inScopeTags.indexOf(tag) !== -1) {\n ancestorInfo.aTagInScope = null;\n ancestorInfo.buttonTagInScope = null;\n ancestorInfo.nobrTagInScope = null;\n }\n if (buttonScopeTags.indexOf(tag) !== -1) {\n ancestorInfo.pTagInButtonScope = null;\n }\n\n // See rules for 'li', 'dd', 'dt' start tags in\n // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody\n if (specialTags.indexOf(tag) !== -1 && tag !== 'address' && tag !== 'div' && tag !== 'p') {\n ancestorInfo.listItemTagAutoclosing = null;\n ancestorInfo.dlItemTagAutoclosing = null;\n }\n\n ancestorInfo.parentTag = info;\n\n if (tag === 'form') {\n ancestorInfo.formTag = info;\n }\n if (tag === 'a') {\n ancestorInfo.aTagInScope = info;\n }\n if (tag === 'button') {\n ancestorInfo.buttonTagInScope = info;\n }\n if (tag === 'nobr') {\n ancestorInfo.nobrTagInScope = info;\n }\n if (tag === 'p') {\n ancestorInfo.pTagInButtonScope = info;\n }\n if (tag === 'li') {\n ancestorInfo.listItemTagAutoclosing = info;\n }\n if (tag === 'dd' || tag === 'dt') {\n ancestorInfo.dlItemTagAutoclosing = info;\n }\n\n return ancestorInfo;\n };\n\n /**\n * Returns whether\n */\n var isTagValidWithParent = function (tag, parentTag) {\n // First, let's check if we're in an unusual parsing mode...\n switch (parentTag) {\n // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inselect\n case 'select':\n return tag === 'option' || tag === 'optgroup' || tag === '#text';\n case 'optgroup':\n return tag === 'option' || tag === '#text';\n // Strictly speaking, seeing an <option> doesn't mean we're in a <select>\n // but\n case 'option':\n return tag === '#text';\n\n // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intd\n // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incaption\n // No special behavior since these rules fall back to \"in body\" mode for\n // all except special table nodes which cause bad parsing behavior anyway.\n\n // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intr\n case 'tr':\n return tag === 'th' || tag === 'td' || tag === 'style' || tag === 'script' || tag === 'template';\n\n // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intbody\n case 'tbody':\n case 'thead':\n case 'tfoot':\n return tag === 'tr' || tag === 'style' || tag === 'script' || tag === 'template';\n\n // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incolgroup\n case 'colgroup':\n return tag === 'col' || tag === 'template';\n\n // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intable\n case 'table':\n return tag === 'caption' || tag === 'colgroup' || tag === 'tbody' || tag === 'tfoot' || tag === 'thead' || tag === 'style' || tag === 'script' || tag === 'template';\n\n // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inhead\n case 'head':\n return tag === 'base' || tag === 'basefont' || tag === 'bgsound' || tag === 'link' || tag === 'meta' || tag === 'title' || tag === 'noscript' || tag === 'noframes' || tag === 'style' || tag === 'script' || tag === 'template';\n\n // https://html.spec.whatwg.org/multipage/semantics.html#the-html-element\n case 'html':\n return tag === 'head' || tag === 'body';\n }\n\n // Probably in the \"in body\" parsing mode, so we outlaw only tag combos\n // where the parsing rules cause implicit opens or closes to be added.\n // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody\n switch (tag) {\n case 'h1':\n case 'h2':\n case 'h3':\n case 'h4':\n case 'h5':\n case 'h6':\n return parentTag !== 'h1' && parentTag !== 'h2' && parentTag !== 'h3' && parentTag !== 'h4' && parentTag !== 'h5' && parentTag !== 'h6';\n\n case 'rp':\n case 'rt':\n return impliedEndTags.indexOf(parentTag) === -1;\n\n case 'caption':\n case 'col':\n case 'colgroup':\n case 'frame':\n case 'head':\n case 'tbody':\n case 'td':\n case 'tfoot':\n case 'th':\n case 'thead':\n case 'tr':\n // These tags are only valid with a few parents that have special child\n // parsing rules -- if we're down here, then none of those matched and\n // so we allow it only if we don't know what the parent is, as all other\n // cases are invalid.\n return parentTag == null;\n }\n\n return true;\n };\n\n /**\n * Returns whether\n */\n var findInvalidAncestorForTag = function (tag, ancestorInfo) {\n switch (tag) {\n case 'address':\n case 'article':\n case 'aside':\n case 'blockquote':\n case 'center':\n case 'details':\n case 'dialog':\n case 'dir':\n case 'div':\n case 'dl':\n case 'fieldset':\n case 'figcaption':\n case 'figure':\n case 'footer':\n case 'header':\n case 'hgroup':\n case 'main':\n case 'menu':\n case 'nav':\n case 'ol':\n case 'p':\n case 'section':\n case 'summary':\n case 'ul':\n\n case 'pre':\n case 'listing':\n\n case 'table':\n\n case 'hr':\n\n case 'xmp':\n\n case 'h1':\n case 'h2':\n case 'h3':\n case 'h4':\n case 'h5':\n case 'h6':\n return ancestorInfo.pTagInButtonScope;\n\n case 'form':\n return ancestorInfo.formTag || ancestorInfo.pTagInButtonScope;\n\n case 'li':\n return ancestorInfo.listItemTagAutoclosing;\n\n case 'dd':\n case 'dt':\n return ancestorInfo.dlItemTagAutoclosing;\n\n case 'button':\n return ancestorInfo.buttonTagInScope;\n\n case 'a':\n // Spec says something about storing a list of markers, but it sounds\n // equivalent to this check.\n return ancestorInfo.aTagInScope;\n\n case 'nobr':\n return ancestorInfo.nobrTagInScope;\n }\n\n return null;\n };\n\n /**\n * Given a ReactCompositeComponent instance, return a list of its recursive\n * owners, starting at the root and ending with the instance itself.\n */\n var findOwnerStack = function (instance) {\n if (!instance) {\n return [];\n }\n\n var stack = [];\n /*eslint-disable space-after-keywords */\n do {\n /*eslint-enable space-after-keywords */\n stack.push(instance);\n } while (instance = instance._currentElement._owner);\n stack.reverse();\n return stack;\n };\n\n var didWarn = {};\n\n validateDOMNesting = function (childTag, childInstance, ancestorInfo) {\n ancestorInfo = ancestorInfo || emptyAncestorInfo;\n var parentInfo = ancestorInfo.parentTag;\n var parentTag = parentInfo && parentInfo.tag;\n\n var invalidParent = isTagValidWithParent(childTag, parentTag) ? null : parentInfo;\n var invalidAncestor = invalidParent ? null : findInvalidAncestorForTag(childTag, ancestorInfo);\n var problematic = invalidParent || invalidAncestor;\n\n if (problematic) {\n var ancestorTag = problematic.tag;\n var ancestorInstance = problematic.instance;\n\n var childOwner = childInstance && childInstance._currentElement._owner;\n var ancestorOwner = ancestorInstance && ancestorInstance._currentElement._owner;\n\n var childOwners = findOwnerStack(childOwner);\n var ancestorOwners = findOwnerStack(ancestorOwner);\n\n var minStackLen = Math.min(childOwners.length, ancestorOwners.length);\n var i;\n\n var deepestCommon = -1;\n for (i = 0; i < minStackLen; i++) {\n if (childOwners[i] === ancestorOwners[i]) {\n deepestCommon = i;\n } else {\n break;\n }\n }\n\n var UNKNOWN = '(unknown)';\n var childOwnerNames = childOwners.slice(deepestCommon + 1).map(function (inst) {\n return inst.getName() || UNKNOWN;\n });\n var ancestorOwnerNames = ancestorOwners.slice(deepestCommon + 1).map(function (inst) {\n return inst.getName() || UNKNOWN;\n });\n var ownerInfo = [].concat(\n // If the parent and child instances have a common owner ancestor, start\n // with that -- otherwise we just start with the parent's owners.\n deepestCommon !== -1 ? childOwners[deepestCommon].getName() || UNKNOWN : [], ancestorOwnerNames, ancestorTag,\n // If we're warning about an invalid (non-parent) ancestry, add '...'\n invalidAncestor ? ['...'] : [], childOwnerNames, childTag).join(' > ');\n\n var warnKey = !!invalidParent + '|' + childTag + '|' + ancestorTag + '|' + ownerInfo;\n if (didWarn[warnKey]) {\n return;\n }\n didWarn[warnKey] = true;\n\n if (invalidParent) {\n var info = '';\n if (ancestorTag === 'table' && childTag === 'tr') {\n info += ' Add a <tbody> to your code to match the DOM tree generated by ' + 'the browser.';\n }\n process.env.NODE_ENV !== 'production' ? warning(false, 'validateDOMNesting(...): <%s> cannot appear as a child of <%s>. ' + 'See %s.%s', childTag, ancestorTag, ownerInfo, info) : undefined;\n } else {\n process.env.NODE_ENV !== 'production' ? warning(false, 'validateDOMNesting(...): <%s> cannot appear as a descendant of ' + '<%s>. See %s.', childTag, ancestorTag, ownerInfo) : undefined;\n }\n }\n };\n\n validateDOMNesting.ancestorInfoContextKey = '__validateDOMNesting_ancestorInfo$' + Math.random().toString(36).slice(2);\n\n validateDOMNesting.updatedAncestorInfo = updatedAncestorInfo;\n\n // For testing\n validateDOMNesting.isTagValidInContext = function (tag, ancestorInfo) {\n ancestorInfo = ancestorInfo || emptyAncestorInfo;\n var parentInfo = ancestorInfo.parentTag;\n var parentTag = parentInfo && parentInfo.tag;\n return isTagValidWithParent(tag, parentTag) && !findInvalidAncestorForTag(tag, ancestorInfo);\n };\n}\n\nmodule.exports = validateDOMNesting;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/validateDOMNesting.js\n ** module id = 69\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactDefaultInjection\n */\n\n'use strict';\n\nvar BeforeInputEventPlugin = require('./BeforeInputEventPlugin');\nvar ChangeEventPlugin = require('./ChangeEventPlugin');\nvar ClientReactRootIndex = require('./ClientReactRootIndex');\nvar DefaultEventPluginOrder = require('./DefaultEventPluginOrder');\nvar EnterLeaveEventPlugin = require('./EnterLeaveEventPlugin');\nvar ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');\nvar HTMLDOMPropertyConfig = require('./HTMLDOMPropertyConfig');\nvar ReactBrowserComponentMixin = require('./ReactBrowserComponentMixin');\nvar ReactComponentBrowserEnvironment = require('./ReactComponentBrowserEnvironment');\nvar ReactDefaultBatchingStrategy = require('./ReactDefaultBatchingStrategy');\nvar ReactDOMComponent = require('./ReactDOMComponent');\nvar ReactDOMTextComponent = require('./ReactDOMTextComponent');\nvar ReactEventListener = require('./ReactEventListener');\nvar ReactInjection = require('./ReactInjection');\nvar ReactInstanceHandles = require('./ReactInstanceHandles');\nvar ReactMount = require('./ReactMount');\nvar ReactReconcileTransaction = require('./ReactReconcileTransaction');\nvar SelectEventPlugin = require('./SelectEventPlugin');\nvar ServerReactRootIndex = require('./ServerReactRootIndex');\nvar SimpleEventPlugin = require('./SimpleEventPlugin');\nvar SVGDOMPropertyConfig = require('./SVGDOMPropertyConfig');\n\nvar alreadyInjected = false;\n\nfunction inject() {\n if (alreadyInjected) {\n // TODO: This is currently true because these injections are shared between\n // the client and the server package. They should be built independently\n // and not share any injection state. Then this problem will be solved.\n return;\n }\n alreadyInjected = true;\n\n ReactInjection.EventEmitter.injectReactEventListener(ReactEventListener);\n\n /**\n * Inject modules for resolving DOM hierarchy and plugin ordering.\n */\n ReactInjection.EventPluginHub.injectEventPluginOrder(DefaultEventPluginOrder);\n ReactInjection.EventPluginHub.injectInstanceHandle(ReactInstanceHandles);\n ReactInjection.EventPluginHub.injectMount(ReactMount);\n\n /**\n * Some important event plugins included by default (without having to require\n * them).\n */\n ReactInjection.EventPluginHub.injectEventPluginsByName({\n SimpleEventPlugin: SimpleEventPlugin,\n EnterLeaveEventPlugin: EnterLeaveEventPlugin,\n ChangeEventPlugin: ChangeEventPlugin,\n SelectEventPlugin: SelectEventPlugin,\n BeforeInputEventPlugin: BeforeInputEventPlugin\n });\n\n ReactInjection.NativeComponent.injectGenericComponentClass(ReactDOMComponent);\n\n ReactInjection.NativeComponent.injectTextComponentClass(ReactDOMTextComponent);\n\n ReactInjection.Class.injectMixin(ReactBrowserComponentMixin);\n\n ReactInjection.DOMProperty.injectDOMPropertyConfig(HTMLDOMPropertyConfig);\n ReactInjection.DOMProperty.injectDOMPropertyConfig(SVGDOMPropertyConfig);\n\n ReactInjection.EmptyComponent.injectEmptyComponent('noscript');\n\n ReactInjection.Updates.injectReconcileTransaction(ReactReconcileTransaction);\n ReactInjection.Updates.injectBatchingStrategy(ReactDefaultBatchingStrategy);\n\n ReactInjection.RootIndex.injectCreateReactRootIndex(ExecutionEnvironment.canUseDOM ? ClientReactRootIndex.createReactRootIndex : ServerReactRootIndex.createReactRootIndex);\n\n ReactInjection.Component.injectEnvironment(ReactComponentBrowserEnvironment);\n\n if (process.env.NODE_ENV !== 'production') {\n var url = ExecutionEnvironment.canUseDOM && window.location.href || '';\n if (/[?&]react_perf\\b/.test(url)) {\n var ReactDefaultPerf = require('./ReactDefaultPerf');\n ReactDefaultPerf.start();\n }\n }\n}\n\nmodule.exports = {\n inject: inject\n};\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactDefaultInjection.js\n ** module id = 70\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015 Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule BeforeInputEventPlugin\n * @typechecks static-only\n */\n\n'use strict';\n\nvar EventConstants = require('./EventConstants');\nvar EventPropagators = require('./EventPropagators');\nvar ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');\nvar FallbackCompositionState = require('./FallbackCompositionState');\nvar SyntheticCompositionEvent = require('./SyntheticCompositionEvent');\nvar SyntheticInputEvent = require('./SyntheticInputEvent');\n\nvar keyOf = require('fbjs/lib/keyOf');\n\nvar END_KEYCODES = [9, 13, 27, 32]; // Tab, Return, Esc, Space\nvar START_KEYCODE = 229;\n\nvar canUseCompositionEvent = ExecutionEnvironment.canUseDOM && 'CompositionEvent' in window;\n\nvar documentMode = null;\nif (ExecutionEnvironment.canUseDOM && 'documentMode' in document) {\n documentMode = document.documentMode;\n}\n\n// Webkit offers a very useful `textInput` event that can be used to\n// directly represent `beforeInput`. The IE `textinput` event is not as\n// useful, so we don't use it.\nvar canUseTextInputEvent = ExecutionEnvironment.canUseDOM && 'TextEvent' in window && !documentMode && !isPresto();\n\n// In IE9+, we have access to composition events, but the data supplied\n// by the native compositionend event may be incorrect. Japanese ideographic\n// spaces, for instance (\\u3000) are not recorded correctly.\nvar useFallbackCompositionData = ExecutionEnvironment.canUseDOM && (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11);\n\n/**\n * Opera <= 12 includes TextEvent in window, but does not fire\n * text input events. Rely on keypress instead.\n */\nfunction isPresto() {\n var opera = window.opera;\n return typeof opera === 'object' && typeof opera.version === 'function' && parseInt(opera.version(), 10) <= 12;\n}\n\nvar SPACEBAR_CODE = 32;\nvar SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE);\n\nvar topLevelTypes = EventConstants.topLevelTypes;\n\n// Events and their corresponding property names.\nvar eventTypes = {\n beforeInput: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onBeforeInput: null }),\n captured: keyOf({ onBeforeInputCapture: null })\n },\n dependencies: [topLevelTypes.topCompositionEnd, topLevelTypes.topKeyPress, topLevelTypes.topTextInput, topLevelTypes.topPaste]\n },\n compositionEnd: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onCompositionEnd: null }),\n captured: keyOf({ onCompositionEndCapture: null })\n },\n dependencies: [topLevelTypes.topBlur, topLevelTypes.topCompositionEnd, topLevelTypes.topKeyDown, topLevelTypes.topKeyPress, topLevelTypes.topKeyUp, topLevelTypes.topMouseDown]\n },\n compositionStart: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onCompositionStart: null }),\n captured: keyOf({ onCompositionStartCapture: null })\n },\n dependencies: [topLevelTypes.topBlur, topLevelTypes.topCompositionStart, topLevelTypes.topKeyDown, topLevelTypes.topKeyPress, topLevelTypes.topKeyUp, topLevelTypes.topMouseDown]\n },\n compositionUpdate: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onCompositionUpdate: null }),\n captured: keyOf({ onCompositionUpdateCapture: null })\n },\n dependencies: [topLevelTypes.topBlur, topLevelTypes.topCompositionUpdate, topLevelTypes.topKeyDown, topLevelTypes.topKeyPress, topLevelTypes.topKeyUp, topLevelTypes.topMouseDown]\n }\n};\n\n// Track whether we've ever handled a keypress on the space key.\nvar hasSpaceKeypress = false;\n\n/**\n * Return whether a native keypress event is assumed to be a command.\n * This is required because Firefox fires `keypress` events for key commands\n * (cut, copy, select-all, etc.) even though no character is inserted.\n */\nfunction isKeypressCommand(nativeEvent) {\n return (nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) &&\n // ctrlKey && altKey is equivalent to AltGr, and is not a command.\n !(nativeEvent.ctrlKey && nativeEvent.altKey);\n}\n\n/**\n * Translate native top level events into event types.\n *\n * @param {string} topLevelType\n * @return {object}\n */\nfunction getCompositionEventType(topLevelType) {\n switch (topLevelType) {\n case topLevelTypes.topCompositionStart:\n return eventTypes.compositionStart;\n case topLevelTypes.topCompositionEnd:\n return eventTypes.compositionEnd;\n case topLevelTypes.topCompositionUpdate:\n return eventTypes.compositionUpdate;\n }\n}\n\n/**\n * Does our fallback best-guess model think this event signifies that\n * composition has begun?\n *\n * @param {string} topLevelType\n * @param {object} nativeEvent\n * @return {boolean}\n */\nfunction isFallbackCompositionStart(topLevelType, nativeEvent) {\n return topLevelType === topLevelTypes.topKeyDown && nativeEvent.keyCode === START_KEYCODE;\n}\n\n/**\n * Does our fallback mode think that this event is the end of composition?\n *\n * @param {string} topLevelType\n * @param {object} nativeEvent\n * @return {boolean}\n */\nfunction isFallbackCompositionEnd(topLevelType, nativeEvent) {\n switch (topLevelType) {\n case topLevelTypes.topKeyUp:\n // Command keys insert or clear IME input.\n return END_KEYCODES.indexOf(nativeEvent.keyCode) !== -1;\n case topLevelTypes.topKeyDown:\n // Expect IME keyCode on each keydown. If we get any other\n // code we must have exited earlier.\n return nativeEvent.keyCode !== START_KEYCODE;\n case topLevelTypes.topKeyPress:\n case topLevelTypes.topMouseDown:\n case topLevelTypes.topBlur:\n // Events are not possible without cancelling IME.\n return true;\n default:\n return false;\n }\n}\n\n/**\n * Google Input Tools provides composition data via a CustomEvent,\n * with the `data` property populated in the `detail` object. If this\n * is available on the event object, use it. If not, this is a plain\n * composition event and we have nothing special to extract.\n *\n * @param {object} nativeEvent\n * @return {?string}\n */\nfunction getDataFromCustomEvent(nativeEvent) {\n var detail = nativeEvent.detail;\n if (typeof detail === 'object' && 'data' in detail) {\n return detail.data;\n }\n return null;\n}\n\n// Track the current IME composition fallback object, if any.\nvar currentComposition = null;\n\n/**\n * @param {string} topLevelType Record from `EventConstants`.\n * @param {DOMEventTarget} topLevelTarget The listening component root node.\n * @param {string} topLevelTargetID ID of `topLevelTarget`.\n * @param {object} nativeEvent Native browser event.\n * @return {?object} A SyntheticCompositionEvent.\n */\nfunction extractCompositionEvent(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) {\n var eventType;\n var fallbackData;\n\n if (canUseCompositionEvent) {\n eventType = getCompositionEventType(topLevelType);\n } else if (!currentComposition) {\n if (isFallbackCompositionStart(topLevelType, nativeEvent)) {\n eventType = eventTypes.compositionStart;\n }\n } else if (isFallbackCompositionEnd(topLevelType, nativeEvent)) {\n eventType = eventTypes.compositionEnd;\n }\n\n if (!eventType) {\n return null;\n }\n\n if (useFallbackCompositionData) {\n // The current composition is stored statically and must not be\n // overwritten while composition continues.\n if (!currentComposition && eventType === eventTypes.compositionStart) {\n currentComposition = FallbackCompositionState.getPooled(topLevelTarget);\n } else if (eventType === eventTypes.compositionEnd) {\n if (currentComposition) {\n fallbackData = currentComposition.getData();\n }\n }\n }\n\n var event = SyntheticCompositionEvent.getPooled(eventType, topLevelTargetID, nativeEvent, nativeEventTarget);\n\n if (fallbackData) {\n // Inject data generated from fallback path into the synthetic event.\n // This matches the property of native CompositionEventInterface.\n event.data = fallbackData;\n } else {\n var customData = getDataFromCustomEvent(nativeEvent);\n if (customData !== null) {\n event.data = customData;\n }\n }\n\n EventPropagators.accumulateTwoPhaseDispatches(event);\n return event;\n}\n\n/**\n * @param {string} topLevelType Record from `EventConstants`.\n * @param {object} nativeEvent Native browser event.\n * @return {?string} The string corresponding to this `beforeInput` event.\n */\nfunction getNativeBeforeInputChars(topLevelType, nativeEvent) {\n switch (topLevelType) {\n case topLevelTypes.topCompositionEnd:\n return getDataFromCustomEvent(nativeEvent);\n case topLevelTypes.topKeyPress:\n /**\n * If native `textInput` events are available, our goal is to make\n * use of them. However, there is a special case: the spacebar key.\n * In Webkit, preventing default on a spacebar `textInput` event\n * cancels character insertion, but it *also* causes the browser\n * to fall back to its default spacebar behavior of scrolling the\n * page.\n *\n * Tracking at:\n * https://code.google.com/p/chromium/issues/detail?id=355103\n *\n * To avoid this issue, use the keypress event as if no `textInput`\n * event is available.\n */\n var which = nativeEvent.which;\n if (which !== SPACEBAR_CODE) {\n return null;\n }\n\n hasSpaceKeypress = true;\n return SPACEBAR_CHAR;\n\n case topLevelTypes.topTextInput:\n // Record the characters to be added to the DOM.\n var chars = nativeEvent.data;\n\n // If it's a spacebar character, assume that we have already handled\n // it at the keypress level and bail immediately. Android Chrome\n // doesn't give us keycodes, so we need to blacklist it.\n if (chars === SPACEBAR_CHAR && hasSpaceKeypress) {\n return null;\n }\n\n return chars;\n\n default:\n // For other native event types, do nothing.\n return null;\n }\n}\n\n/**\n * For browsers that do not provide the `textInput` event, extract the\n * appropriate string to use for SyntheticInputEvent.\n *\n * @param {string} topLevelType Record from `EventConstants`.\n * @param {object} nativeEvent Native browser event.\n * @return {?string} The fallback string for this `beforeInput` event.\n */\nfunction getFallbackBeforeInputChars(topLevelType, nativeEvent) {\n // If we are currently composing (IME) and using a fallback to do so,\n // try to extract the composed characters from the fallback object.\n if (currentComposition) {\n if (topLevelType === topLevelTypes.topCompositionEnd || isFallbackCompositionEnd(topLevelType, nativeEvent)) {\n var chars = currentComposition.getData();\n FallbackCompositionState.release(currentComposition);\n currentComposition = null;\n return chars;\n }\n return null;\n }\n\n switch (topLevelType) {\n case topLevelTypes.topPaste:\n // If a paste event occurs after a keypress, throw out the input\n // chars. Paste events should not lead to BeforeInput events.\n return null;\n case topLevelTypes.topKeyPress:\n /**\n * As of v27, Firefox may fire keypress events even when no character\n * will be inserted. A few possibilities:\n *\n * - `which` is `0`. Arrow keys, Esc key, etc.\n *\n * - `which` is the pressed key code, but no char is available.\n * Ex: 'AltGr + d` in Polish. There is no modified character for\n * this key combination and no character is inserted into the\n * document, but FF fires the keypress for char code `100` anyway.\n * No `input` event will occur.\n *\n * - `which` is the pressed key code, but a command combination is\n * being used. Ex: `Cmd+C`. No character is inserted, and no\n * `input` event will occur.\n */\n if (nativeEvent.which && !isKeypressCommand(nativeEvent)) {\n return String.fromCharCode(nativeEvent.which);\n }\n return null;\n case topLevelTypes.topCompositionEnd:\n return useFallbackCompositionData ? null : nativeEvent.data;\n default:\n return null;\n }\n}\n\n/**\n * Extract a SyntheticInputEvent for `beforeInput`, based on either native\n * `textInput` or fallback behavior.\n *\n * @param {string} topLevelType Record from `EventConstants`.\n * @param {DOMEventTarget} topLevelTarget The listening component root node.\n * @param {string} topLevelTargetID ID of `topLevelTarget`.\n * @param {object} nativeEvent Native browser event.\n * @return {?object} A SyntheticInputEvent.\n */\nfunction extractBeforeInputEvent(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) {\n var chars;\n\n if (canUseTextInputEvent) {\n chars = getNativeBeforeInputChars(topLevelType, nativeEvent);\n } else {\n chars = getFallbackBeforeInputChars(topLevelType, nativeEvent);\n }\n\n // If no characters are being inserted, no BeforeInput event should\n // be fired.\n if (!chars) {\n return null;\n }\n\n var event = SyntheticInputEvent.getPooled(eventTypes.beforeInput, topLevelTargetID, nativeEvent, nativeEventTarget);\n\n event.data = chars;\n EventPropagators.accumulateTwoPhaseDispatches(event);\n return event;\n}\n\n/**\n * Create an `onBeforeInput` event to match\n * http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105/#events-inputevents.\n *\n * This event plugin is based on the native `textInput` event\n * available in Chrome, Safari, Opera, and IE. This event fires after\n * `onKeyPress` and `onCompositionEnd`, but before `onInput`.\n *\n * `beforeInput` is spec'd but not implemented in any browsers, and\n * the `input` event does not provide any useful information about what has\n * actually been added, contrary to the spec. Thus, `textInput` is the best\n * available event to identify the characters that have actually been inserted\n * into the target node.\n *\n * This plugin is also responsible for emitting `composition` events, thus\n * allowing us to share composition fallback code for both `beforeInput` and\n * `composition` event types.\n */\nvar BeforeInputEventPlugin = {\n\n eventTypes: eventTypes,\n\n /**\n * @param {string} topLevelType Record from `EventConstants`.\n * @param {DOMEventTarget} topLevelTarget The listening component root node.\n * @param {string} topLevelTargetID ID of `topLevelTarget`.\n * @param {object} nativeEvent Native browser event.\n * @return {*} An accumulation of synthetic events.\n * @see {EventPluginHub.extractEvents}\n */\n extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) {\n return [extractCompositionEvent(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget), extractBeforeInputEvent(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget)];\n }\n};\n\nmodule.exports = BeforeInputEventPlugin;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/BeforeInputEventPlugin.js\n ** module id = 71\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule EventPropagators\n */\n\n'use strict';\n\nvar EventConstants = require('./EventConstants');\nvar EventPluginHub = require('./EventPluginHub');\n\nvar warning = require('fbjs/lib/warning');\n\nvar accumulateInto = require('./accumulateInto');\nvar forEachAccumulated = require('./forEachAccumulated');\n\nvar PropagationPhases = EventConstants.PropagationPhases;\nvar getListener = EventPluginHub.getListener;\n\n/**\n * Some event types have a notion of different registration names for different\n * \"phases\" of propagation. This finds listeners by a given phase.\n */\nfunction listenerAtPhase(id, event, propagationPhase) {\n var registrationName = event.dispatchConfig.phasedRegistrationNames[propagationPhase];\n return getListener(id, registrationName);\n}\n\n/**\n * Tags a `SyntheticEvent` with dispatched listeners. Creating this function\n * here, allows us to not have to bind or create functions for each event.\n * Mutating the event's members allows us to not have to create a wrapping\n * \"dispatch\" object that pairs the event with the listener.\n */\nfunction accumulateDirectionalDispatches(domID, upwards, event) {\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(domID, 'Dispatching id must not be null') : undefined;\n }\n var phase = upwards ? PropagationPhases.bubbled : PropagationPhases.captured;\n var listener = listenerAtPhase(domID, event, phase);\n if (listener) {\n event._dispatchListeners = accumulateInto(event._dispatchListeners, listener);\n event._dispatchIDs = accumulateInto(event._dispatchIDs, domID);\n }\n}\n\n/**\n * Collect dispatches (must be entirely collected before dispatching - see unit\n * tests). Lazily allocate the array to conserve memory. We must loop through\n * each event and perform the traversal for each one. We cannot perform a\n * single traversal for the entire collection of events because each event may\n * have a different target.\n */\nfunction accumulateTwoPhaseDispatchesSingle(event) {\n if (event && event.dispatchConfig.phasedRegistrationNames) {\n EventPluginHub.injection.getInstanceHandle().traverseTwoPhase(event.dispatchMarker, accumulateDirectionalDispatches, event);\n }\n}\n\n/**\n * Same as `accumulateTwoPhaseDispatchesSingle`, but skips over the targetID.\n */\nfunction accumulateTwoPhaseDispatchesSingleSkipTarget(event) {\n if (event && event.dispatchConfig.phasedRegistrationNames) {\n EventPluginHub.injection.getInstanceHandle().traverseTwoPhaseSkipTarget(event.dispatchMarker, accumulateDirectionalDispatches, event);\n }\n}\n\n/**\n * Accumulates without regard to direction, does not look for phased\n * registration names. Same as `accumulateDirectDispatchesSingle` but without\n * requiring that the `dispatchMarker` be the same as the dispatched ID.\n */\nfunction accumulateDispatches(id, ignoredDirection, event) {\n if (event && event.dispatchConfig.registrationName) {\n var registrationName = event.dispatchConfig.registrationName;\n var listener = getListener(id, registrationName);\n if (listener) {\n event._dispatchListeners = accumulateInto(event._dispatchListeners, listener);\n event._dispatchIDs = accumulateInto(event._dispatchIDs, id);\n }\n }\n}\n\n/**\n * Accumulates dispatches on an `SyntheticEvent`, but only for the\n * `dispatchMarker`.\n * @param {SyntheticEvent} event\n */\nfunction accumulateDirectDispatchesSingle(event) {\n if (event && event.dispatchConfig.registrationName) {\n accumulateDispatches(event.dispatchMarker, null, event);\n }\n}\n\nfunction accumulateTwoPhaseDispatches(events) {\n forEachAccumulated(events, accumulateTwoPhaseDispatchesSingle);\n}\n\nfunction accumulateTwoPhaseDispatchesSkipTarget(events) {\n forEachAccumulated(events, accumulateTwoPhaseDispatchesSingleSkipTarget);\n}\n\nfunction accumulateEnterLeaveDispatches(leave, enter, fromID, toID) {\n EventPluginHub.injection.getInstanceHandle().traverseEnterLeave(fromID, toID, accumulateDispatches, leave, enter);\n}\n\nfunction accumulateDirectDispatches(events) {\n forEachAccumulated(events, accumulateDirectDispatchesSingle);\n}\n\n/**\n * A small set of propagation patterns, each of which will accept a small amount\n * of information, and generate a set of \"dispatch ready event objects\" - which\n * are sets of events that have already been annotated with a set of dispatched\n * listener functions/ids. The API is designed this way to discourage these\n * propagation strategies from actually executing the dispatches, since we\n * always want to collect the entire set of dispatches before executing event a\n * single one.\n *\n * @constructor EventPropagators\n */\nvar EventPropagators = {\n accumulateTwoPhaseDispatches: accumulateTwoPhaseDispatches,\n accumulateTwoPhaseDispatchesSkipTarget: accumulateTwoPhaseDispatchesSkipTarget,\n accumulateDirectDispatches: accumulateDirectDispatches,\n accumulateEnterLeaveDispatches: accumulateEnterLeaveDispatches\n};\n\nmodule.exports = EventPropagators;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/EventPropagators.js\n ** module id = 72\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule FallbackCompositionState\n * @typechecks static-only\n */\n\n'use strict';\n\nvar PooledClass = require('./PooledClass');\n\nvar assign = require('./Object.assign');\nvar getTextContentAccessor = require('./getTextContentAccessor');\n\n/**\n * This helper class stores information about text content of a target node,\n * allowing comparison of content before and after a given event.\n *\n * Identify the node where selection currently begins, then observe\n * both its text content and its current position in the DOM. Since the\n * browser may natively replace the target node during composition, we can\n * use its position to find its replacement.\n *\n * @param {DOMEventTarget} root\n */\nfunction FallbackCompositionState(root) {\n this._root = root;\n this._startText = this.getText();\n this._fallbackText = null;\n}\n\nassign(FallbackCompositionState.prototype, {\n destructor: function () {\n this._root = null;\n this._startText = null;\n this._fallbackText = null;\n },\n\n /**\n * Get current text of input.\n *\n * @return {string}\n */\n getText: function () {\n if ('value' in this._root) {\n return this._root.value;\n }\n return this._root[getTextContentAccessor()];\n },\n\n /**\n * Determine the differing substring between the initially stored\n * text content and the current content.\n *\n * @return {string}\n */\n getData: function () {\n if (this._fallbackText) {\n return this._fallbackText;\n }\n\n var start;\n var startValue = this._startText;\n var startLength = startValue.length;\n var end;\n var endValue = this.getText();\n var endLength = endValue.length;\n\n for (start = 0; start < startLength; start++) {\n if (startValue[start] !== endValue[start]) {\n break;\n }\n }\n\n var minEnd = startLength - start;\n for (end = 1; end <= minEnd; end++) {\n if (startValue[startLength - end] !== endValue[endLength - end]) {\n break;\n }\n }\n\n var sliceTail = end > 1 ? 1 - end : undefined;\n this._fallbackText = endValue.slice(start, sliceTail);\n return this._fallbackText;\n }\n});\n\nPooledClass.addPoolingTo(FallbackCompositionState);\n\nmodule.exports = FallbackCompositionState;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/FallbackCompositionState.js\n ** module id = 73\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule getTextContentAccessor\n */\n\n'use strict';\n\nvar ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');\n\nvar contentKey = null;\n\n/**\n * Gets the key used to access text content on a DOM node.\n *\n * @return {?string} Key used to access text content.\n * @internal\n */\nfunction getTextContentAccessor() {\n if (!contentKey && ExecutionEnvironment.canUseDOM) {\n // Prefer textContent to innerText because many browsers support both but\n // SVG <text> elements don't support innerText even when <div> does.\n contentKey = 'textContent' in document.documentElement ? 'textContent' : 'innerText';\n }\n return contentKey;\n}\n\nmodule.exports = getTextContentAccessor;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/getTextContentAccessor.js\n ** module id = 74\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule SyntheticCompositionEvent\n * @typechecks static-only\n */\n\n'use strict';\n\nvar SyntheticEvent = require('./SyntheticEvent');\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/DOM-Level-3-Events/#events-compositionevents\n */\nvar CompositionEventInterface = {\n data: null\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticUIEvent}\n */\nfunction SyntheticCompositionEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticEvent.augmentClass(SyntheticCompositionEvent, CompositionEventInterface);\n\nmodule.exports = SyntheticCompositionEvent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/SyntheticCompositionEvent.js\n ** module id = 75\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule SyntheticEvent\n * @typechecks static-only\n */\n\n'use strict';\n\nvar PooledClass = require('./PooledClass');\n\nvar assign = require('./Object.assign');\nvar emptyFunction = require('fbjs/lib/emptyFunction');\nvar warning = require('fbjs/lib/warning');\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\nvar EventInterface = {\n type: null,\n // currentTarget is set when dispatching; no use in copying it here\n currentTarget: emptyFunction.thatReturnsNull,\n eventPhase: null,\n bubbles: null,\n cancelable: null,\n timeStamp: function (event) {\n return event.timeStamp || Date.now();\n },\n defaultPrevented: null,\n isTrusted: null\n};\n\n/**\n * Synthetic events are dispatched by event plugins, typically in response to a\n * top-level event delegation handler.\n *\n * These systems should generally use pooling to reduce the frequency of garbage\n * collection. The system should check `isPersistent` to determine whether the\n * event should be released into the pool after being dispatched. Users that\n * need a persisted event should invoke `persist`.\n *\n * Synthetic events (and subclasses) implement the DOM Level 3 Events API by\n * normalizing browser quirks. Subclasses do not necessarily have to implement a\n * DOM interface; custom application-specific events can also subclass this.\n *\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n */\nfunction SyntheticEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n this.dispatchConfig = dispatchConfig;\n this.dispatchMarker = dispatchMarker;\n this.nativeEvent = nativeEvent;\n this.target = nativeEventTarget;\n this.currentTarget = nativeEventTarget;\n\n var Interface = this.constructor.Interface;\n for (var propName in Interface) {\n if (!Interface.hasOwnProperty(propName)) {\n continue;\n }\n var normalize = Interface[propName];\n if (normalize) {\n this[propName] = normalize(nativeEvent);\n } else {\n this[propName] = nativeEvent[propName];\n }\n }\n\n var defaultPrevented = nativeEvent.defaultPrevented != null ? nativeEvent.defaultPrevented : nativeEvent.returnValue === false;\n if (defaultPrevented) {\n this.isDefaultPrevented = emptyFunction.thatReturnsTrue;\n } else {\n this.isDefaultPrevented = emptyFunction.thatReturnsFalse;\n }\n this.isPropagationStopped = emptyFunction.thatReturnsFalse;\n}\n\nassign(SyntheticEvent.prototype, {\n\n preventDefault: function () {\n this.defaultPrevented = true;\n var event = this.nativeEvent;\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(event, 'This synthetic event is reused for performance reasons. If you\\'re ' + 'seeing this, you\\'re calling `preventDefault` on a ' + 'released/nullified synthetic event. This is a no-op. See ' + 'https://fb.me/react-event-pooling for more information.') : undefined;\n }\n if (!event) {\n return;\n }\n\n if (event.preventDefault) {\n event.preventDefault();\n } else {\n event.returnValue = false;\n }\n this.isDefaultPrevented = emptyFunction.thatReturnsTrue;\n },\n\n stopPropagation: function () {\n var event = this.nativeEvent;\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(event, 'This synthetic event is reused for performance reasons. If you\\'re ' + 'seeing this, you\\'re calling `stopPropagation` on a ' + 'released/nullified synthetic event. This is a no-op. See ' + 'https://fb.me/react-event-pooling for more information.') : undefined;\n }\n if (!event) {\n return;\n }\n\n if (event.stopPropagation) {\n event.stopPropagation();\n } else {\n event.cancelBubble = true;\n }\n this.isPropagationStopped = emptyFunction.thatReturnsTrue;\n },\n\n /**\n * We release all dispatched `SyntheticEvent`s after each event loop, adding\n * them back into the pool. This allows a way to hold onto a reference that\n * won't be added back into the pool.\n */\n persist: function () {\n this.isPersistent = emptyFunction.thatReturnsTrue;\n },\n\n /**\n * Checks if this event should be released back into the pool.\n *\n * @return {boolean} True if this should not be released, false otherwise.\n */\n isPersistent: emptyFunction.thatReturnsFalse,\n\n /**\n * `PooledClass` looks for `destructor` on each instance it releases.\n */\n destructor: function () {\n var Interface = this.constructor.Interface;\n for (var propName in Interface) {\n this[propName] = null;\n }\n this.dispatchConfig = null;\n this.dispatchMarker = null;\n this.nativeEvent = null;\n }\n\n});\n\nSyntheticEvent.Interface = EventInterface;\n\n/**\n * Helper to reduce boilerplate when creating subclasses.\n *\n * @param {function} Class\n * @param {?object} Interface\n */\nSyntheticEvent.augmentClass = function (Class, Interface) {\n var Super = this;\n\n var prototype = Object.create(Super.prototype);\n assign(prototype, Class.prototype);\n Class.prototype = prototype;\n Class.prototype.constructor = Class;\n\n Class.Interface = assign({}, Super.Interface, Interface);\n Class.augmentClass = Super.augmentClass;\n\n PooledClass.addPoolingTo(Class, PooledClass.fourArgumentPooler);\n};\n\nPooledClass.addPoolingTo(SyntheticEvent, PooledClass.fourArgumentPooler);\n\nmodule.exports = SyntheticEvent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/SyntheticEvent.js\n ** module id = 76\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule SyntheticInputEvent\n * @typechecks static-only\n */\n\n'use strict';\n\nvar SyntheticEvent = require('./SyntheticEvent');\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105\n * /#events-inputevents\n */\nvar InputEventInterface = {\n data: null\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticUIEvent}\n */\nfunction SyntheticInputEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticEvent.augmentClass(SyntheticInputEvent, InputEventInterface);\n\nmodule.exports = SyntheticInputEvent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/SyntheticInputEvent.js\n ** module id = 77\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule keyOf\n */\n\n/**\n * Allows extraction of a minified key. Let's the build system minify keys\n * without losing the ability to dynamically use key strings as values\n * themselves. Pass in an object with a single key/val pair and it will return\n * you the string key of that single record. Suppose you want to grab the\n * value for a key 'className' inside of an object. Key/val minification may\n * have aliased that key to be 'xa12'. keyOf({className: null}) will return\n * 'xa12' in that case. Resolve keys you want to use once at startup time, then\n * reuse those resolutions.\n */\n\"use strict\";\n\nvar keyOf = function (oneKeyObj) {\n var key;\n for (key in oneKeyObj) {\n if (!oneKeyObj.hasOwnProperty(key)) {\n continue;\n }\n return key;\n }\n return null;\n};\n\nmodule.exports = keyOf;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/keyOf.js\n ** module id = 78\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ChangeEventPlugin\n */\n\n'use strict';\n\nvar EventConstants = require('./EventConstants');\nvar EventPluginHub = require('./EventPluginHub');\nvar EventPropagators = require('./EventPropagators');\nvar ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');\nvar ReactUpdates = require('./ReactUpdates');\nvar SyntheticEvent = require('./SyntheticEvent');\n\nvar getEventTarget = require('./getEventTarget');\nvar isEventSupported = require('./isEventSupported');\nvar isTextInputElement = require('./isTextInputElement');\nvar keyOf = require('fbjs/lib/keyOf');\n\nvar topLevelTypes = EventConstants.topLevelTypes;\n\nvar eventTypes = {\n change: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onChange: null }),\n captured: keyOf({ onChangeCapture: null })\n },\n dependencies: [topLevelTypes.topBlur, topLevelTypes.topChange, topLevelTypes.topClick, topLevelTypes.topFocus, topLevelTypes.topInput, topLevelTypes.topKeyDown, topLevelTypes.topKeyUp, topLevelTypes.topSelectionChange]\n }\n};\n\n/**\n * For IE shims\n */\nvar activeElement = null;\nvar activeElementID = null;\nvar activeElementValue = null;\nvar activeElementValueProp = null;\n\n/**\n * SECTION: handle `change` event\n */\nfunction shouldUseChangeEvent(elem) {\n var nodeName = elem.nodeName && elem.nodeName.toLowerCase();\n return nodeName === 'select' || nodeName === 'input' && elem.type === 'file';\n}\n\nvar doesChangeEventBubble = false;\nif (ExecutionEnvironment.canUseDOM) {\n // See `handleChange` comment below\n doesChangeEventBubble = isEventSupported('change') && (!('documentMode' in document) || document.documentMode > 8);\n}\n\nfunction manualDispatchChangeEvent(nativeEvent) {\n var event = SyntheticEvent.getPooled(eventTypes.change, activeElementID, nativeEvent, getEventTarget(nativeEvent));\n EventPropagators.accumulateTwoPhaseDispatches(event);\n\n // If change and propertychange bubbled, we'd just bind to it like all the\n // other events and have it go through ReactBrowserEventEmitter. Since it\n // doesn't, we manually listen for the events and so we have to enqueue and\n // process the abstract event manually.\n //\n // Batching is necessary here in order to ensure that all event handlers run\n // before the next rerender (including event handlers attached to ancestor\n // elements instead of directly on the input). Without this, controlled\n // components don't work properly in conjunction with event bubbling because\n // the component is rerendered and the value reverted before all the event\n // handlers can run. See https://github.com/facebook/react/issues/708.\n ReactUpdates.batchedUpdates(runEventInBatch, event);\n}\n\nfunction runEventInBatch(event) {\n EventPluginHub.enqueueEvents(event);\n EventPluginHub.processEventQueue(false);\n}\n\nfunction startWatchingForChangeEventIE8(target, targetID) {\n activeElement = target;\n activeElementID = targetID;\n activeElement.attachEvent('onchange', manualDispatchChangeEvent);\n}\n\nfunction stopWatchingForChangeEventIE8() {\n if (!activeElement) {\n return;\n }\n activeElement.detachEvent('onchange', manualDispatchChangeEvent);\n activeElement = null;\n activeElementID = null;\n}\n\nfunction getTargetIDForChangeEvent(topLevelType, topLevelTarget, topLevelTargetID) {\n if (topLevelType === topLevelTypes.topChange) {\n return topLevelTargetID;\n }\n}\nfunction handleEventsForChangeEventIE8(topLevelType, topLevelTarget, topLevelTargetID) {\n if (topLevelType === topLevelTypes.topFocus) {\n // stopWatching() should be a noop here but we call it just in case we\n // missed a blur event somehow.\n stopWatchingForChangeEventIE8();\n startWatchingForChangeEventIE8(topLevelTarget, topLevelTargetID);\n } else if (topLevelType === topLevelTypes.topBlur) {\n stopWatchingForChangeEventIE8();\n }\n}\n\n/**\n * SECTION: handle `input` event\n */\nvar isInputEventSupported = false;\nif (ExecutionEnvironment.canUseDOM) {\n // IE9 claims to support the input event but fails to trigger it when\n // deleting text, so we ignore its input events\n isInputEventSupported = isEventSupported('input') && (!('documentMode' in document) || document.documentMode > 9);\n}\n\n/**\n * (For old IE.) Replacement getter/setter for the `value` property that gets\n * set on the active element.\n */\nvar newValueProp = {\n get: function () {\n return activeElementValueProp.get.call(this);\n },\n set: function (val) {\n // Cast to a string so we can do equality checks.\n activeElementValue = '' + val;\n activeElementValueProp.set.call(this, val);\n }\n};\n\n/**\n * (For old IE.) Starts tracking propertychange events on the passed-in element\n * and override the value property so that we can distinguish user events from\n * value changes in JS.\n */\nfunction startWatchingForValueChange(target, targetID) {\n activeElement = target;\n activeElementID = targetID;\n activeElementValue = target.value;\n activeElementValueProp = Object.getOwnPropertyDescriptor(target.constructor.prototype, 'value');\n\n // Not guarded in a canDefineProperty check: IE8 supports defineProperty only\n // on DOM elements\n Object.defineProperty(activeElement, 'value', newValueProp);\n activeElement.attachEvent('onpropertychange', handlePropertyChange);\n}\n\n/**\n * (For old IE.) Removes the event listeners from the currently-tracked element,\n * if any exists.\n */\nfunction stopWatchingForValueChange() {\n if (!activeElement) {\n return;\n }\n\n // delete restores the original property definition\n delete activeElement.value;\n activeElement.detachEvent('onpropertychange', handlePropertyChange);\n\n activeElement = null;\n activeElementID = null;\n activeElementValue = null;\n activeElementValueProp = null;\n}\n\n/**\n * (For old IE.) Handles a propertychange event, sending a `change` event if\n * the value of the active element has changed.\n */\nfunction handlePropertyChange(nativeEvent) {\n if (nativeEvent.propertyName !== 'value') {\n return;\n }\n var value = nativeEvent.srcElement.value;\n if (value === activeElementValue) {\n return;\n }\n activeElementValue = value;\n\n manualDispatchChangeEvent(nativeEvent);\n}\n\n/**\n * If a `change` event should be fired, returns the target's ID.\n */\nfunction getTargetIDForInputEvent(topLevelType, topLevelTarget, topLevelTargetID) {\n if (topLevelType === topLevelTypes.topInput) {\n // In modern browsers (i.e., not IE8 or IE9), the input event is exactly\n // what we want so fall through here and trigger an abstract event\n return topLevelTargetID;\n }\n}\n\n// For IE8 and IE9.\nfunction handleEventsForInputEventIE(topLevelType, topLevelTarget, topLevelTargetID) {\n if (topLevelType === topLevelTypes.topFocus) {\n // In IE8, we can capture almost all .value changes by adding a\n // propertychange handler and looking for events with propertyName\n // equal to 'value'\n // In IE9, propertychange fires for most input events but is buggy and\n // doesn't fire when text is deleted, but conveniently, selectionchange\n // appears to fire in all of the remaining cases so we catch those and\n // forward the event if the value has changed\n // In either case, we don't want to call the event handler if the value\n // is changed from JS so we redefine a setter for `.value` that updates\n // our activeElementValue variable, allowing us to ignore those changes\n //\n // stopWatching() should be a noop here but we call it just in case we\n // missed a blur event somehow.\n stopWatchingForValueChange();\n startWatchingForValueChange(topLevelTarget, topLevelTargetID);\n } else if (topLevelType === topLevelTypes.topBlur) {\n stopWatchingForValueChange();\n }\n}\n\n// For IE8 and IE9.\nfunction getTargetIDForInputEventIE(topLevelType, topLevelTarget, topLevelTargetID) {\n if (topLevelType === topLevelTypes.topSelectionChange || topLevelType === topLevelTypes.topKeyUp || topLevelType === topLevelTypes.topKeyDown) {\n // On the selectionchange event, the target is just document which isn't\n // helpful for us so just check activeElement instead.\n //\n // 99% of the time, keydown and keyup aren't necessary. IE8 fails to fire\n // propertychange on the first input event after setting `value` from a\n // script and fires only keydown, keypress, keyup. Catching keyup usually\n // gets it and catching keydown lets us fire an event for the first\n // keystroke if user does a key repeat (it'll be a little delayed: right\n // before the second keystroke). Other input methods (e.g., paste) seem to\n // fire selectionchange normally.\n if (activeElement && activeElement.value !== activeElementValue) {\n activeElementValue = activeElement.value;\n return activeElementID;\n }\n }\n}\n\n/**\n * SECTION: handle `click` event\n */\nfunction shouldUseClickEvent(elem) {\n // Use the `click` event to detect changes to checkbox and radio inputs.\n // This approach works across all browsers, whereas `change` does not fire\n // until `blur` in IE8.\n return elem.nodeName && elem.nodeName.toLowerCase() === 'input' && (elem.type === 'checkbox' || elem.type === 'radio');\n}\n\nfunction getTargetIDForClickEvent(topLevelType, topLevelTarget, topLevelTargetID) {\n if (topLevelType === topLevelTypes.topClick) {\n return topLevelTargetID;\n }\n}\n\n/**\n * This plugin creates an `onChange` event that normalizes change events\n * across form elements. This event fires at a time when it's possible to\n * change the element's value without seeing a flicker.\n *\n * Supported elements are:\n * - input (see `isTextInputElement`)\n * - textarea\n * - select\n */\nvar ChangeEventPlugin = {\n\n eventTypes: eventTypes,\n\n /**\n * @param {string} topLevelType Record from `EventConstants`.\n * @param {DOMEventTarget} topLevelTarget The listening component root node.\n * @param {string} topLevelTargetID ID of `topLevelTarget`.\n * @param {object} nativeEvent Native browser event.\n * @return {*} An accumulation of synthetic events.\n * @see {EventPluginHub.extractEvents}\n */\n extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) {\n\n var getTargetIDFunc, handleEventFunc;\n if (shouldUseChangeEvent(topLevelTarget)) {\n if (doesChangeEventBubble) {\n getTargetIDFunc = getTargetIDForChangeEvent;\n } else {\n handleEventFunc = handleEventsForChangeEventIE8;\n }\n } else if (isTextInputElement(topLevelTarget)) {\n if (isInputEventSupported) {\n getTargetIDFunc = getTargetIDForInputEvent;\n } else {\n getTargetIDFunc = getTargetIDForInputEventIE;\n handleEventFunc = handleEventsForInputEventIE;\n }\n } else if (shouldUseClickEvent(topLevelTarget)) {\n getTargetIDFunc = getTargetIDForClickEvent;\n }\n\n if (getTargetIDFunc) {\n var targetID = getTargetIDFunc(topLevelType, topLevelTarget, topLevelTargetID);\n if (targetID) {\n var event = SyntheticEvent.getPooled(eventTypes.change, targetID, nativeEvent, nativeEventTarget);\n event.type = 'change';\n EventPropagators.accumulateTwoPhaseDispatches(event);\n return event;\n }\n }\n\n if (handleEventFunc) {\n handleEventFunc(topLevelType, topLevelTarget, topLevelTargetID);\n }\n }\n\n};\n\nmodule.exports = ChangeEventPlugin;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ChangeEventPlugin.js\n ** module id = 79\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule getEventTarget\n * @typechecks static-only\n */\n\n'use strict';\n\n/**\n * Gets the target node from a native browser event by accounting for\n * inconsistencies in browser DOM APIs.\n *\n * @param {object} nativeEvent Native browser event.\n * @return {DOMEventTarget} Target node.\n */\nfunction getEventTarget(nativeEvent) {\n var target = nativeEvent.target || nativeEvent.srcElement || window;\n // Safari may fire events on text nodes (Node.TEXT_NODE is 3).\n // @see http://www.quirksmode.org/js/events_properties.html\n return target.nodeType === 3 ? target.parentNode : target;\n}\n\nmodule.exports = getEventTarget;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/getEventTarget.js\n ** module id = 80\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule isTextInputElement\n */\n\n'use strict';\n\n/**\n * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary\n */\nvar supportedInputTypes = {\n 'color': true,\n 'date': true,\n 'datetime': true,\n 'datetime-local': true,\n 'email': true,\n 'month': true,\n 'number': true,\n 'password': true,\n 'range': true,\n 'search': true,\n 'tel': true,\n 'text': true,\n 'time': true,\n 'url': true,\n 'week': true\n};\n\nfunction isTextInputElement(elem) {\n var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();\n return nodeName && (nodeName === 'input' && supportedInputTypes[elem.type] || nodeName === 'textarea');\n}\n\nmodule.exports = isTextInputElement;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/isTextInputElement.js\n ** module id = 81\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ClientReactRootIndex\n * @typechecks\n */\n\n'use strict';\n\nvar nextReactRootIndex = 0;\n\nvar ClientReactRootIndex = {\n createReactRootIndex: function () {\n return nextReactRootIndex++;\n }\n};\n\nmodule.exports = ClientReactRootIndex;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ClientReactRootIndex.js\n ** module id = 82\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule DefaultEventPluginOrder\n */\n\n'use strict';\n\nvar keyOf = require('fbjs/lib/keyOf');\n\n/**\n * Module that is injectable into `EventPluginHub`, that specifies a\n * deterministic ordering of `EventPlugin`s. A convenient way to reason about\n * plugins, without having to package every one of them. This is better than\n * having plugins be ordered in the same order that they are injected because\n * that ordering would be influenced by the packaging order.\n * `ResponderEventPlugin` must occur before `SimpleEventPlugin` so that\n * preventing default on events is convenient in `SimpleEventPlugin` handlers.\n */\nvar DefaultEventPluginOrder = [keyOf({ ResponderEventPlugin: null }), keyOf({ SimpleEventPlugin: null }), keyOf({ TapEventPlugin: null }), keyOf({ EnterLeaveEventPlugin: null }), keyOf({ ChangeEventPlugin: null }), keyOf({ SelectEventPlugin: null }), keyOf({ BeforeInputEventPlugin: null })];\n\nmodule.exports = DefaultEventPluginOrder;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/DefaultEventPluginOrder.js\n ** module id = 83\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule EnterLeaveEventPlugin\n * @typechecks static-only\n */\n\n'use strict';\n\nvar EventConstants = require('./EventConstants');\nvar EventPropagators = require('./EventPropagators');\nvar SyntheticMouseEvent = require('./SyntheticMouseEvent');\n\nvar ReactMount = require('./ReactMount');\nvar keyOf = require('fbjs/lib/keyOf');\n\nvar topLevelTypes = EventConstants.topLevelTypes;\nvar getFirstReactDOM = ReactMount.getFirstReactDOM;\n\nvar eventTypes = {\n mouseEnter: {\n registrationName: keyOf({ onMouseEnter: null }),\n dependencies: [topLevelTypes.topMouseOut, topLevelTypes.topMouseOver]\n },\n mouseLeave: {\n registrationName: keyOf({ onMouseLeave: null }),\n dependencies: [topLevelTypes.topMouseOut, topLevelTypes.topMouseOver]\n }\n};\n\nvar extractedEvents = [null, null];\n\nvar EnterLeaveEventPlugin = {\n\n eventTypes: eventTypes,\n\n /**\n * For almost every interaction we care about, there will be both a top-level\n * `mouseover` and `mouseout` event that occurs. Only use `mouseout` so that\n * we do not extract duplicate events. However, moving the mouse into the\n * browser from outside will not fire a `mouseout` event. In this case, we use\n * the `mouseover` top-level event.\n *\n * @param {string} topLevelType Record from `EventConstants`.\n * @param {DOMEventTarget} topLevelTarget The listening component root node.\n * @param {string} topLevelTargetID ID of `topLevelTarget`.\n * @param {object} nativeEvent Native browser event.\n * @return {*} An accumulation of synthetic events.\n * @see {EventPluginHub.extractEvents}\n */\n extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) {\n if (topLevelType === topLevelTypes.topMouseOver && (nativeEvent.relatedTarget || nativeEvent.fromElement)) {\n return null;\n }\n if (topLevelType !== topLevelTypes.topMouseOut && topLevelType !== topLevelTypes.topMouseOver) {\n // Must not be a mouse in or mouse out - ignoring.\n return null;\n }\n\n var win;\n if (topLevelTarget.window === topLevelTarget) {\n // `topLevelTarget` is probably a window object.\n win = topLevelTarget;\n } else {\n // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8.\n var doc = topLevelTarget.ownerDocument;\n if (doc) {\n win = doc.defaultView || doc.parentWindow;\n } else {\n win = window;\n }\n }\n\n var from;\n var to;\n var fromID = '';\n var toID = '';\n if (topLevelType === topLevelTypes.topMouseOut) {\n from = topLevelTarget;\n fromID = topLevelTargetID;\n to = getFirstReactDOM(nativeEvent.relatedTarget || nativeEvent.toElement);\n if (to) {\n toID = ReactMount.getID(to);\n } else {\n to = win;\n }\n to = to || win;\n } else {\n from = win;\n to = topLevelTarget;\n toID = topLevelTargetID;\n }\n\n if (from === to) {\n // Nothing pertains to our managed components.\n return null;\n }\n\n var leave = SyntheticMouseEvent.getPooled(eventTypes.mouseLeave, fromID, nativeEvent, nativeEventTarget);\n leave.type = 'mouseleave';\n leave.target = from;\n leave.relatedTarget = to;\n\n var enter = SyntheticMouseEvent.getPooled(eventTypes.mouseEnter, toID, nativeEvent, nativeEventTarget);\n enter.type = 'mouseenter';\n enter.target = to;\n enter.relatedTarget = from;\n\n EventPropagators.accumulateEnterLeaveDispatches(leave, enter, fromID, toID);\n\n extractedEvents[0] = leave;\n extractedEvents[1] = enter;\n\n return extractedEvents;\n }\n\n};\n\nmodule.exports = EnterLeaveEventPlugin;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/EnterLeaveEventPlugin.js\n ** module id = 84\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule SyntheticMouseEvent\n * @typechecks static-only\n */\n\n'use strict';\n\nvar SyntheticUIEvent = require('./SyntheticUIEvent');\nvar ViewportMetrics = require('./ViewportMetrics');\n\nvar getEventModifierState = require('./getEventModifierState');\n\n/**\n * @interface MouseEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\nvar MouseEventInterface = {\n screenX: null,\n screenY: null,\n clientX: null,\n clientY: null,\n ctrlKey: null,\n shiftKey: null,\n altKey: null,\n metaKey: null,\n getModifierState: getEventModifierState,\n button: function (event) {\n // Webkit, Firefox, IE9+\n // which: 1 2 3\n // button: 0 1 2 (standard)\n var button = event.button;\n if ('which' in event) {\n return button;\n }\n // IE<9\n // which: undefined\n // button: 0 0 0\n // button: 1 4 2 (onmouseup)\n return button === 2 ? 2 : button === 4 ? 1 : 0;\n },\n buttons: null,\n relatedTarget: function (event) {\n return event.relatedTarget || (event.fromElement === event.srcElement ? event.toElement : event.fromElement);\n },\n // \"Proprietary\" Interface.\n pageX: function (event) {\n return 'pageX' in event ? event.pageX : event.clientX + ViewportMetrics.currentScrollLeft;\n },\n pageY: function (event) {\n return 'pageY' in event ? event.pageY : event.clientY + ViewportMetrics.currentScrollTop;\n }\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticUIEvent}\n */\nfunction SyntheticMouseEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticUIEvent.augmentClass(SyntheticMouseEvent, MouseEventInterface);\n\nmodule.exports = SyntheticMouseEvent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/SyntheticMouseEvent.js\n ** module id = 85\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule SyntheticUIEvent\n * @typechecks static-only\n */\n\n'use strict';\n\nvar SyntheticEvent = require('./SyntheticEvent');\n\nvar getEventTarget = require('./getEventTarget');\n\n/**\n * @interface UIEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\nvar UIEventInterface = {\n view: function (event) {\n if (event.view) {\n return event.view;\n }\n\n var target = getEventTarget(event);\n if (target != null && target.window === target) {\n // target is a window object\n return target;\n }\n\n var doc = target.ownerDocument;\n // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8.\n if (doc) {\n return doc.defaultView || doc.parentWindow;\n } else {\n return window;\n }\n },\n detail: function (event) {\n return event.detail || 0;\n }\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticEvent}\n */\nfunction SyntheticUIEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticEvent.augmentClass(SyntheticUIEvent, UIEventInterface);\n\nmodule.exports = SyntheticUIEvent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/SyntheticUIEvent.js\n ** module id = 86\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule getEventModifierState\n * @typechecks static-only\n */\n\n'use strict';\n\n/**\n * Translation from modifier key to the associated property in the event.\n * @see http://www.w3.org/TR/DOM-Level-3-Events/#keys-Modifiers\n */\n\nvar modifierKeyToProp = {\n 'Alt': 'altKey',\n 'Control': 'ctrlKey',\n 'Meta': 'metaKey',\n 'Shift': 'shiftKey'\n};\n\n// IE8 does not implement getModifierState so we simply map it to the only\n// modifier keys exposed by the event itself, does not support Lock-keys.\n// Currently, all major browsers except Chrome seems to support Lock-keys.\nfunction modifierStateGetter(keyArg) {\n var syntheticEvent = this;\n var nativeEvent = syntheticEvent.nativeEvent;\n if (nativeEvent.getModifierState) {\n return nativeEvent.getModifierState(keyArg);\n }\n var keyProp = modifierKeyToProp[keyArg];\n return keyProp ? !!nativeEvent[keyProp] : false;\n}\n\nfunction getEventModifierState(nativeEvent) {\n return modifierStateGetter;\n}\n\nmodule.exports = getEventModifierState;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/getEventModifierState.js\n ** module id = 87\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule HTMLDOMPropertyConfig\n */\n\n'use strict';\n\nvar DOMProperty = require('./DOMProperty');\nvar ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');\n\nvar MUST_USE_ATTRIBUTE = DOMProperty.injection.MUST_USE_ATTRIBUTE;\nvar MUST_USE_PROPERTY = DOMProperty.injection.MUST_USE_PROPERTY;\nvar HAS_BOOLEAN_VALUE = DOMProperty.injection.HAS_BOOLEAN_VALUE;\nvar HAS_SIDE_EFFECTS = DOMProperty.injection.HAS_SIDE_EFFECTS;\nvar HAS_NUMERIC_VALUE = DOMProperty.injection.HAS_NUMERIC_VALUE;\nvar HAS_POSITIVE_NUMERIC_VALUE = DOMProperty.injection.HAS_POSITIVE_NUMERIC_VALUE;\nvar HAS_OVERLOADED_BOOLEAN_VALUE = DOMProperty.injection.HAS_OVERLOADED_BOOLEAN_VALUE;\n\nvar hasSVG;\nif (ExecutionEnvironment.canUseDOM) {\n var implementation = document.implementation;\n hasSVG = implementation && implementation.hasFeature && implementation.hasFeature('http://www.w3.org/TR/SVG11/feature#BasicStructure', '1.1');\n}\n\nvar HTMLDOMPropertyConfig = {\n isCustomAttribute: RegExp.prototype.test.bind(/^(data|aria)-[a-z_][a-z\\d_.\\-]*$/),\n Properties: {\n /**\n * Standard Properties\n */\n accept: null,\n acceptCharset: null,\n accessKey: null,\n action: null,\n allowFullScreen: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE,\n allowTransparency: MUST_USE_ATTRIBUTE,\n alt: null,\n async: HAS_BOOLEAN_VALUE,\n autoComplete: null,\n // autoFocus is polyfilled/normalized by AutoFocusUtils\n // autoFocus: HAS_BOOLEAN_VALUE,\n autoPlay: HAS_BOOLEAN_VALUE,\n capture: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE,\n cellPadding: null,\n cellSpacing: null,\n charSet: MUST_USE_ATTRIBUTE,\n challenge: MUST_USE_ATTRIBUTE,\n checked: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,\n classID: MUST_USE_ATTRIBUTE,\n // To set className on SVG elements, it's necessary to use .setAttribute;\n // this works on HTML elements too in all browsers except IE8. Conveniently,\n // IE8 doesn't support SVG and so we can simply use the attribute in\n // browsers that support SVG and the property in browsers that don't,\n // regardless of whether the element is HTML or SVG.\n className: hasSVG ? MUST_USE_ATTRIBUTE : MUST_USE_PROPERTY,\n cols: MUST_USE_ATTRIBUTE | HAS_POSITIVE_NUMERIC_VALUE,\n colSpan: null,\n content: null,\n contentEditable: null,\n contextMenu: MUST_USE_ATTRIBUTE,\n controls: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,\n coords: null,\n crossOrigin: null,\n data: null, // For `<object />` acts as `src`.\n dateTime: MUST_USE_ATTRIBUTE,\n 'default': HAS_BOOLEAN_VALUE,\n defer: HAS_BOOLEAN_VALUE,\n dir: null,\n disabled: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE,\n download: HAS_OVERLOADED_BOOLEAN_VALUE,\n draggable: null,\n encType: null,\n form: MUST_USE_ATTRIBUTE,\n formAction: MUST_USE_ATTRIBUTE,\n formEncType: MUST_USE_ATTRIBUTE,\n formMethod: MUST_USE_ATTRIBUTE,\n formNoValidate: HAS_BOOLEAN_VALUE,\n formTarget: MUST_USE_ATTRIBUTE,\n frameBorder: MUST_USE_ATTRIBUTE,\n headers: null,\n height: MUST_USE_ATTRIBUTE,\n hidden: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE,\n high: null,\n href: null,\n hrefLang: null,\n htmlFor: null,\n httpEquiv: null,\n icon: null,\n id: MUST_USE_PROPERTY,\n inputMode: MUST_USE_ATTRIBUTE,\n integrity: null,\n is: MUST_USE_ATTRIBUTE,\n keyParams: MUST_USE_ATTRIBUTE,\n keyType: MUST_USE_ATTRIBUTE,\n kind: null,\n label: null,\n lang: null,\n list: MUST_USE_ATTRIBUTE,\n loop: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,\n low: null,\n manifest: MUST_USE_ATTRIBUTE,\n marginHeight: null,\n marginWidth: null,\n max: null,\n maxLength: MUST_USE_ATTRIBUTE,\n media: MUST_USE_ATTRIBUTE,\n mediaGroup: null,\n method: null,\n min: null,\n minLength: MUST_USE_ATTRIBUTE,\n multiple: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,\n muted: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,\n name: null,\n nonce: MUST_USE_ATTRIBUTE,\n noValidate: HAS_BOOLEAN_VALUE,\n open: HAS_BOOLEAN_VALUE,\n optimum: null,\n pattern: null,\n placeholder: null,\n poster: null,\n preload: null,\n radioGroup: null,\n readOnly: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,\n rel: null,\n required: HAS_BOOLEAN_VALUE,\n reversed: HAS_BOOLEAN_VALUE,\n role: MUST_USE_ATTRIBUTE,\n rows: MUST_USE_ATTRIBUTE | HAS_POSITIVE_NUMERIC_VALUE,\n rowSpan: null,\n sandbox: null,\n scope: null,\n scoped: HAS_BOOLEAN_VALUE,\n scrolling: null,\n seamless: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE,\n selected: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,\n shape: null,\n size: MUST_USE_ATTRIBUTE | HAS_POSITIVE_NUMERIC_VALUE,\n sizes: MUST_USE_ATTRIBUTE,\n span: HAS_POSITIVE_NUMERIC_VALUE,\n spellCheck: null,\n src: null,\n srcDoc: MUST_USE_PROPERTY,\n srcLang: null,\n srcSet: MUST_USE_ATTRIBUTE,\n start: HAS_NUMERIC_VALUE,\n step: null,\n style: null,\n summary: null,\n tabIndex: null,\n target: null,\n title: null,\n type: null,\n useMap: null,\n value: MUST_USE_PROPERTY | HAS_SIDE_EFFECTS,\n width: MUST_USE_ATTRIBUTE,\n wmode: MUST_USE_ATTRIBUTE,\n wrap: null,\n\n /**\n * RDFa Properties\n */\n about: MUST_USE_ATTRIBUTE,\n datatype: MUST_USE_ATTRIBUTE,\n inlist: MUST_USE_ATTRIBUTE,\n prefix: MUST_USE_ATTRIBUTE,\n // property is also supported for OpenGraph in meta tags.\n property: MUST_USE_ATTRIBUTE,\n resource: MUST_USE_ATTRIBUTE,\n 'typeof': MUST_USE_ATTRIBUTE,\n vocab: MUST_USE_ATTRIBUTE,\n\n /**\n * Non-standard Properties\n */\n // autoCapitalize and autoCorrect are supported in Mobile Safari for\n // keyboard hints.\n autoCapitalize: null,\n autoCorrect: null,\n // autoSave allows WebKit/Blink to persist values of input fields on page reloads\n autoSave: null,\n // color is for Safari mask-icon link\n color: null,\n // itemProp, itemScope, itemType are for\n // Microdata support. See http://schema.org/docs/gs.html\n itemProp: MUST_USE_ATTRIBUTE,\n itemScope: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE,\n itemType: MUST_USE_ATTRIBUTE,\n // itemID and itemRef are for Microdata support as well but\n // only specified in the the WHATWG spec document. See\n // https://html.spec.whatwg.org/multipage/microdata.html#microdata-dom-api\n itemID: MUST_USE_ATTRIBUTE,\n itemRef: MUST_USE_ATTRIBUTE,\n // results show looking glass icon and recent searches on input\n // search fields in WebKit/Blink\n results: null,\n // IE-only attribute that specifies security restrictions on an iframe\n // as an alternative to the sandbox attribute on IE<10\n security: MUST_USE_ATTRIBUTE,\n // IE-only attribute that controls focus behavior\n unselectable: MUST_USE_ATTRIBUTE\n },\n DOMAttributeNames: {\n acceptCharset: 'accept-charset',\n className: 'class',\n htmlFor: 'for',\n httpEquiv: 'http-equiv'\n },\n DOMPropertyNames: {\n autoCapitalize: 'autocapitalize',\n autoComplete: 'autocomplete',\n autoCorrect: 'autocorrect',\n autoFocus: 'autofocus',\n autoPlay: 'autoplay',\n autoSave: 'autosave',\n // `encoding` is equivalent to `enctype`, IE8 lacks an `enctype` setter.\n // http://www.w3.org/TR/html5/forms.html#dom-fs-encoding\n encType: 'encoding',\n hrefLang: 'hreflang',\n radioGroup: 'radiogroup',\n spellCheck: 'spellcheck',\n srcDoc: 'srcdoc',\n srcSet: 'srcset'\n }\n};\n\nmodule.exports = HTMLDOMPropertyConfig;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/HTMLDOMPropertyConfig.js\n ** module id = 88\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactBrowserComponentMixin\n */\n\n'use strict';\n\nvar ReactInstanceMap = require('./ReactInstanceMap');\n\nvar findDOMNode = require('./findDOMNode');\nvar warning = require('fbjs/lib/warning');\n\nvar didWarnKey = '_getDOMNodeDidWarn';\n\nvar ReactBrowserComponentMixin = {\n /**\n * Returns the DOM node rendered by this component.\n *\n * @return {DOMElement} The root node of this component.\n * @final\n * @protected\n */\n getDOMNode: function () {\n process.env.NODE_ENV !== 'production' ? warning(this.constructor[didWarnKey], '%s.getDOMNode(...) is deprecated. Please use ' + 'ReactDOM.findDOMNode(instance) instead.', ReactInstanceMap.get(this).getName() || this.tagName || 'Unknown') : undefined;\n this.constructor[didWarnKey] = true;\n return findDOMNode(this);\n }\n};\n\nmodule.exports = ReactBrowserComponentMixin;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactBrowserComponentMixin.js\n ** module id = 89\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule findDOMNode\n * @typechecks static-only\n */\n\n'use strict';\n\nvar ReactCurrentOwner = require('./ReactCurrentOwner');\nvar ReactInstanceMap = require('./ReactInstanceMap');\nvar ReactMount = require('./ReactMount');\n\nvar invariant = require('fbjs/lib/invariant');\nvar warning = require('fbjs/lib/warning');\n\n/**\n * Returns the DOM node rendered by this element.\n *\n * @param {ReactComponent|DOMElement} componentOrElement\n * @return {?DOMElement} The root node of this element.\n */\nfunction findDOMNode(componentOrElement) {\n if (process.env.NODE_ENV !== 'production') {\n var owner = ReactCurrentOwner.current;\n if (owner !== null) {\n process.env.NODE_ENV !== 'production' ? warning(owner._warnedAboutRefsInRender, '%s is accessing getDOMNode or findDOMNode inside its render(). ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', owner.getName() || 'A component') : undefined;\n owner._warnedAboutRefsInRender = true;\n }\n }\n if (componentOrElement == null) {\n return null;\n }\n if (componentOrElement.nodeType === 1) {\n return componentOrElement;\n }\n if (ReactInstanceMap.has(componentOrElement)) {\n return ReactMount.getNodeFromInstance(componentOrElement);\n }\n !(componentOrElement.render == null || typeof componentOrElement.render !== 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'findDOMNode was called on an unmounted component.') : invariant(false) : undefined;\n !false ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Element appears to be neither ReactComponent nor DOMNode (keys: %s)', Object.keys(componentOrElement)) : invariant(false) : undefined;\n}\n\nmodule.exports = findDOMNode;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/findDOMNode.js\n ** module id = 90\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactDefaultBatchingStrategy\n */\n\n'use strict';\n\nvar ReactUpdates = require('./ReactUpdates');\nvar Transaction = require('./Transaction');\n\nvar assign = require('./Object.assign');\nvar emptyFunction = require('fbjs/lib/emptyFunction');\n\nvar RESET_BATCHED_UPDATES = {\n initialize: emptyFunction,\n close: function () {\n ReactDefaultBatchingStrategy.isBatchingUpdates = false;\n }\n};\n\nvar FLUSH_BATCHED_UPDATES = {\n initialize: emptyFunction,\n close: ReactUpdates.flushBatchedUpdates.bind(ReactUpdates)\n};\n\nvar TRANSACTION_WRAPPERS = [FLUSH_BATCHED_UPDATES, RESET_BATCHED_UPDATES];\n\nfunction ReactDefaultBatchingStrategyTransaction() {\n this.reinitializeTransaction();\n}\n\nassign(ReactDefaultBatchingStrategyTransaction.prototype, Transaction.Mixin, {\n getTransactionWrappers: function () {\n return TRANSACTION_WRAPPERS;\n }\n});\n\nvar transaction = new ReactDefaultBatchingStrategyTransaction();\n\nvar ReactDefaultBatchingStrategy = {\n isBatchingUpdates: false,\n\n /**\n * Call the provided function in a context within which calls to `setState`\n * and friends are batched such that components aren't updated unnecessarily.\n */\n batchedUpdates: function (callback, a, b, c, d, e) {\n var alreadyBatchingUpdates = ReactDefaultBatchingStrategy.isBatchingUpdates;\n\n ReactDefaultBatchingStrategy.isBatchingUpdates = true;\n\n // The code is written this way to avoid extra allocations\n if (alreadyBatchingUpdates) {\n callback(a, b, c, d, e);\n } else {\n transaction.perform(callback, null, a, b, c, d, e);\n }\n }\n};\n\nmodule.exports = ReactDefaultBatchingStrategy;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactDefaultBatchingStrategy.js\n ** module id = 91\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactDOMComponent\n * @typechecks static-only\n */\n\n/* global hasOwnProperty:true */\n\n'use strict';\n\nvar AutoFocusUtils = require('./AutoFocusUtils');\nvar CSSPropertyOperations = require('./CSSPropertyOperations');\nvar DOMProperty = require('./DOMProperty');\nvar DOMPropertyOperations = require('./DOMPropertyOperations');\nvar EventConstants = require('./EventConstants');\nvar ReactBrowserEventEmitter = require('./ReactBrowserEventEmitter');\nvar ReactComponentBrowserEnvironment = require('./ReactComponentBrowserEnvironment');\nvar ReactDOMButton = require('./ReactDOMButton');\nvar ReactDOMInput = require('./ReactDOMInput');\nvar ReactDOMOption = require('./ReactDOMOption');\nvar ReactDOMSelect = require('./ReactDOMSelect');\nvar ReactDOMTextarea = require('./ReactDOMTextarea');\nvar ReactMount = require('./ReactMount');\nvar ReactMultiChild = require('./ReactMultiChild');\nvar ReactPerf = require('./ReactPerf');\nvar ReactUpdateQueue = require('./ReactUpdateQueue');\n\nvar assign = require('./Object.assign');\nvar canDefineProperty = require('./canDefineProperty');\nvar escapeTextContentForBrowser = require('./escapeTextContentForBrowser');\nvar invariant = require('fbjs/lib/invariant');\nvar isEventSupported = require('./isEventSupported');\nvar keyOf = require('fbjs/lib/keyOf');\nvar setInnerHTML = require('./setInnerHTML');\nvar setTextContent = require('./setTextContent');\nvar shallowEqual = require('fbjs/lib/shallowEqual');\nvar validateDOMNesting = require('./validateDOMNesting');\nvar warning = require('fbjs/lib/warning');\n\nvar deleteListener = ReactBrowserEventEmitter.deleteListener;\nvar listenTo = ReactBrowserEventEmitter.listenTo;\nvar registrationNameModules = ReactBrowserEventEmitter.registrationNameModules;\n\n// For quickly matching children type, to test if can be treated as content.\nvar CONTENT_TYPES = { 'string': true, 'number': true };\n\nvar CHILDREN = keyOf({ children: null });\nvar STYLE = keyOf({ style: null });\nvar HTML = keyOf({ __html: null });\n\nvar ELEMENT_NODE_TYPE = 1;\n\nfunction getDeclarationErrorAddendum(internalInstance) {\n if (internalInstance) {\n var owner = internalInstance._currentElement._owner || null;\n if (owner) {\n var name = owner.getName();\n if (name) {\n return ' This DOM node was rendered by `' + name + '`.';\n }\n }\n }\n return '';\n}\n\nvar legacyPropsDescriptor;\nif (process.env.NODE_ENV !== 'production') {\n legacyPropsDescriptor = {\n props: {\n enumerable: false,\n get: function () {\n var component = this._reactInternalComponent;\n process.env.NODE_ENV !== 'production' ? warning(false, 'ReactDOMComponent: Do not access .props of a DOM node; instead, ' + 'recreate the props as `render` did originally or read the DOM ' + 'properties/attributes directly from this node (e.g., ' + 'this.refs.box.className).%s', getDeclarationErrorAddendum(component)) : undefined;\n return component._currentElement.props;\n }\n }\n };\n}\n\nfunction legacyGetDOMNode() {\n if (process.env.NODE_ENV !== 'production') {\n var component = this._reactInternalComponent;\n process.env.NODE_ENV !== 'production' ? warning(false, 'ReactDOMComponent: Do not access .getDOMNode() of a DOM node; ' + 'instead, use the node directly.%s', getDeclarationErrorAddendum(component)) : undefined;\n }\n return this;\n}\n\nfunction legacyIsMounted() {\n var component = this._reactInternalComponent;\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(false, 'ReactDOMComponent: Do not access .isMounted() of a DOM node.%s', getDeclarationErrorAddendum(component)) : undefined;\n }\n return !!component;\n}\n\nfunction legacySetStateEtc() {\n if (process.env.NODE_ENV !== 'production') {\n var component = this._reactInternalComponent;\n process.env.NODE_ENV !== 'production' ? warning(false, 'ReactDOMComponent: Do not access .setState(), .replaceState(), or ' + '.forceUpdate() of a DOM node. This is a no-op.%s', getDeclarationErrorAddendum(component)) : undefined;\n }\n}\n\nfunction legacySetProps(partialProps, callback) {\n var component = this._reactInternalComponent;\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(false, 'ReactDOMComponent: Do not access .setProps() of a DOM node. ' + 'Instead, call ReactDOM.render again at the top level.%s', getDeclarationErrorAddendum(component)) : undefined;\n }\n if (!component) {\n return;\n }\n ReactUpdateQueue.enqueueSetPropsInternal(component, partialProps);\n if (callback) {\n ReactUpdateQueue.enqueueCallbackInternal(component, callback);\n }\n}\n\nfunction legacyReplaceProps(partialProps, callback) {\n var component = this._reactInternalComponent;\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(false, 'ReactDOMComponent: Do not access .replaceProps() of a DOM node. ' + 'Instead, call ReactDOM.render again at the top level.%s', getDeclarationErrorAddendum(component)) : undefined;\n }\n if (!component) {\n return;\n }\n ReactUpdateQueue.enqueueReplacePropsInternal(component, partialProps);\n if (callback) {\n ReactUpdateQueue.enqueueCallbackInternal(component, callback);\n }\n}\n\nfunction friendlyStringify(obj) {\n if (typeof obj === 'object') {\n if (Array.isArray(obj)) {\n return '[' + obj.map(friendlyStringify).join(', ') + ']';\n } else {\n var pairs = [];\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n var keyEscaped = /^[a-z$_][\\w$_]*$/i.test(key) ? key : JSON.stringify(key);\n pairs.push(keyEscaped + ': ' + friendlyStringify(obj[key]));\n }\n }\n return '{' + pairs.join(', ') + '}';\n }\n } else if (typeof obj === 'string') {\n return JSON.stringify(obj);\n } else if (typeof obj === 'function') {\n return '[function object]';\n }\n // Differs from JSON.stringify in that undefined becauses undefined and that\n // inf and nan don't become null\n return String(obj);\n}\n\nvar styleMutationWarning = {};\n\nfunction checkAndWarnForMutatedStyle(style1, style2, component) {\n if (style1 == null || style2 == null) {\n return;\n }\n if (shallowEqual(style1, style2)) {\n return;\n }\n\n var componentName = component._tag;\n var owner = component._currentElement._owner;\n var ownerName;\n if (owner) {\n ownerName = owner.getName();\n }\n\n var hash = ownerName + '|' + componentName;\n\n if (styleMutationWarning.hasOwnProperty(hash)) {\n return;\n }\n\n styleMutationWarning[hash] = true;\n\n process.env.NODE_ENV !== 'production' ? warning(false, '`%s` was passed a style object that has previously been mutated. ' + 'Mutating `style` is deprecated. Consider cloning it beforehand. Check ' + 'the `render` %s. Previous style: %s. Mutated style: %s.', componentName, owner ? 'of `' + ownerName + '`' : 'using <' + componentName + '>', friendlyStringify(style1), friendlyStringify(style2)) : undefined;\n}\n\n/**\n * @param {object} component\n * @param {?object} props\n */\nfunction assertValidProps(component, props) {\n if (!props) {\n return;\n }\n // Note the use of `==` which checks for null or undefined.\n if (process.env.NODE_ENV !== 'production') {\n if (voidElementTags[component._tag]) {\n process.env.NODE_ENV !== 'production' ? warning(props.children == null && props.dangerouslySetInnerHTML == null, '%s is a void element tag and must not have `children` or ' + 'use `props.dangerouslySetInnerHTML`.%s', component._tag, component._currentElement._owner ? ' Check the render method of ' + component._currentElement._owner.getName() + '.' : '') : undefined;\n }\n }\n if (props.dangerouslySetInnerHTML != null) {\n !(props.children == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Can only set one of `children` or `props.dangerouslySetInnerHTML`.') : invariant(false) : undefined;\n !(typeof props.dangerouslySetInnerHTML === 'object' && HTML in props.dangerouslySetInnerHTML) ? process.env.NODE_ENV !== 'production' ? invariant(false, '`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. ' + 'Please visit https://fb.me/react-invariant-dangerously-set-inner-html ' + 'for more information.') : invariant(false) : undefined;\n }\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(props.innerHTML == null, 'Directly setting property `innerHTML` is not permitted. ' + 'For more information, lookup documentation on `dangerouslySetInnerHTML`.') : undefined;\n process.env.NODE_ENV !== 'production' ? warning(!props.contentEditable || props.children == null, 'A component is `contentEditable` and contains `children` managed by ' + 'React. It is now your responsibility to guarantee that none of ' + 'those nodes are unexpectedly modified or duplicated. This is ' + 'probably not intentional.') : undefined;\n }\n !(props.style == null || typeof props.style === 'object') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'The `style` prop expects a mapping from style properties to values, ' + 'not a string. For example, style={{marginRight: spacing + \\'em\\'}} when ' + 'using JSX.%s', getDeclarationErrorAddendum(component)) : invariant(false) : undefined;\n}\n\nfunction enqueuePutListener(id, registrationName, listener, transaction) {\n if (process.env.NODE_ENV !== 'production') {\n // IE8 has no API for event capturing and the `onScroll` event doesn't\n // bubble.\n process.env.NODE_ENV !== 'production' ? warning(registrationName !== 'onScroll' || isEventSupported('scroll', true), 'This browser doesn\\'t support the `onScroll` event') : undefined;\n }\n var container = ReactMount.findReactContainerForID(id);\n if (container) {\n var doc = container.nodeType === ELEMENT_NODE_TYPE ? container.ownerDocument : container;\n listenTo(registrationName, doc);\n }\n transaction.getReactMountReady().enqueue(putListener, {\n id: id,\n registrationName: registrationName,\n listener: listener\n });\n}\n\nfunction putListener() {\n var listenerToPut = this;\n ReactBrowserEventEmitter.putListener(listenerToPut.id, listenerToPut.registrationName, listenerToPut.listener);\n}\n\n// There are so many media events, it makes sense to just\n// maintain a list rather than create a `trapBubbledEvent` for each\nvar mediaEvents = {\n topAbort: 'abort',\n topCanPlay: 'canplay',\n topCanPlayThrough: 'canplaythrough',\n topDurationChange: 'durationchange',\n topEmptied: 'emptied',\n topEncrypted: 'encrypted',\n topEnded: 'ended',\n topError: 'error',\n topLoadedData: 'loadeddata',\n topLoadedMetadata: 'loadedmetadata',\n topLoadStart: 'loadstart',\n topPause: 'pause',\n topPlay: 'play',\n topPlaying: 'playing',\n topProgress: 'progress',\n topRateChange: 'ratechange',\n topSeeked: 'seeked',\n topSeeking: 'seeking',\n topStalled: 'stalled',\n topSuspend: 'suspend',\n topTimeUpdate: 'timeupdate',\n topVolumeChange: 'volumechange',\n topWaiting: 'waiting'\n};\n\nfunction trapBubbledEventsLocal() {\n var inst = this;\n // If a component renders to null or if another component fatals and causes\n // the state of the tree to be corrupted, `node` here can be null.\n !inst._rootNodeID ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Must be mounted to trap events') : invariant(false) : undefined;\n var node = ReactMount.getNode(inst._rootNodeID);\n !node ? process.env.NODE_ENV !== 'production' ? invariant(false, 'trapBubbledEvent(...): Requires node to be rendered.') : invariant(false) : undefined;\n\n switch (inst._tag) {\n case 'iframe':\n inst._wrapperState.listeners = [ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topLoad, 'load', node)];\n break;\n case 'video':\n case 'audio':\n\n inst._wrapperState.listeners = [];\n // create listener for each media event\n for (var event in mediaEvents) {\n if (mediaEvents.hasOwnProperty(event)) {\n inst._wrapperState.listeners.push(ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes[event], mediaEvents[event], node));\n }\n }\n\n break;\n case 'img':\n inst._wrapperState.listeners = [ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topError, 'error', node), ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topLoad, 'load', node)];\n break;\n case 'form':\n inst._wrapperState.listeners = [ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topReset, 'reset', node), ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topSubmit, 'submit', node)];\n break;\n }\n}\n\nfunction mountReadyInputWrapper() {\n ReactDOMInput.mountReadyWrapper(this);\n}\n\nfunction postUpdateSelectWrapper() {\n ReactDOMSelect.postUpdateWrapper(this);\n}\n\n// For HTML, certain tags should omit their close tag. We keep a whitelist for\n// those special cased tags.\n\nvar omittedCloseTags = {\n 'area': true,\n 'base': true,\n 'br': true,\n 'col': true,\n 'embed': true,\n 'hr': true,\n 'img': true,\n 'input': true,\n 'keygen': true,\n 'link': true,\n 'meta': true,\n 'param': true,\n 'source': true,\n 'track': true,\n 'wbr': true\n};\n\n// NOTE: menuitem's close tag should be omitted, but that causes problems.\nvar newlineEatingTags = {\n 'listing': true,\n 'pre': true,\n 'textarea': true\n};\n\n// For HTML, certain tags cannot have children. This has the same purpose as\n// `omittedCloseTags` except that `menuitem` should still have its closing tag.\n\nvar voidElementTags = assign({\n 'menuitem': true\n}, omittedCloseTags);\n\n// We accept any tag to be rendered but since this gets injected into arbitrary\n// HTML, we want to make sure that it's a safe tag.\n// http://www.w3.org/TR/REC-xml/#NT-Name\n\nvar VALID_TAG_REGEX = /^[a-zA-Z][a-zA-Z:_\\.\\-\\d]*$/; // Simplified subset\nvar validatedTagCache = {};\nvar hasOwnProperty = ({}).hasOwnProperty;\n\nfunction validateDangerousTag(tag) {\n if (!hasOwnProperty.call(validatedTagCache, tag)) {\n !VALID_TAG_REGEX.test(tag) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Invalid tag: %s', tag) : invariant(false) : undefined;\n validatedTagCache[tag] = true;\n }\n}\n\nfunction processChildContextDev(context, inst) {\n // Pass down our tag name to child components for validation purposes\n context = assign({}, context);\n var info = context[validateDOMNesting.ancestorInfoContextKey];\n context[validateDOMNesting.ancestorInfoContextKey] = validateDOMNesting.updatedAncestorInfo(info, inst._tag, inst);\n return context;\n}\n\nfunction isCustomComponent(tagName, props) {\n return tagName.indexOf('-') >= 0 || props.is != null;\n}\n\n/**\n * Creates a new React class that is idempotent and capable of containing other\n * React components. It accepts event listeners and DOM properties that are\n * valid according to `DOMProperty`.\n *\n * - Event listeners: `onClick`, `onMouseDown`, etc.\n * - DOM properties: `className`, `name`, `title`, etc.\n *\n * The `style` property functions differently from the DOM API. It accepts an\n * object mapping of style properties to values.\n *\n * @constructor ReactDOMComponent\n * @extends ReactMultiChild\n */\nfunction ReactDOMComponent(tag) {\n validateDangerousTag(tag);\n this._tag = tag.toLowerCase();\n this._renderedChildren = null;\n this._previousStyle = null;\n this._previousStyleCopy = null;\n this._rootNodeID = null;\n this._wrapperState = null;\n this._topLevelWrapper = null;\n this._nodeWithLegacyProperties = null;\n if (process.env.NODE_ENV !== 'production') {\n this._unprocessedContextDev = null;\n this._processedContextDev = null;\n }\n}\n\nReactDOMComponent.displayName = 'ReactDOMComponent';\n\nReactDOMComponent.Mixin = {\n\n construct: function (element) {\n this._currentElement = element;\n },\n\n /**\n * Generates root tag markup then recurses. This method has side effects and\n * is not idempotent.\n *\n * @internal\n * @param {string} rootID The root DOM ID for this node.\n * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction\n * @param {object} context\n * @return {string} The computed markup.\n */\n mountComponent: function (rootID, transaction, context) {\n this._rootNodeID = rootID;\n\n var props = this._currentElement.props;\n\n switch (this._tag) {\n case 'iframe':\n case 'img':\n case 'form':\n case 'video':\n case 'audio':\n this._wrapperState = {\n listeners: null\n };\n transaction.getReactMountReady().enqueue(trapBubbledEventsLocal, this);\n break;\n case 'button':\n props = ReactDOMButton.getNativeProps(this, props, context);\n break;\n case 'input':\n ReactDOMInput.mountWrapper(this, props, context);\n props = ReactDOMInput.getNativeProps(this, props, context);\n break;\n case 'option':\n ReactDOMOption.mountWrapper(this, props, context);\n props = ReactDOMOption.getNativeProps(this, props, context);\n break;\n case 'select':\n ReactDOMSelect.mountWrapper(this, props, context);\n props = ReactDOMSelect.getNativeProps(this, props, context);\n context = ReactDOMSelect.processChildContext(this, props, context);\n break;\n case 'textarea':\n ReactDOMTextarea.mountWrapper(this, props, context);\n props = ReactDOMTextarea.getNativeProps(this, props, context);\n break;\n }\n\n assertValidProps(this, props);\n if (process.env.NODE_ENV !== 'production') {\n if (context[validateDOMNesting.ancestorInfoContextKey]) {\n validateDOMNesting(this._tag, this, context[validateDOMNesting.ancestorInfoContextKey]);\n }\n }\n\n if (process.env.NODE_ENV !== 'production') {\n this._unprocessedContextDev = context;\n this._processedContextDev = processChildContextDev(context, this);\n context = this._processedContextDev;\n }\n\n var mountImage;\n if (transaction.useCreateElement) {\n var ownerDocument = context[ReactMount.ownerDocumentContextKey];\n var el = ownerDocument.createElement(this._currentElement.type);\n DOMPropertyOperations.setAttributeForID(el, this._rootNodeID);\n // Populate node cache\n ReactMount.getID(el);\n this._updateDOMProperties({}, props, transaction, el);\n this._createInitialChildren(transaction, props, context, el);\n mountImage = el;\n } else {\n var tagOpen = this._createOpenTagMarkupAndPutListeners(transaction, props);\n var tagContent = this._createContentMarkup(transaction, props, context);\n if (!tagContent && omittedCloseTags[this._tag]) {\n mountImage = tagOpen + '/>';\n } else {\n mountImage = tagOpen + '>' + tagContent + '</' + this._currentElement.type + '>';\n }\n }\n\n switch (this._tag) {\n case 'input':\n transaction.getReactMountReady().enqueue(mountReadyInputWrapper, this);\n // falls through\n case 'button':\n case 'select':\n case 'textarea':\n if (props.autoFocus) {\n transaction.getReactMountReady().enqueue(AutoFocusUtils.focusDOMComponent, this);\n }\n break;\n }\n\n return mountImage;\n },\n\n /**\n * Creates markup for the open tag and all attributes.\n *\n * This method has side effects because events get registered.\n *\n * Iterating over object properties is faster than iterating over arrays.\n * @see http://jsperf.com/obj-vs-arr-iteration\n *\n * @private\n * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction\n * @param {object} props\n * @return {string} Markup of opening tag.\n */\n _createOpenTagMarkupAndPutListeners: function (transaction, props) {\n var ret = '<' + this._currentElement.type;\n\n for (var propKey in props) {\n if (!props.hasOwnProperty(propKey)) {\n continue;\n }\n var propValue = props[propKey];\n if (propValue == null) {\n continue;\n }\n if (registrationNameModules.hasOwnProperty(propKey)) {\n if (propValue) {\n enqueuePutListener(this._rootNodeID, propKey, propValue, transaction);\n }\n } else {\n if (propKey === STYLE) {\n if (propValue) {\n if (process.env.NODE_ENV !== 'production') {\n // See `_updateDOMProperties`. style block\n this._previousStyle = propValue;\n }\n propValue = this._previousStyleCopy = assign({}, props.style);\n }\n propValue = CSSPropertyOperations.createMarkupForStyles(propValue);\n }\n var markup = null;\n if (this._tag != null && isCustomComponent(this._tag, props)) {\n if (propKey !== CHILDREN) {\n markup = DOMPropertyOperations.createMarkupForCustomAttribute(propKey, propValue);\n }\n } else {\n markup = DOMPropertyOperations.createMarkupForProperty(propKey, propValue);\n }\n if (markup) {\n ret += ' ' + markup;\n }\n }\n }\n\n // For static pages, no need to put React ID and checksum. Saves lots of\n // bytes.\n if (transaction.renderToStaticMarkup) {\n return ret;\n }\n\n var markupForID = DOMPropertyOperations.createMarkupForID(this._rootNodeID);\n return ret + ' ' + markupForID;\n },\n\n /**\n * Creates markup for the content between the tags.\n *\n * @private\n * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction\n * @param {object} props\n * @param {object} context\n * @return {string} Content markup.\n */\n _createContentMarkup: function (transaction, props, context) {\n var ret = '';\n\n // Intentional use of != to avoid catching zero/false.\n var innerHTML = props.dangerouslySetInnerHTML;\n if (innerHTML != null) {\n if (innerHTML.__html != null) {\n ret = innerHTML.__html;\n }\n } else {\n var contentToUse = CONTENT_TYPES[typeof props.children] ? props.children : null;\n var childrenToUse = contentToUse != null ? null : props.children;\n if (contentToUse != null) {\n // TODO: Validate that text is allowed as a child of this node\n ret = escapeTextContentForBrowser(contentToUse);\n } else if (childrenToUse != null) {\n var mountImages = this.mountChildren(childrenToUse, transaction, context);\n ret = mountImages.join('');\n }\n }\n if (newlineEatingTags[this._tag] && ret.charAt(0) === '\\n') {\n // text/html ignores the first character in these tags if it's a newline\n // Prefer to break application/xml over text/html (for now) by adding\n // a newline specifically to get eaten by the parser. (Alternately for\n // textareas, replacing \"^\\n\" with \"\\r\\n\" doesn't get eaten, and the first\n // \\r is normalized out by HTMLTextAreaElement#value.)\n // See: <http://www.w3.org/TR/html-polyglot/#newlines-in-textarea-and-pre>\n // See: <http://www.w3.org/TR/html5/syntax.html#element-restrictions>\n // See: <http://www.w3.org/TR/html5/syntax.html#newlines>\n // See: Parsing of \"textarea\" \"listing\" and \"pre\" elements\n // from <http://www.w3.org/TR/html5/syntax.html#parsing-main-inbody>\n return '\\n' + ret;\n } else {\n return ret;\n }\n },\n\n _createInitialChildren: function (transaction, props, context, el) {\n // Intentional use of != to avoid catching zero/false.\n var innerHTML = props.dangerouslySetInnerHTML;\n if (innerHTML != null) {\n if (innerHTML.__html != null) {\n setInnerHTML(el, innerHTML.__html);\n }\n } else {\n var contentToUse = CONTENT_TYPES[typeof props.children] ? props.children : null;\n var childrenToUse = contentToUse != null ? null : props.children;\n if (contentToUse != null) {\n // TODO: Validate that text is allowed as a child of this node\n setTextContent(el, contentToUse);\n } else if (childrenToUse != null) {\n var mountImages = this.mountChildren(childrenToUse, transaction, context);\n for (var i = 0; i < mountImages.length; i++) {\n el.appendChild(mountImages[i]);\n }\n }\n }\n },\n\n /**\n * Receives a next element and updates the component.\n *\n * @internal\n * @param {ReactElement} nextElement\n * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction\n * @param {object} context\n */\n receiveComponent: function (nextElement, transaction, context) {\n var prevElement = this._currentElement;\n this._currentElement = nextElement;\n this.updateComponent(transaction, prevElement, nextElement, context);\n },\n\n /**\n * Updates a native DOM component after it has already been allocated and\n * attached to the DOM. Reconciles the root DOM node, then recurses.\n *\n * @param {ReactReconcileTransaction} transaction\n * @param {ReactElement} prevElement\n * @param {ReactElement} nextElement\n * @internal\n * @overridable\n */\n updateComponent: function (transaction, prevElement, nextElement, context) {\n var lastProps = prevElement.props;\n var nextProps = this._currentElement.props;\n\n switch (this._tag) {\n case 'button':\n lastProps = ReactDOMButton.getNativeProps(this, lastProps);\n nextProps = ReactDOMButton.getNativeProps(this, nextProps);\n break;\n case 'input':\n ReactDOMInput.updateWrapper(this);\n lastProps = ReactDOMInput.getNativeProps(this, lastProps);\n nextProps = ReactDOMInput.getNativeProps(this, nextProps);\n break;\n case 'option':\n lastProps = ReactDOMOption.getNativeProps(this, lastProps);\n nextProps = ReactDOMOption.getNativeProps(this, nextProps);\n break;\n case 'select':\n lastProps = ReactDOMSelect.getNativeProps(this, lastProps);\n nextProps = ReactDOMSelect.getNativeProps(this, nextProps);\n break;\n case 'textarea':\n ReactDOMTextarea.updateWrapper(this);\n lastProps = ReactDOMTextarea.getNativeProps(this, lastProps);\n nextProps = ReactDOMTextarea.getNativeProps(this, nextProps);\n break;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n // If the context is reference-equal to the old one, pass down the same\n // processed object so the update bailout in ReactReconciler behaves\n // correctly (and identically in dev and prod). See #5005.\n if (this._unprocessedContextDev !== context) {\n this._unprocessedContextDev = context;\n this._processedContextDev = processChildContextDev(context, this);\n }\n context = this._processedContextDev;\n }\n\n assertValidProps(this, nextProps);\n this._updateDOMProperties(lastProps, nextProps, transaction, null);\n this._updateDOMChildren(lastProps, nextProps, transaction, context);\n\n if (!canDefineProperty && this._nodeWithLegacyProperties) {\n this._nodeWithLegacyProperties.props = nextProps;\n }\n\n if (this._tag === 'select') {\n // <select> value update needs to occur after <option> children\n // reconciliation\n transaction.getReactMountReady().enqueue(postUpdateSelectWrapper, this);\n }\n },\n\n /**\n * Reconciles the properties by detecting differences in property values and\n * updating the DOM as necessary. This function is probably the single most\n * critical path for performance optimization.\n *\n * TODO: Benchmark whether checking for changed values in memory actually\n * improves performance (especially statically positioned elements).\n * TODO: Benchmark the effects of putting this at the top since 99% of props\n * do not change for a given reconciliation.\n * TODO: Benchmark areas that can be improved with caching.\n *\n * @private\n * @param {object} lastProps\n * @param {object} nextProps\n * @param {ReactReconcileTransaction} transaction\n * @param {?DOMElement} node\n */\n _updateDOMProperties: function (lastProps, nextProps, transaction, node) {\n var propKey;\n var styleName;\n var styleUpdates;\n for (propKey in lastProps) {\n if (nextProps.hasOwnProperty(propKey) || !lastProps.hasOwnProperty(propKey)) {\n continue;\n }\n if (propKey === STYLE) {\n var lastStyle = this._previousStyleCopy;\n for (styleName in lastStyle) {\n if (lastStyle.hasOwnProperty(styleName)) {\n styleUpdates = styleUpdates || {};\n styleUpdates[styleName] = '';\n }\n }\n this._previousStyleCopy = null;\n } else if (registrationNameModules.hasOwnProperty(propKey)) {\n if (lastProps[propKey]) {\n // Only call deleteListener if there was a listener previously or\n // else willDeleteListener gets called when there wasn't actually a\n // listener (e.g., onClick={null})\n deleteListener(this._rootNodeID, propKey);\n }\n } else if (DOMProperty.properties[propKey] || DOMProperty.isCustomAttribute(propKey)) {\n if (!node) {\n node = ReactMount.getNode(this._rootNodeID);\n }\n DOMPropertyOperations.deleteValueForProperty(node, propKey);\n }\n }\n for (propKey in nextProps) {\n var nextProp = nextProps[propKey];\n var lastProp = propKey === STYLE ? this._previousStyleCopy : lastProps[propKey];\n if (!nextProps.hasOwnProperty(propKey) || nextProp === lastProp) {\n continue;\n }\n if (propKey === STYLE) {\n if (nextProp) {\n if (process.env.NODE_ENV !== 'production') {\n checkAndWarnForMutatedStyle(this._previousStyleCopy, this._previousStyle, this);\n this._previousStyle = nextProp;\n }\n nextProp = this._previousStyleCopy = assign({}, nextProp);\n } else {\n this._previousStyleCopy = null;\n }\n if (lastProp) {\n // Unset styles on `lastProp` but not on `nextProp`.\n for (styleName in lastProp) {\n if (lastProp.hasOwnProperty(styleName) && (!nextProp || !nextProp.hasOwnProperty(styleName))) {\n styleUpdates = styleUpdates || {};\n styleUpdates[styleName] = '';\n }\n }\n // Update styles that changed since `lastProp`.\n for (styleName in nextProp) {\n if (nextProp.hasOwnProperty(styleName) && lastProp[styleName] !== nextProp[styleName]) {\n styleUpdates = styleUpdates || {};\n styleUpdates[styleName] = nextProp[styleName];\n }\n }\n } else {\n // Relies on `updateStylesByID` not mutating `styleUpdates`.\n styleUpdates = nextProp;\n }\n } else if (registrationNameModules.hasOwnProperty(propKey)) {\n if (nextProp) {\n enqueuePutListener(this._rootNodeID, propKey, nextProp, transaction);\n } else if (lastProp) {\n deleteListener(this._rootNodeID, propKey);\n }\n } else if (isCustomComponent(this._tag, nextProps)) {\n if (!node) {\n node = ReactMount.getNode(this._rootNodeID);\n }\n if (propKey === CHILDREN) {\n nextProp = null;\n }\n DOMPropertyOperations.setValueForAttribute(node, propKey, nextProp);\n } else if (DOMProperty.properties[propKey] || DOMProperty.isCustomAttribute(propKey)) {\n if (!node) {\n node = ReactMount.getNode(this._rootNodeID);\n }\n // If we're updating to null or undefined, we should remove the property\n // from the DOM node instead of inadvertantly setting to a string. This\n // brings us in line with the same behavior we have on initial render.\n if (nextProp != null) {\n DOMPropertyOperations.setValueForProperty(node, propKey, nextProp);\n } else {\n DOMPropertyOperations.deleteValueForProperty(node, propKey);\n }\n }\n }\n if (styleUpdates) {\n if (!node) {\n node = ReactMount.getNode(this._rootNodeID);\n }\n CSSPropertyOperations.setValueForStyles(node, styleUpdates);\n }\n },\n\n /**\n * Reconciles the children with the various properties that affect the\n * children content.\n *\n * @param {object} lastProps\n * @param {object} nextProps\n * @param {ReactReconcileTransaction} transaction\n * @param {object} context\n */\n _updateDOMChildren: function (lastProps, nextProps, transaction, context) {\n var lastContent = CONTENT_TYPES[typeof lastProps.children] ? lastProps.children : null;\n var nextContent = CONTENT_TYPES[typeof nextProps.children] ? nextProps.children : null;\n\n var lastHtml = lastProps.dangerouslySetInnerHTML && lastProps.dangerouslySetInnerHTML.__html;\n var nextHtml = nextProps.dangerouslySetInnerHTML && nextProps.dangerouslySetInnerHTML.__html;\n\n // Note the use of `!=` which checks for null or undefined.\n var lastChildren = lastContent != null ? null : lastProps.children;\n var nextChildren = nextContent != null ? null : nextProps.children;\n\n // If we're switching from children to content/html or vice versa, remove\n // the old content\n var lastHasContentOrHtml = lastContent != null || lastHtml != null;\n var nextHasContentOrHtml = nextContent != null || nextHtml != null;\n if (lastChildren != null && nextChildren == null) {\n this.updateChildren(null, transaction, context);\n } else if (lastHasContentOrHtml && !nextHasContentOrHtml) {\n this.updateTextContent('');\n }\n\n if (nextContent != null) {\n if (lastContent !== nextContent) {\n this.updateTextContent('' + nextContent);\n }\n } else if (nextHtml != null) {\n if (lastHtml !== nextHtml) {\n this.updateMarkup('' + nextHtml);\n }\n } else if (nextChildren != null) {\n this.updateChildren(nextChildren, transaction, context);\n }\n },\n\n /**\n * Destroys all event registrations for this instance. Does not remove from\n * the DOM. That must be done by the parent.\n *\n * @internal\n */\n unmountComponent: function () {\n switch (this._tag) {\n case 'iframe':\n case 'img':\n case 'form':\n case 'video':\n case 'audio':\n var listeners = this._wrapperState.listeners;\n if (listeners) {\n for (var i = 0; i < listeners.length; i++) {\n listeners[i].remove();\n }\n }\n break;\n case 'input':\n ReactDOMInput.unmountWrapper(this);\n break;\n case 'html':\n case 'head':\n case 'body':\n /**\n * Components like <html> <head> and <body> can't be removed or added\n * easily in a cross-browser way, however it's valuable to be able to\n * take advantage of React's reconciliation for styling and <title>\n * management. So we just document it and throw in dangerous cases.\n */\n !false ? process.env.NODE_ENV !== 'production' ? invariant(false, '<%s> tried to unmount. Because of cross-browser quirks it is ' + 'impossible to unmount some top-level components (eg <html>, ' + '<head>, and <body>) reliably and efficiently. To fix this, have a ' + 'single top-level component that never unmounts render these ' + 'elements.', this._tag) : invariant(false) : undefined;\n break;\n }\n\n this.unmountChildren();\n ReactBrowserEventEmitter.deleteAllListeners(this._rootNodeID);\n ReactComponentBrowserEnvironment.unmountIDFromEnvironment(this._rootNodeID);\n this._rootNodeID = null;\n this._wrapperState = null;\n if (this._nodeWithLegacyProperties) {\n var node = this._nodeWithLegacyProperties;\n node._reactInternalComponent = null;\n this._nodeWithLegacyProperties = null;\n }\n },\n\n getPublicInstance: function () {\n if (!this._nodeWithLegacyProperties) {\n var node = ReactMount.getNode(this._rootNodeID);\n\n node._reactInternalComponent = this;\n node.getDOMNode = legacyGetDOMNode;\n node.isMounted = legacyIsMounted;\n node.setState = legacySetStateEtc;\n node.replaceState = legacySetStateEtc;\n node.forceUpdate = legacySetStateEtc;\n node.setProps = legacySetProps;\n node.replaceProps = legacyReplaceProps;\n\n if (process.env.NODE_ENV !== 'production') {\n if (canDefineProperty) {\n Object.defineProperties(node, legacyPropsDescriptor);\n } else {\n // updateComponent will update this property on subsequent renders\n node.props = this._currentElement.props;\n }\n } else {\n // updateComponent will update this property on subsequent renders\n node.props = this._currentElement.props;\n }\n\n this._nodeWithLegacyProperties = node;\n }\n return this._nodeWithLegacyProperties;\n }\n\n};\n\nReactPerf.measureMethods(ReactDOMComponent, 'ReactDOMComponent', {\n mountComponent: 'mountComponent',\n updateComponent: 'updateComponent'\n});\n\nassign(ReactDOMComponent.prototype, ReactDOMComponent.Mixin, ReactMultiChild.Mixin);\n\nmodule.exports = ReactDOMComponent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactDOMComponent.js\n ** module id = 92\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule AutoFocusUtils\n * @typechecks static-only\n */\n\n'use strict';\n\nvar ReactMount = require('./ReactMount');\n\nvar findDOMNode = require('./findDOMNode');\nvar focusNode = require('fbjs/lib/focusNode');\n\nvar Mixin = {\n componentDidMount: function () {\n if (this.props.autoFocus) {\n focusNode(findDOMNode(this));\n }\n }\n};\n\nvar AutoFocusUtils = {\n Mixin: Mixin,\n\n focusDOMComponent: function () {\n focusNode(ReactMount.getNode(this._rootNodeID));\n }\n};\n\nmodule.exports = AutoFocusUtils;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/AutoFocusUtils.js\n ** module id = 93\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule focusNode\n */\n\n'use strict';\n\n/**\n * @param {DOMElement} node input/textarea to focus\n */\nfunction focusNode(node) {\n // IE8 can throw \"Can't move focus to the control because it is invisible,\n // not enabled, or of a type that does not accept the focus.\" for all kinds of\n // reasons that are too expensive and fragile to test.\n try {\n node.focus();\n } catch (e) {}\n}\n\nmodule.exports = focusNode;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/focusNode.js\n ** module id = 94\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule CSSPropertyOperations\n * @typechecks static-only\n */\n\n'use strict';\n\nvar CSSProperty = require('./CSSProperty');\nvar ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');\nvar ReactPerf = require('./ReactPerf');\n\nvar camelizeStyleName = require('fbjs/lib/camelizeStyleName');\nvar dangerousStyleValue = require('./dangerousStyleValue');\nvar hyphenateStyleName = require('fbjs/lib/hyphenateStyleName');\nvar memoizeStringOnly = require('fbjs/lib/memoizeStringOnly');\nvar warning = require('fbjs/lib/warning');\n\nvar processStyleName = memoizeStringOnly(function (styleName) {\n return hyphenateStyleName(styleName);\n});\n\nvar hasShorthandPropertyBug = false;\nvar styleFloatAccessor = 'cssFloat';\nif (ExecutionEnvironment.canUseDOM) {\n var tempStyle = document.createElement('div').style;\n try {\n // IE8 throws \"Invalid argument.\" if resetting shorthand style properties.\n tempStyle.font = '';\n } catch (e) {\n hasShorthandPropertyBug = true;\n }\n // IE8 only supports accessing cssFloat (standard) as styleFloat\n if (document.documentElement.style.cssFloat === undefined) {\n styleFloatAccessor = 'styleFloat';\n }\n}\n\nif (process.env.NODE_ENV !== 'production') {\n // 'msTransform' is correct, but the other prefixes should be capitalized\n var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/;\n\n // style values shouldn't contain a semicolon\n var badStyleValueWithSemicolonPattern = /;\\s*$/;\n\n var warnedStyleNames = {};\n var warnedStyleValues = {};\n\n var warnHyphenatedStyleName = function (name) {\n if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {\n return;\n }\n\n warnedStyleNames[name] = true;\n process.env.NODE_ENV !== 'production' ? warning(false, 'Unsupported style property %s. Did you mean %s?', name, camelizeStyleName(name)) : undefined;\n };\n\n var warnBadVendoredStyleName = function (name) {\n if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {\n return;\n }\n\n warnedStyleNames[name] = true;\n process.env.NODE_ENV !== 'production' ? warning(false, 'Unsupported vendor-prefixed style property %s. Did you mean %s?', name, name.charAt(0).toUpperCase() + name.slice(1)) : undefined;\n };\n\n var warnStyleValueWithSemicolon = function (name, value) {\n if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) {\n return;\n }\n\n warnedStyleValues[value] = true;\n process.env.NODE_ENV !== 'production' ? warning(false, 'Style property values shouldn\\'t contain a semicolon. ' + 'Try \"%s: %s\" instead.', name, value.replace(badStyleValueWithSemicolonPattern, '')) : undefined;\n };\n\n /**\n * @param {string} name\n * @param {*} value\n */\n var warnValidStyle = function (name, value) {\n if (name.indexOf('-') > -1) {\n warnHyphenatedStyleName(name);\n } else if (badVendoredStyleNamePattern.test(name)) {\n warnBadVendoredStyleName(name);\n } else if (badStyleValueWithSemicolonPattern.test(value)) {\n warnStyleValueWithSemicolon(name, value);\n }\n };\n}\n\n/**\n * Operations for dealing with CSS properties.\n */\nvar CSSPropertyOperations = {\n\n /**\n * Serializes a mapping of style properties for use as inline styles:\n *\n * > createMarkupForStyles({width: '200px', height: 0})\n * \"width:200px;height:0;\"\n *\n * Undefined values are ignored so that declarative programming is easier.\n * The result should be HTML-escaped before insertion into the DOM.\n *\n * @param {object} styles\n * @return {?string}\n */\n createMarkupForStyles: function (styles) {\n var serialized = '';\n for (var styleName in styles) {\n if (!styles.hasOwnProperty(styleName)) {\n continue;\n }\n var styleValue = styles[styleName];\n if (process.env.NODE_ENV !== 'production') {\n warnValidStyle(styleName, styleValue);\n }\n if (styleValue != null) {\n serialized += processStyleName(styleName) + ':';\n serialized += dangerousStyleValue(styleName, styleValue) + ';';\n }\n }\n return serialized || null;\n },\n\n /**\n * Sets the value for multiple styles on a node. If a value is specified as\n * '' (empty string), the corresponding style property will be unset.\n *\n * @param {DOMElement} node\n * @param {object} styles\n */\n setValueForStyles: function (node, styles) {\n var style = node.style;\n for (var styleName in styles) {\n if (!styles.hasOwnProperty(styleName)) {\n continue;\n }\n if (process.env.NODE_ENV !== 'production') {\n warnValidStyle(styleName, styles[styleName]);\n }\n var styleValue = dangerousStyleValue(styleName, styles[styleName]);\n if (styleName === 'float') {\n styleName = styleFloatAccessor;\n }\n if (styleValue) {\n style[styleName] = styleValue;\n } else {\n var expansion = hasShorthandPropertyBug && CSSProperty.shorthandPropertyExpansions[styleName];\n if (expansion) {\n // Shorthand property that IE8 won't like unsetting, so unset each\n // component to placate it\n for (var individualStyleName in expansion) {\n style[individualStyleName] = '';\n }\n } else {\n style[styleName] = '';\n }\n }\n }\n }\n\n};\n\nReactPerf.measureMethods(CSSPropertyOperations, 'CSSPropertyOperations', {\n setValueForStyles: 'setValueForStyles'\n});\n\nmodule.exports = CSSPropertyOperations;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/CSSPropertyOperations.js\n ** module id = 95\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule CSSProperty\n */\n\n'use strict';\n\n/**\n * CSS properties which accept numbers but are not in units of \"px\".\n */\nvar isUnitlessNumber = {\n animationIterationCount: true,\n boxFlex: true,\n boxFlexGroup: true,\n boxOrdinalGroup: true,\n columnCount: true,\n flex: true,\n flexGrow: true,\n flexPositive: true,\n flexShrink: true,\n flexNegative: true,\n flexOrder: true,\n fontWeight: true,\n lineClamp: true,\n lineHeight: true,\n opacity: true,\n order: true,\n orphans: true,\n tabSize: true,\n widows: true,\n zIndex: true,\n zoom: true,\n\n // SVG-related properties\n fillOpacity: true,\n stopOpacity: true,\n strokeDashoffset: true,\n strokeOpacity: true,\n strokeWidth: true\n};\n\n/**\n * @param {string} prefix vendor-specific prefix, eg: Webkit\n * @param {string} key style name, eg: transitionDuration\n * @return {string} style name prefixed with `prefix`, properly camelCased, eg:\n * WebkitTransitionDuration\n */\nfunction prefixKey(prefix, key) {\n return prefix + key.charAt(0).toUpperCase() + key.substring(1);\n}\n\n/**\n * Support style names that may come passed in prefixed by adding permutations\n * of vendor prefixes.\n */\nvar prefixes = ['Webkit', 'ms', 'Moz', 'O'];\n\n// Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an\n// infinite loop, because it iterates over the newly added props too.\nObject.keys(isUnitlessNumber).forEach(function (prop) {\n prefixes.forEach(function (prefix) {\n isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop];\n });\n});\n\n/**\n * Most style properties can be unset by doing .style[prop] = '' but IE8\n * doesn't like doing that with shorthand properties so for the properties that\n * IE8 breaks on, which are listed here, we instead unset each of the\n * individual properties. See http://bugs.jquery.com/ticket/12385.\n * The 4-value 'clock' properties like margin, padding, border-width seem to\n * behave without any problems. Curiously, list-style works too without any\n * special prodding.\n */\nvar shorthandPropertyExpansions = {\n background: {\n backgroundAttachment: true,\n backgroundColor: true,\n backgroundImage: true,\n backgroundPositionX: true,\n backgroundPositionY: true,\n backgroundRepeat: true\n },\n backgroundPosition: {\n backgroundPositionX: true,\n backgroundPositionY: true\n },\n border: {\n borderWidth: true,\n borderStyle: true,\n borderColor: true\n },\n borderBottom: {\n borderBottomWidth: true,\n borderBottomStyle: true,\n borderBottomColor: true\n },\n borderLeft: {\n borderLeftWidth: true,\n borderLeftStyle: true,\n borderLeftColor: true\n },\n borderRight: {\n borderRightWidth: true,\n borderRightStyle: true,\n borderRightColor: true\n },\n borderTop: {\n borderTopWidth: true,\n borderTopStyle: true,\n borderTopColor: true\n },\n font: {\n fontStyle: true,\n fontVariant: true,\n fontWeight: true,\n fontSize: true,\n lineHeight: true,\n fontFamily: true\n },\n outline: {\n outlineWidth: true,\n outlineStyle: true,\n outlineColor: true\n }\n};\n\nvar CSSProperty = {\n isUnitlessNumber: isUnitlessNumber,\n shorthandPropertyExpansions: shorthandPropertyExpansions\n};\n\nmodule.exports = CSSProperty;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/CSSProperty.js\n ** module id = 96\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule camelizeStyleName\n * @typechecks\n */\n\n'use strict';\n\nvar camelize = require('./camelize');\n\nvar msPattern = /^-ms-/;\n\n/**\n * Camelcases a hyphenated CSS property name, for example:\n *\n * > camelizeStyleName('background-color')\n * < \"backgroundColor\"\n * > camelizeStyleName('-moz-transition')\n * < \"MozTransition\"\n * > camelizeStyleName('-ms-transition')\n * < \"msTransition\"\n *\n * As Andi Smith suggests\n * (http://www.andismith.com/blog/2012/02/modernizr-prefixed/), an `-ms` prefix\n * is converted to lowercase `ms`.\n *\n * @param {string} string\n * @return {string}\n */\nfunction camelizeStyleName(string) {\n return camelize(string.replace(msPattern, 'ms-'));\n}\n\nmodule.exports = camelizeStyleName;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/camelizeStyleName.js\n ** module id = 97\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule camelize\n * @typechecks\n */\n\n\"use strict\";\n\nvar _hyphenPattern = /-(.)/g;\n\n/**\n * Camelcases a hyphenated string, for example:\n *\n * > camelize('background-color')\n * < \"backgroundColor\"\n *\n * @param {string} string\n * @return {string}\n */\nfunction camelize(string) {\n return string.replace(_hyphenPattern, function (_, character) {\n return character.toUpperCase();\n });\n}\n\nmodule.exports = camelize;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/camelize.js\n ** module id = 98\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule dangerousStyleValue\n * @typechecks static-only\n */\n\n'use strict';\n\nvar CSSProperty = require('./CSSProperty');\n\nvar isUnitlessNumber = CSSProperty.isUnitlessNumber;\n\n/**\n * Convert a value into the proper css writable value. The style name `name`\n * should be logical (no hyphens), as specified\n * in `CSSProperty.isUnitlessNumber`.\n *\n * @param {string} name CSS property name such as `topMargin`.\n * @param {*} value CSS property value such as `10px`.\n * @return {string} Normalized style value with dimensions applied.\n */\nfunction dangerousStyleValue(name, value) {\n // Note that we've removed escapeTextForBrowser() calls here since the\n // whole string will be escaped when the attribute is injected into\n // the markup. If you provide unsafe user data here they can inject\n // arbitrary CSS which may be problematic (I couldn't repro this):\n // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet\n // http://www.thespanner.co.uk/2007/11/26/ultimate-xss-css-injection/\n // This is not an XSS hole but instead a potential CSS injection issue\n // which has lead to a greater discussion about how we're going to\n // trust URLs moving forward. See #2115901\n\n var isEmpty = value == null || typeof value === 'boolean' || value === '';\n if (isEmpty) {\n return '';\n }\n\n var isNonNumeric = isNaN(value);\n if (isNonNumeric || value === 0 || isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name]) {\n return '' + value; // cast to string\n }\n\n if (typeof value === 'string') {\n value = value.trim();\n }\n return value + 'px';\n}\n\nmodule.exports = dangerousStyleValue;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/dangerousStyleValue.js\n ** module id = 99\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule hyphenateStyleName\n * @typechecks\n */\n\n'use strict';\n\nvar hyphenate = require('./hyphenate');\n\nvar msPattern = /^ms-/;\n\n/**\n * Hyphenates a camelcased CSS property name, for example:\n *\n * > hyphenateStyleName('backgroundColor')\n * < \"background-color\"\n * > hyphenateStyleName('MozTransition')\n * < \"-moz-transition\"\n * > hyphenateStyleName('msTransition')\n * < \"-ms-transition\"\n *\n * As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix\n * is converted to `-ms-`.\n *\n * @param {string} string\n * @return {string}\n */\nfunction hyphenateStyleName(string) {\n return hyphenate(string).replace(msPattern, '-ms-');\n}\n\nmodule.exports = hyphenateStyleName;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/hyphenateStyleName.js\n ** module id = 100\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule hyphenate\n * @typechecks\n */\n\n'use strict';\n\nvar _uppercasePattern = /([A-Z])/g;\n\n/**\n * Hyphenates a camelcased string, for example:\n *\n * > hyphenate('backgroundColor')\n * < \"background-color\"\n *\n * For CSS style names, use `hyphenateStyleName` instead which works properly\n * with all vendor prefixes, including `ms`.\n *\n * @param {string} string\n * @return {string}\n */\nfunction hyphenate(string) {\n return string.replace(_uppercasePattern, '-$1').toLowerCase();\n}\n\nmodule.exports = hyphenate;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/hyphenate.js\n ** module id = 101\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule memoizeStringOnly\n * @typechecks static-only\n */\n\n'use strict';\n\n/**\n * Memoizes the return value of a function that accepts one string argument.\n *\n * @param {function} callback\n * @return {function}\n */\nfunction memoizeStringOnly(callback) {\n var cache = {};\n return function (string) {\n if (!cache.hasOwnProperty(string)) {\n cache[string] = callback.call(this, string);\n }\n return cache[string];\n };\n}\n\nmodule.exports = memoizeStringOnly;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/memoizeStringOnly.js\n ** module id = 102\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactDOMButton\n */\n\n'use strict';\n\nvar mouseListenerNames = {\n onClick: true,\n onDoubleClick: true,\n onMouseDown: true,\n onMouseMove: true,\n onMouseUp: true,\n\n onClickCapture: true,\n onDoubleClickCapture: true,\n onMouseDownCapture: true,\n onMouseMoveCapture: true,\n onMouseUpCapture: true\n};\n\n/**\n * Implements a <button> native component that does not receive mouse events\n * when `disabled` is set.\n */\nvar ReactDOMButton = {\n getNativeProps: function (inst, props, context) {\n if (!props.disabled) {\n return props;\n }\n\n // Copy the props, except the mouse listeners\n var nativeProps = {};\n for (var key in props) {\n if (props.hasOwnProperty(key) && !mouseListenerNames[key]) {\n nativeProps[key] = props[key];\n }\n }\n\n return nativeProps;\n }\n};\n\nmodule.exports = ReactDOMButton;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactDOMButton.js\n ** module id = 103\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactDOMInput\n */\n\n'use strict';\n\nvar ReactDOMIDOperations = require('./ReactDOMIDOperations');\nvar LinkedValueUtils = require('./LinkedValueUtils');\nvar ReactMount = require('./ReactMount');\nvar ReactUpdates = require('./ReactUpdates');\n\nvar assign = require('./Object.assign');\nvar invariant = require('fbjs/lib/invariant');\n\nvar instancesByReactID = {};\n\nfunction forceUpdateIfMounted() {\n if (this._rootNodeID) {\n // DOM component is still mounted; update\n ReactDOMInput.updateWrapper(this);\n }\n}\n\n/**\n * Implements an <input> native component that allows setting these optional\n * props: `checked`, `value`, `defaultChecked`, and `defaultValue`.\n *\n * If `checked` or `value` are not supplied (or null/undefined), user actions\n * that affect the checked state or value will trigger updates to the element.\n *\n * If they are supplied (and not null/undefined), the rendered element will not\n * trigger updates to the element. Instead, the props must change in order for\n * the rendered element to be updated.\n *\n * The rendered element will be initialized as unchecked (or `defaultChecked`)\n * with an empty value (or `defaultValue`).\n *\n * @see http://www.w3.org/TR/2012/WD-html5-20121025/the-input-element.html\n */\nvar ReactDOMInput = {\n getNativeProps: function (inst, props, context) {\n var value = LinkedValueUtils.getValue(props);\n var checked = LinkedValueUtils.getChecked(props);\n\n var nativeProps = assign({}, props, {\n defaultChecked: undefined,\n defaultValue: undefined,\n value: value != null ? value : inst._wrapperState.initialValue,\n checked: checked != null ? checked : inst._wrapperState.initialChecked,\n onChange: inst._wrapperState.onChange\n });\n\n return nativeProps;\n },\n\n mountWrapper: function (inst, props) {\n if (process.env.NODE_ENV !== 'production') {\n LinkedValueUtils.checkPropTypes('input', props, inst._currentElement._owner);\n }\n\n var defaultValue = props.defaultValue;\n inst._wrapperState = {\n initialChecked: props.defaultChecked || false,\n initialValue: defaultValue != null ? defaultValue : null,\n onChange: _handleChange.bind(inst)\n };\n },\n\n mountReadyWrapper: function (inst) {\n // Can't be in mountWrapper or else server rendering leaks.\n instancesByReactID[inst._rootNodeID] = inst;\n },\n\n unmountWrapper: function (inst) {\n delete instancesByReactID[inst._rootNodeID];\n },\n\n updateWrapper: function (inst) {\n var props = inst._currentElement.props;\n\n // TODO: Shouldn't this be getChecked(props)?\n var checked = props.checked;\n if (checked != null) {\n ReactDOMIDOperations.updatePropertyByID(inst._rootNodeID, 'checked', checked || false);\n }\n\n var value = LinkedValueUtils.getValue(props);\n if (value != null) {\n // Cast `value` to a string to ensure the value is set correctly. While\n // browsers typically do this as necessary, jsdom doesn't.\n ReactDOMIDOperations.updatePropertyByID(inst._rootNodeID, 'value', '' + value);\n }\n }\n};\n\nfunction _handleChange(event) {\n var props = this._currentElement.props;\n\n var returnValue = LinkedValueUtils.executeOnChange(props, event);\n\n // Here we use asap to wait until all updates have propagated, which\n // is important when using controlled components within layers:\n // https://github.com/facebook/react/issues/1698\n ReactUpdates.asap(forceUpdateIfMounted, this);\n\n var name = props.name;\n if (props.type === 'radio' && name != null) {\n var rootNode = ReactMount.getNode(this._rootNodeID);\n var queryRoot = rootNode;\n\n while (queryRoot.parentNode) {\n queryRoot = queryRoot.parentNode;\n }\n\n // If `rootNode.form` was non-null, then we could try `form.elements`,\n // but that sometimes behaves strangely in IE8. We could also try using\n // `form.getElementsByName`, but that will only return direct children\n // and won't include inputs that use the HTML5 `form=` attribute. Since\n // the input might not even be in a form, let's just use the global\n // `querySelectorAll` to ensure we don't miss anything.\n var group = queryRoot.querySelectorAll('input[name=' + JSON.stringify('' + name) + '][type=\"radio\"]');\n\n for (var i = 0; i < group.length; i++) {\n var otherNode = group[i];\n if (otherNode === rootNode || otherNode.form !== rootNode.form) {\n continue;\n }\n // This will throw if radio buttons rendered by different copies of React\n // and the same name are rendered into the same form (same as #1939).\n // That's probably okay; we don't support it just as we don't support\n // mixing React with non-React.\n var otherID = ReactMount.getID(otherNode);\n !otherID ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactDOMInput: Mixing React and non-React radio inputs with the ' + 'same `name` is not supported.') : invariant(false) : undefined;\n var otherInstance = instancesByReactID[otherID];\n !otherInstance ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactDOMInput: Unknown radio button ID %s.', otherID) : invariant(false) : undefined;\n // If this is a controlled radio button group, forcing the input that\n // was previously checked to update will cause it to be come re-checked\n // as appropriate.\n ReactUpdates.asap(forceUpdateIfMounted, otherInstance);\n }\n }\n\n return returnValue;\n}\n\nmodule.exports = ReactDOMInput;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactDOMInput.js\n ** module id = 104\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule LinkedValueUtils\n * @typechecks static-only\n */\n\n'use strict';\n\nvar ReactPropTypes = require('./ReactPropTypes');\nvar ReactPropTypeLocations = require('./ReactPropTypeLocations');\n\nvar invariant = require('fbjs/lib/invariant');\nvar warning = require('fbjs/lib/warning');\n\nvar hasReadOnlyValue = {\n 'button': true,\n 'checkbox': true,\n 'image': true,\n 'hidden': true,\n 'radio': true,\n 'reset': true,\n 'submit': true\n};\n\nfunction _assertSingleLink(inputProps) {\n !(inputProps.checkedLink == null || inputProps.valueLink == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Cannot provide a checkedLink and a valueLink. If you want to use ' + 'checkedLink, you probably don\\'t want to use valueLink and vice versa.') : invariant(false) : undefined;\n}\nfunction _assertValueLink(inputProps) {\n _assertSingleLink(inputProps);\n !(inputProps.value == null && inputProps.onChange == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Cannot provide a valueLink and a value or onChange event. If you want ' + 'to use value or onChange, you probably don\\'t want to use valueLink.') : invariant(false) : undefined;\n}\n\nfunction _assertCheckedLink(inputProps) {\n _assertSingleLink(inputProps);\n !(inputProps.checked == null && inputProps.onChange == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Cannot provide a checkedLink and a checked property or onChange event. ' + 'If you want to use checked or onChange, you probably don\\'t want to ' + 'use checkedLink') : invariant(false) : undefined;\n}\n\nvar propTypes = {\n value: function (props, propName, componentName) {\n if (!props[propName] || hasReadOnlyValue[props.type] || props.onChange || props.readOnly || props.disabled) {\n return null;\n }\n return new Error('You provided a `value` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultValue`. Otherwise, ' + 'set either `onChange` or `readOnly`.');\n },\n checked: function (props, propName, componentName) {\n if (!props[propName] || props.onChange || props.readOnly || props.disabled) {\n return null;\n }\n return new Error('You provided a `checked` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultChecked`. Otherwise, ' + 'set either `onChange` or `readOnly`.');\n },\n onChange: ReactPropTypes.func\n};\n\nvar loggedTypeFailures = {};\nfunction getDeclarationErrorAddendum(owner) {\n if (owner) {\n var name = owner.getName();\n if (name) {\n return ' Check the render method of `' + name + '`.';\n }\n }\n return '';\n}\n\n/**\n * Provide a linked `value` attribute for controlled forms. You should not use\n * this outside of the ReactDOM controlled form components.\n */\nvar LinkedValueUtils = {\n checkPropTypes: function (tagName, props, owner) {\n for (var propName in propTypes) {\n if (propTypes.hasOwnProperty(propName)) {\n var error = propTypes[propName](props, propName, tagName, ReactPropTypeLocations.prop);\n }\n if (error instanceof Error && !(error.message in loggedTypeFailures)) {\n // Only monitor this failure once because there tends to be a lot of the\n // same error.\n loggedTypeFailures[error.message] = true;\n\n var addendum = getDeclarationErrorAddendum(owner);\n process.env.NODE_ENV !== 'production' ? warning(false, 'Failed form propType: %s%s', error.message, addendum) : undefined;\n }\n }\n },\n\n /**\n * @param {object} inputProps Props for form component\n * @return {*} current value of the input either from value prop or link.\n */\n getValue: function (inputProps) {\n if (inputProps.valueLink) {\n _assertValueLink(inputProps);\n return inputProps.valueLink.value;\n }\n return inputProps.value;\n },\n\n /**\n * @param {object} inputProps Props for form component\n * @return {*} current checked status of the input either from checked prop\n * or link.\n */\n getChecked: function (inputProps) {\n if (inputProps.checkedLink) {\n _assertCheckedLink(inputProps);\n return inputProps.checkedLink.value;\n }\n return inputProps.checked;\n },\n\n /**\n * @param {object} inputProps Props for form component\n * @param {SyntheticEvent} event change event to handle\n */\n executeOnChange: function (inputProps, event) {\n if (inputProps.valueLink) {\n _assertValueLink(inputProps);\n return inputProps.valueLink.requestChange(event.target.value);\n } else if (inputProps.checkedLink) {\n _assertCheckedLink(inputProps);\n return inputProps.checkedLink.requestChange(event.target.checked);\n } else if (inputProps.onChange) {\n return inputProps.onChange.call(undefined, event);\n }\n }\n};\n\nmodule.exports = LinkedValueUtils;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/LinkedValueUtils.js\n ** module id = 105\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactPropTypes\n */\n\n'use strict';\n\nvar ReactElement = require('./ReactElement');\nvar ReactPropTypeLocationNames = require('./ReactPropTypeLocationNames');\n\nvar emptyFunction = require('fbjs/lib/emptyFunction');\nvar getIteratorFn = require('./getIteratorFn');\n\n/**\n * Collection of methods that allow declaration and validation of props that are\n * supplied to React components. Example usage:\n *\n * var Props = require('ReactPropTypes');\n * var MyArticle = React.createClass({\n * propTypes: {\n * // An optional string prop named \"description\".\n * description: Props.string,\n *\n * // A required enum prop named \"category\".\n * category: Props.oneOf(['News','Photos']).isRequired,\n *\n * // A prop named \"dialog\" that requires an instance of Dialog.\n * dialog: Props.instanceOf(Dialog).isRequired\n * },\n * render: function() { ... }\n * });\n *\n * A more formal specification of how these methods are used:\n *\n * type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...)\n * decl := ReactPropTypes.{type}(.isRequired)?\n *\n * Each and every declaration produces a function with the same signature. This\n * allows the creation of custom validation functions. For example:\n *\n * var MyLink = React.createClass({\n * propTypes: {\n * // An optional string or URI prop named \"href\".\n * href: function(props, propName, componentName) {\n * var propValue = props[propName];\n * if (propValue != null && typeof propValue !== 'string' &&\n * !(propValue instanceof URI)) {\n * return new Error(\n * 'Expected a string or an URI for ' + propName + ' in ' +\n * componentName\n * );\n * }\n * }\n * },\n * render: function() {...}\n * });\n *\n * @internal\n */\n\nvar ANONYMOUS = '<<anonymous>>';\n\nvar ReactPropTypes = {\n array: createPrimitiveTypeChecker('array'),\n bool: createPrimitiveTypeChecker('boolean'),\n func: createPrimitiveTypeChecker('function'),\n number: createPrimitiveTypeChecker('number'),\n object: createPrimitiveTypeChecker('object'),\n string: createPrimitiveTypeChecker('string'),\n\n any: createAnyTypeChecker(),\n arrayOf: createArrayOfTypeChecker,\n element: createElementTypeChecker(),\n instanceOf: createInstanceTypeChecker,\n node: createNodeChecker(),\n objectOf: createObjectOfTypeChecker,\n oneOf: createEnumTypeChecker,\n oneOfType: createUnionTypeChecker,\n shape: createShapeTypeChecker\n};\n\nfunction createChainableTypeChecker(validate) {\n function checkType(isRequired, props, propName, componentName, location, propFullName) {\n componentName = componentName || ANONYMOUS;\n propFullName = propFullName || propName;\n if (props[propName] == null) {\n var locationName = ReactPropTypeLocationNames[location];\n if (isRequired) {\n return new Error('Required ' + locationName + ' `' + propFullName + '` was not specified in ' + ('`' + componentName + '`.'));\n }\n return null;\n } else {\n return validate(props, propName, componentName, location, propFullName);\n }\n }\n\n var chainedCheckType = checkType.bind(null, false);\n chainedCheckType.isRequired = checkType.bind(null, true);\n\n return chainedCheckType;\n}\n\nfunction createPrimitiveTypeChecker(expectedType) {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== expectedType) {\n var locationName = ReactPropTypeLocationNames[location];\n // `propValue` being instance of, say, date/regexp, pass the 'object'\n // check, but we can offer a more precise error message here rather than\n // 'of type `object`'.\n var preciseType = getPreciseType(propValue);\n\n return new Error('Invalid ' + locationName + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n}\n\nfunction createAnyTypeChecker() {\n return createChainableTypeChecker(emptyFunction.thatReturns(null));\n}\n\nfunction createArrayOfTypeChecker(typeChecker) {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n if (!Array.isArray(propValue)) {\n var locationName = ReactPropTypeLocationNames[location];\n var propType = getPropType(propValue);\n return new Error('Invalid ' + locationName + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.'));\n }\n for (var i = 0; i < propValue.length; i++) {\n var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']');\n if (error instanceof Error) {\n return error;\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n}\n\nfunction createElementTypeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n if (!ReactElement.isValidElement(props[propName])) {\n var locationName = ReactPropTypeLocationNames[location];\n return new Error('Invalid ' + locationName + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a single ReactElement.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n}\n\nfunction createInstanceTypeChecker(expectedClass) {\n function validate(props, propName, componentName, location, propFullName) {\n if (!(props[propName] instanceof expectedClass)) {\n var locationName = ReactPropTypeLocationNames[location];\n var expectedClassName = expectedClass.name || ANONYMOUS;\n var actualClassName = getClassName(props[propName]);\n return new Error('Invalid ' + locationName + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n}\n\nfunction createEnumTypeChecker(expectedValues) {\n if (!Array.isArray(expectedValues)) {\n return createChainableTypeChecker(function () {\n return new Error('Invalid argument supplied to oneOf, expected an instance of array.');\n });\n }\n\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n for (var i = 0; i < expectedValues.length; i++) {\n if (propValue === expectedValues[i]) {\n return null;\n }\n }\n\n var locationName = ReactPropTypeLocationNames[location];\n var valuesString = JSON.stringify(expectedValues);\n return new Error('Invalid ' + locationName + ' `' + propFullName + '` of value `' + propValue + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.'));\n }\n return createChainableTypeChecker(validate);\n}\n\nfunction createObjectOfTypeChecker(typeChecker) {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n var locationName = ReactPropTypeLocationNames[location];\n return new Error('Invalid ' + locationName + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.'));\n }\n for (var key in propValue) {\n if (propValue.hasOwnProperty(key)) {\n var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key);\n if (error instanceof Error) {\n return error;\n }\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n}\n\nfunction createUnionTypeChecker(arrayOfTypeCheckers) {\n if (!Array.isArray(arrayOfTypeCheckers)) {\n return createChainableTypeChecker(function () {\n return new Error('Invalid argument supplied to oneOfType, expected an instance of array.');\n });\n }\n\n function validate(props, propName, componentName, location, propFullName) {\n for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n var checker = arrayOfTypeCheckers[i];\n if (checker(props, propName, componentName, location, propFullName) == null) {\n return null;\n }\n }\n\n var locationName = ReactPropTypeLocationNames[location];\n return new Error('Invalid ' + locationName + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`.'));\n }\n return createChainableTypeChecker(validate);\n}\n\nfunction createNodeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n if (!isNode(props[propName])) {\n var locationName = ReactPropTypeLocationNames[location];\n return new Error('Invalid ' + locationName + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n}\n\nfunction createShapeTypeChecker(shapeTypes) {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n var locationName = ReactPropTypeLocationNames[location];\n return new Error('Invalid ' + locationName + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));\n }\n for (var key in shapeTypes) {\n var checker = shapeTypes[key];\n if (!checker) {\n continue;\n }\n var error = checker(propValue, key, componentName, location, propFullName + '.' + key);\n if (error) {\n return error;\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n}\n\nfunction isNode(propValue) {\n switch (typeof propValue) {\n case 'number':\n case 'string':\n case 'undefined':\n return true;\n case 'boolean':\n return !propValue;\n case 'object':\n if (Array.isArray(propValue)) {\n return propValue.every(isNode);\n }\n if (propValue === null || ReactElement.isValidElement(propValue)) {\n return true;\n }\n\n var iteratorFn = getIteratorFn(propValue);\n if (iteratorFn) {\n var iterator = iteratorFn.call(propValue);\n var step;\n if (iteratorFn !== propValue.entries) {\n while (!(step = iterator.next()).done) {\n if (!isNode(step.value)) {\n return false;\n }\n }\n } else {\n // Iterator will provide entry [k,v] tuples rather than values.\n while (!(step = iterator.next()).done) {\n var entry = step.value;\n if (entry) {\n if (!isNode(entry[1])) {\n return false;\n }\n }\n }\n }\n } else {\n return false;\n }\n\n return true;\n default:\n return false;\n }\n}\n\n// Equivalent of `typeof` but with special handling for array and regexp.\nfunction getPropType(propValue) {\n var propType = typeof propValue;\n if (Array.isArray(propValue)) {\n return 'array';\n }\n if (propValue instanceof RegExp) {\n // Old webkits (at least until Android 4.0) return 'function' rather than\n // 'object' for typeof a RegExp. We'll normalize this here so that /bla/\n // passes PropTypes.object.\n return 'object';\n }\n return propType;\n}\n\n// This handles more types than `getPropType`. Only used for error messages.\n// See `createPrimitiveTypeChecker`.\nfunction getPreciseType(propValue) {\n var propType = getPropType(propValue);\n if (propType === 'object') {\n if (propValue instanceof Date) {\n return 'date';\n } else if (propValue instanceof RegExp) {\n return 'regexp';\n }\n }\n return propType;\n}\n\n// Returns class name of the object, if any.\nfunction getClassName(propValue) {\n if (!propValue.constructor || !propValue.constructor.name) {\n return '<<anonymous>>';\n }\n return propValue.constructor.name;\n}\n\nmodule.exports = ReactPropTypes;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactPropTypes.js\n ** module id = 106\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule getIteratorFn\n * @typechecks static-only\n */\n\n'use strict';\n\n/* global Symbol */\nvar ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec.\n\n/**\n * Returns the iterator method function contained on the iterable object.\n *\n * Be sure to invoke the function with the iterable as context:\n *\n * var iteratorFn = getIteratorFn(myIterable);\n * if (iteratorFn) {\n * var iterator = iteratorFn.call(myIterable);\n * ...\n * }\n *\n * @param {?object} maybeIterable\n * @return {?function}\n */\nfunction getIteratorFn(maybeIterable) {\n var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);\n if (typeof iteratorFn === 'function') {\n return iteratorFn;\n }\n}\n\nmodule.exports = getIteratorFn;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/getIteratorFn.js\n ** module id = 107\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactDOMOption\n */\n\n'use strict';\n\nvar ReactChildren = require('./ReactChildren');\nvar ReactDOMSelect = require('./ReactDOMSelect');\n\nvar assign = require('./Object.assign');\nvar warning = require('fbjs/lib/warning');\n\nvar valueContextKey = ReactDOMSelect.valueContextKey;\n\n/**\n * Implements an <option> native component that warns when `selected` is set.\n */\nvar ReactDOMOption = {\n mountWrapper: function (inst, props, context) {\n // TODO (yungsters): Remove support for `selected` in <option>.\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(props.selected == null, 'Use the `defaultValue` or `value` props on <select> instead of ' + 'setting `selected` on <option>.') : undefined;\n }\n\n // Look up whether this option is 'selected' via context\n var selectValue = context[valueContextKey];\n\n // If context key is null (e.g., no specified value or after initial mount)\n // or missing (e.g., for <datalist>), we don't change props.selected\n var selected = null;\n if (selectValue != null) {\n selected = false;\n if (Array.isArray(selectValue)) {\n // multiple\n for (var i = 0; i < selectValue.length; i++) {\n if ('' + selectValue[i] === '' + props.value) {\n selected = true;\n break;\n }\n }\n } else {\n selected = '' + selectValue === '' + props.value;\n }\n }\n\n inst._wrapperState = { selected: selected };\n },\n\n getNativeProps: function (inst, props, context) {\n var nativeProps = assign({ selected: undefined, children: undefined }, props);\n\n // Read state only from initial mount because <select> updates value\n // manually; we need the initial state only for server rendering\n if (inst._wrapperState.selected != null) {\n nativeProps.selected = inst._wrapperState.selected;\n }\n\n var content = '';\n\n // Flatten children and warn if they aren't strings or numbers;\n // invalid types are ignored.\n ReactChildren.forEach(props.children, function (child) {\n if (child == null) {\n return;\n }\n if (typeof child === 'string' || typeof child === 'number') {\n content += child;\n } else {\n process.env.NODE_ENV !== 'production' ? warning(false, 'Only strings and numbers are supported as <option> children.') : undefined;\n }\n });\n\n nativeProps.children = content;\n return nativeProps;\n }\n\n};\n\nmodule.exports = ReactDOMOption;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactDOMOption.js\n ** module id = 108\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactChildren\n */\n\n'use strict';\n\nvar PooledClass = require('./PooledClass');\nvar ReactElement = require('./ReactElement');\n\nvar emptyFunction = require('fbjs/lib/emptyFunction');\nvar traverseAllChildren = require('./traverseAllChildren');\n\nvar twoArgumentPooler = PooledClass.twoArgumentPooler;\nvar fourArgumentPooler = PooledClass.fourArgumentPooler;\n\nvar userProvidedKeyEscapeRegex = /\\/(?!\\/)/g;\nfunction escapeUserProvidedKey(text) {\n return ('' + text).replace(userProvidedKeyEscapeRegex, '//');\n}\n\n/**\n * PooledClass representing the bookkeeping associated with performing a child\n * traversal. Allows avoiding binding callbacks.\n *\n * @constructor ForEachBookKeeping\n * @param {!function} forEachFunction Function to perform traversal with.\n * @param {?*} forEachContext Context to perform context with.\n */\nfunction ForEachBookKeeping(forEachFunction, forEachContext) {\n this.func = forEachFunction;\n this.context = forEachContext;\n this.count = 0;\n}\nForEachBookKeeping.prototype.destructor = function () {\n this.func = null;\n this.context = null;\n this.count = 0;\n};\nPooledClass.addPoolingTo(ForEachBookKeeping, twoArgumentPooler);\n\nfunction forEachSingleChild(bookKeeping, child, name) {\n var func = bookKeeping.func;\n var context = bookKeeping.context;\n\n func.call(context, child, bookKeeping.count++);\n}\n\n/**\n * Iterates through children that are typically specified as `props.children`.\n *\n * The provided forEachFunc(child, index) will be called for each\n * leaf child.\n *\n * @param {?*} children Children tree container.\n * @param {function(*, int)} forEachFunc\n * @param {*} forEachContext Context for forEachContext.\n */\nfunction forEachChildren(children, forEachFunc, forEachContext) {\n if (children == null) {\n return children;\n }\n var traverseContext = ForEachBookKeeping.getPooled(forEachFunc, forEachContext);\n traverseAllChildren(children, forEachSingleChild, traverseContext);\n ForEachBookKeeping.release(traverseContext);\n}\n\n/**\n * PooledClass representing the bookkeeping associated with performing a child\n * mapping. Allows avoiding binding callbacks.\n *\n * @constructor MapBookKeeping\n * @param {!*} mapResult Object containing the ordered map of results.\n * @param {!function} mapFunction Function to perform mapping with.\n * @param {?*} mapContext Context to perform mapping with.\n */\nfunction MapBookKeeping(mapResult, keyPrefix, mapFunction, mapContext) {\n this.result = mapResult;\n this.keyPrefix = keyPrefix;\n this.func = mapFunction;\n this.context = mapContext;\n this.count = 0;\n}\nMapBookKeeping.prototype.destructor = function () {\n this.result = null;\n this.keyPrefix = null;\n this.func = null;\n this.context = null;\n this.count = 0;\n};\nPooledClass.addPoolingTo(MapBookKeeping, fourArgumentPooler);\n\nfunction mapSingleChildIntoContext(bookKeeping, child, childKey) {\n var result = bookKeeping.result;\n var keyPrefix = bookKeeping.keyPrefix;\n var func = bookKeeping.func;\n var context = bookKeeping.context;\n\n var mappedChild = func.call(context, child, bookKeeping.count++);\n if (Array.isArray(mappedChild)) {\n mapIntoWithKeyPrefixInternal(mappedChild, result, childKey, emptyFunction.thatReturnsArgument);\n } else if (mappedChild != null) {\n if (ReactElement.isValidElement(mappedChild)) {\n mappedChild = ReactElement.cloneAndReplaceKey(mappedChild,\n // Keep both the (mapped) and old keys if they differ, just as\n // traverseAllChildren used to do for objects as children\n keyPrefix + (mappedChild !== child ? escapeUserProvidedKey(mappedChild.key || '') + '/' : '') + childKey);\n }\n result.push(mappedChild);\n }\n}\n\nfunction mapIntoWithKeyPrefixInternal(children, array, prefix, func, context) {\n var escapedPrefix = '';\n if (prefix != null) {\n escapedPrefix = escapeUserProvidedKey(prefix) + '/';\n }\n var traverseContext = MapBookKeeping.getPooled(array, escapedPrefix, func, context);\n traverseAllChildren(children, mapSingleChildIntoContext, traverseContext);\n MapBookKeeping.release(traverseContext);\n}\n\n/**\n * Maps children that are typically specified as `props.children`.\n *\n * The provided mapFunction(child, key, index) will be called for each\n * leaf child.\n *\n * @param {?*} children Children tree container.\n * @param {function(*, int)} func The map function.\n * @param {*} context Context for mapFunction.\n * @return {object} Object containing the ordered map of results.\n */\nfunction mapChildren(children, func, context) {\n if (children == null) {\n return children;\n }\n var result = [];\n mapIntoWithKeyPrefixInternal(children, result, null, func, context);\n return result;\n}\n\nfunction forEachSingleChildDummy(traverseContext, child, name) {\n return null;\n}\n\n/**\n * Count the number of children that are typically specified as\n * `props.children`.\n *\n * @param {?*} children Children tree container.\n * @return {number} The number of children.\n */\nfunction countChildren(children, context) {\n return traverseAllChildren(children, forEachSingleChildDummy, null);\n}\n\n/**\n * Flatten a children object (typically specified as `props.children`) and\n * return an array with appropriately re-keyed children.\n */\nfunction toArray(children) {\n var result = [];\n mapIntoWithKeyPrefixInternal(children, result, null, emptyFunction.thatReturnsArgument);\n return result;\n}\n\nvar ReactChildren = {\n forEach: forEachChildren,\n map: mapChildren,\n mapIntoWithKeyPrefixInternal: mapIntoWithKeyPrefixInternal,\n count: countChildren,\n toArray: toArray\n};\n\nmodule.exports = ReactChildren;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactChildren.js\n ** module id = 109\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule traverseAllChildren\n */\n\n'use strict';\n\nvar ReactCurrentOwner = require('./ReactCurrentOwner');\nvar ReactElement = require('./ReactElement');\nvar ReactInstanceHandles = require('./ReactInstanceHandles');\n\nvar getIteratorFn = require('./getIteratorFn');\nvar invariant = require('fbjs/lib/invariant');\nvar warning = require('fbjs/lib/warning');\n\nvar SEPARATOR = ReactInstanceHandles.SEPARATOR;\nvar SUBSEPARATOR = ':';\n\n/**\n * TODO: Test that a single child and an array with one item have the same key\n * pattern.\n */\n\nvar userProvidedKeyEscaperLookup = {\n '=': '=0',\n '.': '=1',\n ':': '=2'\n};\n\nvar userProvidedKeyEscapeRegex = /[=.:]/g;\n\nvar didWarnAboutMaps = false;\n\nfunction userProvidedKeyEscaper(match) {\n return userProvidedKeyEscaperLookup[match];\n}\n\n/**\n * Generate a key string that identifies a component within a set.\n *\n * @param {*} component A component that could contain a manual key.\n * @param {number} index Index that is used if a manual key is not provided.\n * @return {string}\n */\nfunction getComponentKey(component, index) {\n if (component && component.key != null) {\n // Explicit key\n return wrapUserProvidedKey(component.key);\n }\n // Implicit key determined by the index in the set\n return index.toString(36);\n}\n\n/**\n * Escape a component key so that it is safe to use in a reactid.\n *\n * @param {*} text Component key to be escaped.\n * @return {string} An escaped string.\n */\nfunction escapeUserProvidedKey(text) {\n return ('' + text).replace(userProvidedKeyEscapeRegex, userProvidedKeyEscaper);\n}\n\n/**\n * Wrap a `key` value explicitly provided by the user to distinguish it from\n * implicitly-generated keys generated by a component's index in its parent.\n *\n * @param {string} key Value of a user-provided `key` attribute\n * @return {string}\n */\nfunction wrapUserProvidedKey(key) {\n return '$' + escapeUserProvidedKey(key);\n}\n\n/**\n * @param {?*} children Children tree container.\n * @param {!string} nameSoFar Name of the key path so far.\n * @param {!function} callback Callback to invoke with each child found.\n * @param {?*} traverseContext Used to pass information throughout the traversal\n * process.\n * @return {!number} The number of children in this subtree.\n */\nfunction traverseAllChildrenImpl(children, nameSoFar, callback, traverseContext) {\n var type = typeof children;\n\n if (type === 'undefined' || type === 'boolean') {\n // All of the above are perceived as null.\n children = null;\n }\n\n if (children === null || type === 'string' || type === 'number' || ReactElement.isValidElement(children)) {\n callback(traverseContext, children,\n // If it's the only child, treat the name as if it was wrapped in an array\n // so that it's consistent if the number of children grows.\n nameSoFar === '' ? SEPARATOR + getComponentKey(children, 0) : nameSoFar);\n return 1;\n }\n\n var child;\n var nextName;\n var subtreeCount = 0; // Count of children found in the current subtree.\n var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR;\n\n if (Array.isArray(children)) {\n for (var i = 0; i < children.length; i++) {\n child = children[i];\n nextName = nextNamePrefix + getComponentKey(child, i);\n subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);\n }\n } else {\n var iteratorFn = getIteratorFn(children);\n if (iteratorFn) {\n var iterator = iteratorFn.call(children);\n var step;\n if (iteratorFn !== children.entries) {\n var ii = 0;\n while (!(step = iterator.next()).done) {\n child = step.value;\n nextName = nextNamePrefix + getComponentKey(child, ii++);\n subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);\n }\n } else {\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(didWarnAboutMaps, 'Using Maps as children is not yet fully supported. It is an ' + 'experimental feature that might be removed. Convert it to a ' + 'sequence / iterable of keyed ReactElements instead.') : undefined;\n didWarnAboutMaps = true;\n }\n // Iterator will provide entry [k,v] tuples rather than values.\n while (!(step = iterator.next()).done) {\n var entry = step.value;\n if (entry) {\n child = entry[1];\n nextName = nextNamePrefix + wrapUserProvidedKey(entry[0]) + SUBSEPARATOR + getComponentKey(child, 0);\n subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);\n }\n }\n }\n } else if (type === 'object') {\n var addendum = '';\n if (process.env.NODE_ENV !== 'production') {\n addendum = ' If you meant to render a collection of children, use an array ' + 'instead or wrap the object using createFragment(object) from the ' + 'React add-ons.';\n if (children._isReactElement) {\n addendum = ' It looks like you\\'re using an element created by a different ' + 'version of React. Make sure to use only one copy of React.';\n }\n if (ReactCurrentOwner.current) {\n var name = ReactCurrentOwner.current.getName();\n if (name) {\n addendum += ' Check the render method of `' + name + '`.';\n }\n }\n }\n var childrenString = String(children);\n !false ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Objects are not valid as a React child (found: %s).%s', childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString, addendum) : invariant(false) : undefined;\n }\n }\n\n return subtreeCount;\n}\n\n/**\n * Traverses children that are typically specified as `props.children`, but\n * might also be specified through attributes:\n *\n * - `traverseAllChildren(this.props.children, ...)`\n * - `traverseAllChildren(this.props.leftPanelChildren, ...)`\n *\n * The `traverseContext` is an optional argument that is passed through the\n * entire traversal. It can be used to store accumulations or anything else that\n * the callback might find relevant.\n *\n * @param {?*} children Children tree object.\n * @param {!function} callback To invoke upon traversing each child.\n * @param {?*} traverseContext Context for traversal.\n * @return {!number} The number of children in this subtree.\n */\nfunction traverseAllChildren(children, callback, traverseContext) {\n if (children == null) {\n return 0;\n }\n\n return traverseAllChildrenImpl(children, '', callback, traverseContext);\n}\n\nmodule.exports = traverseAllChildren;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/traverseAllChildren.js\n ** module id = 110\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactDOMSelect\n */\n\n'use strict';\n\nvar LinkedValueUtils = require('./LinkedValueUtils');\nvar ReactMount = require('./ReactMount');\nvar ReactUpdates = require('./ReactUpdates');\n\nvar assign = require('./Object.assign');\nvar warning = require('fbjs/lib/warning');\n\nvar valueContextKey = '__ReactDOMSelect_value$' + Math.random().toString(36).slice(2);\n\nfunction updateOptionsIfPendingUpdateAndMounted() {\n if (this._rootNodeID && this._wrapperState.pendingUpdate) {\n this._wrapperState.pendingUpdate = false;\n\n var props = this._currentElement.props;\n var value = LinkedValueUtils.getValue(props);\n\n if (value != null) {\n updateOptions(this, props, value);\n }\n }\n}\n\nfunction getDeclarationErrorAddendum(owner) {\n if (owner) {\n var name = owner.getName();\n if (name) {\n return ' Check the render method of `' + name + '`.';\n }\n }\n return '';\n}\n\nvar valuePropNames = ['value', 'defaultValue'];\n\n/**\n * Validation function for `value` and `defaultValue`.\n * @private\n */\nfunction checkSelectPropTypes(inst, props) {\n var owner = inst._currentElement._owner;\n LinkedValueUtils.checkPropTypes('select', props, owner);\n\n for (var i = 0; i < valuePropNames.length; i++) {\n var propName = valuePropNames[i];\n if (props[propName] == null) {\n continue;\n }\n if (props.multiple) {\n process.env.NODE_ENV !== 'production' ? warning(Array.isArray(props[propName]), 'The `%s` prop supplied to <select> must be an array if ' + '`multiple` is true.%s', propName, getDeclarationErrorAddendum(owner)) : undefined;\n } else {\n process.env.NODE_ENV !== 'production' ? warning(!Array.isArray(props[propName]), 'The `%s` prop supplied to <select> must be a scalar ' + 'value if `multiple` is false.%s', propName, getDeclarationErrorAddendum(owner)) : undefined;\n }\n }\n}\n\n/**\n * @param {ReactDOMComponent} inst\n * @param {boolean} multiple\n * @param {*} propValue A stringable (with `multiple`, a list of stringables).\n * @private\n */\nfunction updateOptions(inst, multiple, propValue) {\n var selectedValue, i;\n var options = ReactMount.getNode(inst._rootNodeID).options;\n\n if (multiple) {\n selectedValue = {};\n for (i = 0; i < propValue.length; i++) {\n selectedValue['' + propValue[i]] = true;\n }\n for (i = 0; i < options.length; i++) {\n var selected = selectedValue.hasOwnProperty(options[i].value);\n if (options[i].selected !== selected) {\n options[i].selected = selected;\n }\n }\n } else {\n // Do not set `select.value` as exact behavior isn't consistent across all\n // browsers for all cases.\n selectedValue = '' + propValue;\n for (i = 0; i < options.length; i++) {\n if (options[i].value === selectedValue) {\n options[i].selected = true;\n return;\n }\n }\n if (options.length) {\n options[0].selected = true;\n }\n }\n}\n\n/**\n * Implements a <select> native component that allows optionally setting the\n * props `value` and `defaultValue`. If `multiple` is false, the prop must be a\n * stringable. If `multiple` is true, the prop must be an array of stringables.\n *\n * If `value` is not supplied (or null/undefined), user actions that change the\n * selected option will trigger updates to the rendered options.\n *\n * If it is supplied (and not null/undefined), the rendered options will not\n * update in response to user actions. Instead, the `value` prop must change in\n * order for the rendered options to update.\n *\n * If `defaultValue` is provided, any options with the supplied values will be\n * selected.\n */\nvar ReactDOMSelect = {\n valueContextKey: valueContextKey,\n\n getNativeProps: function (inst, props, context) {\n return assign({}, props, {\n onChange: inst._wrapperState.onChange,\n value: undefined\n });\n },\n\n mountWrapper: function (inst, props) {\n if (process.env.NODE_ENV !== 'production') {\n checkSelectPropTypes(inst, props);\n }\n\n var value = LinkedValueUtils.getValue(props);\n inst._wrapperState = {\n pendingUpdate: false,\n initialValue: value != null ? value : props.defaultValue,\n onChange: _handleChange.bind(inst),\n wasMultiple: Boolean(props.multiple)\n };\n },\n\n processChildContext: function (inst, props, context) {\n // Pass down initial value so initial generated markup has correct\n // `selected` attributes\n var childContext = assign({}, context);\n childContext[valueContextKey] = inst._wrapperState.initialValue;\n return childContext;\n },\n\n postUpdateWrapper: function (inst) {\n var props = inst._currentElement.props;\n\n // After the initial mount, we control selected-ness manually so don't pass\n // the context value down\n inst._wrapperState.initialValue = undefined;\n\n var wasMultiple = inst._wrapperState.wasMultiple;\n inst._wrapperState.wasMultiple = Boolean(props.multiple);\n\n var value = LinkedValueUtils.getValue(props);\n if (value != null) {\n inst._wrapperState.pendingUpdate = false;\n updateOptions(inst, Boolean(props.multiple), value);\n } else if (wasMultiple !== Boolean(props.multiple)) {\n // For simplicity, reapply `defaultValue` if `multiple` is toggled.\n if (props.defaultValue != null) {\n updateOptions(inst, Boolean(props.multiple), props.defaultValue);\n } else {\n // Revert the select back to its default unselected state.\n updateOptions(inst, Boolean(props.multiple), props.multiple ? [] : '');\n }\n }\n }\n};\n\nfunction _handleChange(event) {\n var props = this._currentElement.props;\n var returnValue = LinkedValueUtils.executeOnChange(props, event);\n\n this._wrapperState.pendingUpdate = true;\n ReactUpdates.asap(updateOptionsIfPendingUpdateAndMounted, this);\n return returnValue;\n}\n\nmodule.exports = ReactDOMSelect;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactDOMSelect.js\n ** module id = 111\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactDOMTextarea\n */\n\n'use strict';\n\nvar LinkedValueUtils = require('./LinkedValueUtils');\nvar ReactDOMIDOperations = require('./ReactDOMIDOperations');\nvar ReactUpdates = require('./ReactUpdates');\n\nvar assign = require('./Object.assign');\nvar invariant = require('fbjs/lib/invariant');\nvar warning = require('fbjs/lib/warning');\n\nfunction forceUpdateIfMounted() {\n if (this._rootNodeID) {\n // DOM component is still mounted; update\n ReactDOMTextarea.updateWrapper(this);\n }\n}\n\n/**\n * Implements a <textarea> native component that allows setting `value`, and\n * `defaultValue`. This differs from the traditional DOM API because value is\n * usually set as PCDATA children.\n *\n * If `value` is not supplied (or null/undefined), user actions that affect the\n * value will trigger updates to the element.\n *\n * If `value` is supplied (and not null/undefined), the rendered element will\n * not trigger updates to the element. Instead, the `value` prop must change in\n * order for the rendered element to be updated.\n *\n * The rendered element will be initialized with an empty value, the prop\n * `defaultValue` if specified, or the children content (deprecated).\n */\nvar ReactDOMTextarea = {\n getNativeProps: function (inst, props, context) {\n !(props.dangerouslySetInnerHTML == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, '`dangerouslySetInnerHTML` does not make sense on <textarea>.') : invariant(false) : undefined;\n\n // Always set children to the same thing. In IE9, the selection range will\n // get reset if `textContent` is mutated.\n var nativeProps = assign({}, props, {\n defaultValue: undefined,\n value: undefined,\n children: inst._wrapperState.initialValue,\n onChange: inst._wrapperState.onChange\n });\n\n return nativeProps;\n },\n\n mountWrapper: function (inst, props) {\n if (process.env.NODE_ENV !== 'production') {\n LinkedValueUtils.checkPropTypes('textarea', props, inst._currentElement._owner);\n }\n\n var defaultValue = props.defaultValue;\n // TODO (yungsters): Remove support for children content in <textarea>.\n var children = props.children;\n if (children != null) {\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(false, 'Use the `defaultValue` or `value` props instead of setting ' + 'children on <textarea>.') : undefined;\n }\n !(defaultValue == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'If you supply `defaultValue` on a <textarea>, do not pass children.') : invariant(false) : undefined;\n if (Array.isArray(children)) {\n !(children.length <= 1) ? process.env.NODE_ENV !== 'production' ? invariant(false, '<textarea> can only have at most one child.') : invariant(false) : undefined;\n children = children[0];\n }\n\n defaultValue = '' + children;\n }\n if (defaultValue == null) {\n defaultValue = '';\n }\n var value = LinkedValueUtils.getValue(props);\n\n inst._wrapperState = {\n // We save the initial value so that `ReactDOMComponent` doesn't update\n // `textContent` (unnecessary since we update value).\n // The initial value can be a boolean or object so that's why it's\n // forced to be a string.\n initialValue: '' + (value != null ? value : defaultValue),\n onChange: _handleChange.bind(inst)\n };\n },\n\n updateWrapper: function (inst) {\n var props = inst._currentElement.props;\n var value = LinkedValueUtils.getValue(props);\n if (value != null) {\n // Cast `value` to a string to ensure the value is set correctly. While\n // browsers typically do this as necessary, jsdom doesn't.\n ReactDOMIDOperations.updatePropertyByID(inst._rootNodeID, 'value', '' + value);\n }\n }\n};\n\nfunction _handleChange(event) {\n var props = this._currentElement.props;\n var returnValue = LinkedValueUtils.executeOnChange(props, event);\n ReactUpdates.asap(forceUpdateIfMounted, this);\n return returnValue;\n}\n\nmodule.exports = ReactDOMTextarea;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactDOMTextarea.js\n ** module id = 112\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactMultiChild\n * @typechecks static-only\n */\n\n'use strict';\n\nvar ReactComponentEnvironment = require('./ReactComponentEnvironment');\nvar ReactMultiChildUpdateTypes = require('./ReactMultiChildUpdateTypes');\n\nvar ReactCurrentOwner = require('./ReactCurrentOwner');\nvar ReactReconciler = require('./ReactReconciler');\nvar ReactChildReconciler = require('./ReactChildReconciler');\n\nvar flattenChildren = require('./flattenChildren');\n\n/**\n * Updating children of a component may trigger recursive updates. The depth is\n * used to batch recursive updates to render markup more efficiently.\n *\n * @type {number}\n * @private\n */\nvar updateDepth = 0;\n\n/**\n * Queue of update configuration objects.\n *\n * Each object has a `type` property that is in `ReactMultiChildUpdateTypes`.\n *\n * @type {array<object>}\n * @private\n */\nvar updateQueue = [];\n\n/**\n * Queue of markup to be rendered.\n *\n * @type {array<string>}\n * @private\n */\nvar markupQueue = [];\n\n/**\n * Enqueues markup to be rendered and inserted at a supplied index.\n *\n * @param {string} parentID ID of the parent component.\n * @param {string} markup Markup that renders into an element.\n * @param {number} toIndex Destination index.\n * @private\n */\nfunction enqueueInsertMarkup(parentID, markup, toIndex) {\n // NOTE: Null values reduce hidden classes.\n updateQueue.push({\n parentID: parentID,\n parentNode: null,\n type: ReactMultiChildUpdateTypes.INSERT_MARKUP,\n markupIndex: markupQueue.push(markup) - 1,\n content: null,\n fromIndex: null,\n toIndex: toIndex\n });\n}\n\n/**\n * Enqueues moving an existing element to another index.\n *\n * @param {string} parentID ID of the parent component.\n * @param {number} fromIndex Source index of the existing element.\n * @param {number} toIndex Destination index of the element.\n * @private\n */\nfunction enqueueMove(parentID, fromIndex, toIndex) {\n // NOTE: Null values reduce hidden classes.\n updateQueue.push({\n parentID: parentID,\n parentNode: null,\n type: ReactMultiChildUpdateTypes.MOVE_EXISTING,\n markupIndex: null,\n content: null,\n fromIndex: fromIndex,\n toIndex: toIndex\n });\n}\n\n/**\n * Enqueues removing an element at an index.\n *\n * @param {string} parentID ID of the parent component.\n * @param {number} fromIndex Index of the element to remove.\n * @private\n */\nfunction enqueueRemove(parentID, fromIndex) {\n // NOTE: Null values reduce hidden classes.\n updateQueue.push({\n parentID: parentID,\n parentNode: null,\n type: ReactMultiChildUpdateTypes.REMOVE_NODE,\n markupIndex: null,\n content: null,\n fromIndex: fromIndex,\n toIndex: null\n });\n}\n\n/**\n * Enqueues setting the markup of a node.\n *\n * @param {string} parentID ID of the parent component.\n * @param {string} markup Markup that renders into an element.\n * @private\n */\nfunction enqueueSetMarkup(parentID, markup) {\n // NOTE: Null values reduce hidden classes.\n updateQueue.push({\n parentID: parentID,\n parentNode: null,\n type: ReactMultiChildUpdateTypes.SET_MARKUP,\n markupIndex: null,\n content: markup,\n fromIndex: null,\n toIndex: null\n });\n}\n\n/**\n * Enqueues setting the text content.\n *\n * @param {string} parentID ID of the parent component.\n * @param {string} textContent Text content to set.\n * @private\n */\nfunction enqueueTextContent(parentID, textContent) {\n // NOTE: Null values reduce hidden classes.\n updateQueue.push({\n parentID: parentID,\n parentNode: null,\n type: ReactMultiChildUpdateTypes.TEXT_CONTENT,\n markupIndex: null,\n content: textContent,\n fromIndex: null,\n toIndex: null\n });\n}\n\n/**\n * Processes any enqueued updates.\n *\n * @private\n */\nfunction processQueue() {\n if (updateQueue.length) {\n ReactComponentEnvironment.processChildrenUpdates(updateQueue, markupQueue);\n clearQueue();\n }\n}\n\n/**\n * Clears any enqueued updates.\n *\n * @private\n */\nfunction clearQueue() {\n updateQueue.length = 0;\n markupQueue.length = 0;\n}\n\n/**\n * ReactMultiChild are capable of reconciling multiple children.\n *\n * @class ReactMultiChild\n * @internal\n */\nvar ReactMultiChild = {\n\n /**\n * Provides common functionality for components that must reconcile multiple\n * children. This is used by `ReactDOMComponent` to mount, update, and\n * unmount child components.\n *\n * @lends {ReactMultiChild.prototype}\n */\n Mixin: {\n\n _reconcilerInstantiateChildren: function (nestedChildren, transaction, context) {\n if (process.env.NODE_ENV !== 'production') {\n if (this._currentElement) {\n try {\n ReactCurrentOwner.current = this._currentElement._owner;\n return ReactChildReconciler.instantiateChildren(nestedChildren, transaction, context);\n } finally {\n ReactCurrentOwner.current = null;\n }\n }\n }\n return ReactChildReconciler.instantiateChildren(nestedChildren, transaction, context);\n },\n\n _reconcilerUpdateChildren: function (prevChildren, nextNestedChildrenElements, transaction, context) {\n var nextChildren;\n if (process.env.NODE_ENV !== 'production') {\n if (this._currentElement) {\n try {\n ReactCurrentOwner.current = this._currentElement._owner;\n nextChildren = flattenChildren(nextNestedChildrenElements);\n } finally {\n ReactCurrentOwner.current = null;\n }\n return ReactChildReconciler.updateChildren(prevChildren, nextChildren, transaction, context);\n }\n }\n nextChildren = flattenChildren(nextNestedChildrenElements);\n return ReactChildReconciler.updateChildren(prevChildren, nextChildren, transaction, context);\n },\n\n /**\n * Generates a \"mount image\" for each of the supplied children. In the case\n * of `ReactDOMComponent`, a mount image is a string of markup.\n *\n * @param {?object} nestedChildren Nested child maps.\n * @return {array} An array of mounted representations.\n * @internal\n */\n mountChildren: function (nestedChildren, transaction, context) {\n var children = this._reconcilerInstantiateChildren(nestedChildren, transaction, context);\n this._renderedChildren = children;\n var mountImages = [];\n var index = 0;\n for (var name in children) {\n if (children.hasOwnProperty(name)) {\n var child = children[name];\n // Inlined for performance, see `ReactInstanceHandles.createReactID`.\n var rootID = this._rootNodeID + name;\n var mountImage = ReactReconciler.mountComponent(child, rootID, transaction, context);\n child._mountIndex = index++;\n mountImages.push(mountImage);\n }\n }\n return mountImages;\n },\n\n /**\n * Replaces any rendered children with a text content string.\n *\n * @param {string} nextContent String of content.\n * @internal\n */\n updateTextContent: function (nextContent) {\n updateDepth++;\n var errorThrown = true;\n try {\n var prevChildren = this._renderedChildren;\n // Remove any rendered children.\n ReactChildReconciler.unmountChildren(prevChildren);\n // TODO: The setTextContent operation should be enough\n for (var name in prevChildren) {\n if (prevChildren.hasOwnProperty(name)) {\n this._unmountChild(prevChildren[name]);\n }\n }\n // Set new text content.\n this.setTextContent(nextContent);\n errorThrown = false;\n } finally {\n updateDepth--;\n if (!updateDepth) {\n if (errorThrown) {\n clearQueue();\n } else {\n processQueue();\n }\n }\n }\n },\n\n /**\n * Replaces any rendered children with a markup string.\n *\n * @param {string} nextMarkup String of markup.\n * @internal\n */\n updateMarkup: function (nextMarkup) {\n updateDepth++;\n var errorThrown = true;\n try {\n var prevChildren = this._renderedChildren;\n // Remove any rendered children.\n ReactChildReconciler.unmountChildren(prevChildren);\n for (var name in prevChildren) {\n if (prevChildren.hasOwnProperty(name)) {\n this._unmountChildByName(prevChildren[name], name);\n }\n }\n this.setMarkup(nextMarkup);\n errorThrown = false;\n } finally {\n updateDepth--;\n if (!updateDepth) {\n if (errorThrown) {\n clearQueue();\n } else {\n processQueue();\n }\n }\n }\n },\n\n /**\n * Updates the rendered children with new children.\n *\n * @param {?object} nextNestedChildrenElements Nested child element maps.\n * @param {ReactReconcileTransaction} transaction\n * @internal\n */\n updateChildren: function (nextNestedChildrenElements, transaction, context) {\n updateDepth++;\n var errorThrown = true;\n try {\n this._updateChildren(nextNestedChildrenElements, transaction, context);\n errorThrown = false;\n } finally {\n updateDepth--;\n if (!updateDepth) {\n if (errorThrown) {\n clearQueue();\n } else {\n processQueue();\n }\n }\n }\n },\n\n /**\n * Improve performance by isolating this hot code path from the try/catch\n * block in `updateChildren`.\n *\n * @param {?object} nextNestedChildrenElements Nested child element maps.\n * @param {ReactReconcileTransaction} transaction\n * @final\n * @protected\n */\n _updateChildren: function (nextNestedChildrenElements, transaction, context) {\n var prevChildren = this._renderedChildren;\n var nextChildren = this._reconcilerUpdateChildren(prevChildren, nextNestedChildrenElements, transaction, context);\n this._renderedChildren = nextChildren;\n if (!nextChildren && !prevChildren) {\n return;\n }\n var name;\n // `nextIndex` will increment for each child in `nextChildren`, but\n // `lastIndex` will be the last index visited in `prevChildren`.\n var lastIndex = 0;\n var nextIndex = 0;\n for (name in nextChildren) {\n if (!nextChildren.hasOwnProperty(name)) {\n continue;\n }\n var prevChild = prevChildren && prevChildren[name];\n var nextChild = nextChildren[name];\n if (prevChild === nextChild) {\n this.moveChild(prevChild, nextIndex, lastIndex);\n lastIndex = Math.max(prevChild._mountIndex, lastIndex);\n prevChild._mountIndex = nextIndex;\n } else {\n if (prevChild) {\n // Update `lastIndex` before `_mountIndex` gets unset by unmounting.\n lastIndex = Math.max(prevChild._mountIndex, lastIndex);\n this._unmountChild(prevChild);\n }\n // The child must be instantiated before it's mounted.\n this._mountChildByNameAtIndex(nextChild, name, nextIndex, transaction, context);\n }\n nextIndex++;\n }\n // Remove children that are no longer present.\n for (name in prevChildren) {\n if (prevChildren.hasOwnProperty(name) && !(nextChildren && nextChildren.hasOwnProperty(name))) {\n this._unmountChild(prevChildren[name]);\n }\n }\n },\n\n /**\n * Unmounts all rendered children. This should be used to clean up children\n * when this component is unmounted.\n *\n * @internal\n */\n unmountChildren: function () {\n var renderedChildren = this._renderedChildren;\n ReactChildReconciler.unmountChildren(renderedChildren);\n this._renderedChildren = null;\n },\n\n /**\n * Moves a child component to the supplied index.\n *\n * @param {ReactComponent} child Component to move.\n * @param {number} toIndex Destination index of the element.\n * @param {number} lastIndex Last index visited of the siblings of `child`.\n * @protected\n */\n moveChild: function (child, toIndex, lastIndex) {\n // If the index of `child` is less than `lastIndex`, then it needs to\n // be moved. Otherwise, we do not need to move it because a child will be\n // inserted or moved before `child`.\n if (child._mountIndex < lastIndex) {\n enqueueMove(this._rootNodeID, child._mountIndex, toIndex);\n }\n },\n\n /**\n * Creates a child component.\n *\n * @param {ReactComponent} child Component to create.\n * @param {string} mountImage Markup to insert.\n * @protected\n */\n createChild: function (child, mountImage) {\n enqueueInsertMarkup(this._rootNodeID, mountImage, child._mountIndex);\n },\n\n /**\n * Removes a child component.\n *\n * @param {ReactComponent} child Child to remove.\n * @protected\n */\n removeChild: function (child) {\n enqueueRemove(this._rootNodeID, child._mountIndex);\n },\n\n /**\n * Sets this text content string.\n *\n * @param {string} textContent Text content to set.\n * @protected\n */\n setTextContent: function (textContent) {\n enqueueTextContent(this._rootNodeID, textContent);\n },\n\n /**\n * Sets this markup string.\n *\n * @param {string} markup Markup to set.\n * @protected\n */\n setMarkup: function (markup) {\n enqueueSetMarkup(this._rootNodeID, markup);\n },\n\n /**\n * Mounts a child with the supplied name.\n *\n * NOTE: This is part of `updateChildren` and is here for readability.\n *\n * @param {ReactComponent} child Component to mount.\n * @param {string} name Name of the child.\n * @param {number} index Index at which to insert the child.\n * @param {ReactReconcileTransaction} transaction\n * @private\n */\n _mountChildByNameAtIndex: function (child, name, index, transaction, context) {\n // Inlined for performance, see `ReactInstanceHandles.createReactID`.\n var rootID = this._rootNodeID + name;\n var mountImage = ReactReconciler.mountComponent(child, rootID, transaction, context);\n child._mountIndex = index;\n this.createChild(child, mountImage);\n },\n\n /**\n * Unmounts a rendered child.\n *\n * NOTE: This is part of `updateChildren` and is here for readability.\n *\n * @param {ReactComponent} child Component to unmount.\n * @private\n */\n _unmountChild: function (child) {\n this.removeChild(child);\n child._mountIndex = null;\n }\n\n }\n\n};\n\nmodule.exports = ReactMultiChild;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactMultiChild.js\n ** module id = 113\n ** module chunks = 0 1\n **/","/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactChildReconciler\n * @typechecks static-only\n */\n\n'use strict';\n\nvar ReactReconciler = require('./ReactReconciler');\n\nvar instantiateReactComponent = require('./instantiateReactComponent');\nvar shouldUpdateReactComponent = require('./shouldUpdateReactComponent');\nvar traverseAllChildren = require('./traverseAllChildren');\nvar warning = require('fbjs/lib/warning');\n\nfunction instantiateChild(childInstances, child, name) {\n // We found a component instance.\n var keyUnique = childInstances[name] === undefined;\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(keyUnique, 'flattenChildren(...): Encountered two children with the same key, ' + '`%s`. Child keys must be unique; when two children share a key, only ' + 'the first child will be used.', name) : undefined;\n }\n if (child != null && keyUnique) {\n childInstances[name] = instantiateReactComponent(child, null);\n }\n}\n\n/**\n * ReactChildReconciler provides helpers for initializing or updating a set of\n * children. Its output is suitable for passing it onto ReactMultiChild which\n * does diffed reordering and insertion.\n */\nvar ReactChildReconciler = {\n /**\n * Generates a \"mount image\" for each of the supplied children. In the case\n * of `ReactDOMComponent`, a mount image is a string of markup.\n *\n * @param {?object} nestedChildNodes Nested child maps.\n * @return {?object} A set of child instances.\n * @internal\n */\n instantiateChildren: function (nestedChildNodes, transaction, context) {\n if (nestedChildNodes == null) {\n return null;\n }\n var childInstances = {};\n traverseAllChildren(nestedChildNodes, instantiateChild, childInstances);\n return childInstances;\n },\n\n /**\n * Updates the rendered children and returns a new set of children.\n *\n * @param {?object} prevChildren Previously initialized set of children.\n * @param {?object} nextChildren Flat child element maps.\n * @param {ReactReconcileTransaction} transaction\n * @param {object} context\n * @return {?object} A new set of child instances.\n * @internal\n */\n updateChildren: function (prevChildren, nextChildren, transaction, context) {\n // We currently don't have a way to track moves here but if we use iterators\n // instead of for..in we can zip the iterators and check if an item has\n // moved.\n // TODO: If nothing has changed, return the prevChildren object so that we\n // can quickly bailout if nothing has changed.\n if (!nextChildren && !prevChildren) {\n return null;\n }\n var name;\n for (name in nextChildren) {\n if (!nextChildren.hasOwnProperty(name)) {\n continue;\n }\n var prevChild = prevChildren && prevChildren[name];\n var prevElement = prevChild && prevChild._currentElement;\n var nextElement = nextChildren[name];\n if (prevChild != null && shouldUpdateReactComponent(prevElement, nextElement)) {\n ReactReconciler.receiveComponent(prevChild, nextElement, transaction, context);\n nextChildren[name] = prevChild;\n } else {\n if (prevChild) {\n ReactReconciler.unmountComponent(prevChild, name);\n }\n // The child must be instantiated before it's mounted.\n var nextChildInstance = instantiateReactComponent(nextElement, null);\n nextChildren[name] = nextChildInstance;\n }\n }\n // Unmount children that are no longer present.\n for (name in prevChildren) {\n if (prevChildren.hasOwnProperty(name) && !(nextChildren && nextChildren.hasOwnProperty(name))) {\n ReactReconciler.unmountComponent(prevChildren[name]);\n }\n }\n return nextChildren;\n },\n\n /**\n * Unmounts all rendered children. This should be used to clean up children\n * when this component is unmounted.\n *\n * @param {?object} renderedChildren Previously initialized set of children.\n * @internal\n */\n unmountChildren: function (renderedChildren) {\n for (var name in renderedChildren) {\n if (renderedChildren.hasOwnProperty(name)) {\n var renderedChild = renderedChildren[name];\n ReactReconciler.unmountComponent(renderedChild);\n }\n }\n }\n\n};\n\nmodule.exports = ReactChildReconciler;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactChildReconciler.js\n ** module id = 114\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule flattenChildren\n */\n\n'use strict';\n\nvar traverseAllChildren = require('./traverseAllChildren');\nvar warning = require('fbjs/lib/warning');\n\n/**\n * @param {function} traverseContext Context passed through traversal.\n * @param {?ReactComponent} child React child component.\n * @param {!string} name String name of key path to child.\n */\nfunction flattenSingleChildIntoContext(traverseContext, child, name) {\n // We found a component instance.\n var result = traverseContext;\n var keyUnique = result[name] === undefined;\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(keyUnique, 'flattenChildren(...): Encountered two children with the same key, ' + '`%s`. Child keys must be unique; when two children share a key, only ' + 'the first child will be used.', name) : undefined;\n }\n if (keyUnique && child != null) {\n result[name] = child;\n }\n}\n\n/**\n * Flattens children that are typically specified as `props.children`. Any null\n * children will not be included in the resulting object.\n * @return {!object} flattened children keyed by name.\n */\nfunction flattenChildren(children) {\n if (children == null) {\n return children;\n }\n var result = {};\n traverseAllChildren(children, flattenSingleChildIntoContext, result);\n return result;\n}\n\nmodule.exports = flattenChildren;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/flattenChildren.js\n ** module id = 115\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule shallowEqual\n * @typechecks\n * \n */\n\n'use strict';\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\n/**\n * Performs equality by iterating through keys on an object and returning false\n * when any key has values which are not strictly equal between the arguments.\n * Returns true when the values of all keys are strictly equal.\n */\nfunction shallowEqual(objA, objB) {\n if (objA === objB) {\n return true;\n }\n\n if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {\n return false;\n }\n\n var keysA = Object.keys(objA);\n var keysB = Object.keys(objB);\n\n if (keysA.length !== keysB.length) {\n return false;\n }\n\n // Test for A's keys different from B.\n var bHasOwnProperty = hasOwnProperty.bind(objB);\n for (var i = 0; i < keysA.length; i++) {\n if (!bHasOwnProperty(keysA[i]) || objA[keysA[i]] !== objB[keysA[i]]) {\n return false;\n }\n }\n\n return true;\n}\n\nmodule.exports = shallowEqual;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/shallowEqual.js\n ** module id = 116\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactEventListener\n * @typechecks static-only\n */\n\n'use strict';\n\nvar EventListener = require('fbjs/lib/EventListener');\nvar ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');\nvar PooledClass = require('./PooledClass');\nvar ReactInstanceHandles = require('./ReactInstanceHandles');\nvar ReactMount = require('./ReactMount');\nvar ReactUpdates = require('./ReactUpdates');\n\nvar assign = require('./Object.assign');\nvar getEventTarget = require('./getEventTarget');\nvar getUnboundedScrollPosition = require('fbjs/lib/getUnboundedScrollPosition');\n\nvar DOCUMENT_FRAGMENT_NODE_TYPE = 11;\n\n/**\n * Finds the parent React component of `node`.\n *\n * @param {*} node\n * @return {?DOMEventTarget} Parent container, or `null` if the specified node\n * is not nested.\n */\nfunction findParent(node) {\n // TODO: It may be a good idea to cache this to prevent unnecessary DOM\n // traversal, but caching is difficult to do correctly without using a\n // mutation observer to listen for all DOM changes.\n var nodeID = ReactMount.getID(node);\n var rootID = ReactInstanceHandles.getReactRootIDFromNodeID(nodeID);\n var container = ReactMount.findReactContainerForID(rootID);\n var parent = ReactMount.getFirstReactDOM(container);\n return parent;\n}\n\n// Used to store ancestor hierarchy in top level callback\nfunction TopLevelCallbackBookKeeping(topLevelType, nativeEvent) {\n this.topLevelType = topLevelType;\n this.nativeEvent = nativeEvent;\n this.ancestors = [];\n}\nassign(TopLevelCallbackBookKeeping.prototype, {\n destructor: function () {\n this.topLevelType = null;\n this.nativeEvent = null;\n this.ancestors.length = 0;\n }\n});\nPooledClass.addPoolingTo(TopLevelCallbackBookKeeping, PooledClass.twoArgumentPooler);\n\nfunction handleTopLevelImpl(bookKeeping) {\n // TODO: Re-enable event.path handling\n //\n // if (bookKeeping.nativeEvent.path && bookKeeping.nativeEvent.path.length > 1) {\n // // New browsers have a path attribute on native events\n // handleTopLevelWithPath(bookKeeping);\n // } else {\n // // Legacy browsers don't have a path attribute on native events\n // handleTopLevelWithoutPath(bookKeeping);\n // }\n\n void handleTopLevelWithPath; // temporarily unused\n handleTopLevelWithoutPath(bookKeeping);\n}\n\n// Legacy browsers don't have a path attribute on native events\nfunction handleTopLevelWithoutPath(bookKeeping) {\n var topLevelTarget = ReactMount.getFirstReactDOM(getEventTarget(bookKeeping.nativeEvent)) || window;\n\n // Loop through the hierarchy, in case there's any nested components.\n // It's important that we build the array of ancestors before calling any\n // event handlers, because event handlers can modify the DOM, leading to\n // inconsistencies with ReactMount's node cache. See #1105.\n var ancestor = topLevelTarget;\n while (ancestor) {\n bookKeeping.ancestors.push(ancestor);\n ancestor = findParent(ancestor);\n }\n\n for (var i = 0; i < bookKeeping.ancestors.length; i++) {\n topLevelTarget = bookKeeping.ancestors[i];\n var topLevelTargetID = ReactMount.getID(topLevelTarget) || '';\n ReactEventListener._handleTopLevel(bookKeeping.topLevelType, topLevelTarget, topLevelTargetID, bookKeeping.nativeEvent, getEventTarget(bookKeeping.nativeEvent));\n }\n}\n\n// New browsers have a path attribute on native events\nfunction handleTopLevelWithPath(bookKeeping) {\n var path = bookKeeping.nativeEvent.path;\n var currentNativeTarget = path[0];\n var eventsFired = 0;\n for (var i = 0; i < path.length; i++) {\n var currentPathElement = path[i];\n if (currentPathElement.nodeType === DOCUMENT_FRAGMENT_NODE_TYPE) {\n currentNativeTarget = path[i + 1];\n }\n // TODO: slow\n var reactParent = ReactMount.getFirstReactDOM(currentPathElement);\n if (reactParent === currentPathElement) {\n var currentPathElementID = ReactMount.getID(currentPathElement);\n var newRootID = ReactInstanceHandles.getReactRootIDFromNodeID(currentPathElementID);\n bookKeeping.ancestors.push(currentPathElement);\n\n var topLevelTargetID = ReactMount.getID(currentPathElement) || '';\n eventsFired++;\n ReactEventListener._handleTopLevel(bookKeeping.topLevelType, currentPathElement, topLevelTargetID, bookKeeping.nativeEvent, currentNativeTarget);\n\n // Jump to the root of this React render tree\n while (currentPathElementID !== newRootID) {\n i++;\n currentPathElement = path[i];\n currentPathElementID = ReactMount.getID(currentPathElement);\n }\n }\n }\n if (eventsFired === 0) {\n ReactEventListener._handleTopLevel(bookKeeping.topLevelType, window, '', bookKeeping.nativeEvent, getEventTarget(bookKeeping.nativeEvent));\n }\n}\n\nfunction scrollValueMonitor(cb) {\n var scrollPosition = getUnboundedScrollPosition(window);\n cb(scrollPosition);\n}\n\nvar ReactEventListener = {\n _enabled: true,\n _handleTopLevel: null,\n\n WINDOW_HANDLE: ExecutionEnvironment.canUseDOM ? window : null,\n\n setHandleTopLevel: function (handleTopLevel) {\n ReactEventListener._handleTopLevel = handleTopLevel;\n },\n\n setEnabled: function (enabled) {\n ReactEventListener._enabled = !!enabled;\n },\n\n isEnabled: function () {\n return ReactEventListener._enabled;\n },\n\n /**\n * Traps top-level events by using event bubbling.\n *\n * @param {string} topLevelType Record from `EventConstants`.\n * @param {string} handlerBaseName Event name (e.g. \"click\").\n * @param {object} handle Element on which to attach listener.\n * @return {?object} An object with a remove function which will forcefully\n * remove the listener.\n * @internal\n */\n trapBubbledEvent: function (topLevelType, handlerBaseName, handle) {\n var element = handle;\n if (!element) {\n return null;\n }\n return EventListener.listen(element, handlerBaseName, ReactEventListener.dispatchEvent.bind(null, topLevelType));\n },\n\n /**\n * Traps a top-level event by using event capturing.\n *\n * @param {string} topLevelType Record from `EventConstants`.\n * @param {string} handlerBaseName Event name (e.g. \"click\").\n * @param {object} handle Element on which to attach listener.\n * @return {?object} An object with a remove function which will forcefully\n * remove the listener.\n * @internal\n */\n trapCapturedEvent: function (topLevelType, handlerBaseName, handle) {\n var element = handle;\n if (!element) {\n return null;\n }\n return EventListener.capture(element, handlerBaseName, ReactEventListener.dispatchEvent.bind(null, topLevelType));\n },\n\n monitorScrollValue: function (refresh) {\n var callback = scrollValueMonitor.bind(null, refresh);\n EventListener.listen(window, 'scroll', callback);\n },\n\n dispatchEvent: function (topLevelType, nativeEvent) {\n if (!ReactEventListener._enabled) {\n return;\n }\n\n var bookKeeping = TopLevelCallbackBookKeeping.getPooled(topLevelType, nativeEvent);\n try {\n // Event queue being processed in the same cycle allows\n // `preventDefault`.\n ReactUpdates.batchedUpdates(handleTopLevelImpl, bookKeeping);\n } finally {\n TopLevelCallbackBookKeeping.release(bookKeeping);\n }\n }\n};\n\nmodule.exports = ReactEventListener;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactEventListener.js\n ** module id = 117\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @providesModule EventListener\n * @typechecks\n */\n\n'use strict';\n\nvar emptyFunction = require('./emptyFunction');\n\n/**\n * Upstream version of event listener. Does not take into account specific\n * nature of platform.\n */\nvar EventListener = {\n /**\n * Listen to DOM events during the bubble phase.\n *\n * @param {DOMEventTarget} target DOM element to register listener on.\n * @param {string} eventType Event type, e.g. 'click' or 'mouseover'.\n * @param {function} callback Callback function.\n * @return {object} Object with a `remove` method.\n */\n listen: function (target, eventType, callback) {\n if (target.addEventListener) {\n target.addEventListener(eventType, callback, false);\n return {\n remove: function () {\n target.removeEventListener(eventType, callback, false);\n }\n };\n } else if (target.attachEvent) {\n target.attachEvent('on' + eventType, callback);\n return {\n remove: function () {\n target.detachEvent('on' + eventType, callback);\n }\n };\n }\n },\n\n /**\n * Listen to DOM events during the capture phase.\n *\n * @param {DOMEventTarget} target DOM element to register listener on.\n * @param {string} eventType Event type, e.g. 'click' or 'mouseover'.\n * @param {function} callback Callback function.\n * @return {object} Object with a `remove` method.\n */\n capture: function (target, eventType, callback) {\n if (target.addEventListener) {\n target.addEventListener(eventType, callback, true);\n return {\n remove: function () {\n target.removeEventListener(eventType, callback, true);\n }\n };\n } else {\n if (process.env.NODE_ENV !== 'production') {\n console.error('Attempted to listen to events during the capture phase on a ' + 'browser that does not support the capture phase. Your application ' + 'will not receive some events.');\n }\n return {\n remove: emptyFunction\n };\n }\n },\n\n registerDefault: function () {}\n};\n\nmodule.exports = EventListener;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/EventListener.js\n ** module id = 118\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule getUnboundedScrollPosition\n * @typechecks\n */\n\n'use strict';\n\n/**\n * Gets the scroll position of the supplied element or window.\n *\n * The return values are unbounded, unlike `getScrollPosition`. This means they\n * may be negative or exceed the element boundaries (which is possible using\n * inertial scrolling).\n *\n * @param {DOMWindow|DOMElement} scrollable\n * @return {object} Map with `x` and `y` keys.\n */\nfunction getUnboundedScrollPosition(scrollable) {\n if (scrollable === window) {\n return {\n x: window.pageXOffset || document.documentElement.scrollLeft,\n y: window.pageYOffset || document.documentElement.scrollTop\n };\n }\n return {\n x: scrollable.scrollLeft,\n y: scrollable.scrollTop\n };\n}\n\nmodule.exports = getUnboundedScrollPosition;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/getUnboundedScrollPosition.js\n ** module id = 119\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactInjection\n */\n\n'use strict';\n\nvar DOMProperty = require('./DOMProperty');\nvar EventPluginHub = require('./EventPluginHub');\nvar ReactComponentEnvironment = require('./ReactComponentEnvironment');\nvar ReactClass = require('./ReactClass');\nvar ReactEmptyComponent = require('./ReactEmptyComponent');\nvar ReactBrowserEventEmitter = require('./ReactBrowserEventEmitter');\nvar ReactNativeComponent = require('./ReactNativeComponent');\nvar ReactPerf = require('./ReactPerf');\nvar ReactRootIndex = require('./ReactRootIndex');\nvar ReactUpdates = require('./ReactUpdates');\n\nvar ReactInjection = {\n Component: ReactComponentEnvironment.injection,\n Class: ReactClass.injection,\n DOMProperty: DOMProperty.injection,\n EmptyComponent: ReactEmptyComponent.injection,\n EventPluginHub: EventPluginHub.injection,\n EventEmitter: ReactBrowserEventEmitter.injection,\n NativeComponent: ReactNativeComponent.injection,\n Perf: ReactPerf.injection,\n RootIndex: ReactRootIndex.injection,\n Updates: ReactUpdates.injection\n};\n\nmodule.exports = ReactInjection;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactInjection.js\n ** module id = 120\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactClass\n */\n\n'use strict';\n\nvar ReactComponent = require('./ReactComponent');\nvar ReactElement = require('./ReactElement');\nvar ReactPropTypeLocations = require('./ReactPropTypeLocations');\nvar ReactPropTypeLocationNames = require('./ReactPropTypeLocationNames');\nvar ReactNoopUpdateQueue = require('./ReactNoopUpdateQueue');\n\nvar assign = require('./Object.assign');\nvar emptyObject = require('fbjs/lib/emptyObject');\nvar invariant = require('fbjs/lib/invariant');\nvar keyMirror = require('fbjs/lib/keyMirror');\nvar keyOf = require('fbjs/lib/keyOf');\nvar warning = require('fbjs/lib/warning');\n\nvar MIXINS_KEY = keyOf({ mixins: null });\n\n/**\n * Policies that describe methods in `ReactClassInterface`.\n */\nvar SpecPolicy = keyMirror({\n /**\n * These methods may be defined only once by the class specification or mixin.\n */\n DEFINE_ONCE: null,\n /**\n * These methods may be defined by both the class specification and mixins.\n * Subsequent definitions will be chained. These methods must return void.\n */\n DEFINE_MANY: null,\n /**\n * These methods are overriding the base class.\n */\n OVERRIDE_BASE: null,\n /**\n * These methods are similar to DEFINE_MANY, except we assume they return\n * objects. We try to merge the keys of the return values of all the mixed in\n * functions. If there is a key conflict we throw.\n */\n DEFINE_MANY_MERGED: null\n});\n\nvar injectedMixins = [];\n\nvar warnedSetProps = false;\nfunction warnSetProps() {\n if (!warnedSetProps) {\n warnedSetProps = true;\n process.env.NODE_ENV !== 'production' ? warning(false, 'setProps(...) and replaceProps(...) are deprecated. ' + 'Instead, call render again at the top level.') : undefined;\n }\n}\n\n/**\n * Composite components are higher-level components that compose other composite\n * or native components.\n *\n * To create a new type of `ReactClass`, pass a specification of\n * your new class to `React.createClass`. The only requirement of your class\n * specification is that you implement a `render` method.\n *\n * var MyComponent = React.createClass({\n * render: function() {\n * return <div>Hello World</div>;\n * }\n * });\n *\n * The class specification supports a specific protocol of methods that have\n * special meaning (e.g. `render`). See `ReactClassInterface` for\n * more the comprehensive protocol. Any other properties and methods in the\n * class specification will be available on the prototype.\n *\n * @interface ReactClassInterface\n * @internal\n */\nvar ReactClassInterface = {\n\n /**\n * An array of Mixin objects to include when defining your component.\n *\n * @type {array}\n * @optional\n */\n mixins: SpecPolicy.DEFINE_MANY,\n\n /**\n * An object containing properties and methods that should be defined on\n * the component's constructor instead of its prototype (static methods).\n *\n * @type {object}\n * @optional\n */\n statics: SpecPolicy.DEFINE_MANY,\n\n /**\n * Definition of prop types for this component.\n *\n * @type {object}\n * @optional\n */\n propTypes: SpecPolicy.DEFINE_MANY,\n\n /**\n * Definition of context types for this component.\n *\n * @type {object}\n * @optional\n */\n contextTypes: SpecPolicy.DEFINE_MANY,\n\n /**\n * Definition of context types this component sets for its children.\n *\n * @type {object}\n * @optional\n */\n childContextTypes: SpecPolicy.DEFINE_MANY,\n\n // ==== Definition methods ====\n\n /**\n * Invoked when the component is mounted. Values in the mapping will be set on\n * `this.props` if that prop is not specified (i.e. using an `in` check).\n *\n * This method is invoked before `getInitialState` and therefore cannot rely\n * on `this.state` or use `this.setState`.\n *\n * @return {object}\n * @optional\n */\n getDefaultProps: SpecPolicy.DEFINE_MANY_MERGED,\n\n /**\n * Invoked once before the component is mounted. The return value will be used\n * as the initial value of `this.state`.\n *\n * getInitialState: function() {\n * return {\n * isOn: false,\n * fooBaz: new BazFoo()\n * }\n * }\n *\n * @return {object}\n * @optional\n */\n getInitialState: SpecPolicy.DEFINE_MANY_MERGED,\n\n /**\n * @return {object}\n * @optional\n */\n getChildContext: SpecPolicy.DEFINE_MANY_MERGED,\n\n /**\n * Uses props from `this.props` and state from `this.state` to render the\n * structure of the component.\n *\n * No guarantees are made about when or how often this method is invoked, so\n * it must not have side effects.\n *\n * render: function() {\n * var name = this.props.name;\n * return <div>Hello, {name}!</div>;\n * }\n *\n * @return {ReactComponent}\n * @nosideeffects\n * @required\n */\n render: SpecPolicy.DEFINE_ONCE,\n\n // ==== Delegate methods ====\n\n /**\n * Invoked when the component is initially created and about to be mounted.\n * This may have side effects, but any external subscriptions or data created\n * by this method must be cleaned up in `componentWillUnmount`.\n *\n * @optional\n */\n componentWillMount: SpecPolicy.DEFINE_MANY,\n\n /**\n * Invoked when the component has been mounted and has a DOM representation.\n * However, there is no guarantee that the DOM node is in the document.\n *\n * Use this as an opportunity to operate on the DOM when the component has\n * been mounted (initialized and rendered) for the first time.\n *\n * @param {DOMElement} rootNode DOM element representing the component.\n * @optional\n */\n componentDidMount: SpecPolicy.DEFINE_MANY,\n\n /**\n * Invoked before the component receives new props.\n *\n * Use this as an opportunity to react to a prop transition by updating the\n * state using `this.setState`. Current props are accessed via `this.props`.\n *\n * componentWillReceiveProps: function(nextProps, nextContext) {\n * this.setState({\n * likesIncreasing: nextProps.likeCount > this.props.likeCount\n * });\n * }\n *\n * NOTE: There is no equivalent `componentWillReceiveState`. An incoming prop\n * transition may cause a state change, but the opposite is not true. If you\n * need it, you are probably looking for `componentWillUpdate`.\n *\n * @param {object} nextProps\n * @optional\n */\n componentWillReceiveProps: SpecPolicy.DEFINE_MANY,\n\n /**\n * Invoked while deciding if the component should be updated as a result of\n * receiving new props, state and/or context.\n *\n * Use this as an opportunity to `return false` when you're certain that the\n * transition to the new props/state/context will not require a component\n * update.\n *\n * shouldComponentUpdate: function(nextProps, nextState, nextContext) {\n * return !equal(nextProps, this.props) ||\n * !equal(nextState, this.state) ||\n * !equal(nextContext, this.context);\n * }\n *\n * @param {object} nextProps\n * @param {?object} nextState\n * @param {?object} nextContext\n * @return {boolean} True if the component should update.\n * @optional\n */\n shouldComponentUpdate: SpecPolicy.DEFINE_ONCE,\n\n /**\n * Invoked when the component is about to update due to a transition from\n * `this.props`, `this.state` and `this.context` to `nextProps`, `nextState`\n * and `nextContext`.\n *\n * Use this as an opportunity to perform preparation before an update occurs.\n *\n * NOTE: You **cannot** use `this.setState()` in this method.\n *\n * @param {object} nextProps\n * @param {?object} nextState\n * @param {?object} nextContext\n * @param {ReactReconcileTransaction} transaction\n * @optional\n */\n componentWillUpdate: SpecPolicy.DEFINE_MANY,\n\n /**\n * Invoked when the component's DOM representation has been updated.\n *\n * Use this as an opportunity to operate on the DOM when the component has\n * been updated.\n *\n * @param {object} prevProps\n * @param {?object} prevState\n * @param {?object} prevContext\n * @param {DOMElement} rootNode DOM element representing the component.\n * @optional\n */\n componentDidUpdate: SpecPolicy.DEFINE_MANY,\n\n /**\n * Invoked when the component is about to be removed from its parent and have\n * its DOM representation destroyed.\n *\n * Use this as an opportunity to deallocate any external resources.\n *\n * NOTE: There is no `componentDidUnmount` since your component will have been\n * destroyed by that point.\n *\n * @optional\n */\n componentWillUnmount: SpecPolicy.DEFINE_MANY,\n\n // ==== Advanced methods ====\n\n /**\n * Updates the component's currently mounted DOM representation.\n *\n * By default, this implements React's rendering and reconciliation algorithm.\n * Sophisticated clients may wish to override this.\n *\n * @param {ReactReconcileTransaction} transaction\n * @internal\n * @overridable\n */\n updateComponent: SpecPolicy.OVERRIDE_BASE\n\n};\n\n/**\n * Mapping from class specification keys to special processing functions.\n *\n * Although these are declared like instance properties in the specification\n * when defining classes using `React.createClass`, they are actually static\n * and are accessible on the constructor instead of the prototype. Despite\n * being static, they must be defined outside of the \"statics\" key under\n * which all other static methods are defined.\n */\nvar RESERVED_SPEC_KEYS = {\n displayName: function (Constructor, displayName) {\n Constructor.displayName = displayName;\n },\n mixins: function (Constructor, mixins) {\n if (mixins) {\n for (var i = 0; i < mixins.length; i++) {\n mixSpecIntoComponent(Constructor, mixins[i]);\n }\n }\n },\n childContextTypes: function (Constructor, childContextTypes) {\n if (process.env.NODE_ENV !== 'production') {\n validateTypeDef(Constructor, childContextTypes, ReactPropTypeLocations.childContext);\n }\n Constructor.childContextTypes = assign({}, Constructor.childContextTypes, childContextTypes);\n },\n contextTypes: function (Constructor, contextTypes) {\n if (process.env.NODE_ENV !== 'production') {\n validateTypeDef(Constructor, contextTypes, ReactPropTypeLocations.context);\n }\n Constructor.contextTypes = assign({}, Constructor.contextTypes, contextTypes);\n },\n /**\n * Special case getDefaultProps which should move into statics but requires\n * automatic merging.\n */\n getDefaultProps: function (Constructor, getDefaultProps) {\n if (Constructor.getDefaultProps) {\n Constructor.getDefaultProps = createMergedResultFunction(Constructor.getDefaultProps, getDefaultProps);\n } else {\n Constructor.getDefaultProps = getDefaultProps;\n }\n },\n propTypes: function (Constructor, propTypes) {\n if (process.env.NODE_ENV !== 'production') {\n validateTypeDef(Constructor, propTypes, ReactPropTypeLocations.prop);\n }\n Constructor.propTypes = assign({}, Constructor.propTypes, propTypes);\n },\n statics: function (Constructor, statics) {\n mixStaticSpecIntoComponent(Constructor, statics);\n },\n autobind: function () {} };\n\n// noop\nfunction validateTypeDef(Constructor, typeDef, location) {\n for (var propName in typeDef) {\n if (typeDef.hasOwnProperty(propName)) {\n // use a warning instead of an invariant so components\n // don't show up in prod but not in __DEV__\n process.env.NODE_ENV !== 'production' ? warning(typeof typeDef[propName] === 'function', '%s: %s type `%s` is invalid; it must be a function, usually from ' + 'React.PropTypes.', Constructor.displayName || 'ReactClass', ReactPropTypeLocationNames[location], propName) : undefined;\n }\n }\n}\n\nfunction validateMethodOverride(proto, name) {\n var specPolicy = ReactClassInterface.hasOwnProperty(name) ? ReactClassInterface[name] : null;\n\n // Disallow overriding of base class methods unless explicitly allowed.\n if (ReactClassMixin.hasOwnProperty(name)) {\n !(specPolicy === SpecPolicy.OVERRIDE_BASE) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClassInterface: You are attempting to override ' + '`%s` from your class specification. Ensure that your method names ' + 'do not overlap with React methods.', name) : invariant(false) : undefined;\n }\n\n // Disallow defining methods more than once unless explicitly allowed.\n if (proto.hasOwnProperty(name)) {\n !(specPolicy === SpecPolicy.DEFINE_MANY || specPolicy === SpecPolicy.DEFINE_MANY_MERGED) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClassInterface: You are attempting to define ' + '`%s` on your component more than once. This conflict may be due ' + 'to a mixin.', name) : invariant(false) : undefined;\n }\n}\n\n/**\n * Mixin helper which handles policy validation and reserved\n * specification keys when building React classses.\n */\nfunction mixSpecIntoComponent(Constructor, spec) {\n if (!spec) {\n return;\n }\n\n !(typeof spec !== 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClass: You\\'re attempting to ' + 'use a component class as a mixin. Instead, just use a regular object.') : invariant(false) : undefined;\n !!ReactElement.isValidElement(spec) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClass: You\\'re attempting to ' + 'use a component as a mixin. Instead, just use a regular object.') : invariant(false) : undefined;\n\n var proto = Constructor.prototype;\n\n // By handling mixins before any other properties, we ensure the same\n // chaining order is applied to methods with DEFINE_MANY policy, whether\n // mixins are listed before or after these methods in the spec.\n if (spec.hasOwnProperty(MIXINS_KEY)) {\n RESERVED_SPEC_KEYS.mixins(Constructor, spec.mixins);\n }\n\n for (var name in spec) {\n if (!spec.hasOwnProperty(name)) {\n continue;\n }\n\n if (name === MIXINS_KEY) {\n // We have already handled mixins in a special case above.\n continue;\n }\n\n var property = spec[name];\n validateMethodOverride(proto, name);\n\n if (RESERVED_SPEC_KEYS.hasOwnProperty(name)) {\n RESERVED_SPEC_KEYS[name](Constructor, property);\n } else {\n // Setup methods on prototype:\n // The following member methods should not be automatically bound:\n // 1. Expected ReactClass methods (in the \"interface\").\n // 2. Overridden methods (that were mixed in).\n var isReactClassMethod = ReactClassInterface.hasOwnProperty(name);\n var isAlreadyDefined = proto.hasOwnProperty(name);\n var isFunction = typeof property === 'function';\n var shouldAutoBind = isFunction && !isReactClassMethod && !isAlreadyDefined && spec.autobind !== false;\n\n if (shouldAutoBind) {\n if (!proto.__reactAutoBindMap) {\n proto.__reactAutoBindMap = {};\n }\n proto.__reactAutoBindMap[name] = property;\n proto[name] = property;\n } else {\n if (isAlreadyDefined) {\n var specPolicy = ReactClassInterface[name];\n\n // These cases should already be caught by validateMethodOverride.\n !(isReactClassMethod && (specPolicy === SpecPolicy.DEFINE_MANY_MERGED || specPolicy === SpecPolicy.DEFINE_MANY)) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClass: Unexpected spec policy %s for key %s ' + 'when mixing in component specs.', specPolicy, name) : invariant(false) : undefined;\n\n // For methods which are defined more than once, call the existing\n // methods before calling the new property, merging if appropriate.\n if (specPolicy === SpecPolicy.DEFINE_MANY_MERGED) {\n proto[name] = createMergedResultFunction(proto[name], property);\n } else if (specPolicy === SpecPolicy.DEFINE_MANY) {\n proto[name] = createChainedFunction(proto[name], property);\n }\n } else {\n proto[name] = property;\n if (process.env.NODE_ENV !== 'production') {\n // Add verbose displayName to the function, which helps when looking\n // at profiling tools.\n if (typeof property === 'function' && spec.displayName) {\n proto[name].displayName = spec.displayName + '_' + name;\n }\n }\n }\n }\n }\n }\n}\n\nfunction mixStaticSpecIntoComponent(Constructor, statics) {\n if (!statics) {\n return;\n }\n for (var name in statics) {\n var property = statics[name];\n if (!statics.hasOwnProperty(name)) {\n continue;\n }\n\n var isReserved = (name in RESERVED_SPEC_KEYS);\n !!isReserved ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClass: You are attempting to define a reserved ' + 'property, `%s`, that shouldn\\'t be on the \"statics\" key. Define it ' + 'as an instance property instead; it will still be accessible on the ' + 'constructor.', name) : invariant(false) : undefined;\n\n var isInherited = (name in Constructor);\n !!isInherited ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactClass: You are attempting to define ' + '`%s` on your component more than once. This conflict may be ' + 'due to a mixin.', name) : invariant(false) : undefined;\n Constructor[name] = property;\n }\n}\n\n/**\n * Merge two objects, but throw if both contain the same key.\n *\n * @param {object} one The first object, which is mutated.\n * @param {object} two The second object\n * @return {object} one after it has been mutated to contain everything in two.\n */\nfunction mergeIntoWithNoDuplicateKeys(one, two) {\n !(one && two && typeof one === 'object' && typeof two === 'object') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects.') : invariant(false) : undefined;\n\n for (var key in two) {\n if (two.hasOwnProperty(key)) {\n !(one[key] === undefined) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'mergeIntoWithNoDuplicateKeys(): ' + 'Tried to merge two objects with the same key: `%s`. This conflict ' + 'may be due to a mixin; in particular, this may be caused by two ' + 'getInitialState() or getDefaultProps() methods returning objects ' + 'with clashing keys.', key) : invariant(false) : undefined;\n one[key] = two[key];\n }\n }\n return one;\n}\n\n/**\n * Creates a function that invokes two functions and merges their return values.\n *\n * @param {function} one Function to invoke first.\n * @param {function} two Function to invoke second.\n * @return {function} Function that invokes the two argument functions.\n * @private\n */\nfunction createMergedResultFunction(one, two) {\n return function mergedResult() {\n var a = one.apply(this, arguments);\n var b = two.apply(this, arguments);\n if (a == null) {\n return b;\n } else if (b == null) {\n return a;\n }\n var c = {};\n mergeIntoWithNoDuplicateKeys(c, a);\n mergeIntoWithNoDuplicateKeys(c, b);\n return c;\n };\n}\n\n/**\n * Creates a function that invokes two functions and ignores their return vales.\n *\n * @param {function} one Function to invoke first.\n * @param {function} two Function to invoke second.\n * @return {function} Function that invokes the two argument functions.\n * @private\n */\nfunction createChainedFunction(one, two) {\n return function chainedFunction() {\n one.apply(this, arguments);\n two.apply(this, arguments);\n };\n}\n\n/**\n * Binds a method to the component.\n *\n * @param {object} component Component whose method is going to be bound.\n * @param {function} method Method to be bound.\n * @return {function} The bound method.\n */\nfunction bindAutoBindMethod(component, method) {\n var boundMethod = method.bind(component);\n if (process.env.NODE_ENV !== 'production') {\n boundMethod.__reactBoundContext = component;\n boundMethod.__reactBoundMethod = method;\n boundMethod.__reactBoundArguments = null;\n var componentName = component.constructor.displayName;\n var _bind = boundMethod.bind;\n /* eslint-disable block-scoped-var, no-undef */\n boundMethod.bind = function (newThis) {\n for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n // User is trying to bind() an autobound method; we effectively will\n // ignore the value of \"this\" that the user is trying to use, so\n // let's warn.\n if (newThis !== component && newThis !== null) {\n process.env.NODE_ENV !== 'production' ? warning(false, 'bind(): React component methods may only be bound to the ' + 'component instance. See %s', componentName) : undefined;\n } else if (!args.length) {\n process.env.NODE_ENV !== 'production' ? warning(false, 'bind(): You are binding a component method to the component. ' + 'React does this for you automatically in a high-performance ' + 'way, so you can safely remove this call. See %s', componentName) : undefined;\n return boundMethod;\n }\n var reboundMethod = _bind.apply(boundMethod, arguments);\n reboundMethod.__reactBoundContext = component;\n reboundMethod.__reactBoundMethod = method;\n reboundMethod.__reactBoundArguments = args;\n return reboundMethod;\n /* eslint-enable */\n };\n }\n return boundMethod;\n}\n\n/**\n * Binds all auto-bound methods in a component.\n *\n * @param {object} component Component whose method is going to be bound.\n */\nfunction bindAutoBindMethods(component) {\n for (var autoBindKey in component.__reactAutoBindMap) {\n if (component.__reactAutoBindMap.hasOwnProperty(autoBindKey)) {\n var method = component.__reactAutoBindMap[autoBindKey];\n component[autoBindKey] = bindAutoBindMethod(component, method);\n }\n }\n}\n\n/**\n * Add more to the ReactClass base class. These are all legacy features and\n * therefore not already part of the modern ReactComponent.\n */\nvar ReactClassMixin = {\n\n /**\n * TODO: This will be deprecated because state should always keep a consistent\n * type signature and the only use case for this, is to avoid that.\n */\n replaceState: function (newState, callback) {\n this.updater.enqueueReplaceState(this, newState);\n if (callback) {\n this.updater.enqueueCallback(this, callback);\n }\n },\n\n /**\n * Checks whether or not this composite component is mounted.\n * @return {boolean} True if mounted, false otherwise.\n * @protected\n * @final\n */\n isMounted: function () {\n return this.updater.isMounted(this);\n },\n\n /**\n * Sets a subset of the props.\n *\n * @param {object} partialProps Subset of the next props.\n * @param {?function} callback Called after props are updated.\n * @final\n * @public\n * @deprecated\n */\n setProps: function (partialProps, callback) {\n if (process.env.NODE_ENV !== 'production') {\n warnSetProps();\n }\n this.updater.enqueueSetProps(this, partialProps);\n if (callback) {\n this.updater.enqueueCallback(this, callback);\n }\n },\n\n /**\n * Replace all the props.\n *\n * @param {object} newProps Subset of the next props.\n * @param {?function} callback Called after props are updated.\n * @final\n * @public\n * @deprecated\n */\n replaceProps: function (newProps, callback) {\n if (process.env.NODE_ENV !== 'production') {\n warnSetProps();\n }\n this.updater.enqueueReplaceProps(this, newProps);\n if (callback) {\n this.updater.enqueueCallback(this, callback);\n }\n }\n};\n\nvar ReactClassComponent = function () {};\nassign(ReactClassComponent.prototype, ReactComponent.prototype, ReactClassMixin);\n\n/**\n * Module for creating composite components.\n *\n * @class ReactClass\n */\nvar ReactClass = {\n\n /**\n * Creates a composite component class given a class specification.\n *\n * @param {object} spec Class specification (which must define `render`).\n * @return {function} Component constructor function.\n * @public\n */\n createClass: function (spec) {\n var Constructor = function (props, context, updater) {\n // This constructor is overridden by mocks. The argument is used\n // by mocks to assert on what gets mounted.\n\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(this instanceof Constructor, 'Something is calling a React component directly. Use a factory or ' + 'JSX instead. See: https://fb.me/react-legacyfactory') : undefined;\n }\n\n // Wire up auto-binding\n if (this.__reactAutoBindMap) {\n bindAutoBindMethods(this);\n }\n\n this.props = props;\n this.context = context;\n this.refs = emptyObject;\n this.updater = updater || ReactNoopUpdateQueue;\n\n this.state = null;\n\n // ReactClasses doesn't have constructors. Instead, they use the\n // getInitialState and componentWillMount methods for initialization.\n\n var initialState = this.getInitialState ? this.getInitialState() : null;\n if (process.env.NODE_ENV !== 'production') {\n // We allow auto-mocks to proceed as if they're returning null.\n if (typeof initialState === 'undefined' && this.getInitialState._isMockFunction) {\n // This is probably bad practice. Consider warning here and\n // deprecating this convenience.\n initialState = null;\n }\n }\n !(typeof initialState === 'object' && !Array.isArray(initialState)) ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s.getInitialState(): must return an object or null', Constructor.displayName || 'ReactCompositeComponent') : invariant(false) : undefined;\n\n this.state = initialState;\n };\n Constructor.prototype = new ReactClassComponent();\n Constructor.prototype.constructor = Constructor;\n\n injectedMixins.forEach(mixSpecIntoComponent.bind(null, Constructor));\n\n mixSpecIntoComponent(Constructor, spec);\n\n // Initialize the defaultProps property after all mixins have been merged.\n if (Constructor.getDefaultProps) {\n Constructor.defaultProps = Constructor.getDefaultProps();\n }\n\n if (process.env.NODE_ENV !== 'production') {\n // This is a tag to indicate that the use of these method names is ok,\n // since it's used with createClass. If it's not, then it's likely a\n // mistake so we'll warn you to use the static property, property\n // initializer or constructor respectively.\n if (Constructor.getDefaultProps) {\n Constructor.getDefaultProps.isReactClassApproved = {};\n }\n if (Constructor.prototype.getInitialState) {\n Constructor.prototype.getInitialState.isReactClassApproved = {};\n }\n }\n\n !Constructor.prototype.render ? process.env.NODE_ENV !== 'production' ? invariant(false, 'createClass(...): Class specification must implement a `render` method.') : invariant(false) : undefined;\n\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(!Constructor.prototype.componentShouldUpdate, '%s has a method called ' + 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' + 'The name is phrased as a question because the function is ' + 'expected to return a value.', spec.displayName || 'A component') : undefined;\n process.env.NODE_ENV !== 'production' ? warning(!Constructor.prototype.componentWillRecieveProps, '%s has a method called ' + 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', spec.displayName || 'A component') : undefined;\n }\n\n // Reduce time spent doing lookups by setting these on the prototype.\n for (var methodName in ReactClassInterface) {\n if (!Constructor.prototype[methodName]) {\n Constructor.prototype[methodName] = null;\n }\n }\n\n return Constructor;\n },\n\n injection: {\n injectMixin: function (mixin) {\n injectedMixins.push(mixin);\n }\n }\n\n};\n\nmodule.exports = ReactClass;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactClass.js\n ** module id = 121\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactComponent\n */\n\n'use strict';\n\nvar ReactNoopUpdateQueue = require('./ReactNoopUpdateQueue');\n\nvar canDefineProperty = require('./canDefineProperty');\nvar emptyObject = require('fbjs/lib/emptyObject');\nvar invariant = require('fbjs/lib/invariant');\nvar warning = require('fbjs/lib/warning');\n\n/**\n * Base class helpers for the updating state of a component.\n */\nfunction ReactComponent(props, context, updater) {\n this.props = props;\n this.context = context;\n this.refs = emptyObject;\n // We initialize the default updater but the real one gets injected by the\n // renderer.\n this.updater = updater || ReactNoopUpdateQueue;\n}\n\nReactComponent.prototype.isReactComponent = {};\n\n/**\n * Sets a subset of the state. Always use this to mutate\n * state. You should treat `this.state` as immutable.\n *\n * There is no guarantee that `this.state` will be immediately updated, so\n * accessing `this.state` after calling this method may return the old value.\n *\n * There is no guarantee that calls to `setState` will run synchronously,\n * as they may eventually be batched together. You can provide an optional\n * callback that will be executed when the call to setState is actually\n * completed.\n *\n * When a function is provided to setState, it will be called at some point in\n * the future (not synchronously). It will be called with the up to date\n * component arguments (state, props, context). These values can be different\n * from this.* because your function may be called after receiveProps but before\n * shouldComponentUpdate, and this new state, props, and context will not yet be\n * assigned to this.\n *\n * @param {object|function} partialState Next partial state or function to\n * produce next partial state to be merged with current state.\n * @param {?function} callback Called after state is updated.\n * @final\n * @protected\n */\nReactComponent.prototype.setState = function (partialState, callback) {\n !(typeof partialState === 'object' || typeof partialState === 'function' || partialState == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'setState(...): takes an object of state variables to update or a ' + 'function which returns an object of state variables.') : invariant(false) : undefined;\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(partialState != null, 'setState(...): You passed an undefined or null state object; ' + 'instead, use forceUpdate().') : undefined;\n }\n this.updater.enqueueSetState(this, partialState);\n if (callback) {\n this.updater.enqueueCallback(this, callback);\n }\n};\n\n/**\n * Forces an update. This should only be invoked when it is known with\n * certainty that we are **not** in a DOM transaction.\n *\n * You may want to call this when you know that some deeper aspect of the\n * component's state has changed but `setState` was not called.\n *\n * This will not invoke `shouldComponentUpdate`, but it will invoke\n * `componentWillUpdate` and `componentDidUpdate`.\n *\n * @param {?function} callback Called after update is complete.\n * @final\n * @protected\n */\nReactComponent.prototype.forceUpdate = function (callback) {\n this.updater.enqueueForceUpdate(this);\n if (callback) {\n this.updater.enqueueCallback(this, callback);\n }\n};\n\n/**\n * Deprecated APIs. These APIs used to exist on classic React classes but since\n * we would like to deprecate them, we're not going to move them over to this\n * modern base class. Instead, we define a getter that warns if it's accessed.\n */\nif (process.env.NODE_ENV !== 'production') {\n var deprecatedAPIs = {\n getDOMNode: ['getDOMNode', 'Use ReactDOM.findDOMNode(component) instead.'],\n isMounted: ['isMounted', 'Instead, make sure to clean up subscriptions and pending requests in ' + 'componentWillUnmount to prevent memory leaks.'],\n replaceProps: ['replaceProps', 'Instead, call render again at the top level.'],\n replaceState: ['replaceState', 'Refactor your code to use setState instead (see ' + 'https://github.com/facebook/react/issues/3236).'],\n setProps: ['setProps', 'Instead, call render again at the top level.']\n };\n var defineDeprecationWarning = function (methodName, info) {\n if (canDefineProperty) {\n Object.defineProperty(ReactComponent.prototype, methodName, {\n get: function () {\n process.env.NODE_ENV !== 'production' ? warning(false, '%s(...) is deprecated in plain JavaScript React classes. %s', info[0], info[1]) : undefined;\n return undefined;\n }\n });\n }\n };\n for (var fnName in deprecatedAPIs) {\n if (deprecatedAPIs.hasOwnProperty(fnName)) {\n defineDeprecationWarning(fnName, deprecatedAPIs[fnName]);\n }\n }\n}\n\nmodule.exports = ReactComponent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactComponent.js\n ** module id = 122\n ** module chunks = 0 1\n **/","/**\n * Copyright 2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactNoopUpdateQueue\n */\n\n'use strict';\n\nvar warning = require('fbjs/lib/warning');\n\nfunction warnTDZ(publicInstance, callerName) {\n if (process.env.NODE_ENV !== 'production') {\n process.env.NODE_ENV !== 'production' ? warning(false, '%s(...): Can only update a mounted or mounting component. ' + 'This usually means you called %s() on an unmounted component. ' + 'This is a no-op. Please check the code for the %s component.', callerName, callerName, publicInstance.constructor && publicInstance.constructor.displayName || '') : undefined;\n }\n}\n\n/**\n * This is the abstract API for an update queue.\n */\nvar ReactNoopUpdateQueue = {\n\n /**\n * Checks whether or not this composite component is mounted.\n * @param {ReactClass} publicInstance The instance we want to test.\n * @return {boolean} True if mounted, false otherwise.\n * @protected\n * @final\n */\n isMounted: function (publicInstance) {\n return false;\n },\n\n /**\n * Enqueue a callback that will be executed after all the pending updates\n * have processed.\n *\n * @param {ReactClass} publicInstance The instance to use as `this` context.\n * @param {?function} callback Called after state is updated.\n * @internal\n */\n enqueueCallback: function (publicInstance, callback) {},\n\n /**\n * Forces an update. This should only be invoked when it is known with\n * certainty that we are **not** in a DOM transaction.\n *\n * You may want to call this when you know that some deeper aspect of the\n * component's state has changed but `setState` was not called.\n *\n * This will not invoke `shouldComponentUpdate`, but it will invoke\n * `componentWillUpdate` and `componentDidUpdate`.\n *\n * @param {ReactClass} publicInstance The instance that should rerender.\n * @internal\n */\n enqueueForceUpdate: function (publicInstance) {\n warnTDZ(publicInstance, 'forceUpdate');\n },\n\n /**\n * Replaces all of the state. Always use this or `setState` to mutate state.\n * You should treat `this.state` as immutable.\n *\n * There is no guarantee that `this.state` will be immediately updated, so\n * accessing `this.state` after calling this method may return the old value.\n *\n * @param {ReactClass} publicInstance The instance that should rerender.\n * @param {object} completeState Next state.\n * @internal\n */\n enqueueReplaceState: function (publicInstance, completeState) {\n warnTDZ(publicInstance, 'replaceState');\n },\n\n /**\n * Sets a subset of the state. This only exists because _pendingState is\n * internal. This provides a merging strategy that is not available to deep\n * properties which is confusing. TODO: Expose pendingState or don't use it\n * during the merge.\n *\n * @param {ReactClass} publicInstance The instance that should rerender.\n * @param {object} partialState Next partial state to be merged with state.\n * @internal\n */\n enqueueSetState: function (publicInstance, partialState) {\n warnTDZ(publicInstance, 'setState');\n },\n\n /**\n * Sets a subset of the props.\n *\n * @param {ReactClass} publicInstance The instance that should rerender.\n * @param {object} partialProps Subset of the next props.\n * @internal\n */\n enqueueSetProps: function (publicInstance, partialProps) {\n warnTDZ(publicInstance, 'setProps');\n },\n\n /**\n * Replaces all of the props.\n *\n * @param {ReactClass} publicInstance The instance that should rerender.\n * @param {object} props New props.\n * @internal\n */\n enqueueReplaceProps: function (publicInstance, props) {\n warnTDZ(publicInstance, 'replaceProps');\n }\n\n};\n\nmodule.exports = ReactNoopUpdateQueue;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactNoopUpdateQueue.js\n ** module id = 123\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactReconcileTransaction\n * @typechecks static-only\n */\n\n'use strict';\n\nvar CallbackQueue = require('./CallbackQueue');\nvar PooledClass = require('./PooledClass');\nvar ReactBrowserEventEmitter = require('./ReactBrowserEventEmitter');\nvar ReactDOMFeatureFlags = require('./ReactDOMFeatureFlags');\nvar ReactInputSelection = require('./ReactInputSelection');\nvar Transaction = require('./Transaction');\n\nvar assign = require('./Object.assign');\n\n/**\n * Ensures that, when possible, the selection range (currently selected text\n * input) is not disturbed by performing the transaction.\n */\nvar SELECTION_RESTORATION = {\n /**\n * @return {Selection} Selection information.\n */\n initialize: ReactInputSelection.getSelectionInformation,\n /**\n * @param {Selection} sel Selection information returned from `initialize`.\n */\n close: ReactInputSelection.restoreSelection\n};\n\n/**\n * Suppresses events (blur/focus) that could be inadvertently dispatched due to\n * high level DOM manipulations (like temporarily removing a text input from the\n * DOM).\n */\nvar EVENT_SUPPRESSION = {\n /**\n * @return {boolean} The enabled status of `ReactBrowserEventEmitter` before\n * the reconciliation.\n */\n initialize: function () {\n var currentlyEnabled = ReactBrowserEventEmitter.isEnabled();\n ReactBrowserEventEmitter.setEnabled(false);\n return currentlyEnabled;\n },\n\n /**\n * @param {boolean} previouslyEnabled Enabled status of\n * `ReactBrowserEventEmitter` before the reconciliation occurred. `close`\n * restores the previous value.\n */\n close: function (previouslyEnabled) {\n ReactBrowserEventEmitter.setEnabled(previouslyEnabled);\n }\n};\n\n/**\n * Provides a queue for collecting `componentDidMount` and\n * `componentDidUpdate` callbacks during the the transaction.\n */\nvar ON_DOM_READY_QUEUEING = {\n /**\n * Initializes the internal `onDOMReady` queue.\n */\n initialize: function () {\n this.reactMountReady.reset();\n },\n\n /**\n * After DOM is flushed, invoke all registered `onDOMReady` callbacks.\n */\n close: function () {\n this.reactMountReady.notifyAll();\n }\n};\n\n/**\n * Executed within the scope of the `Transaction` instance. Consider these as\n * being member methods, but with an implied ordering while being isolated from\n * each other.\n */\nvar TRANSACTION_WRAPPERS = [SELECTION_RESTORATION, EVENT_SUPPRESSION, ON_DOM_READY_QUEUEING];\n\n/**\n * Currently:\n * - The order that these are listed in the transaction is critical:\n * - Suppresses events.\n * - Restores selection range.\n *\n * Future:\n * - Restore document/overflow scroll positions that were unintentionally\n * modified via DOM insertions above the top viewport boundary.\n * - Implement/integrate with customized constraint based layout system and keep\n * track of which dimensions must be remeasured.\n *\n * @class ReactReconcileTransaction\n */\nfunction ReactReconcileTransaction(forceHTML) {\n this.reinitializeTransaction();\n // Only server-side rendering really needs this option (see\n // `ReactServerRendering`), but server-side uses\n // `ReactServerRenderingTransaction` instead. This option is here so that it's\n // accessible and defaults to false when `ReactDOMComponent` and\n // `ReactTextComponent` checks it in `mountComponent`.`\n this.renderToStaticMarkup = false;\n this.reactMountReady = CallbackQueue.getPooled(null);\n this.useCreateElement = !forceHTML && ReactDOMFeatureFlags.useCreateElement;\n}\n\nvar Mixin = {\n /**\n * @see Transaction\n * @abstract\n * @final\n * @return {array<object>} List of operation wrap procedures.\n * TODO: convert to array<TransactionWrapper>\n */\n getTransactionWrappers: function () {\n return TRANSACTION_WRAPPERS;\n },\n\n /**\n * @return {object} The queue to collect `onDOMReady` callbacks with.\n */\n getReactMountReady: function () {\n return this.reactMountReady;\n },\n\n /**\n * `PooledClass` looks for this, and will invoke this before allowing this\n * instance to be reused.\n */\n destructor: function () {\n CallbackQueue.release(this.reactMountReady);\n this.reactMountReady = null;\n }\n};\n\nassign(ReactReconcileTransaction.prototype, Transaction.Mixin, Mixin);\n\nPooledClass.addPoolingTo(ReactReconcileTransaction);\n\nmodule.exports = ReactReconcileTransaction;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactReconcileTransaction.js\n ** module id = 124\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactInputSelection\n */\n\n'use strict';\n\nvar ReactDOMSelection = require('./ReactDOMSelection');\n\nvar containsNode = require('fbjs/lib/containsNode');\nvar focusNode = require('fbjs/lib/focusNode');\nvar getActiveElement = require('fbjs/lib/getActiveElement');\n\nfunction isInDocument(node) {\n return containsNode(document.documentElement, node);\n}\n\n/**\n * @ReactInputSelection: React input selection module. Based on Selection.js,\n * but modified to be suitable for react and has a couple of bug fixes (doesn't\n * assume buttons have range selections allowed).\n * Input selection module for React.\n */\nvar ReactInputSelection = {\n\n hasSelectionCapabilities: function (elem) {\n var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();\n return nodeName && (nodeName === 'input' && elem.type === 'text' || nodeName === 'textarea' || elem.contentEditable === 'true');\n },\n\n getSelectionInformation: function () {\n var focusedElem = getActiveElement();\n return {\n focusedElem: focusedElem,\n selectionRange: ReactInputSelection.hasSelectionCapabilities(focusedElem) ? ReactInputSelection.getSelection(focusedElem) : null\n };\n },\n\n /**\n * @restoreSelection: If any selection information was potentially lost,\n * restore it. This is useful when performing operations that could remove dom\n * nodes and place them back in, resulting in focus being lost.\n */\n restoreSelection: function (priorSelectionInformation) {\n var curFocusedElem = getActiveElement();\n var priorFocusedElem = priorSelectionInformation.focusedElem;\n var priorSelectionRange = priorSelectionInformation.selectionRange;\n if (curFocusedElem !== priorFocusedElem && isInDocument(priorFocusedElem)) {\n if (ReactInputSelection.hasSelectionCapabilities(priorFocusedElem)) {\n ReactInputSelection.setSelection(priorFocusedElem, priorSelectionRange);\n }\n focusNode(priorFocusedElem);\n }\n },\n\n /**\n * @getSelection: Gets the selection bounds of a focused textarea, input or\n * contentEditable node.\n * -@input: Look up selection bounds of this input\n * -@return {start: selectionStart, end: selectionEnd}\n */\n getSelection: function (input) {\n var selection;\n\n if ('selectionStart' in input) {\n // Modern browser with input or textarea.\n selection = {\n start: input.selectionStart,\n end: input.selectionEnd\n };\n } else if (document.selection && (input.nodeName && input.nodeName.toLowerCase() === 'input')) {\n // IE8 input.\n var range = document.selection.createRange();\n // There can only be one selection per document in IE, so it must\n // be in our element.\n if (range.parentElement() === input) {\n selection = {\n start: -range.moveStart('character', -input.value.length),\n end: -range.moveEnd('character', -input.value.length)\n };\n }\n } else {\n // Content editable or old IE textarea.\n selection = ReactDOMSelection.getOffsets(input);\n }\n\n return selection || { start: 0, end: 0 };\n },\n\n /**\n * @setSelection: Sets the selection bounds of a textarea or input and focuses\n * the input.\n * -@input Set selection bounds of this input or textarea\n * -@offsets Object of same form that is returned from get*\n */\n setSelection: function (input, offsets) {\n var start = offsets.start;\n var end = offsets.end;\n if (typeof end === 'undefined') {\n end = start;\n }\n\n if ('selectionStart' in input) {\n input.selectionStart = start;\n input.selectionEnd = Math.min(end, input.value.length);\n } else if (document.selection && (input.nodeName && input.nodeName.toLowerCase() === 'input')) {\n var range = input.createTextRange();\n range.collapse(true);\n range.moveStart('character', start);\n range.moveEnd('character', end - start);\n range.select();\n } else {\n ReactDOMSelection.setOffsets(input, offsets);\n }\n }\n};\n\nmodule.exports = ReactInputSelection;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactInputSelection.js\n ** module id = 125\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactDOMSelection\n */\n\n'use strict';\n\nvar ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');\n\nvar getNodeForCharacterOffset = require('./getNodeForCharacterOffset');\nvar getTextContentAccessor = require('./getTextContentAccessor');\n\n/**\n * While `isCollapsed` is available on the Selection object and `collapsed`\n * is available on the Range object, IE11 sometimes gets them wrong.\n * If the anchor/focus nodes and offsets are the same, the range is collapsed.\n */\nfunction isCollapsed(anchorNode, anchorOffset, focusNode, focusOffset) {\n return anchorNode === focusNode && anchorOffset === focusOffset;\n}\n\n/**\n * Get the appropriate anchor and focus node/offset pairs for IE.\n *\n * The catch here is that IE's selection API doesn't provide information\n * about whether the selection is forward or backward, so we have to\n * behave as though it's always forward.\n *\n * IE text differs from modern selection in that it behaves as though\n * block elements end with a new line. This means character offsets will\n * differ between the two APIs.\n *\n * @param {DOMElement} node\n * @return {object}\n */\nfunction getIEOffsets(node) {\n var selection = document.selection;\n var selectedRange = selection.createRange();\n var selectedLength = selectedRange.text.length;\n\n // Duplicate selection so we can move range without breaking user selection.\n var fromStart = selectedRange.duplicate();\n fromStart.moveToElementText(node);\n fromStart.setEndPoint('EndToStart', selectedRange);\n\n var startOffset = fromStart.text.length;\n var endOffset = startOffset + selectedLength;\n\n return {\n start: startOffset,\n end: endOffset\n };\n}\n\n/**\n * @param {DOMElement} node\n * @return {?object}\n */\nfunction getModernOffsets(node) {\n var selection = window.getSelection && window.getSelection();\n\n if (!selection || selection.rangeCount === 0) {\n return null;\n }\n\n var anchorNode = selection.anchorNode;\n var anchorOffset = selection.anchorOffset;\n var focusNode = selection.focusNode;\n var focusOffset = selection.focusOffset;\n\n var currentRange = selection.getRangeAt(0);\n\n // In Firefox, range.startContainer and range.endContainer can be \"anonymous\n // divs\", e.g. the up/down buttons on an <input type=\"number\">. Anonymous\n // divs do not seem to expose properties, triggering a \"Permission denied\n // error\" if any of its properties are accessed. The only seemingly possible\n // way to avoid erroring is to access a property that typically works for\n // non-anonymous divs and catch any error that may otherwise arise. See\n // https://bugzilla.mozilla.org/show_bug.cgi?id=208427\n try {\n /* eslint-disable no-unused-expressions */\n currentRange.startContainer.nodeType;\n currentRange.endContainer.nodeType;\n /* eslint-enable no-unused-expressions */\n } catch (e) {\n return null;\n }\n\n // If the node and offset values are the same, the selection is collapsed.\n // `Selection.isCollapsed` is available natively, but IE sometimes gets\n // this value wrong.\n var isSelectionCollapsed = isCollapsed(selection.anchorNode, selection.anchorOffset, selection.focusNode, selection.focusOffset);\n\n var rangeLength = isSelectionCollapsed ? 0 : currentRange.toString().length;\n\n var tempRange = currentRange.cloneRange();\n tempRange.selectNodeContents(node);\n tempRange.setEnd(currentRange.startContainer, currentRange.startOffset);\n\n var isTempRangeCollapsed = isCollapsed(tempRange.startContainer, tempRange.startOffset, tempRange.endContainer, tempRange.endOffset);\n\n var start = isTempRangeCollapsed ? 0 : tempRange.toString().length;\n var end = start + rangeLength;\n\n // Detect whether the selection is backward.\n var detectionRange = document.createRange();\n detectionRange.setStart(anchorNode, anchorOffset);\n detectionRange.setEnd(focusNode, focusOffset);\n var isBackward = detectionRange.collapsed;\n\n return {\n start: isBackward ? end : start,\n end: isBackward ? start : end\n };\n}\n\n/**\n * @param {DOMElement|DOMTextNode} node\n * @param {object} offsets\n */\nfunction setIEOffsets(node, offsets) {\n var range = document.selection.createRange().duplicate();\n var start, end;\n\n if (typeof offsets.end === 'undefined') {\n start = offsets.start;\n end = start;\n } else if (offsets.start > offsets.end) {\n start = offsets.end;\n end = offsets.start;\n } else {\n start = offsets.start;\n end = offsets.end;\n }\n\n range.moveToElementText(node);\n range.moveStart('character', start);\n range.setEndPoint('EndToStart', range);\n range.moveEnd('character', end - start);\n range.select();\n}\n\n/**\n * In modern non-IE browsers, we can support both forward and backward\n * selections.\n *\n * Note: IE10+ supports the Selection object, but it does not support\n * the `extend` method, which means that even in modern IE, it's not possible\n * to programatically create a backward selection. Thus, for all IE\n * versions, we use the old IE API to create our selections.\n *\n * @param {DOMElement|DOMTextNode} node\n * @param {object} offsets\n */\nfunction setModernOffsets(node, offsets) {\n if (!window.getSelection) {\n return;\n }\n\n var selection = window.getSelection();\n var length = node[getTextContentAccessor()].length;\n var start = Math.min(offsets.start, length);\n var end = typeof offsets.end === 'undefined' ? start : Math.min(offsets.end, length);\n\n // IE 11 uses modern selection, but doesn't support the extend method.\n // Flip backward selections, so we can set with a single range.\n if (!selection.extend && start > end) {\n var temp = end;\n end = start;\n start = temp;\n }\n\n var startMarker = getNodeForCharacterOffset(node, start);\n var endMarker = getNodeForCharacterOffset(node, end);\n\n if (startMarker && endMarker) {\n var range = document.createRange();\n range.setStart(startMarker.node, startMarker.offset);\n selection.removeAllRanges();\n\n if (start > end) {\n selection.addRange(range);\n selection.extend(endMarker.node, endMarker.offset);\n } else {\n range.setEnd(endMarker.node, endMarker.offset);\n selection.addRange(range);\n }\n }\n}\n\nvar useIEOffsets = ExecutionEnvironment.canUseDOM && 'selection' in document && !('getSelection' in window);\n\nvar ReactDOMSelection = {\n /**\n * @param {DOMElement} node\n */\n getOffsets: useIEOffsets ? getIEOffsets : getModernOffsets,\n\n /**\n * @param {DOMElement|DOMTextNode} node\n * @param {object} offsets\n */\n setOffsets: useIEOffsets ? setIEOffsets : setModernOffsets\n};\n\nmodule.exports = ReactDOMSelection;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactDOMSelection.js\n ** module id = 126\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule getNodeForCharacterOffset\n */\n\n'use strict';\n\n/**\n * Given any node return the first leaf node without children.\n *\n * @param {DOMElement|DOMTextNode} node\n * @return {DOMElement|DOMTextNode}\n */\nfunction getLeafNode(node) {\n while (node && node.firstChild) {\n node = node.firstChild;\n }\n return node;\n}\n\n/**\n * Get the next sibling within a container. This will walk up the\n * DOM if a node's siblings have been exhausted.\n *\n * @param {DOMElement|DOMTextNode} node\n * @return {?DOMElement|DOMTextNode}\n */\nfunction getSiblingNode(node) {\n while (node) {\n if (node.nextSibling) {\n return node.nextSibling;\n }\n node = node.parentNode;\n }\n}\n\n/**\n * Get object describing the nodes which contain characters at offset.\n *\n * @param {DOMElement|DOMTextNode} root\n * @param {number} offset\n * @return {?object}\n */\nfunction getNodeForCharacterOffset(root, offset) {\n var node = getLeafNode(root);\n var nodeStart = 0;\n var nodeEnd = 0;\n\n while (node) {\n if (node.nodeType === 3) {\n nodeEnd = nodeStart + node.textContent.length;\n\n if (nodeStart <= offset && nodeEnd >= offset) {\n return {\n node: node,\n offset: offset - nodeStart\n };\n }\n\n nodeStart = nodeEnd;\n }\n\n node = getLeafNode(getSiblingNode(node));\n }\n}\n\nmodule.exports = getNodeForCharacterOffset;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/getNodeForCharacterOffset.js\n ** module id = 127\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule getActiveElement\n * @typechecks\n */\n\n/**\n * Same as document.activeElement but wraps in a try-catch block. In IE it is\n * not safe to call document.activeElement if there is nothing focused.\n *\n * The activeElement will be null only if the document or document body is not yet defined.\n */\n'use strict';\n\nfunction getActiveElement() /*?DOMElement*/{\n if (typeof document === 'undefined') {\n return null;\n }\n\n try {\n return document.activeElement || document.body;\n } catch (e) {\n return document.body;\n }\n}\n\nmodule.exports = getActiveElement;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/getActiveElement.js\n ** module id = 128\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule SelectEventPlugin\n */\n\n'use strict';\n\nvar EventConstants = require('./EventConstants');\nvar EventPropagators = require('./EventPropagators');\nvar ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');\nvar ReactInputSelection = require('./ReactInputSelection');\nvar SyntheticEvent = require('./SyntheticEvent');\n\nvar getActiveElement = require('fbjs/lib/getActiveElement');\nvar isTextInputElement = require('./isTextInputElement');\nvar keyOf = require('fbjs/lib/keyOf');\nvar shallowEqual = require('fbjs/lib/shallowEqual');\n\nvar topLevelTypes = EventConstants.topLevelTypes;\n\nvar skipSelectionChangeEvent = ExecutionEnvironment.canUseDOM && 'documentMode' in document && document.documentMode <= 11;\n\nvar eventTypes = {\n select: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onSelect: null }),\n captured: keyOf({ onSelectCapture: null })\n },\n dependencies: [topLevelTypes.topBlur, topLevelTypes.topContextMenu, topLevelTypes.topFocus, topLevelTypes.topKeyDown, topLevelTypes.topMouseDown, topLevelTypes.topMouseUp, topLevelTypes.topSelectionChange]\n }\n};\n\nvar activeElement = null;\nvar activeElementID = null;\nvar lastSelection = null;\nvar mouseDown = false;\n\n// Track whether a listener exists for this plugin. If none exist, we do\n// not extract events.\nvar hasListener = false;\nvar ON_SELECT_KEY = keyOf({ onSelect: null });\n\n/**\n * Get an object which is a unique representation of the current selection.\n *\n * The return value will not be consistent across nodes or browsers, but\n * two identical selections on the same node will return identical objects.\n *\n * @param {DOMElement} node\n * @return {object}\n */\nfunction getSelection(node) {\n if ('selectionStart' in node && ReactInputSelection.hasSelectionCapabilities(node)) {\n return {\n start: node.selectionStart,\n end: node.selectionEnd\n };\n } else if (window.getSelection) {\n var selection = window.getSelection();\n return {\n anchorNode: selection.anchorNode,\n anchorOffset: selection.anchorOffset,\n focusNode: selection.focusNode,\n focusOffset: selection.focusOffset\n };\n } else if (document.selection) {\n var range = document.selection.createRange();\n return {\n parentElement: range.parentElement(),\n text: range.text,\n top: range.boundingTop,\n left: range.boundingLeft\n };\n }\n}\n\n/**\n * Poll selection to see whether it's changed.\n *\n * @param {object} nativeEvent\n * @return {?SyntheticEvent}\n */\nfunction constructSelectEvent(nativeEvent, nativeEventTarget) {\n // Ensure we have the right element, and that the user is not dragging a\n // selection (this matches native `select` event behavior). In HTML5, select\n // fires only on input and textarea thus if there's no focused element we\n // won't dispatch.\n if (mouseDown || activeElement == null || activeElement !== getActiveElement()) {\n return null;\n }\n\n // Only fire when selection has actually changed.\n var currentSelection = getSelection(activeElement);\n if (!lastSelection || !shallowEqual(lastSelection, currentSelection)) {\n lastSelection = currentSelection;\n\n var syntheticEvent = SyntheticEvent.getPooled(eventTypes.select, activeElementID, nativeEvent, nativeEventTarget);\n\n syntheticEvent.type = 'select';\n syntheticEvent.target = activeElement;\n\n EventPropagators.accumulateTwoPhaseDispatches(syntheticEvent);\n\n return syntheticEvent;\n }\n\n return null;\n}\n\n/**\n * This plugin creates an `onSelect` event that normalizes select events\n * across form elements.\n *\n * Supported elements are:\n * - input (see `isTextInputElement`)\n * - textarea\n * - contentEditable\n *\n * This differs from native browser implementations in the following ways:\n * - Fires on contentEditable fields as well as inputs.\n * - Fires for collapsed selection.\n * - Fires after user input.\n */\nvar SelectEventPlugin = {\n\n eventTypes: eventTypes,\n\n /**\n * @param {string} topLevelType Record from `EventConstants`.\n * @param {DOMEventTarget} topLevelTarget The listening component root node.\n * @param {string} topLevelTargetID ID of `topLevelTarget`.\n * @param {object} nativeEvent Native browser event.\n * @return {*} An accumulation of synthetic events.\n * @see {EventPluginHub.extractEvents}\n */\n extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) {\n if (!hasListener) {\n return null;\n }\n\n switch (topLevelType) {\n // Track the input node that has focus.\n case topLevelTypes.topFocus:\n if (isTextInputElement(topLevelTarget) || topLevelTarget.contentEditable === 'true') {\n activeElement = topLevelTarget;\n activeElementID = topLevelTargetID;\n lastSelection = null;\n }\n break;\n case topLevelTypes.topBlur:\n activeElement = null;\n activeElementID = null;\n lastSelection = null;\n break;\n\n // Don't fire the event while the user is dragging. This matches the\n // semantics of the native select event.\n case topLevelTypes.topMouseDown:\n mouseDown = true;\n break;\n case topLevelTypes.topContextMenu:\n case topLevelTypes.topMouseUp:\n mouseDown = false;\n return constructSelectEvent(nativeEvent, nativeEventTarget);\n\n // Chrome and IE fire non-standard event when selection is changed (and\n // sometimes when it hasn't). IE's event fires out of order with respect\n // to key and input events on deletion, so we discard it.\n //\n // Firefox doesn't support selectionchange, so check selection status\n // after each key entry. The selection changes after keydown and before\n // keyup, but we check on keydown as well in the case of holding down a\n // key, when multiple keydown events are fired but only one keyup is.\n // This is also our approach for IE handling, for the reason above.\n case topLevelTypes.topSelectionChange:\n if (skipSelectionChangeEvent) {\n break;\n }\n // falls through\n case topLevelTypes.topKeyDown:\n case topLevelTypes.topKeyUp:\n return constructSelectEvent(nativeEvent, nativeEventTarget);\n }\n\n return null;\n },\n\n didPutListener: function (id, registrationName, listener) {\n if (registrationName === ON_SELECT_KEY) {\n hasListener = true;\n }\n }\n};\n\nmodule.exports = SelectEventPlugin;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/SelectEventPlugin.js\n ** module id = 129\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ServerReactRootIndex\n * @typechecks\n */\n\n'use strict';\n\n/**\n * Size of the reactRoot ID space. We generate random numbers for React root\n * IDs and if there's a collision the events and DOM update system will\n * get confused. In the future we need a way to generate GUIDs but for\n * now this will work on a smaller scale.\n */\nvar GLOBAL_MOUNT_POINT_MAX = Math.pow(2, 53);\n\nvar ServerReactRootIndex = {\n createReactRootIndex: function () {\n return Math.ceil(Math.random() * GLOBAL_MOUNT_POINT_MAX);\n }\n};\n\nmodule.exports = ServerReactRootIndex;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ServerReactRootIndex.js\n ** module id = 130\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule SimpleEventPlugin\n */\n\n'use strict';\n\nvar EventConstants = require('./EventConstants');\nvar EventListener = require('fbjs/lib/EventListener');\nvar EventPropagators = require('./EventPropagators');\nvar ReactMount = require('./ReactMount');\nvar SyntheticClipboardEvent = require('./SyntheticClipboardEvent');\nvar SyntheticEvent = require('./SyntheticEvent');\nvar SyntheticFocusEvent = require('./SyntheticFocusEvent');\nvar SyntheticKeyboardEvent = require('./SyntheticKeyboardEvent');\nvar SyntheticMouseEvent = require('./SyntheticMouseEvent');\nvar SyntheticDragEvent = require('./SyntheticDragEvent');\nvar SyntheticTouchEvent = require('./SyntheticTouchEvent');\nvar SyntheticUIEvent = require('./SyntheticUIEvent');\nvar SyntheticWheelEvent = require('./SyntheticWheelEvent');\n\nvar emptyFunction = require('fbjs/lib/emptyFunction');\nvar getEventCharCode = require('./getEventCharCode');\nvar invariant = require('fbjs/lib/invariant');\nvar keyOf = require('fbjs/lib/keyOf');\n\nvar topLevelTypes = EventConstants.topLevelTypes;\n\nvar eventTypes = {\n abort: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onAbort: true }),\n captured: keyOf({ onAbortCapture: true })\n }\n },\n blur: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onBlur: true }),\n captured: keyOf({ onBlurCapture: true })\n }\n },\n canPlay: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onCanPlay: true }),\n captured: keyOf({ onCanPlayCapture: true })\n }\n },\n canPlayThrough: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onCanPlayThrough: true }),\n captured: keyOf({ onCanPlayThroughCapture: true })\n }\n },\n click: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onClick: true }),\n captured: keyOf({ onClickCapture: true })\n }\n },\n contextMenu: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onContextMenu: true }),\n captured: keyOf({ onContextMenuCapture: true })\n }\n },\n copy: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onCopy: true }),\n captured: keyOf({ onCopyCapture: true })\n }\n },\n cut: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onCut: true }),\n captured: keyOf({ onCutCapture: true })\n }\n },\n doubleClick: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onDoubleClick: true }),\n captured: keyOf({ onDoubleClickCapture: true })\n }\n },\n drag: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onDrag: true }),\n captured: keyOf({ onDragCapture: true })\n }\n },\n dragEnd: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onDragEnd: true }),\n captured: keyOf({ onDragEndCapture: true })\n }\n },\n dragEnter: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onDragEnter: true }),\n captured: keyOf({ onDragEnterCapture: true })\n }\n },\n dragExit: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onDragExit: true }),\n captured: keyOf({ onDragExitCapture: true })\n }\n },\n dragLeave: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onDragLeave: true }),\n captured: keyOf({ onDragLeaveCapture: true })\n }\n },\n dragOver: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onDragOver: true }),\n captured: keyOf({ onDragOverCapture: true })\n }\n },\n dragStart: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onDragStart: true }),\n captured: keyOf({ onDragStartCapture: true })\n }\n },\n drop: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onDrop: true }),\n captured: keyOf({ onDropCapture: true })\n }\n },\n durationChange: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onDurationChange: true }),\n captured: keyOf({ onDurationChangeCapture: true })\n }\n },\n emptied: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onEmptied: true }),\n captured: keyOf({ onEmptiedCapture: true })\n }\n },\n encrypted: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onEncrypted: true }),\n captured: keyOf({ onEncryptedCapture: true })\n }\n },\n ended: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onEnded: true }),\n captured: keyOf({ onEndedCapture: true })\n }\n },\n error: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onError: true }),\n captured: keyOf({ onErrorCapture: true })\n }\n },\n focus: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onFocus: true }),\n captured: keyOf({ onFocusCapture: true })\n }\n },\n input: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onInput: true }),\n captured: keyOf({ onInputCapture: true })\n }\n },\n keyDown: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onKeyDown: true }),\n captured: keyOf({ onKeyDownCapture: true })\n }\n },\n keyPress: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onKeyPress: true }),\n captured: keyOf({ onKeyPressCapture: true })\n }\n },\n keyUp: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onKeyUp: true }),\n captured: keyOf({ onKeyUpCapture: true })\n }\n },\n load: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onLoad: true }),\n captured: keyOf({ onLoadCapture: true })\n }\n },\n loadedData: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onLoadedData: true }),\n captured: keyOf({ onLoadedDataCapture: true })\n }\n },\n loadedMetadata: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onLoadedMetadata: true }),\n captured: keyOf({ onLoadedMetadataCapture: true })\n }\n },\n loadStart: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onLoadStart: true }),\n captured: keyOf({ onLoadStartCapture: true })\n }\n },\n // Note: We do not allow listening to mouseOver events. Instead, use the\n // onMouseEnter/onMouseLeave created by `EnterLeaveEventPlugin`.\n mouseDown: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onMouseDown: true }),\n captured: keyOf({ onMouseDownCapture: true })\n }\n },\n mouseMove: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onMouseMove: true }),\n captured: keyOf({ onMouseMoveCapture: true })\n }\n },\n mouseOut: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onMouseOut: true }),\n captured: keyOf({ onMouseOutCapture: true })\n }\n },\n mouseOver: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onMouseOver: true }),\n captured: keyOf({ onMouseOverCapture: true })\n }\n },\n mouseUp: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onMouseUp: true }),\n captured: keyOf({ onMouseUpCapture: true })\n }\n },\n paste: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onPaste: true }),\n captured: keyOf({ onPasteCapture: true })\n }\n },\n pause: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onPause: true }),\n captured: keyOf({ onPauseCapture: true })\n }\n },\n play: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onPlay: true }),\n captured: keyOf({ onPlayCapture: true })\n }\n },\n playing: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onPlaying: true }),\n captured: keyOf({ onPlayingCapture: true })\n }\n },\n progress: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onProgress: true }),\n captured: keyOf({ onProgressCapture: true })\n }\n },\n rateChange: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onRateChange: true }),\n captured: keyOf({ onRateChangeCapture: true })\n }\n },\n reset: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onReset: true }),\n captured: keyOf({ onResetCapture: true })\n }\n },\n scroll: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onScroll: true }),\n captured: keyOf({ onScrollCapture: true })\n }\n },\n seeked: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onSeeked: true }),\n captured: keyOf({ onSeekedCapture: true })\n }\n },\n seeking: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onSeeking: true }),\n captured: keyOf({ onSeekingCapture: true })\n }\n },\n stalled: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onStalled: true }),\n captured: keyOf({ onStalledCapture: true })\n }\n },\n submit: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onSubmit: true }),\n captured: keyOf({ onSubmitCapture: true })\n }\n },\n suspend: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onSuspend: true }),\n captured: keyOf({ onSuspendCapture: true })\n }\n },\n timeUpdate: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onTimeUpdate: true }),\n captured: keyOf({ onTimeUpdateCapture: true })\n }\n },\n touchCancel: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onTouchCancel: true }),\n captured: keyOf({ onTouchCancelCapture: true })\n }\n },\n touchEnd: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onTouchEnd: true }),\n captured: keyOf({ onTouchEndCapture: true })\n }\n },\n touchMove: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onTouchMove: true }),\n captured: keyOf({ onTouchMoveCapture: true })\n }\n },\n touchStart: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onTouchStart: true }),\n captured: keyOf({ onTouchStartCapture: true })\n }\n },\n volumeChange: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onVolumeChange: true }),\n captured: keyOf({ onVolumeChangeCapture: true })\n }\n },\n waiting: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onWaiting: true }),\n captured: keyOf({ onWaitingCapture: true })\n }\n },\n wheel: {\n phasedRegistrationNames: {\n bubbled: keyOf({ onWheel: true }),\n captured: keyOf({ onWheelCapture: true })\n }\n }\n};\n\nvar topLevelEventsToDispatchConfig = {\n topAbort: eventTypes.abort,\n topBlur: eventTypes.blur,\n topCanPlay: eventTypes.canPlay,\n topCanPlayThrough: eventTypes.canPlayThrough,\n topClick: eventTypes.click,\n topContextMenu: eventTypes.contextMenu,\n topCopy: eventTypes.copy,\n topCut: eventTypes.cut,\n topDoubleClick: eventTypes.doubleClick,\n topDrag: eventTypes.drag,\n topDragEnd: eventTypes.dragEnd,\n topDragEnter: eventTypes.dragEnter,\n topDragExit: eventTypes.dragExit,\n topDragLeave: eventTypes.dragLeave,\n topDragOver: eventTypes.dragOver,\n topDragStart: eventTypes.dragStart,\n topDrop: eventTypes.drop,\n topDurationChange: eventTypes.durationChange,\n topEmptied: eventTypes.emptied,\n topEncrypted: eventTypes.encrypted,\n topEnded: eventTypes.ended,\n topError: eventTypes.error,\n topFocus: eventTypes.focus,\n topInput: eventTypes.input,\n topKeyDown: eventTypes.keyDown,\n topKeyPress: eventTypes.keyPress,\n topKeyUp: eventTypes.keyUp,\n topLoad: eventTypes.load,\n topLoadedData: eventTypes.loadedData,\n topLoadedMetadata: eventTypes.loadedMetadata,\n topLoadStart: eventTypes.loadStart,\n topMouseDown: eventTypes.mouseDown,\n topMouseMove: eventTypes.mouseMove,\n topMouseOut: eventTypes.mouseOut,\n topMouseOver: eventTypes.mouseOver,\n topMouseUp: eventTypes.mouseUp,\n topPaste: eventTypes.paste,\n topPause: eventTypes.pause,\n topPlay: eventTypes.play,\n topPlaying: eventTypes.playing,\n topProgress: eventTypes.progress,\n topRateChange: eventTypes.rateChange,\n topReset: eventTypes.reset,\n topScroll: eventTypes.scroll,\n topSeeked: eventTypes.seeked,\n topSeeking: eventTypes.seeking,\n topStalled: eventTypes.stalled,\n topSubmit: eventTypes.submit,\n topSuspend: eventTypes.suspend,\n topTimeUpdate: eventTypes.timeUpdate,\n topTouchCancel: eventTypes.touchCancel,\n topTouchEnd: eventTypes.touchEnd,\n topTouchMove: eventTypes.touchMove,\n topTouchStart: eventTypes.touchStart,\n topVolumeChange: eventTypes.volumeChange,\n topWaiting: eventTypes.waiting,\n topWheel: eventTypes.wheel\n};\n\nfor (var type in topLevelEventsToDispatchConfig) {\n topLevelEventsToDispatchConfig[type].dependencies = [type];\n}\n\nvar ON_CLICK_KEY = keyOf({ onClick: null });\nvar onClickListeners = {};\n\nvar SimpleEventPlugin = {\n\n eventTypes: eventTypes,\n\n /**\n * @param {string} topLevelType Record from `EventConstants`.\n * @param {DOMEventTarget} topLevelTarget The listening component root node.\n * @param {string} topLevelTargetID ID of `topLevelTarget`.\n * @param {object} nativeEvent Native browser event.\n * @return {*} An accumulation of synthetic events.\n * @see {EventPluginHub.extractEvents}\n */\n extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) {\n var dispatchConfig = topLevelEventsToDispatchConfig[topLevelType];\n if (!dispatchConfig) {\n return null;\n }\n var EventConstructor;\n switch (topLevelType) {\n case topLevelTypes.topAbort:\n case topLevelTypes.topCanPlay:\n case topLevelTypes.topCanPlayThrough:\n case topLevelTypes.topDurationChange:\n case topLevelTypes.topEmptied:\n case topLevelTypes.topEncrypted:\n case topLevelTypes.topEnded:\n case topLevelTypes.topError:\n case topLevelTypes.topInput:\n case topLevelTypes.topLoad:\n case topLevelTypes.topLoadedData:\n case topLevelTypes.topLoadedMetadata:\n case topLevelTypes.topLoadStart:\n case topLevelTypes.topPause:\n case topLevelTypes.topPlay:\n case topLevelTypes.topPlaying:\n case topLevelTypes.topProgress:\n case topLevelTypes.topRateChange:\n case topLevelTypes.topReset:\n case topLevelTypes.topSeeked:\n case topLevelTypes.topSeeking:\n case topLevelTypes.topStalled:\n case topLevelTypes.topSubmit:\n case topLevelTypes.topSuspend:\n case topLevelTypes.topTimeUpdate:\n case topLevelTypes.topVolumeChange:\n case topLevelTypes.topWaiting:\n // HTML Events\n // @see http://www.w3.org/TR/html5/index.html#events-0\n EventConstructor = SyntheticEvent;\n break;\n case topLevelTypes.topKeyPress:\n // FireFox creates a keypress event for function keys too. This removes\n // the unwanted keypress events. Enter is however both printable and\n // non-printable. One would expect Tab to be as well (but it isn't).\n if (getEventCharCode(nativeEvent) === 0) {\n return null;\n }\n /* falls through */\n case topLevelTypes.topKeyDown:\n case topLevelTypes.topKeyUp:\n EventConstructor = SyntheticKeyboardEvent;\n break;\n case topLevelTypes.topBlur:\n case topLevelTypes.topFocus:\n EventConstructor = SyntheticFocusEvent;\n break;\n case topLevelTypes.topClick:\n // Firefox creates a click event on right mouse clicks. This removes the\n // unwanted click events.\n if (nativeEvent.button === 2) {\n return null;\n }\n /* falls through */\n case topLevelTypes.topContextMenu:\n case topLevelTypes.topDoubleClick:\n case topLevelTypes.topMouseDown:\n case topLevelTypes.topMouseMove:\n case topLevelTypes.topMouseOut:\n case topLevelTypes.topMouseOver:\n case topLevelTypes.topMouseUp:\n EventConstructor = SyntheticMouseEvent;\n break;\n case topLevelTypes.topDrag:\n case topLevelTypes.topDragEnd:\n case topLevelTypes.topDragEnter:\n case topLevelTypes.topDragExit:\n case topLevelTypes.topDragLeave:\n case topLevelTypes.topDragOver:\n case topLevelTypes.topDragStart:\n case topLevelTypes.topDrop:\n EventConstructor = SyntheticDragEvent;\n break;\n case topLevelTypes.topTouchCancel:\n case topLevelTypes.topTouchEnd:\n case topLevelTypes.topTouchMove:\n case topLevelTypes.topTouchStart:\n EventConstructor = SyntheticTouchEvent;\n break;\n case topLevelTypes.topScroll:\n EventConstructor = SyntheticUIEvent;\n break;\n case topLevelTypes.topWheel:\n EventConstructor = SyntheticWheelEvent;\n break;\n case topLevelTypes.topCopy:\n case topLevelTypes.topCut:\n case topLevelTypes.topPaste:\n EventConstructor = SyntheticClipboardEvent;\n break;\n }\n !EventConstructor ? process.env.NODE_ENV !== 'production' ? invariant(false, 'SimpleEventPlugin: Unhandled event type, `%s`.', topLevelType) : invariant(false) : undefined;\n var event = EventConstructor.getPooled(dispatchConfig, topLevelTargetID, nativeEvent, nativeEventTarget);\n EventPropagators.accumulateTwoPhaseDispatches(event);\n return event;\n },\n\n didPutListener: function (id, registrationName, listener) {\n // Mobile Safari does not fire properly bubble click events on\n // non-interactive elements, which means delegated click listeners do not\n // fire. The workaround for this bug involves attaching an empty click\n // listener on the target node.\n if (registrationName === ON_CLICK_KEY) {\n var node = ReactMount.getNode(id);\n if (!onClickListeners[id]) {\n onClickListeners[id] = EventListener.listen(node, 'click', emptyFunction);\n }\n }\n },\n\n willDeleteListener: function (id, registrationName) {\n if (registrationName === ON_CLICK_KEY) {\n onClickListeners[id].remove();\n delete onClickListeners[id];\n }\n }\n\n};\n\nmodule.exports = SimpleEventPlugin;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/SimpleEventPlugin.js\n ** module id = 131\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule SyntheticClipboardEvent\n * @typechecks static-only\n */\n\n'use strict';\n\nvar SyntheticEvent = require('./SyntheticEvent');\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/clipboard-apis/\n */\nvar ClipboardEventInterface = {\n clipboardData: function (event) {\n return 'clipboardData' in event ? event.clipboardData : window.clipboardData;\n }\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticUIEvent}\n */\nfunction SyntheticClipboardEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticEvent.augmentClass(SyntheticClipboardEvent, ClipboardEventInterface);\n\nmodule.exports = SyntheticClipboardEvent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/SyntheticClipboardEvent.js\n ** module id = 132\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule SyntheticFocusEvent\n * @typechecks static-only\n */\n\n'use strict';\n\nvar SyntheticUIEvent = require('./SyntheticUIEvent');\n\n/**\n * @interface FocusEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\nvar FocusEventInterface = {\n relatedTarget: null\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticUIEvent}\n */\nfunction SyntheticFocusEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticUIEvent.augmentClass(SyntheticFocusEvent, FocusEventInterface);\n\nmodule.exports = SyntheticFocusEvent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/SyntheticFocusEvent.js\n ** module id = 133\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule SyntheticKeyboardEvent\n * @typechecks static-only\n */\n\n'use strict';\n\nvar SyntheticUIEvent = require('./SyntheticUIEvent');\n\nvar getEventCharCode = require('./getEventCharCode');\nvar getEventKey = require('./getEventKey');\nvar getEventModifierState = require('./getEventModifierState');\n\n/**\n * @interface KeyboardEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\nvar KeyboardEventInterface = {\n key: getEventKey,\n location: null,\n ctrlKey: null,\n shiftKey: null,\n altKey: null,\n metaKey: null,\n repeat: null,\n locale: null,\n getModifierState: getEventModifierState,\n // Legacy Interface\n charCode: function (event) {\n // `charCode` is the result of a KeyPress event and represents the value of\n // the actual printable character.\n\n // KeyPress is deprecated, but its replacement is not yet final and not\n // implemented in any major browser. Only KeyPress has charCode.\n if (event.type === 'keypress') {\n return getEventCharCode(event);\n }\n return 0;\n },\n keyCode: function (event) {\n // `keyCode` is the result of a KeyDown/Up event and represents the value of\n // physical keyboard key.\n\n // The actual meaning of the value depends on the users' keyboard layout\n // which cannot be detected. Assuming that it is a US keyboard layout\n // provides a surprisingly accurate mapping for US and European users.\n // Due to this, it is left to the user to implement at this time.\n if (event.type === 'keydown' || event.type === 'keyup') {\n return event.keyCode;\n }\n return 0;\n },\n which: function (event) {\n // `which` is an alias for either `keyCode` or `charCode` depending on the\n // type of the event.\n if (event.type === 'keypress') {\n return getEventCharCode(event);\n }\n if (event.type === 'keydown' || event.type === 'keyup') {\n return event.keyCode;\n }\n return 0;\n }\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticUIEvent}\n */\nfunction SyntheticKeyboardEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticUIEvent.augmentClass(SyntheticKeyboardEvent, KeyboardEventInterface);\n\nmodule.exports = SyntheticKeyboardEvent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/SyntheticKeyboardEvent.js\n ** module id = 134\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule getEventCharCode\n * @typechecks static-only\n */\n\n'use strict';\n\n/**\n * `charCode` represents the actual \"character code\" and is safe to use with\n * `String.fromCharCode`. As such, only keys that correspond to printable\n * characters produce a valid `charCode`, the only exception to this is Enter.\n * The Tab-key is considered non-printable and does not have a `charCode`,\n * presumably because it does not produce a tab-character in browsers.\n *\n * @param {object} nativeEvent Native browser event.\n * @return {number} Normalized `charCode` property.\n */\nfunction getEventCharCode(nativeEvent) {\n var charCode;\n var keyCode = nativeEvent.keyCode;\n\n if ('charCode' in nativeEvent) {\n charCode = nativeEvent.charCode;\n\n // FF does not set `charCode` for the Enter-key, check against `keyCode`.\n if (charCode === 0 && keyCode === 13) {\n charCode = 13;\n }\n } else {\n // IE8 does not implement `charCode`, but `keyCode` has the correct value.\n charCode = keyCode;\n }\n\n // Some non-printable keys are reported in `charCode`/`keyCode`, discard them.\n // Must not discard the (non-)printable Enter-key.\n if (charCode >= 32 || charCode === 13) {\n return charCode;\n }\n\n return 0;\n}\n\nmodule.exports = getEventCharCode;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/getEventCharCode.js\n ** module id = 135\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule getEventKey\n * @typechecks static-only\n */\n\n'use strict';\n\nvar getEventCharCode = require('./getEventCharCode');\n\n/**\n * Normalization of deprecated HTML5 `key` values\n * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names\n */\nvar normalizeKey = {\n 'Esc': 'Escape',\n 'Spacebar': ' ',\n 'Left': 'ArrowLeft',\n 'Up': 'ArrowUp',\n 'Right': 'ArrowRight',\n 'Down': 'ArrowDown',\n 'Del': 'Delete',\n 'Win': 'OS',\n 'Menu': 'ContextMenu',\n 'Apps': 'ContextMenu',\n 'Scroll': 'ScrollLock',\n 'MozPrintableKey': 'Unidentified'\n};\n\n/**\n * Translation from legacy `keyCode` to HTML5 `key`\n * Only special keys supported, all others depend on keyboard layout or browser\n * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names\n */\nvar translateToKey = {\n 8: 'Backspace',\n 9: 'Tab',\n 12: 'Clear',\n 13: 'Enter',\n 16: 'Shift',\n 17: 'Control',\n 18: 'Alt',\n 19: 'Pause',\n 20: 'CapsLock',\n 27: 'Escape',\n 32: ' ',\n 33: 'PageUp',\n 34: 'PageDown',\n 35: 'End',\n 36: 'Home',\n 37: 'ArrowLeft',\n 38: 'ArrowUp',\n 39: 'ArrowRight',\n 40: 'ArrowDown',\n 45: 'Insert',\n 46: 'Delete',\n 112: 'F1', 113: 'F2', 114: 'F3', 115: 'F4', 116: 'F5', 117: 'F6',\n 118: 'F7', 119: 'F8', 120: 'F9', 121: 'F10', 122: 'F11', 123: 'F12',\n 144: 'NumLock',\n 145: 'ScrollLock',\n 224: 'Meta'\n};\n\n/**\n * @param {object} nativeEvent Native browser event.\n * @return {string} Normalized `key` property.\n */\nfunction getEventKey(nativeEvent) {\n if (nativeEvent.key) {\n // Normalize inconsistent values reported by browsers due to\n // implementations of a working draft specification.\n\n // FireFox implements `key` but returns `MozPrintableKey` for all\n // printable characters (normalized to `Unidentified`), ignore it.\n var key = normalizeKey[nativeEvent.key] || nativeEvent.key;\n if (key !== 'Unidentified') {\n return key;\n }\n }\n\n // Browser does not implement `key`, polyfill as much of it as we can.\n if (nativeEvent.type === 'keypress') {\n var charCode = getEventCharCode(nativeEvent);\n\n // The enter-key is technically both printable and non-printable and can\n // thus be captured by `keypress`, no other non-printable key should.\n return charCode === 13 ? 'Enter' : String.fromCharCode(charCode);\n }\n if (nativeEvent.type === 'keydown' || nativeEvent.type === 'keyup') {\n // While user keyboard layout determines the actual meaning of each\n // `keyCode` value, almost all function keys have a universal value.\n return translateToKey[nativeEvent.keyCode] || 'Unidentified';\n }\n return '';\n}\n\nmodule.exports = getEventKey;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/getEventKey.js\n ** module id = 136\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule SyntheticDragEvent\n * @typechecks static-only\n */\n\n'use strict';\n\nvar SyntheticMouseEvent = require('./SyntheticMouseEvent');\n\n/**\n * @interface DragEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\nvar DragEventInterface = {\n dataTransfer: null\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticUIEvent}\n */\nfunction SyntheticDragEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n SyntheticMouseEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticMouseEvent.augmentClass(SyntheticDragEvent, DragEventInterface);\n\nmodule.exports = SyntheticDragEvent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/SyntheticDragEvent.js\n ** module id = 137\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule SyntheticTouchEvent\n * @typechecks static-only\n */\n\n'use strict';\n\nvar SyntheticUIEvent = require('./SyntheticUIEvent');\n\nvar getEventModifierState = require('./getEventModifierState');\n\n/**\n * @interface TouchEvent\n * @see http://www.w3.org/TR/touch-events/\n */\nvar TouchEventInterface = {\n touches: null,\n targetTouches: null,\n changedTouches: null,\n altKey: null,\n metaKey: null,\n ctrlKey: null,\n shiftKey: null,\n getModifierState: getEventModifierState\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticUIEvent}\n */\nfunction SyntheticTouchEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticUIEvent.augmentClass(SyntheticTouchEvent, TouchEventInterface);\n\nmodule.exports = SyntheticTouchEvent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/SyntheticTouchEvent.js\n ** module id = 138\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule SyntheticWheelEvent\n * @typechecks static-only\n */\n\n'use strict';\n\nvar SyntheticMouseEvent = require('./SyntheticMouseEvent');\n\n/**\n * @interface WheelEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\nvar WheelEventInterface = {\n deltaX: function (event) {\n return 'deltaX' in event ? event.deltaX :\n // Fallback to `wheelDeltaX` for Webkit and normalize (right is positive).\n 'wheelDeltaX' in event ? -event.wheelDeltaX : 0;\n },\n deltaY: function (event) {\n return 'deltaY' in event ? event.deltaY :\n // Fallback to `wheelDeltaY` for Webkit and normalize (down is positive).\n 'wheelDeltaY' in event ? -event.wheelDeltaY :\n // Fallback to `wheelDelta` for IE<9 and normalize (down is positive).\n 'wheelDelta' in event ? -event.wheelDelta : 0;\n },\n deltaZ: null,\n\n // Browsers without \"deltaMode\" is reporting in raw wheel delta where one\n // notch on the scroll is always +/- 120, roughly equivalent to pixels.\n // A good approximation of DOM_DELTA_LINE (1) is 5% of viewport size or\n // ~40 pixels, for DOM_DELTA_SCREEN (2) it is 87.5% of viewport size.\n deltaMode: null\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticMouseEvent}\n */\nfunction SyntheticWheelEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n SyntheticMouseEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticMouseEvent.augmentClass(SyntheticWheelEvent, WheelEventInterface);\n\nmodule.exports = SyntheticWheelEvent;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/SyntheticWheelEvent.js\n ** module id = 139\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule SVGDOMPropertyConfig\n */\n\n'use strict';\n\nvar DOMProperty = require('./DOMProperty');\n\nvar MUST_USE_ATTRIBUTE = DOMProperty.injection.MUST_USE_ATTRIBUTE;\n\nvar NS = {\n xlink: 'http://www.w3.org/1999/xlink',\n xml: 'http://www.w3.org/XML/1998/namespace'\n};\n\nvar SVGDOMPropertyConfig = {\n Properties: {\n clipPath: MUST_USE_ATTRIBUTE,\n cx: MUST_USE_ATTRIBUTE,\n cy: MUST_USE_ATTRIBUTE,\n d: MUST_USE_ATTRIBUTE,\n dx: MUST_USE_ATTRIBUTE,\n dy: MUST_USE_ATTRIBUTE,\n fill: MUST_USE_ATTRIBUTE,\n fillOpacity: MUST_USE_ATTRIBUTE,\n fontFamily: MUST_USE_ATTRIBUTE,\n fontSize: MUST_USE_ATTRIBUTE,\n fx: MUST_USE_ATTRIBUTE,\n fy: MUST_USE_ATTRIBUTE,\n gradientTransform: MUST_USE_ATTRIBUTE,\n gradientUnits: MUST_USE_ATTRIBUTE,\n markerEnd: MUST_USE_ATTRIBUTE,\n markerMid: MUST_USE_ATTRIBUTE,\n markerStart: MUST_USE_ATTRIBUTE,\n offset: MUST_USE_ATTRIBUTE,\n opacity: MUST_USE_ATTRIBUTE,\n patternContentUnits: MUST_USE_ATTRIBUTE,\n patternUnits: MUST_USE_ATTRIBUTE,\n points: MUST_USE_ATTRIBUTE,\n preserveAspectRatio: MUST_USE_ATTRIBUTE,\n r: MUST_USE_ATTRIBUTE,\n rx: MUST_USE_ATTRIBUTE,\n ry: MUST_USE_ATTRIBUTE,\n spreadMethod: MUST_USE_ATTRIBUTE,\n stopColor: MUST_USE_ATTRIBUTE,\n stopOpacity: MUST_USE_ATTRIBUTE,\n stroke: MUST_USE_ATTRIBUTE,\n strokeDasharray: MUST_USE_ATTRIBUTE,\n strokeLinecap: MUST_USE_ATTRIBUTE,\n strokeOpacity: MUST_USE_ATTRIBUTE,\n strokeWidth: MUST_USE_ATTRIBUTE,\n textAnchor: MUST_USE_ATTRIBUTE,\n transform: MUST_USE_ATTRIBUTE,\n version: MUST_USE_ATTRIBUTE,\n viewBox: MUST_USE_ATTRIBUTE,\n x1: MUST_USE_ATTRIBUTE,\n x2: MUST_USE_ATTRIBUTE,\n x: MUST_USE_ATTRIBUTE,\n xlinkActuate: MUST_USE_ATTRIBUTE,\n xlinkArcrole: MUST_USE_ATTRIBUTE,\n xlinkHref: MUST_USE_ATTRIBUTE,\n xlinkRole: MUST_USE_ATTRIBUTE,\n xlinkShow: MUST_USE_ATTRIBUTE,\n xlinkTitle: MUST_USE_ATTRIBUTE,\n xlinkType: MUST_USE_ATTRIBUTE,\n xmlBase: MUST_USE_ATTRIBUTE,\n xmlLang: MUST_USE_ATTRIBUTE,\n xmlSpace: MUST_USE_ATTRIBUTE,\n y1: MUST_USE_ATTRIBUTE,\n y2: MUST_USE_ATTRIBUTE,\n y: MUST_USE_ATTRIBUTE\n },\n DOMAttributeNamespaces: {\n xlinkActuate: NS.xlink,\n xlinkArcrole: NS.xlink,\n xlinkHref: NS.xlink,\n xlinkRole: NS.xlink,\n xlinkShow: NS.xlink,\n xlinkTitle: NS.xlink,\n xlinkType: NS.xlink,\n xmlBase: NS.xml,\n xmlLang: NS.xml,\n xmlSpace: NS.xml\n },\n DOMAttributeNames: {\n clipPath: 'clip-path',\n fillOpacity: 'fill-opacity',\n fontFamily: 'font-family',\n fontSize: 'font-size',\n gradientTransform: 'gradientTransform',\n gradientUnits: 'gradientUnits',\n markerEnd: 'marker-end',\n markerMid: 'marker-mid',\n markerStart: 'marker-start',\n patternContentUnits: 'patternContentUnits',\n patternUnits: 'patternUnits',\n preserveAspectRatio: 'preserveAspectRatio',\n spreadMethod: 'spreadMethod',\n stopColor: 'stop-color',\n stopOpacity: 'stop-opacity',\n strokeDasharray: 'stroke-dasharray',\n strokeLinecap: 'stroke-linecap',\n strokeOpacity: 'stroke-opacity',\n strokeWidth: 'stroke-width',\n textAnchor: 'text-anchor',\n viewBox: 'viewBox',\n xlinkActuate: 'xlink:actuate',\n xlinkArcrole: 'xlink:arcrole',\n xlinkHref: 'xlink:href',\n xlinkRole: 'xlink:role',\n xlinkShow: 'xlink:show',\n xlinkTitle: 'xlink:title',\n xlinkType: 'xlink:type',\n xmlBase: 'xml:base',\n xmlLang: 'xml:lang',\n xmlSpace: 'xml:space'\n }\n};\n\nmodule.exports = SVGDOMPropertyConfig;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/SVGDOMPropertyConfig.js\n ** module id = 140\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactDefaultPerf\n * @typechecks static-only\n */\n\n'use strict';\n\nvar DOMProperty = require('./DOMProperty');\nvar ReactDefaultPerfAnalysis = require('./ReactDefaultPerfAnalysis');\nvar ReactMount = require('./ReactMount');\nvar ReactPerf = require('./ReactPerf');\n\nvar performanceNow = require('fbjs/lib/performanceNow');\n\nfunction roundFloat(val) {\n return Math.floor(val * 100) / 100;\n}\n\nfunction addValue(obj, key, val) {\n obj[key] = (obj[key] || 0) + val;\n}\n\nvar ReactDefaultPerf = {\n _allMeasurements: [], // last item in the list is the current one\n _mountStack: [0],\n _injected: false,\n\n start: function () {\n if (!ReactDefaultPerf._injected) {\n ReactPerf.injection.injectMeasure(ReactDefaultPerf.measure);\n }\n\n ReactDefaultPerf._allMeasurements.length = 0;\n ReactPerf.enableMeasure = true;\n },\n\n stop: function () {\n ReactPerf.enableMeasure = false;\n },\n\n getLastMeasurements: function () {\n return ReactDefaultPerf._allMeasurements;\n },\n\n printExclusive: function (measurements) {\n measurements = measurements || ReactDefaultPerf._allMeasurements;\n var summary = ReactDefaultPerfAnalysis.getExclusiveSummary(measurements);\n console.table(summary.map(function (item) {\n return {\n 'Component class name': item.componentName,\n 'Total inclusive time (ms)': roundFloat(item.inclusive),\n 'Exclusive mount time (ms)': roundFloat(item.exclusive),\n 'Exclusive render time (ms)': roundFloat(item.render),\n 'Mount time per instance (ms)': roundFloat(item.exclusive / item.count),\n 'Render time per instance (ms)': roundFloat(item.render / item.count),\n 'Instances': item.count\n };\n }));\n // TODO: ReactDefaultPerfAnalysis.getTotalTime() does not return the correct\n // number.\n },\n\n printInclusive: function (measurements) {\n measurements = measurements || ReactDefaultPerf._allMeasurements;\n var summary = ReactDefaultPerfAnalysis.getInclusiveSummary(measurements);\n console.table(summary.map(function (item) {\n return {\n 'Owner > component': item.componentName,\n 'Inclusive time (ms)': roundFloat(item.time),\n 'Instances': item.count\n };\n }));\n console.log('Total time:', ReactDefaultPerfAnalysis.getTotalTime(measurements).toFixed(2) + ' ms');\n },\n\n getMeasurementsSummaryMap: function (measurements) {\n var summary = ReactDefaultPerfAnalysis.getInclusiveSummary(measurements, true);\n return summary.map(function (item) {\n return {\n 'Owner > component': item.componentName,\n 'Wasted time (ms)': item.time,\n 'Instances': item.count\n };\n });\n },\n\n printWasted: function (measurements) {\n measurements = measurements || ReactDefaultPerf._allMeasurements;\n console.table(ReactDefaultPerf.getMeasurementsSummaryMap(measurements));\n console.log('Total time:', ReactDefaultPerfAnalysis.getTotalTime(measurements).toFixed(2) + ' ms');\n },\n\n printDOM: function (measurements) {\n measurements = measurements || ReactDefaultPerf._allMeasurements;\n var summary = ReactDefaultPerfAnalysis.getDOMSummary(measurements);\n console.table(summary.map(function (item) {\n var result = {};\n result[DOMProperty.ID_ATTRIBUTE_NAME] = item.id;\n result.type = item.type;\n result.args = JSON.stringify(item.args);\n return result;\n }));\n console.log('Total time:', ReactDefaultPerfAnalysis.getTotalTime(measurements).toFixed(2) + ' ms');\n },\n\n _recordWrite: function (id, fnName, totalTime, args) {\n // TODO: totalTime isn't that useful since it doesn't count paints/reflows\n var writes = ReactDefaultPerf._allMeasurements[ReactDefaultPerf._allMeasurements.length - 1].writes;\n writes[id] = writes[id] || [];\n writes[id].push({\n type: fnName,\n time: totalTime,\n args: args\n });\n },\n\n measure: function (moduleName, fnName, func) {\n return function () {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n var totalTime;\n var rv;\n var start;\n\n if (fnName === '_renderNewRootComponent' || fnName === 'flushBatchedUpdates') {\n // A \"measurement\" is a set of metrics recorded for each flush. We want\n // to group the metrics for a given flush together so we can look at the\n // components that rendered and the DOM operations that actually\n // happened to determine the amount of \"wasted work\" performed.\n ReactDefaultPerf._allMeasurements.push({\n exclusive: {},\n inclusive: {},\n render: {},\n counts: {},\n writes: {},\n displayNames: {},\n totalTime: 0,\n created: {}\n });\n start = performanceNow();\n rv = func.apply(this, args);\n ReactDefaultPerf._allMeasurements[ReactDefaultPerf._allMeasurements.length - 1].totalTime = performanceNow() - start;\n return rv;\n } else if (fnName === '_mountImageIntoNode' || moduleName === 'ReactBrowserEventEmitter' || moduleName === 'ReactDOMIDOperations' || moduleName === 'CSSPropertyOperations' || moduleName === 'DOMChildrenOperations' || moduleName === 'DOMPropertyOperations') {\n start = performanceNow();\n rv = func.apply(this, args);\n totalTime = performanceNow() - start;\n\n if (fnName === '_mountImageIntoNode') {\n var mountID = ReactMount.getID(args[1]);\n ReactDefaultPerf._recordWrite(mountID, fnName, totalTime, args[0]);\n } else if (fnName === 'dangerouslyProcessChildrenUpdates') {\n // special format\n args[0].forEach(function (update) {\n var writeArgs = {};\n if (update.fromIndex !== null) {\n writeArgs.fromIndex = update.fromIndex;\n }\n if (update.toIndex !== null) {\n writeArgs.toIndex = update.toIndex;\n }\n if (update.textContent !== null) {\n writeArgs.textContent = update.textContent;\n }\n if (update.markupIndex !== null) {\n writeArgs.markup = args[1][update.markupIndex];\n }\n ReactDefaultPerf._recordWrite(update.parentID, update.type, totalTime, writeArgs);\n });\n } else {\n // basic format\n var id = args[0];\n if (typeof id === 'object') {\n id = ReactMount.getID(args[0]);\n }\n ReactDefaultPerf._recordWrite(id, fnName, totalTime, Array.prototype.slice.call(args, 1));\n }\n return rv;\n } else if (moduleName === 'ReactCompositeComponent' && (fnName === 'mountComponent' || fnName === 'updateComponent' || // TODO: receiveComponent()?\n fnName === '_renderValidatedComponent')) {\n\n if (this._currentElement.type === ReactMount.TopLevelWrapper) {\n return func.apply(this, args);\n }\n\n var rootNodeID = fnName === 'mountComponent' ? args[0] : this._rootNodeID;\n var isRender = fnName === '_renderValidatedComponent';\n var isMount = fnName === 'mountComponent';\n\n var mountStack = ReactDefaultPerf._mountStack;\n var entry = ReactDefaultPerf._allMeasurements[ReactDefaultPerf._allMeasurements.length - 1];\n\n if (isRender) {\n addValue(entry.counts, rootNodeID, 1);\n } else if (isMount) {\n entry.created[rootNodeID] = true;\n mountStack.push(0);\n }\n\n start = performanceNow();\n rv = func.apply(this, args);\n totalTime = performanceNow() - start;\n\n if (isRender) {\n addValue(entry.render, rootNodeID, totalTime);\n } else if (isMount) {\n var subMountTime = mountStack.pop();\n mountStack[mountStack.length - 1] += totalTime;\n addValue(entry.exclusive, rootNodeID, totalTime - subMountTime);\n addValue(entry.inclusive, rootNodeID, totalTime);\n } else {\n addValue(entry.inclusive, rootNodeID, totalTime);\n }\n\n entry.displayNames[rootNodeID] = {\n current: this.getName(),\n owner: this._currentElement._owner ? this._currentElement._owner.getName() : '<root>'\n };\n\n return rv;\n } else {\n return func.apply(this, args);\n }\n };\n }\n};\n\nmodule.exports = ReactDefaultPerf;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactDefaultPerf.js\n ** module id = 141\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactDefaultPerfAnalysis\n */\n\n'use strict';\n\nvar assign = require('./Object.assign');\n\n// Don't try to save users less than 1.2ms (a number I made up)\nvar DONT_CARE_THRESHOLD = 1.2;\nvar DOM_OPERATION_TYPES = {\n '_mountImageIntoNode': 'set innerHTML',\n INSERT_MARKUP: 'set innerHTML',\n MOVE_EXISTING: 'move',\n REMOVE_NODE: 'remove',\n SET_MARKUP: 'set innerHTML',\n TEXT_CONTENT: 'set textContent',\n 'setValueForProperty': 'update attribute',\n 'setValueForAttribute': 'update attribute',\n 'deleteValueForProperty': 'remove attribute',\n 'dangerouslyReplaceNodeWithMarkupByID': 'replace'\n};\n\nfunction getTotalTime(measurements) {\n // TODO: return number of DOM ops? could be misleading.\n // TODO: measure dropped frames after reconcile?\n // TODO: log total time of each reconcile and the top-level component\n // class that triggered it.\n var totalTime = 0;\n for (var i = 0; i < measurements.length; i++) {\n var measurement = measurements[i];\n totalTime += measurement.totalTime;\n }\n return totalTime;\n}\n\nfunction getDOMSummary(measurements) {\n var items = [];\n measurements.forEach(function (measurement) {\n Object.keys(measurement.writes).forEach(function (id) {\n measurement.writes[id].forEach(function (write) {\n items.push({\n id: id,\n type: DOM_OPERATION_TYPES[write.type] || write.type,\n args: write.args\n });\n });\n });\n });\n return items;\n}\n\nfunction getExclusiveSummary(measurements) {\n var candidates = {};\n var displayName;\n\n for (var i = 0; i < measurements.length; i++) {\n var measurement = measurements[i];\n var allIDs = assign({}, measurement.exclusive, measurement.inclusive);\n\n for (var id in allIDs) {\n displayName = measurement.displayNames[id].current;\n\n candidates[displayName] = candidates[displayName] || {\n componentName: displayName,\n inclusive: 0,\n exclusive: 0,\n render: 0,\n count: 0\n };\n if (measurement.render[id]) {\n candidates[displayName].render += measurement.render[id];\n }\n if (measurement.exclusive[id]) {\n candidates[displayName].exclusive += measurement.exclusive[id];\n }\n if (measurement.inclusive[id]) {\n candidates[displayName].inclusive += measurement.inclusive[id];\n }\n if (measurement.counts[id]) {\n candidates[displayName].count += measurement.counts[id];\n }\n }\n }\n\n // Now make a sorted array with the results.\n var arr = [];\n for (displayName in candidates) {\n if (candidates[displayName].exclusive >= DONT_CARE_THRESHOLD) {\n arr.push(candidates[displayName]);\n }\n }\n\n arr.sort(function (a, b) {\n return b.exclusive - a.exclusive;\n });\n\n return arr;\n}\n\nfunction getInclusiveSummary(measurements, onlyClean) {\n var candidates = {};\n var inclusiveKey;\n\n for (var i = 0; i < measurements.length; i++) {\n var measurement = measurements[i];\n var allIDs = assign({}, measurement.exclusive, measurement.inclusive);\n var cleanComponents;\n\n if (onlyClean) {\n cleanComponents = getUnchangedComponents(measurement);\n }\n\n for (var id in allIDs) {\n if (onlyClean && !cleanComponents[id]) {\n continue;\n }\n\n var displayName = measurement.displayNames[id];\n\n // Inclusive time is not useful for many components without knowing where\n // they are instantiated. So we aggregate inclusive time with both the\n // owner and current displayName as the key.\n inclusiveKey = displayName.owner + ' > ' + displayName.current;\n\n candidates[inclusiveKey] = candidates[inclusiveKey] || {\n componentName: inclusiveKey,\n time: 0,\n count: 0\n };\n\n if (measurement.inclusive[id]) {\n candidates[inclusiveKey].time += measurement.inclusive[id];\n }\n if (measurement.counts[id]) {\n candidates[inclusiveKey].count += measurement.counts[id];\n }\n }\n }\n\n // Now make a sorted array with the results.\n var arr = [];\n for (inclusiveKey in candidates) {\n if (candidates[inclusiveKey].time >= DONT_CARE_THRESHOLD) {\n arr.push(candidates[inclusiveKey]);\n }\n }\n\n arr.sort(function (a, b) {\n return b.time - a.time;\n });\n\n return arr;\n}\n\nfunction getUnchangedComponents(measurement) {\n // For a given reconcile, look at which components did not actually\n // render anything to the DOM and return a mapping of their ID to\n // the amount of time it took to render the entire subtree.\n var cleanComponents = {};\n var dirtyLeafIDs = Object.keys(measurement.writes);\n var allIDs = assign({}, measurement.exclusive, measurement.inclusive);\n\n for (var id in allIDs) {\n var isDirty = false;\n // For each component that rendered, see if a component that triggered\n // a DOM op is in its subtree.\n for (var i = 0; i < dirtyLeafIDs.length; i++) {\n if (dirtyLeafIDs[i].indexOf(id) === 0) {\n isDirty = true;\n break;\n }\n }\n // check if component newly created\n if (measurement.created[id]) {\n isDirty = true;\n }\n if (!isDirty && measurement.counts[id] > 0) {\n cleanComponents[id] = true;\n }\n }\n return cleanComponents;\n}\n\nvar ReactDefaultPerfAnalysis = {\n getExclusiveSummary: getExclusiveSummary,\n getInclusiveSummary: getInclusiveSummary,\n getDOMSummary: getDOMSummary,\n getTotalTime: getTotalTime\n};\n\nmodule.exports = ReactDefaultPerfAnalysis;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactDefaultPerfAnalysis.js\n ** module id = 142\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule performanceNow\n * @typechecks\n */\n\n'use strict';\n\nvar performance = require('./performance');\nvar curPerformance = performance;\n\n/**\n * Detect if we can use `window.performance.now()` and gracefully fallback to\n * `Date.now()` if it doesn't exist. We need to support Firefox < 15 for now\n * because of Facebook's testing infrastructure.\n */\nif (!curPerformance || !curPerformance.now) {\n curPerformance = Date;\n}\n\nvar performanceNow = curPerformance.now.bind(curPerformance);\n\nmodule.exports = performanceNow;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/performanceNow.js\n ** module id = 143\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule performance\n * @typechecks\n */\n\n'use strict';\n\nvar ExecutionEnvironment = require('./ExecutionEnvironment');\n\nvar performance;\n\nif (ExecutionEnvironment.canUseDOM) {\n performance = window.performance || window.msPerformance || window.webkitPerformance;\n}\n\nmodule.exports = performance || {};\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/performance.js\n ** module id = 144\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactVersion\n */\n\n'use strict';\n\nmodule.exports = '0.14.3';\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactVersion.js\n ** module id = 145\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n* @providesModule renderSubtreeIntoContainer\n*/\n\n'use strict';\n\nvar ReactMount = require('./ReactMount');\n\nmodule.exports = ReactMount.renderSubtreeIntoContainer;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/renderSubtreeIntoContainer.js\n ** module id = 146\n ** module chunks = 0 1\n **/","'use strict';\n\nmodule.exports = require('./lib/React');\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/react.js\n ** module id = 147\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule React\n */\n\n'use strict';\n\nvar ReactDOM = require('./ReactDOM');\nvar ReactDOMServer = require('./ReactDOMServer');\nvar ReactIsomorphic = require('./ReactIsomorphic');\n\nvar assign = require('./Object.assign');\nvar deprecated = require('./deprecated');\n\n// `version` will be added here by ReactIsomorphic.\nvar React = {};\n\nassign(React, ReactIsomorphic);\n\nassign(React, {\n // ReactDOM\n findDOMNode: deprecated('findDOMNode', 'ReactDOM', 'react-dom', ReactDOM, ReactDOM.findDOMNode),\n render: deprecated('render', 'ReactDOM', 'react-dom', ReactDOM, ReactDOM.render),\n unmountComponentAtNode: deprecated('unmountComponentAtNode', 'ReactDOM', 'react-dom', ReactDOM, ReactDOM.unmountComponentAtNode),\n\n // ReactDOMServer\n renderToString: deprecated('renderToString', 'ReactDOMServer', 'react-dom/server', ReactDOMServer, ReactDOMServer.renderToString),\n renderToStaticMarkup: deprecated('renderToStaticMarkup', 'ReactDOMServer', 'react-dom/server', ReactDOMServer, ReactDOMServer.renderToStaticMarkup)\n});\n\nReact.__SECRET_DOM_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ReactDOM;\nReact.__SECRET_DOM_SERVER_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ReactDOMServer;\n\nmodule.exports = React;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/React.js\n ** module id = 148\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactDOMServer\n */\n\n'use strict';\n\nvar ReactDefaultInjection = require('./ReactDefaultInjection');\nvar ReactServerRendering = require('./ReactServerRendering');\nvar ReactVersion = require('./ReactVersion');\n\nReactDefaultInjection.inject();\n\nvar ReactDOMServer = {\n renderToString: ReactServerRendering.renderToString,\n renderToStaticMarkup: ReactServerRendering.renderToStaticMarkup,\n version: ReactVersion\n};\n\nmodule.exports = ReactDOMServer;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactDOMServer.js\n ** module id = 149\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @typechecks static-only\n * @providesModule ReactServerRendering\n */\n'use strict';\n\nvar ReactDefaultBatchingStrategy = require('./ReactDefaultBatchingStrategy');\nvar ReactElement = require('./ReactElement');\nvar ReactInstanceHandles = require('./ReactInstanceHandles');\nvar ReactMarkupChecksum = require('./ReactMarkupChecksum');\nvar ReactServerBatchingStrategy = require('./ReactServerBatchingStrategy');\nvar ReactServerRenderingTransaction = require('./ReactServerRenderingTransaction');\nvar ReactUpdates = require('./ReactUpdates');\n\nvar emptyObject = require('fbjs/lib/emptyObject');\nvar instantiateReactComponent = require('./instantiateReactComponent');\nvar invariant = require('fbjs/lib/invariant');\n\n/**\n * @param {ReactElement} element\n * @return {string} the HTML markup\n */\nfunction renderToString(element) {\n !ReactElement.isValidElement(element) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'renderToString(): You must pass a valid ReactElement.') : invariant(false) : undefined;\n\n var transaction;\n try {\n ReactUpdates.injection.injectBatchingStrategy(ReactServerBatchingStrategy);\n\n var id = ReactInstanceHandles.createReactRootID();\n transaction = ReactServerRenderingTransaction.getPooled(false);\n\n return transaction.perform(function () {\n var componentInstance = instantiateReactComponent(element, null);\n var markup = componentInstance.mountComponent(id, transaction, emptyObject);\n return ReactMarkupChecksum.addChecksumToMarkup(markup);\n }, null);\n } finally {\n ReactServerRenderingTransaction.release(transaction);\n // Revert to the DOM batching strategy since these two renderers\n // currently share these stateful modules.\n ReactUpdates.injection.injectBatchingStrategy(ReactDefaultBatchingStrategy);\n }\n}\n\n/**\n * @param {ReactElement} element\n * @return {string} the HTML markup, without the extra React ID and checksum\n * (for generating static pages)\n */\nfunction renderToStaticMarkup(element) {\n !ReactElement.isValidElement(element) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'renderToStaticMarkup(): You must pass a valid ReactElement.') : invariant(false) : undefined;\n\n var transaction;\n try {\n ReactUpdates.injection.injectBatchingStrategy(ReactServerBatchingStrategy);\n\n var id = ReactInstanceHandles.createReactRootID();\n transaction = ReactServerRenderingTransaction.getPooled(true);\n\n return transaction.perform(function () {\n var componentInstance = instantiateReactComponent(element, null);\n return componentInstance.mountComponent(id, transaction, emptyObject);\n }, null);\n } finally {\n ReactServerRenderingTransaction.release(transaction);\n // Revert to the DOM batching strategy since these two renderers\n // currently share these stateful modules.\n ReactUpdates.injection.injectBatchingStrategy(ReactDefaultBatchingStrategy);\n }\n}\n\nmodule.exports = {\n renderToString: renderToString,\n renderToStaticMarkup: renderToStaticMarkup\n};\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactServerRendering.js\n ** module id = 150\n ** module chunks = 0 1\n **/","/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactServerBatchingStrategy\n * @typechecks\n */\n\n'use strict';\n\nvar ReactServerBatchingStrategy = {\n isBatchingUpdates: false,\n batchedUpdates: function (callback) {\n // Don't do anything here. During the server rendering we don't want to\n // schedule any updates. We will simply ignore them.\n }\n};\n\nmodule.exports = ReactServerBatchingStrategy;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactServerBatchingStrategy.js\n ** module id = 151\n ** module chunks = 0 1\n **/","/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactServerRenderingTransaction\n * @typechecks\n */\n\n'use strict';\n\nvar PooledClass = require('./PooledClass');\nvar CallbackQueue = require('./CallbackQueue');\nvar Transaction = require('./Transaction');\n\nvar assign = require('./Object.assign');\nvar emptyFunction = require('fbjs/lib/emptyFunction');\n\n/**\n * Provides a `CallbackQueue` queue for collecting `onDOMReady` callbacks\n * during the performing of the transaction.\n */\nvar ON_DOM_READY_QUEUEING = {\n /**\n * Initializes the internal `onDOMReady` queue.\n */\n initialize: function () {\n this.reactMountReady.reset();\n },\n\n close: emptyFunction\n};\n\n/**\n * Executed within the scope of the `Transaction` instance. Consider these as\n * being member methods, but with an implied ordering while being isolated from\n * each other.\n */\nvar TRANSACTION_WRAPPERS = [ON_DOM_READY_QUEUEING];\n\n/**\n * @class ReactServerRenderingTransaction\n * @param {boolean} renderToStaticMarkup\n */\nfunction ReactServerRenderingTransaction(renderToStaticMarkup) {\n this.reinitializeTransaction();\n this.renderToStaticMarkup = renderToStaticMarkup;\n this.reactMountReady = CallbackQueue.getPooled(null);\n this.useCreateElement = false;\n}\n\nvar Mixin = {\n /**\n * @see Transaction\n * @abstract\n * @final\n * @return {array} Empty list of operation wrap procedures.\n */\n getTransactionWrappers: function () {\n return TRANSACTION_WRAPPERS;\n },\n\n /**\n * @return {object} The queue to collect `onDOMReady` callbacks with.\n */\n getReactMountReady: function () {\n return this.reactMountReady;\n },\n\n /**\n * `PooledClass` looks for this, and will invoke this before allowing this\n * instance to be reused.\n */\n destructor: function () {\n CallbackQueue.release(this.reactMountReady);\n this.reactMountReady = null;\n }\n};\n\nassign(ReactServerRenderingTransaction.prototype, Transaction.Mixin, Mixin);\n\nPooledClass.addPoolingTo(ReactServerRenderingTransaction);\n\nmodule.exports = ReactServerRenderingTransaction;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactServerRenderingTransaction.js\n ** module id = 152\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactIsomorphic\n */\n\n'use strict';\n\nvar ReactChildren = require('./ReactChildren');\nvar ReactComponent = require('./ReactComponent');\nvar ReactClass = require('./ReactClass');\nvar ReactDOMFactories = require('./ReactDOMFactories');\nvar ReactElement = require('./ReactElement');\nvar ReactElementValidator = require('./ReactElementValidator');\nvar ReactPropTypes = require('./ReactPropTypes');\nvar ReactVersion = require('./ReactVersion');\n\nvar assign = require('./Object.assign');\nvar onlyChild = require('./onlyChild');\n\nvar createElement = ReactElement.createElement;\nvar createFactory = ReactElement.createFactory;\nvar cloneElement = ReactElement.cloneElement;\n\nif (process.env.NODE_ENV !== 'production') {\n createElement = ReactElementValidator.createElement;\n createFactory = ReactElementValidator.createFactory;\n cloneElement = ReactElementValidator.cloneElement;\n}\n\nvar React = {\n\n // Modern\n\n Children: {\n map: ReactChildren.map,\n forEach: ReactChildren.forEach,\n count: ReactChildren.count,\n toArray: ReactChildren.toArray,\n only: onlyChild\n },\n\n Component: ReactComponent,\n\n createElement: createElement,\n cloneElement: cloneElement,\n isValidElement: ReactElement.isValidElement,\n\n // Classic\n\n PropTypes: ReactPropTypes,\n createClass: ReactClass.createClass,\n createFactory: createFactory,\n createMixin: function (mixin) {\n // Currently a noop. Will be used to validate and trace mixins.\n return mixin;\n },\n\n // This looks DOM specific but these are actually isomorphic helpers\n // since they are just generating DOM strings.\n DOM: ReactDOMFactories,\n\n version: ReactVersion,\n\n // Hook for JSX spread, don't use this for anything else.\n __spread: assign\n};\n\nmodule.exports = React;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactIsomorphic.js\n ** module id = 153\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactDOMFactories\n * @typechecks static-only\n */\n\n'use strict';\n\nvar ReactElement = require('./ReactElement');\nvar ReactElementValidator = require('./ReactElementValidator');\n\nvar mapObject = require('fbjs/lib/mapObject');\n\n/**\n * Create a factory that creates HTML tag elements.\n *\n * @param {string} tag Tag name (e.g. `div`).\n * @private\n */\nfunction createDOMFactory(tag) {\n if (process.env.NODE_ENV !== 'production') {\n return ReactElementValidator.createFactory(tag);\n }\n return ReactElement.createFactory(tag);\n}\n\n/**\n * Creates a mapping from supported HTML tags to `ReactDOMComponent` classes.\n * This is also accessible via `React.DOM`.\n *\n * @public\n */\nvar ReactDOMFactories = mapObject({\n a: 'a',\n abbr: 'abbr',\n address: 'address',\n area: 'area',\n article: 'article',\n aside: 'aside',\n audio: 'audio',\n b: 'b',\n base: 'base',\n bdi: 'bdi',\n bdo: 'bdo',\n big: 'big',\n blockquote: 'blockquote',\n body: 'body',\n br: 'br',\n button: 'button',\n canvas: 'canvas',\n caption: 'caption',\n cite: 'cite',\n code: 'code',\n col: 'col',\n colgroup: 'colgroup',\n data: 'data',\n datalist: 'datalist',\n dd: 'dd',\n del: 'del',\n details: 'details',\n dfn: 'dfn',\n dialog: 'dialog',\n div: 'div',\n dl: 'dl',\n dt: 'dt',\n em: 'em',\n embed: 'embed',\n fieldset: 'fieldset',\n figcaption: 'figcaption',\n figure: 'figure',\n footer: 'footer',\n form: 'form',\n h1: 'h1',\n h2: 'h2',\n h3: 'h3',\n h4: 'h4',\n h5: 'h5',\n h6: 'h6',\n head: 'head',\n header: 'header',\n hgroup: 'hgroup',\n hr: 'hr',\n html: 'html',\n i: 'i',\n iframe: 'iframe',\n img: 'img',\n input: 'input',\n ins: 'ins',\n kbd: 'kbd',\n keygen: 'keygen',\n label: 'label',\n legend: 'legend',\n li: 'li',\n link: 'link',\n main: 'main',\n map: 'map',\n mark: 'mark',\n menu: 'menu',\n menuitem: 'menuitem',\n meta: 'meta',\n meter: 'meter',\n nav: 'nav',\n noscript: 'noscript',\n object: 'object',\n ol: 'ol',\n optgroup: 'optgroup',\n option: 'option',\n output: 'output',\n p: 'p',\n param: 'param',\n picture: 'picture',\n pre: 'pre',\n progress: 'progress',\n q: 'q',\n rp: 'rp',\n rt: 'rt',\n ruby: 'ruby',\n s: 's',\n samp: 'samp',\n script: 'script',\n section: 'section',\n select: 'select',\n small: 'small',\n source: 'source',\n span: 'span',\n strong: 'strong',\n style: 'style',\n sub: 'sub',\n summary: 'summary',\n sup: 'sup',\n table: 'table',\n tbody: 'tbody',\n td: 'td',\n textarea: 'textarea',\n tfoot: 'tfoot',\n th: 'th',\n thead: 'thead',\n time: 'time',\n title: 'title',\n tr: 'tr',\n track: 'track',\n u: 'u',\n ul: 'ul',\n 'var': 'var',\n video: 'video',\n wbr: 'wbr',\n\n // SVG\n circle: 'circle',\n clipPath: 'clipPath',\n defs: 'defs',\n ellipse: 'ellipse',\n g: 'g',\n image: 'image',\n line: 'line',\n linearGradient: 'linearGradient',\n mask: 'mask',\n path: 'path',\n pattern: 'pattern',\n polygon: 'polygon',\n polyline: 'polyline',\n radialGradient: 'radialGradient',\n rect: 'rect',\n stop: 'stop',\n svg: 'svg',\n text: 'text',\n tspan: 'tspan'\n\n}, createDOMFactory);\n\nmodule.exports = ReactDOMFactories;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactDOMFactories.js\n ** module id = 154\n ** module chunks = 0 1\n **/","/**\n * Copyright 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactElementValidator\n */\n\n/**\n * ReactElementValidator provides a wrapper around a element factory\n * which validates the props passed to the element. This is intended to be\n * used only in DEV and could be replaced by a static type checker for languages\n * that support it.\n */\n\n'use strict';\n\nvar ReactElement = require('./ReactElement');\nvar ReactPropTypeLocations = require('./ReactPropTypeLocations');\nvar ReactPropTypeLocationNames = require('./ReactPropTypeLocationNames');\nvar ReactCurrentOwner = require('./ReactCurrentOwner');\n\nvar canDefineProperty = require('./canDefineProperty');\nvar getIteratorFn = require('./getIteratorFn');\nvar invariant = require('fbjs/lib/invariant');\nvar warning = require('fbjs/lib/warning');\n\nfunction getDeclarationErrorAddendum() {\n if (ReactCurrentOwner.current) {\n var name = ReactCurrentOwner.current.getName();\n if (name) {\n return ' Check the render method of `' + name + '`.';\n }\n }\n return '';\n}\n\n/**\n * Warn if there's no key explicitly set on dynamic arrays of children or\n * object keys are not valid. This allows us to keep track of children between\n * updates.\n */\nvar ownerHasKeyUseWarning = {};\n\nvar loggedTypeFailures = {};\n\n/**\n * Warn if the element doesn't have an explicit key assigned to it.\n * This element is in an array. The array could grow and shrink or be\n * reordered. All children that haven't already been validated are required to\n * have a \"key\" property assigned to it.\n *\n * @internal\n * @param {ReactElement} element Element that requires a key.\n * @param {*} parentType element's parent's type.\n */\nfunction validateExplicitKey(element, parentType) {\n if (!element._store || element._store.validated || element.key != null) {\n return;\n }\n element._store.validated = true;\n\n var addenda = getAddendaForKeyUse('uniqueKey', element, parentType);\n if (addenda === null) {\n // we already showed the warning\n return;\n }\n process.env.NODE_ENV !== 'production' ? warning(false, 'Each child in an array or iterator should have a unique \"key\" prop.' + '%s%s%s', addenda.parentOrOwner || '', addenda.childOwner || '', addenda.url || '') : undefined;\n}\n\n/**\n * Shared warning and monitoring code for the key warnings.\n *\n * @internal\n * @param {string} messageType A key used for de-duping warnings.\n * @param {ReactElement} element Component that requires a key.\n * @param {*} parentType element's parent's type.\n * @returns {?object} A set of addenda to use in the warning message, or null\n * if the warning has already been shown before (and shouldn't be shown again).\n */\nfunction getAddendaForKeyUse(messageType, element, parentType) {\n var addendum = getDeclarationErrorAddendum();\n if (!addendum) {\n var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name;\n if (parentName) {\n addendum = ' Check the top-level render call using <' + parentName + '>.';\n }\n }\n\n var memoizer = ownerHasKeyUseWarning[messageType] || (ownerHasKeyUseWarning[messageType] = {});\n if (memoizer[addendum]) {\n return null;\n }\n memoizer[addendum] = true;\n\n var addenda = {\n parentOrOwner: addendum,\n url: ' See https://fb.me/react-warning-keys for more information.',\n childOwner: null\n };\n\n // Usually the current owner is the offender, but if it accepts children as a\n // property, it may be the creator of the child that's responsible for\n // assigning it a key.\n if (element && element._owner && element._owner !== ReactCurrentOwner.current) {\n // Give the component that originally created this child.\n addenda.childOwner = ' It was passed a child from ' + element._owner.getName() + '.';\n }\n\n return addenda;\n}\n\n/**\n * Ensure that every element either is passed in a static location, in an\n * array with an explicit keys property defined, or in an object literal\n * with valid key property.\n *\n * @internal\n * @param {ReactNode} node Statically passed child of any type.\n * @param {*} parentType node's parent's type.\n */\nfunction validateChildKeys(node, parentType) {\n if (typeof node !== 'object') {\n return;\n }\n if (Array.isArray(node)) {\n for (var i = 0; i < node.length; i++) {\n var child = node[i];\n if (ReactElement.isValidElement(child)) {\n validateExplicitKey(child, parentType);\n }\n }\n } else if (ReactElement.isValidElement(node)) {\n // This element was passed in a valid location.\n if (node._store) {\n node._store.validated = true;\n }\n } else if (node) {\n var iteratorFn = getIteratorFn(node);\n // Entry iterators provide implicit keys.\n if (iteratorFn) {\n if (iteratorFn !== node.entries) {\n var iterator = iteratorFn.call(node);\n var step;\n while (!(step = iterator.next()).done) {\n if (ReactElement.isValidElement(step.value)) {\n validateExplicitKey(step.value, parentType);\n }\n }\n }\n }\n }\n}\n\n/**\n * Assert that the props are valid\n *\n * @param {string} componentName Name of the component for error messages.\n * @param {object} propTypes Map of prop name to a ReactPropType\n * @param {object} props\n * @param {string} location e.g. \"prop\", \"context\", \"child context\"\n * @private\n */\nfunction checkPropTypes(componentName, propTypes, props, location) {\n for (var propName in propTypes) {\n if (propTypes.hasOwnProperty(propName)) {\n var error;\n // Prop type validation may throw. In case they do, we don't want to\n // fail the render phase where it didn't fail before. So we log it.\n // After these have been cleaned up, we'll let them throw.\n try {\n // This is intentionally an invariant that gets caught. It's the same\n // behavior as without this statement except with a better message.\n !(typeof propTypes[propName] === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s: %s type `%s` is invalid; it must be a function, usually from ' + 'React.PropTypes.', componentName || 'React class', ReactPropTypeLocationNames[location], propName) : invariant(false) : undefined;\n error = propTypes[propName](props, propName, componentName, location);\n } catch (ex) {\n error = ex;\n }\n process.env.NODE_ENV !== 'production' ? warning(!error || error instanceof Error, '%s: type specification of %s `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', ReactPropTypeLocationNames[location], propName, typeof error) : undefined;\n if (error instanceof Error && !(error.message in loggedTypeFailures)) {\n // Only monitor this failure once because there tends to be a lot of the\n // same error.\n loggedTypeFailures[error.message] = true;\n\n var addendum = getDeclarationErrorAddendum();\n process.env.NODE_ENV !== 'production' ? warning(false, 'Failed propType: %s%s', error.message, addendum) : undefined;\n }\n }\n }\n}\n\n/**\n * Given an element, validate that its props follow the propTypes definition,\n * provided by the type.\n *\n * @param {ReactElement} element\n */\nfunction validatePropTypes(element) {\n var componentClass = element.type;\n if (typeof componentClass !== 'function') {\n return;\n }\n var name = componentClass.displayName || componentClass.name;\n if (componentClass.propTypes) {\n checkPropTypes(name, componentClass.propTypes, element.props, ReactPropTypeLocations.prop);\n }\n if (typeof componentClass.getDefaultProps === 'function') {\n process.env.NODE_ENV !== 'production' ? warning(componentClass.getDefaultProps.isReactClassApproved, 'getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.') : undefined;\n }\n}\n\nvar ReactElementValidator = {\n\n createElement: function (type, props, children) {\n var validType = typeof type === 'string' || typeof type === 'function';\n // We warn in this case but don't throw. We expect the element creation to\n // succeed and there will likely be errors in render.\n process.env.NODE_ENV !== 'production' ? warning(validType, 'React.createElement: type should not be null, undefined, boolean, or ' + 'number. It should be a string (for DOM elements) or a ReactClass ' + '(for composite components).%s', getDeclarationErrorAddendum()) : undefined;\n\n var element = ReactElement.createElement.apply(this, arguments);\n\n // The result can be nullish if a mock or a custom function is used.\n // TODO: Drop this when these are no longer allowed as the type argument.\n if (element == null) {\n return element;\n }\n\n // Skip key warning if the type isn't valid since our key validation logic\n // doesn't expect a non-string/function type and can throw confusing errors.\n // We don't want exception behavior to differ between dev and prod.\n // (Rendering will throw with a helpful message and as soon as the type is\n // fixed, the key warnings will appear.)\n if (validType) {\n for (var i = 2; i < arguments.length; i++) {\n validateChildKeys(arguments[i], type);\n }\n }\n\n validatePropTypes(element);\n\n return element;\n },\n\n createFactory: function (type) {\n var validatedFactory = ReactElementValidator.createElement.bind(null, type);\n // Legacy hook TODO: Warn if this is accessed\n validatedFactory.type = type;\n\n if (process.env.NODE_ENV !== 'production') {\n if (canDefineProperty) {\n Object.defineProperty(validatedFactory, 'type', {\n enumerable: false,\n get: function () {\n process.env.NODE_ENV !== 'production' ? warning(false, 'Factory.type is deprecated. Access the class directly ' + 'before passing it to createFactory.') : undefined;\n Object.defineProperty(this, 'type', {\n value: type\n });\n return type;\n }\n });\n }\n }\n\n return validatedFactory;\n },\n\n cloneElement: function (element, props, children) {\n var newElement = ReactElement.cloneElement.apply(this, arguments);\n for (var i = 2; i < arguments.length; i++) {\n validateChildKeys(arguments[i], newElement.type);\n }\n validatePropTypes(newElement);\n return newElement;\n }\n\n};\n\nmodule.exports = ReactElementValidator;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/ReactElementValidator.js\n ** module id = 155\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule mapObject\n */\n\n'use strict';\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\n/**\n * Executes the provided `callback` once for each enumerable own property in the\n * object and constructs a new object from the results. The `callback` is\n * invoked with three arguments:\n *\n * - the property value\n * - the property name\n * - the object being traversed\n *\n * Properties that are added after the call to `mapObject` will not be visited\n * by `callback`. If the values of existing properties are changed, the value\n * passed to `callback` will be the value at the time `mapObject` visits them.\n * Properties that are deleted before being visited are not visited.\n *\n * @grep function objectMap()\n * @grep function objMap()\n *\n * @param {?object} object\n * @param {function} callback\n * @param {*} context\n * @return {?object}\n */\nfunction mapObject(object, callback, context) {\n if (!object) {\n return null;\n }\n var result = {};\n for (var name in object) {\n if (hasOwnProperty.call(object, name)) {\n result[name] = callback.call(context, object[name], name, object);\n }\n }\n return result;\n}\n\nmodule.exports = mapObject;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/~/fbjs/lib/mapObject.js\n ** module id = 156\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule onlyChild\n */\n'use strict';\n\nvar ReactElement = require('./ReactElement');\n\nvar invariant = require('fbjs/lib/invariant');\n\n/**\n * Returns the first child in a collection of children and verifies that there\n * is only one child in the collection. The current implementation of this\n * function assumes that a single child gets passed without a wrapper, but the\n * purpose of this helper function is to abstract away the particular structure\n * of children.\n *\n * @param {?object} children Child collection structure.\n * @return {ReactComponent} The first and only `ReactComponent` contained in the\n * structure.\n */\nfunction onlyChild(children) {\n !ReactElement.isValidElement(children) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'onlyChild must be passed a children with exactly one child.') : invariant(false) : undefined;\n return children;\n}\n\nmodule.exports = onlyChild;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/onlyChild.js\n ** module id = 157\n ** module chunks = 0 1\n **/","/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule deprecated\n */\n\n'use strict';\n\nvar assign = require('./Object.assign');\nvar warning = require('fbjs/lib/warning');\n\n/**\n * This will log a single deprecation notice per function and forward the call\n * on to the new API.\n *\n * @param {string} fnName The name of the function\n * @param {string} newModule The module that fn will exist in\n * @param {string} newPackage The module that fn will exist in\n * @param {*} ctx The context this forwarded call should run in\n * @param {function} fn The function to forward on to\n * @return {function} The function that will warn once and then call fn\n */\nfunction deprecated(fnName, newModule, newPackage, ctx, fn) {\n var warned = false;\n if (process.env.NODE_ENV !== 'production') {\n var newFn = function () {\n process.env.NODE_ENV !== 'production' ? warning(warned,\n // Require examples in this string must be split to prevent React's\n // build tools from mistaking them for real requires.\n // Otherwise the build tools will attempt to build a '%s' module.\n 'React.%s is deprecated. Please use %s.%s from require' + '(\\'%s\\') ' + 'instead.', fnName, newModule, fnName, newPackage) : undefined;\n warned = true;\n return fn.apply(ctx, arguments);\n };\n // We need to make sure all properties of the original fn are copied over.\n // In particular, this is needed to support PropTypes\n return assign(newFn, fn);\n }\n\n return fn;\n}\n\nmodule.exports = deprecated;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/react/lib/deprecated.js\n ** module id = 158\n ** module chunks = 0 1\n **/","// Underscore.js 1.8.3\n// http://underscorejs.org\n// (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n// Underscore may be freely distributed under the MIT license.\n\n(function() {\n\n // Baseline setup\n // --------------\n\n // Establish the root object, `window` in the browser, or `exports` on the server.\n var root = this;\n\n // Save the previous value of the `_` variable.\n var previousUnderscore = root._;\n\n // Save bytes in the minified (but not gzipped) version:\n var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;\n\n // Create quick reference variables for speed access to core prototypes.\n var\n push = ArrayProto.push,\n slice = ArrayProto.slice,\n toString = ObjProto.toString,\n hasOwnProperty = ObjProto.hasOwnProperty;\n\n // All **ECMAScript 5** native function implementations that we hope to use\n // are declared here.\n var\n nativeIsArray = Array.isArray,\n nativeKeys = Object.keys,\n nativeBind = FuncProto.bind,\n nativeCreate = Object.create;\n\n // Naked function reference for surrogate-prototype-swapping.\n var Ctor = function(){};\n\n // Create a safe reference to the Underscore object for use below.\n var _ = function(obj) {\n if (obj instanceof _) return obj;\n if (!(this instanceof _)) return new _(obj);\n this._wrapped = obj;\n };\n\n // Export the Underscore object for **Node.js**, with\n // backwards-compatibility for the old `require()` API. If we're in\n // the browser, add `_` as a global object.\n if (typeof exports !== 'undefined') {\n if (typeof module !== 'undefined' && module.exports) {\n exports = module.exports = _;\n }\n exports._ = _;\n } else {\n root._ = _;\n }\n\n // Current version.\n _.VERSION = '1.8.3';\n\n // Internal function that returns an efficient (for current engines) version\n // of the passed-in callback, to be repeatedly applied in other Underscore\n // functions.\n var optimizeCb = function(func, context, argCount) {\n if (context === void 0) return func;\n switch (argCount == null ? 3 : argCount) {\n case 1: return function(value) {\n return func.call(context, value);\n };\n case 2: return function(value, other) {\n return func.call(context, value, other);\n };\n case 3: return function(value, index, collection) {\n return func.call(context, value, index, collection);\n };\n case 4: return function(accumulator, value, index, collection) {\n return func.call(context, accumulator, value, index, collection);\n };\n }\n return function() {\n return func.apply(context, arguments);\n };\n };\n\n // A mostly-internal function to generate callbacks that can be applied\n // to each element in a collection, returning the desired result — either\n // identity, an arbitrary callback, a property matcher, or a property accessor.\n var cb = function(value, context, argCount) {\n if (value == null) return _.identity;\n if (_.isFunction(value)) return optimizeCb(value, context, argCount);\n if (_.isObject(value)) return _.matcher(value);\n return _.property(value);\n };\n _.iteratee = function(value, context) {\n return cb(value, context, Infinity);\n };\n\n // An internal function for creating assigner functions.\n var createAssigner = function(keysFunc, undefinedOnly) {\n return function(obj) {\n var length = arguments.length;\n if (length < 2 || obj == null) return obj;\n for (var index = 1; index < length; index++) {\n var source = arguments[index],\n keys = keysFunc(source),\n l = keys.length;\n for (var i = 0; i < l; i++) {\n var key = keys[i];\n if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key];\n }\n }\n return obj;\n };\n };\n\n // An internal function for creating a new object that inherits from another.\n var baseCreate = function(prototype) {\n if (!_.isObject(prototype)) return {};\n if (nativeCreate) return nativeCreate(prototype);\n Ctor.prototype = prototype;\n var result = new Ctor;\n Ctor.prototype = null;\n return result;\n };\n\n var property = function(key) {\n return function(obj) {\n return obj == null ? void 0 : obj[key];\n };\n };\n\n // Helper for collection methods to determine whether a collection\n // should be iterated as an array or as an object\n // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength\n // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094\n var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;\n var getLength = property('length');\n var isArrayLike = function(collection) {\n var length = getLength(collection);\n return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;\n };\n\n // Collection Functions\n // --------------------\n\n // The cornerstone, an `each` implementation, aka `forEach`.\n // Handles raw objects in addition to array-likes. Treats all\n // sparse array-likes as if they were dense.\n _.each = _.forEach = function(obj, iteratee, context) {\n iteratee = optimizeCb(iteratee, context);\n var i, length;\n if (isArrayLike(obj)) {\n for (i = 0, length = obj.length; i < length; i++) {\n iteratee(obj[i], i, obj);\n }\n } else {\n var keys = _.keys(obj);\n for (i = 0, length = keys.length; i < length; i++) {\n iteratee(obj[keys[i]], keys[i], obj);\n }\n }\n return obj;\n };\n\n // Return the results of applying the iteratee to each element.\n _.map = _.collect = function(obj, iteratee, context) {\n iteratee = cb(iteratee, context);\n var keys = !isArrayLike(obj) && _.keys(obj),\n length = (keys || obj).length,\n results = Array(length);\n for (var index = 0; index < length; index++) {\n var currentKey = keys ? keys[index] : index;\n results[index] = iteratee(obj[currentKey], currentKey, obj);\n }\n return results;\n };\n\n // Create a reducing function iterating left or right.\n function createReduce(dir) {\n // Optimized iterator function as using arguments.length\n // in the main function will deoptimize the, see #1991.\n function iterator(obj, iteratee, memo, keys, index, length) {\n for (; index >= 0 && index < length; index += dir) {\n var currentKey = keys ? keys[index] : index;\n memo = iteratee(memo, obj[currentKey], currentKey, obj);\n }\n return memo;\n }\n\n return function(obj, iteratee, memo, context) {\n iteratee = optimizeCb(iteratee, context, 4);\n var keys = !isArrayLike(obj) && _.keys(obj),\n length = (keys || obj).length,\n index = dir > 0 ? 0 : length - 1;\n // Determine the initial value if none is provided.\n if (arguments.length < 3) {\n memo = obj[keys ? keys[index] : index];\n index += dir;\n }\n return iterator(obj, iteratee, memo, keys, index, length);\n };\n }\n\n // **Reduce** builds up a single result from a list of values, aka `inject`,\n // or `foldl`.\n _.reduce = _.foldl = _.inject = createReduce(1);\n\n // The right-associative version of reduce, also known as `foldr`.\n _.reduceRight = _.foldr = createReduce(-1);\n\n // Return the first value which passes a truth test. Aliased as `detect`.\n _.find = _.detect = function(obj, predicate, context) {\n var key;\n if (isArrayLike(obj)) {\n key = _.findIndex(obj, predicate, context);\n } else {\n key = _.findKey(obj, predicate, context);\n }\n if (key !== void 0 && key !== -1) return obj[key];\n };\n\n // Return all the elements that pass a truth test.\n // Aliased as `select`.\n _.filter = _.select = function(obj, predicate, context) {\n var results = [];\n predicate = cb(predicate, context);\n _.each(obj, function(value, index, list) {\n if (predicate(value, index, list)) results.push(value);\n });\n return results;\n };\n\n // Return all the elements for which a truth test fails.\n _.reject = function(obj, predicate, context) {\n return _.filter(obj, _.negate(cb(predicate)), context);\n };\n\n // Determine whether all of the elements match a truth test.\n // Aliased as `all`.\n _.every = _.all = function(obj, predicate, context) {\n predicate = cb(predicate, context);\n var keys = !isArrayLike(obj) && _.keys(obj),\n length = (keys || obj).length;\n for (var index = 0; index < length; index++) {\n var currentKey = keys ? keys[index] : index;\n if (!predicate(obj[currentKey], currentKey, obj)) return false;\n }\n return true;\n };\n\n // Determine if at least one element in the object matches a truth test.\n // Aliased as `any`.\n _.some = _.any = function(obj, predicate, context) {\n predicate = cb(predicate, context);\n var keys = !isArrayLike(obj) && _.keys(obj),\n length = (keys || obj).length;\n for (var index = 0; index < length; index++) {\n var currentKey = keys ? keys[index] : index;\n if (predicate(obj[currentKey], currentKey, obj)) return true;\n }\n return false;\n };\n\n // Determine if the array or object contains a given item (using `===`).\n // Aliased as `includes` and `include`.\n _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) {\n if (!isArrayLike(obj)) obj = _.values(obj);\n if (typeof fromIndex != 'number' || guard) fromIndex = 0;\n return _.indexOf(obj, item, fromIndex) >= 0;\n };\n\n // Invoke a method (with arguments) on every item in a collection.\n _.invoke = function(obj, method) {\n var args = slice.call(arguments, 2);\n var isFunc = _.isFunction(method);\n return _.map(obj, function(value) {\n var func = isFunc ? method : value[method];\n return func == null ? func : func.apply(value, args);\n });\n };\n\n // Convenience version of a common use case of `map`: fetching a property.\n _.pluck = function(obj, key) {\n return _.map(obj, _.property(key));\n };\n\n // Convenience version of a common use case of `filter`: selecting only objects\n // containing specific `key:value` pairs.\n _.where = function(obj, attrs) {\n return _.filter(obj, _.matcher(attrs));\n };\n\n // Convenience version of a common use case of `find`: getting the first object\n // containing specific `key:value` pairs.\n _.findWhere = function(obj, attrs) {\n return _.find(obj, _.matcher(attrs));\n };\n\n // Return the maximum element (or element-based computation).\n _.max = function(obj, iteratee, context) {\n var result = -Infinity, lastComputed = -Infinity,\n value, computed;\n if (iteratee == null && obj != null) {\n obj = isArrayLike(obj) ? obj : _.values(obj);\n for (var i = 0, length = obj.length; i < length; i++) {\n value = obj[i];\n if (value > result) {\n result = value;\n }\n }\n } else {\n iteratee = cb(iteratee, context);\n _.each(obj, function(value, index, list) {\n computed = iteratee(value, index, list);\n if (computed > lastComputed || computed === -Infinity && result === -Infinity) {\n result = value;\n lastComputed = computed;\n }\n });\n }\n return result;\n };\n\n // Return the minimum element (or element-based computation).\n _.min = function(obj, iteratee, context) {\n var result = Infinity, lastComputed = Infinity,\n value, computed;\n if (iteratee == null && obj != null) {\n obj = isArrayLike(obj) ? obj : _.values(obj);\n for (var i = 0, length = obj.length; i < length; i++) {\n value = obj[i];\n if (value < result) {\n result = value;\n }\n }\n } else {\n iteratee = cb(iteratee, context);\n _.each(obj, function(value, index, list) {\n computed = iteratee(value, index, list);\n if (computed < lastComputed || computed === Infinity && result === Infinity) {\n result = value;\n lastComputed = computed;\n }\n });\n }\n return result;\n };\n\n // Shuffle a collection, using the modern version of the\n // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).\n _.shuffle = function(obj) {\n var set = isArrayLike(obj) ? obj : _.values(obj);\n var length = set.length;\n var shuffled = Array(length);\n for (var index = 0, rand; index < length; index++) {\n rand = _.random(0, index);\n if (rand !== index) shuffled[index] = shuffled[rand];\n shuffled[rand] = set[index];\n }\n return shuffled;\n };\n\n // Sample **n** random values from a collection.\n // If **n** is not specified, returns a single random element.\n // The internal `guard` argument allows it to work with `map`.\n _.sample = function(obj, n, guard) {\n if (n == null || guard) {\n if (!isArrayLike(obj)) obj = _.values(obj);\n return obj[_.random(obj.length - 1)];\n }\n return _.shuffle(obj).slice(0, Math.max(0, n));\n };\n\n // Sort the object's values by a criterion produced by an iteratee.\n _.sortBy = function(obj, iteratee, context) {\n iteratee = cb(iteratee, context);\n return _.pluck(_.map(obj, function(value, index, list) {\n return {\n value: value,\n index: index,\n criteria: iteratee(value, index, list)\n };\n }).sort(function(left, right) {\n var a = left.criteria;\n var b = right.criteria;\n if (a !== b) {\n if (a > b || a === void 0) return 1;\n if (a < b || b === void 0) return -1;\n }\n return left.index - right.index;\n }), 'value');\n };\n\n // An internal function used for aggregate \"group by\" operations.\n var group = function(behavior) {\n return function(obj, iteratee, context) {\n var result = {};\n iteratee = cb(iteratee, context);\n _.each(obj, function(value, index) {\n var key = iteratee(value, index, obj);\n behavior(result, value, key);\n });\n return result;\n };\n };\n\n // Groups the object's values by a criterion. Pass either a string attribute\n // to group by, or a function that returns the criterion.\n _.groupBy = group(function(result, value, key) {\n if (_.has(result, key)) result[key].push(value); else result[key] = [value];\n });\n\n // Indexes the object's values by a criterion, similar to `groupBy`, but for\n // when you know that your index values will be unique.\n _.indexBy = group(function(result, value, key) {\n result[key] = value;\n });\n\n // Counts instances of an object that group by a certain criterion. Pass\n // either a string attribute to count by, or a function that returns the\n // criterion.\n _.countBy = group(function(result, value, key) {\n if (_.has(result, key)) result[key]++; else result[key] = 1;\n });\n\n // Safely create a real, live array from anything iterable.\n _.toArray = function(obj) {\n if (!obj) return [];\n if (_.isArray(obj)) return slice.call(obj);\n if (isArrayLike(obj)) return _.map(obj, _.identity);\n return _.values(obj);\n };\n\n // Return the number of elements in an object.\n _.size = function(obj) {\n if (obj == null) return 0;\n return isArrayLike(obj) ? obj.length : _.keys(obj).length;\n };\n\n // Split a collection into two arrays: one whose elements all satisfy the given\n // predicate, and one whose elements all do not satisfy the predicate.\n _.partition = function(obj, predicate, context) {\n predicate = cb(predicate, context);\n var pass = [], fail = [];\n _.each(obj, function(value, key, obj) {\n (predicate(value, key, obj) ? pass : fail).push(value);\n });\n return [pass, fail];\n };\n\n // Array Functions\n // ---------------\n\n // Get the first element of an array. Passing **n** will return the first N\n // values in the array. Aliased as `head` and `take`. The **guard** check\n // allows it to work with `_.map`.\n _.first = _.head = _.take = function(array, n, guard) {\n if (array == null) return void 0;\n if (n == null || guard) return array[0];\n return _.initial(array, array.length - n);\n };\n\n // Returns everything but the last entry of the array. Especially useful on\n // the arguments object. Passing **n** will return all the values in\n // the array, excluding the last N.\n _.initial = function(array, n, guard) {\n return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));\n };\n\n // Get the last element of an array. Passing **n** will return the last N\n // values in the array.\n _.last = function(array, n, guard) {\n if (array == null) return void 0;\n if (n == null || guard) return array[array.length - 1];\n return _.rest(array, Math.max(0, array.length - n));\n };\n\n // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.\n // Especially useful on the arguments object. Passing an **n** will return\n // the rest N values in the array.\n _.rest = _.tail = _.drop = function(array, n, guard) {\n return slice.call(array, n == null || guard ? 1 : n);\n };\n\n // Trim out all falsy values from an array.\n _.compact = function(array) {\n return _.filter(array, _.identity);\n };\n\n // Internal implementation of a recursive `flatten` function.\n var flatten = function(input, shallow, strict, startIndex) {\n var output = [], idx = 0;\n for (var i = startIndex || 0, length = getLength(input); i < length; i++) {\n var value = input[i];\n if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) {\n //flatten current level of array or arguments object\n if (!shallow) value = flatten(value, shallow, strict);\n var j = 0, len = value.length;\n output.length += len;\n while (j < len) {\n output[idx++] = value[j++];\n }\n } else if (!strict) {\n output[idx++] = value;\n }\n }\n return output;\n };\n\n // Flatten out an array, either recursively (by default), or just one level.\n _.flatten = function(array, shallow) {\n return flatten(array, shallow, false);\n };\n\n // Return a version of the array that does not contain the specified value(s).\n _.without = function(array) {\n return _.difference(array, slice.call(arguments, 1));\n };\n\n // Produce a duplicate-free version of the array. If the array has already\n // been sorted, you have the option of using a faster algorithm.\n // Aliased as `unique`.\n _.uniq = _.unique = function(array, isSorted, iteratee, context) {\n if (!_.isBoolean(isSorted)) {\n context = iteratee;\n iteratee = isSorted;\n isSorted = false;\n }\n if (iteratee != null) iteratee = cb(iteratee, context);\n var result = [];\n var seen = [];\n for (var i = 0, length = getLength(array); i < length; i++) {\n var value = array[i],\n computed = iteratee ? iteratee(value, i, array) : value;\n if (isSorted) {\n if (!i || seen !== computed) result.push(value);\n seen = computed;\n } else if (iteratee) {\n if (!_.contains(seen, computed)) {\n seen.push(computed);\n result.push(value);\n }\n } else if (!_.contains(result, value)) {\n result.push(value);\n }\n }\n return result;\n };\n\n // Produce an array that contains the union: each distinct element from all of\n // the passed-in arrays.\n _.union = function() {\n return _.uniq(flatten(arguments, true, true));\n };\n\n // Produce an array that contains every item shared between all the\n // passed-in arrays.\n _.intersection = function(array) {\n var result = [];\n var argsLength = arguments.length;\n for (var i = 0, length = getLength(array); i < length; i++) {\n var item = array[i];\n if (_.contains(result, item)) continue;\n for (var j = 1; j < argsLength; j++) {\n if (!_.contains(arguments[j], item)) break;\n }\n if (j === argsLength) result.push(item);\n }\n return result;\n };\n\n // Take the difference between one array and a number of other arrays.\n // Only the elements present in just the first array will remain.\n _.difference = function(array) {\n var rest = flatten(arguments, true, true, 1);\n return _.filter(array, function(value){\n return !_.contains(rest, value);\n });\n };\n\n // Zip together multiple lists into a single array -- elements that share\n // an index go together.\n _.zip = function() {\n return _.unzip(arguments);\n };\n\n // Complement of _.zip. Unzip accepts an array of arrays and groups\n // each array's elements on shared indices\n _.unzip = function(array) {\n var length = array && _.max(array, getLength).length || 0;\n var result = Array(length);\n\n for (var index = 0; index < length; index++) {\n result[index] = _.pluck(array, index);\n }\n return result;\n };\n\n // Converts lists into objects. Pass either a single array of `[key, value]`\n // pairs, or two parallel arrays of the same length -- one of keys, and one of\n // the corresponding values.\n _.object = function(list, values) {\n var result = {};\n for (var i = 0, length = getLength(list); i < length; i++) {\n if (values) {\n result[list[i]] = values[i];\n } else {\n result[list[i][0]] = list[i][1];\n }\n }\n return result;\n };\n\n // Generator function to create the findIndex and findLastIndex functions\n function createPredicateIndexFinder(dir) {\n return function(array, predicate, context) {\n predicate = cb(predicate, context);\n var length = getLength(array);\n var index = dir > 0 ? 0 : length - 1;\n for (; index >= 0 && index < length; index += dir) {\n if (predicate(array[index], index, array)) return index;\n }\n return -1;\n };\n }\n\n // Returns the first index on an array-like that passes a predicate test\n _.findIndex = createPredicateIndexFinder(1);\n _.findLastIndex = createPredicateIndexFinder(-1);\n\n // Use a comparator function to figure out the smallest index at which\n // an object should be inserted so as to maintain order. Uses binary search.\n _.sortedIndex = function(array, obj, iteratee, context) {\n iteratee = cb(iteratee, context, 1);\n var value = iteratee(obj);\n var low = 0, high = getLength(array);\n while (low < high) {\n var mid = Math.floor((low + high) / 2);\n if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;\n }\n return low;\n };\n\n // Generator function to create the indexOf and lastIndexOf functions\n function createIndexFinder(dir, predicateFind, sortedIndex) {\n return function(array, item, idx) {\n var i = 0, length = getLength(array);\n if (typeof idx == 'number') {\n if (dir > 0) {\n i = idx >= 0 ? idx : Math.max(idx + length, i);\n } else {\n length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;\n }\n } else if (sortedIndex && idx && length) {\n idx = sortedIndex(array, item);\n return array[idx] === item ? idx : -1;\n }\n if (item !== item) {\n idx = predicateFind(slice.call(array, i, length), _.isNaN);\n return idx >= 0 ? idx + i : -1;\n }\n for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {\n if (array[idx] === item) return idx;\n }\n return -1;\n };\n }\n\n // Return the position of the first occurrence of an item in an array,\n // or -1 if the item is not included in the array.\n // If the array is large and already in sort order, pass `true`\n // for **isSorted** to use binary search.\n _.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex);\n _.lastIndexOf = createIndexFinder(-1, _.findLastIndex);\n\n // Generate an integer Array containing an arithmetic progression. A port of\n // the native Python `range()` function. See\n // [the Python documentation](http://docs.python.org/library/functions.html#range).\n _.range = function(start, stop, step) {\n if (stop == null) {\n stop = start || 0;\n start = 0;\n }\n step = step || 1;\n\n var length = Math.max(Math.ceil((stop - start) / step), 0);\n var range = Array(length);\n\n for (var idx = 0; idx < length; idx++, start += step) {\n range[idx] = start;\n }\n\n return range;\n };\n\n // Function (ahem) Functions\n // ------------------\n\n // Determines whether to execute a function as a constructor\n // or a normal function with the provided arguments\n var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) {\n if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);\n var self = baseCreate(sourceFunc.prototype);\n var result = sourceFunc.apply(self, args);\n if (_.isObject(result)) return result;\n return self;\n };\n\n // Create a function bound to a given object (assigning `this`, and arguments,\n // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if\n // available.\n _.bind = function(func, context) {\n if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));\n if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');\n var args = slice.call(arguments, 2);\n var bound = function() {\n return executeBound(func, bound, context, this, args.concat(slice.call(arguments)));\n };\n return bound;\n };\n\n // Partially apply a function by creating a version that has had some of its\n // arguments pre-filled, without changing its dynamic `this` context. _ acts\n // as a placeholder, allowing any combination of arguments to be pre-filled.\n _.partial = function(func) {\n var boundArgs = slice.call(arguments, 1);\n var bound = function() {\n var position = 0, length = boundArgs.length;\n var args = Array(length);\n for (var i = 0; i < length; i++) {\n args[i] = boundArgs[i] === _ ? arguments[position++] : boundArgs[i];\n }\n while (position < arguments.length) args.push(arguments[position++]);\n return executeBound(func, bound, this, this, args);\n };\n return bound;\n };\n\n // Bind a number of an object's methods to that object. Remaining arguments\n // are the method names to be bound. Useful for ensuring that all callbacks\n // defined on an object belong to it.\n _.bindAll = function(obj) {\n var i, length = arguments.length, key;\n if (length <= 1) throw new Error('bindAll must be passed function names');\n for (i = 1; i < length; i++) {\n key = arguments[i];\n obj[key] = _.bind(obj[key], obj);\n }\n return obj;\n };\n\n // Memoize an expensive function by storing its results.\n _.memoize = function(func, hasher) {\n var memoize = function(key) {\n var cache = memoize.cache;\n var address = '' + (hasher ? hasher.apply(this, arguments) : key);\n if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);\n return cache[address];\n };\n memoize.cache = {};\n return memoize;\n };\n\n // Delays a function for the given number of milliseconds, and then calls\n // it with the arguments supplied.\n _.delay = function(func, wait) {\n var args = slice.call(arguments, 2);\n return setTimeout(function(){\n return func.apply(null, args);\n }, wait);\n };\n\n // Defers a function, scheduling it to run after the current call stack has\n // cleared.\n _.defer = _.partial(_.delay, _, 1);\n\n // Returns a function, that, when invoked, will only be triggered at most once\n // during a given window of time. Normally, the throttled function will run\n // as much as it can, without ever going more than once per `wait` duration;\n // but if you'd like to disable the execution on the leading edge, pass\n // `{leading: false}`. To disable execution on the trailing edge, ditto.\n _.throttle = function(func, wait, options) {\n var context, args, result;\n var timeout = null;\n var previous = 0;\n if (!options) options = {};\n var later = function() {\n previous = options.leading === false ? 0 : _.now();\n timeout = null;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n };\n return function() {\n var now = _.now();\n if (!previous && options.leading === false) previous = now;\n var remaining = wait - (now - previous);\n context = this;\n args = arguments;\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = now;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n } else if (!timeout && options.trailing !== false) {\n timeout = setTimeout(later, remaining);\n }\n return result;\n };\n };\n\n // Returns a function, that, as long as it continues to be invoked, will not\n // be triggered. The function will be called after it stops being called for\n // N milliseconds. If `immediate` is passed, trigger the function on the\n // leading edge, instead of the trailing.\n _.debounce = function(func, wait, immediate) {\n var timeout, args, context, timestamp, result;\n\n var later = function() {\n var last = _.now() - timestamp;\n\n if (last < wait && last >= 0) {\n timeout = setTimeout(later, wait - last);\n } else {\n timeout = null;\n if (!immediate) {\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n }\n }\n };\n\n return function() {\n context = this;\n args = arguments;\n timestamp = _.now();\n var callNow = immediate && !timeout;\n if (!timeout) timeout = setTimeout(later, wait);\n if (callNow) {\n result = func.apply(context, args);\n context = args = null;\n }\n\n return result;\n };\n };\n\n // Returns the first function passed as an argument to the second,\n // allowing you to adjust arguments, run code before and after, and\n // conditionally execute the original function.\n _.wrap = function(func, wrapper) {\n return _.partial(wrapper, func);\n };\n\n // Returns a negated version of the passed-in predicate.\n _.negate = function(predicate) {\n return function() {\n return !predicate.apply(this, arguments);\n };\n };\n\n // Returns a function that is the composition of a list of functions, each\n // consuming the return value of the function that follows.\n _.compose = function() {\n var args = arguments;\n var start = args.length - 1;\n return function() {\n var i = start;\n var result = args[start].apply(this, arguments);\n while (i--) result = args[i].call(this, result);\n return result;\n };\n };\n\n // Returns a function that will only be executed on and after the Nth call.\n _.after = function(times, func) {\n return function() {\n if (--times < 1) {\n return func.apply(this, arguments);\n }\n };\n };\n\n // Returns a function that will only be executed up to (but not including) the Nth call.\n _.before = function(times, func) {\n var memo;\n return function() {\n if (--times > 0) {\n memo = func.apply(this, arguments);\n }\n if (times <= 1) func = null;\n return memo;\n };\n };\n\n // Returns a function that will be executed at most one time, no matter how\n // often you call it. Useful for lazy initialization.\n _.once = _.partial(_.before, 2);\n\n // Object Functions\n // ----------------\n\n // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.\n var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');\n var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',\n 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];\n\n function collectNonEnumProps(obj, keys) {\n var nonEnumIdx = nonEnumerableProps.length;\n var constructor = obj.constructor;\n var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto;\n\n // Constructor is a special case.\n var prop = 'constructor';\n if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop);\n\n while (nonEnumIdx--) {\n prop = nonEnumerableProps[nonEnumIdx];\n if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) {\n keys.push(prop);\n }\n }\n }\n\n // Retrieve the names of an object's own properties.\n // Delegates to **ECMAScript 5**'s native `Object.keys`\n _.keys = function(obj) {\n if (!_.isObject(obj)) return [];\n if (nativeKeys) return nativeKeys(obj);\n var keys = [];\n for (var key in obj) if (_.has(obj, key)) keys.push(key);\n // Ahem, IE < 9.\n if (hasEnumBug) collectNonEnumProps(obj, keys);\n return keys;\n };\n\n // Retrieve all the property names of an object.\n _.allKeys = function(obj) {\n if (!_.isObject(obj)) return [];\n var keys = [];\n for (var key in obj) keys.push(key);\n // Ahem, IE < 9.\n if (hasEnumBug) collectNonEnumProps(obj, keys);\n return keys;\n };\n\n // Retrieve the values of an object's properties.\n _.values = function(obj) {\n var keys = _.keys(obj);\n var length = keys.length;\n var values = Array(length);\n for (var i = 0; i < length; i++) {\n values[i] = obj[keys[i]];\n }\n return values;\n };\n\n // Returns the results of applying the iteratee to each element of the object\n // In contrast to _.map it returns an object\n _.mapObject = function(obj, iteratee, context) {\n iteratee = cb(iteratee, context);\n var keys = _.keys(obj),\n length = keys.length,\n results = {},\n currentKey;\n for (var index = 0; index < length; index++) {\n currentKey = keys[index];\n results[currentKey] = iteratee(obj[currentKey], currentKey, obj);\n }\n return results;\n };\n\n // Convert an object into a list of `[key, value]` pairs.\n _.pairs = function(obj) {\n var keys = _.keys(obj);\n var length = keys.length;\n var pairs = Array(length);\n for (var i = 0; i < length; i++) {\n pairs[i] = [keys[i], obj[keys[i]]];\n }\n return pairs;\n };\n\n // Invert the keys and values of an object. The values must be serializable.\n _.invert = function(obj) {\n var result = {};\n var keys = _.keys(obj);\n for (var i = 0, length = keys.length; i < length; i++) {\n result[obj[keys[i]]] = keys[i];\n }\n return result;\n };\n\n // Return a sorted list of the function names available on the object.\n // Aliased as `methods`\n _.functions = _.methods = function(obj) {\n var names = [];\n for (var key in obj) {\n if (_.isFunction(obj[key])) names.push(key);\n }\n return names.sort();\n };\n\n // Extend a given object with all the properties in passed-in object(s).\n _.extend = createAssigner(_.allKeys);\n\n // Assigns a given object with all the own properties in the passed-in object(s)\n // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)\n _.extendOwn = _.assign = createAssigner(_.keys);\n\n // Returns the first key on an object that passes a predicate test\n _.findKey = function(obj, predicate, context) {\n predicate = cb(predicate, context);\n var keys = _.keys(obj), key;\n for (var i = 0, length = keys.length; i < length; i++) {\n key = keys[i];\n if (predicate(obj[key], key, obj)) return key;\n }\n };\n\n // Return a copy of the object only containing the whitelisted properties.\n _.pick = function(object, oiteratee, context) {\n var result = {}, obj = object, iteratee, keys;\n if (obj == null) return result;\n if (_.isFunction(oiteratee)) {\n keys = _.allKeys(obj);\n iteratee = optimizeCb(oiteratee, context);\n } else {\n keys = flatten(arguments, false, false, 1);\n iteratee = function(value, key, obj) { return key in obj; };\n obj = Object(obj);\n }\n for (var i = 0, length = keys.length; i < length; i++) {\n var key = keys[i];\n var value = obj[key];\n if (iteratee(value, key, obj)) result[key] = value;\n }\n return result;\n };\n\n // Return a copy of the object without the blacklisted properties.\n _.omit = function(obj, iteratee, context) {\n if (_.isFunction(iteratee)) {\n iteratee = _.negate(iteratee);\n } else {\n var keys = _.map(flatten(arguments, false, false, 1), String);\n iteratee = function(value, key) {\n return !_.contains(keys, key);\n };\n }\n return _.pick(obj, iteratee, context);\n };\n\n // Fill in a given object with default properties.\n _.defaults = createAssigner(_.allKeys, true);\n\n // Creates an object that inherits from the given prototype object.\n // If additional properties are provided then they will be added to the\n // created object.\n _.create = function(prototype, props) {\n var result = baseCreate(prototype);\n if (props) _.extendOwn(result, props);\n return result;\n };\n\n // Create a (shallow-cloned) duplicate of an object.\n _.clone = function(obj) {\n if (!_.isObject(obj)) return obj;\n return _.isArray(obj) ? obj.slice() : _.extend({}, obj);\n };\n\n // Invokes interceptor with the obj, and then returns obj.\n // The primary purpose of this method is to \"tap into\" a method chain, in\n // order to perform operations on intermediate results within the chain.\n _.tap = function(obj, interceptor) {\n interceptor(obj);\n return obj;\n };\n\n // Returns whether an object has a given set of `key:value` pairs.\n _.isMatch = function(object, attrs) {\n var keys = _.keys(attrs), length = keys.length;\n if (object == null) return !length;\n var obj = Object(object);\n for (var i = 0; i < length; i++) {\n var key = keys[i];\n if (attrs[key] !== obj[key] || !(key in obj)) return false;\n }\n return true;\n };\n\n\n // Internal recursive comparison function for `isEqual`.\n var eq = function(a, b, aStack, bStack) {\n // Identical objects are equal. `0 === -0`, but they aren't identical.\n // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).\n if (a === b) return a !== 0 || 1 / a === 1 / b;\n // A strict comparison is necessary because `null == undefined`.\n if (a == null || b == null) return a === b;\n // Unwrap any wrapped objects.\n if (a instanceof _) a = a._wrapped;\n if (b instanceof _) b = b._wrapped;\n // Compare `[[Class]]` names.\n var className = toString.call(a);\n if (className !== toString.call(b)) return false;\n switch (className) {\n // Strings, numbers, regular expressions, dates, and booleans are compared by value.\n case '[object RegExp]':\n // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')\n case '[object String]':\n // Primitives and their corresponding object wrappers are equivalent; thus, `\"5\"` is\n // equivalent to `new String(\"5\")`.\n return '' + a === '' + b;\n case '[object Number]':\n // `NaN`s are equivalent, but non-reflexive.\n // Object(NaN) is equivalent to NaN\n if (+a !== +a) return +b !== +b;\n // An `egal` comparison is performed for other numeric values.\n return +a === 0 ? 1 / +a === 1 / b : +a === +b;\n case '[object Date]':\n case '[object Boolean]':\n // Coerce dates and booleans to numeric primitive values. Dates are compared by their\n // millisecond representations. Note that invalid dates with millisecond representations\n // of `NaN` are not equivalent.\n return +a === +b;\n }\n\n var areArrays = className === '[object Array]';\n if (!areArrays) {\n if (typeof a != 'object' || typeof b != 'object') return false;\n\n // Objects with different constructors are not equivalent, but `Object`s or `Array`s\n // from different frames are.\n var aCtor = a.constructor, bCtor = b.constructor;\n if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor &&\n _.isFunction(bCtor) && bCtor instanceof bCtor)\n && ('constructor' in a && 'constructor' in b)) {\n return false;\n }\n }\n // Assume equality for cyclic structures. The algorithm for detecting cyclic\n // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.\n\n // Initializing stack of traversed objects.\n // It's done here since we only need them for objects and arrays comparison.\n aStack = aStack || [];\n bStack = bStack || [];\n var length = aStack.length;\n while (length--) {\n // Linear search. Performance is inversely proportional to the number of\n // unique nested structures.\n if (aStack[length] === a) return bStack[length] === b;\n }\n\n // Add the first object to the stack of traversed objects.\n aStack.push(a);\n bStack.push(b);\n\n // Recursively compare objects and arrays.\n if (areArrays) {\n // Compare array lengths to determine if a deep comparison is necessary.\n length = a.length;\n if (length !== b.length) return false;\n // Deep compare the contents, ignoring non-numeric properties.\n while (length--) {\n if (!eq(a[length], b[length], aStack, bStack)) return false;\n }\n } else {\n // Deep compare objects.\n var keys = _.keys(a), key;\n length = keys.length;\n // Ensure that both objects contain the same number of properties before comparing deep equality.\n if (_.keys(b).length !== length) return false;\n while (length--) {\n // Deep compare each member\n key = keys[length];\n if (!(_.has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;\n }\n }\n // Remove the first object from the stack of traversed objects.\n aStack.pop();\n bStack.pop();\n return true;\n };\n\n // Perform a deep comparison to check if two objects are equal.\n _.isEqual = function(a, b) {\n return eq(a, b);\n };\n\n // Is a given array, string, or object empty?\n // An \"empty\" object has no enumerable own-properties.\n _.isEmpty = function(obj) {\n if (obj == null) return true;\n if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0;\n return _.keys(obj).length === 0;\n };\n\n // Is a given value a DOM element?\n _.isElement = function(obj) {\n return !!(obj && obj.nodeType === 1);\n };\n\n // Is a given value an array?\n // Delegates to ECMA5's native Array.isArray\n _.isArray = nativeIsArray || function(obj) {\n return toString.call(obj) === '[object Array]';\n };\n\n // Is a given variable an object?\n _.isObject = function(obj) {\n var type = typeof obj;\n return type === 'function' || type === 'object' && !!obj;\n };\n\n // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError.\n _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) {\n _['is' + name] = function(obj) {\n return toString.call(obj) === '[object ' + name + ']';\n };\n });\n\n // Define a fallback version of the method in browsers (ahem, IE < 9), where\n // there isn't any inspectable \"Arguments\" type.\n if (!_.isArguments(arguments)) {\n _.isArguments = function(obj) {\n return _.has(obj, 'callee');\n };\n }\n\n // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8,\n // IE 11 (#1621), and in Safari 8 (#1929).\n if (typeof /./ != 'function' && typeof Int8Array != 'object') {\n _.isFunction = function(obj) {\n return typeof obj == 'function' || false;\n };\n }\n\n // Is a given object a finite number?\n _.isFinite = function(obj) {\n return isFinite(obj) && !isNaN(parseFloat(obj));\n };\n\n // Is the given value `NaN`? (NaN is the only number which does not equal itself).\n _.isNaN = function(obj) {\n return _.isNumber(obj) && obj !== +obj;\n };\n\n // Is a given value a boolean?\n _.isBoolean = function(obj) {\n return obj === true || obj === false || toString.call(obj) === '[object Boolean]';\n };\n\n // Is a given value equal to null?\n _.isNull = function(obj) {\n return obj === null;\n };\n\n // Is a given variable undefined?\n _.isUndefined = function(obj) {\n return obj === void 0;\n };\n\n // Shortcut function for checking if an object has a given property directly\n // on itself (in other words, not on a prototype).\n _.has = function(obj, key) {\n return obj != null && hasOwnProperty.call(obj, key);\n };\n\n // Utility Functions\n // -----------------\n\n // Run Underscore.js in *noConflict* mode, returning the `_` variable to its\n // previous owner. Returns a reference to the Underscore object.\n _.noConflict = function() {\n root._ = previousUnderscore;\n return this;\n };\n\n // Keep the identity function around for default iteratees.\n _.identity = function(value) {\n return value;\n };\n\n // Predicate-generating functions. Often useful outside of Underscore.\n _.constant = function(value) {\n return function() {\n return value;\n };\n };\n\n _.noop = function(){};\n\n _.property = property;\n\n // Generates a function for a given object that returns a given property.\n _.propertyOf = function(obj) {\n return obj == null ? function(){} : function(key) {\n return obj[key];\n };\n };\n\n // Returns a predicate for checking whether an object has a given set of\n // `key:value` pairs.\n _.matcher = _.matches = function(attrs) {\n attrs = _.extendOwn({}, attrs);\n return function(obj) {\n return _.isMatch(obj, attrs);\n };\n };\n\n // Run a function **n** times.\n _.times = function(n, iteratee, context) {\n var accum = Array(Math.max(0, n));\n iteratee = optimizeCb(iteratee, context, 1);\n for (var i = 0; i < n; i++) accum[i] = iteratee(i);\n return accum;\n };\n\n // Return a random integer between min and max (inclusive).\n _.random = function(min, max) {\n if (max == null) {\n max = min;\n min = 0;\n }\n return min + Math.floor(Math.random() * (max - min + 1));\n };\n\n // A (possibly faster) way to get the current timestamp as an integer.\n _.now = Date.now || function() {\n return new Date().getTime();\n };\n\n // List of HTML entities for escaping.\n var escapeMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '`': '`'\n };\n var unescapeMap = _.invert(escapeMap);\n\n // Functions for escaping and unescaping strings to/from HTML interpolation.\n var createEscaper = function(map) {\n var escaper = function(match) {\n return map[match];\n };\n // Regexes for identifying a key that needs to be escaped\n var source = '(?:' + _.keys(map).join('|') + ')';\n var testRegexp = RegExp(source);\n var replaceRegexp = RegExp(source, 'g');\n return function(string) {\n string = string == null ? '' : '' + string;\n return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;\n };\n };\n _.escape = createEscaper(escapeMap);\n _.unescape = createEscaper(unescapeMap);\n\n // If the value of the named `property` is a function then invoke it with the\n // `object` as context; otherwise, return it.\n _.result = function(object, property, fallback) {\n var value = object == null ? void 0 : object[property];\n if (value === void 0) {\n value = fallback;\n }\n return _.isFunction(value) ? value.call(object) : value;\n };\n\n // Generate a unique integer id (unique within the entire client session).\n // Useful for temporary DOM ids.\n var idCounter = 0;\n _.uniqueId = function(prefix) {\n var id = ++idCounter + '';\n return prefix ? prefix + id : id;\n };\n\n // By default, Underscore uses ERB-style template delimiters, change the\n // following template settings to use alternative delimiters.\n _.templateSettings = {\n evaluate : /<%([\\s\\S]+?)%>/g,\n interpolate : /<%=([\\s\\S]+?)%>/g,\n escape : /<%-([\\s\\S]+?)%>/g\n };\n\n // When customizing `templateSettings`, if you don't want to define an\n // interpolation, evaluation or escaping regex, we need one that is\n // guaranteed not to match.\n var noMatch = /(.)^/;\n\n // Certain characters need to be escaped so that they can be put into a\n // string literal.\n var escapes = {\n \"'\": \"'\",\n '\\\\': '\\\\',\n '\\r': 'r',\n '\\n': 'n',\n '\\u2028': 'u2028',\n '\\u2029': 'u2029'\n };\n\n var escaper = /\\\\|'|\\r|\\n|\\u2028|\\u2029/g;\n\n var escapeChar = function(match) {\n return '\\\\' + escapes[match];\n };\n\n // JavaScript micro-templating, similar to John Resig's implementation.\n // Underscore templating handles arbitrary delimiters, preserves whitespace,\n // and correctly escapes quotes within interpolated code.\n // NB: `oldSettings` only exists for backwards compatibility.\n _.template = function(text, settings, oldSettings) {\n if (!settings && oldSettings) settings = oldSettings;\n settings = _.defaults({}, settings, _.templateSettings);\n\n // Combine delimiters into one regular expression via alternation.\n var matcher = RegExp([\n (settings.escape || noMatch).source,\n (settings.interpolate || noMatch).source,\n (settings.evaluate || noMatch).source\n ].join('|') + '|$', 'g');\n\n // Compile the template source, escaping string literals appropriately.\n var index = 0;\n var source = \"__p+='\";\n text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {\n source += text.slice(index, offset).replace(escaper, escapeChar);\n index = offset + match.length;\n\n if (escape) {\n source += \"'+\\n((__t=(\" + escape + \"))==null?'':_.escape(__t))+\\n'\";\n } else if (interpolate) {\n source += \"'+\\n((__t=(\" + interpolate + \"))==null?'':__t)+\\n'\";\n } else if (evaluate) {\n source += \"';\\n\" + evaluate + \"\\n__p+='\";\n }\n\n // Adobe VMs need the match returned to produce the correct offest.\n return match;\n });\n source += \"';\\n\";\n\n // If a variable is not specified, place data values in local scope.\n if (!settings.variable) source = 'with(obj||{}){\\n' + source + '}\\n';\n\n source = \"var __t,__p='',__j=Array.prototype.join,\" +\n \"print=function(){__p+=__j.call(arguments,'');};\\n\" +\n source + 'return __p;\\n';\n\n try {\n var render = new Function(settings.variable || 'obj', '_', source);\n } catch (e) {\n e.source = source;\n throw e;\n }\n\n var template = function(data) {\n return render.call(this, data, _);\n };\n\n // Provide the compiled source as a convenience for precompilation.\n var argument = settings.variable || 'obj';\n template.source = 'function(' + argument + '){\\n' + source + '}';\n\n return template;\n };\n\n // Add a \"chain\" function. Start chaining a wrapped Underscore object.\n _.chain = function(obj) {\n var instance = _(obj);\n instance._chain = true;\n return instance;\n };\n\n // OOP\n // ---------------\n // If Underscore is called as a function, it returns a wrapped object that\n // can be used OO-style. This wrapper holds altered versions of all the\n // underscore functions. Wrapped objects may be chained.\n\n // Helper function to continue chaining intermediate results.\n var result = function(instance, obj) {\n return instance._chain ? _(obj).chain() : obj;\n };\n\n // Add your own custom functions to the Underscore object.\n _.mixin = function(obj) {\n _.each(_.functions(obj), function(name) {\n var func = _[name] = obj[name];\n _.prototype[name] = function() {\n var args = [this._wrapped];\n push.apply(args, arguments);\n return result(this, func.apply(_, args));\n };\n });\n };\n\n // Add all of the Underscore functions to the wrapper object.\n _.mixin(_);\n\n // Add all mutator Array functions to the wrapper.\n _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {\n var method = ArrayProto[name];\n _.prototype[name] = function() {\n var obj = this._wrapped;\n method.apply(obj, arguments);\n if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];\n return result(this, obj);\n };\n });\n\n // Add all accessor Array functions to the wrapper.\n _.each(['concat', 'join', 'slice'], function(name) {\n var method = ArrayProto[name];\n _.prototype[name] = function() {\n return result(this, method.apply(this._wrapped, arguments));\n };\n });\n\n // Extracts the result from a wrapped and chained object.\n _.prototype.value = function() {\n return this._wrapped;\n };\n\n // Provide unwrapping proxy for some methods used in engine operations\n // such as arithmetic and JSON stringification.\n _.prototype.valueOf = _.prototype.toJSON = _.prototype.value;\n\n _.prototype.toString = function() {\n return '' + this._wrapped;\n };\n\n // AMD registration happens at the end for compatibility with AMD loaders\n // that may not enforce next-turn semantics on modules. Even though general\n // practice for AMD registration is to be anonymous, underscore registers\n // as a named module because, like jQuery, it is a base library that is\n // popular enough to be bundled in a third party lib, but not be part of\n // an AMD load request. Those cases could generate an error when an\n // anonymous define() is called outside of a loader request.\n if (typeof define === 'function' && define.amd) {\n define('underscore', [], function() {\n return _;\n });\n }\n}.call(this));\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/underscore/underscore.js\n ** module id = 160\n ** module chunks = 0 1\n **/","import React from 'react';\nimport _ from 'underscore';\nimport Icon from './Icon';\nimport InputError from './InputError';\nimport PasswordValidator from './PasswordValidator';\nimport classNames from 'classnames/bind';\n\nlet cx = classNames.bind({});\n\nexport default class Input extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n valid: (this.props.isValid && this.props.isValid()) || true,\n empty: _.isEmpty(this.props.value),\n focus: false,\n value: null,\n iconsVisible: !this.props.validator,\n errorMessage: this.props.emptyMessage,\n validator: this.props.validator,\n validatorVisible: false,\n type: this.props.type,\n minCharacters: this.props.minCharacters,\n requireCapitals: this.props.requireCapitals,\n requireNumbers: this.props.requireNumbers,\n forbiddenWords: this.props.forbiddenWords,\n isValidatorValid: {\n minChars: false,\n capitalLetters: false,\n numbers: false,\n words: false,\n all: false\n },\n allValidatorValid: false\n };\n }\n\n handleChange = (event) => {\n this.setState({\n value: event.target.value,\n empty: _.isEmpty(event.target.value)\n });\n\n if (this.props.validator) {\n this.checkRules(event.target.value)\n };\n\n if (this.props.validate) {\n this.validateInput(event.target.value);\n }\n\n if (this.props.onChange) {\n this.props.onChange(event);\n }\n }\n\n validateInput = (value) => {\n // trigger custom validation method in the parent component\n if (this.props.validate && this.props.validate(value)){\n this.setState({\n valid: true,\n errorVisible: false\n });\n } else {\n this.setState({\n valid: false,\n errorMessage: !_.isEmpty(value) ? this.props.errorMessage : this.props.emptyMessage\n });\n }\n\n };\n\n componentWillReceiveProps = (newProps) => {\n // perform update only when new value exists and not empty\n if (newProps.value) {\n if(!_.isUndefined(newProps.value) && newProps.value.length > 0) {\n if (this.props.validate) {\n this.validateInput(newProps.value);\n }\n this.setState({\n value: newProps.value,\n empty: _.isEmpty(newProps.value)\n });\n }\n }\n };\n\n isValid() {\n if (this.props.validate) {\n if (_.isEmpty(this.state.value) || !this.props.validate(this.state.value)) {\n this.setState({\n valid: false,\n errorVisible: true\n });\n }\n }\n\n return this.state.valid;\n }\n\n handleFocus = (event) => {\n this.setState({\n focus: true,\n validatorVisible: true\n });\n\n if (this.props.validator) {\n this.setState({\n errorVisible: false\n });\n }\n }\n\n handleBlur = (event) => {\n this.setState({\n focus: false,\n errorVisible: !this.state.valid,\n validatorVisible: false\n });\n }\n\n mouseEnterError() {\n this.setState({\n errorVisible: true\n });\n }\n\n hideError() {\n this.setState({\n errorVisible: false,\n validatorVisible: false\n });\n }\n\n // validator function\n checkRules = (value) => {\n var validData = {\n minChars: !_.isEmpty(value) ? value.length >= parseInt(this.state.minCharacters): false,\n capitalLetters: !_.isEmpty(value) ? this.countCapitals(value): false,\n numbers: !_.isEmpty(value) ? this.countNumbers(value) > 0 : false,\n words: !_.isEmpty(value) ? !this.checkWords(value) : false\n };\n var allValid = (validData.minChars && validData.capitalLetters && validData.numbers && validData.words);\n\n this.setState({\n isValidatorValid: validData,\n allValidatorValid: allValid,\n valid: allValid\n });\n };\n\n countCapitals = (value) => {\n return value.replace(/[^A-Z]/g, \"\").length;\n };\n\n countNumbers = (value) => {\n return /\\d/.test(value);\n };\n\n checkWords = (value) => {\n return _.some(this.state.forbiddenWords, function (word) {\n var matched = (word === value) ? true : \"\";\n return matched\n });\n };\n\n render() {\n\n var inputGroupClasses = cx({\n 'input_group': true,\n 'input_valid': this.state.valid,\n 'input_error': !this.state.valid,\n 'input_empty': this.state.empty,\n 'input_hasValue': !this.state.empty,\n 'input_focused': this.state.focus,\n 'input_unfocused': !this.state.focus\n });\n\n var validator;\n\n if (this.state.validator) {\n validator =\n <PasswordValidator\n ref=\"passwordValidator\"\n visible={this.state.validatorVisible}\n name={this.props.text}\n value={this.state.value}\n validData={this.state.isValidatorValid}\n valid={this.state.allValidatorValid}\n forbiddenWords={this.state.forbiddenWords}\n minCharacters={this.props.minCharacters}\n requireCapitals={this.props.requireCapitals}\n requireNumbers={this.props.requireNumbers}\n />\n };\n\n return (\n <div className={inputGroupClasses}>\n\n <label className=\"input_label\" htmlFor={this.props.text}>\n <span className=\"label_text\">{this.props.text}</span>\n </label>\n\n <input\n {...this.props}\n placeholder={this.props.placeholder}\n className=\"input\"\n id={this.props.text}\n defaultValue={this.props.defaultValue}\n value={this.state.value}\n onChange={this.handleChange}\n onFocus={this.handleFocus}\n onBlur={this.handleBlur}\n autoComplete=\"off\"\n />\n\n <InputError\n visible={this.state.errorVisible}\n errorMessage={this.state.errorMessage}\n />\n\n <div className=\"validationIcons\">\n <i className=\"input_error_icon\" onMouseEnter={this.mouseEnterError}> <Icon type=\"circle_error\"/> </i>\n <i className=\"input_valid_icon\"> <Icon type=\"circle_tick\"/> </i>\n </div>\n\n {validator}\n\n </div>\n );\n }\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./hub/static/jsx/components/Input.jsx\n **/","import React from 'react';\n\nexport default class Icon extends React.Component {\n\n render() {\n switch(this.props.type) {\n\n case 'circle_error':\n return (\n <svg viewBox=\"0 0 20 20\">\n <path d=\"M10,0.982c4.973,0,9.018,4.046,9.018,9.018S14.973,19.018,10,19.018S0.982,14.973,0.982,10\n S5.027,0.982,10,0.982 M10,0C4.477,0,0,4.477,0,10c0,5.523,4.477,10,10,10s10-4.477,10-10C20,4.477,15.523,0,10,0L10,0z M9,5.703\n V5.441h2.5v0.262l-0.66,5.779H9.66L9,5.703z M9.44,12.951h1.621v1.491H9.44V12.951z\"/>\n </svg>\n )\n\n case 'circle_tick':\n return (\n <svg viewBox=\"0 0 23 23\">\n <path d=\"M11.5,23C5.2,23,0,17.8,0,11.5S5.2,0,11.5,0S23,5.2,23,11.5S17.8,23,11.5,23z M11.5,1C5.7,1,1,5.7,1,11.5S5.7,22,11.5,22\n S22,17.3,22,11.5S17.3,1,11.5,1z M10.4,15.2l6.7-7c0.2-0.2,0.2-0.5,0-0.7c-0.2-0.2-0.5-0.2-0.7,0L10,14.2L7,11\n c-0.2-0.2-0.5-0.2-0.7,0c-0.2,0.2-0.2,0.5,0,0.7l3.4,3.5c0.1,0.1,0.2,0.1,0.3,0.1S10.3,15.3,10.4,15.2z\"/>\n </svg>\n )\n\n case 'circle_tick_filled':\n return (\n <svg viewBox=\"0 0 20 20\">\n <path fill=\"#4FB07F\" d=\"M9.5,0C14.7,0,19,4.3,19,9.5S14.7,19,9.5,19S0,14.7,0,9.5S4.3,0,9.5,0z\"/>\n <path fill=\"#FFFFFF\" d=\"M8.7,12.9c-0.1,0-0.2,0-0.3-0.1l-2.4-2.5c-0.1-0.1-0.1-0.4,0-0.5c0.1-0.2,0.4-0.2,0.5,0L8.7,12l4.6-5\n c0.1-0.1,0.4-0.1,0.5,0c0.1,0.2,0.1,0.4,0,0.5L9,12.8C9,12.8,8.9,12.9,8.7,12.9C8.8,12.9,8.8,12.9,8.7,12.9z\"/>\n </svg>\n )\n\n case 'guthub':\n return (\n <svg viewBox=\"0 0 34 34\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" fill=\"#191717\" d=\"M32.6,16.3c0,7.2-4.7,13.3-11.1,15.5c-0.8,0.2-1.1-0.3-1.1-0.8\n c0-0.5,0-2.3,0-4.5c0-1.5-0.5-2.5-1.1-3c3.6-0.4,7.4-1.8,7.4-8c0-1.8-0.6-3.2-1.7-4.4c0.2-0.4,0.7-2.1-0.2-4.3c0,0-1.4-0.4-4.5,1.7\n c-1.3-0.4-2.7-0.5-4.1-0.5c-1.4,0-2.8,0.2-4.1,0.5C9.1,6.3,7.7,6.8,7.7,6.8C6.8,9,7.4,10.7,7.6,11.1c-1,1.1-1.7,2.6-1.7,4.4\n c0,6.2,3.8,7.6,7.4,8.1c-0.5,0.4-0.9,1.1-1,2.2c-0.9,0.4-3.3,1.1-4.7-1.4c0,0-0.9-1.6-2.5-1.7c0,0-1.6,0-0.1,1c0,0,1.1,0.5,1.8,2.4\n c0,0,1,3.2,5.5,2.2c0,1.4,0,2.4,0,2.8c0,0.4-0.3,0.9-1.1,0.8C4.7,29.6,0,23.5,0,16.3C0,7.3,7.3,0,16.3,0C25.3,0,32.6,7.3,32.6,16.3z\n \"/>\n </svg>\n )\n }\n }\n}\n\n\n/** WEBPACK FOOTER **\n ** ./hub/static/jsx/components/Icon.jsx\n **/","import React from 'react';\nimport _ from 'underscore';\nimport classNames from 'classnames/bind';\n\nlet cx = classNames.bind({});\n\nexport default class InputError extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n message: 'Input is invalid'\n };\n }\n\n render() {\n var errorClass = cx({\n 'error_container': true,\n 'visible': this.props.visible,\n 'invisible': !this.props.visible\n });\n\n return (\n <div className={errorClass}>\n <span>{this.props.errorMessage}</span>\n </div>\n )\n }\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./hub/static/jsx/components/InputError.jsx\n **/","/*!\n Copyright (c) 2015 Jed Watson.\n Licensed under the MIT License (MIT), see\n http://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = '';\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (!arg) continue;\n\n\t\t\tvar argType = typeof arg;\n\n\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\tclasses += ' ' + (this && this[arg] || arg);\n\t\t\t} else if (Array.isArray(arg)) {\n\t\t\t\tclasses += ' ' + classNames.apply(this, arg);\n\t\t\t} else if (argType === 'object') {\n\t\t\t\tfor (var key in arg) {\n\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\tclasses += ' ' + (this && this[key] || key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn classes.substr(1);\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/classnames/bind.js\n ** module id = 165\n ** module chunks = 0 1\n **/","import React from 'react';\nimport _ from 'underscore';\nimport Icon from './Icon';\nimport classNames from 'classnames/bind';\n\nlet cx = classNames.bind({});\n\nexport default class PasswordValidator extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n value: null,\n minCharacters: this.props.minCharacters,\n requireCapitals: this.props.requireCapitals,\n requireNumbers: this.props.requireNumbers,\n forbiddenWords: this.props.forbiddenWords,\n name: this.props.name\n }\n }\n\n render() {\n var validatorClass = cx({\n 'password_validator': true,\n 'visible': this.props.visible,\n 'invisible': !this.props.visible\n });\n\n var forbiddenWords = this.state.forbiddenWords.map(function(word, i) {\n return (\n <span key={i} className=\"bad_word\">\n \"{word}\"\n </span>\n )\n });\n\n var validatorTitle;\n\n if (this.props.valid) {\n validatorTitle =\n <h4 className=\"validator_title valid\">\n {this.props.name} IS OK\n </h4>\n } else {\n validatorTitle =\n <h4 className=\"validator_title invalid\">\n {this.props.name} RULES\n </h4>\n }\n\n return (\n <div className={validatorClass}>\n <div className=\"validator_container\">\n {validatorTitle}\n <ul className=\"rules_list\">\n <li className={cx({'valid': this.props.validData.minChars})}>\n <i className=\"icon_valid\"> <Icon type=\"circle_tick_filled\"/> </i>\n <i className=\"icon_invalid\"> <Icon type=\"circle_error\"/> </i>\n <span className=\"error_message\">{this.state.minCharacters} characters minimum</span>\n </li>\n\n <li className={cx({'valid': this.props.validData.capitalLetters})}>\n <i className=\"icon_valid\"> <Icon type=\"circle_tick_filled\"/> </i>\n <i className=\"icon_invalid\"> <Icon type=\"circle_error\"/> </i>\n <span className=\"error_message\">Contains at least {this.state.requireCapitals} capital letter</span>\n </li>\n\n <li className={cx({'valid': this.props.validData.numbers})}>\n <i className=\"icon_valid\"> <Icon type=\"circle_tick_filled\"/> </i>\n <i className=\"icon_invalid\"> <Icon type=\"circle_error\"/> </i>\n <span className=\"error_message\">Contains at least {this.state.requireNumbers} number</span>\n </li>\n\n <li className={cx({'valid': this.props.validData.words})}>\n <i className=\"icon_valid\"> <Icon type=\"circle_tick_filled\"/> </i>\n <i className=\"icon_invalid\"> <Icon type=\"circle_error\"/> </i>\n <span className=\"error_message\">Can't be {forbiddenWords}</span>\n </li>\n </ul>\n </div>\n </div>\n )\n }\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./hub/static/jsx/components/PasswordValidator.jsx\n **/","export function getQueryVariable(variable)\n{\n var query = window.location.search.substring(1);\n var vars = query.split(\"&\");\n for (var i=0;i<vars.length;i++) {\n var pair = vars[i].split(\"=\");\n if(pair[0] == variable){return pair[1];}\n }\n return '/';\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./hub/static/jsx/components/Utils.jsx\n **/","import React from 'react';\nimport _ from 'underscore';\nimport $ from 'jquery';\nimport Input from './components/Input';\nimport Icon from './components/Icon';\nimport InputError from './components/InputError';\nimport {getQueryVariable} from './components/Utils';\n\nexport class RegisterComponent extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n email: null,\n password: null,\n confirmPassword: null,\n forbiddenWords: [\"password\", \"user\", \"username\"],\n errorVisible: false,\n errorMessage: '注册失败, 请联系管理员'\n };\n }\n\n handlePasswordInput = (event) => {\n if (!_.isEmpty(this.state.confirmPassword)) {\n this.refs.passwordConfirm.isValid();\n };\n this.refs.passwordConfirm.hideError();\n this.setState({\n password: event.target.value\n });\n }\n\n handleConfirmPasswordInput = (event) => {\n this.setState({\n confirmPassword: event.target.value\n });\n };\n\n saveAndContinue = (event) => {\n event.preventDefault();\n\n var canProceed = this.validateEmail(this.state.email)\n && this.refs.password.isValid()\n && this.refs.passwordConfirm.isValid();\n\n if (canProceed) {\n let data = {\n email: this.state.email,\n password: this.state.password\n }, self = this, visible;\n\n\n $.post('/register/', data).done(function(result) {\n let res = JSON.parse(result);\n if (res.r) {\n self.setState({\n errorVisible: true,\n errorMessage: res.message\n });\n } else {\n let next = decodeURIComponent(getQueryVariable('continue'));\n window.location = next;\n }\n });\n } else {\n this.refs.email.isValid();\n this.refs.password.isValid();\n this.refs.passwordConfirm.isValid();\n }\n };\n\n isConfirmedPassword = (event) => {\n return (event == this.state.password);\n };\n\n handleEmailInput = (event) => {\n this.setState({\n email: event.target.value\n });\n };\n\n validateEmail = (event) => {\n // from http://stackoverflow.com/questions/46155/validate-email-address-in-javascript\n var re = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n return re.test(event);\n };\n\n isEmpty = (value) => {\n return !_.isEmpty(value);\n };\n\n updateStatesValue = (value) => {\n this.setState({\n statesValue: value\n });\n };\n\n render() {\n return (\n <div className=\"create_account_screen\">\n <div className=\"create_account_form\">\n <h1>创建新用户</h1>\n <p>开启CODE之旅.</p>\n <form onSubmit={this.saveAndContinue}>\n\n <Input\n text=\"邮箱地址\"\n ref=\"email\"\n type=\"text\"\n defaultValue={this.state.email}\n validate={this.validateEmail}\n value={this.state.email}\n onChange={this.handleEmailInput}\n errorMessage=\"Email格式错误\"\n emptyMessage=\"Email不能为空\"\n errorVisible={this.state.showEmailError}\n />\n\n <Input\n text=\"密码\"\n type=\"password\"\n ref=\"password\"\n validator=\"true\"\n minCharacters=\"8\"\n requireCapitals=\"1\"\n requireNumbers=\"1\"\n forbiddenWords={this.state.forbiddenWords}\n value={this.state.passsword}\n emptyMessage=\"密码输入错误\"\n onChange={this.handlePasswordInput}\n />\n\n <Input\n text=\"确认密码\"\n ref=\"passwordConfirm\"\n type=\"password\"\n validate={this.isConfirmedPassword}\n value={this.state.confirmPassword}\n onChange={this.handleConfirmPasswordInput}\n emptyMessage=\"密码为必选\"\n errorMessage=\"2次输入的密码不相同, 请确认\"\n />\n\n <InputError\n visible={this.state.errorVisible}\n errorMessage={this.state.errorMessage}\n />\n\n <button\n type=\"submit\"\n className=\"button button_wide\">\n 创建\n </button>\n </form>\n </div>\n </div>\n );\n }\n}\n\nexport default class Register extends React.Component {\n render() {\n return (\n <div className=\"application_wrapper\">\n <div className=\"application_routeHandler\">\n <RegisterComponent/>\n </div>\n </div>\n );\n }\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./hub/static/jsx/signup.jsx\n **/"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/js/mod/vendors.js b/dist/js/mod/vendors.js new file mode 100644 index 0000000..7efaf2d --- /dev/null +++ b/dist/js/mod/vendors.js @@ -0,0 +1,9325 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // install a JSONP callback for chunk loading +/******/ var parentJsonpFunction = window["webpackJsonp"]; +/******/ window["webpackJsonp"] = function webpackJsonpCallback(chunkIds, moreModules) { +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0, callbacks = []; +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(installedChunks[chunkId]) +/******/ callbacks.push.apply(callbacks, installedChunks[chunkId]); +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ for(moduleId in moreModules) { +/******/ modules[moduleId] = moreModules[moduleId]; +/******/ } +/******/ if(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules); +/******/ while(callbacks.length) +/******/ callbacks.shift().call(null, __webpack_require__); +/******/ if(moreModules[0]) { +/******/ installedModules[0] = 0; +/******/ return __webpack_require__(0); +/******/ } +/******/ }; +/******/ +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // object to store loaded and loading chunks +/******/ // "0" means "already loaded" +/******/ // Array means "loading", array contains callbacks +/******/ var installedChunks = { +/******/ 2:0 +/******/ }; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; +/******/ +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.loaded = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ // This file contains only the entry chunk. +/******/ // The chunk loading function for additional chunks +/******/ __webpack_require__.e = function requireEnsure(chunkId, callback) { +/******/ // "0" is the signal for "already loaded" +/******/ if(installedChunks[chunkId] === 0) +/******/ return callback.call(null, __webpack_require__); +/******/ +/******/ // an array means "currently loading". +/******/ if(installedChunks[chunkId] !== undefined) { +/******/ installedChunks[chunkId].push(callback); +/******/ } else { +/******/ // start chunk loading +/******/ installedChunks[chunkId] = [callback]; +/******/ var head = document.getElementsByTagName('head')[0]; +/******/ var script = document.createElement('script'); +/******/ script.type = 'text/javascript'; +/******/ script.charset = 'utf-8'; +/******/ script.async = true; +/******/ +/******/ script.src = __webpack_require__.p + "" + chunkId + "." + ({"0":"login","1":"register"}[chunkId]||chunkId) + ".js"; +/******/ head.appendChild(script); +/******/ } +/******/ }; +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = "/home/vagrant/code/dist/js/mod"; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ 0: +/***/ function(module, exports, __webpack_require__) { + + module.exports = __webpack_require__(161); + + +/***/ }, + +/***/ 161: +/***/ function(module, exports, __webpack_require__) { + + var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! + * jQuery JavaScript Library v2.1.4 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2015-04-28T16:01Z + */ + + (function( global, factory ) { + + if ( typeof module === "object" && typeof module.exports === "object" ) { + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + + // Pass this if window is not defined yet + }(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + + // Support: Firefox 18+ + // Can't be in strict mode, several libs including ASP.NET trace + // the stack via arguments.caller.callee and Firefox dies if + // you try to trace through "use strict" call chains. (#13335) + // + + var arr = []; + + var slice = arr.slice; + + var concat = arr.concat; + + var push = arr.push; + + var indexOf = arr.indexOf; + + var class2type = {}; + + var toString = class2type.toString; + + var hasOwn = class2type.hasOwnProperty; + + var support = {}; + + + + var + // Use the correct document accordingly with window argument (sandbox) + document = window.document, + + version = "2.1.4", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }, + + // Support: Android<4.1 + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([\da-z])/gi, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }; + + jQuery.fn = jQuery.prototype = { + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // Start with an empty selector + selector: "", + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num != null ? + + // Return just the one element from the set + ( num < 0 ? this[ num + this.length ] : this[ num ] ) : + + // Return all the elements in a clean array + slice.call( this ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + ret.context = this.context; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice + }; + + jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; + }; + + jQuery.extend({ + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray, + + isWindow: function( obj ) { + return obj != null && obj === obj.window; + }, + + isNumeric: function( obj ) { + // parseFloat NaNs numeric-cast false positives (null|true|false|"") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + // adding 1 corrects loss of precision from parseFloat (#15100) + return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0; + }, + + isPlainObject: function( obj ) { + // Not plain objects: + // - Any object or value whose internal [[Class]] property is not "[object Object]" + // - DOM nodes + // - window + if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + if ( obj.constructor && + !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) { + return false; + } + + // If the function hasn't returned already, we're confident that + // |obj| is a plain object, created by {} or constructed with new Object + return true; + }, + + isEmptyObject: function( obj ) { + var name; + for ( name in obj ) { + return false; + } + return true; + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + // Support: Android<4.0, iOS<6 (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call(obj) ] || "object" : + typeof obj; + }, + + // Evaluates a script in a global context + globalEval: function( code ) { + var script, + indirect = eval; + + code = jQuery.trim( code ); + + if ( code ) { + // If the code includes a valid, prologue position + // strict mode pragma, execute code by injecting a + // script tag into the document. + if ( code.indexOf("use strict") === 1 ) { + script = document.createElement("script"); + script.text = code; + document.head.appendChild( script ).parentNode.removeChild( script ); + } else { + // Otherwise, avoid the DOM node creation, insertion + // and removal by using an indirect global eval + indirect( code ); + } + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Support: IE9-11+ + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + // args is for internal usage only + each: function( obj, callback, args ) { + var value, + i = 0, + length = obj.length, + isArray = isArraylike( obj ); + + if ( args ) { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } + } + + return obj; + }, + + // Support: Android<4.1 + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArraylike( Object(arr) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, + i = 0, + length = elems.length, + isArray = isArraylike( elems ), + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var tmp, args, proxy; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: Date.now, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support + }); + + // Populate the class2type map + jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); + }); + + function isArraylike( obj ) { + + // Support: iOS 8.2 (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = "length" in obj && obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + if ( obj.nodeType === 1 && length ) { + return true; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; + } + var Sizzle = + /*! + * Sizzle CSS Selector Engine v2.2.0-pre + * http://sizzlejs.com/ + * + * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-12-16 + */ + (function( window ) { + + var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // General-purpose constants + MAX_NEGATIVE = 1 << 31, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // http://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + // http://www.w3.org/TR/css3-syntax/#characters + characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + + // Loosely modeled on CSS identifier characters + // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors + // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = characterEncoding.replace( "w", "w#" ), + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + characterEncoding + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + characterEncoding + ")" ), + "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), + "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + rescape = /'|\\/g, + + // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }; + + // Optimize for push.apply( _, NodeList ) + try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; + } catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; + } + + function Sizzle( selector, context, results, seed ) { + var match, elem, m, nodeType, + // QSA vars + i, groups, old, nid, newContext, newSelector; + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + + context = context || document; + results = results || []; + nodeType = context.nodeType; + + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + if ( !seed && documentIsHTML ) { + + // Try to shortcut find operations when possible (e.g., not under DocumentFragment) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + // Speed-up: Sizzle("#ID") + if ( (m = match[1]) ) { + if ( nodeType === 9 ) { + elem = context.getElementById( m ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document (jQuery #6963) + if ( elem && elem.parentNode ) { + // Handle the case where IE, Opera, and Webkit return items + // by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + } else { + // Context is not a document + if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && + contains( context, elem ) && elem.id === m ) { + results.push( elem ); + return results; + } + } + + // Speed-up: Sizzle("TAG") + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Speed-up: Sizzle(".CLASS") + } else if ( (m = match[3]) && support.getElementsByClassName ) { + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // QSA path + if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + nid = old = expando; + newContext = context; + newSelector = nodeType !== 1 && selector; + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + groups = tokenize( selector ); + + if ( (old = context.getAttribute("id")) ) { + nid = old.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", nid ); + } + nid = "[id='" + nid + "'] "; + + i = groups.length; + while ( i-- ) { + groups[i] = nid + toSelector( groups[i] ); + } + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context; + newSelector = groups.join(","); + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch(qsaError) { + } finally { + if ( !old ) { + context.removeAttribute("id"); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); + } + + /** + * Create key-value caches of limited size + * @returns {Function(string, Object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ + function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; + } + + /** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ + function markFunction( fn ) { + fn[ expando ] = true; + return fn; + } + + /** + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ + function assert( fn ) { + var div = document.createElement("div"); + + try { + return !!fn( div ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( div.parentNode ) { + div.parentNode.removeChild( div ); + } + // release memory in IE + div = null; + } + } + + /** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ + function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = attrs.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } + } + + /** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ + function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + ( ~b.sourceIndex || MAX_NEGATIVE ) - + ( ~a.sourceIndex || MAX_NEGATIVE ); + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; + } + + /** + * Returns a function to use in pseudos for input types + * @param {String} type + */ + function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; + } + + /** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ + function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; + } + + /** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ + function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); + } + + /** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ + function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; + } + + // Expose support vars for convenience + support = Sizzle.support = {}; + + /** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ + isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; + }; + + /** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ + setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, parent, + doc = node ? node.ownerDocument || node : preferredDoc; + + // If no document and documentElement is available, return + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Set our document + document = doc; + docElem = doc.documentElement; + parent = doc.defaultView; + + // Support: IE>8 + // If iframe document is assigned to "document" variable and if iframe has been reloaded, + // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 + // IE6-8 do not support the defaultView property so parent will be undefined + if ( parent && parent !== parent.top ) { + // IE11 does not have attachEvent, so all must suffer + if ( parent.addEventListener ) { + parent.addEventListener( "unload", unloadHandler, false ); + } else if ( parent.attachEvent ) { + parent.attachEvent( "onunload", unloadHandler ); + } + } + + /* Support tests + ---------------------------------------------------------------------- */ + documentIsHTML = !isXML( doc ); + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( div ) { + div.className = "i"; + return !div.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( div ) { + div.appendChild( doc.createComment("") ); + return !div.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( doc.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( div ) { + docElem.appendChild( div ).id = expando; + return !doc.getElementsByName || !doc.getElementsByName( expando ).length; + }); + + // ID find and filter + if ( support.getById ) { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var m = context.getElementById( id ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [ m ] : []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + } else { + // Support: IE6/7 + // getElementById is not reliable as a find shortcut + delete Expr.find["ID"]; + + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See http://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( div ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + docElem.appendChild( div ).innerHTML = "<a id='" + expando + "'></a>" + + "<select id='" + expando + "-\f]' msallowcapture=''>" + + "<option selected=''></option></select>"; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( div.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+ + if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibing-combinator selector` fails + if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( div ) { + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = doc.createElement("input"); + input.setAttribute( "type", "hidden" ); + div.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( div.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + div.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( div, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully does not implement inclusive descendent + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === doc ? -1 : + b === doc ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return doc; + }; + + Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); + }; + + Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch (e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; + }; + + Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); + }; + + Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; + }; + + Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); + }; + + /** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ + Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; + }; + + /** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ + getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; + }; + + Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, outerCache, node, diff, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + // Seek `elem` from a previously-cached index + outerCache = parent[ expando ] || (parent[ expando ] = {}); + cache = outerCache[ type ] || []; + nodeIndex = cache[0] === dirruns && cache[1]; + diff = cache[0] === dirruns && cache[2]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + outerCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + // Use previously-cached element index if available + } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { + diff = cache[1]; + + // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) + } else { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { + // Cache the index of each encountered element + if ( useCache ) { + (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": function( elem ) { + return elem.disabled === false; + }, + + "disabled": function( elem ) { + return elem.disabled === true; + }, + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } + }; + + Expr.pseudos["nth"] = Expr.pseudos["eq"]; + + // Add button/input type pseudos + for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); + } + for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); + } + + // Easy API for creating new setFilters + function setFilters() {} + setFilters.prototype = Expr.filters = Expr.pseudos; + Expr.setFilters = new setFilters(); + + tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); + }; + + function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; + } + + function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + if ( (oldCache = outerCache[ dir ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + outerCache[ dir ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + }; + } + + function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; + } + + function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; + } + + function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; + } + + function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); + } + + function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); + } + + function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context !== document && context; + } + + // Add elements passing elementMatchers directly to results + // Keep `i` a string if there are no elements so `matchedCount` will be "00" below + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // Apply set filters to unmatched elements + matchedCount += i; + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; + } + + compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; + }; + + /** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ + select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is no seed and only one group + if ( match.length === 1 ) { + + // Take a shortcut and set the context if the root selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + support.getById && context.nodeType === 9 && documentIsHTML && + Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; + }; + + // One-time assignments + + // Sort stability + support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + + // Support: Chrome 14-35+ + // Always assume duplicates if they aren't passed to the comparison function + support.detectDuplicates = !!hasDuplicate; + + // Initialize against the default document + setDocument(); + + // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) + // Detached nodes confoundingly follow *each other* + support.sortDetached = assert(function( div1 ) { + // Should return 1, but returns 4 (following) + return div1.compareDocumentPosition( document.createElement("div") ) & 1; + }); + + // Support: IE<8 + // Prevent attribute/property "interpolation" + // http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx + if ( !assert(function( div ) { + div.innerHTML = "<a href='#'></a>"; + return div.firstChild.getAttribute("href") === "#" ; + }) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); + } + + // Support: IE<9 + // Use defaultValue in place of getAttribute("value") + if ( !support.attributes || !assert(function( div ) { + div.innerHTML = "<input/>"; + div.firstChild.setAttribute( "value", "" ); + return div.firstChild.getAttribute( "value" ) === ""; + }) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); + } + + // Support: IE<9 + // Use getAttributeNode to fetch booleans when getAttribute lies + if ( !assert(function( div ) { + return div.getAttribute("disabled") == null; + }) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); + } + + return Sizzle; + + })( window ); + + + + jQuery.find = Sizzle; + jQuery.expr = Sizzle.selectors; + jQuery.expr[":"] = jQuery.expr.pseudos; + jQuery.unique = Sizzle.uniqueSort; + jQuery.text = Sizzle.getText; + jQuery.isXMLDoc = Sizzle.isXML; + jQuery.contains = Sizzle.contains; + + + + var rneedsContext = jQuery.expr.match.needsContext; + + var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/); + + + + var risSimple = /^.[^:#\[\.,]*$/; + + // Implement the identical functionality for filter and not + function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + /* jshint -W018 */ + return !!qualifier.call( elem, i, elem ) !== not; + }); + + } + + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + }); + + } + + if ( typeof qualifier === "string" ) { + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + qualifier = jQuery.filter( qualifier, elements ); + } + + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) >= 0 ) !== not; + }); + } + + jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 && elem.nodeType === 1 ? + jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : + jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + })); + }; + + jQuery.fn.extend({ + find: function( selector ) { + var i, + len = this.length, + ret = [], + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter(function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }) ); + } + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + // Needed because $( selector, context ) becomes $( context ).find( selector ) + ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); + ret.selector = this.selector ? this.selector + " " + selector : selector; + return ret; + }, + filter: function( selector ) { + return this.pushStack( winnow(this, selector || [], false) ); + }, + not: function( selector ) { + return this.pushStack( winnow(this, selector || [], true) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } + }); + + + // Initialize a jQuery object + + + // A central reference to the root jQuery(document) + var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over <tag> to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, + + init = jQuery.fn.init = function( selector, context ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[0] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[1], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[2] ); + + // Support: Blackberry 4.6 + // gEBID returns nodes no longer in the document (#6963) + if ( elem && elem.parentNode ) { + // Inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || rootjQuery ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return typeof rootjQuery.ready !== "undefined" ? + rootjQuery.ready( selector ) : + // Execute immediately if ready is not present + selector( jQuery ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }; + + // Give the init function the jQuery prototype for later instantiation + init.prototype = jQuery.fn; + + // Initialize central reference + rootjQuery = jQuery( document ); + + + var rparentsprev = /^(?:parents|prev(?:Until|All))/, + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + + jQuery.extend({ + dir: function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; + }, + + sibling: function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; + } + }); + + jQuery.fn.extend({ + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter(function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( ; i < l; i++ ) { + for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { + // Always skip document fragments + if ( cur.nodeType < 11 && (pos ? + pos.index(cur) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector(cur, selectors)) ) { + + matched.push( cur ); + break; + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.unique( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter(selector) + ); + } + }); + + function sibling( cur, dir ) { + while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {} + return cur; + } + + jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return elem.contentDocument || jQuery.merge( [], elem.childNodes ); + } + }, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.unique( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; + }); + var rnotwhite = (/\S+/g); + + + + // String to Object options format cache + var optionsCache = {}; + + // Convert String-formatted options into Object-formatted ones and store in cache + function createOptions( options ) { + var object = optionsCache[ options ] = {}; + jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { + object[ flag ] = true; + }); + return object; + } + + /* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ + jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + ( optionsCache[ options ] || createOptions( options ) ) : + jQuery.extend( {}, options ); + + var // Last fire value (for non-forgettable lists) + memory, + // Flag to know if list was already fired + fired, + // Flag to know if list is currently firing + firing, + // First callback to fire (used internally by add and fireWith) + firingStart, + // End of the loop when firing + firingLength, + // Index of currently firing callback (modified by remove if needed) + firingIndex, + // Actual callback list + list = [], + // Stack of fire calls for repeatable lists + stack = !options.once && [], + // Fire callbacks + fire = function( data ) { + memory = options.memory && data; + fired = true; + firingIndex = firingStart || 0; + firingStart = 0; + firingLength = list.length; + firing = true; + for ( ; list && firingIndex < firingLength; firingIndex++ ) { + if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { + memory = false; // To prevent further calls using add + break; + } + } + firing = false; + if ( list ) { + if ( stack ) { + if ( stack.length ) { + fire( stack.shift() ); + } + } else if ( memory ) { + list = []; + } else { + self.disable(); + } + } + }, + // Actual Callbacks object + self = { + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + // First, we save the current length + var start = list.length; + (function add( args ) { + jQuery.each( args, function( _, arg ) { + var type = jQuery.type( arg ); + if ( type === "function" ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && type !== "string" ) { + // Inspect recursively + add( arg ); + } + }); + })( arguments ); + // Do we need to add the callbacks to the + // current firing batch? + if ( firing ) { + firingLength = list.length; + // With memory, if we're not firing then + // we should call right away + } else if ( memory ) { + firingStart = start; + fire( memory ); + } + } + return this; + }, + // Remove a callback from the list + remove: function() { + if ( list ) { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + // Handle firing indexes + if ( firing ) { + if ( index <= firingLength ) { + firingLength--; + } + if ( index <= firingIndex ) { + firingIndex--; + } + } + } + }); + } + return this; + }, + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); + }, + // Remove all callbacks from the list + empty: function() { + list = []; + firingLength = 0; + return this; + }, + // Have the list do nothing anymore + disable: function() { + list = stack = memory = undefined; + return this; + }, + // Is it disabled? + disabled: function() { + return !list; + }, + // Lock the list in its current state + lock: function() { + stack = undefined; + if ( !memory ) { + self.disable(); + } + return this; + }, + // Is it locked? + locked: function() { + return !stack; + }, + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( list && ( !fired || stack ) ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + if ( firing ) { + stack.push( args ); + } else { + fire( args ); + } + } + return this; + }, + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; + }; + + + jQuery.extend({ + + Deferred: function( func ) { + var tuples = [ + // action, add listener, listener list, final state + [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], + [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], + [ "notify", "progress", jQuery.Callbacks("memory") ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + then: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + return jQuery.Deferred(function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; + // deferred[ done | fail | progress ] for forwarding actions to newDefer + deferred[ tuple[1] ](function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .done( newDefer.resolve ) + .fail( newDefer.reject ) + .progress( newDefer.notify ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); + } + }); + }); + fns = null; + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 3 ]; + + // promise[ done | fail | progress ] = list.add + promise[ tuple[1] ] = list.add; + + // Handle state + if ( stateString ) { + list.add(function() { + // state = [ resolved | rejected ] + state = stateString; + + // [ reject_list | resolve_list ].disable; progress_list.lock + }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); + } + + // deferred[ resolve | reject | notify ] + deferred[ tuple[0] ] = function() { + deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); + return this; + }; + deferred[ tuple[0] + "With" ] = list.fireWith; + }); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( subordinate /* , ..., subordinateN */ ) { + var i = 0, + resolveValues = slice.call( arguments ), + length = resolveValues.length, + + // the count of uncompleted subordinates + remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + + // the master Deferred. If resolveValues consist of only a single Deferred, just use that. + deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + + // Update function for both resolve and progress values + updateFunc = function( i, contexts, values ) { + return function( value ) { + contexts[ i ] = this; + values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( values === progressValues ) { + deferred.notifyWith( contexts, values ); + } else if ( !( --remaining ) ) { + deferred.resolveWith( contexts, values ); + } + }; + }, + + progressValues, progressContexts, resolveContexts; + + // Add listeners to Deferred subordinates; treat others as resolved + if ( length > 1 ) { + progressValues = new Array( length ); + progressContexts = new Array( length ); + resolveContexts = new Array( length ); + for ( ; i < length; i++ ) { + if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { + resolveValues[ i ].promise() + .done( updateFunc( i, resolveContexts, resolveValues ) ) + .fail( deferred.reject ) + .progress( updateFunc( i, progressContexts, progressValues ) ); + } else { + --remaining; + } + } + } + + // If we're not waiting on anything, resolve the master + if ( !remaining ) { + deferred.resolveWith( resolveContexts, resolveValues ); + } + + return deferred.promise(); + } + }); + + + // The deferred used on DOM ready + var readyList; + + jQuery.fn.ready = function( fn ) { + // Add the callback + jQuery.ready.promise().done( fn ); + + return this; + }; + + jQuery.extend({ + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.triggerHandler ) { + jQuery( document ).triggerHandler( "ready" ); + jQuery( document ).off( "ready" ); + } + } + }); + + /** + * The ready event handler and self cleanup method + */ + function completed() { + document.removeEventListener( "DOMContentLoaded", completed, false ); + window.removeEventListener( "load", completed, false ); + jQuery.ready(); + } + + jQuery.ready.promise = function( obj ) { + if ( !readyList ) { + + readyList = jQuery.Deferred(); + + // Catch cases where $(document).ready() is called after the browser event has already occurred. + // We once tried to use readyState "interactive" here, but it caused issues like the one + // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + setTimeout( jQuery.ready ); + + } else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed, false ); + } + } + return readyList.promise( obj ); + }; + + // Kick off the DOM ready check even if the user does not + jQuery.ready.promise(); + + + + + // Multifunctional method to get and set values of a collection + // The value/s can optionally be executed if it's a function + var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); + } + } + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + len ? fn( elems[0], key ) : emptyGet; + }; + + + /** + * Determines whether an object can have data + */ + jQuery.acceptData = function( owner ) { + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + /* jshint -W018 */ + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); + }; + + + function Data() { + // Support: Android<4, + // Old WebKit does not have Object.preventExtensions/freeze method, + // return new empty object instead with no [[set]] accessor + Object.defineProperty( this.cache = {}, 0, { + get: function() { + return {}; + } + }); + + this.expando = jQuery.expando + Data.uid++; + } + + Data.uid = 1; + Data.accepts = jQuery.acceptData; + + Data.prototype = { + key: function( owner ) { + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return the key for a frozen object. + if ( !Data.accepts( owner ) ) { + return 0; + } + + var descriptor = {}, + // Check if the owner object already has a cache key + unlock = owner[ this.expando ]; + + // If not, create one + if ( !unlock ) { + unlock = Data.uid++; + + // Secure it in a non-enumerable, non-writable property + try { + descriptor[ this.expando ] = { value: unlock }; + Object.defineProperties( owner, descriptor ); + + // Support: Android<4 + // Fallback to a less secure definition + } catch ( e ) { + descriptor[ this.expando ] = unlock; + jQuery.extend( owner, descriptor ); + } + } + + // Ensure the cache object + if ( !this.cache[ unlock ] ) { + this.cache[ unlock ] = {}; + } + + return unlock; + }, + set: function( owner, data, value ) { + var prop, + // There may be an unlock assigned to this node, + // if there is no entry for this "owner", create one inline + // and set the unlock as though an owner entry had always existed + unlock = this.key( owner ), + cache = this.cache[ unlock ]; + + // Handle: [ owner, key, value ] args + if ( typeof data === "string" ) { + cache[ data ] = value; + + // Handle: [ owner, { properties } ] args + } else { + // Fresh assignments by object are shallow copied + if ( jQuery.isEmptyObject( cache ) ) { + jQuery.extend( this.cache[ unlock ], data ); + // Otherwise, copy the properties one-by-one to the cache object + } else { + for ( prop in data ) { + cache[ prop ] = data[ prop ]; + } + } + } + return cache; + }, + get: function( owner, key ) { + // Either a valid cache is found, or will be created. + // New caches will be created and the unlock returned, + // allowing direct access to the newly created + // empty data object. A valid owner object must be provided. + var cache = this.cache[ this.key( owner ) ]; + + return key === undefined ? + cache : cache[ key ]; + }, + access: function( owner, key, value ) { + var stored; + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ((key && typeof key === "string") && value === undefined) ) { + + stored = this.get( owner, key ); + + return stored !== undefined ? + stored : this.get( owner, jQuery.camelCase(key) ); + } + + // [*]When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, name, camel, + unlock = this.key( owner ), + cache = this.cache[ unlock ]; + + if ( key === undefined ) { + this.cache[ unlock ] = {}; + + } else { + // Support array or space separated string of keys + if ( jQuery.isArray( key ) ) { + // If "name" is an array of keys... + // When data is initially created, via ("key", "val") signature, + // keys will be converted to camelCase. + // Since there is no way to tell _how_ a key was added, remove + // both plain key and camelCase key. #12786 + // This will only penalize the array argument path. + name = key.concat( key.map( jQuery.camelCase ) ); + } else { + camel = jQuery.camelCase( key ); + // Try the string as a key before any manipulation + if ( key in cache ) { + name = [ key, camel ]; + } else { + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + name = camel; + name = name in cache ? + [ name ] : ( name.match( rnotwhite ) || [] ); + } + } + + i = name.length; + while ( i-- ) { + delete cache[ name[ i ] ]; + } + } + }, + hasData: function( owner ) { + return !jQuery.isEmptyObject( + this.cache[ owner[ this.expando ] ] || {} + ); + }, + discard: function( owner ) { + if ( owner[ this.expando ] ) { + delete this.cache[ owner[ this.expando ] ]; + } + } + }; + var data_priv = new Data(); + + var data_user = new Data(); + + + + // Implementation Summary + // + // 1. Enforce API surface and semantic compatibility with 1.9.x branch + // 2. Improve the module's maintainability by reducing the storage + // paths to a single mechanism. + // 3. Use the same single mechanism to support "private" and "user" data. + // 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) + // 5. Avoid exposing implementation details on user objects (eg. expando properties) + // 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + + var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /([A-Z])/g; + + function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + // Only convert to a number if it doesn't change the string + +data + "" === data ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + data_user.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; + } + + jQuery.extend({ + hasData: function( elem ) { + return data_user.hasData( elem ) || data_priv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return data_user.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + data_user.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to data_priv methods, these can be deprecated. + _data: function( elem, name, data ) { + return data_priv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + data_priv.remove( elem, name ); + } + }); + + jQuery.fn.extend({ + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = data_user.get( elem ); + + if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE11+ + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.slice(5) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + data_priv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each(function() { + data_user.set( this, key ); + }); + } + + return access( this, function( value ) { + var data, + camelKey = jQuery.camelCase( key ); + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + // Attempt to get data from the cache + // with the key as-is + data = data_user.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to get data from the cache + // with the key camelized + data = data_user.get( elem, camelKey ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, camelKey, undefined ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each(function() { + // First, attempt to store a copy or reference of any + // data that might've been store with a camelCased key. + var data = data_user.get( this, camelKey ); + + // For HTML5 data-* attribute interop, we have to + // store property names with dashes in a camelCase form. + // This might not apply to all properties...* + data_user.set( this, camelKey, value ); + + // *... In the case of properties that might _actually_ + // have dashes, we need to also store a copy of that + // unchanged property. + if ( key.indexOf("-") !== -1 && data !== undefined ) { + data_user.set( this, key, value ); + } + }); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each(function() { + data_user.remove( this, key ); + }); + } + }); + + + jQuery.extend({ + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = data_priv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || jQuery.isArray( data ) ) { + queue = data_priv.access( elem, type, jQuery.makeArray(data) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return data_priv.get( elem, key ) || data_priv.access( elem, key, { + empty: jQuery.Callbacks("once memory").add(function() { + data_priv.remove( elem, [ type + "queue", key ] ); + }) + }); + } + }); + + jQuery.fn.extend({ + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[0], type ); + } + + return data === undefined ? + this : + this.each(function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = data_priv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } + }); + var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source; + + var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + + var isHidden = function( elem, el ) { + // isHidden might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); + }; + + var rcheckableType = (/^(?:checkbox|radio)$/i); + + + + (function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Safari<=5.1 + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Safari<=5.1, Android<4.2 + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE<=11+ + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = "<textarea>x</textarea>"; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + })(); + var strundefined = typeof undefined; + + + + support.focusinBubbles = "onfocusin" in window; + + + var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; + + function returnTrue() { + return true; + } + + function returnFalse() { + return false; + } + + function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } + } + + /* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ + jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = data_priv.get( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !(events = elemData.events) ) { + events = elemData.events = {}; + } + if ( !(eventHandle = elemData.handle) ) { + eventHandle = elemData.handle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join(".") + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !(handlers = events[ type ]) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = data_priv.hasData( elem ) && data_priv.get( elem ); + + if ( !elemData || !(events = elemData.events) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + delete elemData.handle; + data_priv.remove( elem, "events" ); + } + }, + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf(".") >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf(":") < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join("."); + event.namespace_re = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === (elem.ownerDocument || document) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && jQuery.acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && + jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + elem[ type ](); + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event ); + + var i, j, ret, matched, handleObj, + handlerQueue = [], + args = slice.call( arguments ), + handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or 2) have namespace(s) + // a subset or equal to those in the bound event (both can have no namespace). + if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) + .apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( (event.result = ret) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, matches, sel, handleObj, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + // Black-hole SVG <use> instance trees (#13180) + // Avoid non-left-click bubbling in Firefox (#3861) + if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.disabled !== true || event.type !== "click" ) { + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matches[ sel ] === undefined ) { + matches[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) >= 0 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matches[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push({ elem: cur, handlers: matches }); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( delegateCount < handlers.length ) { + handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); + } + + return handlerQueue; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + filter: function( event, original ) { + var eventDoc, doc, body, + button = original.button; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, copy, + type = event.type, + originalEvent = event, + fixHook = this.fixHooks[ type ]; + + if ( !fixHook ) { + this.fixHooks[ type ] = fixHook = + rmouseEvent.test( type ) ? this.mouseHooks : + rkeyEvent.test( type ) ? this.keyHooks : + {}; + } + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = new jQuery.Event( originalEvent ); + + i = copy.length; + while ( i-- ) { + prop = copy[ i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Support: Cordova 2.5 (WebKit) (#13255) + // All events should have a target; Cordova deviceready doesn't + if ( !event.target ) { + event.target = document; + } + + // Support: Safari 6.0+, Chrome<28 + // Target should not be a text node (#504, #13143) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; + }, + + special: { + load: { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + this.focus(); + return false; + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return jQuery.nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + }, + + simulate: function( type, elem, event, bubble ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true, + originalEvent: {} + } + ); + if ( bubble ) { + jQuery.event.trigger( e, null, elem ); + } else { + jQuery.event.dispatch.call( elem, e ); + } + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } + }; + + jQuery.removeEvent = function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + }; + + jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !(this instanceof jQuery.Event) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + // Support: Android<4.0 + src.returnValue === false ? + returnTrue : + returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; + }; + + // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding + // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html + jQuery.Event.prototype = { + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && e.preventDefault ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && e.stopPropagation ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && e.stopImmediatePropagation ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } + }; + + // Create mouseenter/leave events using mouseover/out and event-time checks + // Support: Chrome 15+ + jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" + }, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || (related !== target && !jQuery.contains( target, related )) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; + }); + + // Support: Firefox, Chrome, Safari + // Create "bubbling" focus and blur events + if ( !support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = data_priv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + data_priv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = data_priv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + data_priv.remove( doc, fix ); + + } else { + data_priv.access( doc, fix, attaches ); + } + } + }; + }); + } + + jQuery.fn.extend({ + + on: function( types, selector, data, fn, /*INTERNAL*/ one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + this.on( type, selector, data, types[ type ], one ); + } + return this; + } + + if ( data == null && fn == null ) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return this; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return this.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + }); + }, + one: function( types, selector, data, fn ) { + return this.on( types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each(function() { + jQuery.event.remove( this, types, fn, selector ); + }); + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + triggerHandler: function( type, data ) { + var elem = this[0]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } + }); + + + var + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, + rtagName = /<([\w:]+)/, + rhtml = /<|&#?\w+;/, + rnoInnerhtml = /<(?:script|style|link)/i, + // checked="checked" or checked + rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, + rscriptType = /^$|\/(?:java|ecma)script/i, + rscriptTypeMasked = /^true\/(.*)/, + rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g, + + // We have to close these tags to support XHTML (#13200) + wrapMap = { + + // Support: IE9 + option: [ 1, "<select multiple='multiple'>", "</select>" ], + + thead: [ 1, "<table>", "</table>" ], + col: [ 2, "<table><colgroup>", "</colgroup></table>" ], + tr: [ 2, "<table><tbody>", "</tbody></table>" ], + td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ], + + _default: [ 0, "", "" ] + }; + + // Support: IE9 + wrapMap.optgroup = wrapMap.option; + + wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; + wrapMap.th = wrapMap.td; + + // Support: 1.x compatibility + // Manipulating tables requires a tbody + function manipulationTarget( elem, content ) { + return jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? + + elem.getElementsByTagName("tbody")[0] || + elem.appendChild( elem.ownerDocument.createElement("tbody") ) : + elem; + } + + // Replace/restore the type attribute of script elements for safe DOM manipulation + function disableScript( elem ) { + elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type; + return elem; + } + function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + + if ( match ) { + elem.type = match[ 1 ]; + } else { + elem.removeAttribute("type"); + } + + return elem; + } + + // Mark scripts as having already been evaluated + function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + data_priv.set( + elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" ) + ); + } + } + + function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( data_priv.hasData( src ) ) { + pdataOld = data_priv.access( src ); + pdataCur = data_priv.set( dest, pdataOld ); + events = pdataOld.events; + + if ( events ) { + delete pdataCur.handle; + pdataCur.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( data_user.hasData( src ) ) { + udataOld = data_user.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + data_user.set( dest, udataCur ); + } + } + + function getAll( context, tag ) { + var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) : + context.querySelectorAll ? context.querySelectorAll( tag || "*" ) : + []; + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], ret ) : + ret; + } + + // Fix IE bugs, see support tests + function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } + } + + jQuery.extend({ + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = jQuery.contains( elem.ownerDocument, elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + buildFragment: function( elems, context, scripts, selection ) { + var elem, tmp, tag, wrap, contains, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + // Support: QtWebKit, PhantomJS + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement("div") ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: QtWebKit, PhantomJS + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( (elem = nodes[ i++ ]) ) { + + // #4087 - If origin and destination elements are the same, and this is + // that element, do not do anything + if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( (elem = tmp[ j++ ]) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; + }, + + cleanData: function( elems ) { + var data, elem, type, key, + special = jQuery.event.special, + i = 0; + + for ( ; (elem = elems[ i ]) !== undefined; i++ ) { + if ( jQuery.acceptData( elem ) ) { + key = elem[ data_priv.expando ]; + + if ( key && (data = data_priv.cache[ key ]) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + if ( data_priv.cache[ key ] ) { + // Discard any remaining `private` data + delete data_priv.cache[ key ]; + } + } + } + // Discard any remaining `user` data + delete data_user.cache[ elem[ data_user.expando ] ]; + } + } + }); + + jQuery.fn.extend({ + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each(function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + }); + }, null, value, arguments.length ); + }, + + append: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + }); + }, + + prepend: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + }); + }, + + before: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + }); + }, + + after: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + }); + }, + + remove: function( selector, keepData /* Internal Use Only */ ) { + var elem, + elems = selector ? jQuery.filter( selector, this ) : this, + i = 0; + + for ( ; (elem = elems[i]) != null; i++ ) { + if ( !keepData && elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem ) ); + } + + if ( elem.parentNode ) { + if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { + setGlobalEval( getAll( elem, "script" ) ); + } + elem.parentNode.removeChild( elem ); + } + } + + return this; + }, + + empty: function() { + var elem, + i = 0; + + for ( ; (elem = this[i]) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map(function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + }); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = value.replace( rxhtmlTag, "<$1></$2>" ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var arg = arguments[ 0 ]; + + // Make the changes, replacing each context element with the new content + this.domManip( arguments, function( elem ) { + arg = this.parentNode; + + jQuery.cleanData( getAll( this ) ); + + if ( arg ) { + arg.replaceChild( elem, this ); + } + }); + + // Force removal if there was no new content (e.g., from empty arguments) + return arg && (arg.length || arg.nodeType) ? this : this.remove(); + }, + + detach: function( selector ) { + return this.remove( selector, true ); + }, + + domManip: function( args, callback ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = this.length, + set = this, + iNoClone = l - 1, + value = args[ 0 ], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return this.each(function( index ) { + var self = set.eq( index ); + if ( isFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + self.domManip( args, callback ); + }); + } + + if ( l ) { + fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + if ( first ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + // Support: QtWebKit + // jQuery.merge because push.apply(_, arraylike) throws + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( this[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) { + + if ( node.src ) { + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) ); + } + } + } + } + } + } + + return this; + } + }); + + jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" + }, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: QtWebKit + // .get() because push.apply(_, arraylike) throws + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; + }); + + + var iframe, + elemdisplay = {}; + + /** + * Retrieve the actual display of a element + * @param {String} name nodeName of the element + * @param {Object} doc Document object + */ + // Called only from within defaultDisplay + function actualDisplay( name, doc ) { + var style, + elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), + + // getDefaultComputedStyle might be reliably used only on attached element + display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ? + + // Use of this method is a temporary fix (more like optimization) until something better comes along, + // since it was removed from specification and supported only in FF + style.display : jQuery.css( elem[ 0 ], "display" ); + + // We don't have any data stored on the element, + // so use "detach" method as fast way to get rid of the element + elem.detach(); + + return display; + } + + /** + * Try to determine the default display value of an element + * @param {String} nodeName + */ + function defaultDisplay( nodeName ) { + var doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + display = actualDisplay( nodeName, doc ); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + + // Use the already-created iframe if possible + iframe = (iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" )).appendTo( doc.documentElement ); + + // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse + doc = iframe[ 0 ].contentDocument; + + // Support: IE + doc.write(); + doc.close(); + + display = actualDisplay( nodeName, doc ); + iframe.detach(); + } + + // Store the correct default display + elemdisplay[ nodeName ] = display; + } + + return display; + } + var rmargin = (/^margin/); + + var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + + var getStyles = function( elem ) { + // Support: IE<=11+, Firefox<=30+ (#15098, #14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + if ( elem.ownerDocument.defaultView.opener ) { + return elem.ownerDocument.defaultView.getComputedStyle( elem, null ); + } + + return window.getComputedStyle( elem, null ); + }; + + + + function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + style = elem.style; + + computed = computed || getStyles( elem ); + + // Support: IE9 + // getPropertyValue is only needed for .css('filter') (#12537) + if ( computed ) { + ret = computed.getPropertyValue( name ) || computed[ name ]; + } + + if ( computed ) { + + if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { + ret = jQuery.style( elem, name ); + } + + // Support: iOS < 6 + // A tribute to the "awesome hack by Dean Edwards" + // iOS < 6 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels + // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values + if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret !== undefined ? + // Support: IE + // IE returns zIndex value as an integer. + ret + "" : + ret; + } + + + function addGetHookIf( conditionFn, hookFn ) { + // Define the hook, we'll check on the first run if it's really needed. + return { + get: function() { + if ( conditionFn() ) { + // Hook not needed (or it's not possible to use it due + // to missing dependency), remove it. + delete this.get; + return; + } + + // Hook needed; redefine it so that the support test is not executed again. + return (this.get = hookFn).apply( this, arguments ); + } + }; + } + + + (function() { + var pixelPositionVal, boxSizingReliableVal, + docElem = document.documentElement, + container = document.createElement( "div" ), + div = document.createElement( "div" ); + + if ( !div.style ) { + return; + } + + // Support: IE9-11+ + // Style of cloned element affects source element cloned (#8908) + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + container.style.cssText = "border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;" + + "position:absolute"; + container.appendChild( div ); + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computePixelPositionAndBoxSizingReliable() { + div.style.cssText = + // Support: Firefox<29, Android 2.3 + // Vendor-prefix box-sizing + "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;" + + "box-sizing:border-box;display:block;margin-top:1%;top:1%;" + + "border:1px;padding:1px;width:4px;position:absolute"; + div.innerHTML = ""; + docElem.appendChild( container ); + + var divStyle = window.getComputedStyle( div, null ); + pixelPositionVal = divStyle.top !== "1%"; + boxSizingReliableVal = divStyle.width === "4px"; + + docElem.removeChild( container ); + } + + // Support: node.js jsdom + // Don't assume that getComputedStyle is a property of the global object + if ( window.getComputedStyle ) { + jQuery.extend( support, { + pixelPosition: function() { + + // This test is executed only once but we still do memoizing + // since we can use the boxSizingReliable pre-computing. + // No need to check if the test was already performed, though. + computePixelPositionAndBoxSizingReliable(); + return pixelPositionVal; + }, + boxSizingReliable: function() { + if ( boxSizingReliableVal == null ) { + computePixelPositionAndBoxSizingReliable(); + } + return boxSizingReliableVal; + }, + reliableMarginRight: function() { + + // Support: Android 2.3 + // Check if div with explicit width and no margin-right incorrectly + // gets computed margin-right based on width of container. (#3333) + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + // This support function is only executed once so no memoizing is needed. + var ret, + marginDiv = div.appendChild( document.createElement( "div" ) ); + + // Reset CSS: box-sizing; display; margin; border; padding + marginDiv.style.cssText = div.style.cssText = + // Support: Firefox<29, Android 2.3 + // Vendor-prefix box-sizing + "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" + + "box-sizing:content-box;display:block;margin:0;border:0;padding:0"; + marginDiv.style.marginRight = marginDiv.style.width = "0"; + div.style.width = "1px"; + docElem.appendChild( container ); + + ret = !parseFloat( window.getComputedStyle( marginDiv, null ).marginRight ); + + docElem.removeChild( container ); + div.removeChild( marginDiv ); + + return ret; + } + }); + } + })(); + + + // A method for quickly swapping in/out CSS properties to get correct calculations. + jQuery.swap = function( elem, options, callback, args ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.apply( elem, args || [] ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; + }; + + + var + // Swappable if display is none or starts with table except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ), + rrelNum = new RegExp( "^([+-])=(" + pnum + ")", "i" ), + + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }, + + cssPrefixes = [ "Webkit", "O", "Moz", "ms" ]; + + // Return a css property mapped to a potentially vendor prefixed property + function vendorPropName( style, name ) { + + // Shortcut for names that are not vendor prefixed + if ( name in style ) { + return name; + } + + // Check for vendor prefixed names + var capName = name[0].toUpperCase() + name.slice(1), + origName = name, + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in style ) { + return name; + } + } + + return origName; + } + + function setPositiveNumber( elem, value, subtract ) { + var matches = rnumsplit.exec( value ); + return matches ? + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) : + value; + } + + function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { + var i = extra === ( isBorderBox ? "border" : "content" ) ? + // If we already have the right measurement, avoid augmentation + 4 : + // Otherwise initialize for horizontal or vertical properties + name === "width" ? 1 : 0, + + val = 0; + + for ( ; i < 4; i += 2 ) { + // Both box models exclude margin, so add it if we want it + if ( extra === "margin" ) { + val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); + } + + if ( isBorderBox ) { + // border-box includes padding, so remove it if we want content + if ( extra === "content" ) { + val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // At this point, extra isn't border nor margin, so remove border + if ( extra !== "margin" ) { + val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } else { + // At this point, extra isn't content, so add padding + val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // At this point, extra isn't content nor padding, so add border + if ( extra !== "padding" ) { + val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + return val; + } + + function getWidthOrHeight( elem, name, extra ) { + + // Start with offset property, which is equivalent to the border-box value + var valueIsBorderBox = true, + val = name === "width" ? elem.offsetWidth : elem.offsetHeight, + styles = getStyles( elem ), + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Some non-html elements return undefined for offsetWidth, so check for null/undefined + // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285 + // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668 + if ( val <= 0 || val == null ) { + // Fall back to computed then uncomputed css if necessary + val = curCSS( elem, name, styles ); + if ( val < 0 || val == null ) { + val = elem.style[ name ]; + } + + // Computed unit is not pixels. Stop here and return. + if ( rnumnonpx.test(val) ) { + return val; + } + + // Check for style in case a browser which returns unreliable values + // for getComputedStyle silently falls back to the reliable elem.style + valueIsBorderBox = isBorderBox && + ( support.boxSizingReliable() || val === elem.style[ name ] ); + + // Normalize "", auto, and prepare for extra + val = parseFloat( val ) || 0; + } + + // Use the active box-sizing model to add/subtract irrelevant styles + return ( val + + augmentWidthOrHeight( + elem, + name, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles + ) + ) + "px"; + } + + function showHide( elements, show ) { + var display, elem, hidden, + values = [], + index = 0, + length = elements.length; + + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + values[ index ] = data_priv.get( elem, "olddisplay" ); + display = elem.style.display; + if ( show ) { + // Reset the inline display of this element to learn if it is + // being hidden by cascaded rules or not + if ( !values[ index ] && display === "none" ) { + elem.style.display = ""; + } + + // Set elements which have been overridden with display: none + // in a stylesheet to whatever the default browser style is + // for such an element + if ( elem.style.display === "" && isHidden( elem ) ) { + values[ index ] = data_priv.access( elem, "olddisplay", defaultDisplay(elem.nodeName) ); + } + } else { + hidden = isHidden( elem ); + + if ( display !== "none" || !hidden ) { + data_priv.set( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) ); + } + } + } + + // Set the display of most of the elements in a second loop + // to avoid the constant reflow + for ( index = 0; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + if ( !show || elem.style.display === "none" || elem.style.display === "" ) { + elem.style.display = show ? values[ index ] || "" : "none"; + } + } + + return elements; + } + + jQuery.extend({ + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "columnCount": true, + "fillOpacity": true, + "flexGrow": true, + "flexShrink": true, + "fontWeight": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: { + "float": "cssFloat" + }, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = jQuery.camelCase( name ), + style = elem.style; + + name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) ); + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (#7345) + if ( type === "string" && (ret = rrelNum.exec( value )) ) { + value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) ); + // Fixes bug #9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (#7116) + if ( value == null || value !== value ) { + return; + } + + // If a number, add 'px' to the (except for certain CSS properties) + if ( type === "number" && !jQuery.cssNumber[ origName ] ) { + value += "px"; + } + + // Support: IE9-11+ + // background-* props affect original clone's values + if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) { + style[ name ] = value; + } + + } else { + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) { + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = jQuery.camelCase( name ); + + // Make sure that we're working with the right name + name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) ); + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || jQuery.isNumeric( num ) ? num || 0 : val; + } + return val; + } + }); + + jQuery.each([ "height", "width" ], function( i, name ) { + jQuery.cssHooks[ name ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test( jQuery.css( elem, "display" ) ) && elem.offsetWidth === 0 ? + jQuery.swap( elem, cssShow, function() { + return getWidthOrHeight( elem, name, extra ); + }) : + getWidthOrHeight( elem, name, extra ); + } + }, + + set: function( elem, value, extra ) { + var styles = extra && getStyles( elem ); + return setPositiveNumber( elem, value, extra ? + augmentWidthOrHeight( + elem, + name, + extra, + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + styles + ) : 0 + ); + } + }; + }); + + // Support: Android 2.3 + jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight, + function( elem, computed ) { + if ( computed ) { + return jQuery.swap( elem, { "display": "inline-block" }, + curCSS, [ elem, "marginRight" ] ); + } + } + ); + + // These hooks are used by animate to expand properties + jQuery.each({ + margin: "", + padding: "", + border: "Width" + }, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split(" ") : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( !rmargin.test( prefix ) ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } + }); + + jQuery.fn.extend({ + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( jQuery.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + }, + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each(function() { + if ( isHidden( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + }); + } + }); + + + function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); + } + jQuery.Tween = Tween; + + Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || "swing"; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } + }; + + Tween.prototype.init.prototype = Tween.prototype; + + Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + if ( tween.elem[ tween.prop ] != null && + (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) { + return tween.elem[ tween.prop ]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css( tween.elem, tween.prop, "" ); + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } + }; + + // Support: IE9 + // Panic based approach to setting things on disconnected nodes + Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } + }; + + jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p * Math.PI ) / 2; + } + }; + + jQuery.fx = Tween.prototype.init; + + // Back Compat <1.8 extension point + jQuery.fx.step = {}; + + + + + var + fxNow, timerId, + rfxtypes = /^(?:toggle|show|hide)$/, + rfxnum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ), + rrun = /queueHooks$/, + animationPrefilters = [ defaultPrefilter ], + tweeners = { + "*": [ function( prop, value ) { + var tween = this.createTween( prop, value ), + target = tween.cur(), + parts = rfxnum.exec( value ), + unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) && + rfxnum.exec( jQuery.css( tween.elem, prop ) ), + scale = 1, + maxIterations = 20; + + if ( start && start[ 3 ] !== unit ) { + // Trust units reported by jQuery.css + unit = unit || start[ 3 ]; + + // Make sure we update the tween properties later on + parts = parts || []; + + // Iteratively approximate from a nonzero starting point + start = +target || 1; + + do { + // If previous iteration zeroed out, double until we get *something*. + // Use string for doubling so we don't accidentally see scale as unchanged below + scale = scale || ".5"; + + // Adjust and apply + start = start / scale; + jQuery.style( tween.elem, prop, start + unit ); + + // Update scale, tolerating zero or NaN from tween.cur(), + // break the loop if scale is unchanged or perfect, or if we've just had enough + } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations ); + } + + // Update tween properties + if ( parts ) { + start = tween.start = +start || +target || 0; + tween.unit = unit; + // If a +=/-= token was provided, we're doing a relative animation + tween.end = parts[ 1 ] ? + start + ( parts[ 1 ] + 1 ) * parts[ 2 ] : + +parts[ 2 ]; + } + + return tween; + } ] + }; + + // Animations created synchronously will run synchronously + function createFxNow() { + setTimeout(function() { + fxNow = undefined; + }); + return ( fxNow = jQuery.now() ); + } + + // Generate parameters to create a standard animation + function genFx( type, includeWidth ) { + var which, + i = 0, + attrs = { height: type }; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for ( ; i < 4 ; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; + } + + function createTween( value, prop, animation ) { + var tween, + collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( (tween = collection[ index ].call( animation, prop, value )) ) { + + // We're done with this property + return tween; + } + } + } + + function defaultPrefilter( elem, props, opts ) { + /* jshint validthis: true */ + var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHidden( elem ), + dataShow = data_priv.get( elem, "fxshow" ); + + // Handle queue: false promises + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always(function() { + // Ensure the complete handler is called before this completes + anim.always(function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + }); + }); + } + + // Height/width overflow pass + if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) { + // Make sure that nothing sneaks out + // Record all 3 overflow attributes because IE9-10 do not + // change the overflow attribute when overflowX and + // overflowY are set to the same value + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Set display property to inline-block for height/width + // animations on inline elements that are having width/height animated + display = jQuery.css( elem, "display" ); + + // Test default display if display is currently "none" + checkDisplay = display === "none" ? + data_priv.get( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display; + + if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) { + style.display = "inline-block"; + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + anim.always(function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + }); + } + + // show/hide pass + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.exec( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + + // Any non-fx value stops us from restoring the original display value + } else { + display = undefined; + } + } + + if ( !jQuery.isEmptyObject( orig ) ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = data_priv.access( elem, "fxshow", {} ); + } + + // Store state if its toggle - enables .stop().toggle() to "reverse" + if ( toggle ) { + dataShow.hidden = !hidden; + } + if ( hidden ) { + jQuery( elem ).show(); + } else { + anim.done(function() { + jQuery( elem ).hide(); + }); + } + anim.done(function() { + var prop; + + data_priv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + }); + for ( prop in orig ) { + tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = tween.start; + if ( hidden ) { + tween.end = tween.start; + tween.start = prop === "width" || prop === "height" ? 1 : 0; + } + } + } + + // If this is a noop like .hide().hide(), restore an overwritten display value + } else if ( (display === "none" ? defaultDisplay( elem.nodeName ) : display) === "inline" ) { + style.display = display; + } + } + + function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = jQuery.camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( jQuery.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } + } + + function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = animationPrefilters.length, + deferred = jQuery.Deferred().always( function() { + // Don't match elem in the :animated selector + delete tick.elem; + }), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + // Support: Android 2.3 + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length ; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ]); + + if ( percent < 1 && length ) { + return remaining; + } else { + deferred.resolveWith( elem, [ animation ] ); + return false; + } + }, + animation = deferred.promise({ + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { specialEasing: {} }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length ; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // Resolve when we played the last frame; otherwise, reject + if ( gotoEnd ) { + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + }), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length ; index++ ) { + result = animationPrefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( jQuery.isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + }) + ); + + // attach callbacks from options + return animation.progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); + } + + jQuery.Animation = jQuery.extend( Animation, { + + tweener: function( props, callback ) { + if ( jQuery.isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.split(" "); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length ; index++ ) { + prop = props[ index ]; + tweeners[ prop ] = tweeners[ prop ] || []; + tweeners[ prop ].unshift( callback ); + } + }, + + prefilter: function( callback, prepend ) { + if ( prepend ) { + animationPrefilters.unshift( callback ); + } else { + animationPrefilters.push( callback ); + } + } + }); + + jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + jQuery.isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing + }; + + opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration : + opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default; + + // Normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( jQuery.isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; + }; + + jQuery.fn.extend({ + fadeTo: function( speed, to, easing, callback ) { + + // Show any hidden elements after setting opacity to 0 + return this.filter( isHidden ).css( "opacity", 0 ).show() + + // Animate to the value specified + .end().animate({ opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || data_priv.get( this, "finish" ) ) { + anim.stop( true ); + } + }; + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue && type !== false ) { + this.queue( type || "fx", [] ); + } + + return this.each(function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = data_priv.get( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) { + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + }); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each(function() { + var index, + data = data_priv.get( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // Look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // Look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // Turn off finishing flag + delete data.finish; + }); + } + }); + + jQuery.each([ "toggle", "show", "hide" ], function( i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; + }); + + // Generate shortcuts for custom animations + jQuery.each({ + slideDown: genFx("show"), + slideUp: genFx("hide"), + slideToggle: genFx("toggle"), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } + }, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; + }); + + jQuery.timers = []; + jQuery.fx.tick = function() { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = jQuery.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + // Checks the timer has not already been removed + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; + }; + + jQuery.fx.timer = function( timer ) { + jQuery.timers.push( timer ); + if ( timer() ) { + jQuery.fx.start(); + } else { + jQuery.timers.pop(); + } + }; + + jQuery.fx.interval = 13; + + jQuery.fx.start = function() { + if ( !timerId ) { + timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval ); + } + }; + + jQuery.fx.stop = function() { + clearInterval( timerId ); + timerId = null; + }; + + jQuery.fx.speeds = { + slow: 600, + fast: 200, + // Default speed + _default: 400 + }; + + + // Based off of the plugin by Clint Helfers, with permission. + // http://blindsignals.com/index.php/2009/07/jquery-delay/ + jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = setTimeout( next, time ); + hooks.stop = function() { + clearTimeout( timeout ); + }; + }); + }; + + + (function() { + var input = document.createElement( "input" ), + select = document.createElement( "select" ), + opt = select.appendChild( document.createElement( "option" ) ); + + input.type = "checkbox"; + + // Support: iOS<=5.1, Android<=4.2+ + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE<=11+ + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: Android<=2.3 + // Options inside disabled selects are incorrectly marked as disabled + select.disabled = true; + support.optDisabled = !opt.disabled; + + // Support: IE<=11+ + // An input loses its value after becoming a radio + input = document.createElement( "input" ); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; + })(); + + + var nodeHook, boolHook, + attrHandle = jQuery.expr.attrHandle; + + jQuery.fn.extend({ + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each(function() { + jQuery.removeAttr( this, name ); + }); + } + }); + + jQuery.extend({ + attr: function( elem, name, value ) { + var hooks, ret, + nType = elem.nodeType; + + // don't get/set attributes on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === strundefined ) { + return jQuery.prop( elem, name, value ); + } + + // All attributes are lowercase + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + name = name.toLowerCase(); + hooks = jQuery.attrHooks[ name ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook ); + } + + if ( value !== undefined ) { + + if ( value === null ) { + jQuery.removeAttr( elem, name ); + + } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + elem.setAttribute( name, value + "" ); + return value; + } + + } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? + undefined : + ret; + } + }, + + removeAttr: function( elem, value ) { + var name, propName, + i = 0, + attrNames = value && value.match( rnotwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( (name = attrNames[i++]) ) { + propName = jQuery.propFix[ name ] || name; + + // Boolean attributes get special treatment (#10870) + if ( jQuery.expr.match.bool.test( name ) ) { + // Set corresponding property to false + elem[ propName ] = false; + } + + elem.removeAttribute( name ); + } + } + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !support.radioValue && value === "radio" && + jQuery.nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + } + }); + + // Hooks for boolean attributes + boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + elem.setAttribute( name, name ); + } + return name; + } + }; + jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle; + if ( !isXML ) { + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ name ]; + attrHandle[ name ] = ret; + ret = getter( elem, name, isXML ) != null ? + name.toLowerCase() : + null; + attrHandle[ name ] = handle; + } + return ret; + }; + }); + + + + + var rfocusable = /^(?:input|select|textarea|button)$/i; + + jQuery.fn.extend({ + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each(function() { + delete this[ jQuery.propFix[ name ] || name ]; + }); + } + }); + + jQuery.extend({ + propFix: { + "for": "htmlFor", + "class": "className" + }, + + prop: function( elem, name, value ) { + var ret, hooks, notxml, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + if ( notxml ) { + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ? + ret : + ( elem[ name ] = value ); + + } else { + return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ? + ret : + elem[ name ]; + } + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + return elem.hasAttribute( "tabindex" ) || rfocusable.test( elem.nodeName ) || elem.href ? + elem.tabIndex : + -1; + } + } + } + }); + + if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + } + }; + } + + jQuery.each([ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" + ], function() { + jQuery.propFix[ this.toLowerCase() ] = this; + }); + + + + + var rclass = /[\t\r\n\f]/g; + + jQuery.fn.extend({ + addClass: function( value ) { + var classes, elem, cur, clazz, j, finalValue, + proceed = typeof value === "string" && value, + i = 0, + len = this.length; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).addClass( value.call( this, j, this.className ) ); + }); + } + + if ( proceed ) { + // The disjunction here is for better compressibility (see removeClass) + classes = ( value || "" ).match( rnotwhite ) || []; + + for ( ; i < len; i++ ) { + elem = this[ i ]; + cur = elem.nodeType === 1 && ( elem.className ? + ( " " + elem.className + " " ).replace( rclass, " " ) : + " " + ); + + if ( cur ) { + j = 0; + while ( (clazz = classes[j++]) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + + // only assign if different to avoid unneeded rendering. + finalValue = jQuery.trim( cur ); + if ( elem.className !== finalValue ) { + elem.className = finalValue; + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, clazz, j, finalValue, + proceed = arguments.length === 0 || typeof value === "string" && value, + i = 0, + len = this.length; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).removeClass( value.call( this, j, this.className ) ); + }); + } + if ( proceed ) { + classes = ( value || "" ).match( rnotwhite ) || []; + + for ( ; i < len; i++ ) { + elem = this[ i ]; + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( elem.className ? + ( " " + elem.className + " " ).replace( rclass, " " ) : + "" + ); + + if ( cur ) { + j = 0; + while ( (clazz = classes[j++]) ) { + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) >= 0 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = value ? jQuery.trim( cur ) : ""; + if ( elem.className !== finalValue ) { + elem.className = finalValue; + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value; + + if ( typeof stateVal === "boolean" && type === "string" ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( jQuery.isFunction( value ) ) { + return this.each(function( i ) { + jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); + }); + } + + return this.each(function() { + if ( type === "string" ) { + // Toggle individual class names + var className, + i = 0, + self = jQuery( this ), + classNames = value.match( rnotwhite ) || []; + + while ( (className = classNames[ i++ ]) ) { + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( type === strundefined || type === "boolean" ) { + if ( this.className ) { + // store className if set + data_priv.set( this, "__className__", this.className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + this.className = this.className || value === false ? "" : data_priv.get( this, "__className__" ) || ""; + } + }); + }, + + hasClass: function( selector ) { + var className = " " + selector + " ", + i = 0, + l = this.length; + for ( ; i < l; i++ ) { + if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) { + return true; + } + } + + return false; + } + }); + + + + + var rreturn = /\r/g; + + jQuery.fn.extend({ + val: function( value ) { + var hooks, ret, isFunction, + elem = this[0]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { + return ret; + } + + ret = elem.value; + + return typeof ret === "string" ? + // Handle most common string cases + ret.replace(rreturn, "") : + // Handle cases where value is null/undef or number + ret == null ? "" : ret; + } + + return; + } + + isFunction = jQuery.isFunction( value ); + + return this.each(function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( jQuery.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + }); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + }); + } + }); + + jQuery.extend({ + valHooks: { + option: { + get: function( elem ) { + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + // Support: IE10-11+ + // option.text throws exceptions (#14686, #14858) + jQuery.trim( jQuery.text( elem ) ); + } + }, + select: { + get: function( elem ) { + var value, option, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one" || index < 0, + values = one ? null : [], + max = one ? index + 1 : options.length, + i = index < 0 ? + max : + one ? index : 0; + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // IE6-9 doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + // Don't return options that are disabled or in a disabled optgroup + ( support.optDisabled ? !option.disabled : option.getAttribute( "disabled" ) === null ) && + ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + if ( (option.selected = jQuery.inArray( option.value, values ) >= 0) ) { + optionSet = true; + } + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } + }); + + // Radios and checkboxes getter/setter + jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( jQuery.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); + } + } + }; + if ( !support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + return elem.getAttribute("value") === null ? "on" : elem.value; + }; + } + }); + + + + + // Return jQuery for attributes-only inclusion + + + jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + return arguments.length > 0 ? + this.on( name, null, data, fn ) : + this.trigger( name ); + }; + }); + + jQuery.fn.extend({ + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + }, + + bind: function( types, data, fn ) { + return this.on( types, null, data, fn ); + }, + unbind: function( types, fn ) { + return this.off( types, null, fn ); + }, + + delegate: function( selector, types, data, fn ) { + return this.on( types, selector, data, fn ); + }, + undelegate: function( selector, types, fn ) { + // ( namespace ) or ( selector, types [, fn] ) + return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn ); + } + }); + + + var nonce = jQuery.now(); + + var rquery = (/\?/); + + + + // Support: Android 2.3 + // Workaround failure to string-cast null input + jQuery.parseJSON = function( data ) { + return JSON.parse( data + "" ); + }; + + + // Cross-browser xml parsing + jQuery.parseXML = function( data ) { + var xml, tmp; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE9 + try { + tmp = new DOMParser(); + xml = tmp.parseFromString( data, "text/xml" ); + } catch ( e ) { + xml = undefined; + } + + if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; + }; + + + var + rhash = /#.*$/, + rts = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Document location + ajaxLocation = window.location.href, + + // Segment location into parts + ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || []; + + // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport + function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || []; + + if ( jQuery.isFunction( func ) ) { + // For each dataType in the dataTypeExpression + while ( (dataType = dataTypes[i++]) ) { + // Prepend if requested + if ( dataType[0] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + (structure[ dataType ] = structure[ dataType ] || []).unshift( func ); + + // Otherwise append + } else { + (structure[ dataType ] = structure[ dataType ] || []).push( func ); + } + } + } + }; + } + + // Base inspection function for prefilters and transports + function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + }); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); + } + + // A special extend for ajax options + // that takes "flat" options (not to be deep extended) + // Fixes #9887 + function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; + } + + /* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ + function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader("Content-Type"); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } + } + + /* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ + function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s[ "throws" ] ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current }; + } + } + } + } + } + } + + return { state: "success", data: response }; + } + + jQuery.extend({ + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: ajaxLocation, + type: "GET", + isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /xml/, + html: /html/, + json: /json/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": jQuery.parseJSON, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + // URL without anti-cache param + cacheURL, + // Response headers + responseHeadersString, + responseHeaders, + // timeout handle + timeoutTimer, + // Cross-domain detection vars + parts, + // To know if global events are to be dispatched + fireGlobals, + // Loop variable + i, + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + // Callbacks context + callbackContext = s.context || s, + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks("once memory"), + // Status-dependent callbacks + statusCode = s.statusCode || {}, + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + // The jqXHR state + state = 0, + // Default abort message + strAbort = "canceled", + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( state === 2 ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( (match = rheaders.exec( responseHeadersString )) ) { + responseHeaders[ match[1].toLowerCase() ] = match[ 2 ]; + } + } + match = responseHeaders[ key.toLowerCase() ]; + } + return match == null ? null : match; + }, + + // Raw string + getAllResponseHeaders: function() { + return state === 2 ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + var lname = name.toLowerCase(); + if ( !state ) { + name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( !state ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( state < 2 ) { + for ( code in map ) { + // Lazy-add the new callback in a way that preserves old ones + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } else { + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ).complete = completeDeferred.add; + jqXHR.success = jqXHR.done; + jqXHR.error = jqXHR.fail; + + // Remove hash character (#7531: and string promotion) + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (#10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" ) + .replace( rprotocol, ajaxLocParts[ 1 ] + "//" ); + + // Alias method option to type as per ticket #12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ]; + + // A cross-domain request is in order when we have a protocol:host:port mismatch + if ( s.crossDomain == null ) { + parts = rurl.exec( s.url.toLowerCase() ); + s.crossDomain = !!( parts && + ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] || + ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !== + ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) ) + ); + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( state === 2 ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger("ajaxStart"); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + cacheURL = s.url; + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // If data is available, append data to url + if ( s.data ) { + cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data ); + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add anti-cache in url if needed + if ( s.cache === false ) { + s.url = rts.test( cacheURL ) ? + + // If there is already a '_' parameter, set its value + cacheURL.replace( rts, "$1_=" + nonce++ ) : + + // Otherwise add one to the end + cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++; + } + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ? + s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) { + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + for ( i in { success: 1, error: 1, complete: 1 } ) { + jqXHR[ i ]( s[ i ] ); + } + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = setTimeout(function() { + jqXHR.abort("timeout"); + }, s.timeout ); + } + + try { + state = 1; + transport.send( requestHeaders, done ); + } catch ( e ) { + // Propagate exception as error if not done + if ( state < 2 ) { + done( -1, e ); + // Simply rethrow otherwise + } else { + throw e; + } + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Called once + if ( state === 2 ) { + return; + } + + // State is "done" now + state = 2; + + // Clear timeout if it exists + if ( timeoutTimer ) { + clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader("Last-Modified"); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader("etag"); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + // Extract error from statusText and normalize for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger("ajaxStop"); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } + }); + + jQuery.each( [ "get", "post" ], function( i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + // Shift arguments if data argument was omitted + if ( jQuery.isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + return jQuery.ajax({ + url: url, + type: method, + dataType: type, + data: data, + success: callback + }); + }; + }); + + + jQuery._evalUrl = function( url ) { + return jQuery.ajax({ + url: url, + type: "GET", + dataType: "script", + async: false, + global: false, + "throws": true + }); + }; + + + jQuery.fn.extend({ + wrapAll: function( html ) { + var wrap; + + if ( jQuery.isFunction( html ) ) { + return this.each(function( i ) { + jQuery( this ).wrapAll( html.call(this, i) ); + }); + } + + if ( this[ 0 ] ) { + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map(function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + }).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each(function( i ) { + jQuery( this ).wrapInner( html.call(this, i) ); + }); + } + + return this.each(function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + }); + }, + + wrap: function( html ) { + var isFunction = jQuery.isFunction( html ); + + return this.each(function( i ) { + jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html ); + }); + }, + + unwrap: function() { + return this.parent().each(function() { + if ( !jQuery.nodeName( this, "body" ) ) { + jQuery( this ).replaceWith( this.childNodes ); + } + }).end(); + } + }); + + + jQuery.expr.filters.hidden = function( elem ) { + // Support: Opera <= 12.12 + // Opera reports offsetWidths and offsetHeights less than zero on some elements + return elem.offsetWidth <= 0 && elem.offsetHeight <= 0; + }; + jQuery.expr.filters.visible = function( elem ) { + return !jQuery.expr.filters.hidden( elem ); + }; + + + + + var r20 = /%20/g, + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + + function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( jQuery.isArray( obj ) ) { + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + // Item is non-scalar (array or object), encode its numeric index. + buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add ); + } + }); + + } else if ( !traditional && jQuery.type( obj ) === "object" ) { + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + // Serialize scalar item. + add( prefix, obj ); + } + } + + // Serialize an array of form elements or a set of + // key/values into a query string + jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, value ) { + // If value is a function, invoke it and return its value + value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value ); + s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value ); + }; + + // Set traditional to true for jQuery <= 1.3.2 behavior. + if ( traditional === undefined ) { + traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional; + } + + // If an array was passed in, assume that it is an array of form elements. + if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + }); + + } else { + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ).replace( r20, "+" ); + }; + + jQuery.fn.extend({ + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map(function() { + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + }) + .filter(function() { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !rcheckableType.test( type ) ); + }) + .map(function( i, elem ) { + var val = jQuery( this ).val(); + + return val == null ? + null : + jQuery.isArray( val ) ? + jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + }) : + { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + }).get(); + } + }); + + + jQuery.ajaxSettings.xhr = function() { + try { + return new XMLHttpRequest(); + } catch( e ) {} + }; + + var xhrId = 0, + xhrCallbacks = {}, + xhrSuccessStatus = { + // file protocol always yields status code 0, assume 200 + 0: 200, + // Support: IE9 + // #1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + + // Support: IE9 + // Open requests must be manually aborted on unload (#5280) + // See https://support.microsoft.com/kb/2856746 for more info + if ( window.attachEvent ) { + window.attachEvent( "onunload", function() { + for ( var key in xhrCallbacks ) { + xhrCallbacks[ key ](); + } + }); + } + + support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); + support.ajax = xhrSupported = !!xhrSupported; + + jQuery.ajaxTransport(function( options ) { + var callback; + + // Cross domain only allowed if supported through XMLHttpRequest + if ( support.cors || xhrSupported && !options.crossDomain ) { + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(), + id = ++xhrId; + + xhr.open( options.type, options.url, options.async, options.username, options.password ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers["X-Requested-With"] ) { + headers["X-Requested-With"] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + delete xhrCallbacks[ id ]; + callback = xhr.onload = xhr.onerror = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + complete( + // file: protocol always yields status 0; see #8605, #14207 + xhr.status, + xhr.statusText + ); + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + // Support: IE9 + // Accessing binary-data responseText throws an exception + // (#11426) + typeof xhr.responseText === "string" ? { + text: xhr.responseText + } : undefined, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + xhr.onerror = callback("error"); + + // Create the abort callback + callback = xhrCallbacks[ id ] = callback("abort"); + + try { + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + // #14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } + }); + + + + + // Install script dataType + jQuery.ajaxSetup({ + accepts: { + script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /(?:java|ecma)script/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } + }); + + // Handle cache's special case and crossDomain + jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + } + }); + + // Bind script tag hack transport + jQuery.ajaxTransport( "script", function( s ) { + // This transport only deals with cross domain requests + if ( s.crossDomain ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery("<script>").prop({ + async: true, + charset: s.scriptCharset, + src: s.url + }).on( + "load error", + callback = function( evt ) { + script.remove(); + callback = null; + if ( evt ) { + complete( evt.type === "error" ? 404 : 200, evt.type ); + } + } + ); + document.head.appendChild( script[ 0 ] ); + }, + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } + }); + + + + + var oldCallbacks = [], + rjsonp = /(=)\?(?=&|$)|\?\?/; + + // Default jsonp settings + jQuery.ajaxSetup({ + jsonp: "callback", + jsonpCallback: function() { + var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) ); + this[ callback ] = true; + return callback; + } + }); + + // Detect, normalize options and install callbacks for jsonp requests + jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { + + var callbackName, overwritten, responseContainer, + jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ? + "url" : + typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data" + ); + + // Handle iff the expected data type is "jsonp" or we have a parameter to set + if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) { + + // Get callback name, remembering preexisting value associated with it + callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ? + s.jsonpCallback() : + s.jsonpCallback; + + // Insert callback into url or form data + if ( jsonProp ) { + s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName ); + } else if ( s.jsonp !== false ) { + s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName; + } + + // Use data converter to retrieve json after script execution + s.converters["script json"] = function() { + if ( !responseContainer ) { + jQuery.error( callbackName + " was not called" ); + } + return responseContainer[ 0 ]; + }; + + // force json dataType + s.dataTypes[ 0 ] = "json"; + + // Install callback + overwritten = window[ callbackName ]; + window[ callbackName ] = function() { + responseContainer = arguments; + }; + + // Clean-up function (fires after converters) + jqXHR.always(function() { + // Restore preexisting value + window[ callbackName ] = overwritten; + + // Save back as free + if ( s[ callbackName ] ) { + // make sure that re-using the options doesn't screw things around + s.jsonpCallback = originalSettings.jsonpCallback; + + // save the callback name for future use + oldCallbacks.push( callbackName ); + } + + // Call if it was a function and we have a response + if ( responseContainer && jQuery.isFunction( overwritten ) ) { + overwritten( responseContainer[ 0 ] ); + } + + responseContainer = overwritten = undefined; + }); + + // Delegate to script + return "script"; + } + }); + + + + + // data: string of html + // context (optional): If specified, the fragment will be created in this context, defaults to document + // keepScripts (optional): If true, will include scripts passed in the html string + jQuery.parseHTML = function( data, context, keepScripts ) { + if ( !data || typeof data !== "string" ) { + return null; + } + if ( typeof context === "boolean" ) { + keepScripts = context; + context = false; + } + context = context || document; + + var parsed = rsingleTag.exec( data ), + scripts = !keepScripts && []; + + // Single tag + if ( parsed ) { + return [ context.createElement( parsed[1] ) ]; + } + + parsed = jQuery.buildFragment( [ data ], context, scripts ); + + if ( scripts && scripts.length ) { + jQuery( scripts ).remove(); + } + + return jQuery.merge( [], parsed.childNodes ); + }; + + + // Keep a copy of the old load method + var _load = jQuery.fn.load; + + /** + * Load a url into a page + */ + jQuery.fn.load = function( url, params, callback ) { + if ( typeof url !== "string" && _load ) { + return _load.apply( this, arguments ); + } + + var selector, type, response, + self = this, + off = url.indexOf(" "); + + if ( off >= 0 ) { + selector = jQuery.trim( url.slice( off ) ); + url = url.slice( 0, off ); + } + + // If it's a function + if ( jQuery.isFunction( params ) ) { + + // We assume that it's the callback + callback = params; + params = undefined; + + // Otherwise, build a param string + } else if ( params && typeof params === "object" ) { + type = "POST"; + } + + // If we have elements to modify, make the request + if ( self.length > 0 ) { + jQuery.ajax({ + url: url, + + // if "type" variable is undefined, then "GET" method will be used + type: type, + dataType: "html", + data: params + }).done(function( responseText ) { + + // Save response for use in complete callback + response = arguments; + + self.html( selector ? + + // If a selector was specified, locate the right elements in a dummy div + // Exclude scripts to avoid IE 'Permission Denied' errors + jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) : + + // Otherwise use the full result + responseText ); + + }).complete( callback && function( jqXHR, status ) { + self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] ); + }); + } + + return this; + }; + + + + + // Attach a bunch of functions for handling common AJAX events + jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ) { + jQuery.fn[ type ] = function( fn ) { + return this.on( type, fn ); + }; + }); + + + + + jQuery.expr.filters.animated = function( elem ) { + return jQuery.grep(jQuery.timers, function( fn ) { + return elem === fn.elem; + }).length; + }; + + + + + var docElem = window.document.documentElement; + + /** + * Gets a window from an element + */ + function getWindow( elem ) { + return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView; + } + + jQuery.offset = { + setOffset: function( elem, options, i ) { + var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition, + position = jQuery.css( elem, "position" ), + curElem = jQuery( elem ), + props = {}; + + // Set position first, in-case top/left are set even on static elem + if ( position === "static" ) { + elem.style.position = "relative"; + } + + curOffset = curElem.offset(); + curCSSTop = jQuery.css( elem, "top" ); + curCSSLeft = jQuery.css( elem, "left" ); + calculatePosition = ( position === "absolute" || position === "fixed" ) && + ( curCSSTop + curCSSLeft ).indexOf("auto") > -1; + + // Need to be able to calculate position if either + // top or left is auto and position is either absolute or fixed + if ( calculatePosition ) { + curPosition = curElem.position(); + curTop = curPosition.top; + curLeft = curPosition.left; + + } else { + curTop = parseFloat( curCSSTop ) || 0; + curLeft = parseFloat( curCSSLeft ) || 0; + } + + if ( jQuery.isFunction( options ) ) { + options = options.call( elem, i, curOffset ); + } + + if ( options.top != null ) { + props.top = ( options.top - curOffset.top ) + curTop; + } + if ( options.left != null ) { + props.left = ( options.left - curOffset.left ) + curLeft; + } + + if ( "using" in options ) { + options.using.call( elem, props ); + + } else { + curElem.css( props ); + } + } + }; + + jQuery.fn.extend({ + offset: function( options ) { + if ( arguments.length ) { + return options === undefined ? + this : + this.each(function( i ) { + jQuery.offset.setOffset( this, options, i ); + }); + } + + var docElem, win, + elem = this[ 0 ], + box = { top: 0, left: 0 }, + doc = elem && elem.ownerDocument; + + if ( !doc ) { + return; + } + + docElem = doc.documentElement; + + // Make sure it's not a disconnected DOM node + if ( !jQuery.contains( docElem, elem ) ) { + return box; + } + + // Support: BlackBerry 5, iOS 3 (original iPhone) + // If we don't have gBCR, just use 0,0 rather than error + if ( typeof elem.getBoundingClientRect !== strundefined ) { + box = elem.getBoundingClientRect(); + } + win = getWindow( doc ); + return { + top: box.top + win.pageYOffset - docElem.clientTop, + left: box.left + win.pageXOffset - docElem.clientLeft + }; + }, + + position: function() { + if ( !this[ 0 ] ) { + return; + } + + var offsetParent, offset, + elem = this[ 0 ], + parentOffset = { top: 0, left: 0 }; + + // Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent + if ( jQuery.css( elem, "position" ) === "fixed" ) { + // Assume getBoundingClientRect is there when computed position is fixed + offset = elem.getBoundingClientRect(); + + } else { + // Get *real* offsetParent + offsetParent = this.offsetParent(); + + // Get correct offsets + offset = this.offset(); + if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) { + parentOffset = offsetParent.offset(); + } + + // Add offsetParent borders + parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true ); + parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true ); + } + + // Subtract parent offsets and element margins + return { + top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ), + left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true ) + }; + }, + + offsetParent: function() { + return this.map(function() { + var offsetParent = this.offsetParent || docElem; + + while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position" ) === "static" ) ) { + offsetParent = offsetParent.offsetParent; + } + + return offsetParent || docElem; + }); + } + }); + + // Create scrollLeft and scrollTop methods + jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) { + var top = "pageYOffset" === prop; + + jQuery.fn[ method ] = function( val ) { + return access( this, function( elem, method, val ) { + var win = getWindow( elem ); + + if ( val === undefined ) { + return win ? win[ prop ] : elem[ method ]; + } + + if ( win ) { + win.scrollTo( + !top ? val : window.pageXOffset, + top ? val : window.pageYOffset + ); + + } else { + elem[ method ] = val; + } + }, method, val, arguments.length, null ); + }; + }); + + // Support: Safari<7+, Chrome<37+ + // Add the top/left cssHooks using jQuery.fn.position + // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084 + // Blink bug: https://code.google.com/p/chromium/issues/detail?id=229280 + // getComputedStyle returns percent when specified for top/left/bottom/right; + // rather than make the css module depend on the offset module, just check for it here + jQuery.each( [ "top", "left" ], function( i, prop ) { + jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition, + function( elem, computed ) { + if ( computed ) { + computed = curCSS( elem, prop ); + // If curCSS returns percentage, fallback to offset + return rnumnonpx.test( computed ) ? + jQuery( elem ).position()[ prop ] + "px" : + computed; + } + } + ); + }); + + + // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods + jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { + jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) { + // Margin is only for outerHeight, outerWidth + jQuery.fn[ funcName ] = function( margin, value ) { + var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ), + extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" ); + + return access( this, function( elem, type, value ) { + var doc; + + if ( jQuery.isWindow( elem ) ) { + // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there + // isn't a whole lot we can do. See pull request at this URL for discussion: + // https://github.com/jquery/jquery/pull/764 + return elem.document.documentElement[ "client" + name ]; + } + + // Get document width or height + if ( elem.nodeType === 9 ) { + doc = elem.documentElement; + + // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], + // whichever is greatest + return Math.max( + elem.body[ "scroll" + name ], doc[ "scroll" + name ], + elem.body[ "offset" + name ], doc[ "offset" + name ], + doc[ "client" + name ] + ); + } + + return value === undefined ? + // Get width or height on the element, requesting but not forcing parseFloat + jQuery.css( elem, type, extra ) : + + // Set width or height on the element + jQuery.style( elem, type, value, extra ); + }, type, chainable ? margin : undefined, chainable, null ); + }; + }); + }); + + + // The number of elements contained in the matched element set + jQuery.fn.size = function() { + return this.length; + }; + + jQuery.fn.andSelf = jQuery.fn.addBack; + + + + + // Register as a named AMD module, since jQuery can be concatenated with other + // files that may use define, but not via a proper concatenation script that + // understands anonymous AMD modules. A named AMD is safest and most robust + // way to register. Lowercase jquery is used because AMD module names are + // derived from file names, and jQuery is normally delivered in a lowercase + // file name. Do this after creating the global so that if an AMD module wants + // to call noConflict to hide this version of jQuery, it will work. + + // Note that for maximum portability, libraries that are not jQuery should + // declare themselves as anonymous modules, and avoid setting a global if an + // AMD loader is present. jQuery is a special case. For more information, see + // https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon + + if ( true ) { + !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function() { + return jQuery; + }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + } + + + + + var + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$; + + jQuery.noConflict = function( deep ) { + if ( window.$ === jQuery ) { + window.$ = _$; + } + + if ( deep && window.jQuery === jQuery ) { + window.jQuery = _jQuery; + } + + return jQuery; + }; + + // Expose jQuery and $ identifiers, even in AMD + // (#7102#comment:10, https://github.com/jquery/jquery/pull/557) + // and CommonJS for browser emulators (#13566) + if ( typeof noGlobal === strundefined ) { + window.jQuery = window.$ = jQuery; + } + + + + + return jQuery; + + })); + + +/***/ } + +/******/ }); +//# sourceMappingURL=vendors.js.map \ No newline at end of file diff --git a/dist/js/mod/vendors.js.map b/dist/js/mod/vendors.js.map new file mode 100644 index 0000000..e0e89c2 --- /dev/null +++ b/dist/js/mod/vendors.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///webpack/bootstrap 6467d73593f3d2df80b2","webpack:///./~/jquery/dist/jquery.js"],"names":[],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAQ,oBAAoB;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wEAAgE,2BAA2B;AAC3F;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;;;;;;;;;;AC5FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;AACF;AACA;;AAEA;AACA,EAAC;;AAED;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;;;;AAIA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAE;;AAEF;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA,IAAG;AACH,GAAE;;AAEF;AACA;AACA,GAAE;;AAEF;AACA;AACA,GAAE;;AAEF;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,8BAA6B;AAC7B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,SAAQ,YAAY;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,OAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAE;;AAEF,qBAAoB;;AAEpB;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,4CAA2C;AAC3C;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF,iCAAgC;AAChC;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAW,YAAY;AACvB;;AAEA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAG;AACH;AACA,YAAW,YAAY;AACvB;;AAEA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;;AAEA;AACA,GAAE;;AAEF;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;;AAEA,UAAS,SAAS;AAClB;AACA;;AAEA;;AAEA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS,YAAY;AACrB;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAU,YAAY;AACtB;;AAEA;AACA;AACA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAE;;AAEF;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA,EAAC;;AAED;AACA;AACA;AACA,EAAC;;AAED;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;;AAEA;AACA,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS,SAAS;AAClB;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,2BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;;AAEA,iBAAgB,IAAI;;AAEpB;AACA;;AAEA;AACA;;AAEA;AACA,yCAAwC,IAAI;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;AACD,UAAS;;AAET;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAM;AACN;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAI;AACJ;AACA;;AAEA;AACA,KAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,cAAa,yBAAyB;AACtC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAW,SAAS;AACpB;AACA;AACA;;AAEA;AACA;AACA,GAAE;AACF;AACA,GAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,SAAS;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAW,QAAQ;AACnB,YAAW,QAAQ;AACnB,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH,GAAE;AACF;;AAEA;AACA;AACA,YAAW,gBAAgB;AAC3B,cAAa,uBAAuB;AACpC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,YAAW,eAAe;AAC1B,cAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAW,eAAe;AAC1B,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAI;AACJ;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAE;AACF;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,YAAW,UAAU;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,YAAW,cAAc;AACzB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA,iCAAgC,MAAM;AACtC;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,gBAAe;;AAEf,UAAS;;AAET;AACA,SAAQ,iCAAiC;AACzC,SAAQ,oBAAoB;AAC5B,SAAQ,sCAAsC;AAC9C,SAAQ;AACR,GAAE;;AAEF;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,KAAI;AACJ;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,KAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA,iBAAgB,aAAa,EAAE;AAC/B;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,iEAAgE;AAChE;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAO,yEAAyE;AAChF;;AAEA;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA,oDAAmD;AACnD;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA,kEAAiE,UAAU;AAC3E,uCAAsC,2BAA2B;AACjE;AACA,iCAAgC,MAAM;AACtC;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA,WAAU,YAAY;AACtB;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,WAAU,YAAY;AACtB;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,WAAU,UAAU;AACpB;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,WAAU,cAAc;AACxB;AACA;AACA;AACA,IAAG;AACH;AACA;;AAEA;;AAEA;AACA,aAAY,uEAAuE;AACnF;AACA;AACA,aAAY,4BAA4B;AACxC;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAQ,SAAS;AACjB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA,4DAA2D;AAC3D;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA;;AAEA,oCAAmC;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA;AACA,SAAQ,SAAS;AACjB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAQ,SAAS;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA,GAAE;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH,SAAQ,SAAS;AACjB;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA;AACA,YAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAuC,iDAAiD;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,kDAAiD;AACjD,WAAU,wCAAwC;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,gBAAgB;AAC3B;AACA,YAAW,QAAQ;AACnB,YAAW,MAAM;AACjB,YAAW,MAAM;AACjB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,KAAI;AACJ;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,EAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;AACD;AACA;AACA;AACA;AACA,GAAE;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;AACD;AACA;AACA;AACA;AACA,GAAE;AACF;;AAEA;AACA;AACA;AACA;AACA,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;AACF;;AAEA;;AAEA,EAAC;;;;AAID;AACA;AACA;AACA;AACA;AACA;AACA;;;;AAIA;;AAEA;;;;AAIA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAE;AACF;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,iBAAgB,SAAS;AACzB;AACA;AACA;AACA;AACA,KAAI;AACJ;;AAEA,eAAc,SAAS;AACvB;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA,GAAE;AACF;AACA;AACA,GAAE;AACF;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;;AAGD;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,KAAI;AACJ;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAQ;AACR;AACA;AACA;AACA;;AAEA;;AAEA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,KAAI;AACJ;;AAEA;AACA;AACA,KAAI;AACJ;AACA;;AAEA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;;AAEA,UAAS,GAAG;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,EAAC;;AAED;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAU,OAAO;AACjB;AACA;AACA;AACA;AACA,IAAG;AACH,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAS,OAAO;AAChB,wBAAuB,wBAAwB;AAC/C;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAE;;AAEF;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,EAAC;;AAED;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA,GAAE;AACF;AACA;AACA,GAAE;AACF;AACA;AACA,GAAE;AACF;AACA;AACA,GAAE;AACF;AACA;AACA,GAAE;AACF;AACA;AACA,GAAE;AACF;AACA;AACA,GAAE;AACF;AACA;AACA,GAAE;AACF;AACA,iDAAgD;AAChD,GAAE;AACF;AACA;AACA,GAAE;AACF;AACA;AACA;AACA,EAAC;AACD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,EAAC;AACD;;;;AAIA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAE;AACF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAmB;;AAEnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAU,oCAAoC;AAC9C;AACA,qBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA,MAAK;AACL;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAQ;AACR;AACA;AACA;AACA,QAAO;AACP,OAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,OAAM;AACN;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAM;AACN;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAM;AACN;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA,SAAQ;AACR,QAAO;AACP;AACA,OAAM;AACN,MAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,+CAA8C;AAC9C,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAM;AACN;AACA;AACA;AACA,KAAI;;AAEJ;;AAEA,6CAA4C;AAC5C;AACA;AACA;AACA;AACA,WAAU,YAAY;AACtB;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,EAAC;;;AAGD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,GAAE;;AAEF;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;;;AAKA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAE;AACF;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,WAAU,SAAS;AACnB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA,wCAAuC;AACvC;AACA;AACA;AACA,GAAE;;AAEF;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sBAAqB;AACrB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,mCAAkC;AAClC;;AAEA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,wBAAuB,aAAa;AACpC,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;;AAEA;AACA;;AAEA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qBAAoB,SAAS;AAC7B;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;;AAEJ;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA,GAAE;;AAEF;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA,EAAC;;AAED;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAI;AACJ;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ,IAAG;AACH,GAAE;;AAEF;AACA;AACA;AACA,IAAG;AACH;AACA,EAAC;;;AAGD;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ,IAAG;AACH;AACA,EAAC;;AAED;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,KAAI;AACJ,GAAE;AACF;AACA;AACA;AACA,IAAG;AACH,GAAE;AACF;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;AACD;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;AAIA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,EAAC;AACD;;;;AAIA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAE,gBAAgB;AAClB;;AAEA;AACA;AACA;AACA;AACA;;AAEA,YAAW;;AAEX;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;;AAEJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAI;AACJ;AACA;;AAEA;AACA;AACA;;AAEA,GAAE;;AAEF;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,4CAA2C;AAC3C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,uCAAsC;AACtC;AACA;AACA;;AAEA;AACA,0BAAyB;AACzB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,+CAA8C;AAC9C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,4CAA2C;AAC3C;;AAEA;AACA;AACA;AACA;AACA,WAAU,KAAK;AACf;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,mDAAkD;AAClD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;AACA;AACA,sDAAqD;AACrD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,0BAAyB;AACzB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,+DAA8D;AAC9D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,WAAU,cAAc;;AAExB;AACA;AACA;AACA,kBAAiB,mBAAmB;AACpC;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAAyB,+BAA+B;AACxD;AACA;AACA;AACA;;AAEA;AACA;AACA,uBAAsB,wDAAwD;AAC9E;;AAEA;AACA,GAAE;;AAEF;AACA;;AAEA,cAAa;;AAEb;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,uCAAsC,cAAc;AACpD;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,sCAAqC;AACrC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;;AAEJ;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,uCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAE;AACF;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,GAAE;AACF;AACA;;AAEA;;AAEA;AACA;AACA;AACA,GAAE;AACF;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;AACD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;AAED;AACA;AACA;AACA,eAAc,qCAAqC;;AAEnD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;;AAEA,MAAK;AACL;AACA;AACA;AACA;AACA,GAAE;AACF;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH,GAAE;AACF;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH,GAAE;;AAEF;AACA;AACA;AACA,IAAG;AACH,GAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;;AAGD;AACA;AACA;AACA,oBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAE;AACF;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,SAAQ,OAAO;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,4CAA2C,OAAO;AAClD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,+BAA8B;;AAE9B;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAE;AACF;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,wCAAuC,OAAO;AAC9C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,yCAAwC,OAAO;AAC/C;AACA;AACA,KAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAS,OAAO;AAChB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAK;AACL;;AAEA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAE;;AAEF;AACA;AACA;AACA;;AAEA,UAAS,mCAAmC;AAC5C;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL,IAAG;AACH,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,IAAG;AACH,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,IAAG;AACH,GAAE;;AAEF;AACA;AACA;AACA;;AAEA,UAAS,2BAA2B;AACpC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAE;;AAEF;AACA;AACA;;AAEA,UAAS,0BAA0B;AACnC;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,GAAE;;AAEF;AACA;AACA;;AAEA;AACA;AACA,IAAG;AACH,GAAE;;AAEF;AACA;AACA,8BAA6B;AAC7B;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,aAAY,OAAO;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA,IAAG;AACH,GAAE;;AAEF;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,GAAE;;AAEF;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,YAAW,OAAO;AAClB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,kBAAiB,gBAAgB;AACjC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,EAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAS,WAAW;AACpB;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,EAAC;;;AAGD;AACA;;AAEA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,YAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;;AAIA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,mBAAkB;AAClB;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,sCAAqC,QAAQ,SAAS,MAAM,aAAa,eAAe;AACxF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAkC,2BAA2B;AAC7D,2BAA0B,cAAc,cAAc,OAAO;AAC7D,gBAAe,YAAY,UAAU;AACrC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,8BAA6B,SAAS,QAAQ,QAAQ;AACtD;AACA;AACA;AACA,sCAAqC,4BAA4B;AACjE,8BAA6B,cAAc,SAAS,SAAS;AAC7D;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA,EAAC;;;AAGD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAEA,aAAY,+DAA+D;AAC3E;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,SAAQ,OAAO;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,SAAQ,gBAAgB;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAiB,gBAAgB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,IAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;AAED;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAM;AACN;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;AAED;AACA;AACA;AACA;AACA,+BAA8B,4BAA4B;AAC1D;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,EAAC;AACD;AACA;AACA;AACA,kBAAiB;;AAEjB;AACA;;AAEA,WAAU,OAAO;AACjB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,EAAC;;AAED;AACA;AACA;AACA;AACA,aAAY;AACZ;;AAEA;AACA;AACA;;AAEA,YAAW,SAAS;AACpB;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH,GAAE;AACF;AACA;AACA,GAAE;AACF;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA,IAAG;AACH;AACA,EAAC;;;AAGD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;AACF;AACA;;AAEA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;;;;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA;AACA,GAAE;AACF;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW;;AAEX;AACA;AACA;AACA,SAAQ,QAAQ;AAChB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAQ,gBAAgB;AACxB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ,IAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;AACA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH,mDAAkD;AAClD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,KAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAE;AACF;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,WAAU,iBAAiB;AAC3B;AACA;;AAEA;;AAEA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,4BAA2B;AAC3B,gCAA+B,kBAAkB,EAAE;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,iBAAiB;AAC5B;AACA;;AAEA,8CAA6C;AAC7C;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;;AAEA,SAAQ,iBAAiB;AACzB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA;;AAEA,UAAS,iBAAiB;AAC1B;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA,EAAC;;AAED;AACA,kEAAiE;AACjE;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,oBAAmB,cAAc;AACjC,GAAE;AACF;AACA;AACA;AACA;AACA;AACA,kDAAiD;;AAEjD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA,gCAA+B,SAAS;AACxC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH,GAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,gCAA+B,SAAS;AACxC;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAmB,gBAAgB;AACnC;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG;AACH;AACA,EAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;AAED;AACA;AACA;AACA;AACA;AACA,WAAU,kBAAkB;AAC5B,YAAW,kBAAkB;AAC7B,eAAc;AACd,EAAC;AACD;AACA;AACA;AACA,EAAC;;AAED;AACA;AACA;AACA;AACA;;AAEA;;AAEA,SAAQ,mBAAmB;AAC3B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAE;AACF;;;AAGA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;;AAGD;AACA;;AAEA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA,IAAG;AACH;AACA,EAAC;;AAED;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA,KAAI;AACJ;;AAEA,KAAI;AACJ;AACA;AACA;;AAEA,IAAG;AACH;;AAEA,IAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;;;;AAKD;;AAEA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA,IAAG;AACH;AACA,EAAC;;AAED;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,IAAG;AACH;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;;;;AAKD;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAI;AACJ;;AAEA;AACA;AACA;;AAEA,WAAU,SAAS;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;;AAEA,WAAU,SAAS;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAE;;AAEF;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAM;AACN;AACA;AACA;;AAEA;AACA,KAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH,GAAE;;AAEF;AACA;AACA;AACA;AACA,UAAS,OAAO;AAChB;AACA;AACA;AACA;;AAEA;AACA;AACA,EAAC;;;;;AAKD;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,KAAI;AACJ;AACA;;AAEA,kCAAiC;AACjC;AACA;;AAEA,KAAI;AACJ;;AAEA,KAAI;AACJ;AACA;AACA,MAAK;AACL;;AAEA;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA,EAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,YAAW,SAAS;AACpB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,KAAI;;AAEJ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;;;;AAKD;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;AAED;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA,GAAE;AACF;AACA;AACA,GAAE;;AAEF;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;AACA,EAAC;;;AAGD;;AAEA;;;;AAIA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAE;AACF;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAgB;;AAEhB;AACA;AACA;AACA;AACA;AACA,iBAAgB;;AAEhB,iDAAgD;AAChD;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,oBAAmB;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,wDAAuD;AACvD;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAiB;AACjB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;;AAEA;AACA,KAAI;;AAEJ;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAM;AACN;AACA;AACA,QAAO;AACP,gBAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA,UAAS;AACT;;AAEA;;AAEA;AACA;;AAEA;AACA,kBAAiB;AACjB,UAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAkD;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAa;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,GAAE;;AAEF;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mCAAkC;AAClC;AACA,uBAAsB;AACtB,4BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,oFAAmF;AACnF;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,eAAc,oCAAoC;AAClD;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,MAAK;AACL;;AAEA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAI;AACJ;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAE;;AAEF;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA,EAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA,EAAC;;;AAGD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;AACF;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAI;AACJ;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,KAAI;AACJ;;AAEA;AACA,GAAE;;AAEF;AACA;AACA;AACA;AACA,KAAI;AACJ;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,KAAI;AACJ;AACA;AACA,IAAG;AACH,GAAE;;AAEF;AACA;;AAEA;AACA;AACA,IAAG;AACH,GAAE;;AAEF;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA,EAAC;;;AAGD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AAKA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,KAAI;AACJ;AACA;AACA;AACA,IAAG;;AAEH,GAAE;AACF;AACA;AACA;AACA;;AAEA,GAAE;AACF;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH,GAAE;AACF;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAc;AACd,OAAM;AACN,OAAM;AACN,IAAG;AACH;AACA,EAAC;;;AAGD;AACA;AACA;AACA,GAAE;AACF;;AAEA;AACA,mBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;AACF;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAQ;AACR;AACA,mDAAkD;AAClD;AACA;AACA;AACA,SAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAU;AACV;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;;;;AAKD;AACA;AACA;AACA;AACA,GAAE;AACF;AACA;AACA,GAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;;;;AAKD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;AAED;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,IAAG;;AAEH;AACA;AACA;AACA,EAAC;;;;;AAKD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,GAAE;AACF;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,IAAG;AACH;AACA,IAAG;AACH;;AAEA;AACA;;;;;AAKA;AACA;AACA;AACA;AACA;AACA,EAAC;;;;;AAKD;AACA;AACA;AACA,GAAE;AACF;;;;;AAKA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,IAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,IAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA,WAAU,kBAAkB;AAC5B;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAmB;;AAEnB,6DAA4D,eAAe;AAC3E;AACA;AACA;;AAEA,IAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,IAAG;AACH;AACA,EAAC;;AAED;AACA,eAAc,sDAAsD;AACpE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,KAAI;AACJ;AACA;AACA,IAAG;AACH;AACA,EAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAC;;;AAGD;AACA,eAAc,mCAAmC;AACjD,gBAAe,6DAA6D;AAC5E;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,KAAI;AACJ;AACA,GAAE;AACF,EAAC;;;AAGD;AACA;AACA;AACA;;AAEA;;;;;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAE;AACF;;;;;AAKA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;AAKA;;AAEA,EAAC","file":"vendors.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, callbacks = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId])\n \t\t\t\tcallbacks.push.apply(callbacks, installedChunks[chunkId]);\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules);\n \t\twhile(callbacks.length)\n \t\t\tcallbacks.shift().call(null, __webpack_require__);\n \t\tif(moreModules[0]) {\n \t\t\tinstalledModules[0] = 0;\n \t\t\treturn __webpack_require__(0);\n \t\t}\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// \"0\" means \"already loaded\"\n \t// Array means \"loading\", array contains callbacks\n \tvar installedChunks = {\n \t\t2:0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId, callback) {\n \t\t// \"0\" is the signal for \"already loaded\"\n \t\tif(installedChunks[chunkId] === 0)\n \t\t\treturn callback.call(null, __webpack_require__);\n\n \t\t// an array means \"currently loading\".\n \t\tif(installedChunks[chunkId] !== undefined) {\n \t\t\tinstalledChunks[chunkId].push(callback);\n \t\t} else {\n \t\t\t// start chunk loading\n \t\t\tinstalledChunks[chunkId] = [callback];\n \t\t\tvar head = document.getElementsByTagName('head')[0];\n \t\t\tvar script = document.createElement('script');\n \t\t\tscript.type = 'text/javascript';\n \t\t\tscript.charset = 'utf-8';\n \t\t\tscript.async = true;\n\n \t\t\tscript.src = __webpack_require__.p + \"\" + chunkId + \".\" + ({\"0\":\"login\",\"1\":\"register\"}[chunkId]||chunkId) + \".js\";\n \t\t\thead.appendChild(script);\n \t\t}\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/home/vagrant/code/dist/js/mod\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 6467d73593f3d2df80b2\n **/","/*!\n * jQuery JavaScript Library v2.1.4\n * http://jquery.com/\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n *\n * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2015-04-28T16:01Z\n */\n\n(function( global, factory ) {\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n}(typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Support: Firefox 18+\n// Can't be in strict mode, several libs including ASP.NET trace\n// the stack via arguments.caller.callee and Firefox dies if\n// you try to trace through \"use strict\" call chains. (#13335)\n//\n\nvar arr = [];\n\nvar slice = arr.slice;\n\nvar concat = arr.concat;\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar support = {};\n\n\n\nvar\n\t// Use the correct document accordingly with window argument (sandbox)\n\tdocument = window.document,\n\n\tversion = \"2.1.4\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t},\n\n\t// Support: Android<4.1\n\t// Make sure we trim BOM and NBSP\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\n\n\t// Matches dashed string for camelizing\n\trmsPrefix = /^-ms-/,\n\trdashAlpha = /-([\\da-z])/gi,\n\n\t// Used by jQuery.camelCase as callback to replace()\n\tfcamelCase = function( all, letter ) {\n\t\treturn letter.toUpperCase();\n\t};\n\njQuery.fn = jQuery.prototype = {\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// Start with an empty selector\n\tselector: \"\",\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\t\treturn num != null ?\n\n\t\t\t// Return just the one element from the set\n\t\t\t( num < 0 ? this[ num + this.length ] : this[ num ] ) :\n\n\t\t\t// Return all the elements in a clean array\n\t\t\tslice.call( this );\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\t\tret.context = this.context;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\t// (You can seed the arguments with an array of args, but this is\n\t// only used internally.)\n\teach: function( callback, args ) {\n\t\treturn jQuery.each( this, callback, args );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map(this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t}));\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor(null);\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[0] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction(target) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\t\t// Only deal with non-null/undefined values\n\t\tif ( (options = arguments[ i ]) != null ) {\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && jQuery.isArray(src) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject(src) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend({\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type(obj) === \"function\";\n\t},\n\n\tisArray: Array.isArray,\n\n\tisWindow: function( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t},\n\n\tisNumeric: function( obj ) {\n\t\t// parseFloat NaNs numeric-cast false positives (null|true|false|\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t// adding 1 corrects loss of precision from parseFloat (#15100)\n\t\treturn !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0;\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\t// Not plain objects:\n\t\t// - Any object or value whose internal [[Class]] property is not \"[object Object]\"\n\t\t// - DOM nodes\n\t\t// - window\n\t\tif ( jQuery.type( obj ) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( obj.constructor &&\n\t\t\t\t!hasOwn.call( obj.constructor.prototype, \"isPrototypeOf\" ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// If the function hasn't returned already, we're confident that\n\t\t// |obj| is a plain object, created by {} or constructed with new Object\n\t\treturn true;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\ttype: function( obj ) {\n\t\tif ( obj == null ) {\n\t\t\treturn obj + \"\";\n\t\t}\n\t\t// Support: Android<4.0, iOS<6 (functionish RegExp)\n\t\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\t\tclass2type[ toString.call(obj) ] || \"object\" :\n\t\t\ttypeof obj;\n\t},\n\n\t// Evaluates a script in a global context\n\tglobalEval: function( code ) {\n\t\tvar script,\n\t\t\tindirect = eval;\n\n\t\tcode = jQuery.trim( code );\n\n\t\tif ( code ) {\n\t\t\t// If the code includes a valid, prologue position\n\t\t\t// strict mode pragma, execute code by injecting a\n\t\t\t// script tag into the document.\n\t\t\tif ( code.indexOf(\"use strict\") === 1 ) {\n\t\t\t\tscript = document.createElement(\"script\");\n\t\t\t\tscript.text = code;\n\t\t\t\tdocument.head.appendChild( script ).parentNode.removeChild( script );\n\t\t\t} else {\n\t\t\t// Otherwise, avoid the DOM node creation, insertion\n\t\t\t// and removal by using an indirect global eval\n\t\t\t\tindirect( code );\n\t\t\t}\n\t\t}\n\t},\n\n\t// Convert dashed to camelCase; used by the css and data modules\n\t// Support: IE9-11+\n\t// Microsoft forgot to hump their vendor prefix (#9572)\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n\t},\n\n\tnodeName: function( elem, name ) {\n\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\t},\n\n\t// args is for internal usage only\n\teach: function( obj, callback, args ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = obj.length,\n\t\t\tisArray = isArraylike( obj );\n\n\t\tif ( args ) {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// A special, fast, case for the most common use of each\n\t\t} else {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Support: Android<4.1\n\ttrim: function( text ) {\n\t\treturn text == null ?\n\t\t\t\"\" :\n\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArraylike( Object(arr) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tisArray = isArraylike( elems ),\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArray ) {\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tvar tmp, args, proxy;\n\n\t\tif ( typeof context === \"string\" ) {\n\t\t\ttmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\targs = slice.call( arguments, 2 );\n\t\tproxy = function() {\n\t\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\tnow: Date.now,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n});\n\n// Populate the class2type map\njQuery.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"), function(i, name) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n});\n\nfunction isArraylike( obj ) {\n\n\t// Support: iOS 8.2 (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = \"length\" in obj && obj.length,\n\t\ttype = jQuery.type( obj );\n\n\tif ( type === \"function\" || jQuery.isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\tif ( obj.nodeType === 1 && length ) {\n\t\treturn true;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.2.0-pre\n * http://sizzlejs.com/\n *\n * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2014-12-16\n */\n(function( window ) {\n\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// General-purpose constants\n\tMAX_NEGATIVE = 1 << 31,\n\n\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf as it's faster than native\n\t// http://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\t// http://www.w3.org/TR/css3-syntax/#characters\n\tcharacterEncoding = \"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",\n\n\t// Loosely modeled on CSS identifier characters\n\t// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors\n\t// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = characterEncoding.replace( \"w\", \"w#\" ),\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + characterEncoding + \")(?:\" + whitespace +\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\t\t// \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" + whitespace +\n\t\t\"*\\\\]\",\n\n\tpseudos = \":(\" + characterEncoding + \")(?:\\\\((\" +\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\n\trattributeQuotes = new RegExp( \"=\" + whitespace + \"*([^\\\\]'\\\"]*?)\" + whitespace + \"*\\\\]\", \"g\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + characterEncoding + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + characterEncoding + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + characterEncoding.replace( \"w\", \"w*\" ) + \")\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\trescape = /'|\\\\/g,\n\n\t// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox<24\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\thigh < 0 ?\n\t\t\t\t// BMP codepoint\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t};\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar match, elem, m, nodeType,\n\t\t// QSA vars\n\t\ti, groups, old, nid, newContext, newSelector;\n\n\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\n\tcontext = context || document;\n\tresults = results || [];\n\tnodeType = context.nodeType;\n\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\tif ( !seed && documentIsHTML ) {\n\n\t\t// Try to shortcut find operations when possible (e.g., not under DocumentFragment)\n\t\tif ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {\n\t\t\t// Speed-up: Sizzle(\"#ID\")\n\t\t\tif ( (m = match[1]) ) {\n\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\telem = context.getElementById( m );\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document (jQuery #6963)\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE, Opera, and Webkit return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Context is not a document\n\t\t\t\t\tif ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\n\t\t\t\t\t\tcontains( context, elem ) && elem.id === m ) {\n\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Speed-up: Sizzle(\"TAG\")\n\t\t\t} else if ( match[2] ) {\n\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\treturn results;\n\n\t\t\t// Speed-up: Sizzle(\".CLASS\")\n\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName ) {\n\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\treturn results;\n\t\t\t}\n\t\t}\n\n\t\t// QSA path\n\t\tif ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\t\t\tnid = old = expando;\n\t\t\tnewContext = context;\n\t\t\tnewSelector = nodeType !== 1 && selector;\n\n\t\t\t// qSA works strangely on Element-rooted queries\n\t\t\t// We can work around this by specifying an extra ID on the root\n\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\t\t\t// IE 8 doesn't work on object elements\n\t\t\tif ( nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n\t\t\t\tgroups = tokenize( selector );\n\n\t\t\t\tif ( (old = context.getAttribute(\"id\")) ) {\n\t\t\t\t\tnid = old.replace( rescape, \"\\\\$&\" );\n\t\t\t\t} else {\n\t\t\t\t\tcontext.setAttribute( \"id\", nid );\n\t\t\t\t}\n\t\t\t\tnid = \"[id='\" + nid + \"'] \";\n\n\t\t\t\ti = groups.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tgroups[i] = nid + toSelector( groups[i] );\n\t\t\t\t}\n\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) || context;\n\t\t\t\tnewSelector = groups.join(\",\");\n\t\t\t}\n\n\t\t\tif ( newSelector ) {\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch(qsaError) {\n\t\t\t\t} finally {\n\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\tcontext.removeAttribute(\"id\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {Function(string, Object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key + \" \" ] = value);\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created div and expects a boolean result\n */\nfunction assert( fn ) {\n\tvar div = document.createElement(\"div\");\n\n\ttry {\n\t\treturn !!fn( div );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// Remove from its parent by default\n\t\tif ( div.parentNode ) {\n\t\t\tdiv.parentNode.removeChild( div );\n\t\t}\n\t\t// release memory in IE\n\t\tdiv = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split(\"|\"),\n\t\ti = attrs.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\t( ~b.sourceIndex || MAX_NEGATIVE ) -\n\t\t\t( ~a.sourceIndex || MAX_NEGATIVE );\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, parent,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// If no document and documentElement is available, return\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Set our document\n\tdocument = doc;\n\tdocElem = doc.documentElement;\n\tparent = doc.defaultView;\n\n\t// Support: IE>8\n\t// If iframe document is assigned to \"document\" variable and if iframe has been reloaded,\n\t// IE will throw \"permission denied\" error when accessing \"document\" variable, see jQuery #13936\n\t// IE6-8 do not support the defaultView property so parent will be undefined\n\tif ( parent && parent !== parent.top ) {\n\t\t// IE11 does not have attachEvent, so all must suffer\n\t\tif ( parent.addEventListener ) {\n\t\t\tparent.addEventListener( \"unload\", unloadHandler, false );\n\t\t} else if ( parent.attachEvent ) {\n\t\t\tparent.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t/* Support tests\n\t---------------------------------------------------------------------- */\n\tdocumentIsHTML = !isXML( doc );\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert(function( div ) {\n\t\tdiv.className = \"i\";\n\t\treturn !div.getAttribute(\"className\");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( div ) {\n\t\tdiv.appendChild( doc.createComment(\"\") );\n\t\treturn !div.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( doc.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert(function( div ) {\n\t\tdocElem.appendChild( div ).id = expando;\n\t\treturn !doc.getElementsByName || !doc.getElementsByName( expando ).length;\n\t});\n\n\t// ID find and filter\n\tif ( support.getById ) {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\treturn m && m.parentNode ? [ m ] : [];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t} else {\n\t\t// Support: IE6/7\n\t\t// getElementById is not reliable as a find shortcut\n\t\tdelete Expr.find[\"ID\"];\n\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" && elem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See http://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( div ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// http://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( div ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\f]' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( div.querySelectorAll(\"[msallowcapture^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !div.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+\n\t\t\tif ( !div.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push(\"~=\");\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibing-combinator selector` fails\n\t\t\tif ( !div.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push(\".#.+[+~]\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( div ) {\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = doc.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tdiv.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( div.querySelectorAll(\"[name=d]\").length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":enabled\").length ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tdiv.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( div ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( div, \"div\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( div, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully does not implement inclusive descendent\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\tcompare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\tif ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\t\t\treturn a === doc ? -1 :\n\t\t\t\tb === doc ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn doc;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch (e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( (node = elem[i++]) ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[3] || match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[6] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[3] ) {\n\t\t\t\tmatch[2] = match[4] || match[5] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== \"undefined\" && elem.getAttribute(\"class\") || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, outerCache, node, diff, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\t\t\t\t\t\t\touterCache = parent[ expando ] || (parent[ expando ] = {});\n\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[0] === dirruns && cache[1];\n\t\t\t\t\t\t\tdiff = cache[0] === dirruns && cache[2];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {\n\t\t\t\t\t\t\tdiff = cache[1];\n\n\t\t\t\t\t\t// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\tif ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {\n\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[0] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": function( elem ) {\n\t\t\treturn elem.disabled === false;\n\t\t},\n\n\t\t\"disabled\": function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t// but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( (tokens = []) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t});\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push({\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t});\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tcheckNonElements = base && dir === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\t\t\t\t\t\tif ( (oldCache = outerCache[ dir ]) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn (newCache[ 2 ] = oldCache[ 2 ]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\touterCache[ dir ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", outermost ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context !== document && context;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Keep `i` a string if there are no elements so `matchedCount` will be \"00\" below\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\tmatchedCount += i;\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n * selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n * selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( (selector = compiled.selector || selector) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is no seed and only one group\n\tif ( match.length === 1 ) {\n\n\t\t// Take a shortcut and set the context if the root selector is an ID\n\t\ttokens = match[0] = match[0].slice( 0 );\n\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\tsupport.getById && context.nodeType === 9 && documentIsHTML &&\n\t\t\t\tExpr.relative[ tokens[1].type ] ) {\n\n\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[i];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( (seed = find(\n\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context\n\t\t\t\t)) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\trsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( div1 ) {\n\t// Should return 1, but returns 4 (following)\n\treturn div1.compareDocumentPosition( document.createElement(\"div\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( div ) {\n\tdiv.innerHTML = \"<a href='#'></a>\";\n\treturn div.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( div ) {\n\tdiv.innerHTML = \"<input/>\";\n\tdiv.firstChild.setAttribute( \"value\", \"\" );\n\treturn div.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n\taddHandle( \"value\", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( div ) {\n\treturn div.getAttribute(\"disabled\") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t\t(val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\tnull;\n\t\t}\n\t});\n}\n\nreturn Sizzle;\n\n})( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[\":\"] = jQuery.expr.pseudos;\njQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\n\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\nvar rsingleTag = (/^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/);\n\n\n\nvar risSimple = /^.[^:#\\[\\.,]*$/;\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\t/* jshint -W018 */\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t});\n\n\t}\n\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t});\n\n\t}\n\n\tif ( typeof qualifier === \"string\" ) {\n\t\tif ( risSimple.test( qualifier ) ) {\n\t\t\treturn jQuery.filter( qualifier, elements, not );\n\t\t}\n\n\t\tqualifier = jQuery.filter( qualifier, elements );\n\t}\n\n\treturn jQuery.grep( elements, function( elem ) {\n\t\treturn ( indexOf.call( qualifier, elem ) >= 0 ) !== not;\n\t});\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\treturn elems.length === 1 && elem.nodeType === 1 ?\n\t\tjQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :\n\t\tjQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\t\treturn elem.nodeType === 1;\n\t\t}));\n};\n\njQuery.fn.extend({\n\tfind: function( selector ) {\n\t\tvar i,\n\t\t\tlen = this.length,\n\t\t\tret = [],\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter(function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}) );\n\t\t}\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\t// Needed because $( selector, context ) becomes $( context ).find( selector )\n\t\tret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );\n\t\tret.selector = this.selector ? this.selector + \" \" + selector : selector;\n\t\treturn ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector || [], false) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector || [], true) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n});\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,\n\n\tinit = jQuery.fn.init = function( selector, context ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[0] === \"<\" && selector[ selector.length - 1 ] === \">\" && selector.length >= 3 ) {\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && (match[1] || !context) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[1] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[0] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[1],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( jQuery.isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[2] );\n\n\t\t\t\t\t// Support: Blackberry 4.6\n\t\t\t\t\t// gEBID returns nodes no longer in the document (#6963)\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t\tthis[0] = elem;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.context = document;\n\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || rootjQuery ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis.context = this[0] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn typeof rootjQuery.ready !== \"undefined\" ?\n\t\t\t\trootjQuery.ready( selector ) :\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\tif ( selector.selector !== undefined ) {\n\t\t\tthis.selector = selector.selector;\n\t\t\tthis.context = selector.context;\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.extend({\n\tdir: function( elem, dir, until ) {\n\t\tvar matched = [],\n\t\t\ttruncate = until !== undefined;\n\n\t\twhile ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tmatched.push( elem );\n\t\t\t}\n\t\t}\n\t\treturn matched;\n\t},\n\n\tsibling: function( n, elem ) {\n\t\tvar matched = [];\n\n\t\tfor ( ; n; n = n.nextSibling ) {\n\t\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\t\tmatched.push( n );\n\t\t\t}\n\t\t}\n\n\t\treturn matched;\n\t}\n});\n\njQuery.fn.extend({\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter(function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[i] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\tpos = rneedsContext.test( selectors ) || typeof selectors !== \"string\" ?\n\t\t\t\tjQuery( selectors, context || this.context ) :\n\t\t\t\t0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tfor ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {\n\t\t\t\t// Always skip document fragments\n\t\t\t\tif ( cur.nodeType < 11 && (pos ?\n\t\t\t\t\tpos.index(cur) > -1 :\n\n\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\tjQuery.find.matchesSelector(cur, selectors)) ) {\n\n\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.unique(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter(selector)\n\t\t);\n\t}\n});\n\nfunction sibling( cur, dir ) {\n\twhile ( (cur = cur[dir]) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each({\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn jQuery.dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn jQuery.sibling( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\treturn elem.contentDocument || jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.unique( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n});\nvar rnotwhite = (/\\S+/g);\n\n\n\n// String to Object options format cache\nvar optionsCache = {};\n\n// Convert String-formatted options into Object-formatted ones and store in cache\nfunction createOptions( options ) {\n\tvar object = optionsCache[ options ] = {};\n\tjQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t});\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\t( optionsCache[ options ] || createOptions( options ) ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Last fire value (for non-forgettable lists)\n\t\tmemory,\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\t\t// Flag to know if list is currently firing\n\t\tfiring,\n\t\t// First callback to fire (used internally by add and fireWith)\n\t\tfiringStart,\n\t\t// End of the loop when firing\n\t\tfiringLength,\n\t\t// Index of currently firing callback (modified by remove if needed)\n\t\tfiringIndex,\n\t\t// Actual callback list\n\t\tlist = [],\n\t\t// Stack of fire calls for repeatable lists\n\t\tstack = !options.once && [],\n\t\t// Fire callbacks\n\t\tfire = function( data ) {\n\t\t\tmemory = options.memory && data;\n\t\t\tfired = true;\n\t\t\tfiringIndex = firingStart || 0;\n\t\t\tfiringStart = 0;\n\t\t\tfiringLength = list.length;\n\t\t\tfiring = true;\n\t\t\tfor ( ; list && firingIndex < firingLength; firingIndex++ ) {\n\t\t\t\tif ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {\n\t\t\t\t\tmemory = false; // To prevent further calls using add\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfiring = false;\n\t\t\tif ( list ) {\n\t\t\t\tif ( stack ) {\n\t\t\t\t\tif ( stack.length ) {\n\t\t\t\t\t\tfire( stack.shift() );\n\t\t\t\t\t}\n\t\t\t\t} else if ( memory ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t} else {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Actual Callbacks object\n\t\tself = {\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\t// First, we save the current length\n\t\t\t\t\tvar start = list.length;\n\t\t\t\t\t(function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tvar type = jQuery.type( arg );\n\t\t\t\t\t\t\tif ( type === \"function\" ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && type !== \"string\" ) {\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t})( arguments );\n\t\t\t\t\t// Do we need to add the callbacks to the\n\t\t\t\t\t// current firing batch?\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tfiringLength = list.length;\n\t\t\t\t\t// With memory, if we're not firing then\n\t\t\t\t\t// we should call right away\n\t\t\t\t\t} else if ( memory ) {\n\t\t\t\t\t\tfiringStart = start;\n\t\t\t\t\t\tfire( memory );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\t\tvar index;\n\t\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\t\tlist.splice( index, 1 );\n\t\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\t\t\tif ( index <= firingLength ) {\n\t\t\t\t\t\t\t\t\tfiringLength--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );\n\t\t\t},\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tlist = [];\n\t\t\t\tfiringLength = 0;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Have the list do nothing anymore\n\t\t\tdisable: function() {\n\t\t\t\tlist = stack = memory = undefined;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it disabled?\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\t\t\t// Lock the list in its current state\n\t\t\tlock: function() {\n\t\t\t\tstack = undefined;\n\t\t\t\tif ( !memory ) {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it locked?\n\t\t\tlocked: function() {\n\t\t\t\treturn !stack;\n\t\t\t},\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( list && ( !fired || stack ) ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tstack.push( args );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfire( args );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\njQuery.extend({\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\t\t\t\t// action, add listener, listener list, final state\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks(\"once memory\"), \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks(\"once memory\"), \"rejected\" ],\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks(\"memory\") ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\tthen: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\t\t\t\t\treturn jQuery.Deferred(function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\t\t\t\t\tvar fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];\n\t\t\t\t\t\t\t// deferred[ done | fail | progress ] for forwarding actions to newDefer\n\t\t\t\t\t\t\tdeferred[ tuple[1] ](function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject )\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t}).promise();\n\t\t\t\t},\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Keep pipe for back-compat\n\t\tpromise.pipe = promise.then;\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 3 ];\n\n\t\t\t// promise[ done | fail | progress ] = list.add\n\t\t\tpromise[ tuple[1] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(function() {\n\t\t\t\t\t// state = [ resolved | rejected ]\n\t\t\t\t\tstate = stateString;\n\n\t\t\t\t// [ reject_list | resolve_list ].disable; progress_list.lock\n\t\t\t\t}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );\n\t\t\t}\n\n\t\t\t// deferred[ resolve | reject | notify ]\n\t\t\tdeferred[ tuple[0] ] = function() {\n\t\t\t\tdeferred[ tuple[0] + \"With\" ]( this === deferred ? promise : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\t\t\tdeferred[ tuple[0] + \"With\" ] = list.fireWith;\n\t\t});\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( subordinate /* , ..., subordinateN */ ) {\n\t\tvar i = 0,\n\t\t\tresolveValues = slice.call( arguments ),\n\t\t\tlength = resolveValues.length,\n\n\t\t\t// the count of uncompleted subordinates\n\t\t\tremaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,\n\n\t\t\t// the master Deferred. If resolveValues consist of only a single Deferred, just use that.\n\t\t\tdeferred = remaining === 1 ? subordinate : jQuery.Deferred(),\n\n\t\t\t// Update function for both resolve and progress values\n\t\t\tupdateFunc = function( i, contexts, values ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tcontexts[ i ] = this;\n\t\t\t\t\tvalues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( values === progressValues ) {\n\t\t\t\t\t\tdeferred.notifyWith( contexts, values );\n\t\t\t\t\t} else if ( !( --remaining ) ) {\n\t\t\t\t\t\tdeferred.resolveWith( contexts, values );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tprogressValues, progressContexts, resolveContexts;\n\n\t\t// Add listeners to Deferred subordinates; treat others as resolved\n\t\tif ( length > 1 ) {\n\t\t\tprogressValues = new Array( length );\n\t\t\tprogressContexts = new Array( length );\n\t\t\tresolveContexts = new Array( length );\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {\n\t\t\t\t\tresolveValues[ i ].promise()\n\t\t\t\t\t\t.done( updateFunc( i, resolveContexts, resolveValues ) )\n\t\t\t\t\t\t.fail( deferred.reject )\n\t\t\t\t\t\t.progress( updateFunc( i, progressContexts, progressValues ) );\n\t\t\t\t} else {\n\t\t\t\t\t--remaining;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If we're not waiting on anything, resolve the master\n\t\tif ( !remaining ) {\n\t\t\tdeferred.resolveWith( resolveContexts, resolveValues );\n\t\t}\n\n\t\treturn deferred.promise();\n\t}\n});\n\n\n// The deferred used on DOM ready\nvar readyList;\n\njQuery.fn.ready = function( fn ) {\n\t// Add the callback\n\tjQuery.ready.promise().done( fn );\n\n\treturn this;\n};\n\njQuery.extend({\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Hold (or release) the ready event\n\tholdReady: function( hold ) {\n\t\tif ( hold ) {\n\t\t\tjQuery.readyWait++;\n\t\t} else {\n\t\t\tjQuery.ready( true );\n\t\t}\n\t},\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\n\t\t// Trigger any bound ready events\n\t\tif ( jQuery.fn.triggerHandler ) {\n\t\t\tjQuery( document ).triggerHandler( \"ready\" );\n\t\t\tjQuery( document ).off( \"ready\" );\n\t\t}\n\t}\n});\n\n/**\n * The ready event handler and self cleanup method\n */\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed, false );\n\twindow.removeEventListener( \"load\", completed, false );\n\tjQuery.ready();\n}\n\njQuery.ready.promise = function( obj ) {\n\tif ( !readyList ) {\n\n\t\treadyList = jQuery.Deferred();\n\n\t\t// Catch cases where $(document).ready() is called after the browser event has already occurred.\n\t\t// We once tried to use readyState \"interactive\" here, but it caused issues like the one\n\t\t// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15\n\t\tif ( document.readyState === \"complete\" ) {\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\t\t\tsetTimeout( jQuery.ready );\n\n\t\t} else {\n\n\t\t\t// Use the handy event callback\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", completed, false );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.addEventListener( \"load\", completed, false );\n\t\t}\n\t}\n\treturn readyList.promise( obj );\n};\n\n// Kick off the DOM ready check even if the user does not\njQuery.ready.promise();\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( jQuery.type( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\tjQuery.access( elems, fn, i, key[i], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !jQuery.isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn chainable ?\n\t\telems :\n\n\t\t// Gets\n\t\tbulk ?\n\t\t\tfn.call( elems ) :\n\t\t\tlen ? fn( elems[0], key ) : emptyGet;\n};\n\n\n/**\n * Determines whether an object can have data\n */\njQuery.acceptData = function( owner ) {\n\t// Accepts only:\n\t// - Node\n\t// - Node.ELEMENT_NODE\n\t// - Node.DOCUMENT_NODE\n\t// - Object\n\t// - Any\n\t/* jshint -W018 */\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\nfunction Data() {\n\t// Support: Android<4,\n\t// Old WebKit does not have Object.preventExtensions/freeze method,\n\t// return new empty object instead with no [[set]] accessor\n\tObject.defineProperty( this.cache = {}, 0, {\n\t\tget: function() {\n\t\t\treturn {};\n\t\t}\n\t});\n\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\nData.accepts = jQuery.acceptData;\n\nData.prototype = {\n\tkey: function( owner ) {\n\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t// but we should not, see #8335.\n\t\t// Always return the key for a frozen object.\n\t\tif ( !Data.accepts( owner ) ) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar descriptor = {},\n\t\t\t// Check if the owner object already has a cache key\n\t\t\tunlock = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !unlock ) {\n\t\t\tunlock = Data.uid++;\n\n\t\t\t// Secure it in a non-enumerable, non-writable property\n\t\t\ttry {\n\t\t\t\tdescriptor[ this.expando ] = { value: unlock };\n\t\t\t\tObject.defineProperties( owner, descriptor );\n\n\t\t\t// Support: Android<4\n\t\t\t// Fallback to a less secure definition\n\t\t\t} catch ( e ) {\n\t\t\t\tdescriptor[ this.expando ] = unlock;\n\t\t\t\tjQuery.extend( owner, descriptor );\n\t\t\t}\n\t\t}\n\n\t\t// Ensure the cache object\n\t\tif ( !this.cache[ unlock ] ) {\n\t\t\tthis.cache[ unlock ] = {};\n\t\t}\n\n\t\treturn unlock;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\t// There may be an unlock assigned to this node,\n\t\t\t// if there is no entry for this \"owner\", create one inline\n\t\t\t// and set the unlock as though an owner entry had always existed\n\t\t\tunlock = this.key( owner ),\n\t\t\tcache = this.cache[ unlock ];\n\n\t\t// Handle: [ owner, key, value ] args\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ data ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\t\t\t// Fresh assignments by object are shallow copied\n\t\t\tif ( jQuery.isEmptyObject( cache ) ) {\n\t\t\t\tjQuery.extend( this.cache[ unlock ], data );\n\t\t\t// Otherwise, copy the properties one-by-one to the cache object\n\t\t\t} else {\n\t\t\t\tfor ( prop in data ) {\n\t\t\t\t\tcache[ prop ] = data[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\t// Either a valid cache is found, or will be created.\n\t\t// New caches will be created and the unlock returned,\n\t\t// allowing direct access to the newly created\n\t\t// empty data object. A valid owner object must be provided.\n\t\tvar cache = this.cache[ this.key( owner ) ];\n\n\t\treturn key === undefined ?\n\t\t\tcache : cache[ key ];\n\t},\n\taccess: function( owner, key, value ) {\n\t\tvar stored;\n\t\t// In cases where either:\n\t\t//\n\t\t// 1. No key was specified\n\t\t// 2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t// 1. The entire cache object\n\t\t// 2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t((key && typeof key === \"string\") && value === undefined) ) {\n\n\t\t\tstored = this.get( owner, key );\n\n\t\t\treturn stored !== undefined ?\n\t\t\t\tstored : this.get( owner, jQuery.camelCase(key) );\n\t\t}\n\n\t\t// [*]When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t// 1. An object of properties\n\t\t// 2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i, name, camel,\n\t\t\tunlock = this.key( owner ),\n\t\t\tcache = this.cache[ unlock ];\n\n\t\tif ( key === undefined ) {\n\t\t\tthis.cache[ unlock ] = {};\n\n\t\t} else {\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( jQuery.isArray( key ) ) {\n\t\t\t\t// If \"name\" is an array of keys...\n\t\t\t\t// When data is initially created, via (\"key\", \"val\") signature,\n\t\t\t\t// keys will be converted to camelCase.\n\t\t\t\t// Since there is no way to tell _how_ a key was added, remove\n\t\t\t\t// both plain key and camelCase key. #12786\n\t\t\t\t// This will only penalize the array argument path.\n\t\t\t\tname = key.concat( key.map( jQuery.camelCase ) );\n\t\t\t} else {\n\t\t\t\tcamel = jQuery.camelCase( key );\n\t\t\t\t// Try the string as a key before any manipulation\n\t\t\t\tif ( key in cache ) {\n\t\t\t\t\tname = [ key, camel ];\n\t\t\t\t} else {\n\t\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\t\tname = camel;\n\t\t\t\t\tname = name in cache ?\n\t\t\t\t\t\t[ name ] : ( name.match( rnotwhite ) || [] );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ti = name.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ name[ i ] ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\treturn !jQuery.isEmptyObject(\n\t\t\tthis.cache[ owner[ this.expando ] ] || {}\n\t\t);\n\t},\n\tdiscard: function( owner ) {\n\t\tif ( owner[ this.expando ] ) {\n\t\t\tdelete this.cache[ owner[ this.expando ] ];\n\t\t}\n\t}\n};\nvar data_priv = new Data();\n\nvar data_user = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /([A-Z])/g;\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$1\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = data === \"true\" ? true :\n\t\t\t\t\tdata === \"false\" ? false :\n\t\t\t\t\tdata === \"null\" ? null :\n\t\t\t\t\t// Only convert to a number if it doesn't change the string\n\t\t\t\t\t+data + \"\" === data ? +data :\n\t\t\t\t\trbrace.test( data ) ? jQuery.parseJSON( data ) :\n\t\t\t\t\tdata;\n\t\t\t} catch( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdata_user.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend({\n\thasData: function( elem ) {\n\t\treturn data_user.hasData( elem ) || data_priv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn data_user.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdata_user.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to data_priv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn data_priv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdata_priv.remove( elem, name );\n\t}\n});\n\njQuery.fn.extend({\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = data_user.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !data_priv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE11+\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = jQuery.camelCase( name.slice(5) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdata_priv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tdata_user.set( this, key );\n\t\t\t});\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data,\n\t\t\t\tcamelKey = jQuery.camelCase( key );\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// with the key as-is\n\t\t\t\tdata = data_user.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// with the key camelized\n\t\t\t\tdata = data_user.get( elem, camelKey );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, camelKey, undefined );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each(function() {\n\t\t\t\t// First, attempt to store a copy or reference of any\n\t\t\t\t// data that might've been store with a camelCased key.\n\t\t\t\tvar data = data_user.get( this, camelKey );\n\n\t\t\t\t// For HTML5 data-* attribute interop, we have to\n\t\t\t\t// store property names with dashes in a camelCase form.\n\t\t\t\t// This might not apply to all properties...*\n\t\t\t\tdata_user.set( this, camelKey, value );\n\n\t\t\t\t// *... In the case of properties that might _actually_\n\t\t\t\t// have dashes, we need to also store a copy of that\n\t\t\t\t// unchanged property.\n\t\t\t\tif ( key.indexOf(\"-\") !== -1 && data !== undefined ) {\n\t\t\t\t\tdata_user.set( this, key, value );\n\t\t\t\t}\n\t\t\t});\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each(function() {\n\t\t\tdata_user.remove( this, key );\n\t\t});\n\t}\n});\n\n\njQuery.extend({\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = data_priv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || jQuery.isArray( data ) ) {\n\t\t\t\t\tqueue = data_priv.access( elem, type, jQuery.makeArray(data) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn data_priv.get( elem, key ) || data_priv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks(\"once memory\").add(function() {\n\t\t\t\tdata_priv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t})\n\t\t});\n\t}\n});\n\njQuery.fn.extend({\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[0], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[0] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t});\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t});\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = data_priv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n});\nvar pnum = (/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/).source;\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar isHidden = function( elem, el ) {\n\t\t// isHidden might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\t\treturn jQuery.css( elem, \"display\" ) === \"none\" || !jQuery.contains( elem.ownerDocument, elem );\n\t};\n\nvar rcheckableType = (/^(?:checkbox|radio)$/i);\n\n\n\n(function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Safari<=5.1\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Safari<=5.1, Android<4.2\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE<=11+\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n})();\nvar strundefined = typeof undefined;\n\n\n\nsupport.focusinBubbles = \"onfocusin\" in window;\n\n\nvar\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,\n\trfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)$/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = data_priv.get( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !(events = elemData.events) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !(eventHandle = elemData.handle) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnotwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend({\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join(\".\")\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !(handlers = events[ type ]) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle, false );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = data_priv.hasData( elem ) && data_priv.get( elem );\n\n\t\tif ( !elemData || !(events = elemData.events) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnotwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[2] && new RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector || selector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdelete elemData.handle;\n\t\t\tdata_priv.remove( elem, \"events\" );\n\t\t}\n\t},\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split(\".\") : [];\n\n\t\tcur = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf(\".\") >= 0 ) {\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split(\".\");\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf(\":\") < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join(\".\");\n\t\tevent.namespace_re = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === (elem.ownerDocument || document) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {\n\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( data_priv.get( cur, \"events\" ) || {} )[ event.type ] && data_priv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && jQuery.acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&\n\t\t\t\tjQuery.acceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\t\t\t\t\telem[ type ]();\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\tdispatch: function( event ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tevent = jQuery.event.fix( event );\n\n\t\tvar i, j, ret, matched, handleObj,\n\t\t\thandlerQueue = [],\n\t\t\targs = slice.call( arguments ),\n\t\t\thandlers = ( data_priv.get( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[0] = event;\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or 2) have namespace(s)\n\t\t\t\t// a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )\n\t\t\t\t\t\t\t.apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( (event.result = ret) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, matches, sel, handleObj,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\t// Black-hole SVG <use> instance trees (#13180)\n\t\t// Avoid non-left-click bubbling in Firefox (#3861)\n\t\tif ( delegateCount && cur.nodeType && (!event.button || event.type !== \"click\") ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.disabled !== true || event.type !== \"click\" ) {\n\t\t\t\t\tmatches = [];\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matches[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatches[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) >= 0 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matches[ sel ] ) {\n\t\t\t\t\t\t\tmatches.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matches.length ) {\n\t\t\t\t\t\thandlerQueue.push({ elem: cur, handlers: matches });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\t// Includes some event props shared by KeyEvent and MouseEvent\n\tprops: \"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),\n\n\tfixHooks: {},\n\n\tkeyHooks: {\n\t\tprops: \"char charCode key keyCode\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\n\t\t\t// Add which for key events\n\t\t\tif ( event.which == null ) {\n\t\t\t\tevent.which = original.charCode != null ? original.charCode : original.keyCode;\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tmouseHooks: {\n\t\tprops: \"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\t\t\tvar eventDoc, doc, body,\n\t\t\t\tbutton = original.button;\n\n\t\t\t// Calculate pageX/Y if missing and clientX/Y available\n\t\t\tif ( event.pageX == null && original.clientX != null ) {\n\t\t\t\teventDoc = event.target.ownerDocument || document;\n\t\t\t\tdoc = eventDoc.documentElement;\n\t\t\t\tbody = eventDoc.body;\n\n\t\t\t\tevent.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );\n\t\t\t\tevent.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );\n\t\t\t}\n\n\t\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\t\t// Note: button is not normalized, so don't use it\n\t\t\tif ( !event.which && button !== undefined ) {\n\t\t\t\tevent.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tfix: function( event ) {\n\t\tif ( event[ jQuery.expando ] ) {\n\t\t\treturn event;\n\t\t}\n\n\t\t// Create a writable copy of the event object and normalize some properties\n\t\tvar i, prop, copy,\n\t\t\ttype = event.type,\n\t\t\toriginalEvent = event,\n\t\t\tfixHook = this.fixHooks[ type ];\n\n\t\tif ( !fixHook ) {\n\t\t\tthis.fixHooks[ type ] = fixHook =\n\t\t\t\trmouseEvent.test( type ) ? this.mouseHooks :\n\t\t\t\trkeyEvent.test( type ) ? this.keyHooks :\n\t\t\t\t{};\n\t\t}\n\t\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\n\n\t\tevent = new jQuery.Event( originalEvent );\n\n\t\ti = copy.length;\n\t\twhile ( i-- ) {\n\t\t\tprop = copy[ i ];\n\t\t\tevent[ prop ] = originalEvent[ prop ];\n\t\t}\n\n\t\t// Support: Cordova 2.5 (WebKit) (#13255)\n\t\t// All events should have a target; Cordova deviceready doesn't\n\t\tif ( !event.target ) {\n\t\t\tevent.target = document;\n\t\t}\n\n\t\t// Support: Safari 6.0+, Chrome<28\n\t\t// Target should not be a text node (#504, #13143)\n\t\tif ( event.target.nodeType === 3 ) {\n\t\t\tevent.target = event.target.parentNode;\n\t\t}\n\n\t\treturn fixHook.filter ? fixHook.filter( event, originalEvent ) : event;\n\t},\n\n\tspecial: {\n\t\tload: {\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tfocus: {\n\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this !== safeActiveElement() && this.focus ) {\n\t\t\t\t\tthis.focus();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this === safeActiveElement() && this.blur ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\t\tclick: {\n\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this.type === \"checkbox\" && this.click && jQuery.nodeName( this, \"input\" ) ) {\n\t\t\t\t\tthis.click();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, don't fire native .click() on links\n\t\t\t_default: function( event ) {\n\t\t\t\treturn jQuery.nodeName( event.target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tsimulate: function( type, elem, event, bubble ) {\n\t\t// Piggyback on a donor event to simulate a different one.\n\t\t// Fake originalEvent to avoid donor's stopPropagation, but if the\n\t\t// simulated event prevents default then we do the same on the donor.\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true,\n\t\t\t\toriginalEvent: {}\n\t\t\t}\n\t\t);\n\t\tif ( bubble ) {\n\t\t\tjQuery.event.trigger( e, null, elem );\n\t\t} else {\n\t\t\tjQuery.event.dispatch.call( elem, e );\n\t\t}\n\t\tif ( e.isDefaultPrevented() ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n};\n\njQuery.removeEvent = function( elem, type, handle ) {\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle, false );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\t// Allow instantiation without the 'new' keyword\n\tif ( !(this instanceof jQuery.Event) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\t\t\t\t// Support: Android<4.0\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && e.preventDefault ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && e.stopPropagation ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && e.stopImmediatePropagation ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// Support: Chrome 15+\njQuery.each({\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mousenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || (related !== target && !jQuery.contains( target, related )) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n});\n\n// Support: Firefox, Chrome, Safari\n// Create \"bubbling\" focus and blur events\nif ( !support.focusinBubbles ) {\n\tjQuery.each({ focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );\n\t\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = data_priv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdata_priv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = data_priv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdata_priv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdata_priv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t});\n}\n\njQuery.fn.extend({\n\n\ton: function( types, selector, data, fn, /*INTERNAL*/ one ) {\n\t\tvar origFn, type;\n\n\t\t// Types can be a map of types/handlers\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-Object, selector, data )\n\t\t\tif ( typeof selector !== \"string\" ) {\n\t\t\t\t// ( types-Object, data )\n\t\t\t\tdata = data || selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.on( type, selector, data, types[ type ], one );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( data == null && fn == null ) {\n\t\t\t// ( types, fn )\n\t\t\tfn = selector;\n\t\t\tdata = selector = undefined;\n\t\t} else if ( fn == null ) {\n\t\t\tif ( typeof selector === \"string\" ) {\n\t\t\t\t// ( types, selector, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = undefined;\n\t\t\t} else {\n\t\t\t\t// ( types, data, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t} else if ( !fn ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( one === 1 ) {\n\t\t\torigFn = fn;\n\t\t\tfn = function( event ) {\n\t\t\t\t// Can use an empty set, since event contains the info\n\t\t\t\tjQuery().off( event );\n\t\t\t\treturn origFn.apply( this, arguments );\n\t\t\t};\n\t\t\t// Use same guid so caller can remove using origFn\n\t\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.add( this, types, fn, data, selector );\n\t\t});\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn this.on( types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\t\t\t// ( event ) dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ? handleObj.origType + \".\" + handleObj.namespace : handleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t});\n\t},\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t});\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[0];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n});\n\n\nvar\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,\n\trtagName = /<([\\w:]+)/,\n\trhtml = /<|&#?\\w+;/,\n\trnoInnerhtml = /<(?:script|style|link)/i,\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trscriptType = /^$|\\/(?:java|ecma)script/i,\n\trscriptTypeMasked = /^true\\/(.*)/,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g,\n\n\t// We have to close these tags to support XHTML (#13200)\n\twrapMap = {\n\n\t\t// Support: IE9\n\t\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\n\t\tthead: [ 1, \"<table>\", \"</table>\" ],\n\t\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\t\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\t\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t\t_default: [ 0, \"\", \"\" ]\n\t};\n\n// Support: IE9\nwrapMap.optgroup = wrapMap.option;\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// Support: 1.x compatibility\n// Manipulating tables requires a tbody\nfunction manipulationTarget( elem, content ) {\n\treturn jQuery.nodeName( elem, \"table\" ) &&\n\t\tjQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ?\n\n\t\telem.getElementsByTagName(\"tbody\")[0] ||\n\t\t\telem.appendChild( elem.ownerDocument.createElement(\"tbody\") ) :\n\t\telem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = (elem.getAttribute(\"type\") !== null) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tvar match = rscriptTypeMasked.exec( elem.type );\n\n\tif ( match ) {\n\t\telem.type = match[ 1 ];\n\t} else {\n\t\telem.removeAttribute(\"type\");\n\t}\n\n\treturn elem;\n}\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdata_priv.set(\n\t\t\telems[ i ], \"globalEval\", !refElements || data_priv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( data_priv.hasData( src ) ) {\n\t\tpdataOld = data_priv.access( src );\n\t\tpdataCur = data_priv.set( dest, pdataOld );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdelete pdataCur.handle;\n\t\t\tpdataCur.events = {};\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( data_user.hasData( src ) ) {\n\t\tudataOld = data_user.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdata_user.set( dest, udataCur );\n\t}\n}\n\nfunction getAll( context, tag ) {\n\tvar ret = context.getElementsByTagName ? context.getElementsByTagName( tag || \"*\" ) :\n\t\t\tcontext.querySelectorAll ? context.querySelectorAll( tag || \"*\" ) :\n\t\t\t[];\n\n\treturn tag === undefined || tag && jQuery.nodeName( context, tag ) ?\n\t\tjQuery.merge( [ context ], ret ) :\n\t\tret;\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\njQuery.extend({\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tbuildFragment: function( elems, context, scripts, selection ) {\n\t\tvar elem, tmp, tag, wrap, contains, j,\n\t\t\tfragment = context.createDocumentFragment(),\n\t\t\tnodes = [],\n\t\t\ti = 0,\n\t\t\tl = elems.length;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\telem = elems[ i ];\n\n\t\t\tif ( elem || elem === 0 ) {\n\n\t\t\t\t// Add nodes directly\n\t\t\t\tif ( jQuery.type( elem ) === \"object\" ) {\n\t\t\t\t\t// Support: QtWebKit, PhantomJS\n\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t\t// Convert non-html into a text node\n\t\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t\t// Convert html into DOM nodes\n\t\t\t\t} else {\n\t\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement(\"div\") );\n\n\t\t\t\t\t// Deserialize a standard representation\n\t\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\t\ttmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, \"<$1></$2>\" ) + wrap[ 2 ];\n\n\t\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\t\tj = wrap[ 0 ];\n\t\t\t\t\twhile ( j-- ) {\n\t\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: QtWebKit, PhantomJS\n\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t\t// Remember the top-level container\n\t\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\t\ttmp.textContent = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Remove wrapper from fragment\n\t\tfragment.textContent = \"\";\n\n\t\ti = 0;\n\t\twhile ( (elem = nodes[ i++ ]) ) {\n\n\t\t\t// #4087 - If origin and destination elements are the same, and this is\n\t\t\t// that element, do not do anything\n\t\t\tif ( selection && jQuery.inArray( elem, selection ) !== -1 ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t\t// Append to fragment\n\t\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t\t// Preserve script evaluation history\n\t\t\tif ( contains ) {\n\t\t\t\tsetGlobalEval( tmp );\n\t\t\t}\n\n\t\t\t// Capture executables\n\t\t\tif ( scripts ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (elem = tmp[ j++ ]) ) {\n\t\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\t\tscripts.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn fragment;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type, key,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = elems[ i ]) !== undefined; i++ ) {\n\t\t\tif ( jQuery.acceptData( elem ) ) {\n\t\t\t\tkey = elem[ data_priv.expando ];\n\n\t\t\t\tif ( key && (data = data_priv.cache[ key ]) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( data_priv.cache[ key ] ) {\n\t\t\t\t\t\t// Discard any remaining `private` data\n\t\t\t\t\t\tdelete data_priv.cache[ key ];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Discard any remaining `user` data\n\t\t\tdelete data_user.cache[ elem[ data_user.expando ] ];\n\t\t}\n\t}\n});\n\njQuery.fn.extend({\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each(function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t});\n\t},\n\n\tprepend: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t});\n\t},\n\n\tbefore: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t});\n\t},\n\n\tafter: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t});\n\t},\n\n\tremove: function( selector, keepData /* Internal Use Only */ ) {\n\t\tvar elem,\n\t\t\telems = selector ? jQuery.filter( selector, this ) : this,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\t\tif ( !keepData && elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( getAll( elem ) );\n\t\t\t}\n\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\tif ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\t\t\tsetGlobalEval( getAll( elem, \"script\" ) );\n\t\t\t\t}\n\t\t\t\telem.parentNode.removeChild( elem );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = this[i]) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map(function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t});\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = value.replace( rxhtmlTag, \"<$1></$2>\" );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar arg = arguments[ 0 ];\n\n\t\t// Make the changes, replacing each context element with the new content\n\t\tthis.domManip( arguments, function( elem ) {\n\t\t\targ = this.parentNode;\n\n\t\t\tjQuery.cleanData( getAll( this ) );\n\n\t\t\tif ( arg ) {\n\t\t\t\targ.replaceChild( elem, this );\n\t\t\t}\n\t\t});\n\n\t\t// Force removal if there was no new content (e.g., from empty arguments)\n\t\treturn arg && (arg.length || arg.nodeType) ? this : this.remove();\n\t},\n\n\tdetach: function( selector ) {\n\t\treturn this.remove( selector, true );\n\t},\n\n\tdomManip: function( args, callback ) {\n\n\t\t// Flatten any nested arrays\n\t\targs = concat.apply( [], args );\n\n\t\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tset = this,\n\t\t\tiNoClone = l - 1,\n\t\t\tvalue = args[ 0 ],\n\t\t\tisFunction = jQuery.isFunction( value );\n\n\t\t// We can't cloneNode fragments that contain checked, in WebKit\n\t\tif ( isFunction ||\n\t\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\t\treturn this.each(function( index ) {\n\t\t\t\tvar self = set.eq( index );\n\t\t\t\tif ( isFunction ) {\n\t\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t\t}\n\t\t\t\tself.domManip( args, callback );\n\t\t\t});\n\t\t}\n\n\t\tif ( l ) {\n\t\t\tfragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );\n\t\t\tfirst = fragment.firstChild;\n\n\t\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\t\tfragment = first;\n\t\t\t}\n\n\t\t\tif ( first ) {\n\t\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\t\thasScripts = scripts.length;\n\n\t\t\t\t// Use the original fragment for the last item instead of the first because it can end up\n\t\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\tnode = fragment;\n\n\t\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\t\t\t// Support: QtWebKit\n\t\t\t\t\t\t\t// jQuery.merge because push.apply(_, arraylike) throws\n\t\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcallback.call( this[ i ], node, i );\n\t\t\t\t}\n\n\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t\t// Reenable scripts\n\t\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t\t!data_priv.access( node, \"globalEval\" ) && jQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\t\tif ( node.src ) {\n\t\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\t\tif ( jQuery._evalUrl ) {\n\t\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.globalEval( node.textContent.replace( rcleanScript, \"\" ) );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\njQuery.each({\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: QtWebKit\n\t\t\t// .get() because push.apply(_, arraylike) throws\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n});\n\n\nvar iframe,\n\telemdisplay = {};\n\n/**\n * Retrieve the actual display of a element\n * @param {String} name nodeName of the element\n * @param {Object} doc Document object\n */\n// Called only from within defaultDisplay\nfunction actualDisplay( name, doc ) {\n\tvar style,\n\t\telem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),\n\n\t\t// getDefaultComputedStyle might be reliably used only on attached element\n\t\tdisplay = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ?\n\n\t\t\t// Use of this method is a temporary fix (more like optimization) until something better comes along,\n\t\t\t// since it was removed from specification and supported only in FF\n\t\t\tstyle.display : jQuery.css( elem[ 0 ], \"display\" );\n\n\t// We don't have any data stored on the element,\n\t// so use \"detach\" method as fast way to get rid of the element\n\telem.detach();\n\n\treturn display;\n}\n\n/**\n * Try to determine the default display value of an element\n * @param {String} nodeName\n */\nfunction defaultDisplay( nodeName ) {\n\tvar doc = document,\n\t\tdisplay = elemdisplay[ nodeName ];\n\n\tif ( !display ) {\n\t\tdisplay = actualDisplay( nodeName, doc );\n\n\t\t// If the simple way fails, read from inside an iframe\n\t\tif ( display === \"none\" || !display ) {\n\n\t\t\t// Use the already-created iframe if possible\n\t\t\tiframe = (iframe || jQuery( \"<iframe frameborder='0' width='0' height='0'/>\" )).appendTo( doc.documentElement );\n\n\t\t\t// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse\n\t\t\tdoc = iframe[ 0 ].contentDocument;\n\n\t\t\t// Support: IE\n\t\t\tdoc.write();\n\t\t\tdoc.close();\n\n\t\t\tdisplay = actualDisplay( nodeName, doc );\n\t\t\tiframe.detach();\n\t\t}\n\n\t\t// Store the correct default display\n\t\telemdisplay[ nodeName ] = display;\n\t}\n\n\treturn display;\n}\nvar rmargin = (/^margin/);\n\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar getStyles = function( elem ) {\n\t\t// Support: IE<=11+, Firefox<=30+ (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tif ( elem.ownerDocument.defaultView.opener ) {\n\t\t\treturn elem.ownerDocument.defaultView.getComputedStyle( elem, null );\n\t\t}\n\n\t\treturn window.getComputedStyle( elem, null );\n\t};\n\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// Support: IE9\n\t// getPropertyValue is only needed for .css('filter') (#12537)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\t}\n\n\tif ( computed ) {\n\n\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// Support: iOS < 6\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// iOS < 6 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels\n\t\t// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values\n\t\tif ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\t\t// Support: IE\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn (this.get = hookFn).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\n(function() {\n\tvar pixelPositionVal, boxSizingReliableVal,\n\t\tdocElem = document.documentElement,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE9-11+\n\t// Style of cloned element affects source element cloned (#8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tcontainer.style.cssText = \"border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;\" +\n\t\t\"position:absolute\";\n\tcontainer.appendChild( div );\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computePixelPositionAndBoxSizingReliable() {\n\t\tdiv.style.cssText =\n\t\t\t// Support: Firefox<29, Android 2.3\n\t\t\t// Vendor-prefix box-sizing\n\t\t\t\"-webkit-box-sizing:border-box;-moz-box-sizing:border-box;\" +\n\t\t\t\"box-sizing:border-box;display:block;margin-top:1%;top:1%;\" +\n\t\t\t\"border:1px;padding:1px;width:4px;position:absolute\";\n\t\tdiv.innerHTML = \"\";\n\t\tdocElem.appendChild( container );\n\n\t\tvar divStyle = window.getComputedStyle( div, null );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\t\tboxSizingReliableVal = divStyle.width === \"4px\";\n\n\t\tdocElem.removeChild( container );\n\t}\n\n\t// Support: node.js jsdom\n\t// Don't assume that getComputedStyle is a property of the global object\n\tif ( window.getComputedStyle ) {\n\t\tjQuery.extend( support, {\n\t\t\tpixelPosition: function() {\n\n\t\t\t\t// This test is executed only once but we still do memoizing\n\t\t\t\t// since we can use the boxSizingReliable pre-computing.\n\t\t\t\t// No need to check if the test was already performed, though.\n\t\t\t\tcomputePixelPositionAndBoxSizingReliable();\n\t\t\t\treturn pixelPositionVal;\n\t\t\t},\n\t\t\tboxSizingReliable: function() {\n\t\t\t\tif ( boxSizingReliableVal == null ) {\n\t\t\t\t\tcomputePixelPositionAndBoxSizingReliable();\n\t\t\t\t}\n\t\t\t\treturn boxSizingReliableVal;\n\t\t\t},\n\t\t\treliableMarginRight: function() {\n\n\t\t\t\t// Support: Android 2.3\n\t\t\t\t// Check if div with explicit width and no margin-right incorrectly\n\t\t\t\t// gets computed margin-right based on width of container. (#3333)\n\t\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\t\t// This support function is only executed once so no memoizing is needed.\n\t\t\t\tvar ret,\n\t\t\t\t\tmarginDiv = div.appendChild( document.createElement( \"div\" ) );\n\n\t\t\t\t// Reset CSS: box-sizing; display; margin; border; padding\n\t\t\t\tmarginDiv.style.cssText = div.style.cssText =\n\t\t\t\t\t// Support: Firefox<29, Android 2.3\n\t\t\t\t\t// Vendor-prefix box-sizing\n\t\t\t\t\t\"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;\" +\n\t\t\t\t\t\"box-sizing:content-box;display:block;margin:0;border:0;padding:0\";\n\t\t\t\tmarginDiv.style.marginRight = marginDiv.style.width = \"0\";\n\t\t\t\tdiv.style.width = \"1px\";\n\t\t\t\tdocElem.appendChild( container );\n\n\t\t\t\tret = !parseFloat( window.getComputedStyle( marginDiv, null ).marginRight );\n\n\t\t\t\tdocElem.removeChild( container );\n\t\t\t\tdiv.removeChild( marginDiv );\n\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t});\n\t}\n})();\n\n\n// A method for quickly swapping in/out CSS properties to get correct calculations.\njQuery.swap = function( elem, options, callback, args ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.apply( elem, args || [] );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\nvar\n\t// Swappable if display is none or starts with table except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trnumsplit = new RegExp( \"^(\" + pnum + \")(.*)$\", \"i\" ),\n\trrelNum = new RegExp( \"^([+-])=(\" + pnum + \")\", \"i\" ),\n\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t},\n\n\tcssPrefixes = [ \"Webkit\", \"O\", \"Moz\", \"ms\" ];\n\n// Return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( style, name ) {\n\n\t// Shortcut for names that are not vendor prefixed\n\tif ( name in style ) {\n\t\treturn name;\n\t}\n\n\t// Check for vendor prefixed names\n\tvar capName = name[0].toUpperCase() + name.slice(1),\n\t\torigName = name,\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in style ) {\n\t\t\treturn name;\n\t\t}\n\t}\n\n\treturn origName;\n}\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\tvar matches = rnumsplit.exec( value );\n\treturn matches ?\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {\n\tvar i = extra === ( isBorderBox ? \"border\" : \"content\" ) ?\n\t\t// If we already have the right measurement, avoid augmentation\n\t\t4 :\n\t\t// Otherwise initialize for horizontal or vertical properties\n\t\tname === \"width\" ? 1 : 0,\n\n\t\tval = 0;\n\n\tfor ( ; i < 4; i += 2 ) {\n\t\t// Both box models exclude margin, so add it if we want it\n\t\tif ( extra === \"margin\" ) {\n\t\t\tval += jQuery.css( elem, extra + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\tif ( isBorderBox ) {\n\t\t\t// border-box includes padding, so remove it if we want content\n\t\t\tif ( extra === \"content\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// At this point, extra isn't border nor margin, so remove border\n\t\t\tif ( extra !== \"margin\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t} else {\n\t\t\t// At this point, extra isn't content, so add padding\n\t\t\tval += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// At this point, extra isn't content nor padding, so add border\n\t\t\tif ( extra !== \"padding\" ) {\n\t\t\t\tval += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn val;\n}\n\nfunction getWidthOrHeight( elem, name, extra ) {\n\n\t// Start with offset property, which is equivalent to the border-box value\n\tvar valueIsBorderBox = true,\n\t\tval = name === \"width\" ? elem.offsetWidth : elem.offsetHeight,\n\t\tstyles = getStyles( elem ),\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t// Some non-html elements return undefined for offsetWidth, so check for null/undefined\n\t// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285\n\t// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668\n\tif ( val <= 0 || val == null ) {\n\t\t// Fall back to computed then uncomputed css if necessary\n\t\tval = curCSS( elem, name, styles );\n\t\tif ( val < 0 || val == null ) {\n\t\t\tval = elem.style[ name ];\n\t\t}\n\n\t\t// Computed unit is not pixels. Stop here and return.\n\t\tif ( rnumnonpx.test(val) ) {\n\t\t\treturn val;\n\t\t}\n\n\t\t// Check for style in case a browser which returns unreliable values\n\t\t// for getComputedStyle silently falls back to the reliable elem.style\n\t\tvalueIsBorderBox = isBorderBox &&\n\t\t\t( support.boxSizingReliable() || val === elem.style[ name ] );\n\n\t\t// Normalize \"\", auto, and prepare for extra\n\t\tval = parseFloat( val ) || 0;\n\t}\n\n\t// Use the active box-sizing model to add/subtract irrelevant styles\n\treturn ( val +\n\t\taugmentWidthOrHeight(\n\t\t\telem,\n\t\t\tname,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles\n\t\t)\n\t) + \"px\";\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem, hidden,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tvalues[ index ] = data_priv.get( elem, \"olddisplay\" );\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\t\t\t// Reset the inline display of this element to learn if it is\n\t\t\t// being hidden by cascaded rules or not\n\t\t\tif ( !values[ index ] && display === \"none\" ) {\n\t\t\t\telem.style.display = \"\";\n\t\t\t}\n\n\t\t\t// Set elements which have been overridden with display: none\n\t\t\t// in a stylesheet to whatever the default browser style is\n\t\t\t// for such an element\n\t\t\tif ( elem.style.display === \"\" && isHidden( elem ) ) {\n\t\t\t\tvalues[ index ] = data_priv.access( elem, \"olddisplay\", defaultDisplay(elem.nodeName) );\n\t\t\t}\n\t\t} else {\n\t\t\thidden = isHidden( elem );\n\n\t\t\tif ( display !== \"none\" || !hidden ) {\n\t\t\t\tdata_priv.set( elem, \"olddisplay\", hidden ? display : jQuery.css( elem, \"display\" ) );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of most of the elements in a second loop\n\t// to avoid the constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( !show || elem.style.display === \"none\" || elem.style.display === \"\" ) {\n\t\t\telem.style.display = show ? values[ index ] || \"\" : \"none\";\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.extend({\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {\n\t\t\"float\": \"cssFloat\"\n\t},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = jQuery.camelCase( name ),\n\t\t\tstyle = elem.style;\n\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && (ret = rrelNum.exec( value )) ) {\n\t\t\t\tvalue = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (#7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number, add 'px' to the (except for certain CSS properties)\n\t\t\tif ( type === \"number\" && !jQuery.cssNumber[ origName ] ) {\n\t\t\t\tvalue += \"px\";\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !(\"set\" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {\n\t\t\t\tstyle[ name ] = value;\n\t\t\t}\n\n\t\t} else {\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = jQuery.camelCase( name );\n\n\t\t// Make sure that we're working with the right name\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || jQuery.isNumeric( num ) ? num || 0 : val;\n\t\t}\n\t\treturn val;\n\t}\n});\n\njQuery.each([ \"height\", \"width\" ], function( i, name ) {\n\tjQuery.cssHooks[ name ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) && elem.offsetWidth === 0 ?\n\t\t\t\t\tjQuery.swap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\t\t\t\t\t}) :\n\t\t\t\t\tgetWidthOrHeight( elem, name, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar styles = extra && getStyles( elem );\n\t\t\treturn setPositiveNumber( elem, value, extra ?\n\t\t\t\taugmentWidthOrHeight(\n\t\t\t\t\telem,\n\t\t\t\t\tname,\n\t\t\t\t\textra,\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\t\tstyles\n\t\t\t\t) : 0\n\t\t\t);\n\t\t}\n\t};\n});\n\n// Support: Android 2.3\njQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn jQuery.swap( elem, { \"display\": \"inline-block\" },\n\t\t\t\tcurCSS, [ elem, \"marginRight\" ] );\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each({\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split(\" \") : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( !rmargin.test( prefix ) ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n});\n\njQuery.fn.extend({\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( jQuery.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t},\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( isHidden( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t});\n\t}\n});\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || \"swing\";\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\tif ( tween.elem[ tween.prop ] != null &&\n\t\t\t\t(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE9\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t}\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back Compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, timerId,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trfxnum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" ),\n\trrun = /queueHooks$/,\n\tanimationPrefilters = [ defaultPrefilter ],\n\ttweeners = {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value ),\n\t\t\t\ttarget = tween.cur(),\n\t\t\t\tparts = rfxnum.exec( value ),\n\t\t\t\tunit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t\t\t// Starting value computation is required for potential unit mismatches\n\t\t\t\tstart = ( jQuery.cssNumber[ prop ] || unit !== \"px\" && +target ) &&\n\t\t\t\t\trfxnum.exec( jQuery.css( tween.elem, prop ) ),\n\t\t\t\tscale = 1,\n\t\t\t\tmaxIterations = 20;\n\n\t\t\tif ( start && start[ 3 ] !== unit ) {\n\t\t\t\t// Trust units reported by jQuery.css\n\t\t\t\tunit = unit || start[ 3 ];\n\n\t\t\t\t// Make sure we update the tween properties later on\n\t\t\t\tparts = parts || [];\n\n\t\t\t\t// Iteratively approximate from a nonzero starting point\n\t\t\t\tstart = +target || 1;\n\n\t\t\t\tdo {\n\t\t\t\t\t// If previous iteration zeroed out, double until we get *something*.\n\t\t\t\t\t// Use string for doubling so we don't accidentally see scale as unchanged below\n\t\t\t\t\tscale = scale || \".5\";\n\n\t\t\t\t\t// Adjust and apply\n\t\t\t\t\tstart = start / scale;\n\t\t\t\t\tjQuery.style( tween.elem, prop, start + unit );\n\n\t\t\t\t// Update scale, tolerating zero or NaN from tween.cur(),\n\t\t\t\t// break the loop if scale is unchanged or perfect, or if we've just had enough\n\t\t\t\t} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );\n\t\t\t}\n\n\t\t\t// Update tween properties\n\t\t\tif ( parts ) {\n\t\t\t\tstart = tween.start = +start || +target || 0;\n\t\t\t\ttween.unit = unit;\n\t\t\t\t// If a +=/-= token was provided, we're doing a relative animation\n\t\t\t\ttween.end = parts[ 1 ] ?\n\t\t\t\t\tstart + ( parts[ 1 ] + 1 ) * parts[ 2 ] :\n\t\t\t\t\t+parts[ 2 ];\n\t\t\t}\n\n\t\t\treturn tween;\n\t\t} ]\n\t};\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\tsetTimeout(function() {\n\t\tfxNow = undefined;\n\t});\n\treturn ( fxNow = jQuery.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4 ; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( tweeners[ prop ] || [] ).concat( tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( (tween = collection[ index ].call( animation, prop, value )) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\t/* jshint validthis: true */\n\tvar prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHidden( elem ),\n\t\tdataShow = data_priv.get( elem, \"fxshow\" );\n\n\t// Handle queue: false promises\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always(function() {\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always(function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t// Height/width overflow pass\n\tif ( elem.nodeType === 1 && ( \"height\" in props || \"width\" in props ) ) {\n\t\t// Make sure that nothing sneaks out\n\t\t// Record all 3 overflow attributes because IE9-10 do not\n\t\t// change the overflow attribute when overflowX and\n\t\t// overflowY are set to the same value\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Set display property to inline-block for height/width\n\t\t// animations on inline elements that are having width/height animated\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\n\t\t// Test default display if display is currently \"none\"\n\t\tcheckDisplay = display === \"none\" ?\n\t\t\tdata_priv.get( elem, \"olddisplay\" ) || defaultDisplay( elem.nodeName ) : display;\n\n\t\tif ( checkDisplay === \"inline\" && jQuery.css( elem, \"float\" ) === \"none\" ) {\n\t\t\tstyle.display = \"inline-block\";\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always(function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t});\n\t}\n\n\t// show/hide pass\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.exec( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\n\t\t// Any non-fx value stops us from restoring the original display value\n\t\t} else {\n\t\t\tdisplay = undefined;\n\t\t}\n\t}\n\n\tif ( !jQuery.isEmptyObject( orig ) ) {\n\t\tif ( dataShow ) {\n\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\thidden = dataShow.hidden;\n\t\t\t}\n\t\t} else {\n\t\t\tdataShow = data_priv.access( elem, \"fxshow\", {} );\n\t\t}\n\n\t\t// Store state if its toggle - enables .stop().toggle() to \"reverse\"\n\t\tif ( toggle ) {\n\t\t\tdataShow.hidden = !hidden;\n\t\t}\n\t\tif ( hidden ) {\n\t\t\tjQuery( elem ).show();\n\t\t} else {\n\t\t\tanim.done(function() {\n\t\t\t\tjQuery( elem ).hide();\n\t\t\t});\n\t\t}\n\t\tanim.done(function() {\n\t\t\tvar prop;\n\n\t\t\tdata_priv.remove( elem, \"fxshow\" );\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t}\n\t\t});\n\t\tfor ( prop in orig ) {\n\t\t\ttween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\n\t\t\tif ( !( prop in dataShow ) ) {\n\t\t\t\tdataShow[ prop ] = tween.start;\n\t\t\t\tif ( hidden ) {\n\t\t\t\t\ttween.end = tween.start;\n\t\t\t\t\ttween.start = prop === \"width\" || prop === \"height\" ? 1 : 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t// If this is a noop like .hide().hide(), restore an overwritten display value\n\t} else if ( (display === \"none\" ? defaultDisplay( elem.nodeName ) : display) === \"inline\" ) {\n\t\tstyle.display = display;\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = jQuery.camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( jQuery.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = animationPrefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t}),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\t\t\t\t// Support: Android 2.3\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ]);\n\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t} else {\n\t\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tanimation = deferred.promise({\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, { specialEasing: {} }, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length ; index++ ) {\n\t\tresult = animationPrefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( jQuery.isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t})\n\t);\n\n\t// attach callbacks from options\n\treturn animation.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweener: function( props, callback ) {\n\t\tif ( jQuery.isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.split(\" \");\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length ; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\ttweeners[ prop ] = tweeners[ prop ] || [];\n\t\t\ttweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tanimationPrefilters.unshift( callback );\n\t\t} else {\n\t\t\tanimationPrefilters.push( callback );\n\t\t}\n\t}\n});\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tjQuery.isFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\n\t};\n\n\topt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \"number\" ? opt.duration :\n\t\topt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( jQuery.isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend({\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHidden ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate({ opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || data_priv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = data_priv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t});\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tvar index,\n\t\t\t\tdata = data_priv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t});\n\t}\n});\n\njQuery.each([ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n});\n\n// Generate shortcuts for custom animations\njQuery.each({\n\tslideDown: genFx(\"show\"),\n\tslideUp: genFx(\"hide\"),\n\tslideToggle: genFx(\"toggle\"),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n});\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = jQuery.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\t\t// Checks the timer has not already been removed\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tif ( timer() ) {\n\t\tjQuery.fx.start();\n\t} else {\n\t\tjQuery.timers.pop();\n\t}\n};\n\njQuery.fx.interval = 13;\n\njQuery.fx.start = function() {\n\tif ( !timerId ) {\n\t\ttimerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );\n\t}\n};\n\njQuery.fx.stop = function() {\n\tclearInterval( timerId );\n\ttimerId = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\tclearTimeout( timeout );\n\t\t};\n\t});\n};\n\n\n(function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: iOS<=5.1, Android<=4.2+\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE<=11+\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: Android<=2.3\n\t// Options inside disabled selects are incorrectly marked as disabled\n\tselect.disabled = true;\n\tsupport.optDisabled = !opt.disabled;\n\n\t// Support: IE<=11+\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n})();\n\n\nvar nodeHook, boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend({\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tattr: function( elem, name, value ) {\n\t\tvar hooks, ret,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set attributes on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === strundefined ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// All attributes are lowercase\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\tname = name.toLowerCase();\n\t\t\thooks = jQuery.attrHooks[ name ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\n\t\t\t} else if ( hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t} else if ( hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ) {\n\t\t\treturn ret;\n\n\t\t} else {\n\t\t\tret = jQuery.find.attr( elem, name );\n\n\t\t\t// Non-existent attributes return null, we normalize to undefined\n\t\t\treturn ret == null ?\n\t\t\t\tundefined :\n\t\t\t\tret;\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name, propName,\n\t\t\ti = 0,\n\t\t\tattrNames = value && value.match( rnotwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( (name = attrNames[i++]) ) {\n\t\t\t\tpropName = jQuery.propFix[ name ] || name;\n\n\t\t\t\t// Boolean attributes get special treatment (#10870)\n\t\t\t\tif ( jQuery.expr.match.bool.test( name ) ) {\n\t\t\t\t\t// Set corresponding property to false\n\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t}\n\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tjQuery.nodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle;\n\t\tif ( !isXML ) {\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ name ];\n\t\t\tattrHandle[ name ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tname.toLowerCase() :\n\t\t\t\tnull;\n\t\t\tattrHandle[ name ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n});\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i;\n\njQuery.fn.extend({\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each(function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t},\n\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks, notxml,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n\t\tif ( notxml ) {\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\treturn hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?\n\t\t\t\tret :\n\t\t\t\t( elem[ name ] = value );\n\n\t\t} else {\n\t\t\treturn hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ?\n\t\t\t\tret :\n\t\t\t\telem[ name ];\n\t\t}\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\t\t\t\treturn elem.hasAttribute( \"tabindex\" ) || rfocusable.test( elem.nodeName ) || elem.href ?\n\t\t\t\t\telem.tabIndex :\n\t\t\t\t\t-1;\n\t\t\t}\n\t\t}\n\t}\n});\n\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t};\n}\n\njQuery.each([\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n});\n\n\n\n\nvar rclass = /[\\t\\r\\n\\f]/g;\n\njQuery.fn.extend({\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j, finalValue,\n\t\t\tproceed = typeof value === \"string\" && value,\n\t\t\ti = 0,\n\t\t\tlen = this.length;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, this.className ) );\n\t\t\t});\n\t\t}\n\n\t\tif ( proceed ) {\n\t\t\t// The disjunction here is for better compressibility (see removeClass)\n\t\t\tclasses = ( value || \"\" ).match( rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\" \"\n\t\t\t\t);\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = jQuery.trim( cur );\n\t\t\t\t\tif ( elem.className !== finalValue ) {\n\t\t\t\t\t\telem.className = finalValue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j, finalValue,\n\t\t\tproceed = arguments.length === 0 || typeof value === \"string\" && value,\n\t\t\ti = 0,\n\t\t\tlen = this.length;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, this.className ) );\n\t\t\t});\n\t\t}\n\t\tif ( proceed ) {\n\t\t\tclasses = ( value || \"\" ).match( rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\"\"\n\t\t\t\t);\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) >= 0 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = value ? jQuery.trim( cur ) : \"\";\n\t\t\t\t\tif ( elem.className !== finalValue ) {\n\t\t\t\t\t\telem.className = finalValue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value;\n\n\t\tif ( typeof stateVal === \"boolean\" && type === \"string\" ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( type === \"string\" ) {\n\t\t\t\t// Toggle individual class names\n\t\t\t\tvar className,\n\t\t\t\t\ti = 0,\n\t\t\t\t\tself = jQuery( this ),\n\t\t\t\t\tclassNames = value.match( rnotwhite ) || [];\n\n\t\t\t\twhile ( (className = classNames[ i++ ]) ) {\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( type === strundefined || type === \"boolean\" ) {\n\t\t\t\tif ( this.className ) {\n\t\t\t\t\t// store className if set\n\t\t\t\t\tdata_priv.set( this, \"__className__\", this.className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tthis.className = this.className || value === false ? \"\" : data_priv.get( this, \"__className__\" ) || \"\";\n\t\t\t}\n\t\t});\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className = \" \" + selector + \" \",\n\t\t\ti = 0,\n\t\t\tl = this.length;\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tif ( this[i].nodeType === 1 && (\" \" + this[i].className + \" \").replace(rclass, \" \").indexOf( className ) >= 0 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n});\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend({\n\tval: function( value ) {\n\t\tvar hooks, ret, isFunction,\n\t\t\telem = this[0];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, \"value\" )) !== undefined ) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\treturn typeof ret === \"string\" ?\n\t\t\t\t\t// Handle most common string cases\n\t\t\t\t\tret.replace(rreturn, \"\") :\n\t\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\t\tret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tisFunction = jQuery.isFunction( value );\n\n\t\treturn this.each(function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( jQuery.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !(\"set\" in hooks) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\t\t\t\t\t// Support: IE10-11+\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\tjQuery.trim( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\" || index < 0,\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length,\n\t\t\t\t\ti = index < 0 ?\n\t\t\t\t\t\tmax :\n\t\t\t\t\t\tone ? index : 0;\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// IE6-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t( support.optDisabled ? !option.disabled : option.getAttribute( \"disabled\" ) === null ) &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\t\t\t\t\tif ( (option.selected = jQuery.inArray( option.value, values ) >= 0) ) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Radios and checkboxes getter/setter\njQuery.each([ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( jQuery.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute(\"value\") === null ? \"on\" : elem.value;\n\t\t};\n\t}\n});\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\njQuery.each( (\"blur focus focusin focusout load resize scroll unload click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup error contextmenu\").split(\" \"), function( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n});\n\njQuery.fn.extend({\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t},\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ? this.off( selector, \"**\" ) : this.off( types, selector || \"**\", fn );\n\t}\n});\n\n\nvar nonce = jQuery.now();\n\nvar rquery = (/\\?/);\n\n\n\n// Support: Android 2.3\n// Workaround failure to string-cast null input\njQuery.parseJSON = function( data ) {\n\treturn JSON.parse( data + \"\" );\n};\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml, tmp;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE9\n\ttry {\n\t\ttmp = new DOMParser();\n\t\txml = tmp.parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {\n\t\txml = undefined;\n\t}\n\n\tif ( !xml || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\tjQuery.error( \"Invalid XML: \" + data );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trhash = /#.*$/,\n\trts = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\trurl = /^([\\w.+-]+:)(?:\\/\\/(?:[^\\/?#]*@|)([^\\/?#:]*)(?::(\\d+)|)|)/,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t * - BEFORE asking for a transport\n\t * - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Document location\n\tajaxLocation = window.location.href,\n\n\t// Segment location into parts\n\tajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];\n\n\t\tif ( jQuery.isFunction( func ) ) {\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( (dataType = dataTypes[i++]) ) {\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[0] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t});\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader(\"Content-Type\");\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[0] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s[ \"throws\" ] ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn { state: \"parsererror\", error: conv ? e : \"No conversion from \" + prev + \" to \" + current };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend({\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: ajaxLocation,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /xml/,\n\t\t\thtml: /html/,\n\t\t\tjson: /json/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": jQuery.parseJSON,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\t\t\t// Cross-domain detection vars\n\t\t\tparts,\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\t\t\t// Loop variable\n\t\t\ti,\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks(\"once memory\"),\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\t\t\t// The jqXHR state\n\t\t\tstate = 0,\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( state === 2 ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( (match = rheaders.exec( responseHeadersString )) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[1].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn state === 2 ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tvar lname = name.toLowerCase();\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\tname = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\t// Lazy-add the new callback in a way that preserves old ones\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR ).complete = completeDeferred.add;\n\t\tjqXHR.success = jqXHR.done;\n\t\tjqXHR.error = jqXHR.fail;\n\n\t\t// Remove hash character (#7531: and string promotion)\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || ajaxLocation ) + \"\" ).replace( rhash, \"\" )\n\t\t\t.replace( rprotocol, ajaxLocParts[ 1 ] + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = jQuery.trim( s.dataType || \"*\" ).toLowerCase().match( rnotwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when we have a protocol:host:port mismatch\n\t\tif ( s.crossDomain == null ) {\n\t\t\tparts = rurl.exec( s.url.toLowerCase() );\n\t\t\ts.crossDomain = !!( parts &&\n\t\t\t\t( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||\n\t\t\t\t\t( parts[ 3 ] || ( parts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) !==\n\t\t\t\t\t\t( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) )\n\t\t\t);\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( state === 2 ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger(\"ajaxStart\");\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\tcacheURL = s.url;\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// If data is available, append data to url\n\t\t\tif ( s.data ) {\n\t\t\t\tcacheURL = ( s.url += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data );\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add anti-cache in url if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\ts.url = rts.test( cacheURL ) ?\n\n\t\t\t\t\t// If there is already a '_' parameter, set its value\n\t\t\t\t\tcacheURL.replace( rts, \"$1_=\" + nonce++ ) :\n\n\t\t\t\t\t// Otherwise add one to the end\n\t\t\t\t\tcacheURL + ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + nonce++;\n\t\t\t}\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tfor ( i in { success: 1, error: 1, complete: 1 } ) {\n\t\t\tjqXHR[ i ]( s[ i ] );\n\t\t}\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = setTimeout(function() {\n\t\t\t\t\tjqXHR.abort(\"timeout\");\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tstate = 1;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\t\t\t\t// Propagate exception as error if not done\n\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\tdone( -1, e );\n\t\t\t\t// Simply rethrow otherwise\n\t\t\t\t} else {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Called once\n\t\t\tif ( state === 2 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// State is \"done\" now\n\t\t\tstate = 2;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\tclearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"Last-Modified\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"etag\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger(\"ajaxStop\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n});\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\treturn jQuery.ajax({\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t});\n\t};\n});\n\n\njQuery._evalUrl = function( url ) {\n\treturn jQuery.ajax({\n\t\turl: url,\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tasync: false,\n\t\tglobal: false,\n\t\t\"throws\": true\n\t});\n};\n\n\njQuery.fn.extend({\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).wrapAll( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\tif ( this[ 0 ] ) {\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map(function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t}).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t});\n\t},\n\n\twrap: function( html ) {\n\t\tvar isFunction = jQuery.isFunction( html );\n\n\t\treturn this.each(function( i ) {\n\t\t\tjQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );\n\t\t});\n\t},\n\n\tunwrap: function() {\n\t\treturn this.parent().each(function() {\n\t\t\tif ( !jQuery.nodeName( this, \"body\" ) ) {\n\t\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t\t}\n\t\t}).end();\n\t}\n});\n\n\njQuery.expr.filters.hidden = function( elem ) {\n\t// Support: Opera <= 12.12\n\t// Opera reports offsetWidths and offsetHeights less than zero on some elements\n\treturn elem.offsetWidth <= 0 && elem.offsetHeight <= 0;\n};\njQuery.expr.filters.visible = function( elem ) {\n\treturn !jQuery.expr.filters.hidden( elem );\n};\n\n\n\n\nvar r20 = /%20/g,\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( jQuery.isArray( obj ) ) {\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams( prefix + \"[\" + ( typeof v === \"object\" ? i : \"\" ) + \"]\", v, traditional, add );\n\t\t\t}\n\t\t});\n\n\t} else if ( !traditional && jQuery.type( obj ) === \"object\" ) {\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, value ) {\n\t\t\t// If value is a function, invoke it and return its value\n\t\t\tvalue = jQuery.isFunction( value ) ? value() : ( value == null ? \"\" : value );\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" + encodeURIComponent( value );\n\t\t};\n\n\t// Set traditional to true for jQuery <= 1.3.2 behavior.\n\tif ( traditional === undefined ) {\n\t\ttraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t});\n\n\t} else {\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" ).replace( r20, \"+\" );\n};\n\njQuery.fn.extend({\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map(function() {\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t})\n\t\t.filter(function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t})\n\t\t.map(function( i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\treturn val == null ?\n\t\t\t\tnull :\n\t\t\t\tjQuery.isArray( val ) ?\n\t\t\t\t\tjQuery.map( val, function( val ) {\n\t\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t\t}) :\n\t\t\t\t\t{ name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t}).get();\n\t}\n});\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new XMLHttpRequest();\n\t} catch( e ) {}\n};\n\nvar xhrId = 0,\n\txhrCallbacks = {},\n\txhrSuccessStatus = {\n\t\t// file protocol always yields status code 0, assume 200\n\t\t0: 200,\n\t\t// Support: IE9\n\t\t// #1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\n// Support: IE9\n// Open requests must be manually aborted on unload (#5280)\n// See https://support.microsoft.com/kb/2856746 for more info\nif ( window.attachEvent ) {\n\twindow.attachEvent( \"onunload\", function() {\n\t\tfor ( var key in xhrCallbacks ) {\n\t\t\txhrCallbacks[ key ]();\n\t\t}\n\t});\n}\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport(function( options ) {\n\tvar callback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr(),\n\t\t\t\t\tid = ++xhrId;\n\n\t\t\t\txhr.open( options.type, options.url, options.async, options.username, options.password );\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[\"X-Requested-With\"] ) {\n\t\t\t\t\theaders[\"X-Requested-With\"] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tdelete xhrCallbacks[ id ];\n\t\t\t\t\t\t\tcallback = xhr.onload = xhr.onerror = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\t// file: protocol always yields status 0; see #8605, #14207\n\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\t\t\t\t\t\t\t\t\t// Support: IE9\n\t\t\t\t\t\t\t\t\t// Accessing binary-data responseText throws an exception\n\t\t\t\t\t\t\t\t\t// (#11426)\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText === \"string\" ? {\n\t\t\t\t\t\t\t\t\t\ttext: xhr.responseText\n\t\t\t\t\t\t\t\t\t} : undefined,\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\txhr.onerror = callback(\"error\");\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = xhrCallbacks[ id ] = callback(\"abort\");\n\n\t\t\t\ttry {\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\t\t\t\t\t// #14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n});\n\n\n\n\n// Install script dataType\njQuery.ajaxSetup({\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /(?:java|ecma)script/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n});\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n});\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery(\"<script>\").prop({\n\t\t\t\t\tasync: true,\n\t\t\t\t\tcharset: s.scriptCharset,\n\t\t\t\t\tsrc: s.url\n\t\t\t\t}).on(\n\t\t\t\t\t\"load error\",\n\t\t\t\t\tcallback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n});\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup({\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n});\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" && !( s.contentType || \"\" ).indexOf(\"application/x-www-form-urlencoded\") && rjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[\"script json\"] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always(function() {\n\t\t\t// Restore preexisting value\n\t\t\twindow[ callbackName ] = overwritten;\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\t\t\t\t// make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && jQuery.isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t});\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n});\n\n\n\n\n// data: string of html\n// context (optional): If specified, the fragment will be created in this context, defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\tcontext = context || document;\n\n\tvar parsed = rsingleTag.exec( data ),\n\t\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[1] ) ];\n\t}\n\n\tparsed = jQuery.buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n// Keep a copy of the old load method\nvar _load = jQuery.fn.load;\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tif ( typeof url !== \"string\" && _load ) {\n\t\treturn _load.apply( this, arguments );\n\t}\n\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf(\" \");\n\n\tif ( off >= 0 ) {\n\t\tselector = jQuery.trim( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( jQuery.isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax({\n\t\t\turl: url,\n\n\t\t\t// if \"type\" variable is undefined, then \"GET\" method will be used\n\t\t\ttype: type,\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t}).done(function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery(\"<div>\").append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t}).complete( callback && function( jqXHR, status ) {\n\t\t\tself.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t});\n\t}\n\n\treturn this;\n};\n\n\n\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( [ \"ajaxStart\", \"ajaxStop\", \"ajaxComplete\", \"ajaxError\", \"ajaxSuccess\", \"ajaxSend\" ], function( i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n});\n\n\n\n\njQuery.expr.filters.animated = function( elem ) {\n\treturn jQuery.grep(jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t}).length;\n};\n\n\n\n\nvar docElem = window.document.documentElement;\n\n/**\n * Gets a window from an element\n */\nfunction getWindow( elem ) {\n\treturn jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;\n}\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf(\"auto\") > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( jQuery.isFunction( options ) ) {\n\t\t\toptions = options.call( elem, i, curOffset );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend({\n\toffset: function( options ) {\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each(function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t});\n\t\t}\n\n\t\tvar docElem, win,\n\t\t\telem = this[ 0 ],\n\t\t\tbox = { top: 0, left: 0 },\n\t\t\tdoc = elem && elem.ownerDocument;\n\n\t\tif ( !doc ) {\n\t\t\treturn;\n\t\t}\n\n\t\tdocElem = doc.documentElement;\n\n\t\t// Make sure it's not a disconnected DOM node\n\t\tif ( !jQuery.contains( docElem, elem ) ) {\n\t\t\treturn box;\n\t\t}\n\n\t\t// Support: BlackBerry 5, iOS 3 (original iPhone)\n\t\t// If we don't have gBCR, just use 0,0 rather than error\n\t\tif ( typeof elem.getBoundingClientRect !== strundefined ) {\n\t\t\tbox = elem.getBoundingClientRect();\n\t\t}\n\t\twin = getWindow( doc );\n\t\treturn {\n\t\t\ttop: box.top + win.pageYOffset - docElem.clientTop,\n\t\t\tleft: box.left + win.pageXOffset - docElem.clientLeft\n\t\t};\n\t},\n\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\t\t\t// Assume getBoundingClientRect is there when computed position is fixed\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\t// Get *real* offsetParent\n\t\t\toffsetParent = this.offsetParent();\n\n\t\t\t// Get correct offsets\n\t\t\toffset = this.offset();\n\t\t\tif ( !jQuery.nodeName( offsetParent[ 0 ], \"html\" ) ) {\n\t\t\t\tparentOffset = offsetParent.offset();\n\t\t\t}\n\n\t\t\t// Add offsetParent borders\n\t\t\tparentOffset.top += jQuery.css( offsetParent[ 0 ], \"borderTopWidth\", true );\n\t\t\tparentOffset.left += jQuery.css( offsetParent[ 0 ], \"borderLeftWidth\", true );\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\toffsetParent: function() {\n\t\treturn this.map(function() {\n\t\t\tvar offsetParent = this.offsetParent || docElem;\n\n\t\t\twhile ( offsetParent && ( !jQuery.nodeName( offsetParent, \"html\" ) && jQuery.css( offsetParent, \"position\" ) === \"static\" ) ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || docElem;\n\t\t});\n\t}\n});\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\t\t\tvar win = getWindow( elem );\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : window.pageXOffset,\n\t\t\t\t\ttop ? val : window.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length, null );\n\t};\n});\n\n// Support: Safari<7+, Chrome<37+\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://code.google.com/p/chromium/issues/detail?id=229280\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n});\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name }, function( defaultExtra, funcName ) {\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( jQuery.isWindow( elem ) ) {\n\t\t\t\t\t// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there\n\t\t\t\t\t// isn't a whole lot we can do. See pull request at this URL for discussion:\n\t\t\t\t\t// https://github.com/jquery/jquery/pull/764\n\t\t\t\t\treturn elem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable, null );\n\t\t};\n\t});\n});\n\n\n// The number of elements contained in the matched element set\njQuery.fn.size = function() {\n\treturn this.length;\n};\n\njQuery.fn.andSelf = jQuery.fn.addBack;\n\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t});\n}\n\n\n\n\nvar\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( typeof noGlobal === strundefined ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n\n}));\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/jquery/dist/jquery.js\n ** module id = 161\n ** module chunks = 2\n **/"],"sourceRoot":""} \ No newline at end of file diff --git a/docker-common.yml b/docker-common.yml new file mode 100644 index 0000000..a8fe992 --- /dev/null +++ b/docker-common.yml @@ -0,0 +1,14 @@ +code: + volumes: + - .:/code + working_dir: /code + env_file: + - ./code.env + - ./code.local.env + +node: + build: ./dockerfiles/node + working_dir: /code + env_file: + - ./code.env + - ./code.local.env diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..4d0760d --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,46 @@ +web: + extends: + file: docker-common.yml + service: code + build: ./dockerfiles/python + command: gunicorn -b 0.0.0.0:8200 --reload app:app + ports: + - "8200:8200" + links: + - "mysql" + - "memcached" + - "redis" + +webpack: + extends: + file: docker-common.yml + service: node + command: bash -c "cp -R /node_modules /code; npm run build; npm run watch" + volumes_from: + - web + +grunt: + extends: + file: docker-common.yml + service: node + command: bash -c "cp -R /node_modules /code; grunt ozma compass:dev; grunt watch" + volumes_from: + - web + +mysql: + build: ./dockerfiles/mysql + env_file: + - ./code.env + - ./code.local.env + ports: + - "3306:3306" + +memcached: + image: memcached:1.4 + ports: + - "11211:11211" + +redis: + image: redis:3.0 + ports: + - "6379:6379" diff --git a/dockerfiles/mysql/Dockerfile b/dockerfiles/mysql/Dockerfile new file mode 100644 index 0000000..cd1aebd --- /dev/null +++ b/dockerfiles/mysql/Dockerfile @@ -0,0 +1,3 @@ +FROM mysql:5.5 + +ADD charset.cnf /etc/mysql/conf.d/charset.cnf diff --git a/dockerfiles/mysql/charset.cnf b/dockerfiles/mysql/charset.cnf new file mode 100644 index 0000000..595a102 --- /dev/null +++ b/dockerfiles/mysql/charset.cnf @@ -0,0 +1,11 @@ +[client] +default-character-set=utf8 + +[mysql] +default-character-set=utf8 + +[mysqld] +skip-character-set-client-handshake +character-set-server=utf8 +collation-server=utf8_general_ci +init-connect=SET NAMES utf8 diff --git a/dockerfiles/node/Dockerfile b/dockerfiles/node/Dockerfile new file mode 100644 index 0000000..6e15c17 --- /dev/null +++ b/dockerfiles/node/Dockerfile @@ -0,0 +1,16 @@ +FROM node:0.10 + +RUN apt-get update && apt-get install -y --no-install-recommends \ + ruby-dev \ + rubygems +RUN gem install compass -V + +RUN mkdir /code \ + /node_modules +ADD package.json /code/package.json + +WORKDIR /code +RUN npm install \ + && cp -R node_modules / + +ENV PATH=/code/node_modules/.bin:/code/node_modules/grunt-cli/bin:${PATH} diff --git a/dockerfiles/node/package.json b/dockerfiles/node/package.json new file mode 100644 index 0000000..8514008 --- /dev/null +++ b/dockerfiles/node/package.json @@ -0,0 +1,45 @@ +{ + "name": "code", + "version": "0.0.1", + "description": "Dependencies for code grunt build", + "scripts": { + "build": "webpack --progress --colors", + "watch": "webpack --watch --colors", + "start": "webpack && gunicorn -w 2 -b 0.0.0.0:8200 app:app", + "server": "gunicorn -w 2 -b 0.0.0.0:8200 app:app" + }, + "dependencies": { + "grunt-contrib-clean": "~0.4.0", + "grunt-contrib-watch": "~0.2.0", + "grunt-contrib-compass": "~0.1.2", + "grunt-contrib-copy": "~0.4.0", + "grunt-contrib-uglify": "~0.1.1", + "grunt-ozjs": "~0.3.0", + "react": "~0.14.2", + "react-dom": "~0.14.2", + "classnames": "~2.2.0", + "react-router-component": "~0.28.0" + }, + "devDependencies": { + "grunt": "~0.4.0", + "grunt-cli": "~0.1.6", + "grunt-contrib-compass": "~0.1.3", + "webpack": "~1.12.2", + "css-loader": "~0.21.0", + "extract-text-webpack-plugin": "~0.8.2", + "file-loader": "~0.8.4", + "sass-loader": "~3.1.1", + "node-sass": "~3.4.1", + "underscore": "~1.8.3", + "jquery": "~2.1.4", + "babel-core": "^5.8.22", + "babel-loader": "^5.3.2", + "babelify": "^6.2.0" + }, + "repository": { + "type": "git", + "url": "http://code.dapps.douban.com/code.git" + }, + "author": "huanghuang@douban.com", + "license": "BSD" +} diff --git a/dockerfiles/python/Dockerfile b/dockerfiles/python/Dockerfile new file mode 100644 index 0000000..67eed83 --- /dev/null +++ b/dockerfiles/python/Dockerfile @@ -0,0 +1,11 @@ +FROM python:2.7 + +ENV PYTHONUNBUFFERED 1 + +RUN mkdir /code \ + /pip-src +WORKDIR /code +ADD requirements.txt /code/requirements.txt + +RUN pip install cython \ + && pip install -r requirements.txt --src=/pip-src diff --git a/dockerfiles/python/requirements.txt b/dockerfiles/python/requirements.txt new file mode 100644 index 0000000..21953a8 --- /dev/null +++ b/dockerfiles/python/requirements.txt @@ -0,0 +1,37 @@ +-e git+https://github.com/qingfeng/MySQLdb1@MySQL-python-1.2.4#egg=MySQL-python +Mako==0.9.0 +gevent==1.0.2 +gunicorn==19.4.1 +pytest==2.5.0 +wsgiauth==0.1 +pytz==2013.8 +Werkzeug==0.9.4 +celery==3.1.18 +redis==2.10.3 +blinker==1.4 +PyYAML==3.11 +Sphinx==1.3.1 +PyRSS2Gen==1.1 +requests==2.7.0 +python-dateutil==2.1 +oauth2==1.5.211 +Trolly==0.1.0 +bcrypt==2.0.0 +-e git+https://github.com/qingfeng/misaka@2fbe52692e8f304eea9d8925fd2a857916ff0ea5#egg=misaka +mikoto==0.0.4 +WebTest==2.0.20 +mock==1.3.0 +nose==1.3.7 +docutils==0.12 +-e git+https://github.com/douban/sina.git@fd90a60150545bafd491dfd632d0f8212ae4f622#egg=sina +-e git+https://github.com/douban/douban-utils.git@5ca697545da191dab3fbe308e6b6776d8da83bd5#egg=DoubanUtils +-e git+https://github.com/douban/douban-sqlstore.git@d7136b7cac1075f0b285e8c763af2e85124f8b76#egg=DoubanSQLStore +-e git+https://github.com/dongweiming/douban-mc.git@5a0a21cdb73a448eb09a1b657ad80d4941ddb404#egg=DoubanMC +-e git+https://github.com/douban/douban-orz.git@208b48177dc847ef2afdadfda302868c39797bdf#egg=ORZ +-e git+https://github.com/douban/douban-quixote.git@20cda948580802ee4205b72fe46728de9dda5253#egg=Quixote +-e git+https://github.com/douban/pygit2.git@c7b13237e9934b5620cf0c351ae7eaea7d14ffc3#egg=pygit2 +-e git+https://github.com/douban/ellen.git@e092eddd933a4676c53f016d11782897807f873a#egg=ellen +-e git+https://github.com/douban/libmc.git@06b27e8bf2ae7f75d9817ba917f705c471e45028#egg=libmc +kombu==3.0.33 +billiard==3.3.0.22 +paramiko==1.16.0 diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000..407291f Binary files /dev/null and b/favicon.ico differ diff --git a/vilya/tests/__init__.py b/hub/__init__.py similarity index 100% rename from vilya/tests/__init__.py rename to hub/__init__.py diff --git a/hub/hooks/post-receive b/hub/hooks/post-receive new file mode 100755 index 0000000..5fcb76e --- /dev/null +++ b/hub/hooks/post-receive @@ -0,0 +1,46 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- +# +# This code is copyright (c) 2008 by Jack Moffitt jack@metajack.im +# and is available under the GPLv3. + +import os +import sys +import urllib +import urllib2 +import json + + +PROJECT_NAME = os.path.realpath('.').split('/permdir/')[1][:-4] +CODE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))) +sys.path.insert(0, CODE_DIR) +sys.path.append(CODE_DIR + "/venv/src/pygit2") +from config import DOMAIN + + +def http_post(url, data): + payload = json.dumps(data) + try: + u = urllib2.urlopen(url, + urllib.urlencode({'payload': payload})) + u.read() + u.close() + except urllib2.URLError, x: + print "%s => %s" % (url,x) + + +def main(): + url = '%s/api/repos/%s/post_receive/' % (DOMAIN, PROJECT_NAME) + refs = [] + user = os.environ.get('CODE_REMOTE_USER') + for line in sys.stdin.readlines(): + old, new, ref = line.strip().split(' ') + refs.append(dict(old_value=old, + new_value=new, + ref_name=ref, + user_name=user)) + http_post(url, dict(refs=refs)) + + +if __name__ == '__main__': + main() diff --git a/vilya/static/__init__.py b/hub/static/__init__.py similarity index 88% rename from vilya/static/__init__.py rename to hub/static/__init__.py index a3e6aa9..5c80deb 100755 --- a/vilya/static/__init__.py +++ b/hub/static/__init__.py @@ -16,24 +16,27 @@ <script> ${istatic('/js/sns/tribe/manage_members.js')|n} </script> - -参见: -http://svn.douban.com/projects/shire/wiki/RebuildFrontCode_Tribe ''' from copy import copy -from os.path import join, basename, exists, normpath +from os.path import join, exists, normpath, dirname import re import functools + +from quixote.errors import TraversalError + from vilya.config import CODE_DIR __all__ = ['static', 'istatic', 'get_static', 'get_static_content', 'get_file_content', 'CyclicImportStaticException'] -STATIC_FILE_DIR = '' + +STATIC_FILE_DIR = '../dist' +BUILTIN_FILE_DIR = '../hub/static' + +CSS_URL_IMPORT_REGEX = re.compile(r'url\(\'(.*)\'\)') -#from config.conf import STATIC_HOST def css_js_url(path): return path @@ -45,15 +48,15 @@ class StaticManager(object): def __init__(self, static_site=''): self.static_site = static_site - self.static_dir = join(CODE_DIR, STATIC_FILE_DIR, self.static_type) + self.static_dir = join( + CODE_DIR, STATIC_FILE_DIR, self.static_type) def get_packaged_filename(self, filename): '''打包之后应该存储的文件名''' - name = basename(filename) return join(self.static_dir, filename) def static(self, path, compressed=False, convert_url_func=None): - from libs.template import request as req + from vilya.libs.template import request as req '''获取静态文件的访问url''' filename = path[len(self.static_type) + 2:] # 去掉前缀的 /css/ @@ -74,6 +77,8 @@ def static(self, path, compressed=False, convert_url_func=None): else: raise AttributeError('static file %s not exists.' % path) + set_content_type(req, file_path) + if convert_url_func: url = convert_url_func(url) @@ -122,7 +127,7 @@ def file_ends_with_digit(path, extension): def get_static_manager(static_path): '''获取单例化的管理器''' - from config import DOMAIN + from vilya.config import DOMAIN global __CSS_MANAGER global __JS_MANAGER @@ -151,7 +156,7 @@ def static(static_file_path): static_file_path) """ - from libs.template import request + from vilya.libs.template import request if hasattr(request, "is_mobile") and request.is_mobile: mobile_uri = get_mobile_uri(static_file_path) try: @@ -160,12 +165,15 @@ def static(static_file_path): except (IOError, AttributeError): pass """ - return _static_helper(static_file_path) + # 厂外不能使用static自动生成cdn地址. 直接转化下 + # '/css/a.css' -> '/static/css/a.css' + # return _static_helper(static_file_path) + return '/static' + static_file_path def _static_helper(static_file_path): from config import CSS_JS_DEVELOP_MODE - from libs.template import request as req + from vilya.libs.template import request as req # 简单的单例模式(singlton),避免扫描文件等做重复计算,提交执行效率 @@ -189,6 +197,15 @@ def _static_helper(static_file_path): return url +def set_content_type(request, path): + if path.endswith('.js'): + request.response.set_content_type('application/x-javascript') + elif path.endswith('.css'): + request.response.set_content_type('text/css') + elif path.endswith('.svg'): + request.response.set_content_type('image/svg+xml') + + def get_file_content(path): '''获取静态文件的原始内容''' if not path.startswith('/'): @@ -198,13 +215,21 @@ def get_file_content(path): file_path = '%s/%s%s' % (CODE_DIR, STATIC_FILE_DIR, path) else: file_path = '%s%s' % (CODE_DIR, path) - return open(file_path).read() + try: + return open(file_path).read() + except IOError: + file_path = '%s/%s%s' % (CODE_DIR, BUILTIN_FILE_DIR, path) + try: + return open(file_path).read() + except IOError: + raise TraversalError('static file not exists') class ModuleStatic(object): '''模块化静态文件实例 只用于模块化处理过程的计算。''' + def __init__(self, static_path, converters, final_converter=None, debug=False): @@ -213,9 +238,6 @@ def __init__(self, static_path, converters, final_converter=None, self.final_converter = final_converter self.debug = debug self.imported_files = set() - file_type = self.path.split('.')[-1] - - filename = self.path.rsplit('.', 1)[0].lstrip('/') self.content = get_file_content(self.path) @@ -274,6 +296,7 @@ def final(self): class CyclicImportStaticException(Exception): '''静态文件循环导入错误''' + def __init__(self, static_file, cyclic_imported_file): Exception.__init__(self) self.static_file = static_file @@ -286,7 +309,8 @@ def __str__(self): RE_IMPORT = re.compile(r'(?m)' r'(?#single line)^[ \t]*@import (\s*[^\s]+\s*)$' r'|(?#cpp style comment)^//[ \t]*@import (\s*[^\s]+\s*)$' - r'|(?#c style comment)^/\*[ \t]*@import (\s*[^\s]+)\s*\*/\s*$') + r'|(?#c style comment)^/\*[ \t]*@import (\s*[^\s]+)\s*\*/\s*$' + ) def import_converter(module, file_type): @@ -300,9 +324,14 @@ def get_content(match): if '.' not in path.rsplit('/', 1)[-1]: path = '%s.%s' % (path, file_type) + match = CSS_URL_IMPORT_REGEX.search(path) + if match: + path = match.groups()[0] + path = join(dirname(module.path), path) + if not path[0] in './': - raise Exception("import path should start with . or / %s imported in %s" % (path, - module.path)) + raise Exception( + "import path should start with . or / %s imported in %s" % (path, module.path)) if path[0] != '/': path = normpath(join(module.path.rsplit('/', 1)[0], path)) @@ -349,11 +378,10 @@ def get_static_content(static_path, converters=None, debug=False): if converters is None: if static_path.endswith('.js'): converters = JS_CONVERTERS - final_converter = None else: converters = CSS_CONVERTERS # final_converter = scss_converter - final_converter = None + final_converter = None return ModuleStatic(static_path, debug=debug, converters=converters, final_converter=final_converter).final @@ -366,7 +394,7 @@ def get_static(static_path): js_content = get_static('/js/douban.js') ''' try: - from config import CSS_JS_DEVELOP_MODE + from vilya.config import CSS_JS_DEVELOP_MODE debug = CSS_JS_DEVELOP_MODE except ImportError: # 自动打包程序的执行环境中没有 luzong 代码 @@ -408,7 +436,6 @@ def istatic(static_path, **kwargs): 输出内容中不包含script标签。 ''' - from libs.template import request """ if getattr(request, 'is_mobile', None): mobile_uri = get_mobile_uri(static_path) diff --git a/vilya/static/codemirror/codemirror.css b/hub/static/codemirror/codemirror.css similarity index 100% rename from vilya/static/codemirror/codemirror.css rename to hub/static/codemirror/codemirror.css diff --git a/vilya/static/codemirror/codemirror.js b/hub/static/codemirror/codemirror.js similarity index 100% rename from vilya/static/codemirror/codemirror.js rename to hub/static/codemirror/codemirror.js diff --git a/vilya/static/codemirror/model/python.js b/hub/static/codemirror/model/python.js similarity index 100% rename from vilya/static/codemirror/model/python.js rename to hub/static/codemirror/model/python.js diff --git a/hub/static/css/app/badge.scss b/hub/static/css/app/badge.scss new file mode 100644 index 0000000..25e7410 --- /dev/null +++ b/hub/static/css/app/badge.scss @@ -0,0 +1,44 @@ +@import "css/mod/common"; +@import "css/mod/timeline"; + +div.section { + float: left; + width: 225px; + height: 155px; + display: inline; + padding: 60px 0; +} +div.section_center { + text-align:center; +} +div.badge_name { + margin: 20px; +} +div.badge_summary { + margin: 0 30px; + color: #999; + text-align: center; +} +div.badge_all_link { + margin: 30px 30px; +} +div.cl { + clear:both; +} +div.members { + .list { + display: table; + } + .user { + width: 80px; + display: inline-table; + img { + display: block; + margin: auto; + } + a { + display: block; + text-align: center; + } + } +} diff --git a/hub/static/css/app/blame.scss b/hub/static/css/app/blame.scss new file mode 100644 index 0000000..3ea9644 --- /dev/null +++ b/hub/static/css/app/blame.scss @@ -0,0 +1,29 @@ +@import "css/mod/common"; + +@import "css/mod/project-info"; +@import "css/mod/file-blame-blob"; + +@import "css/mod/pull-highlight"; +@import "css/mod/commits"; + +.blame table tr.section-first td { + border-top: 1px solid #CCC; +} +.blame table tr td { + padding: .2em .5em; +} +.blame .line-number { + background-color: #ECECEC; + color: #AAA; + padding: 0 .5em; + text-align: right; + border-left: 1px solid #DDD; + border-right: 1px solid #DDD; + vertical-align: middle; +} +.blame .line-data { + background-color: ghostWhite; + white-space: pre; + width: 100%; + vertical-align: middle; +} diff --git a/hub/static/css/app/center-activity.scss b/hub/static/css/app/center-activity.scss new file mode 100644 index 0000000..f20514c --- /dev/null +++ b/hub/static/css/app/center-activity.scss @@ -0,0 +1,82 @@ +@import "css/mod/common"; +@import "css/mod/flat-hack"; +@import "css/mod/markdown-content"; + +.pull-form input[type="text"] { + font-size: 14px; + padding: 5px 5px; + margin: 0 0 5px 0; + width: 98%; + color: #444; +} +.pull-form textarea { + height: 200px; +} +.pull-form-main .form-actions { + padding: 0; + margin-top: 10px; + text-align: right; + padding-bottom: 5px; + background-color: inherit; + border-top: none; +} + +.previewable-comment-form .zen-enabled textarea { + padding: 10px 18px 10px 10px; +} +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* Write/Preview Control style for new PR component */ +ul.edit-preview-tabs { + margin: 0 0 5px 0; + line-height: 13px; +} +ul.edit-preview-tabs li { + list-style-type: none; + margin: 0; + display: inline-block; +} +ul.edit-preview-tabs a { + display: inline-block; + padding: 2px 8px; + font-size: 11px; + font-weight: bold; + text-decoration: none; + color: #666; + border: 1px solid transparent; + border-radius: 10px; +} + +.previewable-comment-form li.active .write-tab, +.previewable-comment-form li.active .preview-tab { + color: #333; + background: white; + border-color: #BBB; + border-right-color: #DDD; + border-bottom-color: #DDD; +} + +/* Description Component background & help text, from hub.css*/ +.comment-form { + position: relative; + margin: -10px 0 10px 0; + padding: 5px; +} + +.comment-form p.help { + margin: 3px 0 0 0; + float: right; + font-size: 11px; + color: #666; +} diff --git a/hub/static/css/app/center.scss b/hub/static/css/app/center.scss new file mode 100644 index 0000000..d593833 --- /dev/null +++ b/hub/static/css/app/center.scss @@ -0,0 +1,83 @@ +@import "css/mod/common"; +@import "css/mod/flat-hack"; +@import "css/mod/markdown-content"; +@import "css/mod/timeline"; + +.pull-form input[type="text"] { + font-size: 14px; + padding: 5px 5px; + margin: 0 0 5px 0; + width: 98%; + color: #444; +} +.pull-form textarea { + height: 200px; +} +.pull-form-main .form-actions { + padding: 0; + margin-top: 10px; + text-align: right; + padding-bottom: 5px; + background-color: inherit; + border-top: none; +} + +.previewable-comment-form .zen-enabled textarea { + padding: 10px 18px 10px 10px; +} +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* Write/Preview Control style for new PR component */ +ul.edit-preview-tabs { + margin: 0 0 5px 0; + line-height: 13px; +} +ul.edit-preview-tabs li { + list-style-type: none; + margin: 0; + display: inline-block; +} +ul.edit-preview-tabs a { + display: inline-block; + padding: 2px 8px; + font-size: 11px; + font-weight: bold; + text-decoration: none; + color: #666; + border: 1px solid transparent; + border-radius: 10px; +} + +.previewable-comment-form li.active .write-tab, +.previewable-comment-form li.active .preview-tab { + color: #333; + background: white; + border-color: #BBB; + border-right-color: #DDD; + border-bottom-color: #DDD; +} + +/* Description Component background & help text, from hub.css*/ +.comment-form { + position: relative; + margin: -10px 0 10px 0; + padding: 5px; +} + +.comment-form p.help { + margin: 3px 0 0 0; + float: right; + font-size: 11px; + color: #666; +} diff --git a/hub/static/css/app/chat.scss b/hub/static/css/app/chat.scss new file mode 100644 index 0000000..6793556 --- /dev/null +++ b/hub/static/css/app/chat.scss @@ -0,0 +1,123 @@ +@import "compass/css3"; +@import "css/mod/common"; +@import "css/mod/flatui-comment-content"; +.pagehead { + margin-bottom: 7px; +} + +.rooms-right { + float: right; + width: 94px; +} + +.pagehead h2 { + margin: 0; + font-size: 30px; + line-height: 36px; + float: left; +} + +.clearfix { + display: block; +} + +.all_rooms li { + position: relative; + list-style: none; + clear: both; + background: white; + margin: 0; + padding: 0; + border-bottom: 1px solid #eaeaea; +} + +.nav-tabs.nav-stacked > li > a { + padding: 14px 5px; +} + +.del-room { + position: absolute; + right: 0; + z-index: 10; + margin: 0; + top: 13px; + color: rgba(99,182,174,0); +} + +.all_rooms { + height: 686px; + overflow: auto; +} + +.message { + height: 623px; + overflow: auto; + background: white; +} + +#message_input { + height: 63px; + width: 100%; + margin: 0; + padding: 0; +} + +#send_message_button { + height: 63px; + margin: 0; + padding: 0; +} + +.dia_box { + margin-top: 20px; + line-height: 17px; + margin-left: 40px; + margin-bottom: 20px; +} + +.dia_info { + margin-left: 18px; + text-align: left; +} + +.info_date { + color: #808080; + vertical-align: -1px; + white-space: pre; + zoom: 1; +} + +.dia_bg { + min-width: 144px; + max-width: 413px; + margin: 0 8px; + padding: 5px 9px; + @include border-radius(5px); + position: relative; + background: #f3f3f3; + border: solid 1px #eaeaea; + box-shadow: inset -1px 1px 1px rgba(255,255,255,.75); +} + +.dia_txt { + min-width: 144px; + max-width: 413px; + margin: 0 8px; + padding: 5px 9px; + border-radius: 5px; + position: relative; +} + +.side-avatar { + float: left; + padding: 0px 5px 5px; + vertical-align: top; + margin-left: 0; + margin-top: 17px; +} + +.side-avatar img { + width: 32px; + height: 32px; + @include border-radius(3px); +} diff --git a/hub/static/css/app/commit.scss b/hub/static/css/app/commit.scss new file mode 100644 index 0000000..497e2e4 --- /dev/null +++ b/hub/static/css/app/commit.scss @@ -0,0 +1,23 @@ +@import "css/mod/common"; + +@import "css/mod/project-info"; +@import "css/mod/pull-highlight"; +@import "css/mod/commits"; +@import "css/mod/file-diff-blob"; +@import "css/mod/comment-form"; +@import "css/mod/markdown-content"; +@import "css/mod/inline-comment"; +@import "css/mod/user-card"; +@import "css/mod/team-card"; +@import "css/mod/quick-emoji"; +@import "css/mod/comment"; + +.quick-emoji .emojis { + height: 120px; +} + +#files .comment p { + padding: 5px; + margin: 0; + //color:#333; +} diff --git a/hub/static/css/app/commits.scss b/hub/static/css/app/commits.scss new file mode 100644 index 0000000..1c7c47c --- /dev/null +++ b/hub/static/css/app/commits.scss @@ -0,0 +1,9 @@ +@import "css/mod/common"; + +/* TODO Refactor the following mods into components */ +@import "css/mod/commits"; +@import "css/mod/pull-new"; +@import "css/mod/compare"; + +/* Like these */ +@import "css/mod/project-info"; diff --git a/hub/static/css/app/compare.scss b/hub/static/css/app/compare.scss new file mode 100644 index 0000000..ac14183 --- /dev/null +++ b/hub/static/css/app/compare.scss @@ -0,0 +1,22 @@ +@import "css/mod/common"; + +/* TODO Refactor the following mods into components */ +@import "css/mod/pull-highlight"; +@import "css/mod/commits"; +@import "css/mod/pull-tabs"; + +/* Like these */ +@import "css/mod/compare"; +@import "css/mod/project-info"; +@import "css/mod/commits-condensed"; +@import "css/mod/file-diff-blob"; + +/* TODO FIXME 'View File' in file-blob requires styles +in this file, but it hides the show-inline-notes check button +therefore the below Hotfix is useless when you enables this */ +@import "css/mod/file-blame-blob"; + +/* Hotfix for show-inline-notes option button */ +span .show-inline-notes label { + display: inline; +} diff --git a/hub/static/css/app/dashboard.scss b/hub/static/css/app/dashboard.scss new file mode 100644 index 0000000..a293ac7 --- /dev/null +++ b/hub/static/css/app/dashboard.scss @@ -0,0 +1,14 @@ +@import "css/mod/common"; + +/* TODO Refactor the following mods into components */ +@import "css/mod/markdown-content"; +@import "css/mod/commits"; +@import "css/mod/source"; +@import "css/mod/source-edit"; + +/* Like these */ +@import "css/mod/pull-highlight"; +@import "css/mod/code-highlight"; +@import "css/mod/project-info"; +@import "css/mod/file-browser"; +@import "css/mod/file-blob"; diff --git a/hub/static/css/app/docs.scss b/hub/static/css/app/docs.scss new file mode 100644 index 0000000..0da8db2 --- /dev/null +++ b/hub/static/css/app/docs.scss @@ -0,0 +1,38 @@ +@import "css/mod/common"; +@import "css/mod/minibutton"; +@import "css/mod/docs-nav"; +@import "css/mod/docs-page"; +@import "css/mod/meta-nav"; +@import "css/mod/markdown-content"; + +.button-group { display:inline-block; overflow:hidden; border:1px solid #d4d4d4; border-radius:3px; border-bottom-color:#bcbcbc; background:#f5f5f5; background:-moz-linear-gradient(#f5f5f5,#e5e5e5); background:-webkit-linear-gradient(#f5f5f5,#e5e5e5); -ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')";} +.button-group li{ margin:0!important; float:left; } +.button-group li:first-child .grouped-button { border-left:none; border-bottom-left-radius:2px; border-top-left-radius:2px; } +.button-group li:last-child .grouped-button { border-right:none; border-bottom-right-radius:2px; border-bottom-left-radius:2px; } +.button-group .grouped-button { float:left;background:none; border-bottom:none; border-top:none; border-left:1px solid rgba(0,0,0,0.1); border-right:1px solid rgba(255,255,255,0.5); border-radius:0; cursor:pointer; } + +.inner-toc-wrapper { background-color: white; clear: both; float: right; margin: 4px 0 2px 8px; padding: 0 0 8px 8px; } +.inner-toc { border-left:8px solid #D9F3DC; padding-left:.6em; font-size:18px; line-height: 30px; } +.inner-toc a { color: #34833E; } +.inner-toc ul li { line-height:1.5em; } + +.actions { float:right; margin-bottom:5px; } + +.search { float: right } + +/* Patching for sphinx */ + +a.headerlink { visibility: hidden; color: #D9F3DC; } + +h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, +h4:hover > a.headerlink, h5:hover > a.headerlink, h6:hover > a.headerlink, +dt:hover > a.headerlink { visibility: visible; } +p.admonition-title { font-weight: bold; } + +.admonition, div.warning, div.sidebar { padding: 2px 5px 2px 18px; background-color: #ccc; border-radius: 8px; } +.admonition { background-color: #D9F3DC; } +.admonition p.admonition-title { color: #34833E; } +.warning { background-color: #FCD2D1; } +.warning p.admonition-title { color: #f4433E; } +.genindex a { display: block } +.genindex a.sublink { margin-left: 3em } diff --git a/hub/static/css/app/favorites.scss b/hub/static/css/app/favorites.scss new file mode 100644 index 0000000..0fa241e --- /dev/null +++ b/hub/static/css/app/favorites.scss @@ -0,0 +1 @@ +@import "css/mod/common"; diff --git a/hub/static/css/app/future.scss b/hub/static/css/app/future.scss new file mode 100644 index 0000000..6b8e1b8 --- /dev/null +++ b/hub/static/css/app/future.scss @@ -0,0 +1,2 @@ +@import "css/mod/common"; + diff --git a/hub/static/css/app/gist-revisions.scss b/hub/static/css/app/gist-revisions.scss new file mode 100644 index 0000000..10b0e71 --- /dev/null +++ b/hub/static/css/app/gist-revisions.scss @@ -0,0 +1,8 @@ +@import "css/mod/common"; + +/* TODO Refactor the following mods into components */ +@import "css/mod/commits"; +@import "css/mod/file-diff-blob"; + +@import "css/mod/pull-highlight"; +@import "css/mod/code-highlight"; diff --git a/hub/static/css/app/gist.scss b/hub/static/css/app/gist.scss new file mode 100644 index 0000000..5b3ea41 --- /dev/null +++ b/hub/static/css/app/gist.scss @@ -0,0 +1,139 @@ +@import "css/mod/common"; +@import "css/mod/code-highlight"; +@import "css/mod/minibutton"; +@import "css/mod/side-item"; +@import "css/mod/comment-form-preview"; +@import "css/mod/comment-form-zen"; +@import "css/mod/file-blob"; +@import "css/mod/gist-miniicon"; +@import "css/mod/gist-dropzone"; +@import "css/mod/gist-comment"; +@import "css/mod/gist-recent"; +@import "css/mod/gist-item"; +@import "css/mod/gist-form"; +@import "css/mod/gist-render"; +@import "css/mod/user-list"; +@import "css/mod/markdown-content"; + +ul, ol { list-style-type:none; display:block; margin:0; } + +/* Gist */ +a, a:hover { text-decoration: none; } + +.pagehead.separation h1 { margin-bottom: 15px; } +.pagehead h1 { margin: 0 0 10px 0; font-size: 20px; font-weight: normal; letter-spacing: -1px; line-height: 28px; text-shadow: 1px 1px 0 white; color: #495961; z-index: 0; } +.pagehead .title-actions-bar { position: relative; } +ul.pagehead-actions { margin: 0; float: right; position: absolute; right: 0; z-index: 10; } +.pagehead.repohead ul.pagehead-actions { position: relative; top: 0; right: 0; padding: 0 0 0 20px; } +ul.pagehead-actions > li { list-style-type: none; display: inline-block; font-size: 11px; font-weight: bold; color: #333; margin: 0 0 0 5px; } +li { display: list-item; text-align: -webkit-match-parent; } +.pagehead.repohead span.repo-label { position: absolute; top: 14px; left: -75px; width: 65px; margin-top: -14px; text-align: right; font-size: 11px; text-transform: uppercase; color: #B9B9B9; font-weight: 300; letter-spacing: 0px; text-shadow: none; -moz-transition: all 0.4s ease-in-out 0; -webkit-transition: all 0.4s ease-in-out 0; } +.pagehead.repohead span.repo-label { text-align: right; font-size: 11px; text-transform: uppercase; color: #B9B9B9; font-weight: 300; letter-spacing: 0px; text-shadow: none; } +.pagehead.repohead h1 .mega-icon-gist, .pagehead.repohead h1 .mega-icon-gist-secret, .pagehead.repohead h1 .mega-icon-gist-forked { position: absolute; left: -4px; top: 12px; line-height: 32px; margin-top: -13px; } +.mega-icon { font-size: 32px; width: 32px; height: 32px; } + +ul.filter-list { border-top: 1px solid #F1F1F1; margin-top: 20px; padding-top: 20px; } +ul.filter-list .filter-item { display: block; padding: 8px 10px; margin: 0 0 5px 0; font-size: 14px; border-radius: 3px; text-decoration: none; color: #777; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } +ul.filter-list.small .filter-item { font-size: 12px; padding: 4px 10px; margin: 0 0 2px 0; } +ul.filter-list .filter-item .count { font-weight: bold; float: right; } +.filter-list li { position: relative; } + +.tabnav { margin: 0 0 20px; border-bottom: 1px solid #DDD; height: 35px; } +.tabnav-right { position: relative; display: block; float: right; } +.tabnav-tab { display: inline-block; margin-bottom: -1px; /*padding: 8px 12px;*/ border: 1px solid transparent; border-bottom: 0; font-size: 14px; color: #666; text-decoration: none; } +.sort-tabs .tabnav-tab { color: #999; font-size: 13px; } +.tabnav .tabnav-tabs { display: inline-block; } +.tabnav .tabnav-tabs > li:first-child .tabnav-tab { padding-left: 2px; } +.sort-tabs li.active .tabnav-tab { color: #333; } + + +.infotip { background: #FBFFCE; border-radius: 3px; border: 1px solid #DEEA53; color: #333; font-size: 12px; margin: 0; padding: 10px; } +.root-pane { float: left; width: 148px; } +.menu-container { float: none; width: 142px; padding: 3px; background: #EFEFEF; border-radius: 2px; } +.root-pane .menu { background: #FAFAFB; border-radius: 2px; border: 1px solid #D8D8D8; list-style: none; } +.root-pane .menu ul, .root-pane .menu ol { margin: 0; padding: 0; } +.root-pane .menu li { border-bottom: 1px solid #EEE; border-top: 1px solid white; } +.root-pane .menu a { display: block; padding: 8px 10px 8px 8px; text-shadow: 0 1px 0 white; border-left: 2px solid #FAFAFB; text-decoration:none; } +.root-pane .menu a.selected { background: white; border-left: 2px solid #D26911; font-weight: bold; color: #222; cursor: default; box-shadow: inset 0 0px 1px rgba(0, 0, 0, 0.1); } +.root-pane .menu a .counter { float: right; margin: 0 0 0 5px; padding: 1px 5px 2px 5px; font-size: 10px; font-weight: bold; color: #666; background: #E5E5E5; border-radius: 10px; } +.menu a .mini-icon { color: #333; } + +.right-content { width: 770px; } + + +.container { display: inline-block; display: block; margin: 0 auto; } +.discussion-bubble { margin: 20px 0; } +.discussion-bubble .discussion-bubble-avatar { position: relative; float: left; border-radius: 3px; } +.discussion-bubble .discussion-bubble-content { position: relative; margin-left: 60px; } +.discussion-bubble-inner { min-height: 60px; border: 1px solid #CACACA; background-color: white; } +.discussion-bubble textarea { -moz-box-sizing: border-box; box-sizing: border-box; border: none; min-height: 60px; padding: 6px; width: 100%; margin-bottom: 0; } + +a.button { text-decoration: none; outline: none; display: inline-block; } +#add-gist { float: left; } +.form-actions { text-align: right; padding-bottom: 5px; } +button.classy.glowing, a.glowing.button.classy:disabled, a.glowing.button.classy.disabled, button.glowing.classy:disabled:hover, a.glowing.button.classy.disabled:hover, a.button.classy.glowing { background-color: #E6E1C0; background-image: -moz-linear-gradient(#FFFAD5, #E6E1C0); background-image: -webkit-linear-gradient(#FFFAD5, #E6E1C0); background-image: linear-gradient(#FFFAD5, #E6E1C0); background-repeat: repeat-x; border: 1px solid #DDD7AA; border-bottom-color: #CCC27E; } +#gist-form .form-actions { padding-top: 0; padding-right: 0; margin-top: 0; } + +.bubble .blob { margin: 0 0 0 0; } +.blob .file { min-height: 30px; position:relative; overflow:auto } +.pagehead span.repo-label { position: absolute; top: 14px; left: -75px; width: 65px; margin-top: -14px; text-align: right; font-size: 11px; text-transform: uppercase; color: #B9B9B9; font-weight: 300; letter-spacing: 0px; text-shadow: none; -moz-transition: all 0.4s ease-in-out 0; -webkit-transition: all 0.4s ease-in-out 0; } +.pagehead span.repo-label { text-align: right; font-size: 11px; text-transform: uppercase; color: #B9B9B9; font-weight: 300; letter-spacing: 0px; text-shadow: none; } +.pagehead h1.secret .repo-label span { padding: 3px 6px 2px; background-color: #F8EEC7; border-radius: 3px; color: #A1882B; } +h1 .mega-icon::before, .entry-title .meta-icon::before { font-size: 32px; } +h1 .mega-icon { color: #CCC; float: left; top: -1px; left: -4px; position: relative; font-size: 32px; width: 32px; height: 32px; } +.pagehead h1 a { color: #4183C4; white-space: nowrap; } +.pagehead h1 strong { font-weight: bold; } +.pagehead h1 a { color: #4183C4; white-space: nowrap; } +.pagehead h1.avatared { position: relative; padding-left: 52px; margin-bottom: 16px; font-weight: bold; line-height: 54px; } +.pagehead h1.avatared img { border-radius: 3px; top: 0; left: 0; position: absolute; } +.pagehead h1.avatared span { display: block; font-size: 24px; line-height: 24px; } +.pagehead h1.avatared em { display: block; font-size: 18px; line-height: 20px; font-style: normal; font-weight: normal; color: #99A7AF; } +.gist-author img { border-radius: 3px; margin-right: 2px; position: relative; top: -3px; vertical-align: middle; } +.gist-timestamp { color: #999; font-size: 11px; line-height: 20px; letter-spacing: 0; display: block; margin-top: -7px; margin-left: 64px; } +.gist-timestamp .text { color: #666; } +.gist-description { color: #666; font-size: 14px; line-height: 1.4; margin-bottom: 20px; } +button.classy.danger { color: #900; } + +.revision { margin-bottom: 24px; } +.revision .revision-meta { line-height: 24px; padding: 0 0 0 0; } +.revision .revision-meta .creator { color: rgba(51, 51, 51, 0.75); position: relative; } +.revision .revision-meta { line-height: 26px; } +.revision .explain { float: right; } +.revision .creator img { border-radius: 3px; width:23px; height: 23px; position: absolute; top: -4px; left: 0; margin-right: 4px; } +.revision .creator strong { margin-left: 30px; } +.explain { font-size: 12px; color: #666; position: relative; } +.revision .minibutton { margin-left: 6px; } +.pagination-older-newer a { padding: .1em .3em; margin: .2em; text-decoration: none; color: #369; float:none; } +.pagination-older-newer a:hover, .pagination a:active { background-color: transparent; color: #36f; } +.pagination-older-newer span.disabled { padding: .1em .3em; margin: .2em; color: #bbb; float:none; } + +.counts-label { + position: relative; + display: inline-block; + margin-left: 3px; + padding: 3px 7px; + border: 1px solid #ccc; + border-radius: 3px; + color: #333; + background-color: #fafafa; + vertical-align: middle; +} + +.counts-label::before, .counts-label::after { + content: ""; + position: absolute; + top: 50%; + right: 100%; + display: block; + margin-right: 0px; + margin-top: -6px; + width: 0; + height: 0; + border: 6px solid transparent; + border-right-color: #ccc; +} + +.counts-label::after { + margin-right: -1px; + border-right-color: #fafafa; +} diff --git a/hub/static/css/app/graph.scss b/hub/static/css/app/graph.scss new file mode 100644 index 0000000..935e40a --- /dev/null +++ b/hub/static/css/app/graph.scss @@ -0,0 +1,83 @@ +@import "css/mod/common"; +@import "css/mod/minibutton"; +@import "css/mod/meta-nav"; + +#gitstats-total { + display: inline-block; + display: block; +} +#gitstats-total .total-details { + clear: right; +} +#gitstats-total .total-details div:first-child { + border-left: none; +} +#gitstats-total .total-details div { + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 10px 0 0 0; + text-align: center; + border-left: 1px solid #ddd; + border-top: 1px solid #ddd; + color: #999; +} +.grid .col { + display: table-cell; + width: 1%; +} +#gitstats-total .total-details div .num { + font-weight: bold; + font-size: 16px; + display: block; + color: #333; +} +#gitstats-total .total-details div .lbl { + display: block; + font-weight: bold; + padding: 10px 0; + color: #777; + border-top: 1px solid #f7f7f7; + margin-top: 10px; + font-size: 11px; +} +.ext-lines-container { + display: inline; +} +.ext-files-container { + display: inline; +} +.lable p { + font-weight: bold; + font-size: 16px; + width: 465px; + float: left; + text-align: center; + padding-bottom: 5px; +} +div.ext { + height: 480px; +} +.axis path, +.axis line { + fill: none; + stroke: #000; + shape-rendering: crispEdges; +} + +.x.axis path { + display: none; +} + +.line { + fill: none; + stroke: steelblue; + stroke-width: 1.5px; +} +.lines-container g text { + font-size: 9px; +} + +.chart rect { + fill: #DFDFDF; + stroke: white; +} diff --git a/hub/static/css/app/issue-new.scss b/hub/static/css/app/issue-new.scss new file mode 100644 index 0000000..81d364a --- /dev/null +++ b/hub/static/css/app/issue-new.scss @@ -0,0 +1,91 @@ +@import "css/mod/common"; +@import "css/mod/markdown-content"; +@import "css/mod/project-info"; +@import "css/mod/upload-widget"; +@import "css/lib/tag-it"; +@import "css/lib/jquery.atwho"; + +/* highlight */ +@import "css/mod/pull-highlight"; + +.pull-form input[type="text"] { + font-size: 14px; + padding: 5px 5px; + margin: 0 0 5px 0; + width: 98%; + color: #444; +} +.pull-form textarea { + height: 200px; +} +.pull-form-main .form-actions { + padding: 0; + margin-top: 10px; + text-align: right; + padding-bottom: 5px; + background-color: inherit; + border-top: none; +} + +.previewable-comment-form .zen-enabled textarea { + padding: 10px 18px 10px 10px; +} +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* Write/Preview Control style for new PR component */ +ul.edit-preview-tabs { + margin: 0 0 5px 0; + line-height: 13px; +} +ul.edit-preview-tabs li { + list-style-type: none; + margin: 0; + display: inline-block; +} +ul.edit-preview-tabs a { + display: inline-block; + padding: 2px 8px; + font-size: 11px; + font-weight: bold; + text-decoration: none; + color: #666; + border: 1px solid transparent; + border-radius: 10px; +} + +/* Description Component background & help text, from hub.css*/ +.comment-form { + position: relative; +} + +.comment-form p.help { + margin: 0; + float: right; + line-height: 32px; + font-size: 12px; + color: #bbb; +} + +/* tag */ +.tag-groups p{ + margin: 0; +} + +.tags input[type="text"] { + font-size: 14px; + padding: 5px 0px; + margin: 0 0 5px 5px; + width: 98%; + color: #444; +} diff --git a/hub/static/css/app/issue.scss b/hub/static/css/app/issue.scss new file mode 100644 index 0000000..12a0657 --- /dev/null +++ b/hub/static/css/app/issue.scss @@ -0,0 +1,15 @@ +@import "compass/css3"; +@import "css/mod/common"; +@import "css/mod/user-card"; +@import "css/mod/team-card"; +@import "css/mod/text-truncate"; +@import "css/mod/project-info"; +@import "css/mod/markdown-content"; +@import "css/mod/flatui-comment-content"; +@import "css/mod/quick-emoji"; +@import "css/lib/tag-it"; +@import "css/mod/issue-body"; +@import "css/mod/fav-button"; + +/* highlight */ +@import "css/mod/pull-highlight"; diff --git a/hub/static/css/app/issues.scss b/hub/static/css/app/issues.scss new file mode 100644 index 0000000..bad55ee --- /dev/null +++ b/hub/static/css/app/issues.scss @@ -0,0 +1,9 @@ +@import "css/mod/common"; +@import "css/mod/user-card"; +@import "css/mod/team-card"; +@import "css/mod/text-truncate"; +@import "css/mod/project-info"; +@import "css/mod/tag-list"; +@import "css/mod/issues-topbar"; +@import "css/mod/issues-sidebar"; +@import "css/mod/issues-list"; diff --git a/hub/static/css/app/m/gist.scss b/hub/static/css/app/m/gist.scss new file mode 100644 index 0000000..7f236a6 --- /dev/null +++ b/hub/static/css/app/m/gist.scss @@ -0,0 +1,26 @@ +@import "css/mod/code-highlight"; +@import "css/mod/minibutton"; +@import "css/mod/side-item"; +@import "css/mod/file-blob"; +@import "css/mod/gist-miniicon"; +@import "css/mod/gist-comment"; +@import "css/mod/gist-item"; +@import "css/mod/gist-form"; +@import "css/mod/gist-render"; +@import "css/mod/markdown-content"; + +body { margin:0; } +.CodeMirror { height: 300px; } +form { margin:0; } +.container { width:100%; } +#gist-form .file .meta { position: fixed; top: 0; width: 100%; } +.input { margin-top: 43px; } +#gist-form .editor-options { right:25px; } +.btn { font-weight: bold; } +.link-overlay { visibility: visible; } +input.gist-name-textbox { width: 160px; } + +.bubble .blob { margin: 0 0 0 0; } +.blob .file { min-height: 30px; position:relative; overflow:auto } + +.gist-options { top: 5px; position: absolute; right: 5px; } \ No newline at end of file diff --git a/hub/static/css/app/mfeed.scss b/hub/static/css/app/mfeed.scss new file mode 100644 index 0000000..d0a102a --- /dev/null +++ b/hub/static/css/app/mfeed.scss @@ -0,0 +1,4 @@ +@import "css/mod/common"; + +@import "css/mod/timeline"; +@import "css/mod/mobile_timeline"; diff --git a/hub/static/css/app/mirror-cloning.scss b/hub/static/css/app/mirror-cloning.scss new file mode 100644 index 0000000..7e343ca --- /dev/null +++ b/hub/static/css/app/mirror-cloning.scss @@ -0,0 +1,4 @@ +@import "css/mod/common"; +@import "css/mod/timeline"; + +.center { text-align:center; } diff --git a/hub/static/css/app/mirrors.scss b/hub/static/css/app/mirrors.scss new file mode 100644 index 0000000..25e99fc --- /dev/null +++ b/hub/static/css/app/mirrors.scss @@ -0,0 +1,2 @@ +@import "css/mod/common"; +@import "css/mod/project-item"; diff --git a/hub/static/css/app/my-actions.scss b/hub/static/css/app/my-actions.scss new file mode 100644 index 0000000..c09c681 --- /dev/null +++ b/hub/static/css/app/my-actions.scss @@ -0,0 +1,5 @@ +@import "css/mod/common"; +@import "css/mod/timeline"; +@import "css/mod/my-projects"; +@import "css/mod/watched-projects"; + diff --git a/hub/static/css/app/my-issues.scss b/hub/static/css/app/my-issues.scss new file mode 100644 index 0000000..f1501ec --- /dev/null +++ b/hub/static/css/app/my-issues.scss @@ -0,0 +1,6 @@ +@import "css/mod/common"; +@import "css/mod/user-card"; +@import "css/mod/team-card"; +@import "css/mod/text-truncate"; +@import "css/mod/issues-sidebar"; +@import "css/mod/issues-list"; diff --git a/hub/static/css/app/my-pullrequests.scss b/hub/static/css/app/my-pullrequests.scss new file mode 100644 index 0000000..8625232 --- /dev/null +++ b/hub/static/css/app/my-pullrequests.scss @@ -0,0 +1,3 @@ +@import "css/mod/common"; +@import "css/mod/my-pull-requests-tab"; +@import "css/mod/pullrequest-list"; diff --git a/hub/static/css/app/my-settings.scss b/hub/static/css/app/my-settings.scss new file mode 100644 index 0000000..430419b --- /dev/null +++ b/hub/static/css/app/my-settings.scss @@ -0,0 +1,9 @@ +@import "css/mod/common"; +@import "css/mod/setting-box"; +@import "css/mod/minibutton"; +@import "css/mod/email"; +@import "css/mod/github"; +@import "css/mod/notification"; +@import "css/mod/checkbox"; + +.settings-content { width:60% } diff --git a/hub/static/css/app/newsfeed.scss b/hub/static/css/app/newsfeed.scss new file mode 100644 index 0000000..c2d6d4b --- /dev/null +++ b/hub/static/css/app/newsfeed.scss @@ -0,0 +1,4 @@ +@import "css/mod/common"; +@import "css/mod/timeline"; +@import "css/mod/rightside"; +@import "css/mod/my-projects"; diff --git a/hub/static/css/app/notifications.scss b/hub/static/css/app/notifications.scss new file mode 100644 index 0000000..75dbc4c --- /dev/null +++ b/hub/static/css/app/notifications.scss @@ -0,0 +1,171 @@ +@import "compass/css3"; +@import "css/mod/common"; +@import "css/mod/minibutton"; + + +@media (max-width: 767px){ + .notif-list { padding: 10px; } +} + +.mark-all-as-read { + margin-left: 10px; + float:right; +} + +.notif-sidebar { + margin-bottom: 20px; + + .rule { + clear: both; + height: 0px; + padding:0; + margin:0; + overflow: hidden; + border: none; + background: transparent; + border-bottom: 3px solid rgba(99, 182, 174, 0.2); + } + + // TODO: hover style, fix when scroll + .target-list { + background: #fff; + font-size: 12px; + } +} + +.notif-list { + margin-top:0px; + word-wrap: break-word; + word-break: normal; + + form { + margin: 0; + } + + .title > a:hover { + text-decoration: none; + } + + .unread { + background-color: #EAF2F5!important; + border-radius: 3px; + } + + .notif-item { + margin: 0 0 20px 0; + background: #fff; + @include box-shadow(1px 1px 5px 0.8px rgba(0,0,0,0.3)); + + .item-header { + background: rgba(99, 182, 174, 0.6); + + .mark-item { + float: right; + + button { + padding: 8px; + background-color: transparent; + color: #555; + border: solid #d5d5d5; + border-width: 0 1px; + box-shadow: inset 1px 0 0 rgba(255,255,255,0.5); + } + } + + .title { + font-size: 14px; + padding: 8px 16px; + } + } + .item-body { + .entry { + padding: 10px; + border-bottom: 1px solid #eee; + + .entry-title { + padding: 0 10px; + + .title { + margin-right: 100px; + font-size: 15px; + cursor: pointer; + + i { + margin-right: 10px; + } + + .label { + text-shadow: none; + margin-left: 5px; + } + } + + .entry-actions { + float: right; + margin: 0; + padding: 5px; + + li { + float: right; + margin-left: 10px; + + button { + background-color: transparent; + color: rgb(153, 153, 153); + border: none; + padding: 0; + } + } + } + } + + .entry-body { + & > :last-child { + border-bottom: none !important; + } + + .entry-item { + position: relative; + clear: both; + //background: #fff; + padding: 10px 20px 10px 32px; + border-bottom: 1px solid #eaeaea; + + .title { + margin-bottom: 0.5em; + i { + position: absolute; + left: 5px; + padding: 2px 5px 0; + color: #999; + font-size: 10px; + } + .time{ + float: right; + color: #bbb; + font-size: 12px; + } + } + } + } + } + } + } + + + .padding { height:2em; font-weight:bold; } + .desc { color:#666; word-wrap: break-word; } + .desc .right_side {float:right; margin-right:30px;} + +} + +/* // TODO: pagination +.timeline .pagination { display:none; background: rgba(99, 182, 174, 1);} +.pagination { display:block; margin:7px 0; overflow:hidden; border:1px solid #EAEAEA; border-bottom-color:#CACACA; border-top:none; border-bottom:none; border-radius: 3px; background-image: -webkit-linear-gradient(top, white, #EFEFEF); } +.timeline .pagination a {color: rgba(255,255,255,1);} +.pagination a { padding:8px; width:100%; text-align:center; line-height: 1.4; } +.pagination a:last-child, .pagination span:last-child { border-right:none; border-bottom-right-radius:3px; } +.pagination a:first-child, .pagination span:first-child { border-left:none; border-bottom-left-radius:3px; } +.pagination a, .pagination span { float:left; margin:0; color:#777; font-size:13px; text-decoration:none; text-shadow:0 1px 0 white; border-bottom:1px solid #DADADA; } +.timeline .loader img{display:block; width:16px; height:16px; margin:0 auto; position: relative; } +*/ diff --git a/hub/static/css/app/people.scss b/hub/static/css/app/people.scss new file mode 100644 index 0000000..23799ed --- /dev/null +++ b/hub/static/css/app/people.scss @@ -0,0 +1,256 @@ +@import "css/mod/common"; + +@import "css/mod/project-item"; +@import "css/mod/team-item"; +@import "css/mod/timeline"; +@import "css/mod/contribution"; +@import "css/mod/praise"; +@import "css/mod/text-truncate"; + +@import "css/lib/cal-heatmap"; + +/* for flat-ui new people profile page */ +.span3, .span4 { + margin-left: 0px; +} + +.people-info{ + img { + border-radius:3px; + padding: 3px; + border: 1px solid lightgray; + } + + .username { + font-size:18px; + line-height:36px; + font-weight:bold; + height:auto; + text-shadow:1px 1px 0 white; + width:180px; + } + + dl>dd { + width:170px; + } + + .username, dl>dd { + @include text-truncate(180px); + } + + .follow-btn { + margin: 10px auto; + } + + .contact { + border-bottom: 1px solid #eee; + } + + .avatar-group-item { + display: inline-block; + margin-bottom: 3px; + .avatar { + display: inline-block; + vertical-align: middle; + width: 31px; + height: 31px; + } + } + + .follow-stats { + margin: 15px auto; + + ul { + li { + float: left; + margin: 5px 5px; + } + } + + strong { + text-align: center; + display: block; + font-size: 26px; + } + + span { + font-size: 12px; + } + + a { + &:hover { + color: lighten(rgba(0,168,156,1), 7%); + text-decoration: none; + } + } + + } +} + +.follow-list { + margin-bottom: 20px; + + h1 a { + &:hover { + text-decoration: none; + } + } + + .user-list { + .follow-list-item { + float: left; + width: 250px; + padding-bottom: 5px; + margin-bottom: 15px; + margin-right: 20px; + border-bottom: 1px solid #ddd; + height: 100px; + + .avatar { + width: 64px; + height: 64px; + } + .email { + margin-top: 10px; + } + + .follow-btn { + float: right; + margin: 20px 5px; + a { + display: block; + width: 50px; + text-align: center; + } + + } + + .username{ + display:inline-block; + @include text-truncate(90px); + } + } + } +} + +.glory { padding: 10px 20px; } + +.rec, .badge-list, .rec-num { + display:inline-block; +} + +.rec { margin-right: 20px; } + +/* fix for newer bootstrap to make it look just like old page */ + +.dl-horizontal dt { float: none; width: 50px; text-align: left; } + +/* People Page */ +.add-rec { background: url('../../static/img/recommend.png') 0 10px no-repeat; width:32px; height:36px; opacity:0.7; display:inline-block } +.add-rec:hover { opacity:1 } +.add-rec.mine:hover { opacity:0.7 } + +h1.people-info img, .rec img +{ vertical-align:middle; position:relative; top:-2px; margin-right:5px; padding:2px; border:1px solid #DDD } + +h1.people-info img, h1.people-info .username, +h1.people-info .follow-btn, h1.people-info .rec { float:left; margin-right:12px } + +h1.people-info .rec-num { display:inline-block; } +h1.people-info .rec-num a { font-size:20px; color:#888; text-decoration:none } +h1.people-info .rec-num a:hover { color:#08C } + +.right-info { + float:right; + font-size:14px; + margin-top:20px; + a { + color:#333; + } +} + +#add-rec-form { + margin: 0; + + textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + background: #FAFAFA; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing:border-box; + box-sizing: border-box; + border-radius:3px; + } + + .form-actions { + padding: 0; + margin: 0; + } +} + +.form-actions { + text-align: right; + padding-bottom: 5px; + background: #fff; + border: none; + + .optional { + display:block; + padding-top:8px; + float:left; + margin-right:15px; + padding-top:3px; + } + + .primary { + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.4); + border-color: #74BB5A; + border-bottom-color: #509338; + background: #8ADD6D; + -ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#8add6d', endColorstr='#60b044')"; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); + background-image: -webkit-linear-gradient(top, #8ADD6D, #60B044); + } +} + + +.rec-wnd { + position: fixed; + top: 120px; + left: 453px; + width: 360px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + padding: 5px; +} + +.people-activity .info { + color:#888; + margin:15px 5px; +} + +.pagination { + margin-right: 100px; + + a { + float: left; + padding: 6px 15px 5px; + margin: 0; + font-size: 13px; + text-decoration: none; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #DADADA; + border-top: none; + width: auto; + } +} + +img.is-new { + float: right; +} \ No newline at end of file diff --git a/hub/static/css/app/project-create.scss b/hub/static/css/app/project-create.scss new file mode 100644 index 0000000..75ff1eb --- /dev/null +++ b/hub/static/css/app/project-create.scss @@ -0,0 +1,35 @@ +@import "css/mod/common"; + +#mirror { + display: none; +} + +.mirror-url { + display: none; +} + +.mirror-with-proxy { + display: none; + margin:15px 0 5px 0; +} + +.splash { + margin: 0; + padding-top: 22px; + margin-left: 0; + width: auto; +} + +#owner { + img { + padding-top: 3px; + padding-left: 20px; + } +} + +#mirror { + img { + padding-top: 3px; + padding-left: 20px; + } +} diff --git a/hub/static/css/app/public-timeline.scss b/hub/static/css/app/public-timeline.scss new file mode 100644 index 0000000..84390cc --- /dev/null +++ b/hub/static/css/app/public-timeline.scss @@ -0,0 +1,3 @@ +@import "css/mod/common"; +@import "css/mod/timeline"; + diff --git a/hub/static/css/app/pull-new.scss b/hub/static/css/app/pull-new.scss new file mode 100644 index 0000000..d02e72c --- /dev/null +++ b/hub/static/css/app/pull-new.scss @@ -0,0 +1,84 @@ +@import "css/mod/common"; + +/* TODO Refactor the following mods into components */ +@import "css/mod/pull-new"; +@import "css/mod/pull-request"; +@import "css/mod/pull-github"; +@import "css/mod/pull-ticket"; +@import "css/mod/pull-tabs"; +@import "css/mod/pull-codereview"; +@import "css/mod/commits"; + +/* Like these */ +@import "css/lib/jquery.atwho"; +@import "css/mod/project-info"; +@import "css/mod/commits-condensed"; +@import "css/mod/file-diff-blob"; +@import "css/mod/merge-guide"; +@import "css/mod/diffs-pane"; +@import "css/mod/comment-form"; +@import "css/mod/upload-widget"; +@import "css/mod/markdown-content"; + +/* highlight */ +@import "css/mod/pull-highlight"; + +/* Write/Preview Control style for new PR component */ +ul.edit-preview-tabs { + margin: 0 0 5px 0; + line-height: 13px; +} +ul.edit-preview-tabs li { + list-style-type: none; + margin: 0; + display: inline-block; +} +ul.edit-preview-tabs a { + display: inline-block; + padding: 2px 8px; + font-size: 11px; + font-weight: bold; + text-decoration: none; + color: #666; + border: 1px solid transparent; + border-radius: 10px; +} + +.previewable-comment-form li.active .write-tab, +.previewable-comment-form li.active .preview-tab { + color: #333; + background: white; + border-color: #BBB; + border-right-color: #DDD; + border-bottom-color: #DDD; +} + +/* Description Component background & help text, from hub.css*/ +.comment-form { + position: relative; + margin: -10px 0 10px 0; + padding: 5px; + background: #EEE; + border-radius: 5px; +} + +.comment-form p.help { + margin: 3px 0 0 0; + float: right; + font-size: 11px; + color: #666; +} + +.write-content.zen-enabled .go-zen { top: 15px; } + +#form-file-upload { top: -70px; } + +.contributing { + padding: 15px; + margin: 15px 0; + font-size: 14px; + color: #4c4a42; + background-color: #fff9ea; + border: 1px solid #dfd8c2; + border-radius: 3px; +} diff --git a/hub/static/css/app/pulls.scss b/hub/static/css/app/pulls.scss new file mode 100644 index 0000000..d7d2392 --- /dev/null +++ b/hub/static/css/app/pulls.scss @@ -0,0 +1,6 @@ +@import "css/mod/common"; +@import "css/mod/pullrequest-list"; +@import "css/mod/minibutton"; +@import "css/mod/meta-nav"; +@import "css/mod/project-info"; +@import "css/mod/navbar-search"; diff --git a/hub/static/css/app/settings.scss b/hub/static/css/app/settings.scss new file mode 100644 index 0000000..a69a0c5 --- /dev/null +++ b/hub/static/css/app/settings.scss @@ -0,0 +1,35 @@ +@import "css/mod/common"; +@import "css/mod/meta-nav"; +@import "css/mod/minibutton"; + +.avatar { + display: inline-block; + width: 48px; + margin-right: 5px; +} +img.avatar{ + width: 18px; + height: 18px; +} +.form-note { + margin-top: -1px; + display: inline-block; + padding: 5px; + font-size: 11px; + color: #494620; + background: #f7ea57; + border: 1px solid #c0b536; + border-top-color: #fff; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +ul.hook-list li a { + display: inline-block; + padding: 3px 0 3px 5px; + color: #999; + text-decoration: none; +} + +.btn-details { + margin-right: 4px; +} \ No newline at end of file diff --git a/hub/static/css/app/source.scss b/hub/static/css/app/source.scss new file mode 100644 index 0000000..a293ac7 --- /dev/null +++ b/hub/static/css/app/source.scss @@ -0,0 +1,14 @@ +@import "css/mod/common"; + +/* TODO Refactor the following mods into components */ +@import "css/mod/markdown-content"; +@import "css/mod/commits"; +@import "css/mod/source"; +@import "css/mod/source-edit"; + +/* Like these */ +@import "css/mod/pull-highlight"; +@import "css/mod/code-highlight"; +@import "css/mod/project-info"; +@import "css/mod/file-browser"; +@import "css/mod/file-blob"; diff --git a/hub/static/css/app/stat.scss b/hub/static/css/app/stat.scss new file mode 100644 index 0000000..ec3f8d8 --- /dev/null +++ b/hub/static/css/app/stat.scss @@ -0,0 +1,30 @@ +@import "css/mod/common"; +@import "css/lib/odometer"; +h2 { + margin: 0px 20px 20px 20px; +} + +.data { + display: block; + margin: 20px; +} + +.data h2 { + margin: 0 0 6px; + line-height: 1.1; + font-size: 15px; + color: #999; +} + +.mod { + padding: 15px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} + +.indent { + margin-left: -10px; +} \ No newline at end of file diff --git a/hub/static/css/app/team-add-project.scss b/hub/static/css/app/team-add-project.scss new file mode 100644 index 0000000..d7701b3 --- /dev/null +++ b/hub/static/css/app/team-add-project.scss @@ -0,0 +1,33 @@ +@import "css/mod/common"; +@import "css/mod/team-header"; +@import "css/mod/drop-down-list"; +.boxed-group { + position: relative; + background: #EFEFEF; + padding: 3px; + border-radius: 3px; + margin: 0 0 15px 0; + .boxed-group-inner { + padding: 1px 10px; + background: white; + border: 1px solid #D8D8D8; + border-top: none; + border-bottom-left-radius: 1px; + border-bottom-right-radius: 1px; + color: #666; + font-size: 13px; + } +} +#project_id { + margin-bottom: 1px; +} +label { + margin-left:10px; + color: rgba(99, 182, 174, 1); +} +dd { + position: relative; +} +.add-item-menu{ + top: 30px; +} diff --git a/hub/static/css/app/team-groups.scss b/hub/static/css/app/team-groups.scss new file mode 100644 index 0000000..8780c34 --- /dev/null +++ b/hub/static/css/app/team-groups.scss @@ -0,0 +1,23 @@ +@import "css/mod/common"; +@import "css/mod/team-header"; +@import "css/mod/timeline"; +@import "css/mod/my-projects"; + +.group-link { + text-decoration: none; +} +.group-link:focus { + outline: none; +} +.group-link:hover { + text-decoration: none; +} +.group-description { + overflow: hidden; + max-width: 80%; + margin-top: 5px; + font-size: 14px; + color: #777; + text-overflow: ellipsis; + white-space: nowrap; +} diff --git a/hub/static/css/app/team-issue.scss b/hub/static/css/app/team-issue.scss new file mode 100644 index 0000000..463ef56 --- /dev/null +++ b/hub/static/css/app/team-issue.scss @@ -0,0 +1,15 @@ +@import "compass/css3"; +@import "css/mod/common"; +@import "css/mod/user-card"; +@import "css/mod/team-card"; +@import "css/mod/text-truncate"; +@import "css/mod/project-info"; +@import "css/mod/markdown-content"; +@import "css/mod/flatui-comment-content"; +@import "css/mod/quick-emoji"; +@import "css/lib/tag-it"; +@import "css/mod/team-header"; +@import "css/mod/issue-body"; + +/* highlight */ +@import "css/mod/pull-highlight"; diff --git a/hub/static/css/app/team-issues.scss b/hub/static/css/app/team-issues.scss new file mode 100644 index 0000000..89326a5 --- /dev/null +++ b/hub/static/css/app/team-issues.scss @@ -0,0 +1,6 @@ +@import "css/mod/common"; +@import "css/mod/team-header"; +@import "css/mod/issues-sidebar"; +@import "css/mod/issues-topbar"; +@import "css/mod/issues-list"; +@import "css/mod/tag-list"; diff --git a/hub/static/css/app/team-new-issue.scss b/hub/static/css/app/team-new-issue.scss new file mode 100644 index 0000000..d33258b --- /dev/null +++ b/hub/static/css/app/team-new-issue.scss @@ -0,0 +1,97 @@ +@import "css/mod/common"; +@import "css/mod/team-header"; +@import "css/mod/flat-hack"; +@import "css/mod/markdown-content"; +@import "css/mod/upload-widget"; +@import "css/lib/tag-it"; + +.pull-form input[type="text"] { + font-size: 14px; + padding: 5px 5px; + margin: 0 0 5px 0; + width: 98%; + color: #444; +} +.pull-form textarea { + height: 200px; +} +.pull-form-main .form-actions { + padding: 0; + margin-top: 10px; + text-align: right; + padding-bottom: 5px; + background-color: inherit; + border-top: none; +} + +.previewable-comment-form .zen-enabled textarea { + padding: 10px 18px 10px 10px; +} +.previewable-comment-form textarea { + display: block; + width: 100%; + max-width: 100%; + min-height: 100px; + padding: 10px; + border: 1px solid #DDD; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 3px; +} + +/* Write/Preview Control style for new PR component */ +ul.edit-preview-tabs { + margin: 0 0 5px 0; + line-height: 13px; +} +ul.edit-preview-tabs li { + list-style-type: none; + margin: 0; + display: inline-block; +} +ul.edit-preview-tabs a { + display: inline-block; + padding: 2px 8px; + font-size: 11px; + font-weight: bold; + text-decoration: none; + color: #666; + border: 1px solid transparent; + border-radius: 10px; +} + +.previewable-comment-form li.active .write-tab, +.previewable-comment-form li.active .preview-tab { + color: #333; + background: white; + border-color: #BBB; + border-right-color: #DDD; + border-bottom-color: #DDD; +} + +/* Description Component background & help text, from hub.css*/ +.comment-form { + position: relative; + margin: -10px 0 10px 0; + padding: 5px; +} + +.comment-form p.help { + margin: 3px 0 0 0; + float: right; + font-size: 11px; + color: #666; +} + +/* tag */ +.tag-groups p{ + margin: 0; +} +.tags input[type="text"] { + font-size: 14px; + padding: 5px 0px; + margin: 0 0 5px 5px; + width: 98%; + color: #444; +} diff --git a/hub/static/css/app/team-pulls.scss b/hub/static/css/app/team-pulls.scss new file mode 100644 index 0000000..1507b4d --- /dev/null +++ b/hub/static/css/app/team-pulls.scss @@ -0,0 +1,3 @@ +@import "css/mod/common"; +@import "css/mod/team-header"; +@import "css/mod/pullrequest-list"; diff --git a/hub/static/css/app/team-settings.scss b/hub/static/css/app/team-settings.scss new file mode 100644 index 0000000..5090417 --- /dev/null +++ b/hub/static/css/app/team-settings.scss @@ -0,0 +1,191 @@ +@import "css/mod/common"; +@import "css/mod/team-header"; +@import "css/mod/drop-down-list"; + +.columns { + display: block; + &:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; + } + &.equacols .column { + width: 520px; + float: left; + } +} + +.equacols { + .column>.fieldgroup:first-child { + margin-top: 0; + } + .fieldgroup .fields { + text-align: center; + background-image: url(""); + } +} +.fieldgroup { + position: relative; + margin-top: 10px; + width: 440px; + .fields { + margin: 10px 0 0 0; + padding: 10px; + background: url("") 0 0 no-repeat; + } + h2 { + margin: 15px 0 0 0; + font-size: 18px; + font-weight: normal; + color: #666; + } +} +ul.fieldpills { + position: relative; + margin: 0; + li { + position: relative; + list-style-type: none; + margin: 3px 0; + min-height: 24px; + line-height: 24px; + padding: 4px 5px; + background: #eee; + font-size: 12px; + font-weight: bold; + color: #333; + border: 1px solid #ddd; + border-radius: 3px; + } + &.usernames li img { + margin-right: 2px; + padding: 1px; + background: #fff; + border: 1px solid #ddd; + vertical-align: middle; + } +} +a { + text-decoration: none; + &.action { + color: #d00; + text-decoration: underline; + } +} +.team-setting { + input[type="text"] { + min-height: 34px; + padding: 7px 8px; + outline: none; + color: #333; + background-color: #fff; + background-repeat: no-repeat; + background-position: right center; + border: 1px solid #ccc; + border-radius: 3px; + box-shadow: inset 0 1px 2px rgba(0,0,0,0.075); + -moz-box-sizing: border-box; + box-sizing: border-box; + transition: all 0.15s ease-in; + -webkit-transition: all 0.15s ease-in 0; + vertical-align: middle; + } +} +.add-pill-form { + margin-top: 15px; + padding: 4px 5px; + background: #f5f5f5; + font-size: 12px; + color: #333; + border: 1px solid #ddd; + border-radius: 5px; + position: relative; + height: 40px; + input[type=text] { + font-size: 14px; + width: 350px; + padding: 2px 5px; + color: #666; + width: 332px; + margin-bottom: 1px; + } +} +.autocomplete-results { + display: none; + position: absolute; + max-height: 20em; + list-style: none; + background: #fff; + border: 1px solid #c1c1c1; + border-radius: 3px; + box-shadow: 0 0 5px rgba(0,0,0,0.3); + overflow-y: auto; + font-size: 13px; + z-index: 99; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.autocomplete-group { + width: 100%; + overflow: hidden; + border-radius: 0 0 3px 3px; + &:first-child { + border-radius: 3px; + } +} +.button, .minibutton { + position: relative; + display: inline-block; + padding: 7px 15px; + font-size: 13px; + font-weight: bold; + color: #333; + text-shadow: 0 1px 0 rgba(255,255,255,0.9); + white-space: nowrap; + background-color: #eaeaea; + background-image: -moz-linear-gradient(#fafafa, #eaeaea); + background-image: -webkit-linear-gradient(#fafafa, #eaeaea); + background-image: linear-gradient(#fafafa, #eaeaea); + background-repeat: repeat-x; + border-radius: 3px; + border: 1px solid #ddd; + border-bottom-color: #c5c5c5; + box-shadow: 0 1px 3px rgba(0,0,0,0.075); + vertical-align: middle; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-appearance: none; +} +.minibutton { + padding: 0 10px; + line-height: 24px; + box-shadow: none; +} +.button:hover, .button:active, .minibutton:hover, .minibutton:active { + color: #fff; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0,0,0,0.25); + background-color: #3072b3; + background-image: -moz-linear-gradient(#599bcd, #3072b3); + background-image: -webkit-linear-gradient(#599bcd, #3072b3); + background-image: linear-gradient(#599bcd, #3072b3); + background-repeat: repeat-x; + border-color: #2a65a0; +} +.team-setting-item { + margin-top: 15px; + border-radius: 5px; + h2 { + margin: 15px 0 15px 0; + font-size: 18px; + font-weight: normal; + color: #666; + } +} diff --git a/hub/static/css/app/team.scss b/hub/static/css/app/team.scss new file mode 100644 index 0000000..c859d4c --- /dev/null +++ b/hub/static/css/app/team.scss @@ -0,0 +1,8 @@ +@import "css/mod/common"; +@import "css/mod/team-header"; +@import "css/mod/timeline"; +@import "css/mod/my-projects"; + +.text-center .add_team_btn { + margin-left: 150px; +} diff --git a/hub/static/css/app/teams.scss b/hub/static/css/app/teams.scss new file mode 100644 index 0000000..e40475f --- /dev/null +++ b/hub/static/css/app/teams.scss @@ -0,0 +1,223 @@ +@import "css/mod/common"; +img { + border: 0; + -ms-interpolation-mode: bicubic; +} +.cf { + zoom: 1; + &:before { + content: ""; + display: table; + } + .cf:after { + clear: both; + content: ""; + display: table; + } +} +ul { + list-style: none; + display: block; + -webkit-margin-before: 1em; + -webkit-margin-after: 1em; + -webkit-margin-start: 0px; + -webkit-margin-end: 0px; +} +h3 { + font-family: "MuseoSans-500", arial, sans-serif; +} +h2 { + display: block; + font-size: 1.5em; + -webkit-margin-before: 0.83em; + -webkit-margin-after: 0.83em; + -webkit-margin-start: 0px; + -webkit-margin-end: 0px; + font-weight: bold; +} +.featured-team-list { + width:940px; + a { + text-decoration: none; + } + &>li { + text-align: -webkit-match-parent; + display: inline-block; + vertical-align: top; + width: 450px; + margin-left: 32px; + margin-bottom: 30px; + background: #fff; + border: 1px solid #c1ccd4; + position: relative; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; + .image { + height: 150px; + line-height: 150px; + text-align: center; + img { + max-width: 100%; + max-height: 100%; + vertical-align: middle; + } + } + header { + border-bottom: solid 1px #eaeaea; + display: block; + h2 { + font-size: 1.5em; + margin-bottom: 3px; + color: #343131; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + -o-text-overflow: ellipsis; + -ms-text-overflow: ellipsis; + height: 22px; + margin-top: 1px; + line-height: 20px; + } + h3 { + font-size: 1.0em; + color: #5d5d5d; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + -o-text-overflow: ellipsis; + -ms-text-overflow: ellipsis; + height: 16px; + margin-top: 1px; + margin-bottom: 1px; + line-height: 20px; + } + .avatar { + float: left; + margin-right: 15px; + img { + display: block; + width: 39px; + height: 39px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; + } + } + } + .team-link { + display: block; + padding: 20px; + height: 40px; + -webkit-transform: translate3d(0, 0, 0); + text-rendering: optimizeLegibility; + -webkit-font-smoothing: subpixel-antialiased; + -moz-font-smoothing: subpixel-antialiased; + font-smoothing: subpixel-antialiased; + -webkit-transition: all 0.2s ease-out; + -moz-transition: all 0.2s ease-out; + -ms-transition: all 0.2s ease-out; + -o-transition: all 0.2s ease-out; + transition: all 0.2s ease-out; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + } + .hiring-ribbon { + position: absolute; + z-index: 100; + width: 76px; + height: 77px; + top: -6px; + right: -5px; + background: url('/static/img/join_team.png') no-repeat; + span { + display: none; + } + } + &:nth-child(odd) { + margin-left: 0; + } + .content { + padding: 20px; + -webkit-box-shadow: inset 0px 0px 2px 2px #ffffff; + box-shadow: inset 0px 0px 2px 2px #ffffff; + background: url('/static/img/team_paper_texture.jpg') repeat; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + } + footer { + border-top: solid 1px #eaeaea; + padding-top: 20px; + height: 26px; + .more-members { + float: right; + width: 24px; + height: 24px; + line-height: 26px; + text-align: center; + border: 1px solid #eaeaea; + background: #eaeaea; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; + } + .members { + float: right; + margin-right: 10px; + margin-top: 0px; + li { + float: left; + margin-left: 10px; + a { + display: block; + width: 26px; + height: 26px; + overflow: hidden; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; + img { + width: 26px; + height: 26px; + } + } + } + } + } + } +} +.pagehead { + h2 { + margin: 0; + font-size: 30px; + line-height: 36px; + float: left; + } + .teams-right { + float: right; + width: 100px; + } +} +.add_team { + float: left; + margin-right: 5px; +} +.clearfix { + display: block; +} diff --git a/hub/static/css/app/ticket.scss b/hub/static/css/app/ticket.scss new file mode 100644 index 0000000..1ad03a2 --- /dev/null +++ b/hub/static/css/app/ticket.scss @@ -0,0 +1,44 @@ +@import "css/mod/common"; + +/* TODO Refactor the following mods into components */ +@import "css/mod/pull-request"; +@import "css/mod/pull-comment"; +@import "css/mod/pull-codereview"; +@import "css/mod/pull-github"; +@import "css/mod/pull-highlight"; +@import "css/mod/pull-ticket"; + +/* Like these */ +@import "css/mod/pullrequest-pull-head"; +@import "css/mod/pullrequest-pull-head-responsive"; +@import "css/mod/project-info"; +@import "css/mod/commits-condensed"; +@import "css/mod/file-diff-blob"; +@import "css/mod/merge-guide"; +@import "css/mod/diffs-pane"; +@import "css/mod/user-card"; +@import "css/mod/team-card"; +@import "css/mod/inline-comment"; +@import "css/mod/comment-form"; +@import "css/mod/text-truncate"; +@import "css/mod/markdown-content"; +@import "css/mod/upload-widget"; +@import "css/mod/quick-emoji"; +@import "css/mod/checkbox"; + +// TODO: refac pr and commit 's css +.mini-icon-commit-comment:before { + content: "\f02b"; +} + +// hack // refactor this +#files .file .meta .info { + max-width: 410px !important; + + .patch-title { + padding: 0; + margin: 0; + border: 0; + box-shadow: none; + } +} diff --git a/hub/static/css/app/watchers.scss b/hub/static/css/app/watchers.scss new file mode 100644 index 0000000..7fb437f --- /dev/null +++ b/hub/static/css/app/watchers.scss @@ -0,0 +1,26 @@ +@import "css/mod/common"; +@import "css/mod/minibutton"; +@import "css/mod/meta-nav"; + +.userlist{ + padding: 5px; +} + +.gray { + color: #ccc; + margin-top: 10px; + padding: 5px; +} + +.userlist .user { + margin-top: 15px; +} + +.userlist .user img { + width: 32px; + height: 32px; +} + +.userlist a { + margin-right: 10px; +} diff --git a/hub/static/css/app/watching.scss b/hub/static/css/app/watching.scss new file mode 100644 index 0000000..7b58582 --- /dev/null +++ b/hub/static/css/app/watching.scss @@ -0,0 +1,6 @@ +@import "css/mod/common"; +@import "css/mod/setting-box"; + +.settings-content { width:60% } +.watch-btn { display:inline-table; float:right } +li.inline-list { clear:both; margin:2px 5px;} diff --git a/hub/static/css/board.css b/hub/static/css/board.css new file mode 100644 index 0000000..368a42f --- /dev/null +++ b/hub/static/css/board.css @@ -0,0 +1,280 @@ +@charset "utf-8"; +/*============================================================ +@prefix : <http://purl.org/net/ns/doas#> . +<> a :CSSStylesheet; + :title "style.css"; + :shortdesc "CSS3 BOX STYLE for Apple Safri and iOS Safari"; + :created "2011-01-27"; + :release [:revision "0.1"; :created "2011-01-27"]; + :author [:name "Kouji Tsuru (Pafuxu)"] . +==============================================================*/ + + + +/* reset styles +--------------------------------------------- */ + +html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td { + margin: 0; + padding: 0; + font-size: 100%; + vertical-align: baseline; + border: 0; + outline: 0; + background: transparent; + } +ol, ul { + list-style: none; + } +blockquote, q { + quotes: none; + } +table { + border-collapse: collapse; + border-spacing: 0; + } + +/* master styles +--------------------------------------------- */ + +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + color: #333; + font-size: 62.5%; + background: #474747; + background: url('/static/img/board_bg.png'); + } + +/* links */ + +a:link, a:visited { + color: #6cc3ff; + outline: none; + text-decoration: none; + } +a:hover { + text-decoration: none; + color: #205f82; + } + +/* page structure +--------------------------------------------- */ +#header, #content { + position: relative; + width: 1200px; + margin: 0 auto; + padding: 0; + } +#content { + padding: 20px; + background-color: white; + background: -webkit-linear-gradient(top, white 0%, #F3F3F3 100%); + background: -moz-linear-gradient(top, white 0%, #F3F3F3 100%); + border: 0; + -webkit-border-radius: 8px; + -webkit-box-sizing: border-box; + -webkit-box-shadow: 0 0 10px white; + -moz-border-radius: 8px; + -moz-box-sizing: border-box; + -moz-box-shadow: 0 0 10px white; + } +section { + float: left; + position: relative; + width: 220px; + margin-right: 10px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + } + +.list_name { + text-align: center; + font-size: 25px; +} +.card_labels { + margin: -10px 0 3px; + zoom: 1; +} +.card_label { + float: left; + width: 30px; + height: 4px; + padding: 0; + margin-right: 5px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + text-shadow: 0 1px rgba(0, 0, 0, 0.4), 0 0 3px black; +} +.card_members { + float: right; + margin: 2px -7px -5px 0; +} +.member { + float: right; +} +.input_h_28 { + height: 28px; +} +.control-label { + font-weight: bold; +} + +.note { + margin-top: 30px; + padding: 16px; + background-color: rgba(0, 0, 0, .5); + border: 0; + -webkit-border-radius: 8px; + -webkit-box-shadow: inset 0 1px 5px rgba(0, 0, 0, .2); + -moz-border-radius: 8px; + -moz-box-shadow: inset 0 1px 5px rgba(0, 0, 0, .2); + } + +/* box styles +--------------------------------------------- */ +.rBox { + padding: 10px 12px; + background-color: white; + border: 1px solid #ababab; + -webkit-border-radius: 7px; + -moz-border-radius: 7px; + margin-bottom: 10px; + overflow: auto; + } +.grBox { + padding: 8px 16px; + background-color: #e3e6e9; + background-image: -webkit-gradient(linear, left top, left bottom, from(#e5e8eb), to(#e3e6e9)); + background-image: -moz-gradient(linear, left top, left bottom, from(#e5e8eb), to(#e3e6e9)); + border: 1px solid #ababab; + -webkit-border-radius: 7px 7px 0 0; + -webkit-box-shadow: inset 0 1px 1px white; + -moz-border-radius: 7px 7px 0 0; + -moz-box-shadow: inset 0 1px 1px white; + overflow: auto; + } +.grBox + .rBox { + border-top: 0; + -webkit-border-radius: 0 0 7px 7px; + -moz-border-radius: 0 0 7px 7px; + } +.inBox { + margin-top: 8px; + padding: 10px; + background-color: #fff; + border: 1px solid #878787; + -webkit-border-radius: 3px; + -webkit-box-shadow: 0 1px 1px #fff, inset 0 1px 5px rgba(0, 0, 0, .2); + -moz-border-radius: 3px; + -moz-box-shadow: 0 1px 1px #fff, inset 0 1px 5px rgba(0, 0, 0, .2); + } +.grBox.inner { + padding-bottom: 16px; + -webkit-border-radius: 7px; + -moz-border-radius: 7px; + } +.rList { + padding: 0; + background-color: white; + border: 1px solid #ababab; + -webkit-border-radius: 7px; + -moz-border-radius: 7px; + } +.rList li { + position: relative; + border-top: 1px solid #ababab; + padding: 10px 25px 10px 10px; + -webkit-transition: all 0.3s ease; + -moz-transition: all 0.3s ease; + } +.rList li:first-child { + border-top: 0; + -webkit-border-radius: 7px 7px 0 0; + -moz-border-radius: 7px 7px 0 0; + } +.rList li:last-child { + -webkit-border-radius: 0 0 7px 7px; + -moz-border-radius: 0 0 7px 7px; + } +.rList li:hover { + background-color: rgba(213, 233, 237, .5); + } +.rList li a { + display: block; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + padding: 8px; + margin: -8px; + } +.grBox + .rList, .grBox + .rList li:first-child { + border-top: 0; + -webkit-border-radius: 0 0 7px 7px; + -moz-border-radius: 0 0 7px 7px; + } + +/* list arrow */ + +.listArrow { + background: url(./img/hi-arrow.png) no-repeat right center; + -webkit-background-size: 18px 13px; + -moz-background-size: 18px 13px; + } + +/* text styles +--------------------------------------------- */ + +#header .title { + padding: 10px 10px 10px 30px; + text-align: center; + font-family: "League-Gothic", Courier; + font-size: 50px; + text-transform: uppercase; + color: white; + text-shadow: 0px 2px 3px #666; + + } +section .title { + font-size: 14px; + text-shadow: 0 1px 2px white; + } +section p { + font-size: 12px; + margin-bottom: 10px; + } +section p:last-child { + margin-bottom: 0; + } +section li > a { + font-size: 14px; + } +.note p { + color: white; + font-size: 12px; + line-height: 1.5; + } + +#back_proj { + right: 0; + padding: 10px 20px; + border-radius: 10px 0 0 0; + position: fixed; + z-index: 9999999; + bottom: 0; + background: rgba(10, 10, 10, 0.5); + font-family: Helvetica, Arial, sans-serif; + font-weight: normal; + font-size: 20px; + color: white; + text-shadow: 1px 1px 0 transparent, 2px 2px 0 #101010; +} + +#back_proj a, a:visited { + color: white; + text-decoration: none; + border-bottom: 2px dotted; + border: none; + -webkit-transition: color 0.2s; + -moz-transition: color 0.2s; +} diff --git a/vilya/static/css/code.css b/hub/static/css/code.css similarity index 100% rename from vilya/static/css/code.css rename to hub/static/css/code.css diff --git a/vilya/static/css/embed.css b/hub/static/css/embed.css similarity index 100% rename from vilya/static/css/embed.css rename to hub/static/css/embed.css diff --git a/hub/static/css/fonts/SourceCodePro-Bold.woff b/hub/static/css/fonts/SourceCodePro-Bold.woff new file mode 100644 index 0000000..e2a8674 Binary files /dev/null and b/hub/static/css/fonts/SourceCodePro-Bold.woff differ diff --git a/hub/static/css/fonts/SourceCodePro-Medium.woff b/hub/static/css/fonts/SourceCodePro-Medium.woff new file mode 100644 index 0000000..87ca94d Binary files /dev/null and b/hub/static/css/fonts/SourceCodePro-Medium.woff differ diff --git a/hub/static/css/fonts/SourceCodePro-Regular.woff b/hub/static/css/fonts/SourceCodePro-Regular.woff new file mode 100644 index 0000000..6172046 Binary files /dev/null and b/hub/static/css/fonts/SourceCodePro-Regular.woff differ diff --git a/hub/static/css/fonts/SourceCodePro-Semibold.woff b/hub/static/css/fonts/SourceCodePro-Semibold.woff new file mode 100644 index 0000000..145df81 Binary files /dev/null and b/hub/static/css/fonts/SourceCodePro-Semibold.woff differ diff --git a/hub/static/css/fonts/glyphiconshalflings-regular.eot b/hub/static/css/fonts/glyphiconshalflings-regular.eot new file mode 100644 index 0000000..bd59ccd Binary files /dev/null and b/hub/static/css/fonts/glyphiconshalflings-regular.eot differ diff --git a/hub/static/css/fonts/glyphiconshalflings-regular.otf b/hub/static/css/fonts/glyphiconshalflings-regular.otf new file mode 100644 index 0000000..b058f1c Binary files /dev/null and b/hub/static/css/fonts/glyphiconshalflings-regular.otf differ diff --git a/vilya/static/css/fonts/glyphicons-halflings-regular.svg b/hub/static/css/fonts/glyphiconshalflings-regular.svg similarity index 54% rename from vilya/static/css/fonts/glyphicons-halflings-regular.svg rename to hub/static/css/fonts/glyphiconshalflings-regular.svg index 4469488..0fb4587 100644 --- a/vilya/static/css/fonts/glyphicons-halflings-regular.svg +++ b/hub/static/css/fonts/glyphiconshalflings-regular.svg @@ -12,32 +12,17 @@ <glyph unicode=" " /> <glyph unicode="*" d="M100 500v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259z" /> <glyph unicode="+" d="M0 400v300h400v400h300v-400h400v-300h-400v-400h-300v400h-400z" /> -<glyph unicode=" " /> -<glyph unicode=" " horiz-adv-x="652" /> -<glyph unicode=" " horiz-adv-x="1304" /> -<glyph unicode=" " horiz-adv-x="652" /> -<glyph unicode=" " horiz-adv-x="1304" /> -<glyph unicode=" " horiz-adv-x="434" /> -<glyph unicode=" " horiz-adv-x="326" /> -<glyph unicode=" " horiz-adv-x="217" /> -<glyph unicode=" " horiz-adv-x="217" /> -<glyph unicode=" " horiz-adv-x="163" /> -<glyph unicode=" " horiz-adv-x="260" /> -<glyph unicode=" " horiz-adv-x="72" /> -<glyph unicode=" " horiz-adv-x="260" /> -<glyph unicode=" " horiz-adv-x="326" /> -<glyph unicode="€" d="M100 500l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-62.5 -32t-65.5 -67t-50.5 -107h379l-100 -100h-300q-6 -46 -6 -100h406l-100 -100 h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-205 0 -324 158q-36 46 -69 131.5t-45 205.5h-217z" /> +<glyph unicode="€" d="M100 500l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-63 -32t-65.5 -67t-50 -107h379l-100 -100h-300q-6 -46 -6 -100h406l-100 -100 h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-207 0 -324 158q-36 46 -69 131.5t-45 205.5h-217z" /> <glyph unicode="−" d="M200 400h900v300h-900v-300z" /> -<glyph unicode="☁" d="M-14 494q0 -80 56.5 -137t135.5 -57h750q120 0 205 86t85 208q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5z" /> <glyph unicode="✉" d="M0 100l400 400l200 -200l200 200l400 -400h-1200zM0 300v600l300 -300zM0 1100l600 -603l600 603h-1200zM900 600l300 300v-600z" /> <glyph unicode="✏" d="M-13 -13l333 112l-223 223zM187 403l214 -214l614 614l-214 214zM887 1103l214 -214l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13z" /> <glyph unicode="" horiz-adv-x="500" d="M0 0z" /> <glyph unicode="" d="M0 1200h1200l-500 -550v-550h300v-100h-800v100h300v550z" /> -<glyph unicode="" d="M14 84q18 -55 86 -75.5t147 5.5q65 21 109 69t44 90v606l600 155v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q17 -55 85.5 -75.5t147.5 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7 q-79 -25 -122.5 -82t-25.5 -112z" /> +<glyph unicode="" d="M14 84q18 -55 86 -75.5t147 5.5q65 21 109 69t44 90v606l600 155v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q18 -55 86 -75.5t147 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7 q-79 -25 -122.5 -82t-25.5 -112z" /> <glyph unicode="" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233z" /> <glyph unicode="" d="M100 784q0 64 28 123t73 100.5t104.5 64t119 20.5t120 -38.5t104.5 -104.5q48 69 109.5 105t121.5 38t118.5 -20.5t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-149.5 152.5t-126.5 127.5 t-94 124.5t-33.5 117.5z" /> -<glyph unicode="" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1z" /> -<glyph unicode="" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1zM237 700l196 -142l-73 -226l192 140l195 -141l-74 229l193 140h-235l-77 211l-78 -211h-239z" /> +<glyph unicode="" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447z" /> +<glyph unicode="" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM237 700l196 -142l-73 -226l192 140l195 -141l-74 229l193 140h-235l-77 211l-78 -211h-239z" /> <glyph unicode="" d="M0 0v143l400 257v100q-37 0 -68.5 74.5t-31.5 125.5v200q0 124 88 212t212 88t212 -88t88 -212v-200q0 -51 -31.5 -125.5t-68.5 -74.5v-100l400 -257v-143h-1200z" /> <glyph unicode="" d="M0 0v1100h1200v-1100h-1200zM100 100h100v100h-100v-100zM100 300h100v100h-100v-100zM100 500h100v100h-100v-100zM100 700h100v100h-100v-100zM100 900h100v100h-100v-100zM300 100h600v400h-600v-400zM300 600h600v400h-600v-400zM1000 100h100v100h-100v-100z M1000 300h100v100h-100v-100zM1000 500h100v100h-100v-100zM1000 700h100v100h-100v-100zM1000 900h100v100h-100v-100z" /> <glyph unicode="" d="M0 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM0 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5zM600 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM600 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5z" /> @@ -53,22 +38,22 @@ <glyph unicode="" d="M100 1025v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18zM200 100v800h900v-800q0 -41 -29.5 -71t-70.5 -30h-700q-41 0 -70.5 30 t-29.5 71zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM500 1100h300v100h-300v-100zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" /> <glyph unicode="" d="M1 601l656 644l644 -644h-200v-600h-300v400h-300v-400h-300v600h-200z" /> <glyph unicode="" d="M100 25v1150q0 11 7 18t18 7h475v-500h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18zM700 800v300l300 -300h-300z" /> -<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 500v400h100 v-300h200v-100h-300z" /> +<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM173 600q0 -176 125 -301.5t302 -125.5t302 125.5t125 301.5 q0 177 -125 302t-302 125t-302 -125t-125 -302zM500 500v400h100v-300h200v-100h-300z" /> <glyph unicode="" d="M-100 0l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538l-41 400h-242l-40 -400h-539zM488 500h224l-27 300h-170z" /> <glyph unicode="" d="M0 0v400h490l-290 300h200v500h300v-500h200l-290 -300h490v-400h-1100zM813 200h175v100h-175v-100z" /> -<glyph unicode="" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM188 600q0 -170 121 -291t291 -121t291 121t121 291t-121 291t-291 121 t-291 -121t-121 -291zM350 600h150v300h200v-300h150l-250 -300z" /> -<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM350 600l250 300 l250 -300h-150v-300h-200v300h-150z" /> +<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM173 600q0 -176 125 -301.5t302 -125.5t302 125.5t125 301.5 q0 177 -125 302t-302 125t-302 -125t-125 -302zM350 600h150v300h200v-300h150l-250 -300z" /> +<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM173 600q0 -176 125 -301.5t302 -125.5t302 125.5t125 301.5 q0 177 -125 302t-302 125t-302 -125t-125 -302zM350 600h150v-300h200v300h150l-250 300z" /> <glyph unicode="" d="M0 25v475l200 700h800q199 -700 200 -700v-475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18zM200 500h200l50 -200h300l50 200h200l-97 500h-606z" /> -<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 397v401 l297 -200z" /> +<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM173 601q0 -176 125 -301.5t302 -125.5t302 125.5t125 301.5 q0 177 -125 302t-302 125t-302 -125t-125 -302zM500 397v401l297 -200z" /> <glyph unicode="" d="M23 600q0 -118 45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123t123 184t45.5 224.5h-150q0 -177 -125 -302t-302 -125t-302 125t-125 302t125 302t302 125q136 0 246 -81l-146 -146h400v400l-145 -145q-157 122 -355 122q-118 0 -224.5 -45.5t-184 -123 t-123 -184t-45.5 -224.5z" /> <glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150zM100 0v400h400l-147 -147q112 -80 247 -80q177 0 302 125t125 302h150q0 -118 -45.5 -224.5t-123 -184t-184 -123 t-224.5 -45.5q-198 0 -355 122z" /> <glyph unicode="" d="M100 0h1100v1200h-1100v-1200zM200 100v900h900v-900h-900zM300 200v100h100v-100h-100zM300 400v100h100v-100h-100zM300 600v100h100v-100h-100zM300 800v100h100v-100h-100zM500 200h500v100h-500v-100zM500 400v100h500v-100h-500zM500 600v100h500v-100h-500z M500 800v100h500v-100h-500z" /> <glyph unicode="" d="M0 100v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200h100q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-900q-41 0 -70.5 29.5t-29.5 70.5zM400 800h300v150q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-150z" /> <glyph unicode="" d="M100 0v1100h100v-1100h-100zM300 400q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500z" /> -<glyph unicode="" d="M0 275q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5 t-49.5 -227v-300zM200 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14zM800 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14z" /> +<glyph unicode="" d="M0 275q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v275v25q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5 t-49.5 -227v-300zM200 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14zM800 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14z" /> <glyph unicode="" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM688 459l141 141l-141 141l71 71l141 -141l141 141l71 -71l-141 -141l141 -141l-71 -71l-141 141l-141 -141z" /> <glyph unicode="" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" /> -<glyph unicode="" d="M0 401v400h300l300 200v-800l-300 200h-300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257zM889 951l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8l81 -66l6 8q142 178 142 405q0 230 -144 408l-6 8z" /> +<glyph unicode="" d="M0 401v400h300l300 200v-800l-300 200h-300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 108 86 248q0 145 -93 257zM889 951l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8l81 -66l6 8q142 178 142 405q0 230 -144 408l-6 8z" /> <glyph unicode="" d="M0 0h500v500h-200v100h-100v-100h-200v-500zM0 600h100v100h400v100h100v100h-100v300h-500v-600zM100 100v300h300v-300h-300zM100 800v300h300v-300h-300zM200 200v100h100v-100h-100zM200 900h100v100h-100v-100zM500 500v100h300v-300h200v-100h-100v-100h-200v100 h-100v100h100v200h-200zM600 0v100h100v-100h-100zM600 1000h100v-300h200v-300h300v200h-200v100h200v500h-600v-200zM800 800v300h300v-300h-300zM900 0v100h300v-100h-300zM900 900v100h100v-100h-100zM1100 200v100h100v-100h-100z" /> <glyph unicode="" d="M0 200h100v1000h-100v-1000zM100 0v100h300v-100h-300zM200 200v1000h100v-1000h-100zM500 0v91h100v-91h-100zM500 200v1000h200v-1000h-200zM700 0v91h100v-91h-100zM800 200v1000h100v-1000h-100zM900 0v91h200v-91h-200zM1000 200v1000h200v-1000h-200z" /> <glyph unicode="" d="M1 700v475q0 10 7.5 17.5t17.5 7.5h474l700 -700l-500 -500zM148 953q0 -42 29 -71q30 -30 71.5 -30t71.5 30q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71z" /> @@ -77,8 +62,8 @@ <glyph unicode="" d="M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z" /> <glyph unicode="" d="M0 100v700h200l100 -200h600l100 200h200v-700h-200v200h-800v-200h-200zM253 829l40 -124h592l62 124l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18zM281 24l38 152q2 10 11.5 17t19.5 7h500q10 0 19.5 -7t11.5 -17l38 -152q2 -10 -3.5 -17t-15.5 -7h-600 q-10 0 -15.5 7t-3.5 17z" /> <glyph unicode="" d="M0 200q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-150q-4 8 -11.5 21.5t-33 48t-53 61t-69 48t-83.5 21.5h-200q-41 0 -82 -20.5t-70 -50t-52 -59t-34 -50.5l-12 -20h-150q-41 0 -70.5 -29.5t-29.5 -70.5v-600z M356 500q0 100 72 172t172 72t172 -72t72 -172t-72 -172t-172 -72t-172 72t-72 172zM494 500q0 -44 31 -75t75 -31t75 31t31 75t-31 75t-75 31t-75 -31t-31 -75zM900 700v100h100v-100h-100z" /> -<glyph unicode="" d="M53 0h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66zM416 521l178 457l46 -140l116 -317h-340 z" /> -<glyph unicode="" d="M100 0v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21t-29 14t-49 14.5v70h471q120 0 213 -88t93 -228q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129q0 -84 -59 -156.5t-142 -111 t-162 -38.5h-500zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400zM400 700h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5v-379z" /> +<glyph unicode="" d="M53 0h365v66q-41 0 -72 11t-49 38t1 71l92 234h391q67 -181 82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66zM416 521l178 457l46 -140 l116 -317h-340z" /> +<glyph unicode="" d="M100 0v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21t-29 13.5t-49 14v71h471q76 0 145.5 -37.5t115 -111.5t45.5 -167q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129 q0 -84 -59 -156.5t-142 -111t-162 -38.5h-500zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400zM400 700h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5v-379z" /> <glyph unicode="" d="M200 0v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425l2 -57q-33 -8 -62 -25.5t-46 -37t-29.5 -38t-17.5 -30.5l-5 -12l-128 -825q-10 -52 14 -82t95 -36v-57h-500z" /> <glyph unicode="" d="M-75 200h75v800h-75l125 167l125 -167h-75v-800h75l-125 -167zM300 900v300h150h700h150v-300h-50q0 29 -8 48.5t-18.5 30t-33.5 15t-39.5 5.5t-50.5 1h-200v-850l100 -50v-100h-400v100l100 50v850h-200q-34 0 -50.5 -1t-40 -5.5t-33.5 -15t-18.5 -30t-8.5 -48.5h-49z " /> <glyph unicode="" d="M33 51l167 125v-75h800v75l167 -125l-167 -125v75h-800v-75zM100 901v300h150h700h150v-300h-50q0 29 -8 48.5t-18 30t-33.5 15t-40 5.5t-50.5 1h-200v-650l100 -50v-100h-400v100l100 50v650h-200q-34 0 -50.5 -1t-39.5 -5.5t-33.5 -15t-18.5 -30t-8 -48.5h-50z" /> @@ -91,10 +76,10 @@ <glyph unicode="" d="M1 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 650 q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM801 0v1100h100v-1100 h-100zM934 550l167 -125v75h200v100h-200v75z" /> <glyph unicode="" d="M0 275v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53zM900 600l300 300v-600z" /> <glyph unicode="" d="M0 44v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31zM100 263l247 182l298 -131l-74 156l293 318l236 -288v500h-1000v-737zM208 750q0 56 39 95t95 39t95 -39t39 -95t-39 -95t-95 -39t-95 39t-39 95z " /> -<glyph unicode="" d="M148 745q0 124 60.5 231.5t165 172t226.5 64.5q123 0 227 -63t164.5 -169.5t60.5 -229.5t-73 -272q-73 -114 -166.5 -237t-150.5 -189l-57 -66q-10 9 -27 26t-66.5 70.5t-96 109t-104 135.5t-100.5 155q-63 139 -63 262zM342 772q0 -107 75.5 -182.5t181.5 -75.5 q107 0 182.5 75.5t75.5 182.5t-75.5 182t-182.5 75t-182 -75.5t-75 -181.5z" /> -<glyph unicode="" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM173 600q0 -177 125.5 -302t301.5 -125v854q-176 0 -301.5 -125 t-125.5 -302z" /> +<glyph unicode="" d="M219 725q0 -116 60 -249q65 -114 158.5 -231.5t154.5 -178.5l61 -61q22 25 59.5 69t132 167t163.5 231q70 142 70 258q0 117 -57.5 218.5t-156.5 161t-216 59.5q-116 0 -215 -61t-156.5 -163.5t-57.5 -219.5zM431 752q0 92 64.5 157t156.5 65t157 -65t65 -157t-65 -156.5 t-157 -64.5t-156.5 64.5t-64.5 156.5z" /> +<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM173 600q0 -176 125 -301.5t302 -125.5v854q-177 0 -302 -125t-125 -302z " /> <glyph unicode="" d="M117 406q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5q21 -71 57.5 -142.5t76 -130.5t83 -118.5t82 -117t70 -116t50 -125.5t18.5 -136q0 -89 -39 -165.5t-102 -126.5t-140 -79.5t-156 -33.5q-114 6 -211.5 53t-161.5 138.5t-64 210.5zM243 414q14 -82 59.5 -136 t136.5 -80l16 98q-7 6 -18 17t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156z" /> -<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125l200 200v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM436 341l161 50l412 412l-114 113l-405 -405zM995 1015l113 -113l113 113l-21 85l-92 28z" /> +<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125l200 200v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM436 341l161 50l412 412l-114 113l-405 -405zM994 1015l114 -113l113 113l-21 85l-92 28z" /> <glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h261l2 -80q-133 -32 -218 -120h-145q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5 zM423 524q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209l360 324l-359 318v-216q-7 0 -19 -1t-48 -8t-69.5 -18.5t-76.5 -37t-76.5 -59t-62 -88t-39.5 -121.5z" /> <glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM342 632l283 -284l566 567l-136 137l-430 -431l-147 147z" /> <glyph unicode="" d="M0 603l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296l-300 -300v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198z" /> @@ -108,73 +93,73 @@ <glyph unicode="" d="M0 0v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v488z" /> <glyph unicode="" d="M300 0v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438z" /> <glyph unicode="" d="M100 250v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5zM100 500h1100l-550 564z" /> -<glyph unicode="" d="M185 599l592 -592l240 240l-353 353l353 353l-240 240z" /> -<glyph unicode="" d="M272 194l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1l-592 -591z" /> -<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -300t-217.5 -218t-299.5 -80t-299.5 80t-217.5 218t-80 300zM300 500h200v-200h200v200h200v200h-200v200h-200v-200h-200v-200z" /> -<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -300t-217.5 -218t-299.5 -80t-299.5 80t-217.5 218t-80 300zM300 500h600v200h-600v-200z" /> -<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -300t-217.5 -218t-299.5 -80t-299.5 80t-217.5 218t-80 300zM246 459l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141l-141 142l-212 -213l141 -141z" /> -<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM270 551l276 -277l411 411l-175 174l-236 -236l-102 102z" /> -<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -300t-217.5 -218t-299.5 -80t-299.5 80t-217.5 218t-80 300zM363 700h144q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5q19 0 30 -10t11 -26 q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5h200q5 3 14 8t31.5 25.5t39.5 45.5t31 69t14 94q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3q-105 0 -172 -56t-67 -183zM500 300h200v100h-200v-100z" /> -<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -300t-217.5 -218t-299.5 -80t-299.5 80t-217.5 218t-80 300zM400 300h400v100h-100v300h-300v-100h100v-200h-100v-100zM500 800h200v100h-200v-100z" /> -<glyph unicode="" d="M0 500v200h194q15 60 36 104.5t55.5 86t88 69t126.5 40.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194zM290 500q24 -73 79.5 -127.5t130.5 -78.5v206h200 v-206q149 48 201 206h-201v200h200q-25 74 -76 127.5t-124 76.5v-204h-200v203q-75 -24 -130 -77.5t-79 -125.5h209v-200h-210z" /> -<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM356 465l135 135 l-135 135l109 109l135 -135l135 135l109 -109l-135 -135l135 -135l-109 -109l-135 135l-135 -135z" /> -<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM322 537l141 141 l87 -87l204 205l142 -142l-346 -345z" /> -<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -115 62 -215l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5zM391 245q97 -59 209 -59q171 0 292.5 121.5t121.5 292.5 q0 112 -59 209z" /> +<glyph unicode="" d="M136 550v1l551 550l198 -197l-352 -353l352 -353l-198 -198z" /> +<glyph unicode="" d="M315 198l198 -198l552 550l-1 1l-551 550l-198 -197l353 -353z" /> +<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM300 500h200v-200h200v200h200v200h-200v200h-200v-200h-200v-200z" /> +<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM300 500h600v200h-600v-200z" /> +<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM247 459l212 -212l141 141l141 -141l213 212l-142 141l142 142l-213 212 l-141 -142l-141 142l-212 -212l141 -142z" /> +<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM270 551l276 -277l411 411l-175 174l-236 -236l-102 102z" /> +<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM364 700h143q4 0 11.5 -1t11 -0.5t6.5 3t3 8.5t1 11t3.5 8.5t3.5 6t5.5 4 t6.5 2.5t9 1.5t9 0.5h11.5h12.5q19 0 30 -10t11 -26q0 -21 -4.5 -27.5t-26.5 -21.5q-5 -1 -12.5 -3.5t-27 -13.5t-34 -27t-26.5 -46.5t-11 -68.5h200q5 3 14 8t31.5 25.5t39.5 46t31 69t14 93.5q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3q-50 0 -90.5 -12t-75 -38.5 t-53.5 -74.5t-19 -114zM500 300h200v100h-200v-100z" /> +<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM400 300h400v100h-100v300h-300v-100h100v-200h-100v-100zM500 800h200 v100h-200v-100z" /> +<glyph unicode="" d="M0 500v200h194q15 60 36 104.5t55.5 86t88 69t126.5 40.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h6h165h32v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194zM290 500q24 -73 79.5 -127.5t130.5 -78.5v206 h200v-206q149 48 201 206h-201v200h200q-25 74 -76 127.5t-124 76.5v-204h-200v203q-75 -24 -130 -77.5t-79 -125.5h209v-200h-210z" /> +<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM173 600q0 -176 125 -301.5t302 -125.5t302 125.5t125 301.5 q0 177 -125 302t-302 125t-302 -125t-125 -302zM384 465l135 135l-135 135l81 81l135 -135l135 135l81 -81l-135 -135l135 -135l-81 -81l-135 136l-135 -136z" /> +<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM173 600q0 -176 125 -301.5t302 -125.5t302 125.5t125 301.5 q0 177 -125 302t-302 125t-302 -125t-125 -302zM350 537l113 113l87 -87l204 204l113 -113l-317 -317z" /> +<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM173 600q0 -119 66 -225l586 587q-105 65 -225 65q-177 0 -302 -125 t-125 -302zM381 235q104 -62 219 -62q177 0 302 125.5t125 301.5q0 117 -62 219z" /> <glyph unicode="" d="M0 547l600 453v-300h600v-300h-600v-301z" /> <glyph unicode="" d="M0 400v300h600v300l600 -453l-600 -448v301h-600z" /> <glyph unicode="" d="M204 600l450 600l444 -600h-298v-600h-300v600h-296z" /> <glyph unicode="" d="M104 600h296v600h300v-600h298l-449 -600z" /> -<glyph unicode="" d="M0 200q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453l-600 -448v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5z" /> +<glyph unicode="" d="M0 200q5 105 27 193t68 167t113 135t166.5 91.5t225.5 42.5v271l600 -453l-600 -448v301q-94 -2 -182.5 -20t-170.5 -52.5t-147 -92.5t-100 -135z" /> <glyph unicode="" d="M0 0v400l129 -129l294 294l142 -142l-294 -294l129 -129h-400zM635 777l142 -142l294 294l129 -129v400h-400l129 -129z" /> -<glyph unicode="" d="M34 176l295 295l-129 129h400v-400l-129 130l-295 -295zM600 600v400l129 -129l295 295l142 -141l-295 -295l129 -130h-400z" /> +<glyph unicode="" d="M34 176l295 295l-129 129h400v-400l-129 130l-295 -295zM600 600v400l129 -129l295 295l142 -142l-295 -294l129 -130h-400z" /> <glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM456 851l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5 t21.5 34.5l58 302q4 20 -8 34.5t-33 14.5h-207q-20 0 -32 -14.5t-8 -34.5zM500 300h200v100h-200v-100z" /> <glyph unicode="" d="M0 800h100v-200h400v300h200v-300h400v200h100v100h-111v6t-1 15t-3 18l-34 172q-11 39 -41.5 63t-69.5 24q-32 0 -61 -17l-239 -144q-22 -13 -40 -35q-19 24 -40 36l-238 144q-33 18 -62 18q-39 0 -69.5 -23t-40.5 -61l-35 -177q-2 -8 -3 -18t-1 -15v-6h-111v-100z M100 0h400v400h-400v-400zM200 900q-3 0 14 48t35 96l18 47l214 -191h-281zM700 0v400h400v-400h-400zM731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269z" /> <glyph unicode="" d="M0 -22v143l216 193q-9 53 -13 83t-5.5 94t9 113t38.5 114t74 124q47 60 99.5 102.5t103 68t127.5 48t145.5 37.5t184.5 43.5t220 58.5q0 -189 -22 -343t-59 -258t-89 -181.5t-108.5 -120t-122 -68t-125.5 -30t-121.5 -1.5t-107.5 12.5t-87.5 17t-56.5 7.5l-99 -55z M238.5 300.5q19.5 -6.5 86.5 76.5q55 66 367 234q70 38 118.5 69.5t102 79t99 111.5t86.5 148q22 50 24 60t-6 19q-7 5 -17 5t-26.5 -14.5t-33.5 -39.5q-35 -51 -113.5 -108.5t-139.5 -89.5l-61 -32q-369 -197 -458 -401q-48 -111 -28.5 -117.5z" /> -<glyph unicode="" d="M111 408q0 -33 5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-5 -33 -20.5 -69.5t-37.5 -80.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5t30.5 2.5 t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60 -138t-8 -166.5q2 -12 8 -41.5t8 -43t6 -39.5 t3.5 -39.5t-1 -33.5t-6 -31.5t-13.5 -24t-21 -20.5t-31 -12q-38 -10 -67 13t-40.5 61.5t-15 81.5t10.5 75q-52 -46 -83.5 -101t-39 -107t-7.5 -85z" /> +<glyph unicode="" d="M111 408q0 -33 5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-4 -23 -14 -51.5t-20 -49t-24 -49.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5 t30.5 2.5t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60 -138t-8 -166.5q2 -12 8 -41.5 t8 -43t6 -39.5t3.5 -39.5t-1 -33.5t-6 -31.5t-13.5 -24t-21 -20.5t-31 -12q-38 -10 -67 13t-40.5 61.5t-15 81.5t10.5 75q-52 -46 -83.5 -101t-39 -107t-7.5 -85z" /> <glyph unicode="" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30l26 -40l-26 -40q-6 -10 -20 -30t-49 -63.5t-74.5 -85.5t-97 -90t-116.5 -83.5t-132.5 -59t-145.5 -23.5 t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30zM120 600q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5t123.5 20t100.5 45.5t85.5 71.5t66.5 75.5t58 81.5t47 66q-1 1 -28.5 37.5t-42 55t-43.5 53t-57.5 63.5t-58.5 54 q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l105 105q-37 24 -75 72t-57 84l-20 36z" /> -<glyph unicode="" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43zM120 600q210 -282 393 -336l37 141q-107 18 -178.5 101.5t-71.5 193.5 q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68l-14 26zM780 161l38 145q22 15 44.5 34t46 44t40.5 44t41 50.5t33.5 43.5t33 44t24.5 34q-97 127 -140 175l39 146q67 -54 131.5 -125.5t87.5 -103.5t36 -52l26 -40l-26 -40 q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5t-124 -100t-146.5 -79z" /> +<glyph unicode="" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43zM119 600q37 -48 65.5 -82.5t84 -93t118.5 -100t126 -60.5l37 141 q-107 18 -178.5 101.5t-71.5 193.5q0 85 46 158q-97 -83 -227 -258zM377 656q49 -124 154 -191l47 47l23 87q-30 28 -59.5 69t-43.5 68l-15 26zM780 161l38 145q22 15 45 34t45.5 43.5t40.5 44.5t40.5 49.5t34 44.5t32 44t24.5 34q-83 113 -139 175l38 146 q68 -54 132.5 -125.5t87.5 -103.5t36 -52l26 -40l-26 -40q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5t-124 -100t-146.5 -79z" /> <glyph unicode="" d="M-97.5 34q13.5 -34 50.5 -34h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 33 -48 36t-48 -29l-642 -1066q-21 -32 -7.5 -66zM155 200l445 723l445 -723h-345v100h-200v-100h-345zM500 600l100 -300l100 300v100h-200v-100z" /> -<glyph unicode="" d="M100 262v41q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -21 -13 -29t-32 1l-94 78h-222l-94 -78q-19 -9 -32 -1t-13 29v64 q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5z" /> +<glyph unicode="" d="M100 262v41q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -20 -13 -28.5t-32 0.5l-94 78h-222l-94 -78q-19 -9 -32 -0.5t-13 28.5 v64q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5z" /> <glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100v-750zM0 900h1100v150q0 21 -14.5 35.5t-35.5 14.5h-150v100h-100v-100h-500v100h-100v-100h-150q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 100v100h100v-100h-100zM100 300v100h100v-100h-100z M100 500v100h100v-100h-100zM300 100v100h100v-100h-100zM300 300v100h100v-100h-100zM300 500v100h100v-100h-100zM500 100v100h100v-100h-100zM500 300v100h100v-100h-100zM500 500v100h100v-100h-100zM700 100v100h100v-100h-100zM700 300v100h100v-100h-100zM700 500 v100h100v-100h-100zM900 100v100h100v-100h-100zM900 300v100h100v-100h-100zM900 500v100h100v-100h-100z" /> <glyph unicode="" d="M0 200v200h259l600 600h241v198l300 -295l-300 -300v197h-159l-600 -600h-341zM0 800h259l122 -122l141 142l-181 180h-341v-200zM678 381l141 142l122 -123h159v198l300 -295l-300 -300v197h-241z" /> <glyph unicode="" d="M0 400v600q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5z" /> -<glyph unicode="" d="M100 600v200h300v-250q0 -113 6 -145q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5t-89 96.5 t-58 109.5t-31.5 116t-15 104t-3 83zM100 900v300h300v-300h-300zM800 900v300h300v-300h-300z" /> -<glyph unicode="" d="M-30 411l227 -227l352 353l353 -353l226 227l-578 579z" /> -<glyph unicode="" d="M70 797l580 -579l578 579l-226 227l-353 -353l-352 353z" /> -<glyph unicode="" d="M-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196zM402 1000l215 -200h381v-400h-198l299 -283l299 283h-200v600h-796z" /> -<glyph unicode="" d="M18 939q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-300v-50q0 -20 -14.5 -35t-35.5 -15 t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43z" /> +<glyph unicode="" d="M100 600v200h300v-250v-26v-55.5t3.5 -50t11 -47.5t22 -37t35.5 -31.5t53.5 -18t74.5 -7.5t74.5 8t53.5 18.5t35.5 32t22 38t11 48t3.5 49.5v54v25v250h300v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5 t-89 96.5t-58 109.5t-31.5 116t-15 104t-3 83zM100 900v300h300v-300h-300zM800 900v300h300v-300h-300z" /> +<glyph unicode="" d="M-1 410l198 -198l353 353l353 -353l198 198l-550 552z" /> +<glyph unicode="" d="M99 797l551 -551l550 551l-198 198l-353 -352l-352 352z" /> +<glyph unicode="" d="M-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196zM402 1000l215 -200h381v-400h-199l300 -283l299 283h-200v600h-796z" /> +<glyph unicode="" d="M18 939q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-300v-50q0 -21 -14.5 -35.5 t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43z" /> <glyph unicode="" d="M0 0v800h1200v-800h-1200zM0 900v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-100h-1200z" /> <glyph unicode="" d="M1 0l300 700h1200l-300 -700h-1200zM1 400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000z" /> <glyph unicode="" d="M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z" /> <glyph unicode="" d="M0 600l300 298v-198h600v198l300 -298l-300 -297v197h-600v-197z" /> <glyph unicode="" d="M0 100v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM800 100h100v100h-100v-100z M1000 100h100v100h-100v-100z" /> -<glyph unicode="" d="M-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5zM99 500v250v5q0 13 0.5 18.5t2.5 13t8 10.5t15 3h200l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35q-56 337 -56 351z M1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35z" /> -<glyph unicode="" d="M74 350q0 21 13.5 35.5t33.5 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-22 -9 -63 -23t-167.5 -37 t-251.5 -23t-245.5 20.5t-178.5 41.5l-58 20q-18 7 -31 27.5t-13 40.5zM497 110q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6t-103 6z" /> +<glyph unicode="" d="M-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5zM100 500v250v8v8v7t0.5 7t1.5 5.5t2 5t3 4t4.5 3.5t6 1.5t7.5 0.5h200l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35 q-55 337 -55 351zM1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35z" /> +<glyph unicode="" d="M74 350q0 21 13.5 35.5t33.5 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94q20 0 29 -10.5t3 -29.5q-18 -36 -18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-22 -9 -63 -23 t-167.5 -37t-251.5 -23t-245.5 20.5t-178.5 41.5l-58 20q-18 7 -31 27.5t-13 40.5zM497 110q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6t-103 6z" /> <glyph unicode="" d="M21 445l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180l-155 180l-45 -233l-224 78l78 -225l-233 -44l179 -156z" /> -<glyph unicode="" d="M0 200h200v600h-200v-600zM300 275q0 -75 100 -75h61q123 -100 139 -100h250q46 0 83 57l238 344q29 31 29 74v100q0 44 -30.5 84.5t-69.5 40.5h-328q28 118 28 125v150q0 44 -30.5 84.5t-69.5 40.5h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400z M400 300v375l150 212l100 213h50v-175l-50 -225h450v-125l-250 -375h-214l-136 100h-100z" /> -<glyph unicode="" d="M0 400v600h200v-600h-200zM300 525v400q0 75 100 75h61q123 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5h-50q-27 0 -51 20t-38 48l-96 198l-145 196 q-20 26 -20 63zM400 525l150 -212l100 -213h50v175l-50 225h450v125l-250 375h-214l-136 -100h-100v-375z" /> -<glyph unicode="" d="M8 200v600h200v-600h-200zM308 275v525q0 17 14 35.5t28 28.5l14 9l362 230q14 6 25 6q17 0 29 -12l109 -112q14 -14 14 -34q0 -18 -11 -32l-85 -121h302q85 0 138.5 -38t53.5 -110t-54.5 -111t-138.5 -39h-107l-130 -339q-7 -22 -20.5 -41.5t-28.5 -19.5h-341 q-7 0 -90 81t-83 94zM408 289l100 -89h293l131 339q6 21 19.5 41t28.5 20h203q16 0 25 15t9 36q0 20 -9 34.5t-25 14.5h-457h-6.5h-7.5t-6.5 0.5t-6 1t-5 1.5t-5.5 2.5t-4 4t-4 5.5q-5 12 -5 20q0 14 10 27l147 183l-86 83l-339 -236v-503z" /> -<glyph unicode="" d="M-101 651q0 72 54 110t139 37h302l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6l365 -230q7 -4 16.5 -10.5t26 -26t16.5 -36.5v-526q0 -13 -85.5 -93.5t-93.5 -80.5h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-84 0 -139 39t-55 111zM-1 601h222 q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l106 89v502l-342 237l-87 -83l145 -184q10 -11 10 -26q0 -11 -5 -20q-1 -3 -3.5 -5.5l-4 -4t-5 -2.5t-5.5 -1.5t-6.5 -1t-6.5 -0.5h-7.5h-6.5h-476v-100zM999 201v600h200v-600h-200z" /> -<glyph unicode="" d="M97 719l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53zM172 739l83 86l183 -146 q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6v7.5v7v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294l-89 -100h-503zM400 0v200h600v-200h-600z" /> -<glyph unicode="" d="M1 585q-15 -31 7 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85l-1 -302q0 -84 38.5 -138t110.5 -54t111 55t39 139v106l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15zM76 565l237 339h503l89 -100v-294l-340 -130 q-20 -6 -40 -20t-20 -29v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146zM305 1104v200h600v-200h-600z" /> -<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 500h300l-2 -194l402 294l-402 298v-197h-298v-201z" /> -<glyph unicode="" d="M0 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5q122 0 232.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-218 -217.5t-300 -80t-299.5 80t-217.5 217.5t-80 299.5zM200 600l400 -294v194h302v201h-300v197z" /> -<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600h200v-300h200v300h200l-300 400z" /> -<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600l300 -400l300 400h-200v300h-200v-300h-200z" /> -<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM254 780q-8 -34 5.5 -93t7.5 -87q0 -9 17 -44t16 -60q12 0 23 -5.5 t23 -15t20 -13.5q20 -10 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55.5t-20 -57.5q12 -21 22.5 -34.5t28 -27t36.5 -17.5q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q101 -2 221 111q31 30 47 48t34 49t21 62q-14 9 -37.5 9.5t-35.5 7.5q-14 7 -49 15t-52 19 q-9 0 -39.5 -0.5t-46.5 -1.5t-39 -6.5t-39 -16.5q-50 -35 -66 -12q-4 2 -3.5 25.5t0.5 25.5q-6 13 -26.5 17t-24.5 7q2 22 -2 41t-16.5 28t-38.5 -20q-23 -25 -42 4q-19 28 -8 58q8 16 22 22q6 -1 26 -1.5t33.5 -4.5t19.5 -13q12 -19 32 -37.5t34 -27.5l14 -8q0 3 9.5 39.5 t5.5 57.5q-4 23 14.5 44.5t22.5 31.5q5 14 10 35t8.5 31t15.5 22.5t34 21.5q-6 18 10 37q8 0 23.5 -1.5t24.5 -1.5t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 41 1 44q31 -13 58.5 -14.5t39.5 3.5l11 4q6 36 -17 53.5t-64 28.5t-56 23 q-19 -3 -37 0q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6q-15 -3 -46 0t-45 -3q-20 -6 -51.5 -25.5t-34.5 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -91t-29.5 -79zM518 915q3 12 16 30.5t16 25.5q10 -10 18.5 -10t14 6t14.5 14.5t16 12.5q0 -18 8 -42.5t16.5 -44 t9.5 -23.5q-6 1 -39 5t-53.5 10t-36.5 16z" /> +<glyph unicode="" d="M0 200v600h200v-600h-200zM300 275v400q0 37 20 63l145 196l96 198q14 28 38 48t51 20h50q39 0 69.5 -40.5t30.5 -84.5v-150l-28 -125h328q39 0 69.5 -40.5t30.5 -84.5v-100q0 -43 -29 -74l-238 -344q-37 -57 -83 -57h-250q-7 0 -41.5 25t-66.5 50l-31 25h-61 q-100 0 -100 75z" /> +<glyph unicode="" d="M0 400v600h200v-600h-200zM300 525v400q0 75 100 75h61q123 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5h-50q-27 0 -51 20t-38 48l-96 198l-145 196 q-20 26 -20 63z" /> +<glyph unicode="" d="M8 200v600h200v-600h-200zM308 275q0 -13 83 -94t90 -81h341q15 0 28.5 19.5t20.5 41.5l130 339h107q84 0 138.5 39t54.5 111t-53.5 110t-138.5 38h-302l85 121q11 15 10.5 34t-13.5 32l-110 112q-22 22 -53 6l-362 -230q-6 -4 -15.5 -10.5t-25 -26t-15.5 -36.5v-525z M408 289v503l339 236l86 -83l-147 -183q-17 -23 -5 -47q2 -3 4 -5.5t4 -4t5.5 -2.5t5 -1.5t6 -1t6.5 -0.5h7.5h6.5h457q22 0 30.5 -25t-0.5 -50t-30 -25h-203q-15 0 -28.5 -20t-19.5 -41l-131 -339h-293z" /> +<glyph unicode="" d="M-101 651q0 -72 55 -111t139 -39h107l130 -339q6 -21 19.5 -41t29.5 -20h341q8 0 94 80.5t86 93.5v526q0 17 -15 35.5t-30 27.5l-15 10l-365 230q-32 14 -54 -6l-109 -113q-13 -13 -13.5 -32t10.5 -34l85 -121q-101 1 -302 1q-85 0 -139 -38t-54 -110zM-1 601v100h476 h6.5h7.5t6.5 0.5t6.5 1t5.5 1.5t5 2.5l4 4t3.5 5.5q13 24 -5 46l-145 184l87 83l343 -237v-502l-107 -89h-293l-131 339q-6 20 -19.5 40.5t-28.5 20.5h-222zM1000 201v600h200v-600h-200z" /> +<glyph unicode="" d="M97 719l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53zM172 739l83 86l183 -146 q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6v7.5v7v456q0 22 25 31t50 -0.5t25 -30.5v-203q0 -15 20 -28.5t41 -19.5l339 -131v-293l-89 -100h-503zM400 0v200h600v-200h-600z" /> +<glyph unicode="" d="M1 585q-15 -31 7 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85q0 -51 -0.5 -153.5t-0.5 -148.5q0 -84 38.5 -138t110.5 -54t111 55t39 139v106l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15zM76 565l237 339h503 l89 -100v-294l-340 -130q-21 -7 -40.5 -20.5t-19.5 -28.5v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146zM305 1104v200h600v-200h-600z" /> +<glyph unicode="" d="M22 600q0 157 77.5 290.5t210.5 210.5t290 77t290 -77t210.5 -210.5t77.5 -290.5t-77.5 -290t-210.5 -210.5t-290 -77.5t-290 77.5t-210.5 210.5t-77.5 290zM298 500h300v-194l402 294l-402 299v-198h-300v-201z" /> +<glyph unicode="" d="M22 600q0 157 77.5 290.5t210.5 210.5t290 77t290 -77t210.5 -210.5t77.5 -290.5t-77.5 -290t-210.5 -210.5t-290 -77.5t-290 77.5t-210.5 210.5t-77.5 290zM200 600l400 -294v194h300v201h-298v198z" /> +<glyph unicode="" d="M22 600q0 157 77.5 290.5t210.5 210.5t290 77t290 -77t210.5 -210.5t77.5 -290.5t-77.5 -290t-210.5 -210.5t-290 -77.5t-290 77.5t-210.5 210.5t-77.5 290zM302 599h197v-300h201v300h194l-294 401z" /> +<glyph unicode="" d="M22 600q0 157 77.5 290.5t210.5 210.5t290 77t290 -77t210.5 -210.5t77.5 -290.5t-77.5 -290t-210.5 -210.5t-290 -77.5t-290 77.5t-210.5 210.5t-77.5 290zM306 602l294 -402l298 402h-197v300h-201v-300h-194z" /> +<glyph unicode="" d="M24 600q0 154 78 287t211 211t287 78t287 -78t211 -211t78 -287t-78 -287t-211 -211t-287 -78t-287 78t-211 211t-78 287zM254 780q-8 -33 5.5 -92.5t7.5 -87.5q0 -9 17 -44t16 -60q12 0 23 -5.5t23 -15t20 -13.5q16 -8 34 -15t40 -14.5t34 -12.5q22 -8 53 -31.5 t59.5 -38.5t57.5 -11q8 -18 -15 -55t-20 -57q42 -71 87 -80q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q104 -3 221 112q30 29 47 47t34.5 49.5t20.5 62.5q-14 9 -37.5 9t-35.5 7q-14 8 -49 15.5t-52 18.5q-9 0 -39.5 -0.5t-46.5 -1.5t-39 -6.5t-39 -16.5q-50 -35 -66 -12 q-4 2 -3.5 25.5t0.5 25.5q-6 13 -26.5 17t-24.5 7q2 22 -2 41t-16.5 28t-38.5 -20q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q12 -19 32 -37.5t34 -27.5l14 -8q0 3 9.5 39.5t5.5 57.5q-4 23 14.5 44.5t22.5 31.5q5 14 10 35t8.5 31t15.5 22.5 t34 22.5q-6 17 10 36q8 0 23.5 -1.5t24.5 -1.5t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 41 1 44q31 -13 58.5 -14.5t39.5 3.5l11 4q6 36 -17 53.5t-64 28.5t-56 23q-20 -3 -37 1q-16 -13 -37.5 -21.5t-34 -12t-44 -8.5t-38.5 -6 q-15 -3 -45.5 0.5t-45.5 -2.5q-22 -8 -52.5 -27t-33.5 -34q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -90.5t-29.5 -79.5zM518 916q3 12 16 30t16 25q10 -10 18.5 -10t14 6t14.5 14.5t16 12.5q0 -17 8 -41.5t16.5 -44.5t9.5 -24q-9 2 -39.5 6t-52 10t-37.5 16z" /> <glyph unicode="" d="M0 164.5q0 21.5 15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138l145 -232l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5z" /> <glyph unicode="" horiz-adv-x="1220" d="M0 196v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 596v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5zM0 996v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM600 596h500v100h-500v-100zM800 196h300v100h-300v-100zM900 996h200v100h-200v-100z" /> <glyph unicode="" d="M100 1100v100h1000v-100h-1000zM150 1000h900l-350 -500v-300l-200 -200v500z" /> <glyph unicode="" d="M0 200v200h1200v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500z M500 1000h200v100h-200v-100z" /> <glyph unicode="" d="M0 0v400l129 -129l200 200l142 -142l-200 -200l129 -129h-400zM0 800l129 129l200 -200l142 142l-200 200l129 129h-400v-400zM729 329l142 142l200 -200l129 129v-400h-400l129 129zM729 871l200 200l-129 129h400v-400l-129 129l-200 -200z" /> -<glyph unicode="" d="M0 596q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 596q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM291 655 q0 23 15.5 38.5t38.5 15.5t39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39zM400 850q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5zM513 609q0 32 21 56.5t52 29.5l122 126l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5 q22 0 38 -16t16 -39t-16 -39t-38 -16q-16 0 -29 10l-55 -145q17 -22 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5q-37 0 -62.5 25.5t-25.5 61.5zM800 655q0 22 16 38t39 16t38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39z" /> -<glyph unicode="" d="M-40 375q-13 -95 35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -79.5 -17t-67.5 -51l-388 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23q38 0 53 -36 q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -249l-253 -256l7 -7l69 -60l517 511 q67 67 95 157t11 183q-16 87 -67 154t-130 103q-69 33 -152 33q-107 0 -197 -55q-40 -24 -111 -95l-512 -512q-68 -68 -81 -163z" /> -<glyph unicode="" d="M79 784q0 131 99 229.5t230 98.5q144 0 242 -129q103 129 245 129q130 0 227 -98.5t97 -229.5q0 -46 -17.5 -91t-61 -99t-77 -89.5t-104.5 -105.5q-197 -191 -293 -322l-17 -23l-16 23q-43 58 -100 122.5t-92 99.5t-101 100l-84.5 84.5t-68 74t-60 78t-33.5 70.5t-15 78z M250 784q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203l12 12q64 62 97.5 97t64.5 79t31 72q0 71 -48 119.5t-106 48.5q-73 0 -131 -83l-118 -171l-114 174q-51 80 -124 80q-59 0 -108.5 -49.5t-49.5 -118.5z" /> -<glyph unicode="" d="M57 353q0 -94 66 -160l141 -141q66 -66 159 -66q95 0 159 66l283 283q66 66 66 159t-66 159l-141 141q-12 12 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159zM269 706q0 -93 66 -159l141 -141l19 -17l105 105 l-212 212l389 389l247 -247l-95 -96l18 -18q46 -46 77 -99l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159z" /> +<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM173 600q0 -176 125.5 -301.5t301.5 -125.5q177 0 302 125.5t125 301.5 q0 177 -125 302t-302 125q-176 0 -301.5 -125t-125.5 -302zM291 655q0 23 16 39t38 16q23 0 39 -16t16 -39t-16 -39t-39 -16q-22 0 -38 16t-16 39zM400 850q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5zM513 609q0 32 21 56.5 t52 29.5l122 126l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-16 0 -29 10l-55 -145q17 -22 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-62 25.5t-26 61.5zM800 655q0 23 16 39t39 16q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16t-16 39z " /> +<glyph unicode="" d="M-40 375q-13 -95 35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -79.5 -17t-67.5 -51l-388 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23q38 0 53 -36 q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -249l-253 -256l7 -7l69 -60l517 511 q67 67 95 157t11 183q-16 87 -67 154t-130 103q-69 33 -152 33q-107 0 -197 -55q-39 -23 -111 -95l-512 -512q-68 -68 -81 -163z" /> +<glyph unicode="" d="M99 785q0 64 28 122.5t73 100t104.5 64t119 20.5t120 -38.5t105.5 -104.5q48 69 109.5 105t121.5 38t118.5 -20.5t102.5 -64t71 -100t27 -122.5q0 -70 -55.5 -151.5t-129.5 -151t-182.5 -181t-182.5 -212.5q-62 85 -145.5 174t-150 152.5t-127 127t-94 124.5t-33.5 118z M229 785q0 -31 29.5 -75t64.5 -80.5t97 -97.5q17 -16 25 -24q101 -98 204 -217q85 97 209 219q127 125 163 171q48 62 48 104q0 78 -53.5 132.5t-120.5 54.5q-85 0 -147 -91l-102 -147l-97 150q-58 88 -141 88q-68 0 -123.5 -55.5t-55.5 -131.5z" /> +<glyph unicode="" d="M57 353q0 -95 66 -159l141 -142q66 -66 159 -66t159 66l283 283q66 66 66 159t-66 159l-141 141q-3 4 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159zM269 706q0 -93 66 -159l141 -141q3 -3 9.5 -9t8.5 -8 l106 105l-212 212l389 389l247 -247l-95 -96l17 -17q47 -47 78 -100l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159z" /> <glyph unicode="" d="M200 100v953q0 21 30 46t81 48t129 38t163 15t162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5zM300 300h600v700h-600v-700zM496 150q0 -43 30.5 -73.5t73.5 -30.5t73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5 t-73.5 -30.5t-30.5 -73.5z" /> <glyph unicode="" d="M0 0l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207z" /> -<glyph unicode="" d="M295 433h139q5 -77 48.5 -126.5t117.5 -64.5v335l-27 7q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5v-307l64 -14 q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5zM466 889q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3v274q-61 -8 -97.5 -37.5t-36.5 -102.5zM700 237 q170 18 170 151q0 64 -44 99.5t-126 60.5v-311z" /> -<glyph unicode="" d="M100 600v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -11 2.5 -24.5t5.5 -24t9.5 -26.5t10.5 -25t14 -27.5t14 -25.5 t15.5 -27t13.5 -24h242v-100h-197q8 -50 -2.5 -115t-31.5 -94q-41 -59 -99 -113q35 11 84 18t70 7q32 1 102 -16t104 -17q76 0 136 30l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -25l-24 -11l-55 145l16.5 11t15.5 10 t13.5 9.5t14.5 12t14.5 14t17.5 18.5q48 55 54 126.5t-30 142.5h-221z" /> +<glyph unicode="" d="M295 433h139q5 -77 48.5 -126.5t117.5 -64.5v335q-6 1 -15.5 4t-11.5 3q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5 v-307l64 -14q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5zM466 889q0 -36 9 -60t31 -38t36 -19.5t47 -13.5q7 -2 11 -3v274q-61 -8 -97.5 -37.5t-36.5 -102.5zM700 237 q170 18 170 151q0 64 -44 99.5t-126 60.5v-311z" /> +<glyph unicode="" d="M100 600v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -28 16.5 -69.5t28 -62.5t41.5 -72h241v-100h-197q8 -50 -2.5 -115 t-31.5 -94q-41 -59 -99 -113q35 11 84 18t70 7q32 1 102 -16t104 -17q76 0 136 30l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -25l-24 -11l-55 145l16.5 11t15.5 10t13.5 9.5t14.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221z" /> <glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM602 900l298 300l298 -300h-198v-900h-200v900h-198z" /> <glyph unicode="" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v200h100v-100h200v-100h-300zM700 400v100h300v-200h-99v-100h-100v100h99v100h-200zM700 700v500h300v-500h-100v100h-100v-100h-100zM801 900h100v200h-100v-200z" /> <glyph unicode="" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v500h300v-500h-100v100h-100v-100h-100zM700 700v200h100v-100h200v-100h-300zM700 1100v100h300v-200h-99v-100h-100v100h99v100h-200zM801 200h100v200h-100v-200z" /> @@ -186,44 +171,5 @@ <glyph unicode="" d="M0 400v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-163 0 -281.5 117.5t-118.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM400 300l333 250l-333 250v-500z" /> <glyph unicode="" d="M0 400v300q0 163 117.5 281.5t282.5 118.5h300q163 0 281.5 -119t118.5 -281v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 700l250 -333l250 333h-500z" /> <glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 400h500l-250 333z" /> -<glyph unicode="" d="M0 400v300h300v200l400 -350l-400 -350v200h-300zM500 0v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400z" /> -<glyph unicode="" d="M216 519q10 -19 32 -19h302q-155 -438 -160 -458q-5 -21 4 -32l9 -8l9 -1q13 0 26 16l538 630q15 19 6 36q-8 18 -32 16h-300q1 4 78 219.5t79 227.5q2 17 -6 27l-8 8h-9q-16 0 -25 -15q-4 -5 -98.5 -111.5t-228 -257t-209.5 -238.5q-17 -19 -7 -40z" /> -<glyph unicode="" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h500v185q-14 4 -114 7.5t-193 5.5l-93 2q-165 0 -282.5 -117.5t-117.5 -282.5v-300zM600 400v300h300v200l400 -350l-400 -350v200h-300z " /> -<glyph unicode="" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98l-78 73l-122 -123v-148q0 -41 -29.5 -70.5t-70.5 -29.5h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h156l118 122l-74 78h-100q-165 0 -282.5 -117.5t-117.5 -282.5 v-300zM496 709l353 342l-149 149h500v-500l-149 149l-342 -353z" /> -<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM406 600 q0 80 57 137t137 57t137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137z" /> -<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 800l445 -500l450 500h-295v400h-300v-400h-300zM900 150h100v50h-100v-50z" /> -<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 700h300v-300h300v300h295l-445 500zM900 150h100v50h-100v-50z" /> -<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 705l305 -305l596 596l-154 155l-442 -442l-150 151zM900 150h100v50h-100v-50z" /> -<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 988l97 -98l212 213l-97 97zM200 401h700v699l-250 -239l-149 149l-212 -212l149 -149zM900 150h100v50h-100v-50z" /> -<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM200 612l212 -212l98 97l-213 212zM300 1200l239 -250l-149 -149l212 -212l149 148l248 -237v700h-699zM900 150h100v50h-100v-50z" /> -<glyph unicode="" d="M23 415l1177 784v-1079l-475 272l-310 -393v416h-392zM494 210l672 938l-672 -712v-226z" /> -<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200z" /> -<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120l-126 -127h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM581 306l123 123l120 -120l353 352l123 -123l-475 -476zM600 1000h100v200h-100v-200z" /> -<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170l-298 -298h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200zM700 133l170 170l-170 170l127 127l170 -170l170 170l127 -128l-170 -169l170 -170 l-127 -127l-170 170l-170 -170z" /> -<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300l300 -300l300 300h-200v300h-200v-300h-200zM600 1000v200h100v-200h-100z" /> -<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200l-298 -298h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300h200v-300h200v300h200l-300 300zM600 1000v200h100v-200h-100z" /> -<glyph unicode="" d="M0 250q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200v-550zM0 900h1200v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 300v200h400v-200h-400z" /> -<glyph unicode="" d="M0 400l300 298v-198h400v-200h-400v-198zM100 800v200h100v-200h-100zM300 800v200h100v-200h-100zM500 800v200h400v198l300 -298l-300 -298v198h-400zM800 300v200h100v-200h-100zM1000 300h100v200h-100v-200z" /> -<glyph unicode="" d="M100 700v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300l50 100l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447zM800 597q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5 t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v1106q0 31 -18 40.5t-44 -7.5l-276 -117q-25 -16 -43.5 -50.5t-18.5 -65.5v-359z" /> -<glyph unicode="" d="M100 0h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v888q0 22 25 34.5t50 13.5l25 2v56h-400v-56q75 0 87.5 -6t12.5 -44v-394h-500v394q0 38 12.5 44t87.5 6v56h-400v-56q4 0 11 -0.5 t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56z" /> -<glyph unicode="" d="M0 300q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM100 100h400l200 200h105l295 98v-298h-425l-100 -100h-375zM100 300v200h300v-200h-300zM100 600v200h300v-200h-300z M100 1000h400l200 -200v-98l295 98h105v200h-425l-100 100h-375zM700 402v163l400 133v-163z" /> -<glyph unicode="" d="M16.5 974.5q0.5 -21.5 16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q16 17 13 40.5t-22 37.5l-192 136q-19 14 -45 12t-42 -19l-119 -118q-143 103 -267 227q-126 126 -227 268l118 118q17 17 20 41.5 t-11 44.5l-139 194q-14 19 -36.5 22t-40.5 -14l-162 -162q-1 -11 -0.5 -32.5z" /> -<glyph unicode="" d="M0 50v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5t30 -27.5t12 -24l1 -10v-50l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -15 -35.5t-35 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5zM0 712 q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5v200q-6 8 -19 20.5t-63 45t-112 57t-171 45t-235 20.5q-92 0 -175 -10.5t-141.5 -27t-108.5 -36.5t-81.5 -40 t-53.5 -36.5t-31 -27.5l-9 -10v-200z" /> -<glyph unicode="" d="M100 0v100h1100v-100h-1100zM175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250z" /> -<glyph unicode="" d="M100 0h300v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400zM500 0v1000q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300zM900 0v700q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300z" /> -<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" /> -<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h100v200h100v-200h100v500h-100v-200h-100v200h-100v-500zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" /> -<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v100h-200v300h200v100h-300v-500zM600 300h300v100h-200v300h200v100h-300v-500z" /> -<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 550l300 -150v300zM600 400l300 150l-300 150v-300z" /> -<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300v500h700v-500h-700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM575 549 q0 -65 27 -107t68 -42h130v300h-130q-38 0 -66.5 -43t-28.5 -108z" /> -<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" /> -<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v400h-200v100h-100v-500zM301 400v200h100v-200h-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" /> -<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 700v100h300v-300h-99v-100h-100v100h99v200h-200zM201 300v100h100v-100h-100zM601 300v100h100v-100h-100z M700 700v100h200v-500h-100v400h-100z" /> -<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 500v200 l100 100h300v-100h-300v-200h300v-100h-300z" /> -<glyph unicode="" d="M0 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 400v400h300 l100 -100v-100h-100v100h-200v-100h200v-100h-200v-100h-100zM700 400v100h100v-100h-100z" /> -<glyph unicode="" d="M-14 494q0 -80 56.5 -137t135.5 -57h222v300h400v-300h128q120 0 205 86t85 208q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200h200v300h200v-300 h200l-300 -300z" /> -<glyph unicode="" d="M-14 494q0 -80 56.5 -137t135.5 -57h8l414 414l403 -403q94 26 154.5 104t60.5 178q0 121 -85 207.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200l300 300 l300 -300h-200v-300h-200v300h-200z" /> -<glyph unicode="" d="M100 200h400v-155l-75 -45h350l-75 45v155h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170z" /> -<glyph unicode="" d="M121 700q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350l-75 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5 t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -12t1 -11q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5z" /> </font> </defs></svg> \ No newline at end of file diff --git a/hub/static/css/fonts/glyphiconshalflings-regular.ttf b/hub/static/css/fonts/glyphiconshalflings-regular.ttf new file mode 100644 index 0000000..c63c068 Binary files /dev/null and b/hub/static/css/fonts/glyphiconshalflings-regular.ttf differ diff --git a/hub/static/css/fonts/glyphiconshalflings-regular.woff b/hub/static/css/fonts/glyphiconshalflings-regular.woff new file mode 100644 index 0000000..4c778ff Binary files /dev/null and b/hub/static/css/fonts/glyphiconshalflings-regular.woff differ diff --git a/hub/static/css/fonts/opensans-600.woff b/hub/static/css/fonts/opensans-600.woff new file mode 100644 index 0000000..1438266 Binary files /dev/null and b/hub/static/css/fonts/opensans-600.woff differ diff --git a/hub/static/css/fonts/opensans.woff b/hub/static/css/fonts/opensans.woff new file mode 100644 index 0000000..58e6cb3 Binary files /dev/null and b/hub/static/css/fonts/opensans.woff differ diff --git a/vilya/static/css/highlight.css b/hub/static/css/highlight.css similarity index 100% rename from vilya/static/css/highlight.css rename to hub/static/css/highlight.css diff --git a/hub/static/css/img/arrow.png b/hub/static/css/img/arrow.png new file mode 100644 index 0000000..2753343 Binary files /dev/null and b/hub/static/css/img/arrow.png differ diff --git a/hub/static/css/img/glyphicons-halflings-white.png b/hub/static/css/img/glyphicons-halflings-white.png new file mode 100644 index 0000000..3bf6484 Binary files /dev/null and b/hub/static/css/img/glyphicons-halflings-white.png differ diff --git a/hub/static/css/img/glyphicons-halflings.png b/hub/static/css/img/glyphicons-halflings.png new file mode 100644 index 0000000..a996999 Binary files /dev/null and b/hub/static/css/img/glyphicons-halflings.png differ diff --git a/hub/static/css/img/spinner.gif b/hub/static/css/img/spinner.gif new file mode 100644 index 0000000..5b33f7e Binary files /dev/null and b/hub/static/css/img/spinner.gif differ diff --git a/vilya/static/css/lib/_cal-heatmap.scss b/hub/static/css/lib/_cal-heatmap.scss similarity index 100% rename from vilya/static/css/lib/_cal-heatmap.scss rename to hub/static/css/lib/_cal-heatmap.scss diff --git a/vilya/static/css/lib/bootstrap-responsive.scss b/hub/static/css/lib/bootstrap-responsive.scss similarity index 100% rename from vilya/static/css/lib/bootstrap-responsive.scss rename to hub/static/css/lib/bootstrap-responsive.scss diff --git a/hub/static/css/lib/bootstrap.min.css b/hub/static/css/lib/bootstrap.min.css new file mode 100644 index 0000000..c10c7f4 --- /dev/null +++ b/hub/static/css/lib/bootstrap.min.css @@ -0,0 +1,9 @@ +/*! + * Bootstrap v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover,a:focus{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} diff --git a/vilya/static/css/lib/code.css b/hub/static/css/lib/code.css similarity index 100% rename from vilya/static/css/lib/code.css rename to hub/static/css/lib/code.css diff --git a/hub/static/css/lib/flat-ui.css b/hub/static/css/lib/flat-ui.css new file mode 100644 index 0000000..00ad458 --- /dev/null +++ b/hub/static/css/lib/flat-ui.css @@ -0,0 +1,655 @@ +/*! + * Flat-UI v0.0.1 by @whshang + * + * Inspired from bootstrap. + */ + +@import url('glyphicon.css'); + +body { + font: 13px/1.6 'Lato','lucida grande', "ClassicGrotesqueW01-Rg", Arial, "Hiragino Sans GB", "STHeiti", "WenQuanYi Micro Hei", SimSun, sans-serif; + color: #273338; +} + +input, button, select, textarea { + font-family: 'Lato','lucida grande', "ClassicGrotesqueW01-Rg", Arial, "Hiragino Sans GB", "STHeiti", "WenQuanYi Micro Hei", SimSun, sans-serif; +} + +a { + color: rgba(0,168,156,1); +} +a:hover, a:focus { color:rgba(0,168,156,0.8); } +a:active, a.active{ color: rgba(0,168,156,0.9); } +a, a:link, a:hover, a:active { + -webkit-transition: all .2s ease-out; + -moz-transition: all .2s ease-out; + -o-transition: all .2s ease-out; + -ms-transition: all .2s ease-out; + transition: all .2s ease-out; + -webkit-backface-visibility: hidden; +} + +section { + margin-top: 40px; + padding-top: 60px; +} +/* +::selection { +background: rgba(99,182,174,1); +color: rgba(255,255,255,1); +text-shadow: none; +} + */ +a .caret{border-top-color: rgba(99,182,174,1);} +a:hover .caret{border-top-color: rgba(99,182,174,0.8);} +.btn .caret{border-top-color: rgba(255,255,255,1);} +.btn i {padding-right: 0.6em;line-height: 1.4em;} +.nav .dropdown-toggle .caret, +.navbar .nav .dropdown-toggle .caret{border-top-color: rgba(99,182,174,1);border-bottom-color: rgba(99,182,174,1);} +.nav .dropdown-toggle:hover .caret, +.nav .dropdown-toggle:focus .caret{border-top-color: rgba(99,182,174,0.8);border-bottom-color: rgba(99,182,174,0.8);} + +textarea, input[type="text"], input[type="password"], input[type="datetime"], input[type="datetime-local"], input[type="date"], input[type="month"], input[type="time"], input[type="week"], input[type="number"], input[type="email"], input[type="url"], input[type="search"], input[type="tel"], input[type="color"], .uneditable-input{ + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; +} + +.icon-white, .nav-pills>.active>a>[class^="icon-"], .nav-pills>.active>a>[class*=" icon-"], .nav-list>.active>a>[class^="icon-"], .nav-list>.active>a>[class*=" icon-"], .navbar-inverse .nav>.active>a>[class^="icon-"], .navbar-inverse .nav>.active>a>[class*=" icon-"], .dropdown-menu>li>a:hover>[class^="icon-"], .dropdown-menu>li>a:focus>[class^="icon-"], .dropdown-menu>li>a:hover>[class*=" icon-"], .dropdown-menu>li>a:focus>[class*=" icon-"], .dropdown-menu>.active>a>[class^="icon-"], .dropdown-menu>.active>a>[class*=" icon-"], .dropdown-submenu:hover>a>[class^="icon-"], .dropdown-submenu:focus>a>[class^="icon-"], .dropdown-submenu:hover>a>[class*=" icon-"], .dropdown-submenu:focus>a>[class*=" icon-"]{background-image: none;} + +input.search-query{ + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; +} + +.control-group.warning input, .control-group.warning select, .control-group.warning textarea, +.control-group.warning input:focus, .control-group.warning select:focus, .control-group.warning textarea:focus, +input.warning, select.warning, textarea.warning, +input.warning:focus, select.warning:focus, textarea.warning:focus{ + border-color: rgba(248,148,6,1); + color:rgba(248,148,6,1); +} + +.control-group.error input, .control-group.error select, .control-group.error textarea, +.control-group.error input:focus, .control-group.error select:focus, .control-group.error textarea:focus, +input.error, select.error, textarea.error, +input.error:focus, select.error:focus, textarea.error:focus{ + border-color: rgba(231,76,60,1); + color:rgba(231,76,60,1); +} +.control-group.success input, .control-group.success select, .control-group.success textarea, +.control-group.success input:focus, .control-group.success select:focus, .control-group.success textarea:focus, +input.success, select.success, textarea.success, +input.success:focus, select.success:focus, textarea.success:focus{ + border-color: rgba(38,174,144,1); + color:rgba(38,174,144,1); +} + +.control-group.info input, .control-group.info select, .control-group.info textarea, +.control-group.info input:focus, .control-group.info select:focus, .control-group.info textarea:focus, +input.info, select.info, textarea.info, +input.info:focus, select.info:focus, textarea.info:focus{ + border-color: rgba(47,150,180,1); + color:rgba(47,150,180,1); +} + +.control-group.warning input:focus, .control-group.warning select:focus, .control-group.warning textarea:focus, +.control-group.error input:focus, .control-group.error select:focus, .control-group.error textarea:focus, +.control-group.success input:focus, .control-group.success select:focus, .control-group.success textarea:focus, +.control-group.info input:focus, .control-group.info select:focus, .control-group.info textarea:focus, +.control-group input:focus, .control-group select:focus, .control-group textarea:focus{ + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-group.open .btn.dropdown-toggle{ + background-color: #88ccc5; + color: rgba(255,255,255,1); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.input-append, +.input-prepend{ + margin-bottom: 0; +} + +.btn{ + text-align: center; + vertical-align: middle; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + text-shadow: none; + background: #ebebeb; + color: #333; + border: 1px solid #DCDCDC; + font-size: 13px; +} +.btn:hover,btn:focus{ -webkit-transition: 0.25s; -moz-transition: 0.25s; -o-transition: 0.25s; transition: 0.25s; -webkit-backface-visibility: hidden; } +.btn.disabled, .btn[disabled] { background-color: #b1bcbd; color: rgba(255,255,255,1); } + +.btn-large {padding: 11px 19px;font-size: 17.5px;-webkit-border-radius: 3px;-moz-border-radius: 3px;border-radius: 3px;} +.btn-small {padding: 2px 10px;font-size: 11.9px;-webkit-border-radius: 2px;-moz-border-radius: 2px;border-radius: 2px;} +.btn-mini {padding: 0 6px;font-size: 10.5px;-webkit-border-radius: 2px;-moz-border-radius: 2px;border-radius: 2px;} + + +.btn.btn-primary{ background: rgba(18,133,192,1);border-color: rgba(18,133,192,1); color: #fff;} +.btn.btn-primary:hover, +.btn.btn-primary:focus, +.btn.btn-primary.disabled, +.btn.btn-primary.disabled:active{ background: rgba(18,133,192,0.8); } +.btn.btn-primary:active, +.btn.btn-primary.active{ background: rgba(18,133,192,0.9); } + +.btn.btn-info{ background: rgba(43,166,203,1);border-color: rgba(43,166,203,1); color: #fff; } +.btn.btn-info:hover, +.btn.btn-info:focus, +.btn.btn-info.disabled, +.btn.btn-info.disabled:active{ background: rgba(43,166,203,0.8);} +.btn.btn-info:active, +.btn.btn-info.active{ background: rgba(43,166,203,0.9); } + +.btn.btn-success{ background: rgba(38,174,144,1); border-color: rgba(38,174,144,1); color: #fff;} +.btn.btn-success:hover, +.btn.btn-success:focus, +.btn.btn-success.disabled, +.btn.btn-success.disabled:active{ background: rgba(38,174,144,0.8);} +.btn.btn-success:active, +.btn.btn-success.active{ background: rgba(38,174,144,0.9); } + +.btn.btn-warning{ background: rgba(248,148,6,1);border-color: rgba(248,148,6,1); color: #fff; } +.btn.btn-warning:hover, +.btn.btn-warning:focus, +.btn.btn-warning.disabled, +.btn.btn-warning.disabled:active{ background: rgba(248,148,6,0.8); } +.btn.btn-warning:active, +.btn.btn-warning.active{ background: rgba(248,148,6,0.9); } + +.btn.btn-danger{ background: rgba(231,76,60,1);border-color: rgba(231,76,60,1); color: #fff; } +.btn.btn-danger:hover, +.btn.btn-danger:focus, +.btn.btn-danger.disabled, +.btn.btn-danger.disabled:active{ background: rgba(231,76,60,0.8); } +.btn.btn-danger:active, +.btn.btn-danger.active{ background: rgba(231,76,60,0.9); } + +.btn.btn-inverse{ background: rgba(52,73,94,1);border-color: rgba(52,73,94,1); color: #fff; } +.btn.btn-inverse:hover, +.btn.btn-inverse:focus, +.btn.btn-inverse.disabled, +.btn.btn-inverse.disabled:active{ background: rgba(52,73,94,0.8); } +.btn.btn-inverse:active, +.btn.btn-inverse.active{ background: rgba(52,73,94,0.9) } + +.btn.btn-link{ background: none; color: #16a085;} +.btn.btn-link:hover, +.btn.btn-link:focus, +.btn.btn-link.disabled, +.btn.btn-link.disabled:active{ background: none; color: #999; } +.btn.btn-link.disabled:hover, +.btn.btn-link.disabled:active{ text-decoration: none; } +.btn.btn-link:active, +.btn.btn-link.active{ background: none; color: #118b73; } + +.btn.disabled, +.btn[disabled]{cursor: default;background-image: none;opacity: 0.65;filter: alpha(opacity=65);} + +.label, .badge{font-weight:400;} + +.label-primary, .badge-primary{background-color: rgba(18,133,192,0.2); color: rgba(18,133,192,1);} +.label-success, .badge-success{background-color: rgba(38,174,144,0.2); color: rgba(38,174,144,1);} +.label-warning, .badge-warning{background-color: rgba(248,148,6,0.2); color: rgba(248,148,6,1);} +.label-important, .badge-important{background-color: rgba(231,76,60,0.2); color: rgba(231,76,60,1);} +.label-info, .badge-info{background-color: rgba(47,150,180,0.2); color: rgba(47,150,180,1);} +.label-inverse, .badge-inverse{background-color: rgba(52,73,94,0.2); color: rgba(52,73,94,1);} + +.btn-group>.btn+.dropdown-toggle{ + box-shadow: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; +} + +.btn-group>.btn:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 2px; + border-bottom-left-radius: 2px; + -webkit-border-top-left-radius: 2px; + border-top-left-radius: 2px; + -moz-border-radius-bottomleft: 2px; + -moz-border-radius-topleft: 2px; +} + +.btn-group>.btn:last-child { + -webkit-border-top-right-radius: 2px; + border-top-right-radius: 2px; + -webkit-border-bottom-right-radius: 2px; + border-bottom-right-radius: 2px; + -moz-border-radius-topright: 2px; + -moz-border-radius-bottomright: 2px; +} + +.dropdown-menu{ + border-color: rgba(99,182,174,0.8); + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.nav > .disabled > a, +.nav > .disabled > a:hover, +.nav > .disabled > a:focus{ + color: #999; +} + +.navbar-inner{ + padding: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + background-image:none; + border: none; + border-radius: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + background: rgba(255,255,255,1); +} + +.navbar-fixed-top .navbar-inner{border-radius: 0;-webkit-border-radius: 0;-moz-border-radius: 0;} + +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner{ + background:rgba(255,255,255,0.9); + box-shadow: none; + border-bottom: 1px solid #eaeaea; +} + +.navbar .nav > li > a:hover, +.navbar .nav > li > a:focus{color: rgba(99,182,174,1);outline: none; } +.navbar .nav li.dropdown > .dropdown-toggle:hover .caret{border-top-color: rgba(99,182,174,1);border-bottom-color: rgba(99,182,174,1);} + +.dropdown-menu > li > a{ + color: rgba(99,182,174,1); +} + +.navbar .nav ul a:hover, +.dropdown-menu>li>a:hover, +.dropdown-menu>li>a:focus, +.dropdown-submenu:hover>a, +.dropdown-submenu:focus>a, +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus{background: rgba(99,182,174,1);} + +.navbar .nav>.active>a, +.navbar .nav>.active>a:hover, +.navbar .nav>.active>a:focus{ + color: rgba(99,182,174,1); + background: none; + -webkit-box-shadow:none; + -moz-box-shadow:none; + box-shadow:none; +} + +.nav-list > .active > a, +.nav-list > .active > a:hover, +.nav-list > .active > a:focus{ + background-color: rgba(99,182,174,1); +} + +.navbar .nav li.dropdown.open > .dropdown-toggle, +.navbar .nav li.dropdown.active > .dropdown-toggle, +.navbar .nav li.dropdown.open.active > .dropdown-toggle{ background: none;} + + +.navbar .btn-navbar{background-image: none;background-color: rgba(99,182,174,1);} +.navbar .btn-navbar:hover, +.navbar .btn-navbar:focus{background-color: rgba(99,182,174,0.8);} +.navbar .btn-navbar .icon-bar{box-shadow: none;} + +.navbar-inverse .btn-navbar{background-color: #fff;} +.navbar-inverse .btn-navbar .icon-bar{background-color: rgba(99,182,174,1);} +.navbar-inverse .btn-navbar:hover, +.navbar-inverse .btn-navbar:focus{background-color: rgba(255,255,255,0.8);} + +.nav-tabs{ + margin-bottom: 0; +} + +.nav-pills>li>a { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.nav-tabs > .active > a, +.nav-tabs > .active > a:hover, +.nav-tabs > .active > a:focus{ + color: ; +} +.nav-pills > .active > a, +.nav-pills > .active > a:hover, +.nav-pills > .active > a:focus{ + color: #fff; + cursor: default; + background-color: rgba(0,168,156,1); + border: none; +} +.nav > li > a:hover, +.nav > li > a:focus, +.nav-tabs > li > a:hover, +.nav-tabs > li > a:focus, +.nav-pills > li > a:hover, +.nav-pills > li > a:focus{ + background: none; + color: rgba(99,182,174,1); + border-color: transparent; +} + +.nav-tabs .open .dropdown-toggle, +.nav-pills .open .dropdown-toggle, +.nav > li.dropdown.open.active > a:hover, +.nav > li.dropdown.open.active > a:focus{ + background: none; + border-color: transparent; +} + + +.nav-pills .open .dropdown-toggle{ + color: rgba(0,0,0,0.4); +} + +.nav-pills li.dropdown.open .caret, +.nav-pills li.dropdown.open.active .caret, +.nav-pills li.dropdown.open a:hover .caret, +.nav-pills li.dropdown.open a:focus .caret{ + border-top-color: rgba(0,0,0,0.4); + border-bottom-color: rgba(0,0,0,0.4); +} + +.nav-tabs.nav-stacked{ + background: #fff; + padding: 0; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: 0 1px 2px rgba(0,0,0,.075); + -moz-box-shadow: 0 1px 2px rgba(0,0,0,.075); + box-shadow: 0 1px 2px rgba(0,0,0,.075); +} + +.nav-tabs.nav-stacked>li>a, +.nav-tabs.nav-stacked>li:first-child>a, +.nav-tabs.nav-stacked>li:last-child>a{ + border-radius: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-width: 0 0 0 3px; + border-style: solid; + border-color: transparent; +} +.nav-tabs.nav-stacked > li > a{ + padding: 14px 16px; +} + +.nav-tabs.nav-stacked > li:nth-child(even) { + background: #f9f9f9; +} + +.nav-tabs.nav-stacked > li > a:hover, +.nav-tabs.nav-stacked>li:first-child>a:hover, +.nav-tabs.nav-stacked>li:last-child>a:hover{ + border-color: #999; +} + +.nav-tabs.nav-stacked > li.active > a, +.nav-tabs.nav-stacked > li.active > a:hover{ + border-color: rgba(99,182,174,1); + background-color: transparent; + color: rgba(0,168,156,1); + border-width: 0 0 0 3px; +} + + +.tabs-left > .nav-tabs{ + margin-right: 20px; + border: none; +} + +.tabs-left > .nav-tabs > li > a{ + margin:0 -3px 0 0; + border-radius:0; + -webkit-border-radius:0; + -moz-border-radius:0; +} + +.tabs-left > .nav-tabs .active > a, +.tabs-left > .nav-tabs .active > a:hover, +.tabs-left > .nav-tabs .active > a:focus{ + border-right: 3px solid rgba(99,182,174,1); + border-bottom: none; + margin-right: 0; +} + +.tabs-right > .nav-tabs{ + margin-left: 20px; + border: none; +} + +.tabs-right > .nav-tabs > li > a{ + margin:0 0 0 -3px; + border-radius:0; + -webkit-border-radius:0; + -moz-border-radius:0; +} + +.tabs-right > .nav-tabs .active > a, +.tabs-right > .nav-tabs .active > a:hover, +.tabs-right > .nav-tabs .active > a:focus{ + border-left: 3px solid rgba(99,182,174,1); + border-bottom: none; + margin-left: 0; + padding-left: 11px; +} + +.navbar .nav>li>a{ + padding: 10px 15px 8px; + color: #666; +} + +.navbar-inverse .navbar-inner{ + background-color: #3c3f45; + background-image: none; + border: none; +} + +.navbar-inverse .brand, +.navbar-inverse .nav > li > a{ + color: #A0A8AC; + text-shadow: none; +} + +.navbar-inverse .nav > li > a{ + border-bottom: 2px solid #2a2c32; + padding-left: 5px; + padding-right: 5px; +} + +.navbar .brand{ + padding-top: 6px; + padding-bottom: 4px; + margin-left: 0; + font-size: 18px; +} + +.navbar.navbar-inverse .nav>.active>a, +.navbar.navbar-inverse .nav>.active>a:hover, +.navbar.navbar-inverse .nav>.active>a:focus{ + color: rgba(255,255,255,1); + background: #1abc9c; + border-bottom-color: #16a085 +} + +.navbar.navbar-inverse .nav > li > a:hover, +.navbar.navbar-inverse .nav > li > a:focus{ + color: rgba(255,255,255,0.8); +} + + +.navbar-search .search-query, +.navbar-inverse .navbar-search .search-query{ + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; +} + +.navbar-inverse .navbar-search .search-query, +.navbar-inverse .navbar-search .search-query:focus, +.navbar-inverse .navbar-search .search-query.focused{ + text-shadow: none; + color: #fff; + background: none; + border:1px solid #111; + padding: 4px 14px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0 rgba(255, 255, 255, 0.15); + -moz-box-shadow: inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0 rgba(255, 255, 255, 0.15); +} + +.navbar-search .search-query:-moz-placeholder { color: #777; } +.navbar-search .search-query:focus::-moz-placeholder{ color: #ccc;} + +.navbar-search .search-query:-ms-input-placeholder { color: #777;} +.navbar-search .search-query:focus::-ms-input-placeholder{ color: #ccc;} + +.navbar-search .search-query::-webkit-input-placeholder { color: #777;} +.navbar-search .search-query:focus::-webkit-input-placeholder{ color: #ccc;} + + +.navbar-inverse .navbar-search .search-query:-moz-placeholder { color: #fff; } +.navbar-inverse .navbar-search .search-query:focus::-moz-placeholder{ color: rgba(255,255,255,0.3);} + +.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { color: #fff;} +.navbar-inverse .navbar-search .search-query:focus::-ms-input-placeholder{ color: rgba(255,255,255,0.3);} + +.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { color: #fff;} +.navbar-inverse .navbar-search .search-query:focus::-webkit-input-placeholder{ color: rgba(255,255,255,0.3);} + +.navbar-inverse .divider-vertical{ + border-right-color: rgba(0,0,0,0.1); + border-left-color: rgba(255,255,255,0.1); +} + +.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown > .dropdown-toggle:hover .caret{ + border-top-color: rgba(255,255,255,0.8); + border-bottom-color: rgba(255,255,255,0.8); +} + + +a.thumbnail:hover, +a.thumbnail:focus{ + border-color: rgba(99,182,174,1); + -webkit-box-shadow: 0 1px 4px rgba(99,182,174,0.25); + -moz-box-shadow: 0 1px 4px rgba(99,182,174,0.25); + box-shadow: 0 1px 4px rgba(99,182,174,0.25); +} + + +.well{ + border: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + background-color: rgba(255,255,255,1); +} + +.breadcrumb{ + background-color: rgba(99,182,174,0.2); +} + +.pagination ul{ + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + + +.pagination ul > li > a, +.pagination ul > li > span, +.pager li>a, +.pager li>span { + padding: 6px 16px; + border: none; + -webkit-transition: background 0.2s ease-out, border-color 0s ease-out, color 0.2s ease-out; + -moz-transition: background 0.2s ease-out, border-color 0s ease-out, color 0.2s ease-out; + -o-transition: background 0.2s ease-out, border-color 0s ease-out, color 0.2s ease-out; + transition: background 0.2s ease-out, border-color 0s ease-out, color 0.2s ease-out; + -webkit-backface-visibility: hidden; + -webkit-box-shadow: 0 1px 2px rgba(0,0,0,0.05); + -moz-box-shadow: 0 1px 2px rgba(0,0,0,0.05); + box-shadow: 0 1px 2px rgba(0,0,0,0.05); +} + +.pagination ul>.disabled>span, +.pagination ul>.disabled>a, +.pagination ul>.disabled>a:hover, +.pagination ul>.disabled>a:focus, +.pager .disabled>span, +.pager .disabled>a, +.pager .disabled>a:hover, +.pager .disabled>a:focus{ + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + background: none; +} + + +.pagination ul > li > a:hover, +.pagination ul > li > a:focus, +.pagination ul > li > span:hover, +.pagination ul > li > span:focus, +.pager li>a:hover, +.pager li>a:focus, +.pager li>span:hover, +.pager li>span:focus { + background-color: rgba(99,182,174,1); + color: #FFF; +} + +.pagination ul>.active>a, +.pagination ul>.active>span{ + background-color: rgba(99,182,174,1); + color: #FFF; +} + +.pagination ul>li:first-child>a, +.pagination ul>li:first-child>span, +.pagination ul>li:last-child>a, +.pagination ul>li:last-child>span{ +} + + +.progress .bar{ + background-image: none; + background-color: rgba(99,182,174,1); +} + +.progress-info.progress-striped .bar, +.progress-striped .bar-info{ + background-color: rgba(99,182,174,1); +} + +.alert-success{ + background-color: rgba(99,182,174,0.2); + border-color: rgba(99,182,174,0.2); +} + +.breadcrumb>.active{color: #333;} diff --git a/vilya/static/css/lib/glyphicon.css b/hub/static/css/lib/glyphicon.css similarity index 100% rename from vilya/static/css/lib/glyphicon.css rename to hub/static/css/lib/glyphicon.css diff --git a/vilya/static/css/lib/jquery.atwho.scss b/hub/static/css/lib/jquery.atwho.scss similarity index 100% rename from vilya/static/css/lib/jquery.atwho.scss rename to hub/static/css/lib/jquery.atwho.scss diff --git a/vilya/static/css/lib/jquery.mobile-1.3.0.min.css b/hub/static/css/lib/jquery.mobile-1.3.0.min.css similarity index 100% rename from vilya/static/css/lib/jquery.mobile-1.3.0.min.css rename to hub/static/css/lib/jquery.mobile-1.3.0.min.css diff --git a/hub/static/css/lib/odometer.scss b/hub/static/css/lib/odometer.scss new file mode 100644 index 0000000..2d72291 --- /dev/null +++ b/hub/static/css/lib/odometer.scss @@ -0,0 +1,102 @@ +.odometer { + &.odometer-auto-theme, &.odometer-theme-default { + display: -moz-inline-box; + -moz-box-orient: vertical; + display: inline-block; + vertical-align: middle; + *vertical-align: auto; + position: relative; + } + &.odometer-auto-theme, &.odometer-theme-default { + *display: inline; + } + &.odometer-auto-theme .odometer-digit, &.odometer-theme-default .odometer-digit { + display: -moz-inline-box; + -moz-box-orient: vertical; + display: inline-block; + vertical-align: middle; + *vertical-align: auto; + position: relative; + } + &.odometer-auto-theme .odometer-digit, &.odometer-theme-default .odometer-digit { + *display: inline; + } + &.odometer-auto-theme .odometer-digit .odometer-digit-spacer, &.odometer-theme-default .odometer-digit .odometer-digit-spacer { + display: -moz-inline-box; + -moz-box-orient: vertical; + display: inline-block; + vertical-align: middle; + *vertical-align: auto; + visibility: hidden; + } + &.odometer-auto-theme .odometer-digit .odometer-digit-spacer, &.odometer-theme-default .odometer-digit .odometer-digit-spacer { + *display: inline; + } + &.odometer-auto-theme .odometer-digit .odometer-digit-inner, &.odometer-theme-default .odometer-digit .odometer-digit-inner { + text-align: left; + display: block; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + overflow: hidden; + } + &.odometer-auto-theme .odometer-digit .odometer-ribbon, &.odometer-theme-default .odometer-digit .odometer-ribbon { + display: block; + } + &.odometer-auto-theme .odometer-digit .odometer-ribbon-inner, &.odometer-theme-default .odometer-digit .odometer-ribbon-inner { + display: block; + -webkit-backface-visibility: hidden; + } + &.odometer-auto-theme .odometer-digit .odometer-value, &.odometer-theme-default .odometer-digit .odometer-value { + display: block; + -webkit-transform: translateZ(0); + } + &.odometer-auto-theme .odometer-digit .odometer-value.odometer-last-value, &.odometer-theme-default .odometer-digit .odometer-value.odometer-last-value { + position: absolute; + } + &.odometer-auto-theme.odometer-animating-up .odometer-ribbon-inner, &.odometer-theme-default.odometer-animating-up .odometer-ribbon-inner { + -webkit-transition: -webkit-transform 2s; + -moz-transition: -moz-transform 2s; + -ms-transition: -ms-transform 2s; + -o-transition: -o-transform 2s; + transition: transform 2s; + } + &.odometer-auto-theme.odometer-animating-up.odometer-animating .odometer-ribbon-inner, &.odometer-theme-default.odometer-animating-up.odometer-animating .odometer-ribbon-inner { + -webkit-transform: translateY(-100%); + -moz-transform: translateY(-100%); + -ms-transform: translateY(-100%); + -o-transform: translateY(-100%); + transform: translateY(-100%); + } + &.odometer-auto-theme.odometer-animating-down .odometer-ribbon-inner, &.odometer-theme-default.odometer-animating-down .odometer-ribbon-inner { + -webkit-transform: translateY(-100%); + -moz-transform: translateY(-100%); + -ms-transform: translateY(-100%); + -o-transform: translateY(-100%); + transform: translateY(-100%); + } + &.odometer-auto-theme.odometer-animating-down.odometer-animating .odometer-ribbon-inner, &.odometer-theme-default.odometer-animating-down.odometer-animating .odometer-ribbon-inner { + -webkit-transition: -webkit-transform 2s; + -moz-transition: -moz-transform 2s; + -ms-transition: -ms-transform 2s; + -o-transition: -o-transform 2s; + transition: transform 2s; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -ms-transform: translateY(0); + -o-transform: translateY(0); + transform: translateY(0); + } + &.odometer-auto-theme, &.odometer-theme-default { + line-height: 0.7; + font-size: 52px; + font-family: "HelveticaNeue-CondensedBold","Helvetica Neue","Arial Narrow",Arial,sans-serif; + font-weight: bold; + font-stretch: condensed; + } + &.odometer-auto-theme .odometer-value, &.odometer-theme-default .odometer-value { + text-align: center; + } +} \ No newline at end of file diff --git a/hub/static/css/lib/pull-to-refresh.css b/hub/static/css/lib/pull-to-refresh.css new file mode 100755 index 0000000..ae3f23c --- /dev/null +++ b/hub/static/css/lib/pull-to-refresh.css @@ -0,0 +1,71 @@ +.scrollable { + overflow-y: auto; + height: 100%; + -webkit-overflow-scrolling: touch; + position: relative; +} + +.scrollable .wrap { + min-height: 100%; + padding-bottom: 1px; + background: #f5f5f5; + -webkit-transform: translateZ(0); +} + +.pull-to-refresh { + line-height: 40px; + height: 40px; + width: 100%; + + position: absolute; + left: 0; + top: -40px; + + font-size: 0.85em; + + z-index: -1; +} + +.pull-to-refresh >.message { + height: 40px; + width: 100%; + overflow-y: auto; + position: relative; +} + +.pull-to-refresh >.message >i.arrow, +.pull-to-refresh >.message >i.spinner { + -webkit-background-size: 100% 100%; + -moz-background-size: 100% 100%; + background-size: 100% 100%; + display: inline-block; + margin-left: 10px; + background-position: center center; + +} + +.pull-to-refresh >.message >i.arrow { + width: 20px; + height: 40px; + background-image: url('../img/arrow.png'); +} + +.pull-to-refresh >.message >i.spinner { + width: 16px; + height: 16px; + background-image: url('../img/spinner.gif'); +} + +.pull-to-refresh >.message >span.pull, +.pull-to-refresh >.message >span.release, +.pull-to-refresh >.message >span.loading { + text-align: center; + + display: block; + height: 40px; + width: 100%; + + position: absolute; + top: 0; + left: 0; +} \ No newline at end of file diff --git a/hub/static/css/lib/tag-it.scss b/hub/static/css/lib/tag-it.scss new file mode 100644 index 0000000..430000d --- /dev/null +++ b/hub/static/css/lib/tag-it.scss @@ -0,0 +1,44 @@ +ul.tagit { + overflow:auto; +} +ul.tagit li { + -moz-border-radius:5px 5px 5px 5px; + display: block; + float: left; + margin:2px 5px 2px 0; +} +ul.tagit li.tagit-choice { + background-color:rgba(0,168,156,1); + padding:2px 4px 3px; + color: #fff; + border-radius: 2px; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; +} + +ul.tagit li.tagit-choice:hover{ + color: rgba(255,255,255,0.8); + cursor: pointer; +} +ul.tagit li.tagit-new { + padding:2px 4px 3px; + padding:2px 4px 1px; + padding:2px 4px 1px 0; +} + +ul.tagit li.tagit-choice input { + display:block; + float:left; + margin:2px 5px 2px 0; +} +ul.tagit li.tagit-choice a.tag-close { + color:#fff; + cursor:pointer; + font-weight:bold; + padding-left: 3px; + text-decoration:none; + text-shadow: none; +} +ul.tagit input[type="text"] { + width: 200px; +} diff --git a/hub/static/css/lib/tooltipster.css b/hub/static/css/lib/tooltipster.css new file mode 100644 index 0000000..e5c609c --- /dev/null +++ b/hub/static/css/lib/tooltipster.css @@ -0,0 +1,274 @@ +/* This is the default Tooltipster theme (feel free to modify or duplicate and create multiple themes!): */ +.tooltipster-default { + border-radius: 5px; + border: 2px solid #000; + background: #4c4c4c; + color: #fff; +} + +/* Use this next selector to style things like font-size and line-height: */ +.tooltipster-default .tooltipster-content { + font-family: Arial, sans-serif; + font-size: 14px; + line-height: 16px; + padding: 8px 10px; + overflow: hidden; +} + +/* This next selector defines the color of the border on the outside of the arrow. This will automatically match the color and size of the border set on the main tooltip styles. Set display: none; if you would like a border around the tooltip but no border around the arrow */ +.tooltipster-default .tooltipster-arrow .tooltipster-arrow-border { + /* border-color: ... !important; */ +} + + +/* If you're using the icon option, use this next selector to style them */ +.tooltipster-icon { + cursor: help; + margin-left: 4px; +} + + + + + + + + +/* This is the base styling required to make all Tooltipsters work */ +.tooltipster-base { + padding: 0; + font-size: 0; + line-height: 0; + position: absolute; + left: 0; + top: 0; + z-index: 9999999; + pointer-events: none; + width: auto; + overflow: visible; +} +.tooltipster-base .tooltipster-content { + overflow: hidden; +} + + +/* These next classes handle the styles for the little arrow attached to the tooltip. By default, the arrow will inherit the same colors and border as what is set on the main tooltip itself. */ +.tooltipster-arrow { + display: block; + text-align: center; + width: 100%; + height: 100%; + position: absolute; + top: 0; + left: 0; + z-index: -1; +} +.tooltipster-arrow span, .tooltipster-arrow-border { + display: block; + width: 0; + height: 0; + position: absolute; +} +.tooltipster-arrow-top span, .tooltipster-arrow-top-right span, .tooltipster-arrow-top-left span { + border-left: 8px solid transparent !important; + border-right: 8px solid transparent !important; + border-top: 8px solid; + bottom: -7px; +} +.tooltipster-arrow-top .tooltipster-arrow-border, .tooltipster-arrow-top-right .tooltipster-arrow-border, .tooltipster-arrow-top-left .tooltipster-arrow-border { + border-left: 9px solid transparent !important; + border-right: 9px solid transparent !important; + border-top: 9px solid; + bottom: -7px; +} + +.tooltipster-arrow-bottom span, .tooltipster-arrow-bottom-right span, .tooltipster-arrow-bottom-left span { + border-left: 8px solid transparent !important; + border-right: 8px solid transparent !important; + border-bottom: 8px solid; + top: -7px; +} +.tooltipster-arrow-bottom .tooltipster-arrow-border, .tooltipster-arrow-bottom-right .tooltipster-arrow-border, .tooltipster-arrow-bottom-left .tooltipster-arrow-border { + border-left: 9px solid transparent !important; + border-right: 9px solid transparent !important; + border-bottom: 9px solid; + top: -7px; +} +.tooltipster-arrow-top span, .tooltipster-arrow-top .tooltipster-arrow-border, .tooltipster-arrow-bottom span, .tooltipster-arrow-bottom .tooltipster-arrow-border { + left: 0; + right: 0; + margin: 0 auto; +} +.tooltipster-arrow-top-left span, .tooltipster-arrow-bottom-left span { + left: 6px; +} +.tooltipster-arrow-top-left .tooltipster-arrow-border, .tooltipster-arrow-bottom-left .tooltipster-arrow-border { + left: 5px; +} +.tooltipster-arrow-top-right span, .tooltipster-arrow-bottom-right span { + right: 6px; +} +.tooltipster-arrow-top-right .tooltipster-arrow-border, .tooltipster-arrow-bottom-right .tooltipster-arrow-border { + right: 5px; +} +.tooltipster-arrow-left span, .tooltipster-arrow-left .tooltipster-arrow-border { + border-top: 8px solid transparent !important; + border-bottom: 8px solid transparent !important; + border-left: 8px solid; + top: 50%; + margin-top: -7px; + right: -7px; +} +.tooltipster-arrow-left .tooltipster-arrow-border { + border-top: 9px solid transparent !important; + border-bottom: 9px solid transparent !important; + border-left: 9px solid; + margin-top: -8px; +} +.tooltipster-arrow-right span, .tooltipster-arrow-right .tooltipster-arrow-border { + border-top: 8px solid transparent !important; + border-bottom: 8px solid transparent !important; + border-right: 8px solid; + top: 50%; + margin-top: -7px; + left: -7px; +} +.tooltipster-arrow-right .tooltipster-arrow-border { + border-top: 9px solid transparent !important; + border-bottom: 9px solid transparent !important; + border-right: 9px solid; + margin-top: -8px; +} + + +/* Some CSS magic for the awesome animations - feel free to make your own custom animations and reference it in your Tooltipster settings! */ + +.tooltipster-fade { + opacity: 0; + -webkit-transition-property: opacity; + -moz-transition-property: opacity; + -o-transition-property: opacity; + -ms-transition-property: opacity; + transition-property: opacity; +} +.tooltipster-fade-show { + opacity: 1; +} + +.tooltipster-grow { + -webkit-transform: scale(0,0); + -moz-transform: scale(0,0); + -o-transform: scale(0,0); + -ms-transform: scale(0,0); + transform: scale(0,0); + -webkit-transition-property: -webkit-transform; + -moz-transition-property: -moz-transform; + -o-transition-property: -o-transform; + -ms-transition-property: -ms-transform; + transition-property: transform; + -webkit-backface-visibility: hidden; +} +.tooltipster-grow-show { + -webkit-transform: scale(1,1); + -moz-transform: scale(1,1); + -o-transform: scale(1,1); + -ms-transform: scale(1,1); + transform: scale(1,1); + -webkit-transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + -webkit-transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1.15); + -moz-transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1.15); + -ms-transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1.15); + -o-transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1.15); + transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1.15); +} + +.tooltipster-swing { + opacity: 0; + -webkit-transform: rotateZ(4deg); + -moz-transform: rotateZ(4deg); + -o-transform: rotateZ(4deg); + -ms-transform: rotateZ(4deg); + transform: rotateZ(4deg); + -webkit-transition-property: -webkit-transform, opacity; + -moz-transition-property: -moz-transform; + -o-transition-property: -o-transform; + -ms-transition-property: -ms-transform; + transition-property: transform; +} +.tooltipster-swing-show { + opacity: 1; + -webkit-transform: rotateZ(0deg); + -moz-transform: rotateZ(0deg); + -o-transform: rotateZ(0deg); + -ms-transform: rotateZ(0deg); + transform: rotateZ(0deg); + -webkit-transition-timing-function: cubic-bezier(0.230, 0.635, 0.495, 1); + -webkit-transition-timing-function: cubic-bezier(0.230, 0.635, 0.495, 2.4); + -moz-transition-timing-function: cubic-bezier(0.230, 0.635, 0.495, 2.4); + -ms-transition-timing-function: cubic-bezier(0.230, 0.635, 0.495, 2.4); + -o-transition-timing-function: cubic-bezier(0.230, 0.635, 0.495, 2.4); + transition-timing-function: cubic-bezier(0.230, 0.635, 0.495, 2.4); +} + +.tooltipster-fall { + top: 0; + -webkit-transition-property: top; + -moz-transition-property: top; + -o-transition-property: top; + -ms-transition-property: top; + transition-property: top; + -webkit-transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + -webkit-transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1.15); + -moz-transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1.15); + -ms-transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1.15); + -o-transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1.15); + transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1.15); +} +.tooltipster-fall-show { +} +.tooltipster-fall.tooltipster-dying { + -webkit-transition-property: all; + -moz-transition-property: all; + -o-transition-property: all; + -ms-transition-property: all; + transition-property: all; + top: 0px !important; + opacity: 0; +} + +.tooltipster-slide { + left: -40px; + -webkit-transition-property: left; + -moz-transition-property: left; + -o-transition-property: left; + -ms-transition-property: left; + transition-property: left; + -webkit-transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + -webkit-transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1.15); + -moz-transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1.15); + -ms-transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1.15); + -o-transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1.15); + transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1.15); +} +.tooltipster-slide.tooltipster-slide-show { +} +.tooltipster-slide.tooltipster-dying { + -webkit-transition-property: all; + -moz-transition-property: all; + -o-transition-property: all; + -ms-transition-property: all; + transition-property: all; + left: 0px !important; + opacity: 0; +} + + +/* CSS transition for when contenting is changing in a tooltip that is still open. The only properties that will NOT transition are: width, height, top, and left */ +.tooltipster-content-changing { + opacity: 0.5; + -webkit-transform: scale(1.1, 1.1); + -moz-transform: scale(1.1, 1.1); + -o-transform: scale(1.1, 1.1); + -ms-transform: scale(1.1, 1.1); + transform: scale(1.1, 1.1); +} diff --git a/hub/static/css/lib/zen-form.scss b/hub/static/css/lib/zen-form.scss new file mode 100644 index 0000000..2cdb0b9 --- /dev/null +++ b/hub/static/css/lib/zen-form.scss @@ -0,0 +1,124 @@ + +/* ================================== *\ + * Zen Form + * ================================== */ + +.zen-forms { + position: fixed; + z-index: 99999; + top: 0; + left: 0; + right: 0; + bottom: 0; + padding: 24px 30px 24px 24px; +} + +.zen-forms-input-wrap { + max-width: 640px; + position: relative; + margin: 0 auto; +} + +/** + * Buttons style + */ +.zen-forms-close-button, +.zen-forms-theme-switch { + position: absolute; + width: 18px; + height: 18px; + text-align: center; + top: 10px; + right: 10px; + font-size: 24px; + color: #516066; + cursor: pointer; + line-height: 1; +} + +.zen-forms-theme-switch { + top: 28px; + font-size: 34px; +} + +.zen-forms-close-button:hover, +.zen-forms-theme-switch:hover { + color: #667981; +} + +/** + * Inputs basic style + */ +.zen-forms input, +.zen-forms textarea { + padding: 8px 0; + width: 100%; + background: none; + border: none; + margin-bottom: 24px; + cursor: pointer; +} + +.zen-forms input:focus, +.zen-forms textarea:focus { + cursor: text; +} + +.zen-forms textarea { + resize: none; +} + +.zen-forms label { + cursor: pointer; + display: none; + padding: 8px 3; + position: absolute; + top: 0; + width: 100%; +} + +.zen-forms .empty + label { + display: block; +} + +.zen-forms input:focus + label, +.zen-forms textarea:focus + label { + display: none; +} + +.zen-forms :focus { + outline-color: transparent; + outline-style: none; +} + +/** + * Dark theme + */ +.zen-forms { + background: #151a1c; +} + +.zen-forms label { + color: #516066; +} + +.zen-forms input, +.zen-forms textarea { + color: #667981; +} + +/** + * Light theme + */ +.zen-forms.light-theme { + background: #fefefe; +} + +.zen-forms.light-theme label { + color: #959697; +} + +.zen-forms.light-theme input, +.zen-forms.light-theme textarea { + color: #707071; +} diff --git a/hub/static/css/login.css b/hub/static/css/login.css new file mode 100644 index 0000000..32cc7d7 --- /dev/null +++ b/hub/static/css/login.css @@ -0,0 +1,1445 @@ +html { + color: #000; + background: #FFF; + overflow-y: scroll; + overflow-x: hidden; + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + font-family: sans-serif; +} +html, +body { + height: 100%; + min-height: 100%; +} +a { + background: transparent; +} +a, +a:active, +a:hover { + outline: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section, +body, +div, +dl, +dt, +dd, +ul, +ol, +li, +h1, +h2, +h3, +h4, +h5, +h6, +pre, +code, +form, +fieldset, +legend, +input, +textarea, +p, +blockquote, +th, +td { + margin: 0; + padding: 0; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +fieldset, +img { + border: 0; +} +address, +caption, +cite, +code, +dfn, +em, +strong, +th, +var { + font-style: normal; + font-weight: normal; +} +ol, +ul { + list-style: none; +} +caption, +th { + text-align: left; +} +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: 100%; + font-weight: normal; +} +q:before, +q:after { + content: ''; +} +abbr, +acronym { + border: 0; + font-variant: normal; +} +/* to preserve line-height and selector appearance */ +sup { + vertical-align: text-top; +} +sub { + vertical-align: text-bottom; +} +input, +textarea, +select { + font-family: inherit; + font-size: inherit; + font-weight: inherit; + *font-size: 100%; + /*to enable resizing for IE*/ +} +legend { + color: #000; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section { + display: block; +} +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} +audio:not([controls]) { + display: none; +} +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sup { + top: -0.5em; +} +sub { + bottom: -0.25em; +} +svg:not(:root) { + overflow: hidden; +} +button, +input, +select, +textarea { + margin: 0; + font-size: 100%; + vertical-align: middle; +} +button, +input { + *overflow: visible; + line-height: normal; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} +button, +input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + -webkit-appearance: button; +} +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} +textarea { + overflow: auto; + vertical-align: top; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +pre { + overflow: auto; +} +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +td, +th { + padding: 0; +} +svg { + display: block; +} +.hidden { + display: none !important; + visibility: hidden !important; + opacity: 0; +} +::selection { + background: #40b4de; + color: #fff; +} +::-moz-selection { + background: #40b4de; + color: #fff; +} +* { + outline: none; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + -webkit-tap-highlight-color: transparent; +} +a { + color: #40b4de; + text-decoration: none; + -webkit-transition: color 0.3s ease-in-out; + -moz-transition: color 0.3s ease-in-out; + -ms-transition: color 0.3s ease-in-out; + -o-transition: color 0.3s ease-in-out; + transition: color 0.3s ease-in-out; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + -o-user-select: none; + user-select: none; +} +a:hover { + color: #1b7a9d; + text-decoration: none; +} +a:active { + color: #97d6ed; +} +a:focus { + outline: none; +} +p { + font-size: 14px; + line-height: 1.6; + margin: 0 0 11px; +} +table { + width: 100%; +} +table thead, +table tr, +table th, +table td { + vertical-align: middle; +} +table td { + padding-right: 20px; +} +.input_group { + display: block; + position: relative; + width: 100%; + min-height: 70px; + margin-bottom: 10px; +} +@media only screen and (min-width : 0px) and (max-width : 870px) { + .input_group { + min-height: 64px; + margin-bottom: 0; + } +} +.input_group label.input_label { + display: -webkit-flex; + display: -moz-flex; + display: -ms-flexbox; + display: -ms-flex; + display: flex; + -webkit-align-items: center; + -moz-align-items: center; + -ms-align-items: center; + align-items: center; + top: 0; + left: 0; + width: 100%; + height: 100%; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + -o-user-select: none; + user-select: none; + -webkit-box-sizing: border-box; + -khtml-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + position: absolute; + z-index: 10; + cursor: text; + padding: 0 0 0 15px; +} +.input_group label.input_label .label_text { + font-size: 18px; + font-weight: 100; + letter-spacing: .7px; +} +@media only screen and (min-width : 0px) and (max-width : 870px) { + .input_group label.input_label .label_text { + font-size: 16px; + font-weight: 300; + } +} +@media only screen and (min-width : 0px) and (max-width : 870px) { + .input_group label.input_label { + height: 64px; + } +} +.input_group.input_empty.input_unfocused { + color: #c1c5cc; +} +.input_group.input_focused label.input_label, +.input_group.input_hasValue label.input_label { + height: 46px; +} +@media only screen and (min-width : 0px) and (max-width : 870px) { + .input_group.input_focused label.input_label, + .input_group.input_hasValue label.input_label { + height: 40px; + } +} +.input_group.input_focused label.input_label .label_text, +.input_group.input_hasValue label.input_label .label_text { + color: #b8bdc4; + letter-spacing: .7px; + font-size: 11px; +} +.input_group.input_unfocused.input_hasValue.input_valid label.input_label { + color: #b1b0b1; +} +.input_group input.input { + display: block; + position: relative; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + width: 100%; + -webkit-box-sizing: border-box; + -khtml-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: all 0.7s ease-in-out; + -moz-transition: all 0.7s ease-in-out; + -ms-transition: all 0.7s ease-in-out; + -o-transition: all 0.7s ease-in-out; + transition: all 0.7s ease-in-out; + z-index: 1; + -webkit-appearance: none; + border: none; + outline: none; + padding: 18px 15px 0 15px; + margin: 0 auto 13px auto; + color: #363b4a; + letter-spacing: .7px; + font-family: 'Roboto', sans-serif; + font-weight: 300; + font-size: 16px; + height: 70px; +} +@media only screen and (min-width : 0px) and (max-width : 870px) { + .input_group input.input { + font-size: 14px; + padding: 15px 15px 0 15px; + height: 64px; + } +} +.input_group input.input:-webkit-autofill { + -webkit-box-shadow: 0 0 0px 1000px white inset; + color: #cacaca; +} +.input_group i { + top: 0; + right: 15px; + display: -webkit-flex; + display: -moz-flex; + display: -ms-flexbox; + display: -ms-flex; + display: flex; + -webkit-flex-direction: row; + -moz-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; + -webkit-align-items: center; + -moz-align-items: center; + -ms-align-items: center; + align-items: center; + width: 20px; + height: 70px; + z-index: 1000; + position: absolute; + z-index: 100; +} +@media only screen and (min-width : 0px) and (max-width : 870px) { + .input_group i { + height: 64px; + } +} +.input_group i svg { + opacity: 0; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + width: 20px; + height: 20px; +} +.input_group i.input_error_icon { + z-index: 10; +} +.input_group i.input_error_icon path { + fill: #f16767; +} +.input_group i.input_valid_icon { + z-index: 1; +} +.input_group i.input_valid_icon path { + fill: #50b87f; +} +.input_group.input_error i.input_error_icon svg { + opacity: 1; +} +.input_group.input_valid i.input_error_icon { + z-index: 1; +} +.input_group.input_valid i.input_valid_icon { + z-index: 10; +} +.input_group.input_valid.input_hasValue i.input_valid_icon svg { + opacity: 1; +} +.error_container { + opacity: 0; + white-space: nowrap; + line-height: 70px; + width: auto; + height: 70px; + background: #f16767; + -webkit-box-sizing: border-box; + -khtml-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + padding: 0 20px 0 20px; + color: white; + font-size: 14px; + font-weight: 100; + letter-spacing: .6px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + -o-user-select: none; + user-select: none; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +@media only screen and (min-width : 0px) and (max-width : 870px) { + .error_container { + position: relative; + top: -13px; + left: 0; + line-height: 30px; + font-size: 12px; + padding: 0 15px 0 15px; + font-weight: 300; + } +} +.error_container.visible { + -o-transform: translateX(0px); + -webkit-transform: translateX(0px); + -moz-transform: translateX(0px); + -ms-transform: translateX(0px); + transform: translateX(0px); + opacity: 1; +} +@media only screen and (min-width : 0px) and (max-width : 870px) { + .error_container.visible { + height: 30px; + } +} +.error_container.invisible { + -o-transform: translateX(-30px); + -webkit-transform: translateX(-30px); + -moz-transform: translateX(-30px); + -ms-transform: translateX(-30px); + transform: translateX(-30px); + opacity: 0; + -webkit-animation-delay: 2s; + /* Chrome, Safari, Opera */ + animation-delay: 2s; + display: none; +} +@media only screen and (min-width : 0px) and (max-width : 870px) { + .error_container.invisible { + height: 0; + line-height: 0; + -o-transform: translateX(0px); + -webkit-transform: translateX(0px); + -moz-transform: translateX(0px); + -ms-transform: translateX(0px); + transform: translateX(0px); + display: none; + } +} +.password_validator { + top: 0; + left: 105%; + position: absolute; + display: block; + opacity: 0; + width: 320px; + height: auto; + -webkit-box-sizing: border-box; + -khtml-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + -o-user-select: none; + user-select: none; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + opacity: 1; + z-index: 100; +} +.password_validator:after { + display: block; + position: absolute; + top: 30px; + left: -10px; + content: ''; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + border-right: 10px solid #e4e7e8; +} +.password_validator .validator_container { + display: block; + position: relative; + -webkit-box-sizing: border-box; + -khtml-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + background: #e4e7e8; + padding: 10px 0px 10px 20px; +} +.password_validator .validator_container h4.validator_title { + display: block; + position: relative; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + margin: 12px 0 5px 0; + font-size: 12px; + font-weight: 500; + text-transform: uppercase; + color: #363b4a; + opacity: .25; + letter-spacing: 1.5px; +} +.password_validator .validator_container h4.validator_title.valid { + color: #50b87f; + opacity: 1; +} +.password_validator .validator_container ul.rules_list { + display: block; + position: relative; + margin: 0; + padding: 0; +} +.password_validator .validator_container ul.rules_list > li { + display: block; + position: relative; + margin: 12px 0 12px 0; + font-size: 12px; + letter-spacing: .3px; + font-weight: 200; + color: #363b4a; +} +.password_validator .validator_container ul.rules_list > li .bad_word { + font-style: italic; + padding: 0 5px 0 0; +} +.password_validator .validator_container ul.rules_list > li .bad_word:after { + content: ','; + display: inline; +} +.password_validator .validator_container ul.rules_list > li .bad_word:last-child { + padding: 0; +} +.password_validator .validator_container ul.rules_list > li .bad_word:last-child:after { + display: none; +} +.password_validator .validator_container ul.rules_list > li .icon_invalid { + display: block; + position: absolute; + top: 1px; + left: 0; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -ms-transform: scale(1); + -o-transform: scale(1); + transform: scale(1); + opacity: 1; + width: 18px; + height: 18px; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +.password_validator .validator_container ul.rules_list > li .icon_invalid svg { + opacity: 1; + width: 18px; + height: 18px; +} +.password_validator .validator_container ul.rules_list > li .icon_invalid svg path { + fill: #f16767; +} +.password_validator .validator_container ul.rules_list > li .icon_valid { + position: absolute; + top: 1px; + left: 0; + -webkit-transform: scale(0); + -moz-transform: scale(0); + -ms-transform: scale(0); + -o-transform: scale(0); + transform: scale(0); + opacity: 0; + width: 19px; + height: 19px; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +.password_validator .validator_container ul.rules_list > li .icon_valid svg { + opacity: 1; + width: 19px; + height: 19px; +} +.password_validator .validator_container ul.rules_list > li .error_message { + display: block; + position: relative; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + padding: 0 0 0 27px; + opacity: .9; +} +.password_validator .validator_container ul.rules_list > li.valid .icon_invalid { + -webkit-transform: scale(0); + -moz-transform: scale(0); + -ms-transform: scale(0); + -o-transform: scale(0); + transform: scale(0); + opacity: 0; +} +.password_validator .validator_container ul.rules_list > li.valid .icon_valid { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -ms-transform: scale(1); + -o-transform: scale(1); + transform: scale(1); + opacity: 1; +} +.password_validator .validator_container ul.rules_list > li.valid .error_message { + opacity: .3; +} +.password_validator.visible { + -o-transform: translateX(0px); + -webkit-transform: translateX(0px); + -moz-transform: translateX(0px); + -ms-transform: translateX(0px); + transform: translateX(0px); + opacity: 1; +} +.password_validator.invisible { + -o-transform: translateX(-15px); + -webkit-transform: translateX(-15px); + -moz-transform: translateX(-15px); + -ms-transform: translateX(-15px); + transform: translateX(-15px); + opacity: 0; + -webkit-animation-delay: 2s; + /* Chrome, Safari, Opera */ + animation-delay: 2s; +} +.Select { + position: relative; +} +.Select .Select-control { + display: block; + position: relative; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + width: 100%; + height: 70px; + -webkit-box-sizing: border-box; + -khtml-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: all 0.7s ease-in-out; + -moz-transition: all 0.7s ease-in-out; + -ms-transition: all 0.7s ease-in-out; + -o-transition: all 0.7s ease-in-out; + transition: all 0.7s ease-in-out; + background: white; + z-index: 1; + -webkit-appearance: none; + border: none; + outline: none; + margin: 0 auto 13px auto; + color: #363b4a; + letter-spacing: .5px; + font-weight: 300; + font-size: 18px; +} +@media only screen and (min-width : 0px) and (max-width : 870px) { + .Select .Select-control { + height: 64px; + } +} +.Select.is-searchable.is-open > .Select-control { + cursor: text; +} +.Select.is-open > .Select-control { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + background: white; + border-color: #b3b3b3 #cccccc #d9d9d9; +} +.Select.is-open > .Select-control > .Select-arrow { + border-color: transparent transparent #999999; + border-width: 0 8px 8px; +} +.Select.is-searchable.is-focused:not(.is-open) > .Select-control { + cursor: text; +} +.Select .Select-placeholder { + display: block; + top: 20px; + left: 0; + font-size: 18px; + font-weight: 100; + letter-spacing: .7px; + position: absolute; + cursor: text; + padding: 0 0 0 15px; + color: #c1c5cc; + z-index: 10; +} +@media only screen and (min-width : 0px) and (max-width : 870px) { + .Select .Select-placeholder { + font-size: 16px; + font-weight: 300; + } +} +.Select .Select-actual-placeholder { + position: absolute; + display: none; + color: #b8bdc4; + letter-spacing: .3px; + font-size: 11px; + top: 14px; + left: 15px; + z-index: 10; + font-weight: 300; +} +@media only screen and (min-width : 0px) and (max-width : 870px) { + .Select .Select-actual-placeholder { + font-weight: 300; + } +} +.Select.is-focused .Select-placeholder { + opacity: 0; +} +.Select.has-value .Select-actual-placeholder, +.Select.is-focused.has-value .Select-actual-placeholder { + display: block; +} +.Select.has-value .Select-placeholder, +.Select.is-focused.has-value .Select-placeholder { + color: #333333; + opacity: 1; + top: 30px; + color: #363b4a; + letter-spacing: .5px; + font-weight: 300; + font-size: 16px; +} +@media only screen and (min-width : 0px) and (max-width : 870px) { + .Select.has-value .Select-placeholder, + .Select.is-focused.has-value .Select-placeholder { + font-size: 14px; + } +} +.Select.is-focused .Select-placeholder { + opacity: 0; +} +.Select.is-focused .Select-actual-placeholder { + display: block; +} +.Select.is-open .Select-actual-placeholder { + display: block; +} +.Select.is-open .Select-placeholder { + display: none; +} +.Select.is-open.has-value .Select-placeholder, +.Select.is-open.has-value.is-focused .Select-placeholder { + display: block; +} +.Select .Select-input > input { + display: block; + position: relative; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + width: 410px; + height: 70px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + -webkit-transition: all 0.7s ease-in-out; + -moz-transition: all 0.7s ease-in-out; + -ms-transition: all 0.7s ease-in-out; + -o-transition: all 0.7s ease-in-out; + transition: all 0.7s ease-in-out; + -webkit-box-sizing: border-box; + -khtml-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + z-index: 1; + -webkit-appearance: none; + border: none; + outline: none; + padding: 16px 15px 0 15px; + margin: 0 auto 13px auto; + color: #363b4a; + letter-spacing: .5px; + font-weight: 300; + font-size: 16px; +} +@media only screen and (min-width : 0px) and (max-width : 870px) { + .Select .Select-input > input { + height: 64px; + font-size: 14px; + } +} +.is-focused .Select .Select-input > input { + cursor: text; +} +.Select .Select-control:not(.is-searchable) > .Select-input { + outline: none; +} +.Select .Select-loading { + -moz-animation: spin 400ms infinite linear; + -ms-animation: spin 400ms infinite linear; + -webkit-animation: spin 400ms infinite linear; + -o-animation: spin 400ms infinite linear; + animation: spin 400ms infinite linear; + width: 16px; + height: 16px; + box-sizing: border-box; + border-radius: 50%; + border: 2px solid #cccccc; + border-right-color: #333333; + display: inline-block; + position: relative; + margin-top: -8px; + position: absolute; + right: 30px; + top: 50%; +} +.Select .has-value > .Select-control > .Select-loading { + right: 46px; +} +.Select .Select-clear { + opacity: 0; +} +.Select .Select-arrow { + border-color: #999999 transparent transparent; + border-style: solid; + border-width: 8px 8px 0; + content: " "; + display: block; + height: 0; + margin-top: -ceil(4px); + position: absolute; + right: 15px; + top: 32px; + width: 0; + opacity: .8; +} +@media only screen and (min-width : 0px) and (max-width : 870px) { + .Select .Select-arrow { + top: 30px; + } +} +.Select .Select-menu { + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; + background-color: white; + margin-top: 0px; + margin-left: -2px; + border: 2px solid #f0f4f5; + max-height: 210px; + overflow-y: auto; + position: absolute; + top: 100%; + width: 100%; + z-index: 1000; + -webkit-overflow-scrolling: touch; +} +.Select .Select-menu::-webkit-scrollbar { + width: 11px; + background-color: transparent; + background-clip: content-box; +} +.Select .Select-menu::-webkit-scrollbar-button { + background-color: transparent; +} +.Select .Select-menu::-webkit-scrollbar-corner { + background-color: transparent; +} +.Select .Select-menu::-webkit-scrollbar-thumb { + border: solid transparent; + border-width: 1px 1px 1px 2px; + background-color: #c5c5c5; + background-clip: content-box; +} +.Select .Select-menu::-webkit-scrollbar-thumb:hover { + background-color: #bfbfbf; +} +.Select .Select-menu::-webkit-scrollbar-track { + border: solid #fff; + border-width: 1px 1px 1px 2px; + background-color: #fff; + background-clip: content-box; +} +.Select .Select-menu::-webkit-scrollbar-track-piece { + border-left: 1px solid #ccc; + background-color: transparent; +} +.Select .Select-menu::-webkit-scrollbar:horizontal { + height: 12px; + background-color: transparent; + background-clip: content-box; +} +.Select .Select-menu::-webkit-scrollbar-track:horizontal { + background-color: #fff; + background-clip: content-box; +} +.Select .Select-menu::-webkit-scrollbar-track-piece:horizontal { + border-top: 1px solid #ccc; + border-left: 1px solid transparent; +} +.Select .Select-menu::-webkit-scrollbar-thumb:horizontal { + border: solid transparent; + border-width: 2px 1px 2px 2px; + background-color: #c5c5c5; + background-clip: content-box; +} +.Select .Select-menu::-webkit-scrollbar-thumb:horizontal:hover { + background-color: #bfbfbf; +} +.Select .Select-menu::-webkit-scrollbar-corner { + display: none; +} +.Select .Select-menu::-webkit-resizer { + display: none; +} +.Select .Select-menu::-webkit-scrollbar { + width: 16px; + background-color: transparent; + background-clip: content-box; + cursor: pointer; +} +.Select .Select-menu::-webkit-scrollbar-button { + background-color: transparent; +} +.Select .Select-menu::-webkit-scrollbar-corner { + background-color: transparent; +} +.Select .Select-menu::-webkit-scrollbar-thumb { + border: solid transparent; + border-width: 6px; + background-color: #c5c5c5; + background-clip: content-box; + cursor: pointer; +} +.Select .Select-menu::-webkit-scrollbar-thumb:hover { + background-color: #bfbfbf; +} +.Select .Select-menu::-webkit-scrollbar-track { + border: solid #fff; + border-width: 1px 1px 1px 2px; + background-color: #fff; + background-clip: content-box; +} +.Select .Select-menu::-webkit-scrollbar-track-piece { + border-left: 1px solid #f0f4f5; + background-color: transparent; +} +.Select .Select-menu::-webkit-scrollbar:horizontal { + height: 12px; + background-color: transparent; + background-clip: content-box; +} +.Select .Select-menu::-webkit-scrollbar-track:horizontal { + background-color: #fff; + background-clip: content-box; +} +.Select .Select-menu::-webkit-scrollbar-track-piece:horizontal { + border-top: 1px solid transparent; + border-left: 1px solid transparent; +} +.Select .Select-menu::-webkit-scrollbar-thumb:horizontal { + border: solid transparent; + border-width: 2px 1px 2px 2px; + background-color: #c5c5c5; + background-clip: content-box; +} +.Select .Select-menu::-webkit-scrollbar-thumb:horizontal:hover { + background-color: #bfbfbf; +} +.Select .Select-menu::-webkit-scrollbar-corner { + display: none; +} +.Select .Select-menu::-webkit-resizer { + display: none; +} +@media only screen and (min-width : 0px) and (max-width : 870px) { + .Select .Select-menu { + top: 64px; + } +} +.Select .Select-option { + box-sizing: border-box; + color: #666666; + cursor: pointer; + display: block; + padding: 8px 15px; + font-weight: 100; + letter-spacing: .4px; +} +.Select .Select-option:last-child { + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.Select .Select-option.is-focused { + background-color: #82d2f0; + color: #fff; +} +.Select .Select-noresults { + box-sizing: border-box; + color: #999999; + cursor: default; + display: block; + padding: 8px 10px; +} +@keyframes spin { + to { + transform: rotate(1turn); + } +} +@-webkit-keyframes spin { + to { + -webkit-transform: rotate(1turn); + } +} +.button { + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + -o-user-select: none; + user-select: none; + display: inline-block; + position: relative; + border: none; + border-radius: 3px; + background: #545a6a; + color: #ffffff; + font: normal normal 200 13px/40px 'Roboto', sans-serif; + text-transform: uppercase; + letter-spacing: 1.5px; + height: 40px; + padding: 0px 15px; + -webkit-font-smoothing: subpixel-antialiased; + cursor: pointer; + white-space: nowrap; +} +.button.button_wide { + display: block; + position: relative; + width: 100%; + margin: 20px 0 0 0; + height: 50px; + font-size: 13px; +} +.button:hover, +.button:focus { + color: #ffffff; + background: #40b4de; +} +.button:active, +.button.active { + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + background: #6bc5e6; +} +html { + width: 100%; + height: 100%; + overflow: hidden; +} +body { + position: absolute; + width: 100%; + height: 100%; + -webkit-font-smoothing: subpixel-antialiased; + background: #f0f4f5; + overflow: hidden; + font: normal normal 100 14px/1.6 'Roboto', sans-serif; + -webkit-overflow-scrolling: touch; + display: block; +} +.application_wrapper { + display: block; + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + z-index: 1; + overflow-y: scroll; + overflow-x: hidden; +} +.application_wrapper::-webkit-scrollbar { + width: 11px; + background-color: transparent; + background-clip: content-box; +} +.application_wrapper::-webkit-scrollbar-button { + background-color: transparent; +} +.application_wrapper::-webkit-scrollbar-corner { + background-color: transparent; +} +.application_wrapper::-webkit-scrollbar-thumb { + border: solid transparent; + border-width: 1px 1px 1px 2px; + background-color: #c5c5c5; + background-clip: content-box; +} +.application_wrapper::-webkit-scrollbar-thumb:hover { + background-color: #bfbfbf; +} +.application_wrapper::-webkit-scrollbar-track { + border: solid #fff; + border-width: 1px 1px 1px 2px; + background-color: #fff; + background-clip: content-box; +} +.application_wrapper::-webkit-scrollbar-track-piece { + border-left: 1px solid #ccc; + background-color: transparent; +} +.application_wrapper::-webkit-scrollbar:horizontal { + height: 12px; + background-color: transparent; + background-clip: content-box; +} +.application_wrapper::-webkit-scrollbar-track:horizontal { + background-color: #fff; + background-clip: content-box; +} +.application_wrapper::-webkit-scrollbar-track-piece:horizontal { + border-top: 1px solid #ccc; + border-left: 1px solid transparent; +} +.application_wrapper::-webkit-scrollbar-thumb:horizontal { + border: solid transparent; + border-width: 2px 1px 2px 2px; + background-color: #c5c5c5; + background-clip: content-box; +} +.application_wrapper::-webkit-scrollbar-thumb:horizontal:hover { + background-color: #bfbfbf; +} +.application_wrapper::-webkit-scrollbar-corner { + display: none; +} +.application_wrapper::-webkit-resizer { + display: none; +} +.application_wrapper::-webkit-scrollbar { + width: 16px; + background-color: transparent; + background-clip: content-box; + cursor: pointer; +} +.application_wrapper::-webkit-scrollbar-button { + background-color: transparent; +} +.application_wrapper::-webkit-scrollbar-corner { + background-color: transparent; +} +.application_wrapper::-webkit-scrollbar-thumb { + border: solid transparent; + border-width: 6px; + background-color: #c5c5c5; + background-clip: content-box; + cursor: pointer; +} +.application_wrapper::-webkit-scrollbar-thumb:hover { + background-color: #bfbfbf; +} +.application_wrapper::-webkit-scrollbar-track { + border: solid #fff; + border-width: 1px 1px 1px 2px; + background-color: #fff; + background-clip: content-box; +} +.application_wrapper::-webkit-scrollbar-track-piece { + border-left: 1px solid #f0f4f5; + background-color: transparent; +} +.application_wrapper::-webkit-scrollbar:horizontal { + height: 12px; + background-color: transparent; + background-clip: content-box; +} +.application_wrapper::-webkit-scrollbar-track:horizontal { + background-color: #fff; + background-clip: content-box; +} +.application_wrapper::-webkit-scrollbar-track-piece:horizontal { + border-top: 1px solid transparent; + border-left: 1px solid transparent; +} +.application_wrapper::-webkit-scrollbar-thumb:horizontal { + border: solid transparent; + border-width: 2px 1px 2px 2px; + background-color: #c5c5c5; + background-clip: content-box; +} +.application_wrapper::-webkit-scrollbar-thumb:horizontal:hover { + background-color: #bfbfbf; +} +.application_wrapper::-webkit-scrollbar-corner { + display: none; +} +.application_wrapper::-webkit-resizer { + display: none; +} +.application_wrapper .create_account_screen { + display: block; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + min-height: 520px; + opacity: 0; + -moz-animation: fadeIn 0.4s ease-in-out forwards; + -ms-animation: fadeIn 0.4s ease-in-out forwards; + -webkit-animation: fadeIn 0.4s ease-in-out forwards; + -o-animation: fadeIn 0.4s ease-in-out forwards; + animation: fadeIn 0.4s ease-in-out forwards; +} +.application_wrapper .create_account_screen .create_account_form { + display: -webkit-flex; + display: -moz-flex; + display: -ms-flexbox; + display: -ms-flex; + display: flex; + -webkit-flex-direction: column; + -moz-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-justify-content: center; + -moz-justify-content: center; + -ms-justify-content: center; + justify-content: center; + -webkit-align-items: center; + -moz-align-items: center; + -ms-align-items: center; + align-items: center; + position: relative; + margin: 80px 0 200px 0; + min-height: 400px; +} +.application_wrapper .create_account_screen .create_account_form > h1 { + display: block; + position: relative; + font-size: 34px; + letter-spacing: .8px; + font-weight: 200; + line-height: 34px; + margin: 0 0 5px 0; +} +.application_wrapper .create_account_screen .create_account_form p { + display: block; + position: relative; + font-size: 16px; + font-weight: 100; + letter-spacing: .7px; + color: #363b4a; + text-align: center; + opacity: .5; + margin: 0 0 30px 0; +} +.application_wrapper .create_account_screen .create_account_form .checkbox_group { + display: block; + position: relative; + min-height: 40px; +} +.application_wrapper .create_account_screen .create_account_form .checkbox_group span { + letter-spacing: .5px; +} +.application_wrapper .create_account_screen .create_account_form .github_link { + display: block; + position: relative; + margin: 50px 0 50px 0; + opacity: 0; + -moz-animation: fadeIn 0.4s 0.3s ease-in-out forwards; + -ms-animation: fadeIn 0.4s 0.3s ease-in-out forwards; + -webkit-animation: fadeIn 0.4s 0.3s ease-in-out forwards; + -o-animation: fadeIn 0.4s 0.3s ease-in-out forwards; + animation: fadeIn 0.4s 0.3s ease-in-out forwards; +} +.application_wrapper .create_account_screen .create_account_form .github_link svg { + width: 26px; + height: 26px; +} +.application_wrapper .create_account_screen .create_account_form .github_link svg path { + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + fill: #545a6a; +} +.application_wrapper .create_account_screen .create_account_form .github_link:hover svg path { + fill: #40b4de; +} +.application_wrapper .create_account_screen form { + width: 430px; +} +@media only screen and (min-width : 0px) and (max-width : 870px) { + .application_wrapper .create_account_screen form { + width: 300px; + } +} +@-webkit-keyframes fadeIn { + from { + opacity: 0; + } + to { + opacity: 1; + } +} +@-moz-keyframes fadeIn { + from { + opacity: 0; + } + to { + opacity: 1; + } +} +@keyframes fadeIn { + from { + opacity: 0; + } + to { + opacity: 1; + } +} diff --git a/hub/static/css/mod/checkbox.scss b/hub/static/css/mod/checkbox.scss new file mode 100644 index 0000000..2422ba8 --- /dev/null +++ b/hub/static/css/mod/checkbox.scss @@ -0,0 +1,17 @@ +.checkbox-container { + display: inline-block; +} + +.checkbox-container input[type=checkbox] { + vertical-align: middle; +} + +.checkbox-container label { + display: inline; + vertical-align: middle; + padding: 0 0 0 5px; +} + +.checkbox-container label span { + margin: 0 0 0 5px; +} diff --git a/hub/static/css/mod/code-highlight.scss b/hub/static/css/mod/code-highlight.scss new file mode 100644 index 0000000..00ec76e --- /dev/null +++ b/hub/static/css/mod/code-highlight.scss @@ -0,0 +1,63 @@ +/* Highlight style from pygments */ +.code .hll { background-color: #ffffcc; } +.code { background: #ffffff; } +.code .c { color: #808080; } /* Comment */ +.code .err { color: #F00000; background-color: #F0A0A0; } /* Error */ +.code .k { color: #008000; font-weight: bold; } /* Keyword */ +.code .o { color: #303030; } /* Operator */ +.code .cm { color: #808080; } /* Comment.Multiline */ +.code .cp { color: #507090; } /* Comment.Preproc */ +.code .c1 { color: #808080; } /* Comment.Single */ +.code .cs { color: #cc0000; font-weight: bold; } /* Comment.Special */ +.code .gd { color: #A00000; } /* Generic.Deleted */ +.code .ge { font-style: italic; } /* Generic.Emph */ +.code .gr { color: #FF0000; } /* Generic.Error */ +.code .gh { color: #000080; font-weight: bold; } /* Generic.Heading */ +.code .gi { color: #00A000; } /* Generic.Inserted */ +.code .go { color: #808080; } /* Generic.Output */ +.code .gp { color: #c65d09; font-weight: bold; } /* Generic.Prompt */ +.code .gs { font-weight: bold; } /* Generic.Strong */ +.code .gu { color: #800080; font-weight: bold; } /* Generic.Subheading */ +.code .gt { color: #0040D0; } /* Generic.Traceback */ +.code .kc { color: #008000; font-weight: bold; } /* Keyword.Constant */ +.code .kd { color: #008000; font-weight: bold; } /* Keyword.Declaration */ +.code .kn { color: #008000; font-weight: bold; } /* Keyword.Namespace */ +.code .kp { color: #003080; font-weight: bold; } /* Keyword.Pseudo */ +.code .kr { color: #008000; font-weight: bold; } /* Keyword.Reserved */ +.code .kt { color: #303090; font-weight: bold; } /* Keyword.Type */ +.code .m { color: #6000E0; font-weight: bold; } /* Literal.Number */ +.code .s { background-color: #fff0f0; } /* Literal.String */ +.code .na { color: #0000C0; } /* Name.Attribute */ +.code .nb { color: #007020; } /* Name.Builtin */ +.code .nc { color: #B00060; font-weight: bold; } /* Name.Class */ +.code .no { color: #003060; font-weight: bold; } /* Name.Constant */ +.code .nd { color: #505050; font-weight: bold; } /* Name.Decorator */ +.code .ni { color: #800000; font-weight: bold; } /* Name.Entity */ +.code .ne { color: #F00000; font-weight: bold; } /* Name.Exception */ +.code .nf { color: #0060B0; font-weight: bold; } /* Name.Function */ +.code .nl { color: #907000; font-weight: bold; } /* Name.Label */ +.code .nn { color: #0e84b5; font-weight: bold; } /* Name.Namespace */ +.code .nt { color: #007000; } /* Name.Tag */ +.code .nv { color: #906030; } /* Name.Variable */ +.code .ow { color: #000000; font-weight: bold; } /* Operator.Word */ +.code .w { color: #bbbbbb; } /* Text.Whitespace */ +.code .mf { color: #6000E0; font-weight: bold; } /* Literal.Number.Float */ +.code .mh { color: #005080; font-weight: bold; } /* Literal.Number.Hex */ +.code .mi { color: #0000D0; font-weight: bold; } /* Literal.Number.Integer */ +.code .mo { color: #4000E0; font-weight: bold; } /* Literal.Number.Oct */ +.code .sb { background-color: #fff0f0; } /* Literal.String.Backtick */ +.code .sc { color: #0040D0; } /* Literal.String.Char */ +.code .sd { color: #D04020; } /* Literal.String.Doc */ +.code .s2 { background-color: #fff0f0; } /* Literal.String.Double */ +.code .se { color: #606060; font-weight: bold; background-color: #fff0f0; } /* Literal.String.Escape */ +.code .sh { background-color: #fff0f0; } /* Literal.String.Heredoc */ +.code .si { background-color: #e0e0e0; } /* Literal.String.Interpol */ +.code .sx { color: #D02000; background-color: #fff0f0; } /* Literal.String.Other */ +.code .sr { color: #000000; background-color: #fff0ff; } /* Literal.String.Regex */ +.code .s1 { background-color: #fff0f0; } /* Literal.String.Single */ +.code .ss { color: #A06000; } /* Literal.String.Symbol */ +.code .bp { color: #007020; } /* Name.Builtin.Pseudo */ +.code .vc { color: #306090; } /* Name.Variable.Class */ +.code .vg { color: #d07000; font-weight: bold; } /* Name.Variable.Global */ +.code .vi { color: #3030B0; } /* Name.Variable.Instance */ +.code .il { color: #0000D0; font-weight: bold; } /* Literal.Number.Integer.Long */ diff --git a/hub/static/css/mod/colorcube.scss b/hub/static/css/mod/colorcube.scss new file mode 100644 index 0000000..48c3b9a --- /dev/null +++ b/hub/static/css/mod/colorcube.scss @@ -0,0 +1,2 @@ +.colorcube { position:absolute; width:30px; height:30px; border: 1px solid #DDD; } +.colorcube::before { content:""; display:block; height:0; width:0; border:5px solid #DDD; border-width:5px; border-color:#DDD transparent transparent transparent; left:10px; top:30px; float:left; position:absolute } \ No newline at end of file diff --git a/hub/static/css/mod/comment-form-button.scss b/hub/static/css/mod/comment-form-button.scss new file mode 100644 index 0000000..1ef3429 --- /dev/null +++ b/hub/static/css/mod/comment-form-button.scss @@ -0,0 +1,43 @@ +button.classy.primary, button.primary.classy:disabled, button.primary.classy.disabled, button.primary.classy:disabled:hover, button.primary.classy.disabled:disabled:hover, button.classy:disabled:hover.primary, button.classy.disabled:disabled:hover.primary { color:#fff; text-shadow:0 -1px 0 rgba(0, 0, 0, 0.4); border-color:#74BB5A; border-bottom-color:#509338; background:#8ADD6D; -ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#8add6d', endColorstr='#60b044')"; box-shadow:0 1px 4px rgba(0, 0, 0, 0.2); background-image:-webkit-linear-gradient(top, #8ADD6D, #60B044) } +button.classy.primary.disabled { opacity: 0.5 } + +button.classy, +button.classy:disabled, +button.classy.disabled, +a.button.classy:disabled, +a.button.classy.disabled, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover:disabled, +a.button.classy.disabled:hover, +a.button.classy, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy:disabled:hover, +a.button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover { + display: inline-block; + padding: 8px 15px; + line-height: normal; + position: relative; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 12px; + font-weight: bold; + color: #666; + text-shadow: 0 1px rgba(255, 255, 255, 0.9); + background: whiteSmoke; + background: -moz-linear-gradient(whiteSmoke, #E5E5E5); + background: -webkit-linear-gradient(whiteSmoke, #E5E5E5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; + border-radius: 3px; + border: 1px solid #DDD; + border-bottom-color: #BBB; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} \ No newline at end of file diff --git a/hub/static/css/mod/comment-form-content.scss b/hub/static/css/mod/comment-form-content.scss new file mode 100644 index 0000000..bc8b552 --- /dev/null +++ b/hub/static/css/mod/comment-form-content.scss @@ -0,0 +1,9 @@ +.previewable-comment-form.tab-content { overflow:initial; position:relative; } +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { padding:10px } +.previewable-comment-form textarea { display:block; width:100%; max-width:100%; min-height:100px; padding:10px; background:#FAFAFA; border:1px solid #DDD; -webkit-box-sizing:border-box; -moz-box-sizing:border-box; box-sizing:border-box; border-radius:3px } + +#add-comment-form .form-actions { padding:0; } +#add-comment-form .form-content { position:relative; border: 3px solid #EEE; } +#add-comment-form .form-content { padding: 0; background: #EEE; } +#add-comment-form .form-content .write-content { padding:0 10px 10px; } +#add-comment-form .form-content textarea { display: block; width: 100%; max-width: 100%; min-height: 100px; padding: 10px; background: #FAFAFA; border: 1px solid #DDD; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; border-radius: 3px; margin:0 } diff --git a/hub/static/css/mod/comment-form-preview.scss b/hub/static/css/mod/comment-form-preview.scss new file mode 100644 index 0000000..7b2402e --- /dev/null +++ b/hub/static/css/mod/comment-form-preview.scss @@ -0,0 +1,11 @@ +/* preview comment form style */ +.tabnav { margin: 10px 0; border-bottom: 1px solid #DDD; height: 35px; } +.tabnav .tabnav-tabs { display: inline-block; } +.tabnav .tabnav-tabs > li { display: inline-block; } +.tabnav-tab { display: inline-block; margin-bottom: -1px; padding: 8px 12px 9px; border: 1px solid transparent; border-bottom: 0; font-size: 14px; color: #666; text-decoration: none; } +.tabnav-tab.selected { border-color: #DDD; border-radius: 3px 3px 0 0; background-color: white; color: #333; font-weight: bold; } +.tabnav-tab:hover { text-decoration: none; } +.previewable-comment-form .tabnav { position: relative; } +.previewable-comment-form .tabnav ul.tabnav-tabs { padding-left: 10px; } +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { padding: 0 10px 10px; } +.previewable-comment-form #preview_bucket .content-body { padding:10px; min-height:132px; } \ No newline at end of file diff --git a/hub/static/css/mod/comment-form-zen.scss b/hub/static/css/mod/comment-form-zen.scss new file mode 100644 index 0000000..8d20c07 --- /dev/null +++ b/hub/static/css/mod/comment-form-zen.scss @@ -0,0 +1,5 @@ +@import "css/mod/zen-forms"; + +.previewable-comment-form .zen-enabled textarea { padding: 10px 18px 10px 10px; } +.write-content.zen-enabled { position: relative; } +.write-content.zen-enabled .go-zen { position: absolute; right: 15px; top: 5px; } diff --git a/hub/static/css/mod/comment-form.scss b/hub/static/css/mod/comment-form.scss new file mode 100644 index 0000000..5b686b5 --- /dev/null +++ b/hub/static/css/mod/comment-form.scss @@ -0,0 +1,19 @@ +@import "css/mod/comment-form-preview"; +@import "css/mod/comment-form-content"; +@import "css/mod/minibutton"; +@import "css/mod/comment-form-button"; +@import "css/mod/comment-form-zen"; +@import "css/mod/loader"; +@import "css/lib/jquery.atwho"; + +.side-avatar { margin-left: 0; } + +/* fix li header for newer version of bootstrap */ +.comment-form-head li { + line-height: 18px; +} + +#new_comment .form-content { width: 880px; margin-left: 60px; } + +.discussion-bubble-avatar { position: relative; float: left; border-radius: 3px; } +.discussion-bubble-inner { min-height: 60px; border: 1px solid #CACACA; background-color: white; } diff --git a/hub/static/css/mod/comment.scss b/hub/static/css/mod/comment.scss new file mode 100644 index 0000000..c06d8c6 --- /dev/null +++ b/hub/static/css/mod/comment.scss @@ -0,0 +1,63 @@ + +.full-comment .comment-row { + padding: 0; + background: #FBFBFB; + margin-bottom: 20px; + border-radius: 3px; + border: 3px solid #eee; +} +.full-comment .comment-row:before { + position: relative; + content: ""; + display: block; + height: 0; + width: 0; + border: 10px solid #EEE; + border-width: 10px 10px 10px 0; + border-color: transparent #EEE transparent transparent; + left: -12px; + top: 15px; + float: left; +} +.full-comment .side-avatar { + position: relative; + float: left; + border-radius: 3px; + margin-left:-70px +} +.full-comment{ + width: 63em; + max-width: 100%; + margin-left: auto; +} +.full-comment .comment-header { + height: 23px; + color: #333; + margin: 0; + font-size: 12px; + text-shadow: 1px 1px 0 rgba(255,255,255,0.7); + white-space: nowrap; + text-overflow: ellipsis; + padding: 3px 10px 0 6px; + border-bottom: 1px solid #CCC; + background: -webkit-linear-gradient(#f8fbfc, #dde8eb); + background-image: linear-gradient(#f8f8f8,#e1e1e1); +} +#new_comment .form-content { + width:auto; + position: relative; + border: 3px solid #EEE; +} +.form-content:before { + content: ""; + display: block; + height: 0; + width: 0; + border: 10px solid #EEE; + border-width: 10px 10px 10px 0; + border-color: transparent #EEE transparent transparent; + left: -12px; + top: 15px; + float: left; + position: absolute; +} diff --git a/hub/static/css/mod/commits-condensed.scss b/hub/static/css/mod/commits-condensed.scss new file mode 100644 index 0000000..62054d5 --- /dev/null +++ b/hub/static/css/mod/commits-condensed.scss @@ -0,0 +1,167 @@ +table.commits { + width: 100%; + margin-top: 10px; +} + +.boxed-group { + position: relative; + background: #EFEFEF; + padding: 3px; + border-radius: 3px; + margin: 0 0 15px 0; +} +.boxed-group > h3 { + background: #FAFAFA; + background: -moz-linear-gradient(#FAFAFA, #E0E0E0); + background: -webkit-linear-gradient(#FAFAFA, #E0E0E0); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#e0e0e0')"; + margin: 0; + border-top-left-radius: 1px; + border-top-right-radius: 1px; + border: 1px solid #D8D8D8; + border-bottom: 1px solid #CCC; + padding: 10px 10px 11px 10px; + font-size: 14px; + text-shadow: 0 1px 0 white; +} +.boxed-group .boxed-group-inner { + padding: 1px 10px; + background: white; + border: 1px solid #D8D8D8; + border-top: none; + border-bottom-left-radius: 1px; + border-bottom-right-radius: 1px; + color: #666; + font-size: 13px; +} +.boxed-group.condensed > h3 { + padding: 6px 6px 7px; + font-size: 12px; +} +.boxed-group.condensed > h3 i { + position: relative; + padding: 0 6px 0 2px; +} +.boxed-group.condensed .boxed-group-inner { + font-size: 12px; + padding: 0; +} + +.boxed-group-list > li { + display: block; + margin-left: -10px; + width: 100%; + padding: 5px 10px; + line-height: 23px; + border-bottom: 1px solid #E5E5E5; +} + +.commits-condensed { + margin-top: 0; + border: none; + background-color: white; +} +.commits-condensed td { + padding: 4px; + vertical-align: top; + border-top: 1px solid #E2EAEE; +} +.commits-condensed td.gravatar { + width: 29px; + padding: 5px; +} + +.commits-condensed tr:first-child td { + border-top: 0; +} +.commits-condensed tr:nth-child(2n) td { + background: #F7FBFC; +} +.commits-condensed span.gravatar { + display: block; + width: 16px; + height: 16px; + line-height: 1px; + padding: 1px; + border: 1px solid #DDD; + background: white; +} +.commits-condensed span.gravatar a { + display: inline-block; +} +.commits-condensed td.author { + padding-left: 0; + color: #666; + width: 100px; + font-weight: bold; +} +.commits-condensed td.author span.commit-author { + display: inline-block; + width: 100px; + text-overflow: ellipsis; + overflow: hidden; + line-height: 22px; +} +.commits-condensed td.author a { + color: #333; +} +.commits-condensed td.message { + padding-left: 0; +} +.commits-condensed code { + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + background: inherit; +} +.commits-condensed td.message code { + line-height: 22px; +} +.commits-condensed td.message a { + color: #333; +} +.commits-condensed .commit-desc pre { + margin-top: 5px; + margin-bottom: 4px; + border-left: 1px solid #E5E5E5; + padding-left: 8px; + font-size: 11px; + font-weight: normal; + color: #596063; +} +.commits-condensed td.commit-meta { + width: 1%; + text-align: right; + white-space: nowrap; + padding-right: 10px; +} +.commits-condensed td.commit-meta code { + line-height: 22px; +} + +/* following style for new-pull 'xxx add commits' commits-condense style */ + +table.commits { + width: 100%; + margin: 0; + font-size:12px; +} +table.commits .commit { + width: 59px; + padding-right:10px; +} +table.commits code { + border: none; +} +table.commits td.message { +/* width: 70%;*/ +} +table.commits td.date { + text-align: right; +} + +table.commits-condensed code { + white-space: normal; +} +table.commits-condensed pre { + white-space: pre-wrap; +} + diff --git a/hub/static/css/mod/commits.scss b/hub/static/css/mod/commits.scss new file mode 100644 index 0000000..c5a76b8 --- /dev/null +++ b/hub/static/css/mod/commits.scss @@ -0,0 +1,524 @@ +/* For other page that still depends on commits.scss */ +@import "css/mod/comment-form"; +@import "css/mod/diffs-pane"; + +div.container div.raw { + overflow: visible; +} + +#commits-graph { + position: absolute; + left: -200px; + width: 200px; +} + +.commits-body { + position: relative; +} + +h3.commit-group-heading { + margin:15px 0 0 0; + padding:5px 8px; + font-size:13px; + color:#3a505b; + text-shadow:0 1px white; + background:#e6f1f6; + border:1px solid #c5d5dd; + border-top-right-radius:4px; + border-top-left-radius:4px; +} + +h3.history { + margin-top:15px; +} + +.commit-group { + list-style-type:none; + margin:15px 0; + background:#f7fbfc; + border:1px solid #c5d5dd; + border-top-right-radius:4px; + border-top-left-radius:4px; + border-bottom-right-radius:4px; + border-bottom-left-radius:4px; +} + +.commit-group-item { + position:relative; + padding:8px 8px 8px 52px; + border-top:1px solid #e2eaee; +} + +.commit-group-item:first-child { + border-top:none; +} + +.commit-group-item:last-child { + border-bottom-right-radius:4px; + border-bottom-left-radius:4px; +} + +.commit-group-item:nth-child(2n) { + background:#fff; +} + +.commit-group-item.navigation-focus { + background:#fcfce2; +} + +.commit-group-item .gravatar { + float:left; + margin-left:-44px; + border-radius:4px; +} + +.commit-group-item .commit-title { + margin:1px 0 1px 0; + font-size:14px; + font-weight:bold; + color:#333; +} + +.commit-group-item .commit-title a { + color:#333; +} + +.commit-group-item .commit-desc pre { + margin-top:5px; + margin-bottom:10px; + font-size:12px; + color:#596063; + border-left:1px solid #e5e5e5; + padding-left:8px; +} + +.commit-group-item .authorship { + font-size:12px; + color:#888; +} + +.commit-group-item .authorship a { + color:#444; +} + +.commit-group-item .authorship .author-name { + color:#444; +} + +.commit-group-item .authorship .committer { + display:block; + font-size:11px; +} + +.commit-group-item .authorship .committer .mini-icon { + position:relative; + top:2px; +} + +.commit-group-item .commit-links { + position:absolute; + top:7px; + right:8px; + width:243px; + text-align:right; +} + +.commit-group-item .mini-icon-clippy { + visibility:hidden; + float:left; + margin-right:7px; + margin-top:5px; +} + +.commit-group-item:hover .mini-icon-clippy { + visibility:visible; +} + +.commit-group-item .gobutton { + float:right; + height:18px; + padding:0 7px; + line-height:22px; + font-size:11px; + color:#4e575b; + text-shadow:0 1px rgba(255,255,255,0.5); + background:#eff6f9; + background:-moz-linear-gradient(#eff6f9,#ddecf3); + background:-webkit-linear-gradient(#eff6f9,#ddecf3); + -ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#eff6f9',endColorstr='#ddecf3')"; + border:1px solid #cedee5; + border-radius:3px; + min-width:70px; + text-align: center; +} + +.commit-group-item .gobutton .comment-popover { + color: #91A6B1; + border-right:1px solid #ddd; + padding-right: 4px; +} + +.commit-group-item.navigation-focus .gobutton { + color:#5a5b4e; +} + +.commit-group-item:nth-child(2n+1) .gobutton { + border-color:#d5dcdf; + background:#f2f5f6; + background:-moz-linear-gradient(#f2f5f6,#e3eaed); + background:-webkit-linear-gradient(#f2f5f6,#e3eaed); + -ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#f2f5f6',endColorstr='#e3eaed')"; +} + +.commit-group-item.navigation-focus .gobutton { + border-color:#e7e86d; + background:#f9fac9; + background:-moz-linear-gradient(#f9fac9,#f3f494); + background:-webkit-linear-gradient(#f9fac9,#f3f494); + -ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#f9fac9',endColorstr='#f3f494')"; +} + +.commit-group-item .gobutton:hover { + text-decoration:none; + border-color:#cedee5; + background:#fbfdfe; + background:-moz-linear-gradient(#fbfdfe,#eaf4f8); + background:-webkit-linear-gradient(#fbfdfe,#eaf4f8); + -ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbfdfe',endColorstr='#eaf4f8')"; +} + +.commit-group-item .gobutton>.sha,.commit-group-item.navigation-focus .gobutton:hover>.sha { + display:inline-block; + height:22px; + margin-right:-3px; +} + +.commit-group-item .gobutton>.sha .mini-icon,.commit-group-item.navigation-focus .gobutton:hover>.sha .mini-icon { + position:relative; + top:2px; + border-radius:30px; + border:1px solid #CFDEE5; + background-color:rgba(255,255,255,0.5); + color:#91a6b1; + margin-left:5px; + width:16px; +} + +.commit-group-item.navigation-focus .gobutton>.sha .mini-icon { + border:1px solid #E7E86D; + color:#c3c45c; +} + +.commit-group-item .gobutton.with-comments { + padding-left:5px; +} + +.commit-group-item .gobutton.with-comments .sha,.commit-group-item.navigation-focus .gobutton.with-comments:hover .sha { + padding-left:8px; + border-left:1px solid #cfdee5; +} + +.commit-group-item.navigation-focus .gobutton.with-comments .sha { + border-left-color:#e1e29e; +} + +.commit-group-item .gobutton .comment-count,.commit-group-item.navigation-focus .gobutton:hover .comment-count { + float:left; + height:22px; + padding-right:9px; + line-height:24px; + font-weight:bold; + border-right:1px solid #f6fafc; +} + +.commit-group-item .gobutton .comment-count .mini-icon,.commit-group-item.navigation-focus .gobutton:hover .comment-count .mini-icon { + position:relative; + top:2px; + color:#91A6B1; +} + +.commit-group-item.navigation-focus .gobutton .comment-count .mini-icon { + color:#C3C45C; +} + +.commit-group-item .browse-button, .commit-group-item .compare-button { + clear:left; + margin-top:1px; + font-size:11px; + font-weight:bold; + text-align:right; + color:#999; +} + +.commit-group-item .browse-button .mini-icon { + position:relative; + top:2px; +} + +.commit-group-item .browse-button:hover { + color:#4183C4; + background-position:100% -95px; +} + + +@import "css/mod/diff-base"; + +#files.commentable tr td pre:hover { background-color:#FFC; } + +.full-commit { + margin: 10px 0; + padding: 8px 8px 0; + background: #E6F1F6; + border: 1px solid #C5D5DD; + border-radius: 4px; +} + +.full-commit .commit-meta { + margin-left: -8px; + width: 100%; + padding: 8px; + background: white; + border-top: 1px solid #D8E6EC; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} + +.full-commit .commit-desc { + display: block; + margin: -4px 0 10px 0; +} + +.full-commit .commit-desc pre { + max-width: 100%; + font-size: 14px; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); +} + +.full-commit .browse-button { + float: right; + margin: -3px -3px 0 0; + height: 26px; + padding: 0 10px; + line-height: 26px; + font-size: 13px; + font-weight: bold; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); + background: #EFF6F9; + background: -moz-linear-gradient(#EFF6F9,#DDECF3); + background: -webkit-linear-gradient(#EFF6F9,#DDECF3); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#eff6f9',endColorstr='#ddecf3')"; + border: 1px solid #CEDEE5; + border-radius: 3px; +} + +.full-commit p.commit-title { + margin: 0 0 8px 0; + font-size: 18px; + font-weight: bold; + color: #213F4D; + text-shadow: 0 1px rgba(255, 255, 255, 0.5); +} + +.clearfix { + display: block; +} + +.full-commit .sha-block { + float: right; + margin-left: 15px; + color: #888; + font-size: 12px; +} + +.full-commit .authorship { + margin-top: -2px; + margin-left: -4px; + margin-bottom: -4px; + font-size: 14px; + color: #999; +} + +.full-commit .authorship .gravatar { + margin-top: -2px; + margin-right: 3px; + vertical-align: middle; + border-radius: 3px; +} +#files { + position: relative; +} + +#files .file, .file-box { + border: 1px solid #CCC; + margin-bottom: 13px; + position: relative; + background-color: #DDD; +} + +#files .file .meta, .file-box .meta { + overflow: hidden; + padding: 5px 10px; + font-size: 12px; + height: 33px; + text-align: left; + color: #555; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #D8D8D8; + background: #FAFAFA; + background: -moz-linear-gradient(#FAFAFA,#EAEAEA); + background: -webkit-linear-gradient(#FAFAFA,#EAEAEA); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; +} + +#files .file .meta .info, .file-box .meta .info { + float: left; + height: 33px; + line-height: 33px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; +} + +#files .file .meta .actions, .file-box .meta .actions { + float: right; + height: 33px; + line-height: 33px; + margin-top: 1px; +} + +#files .file .meta .actions li:first-child, .file-box .meta .actions li:first-child { + background: transparent; + margin-left: 0; + padding-left: 0; +} + +#files .file .meta .actions li, .file-box .meta .actions li { + list-style-type: none; + float: left; + margin: 0 0 0 7px; +} + +.button-group li { + margin: 0!important; +} + +.pagination-older-newer a { + padding: .1em .3em; + margin: .2em; + text-decoration: none; + color: #369; + float:none; +} + +.pagination-older-newer a:hover, .pagination a:active { + background-color: transparent; + color: #36f; +} + +.pagination-older-newer span.disabled { + padding: .1em .3em; + margin: .2em; + color: #bbb; + float:none; +} + +.commit .sha-block, .commit .sha { + padding-right: 3px; + font-size: 11px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; +} + +#files .file .data .line_numbers, .file-box .data .line_numbers { + background-color: #ECECEC; + color: #AAA; + padding: 0 6px; + border-right: 1px solid #DDD; + text-align: right; + cursor: pointer; +} +#files .file .data .line_numbers a { + color: #AAA; +} + +.mini-icon-added:before{content:"\f06b";} +.mini-icon-removed:before{content:"\f06c";} +.mini-icon-modified:before{content:"\f06d";} +.mini-icon-moved:before,.mini-icon-renamed:before{content:"\f06e";} +.mini-icon-commit-comment:before{content:"\f02b";} + +.mega-icon-beer:before{content:"\f269";} +.mega-icon-commit-comment:before{content:"\f22b";} + +#files .file .meta .info span.icon, +#files .file .meta .info span.diffstat, +.file-box .meta .info span.icon { + line-height: 0; + float: left; + margin: 5px 5px 0 0; + padding: 3px; + background: #F7F7F7; + border: 1px solid #CCC; + border-right-color: #E5E5E5; + border-bottom-color: #E5E5E5; + border-radius: 3px; +} +#files .file .meta .info span.diffstat { + height: 16px; + padding: 3px 6px; +} +#files .file .meta .info span:first-child, +#files .file .meta .info .icon + span, +.file-box .meta .info span:first-child, +.file-box .meta .info .icon + span { + border-left: 0 none; + box-shadow: inset 0 0 0 transparent; + margin-left: 0; + padding-left: 0; +} + +.commit-meta.comment-row .mini-icon { color:#939AA0; margin: 0 2px 0 1px; top: 2px; text-decoration: none; } +#files .file .data.empty, .file-box .data.empty { +padding: 10px 15px; +color: #777; +} +.timeout { +width: 873px; +height: 528px; +border: 1px solid #C5D5DD; +background: url("/static/img/timeout.jpg") #E6F1F6 no-repeat; +background-position: 90% 50%; +padding: 0 32px 0 33px; +border-radius: 3px; +} +.timeout h3 { +color: white; +font-size: 18px; +font-weight: bold; +text-shadow: darkGray 1px 1px 0; +padding: 15px 0 15px 0; +} +.timeout h3 strong { +font-size: 30px; +display: block; +} +.timeout p { +color: white; +} + +.side-avatar { +position: absolute; +float: left; +margin-left: -60px; +} + +div.generated, div.binary { +text-align: center; +background-color: #ddd; +padding: 30px; +} + +.commit-history-header { + margin-bottom: 55px; + + #search-commits { + margin: 15px 5px; + } +} diff --git a/hub/static/css/mod/common.scss b/hub/static/css/mod/common.scss new file mode 100644 index 0000000..c8c59cd --- /dev/null +++ b/hub/static/css/mod/common.scss @@ -0,0 +1,30 @@ +/* Styles that are used in ALL pages. */ +@import "css/lib/bootstrap-responsive"; +@import "css/mod/reset"; +@import "css/mod/subnav"; +@import "css/mod/nav"; +@import "css/mod/side-item"; +@import "css/mod/user-avatar"; +@import "css/mod/emoji"; +@import "css/mod/emoji-hint"; +@import "css/mod/footer"; + +/* TODO: to be removed */ +@import "css/mod/mini-icons"; + +.hidden { + display: none; +} + +h1.pagehead { + font-size: 20px; + font-weight: normal; + color: #495961; +} + +.pagehead { margin-bottom:7px;} + +.raw { + overflow: hidden; + margin-left: -20px; +} diff --git a/hub/static/css/mod/compare.scss b/hub/static/css/mod/compare.scss new file mode 100644 index 0000000..b3909a3 --- /dev/null +++ b/hub/static/css/mod/compare.scss @@ -0,0 +1,186 @@ +@charset "UTF-8"; +.compare-range { + margin-top: -15px; + float: right; +} + +.compare-range .switch { + display: inline-block; + width: 16px; + height: 16px; + text-indent: -9999px; + background: url("/static/img/switch_icon.png") 0 0 no-repeat; +} + +.commit-ref { + padding: 2px 5px; + line-height: 19px; + font-family: Monaco,"Courier New","DejaVu Sans Mono","Bitstream Vera Sans Mono",monospace; + font-size: 12px; + font-weight: normal; + color: white; + text-shadow: -1px -1px 0 black; + text-decoration: none; + background: #787878; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#787878',endColorstr='#282828')"; + border-radius: 3px; +} + +#compare p.subtext { + margin: -15px 0 10px 0; + color: #666; +} + +.rule, hr { + clear: both; + margin: 15px 0; + height: 0; + overflow: hidden; + border: none; + background: transparent; + border-bottom: 1px solid #DDD; +} +.commits-condensed { + margin-top: 15px; + border: 1px solid #DDD; + border-width: 1px 1px 0 1px; +} + +table { + border-collapse: collapse; + border-spacing: 0; + font-size: 100%; + font: inherit; +} + +.avatar-bubble::before { + content: ""; + display: block; + height: 0; + width: 0; + border: 10px solid #EEE; + border-width: 10px 10px 10px 0; + border-color: transparent #EEE transparent transparent; + position: absolute; + left: 51px; + top: 15px; +} + +.bubble { + padding: 3px; + background: #EEE; + border-radius: 3px; +} + +.new-comments .bubble .comment { + margin: 0; +} +.new-comments .comment { + margin: 10px 0; + border: 1px solid #CACACA; +} + +.new-comments .comment .cmeta { + height: 33px; + padding: 0 10px 0 6px; + border-bottom: 1px solid #CCC; + background: #F8F8F8; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f8f8f8',endColorstr='#e1e1e1')"; +} + +.new-comments .comment > .body { + position: relative; + padding: 0; + color: #333; + font-size: 12px; + background: #FBFBFB; +} + +.avatar-bubble { + margin: 20px 0; + padding-left: 60px; + position: relative; +} + +.avatar-bubble > .avatar { + position: relative; + float: left; + margin-left: -60px; +} + +.comment .content-body { + padding: 10px; + font-size: 13px; +} + +.markdown-body { + font-size: 14px; + line-height: 1.6; +} + +.markdown-body p, .markdown-body blockquote, .markdown-body ul, .markdown-body ol, .markdown-body dl, .markdown-body li, .markdown-body table, .markdown-body pre { + margin: 15px 0; +} + +.new-comments .comment .cmeta p.author { + margin: 0; + float: left; + max-width: 600px; + font-size: 12px; + height: 33px; + line-height: 33px; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.7); + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.new-comments .comment .cmeta p.info { + float: right; + margin: 0; + font-size: 11px; + height: 33px; + line-height: 33px; +} +a.commit-ref:hover { + text-shadow: -1px -1px 0 #04284B; + background: #74A4D4; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#74a4d4',endColorstr='#2a5177')"; + text-decoration: none; +} + +#compare h2 { + font-size: 20px; +} + +.commit-preview { + margin: 10px 0 0 0; + font-size: 11px; +} + +form-actions { + text-align: right; + padding-bottom: 5px; +} + +.commit-preview > p { + margin: 16px 0; + font-size: 14px; + text-align: center; +} + +/* compare-popup related styles copied from hub.css */ +.mini-icon-remove-close::before { content: ""; } +#compare-popup { + position:absolute; + top:159px; + left:407px; + z-index:100; +} +#compare-popup .popup { position:relative; border-radius:5px; box-shadow:0 0 18px rgba(0, 0, 0, 0.4); } +#compare-popup .content { width:425px; color:#333; font-size:12px; padding:10px; border-radius:4px; background:white; -ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='white',endColorstr='#f4f9fb')"; } +#compare-popup .form-actions { margin:10px 0 0; background-color:#fff; text-align:right; } +#compare-popup .close { position:absolute; top:4px; right:5px; padding:2px; } +#compare-popup .close .mini-icon-remove-close { line-height:16px; height:16px; color:#CCC; } +#compare-popup input[type="text"] { width:96%; padding:5px 5px; font-size:12px; } + diff --git a/hub/static/css/mod/contribution.scss b/hub/static/css/mod/contribution.scss new file mode 100644 index 0000000..8a36871 --- /dev/null +++ b/hub/static/css/mod/contribution.scss @@ -0,0 +1,4 @@ +h3.conversation-list-heading { margin: 25px 0 10px 0; height: 0; text-align: center; font-size: 16px; font-weight: normal; color: #999999; border-bottom: 1px solid #ddd; } +h3.conversation-list-heading .inner { display: inline-block; position: relative; top: -10px; padding: 0 5px; background: #fff; } +h3.conversation-list-heading strong { font-weight: bold; color: #333333; } +.simple-conversation-list>li .title .project-info { color: #999999; } diff --git a/hub/static/css/mod/diff-base.scss b/hub/static/css/mod/diff-base.scss new file mode 100644 index 0000000..5fb5abe --- /dev/null +++ b/hub/static/css/mod/diff-base.scss @@ -0,0 +1,81 @@ +@import "css/mod/source-code-pro"; + +.code pre, xmp, plaintext, listing { + display: block; + font-size: 13px; + font-family: 'Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; + white-space: pre; + margin: 0; + padding: 0; +} + +.code pre { + line-height: 18px; +} + +.font-consolas pre { + font-family: Consolas,'Source Code Pro',Courier,Monaco,Menlo,monospace; +} + +.font-monaco pre { + font-family: Monaco,'Source Code Pro',Courier,Consolas,Menlo,monospace; +} + +.font-courier pre { + font-family: Courier,'Source Code Pro',Monaco,Consolas,Menlo,monospace; +} + +.font-dejavu pre { + font-family: 'DejaVu Sans Mono','Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; +} + +.font-ubuntu pre { + font-family: 'Ubuntu Mono','Source Code Pro',Courier,Monaco,Consolas,Menlo,monospace; +} + +// code tag?? +pre, code, tt { + font-size: 12px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + border: 0; +} + +.highlight .normal { + background-color: #FFF; +} + +.highlight .deletion { + color: black; + background-color: #FDD; + & .x, & .c { + color: black; + background-color: #ffaaaa; + } +} + +.highlight .insertion { + color: black; + background-color: #DFD; + & .i, & .c { + color: black; + background-color: #aaffaa; + } +} + +.highlight .skipped { + color: rgb(202, 202, 202); + background-color: rgb(249, 249, 249); + + a { + color: rgb(202, 202, 202); + vertical-align: middle; + + &:hover { + text-decoration: none; + } + + &[data-type="after"], &[data-type="before"] { + font-size: 20px; + } + } +} diff --git a/hub/static/css/mod/diff-stat.scss b/hub/static/css/mod/diff-stat.scss new file mode 100644 index 0000000..3f30944 --- /dev/null +++ b/hub/static/css/mod/diff-stat.scss @@ -0,0 +1,68 @@ +#toc li { + border-bottom: 1px solid #DDD; + list-style-type: none; + padding: 5px; +} + +#toc { + margin: 15px 0; +} + +#toc .diffstat { + float: right; +} +#toc .mini-icon-modified { + color: #677A85; +} + +span.diffstat { + white-space: nowrap; + text-align: right; + font-family: Helvetica,arial,freesans,clean,sans-serif; + color: #666; + font-weight: bold; + font-size: 11px; +} +span.diffstat a { + text-decoration: none; + color: #666; +} +span.diffstat .diffstat-bar { + position: relative; + left: -3px; + display: inline-block; + height: 12px; + text-decoration: none; + text-align: left; + color: #EEE; + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + line-height: 1; + -webkit-font-smoothing: antialiased; + font-size: 16px; + letter-spacing: -7px; +} +span.diffstat .diffstat-bar.diff-added, +span.diffstat .diffstat-bar i.plus { + color: #61C423; + font-style: normal; +} +span.diffstat .diffstat-bar.diff-added, +span.diffstat .diffstat-bar i.minus { + color: #C52323; + font-style: normal; +} + +p.explain { + font-size: 12px; + color: #666; + margin: 1em 0; +} + +p.explain .minibutton { + float: right; + top: -4px; +} diff --git a/hub/static/css/mod/diffs-pane.scss b/hub/static/css/mod/diffs-pane.scss new file mode 100644 index 0000000..d0a8aae --- /dev/null +++ b/hub/static/css/mod/diffs-pane.scss @@ -0,0 +1,7 @@ +@import "css/mod/diff-stat"; + +.diff-cutoff { margin-bottom: -2px; height: 35px; line-height: 37px; font-size: 12px; font-weight: bold; color: #000; text-align: center; background: url("/static/img/compare_too_big.gif") 0 0 no-repeat; } + +.fullscreen-mode { overflow:hidden; } +#fullscreen-stage { display:none; position:fixed; top:0; left:0; width:100%; height:100%; overflow-y:auto; background:#fff; z-index:9999; } +#files #fullscreen-stage .file { margin:0; } diff --git a/hub/static/css/mod/docs-nav.scss b/hub/static/css/mod/docs-nav.scss new file mode 100644 index 0000000..95a94ce --- /dev/null +++ b/hub/static/css/mod/docs-nav.scss @@ -0,0 +1,12 @@ +.docsnav { clear: both; font-size: 120%; margin: 15px 0 25px; color: #34833E; padding: 4px 0 6px 0 } +.docsnav a { color: #34833E; text-indent: 5px; } +.docsnav table { width: 100% } +.docsnav table td { vertical-align: top } +.docsnav .bigger::before { font-size:160%; vertical-align: bottom; line-height: 16px; } +.docsnav .biggest::before { font-size:200%; vertical-align: bottom; line-height: 10px; } +.docsnav .search::before { font-size:130%; vertical-align: bottom; line-height: 13px; } + +.docsnav tr.first td { width: 33%; padding:0 6px 0px 6px; } +.docsnav tr.second td { padding-top:9px } + +.docsnav { border-bottom: 1px solid #CCC; } diff --git a/hub/static/css/mod/docs-page.scss b/hub/static/css/mod/docs-page.scss new file mode 100644 index 0000000..ba2e8e6 --- /dev/null +++ b/hub/static/css/mod/docs-page.scss @@ -0,0 +1,11 @@ +.pages_doc { + border-radius: 5px; border: 2px solid #394249; + float: right; padding: 5px; margin: 5px 0 3px 15px; + font-weight: bold; color: #fbfbf9; font-size: 110%; + height: 35px; width: 280px; + background: #739890 url("/static/img/smokinggal.jpg") no-repeat scroll 25px -175px; +} +.pages_doc a { + font-weight: bold; color: #435159; + text-shadow: -1px +0px 7px #f9f0e2; +} diff --git a/hub/static/css/mod/drop-down-list.scss b/hub/static/css/mod/drop-down-list.scss new file mode 100644 index 0000000..90e0d80 --- /dev/null +++ b/hub/static/css/mod/drop-down-list.scss @@ -0,0 +1,37 @@ +.add-item-menu{ + display: none; + position: absolute; + top: 35px; + width: 218px; + background-color: white; + border: 1px solid #EEE; + z-index: 100; +} +.add-item-menu ul li.intro { + padding: 7px; + color: #666666; +} +.add-item-menu ul li.intro.active { + background: #fff; + padding: 7px; + color: #666666; +} +.add-item-menu ul li.active { + background: #4183C4; + color: white; +} +.add-item-menu ul li { + min-height: 25px; + padding: 3px; + color: #666; + cursor: pointer; + word-wrap: break-word; +} +.add-item-menu .avatar img { + float: left; + border: none; + width: 24px; + height: 24px; + margin-right: 5px; + border-radius: 3px; +} diff --git a/hub/static/css/mod/email.scss b/hub/static/css/mod/email.scss new file mode 100644 index 0000000..8fbffdb --- /dev/null +++ b/hub/static/css/mod/email.scss @@ -0,0 +1,3 @@ +span.email-actions { float:right } +.new-email-form input#email { padding:6px; margin:2px 2px 2px 0px;} +.new-email-form dd { margin-left: 0px;} diff --git a/hub/static/css/mod/emoji-hint.scss b/hub/static/css/mod/emoji-hint.scss new file mode 100644 index 0000000..b82c383 --- /dev/null +++ b/hub/static/css/mod/emoji-hint.scss @@ -0,0 +1,22 @@ + +#show-emoji-hint { + float:right +} + +.emoji-hint { + z-inde: 1000; + position: absolute; + top: 180px; + left: 300px; + width: 630px; + height: 550px; + background-color: #fff; + border: 1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + + #close { + position: absolute; + top: 10px; + right: 10px; + } +} diff --git a/hub/static/css/mod/emoji.scss b/hub/static/css/mod/emoji.scss new file mode 100644 index 0000000..068d22e --- /dev/null +++ b/hub/static/css/mod/emoji.scss @@ -0,0 +1,724 @@ +.emoji { background: url("/static/img/iphone_emoji.png") top left no-repeat; width: 20px; height: 20px; display: -moz-inline-stack; display: inline-block; vertical-align: top; zoom: 1; *display: inline; } +.emoji2600 { background-position: 0px -260px; } +.emoji2601 { background-position: 0px -20px; } +.emoji2614 { background-position: 0px -40px; } +.emoji26c4 { background-position: 0px -60px; } +.emoji26a1 { background-position: 0px -80px; } +.emoji1f300 { background-position: 0px -100px; } +.emoji1f301 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f302 { background-position: 0px -120px; } +.emoji1f303 { background-position: 0px -920px; } +.emoji1f304 { background-position: 0px -160px; } +.emoji1f305 { background-position: 0px -180px; } +.emoji1f306 { background-position: 0px -200px; } +.emoji1f307 { background-position: 0px -220px; } +.emoji1f308 { background-position: 0px -240px; } +.emoji2744 { background-position: 0px -9200px; } /* placeholder */ +.emoji26c5 { background-position: 0px -260px; } +.emoji1f309 { background-position: 0px -920px; } +.emoji1f30a { background-position: 0px -900px; } +.emoji1f30b { background-position: 0px -9200px; } /* placeholder */ +.emoji1f30c { background-position: 0px -920px; } +.emoji1f30f { background-position: 0px -9200px; } /* placeholder */ +.emoji1f311 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f314 { background-position: 0px -360px; } +.emoji1f313 { background-position: 0px -360px; } +.emoji1f319 { background-position: 0px -360px; } +.emoji1f315 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f31b { background-position: 0px -360px; } +.emoji1f31f { background-position: 0px -10740px; } +.emoji1f320 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f550 { background-position: 0px -380px; } +.emoji1f551 { background-position: 0px -400px; } +.emoji1f552 { background-position: 0px -420px; } +.emoji1f553 { background-position: 0px -440px; } +.emoji1f554 { background-position: 0px -460px; } +.emoji1f555 { background-position: 0px -480px; } +.emoji1f556 { background-position: 0px -500px; } +.emoji1f557 { background-position: 0px -520px; } +.emoji1f558 { background-position: 0px -540px; } +.emoji1f559 { background-position: 0px -620px; } +.emoji1f55a { background-position: 0px -580px; } +.emoji1f55b { background-position: 0px -600px; } +.emoji231a { background-position: 0px -9200px; } /* placeholder */ +.emoji231b { background-position: 0px -9200px; } /* placeholder */ +.emoji23f0 { background-position: 0px -620px; } +.emoji23f3 { background-position: 0px -9200px; } /* placeholder */ +.emoji2648 { background-position: 0px -640px; } +.emoji2649 { background-position: 0px -660px; } +.emoji264a { background-position: 0px -680px; } +.emoji264b { background-position: 0px -700px; } +.emoji264c { background-position: 0px -720px; } +.emoji264d { background-position: 0px -740px; } +.emoji264e { background-position: 0px -760px; } +.emoji264f { background-position: 0px -780px; } +.emoji2650 { background-position: 0px -800px; } +.emoji2651 { background-position: 0px -820px; } +.emoji2652 { background-position: 0px -840px; } +.emoji2653 { background-position: 0px -860px; } +.emoji26ce { background-position: 0px -880px; } +.emoji1f340 { background-position: 0px -1220px; } +.emoji1f337 { background-position: 0px -960px; } +.emoji1f331 { background-position: 0px -1220px; } +.emoji1f341 { background-position: 0px -1000px; } +.emoji1f338 { background-position: 0px -1020px; } +.emoji1f339 { background-position: 0px -1040px; } +.emoji1f342 { background-position: 0px -1060px; } +.emoji1f343 { background-position: 0px -1080px; } +.emoji1f33a { background-position: 0px -1100px; } +.emoji1f33b { background-position: 0px -1200px; } +.emoji1f334 { background-position: 0px -1140px; } +.emoji1f335 { background-position: 0px -1160px; } +.emoji1f33e { background-position: 0px -1180px; } +.emoji1f33d { background-position: 0px -9200px; } /* placeholder */ +.emoji1f344 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f330 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f33c { background-position: 0px -1200px; } +.emoji1f33f { background-position: 0px -1220px; } +.emoji1f352 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f34c { background-position: 0px -9200px; } /* placeholder */ +.emoji1f34e { background-position: 0px -1360px; } +.emoji1f34a { background-position: 0px -1260px; } +.emoji1f353 { background-position: 0px -1280px; } +.emoji1f349 { background-position: 0px -1300px; } +.emoji1f345 { background-position: 0px -1320px; } +.emoji1f346 { background-position: 0px -1340px; } +.emoji1f348 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f34d { background-position: 0px -9200px; } /* placeholder */ +.emoji1f347 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f351 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f34f { background-position: 0px -1360px; } +.emoji1f440 { background-position: 0px -1380px; } +.emoji1f442 { background-position: 0px -1400px; } +.emoji1f443 { background-position: 0px -1420px; } +.emoji1f444 { background-position: 0px -1440px; } +.emoji1f445 { background-position: 0px -3000px; } +.emoji1f484 { background-position: 0px -1480px; } +.emoji1f485 { background-position: 0px -1500px; } +.emoji1f486 { background-position: 0px -1520px; } +.emoji1f487 { background-position: 0px -1540px; } +.emoji1f488 { background-position: 0px -1560px; } +.emoji1f464 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f466 { background-position: 0px -1580px; } +.emoji1f467 { background-position: 0px -1600px; } +.emoji1f468 { background-position: 0px -1620px; } +.emoji1f469 { background-position: 0px -1640px; } +.emoji1f46a { background-position: 0px -9200px; } /* placeholder */ +.emoji1f46b { background-position: 0px -1660px; } +.emoji1f46e { background-position: 0px -1680px; } +.emoji1f46f { background-position: 0px -1700px; } +.emoji1f470 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f471 { background-position: 0px -1720px; } +.emoji1f472 { background-position: 0px -1740px; } +.emoji1f473 { background-position: 0px -1760px; } +.emoji1f474 { background-position: 0px -1780px; } +.emoji1f475 { background-position: 0px -1800px; } +.emoji1f476 { background-position: 0px -1820px; } +.emoji1f477 { background-position: 0px -1840px; } +.emoji1f478 { background-position: 0px -1860px; } +.emoji1f479 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f47a { background-position: 0px -9200px; } /* placeholder */ +.emoji1f47b { background-position: 0px -1880px; } +.emoji1f47c { background-position: 0px -1900px; } +.emoji1f47d { background-position: 0px -1920px; } +.emoji1f47e { background-position: 0px -1940px; } +.emoji1f47f { background-position: 0px -1960px; } +.emoji1f480 { background-position: 0px -1980px; } +.emoji1f481 { background-position: 0px -2000px; } +.emoji1f482 { background-position: 0px -2020px; } +.emoji1f483 { background-position: 0px -2040px; } +.emoji1f40c { background-position: 0px -9200px; } /* placeholder */ +.emoji1f40d { background-position: 0px -2620px; } +.emoji1f40e { background-position: 0px -6680px; } +.emoji1f414 { background-position: 0px -2640px; } +.emoji1f417 { background-position: 0px -2660px; } +.emoji1f42b { background-position: 0px -2680px; } +.emoji1f418 { background-position: 0px -2480px; } +.emoji1f428 { background-position: 0px -2500px; } +.emoji1f412 { background-position: 0px -2520px; } +.emoji1f411 { background-position: 0px -2540px; } +.emoji1f419 { background-position: 0px -2340px; } +.emoji1f41a { background-position: 0px -2360px; } +.emoji1f41b { background-position: 0px -2460px; } +.emoji1f41c { background-position: 0px -9200px; } /* placeholder */ +.emoji1f41d { background-position: 0px -9200px; } /* placeholder */ +.emoji1f41e { background-position: 0px -9200px; } /* placeholder */ +.emoji1f420 { background-position: 0px -2420px; } +.emoji1f421 { background-position: 0px -7360px; } +.emoji1f422 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f424 { background-position: 0px -2140px; } +.emoji1f425 { background-position: 0px -2140px; } +.emoji1f426 { background-position: 0px -2400px; } +.emoji1f423 { background-position: 0px -2140px; } +.emoji1f427 { background-position: 0px -2160px; } +.emoji1f429 { background-position: 0px -2720px; } +.emoji1f41f { background-position: 0px -7360px; } +.emoji1f42c { background-position: 0px -2380px; } +.emoji1f42d { background-position: 0px -2280px; } +.emoji1f42f { background-position: 0px -2240px; } +.emoji1f431 { background-position: 0px -2080px; } +.emoji1f433 { background-position: 0px -2300px; } +.emoji1f434 { background-position: 0px -2200px; } +.emoji1f435 { background-position: 0px -2320px; } +.emoji1f436 { background-position: 0px -2720px; } +.emoji1f437 { background-position: 0px -2780px; } +.emoji1f43b { background-position: 0px -2260px; } +.emoji1f439 { background-position: 0px -2440px; } +.emoji1f43a { background-position: 0px -2560px; } +.emoji1f42e { background-position: 0px -2580px; } +.emoji1f430 { background-position: 0px -2600px; } +.emoji1f438 { background-position: 0px -2700px; } +.emoji1f43e { background-position: 0px -6460px; } +.emoji1f432 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f43c { background-position: 0px -9200px; } /* placeholder */ +.emoji1f43d { background-position: 0px -2780px; } +.emoji1f620 { background-position: 0px -2800px; } +.emoji1f629 { background-position: 0px -3860px; } +.emoji1f632 { background-position: 0px -2840px; } +.emoji1f61e { background-position: 0px -2860px; } +.emoji1f635 { background-position: 0px -3540px; } +.emoji1f630 { background-position: 0px -2900px; } +.emoji1f612 { background-position: 0px -2920px; } +.emoji1f60d { background-position: 0px -3660px; } +.emoji1f624 { background-position: 0px -3720px; } +.emoji1f61c { background-position: 0px -2980px; } +.emoji1f61d { background-position: 0px -3000px; } +.emoji1f60b { background-position: 0px -3220px; } +.emoji1f618 { background-position: 0px -3640px; } +.emoji1f61a { background-position: 0px -3060px; } +.emoji1f637 { background-position: 0px -3080px; } +.emoji1f633 { background-position: 0px -3100px; } +.emoji1f603 { background-position: 0px -3580px; } +.emoji1f605 { background-position: 0px -3260px; } +.emoji1f606 { background-position: 0px -3380px; } +.emoji1f601 { background-position: 0px -3720px; } +.emoji1f602 { background-position: 0px -3620px; } +.emoji1f60a { background-position: 0px -3220px; } +.emoji263a { background-position: 0px -3240px; } +.emoji1f604 { background-position: 0px -3260px; } +.emoji1f622 { background-position: 0px -3680px; } +.emoji1f62d { background-position: 0px -3300px; } +.emoji1f628 { background-position: 0px -3320px; } +.emoji1f623 { background-position: 0px -3540px; } +.emoji1f621 { background-position: 0px -3880px; } +.emoji1f60c { background-position: 0px -3380px; } +.emoji1f616 { background-position: 0px -10520px; } +.emoji1f614 { background-position: 0px -3860px; } +.emoji1f631 { background-position: 0px -3440px; } +.emoji1f62a { background-position: 0px -3460px; } +.emoji1f60f { background-position: 0px -3480px; } +.emoji1f613 { background-position: 0px -3500px; } +.emoji1f625 { background-position: 0px -3520px; } +.emoji1f62b { background-position: 0px -3540px; } +.emoji1f609 { background-position: 0px -3560px; } +.emoji1f63a { background-position: 0px -3580px; } +.emoji1f638 { background-position: 0px -3720px; } +.emoji1f639 { background-position: 0px -3620px; } +.emoji1f63d { background-position: 0px -3640px; } +.emoji1f63b { background-position: 0px -3660px; } +.emoji1f63f { background-position: 0px -3680px; } +.emoji1f63e { background-position: 0px -3880px; } +.emoji1f63c { background-position: 0px -3720px; } +.emoji1f640 { background-position: 0px -3860px; } +.emoji1f645 { background-position: 0px -3760px; } +.emoji1f646 { background-position: 0px -3780px; } +.emoji1f647 { background-position: 0px -3800px; } +.emoji1f648 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f64a { background-position: 0px -9200px; } /* placeholder */ +.emoji1f649 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f64b { background-position: 0px -11240px; } +.emoji1f64c { background-position: 0px -3840px; } +.emoji1f64d { background-position: 0px -3860px; } +.emoji1f64e { background-position: 0px -3880px; } +.emoji1f64f { background-position: 0px -3900px; } +.emoji1f3e0 { background-position: 0px -3940px; } +.emoji1f3e1 { background-position: 0px -3940px; } +.emoji1f3e2 { background-position: 0px -3960px; } +.emoji1f3e3 { background-position: 0px -3980px; } +.emoji1f3e5 { background-position: 0px -4000px; } +.emoji1f3e6 { background-position: 0px -4020px; } +.emoji1f3e7 { background-position: 0px -4040px; } +.emoji1f3e8 { background-position: 0px -4060px; } +.emoji1f3e9 { background-position: 0px -4080px; } +.emoji1f3ea { background-position: 0px -4100px; } +.emoji1f3eb { background-position: 0px -4120px; } +.emoji26ea { background-position: 0px -4140px; } +.emoji26f2 { background-position: 0px -4160px; } +.emoji1f3ec { background-position: 0px -4180px; } +.emoji1f3ef { background-position: 0px -4200px; } +.emoji1f3f0 { background-position: 0px -4220px; } +.emoji1f3ed { background-position: 0px -4240px; } +.emoji2693 { background-position: 0px -6920px; } +.emoji1f3ee { background-position: 0px -8800px; } +.emoji1f5fb { background-position: 0px -4300px; } +.emoji1f5fc { background-position: 0px -4320px; } +.emoji1f5fd { background-position: 0px -4340px; } +.emoji1f5fe { background-position: 0px -9200px; } /* placeholder */ +.emoji1f5ff { background-position: 0px -9200px; } /* placeholder */ +.emoji1f45e { background-position: 0px -4400px; } +.emoji1f45f { background-position: 0px -4400px; } +.emoji1f460 { background-position: 0px -4420px; } +.emoji1f461 { background-position: 0px -4440px; } +.emoji1f462 { background-position: 0px -4460px; } +.emoji1f463 { background-position: 0px -6460px; } +.emoji1f453 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f455 { background-position: 0px -4620px; } +.emoji1f456 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f451 { background-position: 0px -4500px; } +.emoji1f454 { background-position: 0px -4520px; } +.emoji1f452 { background-position: 0px -4540px; } +.emoji1f457 { background-position: 0px -4560px; } +.emoji1f458 { background-position: 0px -4580px; } +.emoji1f459 { background-position: 0px -4600px; } +.emoji1f45a { background-position: 0px -4620px; } +.emoji1f45b { background-position: 0px -9200px; } /* placeholder */ +.emoji1f45c { background-position: 0px -4960px; } +.emoji1f45d { background-position: 0px -9200px; } /* placeholder */ +.emoji1f4b0 { background-position: 0px -4720px; } +.emoji1f4b1 { background-position: 0px -4660px; } +.emoji1f4b9 { background-position: 0px -6380px; } +.emoji1f4b2 { background-position: 0px -4720px; } +.emoji1f4b3 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f4b4 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f4b5 { background-position: 0px -4720px; } +.emoji1f4b8 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f1e81f1f3 { background-position: 0px -4740px; } +.emoji1f1e91f1ea { background-position: 0px -4760px; } +.emoji1f1ea1f1f8 { background-position: 0px -4780px; } +.emoji1f1eb1f1f7 { background-position: 0px -4800px; } +.emoji1f1ec1f1e7 { background-position: 0px -4820px; } +.emoji1f1ee1f1f9 { background-position: 0px -4840px; } +.emoji1f1ef1f1f5 { background-position: 0px -4860px; } +.emoji1f1f01f1f7 { background-position: 0px -4880px; } +.emoji1f1f71f1fa { background-position: 0px -4900px; } +.emoji1f1fa1f1f8 { background-position: 0px -4920px; } +.emoji1f525 { background-position: 0px -5040px; } +.emoji1f526 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f527 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f528 { background-position: 0px -4360px; } +.emoji1f529 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f52a { background-position: 0px -9200px; } /* placeholder */ +.emoji1f52b { background-position: 0px -5020px; } +.emoji1f52e { background-position: 0px -5080px; } +.emoji1f52f { background-position: 0px -5080px; } +.emoji1f530 { background-position: 0px -9660px; } +.emoji1f531 { background-position: 0px -9680px; } +.emoji1f489 { background-position: 0px -5300px; } +.emoji1f48a { background-position: 0px -5320px; } +.emoji1f170 { background-position: 0px -5340px; } +.emoji1f171 { background-position: 0px -5360px; } +.emoji1f18e { background-position: 0px -5380px; } +.emoji1f17e { background-position: 0px -5400px; } +.emoji1f380 { background-position: 0px -5420px; } +.emoji1f381 { background-position: 0px -6080px; } +.emoji1f382 { background-position: 0px -5460px; } +.emoji1f384 { background-position: 0px -5480px; } +.emoji1f385 { background-position: 0px -5500px; } +.emoji1f38c { background-position: 0px -5520px; } +.emoji1f386 { background-position: 0px -5540px; } +.emoji1f388 { background-position: 0px -5560px; } +.emoji1f389 { background-position: 0px -5580px; } +.emoji1f38d { background-position: 0px -5600px; } +.emoji1f38e { background-position: 0px -5620px; } +.emoji1f393 { background-position: 0px -5640px; } +.emoji1f392 { background-position: 0px -5660px; } +.emoji1f38f { background-position: 0px -5680px; } +.emoji1f387 { background-position: 0px -5700px; } +.emoji1f390 { background-position: 0px -5720px; } +.emoji1f383 { background-position: 0px -5740px; } +.emoji1f38a { background-position: 0px -9200px; } /* placeholder */ +.emoji1f38b { background-position: 0px -9200px; } /* placeholder */ +.emoji1f391 { background-position: 0px -5760px; } +.emoji1f4df { background-position: 0px -9200px; } /* placeholder */ +.emoji260e { background-position: 0px -5800px; } +.emoji1f4de { background-position: 0px -5800px; } +.emoji1f4f1 { background-position: 0px -5820px; } +.emoji1f4f2 { background-position: 0px -5840px; } +.emoji1f4dd { background-position: 0px -6440px; } +.emoji1f4e0 { background-position: 0px -5880px; } +.emoji2709 { background-position: 0px -11200px; } +.emoji1f4e8 { background-position: 0px -11200px; } +.emoji1f4e9 { background-position: 0px -11200px; } +.emoji1f4ea { background-position: 0px -5980px; } +.emoji1f4eb { background-position: 0px -5980px; } +.emoji1f4ee { background-position: 0px -6000px; } +.emoji1f4f0 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f4e2 { background-position: 0px -6020px; } +.emoji1f4e3 { background-position: 0px -6040px; } +.emoji1f4e1 { background-position: 0px -6060px; } +.emoji1f4e4 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f4e5 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f4e6 { background-position: 0px -6080px; } +.emoji1f4e7 { background-position: 0px -11200px; } +.emoji1f520 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f521 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f522 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f523 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f524 { background-position: 0px -9200px; } /* placeholder */ +.emoji2712 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f4ba { background-position: 0px -6100px; } +.emoji1f4bb { background-position: 0px -6120px; } +.emoji270f { background-position: 0px -6440px; } +.emoji1f4ce { background-position: 0px -9200px; } /* placeholder */ +.emoji1f4bc { background-position: 0px -6160px; } +.emoji1f4bd { background-position: 0px -6200px; } +.emoji1f4be { background-position: 0px -6200px; } +.emoji1f4bf { background-position: 0px -7800px; } +.emoji1f4c0 { background-position: 0px -7820px; } +.emoji2702 { background-position: 0px -6220px; } +.emoji1f4cd { background-position: 0px -9200px; } /* placeholder */ +.emoji1f4c3 { background-position: 0px -6440px; } +.emoji1f4c4 { background-position: 0px -6440px; } +.emoji1f4c5 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f4c1 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f4c2 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f4d3 { background-position: 0px -6420px; } +.emoji1f4d6 { background-position: 0px -6420px; } +.emoji1f4d4 { background-position: 0px -6420px; } +.emoji1f4d5 { background-position: 0px -6420px; } +.emoji1f4d7 { background-position: 0px -6420px; } +.emoji1f4d8 { background-position: 0px -6420px; } +.emoji1f4d9 { background-position: 0px -6420px; } +.emoji1f4da { background-position: 0px -6420px; } +.emoji1f4db { background-position: 0px -9200px; } /* placeholder */ +.emoji1f4dc { background-position: 0px -9200px; } /* placeholder */ +.emoji1f4cb { background-position: 0px -6440px; } +.emoji1f4c6 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f4ca { background-position: 0px -6380px; } +.emoji1f4c8 { background-position: 0px -6380px; } +.emoji1f4c9 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f4c7 { background-position: 0px -6420px; } +.emoji1f4cc { background-position: 0px -9200px; } /* placeholder */ +.emoji1f4d2 { background-position: 0px -6420px; } +.emoji1f4cf { background-position: 0px -9200px; } /* placeholder */ +.emoji1f4d0 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f4d1 { background-position: 0px -6440px; } +.emoji1f3bd { background-position: 0px -9200px; } /* placeholder */ +.emoji26be { background-position: 0px -6480px; } +.emoji26f3 { background-position: 0px -6500px; } +.emoji1f3be { background-position: 0px -6520px; } +.emoji26bd { background-position: 0px -6540px; } +.emoji1f3bf { background-position: 0px -6560px; } +.emoji1f3c0 { background-position: 0px -6580px; } +.emoji1f3c1 { background-position: 0px -6600px; } +.emoji1f3c2 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f3c3 { background-position: 0px -6620px; } +.emoji1f3c4 { background-position: 0px -6640px; } +.emoji1f3c6 { background-position: 0px -6660px; } +.emoji1f3c8 { background-position: 0px -6700px; } +.emoji1f3ca { background-position: 0px -6720px; } +.emoji1f683 { background-position: 0px -6740px; } +.emoji1f687 { background-position: 0px -6780px; } +.emoji24c2 { background-position: 0px -6780px; } +.emoji1f684 { background-position: 0px -6800px; } +.emoji1f685 { background-position: 0px -6820px; } +.emoji1f697 { background-position: 0px -6840px; } +.emoji1f699 { background-position: 0px -6860px; } +.emoji1f68c { background-position: 0px -6880px; } +.emoji1f68f { background-position: 0px -6900px; } +.emoji1f6a2 { background-position: 0px -6920px; } +.emoji2708 { background-position: 0px -6940px; } +.emoji26f5 { background-position: 0px -6960px; } +.emoji1f689 { background-position: 0px -7000px; } +.emoji1f680 { background-position: 0px -7020px; } +.emoji1f6a4 { background-position: 0px -7040px; } +.emoji1f695 { background-position: 0px -7060px; } +.emoji1f69a { background-position: 0px -7100px; } +.emoji1f692 { background-position: 0px -7120px; } +.emoji1f691 { background-position: 0px -7140px; } +.emoji1f693 { background-position: 0px -7260px; } +.emoji26fd { background-position: 0px -7180px; } +.emoji1f17f { background-position: 0px -7200px; } +.emoji1f6a5 { background-position: 0px -7220px; } +.emoji1f6a7 { background-position: 0px -9720px; } +.emoji1f6a8 { background-position: 0px -7260px; } +.emoji2668 { background-position: 0px -7280px; } +.emoji26fa { background-position: 0px -7300px; } +.emoji1f3a0 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f3a1 { background-position: 0px -7320px; } +.emoji1f3a2 { background-position: 0px -7340px; } +.emoji1f3a3 { background-position: 0px -7360px; } +.emoji1f3a4 { background-position: 0px -7380px; } +.emoji1f3a5 { background-position: 0px -7400px; } +.emoji1f3a6 { background-position: 0px -7420px; } +.emoji1f3a7 { background-position: 0px -7440px; } +.emoji1f3a8 { background-position: 0px -7460px; } +.emoji1f3a9 { background-position: 0px -7540px; } +.emoji1f3aa { background-position: 0px -9200px; } /* placeholder */ +.emoji1f3ab { background-position: 0px -7500px; } +.emoji1f3ac { background-position: 0px -7520px; } +.emoji1f3ad { background-position: 0px -7540px; } +.emoji1f3ae { background-position: 0px -9200px; } /* placeholder */ +.emoji1f004 { background-position: 0px -7560px; } +.emoji1f3af { background-position: 0px -7580px; } +.emoji1f3b0 { background-position: 0px -7600px; } +.emoji1f3b1 { background-position: 0px -7620px; } +.emoji1f3b2 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f3b3 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f3b4 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f0cf { background-position: 0px -9200px; } /* placeholder */ +.emoji1f3b5 { background-position: 0px -7640px; } +.emoji1f3b6 { background-position: 0px -7740px; } +.emoji1f3b7 { background-position: 0px -7680px; } +.emoji1f3b8 { background-position: 0px -7700px; } +.emoji1f3b9 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f3ba { background-position: 0px -7720px; } +.emoji1f3bb { background-position: 0px -9200px; } /* placeholder */ +.emoji1f3bc { background-position: 0px -7740px; } +.emoji303d { background-position: 0px -7760px; } +.emoji1f4f7 { background-position: 0px -4940px; } +.emoji1f4f9 { background-position: 0px -7400px; } +.emoji1f4fa { background-position: 0px -7780px; } +.emoji1f4fb { background-position: 0px -7840px; } +.emoji1f4fc { background-position: 0px -7860px; } +.emoji1f48b { background-position: 0px -7900px; } +.emoji1f48c { background-position: 0px -11200px; } +.emoji1f48d { background-position: 0px -7940px; } +.emoji1f48e { background-position: 0px -7960px; } +.emoji1f48f { background-position: 0px -7980px; } +.emoji1f490 { background-position: 0px -8000px; } +.emoji1f491 { background-position: 0px -8020px; } +.emoji1f492 { background-position: 0px -8040px; } +.emoji1f51e { background-position: 0px -9860px; } +.emojia9 { background-position: 0px -9900px; } +.emojiae { background-position: 0px -9920px; } +.emoji2122 { background-position: 0px -9940px; } +.emoji2139 { background-position: 0px -9200px; } /* placeholder */ +.emoji2320e3 { background-position: 0px -8060px; } +.emoji3120e3 { background-position: 0px -8080px; } +.emoji3220e3 { background-position: 0px -8100px; } +.emoji3320e3 { background-position: 0px -8120px; } +.emoji3420e3 { background-position: 0px -8140px; } +.emoji3520e3 { background-position: 0px -8160px; } +.emoji3620e3 { background-position: 0px -8180px; } +.emoji3720e3 { background-position: 0px -8200px; } +.emoji3820e3 { background-position: 0px -8220px; } +.emoji3920e3 { background-position: 0px -8240px; } +.emoji3020e3 { background-position: 0px -8260px; } +.emoji1f51f { background-position: 0px -9200px; } /* placeholder */ +.emoji1f4f6 { background-position: 0px -8280px; } +.emoji1f4f3 { background-position: 0px -8300px; } +.emoji1f4f4 { background-position: 0px -8320px; } +.emoji1f354 { background-position: 0px -8340px; } +.emoji1f359 { background-position: 0px -8360px; } +.emoji1f370 { background-position: 0px -8380px; } +.emoji1f35c { background-position: 0px -8400px; } +.emoji1f35e { background-position: 0px -8420px; } +.emoji1f373 { background-position: 0px -8440px; } +.emoji1f366 { background-position: 0px -8460px; } +.emoji1f35f { background-position: 0px -8480px; } +.emoji1f361 { background-position: 0px -8500px; } +.emoji1f358 { background-position: 0px -8520px; } +.emoji1f35a { background-position: 0px -8540px; } +.emoji1f35d { background-position: 0px -8560px; } +.emoji1f35b { background-position: 0px -8580px; } +.emoji1f362 { background-position: 0px -8600px; } +.emoji1f363 { background-position: 0px -8620px; } +.emoji1f371 { background-position: 0px -8640px; } +.emoji1f372 { background-position: 0px -8660px; } +.emoji1f367 { background-position: 0px -8680px; } +.emoji1f356 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f365 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f360 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f355 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f357 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f368 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f369 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f36a { background-position: 0px -9200px; } /* placeholder */ +.emoji1f36b { background-position: 0px -9200px; } /* placeholder */ +.emoji1f36c { background-position: 0px -9200px; } /* placeholder */ +.emoji1f36d { background-position: 0px -9200px; } /* placeholder */ +.emoji1f36e { background-position: 0px -9200px; } /* placeholder */ +.emoji1f36f { background-position: 0px -9200px; } /* placeholder */ +.emoji1f364 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f374 { background-position: 0px -8700px; } +.emoji2615 { background-position: 0px -8720px; } +.emoji1f378 { background-position: 0px -8860px; } +.emoji1f37a { background-position: 0px -8760px; } +.emoji1f375 { background-position: 0px -8780px; } +.emoji1f376 { background-position: 0px -8800px; } +.emoji1f377 { background-position: 0px -8860px; } +.emoji1f37b { background-position: 0px -8840px; } +.emoji1f379 { background-position: 0px -8860px; } +.emoji2197 { background-position: 0px -8960px; } +.emoji2198 { background-position: 0px -8980px; } +.emoji2196 { background-position: 0px -8920px; } +.emoji2199 { background-position: 0px -8940px; } +.emoji2934 { background-position: 0px -8960px; } +.emoji2935 { background-position: 0px -8980px; } +.emoji2194 { background-position: 0px -9200px; } /* placeholder */ +.emoji2195 { background-position: 0px -9200px; } /* placeholder */ +.emoji2b06 { background-position: 0px -9000px; } +.emoji2b07 { background-position: 0px -9020px; } +.emoji27a1 { background-position: 0px -9040px; } +.emoji2b05 { background-position: 0px -11180px; } +.emoji25b6 { background-position: 0px -9080px; } +.emoji25c0 { background-position: 0px -9100px; } +.emoji23e9 { background-position: 0px -9120px; } +.emoji23ea { background-position: 0px -9140px; } +.emoji23eb { background-position: 0px -9200px; } /* placeholder */ +.emoji23ec { background-position: 0px -9200px; } /* placeholder */ +.emoji1f53a { background-position: 0px -9200px; } /* placeholder */ +.emoji1f53b { background-position: 0px -9200px; } /* placeholder */ +.emoji1f53c { background-position: 0px -9200px; } /* placeholder */ +.emoji1f53d { background-position: 0px -9200px; } /* placeholder */ +.emoji2b55 { background-position: 0px -9800px; } +.emoji274c { background-position: 0px -10340px; } +.emoji274e { background-position: 0px -10340px; } +.emoji2757 { background-position: 0px -9160px; } +.emoji2049 { background-position: 0px -9200px; } /* placeholder */ +.emoji203c { background-position: 0px -9200px; } /* placeholder */ +.emoji2753 { background-position: 0px -9180px; } +.emoji2754 { background-position: 0px -9200px; } +.emoji2755 { background-position: 0px -9220px; } +.emoji3030 { background-position: 0px -9200px; } /* placeholder */ +.emoji27b0 { background-position: 0px -9200px; } /* placeholder */ +.emoji27bf { background-position: 0px -9200px; } /* placeholder */ +.emoji2764 { background-position: 0px -9240px; } +.emoji1f493 { background-position: 0px -9480px; } +.emoji1f494 { background-position: 0px -9280px; } +.emoji1f495 { background-position: 0px -9480px; } +.emoji1f496 { background-position: 0px -9480px; } +.emoji1f497 { background-position: 0px -9340px; } +.emoji1f498 { background-position: 0px -9360px; } +.emoji1f499 { background-position: 0px -9380px; } +.emoji1f49a { background-position: 0px -9400px; } +.emoji1f49b { background-position: 0px -9420px; } +.emoji1f49c { background-position: 0px -9440px; } +.emoji1f49d { background-position: 0px -9460px; } +.emoji1f49e { background-position: 0px -9480px; } +.emoji1f49f { background-position: 0px -9500px; } +.emoji2665 { background-position: 0px -9520px; } +.emoji2660 { background-position: 0px -9540px; } +.emoji2666 { background-position: 0px -9560px; } +.emoji2663 { background-position: 0px -9580px; } +.emoji1f6ac { background-position: 0px -9600px; } +.emoji1f6ad { background-position: 0px -9620px; } +.emoji267f { background-position: 0px -9640px; } +.emoji1f6a9 { background-position: 0px -9200px; } /* placeholder */ +.emoji26a0 { background-position: 0px -9700px; } +.emoji26d4 { background-position: 0px -9720px; } +.emoji267b { background-position: 0px -9200px; } /* placeholder */ +.emoji1f6b2 { background-position: 0px -6980px; } +.emoji1f6b6 { background-position: 0px -7080px; } +.emoji1f6b9 { background-position: 0px -9740px; } +.emoji1f6ba { background-position: 0px -9760px; } +.emoji1f6c0 { background-position: 0px -5220px; } +.emoji1f6bb { background-position: 0px -5240px; } +.emoji1f6bd { background-position: 0px -5260px; } +.emoji1f6be { background-position: 0px -5280px; } +.emoji1f6bc { background-position: 0px -9780px; } +.emoji1f6aa { background-position: 0px -9200px; } /* placeholder */ +.emoji1f6ab { background-position: 0px -9200px; } /* placeholder */ +.emoji2714 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f191 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f192 { background-position: 0px -10020px; } +.emoji1f193 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f194 { background-position: 0px -11020px; } +.emoji1f195 { background-position: 0px -9980px; } +.emoji1f196 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f197 { background-position: 0px -9880px; } +.emoji1f198 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f199 { background-position: 0px -10000px; } +.emoji1f19a { background-position: 0px -9960px; } +.emoji1f201 { background-position: 0px -10060px; } +.emoji1f202 { background-position: 0px -10080px; } +.emoji1f232 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f233 { background-position: 0px -10100px; } +.emoji1f234 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f235 { background-position: 0px -10120px; } +.emoji1f236 { background-position: 0px -10140px; } +.emoji1f21a { background-position: 0px -10160px; } +.emoji1f237 { background-position: 0px -10180px; } +.emoji1f238 { background-position: 0px -10200px; } +.emoji1f239 { background-position: 0px -10220px; } +.emoji1f22f { background-position: 0px -10240px; } +.emoji1f23a { background-position: 0px -10260px; } +.emoji3299 { background-position: 0px -10280px; } +.emoji3297 { background-position: 0px -10300px; } +.emoji1f250 { background-position: 0px -10320px; } +.emoji1f251 { background-position: 0px -9200px; } /* placeholder */ +.emoji2795 { background-position: 0px -9200px; } /* placeholder */ +.emoji2796 { background-position: 0px -9200px; } /* placeholder */ +.emoji2716 { background-position: 0px -10340px; } +.emoji2797 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f4a0 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f4a1 { background-position: 0px -10360px; } +.emoji1f4a2 { background-position: 0px -10380px; } +.emoji1f4a3 { background-position: 0px -10400px; } +.emoji1f4a4 { background-position: 0px -10420px; } +.emoji1f4a5 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f4a6 { background-position: 0px -10460px; } +.emoji1f4a7 { background-position: 0px -10460px; } +.emoji1f4a8 { background-position: 0px -10480px; } +.emoji1f4a9 { background-position: 0px -5000px; } +.emoji1f4aa { background-position: 0px -10500px; } +.emoji1f4ab { background-position: 0px -10520px; } +.emoji1f4ac { background-position: 0px -9200px; } /* placeholder */ +.emoji2728 { background-position: 0px -11000px; } +.emoji2734 { background-position: 0px -10560px; } +.emoji2733 { background-position: 0px -10580px; } +.emoji26aa { background-position: 0px -10640px; } +.emoji26ab { background-position: 0px -10640px; } +.emoji1f534 { background-position: 0px -10640px; } +.emoji1f535 { background-position: 0px -10900px; } +.emoji1f532 { background-position: 0px -10900px; } +.emoji1f533 { background-position: 0px -10980px; } +.emoji2b50 { background-position: 0px -10720px; } +.emoji2b1c { background-position: 0px -10980px; } +.emoji2b1b { background-position: 0px -10900px; } +.emoji25ab { background-position: 0px -10980px; } +.emoji25aa { background-position: 0px -10900px; } +.emoji25fd { background-position: 0px -10980px; } +.emoji25fe { background-position: 0px -10900px; } +.emoji25fb { background-position: 0px -10980px; } +.emoji25fc { background-position: 0px -10900px; } +.emoji1f536 { background-position: 0px -10980px; } +.emoji1f537 { background-position: 0px -10980px; } +.emoji1f538 { background-position: 0px -10980px; } +.emoji1f539 { background-position: 0px -10980px; } +.emoji2747 { background-position: 0px -11000px; } +.emoji1f4ae { background-position: 0px -9200px; } /* placeholder */ +.emoji1f4af { background-position: 0px -9200px; } /* placeholder */ +.emoji21a9 { background-position: 0px -9200px; } /* placeholder */ +.emoji21aa { background-position: 0px -9200px; } /* placeholder */ +.emoji1f503 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f50a { background-position: 0px -7880px; } +.emoji1f50b { background-position: 0px -9200px; } /* placeholder */ +.emoji1f50c { background-position: 0px -9200px; } /* placeholder */ +.emoji1f50d { background-position: 0px -11060px; } +.emoji1f50e { background-position: 0px -11060px; } +.emoji1f512 { background-position: 0px -11140px; } +.emoji1f513 { background-position: 0px -11100px; } +.emoji1f50f { background-position: 0px -11140px; } +.emoji1f510 { background-position: 0px -11140px; } +.emoji1f511 { background-position: 0px -11160px; } +.emoji1f514 { background-position: 0px -4980px; } +.emoji2611 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f518 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f516 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f517 { background-position: 0px -9200px; } /* placeholder */ +.emoji1f519 { background-position: 0px -11180px; } +.emoji1f51a { background-position: 0px -9200px; } /* placeholder */ +.emoji1f51b { background-position: 0px -9200px; } /* placeholder */ +.emoji1f51c { background-position: 0px -9200px; } /* placeholder */ +.emoji1f51d { background-position: 0px -10040px; } +.emoji2003 { background-position: 0px -9200px; } /* placeholder */ +.emoji2002 { background-position: 0px -9200px; } /* placeholder */ +.emoji2005 { background-position: 0px -9200px; } /* placeholder */ +.emoji2705 { background-position: 0px -9200px; } /* placeholder */ +.emoji270a { background-position: 0px -11220px; } +.emoji270b { background-position: 0px -11240px; } +.emoji270c { background-position: 0px -11260px; } +.emoji1f44a { background-position: 0px -11280px; } +.emoji1f44d { background-position: 0px -11300px; } +.emoji261d { background-position: 0px -11320px; } +.emoji1f446 { background-position: 0px -11340px; } +.emoji1f447 { background-position: 0px -11360px; } +.emoji1f448 { background-position: 0px -11380px; } +.emoji1f449 { background-position: 0px -11400px; } +.emoji1f44b { background-position: 0px -11420px; } +.emoji1f44f { background-position: 0px -11440px; } +.emoji1f44c { background-position: 0px -11460px; } +.emoji1f44e { background-position: 0px -11480px; } +.emoji1f450 { background-position: 0px -11500px; } diff --git a/hub/static/css/mod/fav-button.scss b/hub/static/css/mod/fav-button.scss new file mode 100644 index 0000000..916a851 --- /dev/null +++ b/hub/static/css/mod/fav-button.scss @@ -0,0 +1,2 @@ +a#fav-button { height: 25px; width: 25px; display: block; float: right; background: url("/static/img/fav_star.png") 0 0 no-repeat; } +a#fav-button.faved { background: url("/static/img/faved_star.png") 0 0 no-repeat; } \ No newline at end of file diff --git a/hub/static/css/mod/file-blame-blob.scss b/hub/static/css/mod/file-blame-blob.scss new file mode 100644 index 0000000..2c35e09 --- /dev/null +++ b/hub/static/css/mod/file-blame-blob.scss @@ -0,0 +1,122 @@ +@import "css/mod/minibutton"; + +#files { + position: relative; +} +#files .file { + margin-top: 0; +} +#files .file, .file-box { + border: 1px solid #CCC; + margin-bottom: 13px; + position: relative; + background-color: #DDD; +} +#files .file .meta, +.file-box .meta { + overflow: hidden; + padding: 5px 10px; + font-size: 12px; + height: 33px; + text-align: left; + color: #555; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #D8D8D8; + background: #FAFAFA; + background: -moz-linear-gradient(#FAFAFA, #EAEAEA); + background: -webkit-linear-gradient(#FAFAFA, #EAEAEA); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; +} +#files .file .meta .info, +.file-box .meta .info { + float: left; + height: 33px; + max-width: 555px; + line-height: 33px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} +#files .file .meta .info span, +.file-box .meta .info span { + padding-left: 9px; + margin-left: 5px; + border-left: 1px solid + #C1C1C1; + box-shadow: inset 1px 0 0 + white; +} +#files .file .meta .info span.icon, +#files .file .meta .info span.diffstat, +.file-box .meta .info span.icon { + line-height: 0; + float: left; + margin: 5px 5px 0 0; + padding: 3px; + background: #F7F7F7; + border: 1px solid #CCC; + border-right-color: #E5E5E5; + border-bottom-color: #E5E5E5; + border-radius: 3px; +} +#files .file .meta .info span.diffstat { + height: 16px; + padding: 3px 6px; +} +#files .file .meta .info span:first-child, +#files .file .meta .info .icon + span, +.file-box .meta .info span:first-child, +.file-box .meta .info .icon + span { + border-left: 0 none; + box-shadow: inset 0 0 0 transparent; + margin-left: 0; + padding-left: 0; +} +#files .file .meta .info span.diffstat .diffstat-bar { + color: #D8D8D8; +} +#files .file .meta .actions, .file-box .meta .actions { + float: right; + height: 33px; + line-height: 33px; + margin-top: 1px; +} +#files .file .meta .actions .show-inline-notes { + display: block; + position: relative; + display: block; + float: left; + margin-right: 10px; +} +#files .file .meta .actions .show-inline-notes label { + font-weight: bold; + margin: 5px 0; +} +#files .file .meta .actions .show-inline-notes input { + margin:0; +} +#files .file .meta .actions .button-group, +.file-box .meta .actions .button-group { + float: right; + margin-top: 2px; +} +#files .file .meta .actions code, +.file-box .meta .actions code { + background: inherit; + border: none; + font-size: 11px; + color: inherit; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + padding: 0; +} + +.file { + margin: 15px 0; +} + +.file .data { overflow: auto; } + +.change #files .file, .file-box, .change .file { margin-bottom:0 } + +.blame .line-data { font-size: 12px; font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; } diff --git a/hub/static/css/mod/file-blob.scss b/hub/static/css/mod/file-blob.scss new file mode 100644 index 0000000..ebe61d9 --- /dev/null +++ b/hub/static/css/mod/file-blob.scss @@ -0,0 +1,33 @@ +/* button list */ + +.button-group { display:inline-block; overflow:hidden; border:1px solid #d4d4d4; border-radius:3px; border-bottom-color:#bcbcbc; background:#f5f5f5; background:-moz-linear-gradient(#f5f5f5,#e5e5e5); background:-webkit-linear-gradient(#f5f5f5,#e5e5e5); -ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')";} +.button-group li{ margin:0!important; float:left; } +.button-group li:first-child .grouped-button { border-left:none; border-bottom-left-radius:2px; border-top-left-radius:2px; } +.button-group li:last-child .grouped-button { border-right:none; border-bottom-right-radius:2px; border-bottom-left-radius:2px; } +.button-group .grouped-button { float:left;background:none; border-bottom:none; border-top:none; border-left:1px solid rgba(0,0,0,0.1); border-right:1px solid rgba(255,255,255,0.5); border-radius:0; cursor:pointer; } +.button-group .minibutton {position:relative;display:inline-block;padding:0 10px 0 10px;color:#333;font-family:Helvetica,arial,freesans,clean,sans-serif;font-size:13px;font-weight:bold;line-height:24px;text-shadow:0 1px 0 #fff;white-space:nowrap;border-bottom-color:#bcbcbc;border-radius:3px;background:#fafafa;background:-moz-linear-gradient(#fafafa,#eaeaea);background:-webkit-linear-gradient(#fafafa,#eaeaea);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')";cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;} + + +/* line-no */ +#blob .file { min-height:78px; position:relative; overflow:auto } +#blob .file .rawfile { text-align: center; background-color: #ddd; padding: 30px; position: relative; } +.file table { width:100%; border-collapse:collapse; border-spacing:0; } +.file table td, .file table th { vertical-align:top; padding:0; } +.file .data { overflow:auto } + +.code { width:100%; } +.code .highlight pre { margin:0; padding:8px; border:none; background-color:#FFF; white-space:pre; } +.code .highlight pre a { display:block; } + +// linenos +.linenos .linenodiv pre { background-color:#ECECEC; padding:8px; border:none; border-right: 1px solid #DDD; text-align:right; white-space:pre; } +.linenos .linenodiv pre a { color:#AAA; text-decoration:none; white-space:nowrap; line-height:18px } +.code .highlight pre, .linenos .linenodiv pre { + margin:0; + line-height: 18px; + -webkit-border-radius:0; + -moz-border-radius:0; + border-radius:0; +} +.linenos { padding:0; } + diff --git a/hub/static/css/mod/file-browser.scss b/hub/static/css/mod/file-browser.scss new file mode 100644 index 0000000..5dcb4f9 --- /dev/null +++ b/hub/static/css/mod/file-browser.scss @@ -0,0 +1,11 @@ +#tree, #blob { margin: 0 0 27px; } + +.tree-browser { width:100%; margin:0; border-radius:3px; border:1px solid #CACACA; } +.tree-browser th{ text-align:left; font-weight:bold; padding:6px 3px; color:#555; text-shadow:0 1px 0 #fff; border-bottom:1px solid #d8d8d8; background:#fafafa; background:-moz-linear-gradient(#fafafa,#eaeaea); background:-webkit-linear-gradient(#fafafa,#eaeaea); -ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; } +.tree-browser td{ background:#f8f8f8; border-bottom:1px solid #eee; padding:7px 3px; color:#484848; vertical-align:middle; } +.tree-browser tbody tr:last-child td { border-bottom:0; } +.tree-browser .message { min-width:270px; max-width: 484px;} +.tree-browser td a.message { color:#484848 } + +.tree-browser i, .file i, .commit-group-item i { filter:alpha(opacity=70);opacity:.7; } +.file .error { text-align:center; margin:30px; color:#666; } diff --git a/hub/static/css/mod/file-diff-blob.scss b/hub/static/css/mod/file-diff-blob.scss new file mode 100644 index 0000000..38cf470 --- /dev/null +++ b/hub/static/css/mod/file-diff-blob.scss @@ -0,0 +1,269 @@ +@import "css/mod/file-blob"; +@import "css/mod/diff-base"; +@import "css/mod/colorcube"; + +#files .file .data .line_numbers, .file-box .data .line_numbers { + background-color: #ECECEC; + color: #AAA; + padding: 0 2px 0 16px; + border-right: 1px solid #DDD; + text-align: right; + cursor: pointer; + &.deletion { + color: #AAA; + background-color: #f7c8c8; + } + &.insertion { + color: #AAA; + background-color: #ceffce; + } +} +#files .file .data .line_numbers a { + color: #AAA; +} +#files .file .data .code{ + width: 100%; +} + +#files .file .side { + overflow-x: none; + display:none; +} + +#files .file .side .file-col { + width: 50%; + float:left; + overflow-x:auto; +} + + +#files .file .data .diff-table { + border-collapse: collapse; +} + +#files.commentable tr td pre:hover { background-color:#FFC; } + +#files .file .data .diff-table pre { border-radius:0px; } + +#files .file .data table, .file-box .data table { + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + font-size: 12px; + line-height: 1.4; +} + +#files .file .data .file-diff-line span.color { cursor: default; } + + +/* Comment Bubble */ +#files .file-diff-line .add-bubble { + position:absolute; + left:0; + width:25px; + height:16px; + margin-top:0; + //margin-left: -9px; + cursor:pointer; + opacity:0; + color:#4183C4 +} +#files .file-diff-line:hover .add-bubble { opacity:1 } + +/* Comment Bubble icons */ +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} + +.mini-icon-add-comment::before { content: "\f06f"; } + +.skipped-container:first-child:after { +margin: -18px 0 0; +} + +.skipped-container:after { +background: none repeat scroll 0 0 #fff; +content: ""; +display: block; +height: 2px; +margin: -16px 0 0; +position: absolute; +left: 0px; +width: 938px; +} + +// line-numbers-skipped +.data .line-numbers-skipped { + position: absolute; + width: 79px; + background-color: #f5f5f5; + border-right: 1px solid #ccc; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; +} + +.skipped-container .skipped-top, .skipped-container .skipped-bottom { +height: 18px; +background-color: #f5f5f5; +} + +.skipped-top::before { +background: #fff; +border-bottom: 1px solid #ccc; +border-top: 1px solid #ccc; +-moz-box-sizing: border-box; +-ms-box-sizing: border-box; +box-sizing: border-box; +content: ""; +display: block; +height: 4px; +position: relative; +top: -1px; +margin-left: -1px; +} + +// ellipsis +.skipped-container .ellipsis:hover { + background-color: #e6e6e6; + border-color: #999; +} + +.skipped-container .ellipsis { + background: #f5f5f5; + border: 1px solid #ccc; + -moz-border-radius: 3px; + border-radius: 3px; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + box-shadow: 0 0 0 2px #fff; + cursor: pointer; + display: block; + float: left; + font-family: Arial, sans-serif; + font-size: 20px; + text-align: center; + color: #707070; + height: 16px; + line-height: 6px; + margin: 0 0 0 5px; + padding: 0; + position: absolute; + width: 30px; + z-index: 10; +} + +.skipped-top .ellipsis { + margin-top: -10px; +} + +.skipped-container .ellipsis::before, .skipped-container .ellipsis::after { + border: 1px solid #ccc; + -moz-border-radius: 4px; + border-radius: 4px; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + content: ""; + height: 9px; + left: -4px; + width: 36px; + position: absolute; +} + +.skipped-container .ellipsis::before { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + content: "\2026"; + padding: 2px 0 0; + top: -4px; +} + +.skipped-container .ellipsis::after { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; + bottom: -4px; + height: 10px; +} + +// toggle_whitespace +.skipped-container .toggle_whitespace:hover { + background-color: #e6e6e6; + border-color: #999; +} + +.skipped-container .toggle_whitespace { + background: #f5f5f5; + border: 1px solid #ccc; + -moz-border-radius: 3px; + border-radius: 3px; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + box-shadow: 0 0 0 2px #fff; + cursor: pointer; + display: block; + float: left; + font-family: Arial, sans-serif; + font-size: 16px; + text-align: center; + color: #707070; + height: 16px; + line-height: 6px; + margin: 0 0 0 44px; + padding: 0; + position: absolute; + width: 30px; + z-index: 10; +} + +.skipped-top .toggle_whitespace { + margin-top: -10px; +} + +.skipped-container .toggle_whitespace::before, .skipped-container .toggle_whitespace::after { + border: 1px solid #ccc; + -moz-border-radius: 4px; + border-radius: 4px; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + content: ""; + height: 9px; + left: -4px; + width: 36px; + position: absolute; +} + +.skipped-container .toggle_whitespace::before { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + content: "\2423"; + padding: 2px 0 0; + top: -4px; +} + +.skipped-container .toggle_whitespace::after { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; + bottom: -4px; + height: 10px; +} diff --git a/hub/static/css/mod/filter-tabs.scss b/hub/static/css/mod/filter-tabs.scss new file mode 100644 index 0000000..241f30f --- /dev/null +++ b/hub/static/css/mod/filter-tabs.scss @@ -0,0 +1,30 @@ +.list-browser-filter-tabs { + display: block; + float: left; + padding: 5px 5px 0; + overflow: hidden; + .filter-tab { + display: inline-block; + padding: 0 8px; + height: 24px; + line-height: 24px; + font-size: 12px; + font-weight: bold; + color: #888; + -webkit-font-smoothing: antialiased; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.3); + text-decoration: none; + border: 1px solid #CCC; + border-bottom: 0; + border-radius: 3px 3px 0 0; + background: rgba(255, 255, 255, 0.2); + cursor: pointer; + } + & .selected { + color: #333; + background: white; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + border-color: #B4B4B4; + border-bottom: 1px solid white; + } +} diff --git a/hub/static/css/mod/flat-hack.scss b/hub/static/css/mod/flat-hack.scss new file mode 100644 index 0000000..20f8f55 --- /dev/null +++ b/hub/static/css/mod/flat-hack.scss @@ -0,0 +1,4 @@ +//tmp hack for undetermined design ideas +a.btn i { + padding-right: 5px; +} diff --git a/hub/static/css/mod/flatui-comment-content.scss b/hub/static/css/mod/flatui-comment-content.scss new file mode 100644 index 0000000..4348421 --- /dev/null +++ b/hub/static/css/mod/flatui-comment-content.scss @@ -0,0 +1,58 @@ +@import "css/mod/flatui-comment-form"; + +/* hacks for markdown paragraph content for flatui */ +.markdown-body p, .markdown-body blockquote, .markdown-body ul, .markdown-body ol, .markdown-body dl, .markdown-body table, .markdown-body pre { + margin: 15px 0px 0px 0px; +} + +#summary.mod .header { + position: relative; +} + +.mini-icon-edit:before { content: "\f058" } +.mini-icon-delete-note::before, .mini-icon-remove-close::before { content:"\f050" } + +.content .form-content input.title-field { + font-size: 20px; + font-weight: bold; + margin-bottom:5px; + width: 99%; +} + +.content .form-content textarea { + min-height: 100px; + max-width: 100%; + width: 99%; + margin: 0; +} + +.form-actions { + background-color: transparent; + border: none; + text-align: right; + margin: 0px; + padding: 10px 0px 0px; +} + +.change-header-right { + float: right; + a.change-header-date { + color: lightgray; + } +} + +ul.comment-header-actions { + margin-left: 10px; + display: inline; + li { + display: inline; + } +} + +.comment-body { + padding: 0px; +} + +.markdown-body { + padding: 0px; +} diff --git a/hub/static/css/mod/flatui-comment-form.scss b/hub/static/css/mod/flatui-comment-form.scss new file mode 100644 index 0000000..bc63b07 --- /dev/null +++ b/hub/static/css/mod/flatui-comment-form.scss @@ -0,0 +1,92 @@ +@import "compass/css3"; +@import "css/mod/comment-form-preview"; +@import "css/mod/comment-form-content"; +@import "css/mod/minibutton"; +@import "css/mod/comment-form-button"; +@import "css/mod/comment-form-zen"; +@import "css/mod/loader"; +@import "css/mod/upload-widget"; +@import "css/lib/jquery.atwho"; + +.side-avatar { + float: left; + padding: 0px 5px 5px; + vertical-align: top; + margin-left: 0; +} + +.comment-form-head li { + line-height: 18px; +} + +#form-file-upload { + position: relative; + top: -50px; + width:360px; +} + +#form-file-upload #file { + position: absolute; + width: 240px; + margin-left: -80px; + opacity: 0.0001; + cursor: pointer; +} + +.form-content { + padding: 10px; + display: none; + opacity: 1.0; +} + +form#add-comment-form { + .form-content { + display: block; + background:rgba(255,255,255,1); + border: 0px solid; + @include border-radius(3px); + + textarea#new_comment_content { + width: 100%; + background: rgba(255,255,255,1); + } + + .tabnav { + border-bottom: none; + padding: 10px; + } + + .write-content { + position: relative; + padding: 10px 10px 10px; + } + } +} + +/* Zen Mode button hacks for FlatUI */ +.write-content .enable-fullscreen { + top: 15px; +} + +.tab-content { + overflow: visible; +} + +/* Issue for Responsive Mobile Hacks */ + +@media (max-width: 767px){ + + .side-avatar { + padding: 0px; + } + + form#add-comment-form { + .form-content { + .tabnav { + max-width: 100%; + } + + } + } + +} \ No newline at end of file diff --git a/hub/static/css/mod/footer.scss b/hub/static/css/mod/footer.scss new file mode 100644 index 0000000..3ab9f4c --- /dev/null +++ b/hub/static/css/mod/footer.scss @@ -0,0 +1,10 @@ +#footer{ + clear: both; + padding: 10px 0; + color: #999; + border-top: 1px solid #EAEAEA; + background:url('/static/img/pb2.png') no-repeat center center; +} +#footer .footer-logo { float:left; opacity: 0.6; } +#footer #revision { color:lightgray; float:right; display:inline-table; } +#footer #revision span { padding: 0 5px;} diff --git a/hub/static/css/mod/gist-comment.scss b/hub/static/css/mod/gist-comment.scss new file mode 100644 index 0000000..15cf540 --- /dev/null +++ b/hub/static/css/mod/gist-comment.scss @@ -0,0 +1,31 @@ +.tabnav .tabnav-tabs>li:first-child .tabnav-tab.selected{padding-left:12px} +.previewable-comment-form .tabnav { margin-bottom: 10px; margin-top: 10px; position: relative; } +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { padding: 0 10px 10px; } +.previewable-comment-form textarea { display: block; width: 100%; max-width: 100%; min-height: 100px; padding: 10px; background: #FAFAFA; border: 1px solid #DDD; webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; border-radius: 3px; } +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { display: none; padding: 0 10px 10px; } +.previewable-comment-form.write-selected .write-content, .previewable-comment-form.preview-selected .preview-content { display: block; } +.previewable-comment-form .comment { border: 1px solid #CACACA; } +.comment-header { height: 33px; padding: 0 10px 0 6px; border-bottom: 1px solid #CCC; background-color: #E1E1E1; background-image: -moz-linear-gradient(#F8F8F8, #E1E1E1); background-image: -webkit-linear-gradient(#F8F8F8, #E1E1E1); background-image: linear-gradient(#F8F8F8, #E1E1E1); background-repeat: repeat-x; font-size: 12px; } +.comment-header .comment-header-gravatar { display: inline-block; margin-right: 3px; vertical-align: middle; border-radius: 3px;} +.gist-form-actions { text-align: right; padding-bottom: 5px; } +.previewable-comment-form .write-content, .previewable-comment-form .preview-content { display: none; padding: 0 10px 10px; } +.comment-header .comment-header-author { display: inline-block; max-width: 600px; height: 33px; line-height: 33px; font-weight: bold; color: #222; text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.7); white-space: nowrap; text-overflow: ellipsis; } +.comment-header a { color: #666; } +.comment-header a:hover { text-decoration: underline; } +.comment-header .comment-header-right { float: right; } +.comment-header .comment-header-date { display: inline-block; margin: 0; height: 33px; font-size: 11px; line-height: 33px; font-style: normal; color: #777; text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.7); line-height: 33px; } +.comment-content .comment-body { padding: 10px; font-size: 13px; overflow: auto; width: 100%; -moz-box-sizing: border-box; box-sizing: border-box; } +.markdown-body { font-size: 14px; line-height: 1.6; overflow: hidden; background-color: white; } +.comment-content { color: #333; font-size: 12px; } +.markdown-body > :last-child { margin-bottom: 0 !important; } +.markdown-body > :first-child { margin-top: 0 !important; } +.markdown-body p, .markdown-body blockquote, .markdown-body ul, .markdown-body ol, .markdown-body dl, .markdown-body table, .markdown-body pre { margin: 15px 0; } +.comment-content .comment-body { font-size: 13px; } + +.export-references { list-style: none; margin-top: 18px; } +.export-references li, .export-references label { color: #999; font-size: 11px; margin-bottom: 2px; } +.export-references label { display: block; padding: 6px 0 1px; margin-bottom: 0; } +input.url-field { border-radius: 3px; border: 1px solid #CCC; font-family: Monaco, "Liberation Mono", Courier, monospace; font-size: 11px; color: #666; padding: 0 5px 0 5px; width: 136px; height: 24px; margin-bottom: 0; } +.comment-header-actions { display: inline-block; vertical-align: middle; font-size: 13px; } +.comment-header .mini-icon { color: #939AA0; margin: 0 2px 0 1px; position: relative; top: 1px; } +.comment-header a:hover { text-decoration: none; color:#4183C4; } diff --git a/hub/static/css/mod/gist-dropzone.scss b/hub/static/css/mod/gist-dropzone.scss new file mode 100644 index 0000000..d20cdb6 --- /dev/null +++ b/hub/static/css/mod/gist-dropzone.scss @@ -0,0 +1,4 @@ +#dropzone { display: none; background: rgba(0,0,0,0.25); height: 100%; position: fixed; top: 0; left: 0; width: 100%; z-index: 100; } +#dropzone #dropzone-pill { background: rgba(0,0,0,0.75); border-radius: 6px; color: #fff; font-weight: bold; text-align: center; margin-left: -100px; margin-top: -60px; padding: 20px; width: 160px; height: 80px; position: absolute; top: 50%; left: 50%; } +#dropzone .mega-icon-code-file::before, .mega-icon-download-unknown::before, #dropzone .mega-icon-arr-right::before, #dropzone .mega-icon-gist-add::before { font-size: 32px; } +#dropzone p { display: block; -webkit-margin-before: 1em; -webkit-margin-after: 1em; -webkit-margin-start: 0px; -webkit-margin-end: 0px; } diff --git a/hub/static/css/mod/gist-form.scss b/hub/static/css/mod/gist-form.scss new file mode 100644 index 0000000..7d5edf0 --- /dev/null +++ b/hub/static/css/mod/gist-form.scss @@ -0,0 +1,4 @@ +.bubble { background: #EEE; border-radius: 3px; margin-bottom: 1em; padding: 3px; } +#gist-form .file { border: 1px solid #D9D9D9; background: whiteSmoke; } +#gist-form .file .meta { background-color: #EAEAEA; background-image: -moz-linear-gradient(#FAFAFA, #EAEAEA); background-image: -webkit-linear-gradient(#FAFAFA, #EAEAEA); background-image: linear-gradient(#FAFAFA, #EAEAEA); background-repeat: repeat-x; display: inline-block; display: block; border-bottom: 1px solid #D8D8D8; color: #555; font-size: 12px; height: 26px; padding: 8px; position: relative; text-align: left; text-shadow: 0 1px 0 white; } +#gist-form .editor-options { position: absolute; top: 6px; right: 5px; } \ No newline at end of file diff --git a/hub/static/css/mod/gist-item.scss b/hub/static/css/mod/gist-item.scss new file mode 100644 index 0000000..7deb246 --- /dev/null +++ b/hub/static/css/mod/gist-item.scss @@ -0,0 +1,26 @@ +.gist-item { display: inline-block; display: block; margin-bottom: 2em; position: relative; } +.gist-item ul.meta > li .mini-icon { line-height: 0.6; opacity: 0.5; } +.gist-item ul.meta { position: absolute; right: 0; } +.gist-item ul.meta > li { font-size: 12px; font-weight: bold; list-style-type: none; display: inline-block; margin-left: 12px; } +.gist-item ul.meta > li > a { display: block; text-decoration: none; color: #666; } +.gist-item .byline { margin: 3px 0 11px; } +.gist-item .creator img { border-radius: 3px; width: 28px; height: 28px; position: absolute; top: 0; left: 0; margin-left: 3px; } +.gist-item .creator { color: rgba(51, 51, 51, 0.75); font-size: 13px; font-weight: 300; padding-left: 40px; position: relative; width: 480px; } +.gist-item .creator a { font-weight: bold; } +.gist-item .metadata { font-size: 11px; margin-left: 40px; } +.gist-item .metadata .datetime { color: #999; } +.gist-item .description { color: rgba(51, 51, 51, 0.75); display: block; font-size: 12px; vertical-align: text-top; margin-top: 6px; margin-left: 40px; width: 480px; } +.bubble { background: #EEE; border-radius: 3px; margin-bottom: 1em; padding: 3px; } +table { font-size: inherit; font: 100%; } +tbody { display: table-row-group; vertical-align: middle; border-color: inherit; } +.file-box { background-color: #DDD; border: 1px solid #CCC; margin-bottom: 1em; position: relative; } +.file-box .data { background-color: ghostWhite; font-size: 12px; overflow: auto; } +.file-box .highlight { border: none; padding: 0; } +.file-box .data tr:last-child td.line_numbers, .file-box .data tr:last-child .line_data { padding-bottom: 12px; } +.file-box .data tr:first-child td.line_numbers, .file-box .data tr:first-child .line_data { padding-top: 12px; } +.highlight { background: white; } +.bubble .file-box:only-child { border-bottom: 1px solid #CCC; } +.bubble .file-box .data { background: ghostWhite; } +.gist-item .file-box { position: relative; } +.bubble .file-box { background: #ECECEC; margin-bottom: 0; } +.bubble.secret { background-color: #F8EEC7; } diff --git a/hub/static/css/mod/gist-miniicon.scss b/hub/static/css/mod/gist-miniicon.scss new file mode 100644 index 0000000..0e11e95 --- /dev/null +++ b/hub/static/css/mod/gist-miniicon.scss @@ -0,0 +1,25 @@ +.minibutton .mini-icon { vertical-align: -2px; } +.mini-icon-gist::before{ content:"\f00e"; } +.mega-icon-gist-secret::before { content: "\f28c"; color: #F8EEC7; } +.mini-icon-gist-add::before { content:"\f07a"; } +.mini-icon-gist-private::before { content:"\f00f"; } +.mini-icon-gist-forked::before { content:"\f079"; } +.mini-icon-gist-starred::before { content:"\f02a"; } +.mini-icon-arr-up::before { content: "\f03d"; } +.mini-icon-gist-secret::before { content:"\f08c"; } +.mini-icon-gist-fork::before { content: "\f020"; } +.mini-icon-gist-star::before { content:"\f02a"; } +.mini-icon-arr-down::before { content: "\f03f"; } +.mini-icon-commit-comment::before { content: "\f02b"; } +.mini-icon-code::before { content: "\f05f"; } +.mini-icon-link::before { content: "\f05c"; } +.mini-icon-edit::before { content: "\f058"; } +.mini-icon-delete-note::before, .mini-icon-remove-close::beforeremove-close::before { content: "\f050"; } +.mini-icon-arr-right::before { content: "\f03e"; } +.mini-icon-diff::before { content: "\f04d"; } +.mini-icon-download::before { content: "\f00b"; } +.mini-icon-logout::before { content: "\f032"; } +.mega-icon-code-file::before, .mega-icon-download-unknown::before { content: "\f210"; } +.mega-icon-arr-right::before { content: "\f23e"; } +.mega-icon-gist-add::before { content: "\f27a"; } +.discussion-bubble .discussion-bubble-content::before { content: ""; display: block; height: 0; width: 0; border: 10px solid #EEE; border-width: 10px 10px 10px 0; border-color: transparent #EEE transparent transparent; position: absolute; left: -10px; top: 15px; } diff --git a/hub/static/css/mod/gist-recent.scss b/hub/static/css/mod/gist-recent.scss new file mode 100644 index 0000000..ef7ced1 --- /dev/null +++ b/hub/static/css/mod/gist-recent.scss @@ -0,0 +1,9 @@ +.recent-gists { display: block; } +.recent-gists::after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } +.recent-gists ul { list-style: none; margin: 0; padding: 0; } +.recent-gists li { display: list-item; text-align: -webkit-match-parent; float: left; width: 200px;} +.recent-gists .metadata { color: #999; } +.recent-gists .description .blank { color: rgba(153, 153, 153, 0.5); } +.recent-gists .your-gists { float: right; width: 108px; } +.recent-gists .mega-icon::before, .entry-title .meta-icon::before { font-size: 32px; } +.recent-gists .mega-icon { color: #B9B9B9; float: left; top: -1px; left: -4px; position: relative; font-size: 32px; width: 32px; height: 32px; } diff --git a/hub/static/css/mod/gist-render.scss b/hub/static/css/mod/gist-render.scss new file mode 100644 index 0000000..efa18fb --- /dev/null +++ b/hub/static/css/mod/gist-render.scss @@ -0,0 +1,3 @@ +.link-overlay { height: 100%; width: 100%; position: absolute; visibility: hidden; z-index: 50; } +.link-overlay .link { background-color: rgba(0, 0, 0, 0.75); color: white; margin: -14px 0 0 0; padding: 4px 8px 4px 10px; height: 20px; position: absolute; top: 20px; right: 6px; z-index: 100; } +.link-overlay .link .mini-icon { position: relative; top: 2px; } diff --git a/hub/static/css/mod/github.scss b/hub/static/css/mod/github.scss new file mode 100644 index 0000000..e27a411 --- /dev/null +++ b/hub/static/css/mod/github.scss @@ -0,0 +1,3 @@ +span.github-actions { float:right } +.new-github-form input#github { padding:6px; margin:2px 2px 2px 0px;} +.new-github-form dd { margin-left: 0px;} diff --git a/hub/static/css/mod/inline-comment-form.scss b/hub/static/css/mod/inline-comment-form.scss new file mode 100644 index 0000000..6d8db10 --- /dev/null +++ b/hub/static/css/mod/inline-comment-form.scss @@ -0,0 +1,20 @@ +@charset "UTF-8"; +@import "css/mod/comment-form-button"; +@import "css/mod/comment-form-content"; + +.show-inline-comment-form { margin:10px } +tr.inline-comments.show-inline-comment-form .show-inline-comment-form { display: none; } +.inline-comments .comment-count { overflow:hidden; padding:0 !important; border:solid #DDD; border-width:1px 0; vertical-align:top; text-align:center !important } +.inline-comments .counter { display:inline-block; padding:2px 8px 6px; font-family:11px/1.2 bold Helvetica,arial,freesans,clean,sans-serif !important; color:#333 !important; border:1px solid #C0CCD0; border-top:0; border-radius:0 0 3px 3px; cursor:default !important } +#files .file.show-inline-notes tr.inline-comments { display:table-row } +.inline-comments .line-comments { overflow:auto; padding:0; border-top:1px solid #CCC; border-bottom:1px solid #DDD; background:#fff; font-family:Helvetica, arial, freesans, clean, sans-serif !important } +.inline-comment-form { max-width:870px } +.inline-comment-form form { margin:0 } + +.inline-comments .form-actions { padding:0 10px 10px; margin:0 } +.form-content .form-actions { background-color:transparent; } +.form-actions { text-align:right; padding-bottom:5px; background:#fff; border:none } +.form-actions .optional { display:block; padding-top:8px; float:left; margin-right:15px; padding-top:3px } + + + diff --git a/hub/static/css/mod/inline-comment.scss b/hub/static/css/mod/inline-comment.scss new file mode 100644 index 0000000..d55173c --- /dev/null +++ b/hub/static/css/mod/inline-comment.scss @@ -0,0 +1,20 @@ +@charset "UTF-8"; +@import "css/mod/inline-comment-form"; +@import "css/mod/comment-form-preview"; + +.inline-comments .comment-holder { max-width:850px; margin:10px } +.inline-comments .comment { margin:5px 0 !important; border:1px solid #CACACA } +.comment-header { height:33px; padding:0 10px 0 6px; border-bottom:1px solid #CCC; background:#F8F8F8; font-size:12px; background-image: -webkit-linear-gradient(top, #F4FAF6, #D8E5DD); } +.comment-header .comment-header-gravatar { display:inline-block; margin-right:3px; vertical-align:middle; border-radius:3px } +.comment-header .comment-header-author { display:inline-block; max-width:600px; height:33px; line-height:33px; font-weight:bold; color:#222; text-shadow:1px 1px 0 rgba(255, 255, 255, 0.7); overflow:hidden; white-space:nowrap; text-overflow:ellipsis; vertical-align:middle } +.comment-header .comment-header-right { float:right } +.comment-header .comment-header-date { display:inline-block; margin:0; height:33px; font-size:11px; ine-height:33px; font-style:normal; color:#777; text-shadow:1px 1px 0 rgba(255, 255, 255, 0.7); line-height:33px } +.mini-icon-delete-note::before, .mini-icon-remove-close::before { content:"" } +.mini-icon-edit:before { content: "" } +.comment-header .comment-header-actions { display:inline-block; vertical-align:middle; font-size:13px; margin-left:7px } +.comment-header .mini-icon { color:#939AA0; margin:0 2px 0 1px; position:relative; top:2px } +.comment-header .comment-header-actions li .mini-icon { -moz-transition:all 0.15s ease-in 0; -webkit-transition:all 0.15s ease-in 0;text-decoration:none } +.comment-header .comment-header-date { color:#939AA0; text-decoration:none } +.comment-content { padding:0; color:#333; font-size:12px; background:#FBFBFB } +.comment-content .comment-body { padding:10px; font-size:13px; overflow:auto; width:100%; -moz-box-sizing:border-box; box-sizing:border-box } +.comment-header .comment-header-actions li { list-style-type: none; float: left; margin: 0 0 0 8px; } diff --git a/hub/static/css/mod/issue-body.scss b/hub/static/css/mod/issue-body.scss new file mode 100644 index 0000000..ba99d4e --- /dev/null +++ b/hub/static/css/mod/issue-body.scss @@ -0,0 +1,245 @@ +@import "compass/css3"; + +#issue { + + #content { + word-wrap: break-word; + word-break: normal; + + .side-avatar { + a:hover { + text-decoration: none; + } + + img { + width: 48px; + height: 48px; + @include border-radius(3px); + } + } + #summary { + @include border-radius(3px); + display: block; + margin-left: 65px; + + .form-content { + padding: 0px; + } + + .is-comment-editing .content-body { + display: none; + } + + h2 { + font-size: 24px; + } + + ul.actions { + float: right; + text-align: right; + + li { + display: inline; + } + + #upvote i { + position: absolute; + } + } + .summary-bottom { + margin-top: 10px; + + .assignee { + float: right; + margin-right: 10px; + } + .state { + float: left; + a#issue-closer { + padding-left: 10px; + } + } + } + /* Milestone */ + .milestone-body { + display: block; + .milestone-bar-title { + display: inline; + label { + display: inline; + } + } + } + } + + .participation { + p { + display: inline-block; + margin-left: 15px; + } + } + + #changelog { + padding: 0px; + @include border-radius(3px); + + .change { + padding: 10px 15px; + border-bottom: 1px solid #eaeaea; + + .change-text { + padding: 10px; + } + &:hover .change-bottom .comment-header-actions { + display: inline; + } + .change-bottom { + position: relative; + .comment-header-actions { + display: none; + position: absolute; + bottom: 10px; + left: 10px; + } + .author-profile { + float: right; + p { + margin: 5px; + display: inline-block; + } + a.change-header-date { + color: lightgray; + } + .side-avatar { + float: none; + + a:hover { + text-decoration: none; + } + + img { + width: 32px; + height: 32px; + @include border-radius(3px); + } + } + } + } + } + + & > .change:last-child { + border-bottom: none; + } + } + .is-comment-editing .change-text { + display: none; + } + + .markdown-body pre { + font-family: Consolas, Menlo, "Liberation Mono", Courier, monospace; + margin: 0; + border: 0; + } + + .avatar.avatar-tiny { + display: inline-block; + margin: 0 3px 0 0; + vertical-align: baseline; + @include border-radius(3px); + } + } +} + +/* modal */ + +.modal-header { + background: rgba(99, 182, 174, 1); + color: rgba(255,255,255,1); + text-shadow: none; + + p { + margin: 0; + } +} + +.modal-body { + text-shadow: none; +} + +.modal-footer { + background: rgba(99, 182, 174, 1); + color: rgba(255,255,255,1); + text-shadow: none; +} + +.quick-emoji .emojis{ + height:120px; +} + +/* Tag */ +ul.tagit li.tagit-choice { + margin-top: 6px; +} +ul.tagit input[type="text"] { + width: 540px; +} +.tag-groups p{ + margin: 0; +} +.tag-groups { + margin-bottom: 10px; +} + +/* Milestone */ +#milestone-modal { + .milestone-menu { + list-style: none; + display: block; + float: none; + position: relative; + margin-bottom: 5px; + border: 1px solid rgba(0,0,0,0.2); + padding: 5px 0; + border-color: rgba(99,182,174,0.8); + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + .milestone-menu>li>a:hover, + .milestone-menu>li>a:focus, + .milestone-menu > .active > a, + .milestone-menu > .active > a:hover, + .milestone-menu > .active > a:focus { + color: #fff; + text-decoration: none; + background: rgba(99,182,174,1); + } + .milestone-menu>li>a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 20px; + white-space: nowrap; + } + + input[type=radio] { + display: none; + } +} + +/* Issue for Responsive Mobile Hacks */ + +@media (max-width: 767px){ + + #issue #content { + .mod { + margin-left: 35px; + } + span.side-avatar img.discussion-bubble-avatar { + width: 30px; + height: 30px; + } + } + +} diff --git a/hub/static/css/mod/issues-list.scss b/hub/static/css/mod/issues-list.scss new file mode 100644 index 0000000..ffb7295 --- /dev/null +++ b/hub/static/css/mod/issues-list.scss @@ -0,0 +1,68 @@ +@import "css/mod/pagination"; + +.new-issue { + float: left; +} + +.sortby-issues { + float: right; +} + +.issues-topbar { + overflow: hidden; + display: block; +} + +.issue-list { + background: rgba(255,255,255,1); + margin-bottom: 20px; + border-bottom: 1px solid #eaeaea; + + & > :first-child { + margin-top: 0px; + } + + .issue-item { + padding: 15px; + border-bottom: 1px solid #eaeaea; + + h3{ + font-size: 16px; + font-weight: 400; + overflow: hidden; + word-break: break-all; + margin: 0; + + a{ + color: #273338; + } + } + + p{ + a{ + color: #999; + } + } + + h3, p { + a:visited, a:visited:hover { + } + } + .meta{ + margin-top: 20px; + } + } + a.comment-count, + a.comment-count:link, + span.issue-info { + color: #bbb; + } + + .rule { + clear: both; + height: 0px; + padding: 0; + overflow: hidden; + background: transparent; + } +} diff --git a/hub/static/css/mod/issues-sidebar.scss b/hub/static/css/mod/issues-sidebar.scss new file mode 100644 index 0000000..43e853d --- /dev/null +++ b/hub/static/css/mod/issues-sidebar.scss @@ -0,0 +1,58 @@ +@import "compass/css3"; +@import "css/mod/navbar-search"; + +.issues-sidebar { + background: #fff; + @include box-shadow(0 1px 2px rgba(0, 0, 0, .075)); + margin-bottom: 20px; + + .nav { + margin: 0px; + @include border-radius(0px); + @include box-shadow(none); + } + + .issue-tags { + @include border-radius(0px); + } + + & > *:first-child { + @include border-corner-radius(top, left, 3px); + @include border-corner-radius(top, right, 3px); + } + + & > *:last-child { + @include border-corner-radius(bottom, left, 3px); + @include border-corner-radius(bottom, right, 3px); + } + + .rule { + clear: both; + height: 0px; + padding:0; + margin:0; + overflow: hidden; + border: none; + background: transparent; + border-bottom: 3px solid rgba(99, 182, 174, 0.2); + } + + .label { + margin:2px 0px; + a { + color: rgba(99, 182, 174, 1); + text-decoration: none; + &:hover { + background: #63b6ae; + color: white; + @include text-shadow(0 -1px 0 rgba(0, 0, 0, 0.2)); + @include border-radius(4px); + } + } + } + + .well{ + margin-bottom:0; + overflow:hidden; + } +} diff --git a/hub/static/css/mod/issues-tab.scss b/hub/static/css/mod/issues-tab.scss new file mode 100644 index 0000000..3de75aa --- /dev/null +++ b/hub/static/css/mod/issues-tab.scss @@ -0,0 +1,31 @@ + +ul.filter-list .filter-item { + border-radius: 3px 3px 3px 3px; + color: #777777; + display: block; + font-size: 14px; + margin: 0 0 5px; + overflow: hidden; + padding: 8px 10px; + text-decoration: none; + text-overflow: ellipsis; + white-space: nowrap; +} + +ul.filter-list .filter-item:hover { + background: none repeat scroll 0 0 #EEEEEE; +} + +ul.filter-list .filter-item.selected { + background: none repeat scroll 0 0 #4183C4; + color: #FFFFFF; +} + +ul.filter-list .filter-item .count { + float: right; + font-weight: bold; +} + +.issues-tab { + margin-top: 27px; +} diff --git a/hub/static/css/mod/issues-topbar.scss b/hub/static/css/mod/issues-topbar.scss new file mode 100644 index 0000000..492b84d --- /dev/null +++ b/hub/static/css/mod/issues-topbar.scss @@ -0,0 +1,3 @@ +.issues-topbar { + padding-bottom: 10px; +} diff --git a/hub/static/css/mod/loader.scss b/hub/static/css/mod/loader.scss new file mode 100644 index 0000000..9c1e7e8 --- /dev/null +++ b/hub/static/css/mod/loader.scss @@ -0,0 +1,2 @@ +.loader { display:none; position: absolute; top:0; width: 100%; height: 100%; opacity: 0.3; background-color: #eee; } +.loader .spinner { display:block; width:32px; height:32px; margin:0 auto; top: 121px; position: relative; background:url(/static/img/spinner.gif) no-repeat; } diff --git a/hub/static/css/mod/markdown-content.scss b/hub/static/css/mod/markdown-content.scss new file mode 100644 index 0000000..b068ce7 --- /dev/null +++ b/hub/static/css/mod/markdown-content.scss @@ -0,0 +1,116 @@ +.markdown-body { + padding:30px; +} +.markdown-body > :first-child { + margin-top:0!important; +} +.markdown-body h1, +.markdown-body h2, +.markdown-body h3, +.markdown-body h4, +.markdown-body h5, +.markdown-body h6 { + margin:20px 0 10px; + padding:0; + font-weight:bold; + -webkit-font-smoothing:antialiased; + cursor:text; + position:relative; +} +.markdown-body h2 { +font-size:24px; +border-bottom:1px solid #CCC; +color:black; +} +.markdown-body, +.markdown-body p { + font-size:14px; + line-height:1.6; +} +.markdown-body p, +.markdown-body blockquote, +.markdown-body ul, +.markdown-body ol, +.markdown-body dl, +.markdown-body table, +.markdown-body pre { + margin:15px 0; +} +.markdown-body ul, +.markdown-body ol { + padding-left:30px +} +.markdown-body ul li { + line-height:1.6; +} +.markdown-body ul { + list-style: disc; +} +.markdown-body ol { + list-style: decimal; +} +.markdown-body table { + width: 100%; +} +.markdown-body table caption+thead tr:first-child th, +.markdown-body table caption+thead tr:first-child td, +.markdown-body table colgroup+thead tr:first-child th, +.markdown-body table colgroup+thead tr:first-child td, +.markdown-body table thead:first-child tr:first-child th, +.markdown-body table thead:first-child tr:first-child td { + border-top: 0; +} +.markdown-body table thead th { + vertical-align: bottom; +} +.markdown-body table th { + font-weight: bold; +} +.markdown-body table th, +.markdown-body table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #ddd; +} +.markdown-body table th, +.markdown-body table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #ddd; +} +.markdown-body table tbody>tr:nth-child(odd)>td, +.markdown-body table tbody>tr:nth-child(odd)>th { + background-color: #f9f9f9; +} +.markdown-body .progress-percentage { + color:#888; +} + +.markdown-page { + padding:0px; +} +.markdown-page h1, +.markdown-page h2, +.markdown-page h3, +.markdown-page h4, +.markdown-page h5, +.markdown-page h6 { + position: static; +} +.markdown-page pre { + font-family: Consolas, 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 14px; +} +.markdown-page .label { + background-color: transparent; +} +.markdown-page dd { + margin-left: 1.5em; +} +.markdown-body code { + white-space: pre-wrap; +} diff --git a/hub/static/css/mod/merge-guide.scss b/hub/static/css/mod/merge-guide.scss new file mode 100644 index 0000000..071bcdf --- /dev/null +++ b/hub/static/css/mod/merge-guide.scss @@ -0,0 +1,155 @@ +@import "css/mod/minibutton"; + +.pullrequest .merge-guide { margin: 20px 0; } +.commit-preview { + margin: 10px 0 0 0; + + .message, .commit-preview p.error { + clear: both; + padding: 5px; + background: #eaf2f5; + border: 1px solid #bedce7; + } + + .message pre { + font-size: 11px; + color: #333; + white-space: pre-wrap; + word-wrap: break-word; + } +} + +.merge-branch { + + .mergeable { + padding: 8px 10px; + border: 1px solid #ddd; + border-radius: 2px; + } + + .mergeable.merging { + background-color: #589ab3; + background-image: -moz-linear-gradient(#82bccd, #589ab3); + background-image: -webkit-linear-gradient(#82bccd, #589ab3); + background-image: linear-gradient(#82bccd, #589ab3); + background-repeat: repeat-x; + border-color: #7699ad; + border-bottom-color: #648192; + border-top-left-radius: 0; + border-top-right-radius: 0; + background-repeat: repeat-x; + border-color: #8bc384; + } + + &.mergeable-clean .mergeable { + background-color: #6eda62; + background-image: -moz-linear-gradient(#9ee692, #6eda62); + background-image: -webkit-linear-gradient(#9ee692, #6eda62); + background-image: linear-gradient(#9ee692, #6eda62); + + p.message { + color: #0b5f00; + text-shadow: 1px 1px 0 rgba(255,255,255,0.4); + + span.blue { color: blue; } + } + } + + &.mergeable-dirty .mergeable, & .dirty-cleanup .mergeable { + position: relative; + background-color: #f6e69f; + background-image: -moz-linear-gradient(#f6e69f, #f6e69f); + background-image: -webkit-linear-gradient(#f6e69f, #f6e69f); + background-image: linear-gradient(#f6e69f, #f6e69f); + background-repeat: repeat-x; + border-color: #888; + } + + &.mergeable-error .mergeable, & .dirty-cleanup .mergeable { + position: relative; + background-color: #da4f49; + background-image: -moz-linear-gradient(#da4f49, #da4f49); + background-image: -webkit-linear-gradient(#da4f49, #da4f49); + background-image: linear-gradient(#da4f49, #da4f49); + background-repeat: repeat-x; + border-color: #888; + } + + .minibutton { + float: right; + margin: -3px 0 0 15px; + } + + p.message { + margin: 0; + font-size: 13px; + font-weight: bold; + } + + .merge-form .merge-error-message { + display: none; + margin: 10px 0 0 0; + padding: 5px 7px; + color: #bd2c00; + font-weight: bold; + font-size: 12px; + line-height: 19px; + background: rgba(255,255,255,0.8); + border-radius: 2px; + } + + .commit-preview { + position: relative; + display: table-row; + font-size: 12px; + + .author { + display: table-cell; + width: 36px; + padding: 8px 10px; + vertical-align: top; + background: #d3e5eb; + border: 1px solid #bedce7; + border-right: none; + } + + .gravatar { + float: left; + margin: 2px 8px 0 0; + } + + .message { + display: table-cell; + width: 805px; + padding: 8px 10px; + vertical-align: top; + background-color: #e7f0f3; + background-image: -moz-linear-gradient(#f6f9fa, #e7f0f3); + background-image: -webkit-linear-gradient(#f6f9fa, #e7f0f3); + background-image: linear-gradient(#f6f9fa, #e7f0f3); + background-repeat: repeat-x; + border: 1px solid #bedce7; + + pre { + font-family: Monaco, "Liberation Mono", Courier, monospace; + font-size: 12px; + color: #5b6f74; + } + + textarea { + margin-top: 5px; + box-sizing: border-box; + width: 100%; + height: 50px; + padding: 4px; + font-family: Monaco, "Liberation Mono", Courier, monospace; + font-size: 12px; + color: #666; + background-color: #fafafa; + } + } + } +} + +.merge-form { display:none; } + diff --git a/hub/static/css/mod/meta-nav.scss b/hub/static/css/mod/meta-nav.scss new file mode 100644 index 0000000..38c4853 --- /dev/null +++ b/hub/static/css/mod/meta-nav.scss @@ -0,0 +1,32 @@ +.metanav { margin-top:6px; } + +.metanav .counts-label { + position: relative; + display: inline-block; + margin-left: 3px; + padding: 3px 7px; + border: 1px solid #ccc; + border-radius: 3px; + color: #333; + background-color: #fafafa; + vertical-align: middle; +} + +.metanav .counts-label::before, .metanav .counts-label::after { + content: ""; + position: absolute; + top: 50%; + right: 100%; + display: block; + margin-right: 0px; + margin-top: -6px; + width: 0; + height: 0; + border: 6px solid transparent; + border-right-color: #ccc; +} + +.metanav .counts-label::after { + margin-right: -1px; + border-right-color: #fafafa; +} diff --git a/hub/static/css/mod/mini-icons.scss b/hub/static/css/mod/mini-icons.scss new file mode 100644 index 0000000..ef0d192 --- /dev/null +++ b/hub/static/css/mod/mini-icons.scss @@ -0,0 +1,32 @@ +/* mini-icons - from Github */ +/* TODO: Completely remove this component from anywhere in Code */ + +@font-face{ + font-family: 'Octicons Regular'; + src:url("/static/octicons/octicons-regular-webfont.eot") format("eot"), + url("/static/octicons/octicons-regular-webfont.eot#iefix") format("embedded-opentype"), + url("/static/octicons/octicons-regular-webfont.woff") format("woff"), + url("/static/octicons/octicons-regular-webfont.ttf") format("truetype"), + url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight:normal; + font-style:normal; +} + +.mini-icon, +.mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} +.mini-icon::before, +.mega-icon::before { + -moz-transition: color .15s ease-in 0; + -webkit-transition: color .15s ease-in 0; + font-size: 16px; + text-decoration: none; +} diff --git a/hub/static/css/mod/minibutton.scss b/hub/static/css/mod/minibutton.scss new file mode 100644 index 0000000..8951043 --- /dev/null +++ b/hub/static/css/mod/minibutton.scss @@ -0,0 +1,15 @@ +.minibutton {position:relative;display:inline-block;padding:0 10px 0 10px;color:#333;font-family:Helvetica,arial,freesans,clean,sans-serif;font-size:13px;font-weight:bold;line-height:24px;text-shadow:0 1px 0 #fff;white-space:nowrap;border:1px solid #d4d4d4;border-bottom-color:#bcbcbc;border-radius:3px;background:#fafafa;background:-moz-linear-gradient(#fafafa,#eaeaea);background:-webkit-linear-gradient(#fafafa,#eaeaea);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')";cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;} +.minibutton.green{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.3);background:#36b825;background:-moz-linear-gradient(#36b825,#28881b);background:-webkit-linear-gradient(#36b825,#28881b);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#36b825',endColorstr='#28881b')";border-color:#4a993e;} +.minibutton:hover.btn-windows:before,.button-group .btn-windows.grouped-button:before:hover{background-position:-17px 3px;} +.minibutton:disabled,.minibutton.disabled{opacity:.5;cursor:default;} +button.minibutton::-moz-focus-inner{margin:-1px -3px;}input[type=text]+.minibutton{margin-left:5px;} + +.minibutton:hover, .button-group .grouped-button:hover { + color: white; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3); + border-color: #518CC6; + border-bottom-color: #2A65A0; + background: #599BDC; + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#599bdc',endColorstr='#3072b3')"; +} diff --git a/hub/static/css/mod/mobile_timeline.scss b/hub/static/css/mod/mobile_timeline.scss new file mode 100644 index 0000000..c82b171 --- /dev/null +++ b/hub/static/css/mod/mobile_timeline.scss @@ -0,0 +1,9 @@ +/* Timeline on mobile */ +body { margin:0; padding:0; } + +.ui-footer ul li { line-height:32px; } +.scrollable .wrap { background:#fff; } + +.timeline { width:100%; height:100%; position:fixed; margin-top:0; } +.timeline .action, .timeline .pulls { margin-bottom:0.5em; padding:0 12px 0 32px; border-bottom:1px solid #f1f1f1; } +.timeline .desc { border:none; margin-bottom:0.5em; padding-bottom:5px; } diff --git a/hub/static/css/mod/my-projects.scss b/hub/static/css/mod/my-projects.scss new file mode 100644 index 0000000..24e4d00 --- /dev/null +++ b/hub/static/css/mod/my-projects.scss @@ -0,0 +1,25 @@ +@import "css/mod/text-truncate"; + +.my_projects { + a.right { + float: right; + } + + li { + @include text-truncate(300px); + } + + li .delete-btn { + display: none; + } + + li.hover .delete-btn { + display: block; + } + margin-top: 5px; + +} + +.my_projects .delete-btn { + padding: 0 6px 0 6px; +} diff --git a/hub/static/css/mod/my-pull-requests-tab.scss b/hub/static/css/mod/my-pull-requests-tab.scss new file mode 100644 index 0000000..88e3299 --- /dev/null +++ b/hub/static/css/mod/my-pull-requests-tab.scss @@ -0,0 +1,27 @@ +ul.filter-list .filter-item { + border-radius: 3px 3px 3px 3px; + color: #777777; + display: block; + font-size: 14px; + margin: 0 0 5px; + overflow: hidden; + padding: 8px 10px; + text-decoration: none; + text-overflow: ellipsis; + white-space: nowrap; + &:hover { + background: none repeat scroll 0 0 #EEEEEE; + } + &.selected { + background: none repeat scroll 0 0 #4183C4; + color: #FFFFFF; + } + .count { + float: right; + font-weight: bold; + } +} + +.my-pull-requests-tab { + margin-top: 27px; +} diff --git a/hub/static/css/mod/nav-search-dropdown-codeui.scss b/hub/static/css/mod/nav-search-dropdown-codeui.scss new file mode 100644 index 0000000..c217278 --- /dev/null +++ b/hub/static/css/mod/nav-search-dropdown-codeui.scss @@ -0,0 +1,15 @@ + +#search-repos-menu { display:none; position:absolute; top:30px; width:370px; background-color:white; +border: 1px solid rgba(99,182,174,0.4); +z-index:100 } + +#search-repos-menu ul li { min-height:25px; padding:3px; color:#666; cursor:pointer; word-wrap:break-word; } + +#search-repos-menu ul li.active { +background: rgba(99,182,174,1); +color:#fff; } + +#search-repos-menu ul li.intro { padding:7px; color:#666 } +#search-repos-menu ul li.intro.active { background:#fff; padding:7px; color:#666 } +#search-repos-menu .repo-name { padding:3px } +#search-repos-menu .avatar img { float:left; border:none; width:24px; height:24px; margin-right:5px } diff --git a/hub/static/css/mod/nav-search-dropdown.scss b/hub/static/css/mod/nav-search-dropdown.scss new file mode 100644 index 0000000..a75d4a0 --- /dev/null +++ b/hub/static/css/mod/nav-search-dropdown.scss @@ -0,0 +1,8 @@ + +#search-repos-menu { display:none; position:absolute; top:30px; width:228px; background-color:white; border:1px solid #EEE; z-index:100 } +#search-repos-menu ul li { min-height:25px; padding:3px; color:#666; cursor:pointer; word-wrap:break-word; } +#search-repos-menu ul li.active { background:#4183C4; color:#fff } +#search-repos-menu ul li.intro { padding:7px; color:#666 } +#search-repos-menu ul li.intro.active { background:#fff; padding:7px; color:#666 } +#search-repos-menu .repo-name { padding:3px } +#search-repos-menu .avatar img { float:left; border:none; width:24px; height:24px; margin-right:5px } diff --git a/hub/static/css/mod/nav.scss b/hub/static/css/mod/nav.scss new file mode 100644 index 0000000..22b618d --- /dev/null +++ b/hub/static/css/mod/nav.scss @@ -0,0 +1,37 @@ +/* TODO: still has Github UI in this mod */ +@import "css/mod/nav-search-dropdown"; + +.navbar .container { width: 100%; } +div.navbar .nav-logo { float:left; margin:2px 2px 0 0; } +.span4 .items { max-width: 300px; } +body div.container { max-width: 940px; } + +.btn-back { + float: left; + margin-right: 5px; +} + +/* other responsive styles */ + +@media (max-width: 767px) { + body { + padding: 50px 0px 0px; + } + body div.container { + max-width: 950px; + padding: 5px 5px; + } + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin: 0px 0px; + } +} + +@media (max-width: 979px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + position: fixed; + } +} + diff --git a/hub/static/css/mod/navbar-search.scss b/hub/static/css/mod/navbar-search.scss new file mode 100644 index 0000000..c946f44 --- /dev/null +++ b/hub/static/css/mod/navbar-search.scss @@ -0,0 +1,6 @@ +.navbar-search { + i { + color: rgba(99, 182, 174,1); + padding-right: 4px; + } +} diff --git a/hub/static/css/mod/notification.scss b/hub/static/css/mod/notification.scss new file mode 100644 index 0000000..dd31825 --- /dev/null +++ b/hub/static/css/mod/notification.scss @@ -0,0 +1,5 @@ +#settings-notifications h4 { margin:15px 0 5px 0; font-size:14px; color:black; } +.user-mention { font-weight:bold; color:#333; } +#settings-notifications ul.compact-options { margin:-6px 0 13px 0; } +#settings-notifications ul.compact-options li { margin: 0 15px 0 0; list-style-type:none; font-weight:bold; } +.horizontal_line { margin:10px 0 10px -10px; padding:0 10px; width:100%; } diff --git a/hub/static/css/mod/pagination.scss b/hub/static/css/mod/pagination.scss new file mode 100644 index 0000000..ed67a8c --- /dev/null +++ b/hub/static/css/mod/pagination.scss @@ -0,0 +1,34 @@ +.pagination { + display:block; + margin:7px 0; + overflow:hidden; + a { + padding:8px; + width:100%; + text-align:center; + line-height: 1.4; + } + a, span { + float:left; + margin:0; + color:#777; + font-size:13px; + text-decoration:none; + text-shadow:0 1px 0 white; + border-bottom:1px solid #DADADA; + } + + ul { + li { + a { + width: 20px; + } + } + + .disabled { + a { + background-color: #fff; + } + } + } +} diff --git a/hub/static/css/mod/praise.scss b/hub/static/css/mod/praise.scss new file mode 100644 index 0000000..d8b89b1 --- /dev/null +++ b/hub/static/css/mod/praise.scss @@ -0,0 +1,23 @@ +.recs, .rec-paginator { margin:35px 87px } +.recs .rec { margin-bottom:36px; width:100%; } +.rec blockquote { padding-left:1.5em; color:#404040; background:url(/static/img/big_quotel.png) no-repeat 0 0 transparent; margin:0 15px; border:none; font-size:15px; } +.rec .to-user-info { margin-bottom:15px; } +.rec .to-user-info img { margin:0 7px 0 0 } +.rec .from-user-info { float:right; display:inline-block; font-style:italic; } +.rec img { width:32px; height:32px; margin-left:7px } +.rec .vote-buttons { float:left; text-align:center; } +.rec a.rec-vote { display:block; position:relative; width:24px; height:24px; opacity:0.5 } +.rec a.rec-vote:hover { opacity:0.8 } +.rec a.rec-vote { background: url("/static/img/arrow-up.png") no-repeat scroll center center transparent; } +.rec .vote-buttons.likes a.rec-vote, .rec .vote-buttons.voted a.rec-vote { background: url("/static/img/arrow-up-orange.png") no-repeat scroll center center transparent; } +.rec .rec-score { font-weight:bold; font-size:20px; margin-top:3px; } +.rec .rec-score.current { color: #C6C6C6; display:block } +.rec .vote-buttons.likes .rec-score.current { display:none } +.rec .rec-score.likes { display:none; color:#FF8B60; } +.rec .vote-buttons.likes .rec-score.likes { display:block } + +.rec .item-right { margin-left:32px; padding:12px 5px; border-bottom:1px solid #DDD; } +.rec .item-right:hover { background:#FFF6ED; border-bottom:1px solid #FFF6ED } + +.rec-paginator { font-size:14px } +.rec-paginator .next { float:right } diff --git a/hub/static/css/mod/project-info.scss b/hub/static/css/mod/project-info.scss new file mode 100644 index 0000000..ef727ca --- /dev/null +++ b/hub/static/css/mod/project-info.scss @@ -0,0 +1,76 @@ +@charset "UTF-8"; +@import "css/mod/meta-nav"; +@import "css/mod/repository-lang-stats"; + +/* fix project title for newer version of bootstrap*/ +.pagehead .pull-left { + margin: 0; + font-size: 30px; + line-height: 36px; +} + +/* Hotfix for FlatUI */ +.pagehead h2.pull-left { + margin: 0; +} + +#project-info { + border: 1px solid #c5d5dd; + border-radius: 3px; + width: 100%; +} +#project-info > div { + padding: 10px; +} +#project-info p { + margin: 0px; +} +#project-info > div.team-label { + border-top: 1px solid #ccc; +} + +#project-info > div.git-url { + border-top: 1px solid #ccc; +} + +#project-info input.git-url{ + width: 480px; + margin: 0px; + cursor: auto; +} + +#project-info .ssh { + div.ssh-url { + display: inline; + } + div.http-url { + display: none; + } +} + +#project-info .http { + div.ssh-url { + display: none; + } + div.http-url { + display: inline; + } +} + +.sourcenav-bar { margin-top:12px; border-bottom:1px solid #DDD; } +.sourcenav-bar #back-old-browser { padding-top:8px; float:right; } +.sourcenav-bar ul.tab { padding-left: 20px; } +.sourcenav-bar ul.tab li { display: inline-block; vertical-align: top; cursor: pointer; } +.sourcenav-bar ul.tab li a { color: #666; text-decoration: none; padding: 8px 12px; display: inline-block; border-left: 1px solid transparent; border-top: 1px solid transparent; border-right: 1px solid transparent; margin-bottom: -1px; } +.sourcenav-bar ul.tab li a.active { color: #333; font-weight: bold; border-left: 1px solid #DDD; border-top: 1px solid #DDD; border-right: 1px solid #DDD; border-top-left-radius: 3px; border-top-right-radius: 3px; background-color: white; } + +.sourcenav-bar .scope { + float: left; + margin-right: 10px; +} +.sourcenav-bar .scope i { + font-style: normal; +} + +#breadcrumb { margin:10px 0; font-size:18px; font-weight:bold; color:#999; } +#breadcrumb .final-path { color:#000; } diff --git a/hub/static/css/mod/project-item.scss b/hub/static/css/mod/project-item.scss new file mode 100644 index 0000000..e1fc198 --- /dev/null +++ b/hub/static/css/mod/project-item.scss @@ -0,0 +1,63 @@ +/* Echo out a label for the example */ +.bs-docs-project:after { + content: "Proj"; +} + +.bs-docs-fork:after { + content: "Fork"; +} + +.project-item { + overflow:hidden; + word-wrap: break-word; + word-break: normal; + min-height: 80px; + position: relative; + margin: 15px 0; + padding: 14px 19px 14px 49px; + *padding-top: 14px; + background-color: transparent; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + + &:after { + position: absolute; + top: -1px; + left: -1px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + background-color: #f5f5f5; + border: 1px solid #ddd; + color: #9da0a4; + -webkit-border-radius: 4px 0 4px 0; + -moz-border-radius: 4px 0 4px 0; + border-radius: 4px 0 4px 0; + } + + h4.project-title { + margin: 0; + i { + margin-top: 5px; + } + } + ul.project-stats { + li { + float: left; + margin-left: 10px; + } + } + .summary { + margin-top: 10px; + } + .commit-graph { + position: absolute; + left: 10px; + bottom: 0; + z-index: -9999; + height: 80px; + width: 440px; + } +} diff --git a/hub/static/css/mod/pull-codereview.scss b/hub/static/css/mod/pull-codereview.scss new file mode 100644 index 0000000..a706b3a --- /dev/null +++ b/hub/static/css/mod/pull-codereview.scss @@ -0,0 +1,41 @@ +/* codereview style */ + +/* comments style is also used in pull-new page's description input box */ + +.comments-row .comments { + padding: 5px; +} +.comments-row .comment { + margin: 5px 0; + border: 1px solid #CACACA; +} +.comments-row .comment-meta { + padding: 5px 10px; + border-bottom: 1px solid #CCC; + background-image: linear-gradient(top, #F4F8F9, #DCE8EC); + background-image: -o-linear-gradient(top, #F4F8F9, #DCE8EC); + background-image: -moz-linear-gradient(top, #F4F8F9, #DCE8EC); + background-image: -webkit-linear-gradient(top, #F4F8F9, #DCE8EC); + background-image: -ms-linear-gradient(top, #F4F8F9, #DCE8EC); +} + +.comments-row .comment .body { + color: #333; + font-size: 13px; + padding: 10px; + background: #FBFBFB; +} + +.comments-row .comment-form .help { + margin: 3px 0 0 0; + float: right; + font-size: 11px; + color: #666; +} +.comments-row .comment-form textarea { + width: 100%; + height: 100px; + font-size: 12px; +} + + diff --git a/hub/static/css/mod/pull-comment.scss b/hub/static/css/mod/pull-comment.scss new file mode 100644 index 0000000..0bc7d0f --- /dev/null +++ b/hub/static/css/mod/pull-comment.scss @@ -0,0 +1,56 @@ +.comment-content { padding:0; width:100%; } +.comment-content .form-content { padding: 10px; display: none; opacity: 1.0; } +.comment-content.is-comment-editing .comment-body { display:none; } +.comment-content.is-comment-editing .form-content { display:block; background-color:#fff; } +.comment-content .form-content form { margin:0; } +.comment-content .form-content input.title-field { font-size: 20px; font-weight: bold; } +.comment-content .form-content input[type="text"] { margin-bottom: 5px; width: 99%; } +.comment-content .form-content textarea { margin: 0; width: 99%; max-width: 100%; height: 100px; min-height: 100px; } +.comment-content .form-content .form-actions { padding:0; margin: 10px 0 0 0; } +.comment-content .comment-cancel-button { float: left; } + +.pullrequest #attachments, .pullrequest .foldable, .pullrequest .threading { display:none } + +@import "css/mod/comment-form-preview"; + +/* Button style from hub.css */ +button.classy, +button.classy:disabled, +button.classy.disabled, +a.button.classy:disabled, +a.button.classy.disabled, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover:disabled, +a.button.classy.disabled:hover, +a.button.classy, +button.classy:disabled:hover, +button.classy.disabled:disabled:hover, +a.button.classy:disabled:hover, +a.button.classy.disabled:disabled:hover, +a.button.classy.disabled:hover { + display: inline-block; + padding: 8px 15px; + line-height: normal; + position: relative; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 12px; + font-weight: bold; + color: #666; + text-shadow: 0 1px rgba(255, 255, 255, 0.9); + background: whiteSmoke; + background: -moz-linear-gradient(whiteSmoke, #E5E5E5); + background: -webkit-linear-gradient(whiteSmoke, #E5E5E5); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#e5e5e5')"; + border-radius: 3px; + border: 1px solid #DDD; + border-bottom-color: #BBB; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} diff --git a/hub/static/css/mod/pull-github.scss b/hub/static/css/mod/pull-github.scss new file mode 100644 index 0000000..c013e9c --- /dev/null +++ b/hub/static/css/mod/pull-github.scss @@ -0,0 +1,52 @@ + +/*========= Github Style ========*/ + +span.diffstat { + white-space: nowrap; + text-align: right; + font-family: Helvetica,arial,freesans,clean,sans-serif; + color: #666; + font-weight: bold; + font-size: 11px; +} +span.diffstat a { + text-decoration: none; + color: #666; +} +span.diffstat .diffstat-bar { + position: relative; + left: -3px; + display: inline-block; + height: 12px; + text-decoration: none; + text-align: left; + color: #EEE; + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + line-height: 1; + -webkit-font-smoothing: antialiased; + font-size: 16px; + letter-spacing: -7px; +} +span.diffstat .diffstat-bar.diff-added, +span.diffstat .diffstat-bar i.plus { + color: #61C423; + font-style: normal; +} +span.diffstat .diffstat-bar.diff-added, +span.diffstat .diffstat-bar i.minus { + color: #C52323; + font-style: normal; +} + +.mini-icon-added:before{content:"\f06b";} +.mini-icon-removed:before{content:"\f06c";} +.mini-icon-modified:before{content:"\f06d";} +.mini-icon-moved:before,.mini-icon-renamed:before{content:"\f06e";} + +/* TODO remove the following line */ +/* file-blame-blob should only be import at blame page */ +@import "css/mod/file-blame-blob"; \ No newline at end of file diff --git a/hub/static/css/mod/pull-highlight.scss b/hub/static/css/mod/pull-highlight.scss new file mode 100644 index 0000000..1b7dfef --- /dev/null +++ b/hub/static/css/mod/pull-highlight.scss @@ -0,0 +1,64 @@ +/* highlight style */ +.highlight .hll { background-color: #ffffcc; } +.highlight { background: #ffffff; } +.highlight .c { color: #808080; } /* Comment */ +.highlight .err { color: #F00000; background-color: #F0A0A0; } /* Error */ +.highlight .k { color: #008000; font-weight: bold; } /* Keyword */ +.highlight .o { color: #303030; } /* Operator */ +.highlight .cm { color: #808080; } /* Comment.Multiline */ +.highlight .cp { color: #507090; } /* Comment.Preproc */ +.highlight .c1 { color: #808080; } /* Comment.Single */ +.highlight .cs { color: #cc0000; font-weight: bold; } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #FF0000; } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold; } /* Generic.Heading */ +.highlight .gi { color: #00A000; } /* Generic.Inserted */ +.highlight .go { color: #808080; } /* Generic.Output */ +.highlight .gp { color: #c65d09; font-weight: bold; } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold; } /* Generic.Subheading */ +.highlight .gt { color: #0040D0; } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold; } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold; } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold; } /* Keyword.Namespace */ +.highlight .kp { color: #003080; font-weight: bold; } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold; } /* Keyword.Reserved */ +.highlight .kt { color: #303090; font-weight: bold; } /* Keyword.Type */ +.highlight .m { color: #6000E0; font-weight: bold; } /* Literal.Number */ +.highlight .s { background-color: #fff0f0; } /* Literal.String */ +.highlight .na { color: #0000C0; } /* Name.Attribute */ +.highlight .nb { color: #007020; } /* Name.Builtin */ +.highlight .nc { color: #B00060; font-weight: bold; } /* Name.Class */ +.highlight .no { color: #003060; font-weight: bold; } /* Name.Constant */ +.highlight .nd { color: #505050; font-weight: bold; } /* Name.Decorator */ +.highlight .ni { color: #800000; font-weight: bold; } /* Name.Entity */ +.highlight .ne { color: #F00000; font-weight: bold; } /* Name.Exception */ +.highlight .nf { color: #0060B0; font-weight: bold; } /* Name.Function */ +.highlight .nl { color: #907000; font-weight: bold; } /* Name.Label */ +.highlight .nn { color: #0e84b5; font-weight: bold; } /* Name.Namespace */ +.highlight .nt { color: #007000; } /* Name.Tag */ +.highlight .nv { color: #906030; } /* Name.Variable */ +.highlight .ow { color: #000000; font-weight: bold; } /* Operator.Word */ +.highlight .w { color: #bbbbbb; } /* Text.Whitespace */ +.highlight .mf { color: #6000E0; font-weight: bold; } /* Literal.Number.Float */ +.highlight .mh { color: #005080; font-weight: bold; } /* Literal.Number.Hex */ +.highlight .mi { color: #0000D0; font-weight: bold; } /* Literal.Number.Integer */ +.highlight .mo { color: #4000E0; font-weight: bold; } /* Literal.Number.Oct */ +.highlight .sb { background-color: #fff0f0; } /* Literal.String.Backtick */ +.highlight .sc { color: #0040D0; } /* Literal.String.Char */ +.highlight .sd { color: #D04020; } /* Literal.String.Doc */ +.highlight .s2 { background-color: #fff0f0; } /* Literal.String.Double */ +.highlight .se { color: #606060; font-weight: bold; background-color: #fff0f0; } /* Literal.String.Escape */ +.highlight .sh { background-color: #fff0f0; } /* Literal.String.Heredoc */ +.highlight .si { background-color: #e0e0e0; } /* Literal.String.Interpol */ +.highlight .sx { color: #D02000; background-color: #fff0f0 } /* Literal.String.Other */ +.highlight .sr { color: #000000; background-color: #fff0ff } /* Literal.String.Regex */ +.highlight .s1 { background-color: #fff0f0; } /* Literal.String.Single */ +.highlight .ss { color: #A06000; } /* Literal.String.Symbol */ +.highlight .bp { color: #007020; } /* Name.Builtin.Pseudo */ +.highlight .vc { color: #306090; } /* Name.Variable.Class */ +.highlight .vg { color: #d07000; font-weight: bold; } /* Name.Variable.Global */ +.highlight .vi { color: #3030B0; } /* Name.Variable.Instance */ +.highlight .il { color: #0000D0; font-weight: bold; } /* Literal.Number.Integer.Long */ + diff --git a/hub/static/css/mod/pull-new.scss b/hub/static/css/mod/pull-new.scss new file mode 100644 index 0000000..027a49a --- /dev/null +++ b/hub/static/css/mod/pull-new.scss @@ -0,0 +1,233 @@ +.pull-heading .btn-change { + float: right; + margin: 9px 10px 0 0; +} + +.editor-expander { + cursor: pointer; +} + +.pull-head { + padding: 10px; + border: 1px solid whiteSmoke; + border-top: none; + border-bottom: 2px solid #EEE; + border-radius: 5px; +} + +.pull-description { + font-size: 14px; + margin: 0; + color: #333; + font-weight: 300; +} +.pull-description a { + font-weight: bold; + color: black; +} +.pull-description .commit-ref { + margin: 0 3px; +} + +.commit-ref { + padding: 2px 5px; + line-height: 19px; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + font-size: 12px; + font-weight: normal; + color: white; + text-shadow: -1px -1px 0 black; + text-decoration: none; + background: #787878; + background: -moz-linear-gradient(#787878, #282828); + background: -webkit-linear-gradient(#787878, #282828); + border-radius: 3px; +} +.commit-ref .project { + font-weight: normal; + color: #CCC; +} + +.range-editor { + margin: 15px 0 20px; + background: url("http://t.douban.com/img/files/file-1363274223.gif") 50% 80px no-repeat; +} +.range-editor .chooser-box { + float: left; + width: 420px; +} +.range-editor .chooser-box.head { + float: right; +} +.range-editor table.reposha { + margin: 15px 0 0 0; + width: 100%; +} +.range-editor .commit-preview .message, +.range-editor .commit-preview p.error { + margin: 10px 0 0 0; + background: #F7F8F9; + border: 1px solid #DDD; + border-bottom: none; + border-radius: 3px; +} +.range-editor .form-actions { + margin: 10px 0 0; + text-align: right; + padding-bottom: 5px; + padding: 0; + background-color: inherit; + border-top: none; +} + +.chooser-box { + padding: 0 10px 10px; + background: white; + background: -moz-linear-gradient(white, #F1F1F1); + background: -webkit-linear-gradient(white, #F1F1F1); + border: 1px solid #DDD; + border-radius: 5px; +} +.chooser-box h3 { + margin: 0 0 0 -10px; + width: 100%; + padding: 13px 10px 10px; + font-size: 16px; + line-height: 1.2; + color: #222; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.5); + background: #FBFBFB; + background: -moz-linear-gradient(#FBFBFB, #F2F2F2); + background: -webkit-linear-gradient(#FBFBFB, #F2F2F2); + border-top-left-radius: 5px; + border-bottom: 1px solid white; +} +.chooser-box .fakerule { + margin: 0 0 0 -10px; + width: 100%; + height: 1px; + padding: 0 10px; + font-size: 1px; + line-height: 1px; + background: #DDD; +} + +.reposha td.repo { + width: 1%; + white-space: nowrap; +} +.reposha .repo .at { + padding-right: 5px; + color: #666; +} +.reposha .sha { + text-align: left; +} +.reposha input[type="text"] { + width: 98%; + font-family: Helvetica,arial,freesans,clean,sans-serif; + font-size: 12px; + line-height: 20px; + color: #444; +} + +/* following commit-preview styles are also used in commits.html */ + +.commit-preview { + margin: 10px 0 0 0; + font-size: 11px; +} +.commit-preview p.name { + margin: 0; + height: 20px; + line-height: 20px; + font-size: 12px; + color: #5B6375; +} +.commit-preview p.name .avatar { + float: left; + margin-right: 5px; + width: 16px; + height: 16px; + padding: 1px; + background: white; + border: 1px solid #CEDADF; +} +.commit-preview p.name a { + font-weight: bold; + color: black; +} +.commit-preview p.name .date { + color: #5B6375; +} +.commit-preview .message, +.commit-preview p.error { + clear: both; + padding: 5px; + background: #EAF2F5; + border: 1px solid #BEDCE7; +} +.commit-preview .message pre { + font-size: 11px; + color: #333; + white-space: pre-wrap; + word-wrap: break-word; + border: none; +} +.commit-preview .message p.commit-id { + margin: 5px 0 0 0; + padding: 0; + font-family: Consolas,Menlo,"Liberation Mono",Courier,monospace; + font-size: 11px; +} + +.new-pull-request .pull-tabs { + clear: both; +} + +.mini-icon-commit::before { + content: "\f01f"; +} +.mini-icon-discussion::before { + content: "\f04f"; +} +.mini-icon-diff::before { + content: "\f04d"; +} + +.pull-form { + margin: 0; +} +.pull-form input[type="text"] { + font-size: 14px; + padding: 5px 5px; + margin: 0 0 5px 0; + width: 98%; + color: #444; +} +.pull-form textarea { + height: 200px; +} +.pull-form .preview-content { + background: white; +} + +.pull-form-main .form-actions { + padding: 0; + margin-top: 10px; + text-align: right; + padding-bottom: 5px; + background-color: inherit; + border-top: none; +} + +.pull-dest-repo a { + font-size: 12px; + font-weight: bold; + padding: 5px 0; +} +.pull-dest-repo p { + font-size: 11px; + color: #999; + margin: 5px 0 15px 0; +} diff --git a/hub/static/css/mod/pull-request.scss b/hub/static/css/mod/pull-request.scss new file mode 100644 index 0000000..eda5022 --- /dev/null +++ b/hub/static/css/mod/pull-request.scss @@ -0,0 +1,182 @@ +@import "css/mod/comment-form"; +@import "css/mod/loader"; +@import "css/mod/pullrequest-pull-head"; +@import "css/mod/fav-button"; + +#project-info { margin-bottom:15px; } + +.tab-content { overflow:initial; position:relative; } +.pullrequest.tab-content { min-height:280px; overflow:visible; } + +.commit-preview .date { color: #5B6375; } + +.pull-nav.tabnav { margin: 0 0 10px; border-bottom:none; height: 35px; } +.pull-nav.tabnav .nav li.active { font-weight: bold; } +.pull-nav.tabnav .nav li a:hover { background-color:transparent; border:1px solid transparent; } +.pull-nav.tabnav .nav li.active a { background-color:#fff; border-bottom:1px solid #fff; } +.pull-nav.tabnav .nav li.active a:hover { background-color:#fff; border: 1px solid #DDD; border-bottom:1px solid #fff; } + +.tabnav .counter { position: relative; top: -1px; margin: 0 0 0 5px; padding: 1px 5px 2px 5px; font-size: 10px; font-weight: bold; color: #666; background: #E5E5E5; border-radius: 10px; } + +.pullrequest .explain { margin: 15px 0; } + +.discussion-topic-header { position: relative; margin: 10px; } +.discusion-topic-infobar { border-bottom:1px solid #e5e5e5; } +.discussion-topic-header .comment-topic-actions { position: absolute; top: 10px; right: 10px; list-style-type: none; } +.discussion-topic-header .comment-topic-actions li { float: left; margin-left: 12px; } + +.pullrequest blockquote.citation { border:none } +.pullrequest #trac-ticket-title { display:none } +.pullrequest .ticket { margin-top:23px } +.pullrequest .trac-topnav { margin-top:0; top:-20px; position:absolute; right:0 } + +.pullrequest .ticket #ticket, .pullrequest div.change { margin-bottom:20px; background:#fff; border-radius:3px; border:3px solid #eee } +.pullrequest .ticket #ticket::before, .pullrequest div.change::before, .pullrequest #propertyform fieldset.iefix::before, .pullrequest #add-comment-form .form-content::before { content:""; display:block; height:0; width:0; border:10px solid #EEE; border-width:10px 10px 10px 0; border-color:transparent #EEE transparent transparent; left:-12px; top:15px; float:left; position:absolute } +.pullrequest .ticket #ticket::before { position:absolute; } +.pullrequest div.change::before, .pullrequest #propertyform fieldset.iefix::before { position:relative; } +.pullrequest .ticket #ticket { padding:5px } + +.pullrequest .ticket #ticket .date { float:none; clear:both; color:#666; font-size:12px } +.pullrequest .ticket #ticket .date::after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } +.pullrequest .ticket #ticket .date p { float:left } +.pullrequest .ticket #ticket .summary { font-size:20px; font-weight:bold; margin:0 } +.pullrequest .ticket #ticket .properties { display:none; border:none } +.pullrequest .ticket #ticket .description { margin-top:10px } +.pullrequest .ticket #ticket .description div { padding:0 } +.pullrequest .ticket #ticket .description h3 { display:none } +.pullrequest .ticket #ticket .description #addreply { float:right } + + +.pullrequest { + .commits-condensed tr td.message { + word-break: break-all; + } + + #changelog { + border: none; + padding: 0; + + .change table.commits tr td { + &.author { + width: 80px; + } + &.date { + width: 100px; + } + &.status { + width: 20px; + } + + span { + &.commit-status { + width:100px; + display:inline-block; + border-radius:100px; + width:15px; + height:15px; + vertical-align: middle; + } + &.dirty { + background-color:#f6e69f; + } + &.error { + background-color:#da4f49; + } + &.success { + background-color:#6eda62; + } + } + } + } +} + +.pullrequest #changelog h3 { border:none } +.pullrequest #changelog .change div.outdated_mark { background-color: #DDD; height: 31px; text-align: center; color: #777; line-height: 31px; } +.pullrequest #changelog .change div.outdated_commits { display:none; } +.pullrequest #changelog .change div.outdated_codereview { display:none; } +.pullrequest div.change { padding:0; background:#FBFBFB; } +.pullrequest #changelog .change h3.change { color:#333; margin:0; font-size:12px; text-shadow:1px 1px 0 rgba(255, 255, 255, 0.7); white-space:nowrap; text-overflow:ellipsis; padding:0 10px 0 6px; border-bottom:1px solid #CCC; background:-webkit-linear-gradient(#F8FBFC, #DDE8EB); background-image: -webkit-linear-gradient(#F8F8F8, #E1E1E1); background-image: linear-gradient(#F8F8F8, #E1E1E1); -ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#f8fbfc', endColorstr='#dde8eb')" } +.pullrequest div.change form[id^=reply-to-comment-] { right:7px } +.pullrequest div.change table.commits .commit code { background-color:transparent } +.pullrequest #changelog .comment { margin:0; top: -1px; position: relative; } +.pullrequest #changelog .comment #files { margin-top:-24px } +.pullrequest #changelog .comment #files .file { width:100%; margin:0 0 0 -1px } +.pullrequest #changelog .comment p br { height:0; } +.pullrequest #changelog .comment p { padding:5px; margin:0; color:#333; } + +.pullrequest div.change form#trac-comment-editor { position:relative; right:0; margin:12px } +.pullrequest h2#trac-add-comment, .pullrequest .trac-nav { display:none } +.pullrequest fieldset.iefix { padding:6px; background:#EEE; border-radius:3px; } +.pullrequest fieldset.iefix h3 { font-size:13px; line-height:1.4; color:#333; margin:0 5px } + +.pullrequest #propertyform .btn[type=submit] { padding:8px 15px; } +.pullrequest #modify { background-color:#EEE; padding:12px; } +.pullrequest #ticketchange.ticketdraft { padding:1em; background:none; background-color:#FBFBFB } +.pullrequest #ticketchange.ticketdraft .comment { margin:1em } +.pullrequest #ticketchange.ticketdraft .comment blockquote.citation { margin:12px 0; } +.pullrequest #ticketchange.ticketdraft .comment blockquote.citation p { font-size:13px } + +.pullrequest .ticket .side-avatar { position:absolute; float:left; margin-left:-60px } + +table.commits { margin: 0; font-size:12px; } + +.pull-participation { margin: -10px 0 15px; font-size: 13px; font-weight: 300; color: #666; } +.pull-participation p.quickstat { display: inline-block; margin: 0 5px 0 0; } +.pull-participation a { color: #666; } +.pull-participation .avatar { position: relative; display: inline-block; height: 24px; top: -2px; margin-right: 3px; margin-bottom: 3px; } +.pull-participation .avatar img { vertical-align: middle; } + +/* action-bubble part is also used in commits.html */ + +.action-bubble { margin: 20px 0; } +.action-bubble .action { float: left; line-height: 29px; } +.action-bubble .state-indicator { display: inline-block; margin-right: 8px; font-size: 12px; padding: 0 5px; line-height: 24px; } +.state-indicator.closed { background: #BD2C00; } +.state-indicator { display: block; font-size: 14px; font-weight: bold; color: white; text-align: center; border-radius: 3px; background: #999; } +.action-bubble .bubble { font-size: 13px; font-weight: 300; background-color: transparent; } +.bubble { padding: 3px; background: #EEE; border-radius: 3px; } +.action-bubble .bubble p { margin: 0; line-height: 26px; } +.action-bubble .bubble strong { font-weight: bold; } +.action-bubble .avatar { position: relative; top: -2px; display: inline-block; height: 24px; margin-right: 3px; line-height: 1px; } +.action-bubble .avatar img { vertical-align: middle; } +.state-indicator.open, .state-indicator.reopened, .state-indicator.merged { background: #6CC644; } + +/* the following action-bubble style seems only used in commits.html */ + +.action-bubble .state-renamed { +color: black; +background-color: #FFFA5D; +text-shadow: none; +} +.action-bubble .state { +display: inline-block; +padding: 0 5px; +height: 24px; +line-height: 25px; +text-shadow: 0 -1px -1px rgba(0, 0, 0, 0.25); +} +.action-bubble .state { +float: none; +padding: 3px 5px; +font-size: 11px; +} + + +.closed-banner { margin: 15px 0; height: 7px; overflow: hidden; background: url("/static/img/closed_pattern.gif"); border-radius: 5px; } + +.change-header .change-header-right { float: right; height:15px; } +.change-header .change-header-date { display: inline-block; margin: 0; height: 33px; font-size: 11px; font-style: normal; color: #777; text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.7); } + +.pullrequest .ticket #ticket { padding:0 } +.discussion-bubble-avatar { position: relative; float: left; border-radius: 3px; } +.discussion-bubble-inner { min-height: 60px; border: 1px solid #CACACA; background-color: white; } + +.pullrequest #changelog .change .change-header { height:23px; color:#333; margin:0; font-size:12px; text-shadow:1px 1px 0 rgba(255, 255, 255, 0.7); white-space:nowrap; text-overflow:ellipsis; padding:3px 10px 0 6px; border-bottom:1px solid #CCC; background:-webkit-linear-gradient(#F8FBFC, #DDE8EB); background-image: -webkit-linear-gradient(#F8F8F8, #E1E1E1); background-image: linear-gradient(#F8F8F8, #E1E1E1); -ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#f8fbfc', endColorstr='#dde8eb')"; } + +.comment-content .comment-body, .pullrequest .ticket #ticket .comment-content .comment-body { padding: 10px; font-size: 13px; overflow: auto; width: 100%; -moz-box-sizing: border-box; box-sizing: border-box; } +.comment-content .comment-body, .pullrequest #changelog .comment p { font-size: 13px; } + +.user-mention, .team-mention { font-weight: bold; color: #333; } + +.change #files .file { border: none; } + diff --git a/hub/static/css/mod/pull-tabs.scss b/hub/static/css/mod/pull-tabs.scss new file mode 100644 index 0000000..80e7ff6 --- /dev/null +++ b/hub/static/css/mod/pull-tabs.scss @@ -0,0 +1,65 @@ +/* tabs */ + +ul.smalltabs { + margin: 15px 0 15px 0; + height: 24px; + line-height: 24px; + font-size: 12px; + color: #555; + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.5); + background: #E8E8E8; + background: -moz-linear-gradient(#E8E8E8, #D2D2D2); + background: -webkit-linear-gradient(#E8E8E8, #D2D2D2); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#e8e8e8',endColorstr='#d2d2d2')"; + border: 1px solid #D1D1D1; + border-bottom-color: #BBB; + border-radius: 3px; +} +ul.smalltabs li { + list-style-type: none; + display: inline; + line-height: 24px; +} +ul.smalltabs li:first-child a.selected { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} +ul.smalltabs li:first-child a { + border-left: none; +} +ul.smalltabs li.active a { + color: #333; + background: white; + background: -moz-linear-gradient(white, #F2F2F2); + background: -webkit-linear-gradient(white, #F2F2F2); +} +ul.smalltabs a { + float: left; + height: 24px; + padding: 0 7px; + color: #666; + font-weight: bold; + text-decoration: none; + border-right: 1px solid #ABABAB; + border-left: 1px solid #F6F6F6; +} +ul.smalltabs .mini-icon { + vertical-align: middle; + color: #888; +} +ul.smalltabs .counter { + display: inline-block; + position: relative; + top: -1px; + margin-left: 2px; + line-height: 12px; + padding: 1px 3px 0 3px; + font-size: 9px; + background: #ECECEC; + border: 1px solid #AFAFAF; + border-right-color: #ECECEC; + border-bottom-color: #ECECEC; + border-radius: 2px; +} + + diff --git a/hub/static/css/mod/pull-ticket.scss b/hub/static/css/mod/pull-ticket.scss new file mode 100644 index 0000000..4ed164c --- /dev/null +++ b/hub/static/css/mod/pull-ticket.scss @@ -0,0 +1,141 @@ +/* ticket style */ +#content.ticket { + width: 63em; + max-width: 100%; + margin-left: auto; +} + +#field-description-help { float: right } +#properties div.trac-resizable, #field-description { width: 100% } + +#ticket { + background: #ffd; + border: 1px outset #996; + margin-top: 1em; + padding: .5em 1em; + position: relative; +} + +#ticket.ticketdraft { + background: #f8f8f8 url(../draft.png); +} +#ticketchange.ticketdraft { + padding: 0 1em; + margin: 1em 0; +} +#ticketchange.ticketdraft h3 { + margin-top: .5em; +} +.preview-notice { font-weight: bold; } + +.ticketdraft { + background: #f8f8f8 url(../draft.png); + border: 1px outset #996; + padding: 0 .2em; +} + +h1 .status { color: #444; } +#ticket h2.summary { margin: 0 0 .8em 0 } +#ticket .date { color: #996; float: right; font-size: 85%; position: relative } +#ticket .date p { margin: .3em } + +#ticket table.properties { + clear: both; + border-top: 1px solid #dd9; + border-collapse: collapse; + table-layout: fixed; + width: 100%; +} +#ticket table.properties tr { border-bottom: 1px dotted #eed } +#ticket table.properties td, #ticket table.properties th { + font-size: 80%; + padding: .5em 1em; + vertical-align: top; +} +#ticket table.properties th { + color: #663; + font-weight: normal; + text-align: left; + width: 20%; +} +#ticket table.properties td { width: 30% } +#ticket table.properties td p:first-child { margin-top: 0 } +#ticket table.properties td p:last-child { margin-bottom: 0 } +#ticket table.properties .description { border-top: 1px solid #dd9 } + +#ticket .description h3 { + border-bottom: 1px solid #dd9; + color: #663; + font-size: 100%; + font-weight: normal; +} +#ticket .description h3 .lastmod { + font-size: 90%; +} +#ticket .inlinebuttons { + float: right; + position: relative; + bottom: 0.3em; + margin-left: 0.2em; +} + +#changelog { border: 1px outset #996; padding: 1em } +.trac-shade { background-color: #eee } +#trac-comment-editor { margin-left: 2em; margin-bottom: 1em } +#trac-comment-editor div.trac-resizable { width: 100% } +#trac-comment-editor textarea { + background: #ffffe0; + margin-left: -1px; + margin-right: -1px; + width: 100%; +} +#trac-comment-editor .wikitoolbar { margin-left: -1px } +#trac-add-comment :link, #trac-add-comment :visited { color: #b00 } +#changelog h3, #ticketchange h3 { + border-bottom: 1px solid #d7d7d7; + color: #999; + font-size: 100%; + font-weight: normal; +} +.threading, #changelog .inlinebuttons { float: right; margin-left: 0.2em } +.threading { font-size: 85%; } +.threading :link, .threading :visited { border-bottom: 0 } +#changelog .trac-lastedit { + padding-left: 2.5em; + color: #999; + font-size: 80%; +} +#changelog .trac-lastedit :link, #changelog .trac-lastedit :visited { color: inherit } + +#changelog .changes, #ticketchange .changes { list-style: square; margin-left: 2em; padding: 0 } +#changelog .comment, #ticketchange .comment { margin-left: 2em } + +form .field { margin-top: .75em; width: 100% } +form .field fieldset.iefix { margin-left: 1px; margin-right: 1px } +label[for=comment] { float: right } +form .field .wikitoolbar { margin-left: -1px } +form .field div.trac-resizable { width: 100% } + +#properties { white-space: nowrap; line-height: 160%; padding: .5em } +#properties table { border-spacing: 0; width: 100%; padding: 0 .5em } +#properties table th { + padding: .4em; + text-align: right; + width: 20%; + vertical-align: top; +} +#properties table th.col2 { border-left: 1px dotted #d7d7d7 } +#properties table td { vertical-align: middle; width: 30% } +#properties table td.fullrow { vertical-align: middle; width: 80% } + +#action { line-height: 2em } + +fieldset.radio { border: none; margin: 0; padding: 0 } +fieldset.radio legend { + color: #000; + float: left; + font-size: 100%; + font-weight: normal; + padding: 0 1em 0 0; +} +fieldset.radio label { padding-right: 1em } diff --git a/hub/static/css/mod/pullrequest-list.scss b/hub/static/css/mod/pullrequest-list.scss new file mode 100644 index 0000000..84bbf14 --- /dev/null +++ b/hub/static/css/mod/pullrequest-list.scss @@ -0,0 +1,134 @@ +@import "css/mod/filter-tabs"; +@import "css/mod/pagination"; + +.pulls { + margin: 20px 0; + h2 { + font-size: 16px; + font-weight: bold; + margin: 0; + } +} + +.row.pulls .mod p { + word-wrap: break-word; +} + +.pulls-list { + word-break:break-all; + h3 { + margin: 0; + font-size: 14px; + line-height: 1.3; + a { + color: #333; + } + } + .list-browser-item { + position: relative; + padding: 10px; + border-bottom: 1px solid #EAEAEA; + } + .meta { + float: left; + margin-top: 4px; + margin-bottom: -2px; + height: 16px; + padding: 4px 6px; + font-size: 11px; + color: rgba(0, 0, 0, 0.55); + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.5); + background: rgba(0, 0, 0, 0.07); + border-radius: 3px; + } + p a { + color: #555; + text-decoration: none; + } +} + +.chromed-list-browser { + border-color: #D5D5D5; + position: relative; + border: 1px solid #DDD; + border-radius: 5px; + .pagination { + float: right; + margin: 7px; + font-weight: bold; + height:26px; + a { + padding: 4px; + font-size: 11px; + color: #4183C4; + width:auto; + } + span { + padding: 4px; + font-size: 11px; + color: #4183C4; + } + } + .none, .error { + padding: 10px; + border-bottom: 1px solid #DDD; + p { + margin: 0; + padding: 20px; + border-radius: 3px; + text-align: center; + font-weight: bold; + font-size: 14px; + color: #999; + background: #F3F3F3; + -webkit-font-smoothing: antialiased; + } + } +} + + +.list-browser-item { + .list-browser-bottom-right-info { + position: absolute; + bottom: 3px; + right: 5px; + } + .list-browser-bottom-right-item { + padding-left: 18px; + font-size: 11px; + font-weight: bold; + color: #999; + a { + color: #666; + } + } +} + +.list-browser-filterbar { + font-family: "Helvetica Neue", Helvetica, Arial, freesans; + border-radius: 5px 5px 0 0; + height: 31px; + background-color: #CACACA; + background-image: -moz-linear-gradient(#EFEFEF, #CACACA); + background-image: -webkit-linear-gradient(#EFEFEF, #CACACA); + background-image: linear-gradient(#EFEFEF, #CACACA); + background-repeat: repeat-x; + border-bottom: 1px solid #B4B4B4; -moz-box-sizing: border-box; box-sizing: border-box; + li { + list-style-type: none; + display: inline; + } +} + +.list-browser-footer { + font-size: 11px; + font-weight: bold; + color: #777; + overflow: hidden; + min-height: 15px; + background: #F6F6F6; + border-radius: 0 0 5px 5px; + .pagination { + margin: 5px; + } +} diff --git a/hub/static/css/mod/pullrequest-pull-head-responsive.scss b/hub/static/css/mod/pullrequest-pull-head-responsive.scss new file mode 100644 index 0000000..7cc1197 --- /dev/null +++ b/hub/static/css/mod/pullrequest-pull-head-responsive.scss @@ -0,0 +1,5 @@ +@media (max-width: 767px) { + div.pull-head .pull-description p { + white-space: normal; + } +} \ No newline at end of file diff --git a/hub/static/css/mod/pullrequest-pull-head.scss b/hub/static/css/mod/pullrequest-pull-head.scss new file mode 100644 index 0000000..63ed4ad --- /dev/null +++ b/hub/static/css/mod/pullrequest-pull-head.scss @@ -0,0 +1,15 @@ +div.pull-head .pull-description .css-truncate-target+.css-truncate-target { max-width:125px; } +div.pull-head .pull-description p .commit-ref .user { color: #CCC; } +div.pull-head { margin:20px 0; background-color:#FAFAFA; border:1px solid #EEE; border-bottom-width:2px; border-radius:3px } +div.pull-head .pull-description .attention-icon { position: relative; float: left; margin: 4px 10px 0 0; } +div.pull-head .pull-description p { padding-left:10px; position:relative; float:left; margin:0; line-height:36px; font-size:13px; max-width:690px; white-space:nowrap } +div.pull-head .pull-description p .user { font-weight:bold; color:#333 } + +div.pull-head .pull-description p { + padding-left: 0; +} + +div.pull-head .pull-description .pull-state { float: left; padding: 8px; margin-right: 8px; border-right: 1px solid #EEE; line-height: 20px; } +div.pull-head .pull-description .state-indicator { font-size: 13px; display: inline-block; height: 20px; line-height: 20px; padding: 0 5px; } + +.commit-ref { position: relative; height: 20px; display: inline-block; padding: 0 5px; border: 1px solid black; border-radius: 3px; font: 10px/20px Monaco,"Liberation Mono",Courier,monospace; color: white; white-space: nowrap; vertical-align: middle; background-color: #222; background-image: -moz-linear-gradient(#444, #222); background-image: -webkit-linear-gradient(#444, #222); background-image: linear-gradient(#444, #222); background-repeat: repeat-x; } diff --git a/hub/static/css/mod/quick-emoji.scss b/hub/static/css/mod/quick-emoji.scss new file mode 100644 index 0000000..0f023b4 --- /dev/null +++ b/hub/static/css/mod/quick-emoji.scss @@ -0,0 +1,30 @@ +.quick-emoji { + margin-right:10px; + + .description{ + text-align:center; + color:#999; + } + + .emojis { + overflow-x:hidden; + overflow-y:scroll; + word-wrap:break-word; + word-break:break-all; + width:290px; + height:260px; + + a { + display:block; + float:left; + width:25px; + height:25px; + padding:2px; + border:1px solid white; + &:hover { + background:#eef; + border:1px solid #aad; + } + } + } +} diff --git a/hub/static/css/mod/repository-lang-stats.scss b/hub/static/css/mod/repository-lang-stats.scss new file mode 100644 index 0000000..f4f42d6 --- /dev/null +++ b/hub/static/css/mod/repository-lang-stats.scss @@ -0,0 +1,87 @@ +@charset "UTF-8"; +.metabox { + display: inline-block; + height: 8px; + background: #ccc; + text-indent: -9999px; + font-size: 12px; +} +.repository-lang-stats { + font: 13px Helvetica, arial, freesans, clean, sans-serif; + line-height: 1.4; + margin: 0; + padding: 0; + border: 0; + position: relative; + float: right; + width: 135px; + opacity: 0.5; + padding-bottom: 10px; +} +.repository-lang-stats:hover { + opacity: 1; +} +.repository-lang-stats:hover .list-tip { + display: block; +} +.repository-lang-stats a { + color: #4183c4; + text-decoration: none; +} +.repository-lang-stats-graph { + height: 10px; + overflow: hidden; +} +.repository-lang-stats-graph span { + display: inline-block; + height: 6px; + background: #ccc; + text-indent: -9999px; + float: left; +} +ol.list-tip, ul.list-tip { + border-radius: 3px; + box-shadow: 0 0 5px #ccc; + border: 1px solid #ddd; + background: #fff; + position: absolute; + padding-left: 0px; + top: 20px; + left: -20px; + width: 175px; + z-index: 100; + display: none; + margin-top: 0px; +} +ol.list-tip:before, ul.list-tip:before { + content: "▲"; + font-size: 14px; + margin: 0 auto; + width: 14px; + display: block; + margin-top: -13px; + color: #fff; + text-shadow: -1px -1px 2px #ccc; +} +ol.list-tip li, ul.list-tip li { + margin: 0; + line-height: 100%; + list-style: none; + border-bottom: 1px solid #eee; + font-weight: bold; +} +ol.list-tip li a, ol.list-tip li .other, ul.list-tip li a, ul.list-tip li .other { + color: #333; + padding: 8px 10px; + display: block; +} +ol.list-tip li span.color-block, ul.list-tip li span.color-block { + display: inline-block; + width: 8px; + height: 10px; + margin-right: 5px; +} +ol.list-tip li span.percent, ul.list-tip li span.percent { + float: right; + color: #999; +} diff --git a/hub/static/css/mod/reset.scss b/hub/static/css/mod/reset.scss new file mode 100644 index 0000000..3cf61af --- /dev/null +++ b/hub/static/css/mod/reset.scss @@ -0,0 +1,25 @@ +ul, ol { + list-style-type:none; + display:block; + margin:0; +} + +.clear { clear: both; } + +.clearfix { + display: block; + &:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; + } +} + +/* hacks for adopting new version of bootstrap */ +h3 { + line-height: 27px; +} + +input[type="checkbox"] { margin:0; } \ No newline at end of file diff --git a/hub/static/css/mod/rightside.scss b/hub/static/css/mod/rightside.scss new file mode 100644 index 0000000..9ec3c60 --- /dev/null +++ b/hub/static/css/mod/rightside.scss @@ -0,0 +1,71 @@ + +/* Timeline */ +@media (max-width: 767px){ + .rightside { padding: 10px; } +} + +.rightside { + margin-top:0px; + word-wrap: break-word; + word-break: normal; + margin-bottom: 20px; + li { + position: relative; + list-style: none; + clear: both; + background: rgba(255,255,255,1); + padding: 1px 15px 10px 10px; + margin: 0 0 0px; + border-bottom: 1px solid #eaeaea; + + .title{ + margin-bottom: 0.5em; + i{ + position: absolute; + left: 5px; + padding: 2px 5px 0; + color: #999; + font-size: 10px; + } + } + } + + .time{ + float: right; + color: #ccc; + font-size: 12px; + } +} + +.rightside .padding { + height:2em; + font-weight:bold; +} + +.rightside .more_items { + margin-left:10px; + font-weight:bold; +} + +.rightside .time { color: #bbb; } + +.rightside .desc { + padding: 0 0 1em 0; + color:#666; + word-wrap: break-word; +} + +.rightside .desc .right_side { + float:right; + margin-right:30px; +} + +div.right-tittle { + color: gray; + background: rgba(99,182,174,0.2); + text-align: center; + padding-top: 6px; + padding-bottom: 6px; + font-size:14px; + font-weight: bold; +} diff --git a/hub/static/css/mod/setting-box.scss b/hub/static/css/mod/setting-box.scss new file mode 100644 index 0000000..12ac0a8 --- /dev/null +++ b/hub/static/css/mod/setting-box.scss @@ -0,0 +1,52 @@ +.boxed-group { + position: relative; + background: #EFEFEF; + padding: 3px; + border-radius: 3px; + margin: 0 0 15px 0; +} +.boxed-group > h3 { + background: #FAFAFA; + background: -moz-linear-gradient(#FAFAFA, #E0E0E0); + background: -webkit-linear-gradient(#FAFAFA, #E0E0E0); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#e0e0e0')"; + margin: 0; + border-top-left-radius: 1px; + border-top-right-radius: 1px; + border: 1px solid #D8D8D8; + border-bottom: 1px solid #CCC; + padding: 10px 10px 11px 10px; + font-size: 14px; + text-shadow: 0 1px 0 white; +} +.boxed-group .boxed-group-inner { + padding: 1px 10px; + background: white; + border: 1px solid #D8D8D8; + border-top: none; + border-bottom-left-radius: 1px; + border-bottom-right-radius: 1px; + color: #666; + font-size: 13px; +} +.boxed-group.condensed > h3 { + padding: 6px 6px 7px; + font-size: 12px; +} +.boxed-group.condensed > h3 i { + position: relative; + padding: 0 6px 0 2px; +} +.boxed-group.condensed .boxed-group-inner { + font-size: 12px; + padding: 0; +} + +.boxed-group-list > li { + display: block; + margin-left: -10px; + width: 100%; + padding: 5px 10px; + line-height: 23px; + border-bottom: 1px solid #E5E5E5; +} diff --git a/hub/static/css/mod/side-item.scss b/hub/static/css/mod/side-item.scss new file mode 100644 index 0000000..bf30bce --- /dev/null +++ b/hub/static/css/mod/side-item.scss @@ -0,0 +1,102 @@ +/* Item Listing */ +.items { + margin-top: 27px; + border: 1px solid #DDD; + border-radius: 5px; +} +.items .top-bar { + position: relative; + height: 44px; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa,#eaeaea); + background: -ms-linear-gradient(#fafafa,#eaeaea); + background: -webkit-gradient(linear,left top,left bottom,color-stop(0%,#fafafa),color-stop(100%,#eaeaea)); + background: -webkit-linear-gradient(#fafafa,#eaeaea); + background: -o-linear-gradient(#fafafa,#eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa,#eaeaea); + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border-bottom: 1px solid #e1e1e2; +} + +.items .top-bar h2 { + margin: 0; + height: 44px; + line-height: 44px; + padding: 0 10px; + font-size: 16px; + color: #52595d; + border-bottom: 1px solid #D7D7D7; + background-color: #fafafa; + background: -moz-linear-gradient(#fafafa,#eaeaea); + background: -ms-linear-gradient(#fafafa,#eaeaea); + background: -webkit-gradient(linear,left top,left bottom,color-stop(0%,#fafafa),color-stop(100%,#eaeaea)); + background: -webkit-linear-gradient(#fafafa,#eaeaea); + background: -o-linear-gradient(#fafafa,#eaeaea); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea')"; + background: linear-gradient(#fafafa,#eaeaea); +} + +.items .top-bar .actions { + float: right; + margin-top: 10px; + margin-right: 5px; +} + +.items h2 em { + color: #99A4AA; + font-style: normal; +} +.items input { + margin-bottom: 0; +} +.items ul.item_list { + margin: 0; +} +.items .item_list li { + border: none; + color: #666; + border-bottom: 1px solid #E5E5E5; + padding: 6px 10px 5px 12px; +} + +.items .item_list li a.action { + float: right; +} +.items .item_list li a.item { + font-weight: bold; +} +.items .bottom-bar { + min-height: 13px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + background-color: #FAFAFB; +} + +/* Item Listing using flatui*/ +ul .inline-left { + float: right; + padding: 0 5px 0 5px; +} + +.dull-comment { + font-size: 11px; + color: #999; + margin: 0; + line-height: 20px; +} + +.nav .top-bar { + margin: 15px 0 0 15px; + font-size: 15px; + position: relative; +} + +.nav-list li { + line-height: 27px; +} + +.nav-list li a.item { + display: inline; +} diff --git a/hub/static/css/mod/source-code-pro.scss b/hub/static/css/mod/source-code-pro.scss new file mode 100644 index 0000000..905dca9 --- /dev/null +++ b/hub/static/css/mod/source-code-pro.scss @@ -0,0 +1,24 @@ +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 400; + src: local('Source Code Pro'), local('SourceCodePro-Regular'), url('/static/css/fonts/SourceCodePro-Regular.woff') format('woff'); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 500; + src: local('Source Code Pro Medium'), local('SourceCodePro-Medium'), url('/static/css/fonts/SourceCodePro-Medium.woff') format('woff'); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 600; + src: local('Source Code Pro Semibold'), local('SourceCodePro-Semibold'), url('/static/css/fonts/SourceCodePro-Semibold.woff') format('woff'); +} +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 700; + src: local('Source Code Pro Bold'), local('SourceCodePro-Bold'), url('/static/css/fonts/SourceCodePro-Bold.woff') format('woff'); +} diff --git a/hub/static/css/mod/source-edit.scss b/hub/static/css/mod/source-edit.scss new file mode 100644 index 0000000..35710ee --- /dev/null +++ b/hub/static/css/mod/source-edit.scss @@ -0,0 +1,25 @@ +.raw { overflow: visible } +div.helpop { + float: right; + width:137px; height:140px; + margin-top: -140px; + margin-right: 20px; + overflow:hidden; position:relative; +} +div.helpop .popic { + display:block; + position:absolute; + bottom:-115px; + -webkit-transition: all 300ms ease-out; + -moz-transition: all 300ms ease-out; + -o-transition: all 300ms ease-out; + -ms-transition: all 300ms ease-out; +} + +div.helpop:hover .popic { + bottom:-10px; + -webkit-transition: all 300ms ease-out; + -moz-transition: all 300ms ease-out; + -o-transition: all 300ms ease-out; + -ms-transition: all 300ms ease-out; +} diff --git a/hub/static/css/mod/source.scss b/hub/static/css/mod/source.scss new file mode 100644 index 0000000..ea560d3 --- /dev/null +++ b/hub/static/css/mod/source.scss @@ -0,0 +1,119 @@ +@font-face{ + font-family: 'Octicons Regular'; + src:url("/static/octicons/octicons-regular-webfont.svg") format("svg"), + url("/static/octicons/octicons-regular-webfont.woff") format("woff"); + font-weight:normal; + font-style:normal; +} +.last-bar { + margin-top: 5px; +} +p.last-commit { + margin: 10px 0 -5px 0; + font-size: 11px; + color: #888; + + .mini-icon { + color: #BBB; + position: relative; + top: 1px; + } +} +.pr-latest-branch { + color: #888; + margin-top: 10px; + line-height: 27px; + border-bottom: 1px solid #DDD; + padding-bottom: 10px; +} +.pr-latest-branch #pullrequest-btn { + margin-right: 5px; +} +.mini-icon, .mega-icon { + line-height: 1; + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + line-height: 1; + -webkit-font-smoothing: antialiased; + text-decoration: none; +} +.commit-tease { + margin: 10px 0; + padding: 8px 8px 0; + background: #EEE; + border: 1px solid #C5D5DD; + border-radius: 4px; +} +.commit-tease p.commit-title { + margin: 0 0 6px 0; +} +.commit .commit-title, .commit .commit-title a { + color: #4E575B; +} +.commit-tease .commit-meta { + margin-left: -8px; + width: 100%; + padding: 8px; + background: white; + border-top: 1px solid #D8E6EC; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.commit-tease .sha-block { + float: right; + color: #888; +} +.commit .sha-block, .commit .sha { + font-size: 11px; + font-family: Monaco,"Courier New","DejaVu Sans Mono","Bitstream Vera Sans Mono",monospace; +} +.commit-tease .authorship { + font-size: 12px; + color: #999; + margin-left: -4px; + margin-bottom: -4px; + margin-top: -2px; + .gravatar { + margin-top: -2px; + margin-right: 3px; + vertical-align: middle; + border-radius: 3px; + } + a, span { + color: #444; + text-decoration: none; + font-weight: bold; + &:hover { + text-decoration: underline; + } + } +} + +.commit-tease .mini-icon-clippy { + margin-right: 5px; + float: right; +} +.mini-icon-clippy { + display: inline-block; + height: 16px; + width: 16px; + background-color: transparent; + background-position: 0 0; + background-repeat: no-repeat; + vertical-align: text-bottom; + background-image: url("/static/img/clippy.png"); +} +.mini-icon-u-list:before { content:"\f061"; } +.mini-icon-text-file:before { content:"\f211"; } +.mini-icon-code-file:before { content:"\f210"; } +.mini-icon-directory:before { content:"\f016"; } +.mini-icon-submodule:before { content:"\f017"; } + +ul.browsefiles li { padding: 3px 0 2px 0; border-top: 1px solid #eee } +ul.browsefiles a.mode-040000{ color: #333 } +ul.browsefiles li a { display: block } +ul.browsefiles li:hover { background: #eee } +ul.browsefiles li a.warn-bad { color: red } diff --git a/hub/static/css/mod/subnav.scss b/hub/static/css/mod/subnav.scss new file mode 100644 index 0000000..a22ac4c --- /dev/null +++ b/hub/static/css/mod/subnav.scss @@ -0,0 +1,74 @@ +/* Subnav */ +.nav-pills li { list-style-display:none; float:none; width:1%; display:table-cell; text-align:center; } +.nav-pills li a .counter { position:relative; top:-1px; display:inline-block; height:14px; margin:0 0 0 5px;padding:0 8px 0px 8px; height:auto; font-family:Helvetica,arial,freesans,clean,sans-serif; font-size:10px; line-height:12px; text-align:center; color:#777; background:white; border-top:1px solid #CCC; border-radius:8px; } + +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; /* Old browsers */ + background-repeat: repeat-x; /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f5f5f5), color-stop(100%,#eeeeee)); /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%,#eeeeee 100%); /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%,#eeeeee 100%); /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%,#eeeeee 100%); /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%,#eeeeee 100%); /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.subnav .nav { + margin-bottom: 0; + font-weight: bold; +} +.subnav .nav > li > a { + display: block; + margin: 0; + padding-top: 11px; + padding-bottom: 10px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + color: #777; + font-size: 12px; + text-shadow: 0 1px 0 white; + text-decoration: none; + padding-left: 5px; + padding-right: 5px; +} +.subnav .nav > .active a { + border-bottom: 2px solid #D26911; +} +.subnav .nav > .active a.tab_docs { + border-bottom-color: #34833E; +} +.subnav .nav > .active > a, +.subnav .nav > .active > a:hover { + padding-left: 13px; + color: black; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0,0,0,.05); + -moz-box-shadow: inset 0 3px 5px rgba(0,0,0,.05); + box-shadow: inset 0 3px 5px rgba(0,0,0,.05); +} +.subnav .nav > .active > a .caret, +.subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} +.subnav .nav > li:first-child > a, +.subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.subnav .nav > li:last-child > a { + border-right: 0; +} diff --git a/hub/static/css/mod/tag-list.scss b/hub/static/css/mod/tag-list.scss new file mode 100644 index 0000000..c2b96d0 --- /dev/null +++ b/hub/static/css/mod/tag-list.scss @@ -0,0 +1,149 @@ +%tag-filter-style { + background: rgba(99, 182, 174, 1); + background-image: none; + cursor:pointer; +} +%tag-hover-style { + background: rgba(99, 182, 174, 1); + color: rgba(255,255,255,1); + text-shadow: 0 -1px 0 rgba(0,0,0,0.2); + border-radius: 4px; +} +.issue-tags { + padding: 8px 0; + ul { + li { + line-height: 20px; + a:hover { + @extend %tag-hover-style; + } + .tag-filter { + @extend %tag-filter-style; + } + .tag-remove, .icon-remove, .icon-white { + @extend %tag-filter-style; + float:right; + } + } + .tag-filter { + @extend %tag-filter-style; + } + .tag-remove, .icon-remove, .icon-white { + @extend %tag-filter-style; + float:right; + } + a:hover { + @extend %tag-hover-style; + } + } + ul li.active{ + a { + border-radius: 4px; + } + } + .nav-header { + margin-bottom: 8px; + } + .tag-admin { + float: right; + cursor:pointer; + font-weight: 400; + } + .tag-admin-unuse { + color: rgba(99, 182, 174, 1); + } + .tag-admin-using { + color: #999; + } + .nav-list-edit .tag-item { + display: block; + padding: 3px 1px; + color: #08c; + } +} + +/* edit tag */ +ul.color-chooser .color-cooser-color { + display: block; + text-align: center; + height: 25px; + cursor: pointer; + box-sizing: border-box; + border: solid 2px transparent; +} +.edit-color-label-form.open .color-chooser, .edit-color-label-form.open .color-editor { + display: block; +} +ul.color-chooser { + height: 25px; + list-style-type: none; + display: table-row; +} +ul.color-chooser li { + display: table-cell; + width: 1%; + vertical-align: top; +} +.fieldWithErrors { + display: inline; +} +.edit-color-label-form .color-editor-bg { + position: absolute; + left: 0; + height: 25px; + width: 130px; + opacity: 0.12; + border-radius: 3px; +} +.edit-color-label-form .color-editor .color-editor-input { + position: absolute; + left: 0; + background-color: transparent; + min-height: 25px; + border-left-width: 26px; + padding-top: 3px; + padding-bottom: 3px; + width: 130px; +} +.edit-color-label-form .color-editor .invalid-color-indicator { + display: none; + position: absolute; + top: 5px; + left: 9px; + color: #c00; + z-index: 10; + font-weight: bold; +} +.edit-color-label-form .color-editor { + margin-top: 5px; + position: relative; + height: 25px; + margin-bottom: 10px; +} +.edit-color-label-form .color-editor .invalid-color-indicator { + display: none; + position: absolute; + top: 5px; + left: 9px; + color: #c00; + z-index: 10; + font-weight: bold; +} +.edit-color-label-form input[type="text"] { + min-height: 34px; + padding: 7px 8px; + outline: none; + color: #333; + background-color: #fff; + background-repeat: no-repeat; + background-position: right center; + border: 1px solid #ccc; + border-radius: 3px; + box-shadow: inset 0 1px 2px rgba(0,0,0,0.075); + -moz-box-sizing: border-box; + box-sizing: border-box; + vertical-align: middle; +} +.edit-color-label-form.is-not-valid .color-editor .invalid-color-indicator { + display: block; +} diff --git a/hub/static/css/mod/team-card.scss b/hub/static/css/mod/team-card.scss new file mode 100644 index 0000000..1094a3f --- /dev/null +++ b/hub/static/css/mod/team-card.scss @@ -0,0 +1,84 @@ +.team-card { + position:absolute; + padding: 6px 10px; + min-height:68px; + width: 236px; + background-color:#fff; + border:1px solid #BEBEBE; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + overflow: hidden; + .pic { + float: right; + max-height: 50px; + margin: 6px 0 0 10px; + } + .content { + word-wrap: break-word; + .title { + margin: 6px 0; + font-size: 15px; + overflow: hidden; + white-space: nowrap; + } + .info { + position: relative; + margin-top: 10px; + font-size: 13px; + .desc { + white-space: nowrap; + overflow: hidden; + } + } + } +} + +.member { + border-top: solid 1px #eaeaea; + padding-top: 8px; + height: 26px; + .more-members { + float: right; + width: 24px; + height: 24px; + line-height: 26px; + text-align: center; + border: 1px solid #eaeaea; + background: #eaeaea; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; + } + .members li { + float: left; + a { + display: block; + width: 26px; + height: 26px; + overflow: hidden; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; + img { + width: 26px; + height: 26px; + } + } + } +} + +.cf { + zoom: 1; + &:before { + content: ""; + display: table; + } + .cf:after { + clear: both; + content: ""; + display: table; + } +} \ No newline at end of file diff --git a/hub/static/css/mod/team-header.scss b/hub/static/css/mod/team-header.scss new file mode 100644 index 0000000..066229a --- /dev/null +++ b/hub/static/css/mod/team-header.scss @@ -0,0 +1,26 @@ +.pagehead { + .team-left { + margin: 0; + font-size: 30px; + line-height: 36px; + float: left; + } + .team-desc { + p { + small { + padding: 0 6px; + background: rgba(99,182,174,0.2); + color: rgba(99,182,174,1); + } + margin: 0; + } + margin-top: 12px; + margin-left: 5px; + margin-bottom: 0; + width: 60%; + float: left; + } + .team-right { + float: right; + } +} diff --git a/hub/static/css/mod/team-item.scss b/hub/static/css/mod/team-item.scss new file mode 100644 index 0000000..8f24789 --- /dev/null +++ b/hub/static/css/mod/team-item.scss @@ -0,0 +1,71 @@ +.bs-docs-team:after { + content: "Team"; +} +.team-item { + position: relative; + margin: 15px 0; + padding: 14px 19px 14px 49px; + *padding-top: 14px; + background-color: transparent; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + &:after { + position: absolute; + top: -1px; + left: -1px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + background-color: #f5f5f5; + border: 1px solid #ddd; + color: #9da0a4; + -webkit-border-radius: 4px 0 4px 0; + -moz-border-radius: 4px 0 4px 0; + border-radius: 4px 0 4px 0; + } + h4.team-title { + margin: 0; + i { + margin-top: 5px; + } + } + ul.team-stats li { + float: left; + margin-left: 10px; + } + .team-item .summary { + margin-top: 10px; + } +} + +.team-user-list { + height: 26px; + margin-bottom: 1px; + list-style: none; + display: block; + ul{ + float: right; + margin-right: 10px; + margin-top: 0px; + } + li { + float: left; + margin-left: 10px; + line-height: 20px; + a { + display: block; + width: 26px; + height: 26px; + overflow: hidden; + -webkit-border-radius: 4px; + border-radius: 4px; + text-decoration: none; + img { + width: 26px; + height: 26px; + } + } + } +} diff --git a/hub/static/css/mod/text-truncate.scss b/hub/static/css/mod/text-truncate.scss new file mode 100644 index 0000000..94e32eb --- /dev/null +++ b/hub/static/css/mod/text-truncate.scss @@ -0,0 +1,16 @@ +@mixin text-truncate($width){ + max-width: $width; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.css-truncate.css-truncate-target, .css-truncate .css-truncate-target { + @include text-truncate(125px); + vertical-align: top; + display: inline-block; +} + +.css-truncate.expandable:hover .css-truncate-target { + max-width:10000px !important; +} diff --git a/hub/static/css/mod/timeline.scss b/hub/static/css/mod/timeline.scss new file mode 100644 index 0000000..f8c02b6 --- /dev/null +++ b/hub/static/css/mod/timeline.scss @@ -0,0 +1,114 @@ +@import "css/mod/user-card"; +@import "css/mod/team-card"; + +/* Timeline */ +@media (max-width: 767px){ + .timeline { padding: 10px; } +} + +.timeline { + margin-top:0px; + word-wrap: break-word; + word-break: normal; + + li { + position: relative; + list-style: none; + clear: both; + background: rgba(255,255,255,1); + padding: 10px 20px 10px 32px; + margin: 0 0 0px; + border-bottom: 1px solid #eaeaea; + + .title { + margin-bottom: 0.5em; + i { + position: absolute; + left: 5px; + padding: 2px 5px 0; + color: #999; + font-size: 10px; + } + } + } + + .time { + float: right; + color: #ccc; + font-size: 12px; + } + + code { + white-space: normal; + } +} + +.timeline .padding { + height: 2em; + font-weight: bold; +} +.timeline .more_items { + margin-left: 10px; + font-weight: bold; +} +.timeline .time { + color: #bbb; +} +.timeline .desc { + padding: 0 0 1em 0; + color: #666; + word-wrap: break-word; +} +.timeline .desc .right_side { + float: right; + margin-right: 30px; +} + +.timeline .pagination { + display: none; + background: rgba(99, 182, 174, 1); +} +.pagination { + display: block; + margin: 7px 0; + overflow: hidden; + border: 1px solid #EAEAEA; + border-bottom-color: #CACACA; + border-top: none; + border-bottom: none; + border-radius: 3px; + background-image: -webkit-linear-gradient(top, white, #EFEFEF); +} +.timeline .pagination a { + color: rgba(255,255,255,1); +} +.pagination a { + padding: 8px; + width: 100%; + text-align: center; + line-height: 1.4; +} +.pagination a:last-child, .pagination span:last-child { + border-right: none; + border-bottom-right-radius: 3px; +} +.pagination a:first-child, .pagination span:first-child { + border-left: none; + border-bottom-left-radius: 3px; +} +.pagination a, .pagination span { + float: left; + margin: 0; + color: #777; + font-size: 13px; + text-decoration: none; + text-shadow: 0 1px 0 white; + border-bottom: 1px solid #DADADA; +} +.timeline .loader img { + display: block; + width: 16px; + height: 16px; + margin: 0 auto; + position: relative; +} diff --git a/hub/static/css/mod/upload-widget.scss b/hub/static/css/mod/upload-widget.scss new file mode 100644 index 0000000..2214f2b --- /dev/null +++ b/hub/static/css/mod/upload-widget.scss @@ -0,0 +1,19 @@ +.upload-widget{ + + position: relative; + top: -50px; + width:360px; + + input { + position: absolute; + width: 120px;; + opacity: 0.0001; + cursor: pointer; + margin:0; + } + + form { + width:120px; + float:left; + } +} diff --git a/hub/static/css/mod/user-avatar.scss b/hub/static/css/mod/user-avatar.scss new file mode 100644 index 0000000..ff558a9 --- /dev/null +++ b/hub/static/css/mod/user-avatar.scss @@ -0,0 +1,26 @@ +.user-avatar-mini { + width: 12px; + height: 12px; +} + +img.avatar { + margin-right: 5px; + vertical-align: middle; +} +img.avatar.tiny { + width: 16px; + height: 16px; +} +img.avatar.small { + width: 20px; + height: 20px; +} +img.avatar.medium { + width: 40px; + height: 40px; +} + +.avatar img { + border-radius: 3px; +} + diff --git a/hub/static/css/mod/user-card.scss b/hub/static/css/mod/user-card.scss new file mode 100644 index 0000000..92c20a7 --- /dev/null +++ b/hub/static/css/mod/user-card.scss @@ -0,0 +1,6 @@ +.user-card { position:absolute; padding: 3px 5px 5px; min-height:68px; width: 210px; background-color:#fff; border:1px solid #BEBEBE; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1) } +.user-card .desc { margin-left:3px } +.user-card .avatar-wrap { width: 46px; height: 36px; float: left; margin-right: 6px; border-right:1px solid #BEBEBE;} +.user-card .badge-item { float:left; width:30px; height:30px; border:none; padding:2px; background-color:white; line-height:0; margin-right:.7em } +.user-card .title { padding: 0 0 .25em 0 } +.user-card .desc .avatar { float:left; width:30px; height:30px; padding:2px; background-color:white; line-height:0; margin-right:.7em } diff --git a/hub/static/css/mod/user-list.scss b/hub/static/css/mod/user-list.scss new file mode 100644 index 0000000..ea7bc91 --- /dev/null +++ b/hub/static/css/mod/user-list.scss @@ -0,0 +1,7 @@ +.user-list { border-top: 1px solid rgba(0, 0, 0, 0.05); list-style: none; } +.user-list li { border-bottom: 1px solid rgba(0, 0, 0, 0.05); line-height: 26px; padding: 6px 0 6px 30px; position: relative; } +.user-list li a { font-weight: bold; color: #4183C4; } +.user-list li img { border-radius: 3px; margin-top: 1px; position: absolute; left: 0; border: 0; } +.user-list li .actions { position: absolute; top: 6px; right: 0; } +.user-list li .actions a { color: #333; } +.user-list li .actions a:hover { color: #FFF; } diff --git a/hub/static/css/mod/watched-projects.scss b/hub/static/css/mod/watched-projects.scss new file mode 100644 index 0000000..2d18ac1 --- /dev/null +++ b/hub/static/css/mod/watched-projects.scss @@ -0,0 +1,7 @@ +@import "css/mod/text-truncate"; + +.watched-projects{ + li { + @include text-truncate(300px); + } +} diff --git a/hub/static/css/mod/zen-forms.scss b/hub/static/css/mod/zen-forms.scss new file mode 100644 index 0000000..22c1dfa --- /dev/null +++ b/hub/static/css/mod/zen-forms.scss @@ -0,0 +1,10 @@ +@charset "UTF-8"; +@import "css/lib/zen-form"; + +.write-content .enable-fullscreen { position: absolute; top: 5px; right: 16px; color: #333333; opacity: .5; line-height: 1em; } +.mini-icon-fullscreen::before { content: ""; } +.fullscreen-overlay textarea, .zen-forms textarea { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; width: 100%; height: 100%; padding: 20px; border: 0; font-size: 21px; line-height: 1.6em; resize: none; -moz-transition: color 0.15s ease-in 0; -webkit-transition: color 0.15s ease-in 0; transition: color 0.15s ease-in 0; box-shadow: none; } +.zen-forms.light-theme textarea { background: #fff; color: #999999; } +.zen-forms .zen-forms-input-wrap { width:100%; height:100%; } +.zen-forms label[for^=zen-forms-input] { display:none; } + diff --git a/hub/static/css/search.css b/hub/static/css/search.css new file mode 100644 index 0000000..091d1e5 --- /dev/null +++ b/hub/static/css/search.css @@ -0,0 +1,627 @@ +.codesearch-head h1 { + float: left; + margin: 0 20px 0 0; + width: 220px; + line-height: 33px; + font-size: 20px; +} + +.codesearch-head .commandbar { + display: inline-block; + width: auto; +} + +.commandbar { + position: relative; +} + +.codesearch-head input { + width: 618px; + margin-right: 0; +} + +.codesearch-head button { + float: right; +} + +.codesearch-head input[type="text"] { + min-height: 34px; + padding: 7px 8px; + outline: none; + color: #333; + background-color: #fff; + background-repeat: no-repeat; + background-position: right center; + border: 1px solid #ccc; + border-radius: 3px; + box-shadow: inset 0 1px 2px rgba(0,0,0,0.075); + -moz-box-sizing: border-box; + box-sizing: border-box; + -moz-transition: all 0.15s ease-in 0; + -webkit-transition: all 0.15s ease-in 0; + vertical-align: middle; +} + +.codesearch-head button { + position: relative; + display: inline-block; + padding: 7px 15px; + font-size: 13px; + font-weight: bold; + color: #333; + text-shadow: 0 1px 0 rgba(255,255,255,0.9); + white-space: nowrap; + background-color: #eaeaea; + background-image: -moz-linear-gradient(#fafafa, #eaeaea); + background-image: -webkit-linear-gradient(#fafafa, #eaeaea); + background-image: linear-gradient(#fafafa, #eaeaea); + background-repeat: repeat-x; + border-radius: 3px; + border: 1px solid #ddd; + border-bottom-color: #c5c5c5; + box-shadow: 0 1px 3px rgba(0,0,0,0.075); + vertical-align: middle; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-appearance: none; +} + +.codesearch-head button:hover { + color: #fff; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0,0,0,0.25); + background-color: #3072b3; + background-image: -moz-linear-gradient(#599bcd, #3072b3); + background-image: -webkit-linear-gradient(#599bcd, #3072b3); + background-image: linear-gradient(#599bcd, #3072b3); + background-repeat: repeat-x; + border-color: #2a65a0; +} + +.menu-container { + float: none; + width: 220px; + padding: 3px; + background: #EFEFEF; + border-radius: 2px; +} + +.root-pane .menu { + background: #FAFAFB; + border-radius: 2px; + border: 1px solid #D8D8D8; + list-style: none; +} + +.export-references { + list-style: none; + margin-top: 18px; +} + +.root-pane .menu a { + display: block; + padding: 8px 10px 8px 8px; + text-shadow: 0 1px 0 white; + border-left: 2px solid #FAFAFB; + text-decoration: none; +} + +.root-pane .menu a.selected { + background: white; + border-left: 2px solid #D26911; + font-weight: bold; + color: #222; + cursor: default; + box-shadow: inset 0 0px 1px rgba(0, 0, 0, 0.1); +} + +.mini-icon-public-repo:before { + content: "\f001"; +} + +.mini-icon-code:before { + content: "\f05f"; +} + +.mini-icon-person:before { + content: "\f018"; +} + +.mini-icon-doc:before { + content: "\f014"; +} + +.mini-icon-issue:before { + content: "\f026"; +} + +.mini-icon-pull:before { + content: "\f022"; +} + +.root-pane .menu a .counter { + float: right; + margin: 0 0 0 5px; + padding: 1px 5px 2px 5px; + font-size: 10px; + font-weight: bold; + color: #666; + background: #E5E5E5; + border-radius: 10px; +} + +.search-content { + position: relative; + margin-left: 80px; +} + +.sort-bar { + border-bottom: 1px solid #f1f1f1; + margin-bottom: 20px; + overflow: hidden; +} + +.sort-bar h3 { + margin: 0; + font-size: 15px; +} + +.sort-bar form { + float: right; +} + +.sort-bar .sort-label { + padding-right: 5px; + font-weight: 200; + font-size: 13px; + color: #666; +} + +.sort-bar select { + font: 13px Helvetica, arial, freesans, clean, sans-serif; + line-height: 1.4; + -webkit-appearance: menulist; + box-sizing: border-box; + -webkit-box-align: center; + border-image: initial; + white-space: pre; + -webkit-rtl-ordering: logical; + color: black; + background-color: white; + cursor: default; + margin: 0em; + font: -webkit-small-control; + color: initial; + letter-spacing: normal; + word-spacing: normal; + text-transform: none; + text-indent: 0px; + text-shadow: none; + display: inline-block; + text-align: start; + height: 18px; + width: 110px; + padding: 0; +} + +.sort-bar select option { + padding: 0 .25em; +} + +.repolist>li { + border-bottom: 1px solid #f1f1f1; + padding: 0 0 10px 0; + position: relative; + min-height: 66px; + overflow: hidden; + margin: 0 0 10px 0; + list-style-type: none; +} + +.repolist ul.repo-stats { + position: relative; + float: right; + border: none; + font-size: 11px; + font-weight: bold; + padding-left: 15px; + padding-top: 15px; + z-index: 5; + background: transparent; +} + +.repo-stats { + display: inline-block; + margin: 0; + border: 1px solid #ddd; + border-radius: 3px; + background: #fff; + overflow: hidden; +} + +.repolist ul.repo-stats li { + border: none; + color: #666; + line-height: 21px; + margin-left: 10px !important; +} + +.repo-stats li { + list-style-type: none; + display: block; + margin: 0 !important; + float: left; +} + +.repolist ul.repo-stats li a, .repolist ul.repo-stats li a:hover { + color: #666 !important; + border: none; + background-color: transparent; + line-height: 1; +} + +ul.repo-stats li a { + display: inline-block; + padding: 0 5px; + line-height: 24px; + color: #666; + border-left: 1px solid #ddd; +} + +ul.repo-stats li a .mini-icon { + color: #838383; + position: relative; + vertical-align: middle; + top: -1px; +} + +.mini-icon, .mega-icon { + font-family: 'Octicons Regular'; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: inherit; + line-height: 1; + -webkit-font-smoothing: antialiased; + line-height: 1; + text-decoration: none; +} + +.mega-icon { + font-size: 32px; + width: 32px; + height: 32px; +} + +.mini-icon { + font-size: 16px; + width: 16px; + height: 16px; +} + +.repolist .mega-icon::before { + color: #bbb; +} + +.mega-icon-public-repo:before { + content: "\f201"; +} + +.repolist h3 { + font-size: 20px; + letter-spacing: -1px; + line-height: 32px; + white-space: nowrap; +} + +.mini-icon-star:before { + content: "\f02a"; +} + +.repolist ul.repo-stats li a, .repolist ul.repo-stats li a:hover { + color: #666 !important; + line-height: 1; +} + +.mini-icon-public-fork:before, .mini-icon-fork:before, .mini-icon-branch:before, .mini-icon-tree:before { + content: "\f020"; +} + +.repolist p.updated-at { + margin: 0; + font-size: 11px; + color: #999999; +} + +.repolist p.description { + margin: 0 0 5px 0; + color: #333333; + font-size: 14px; +} + +.repolist .body { + margin: 0 0 0 37px; + text-shadow: 0 1px 0 #fff,1px 0 0 #fff,0 -1px 0 #fff,-1px 0 0 #fff,0 2px 0 #fff,2px 0 0 #fff,0 -2px 0 #fff,-2px 0 0 #fff; +} + +.code-list .code-list-item { + border-bottom: 1px solid #f1f1f1; + padding: 0 0 20px 0; + margin: 0 0 20px 0; +} + +.code-list img.avatar { + float: left; + border-radius: 3px; + margin-left: 3px; +} + +.code-list .language { + float: right; + color: rgba(51,51,51,0.75); + font-size: 12px; + margin-left: 10px; +} + +.code-list .title { + padding: 0 0 5px; + margin: 0 0 0 40px; + min-height: 24px; + font-weight: bold; + font-size: 14px; +} + +.codesearch-cols ul.repolist h3 a:visited, .codesearch-cols .code-list .title a:visited { + color: #7C65C2; +} + +.code-list .updated-at { + margin: 0; + font-size: 11px; + color: #999999; + font-weight: normal; +} + +ul.members-list .gravatar { + float: left; + margin-left: -58px; + border-radius: 3px; +} + +ul.members-list li h4 { + margin: -1px 0 0 0; + font-size: 16px; + line-height: 1.2; +} + +.col-2 ul.members-list li { + display: block; + border-bottom: 1px solid #f1f1f1; + width: inherit; +} + +.search-content ul.members-list li:first-child { + padding-top: 0; +} + +ul.members-list li { + display: inline-block; + width: 165px; + position: relative; + list-style-type: none; + min-height: 48px; + margin: 0; + padding: 10px 0 10px 58px; + vertical-align: top; +} + +ul.members-list li h4 em { + font-style: normal; + font-weight: normal; + color: #99a7af; + display: block; +} + +.bubble { + padding: 3px; + background: #eee; + border-radius: 3px; +} + +.file-box { + border: 1px solid #ccc; + margin-bottom: 0; + position: relative; + background-color: #DDD; + outline: none; +} + +.file-box .data { + overflow: auto; + background-color: #f8f8ff; +} + +.code-list .code-list-item .data { + background: #fff; +} + +.data p { + padding: 0; + margin: 0; +} + +.pagination { + margin: 7px 0; + display: inline-block; + overflow: hidden; + background-color: #efefef; + background-image: -moz-linear-gradient(#fff, #efefef); + background-image: -webkit-linear-gradient(#fff, #efefef); + background-image: linear-gradient(#fff, #efefef); + background-repeat: repeat-x; + border: 1px solid #eaeaea; + border-bottom-color: #cacaca; + border-bottom: none; + border-radius: 3px; + height: auto; +} + +.pagination a.current, .pagination a.current:hover, .pagination span.current, .pagination span.current:hover { + color: #000; + background-color: #ebebeb; + background-image: -moz-linear-gradient(#fcfcfc, #ebebeb); + background-image: -webkit-linear-gradient(#fcfcfc, #ebebeb); + background-image: linear-gradient(#fcfcfc, #ebebeb); + background-repeat: repeat-x; + border-bottom-color: #D26911; +} + +.pagination a:first-child, .pagination span:first-child { + border-left: none; + border-bottom-left-radius: 3px; +} + +.pagination a, .pagination span { + float: left; + padding: 6px 10px 5px; + margin: 0; + color: #777; + font-size: 13px; + text-decoration: none; + text-shadow: 0 1px 0 white; + border-right: 1px solid rgba(0,0,0,0.04); + border-left: 1px solid rgba(255,255,255,0.7); + border-bottom: 1px solid #DADADA; + border-top: none; + width: auto; +} + +.pagination a:hover, .pagination span:hover { + color: #4183c4; + border-bottom-color: #CFDCE8; + background-color: #dce6ef; + background-image: -moz-linear-gradient(#fafbfd, #dce6ef); + background-image: -webkit-linear-gradient(#fafbfd, #dce6ef); + background-image: linear-gradient(#fafbfd, #dce6ef); + background-repeat: repeat-x; +} + +highlight { + background-color: yellow; +} + +.code .highlight pre { + background-color: #FFFFFF; + border: medium none; + margin: 0; + padding: 8px; + white-space: pre; +} +.code .highlight pre a { + display: block; +} +.code .highlight em { + font-style: normal; + background-color: #FFF68F; +} +.linenos .linenodiv pre { + -moz-border-bottom-colors: none; + -moz-border-left-colors: none; + -moz-border-right-colors: none; + -moz-border-top-colors: none; + background-color: #ECECEC; + border-color: -moz-use-text-color #DDDDDD -moz-use-text-color -moz-use-text-color; + border-image: none; + border-style: none solid none none; + border-width: medium 1px medium medium; + padding: 8px; + text-align: right; + white-space: pre; +} +.linenos .linenodiv pre a { + color: #AAAAAA; + line-height: 18px; + text-decoration: none; + white-space: nowrap; +} +.code { + width: 100%; +} +.code .highlight pre, .linenos .linenodiv pre { + border-radius: 0 0 0 0; + margin: 0; +} +.linenos { + padding: 0; +} + +.filter-pane { + width: 220px; +} + +.filter-pane h3 { + font-size: 16px; + text-transform: capitalize; +} + +.octicon-remove-close:before { + content: "\f050" +} + +.octicon { + display: inline-block; + font: 16px/1 Octicons Regular; + text-decoration: none; +} + +ul.filter-list { + list-style-type: none; +} +ul.filter-list.small .filter-item { + font-size: 12px; + margin: 0 0 2px; + padding: 4px 10px; +} +ul.filter-list .filter-item { + border-radius: 3px 3px 3px 3px; + color: #777777; + cursor: pointer; + display: block; + font-size: 14px; + margin: 0 0 5px; + overflow: hidden; + padding: 8px 10px; + text-decoration: none; + text-overflow: ellipsis; + white-space: nowrap; + text-transform: capitalize; +} +ul.filter-list .filter-item:hover { + background: none repeat scroll 0 0 #EEEEEE; +} +ul.filter-list .filter-item.selected { + background: none repeat scroll 0 0 #4183C4; + color: #FFFFFF; +} +ul.filter-list .filter-item.selected .octicon-remove-close { + display: inline-block; + float: right; + opacity: 0.8; +} +ul.filter-list .filter-item .count { + float: right; + font-weight: bold; +} +ul.filter-list.pjax-active .filter-item { + background: none repeat scroll 0 0 rgba(0, 0, 0, 0); + color: #777777; +} +ul.filter-list.pjax-active .filter-item.pjax-active { + background: none repeat scroll 0 0 #4183C4; + color: #FFFFFF; +} diff --git a/hub/static/css/sphinx_doc.css b/hub/static/css/sphinx_doc.css new file mode 100644 index 0000000..04b2b71 --- /dev/null +++ b/hub/static/css/sphinx_doc.css @@ -0,0 +1,540 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox input[type="text"] { + width: 170px; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + width: 30px; +} + +img { + border: 0; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li div.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable dl, table.indextable dd { + margin-top: 0; + margin-bottom: 0; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- general body styles --------------------------------------------------- */ + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.field-list ul { + padding-left: 1em; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px 7px 0 7px; + background-color: #ffe; + width: 40%; + float: right; +} + +p.sidebar-title { + font-weight: bold; +} + +/* -- topics ---------------------------------------------------------------- */ + +div.topic { + border: 1px solid #ccc; + padding: 7px 7px 0 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +div.admonition dl { + margin-bottom: 0; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + border: 0; + border-collapse: collapse; +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +table.field-list td, table.field-list th { + border: 0 !important; +} + +table.footnote td, table.footnote th { + border: 0 !important; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +dl { + margin-bottom: 15px; +} + +dd p { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dt:target, .highlighted { + background-color: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.refcount { + color: #060; +} + +.optional { + font-size: 1.3em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +td.linenos pre { + padding: 5px 0px; + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + margin-left: 0.5em; +} + +table.highlighttable td { + padding: 0 0.5em 0 0.5em; +} + +tt.descname { + background-color: transparent; + font-weight: bold; + font-size: 1.2em; +} + +tt.descclassname { + background-color: transparent; +} + +tt.xref, a tt { + background-color: transparent; + font-weight: bold; +} + +h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} diff --git a/hub/static/emoji/1F400.png b/hub/static/emoji/1F400.png new file mode 100644 index 0000000..5c577cf Binary files /dev/null and b/hub/static/emoji/1F400.png differ diff --git a/hub/static/emoji/1F401.png b/hub/static/emoji/1F401.png new file mode 100644 index 0000000..0f91255 Binary files /dev/null and b/hub/static/emoji/1F401.png differ diff --git a/hub/static/emoji/1F402.png b/hub/static/emoji/1F402.png new file mode 100644 index 0000000..0404a21 Binary files /dev/null and b/hub/static/emoji/1F402.png differ diff --git a/hub/static/emoji/1F403.png b/hub/static/emoji/1F403.png new file mode 100644 index 0000000..8bf8293 Binary files /dev/null and b/hub/static/emoji/1F403.png differ diff --git a/hub/static/emoji/1F404.png b/hub/static/emoji/1F404.png new file mode 100644 index 0000000..f28d315 Binary files /dev/null and b/hub/static/emoji/1F404.png differ diff --git a/hub/static/emoji/1F405.png b/hub/static/emoji/1F405.png new file mode 100644 index 0000000..0b7f0eb Binary files /dev/null and b/hub/static/emoji/1F405.png differ diff --git a/hub/static/emoji/1F406.png b/hub/static/emoji/1F406.png new file mode 100644 index 0000000..0088e88 Binary files /dev/null and b/hub/static/emoji/1F406.png differ diff --git a/hub/static/emoji/1F407.png b/hub/static/emoji/1F407.png new file mode 100644 index 0000000..fd7830e Binary files /dev/null and b/hub/static/emoji/1F407.png differ diff --git a/hub/static/emoji/1F408.png b/hub/static/emoji/1F408.png new file mode 100644 index 0000000..e3f4a0d Binary files /dev/null and b/hub/static/emoji/1F408.png differ diff --git a/hub/static/emoji/1F409.png b/hub/static/emoji/1F409.png new file mode 100644 index 0000000..60b19a4 Binary files /dev/null and b/hub/static/emoji/1F409.png differ diff --git a/hub/static/emoji/1F410.png b/hub/static/emoji/1F410.png new file mode 100644 index 0000000..a6f5479 Binary files /dev/null and b/hub/static/emoji/1F410.png differ diff --git a/hub/static/emoji/1F411.png b/hub/static/emoji/1F411.png new file mode 100644 index 0000000..6ea5818 Binary files /dev/null and b/hub/static/emoji/1F411.png differ diff --git a/hub/static/emoji/1F412.png b/hub/static/emoji/1F412.png new file mode 100644 index 0000000..f71be14 Binary files /dev/null and b/hub/static/emoji/1F412.png differ diff --git a/hub/static/emoji/1F413.png b/hub/static/emoji/1F413.png new file mode 100644 index 0000000..ea5c856 Binary files /dev/null and b/hub/static/emoji/1F413.png differ diff --git a/hub/static/emoji/1F414.png b/hub/static/emoji/1F414.png new file mode 100644 index 0000000..dc0ac73 Binary files /dev/null and b/hub/static/emoji/1F414.png differ diff --git a/hub/static/emoji/1F415.png b/hub/static/emoji/1F415.png new file mode 100644 index 0000000..544b06c Binary files /dev/null and b/hub/static/emoji/1F415.png differ diff --git a/hub/static/emoji/1F416.png b/hub/static/emoji/1F416.png new file mode 100644 index 0000000..2492c56 Binary files /dev/null and b/hub/static/emoji/1F416.png differ diff --git a/hub/static/emoji/1F417.png b/hub/static/emoji/1F417.png new file mode 100644 index 0000000..fe9ceb0 Binary files /dev/null and b/hub/static/emoji/1F417.png differ diff --git a/hub/static/emoji/1F418.png b/hub/static/emoji/1F418.png new file mode 100644 index 0000000..4a3a075 Binary files /dev/null and b/hub/static/emoji/1F418.png differ diff --git a/hub/static/emoji/1F419.png b/hub/static/emoji/1F419.png new file mode 100644 index 0000000..63c9a13 Binary files /dev/null and b/hub/static/emoji/1F419.png differ diff --git a/hub/static/emoji/1F420.png b/hub/static/emoji/1F420.png new file mode 100644 index 0000000..4a02ce1 Binary files /dev/null and b/hub/static/emoji/1F420.png differ diff --git a/hub/static/emoji/1F421.png b/hub/static/emoji/1F421.png new file mode 100644 index 0000000..d9286fd Binary files /dev/null and b/hub/static/emoji/1F421.png differ diff --git a/hub/static/emoji/1F422.png b/hub/static/emoji/1F422.png new file mode 100644 index 0000000..4ab991b Binary files /dev/null and b/hub/static/emoji/1F422.png differ diff --git a/hub/static/emoji/1F423.png b/hub/static/emoji/1F423.png new file mode 100644 index 0000000..e471ba2 Binary files /dev/null and b/hub/static/emoji/1F423.png differ diff --git a/hub/static/emoji/1F424.png b/hub/static/emoji/1F424.png new file mode 100644 index 0000000..4e27df5 Binary files /dev/null and b/hub/static/emoji/1F424.png differ diff --git a/hub/static/emoji/1F425.png b/hub/static/emoji/1F425.png new file mode 100644 index 0000000..2593d56 Binary files /dev/null and b/hub/static/emoji/1F425.png differ diff --git a/hub/static/emoji/1F426.png b/hub/static/emoji/1F426.png new file mode 100644 index 0000000..19c7c57 Binary files /dev/null and b/hub/static/emoji/1F426.png differ diff --git a/hub/static/emoji/1F427.png b/hub/static/emoji/1F427.png new file mode 100644 index 0000000..fd36388 Binary files /dev/null and b/hub/static/emoji/1F427.png differ diff --git a/hub/static/emoji/1F428.png b/hub/static/emoji/1F428.png new file mode 100644 index 0000000..7dc6ffc Binary files /dev/null and b/hub/static/emoji/1F428.png differ diff --git a/hub/static/emoji/1F429.png b/hub/static/emoji/1F429.png new file mode 100644 index 0000000..6e77dc3 Binary files /dev/null and b/hub/static/emoji/1F429.png differ diff --git a/hub/static/emoji/1F430.png b/hub/static/emoji/1F430.png new file mode 100644 index 0000000..a75b275 Binary files /dev/null and b/hub/static/emoji/1F430.png differ diff --git a/hub/static/emoji/1F431.png b/hub/static/emoji/1F431.png new file mode 100644 index 0000000..0c41468 Binary files /dev/null and b/hub/static/emoji/1F431.png differ diff --git a/hub/static/emoji/1F432.png b/hub/static/emoji/1F432.png new file mode 100644 index 0000000..a082fc5 Binary files /dev/null and b/hub/static/emoji/1F432.png differ diff --git a/hub/static/emoji/1F433.png b/hub/static/emoji/1F433.png new file mode 100644 index 0000000..2e5f613 Binary files /dev/null and b/hub/static/emoji/1F433.png differ diff --git a/hub/static/emoji/1F434.png b/hub/static/emoji/1F434.png new file mode 100644 index 0000000..f7d1431 Binary files /dev/null and b/hub/static/emoji/1F434.png differ diff --git a/hub/static/emoji/1F435.png b/hub/static/emoji/1F435.png new file mode 100644 index 0000000..a373552 Binary files /dev/null and b/hub/static/emoji/1F435.png differ diff --git a/hub/static/emoji/1F436.png b/hub/static/emoji/1F436.png new file mode 100644 index 0000000..cb5afae Binary files /dev/null and b/hub/static/emoji/1F436.png differ diff --git a/hub/static/emoji/1F437.png b/hub/static/emoji/1F437.png new file mode 100644 index 0000000..45baef3 Binary files /dev/null and b/hub/static/emoji/1F437.png differ diff --git a/hub/static/emoji/1F438.png b/hub/static/emoji/1F438.png new file mode 100644 index 0000000..cc3d027 Binary files /dev/null and b/hub/static/emoji/1F438.png differ diff --git a/hub/static/emoji/1F439.png b/hub/static/emoji/1F439.png new file mode 100644 index 0000000..f8de04a Binary files /dev/null and b/hub/static/emoji/1F439.png differ diff --git a/hub/static/emoji/1F440.png b/hub/static/emoji/1F440.png new file mode 100644 index 0000000..543cd83 Binary files /dev/null and b/hub/static/emoji/1F440.png differ diff --git a/hub/static/emoji/1F493.png b/hub/static/emoji/1F493.png new file mode 100644 index 0000000..43a365e Binary files /dev/null and b/hub/static/emoji/1F493.png differ diff --git a/hub/static/emoji/1F494.png b/hub/static/emoji/1F494.png new file mode 100644 index 0000000..b7ee9b4 Binary files /dev/null and b/hub/static/emoji/1F494.png differ diff --git a/hub/static/emoji/1F495.png b/hub/static/emoji/1F495.png new file mode 100644 index 0000000..48f8d88 Binary files /dev/null and b/hub/static/emoji/1F495.png differ diff --git a/hub/static/emoji/1F496.png b/hub/static/emoji/1F496.png new file mode 100644 index 0000000..0bfffc4 Binary files /dev/null and b/hub/static/emoji/1F496.png differ diff --git a/hub/static/emoji/1F497.png b/hub/static/emoji/1F497.png new file mode 100644 index 0000000..b3d5da2 Binary files /dev/null and b/hub/static/emoji/1F497.png differ diff --git a/hub/static/emoji/1F498.png b/hub/static/emoji/1F498.png new file mode 100644 index 0000000..4926021 Binary files /dev/null and b/hub/static/emoji/1F498.png differ diff --git a/hub/static/emoji/1F499.png b/hub/static/emoji/1F499.png new file mode 100644 index 0000000..494ab72 Binary files /dev/null and b/hub/static/emoji/1F499.png differ diff --git a/hub/static/emoji/1F58F.png b/hub/static/emoji/1F58F.png new file mode 100755 index 0000000..1e20ede Binary files /dev/null and b/hub/static/emoji/1F58F.png differ diff --git a/hub/static/emoji/1F590.png b/hub/static/emoji/1F590.png new file mode 100755 index 0000000..09046e2 Binary files /dev/null and b/hub/static/emoji/1F590.png differ diff --git a/hub/static/emoji/1F591.png b/hub/static/emoji/1F591.png new file mode 100755 index 0000000..e7d29d8 Binary files /dev/null and b/hub/static/emoji/1F591.png differ diff --git a/hub/static/emoji/1F592.png b/hub/static/emoji/1F592.png new file mode 100755 index 0000000..c39f330 Binary files /dev/null and b/hub/static/emoji/1F592.png differ diff --git a/hub/static/emoji/1F593.png b/hub/static/emoji/1F593.png new file mode 100755 index 0000000..ebcdca1 Binary files /dev/null and b/hub/static/emoji/1F593.png differ diff --git a/hub/static/emoji/1F594.png b/hub/static/emoji/1F594.png new file mode 100755 index 0000000..a5dadf2 Binary files /dev/null and b/hub/static/emoji/1F594.png differ diff --git a/hub/static/emoji/1F595.png b/hub/static/emoji/1F595.png new file mode 100755 index 0000000..c4e5d4a Binary files /dev/null and b/hub/static/emoji/1F595.png differ diff --git a/hub/static/emoji/1F596.png b/hub/static/emoji/1F596.png new file mode 100755 index 0000000..88e8765 Binary files /dev/null and b/hub/static/emoji/1F596.png differ diff --git a/hub/static/emoji/1F597.png b/hub/static/emoji/1F597.png new file mode 100755 index 0000000..18468bc Binary files /dev/null and b/hub/static/emoji/1F597.png differ diff --git a/hub/static/emoji/1F598.png b/hub/static/emoji/1F598.png new file mode 100755 index 0000000..1abfbc5 Binary files /dev/null and b/hub/static/emoji/1F598.png differ diff --git a/hub/static/emoji/1F599.png b/hub/static/emoji/1F599.png new file mode 100755 index 0000000..5ea3694 Binary files /dev/null and b/hub/static/emoji/1F599.png differ diff --git a/hub/static/emoji/1F59E.png b/hub/static/emoji/1F59E.png new file mode 100755 index 0000000..ef514b6 Binary files /dev/null and b/hub/static/emoji/1F59E.png differ diff --git a/hub/static/emoji/1F59F.png b/hub/static/emoji/1F59F.png new file mode 100755 index 0000000..8a1a419 Binary files /dev/null and b/hub/static/emoji/1F59F.png differ diff --git a/hub/static/emoji/1F600.png b/hub/static/emoji/1F600.png new file mode 100644 index 0000000..34ac223 Binary files /dev/null and b/hub/static/emoji/1F600.png differ diff --git a/hub/static/emoji/1F601.png b/hub/static/emoji/1F601.png new file mode 100644 index 0000000..394fcef Binary files /dev/null and b/hub/static/emoji/1F601.png differ diff --git a/hub/static/emoji/1F602.png b/hub/static/emoji/1F602.png new file mode 100644 index 0000000..b2a2037 Binary files /dev/null and b/hub/static/emoji/1F602.png differ diff --git a/hub/static/emoji/1F603.png b/hub/static/emoji/1F603.png new file mode 100644 index 0000000..add5433 Binary files /dev/null and b/hub/static/emoji/1F603.png differ diff --git a/hub/static/emoji/1F604.png b/hub/static/emoji/1F604.png new file mode 100644 index 0000000..642c90c Binary files /dev/null and b/hub/static/emoji/1F604.png differ diff --git a/hub/static/emoji/1F605.png b/hub/static/emoji/1F605.png new file mode 100644 index 0000000..c80fbcf Binary files /dev/null and b/hub/static/emoji/1F605.png differ diff --git a/hub/static/emoji/1F606.png b/hub/static/emoji/1F606.png new file mode 100644 index 0000000..a0f1a82 Binary files /dev/null and b/hub/static/emoji/1F606.png differ diff --git a/hub/static/emoji/1F607.png b/hub/static/emoji/1F607.png new file mode 100644 index 0000000..5a51477 Binary files /dev/null and b/hub/static/emoji/1F607.png differ diff --git a/hub/static/emoji/1F608.png b/hub/static/emoji/1F608.png new file mode 100644 index 0000000..66a8653 Binary files /dev/null and b/hub/static/emoji/1F608.png differ diff --git a/hub/static/emoji/1F609.png b/hub/static/emoji/1F609.png new file mode 100644 index 0000000..ebd7e32 Binary files /dev/null and b/hub/static/emoji/1F609.png differ diff --git a/hub/static/emoji/1F60A.png b/hub/static/emoji/1F60A.png new file mode 100644 index 0000000..48bd35e Binary files /dev/null and b/hub/static/emoji/1F60A.png differ diff --git a/hub/static/emoji/1F60B.png b/hub/static/emoji/1F60B.png new file mode 100644 index 0000000..cd81753 Binary files /dev/null and b/hub/static/emoji/1F60B.png differ diff --git a/hub/static/emoji/1F60C.png b/hub/static/emoji/1F60C.png new file mode 100644 index 0000000..a6a8971 Binary files /dev/null and b/hub/static/emoji/1F60C.png differ diff --git a/hub/static/emoji/1F60D.png b/hub/static/emoji/1F60D.png new file mode 100644 index 0000000..857e1be Binary files /dev/null and b/hub/static/emoji/1F60D.png differ diff --git a/hub/static/emoji/1F60E.png b/hub/static/emoji/1F60E.png new file mode 100644 index 0000000..2c8b711 Binary files /dev/null and b/hub/static/emoji/1F60E.png differ diff --git a/hub/static/emoji/1F60F.png b/hub/static/emoji/1F60F.png new file mode 100644 index 0000000..70240ea Binary files /dev/null and b/hub/static/emoji/1F60F.png differ diff --git a/hub/static/emoji/1F610.png b/hub/static/emoji/1F610.png new file mode 100644 index 0000000..2cfa8c4 Binary files /dev/null and b/hub/static/emoji/1F610.png differ diff --git a/hub/static/emoji/1F611.png b/hub/static/emoji/1F611.png new file mode 100644 index 0000000..b18262c Binary files /dev/null and b/hub/static/emoji/1F611.png differ diff --git a/hub/static/emoji/1F612.png b/hub/static/emoji/1F612.png new file mode 100644 index 0000000..7152d29 Binary files /dev/null and b/hub/static/emoji/1F612.png differ diff --git a/hub/static/emoji/1F613.png b/hub/static/emoji/1F613.png new file mode 100644 index 0000000..2154e41 Binary files /dev/null and b/hub/static/emoji/1F613.png differ diff --git a/hub/static/emoji/1F614.png b/hub/static/emoji/1F614.png new file mode 100644 index 0000000..5935c47 Binary files /dev/null and b/hub/static/emoji/1F614.png differ diff --git a/hub/static/emoji/1F615.png b/hub/static/emoji/1F615.png new file mode 100644 index 0000000..b5c5b07 Binary files /dev/null and b/hub/static/emoji/1F615.png differ diff --git a/hub/static/emoji/1F616.png b/hub/static/emoji/1F616.png new file mode 100644 index 0000000..a986720 Binary files /dev/null and b/hub/static/emoji/1F616.png differ diff --git a/hub/static/emoji/1F617.png b/hub/static/emoji/1F617.png new file mode 100644 index 0000000..12d18f7 Binary files /dev/null and b/hub/static/emoji/1F617.png differ diff --git a/hub/static/emoji/1F618.png b/hub/static/emoji/1F618.png new file mode 100644 index 0000000..f85e7ba Binary files /dev/null and b/hub/static/emoji/1F618.png differ diff --git a/hub/static/emoji/1F619.png b/hub/static/emoji/1F619.png new file mode 100644 index 0000000..871680f Binary files /dev/null and b/hub/static/emoji/1F619.png differ diff --git a/hub/static/emoji/1F61A.png b/hub/static/emoji/1F61A.png new file mode 100644 index 0000000..b22b35c Binary files /dev/null and b/hub/static/emoji/1F61A.png differ diff --git a/hub/static/emoji/1F61B.png b/hub/static/emoji/1F61B.png new file mode 100644 index 0000000..f036ed3 Binary files /dev/null and b/hub/static/emoji/1F61B.png differ diff --git a/hub/static/emoji/1F61C.png b/hub/static/emoji/1F61C.png new file mode 100644 index 0000000..46b8fa0 Binary files /dev/null and b/hub/static/emoji/1F61C.png differ diff --git a/hub/static/emoji/1F61D.png b/hub/static/emoji/1F61D.png new file mode 100644 index 0000000..05b6961 Binary files /dev/null and b/hub/static/emoji/1F61D.png differ diff --git a/hub/static/emoji/1F61E.png b/hub/static/emoji/1F61E.png new file mode 100644 index 0000000..22bf80d Binary files /dev/null and b/hub/static/emoji/1F61E.png differ diff --git a/hub/static/emoji/1F61F.png b/hub/static/emoji/1F61F.png new file mode 100644 index 0000000..4048ebf Binary files /dev/null and b/hub/static/emoji/1F61F.png differ diff --git a/hub/static/emoji/1F620.png b/hub/static/emoji/1F620.png new file mode 100644 index 0000000..6c69d9b Binary files /dev/null and b/hub/static/emoji/1F620.png differ diff --git a/hub/static/emoji/1F621.png b/hub/static/emoji/1F621.png new file mode 100644 index 0000000..c1ab5d1 Binary files /dev/null and b/hub/static/emoji/1F621.png differ diff --git a/hub/static/emoji/1F622.png b/hub/static/emoji/1F622.png new file mode 100644 index 0000000..5f1690d Binary files /dev/null and b/hub/static/emoji/1F622.png differ diff --git a/hub/static/emoji/1F623.png b/hub/static/emoji/1F623.png new file mode 100644 index 0000000..9fe8a28 Binary files /dev/null and b/hub/static/emoji/1F623.png differ diff --git a/hub/static/emoji/1F624.png b/hub/static/emoji/1F624.png new file mode 100644 index 0000000..4f0a6c1 Binary files /dev/null and b/hub/static/emoji/1F624.png differ diff --git a/hub/static/emoji/1F625.png b/hub/static/emoji/1F625.png new file mode 100644 index 0000000..d73d8a3 Binary files /dev/null and b/hub/static/emoji/1F625.png differ diff --git a/hub/static/emoji/1F626.png b/hub/static/emoji/1F626.png new file mode 100644 index 0000000..03a5724 Binary files /dev/null and b/hub/static/emoji/1F626.png differ diff --git a/hub/static/emoji/1F627.png b/hub/static/emoji/1F627.png new file mode 100644 index 0000000..70219ed Binary files /dev/null and b/hub/static/emoji/1F627.png differ diff --git a/hub/static/emoji/1F628.png b/hub/static/emoji/1F628.png new file mode 100644 index 0000000..1fafb01 Binary files /dev/null and b/hub/static/emoji/1F628.png differ diff --git a/hub/static/emoji/1F629.png b/hub/static/emoji/1F629.png new file mode 100644 index 0000000..1ef63c7 Binary files /dev/null and b/hub/static/emoji/1F629.png differ diff --git a/hub/static/emoji/1F62A.png b/hub/static/emoji/1F62A.png new file mode 100644 index 0000000..e3720f8 Binary files /dev/null and b/hub/static/emoji/1F62A.png differ diff --git a/hub/static/emoji/1F62B.png b/hub/static/emoji/1F62B.png new file mode 100644 index 0000000..567b854 Binary files /dev/null and b/hub/static/emoji/1F62B.png differ diff --git a/hub/static/emoji/1F62C.png b/hub/static/emoji/1F62C.png new file mode 100644 index 0000000..3819f5f Binary files /dev/null and b/hub/static/emoji/1F62C.png differ diff --git a/hub/static/emoji/1F62D.png b/hub/static/emoji/1F62D.png new file mode 100644 index 0000000..a6d7388 Binary files /dev/null and b/hub/static/emoji/1F62D.png differ diff --git a/hub/static/emoji/1F62E.png b/hub/static/emoji/1F62E.png new file mode 100644 index 0000000..d5b3155 Binary files /dev/null and b/hub/static/emoji/1F62E.png differ diff --git a/hub/static/emoji/1F62F.png b/hub/static/emoji/1F62F.png new file mode 100644 index 0000000..7df7660 Binary files /dev/null and b/hub/static/emoji/1F62F.png differ diff --git a/hub/static/emoji/1F630.png b/hub/static/emoji/1F630.png new file mode 100644 index 0000000..a4c2cb9 Binary files /dev/null and b/hub/static/emoji/1F630.png differ diff --git a/hub/static/emoji/1F631.png b/hub/static/emoji/1F631.png new file mode 100644 index 0000000..51396ec Binary files /dev/null and b/hub/static/emoji/1F631.png differ diff --git a/hub/static/emoji/1F632.png b/hub/static/emoji/1F632.png new file mode 100644 index 0000000..2734543 Binary files /dev/null and b/hub/static/emoji/1F632.png differ diff --git a/hub/static/emoji/1F633.png b/hub/static/emoji/1F633.png new file mode 100644 index 0000000..c973f63 Binary files /dev/null and b/hub/static/emoji/1F633.png differ diff --git a/hub/static/emoji/1F634.png b/hub/static/emoji/1F634.png new file mode 100644 index 0000000..b521d03 Binary files /dev/null and b/hub/static/emoji/1F634.png differ diff --git a/hub/static/emoji/1F635.png b/hub/static/emoji/1F635.png new file mode 100644 index 0000000..45d3443 Binary files /dev/null and b/hub/static/emoji/1F635.png differ diff --git a/hub/static/emoji/1F636.png b/hub/static/emoji/1F636.png new file mode 100644 index 0000000..1ce9b90 Binary files /dev/null and b/hub/static/emoji/1F636.png differ diff --git a/hub/static/emoji/1F637.png b/hub/static/emoji/1F637.png new file mode 100644 index 0000000..f329141 Binary files /dev/null and b/hub/static/emoji/1F637.png differ diff --git a/hub/static/emoji/1F638.png b/hub/static/emoji/1F638.png new file mode 100644 index 0000000..81b6e5c Binary files /dev/null and b/hub/static/emoji/1F638.png differ diff --git a/hub/static/emoji/1F639.png b/hub/static/emoji/1F639.png new file mode 100644 index 0000000..dbd4f34 Binary files /dev/null and b/hub/static/emoji/1F639.png differ diff --git a/hub/static/emoji/1F63A.png b/hub/static/emoji/1F63A.png new file mode 100644 index 0000000..d8d42a8 Binary files /dev/null and b/hub/static/emoji/1F63A.png differ diff --git a/hub/static/emoji/1F63B.png b/hub/static/emoji/1F63B.png new file mode 100644 index 0000000..7fcb09e Binary files /dev/null and b/hub/static/emoji/1F63B.png differ diff --git a/hub/static/emoji/1F63C.png b/hub/static/emoji/1F63C.png new file mode 100644 index 0000000..24f9337 Binary files /dev/null and b/hub/static/emoji/1F63C.png differ diff --git a/hub/static/emoji/1F63D.png b/hub/static/emoji/1F63D.png new file mode 100644 index 0000000..b454c64 Binary files /dev/null and b/hub/static/emoji/1F63D.png differ diff --git a/hub/static/emoji/1F63E.png b/hub/static/emoji/1F63E.png new file mode 100644 index 0000000..77a4195 Binary files /dev/null and b/hub/static/emoji/1F63E.png differ diff --git a/hub/static/emoji/1F63F.png b/hub/static/emoji/1F63F.png new file mode 100644 index 0000000..112d9b0 Binary files /dev/null and b/hub/static/emoji/1F63F.png differ diff --git a/hub/static/emoji/1F640.png b/hub/static/emoji/1F640.png new file mode 100644 index 0000000..46095ab Binary files /dev/null and b/hub/static/emoji/1F640.png differ diff --git a/hub/static/emoji/1F641.png b/hub/static/emoji/1F641.png new file mode 100644 index 0000000..55e16c1 Binary files /dev/null and b/hub/static/emoji/1F641.png differ diff --git a/hub/static/emoji/1F642.png b/hub/static/emoji/1F642.png new file mode 100644 index 0000000..1bb673b Binary files /dev/null and b/hub/static/emoji/1F642.png differ diff --git a/hub/static/emoji/1F645.png b/hub/static/emoji/1F645.png new file mode 100644 index 0000000..120adca Binary files /dev/null and b/hub/static/emoji/1F645.png differ diff --git a/hub/static/emoji/1F646.png b/hub/static/emoji/1F646.png new file mode 100644 index 0000000..78d65bc Binary files /dev/null and b/hub/static/emoji/1F646.png differ diff --git a/hub/static/emoji/1F647.png b/hub/static/emoji/1F647.png new file mode 100644 index 0000000..44739d3 Binary files /dev/null and b/hub/static/emoji/1F647.png differ diff --git a/hub/static/emoji/1F648.png b/hub/static/emoji/1F648.png new file mode 100644 index 0000000..193927e Binary files /dev/null and b/hub/static/emoji/1F648.png differ diff --git a/hub/static/emoji/1F649.png b/hub/static/emoji/1F649.png new file mode 100644 index 0000000..dc5c4b2 Binary files /dev/null and b/hub/static/emoji/1F649.png differ diff --git a/hub/static/emoji/1F64A.png b/hub/static/emoji/1F64A.png new file mode 100644 index 0000000..e78d285 Binary files /dev/null and b/hub/static/emoji/1F64A.png differ diff --git a/hub/static/emoji/1F64B.png b/hub/static/emoji/1F64B.png new file mode 100644 index 0000000..e9d5483 Binary files /dev/null and b/hub/static/emoji/1F64B.png differ diff --git a/hub/static/emoji/1F64C.png b/hub/static/emoji/1F64C.png new file mode 100644 index 0000000..8dbc25f Binary files /dev/null and b/hub/static/emoji/1F64C.png differ diff --git a/hub/static/emoji/1F64D.png b/hub/static/emoji/1F64D.png new file mode 100644 index 0000000..81dbb96 Binary files /dev/null and b/hub/static/emoji/1F64D.png differ diff --git a/hub/static/emoji/1f400.png b/hub/static/emoji/1f400.png new file mode 100644 index 0000000..5c577cf Binary files /dev/null and b/hub/static/emoji/1f400.png differ diff --git a/hub/static/emoji/1f401.png b/hub/static/emoji/1f401.png new file mode 100644 index 0000000..0f91255 Binary files /dev/null and b/hub/static/emoji/1f401.png differ diff --git a/hub/static/emoji/1f402.png b/hub/static/emoji/1f402.png new file mode 100644 index 0000000..0404a21 Binary files /dev/null and b/hub/static/emoji/1f402.png differ diff --git a/hub/static/emoji/1f403.png b/hub/static/emoji/1f403.png new file mode 100644 index 0000000..8bf8293 Binary files /dev/null and b/hub/static/emoji/1f403.png differ diff --git a/hub/static/emoji/1f404.png b/hub/static/emoji/1f404.png new file mode 100644 index 0000000..f28d315 Binary files /dev/null and b/hub/static/emoji/1f404.png differ diff --git a/hub/static/emoji/1f405.png b/hub/static/emoji/1f405.png new file mode 100644 index 0000000..0b7f0eb Binary files /dev/null and b/hub/static/emoji/1f405.png differ diff --git a/hub/static/emoji/1f406.png b/hub/static/emoji/1f406.png new file mode 100644 index 0000000..0088e88 Binary files /dev/null and b/hub/static/emoji/1f406.png differ diff --git a/hub/static/emoji/1f407.png b/hub/static/emoji/1f407.png new file mode 100644 index 0000000..fd7830e Binary files /dev/null and b/hub/static/emoji/1f407.png differ diff --git a/hub/static/emoji/1f408.png b/hub/static/emoji/1f408.png new file mode 100644 index 0000000..e3f4a0d Binary files /dev/null and b/hub/static/emoji/1f408.png differ diff --git a/hub/static/emoji/1f409.png b/hub/static/emoji/1f409.png new file mode 100644 index 0000000..60b19a4 Binary files /dev/null and b/hub/static/emoji/1f409.png differ diff --git a/hub/static/emoji/1f410.png b/hub/static/emoji/1f410.png new file mode 100644 index 0000000..a6f5479 Binary files /dev/null and b/hub/static/emoji/1f410.png differ diff --git a/hub/static/emoji/1f411.png b/hub/static/emoji/1f411.png new file mode 100644 index 0000000..6ea5818 Binary files /dev/null and b/hub/static/emoji/1f411.png differ diff --git a/hub/static/emoji/1f412.png b/hub/static/emoji/1f412.png new file mode 100644 index 0000000..f71be14 Binary files /dev/null and b/hub/static/emoji/1f412.png differ diff --git a/hub/static/emoji/1f413.png b/hub/static/emoji/1f413.png new file mode 100644 index 0000000..ea5c856 Binary files /dev/null and b/hub/static/emoji/1f413.png differ diff --git a/hub/static/emoji/1f414.png b/hub/static/emoji/1f414.png new file mode 100644 index 0000000..dc0ac73 Binary files /dev/null and b/hub/static/emoji/1f414.png differ diff --git a/hub/static/emoji/1f415.png b/hub/static/emoji/1f415.png new file mode 100644 index 0000000..544b06c Binary files /dev/null and b/hub/static/emoji/1f415.png differ diff --git a/hub/static/emoji/1f416.png b/hub/static/emoji/1f416.png new file mode 100644 index 0000000..2492c56 Binary files /dev/null and b/hub/static/emoji/1f416.png differ diff --git a/hub/static/emoji/1f417.png b/hub/static/emoji/1f417.png new file mode 100644 index 0000000..fe9ceb0 Binary files /dev/null and b/hub/static/emoji/1f417.png differ diff --git a/hub/static/emoji/1f418.png b/hub/static/emoji/1f418.png new file mode 100644 index 0000000..4a3a075 Binary files /dev/null and b/hub/static/emoji/1f418.png differ diff --git a/hub/static/emoji/1f419.png b/hub/static/emoji/1f419.png new file mode 100644 index 0000000..63c9a13 Binary files /dev/null and b/hub/static/emoji/1f419.png differ diff --git a/hub/static/emoji/1f420.png b/hub/static/emoji/1f420.png new file mode 100644 index 0000000..4a02ce1 Binary files /dev/null and b/hub/static/emoji/1f420.png differ diff --git a/hub/static/emoji/1f421.png b/hub/static/emoji/1f421.png new file mode 100644 index 0000000..d9286fd Binary files /dev/null and b/hub/static/emoji/1f421.png differ diff --git a/hub/static/emoji/1f422.png b/hub/static/emoji/1f422.png new file mode 100644 index 0000000..4ab991b Binary files /dev/null and b/hub/static/emoji/1f422.png differ diff --git a/hub/static/emoji/1f423.png b/hub/static/emoji/1f423.png new file mode 100644 index 0000000..e471ba2 Binary files /dev/null and b/hub/static/emoji/1f423.png differ diff --git a/hub/static/emoji/1f424.png b/hub/static/emoji/1f424.png new file mode 100644 index 0000000..4e27df5 Binary files /dev/null and b/hub/static/emoji/1f424.png differ diff --git a/hub/static/emoji/1f425.png b/hub/static/emoji/1f425.png new file mode 100644 index 0000000..2593d56 Binary files /dev/null and b/hub/static/emoji/1f425.png differ diff --git a/hub/static/emoji/1f426.png b/hub/static/emoji/1f426.png new file mode 100644 index 0000000..19c7c57 Binary files /dev/null and b/hub/static/emoji/1f426.png differ diff --git a/hub/static/emoji/1f427.png b/hub/static/emoji/1f427.png new file mode 100644 index 0000000..fd36388 Binary files /dev/null and b/hub/static/emoji/1f427.png differ diff --git a/hub/static/emoji/1f428.png b/hub/static/emoji/1f428.png new file mode 100644 index 0000000..7dc6ffc Binary files /dev/null and b/hub/static/emoji/1f428.png differ diff --git a/hub/static/emoji/1f429.png b/hub/static/emoji/1f429.png new file mode 100644 index 0000000..6e77dc3 Binary files /dev/null and b/hub/static/emoji/1f429.png differ diff --git a/hub/static/emoji/1f430.png b/hub/static/emoji/1f430.png new file mode 100644 index 0000000..a75b275 Binary files /dev/null and b/hub/static/emoji/1f430.png differ diff --git a/hub/static/emoji/1f431.png b/hub/static/emoji/1f431.png new file mode 100644 index 0000000..0c41468 Binary files /dev/null and b/hub/static/emoji/1f431.png differ diff --git a/hub/static/emoji/1f432.png b/hub/static/emoji/1f432.png new file mode 100644 index 0000000..a082fc5 Binary files /dev/null and b/hub/static/emoji/1f432.png differ diff --git a/hub/static/emoji/1f433.png b/hub/static/emoji/1f433.png new file mode 100644 index 0000000..2e5f613 Binary files /dev/null and b/hub/static/emoji/1f433.png differ diff --git a/hub/static/emoji/1f434.png b/hub/static/emoji/1f434.png new file mode 100644 index 0000000..f7d1431 Binary files /dev/null and b/hub/static/emoji/1f434.png differ diff --git a/hub/static/emoji/1f435.png b/hub/static/emoji/1f435.png new file mode 100644 index 0000000..a373552 Binary files /dev/null and b/hub/static/emoji/1f435.png differ diff --git a/hub/static/emoji/1f436.png b/hub/static/emoji/1f436.png new file mode 100644 index 0000000..cb5afae Binary files /dev/null and b/hub/static/emoji/1f436.png differ diff --git a/hub/static/emoji/1f437.png b/hub/static/emoji/1f437.png new file mode 100644 index 0000000..45baef3 Binary files /dev/null and b/hub/static/emoji/1f437.png differ diff --git a/hub/static/emoji/1f438.png b/hub/static/emoji/1f438.png new file mode 100644 index 0000000..cc3d027 Binary files /dev/null and b/hub/static/emoji/1f438.png differ diff --git a/hub/static/emoji/1f439.png b/hub/static/emoji/1f439.png new file mode 100644 index 0000000..f8de04a Binary files /dev/null and b/hub/static/emoji/1f439.png differ diff --git a/hub/static/emoji/1f440.png b/hub/static/emoji/1f440.png new file mode 100644 index 0000000..543cd83 Binary files /dev/null and b/hub/static/emoji/1f440.png differ diff --git a/hub/static/emoji/1f445.png b/hub/static/emoji/1f445.png new file mode 100644 index 0000000..a79abe0 Binary files /dev/null and b/hub/static/emoji/1f445.png differ diff --git a/hub/static/emoji/1f446.png b/hub/static/emoji/1f446.png new file mode 100644 index 0000000..0b22c98 Binary files /dev/null and b/hub/static/emoji/1f446.png differ diff --git a/hub/static/emoji/1f447.png b/hub/static/emoji/1f447.png new file mode 100644 index 0000000..275970f Binary files /dev/null and b/hub/static/emoji/1f447.png differ diff --git a/hub/static/emoji/1f448.png b/hub/static/emoji/1f448.png new file mode 100644 index 0000000..fe1c9e2 Binary files /dev/null and b/hub/static/emoji/1f448.png differ diff --git a/hub/static/emoji/1f449.png b/hub/static/emoji/1f449.png new file mode 100644 index 0000000..54b368a Binary files /dev/null and b/hub/static/emoji/1f449.png differ diff --git a/hub/static/emoji/1f450.png b/hub/static/emoji/1f450.png new file mode 100644 index 0000000..54ce8e2 Binary files /dev/null and b/hub/static/emoji/1f450.png differ diff --git a/hub/static/emoji/1f600.png b/hub/static/emoji/1f600.png new file mode 100644 index 0000000..34ac223 Binary files /dev/null and b/hub/static/emoji/1f600.png differ diff --git a/hub/static/emoji/1f601.png b/hub/static/emoji/1f601.png new file mode 100644 index 0000000..394fcef Binary files /dev/null and b/hub/static/emoji/1f601.png differ diff --git a/hub/static/emoji/1f602.png b/hub/static/emoji/1f602.png new file mode 100644 index 0000000..b2a2037 Binary files /dev/null and b/hub/static/emoji/1f602.png differ diff --git a/hub/static/emoji/1f603.png b/hub/static/emoji/1f603.png new file mode 100644 index 0000000..add5433 Binary files /dev/null and b/hub/static/emoji/1f603.png differ diff --git a/hub/static/emoji/1f604.png b/hub/static/emoji/1f604.png new file mode 100644 index 0000000..642c90c Binary files /dev/null and b/hub/static/emoji/1f604.png differ diff --git a/hub/static/emoji/1f605.png b/hub/static/emoji/1f605.png new file mode 100644 index 0000000..c80fbcf Binary files /dev/null and b/hub/static/emoji/1f605.png differ diff --git a/hub/static/emoji/1f606.png b/hub/static/emoji/1f606.png new file mode 100644 index 0000000..a0f1a82 Binary files /dev/null and b/hub/static/emoji/1f606.png differ diff --git a/hub/static/emoji/1f607.png b/hub/static/emoji/1f607.png new file mode 100644 index 0000000..5a51477 Binary files /dev/null and b/hub/static/emoji/1f607.png differ diff --git a/hub/static/emoji/1f608.png b/hub/static/emoji/1f608.png new file mode 100644 index 0000000..66a8653 Binary files /dev/null and b/hub/static/emoji/1f608.png differ diff --git a/hub/static/emoji/1f609.png b/hub/static/emoji/1f609.png new file mode 100644 index 0000000..ebd7e32 Binary files /dev/null and b/hub/static/emoji/1f609.png differ diff --git a/hub/static/emoji/1f60a.png b/hub/static/emoji/1f60a.png new file mode 100644 index 0000000..48bd35e Binary files /dev/null and b/hub/static/emoji/1f60a.png differ diff --git a/hub/static/emoji/1f60b.png b/hub/static/emoji/1f60b.png new file mode 100644 index 0000000..cd81753 Binary files /dev/null and b/hub/static/emoji/1f60b.png differ diff --git a/hub/static/emoji/1f60c.png b/hub/static/emoji/1f60c.png new file mode 100644 index 0000000..a6a8971 Binary files /dev/null and b/hub/static/emoji/1f60c.png differ diff --git a/hub/static/emoji/1f60d.png b/hub/static/emoji/1f60d.png new file mode 100644 index 0000000..857e1be Binary files /dev/null and b/hub/static/emoji/1f60d.png differ diff --git a/hub/static/emoji/1f60e.png b/hub/static/emoji/1f60e.png new file mode 100644 index 0000000..2c8b711 Binary files /dev/null and b/hub/static/emoji/1f60e.png differ diff --git a/hub/static/emoji/1f60f.png b/hub/static/emoji/1f60f.png new file mode 100644 index 0000000..70240ea Binary files /dev/null and b/hub/static/emoji/1f60f.png differ diff --git a/hub/static/emoji/1f610.png b/hub/static/emoji/1f610.png new file mode 100644 index 0000000..2cfa8c4 Binary files /dev/null and b/hub/static/emoji/1f610.png differ diff --git a/hub/static/emoji/1f611.png b/hub/static/emoji/1f611.png new file mode 100644 index 0000000..b18262c Binary files /dev/null and b/hub/static/emoji/1f611.png differ diff --git a/hub/static/emoji/1f612.png b/hub/static/emoji/1f612.png new file mode 100644 index 0000000..7152d29 Binary files /dev/null and b/hub/static/emoji/1f612.png differ diff --git a/hub/static/emoji/1f613.png b/hub/static/emoji/1f613.png new file mode 100644 index 0000000..2154e41 Binary files /dev/null and b/hub/static/emoji/1f613.png differ diff --git a/hub/static/emoji/1f614.png b/hub/static/emoji/1f614.png new file mode 100644 index 0000000..5935c47 Binary files /dev/null and b/hub/static/emoji/1f614.png differ diff --git a/hub/static/emoji/1f615.png b/hub/static/emoji/1f615.png new file mode 100644 index 0000000..b5c5b07 Binary files /dev/null and b/hub/static/emoji/1f615.png differ diff --git a/hub/static/emoji/1f616.png b/hub/static/emoji/1f616.png new file mode 100644 index 0000000..a986720 Binary files /dev/null and b/hub/static/emoji/1f616.png differ diff --git a/hub/static/emoji/1f617.png b/hub/static/emoji/1f617.png new file mode 100644 index 0000000..12d18f7 Binary files /dev/null and b/hub/static/emoji/1f617.png differ diff --git a/hub/static/emoji/1f618.png b/hub/static/emoji/1f618.png new file mode 100644 index 0000000..f85e7ba Binary files /dev/null and b/hub/static/emoji/1f618.png differ diff --git a/hub/static/emoji/1f619.png b/hub/static/emoji/1f619.png new file mode 100644 index 0000000..871680f Binary files /dev/null and b/hub/static/emoji/1f619.png differ diff --git a/hub/static/emoji/1f61a.png b/hub/static/emoji/1f61a.png new file mode 100644 index 0000000..b22b35c Binary files /dev/null and b/hub/static/emoji/1f61a.png differ diff --git a/hub/static/emoji/1f61b.png b/hub/static/emoji/1f61b.png new file mode 100644 index 0000000..f036ed3 Binary files /dev/null and b/hub/static/emoji/1f61b.png differ diff --git a/hub/static/emoji/1f61c.png b/hub/static/emoji/1f61c.png new file mode 100644 index 0000000..46b8fa0 Binary files /dev/null and b/hub/static/emoji/1f61c.png differ diff --git a/hub/static/emoji/1f61d.png b/hub/static/emoji/1f61d.png new file mode 100644 index 0000000..05b6961 Binary files /dev/null and b/hub/static/emoji/1f61d.png differ diff --git a/hub/static/emoji/1f61e.png b/hub/static/emoji/1f61e.png new file mode 100644 index 0000000..22bf80d Binary files /dev/null and b/hub/static/emoji/1f61e.png differ diff --git a/hub/static/emoji/1f61f.png b/hub/static/emoji/1f61f.png new file mode 100644 index 0000000..4048ebf Binary files /dev/null and b/hub/static/emoji/1f61f.png differ diff --git a/hub/static/emoji/1f620.png b/hub/static/emoji/1f620.png new file mode 100644 index 0000000..6c69d9b Binary files /dev/null and b/hub/static/emoji/1f620.png differ diff --git a/hub/static/emoji/1f621.png b/hub/static/emoji/1f621.png new file mode 100644 index 0000000..c1ab5d1 Binary files /dev/null and b/hub/static/emoji/1f621.png differ diff --git a/hub/static/emoji/1f622.png b/hub/static/emoji/1f622.png new file mode 100644 index 0000000..5f1690d Binary files /dev/null and b/hub/static/emoji/1f622.png differ diff --git a/hub/static/emoji/1f623.png b/hub/static/emoji/1f623.png new file mode 100644 index 0000000..9fe8a28 Binary files /dev/null and b/hub/static/emoji/1f623.png differ diff --git a/hub/static/emoji/1f624.png b/hub/static/emoji/1f624.png new file mode 100644 index 0000000..4f0a6c1 Binary files /dev/null and b/hub/static/emoji/1f624.png differ diff --git a/hub/static/emoji/1f625.png b/hub/static/emoji/1f625.png new file mode 100644 index 0000000..d73d8a3 Binary files /dev/null and b/hub/static/emoji/1f625.png differ diff --git a/hub/static/emoji/1f626.png b/hub/static/emoji/1f626.png new file mode 100644 index 0000000..03a5724 Binary files /dev/null and b/hub/static/emoji/1f626.png differ diff --git a/hub/static/emoji/1f627.png b/hub/static/emoji/1f627.png new file mode 100644 index 0000000..70219ed Binary files /dev/null and b/hub/static/emoji/1f627.png differ diff --git a/hub/static/emoji/1f628.png b/hub/static/emoji/1f628.png new file mode 100644 index 0000000..1fafb01 Binary files /dev/null and b/hub/static/emoji/1f628.png differ diff --git a/hub/static/emoji/1f629.png b/hub/static/emoji/1f629.png new file mode 100644 index 0000000..1ef63c7 Binary files /dev/null and b/hub/static/emoji/1f629.png differ diff --git a/hub/static/emoji/1f62a.png b/hub/static/emoji/1f62a.png new file mode 100644 index 0000000..e3720f8 Binary files /dev/null and b/hub/static/emoji/1f62a.png differ diff --git a/hub/static/emoji/1f62b.png b/hub/static/emoji/1f62b.png new file mode 100644 index 0000000..567b854 Binary files /dev/null and b/hub/static/emoji/1f62b.png differ diff --git a/hub/static/emoji/1f62c.png b/hub/static/emoji/1f62c.png new file mode 100644 index 0000000..3819f5f Binary files /dev/null and b/hub/static/emoji/1f62c.png differ diff --git a/hub/static/emoji/1f62d.png b/hub/static/emoji/1f62d.png new file mode 100644 index 0000000..a6d7388 Binary files /dev/null and b/hub/static/emoji/1f62d.png differ diff --git a/hub/static/emoji/1f62e.png b/hub/static/emoji/1f62e.png new file mode 100644 index 0000000..d5b3155 Binary files /dev/null and b/hub/static/emoji/1f62e.png differ diff --git a/hub/static/emoji/1f62f.png b/hub/static/emoji/1f62f.png new file mode 100644 index 0000000..7df7660 Binary files /dev/null and b/hub/static/emoji/1f62f.png differ diff --git a/hub/static/emoji/1f630.png b/hub/static/emoji/1f630.png new file mode 100644 index 0000000..a4c2cb9 Binary files /dev/null and b/hub/static/emoji/1f630.png differ diff --git a/hub/static/emoji/1f631.png b/hub/static/emoji/1f631.png new file mode 100644 index 0000000..51396ec Binary files /dev/null and b/hub/static/emoji/1f631.png differ diff --git a/hub/static/emoji/1f632.png b/hub/static/emoji/1f632.png new file mode 100644 index 0000000..2734543 Binary files /dev/null and b/hub/static/emoji/1f632.png differ diff --git a/hub/static/emoji/1f633.png b/hub/static/emoji/1f633.png new file mode 100644 index 0000000..c973f63 Binary files /dev/null and b/hub/static/emoji/1f633.png differ diff --git a/hub/static/emoji/1f634.png b/hub/static/emoji/1f634.png new file mode 100644 index 0000000..b521d03 Binary files /dev/null and b/hub/static/emoji/1f634.png differ diff --git a/hub/static/emoji/1f635.png b/hub/static/emoji/1f635.png new file mode 100644 index 0000000..45d3443 Binary files /dev/null and b/hub/static/emoji/1f635.png differ diff --git a/hub/static/emoji/1f636.png b/hub/static/emoji/1f636.png new file mode 100644 index 0000000..1ce9b90 Binary files /dev/null and b/hub/static/emoji/1f636.png differ diff --git a/hub/static/emoji/1f637.png b/hub/static/emoji/1f637.png new file mode 100644 index 0000000..f329141 Binary files /dev/null and b/hub/static/emoji/1f637.png differ diff --git a/hub/static/emoji/1f638.png b/hub/static/emoji/1f638.png new file mode 100644 index 0000000..81b6e5c Binary files /dev/null and b/hub/static/emoji/1f638.png differ diff --git a/hub/static/emoji/1f639.png b/hub/static/emoji/1f639.png new file mode 100644 index 0000000..dbd4f34 Binary files /dev/null and b/hub/static/emoji/1f639.png differ diff --git a/hub/static/emoji/1f63a.png b/hub/static/emoji/1f63a.png new file mode 100644 index 0000000..d8d42a8 Binary files /dev/null and b/hub/static/emoji/1f63a.png differ diff --git a/hub/static/emoji/1f63b.png b/hub/static/emoji/1f63b.png new file mode 100644 index 0000000..7fcb09e Binary files /dev/null and b/hub/static/emoji/1f63b.png differ diff --git a/hub/static/emoji/1f63c.png b/hub/static/emoji/1f63c.png new file mode 100644 index 0000000..24f9337 Binary files /dev/null and b/hub/static/emoji/1f63c.png differ diff --git a/hub/static/emoji/1f63d.png b/hub/static/emoji/1f63d.png new file mode 100644 index 0000000..b454c64 Binary files /dev/null and b/hub/static/emoji/1f63d.png differ diff --git a/hub/static/emoji/1f63e.png b/hub/static/emoji/1f63e.png new file mode 100644 index 0000000..77a4195 Binary files /dev/null and b/hub/static/emoji/1f63e.png differ diff --git a/hub/static/emoji/1f63f.png b/hub/static/emoji/1f63f.png new file mode 100644 index 0000000..112d9b0 Binary files /dev/null and b/hub/static/emoji/1f63f.png differ diff --git a/hub/static/emoji/1f640.png b/hub/static/emoji/1f640.png new file mode 100644 index 0000000..46095ab Binary files /dev/null and b/hub/static/emoji/1f640.png differ diff --git a/hub/static/emoji/1f645.png b/hub/static/emoji/1f645.png new file mode 100644 index 0000000..120adca Binary files /dev/null and b/hub/static/emoji/1f645.png differ diff --git a/hub/static/emoji/1f646.png b/hub/static/emoji/1f646.png new file mode 100644 index 0000000..78d65bc Binary files /dev/null and b/hub/static/emoji/1f646.png differ diff --git a/hub/static/emoji/1f647.png b/hub/static/emoji/1f647.png new file mode 100644 index 0000000..44739d3 Binary files /dev/null and b/hub/static/emoji/1f647.png differ diff --git a/hub/static/emoji/1f648.png b/hub/static/emoji/1f648.png new file mode 100644 index 0000000..193927e Binary files /dev/null and b/hub/static/emoji/1f648.png differ diff --git a/hub/static/emoji/1f649.png b/hub/static/emoji/1f649.png new file mode 100644 index 0000000..dc5c4b2 Binary files /dev/null and b/hub/static/emoji/1f649.png differ diff --git a/hub/static/emoji/1f64a.png b/hub/static/emoji/1f64a.png new file mode 100644 index 0000000..e78d285 Binary files /dev/null and b/hub/static/emoji/1f64a.png differ diff --git a/hub/static/emoji/1f64f.png b/hub/static/emoji/1f64f.png new file mode 100644 index 0000000..e866b14 Binary files /dev/null and b/hub/static/emoji/1f64f.png differ diff --git a/hub/static/emoji/1f680.png b/hub/static/emoji/1f680.png new file mode 100644 index 0000000..64d83ea Binary files /dev/null and b/hub/static/emoji/1f680.png differ diff --git a/hub/static/emoji/1f681.png b/hub/static/emoji/1f681.png new file mode 100644 index 0000000..cfa64f4 Binary files /dev/null and b/hub/static/emoji/1f681.png differ diff --git a/hub/static/emoji/1f682.png b/hub/static/emoji/1f682.png new file mode 100644 index 0000000..7e6d80a Binary files /dev/null and b/hub/static/emoji/1f682.png differ diff --git a/hub/static/emoji/2049.png b/hub/static/emoji/2049.png new file mode 100644 index 0000000..a8e1ec2 Binary files /dev/null and b/hub/static/emoji/2049.png differ diff --git a/hub/static/emoji/261D.png b/hub/static/emoji/261D.png new file mode 100644 index 0000000..387fe59 Binary files /dev/null and b/hub/static/emoji/261D.png differ diff --git a/hub/static/emoji/263A.png b/hub/static/emoji/263A.png new file mode 100644 index 0000000..ea6e93a Binary files /dev/null and b/hub/static/emoji/263A.png differ diff --git a/hub/static/emoji/2705.png b/hub/static/emoji/2705.png new file mode 100644 index 0000000..241a4f6 Binary files /dev/null and b/hub/static/emoji/2705.png differ diff --git a/hub/static/emoji/270A.png b/hub/static/emoji/270A.png new file mode 100644 index 0000000..97e5b06 Binary files /dev/null and b/hub/static/emoji/270A.png differ diff --git a/hub/static/emoji/270B.png b/hub/static/emoji/270B.png new file mode 100755 index 0000000..89de966 Binary files /dev/null and b/hub/static/emoji/270B.png differ diff --git a/hub/static/emoji/270C.png b/hub/static/emoji/270C.png new file mode 100644 index 0000000..0b7aa52 Binary files /dev/null and b/hub/static/emoji/270C.png differ diff --git a/hub/static/emoji/270F.png b/hub/static/emoji/270F.png new file mode 100644 index 0000000..693ee84 Binary files /dev/null and b/hub/static/emoji/270F.png differ diff --git a/hub/static/emoji/2714.png b/hub/static/emoji/2714.png new file mode 100644 index 0000000..239ea09 Binary files /dev/null and b/hub/static/emoji/2714.png differ diff --git a/hub/static/emoji/2716.png b/hub/static/emoji/2716.png new file mode 100644 index 0000000..a75fd57 Binary files /dev/null and b/hub/static/emoji/2716.png differ diff --git a/hub/static/emoji/274C.png b/hub/static/emoji/274C.png new file mode 100644 index 0000000..18de930 Binary files /dev/null and b/hub/static/emoji/274C.png differ diff --git a/hub/static/emoji/274E.png b/hub/static/emoji/274E.png new file mode 100644 index 0000000..90ca183 Binary files /dev/null and b/hub/static/emoji/274E.png differ diff --git a/hub/static/emoji/2753.png b/hub/static/emoji/2753.png new file mode 100644 index 0000000..9e84758 Binary files /dev/null and b/hub/static/emoji/2753.png differ diff --git a/hub/static/emoji/2754.png b/hub/static/emoji/2754.png new file mode 100644 index 0000000..7808b13 Binary files /dev/null and b/hub/static/emoji/2754.png differ diff --git a/hub/static/emoji/2755.png b/hub/static/emoji/2755.png new file mode 100644 index 0000000..759d6e7 Binary files /dev/null and b/hub/static/emoji/2755.png differ diff --git a/hub/static/emoji/2757.png b/hub/static/emoji/2757.png new file mode 100644 index 0000000..b8fca78 Binary files /dev/null and b/hub/static/emoji/2757.png differ diff --git a/hub/static/emoji/2764.png b/hub/static/emoji/2764.png new file mode 100644 index 0000000..af35e22 Binary files /dev/null and b/hub/static/emoji/2764.png differ diff --git a/hub/static/emoji/303D.png b/hub/static/emoji/303D.png new file mode 100644 index 0000000..d39063e Binary files /dev/null and b/hub/static/emoji/303D.png differ diff --git a/hub/static/emoji/Aquarius.png b/hub/static/emoji/Aquarius.png new file mode 100644 index 0000000..bf586a0 Binary files /dev/null and b/hub/static/emoji/Aquarius.png differ diff --git a/hub/static/emoji/Aries.png b/hub/static/emoji/Aries.png new file mode 100644 index 0000000..4292009 Binary files /dev/null and b/hub/static/emoji/Aries.png differ diff --git a/hub/static/emoji/Cancer.png b/hub/static/emoji/Cancer.png new file mode 100644 index 0000000..e29031f Binary files /dev/null and b/hub/static/emoji/Cancer.png differ diff --git a/hub/static/emoji/Capricorn.png b/hub/static/emoji/Capricorn.png new file mode 100644 index 0000000..e41f5e4 Binary files /dev/null and b/hub/static/emoji/Capricorn.png differ diff --git a/hub/static/emoji/DSLR_click.png b/hub/static/emoji/DSLR_click.png new file mode 100644 index 0000000..3e7d5a9 Binary files /dev/null and b/hub/static/emoji/DSLR_click.png differ diff --git a/hub/static/emoji/GAKUEngine.png b/hub/static/emoji/GAKUEngine.png new file mode 100644 index 0000000..696db09 Binary files /dev/null and b/hub/static/emoji/GAKUEngine.png differ diff --git a/hub/static/emoji/Gemini.png b/hub/static/emoji/Gemini.png new file mode 100644 index 0000000..4a057ae Binary files /dev/null and b/hub/static/emoji/Gemini.png differ diff --git a/hub/static/emoji/Giorgio.png b/hub/static/emoji/Giorgio.png new file mode 100644 index 0000000..ffae130 Binary files /dev/null and b/hub/static/emoji/Giorgio.png differ diff --git a/hub/static/emoji/Happy_FMC.png b/hub/static/emoji/Happy_FMC.png new file mode 100644 index 0000000..91c58cf Binary files /dev/null and b/hub/static/emoji/Happy_FMC.png differ diff --git a/hub/static/emoji/Kagetsuki.png b/hub/static/emoji/Kagetsuki.png new file mode 100644 index 0000000..ec6e01f Binary files /dev/null and b/hub/static/emoji/Kagetsuki.png differ diff --git a/hub/static/emoji/Leo.png b/hub/static/emoji/Leo.png new file mode 100644 index 0000000..4334c09 Binary files /dev/null and b/hub/static/emoji/Leo.png differ diff --git a/hub/static/emoji/Libra.png b/hub/static/emoji/Libra.png new file mode 100644 index 0000000..91bf781 Binary files /dev/null and b/hub/static/emoji/Libra.png differ diff --git a/hub/static/emoji/Pisces.png b/hub/static/emoji/Pisces.png new file mode 100644 index 0000000..fdaeea0 Binary files /dev/null and b/hub/static/emoji/Pisces.png differ diff --git a/hub/static/emoji/RV.png b/hub/static/emoji/RV.png new file mode 100644 index 0000000..d38f50e Binary files /dev/null and b/hub/static/emoji/RV.png differ diff --git a/hub/static/emoji/Sagittarius.png b/hub/static/emoji/Sagittarius.png new file mode 100644 index 0000000..ba4f2b9 Binary files /dev/null and b/hub/static/emoji/Sagittarius.png differ diff --git a/hub/static/emoji/Scorpius.png b/hub/static/emoji/Scorpius.png new file mode 100644 index 0000000..9509f4f Binary files /dev/null and b/hub/static/emoji/Scorpius.png differ diff --git a/hub/static/emoji/Taurus.png b/hub/static/emoji/Taurus.png new file mode 100644 index 0000000..e8ae3ca Binary files /dev/null and b/hub/static/emoji/Taurus.png differ diff --git a/hub/static/emoji/Virgo.png b/hub/static/emoji/Virgo.png new file mode 100644 index 0000000..c2c7520 Binary files /dev/null and b/hub/static/emoji/Virgo.png differ diff --git a/hub/static/emoji/anchor.png b/hub/static/emoji/anchor.png new file mode 100644 index 0000000..2386ca0 Binary files /dev/null and b/hub/static/emoji/anchor.png differ diff --git a/hub/static/emoji/angry_face.png b/hub/static/emoji/angry_face.png new file mode 100644 index 0000000..c74d043 Binary files /dev/null and b/hub/static/emoji/angry_face.png differ diff --git a/hub/static/emoji/anguished.png b/hub/static/emoji/anguished.png new file mode 100644 index 0000000..818ffde Binary files /dev/null and b/hub/static/emoji/anguished.png differ diff --git a/hub/static/emoji/apple_of_discord.png b/hub/static/emoji/apple_of_discord.png new file mode 100644 index 0000000..22e2560 Binary files /dev/null and b/hub/static/emoji/apple_of_discord.png differ diff --git a/hub/static/emoji/assault_rifle.png b/hub/static/emoji/assault_rifle.png new file mode 100644 index 0000000..2bd1611 Binary files /dev/null and b/hub/static/emoji/assault_rifle.png differ diff --git a/hub/static/emoji/astonished_face.png b/hub/static/emoji/astonished_face.png new file mode 100644 index 0000000..b733714 Binary files /dev/null and b/hub/static/emoji/astonished_face.png differ diff --git a/hub/static/emoji/bactrian_camel.png b/hub/static/emoji/bactrian_camel.png new file mode 100644 index 0000000..10c2d7d Binary files /dev/null and b/hub/static/emoji/bactrian_camel.png differ diff --git a/hub/static/emoji/beer_mug.png b/hub/static/emoji/beer_mug.png new file mode 100644 index 0000000..f94eaed Binary files /dev/null and b/hub/static/emoji/beer_mug.png differ diff --git a/hub/static/emoji/bento_box.png b/hub/static/emoji/bento_box.png new file mode 100644 index 0000000..d3ca9a5 Binary files /dev/null and b/hub/static/emoji/bento_box.png differ diff --git a/hub/static/emoji/bgok.png b/hub/static/emoji/bgok.png new file mode 100644 index 0000000..3f07f0e Binary files /dev/null and b/hub/static/emoji/bgok.png differ diff --git a/hub/static/emoji/blowfish.png b/hub/static/emoji/blowfish.png new file mode 100644 index 0000000..7f8cad9 Binary files /dev/null and b/hub/static/emoji/blowfish.png differ diff --git a/hub/static/emoji/blush.png b/hub/static/emoji/blush.png new file mode 100644 index 0000000..b03bb1a Binary files /dev/null and b/hub/static/emoji/blush.png differ diff --git a/hub/static/emoji/boar.png b/hub/static/emoji/boar.png new file mode 100644 index 0000000..beb32e7 Binary files /dev/null and b/hub/static/emoji/boar.png differ diff --git a/hub/static/emoji/bus_stop.png b/hub/static/emoji/bus_stop.png new file mode 100644 index 0000000..50d3339 Binary files /dev/null and b/hub/static/emoji/bus_stop.png differ diff --git a/hub/static/emoji/cactus.png b/hub/static/emoji/cactus.png new file mode 100644 index 0000000..c9f4e95 Binary files /dev/null and b/hub/static/emoji/cactus.png differ diff --git a/hub/static/emoji/cake.png b/hub/static/emoji/cake.png new file mode 100644 index 0000000..a95953d Binary files /dev/null and b/hub/static/emoji/cake.png differ diff --git a/hub/static/emoji/car.png b/hub/static/emoji/car.png new file mode 100644 index 0000000..07d1efa Binary files /dev/null and b/hub/static/emoji/car.png differ diff --git a/hub/static/emoji/cat_face.png b/hub/static/emoji/cat_face.png new file mode 100644 index 0000000..81178d1 Binary files /dev/null and b/hub/static/emoji/cat_face.png differ diff --git a/hub/static/emoji/cat_face_with_tears_of_joy.png b/hub/static/emoji/cat_face_with_tears_of_joy.png new file mode 100644 index 0000000..75c70e0 Binary files /dev/null and b/hub/static/emoji/cat_face_with_tears_of_joy.png differ diff --git a/hub/static/emoji/cat_face_with_wry_smile.png b/hub/static/emoji/cat_face_with_wry_smile.png new file mode 100644 index 0000000..5831503 Binary files /dev/null and b/hub/static/emoji/cat_face_with_wry_smile.png differ diff --git a/hub/static/emoji/chicken.png b/hub/static/emoji/chicken.png new file mode 100644 index 0000000..9f6c199 Binary files /dev/null and b/hub/static/emoji/chicken.png differ diff --git a/hub/static/emoji/circled_ideograph_secret.png b/hub/static/emoji/circled_ideograph_secret.png new file mode 100644 index 0000000..a32e68f Binary files /dev/null and b/hub/static/emoji/circled_ideograph_secret.png differ diff --git a/hub/static/emoji/cloud.png b/hub/static/emoji/cloud.png new file mode 100644 index 0000000..fb8aa17 Binary files /dev/null and b/hub/static/emoji/cloud.png differ diff --git a/hub/static/emoji/confused.png b/hub/static/emoji/confused.png new file mode 100644 index 0000000..bce353b Binary files /dev/null and b/hub/static/emoji/confused.png differ diff --git a/hub/static/emoji/couple_holding_hands.png b/hub/static/emoji/couple_holding_hands.png new file mode 100644 index 0000000..0443167 Binary files /dev/null and b/hub/static/emoji/couple_holding_hands.png differ diff --git a/hub/static/emoji/couple_in_love.png b/hub/static/emoji/couple_in_love.png new file mode 100644 index 0000000..f7d6dca Binary files /dev/null and b/hub/static/emoji/couple_in_love.png differ diff --git a/hub/static/emoji/couple_with_heart.png b/hub/static/emoji/couple_with_heart.png new file mode 100644 index 0000000..8c1431d Binary files /dev/null and b/hub/static/emoji/couple_with_heart.png differ diff --git a/hub/static/emoji/crescent_moon.png b/hub/static/emoji/crescent_moon.png new file mode 100644 index 0000000..b8d31d6 Binary files /dev/null and b/hub/static/emoji/crescent_moon.png differ diff --git a/hub/static/emoji/crying_cat_face.png b/hub/static/emoji/crying_cat_face.png new file mode 100644 index 0000000..c057a10 Binary files /dev/null and b/hub/static/emoji/crying_cat_face.png differ diff --git a/hub/static/emoji/crying_face.png b/hub/static/emoji/crying_face.png new file mode 100644 index 0000000..c5a3b5b Binary files /dev/null and b/hub/static/emoji/crying_face.png differ diff --git a/hub/static/emoji/cutting_lines.png b/hub/static/emoji/cutting_lines.png new file mode 100644 index 0000000..55b9bc9 Binary files /dev/null and b/hub/static/emoji/cutting_lines.png differ diff --git a/hub/static/emoji/cyclone.png b/hub/static/emoji/cyclone.png new file mode 100644 index 0000000..9ed61f5 Binary files /dev/null and b/hub/static/emoji/cyclone.png differ diff --git a/hub/static/emoji/dancer.png b/hub/static/emoji/dancer.png new file mode 100644 index 0000000..16e1e07 Binary files /dev/null and b/hub/static/emoji/dancer.png differ diff --git a/hub/static/emoji/disappointed_but_relieved_face.png b/hub/static/emoji/disappointed_but_relieved_face.png new file mode 100644 index 0000000..333c7ff Binary files /dev/null and b/hub/static/emoji/disappointed_but_relieved_face.png differ diff --git a/hub/static/emoji/disappointed_face.png b/hub/static/emoji/disappointed_face.png new file mode 100644 index 0000000..3b79f00 Binary files /dev/null and b/hub/static/emoji/disappointed_face.png differ diff --git a/hub/static/emoji/dizzy_face.png b/hub/static/emoji/dizzy_face.png new file mode 100644 index 0000000..e99ec8a Binary files /dev/null and b/hub/static/emoji/dizzy_face.png differ diff --git a/hub/static/emoji/dog_face.png b/hub/static/emoji/dog_face.png new file mode 100644 index 0000000..4f1d757 Binary files /dev/null and b/hub/static/emoji/dog_face.png differ diff --git a/hub/static/emoji/drunk.png b/hub/static/emoji/drunk.png new file mode 100644 index 0000000..9ecaf77 Binary files /dev/null and b/hub/static/emoji/drunk.png differ diff --git a/hub/static/emoji/elephant.png b/hub/static/emoji/elephant.png new file mode 100644 index 0000000..bc31a0b Binary files /dev/null and b/hub/static/emoji/elephant.png differ diff --git a/hub/static/emoji/expressionless.png b/hub/static/emoji/expressionless.png new file mode 100644 index 0000000..1a44202 Binary files /dev/null and b/hub/static/emoji/expressionless.png differ diff --git a/hub/static/emoji/extraterrestrial_alien.png b/hub/static/emoji/extraterrestrial_alien.png new file mode 100644 index 0000000..f778244 Binary files /dev/null and b/hub/static/emoji/extraterrestrial_alien.png differ diff --git a/hub/static/emoji/face_savouring_delicious_food.png b/hub/static/emoji/face_savouring_delicious_food.png new file mode 100644 index 0000000..51a6045 Binary files /dev/null and b/hub/static/emoji/face_savouring_delicious_food.png differ diff --git a/hub/static/emoji/face_with_look_of_triumph.png b/hub/static/emoji/face_with_look_of_triumph.png new file mode 100644 index 0000000..00858b7 Binary files /dev/null and b/hub/static/emoji/face_with_look_of_triumph.png differ diff --git a/hub/static/emoji/face_with_medical_mask.png b/hub/static/emoji/face_with_medical_mask.png new file mode 100644 index 0000000..9633f2f Binary files /dev/null and b/hub/static/emoji/face_with_medical_mask.png differ diff --git a/hub/static/emoji/face_with_no_good_gesture.png b/hub/static/emoji/face_with_no_good_gesture.png new file mode 100644 index 0000000..537c3e9 Binary files /dev/null and b/hub/static/emoji/face_with_no_good_gesture.png differ diff --git a/hub/static/emoji/face_with_ok_gesture.png b/hub/static/emoji/face_with_ok_gesture.png new file mode 100644 index 0000000..ff9f684 Binary files /dev/null and b/hub/static/emoji/face_with_ok_gesture.png differ diff --git a/hub/static/emoji/face_with_open_mouth_and_cold_sweat.png b/hub/static/emoji/face_with_open_mouth_and_cold_sweat.png new file mode 100644 index 0000000..1668389 Binary files /dev/null and b/hub/static/emoji/face_with_open_mouth_and_cold_sweat.png differ diff --git a/hub/static/emoji/face_with_tear_of_joy.png b/hub/static/emoji/face_with_tear_of_joy.png new file mode 100644 index 0000000..e838f7a Binary files /dev/null and b/hub/static/emoji/face_with_tear_of_joy.png differ diff --git a/hub/static/emoji/family.png b/hub/static/emoji/family.png new file mode 100644 index 0000000..01dc054 Binary files /dev/null and b/hub/static/emoji/family.png differ diff --git a/hub/static/emoji/family_daughters.png b/hub/static/emoji/family_daughters.png new file mode 100644 index 0000000..6309fcc Binary files /dev/null and b/hub/static/emoji/family_daughters.png differ diff --git a/hub/static/emoji/fearful_face.png b/hub/static/emoji/fearful_face.png new file mode 100644 index 0000000..750ea91 Binary files /dev/null and b/hub/static/emoji/fearful_face.png differ diff --git a/hub/static/emoji/first_quarter_moon.png b/hub/static/emoji/first_quarter_moon.png new file mode 100644 index 0000000..138a223 Binary files /dev/null and b/hub/static/emoji/first_quarter_moon.png differ diff --git a/hub/static/emoji/fish_cake_with_swirl_design.png b/hub/static/emoji/fish_cake_with_swirl_design.png new file mode 100644 index 0000000..47ef60d Binary files /dev/null and b/hub/static/emoji/fish_cake_with_swirl_design.png differ diff --git a/hub/static/emoji/fisted_hand_sign.png b/hub/static/emoji/fisted_hand_sign.png new file mode 100644 index 0000000..3ce1844 Binary files /dev/null and b/hub/static/emoji/fisted_hand_sign.png differ diff --git a/hub/static/emoji/flushed.png b/hub/static/emoji/flushed.png new file mode 100644 index 0000000..ee8aa47 Binary files /dev/null and b/hub/static/emoji/flushed.png differ diff --git a/hub/static/emoji/frog_face.png b/hub/static/emoji/frog_face.png new file mode 100644 index 0000000..77fab03 Binary files /dev/null and b/hub/static/emoji/frog_face.png differ diff --git a/hub/static/emoji/frowning.png b/hub/static/emoji/frowning.png new file mode 100644 index 0000000..0ea99d0 Binary files /dev/null and b/hub/static/emoji/frowning.png differ diff --git a/hub/static/emoji/full_moon.png b/hub/static/emoji/full_moon.png new file mode 100644 index 0000000..efdcaa7 Binary files /dev/null and b/hub/static/emoji/full_moon.png differ diff --git a/hub/static/emoji/genshin.png b/hub/static/emoji/genshin.png new file mode 100644 index 0000000..4ae19e1 Binary files /dev/null and b/hub/static/emoji/genshin.png differ diff --git a/hub/static/emoji/gentleman_octopus.png b/hub/static/emoji/gentleman_octopus.png new file mode 100644 index 0000000..21f51b2 Binary files /dev/null and b/hub/static/emoji/gentleman_octopus.png differ diff --git a/hub/static/emoji/ghost.png b/hub/static/emoji/ghost.png new file mode 100644 index 0000000..bf61c1b Binary files /dev/null and b/hub/static/emoji/ghost.png differ diff --git a/hub/static/emoji/glowing_star.png b/hub/static/emoji/glowing_star.png new file mode 100644 index 0000000..8c3c4b4 Binary files /dev/null and b/hub/static/emoji/glowing_star.png differ diff --git a/hub/static/emoji/grimacing.png b/hub/static/emoji/grimacing.png new file mode 100644 index 0000000..54db01f Binary files /dev/null and b/hub/static/emoji/grimacing.png differ diff --git a/hub/static/emoji/grin.png b/hub/static/emoji/grin.png new file mode 100644 index 0000000..9f2f33b Binary files /dev/null and b/hub/static/emoji/grin.png differ diff --git a/hub/static/emoji/grinning.png b/hub/static/emoji/grinning.png new file mode 100644 index 0000000..e9573c1 Binary files /dev/null and b/hub/static/emoji/grinning.png differ diff --git a/hub/static/emoji/grinning_cat_face_with_smiling_eyes.png b/hub/static/emoji/grinning_cat_face_with_smiling_eyes.png new file mode 100644 index 0000000..e8a2f5c Binary files /dev/null and b/hub/static/emoji/grinning_cat_face_with_smiling_eyes.png differ diff --git a/hub/static/emoji/groupme.png b/hub/static/emoji/groupme.png new file mode 100644 index 0000000..049a7c9 Binary files /dev/null and b/hub/static/emoji/groupme.png differ diff --git a/hub/static/emoji/guitar.png b/hub/static/emoji/guitar.png new file mode 100644 index 0000000..5c220d0 Binary files /dev/null and b/hub/static/emoji/guitar.png differ diff --git a/hub/static/emoji/hamburger.png b/hub/static/emoji/hamburger.png new file mode 100644 index 0000000..07f08bc Binary files /dev/null and b/hub/static/emoji/hamburger.png differ diff --git a/hub/static/emoji/happijar.png b/hub/static/emoji/happijar.png new file mode 100644 index 0000000..444734c Binary files /dev/null and b/hub/static/emoji/happijar.png differ diff --git a/hub/static/emoji/happy_person_raising_one_hand.png b/hub/static/emoji/happy_person_raising_one_hand.png new file mode 100644 index 0000000..5aa17f1 Binary files /dev/null and b/hub/static/emoji/happy_person_raising_one_hand.png differ diff --git a/hub/static/emoji/hatching_chick.png b/hub/static/emoji/hatching_chick.png new file mode 100644 index 0000000..e27b38f Binary files /dev/null and b/hub/static/emoji/hatching_chick.png differ diff --git a/hub/static/emoji/hear_no_evil_monkey.png b/hub/static/emoji/hear_no_evil_monkey.png new file mode 100644 index 0000000..b1d15c2 Binary files /dev/null and b/hub/static/emoji/hear_no_evil_monkey.png differ diff --git a/hub/static/emoji/heart.png b/hub/static/emoji/heart.png new file mode 100644 index 0000000..160175f Binary files /dev/null and b/hub/static/emoji/heart.png differ diff --git a/hub/static/emoji/heart_eyes.png b/hub/static/emoji/heart_eyes.png new file mode 100644 index 0000000..0432d1b Binary files /dev/null and b/hub/static/emoji/heart_eyes.png differ diff --git a/hub/static/emoji/high_hopes.png b/hub/static/emoji/high_hopes.png new file mode 100644 index 0000000..90fbf0b Binary files /dev/null and b/hub/static/emoji/high_hopes.png differ diff --git a/hub/static/emoji/high_voltage_sign.png b/hub/static/emoji/high_voltage_sign.png new file mode 100644 index 0000000..905e9c3 Binary files /dev/null and b/hub/static/emoji/high_voltage_sign.png differ diff --git a/hub/static/emoji/horse.png b/hub/static/emoji/horse.png new file mode 100644 index 0000000..6dbd00b Binary files /dev/null and b/hub/static/emoji/horse.png differ diff --git a/hub/static/emoji/hot_beverage.png b/hub/static/emoji/hot_beverage.png new file mode 100644 index 0000000..06919a6 Binary files /dev/null and b/hub/static/emoji/hot_beverage.png differ diff --git a/hub/static/emoji/hushed.png b/hub/static/emoji/hushed.png new file mode 100644 index 0000000..fbf46b9 Binary files /dev/null and b/hub/static/emoji/hushed.png differ diff --git a/hub/static/emoji/jack_o_lantern.png b/hub/static/emoji/jack_o_lantern.png new file mode 100644 index 0000000..e16fd88 Binary files /dev/null and b/hub/static/emoji/jack_o_lantern.png differ diff --git a/hub/static/emoji/jumping_spider.png b/hub/static/emoji/jumping_spider.png new file mode 100644 index 0000000..8193fe4 Binary files /dev/null and b/hub/static/emoji/jumping_spider.png differ diff --git a/hub/static/emoji/jumping_spider_red.png b/hub/static/emoji/jumping_spider_red.png new file mode 100644 index 0000000..040fa9a Binary files /dev/null and b/hub/static/emoji/jumping_spider_red.png differ diff --git a/hub/static/emoji/kissing.png b/hub/static/emoji/kissing.png new file mode 100644 index 0000000..34f4c11 Binary files /dev/null and b/hub/static/emoji/kissing.png differ diff --git a/hub/static/emoji/kissing_cat_face_with_closed_eyes.png b/hub/static/emoji/kissing_cat_face_with_closed_eyes.png new file mode 100644 index 0000000..70980c6 Binary files /dev/null and b/hub/static/emoji/kissing_cat_face_with_closed_eyes.png differ diff --git a/hub/static/emoji/kissing_closed_eyes.png b/hub/static/emoji/kissing_closed_eyes.png new file mode 100644 index 0000000..5dbb776 Binary files /dev/null and b/hub/static/emoji/kissing_closed_eyes.png differ diff --git a/hub/static/emoji/kissing_heart.png b/hub/static/emoji/kissing_heart.png new file mode 100644 index 0000000..87107d4 Binary files /dev/null and b/hub/static/emoji/kissing_heart.png differ diff --git a/hub/static/emoji/kissing_smiling_eyes.png b/hub/static/emoji/kissing_smiling_eyes.png new file mode 100644 index 0000000..cbef42d Binary files /dev/null and b/hub/static/emoji/kissing_smiling_eyes.png differ diff --git a/hub/static/emoji/koala.png b/hub/static/emoji/koala.png new file mode 100644 index 0000000..3cede6c Binary files /dev/null and b/hub/static/emoji/koala.png differ diff --git a/hub/static/emoji/ksroom.png b/hub/static/emoji/ksroom.png new file mode 100644 index 0000000..b288ccc Binary files /dev/null and b/hub/static/emoji/ksroom.png differ diff --git a/hub/static/emoji/lambda_chi_alpha.png b/hub/static/emoji/lambda_chi_alpha.png new file mode 100644 index 0000000..26e24a2 Binary files /dev/null and b/hub/static/emoji/lambda_chi_alpha.png differ diff --git a/hub/static/emoji/last_quarter_moon.png b/hub/static/emoji/last_quarter_moon.png new file mode 100644 index 0000000..13c94ed Binary files /dev/null and b/hub/static/emoji/last_quarter_moon.png differ diff --git a/hub/static/emoji/laughing.png b/hub/static/emoji/laughing.png new file mode 100644 index 0000000..5e170cf Binary files /dev/null and b/hub/static/emoji/laughing.png differ diff --git a/hub/static/emoji/lgtm.png b/hub/static/emoji/lgtm.png new file mode 100644 index 0000000..fa8d995 Binary files /dev/null and b/hub/static/emoji/lgtm.png differ diff --git a/hub/static/emoji/loudly_crying_face.png b/hub/static/emoji/loudly_crying_face.png new file mode 100644 index 0000000..eea3a4a Binary files /dev/null and b/hub/static/emoji/loudly_crying_face.png differ diff --git a/hub/static/emoji/love_hotel.png b/hub/static/emoji/love_hotel.png new file mode 100644 index 0000000..58081c4 Binary files /dev/null and b/hub/static/emoji/love_hotel.png differ diff --git a/hub/static/emoji/mens_symbol.png b/hub/static/emoji/mens_symbol.png new file mode 100644 index 0000000..430ae5f Binary files /dev/null and b/hub/static/emoji/mens_symbol.png differ diff --git a/hub/static/emoji/microphone.png b/hub/static/emoji/microphone.png new file mode 100644 index 0000000..8048eec Binary files /dev/null and b/hub/static/emoji/microphone.png differ diff --git a/hub/static/emoji/milky_way.png b/hub/static/emoji/milky_way.png new file mode 100644 index 0000000..06c9a7d Binary files /dev/null and b/hub/static/emoji/milky_way.png differ diff --git a/hub/static/emoji/monster.png b/hub/static/emoji/monster.png new file mode 100644 index 0000000..090dc94 Binary files /dev/null and b/hub/static/emoji/monster.png differ diff --git a/hub/static/emoji/moon_with_face.png b/hub/static/emoji/moon_with_face.png new file mode 100644 index 0000000..3141e21 Binary files /dev/null and b/hub/static/emoji/moon_with_face.png differ diff --git a/hub/static/emoji/mount_fuji.png b/hub/static/emoji/mount_fuji.png new file mode 100644 index 0000000..2522d05 Binary files /dev/null and b/hub/static/emoji/mount_fuji.png differ diff --git a/hub/static/emoji/new_moon.png b/hub/static/emoji/new_moon.png new file mode 100644 index 0000000..47dfe53 Binary files /dev/null and b/hub/static/emoji/new_moon.png differ diff --git a/hub/static/emoji/ninja.png b/hub/static/emoji/ninja.png new file mode 100644 index 0000000..5cb3e78 Binary files /dev/null and b/hub/static/emoji/ninja.png differ diff --git a/hub/static/emoji/no_one_under_eighteen_symbol.png b/hub/static/emoji/no_one_under_eighteen_symbol.png new file mode 100644 index 0000000..a9fa5b9 Binary files /dev/null and b/hub/static/emoji/no_one_under_eighteen_symbol.png differ diff --git a/hub/static/emoji/oars.png b/hub/static/emoji/oars.png new file mode 100644 index 0000000..d9128bc Binary files /dev/null and b/hub/static/emoji/oars.png differ diff --git a/hub/static/emoji/ocean_dive_view.png b/hub/static/emoji/ocean_dive_view.png new file mode 100644 index 0000000..acad8cf Binary files /dev/null and b/hub/static/emoji/ocean_dive_view.png differ diff --git a/hub/static/emoji/octopus.png b/hub/static/emoji/octopus.png new file mode 100644 index 0000000..fc64c3b Binary files /dev/null and b/hub/static/emoji/octopus.png differ diff --git a/hub/static/emoji/one_eyed_robot.png b/hub/static/emoji/one_eyed_robot.png new file mode 100644 index 0000000..dc6ae60 Binary files /dev/null and b/hub/static/emoji/one_eyed_robot.png differ diff --git a/hub/static/emoji/open_mouth.png b/hub/static/emoji/open_mouth.png new file mode 100644 index 0000000..a0e550d Binary files /dev/null and b/hub/static/emoji/open_mouth.png differ diff --git a/hub/static/emoji/palm_pre3.png b/hub/static/emoji/palm_pre3.png new file mode 100644 index 0000000..78f2492 Binary files /dev/null and b/hub/static/emoji/palm_pre3.png differ diff --git a/hub/static/emoji/paw_prints.png b/hub/static/emoji/paw_prints.png new file mode 100644 index 0000000..710d2c0 Binary files /dev/null and b/hub/static/emoji/paw_prints.png differ diff --git a/hub/static/emoji/pegasus_black.png b/hub/static/emoji/pegasus_black.png new file mode 100644 index 0000000..481d352 Binary files /dev/null and b/hub/static/emoji/pegasus_black.png differ diff --git a/hub/static/emoji/penguin.png b/hub/static/emoji/penguin.png new file mode 100644 index 0000000..f9118be Binary files /dev/null and b/hub/static/emoji/penguin.png differ diff --git a/hub/static/emoji/penguin_chick.png b/hub/static/emoji/penguin_chick.png new file mode 100644 index 0000000..6c710fd Binary files /dev/null and b/hub/static/emoji/penguin_chick.png differ diff --git a/hub/static/emoji/pensive_face.png b/hub/static/emoji/pensive_face.png new file mode 100644 index 0000000..ac92c00 Binary files /dev/null and b/hub/static/emoji/pensive_face.png differ diff --git a/hub/static/emoji/persevering_face.png b/hub/static/emoji/persevering_face.png new file mode 100644 index 0000000..551e8e7 Binary files /dev/null and b/hub/static/emoji/persevering_face.png differ diff --git a/hub/static/emoji/person_bowing_deeply.png b/hub/static/emoji/person_bowing_deeply.png new file mode 100644 index 0000000..c1fdca0 Binary files /dev/null and b/hub/static/emoji/person_bowing_deeply.png differ diff --git a/hub/static/emoji/person_frowning.png b/hub/static/emoji/person_frowning.png new file mode 100644 index 0000000..2efbe73 Binary files /dev/null and b/hub/static/emoji/person_frowning.png differ diff --git a/hub/static/emoji/person_raising_both_hands_in_celebration.png b/hub/static/emoji/person_raising_both_hands_in_celebration.png new file mode 100644 index 0000000..fd0faa8 Binary files /dev/null and b/hub/static/emoji/person_raising_both_hands_in_celebration.png differ diff --git a/hub/static/emoji/person_with_folded_hands.png b/hub/static/emoji/person_with_folded_hands.png new file mode 100644 index 0000000..51ec69d Binary files /dev/null and b/hub/static/emoji/person_with_folded_hands.png differ diff --git a/hub/static/emoji/person_with_pouting_face.png b/hub/static/emoji/person_with_pouting_face.png new file mode 100644 index 0000000..b784cf5 Binary files /dev/null and b/hub/static/emoji/person_with_pouting_face.png differ diff --git a/hub/static/emoji/phone_book.png b/hub/static/emoji/phone_book.png new file mode 100644 index 0000000..e3c3374 Binary files /dev/null and b/hub/static/emoji/phone_book.png differ diff --git a/hub/static/emoji/pill.png b/hub/static/emoji/pill.png new file mode 100644 index 0000000..902eefa Binary files /dev/null and b/hub/static/emoji/pill.png differ diff --git a/hub/static/emoji/pistol.png b/hub/static/emoji/pistol.png new file mode 100644 index 0000000..be0d337 Binary files /dev/null and b/hub/static/emoji/pistol.png differ diff --git a/hub/static/emoji/pizza.png b/hub/static/emoji/pizza.png new file mode 100644 index 0000000..5c24dc8 Binary files /dev/null and b/hub/static/emoji/pizza.png differ diff --git a/hub/static/emoji/poop.png b/hub/static/emoji/poop.png new file mode 100644 index 0000000..c56307d Binary files /dev/null and b/hub/static/emoji/poop.png differ diff --git a/hub/static/emoji/pouting_cat_face.png b/hub/static/emoji/pouting_cat_face.png new file mode 100644 index 0000000..a06b13a Binary files /dev/null and b/hub/static/emoji/pouting_cat_face.png differ diff --git a/hub/static/emoji/pouting_face.png b/hub/static/emoji/pouting_face.png new file mode 100644 index 0000000..6fb14ee Binary files /dev/null and b/hub/static/emoji/pouting_face.png differ diff --git a/hub/static/emoji/princess.png b/hub/static/emoji/princess.png new file mode 100644 index 0000000..b1e030f Binary files /dev/null and b/hub/static/emoji/princess.png differ diff --git a/hub/static/emoji/puke_finger.png b/hub/static/emoji/puke_finger.png new file mode 100644 index 0000000..ab1f61e Binary files /dev/null and b/hub/static/emoji/puke_finger.png differ diff --git a/hub/static/emoji/quoll.png b/hub/static/emoji/quoll.png new file mode 100644 index 0000000..8087847 Binary files /dev/null and b/hub/static/emoji/quoll.png differ diff --git a/hub/static/emoji/rainbow.png b/hub/static/emoji/rainbow.png new file mode 100644 index 0000000..57fb468 Binary files /dev/null and b/hub/static/emoji/rainbow.png differ diff --git a/hub/static/emoji/rainbow_sky.png b/hub/static/emoji/rainbow_sky.png new file mode 100644 index 0000000..98ad6bf Binary files /dev/null and b/hub/static/emoji/rainbow_sky.png differ diff --git a/hub/static/emoji/rainbow_solid.png b/hub/static/emoji/rainbow_solid.png new file mode 100644 index 0000000..3bb6b77 Binary files /dev/null and b/hub/static/emoji/rainbow_solid.png differ diff --git a/hub/static/emoji/relaxed.png b/hub/static/emoji/relaxed.png new file mode 100644 index 0000000..d894bd7 Binary files /dev/null and b/hub/static/emoji/relaxed.png differ diff --git a/hub/static/emoji/relieved.png b/hub/static/emoji/relieved.png new file mode 100644 index 0000000..64c9547 Binary files /dev/null and b/hub/static/emoji/relieved.png differ diff --git a/hub/static/emoji/rice_ball.png b/hub/static/emoji/rice_ball.png new file mode 100644 index 0000000..7c33721 Binary files /dev/null and b/hub/static/emoji/rice_ball.png differ diff --git a/hub/static/emoji/ruby.png b/hub/static/emoji/ruby.png new file mode 100644 index 0000000..f167492 Binary files /dev/null and b/hub/static/emoji/ruby.png differ diff --git a/hub/static/emoji/satisfied.png b/hub/static/emoji/satisfied.png new file mode 100644 index 0000000..1ff06d8 Binary files /dev/null and b/hub/static/emoji/satisfied.png differ diff --git a/hub/static/emoji/scuba_diver.png b/hub/static/emoji/scuba_diver.png new file mode 100644 index 0000000..d1e17d6 Binary files /dev/null and b/hub/static/emoji/scuba_diver.png differ diff --git a/hub/static/emoji/see_no_evil_monkey.png b/hub/static/emoji/see_no_evil_monkey.png new file mode 100644 index 0000000..f6efc9b Binary files /dev/null and b/hub/static/emoji/see_no_evil_monkey.png differ diff --git a/hub/static/emoji/ship.png b/hub/static/emoji/ship.png new file mode 100644 index 0000000..3f086a2 Binary files /dev/null and b/hub/static/emoji/ship.png differ diff --git a/hub/static/emoji/shit.png b/hub/static/emoji/shit.png new file mode 100644 index 0000000..7525361 Binary files /dev/null and b/hub/static/emoji/shit.png differ diff --git a/hub/static/emoji/shooting_star.png b/hub/static/emoji/shooting_star.png new file mode 100644 index 0000000..b630c56 Binary files /dev/null and b/hub/static/emoji/shooting_star.png differ diff --git a/hub/static/emoji/siamese_kitten.png b/hub/static/emoji/siamese_kitten.png new file mode 100644 index 0000000..cb8b42e Binary files /dev/null and b/hub/static/emoji/siamese_kitten.png differ diff --git a/hub/static/emoji/skull.png b/hub/static/emoji/skull.png new file mode 100644 index 0000000..09ff203 Binary files /dev/null and b/hub/static/emoji/skull.png differ diff --git a/hub/static/emoji/sleeping.png b/hub/static/emoji/sleeping.png new file mode 100644 index 0000000..52e891c Binary files /dev/null and b/hub/static/emoji/sleeping.png differ diff --git a/hub/static/emoji/smile.png b/hub/static/emoji/smile.png new file mode 100644 index 0000000..4135aaa Binary files /dev/null and b/hub/static/emoji/smile.png differ diff --git a/hub/static/emoji/smiley.png b/hub/static/emoji/smiley.png new file mode 100644 index 0000000..80ffc99 Binary files /dev/null and b/hub/static/emoji/smiley.png differ diff --git a/hub/static/emoji/smiley_confused.png b/hub/static/emoji/smiley_confused.png new file mode 100644 index 0000000..571ee2f Binary files /dev/null and b/hub/static/emoji/smiley_confused.png differ diff --git a/hub/static/emoji/smiley_kissing_heart.png b/hub/static/emoji/smiley_kissing_heart.png new file mode 100644 index 0000000..2678c76 Binary files /dev/null and b/hub/static/emoji/smiley_kissing_heart.png differ diff --git a/hub/static/emoji/smiley_sleeping.png b/hub/static/emoji/smiley_sleeping.png new file mode 100644 index 0000000..f703789 Binary files /dev/null and b/hub/static/emoji/smiley_sleeping.png differ diff --git a/hub/static/emoji/smiley_smile.png b/hub/static/emoji/smiley_smile.png new file mode 100644 index 0000000..8904240 Binary files /dev/null and b/hub/static/emoji/smiley_smile.png differ diff --git a/hub/static/emoji/smiley_stuck_out_tongue_winking_eye.png b/hub/static/emoji/smiley_stuck_out_tongue_winking_eye.png new file mode 100644 index 0000000..9a2cfe9 Binary files /dev/null and b/hub/static/emoji/smiley_stuck_out_tongue_winking_eye.png differ diff --git a/hub/static/emoji/smiling_cat_face_with_heart_shaped_eyes.png b/hub/static/emoji/smiling_cat_face_with_heart_shaped_eyes.png new file mode 100644 index 0000000..97c1f57 Binary files /dev/null and b/hub/static/emoji/smiling_cat_face_with_heart_shaped_eyes.png differ diff --git a/hub/static/emoji/smiling_cat_face_with_open_mouth.png b/hub/static/emoji/smiling_cat_face_with_open_mouth.png new file mode 100644 index 0000000..10ffd74 Binary files /dev/null and b/hub/static/emoji/smiling_cat_face_with_open_mouth.png differ diff --git a/hub/static/emoji/smiling_face.png b/hub/static/emoji/smiling_face.png new file mode 100644 index 0000000..128f840 Binary files /dev/null and b/hub/static/emoji/smiling_face.png differ diff --git a/hub/static/emoji/smirk.png b/hub/static/emoji/smirk.png new file mode 100644 index 0000000..6666cf3 Binary files /dev/null and b/hub/static/emoji/smirk.png differ diff --git a/hub/static/emoji/snail.png b/hub/static/emoji/snail.png new file mode 100644 index 0000000..ea84411 Binary files /dev/null and b/hub/static/emoji/snail.png differ diff --git a/hub/static/emoji/snake.png b/hub/static/emoji/snake.png new file mode 100644 index 0000000..d00f577 Binary files /dev/null and b/hub/static/emoji/snake.png differ diff --git a/hub/static/emoji/snowboarder.png b/hub/static/emoji/snowboarder.png new file mode 100644 index 0000000..732ba14 Binary files /dev/null and b/hub/static/emoji/snowboarder.png differ diff --git a/hub/static/emoji/speak_no_evil_monkey.png b/hub/static/emoji/speak_no_evil_monkey.png new file mode 100644 index 0000000..dc5252f Binary files /dev/null and b/hub/static/emoji/speak_no_evil_monkey.png differ diff --git a/hub/static/emoji/speech_balloon.png b/hub/static/emoji/speech_balloon.png new file mode 100644 index 0000000..39da3c8 Binary files /dev/null and b/hub/static/emoji/speech_balloon.png differ diff --git a/hub/static/emoji/spouting_whale.png b/hub/static/emoji/spouting_whale.png new file mode 100644 index 0000000..1633671 Binary files /dev/null and b/hub/static/emoji/spouting_whale.png differ diff --git a/hub/static/emoji/stuck_out_tongue.png b/hub/static/emoji/stuck_out_tongue.png new file mode 100644 index 0000000..abe17d4 Binary files /dev/null and b/hub/static/emoji/stuck_out_tongue.png differ diff --git a/hub/static/emoji/stuck_out_tongue_closed_eyes.png b/hub/static/emoji/stuck_out_tongue_closed_eyes.png new file mode 100644 index 0000000..a99cc19 Binary files /dev/null and b/hub/static/emoji/stuck_out_tongue_closed_eyes.png differ diff --git a/hub/static/emoji/stuck_out_tongue_winking_eye.png b/hub/static/emoji/stuck_out_tongue_winking_eye.png new file mode 100644 index 0000000..4f0c1d4 Binary files /dev/null and b/hub/static/emoji/stuck_out_tongue_winking_eye.png differ diff --git a/hub/static/emoji/sun.png b/hub/static/emoji/sun.png new file mode 100644 index 0000000..fc4ed45 Binary files /dev/null and b/hub/static/emoji/sun.png differ diff --git a/hub/static/emoji/sun_with_face.png b/hub/static/emoji/sun_with_face.png new file mode 100644 index 0000000..a0298a3 Binary files /dev/null and b/hub/static/emoji/sun_with_face.png differ diff --git a/hub/static/emoji/sunrise_over_mountains.png b/hub/static/emoji/sunrise_over_mountains.png new file mode 100644 index 0000000..9ccfe9b Binary files /dev/null and b/hub/static/emoji/sunrise_over_mountains.png differ diff --git a/hub/static/emoji/sweat.png b/hub/static/emoji/sweat.png new file mode 100644 index 0000000..2f4f4b1 Binary files /dev/null and b/hub/static/emoji/sweat.png differ diff --git a/hub/static/emoji/sweat_smile.png b/hub/static/emoji/sweat_smile.png new file mode 100644 index 0000000..ea6d8eb Binary files /dev/null and b/hub/static/emoji/sweat_smile.png differ diff --git a/hub/static/emoji/tangerine.png b/hub/static/emoji/tangerine.png new file mode 100644 index 0000000..24d7d51 Binary files /dev/null and b/hub/static/emoji/tangerine.png differ diff --git a/hub/static/emoji/tennis_racquet_and_ball.png b/hub/static/emoji/tennis_racquet_and_ball.png new file mode 100644 index 0000000..bbbccf2 Binary files /dev/null and b/hub/static/emoji/tennis_racquet_and_ball.png differ diff --git a/hub/static/emoji/thumbs_up_sign.png b/hub/static/emoji/thumbs_up_sign.png new file mode 100644 index 0000000..f5cf49a Binary files /dev/null and b/hub/static/emoji/thumbs_up_sign.png differ diff --git a/hub/static/emoji/tropical_drink.png b/hub/static/emoji/tropical_drink.png new file mode 100644 index 0000000..821f9d9 Binary files /dev/null and b/hub/static/emoji/tropical_drink.png differ diff --git a/hub/static/emoji/two_men_holding_hands.png b/hub/static/emoji/two_men_holding_hands.png new file mode 100644 index 0000000..27b6619 Binary files /dev/null and b/hub/static/emoji/two_men_holding_hands.png differ diff --git a/hub/static/emoji/two_men_in_love.png b/hub/static/emoji/two_men_in_love.png new file mode 100644 index 0000000..4359834 Binary files /dev/null and b/hub/static/emoji/two_men_in_love.png differ diff --git a/hub/static/emoji/two_men_with_heart.png b/hub/static/emoji/two_men_with_heart.png new file mode 100644 index 0000000..ac9c71c Binary files /dev/null and b/hub/static/emoji/two_men_with_heart.png differ diff --git a/hub/static/emoji/two_women_holding_hands.png b/hub/static/emoji/two_women_holding_hands.png new file mode 100644 index 0000000..c503b20 Binary files /dev/null and b/hub/static/emoji/two_women_holding_hands.png differ diff --git a/hub/static/emoji/two_women_in_love.png b/hub/static/emoji/two_women_in_love.png new file mode 100644 index 0000000..cfb2ecb Binary files /dev/null and b/hub/static/emoji/two_women_in_love.png differ diff --git a/hub/static/emoji/two_women_with_heart.png b/hub/static/emoji/two_women_with_heart.png new file mode 100644 index 0000000..365bc41 Binary files /dev/null and b/hub/static/emoji/two_women_with_heart.png differ diff --git a/hub/static/emoji/unamused.png b/hub/static/emoji/unamused.png new file mode 100644 index 0000000..ef3acf4 Binary files /dev/null and b/hub/static/emoji/unamused.png differ diff --git a/hub/static/emoji/victory_hand.png b/hub/static/emoji/victory_hand.png new file mode 100644 index 0000000..5fd2888 Binary files /dev/null and b/hub/static/emoji/victory_hand.png differ diff --git a/hub/static/emoji/video_game.png b/hub/static/emoji/video_game.png new file mode 100644 index 0000000..799919a Binary files /dev/null and b/hub/static/emoji/video_game.png differ diff --git a/hub/static/emoji/waxing_gibbous_moon.png b/hub/static/emoji/waxing_gibbous_moon.png new file mode 100644 index 0000000..d34163f Binary files /dev/null and b/hub/static/emoji/waxing_gibbous_moon.png differ diff --git a/hub/static/emoji/weary_cat_face.png b/hub/static/emoji/weary_cat_face.png new file mode 100644 index 0000000..632c08a Binary files /dev/null and b/hub/static/emoji/weary_cat_face.png differ diff --git a/hub/static/emoji/weary_face.png b/hub/static/emoji/weary_face.png new file mode 100644 index 0000000..ef62198 Binary files /dev/null and b/hub/static/emoji/weary_face.png differ diff --git a/hub/static/emoji/wheelchair.png b/hub/static/emoji/wheelchair.png new file mode 100644 index 0000000..230d522 Binary files /dev/null and b/hub/static/emoji/wheelchair.png differ diff --git a/hub/static/emoji/white_smiling_face.png b/hub/static/emoji/white_smiling_face.png new file mode 100644 index 0000000..128f840 Binary files /dev/null and b/hub/static/emoji/white_smiling_face.png differ diff --git a/hub/static/emoji/wink.png b/hub/static/emoji/wink.png new file mode 100644 index 0000000..4739b7f Binary files /dev/null and b/hub/static/emoji/wink.png differ diff --git a/hub/static/emoji/wink2.png b/hub/static/emoji/wink2.png new file mode 100644 index 0000000..4f0c1d4 Binary files /dev/null and b/hub/static/emoji/wink2.png differ diff --git a/hub/static/emoji/wolf_face.png b/hub/static/emoji/wolf_face.png new file mode 100644 index 0000000..bcc1ea9 Binary files /dev/null and b/hub/static/emoji/wolf_face.png differ diff --git a/hub/static/emoji/worried.png b/hub/static/emoji/worried.png new file mode 100644 index 0000000..cea698f Binary files /dev/null and b/hub/static/emoji/worried.png differ diff --git a/vilya/static/img/401.jpg b/hub/static/img/401.jpg similarity index 100% rename from vilya/static/img/401.jpg rename to hub/static/img/401.jpg diff --git a/vilya/static/img/404.jpg b/hub/static/img/404.jpg similarity index 100% rename from vilya/static/img/404.jpg rename to hub/static/img/404.jpg diff --git a/vilya/static/img/500.jpg b/hub/static/img/500.jpg similarity index 100% rename from vilya/static/img/500.jpg rename to hub/static/img/500.jpg diff --git a/vilya/static/img/ajax-loader.gif b/hub/static/img/ajax-loader.gif similarity index 100% rename from vilya/static/img/ajax-loader.gif rename to hub/static/img/ajax-loader.gif diff --git a/vilya/static/img/arrow-up-orange.png b/hub/static/img/arrow-up-orange.png similarity index 100% rename from vilya/static/img/arrow-up-orange.png rename to hub/static/img/arrow-up-orange.png diff --git a/vilya/static/img/arrow-up.png b/hub/static/img/arrow-up.png similarity index 100% rename from vilya/static/img/arrow-up.png rename to hub/static/img/arrow-up.png diff --git a/vilya/static/img/big_quotel.png b/hub/static/img/big_quotel.png similarity index 100% rename from vilya/static/img/big_quotel.png rename to hub/static/img/big_quotel.png diff --git a/vilya/static/img/board_bg.png b/hub/static/img/board_bg.png similarity index 100% rename from vilya/static/img/board_bg.png rename to hub/static/img/board_bg.png diff --git a/vilya/static/img/clippy.png b/hub/static/img/clippy.png similarity index 100% rename from vilya/static/img/clippy.png rename to hub/static/img/clippy.png diff --git a/hub/static/img/cloning.png b/hub/static/img/cloning.png new file mode 100644 index 0000000..1940130 Binary files /dev/null and b/hub/static/img/cloning.png differ diff --git a/vilya/static/img/closed_pattern.gif b/hub/static/img/closed_pattern.gif similarity index 100% rename from vilya/static/img/closed_pattern.gif rename to hub/static/img/closed_pattern.gif diff --git a/vilya/static/img/code-apple-icon-114.png b/hub/static/img/code-apple-icon-114.png similarity index 100% rename from vilya/static/img/code-apple-icon-114.png rename to hub/static/img/code-apple-icon-114.png diff --git a/vilya/static/img/code-apple-icon-57.png b/hub/static/img/code-apple-icon-57.png similarity index 100% rename from vilya/static/img/code-apple-icon-57.png rename to hub/static/img/code-apple-icon-57.png diff --git a/vilya/static/img/code-apple-icon-72.png b/hub/static/img/code-apple-icon-72.png similarity index 100% rename from vilya/static/img/code-apple-icon-72.png rename to hub/static/img/code-apple-icon-72.png diff --git a/vilya/static/img/code-logo.png b/hub/static/img/code-logo.png similarity index 100% rename from vilya/static/img/code-logo.png rename to hub/static/img/code-logo.png diff --git a/hub/static/img/code-startup-image-1024x748.png b/hub/static/img/code-startup-image-1024x748.png new file mode 100644 index 0000000..4bc22fa Binary files /dev/null and b/hub/static/img/code-startup-image-1024x748.png differ diff --git a/hub/static/img/code-startup-image-1536x2008.png b/hub/static/img/code-startup-image-1536x2008.png new file mode 100644 index 0000000..675c979 Binary files /dev/null and b/hub/static/img/code-startup-image-1536x2008.png differ diff --git a/hub/static/img/code-startup-image-2048x1496.png b/hub/static/img/code-startup-image-2048x1496.png new file mode 100644 index 0000000..a5fb88f Binary files /dev/null and b/hub/static/img/code-startup-image-2048x1496.png differ diff --git a/hub/static/img/code-startup-image-640x1096.png b/hub/static/img/code-startup-image-640x1096.png new file mode 100644 index 0000000..a0cbc69 Binary files /dev/null and b/hub/static/img/code-startup-image-640x1096.png differ diff --git a/hub/static/img/code-startup-image-640x920.png b/hub/static/img/code-startup-image-640x920.png new file mode 100644 index 0000000..21cc837 Binary files /dev/null and b/hub/static/img/code-startup-image-640x920.png differ diff --git a/hub/static/img/code-startup-image-768x1004.png b/hub/static/img/code-startup-image-768x1004.png new file mode 100644 index 0000000..c3421da Binary files /dev/null and b/hub/static/img/code-startup-image-768x1004.png differ diff --git a/hub/static/img/code-startup-image.png b/hub/static/img/code-startup-image.png new file mode 100644 index 0000000..21cc837 Binary files /dev/null and b/hub/static/img/code-startup-image.png differ diff --git a/hub/static/img/code_lover.png b/hub/static/img/code_lover.png new file mode 100644 index 0000000..e8b24d7 Binary files /dev/null and b/hub/static/img/code_lover.png differ diff --git a/vilya/static/img/compare_too_big.gif b/hub/static/img/compare_too_big.gif similarity index 100% rename from vilya/static/img/compare_too_big.gif rename to hub/static/img/compare_too_big.gif diff --git a/vilya/static/img/docs_wrong.jpg b/hub/static/img/docs_wrong.jpg similarity index 100% rename from vilya/static/img/docs_wrong.jpg rename to hub/static/img/docs_wrong.jpg diff --git a/hub/static/img/fav_star.png b/hub/static/img/fav_star.png new file mode 100644 index 0000000..a0dff8b Binary files /dev/null and b/hub/static/img/fav_star.png differ diff --git a/hub/static/img/faved_star.png b/hub/static/img/faved_star.png new file mode 100644 index 0000000..497d265 Binary files /dev/null and b/hub/static/img/faved_star.png differ diff --git a/vilya/static/img/file_modes.png b/hub/static/img/file_modes.png similarity index 100% rename from vilya/static/img/file_modes.png rename to hub/static/img/file_modes.png diff --git a/vilya/static/img/gist.png b/hub/static/img/gist.png similarity index 100% rename from vilya/static/img/gist.png rename to hub/static/img/gist.png diff --git a/vilya/static/img/helpgirl.png b/hub/static/img/helpgirl.png similarity index 100% rename from vilya/static/img/helpgirl.png rename to hub/static/img/helpgirl.png diff --git a/vilya/static/img/iphone_emoji.png b/hub/static/img/iphone_emoji.png similarity index 100% rename from vilya/static/img/iphone_emoji.png rename to hub/static/img/iphone_emoji.png diff --git a/vilya/static/img/join_team.png b/hub/static/img/join_team.png similarity index 100% rename from vilya/static/img/join_team.png rename to hub/static/img/join_team.png diff --git a/vilya/static/img/logo.png b/hub/static/img/logo.png similarity index 100% rename from vilya/static/img/logo.png rename to hub/static/img/logo.png diff --git a/vilya/static/img/logo.svg b/hub/static/img/logo.svg similarity index 100% rename from vilya/static/img/logo.svg rename to hub/static/img/logo.svg diff --git a/vilya/static/img/logo1.svg b/hub/static/img/logo1.svg similarity index 100% rename from vilya/static/img/logo1.svg rename to hub/static/img/logo1.svg diff --git a/hub/static/img/new_menu.gif b/hub/static/img/new_menu.gif new file mode 100644 index 0000000..307d362 Binary files /dev/null and b/hub/static/img/new_menu.gif differ diff --git a/hub/static/img/octocat-spinner-16px.gif b/hub/static/img/octocat-spinner-16px.gif new file mode 100644 index 0000000..91c5328 Binary files /dev/null and b/hub/static/img/octocat-spinner-16px.gif differ diff --git a/vilya/static/img/pb2.png b/hub/static/img/pb2.png similarity index 100% rename from vilya/static/img/pb2.png rename to hub/static/img/pb2.png diff --git a/vilya/static/img/recommend.png b/hub/static/img/recommend.png similarity index 100% rename from vilya/static/img/recommend.png rename to hub/static/img/recommend.png diff --git a/vilya/static/img/smokinggal.jpg b/hub/static/img/smokinggal.jpg similarity index 100% rename from vilya/static/img/smokinggal.jpg rename to hub/static/img/smokinggal.jpg diff --git a/vilya/static/img/spinner.gif b/hub/static/img/spinner.gif similarity index 100% rename from vilya/static/img/spinner.gif rename to hub/static/img/spinner.gif diff --git a/vilya/static/img/switch_icon.png b/hub/static/img/switch_icon.png similarity index 100% rename from vilya/static/img/switch_icon.png rename to hub/static/img/switch_icon.png diff --git a/hub/static/img/team_default_profile.jpg b/hub/static/img/team_default_profile.jpg new file mode 100644 index 0000000..1b8b53d Binary files /dev/null and b/hub/static/img/team_default_profile.jpg differ diff --git a/hub/static/img/team_logo.svg b/hub/static/img/team_logo.svg new file mode 100644 index 0000000..9e03364 --- /dev/null +++ b/hub/static/img/team_logo.svg @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="iso-8859-1"?> +<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="96px" height="96px" viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve"> +<g> + <g> + <path style="fill:#AAAAAA;" d="M66,32.998c3.312,0,5.996-2.687,5.996-6c0-3.314-2.684-6-5.996-6s-5.996,2.686-5.996,6 + C60.004,30.312,62.688,32.998,66,32.998z M66,35.002c-4.419,0-8,0.617-8,4.77c0,7.18,4.281,17.23,8,17.23s8-10.051,8-17.23 + C74,35.619,70.418,35.002,66,35.002z"/> + </g> +</g> +<g> + <g> + <path style="fill:#AAAAAA;" d="M30,32.998c3.312,0,5.996-2.687,5.996-6c0-3.314-2.684-6-5.996-6s-5.996,2.686-5.996,6 + C24.004,30.312,26.688,32.998,30,32.998z M30,35.002c-4.419,0-8,0.617-8,4.77c0,7.18,4.281,17.23,8,17.23s8-10.051,8-17.23 + C38,35.619,34.418,35.002,30,35.002z"/> + </g> +</g> +<g> + <path style="fill:#737373;" d="M35.806,76.235h-2.9V85.5h-1.062v-9.265H29v-0.89h6.806V76.235z"/> + <path style="fill:#737373;" d="M45.884,76.235h-4.231v3.609h3.042v0.889h-3.042v3.879h4.33V85.5h-5.391V75.346h5.292V76.235z"/> + <path style="fill:#737373;" d="M56.965,85.5h-1.146l-0.906-2.99h-3.099l-0.906,2.99h-1.146l3.595-11L56.965,85.5z M52.069,81.622 + h2.59l-1.302-4.104L52.069,81.622z"/> + <path style="fill:#737373;" d="M65.953,75.346H67V85.5h-1.061v-7.728h-0.028l-2.095,4.978l-2.08-4.978L61.708,77.8v7.7h-1.061 + V75.346h1.032l2.137,5.063L65.953,75.346z"/> +</g> +<g> + <g> + <path style="fill-rule:evenodd;clip-rule:evenodd;fill:#737373;" d="M48,34.403c-6.628,0-12,0.897-12,6.938 + c0,10.443,7.873,25.062,12,25.062c4.127,0,12-14.619,12-25.062C60,35.3,54.627,34.403,48,34.403z M48,32.397 + c4.417,0,7.995-3.582,7.995-8s-3.578-8-7.995-8c-4.416,0-7.996,3.582-7.996,8S43.583,32.397,48,32.397z"/> + </g> +</g> +</svg> diff --git a/hub/static/img/team_paper_texture.jpg b/hub/static/img/team_paper_texture.jpg new file mode 100644 index 0000000..8053674 Binary files /dev/null and b/hub/static/img/team_paper_texture.jpg differ diff --git a/vilya/static/img/timeout.jpg b/hub/static/img/timeout.jpg similarity index 100% rename from vilya/static/img/timeout.jpg rename to hub/static/img/timeout.jpg diff --git a/hub/static/img/tshirts/p1994842093.jpg b/hub/static/img/tshirts/p1994842093.jpg new file mode 100644 index 0000000..63d61d4 Binary files /dev/null and b/hub/static/img/tshirts/p1994842093.jpg differ diff --git a/hub/static/img/tshirts/p1994842153.jpg b/hub/static/img/tshirts/p1994842153.jpg new file mode 100644 index 0000000..4654083 Binary files /dev/null and b/hub/static/img/tshirts/p1994842153.jpg differ diff --git a/hub/static/img/tshirts/p1994842218.jpg b/hub/static/img/tshirts/p1994842218.jpg new file mode 100644 index 0000000..3f28a4f Binary files /dev/null and b/hub/static/img/tshirts/p1994842218.jpg differ diff --git a/hub/static/img/tshirts/p1994842254.jpg b/hub/static/img/tshirts/p1994842254.jpg new file mode 100644 index 0000000..8fa0a3c Binary files /dev/null and b/hub/static/img/tshirts/p1994842254.jpg differ diff --git a/hub/static/img/tshirts/qrcode.png b/hub/static/img/tshirts/qrcode.png new file mode 100644 index 0000000..dfe34f8 Binary files /dev/null and b/hub/static/img/tshirts/qrcode.png differ diff --git a/vilya/static/img/typing.gif b/hub/static/img/typing.gif similarity index 100% rename from vilya/static/img/typing.gif rename to hub/static/img/typing.gif diff --git a/hub/static/img/u1000001.jpg b/hub/static/img/u1000001.jpg new file mode 100644 index 0000000..fc3a921 Binary files /dev/null and b/hub/static/img/u1000001.jpg differ diff --git a/vilya/static/img/user_normal.jpg b/hub/static/img/user_normal.jpg similarity index 100% rename from vilya/static/img/user_normal.jpg rename to hub/static/img/user_normal.jpg diff --git a/hub/static/js/app/badge/main.js b/hub/static/js/app/badge/main.js new file mode 100644 index 0000000..4b678b8 --- /dev/null +++ b/hub/static/js/app/badge/main.js @@ -0,0 +1,69 @@ +require(['jquery-tmpl'], function(){ + + var increment = 10; //badge_item per page / Additional badges displayed per click + var index = 0; //Number of times more badge info has been requested + var badge_list; + var item_count; + var last_day = null; + + $(function get_badges() { + $.getJSON("/badge/badges", function(badges) { + badge_list = badges; + get_item_count(); + }); + }); + + var get_item_count = function() { + $.getJSON("/badge/count", {}, function(count) { + item_count = count[0]; + populate_list(); + if (increment < item_count) { + $(".timeline .more").append("<a class='more_items' href='javascript:void(0)'>See more</a>"); + $("a.more_items").click(populate_list); + } + }); + }; + + var populate_list = function() { + index++; + var data_vars = { + ind: index - 1, + inc: increment + }; + $.getJSON("/badge/items", data_vars, function(items) { + $.each(items, function(i, day) { + var badge_date = new Date(day[0][3]); + var text = ""; + if (last_day == null || last_day.toDateString() != badge_date.toDateString()) { + var date_string = badge_date.getFullYear() + "-" + (badge_date.getMonth()+1) + "-" + badge_date.getDate(); + text += "<h2>" + date_string + " </h2>"; + } + last_day = badge_date; + text += "<dl><div class='action'></div></dl>"; + $(".timeline>dl").append(text); + var data = []; + $.each(day, function(j, item) { + var id = item[0]; + var item_date = new Date(item[3]); + item_date.setHours(item_date.getHours() + item_date.getTimezoneOffset()/60); + var time_string = item_date.toLocaleTimeString(); + var item_data = { + badge_id: id, + recipient: item[1], + avatar: item[4], + reason: item[2] == null ? "" : item[2], + item_time: time_string.substring(0, time_string.length - 3), + badge_name: badge_list[id-1][1], + summary: badge_list[id-1][2] + }; + data.push(item_data); + }); + $("#timeline_template").tmpl(data).appendTo(".action:last"); + }); + if (index * increment > item_count) { + $(".more_items").remove(); + } + }); + }; + +}); diff --git a/hub/static/js/app/center/main.js b/hub/static/js/app/center/main.js new file mode 100644 index 0000000..7d6cd08 --- /dev/null +++ b/hub/static/js/app/center/main.js @@ -0,0 +1,43 @@ +require( + ['jquery', + 'mod/relative_date', + 'mod/user_avatar', + 'jquery-tmpl', + 'mod/input-ext'], function ($, updateRelativeDate, loadAvatar) { + var tmpl = $("#tmpl-timeline-activity"); + //previewable-comment-form + $('.previewable-comment-form .js-preview-tabs a.preview-tab').on('show', function(e) { + $('#preview_bucket p').html("Loading preview..."); + }).on('shown', function(e) { + var url = $('#preview_bucket .content-body').data('api-url'); + var text = $('#write_bucket textarea').val(); + $('#preview_bucket .content-body').load(url, {text: text}); + }); + + $('.timeline .loader').hide(); + $('.timeline .pagination').show().click( + function () { + var id = $('.timeline .activity .action').length; + var url = "/api/center/activity/?start=" + id + "&limit=10"; + $.ajax({type: "GET", + url: url, + dataType: "json", + beforeSend: function() { + $('.timeline .loader').show(); + }, + success: function(data) { + for (var x in data) { + $('.timeline .activity').append($.tmpl(tmpl, data[x])); + } + $('.timeline .loader').hide(); + if (data.length < 10) { + $('.timeline .pagination').hide(); + } + updateRelativeDate(); + loadAvatar(); + } + }); + }); + } +); + diff --git a/hub/static/js/app/chat/main.js b/hub/static/js/app/chat/main.js new file mode 100644 index 0000000..c95ae77 --- /dev/null +++ b/hub/static/js/app/chat/main.js @@ -0,0 +1,6 @@ +require(['jquery' +, 'mod/chat' +, 'mod/connect' +, 'mod/user_avatar' +], function() { +}); diff --git a/hub/static/js/app/create/main.js b/hub/static/js/app/create/main.js new file mode 100644 index 0000000..e1f8b85 --- /dev/null +++ b/hub/static/js/app/create/main.js @@ -0,0 +1,26 @@ +//define('jquery', 'lib/jquery.min.js') +require(['jquery'], function($){ + $(function(){ + $("#org_proj").click(function(){ + $("#owner").hide("slow"); + $(".splash").hide("slow"); + $("#mirror").hide("slow"); + $(".mirror-url").hide(); + $(".mirror-with-proxy").hide(); + }); + $("#people_proj").click(function(){ + $("#owner").show("slow"); + $(".splash").show("slow"); + $("#mirror").hide(); + $(".mirror-url").hide(); + $(".mirror-with-proxy").hide(); + }); + $("#mirror_proj").click(function(){ + $("#owner").hide(); + $("#mirror").show("slow"); + $(".splash").show("slow"); + $(".mirror-url").show(); + $(".mirror-with-proxy").show(); + }); + }); +}); diff --git a/hub/static/js/app/explore/main.js b/hub/static/js/app/explore/main.js new file mode 100644 index 0000000..403e3ff --- /dev/null +++ b/hub/static/js/app/explore/main.js @@ -0,0 +1,55 @@ +//define('jquery', 'lib/jquery.min.js') +//define('mustache', 'lib/mustache.js') +//define('bootstrap', 'lib/bootstrap-amd.js') +//define('jquery-tmpl', 'lib/jquery.tmpl.min.js') +//define('bootbox', 'lib/bootbox.js') +require(['jquery' +, 'mustache' +, 'mod/confirm'], function($, Mustache){ + + $("div.trending-repositories a[href^='#tab_']").click( + function(e) { + tab_name = $(this).attr("href").slice("#tab_".length); + $.ajax({type: "GET", + url: "/api/projects?without_commits=true&sortby=" + tab_name, + dataType: "json", + success: function(data){ + var template = $("script#item-project").html(); + var render = '<table class="table repo"><tbody>'; + + for(idx_proj in data['projects']){ + proj = data['projects'][idx_proj]; + render += Mustache.to_html(template, proj); + if (idx_proj >= 5) { break } + } + render += '</tbody></table>'; + $("div#tab_" + tab_name).html(render); + }, + }); + }); + + $("div.repositories-by-dept a[href^='#proj_dept_']").click( + function(e) { + dept_name = $(this).attr("href").slice("#proj_dept_".length); + $.ajax({type: "GET", + url: "/api/projects?without_commits=true&by_dept=" + dept_name, + dataType: "json", + success: function(data){ + var template = $("script#item-project").html(); + var render = '<table class="table repo"><tbody>'; + + for(idx_proj in data['projects']){ + proj = data['projects'][idx_proj]; + render += Mustache.to_html(template, proj); + } + render += '</tbody></table>'; + $("div#proj_dept_" + dept_name).html(render); + } + }); + }); + + $("div.trending-repositories a[href='#tab_updated']").click(); + $("div.repositories-by-dept a[href='#proj_dept_public']").click(); + + +}); diff --git a/hub/static/js/app/explore/notify_timeline.js b/hub/static/js/app/explore/notify_timeline.js new file mode 100644 index 0000000..09e317e --- /dev/null +++ b/hub/static/js/app/explore/notify_timeline.js @@ -0,0 +1,71 @@ +require(['jquery' +, 'mod/user_avatar' +//, 'mod/notify_pagination' +], function($, loadAvatar) { + //TODO: add notify realtime show + // + $(function () { + $('.entry').delegate('.entry-title .title', 'click', function(){ + $(this).parent().next().toggle(300); + loadAvatar(); + }); + + var removeSlow = function($this) { + $this.fadeOut(350, function() { $this.remove();}); + }; + + $('.notif-list').delegate('.mark-item', 'click', function (e) { + var $this = $(this); + $this.ajaxForm({ + dataType: 'json', + success: function(r) { + if (r.r === 0) { + removeSlow($this.parents('.notif-item')); + } + } + }); + }); + + $('.notif-list').delegate('.mark-entry', 'click', function (e) { + var $this = $(this); + $this.ajaxForm({ + dataType: 'json', + success: function(r) { + if (r.r === 0) { + if ($this.parents('.item-body').children().length == 1) { + removeSlow($this.parents('.notif-item')); + } else { + removeSlow($this.parents('.entry')); + } + } + } + }); + }); + + $('.notif-list').delegate('.mute-entry', 'click', function (e) { + var $this = $(this); + $this.ajaxForm({ + dataType: 'json', + success: function(r) { + if (r.r === 0) { + $this.find('i').removeClass('icon-volume-up').addClass('icon-volume-off'); + } + } + }); + }); + + $('.mark-all-as-read').click(function() { + var $this = $(this), + type = $this.data('type'); + if(type == 'merged_pr') { + var form = $('#merged-pr-uids'); + form.ajaxSubmit({ + success: function() { + location.reload(); + } + }); + } + }) + + }); +}); diff --git a/hub/static/js/app/explore/public_timeline.js b/hub/static/js/app/explore/public_timeline.js new file mode 100644 index 0000000..d060c83 --- /dev/null +++ b/hub/static/js/app/explore/public_timeline.js @@ -0,0 +1,25 @@ +require(['jquery' +, 'mod/connect' +, 'mod/count' +, 'mod/relative_date' +, 'mod/user_avatar' +, 'mod/user_profile_card' +, 'mod/newsfeed' +, 'mod/newsfeed_pagination' +], function($, connectNode, countDict, updateRelativeDate, loadAvatar){ + //put your home code here. + var channel = 'feed:public:everyone:v2'; + var io = connectNode(channel); + io.on('announce', function(data) { + countDict.public_num += 1; + if ($('.timeline>ul').length == 0) { + $('.info').hide(); + $('body>.container').prepend( + '<div class="timeline"><h2>Public Timeline Feed</h2><ul></ul></div>' + ); + } + $('.timeline>ul').prepend(data.send_message); + updateRelativeDate(); + loadAvatar(); + }); +}); diff --git a/hub/static/js/app/gist/edit.js b/hub/static/js/app/gist/edit.js new file mode 100644 index 0000000..39f980a --- /dev/null +++ b/hub/static/js/app/gist/edit.js @@ -0,0 +1,39 @@ +define('codemirror', ['lib/codemirror.js'], function(none){ + return CodeMirror; +}); + +require(['jquery' +, 'spin' +, 'mod/gist-editor' +, 'mod/gist-delete' +, 'mod/drop' +, 'jquery-timeago' +, 'bootstrap' +, 'codemirror' +], function($, Spinner){ + var files = $('.js-gist-file'); + var get_src = function (index, file, gist, path, ref) { + var is_image = /^.+\.(jpg|png|gif|jpeg)$/i.test(path); + if(is_image){ + } + else{ + $.ajax({type: 'GET', + data: {'path': path, 'ref': ref}, + url: '/api/gist/'.concat(gist, '/source'), + dataType: 'json', + success: function (ret) { + editors[index].setValue(ret.source); + }}); + } + }; + + if (files.length > 0) { + $.each(files, function(i, f){ + var file = $(f).children(".file textarea")[0], + path = $(f).attr('data-path'), + ref = $(f).attr('data-ref'), + gist = $(f).attr('data-gist'); + get_src(i, file, gist, path, ref); + }); + } +}); diff --git a/hub/static/js/app/gist/gist.js b/hub/static/js/app/gist/gist.js new file mode 100644 index 0000000..59bae94 --- /dev/null +++ b/hub/static/js/app/gist/gist.js @@ -0,0 +1,116 @@ +require(['jquery' +, 'spin' +, 'jquery-timeago' +, 'bootstrap' +, 'mod/gist-delete' +//, 'mod/diff' // no use yet +], function($, Spinner){ + $(function(){ + blob = $('.blob'); + var get_src = function (file, gist, path, ref) { + var is_image = /^.+\.(jpg|png|gif|jpeg)$/i.test(path); + if(is_image){ + } + else{ + $.ajax({type: 'GET', + data: {'path': path, 'ref': ref}, + url: '/api/gist/'.concat(gist, '/src'), + dataType: 'json', + success: function (ret) { + if (ret.type == 'blob') { + $(file).html(ret.src); + var anchor = window.location.hash; + anchor && $('a[href='.concat(anchor, ']')).get(0).scrollIntoView(); + } + }}); + } + }; + + var drawSpinner = function (elem, isSmall) { + var opts = { lines: 9, length: 6, width: 4, radius: 9, rotate: 12, + color: '#000', speed: 1, trail: 60, shadow: false, + hwaccel: false, className: 'spinner', zIndex: 2e9, + top: 'auto', left: 'auto' }; + if (isSmall) { + opts.length = 4; + opts.width = 2; + opts.radius = 4; + } + return new Spinner(opts).spin(elem); + }; + if (blob.length > 0) { + $.each(blob, function(i, bb){ + var file = $(bb).children(".file")[0]; + drawSpinner(file); + var path = $(bb).attr('data-path'), + ref = $(bb).attr('data-ref'); + gist = $(bb).attr('data-gist'); + get_src(file, gist, path, ref); + }); + } + $.each($('.file-box'), function(i, l){ + var aspan = $(l).find('.link-overlay')[0]; + $(l).mouseenter(function(){ + $(l).css("outline","solid 1px #D8EAF2"); + $(aspan).css('visibility', 'visible'); + }).mouseleave(function(){ + $(l).css("outline","none"); + $(aspan).css('visibility', 'hidden'); + }); + }); + $(".js-preview-tabs a").click(function() { + var curTab = $(this), + act = curTab.attr("action"), + writeContent = $("form .write-content"), + previewContent = $("form .preview-content"); + $(".js-preview-tabs a").removeClass("selected"); + curTab.addClass("selected"); + if (act == "write") { + writeContent.css("display", "block"); + previewContent.css("display", "none"); + } else if (act == "preview") { + writeContent.css("display", "none"); + previewContent.css("display", "block"); + preview(); + } + }); + + var commentTextarea = $("textarea[name='content']"); + commentTextarea.keyup(function() { + var submitBtn = $(".js-comment-submit"); + if ($(this).val() == "") { + submitBtn.attr("disabled", "disabled"); + } else { + submitBtn.removeAttr("disabled"); + } + }); + + var commentDeleteButton = $(".js-comment-delete"); + commentDeleteButton.click(function() { + var url = $(this).attr("url"), + act = $(this).attr("act"), + commentId = $(this).attr("target-id"); + $.post(url, {"act": act}, function(ret) { + ret = $.parseJSON(ret); + if (ret.hasOwnProperty('r') && ret.r == "1") { + var containerId = "comment-"+commentId+"-container"; + $("#"+containerId).hide("fast"); + } else { + alert("Failed to delete comment"); + } + }); + }); + + var preview = function() { + var text = $("textarea[name='content']").val(); + $.ajax({ + url: "/preview", + data: {"text": text}, + success: function(ret) { + $(".comment-content .preview-content-body").html(ret); + } + }); + } + + }); +}); diff --git a/hub/static/js/app/gist/main.js b/hub/static/js/app/gist/main.js new file mode 100644 index 0000000..1b1af56 --- /dev/null +++ b/hub/static/js/app/gist/main.js @@ -0,0 +1,4 @@ +define('codemirror', ['lib/codemirror.js'], function(none){ + return CodeMirror; +}); +require(['codemirror', 'mod/gist-editor', 'mod/drop'], function(){}); diff --git a/hub/static/js/app/graph/main.js b/hub/static/js/app/graph/main.js new file mode 100644 index 0000000..e5c66cc --- /dev/null +++ b/hub/static/js/app/graph/main.js @@ -0,0 +1,273 @@ +define('d3', ['lib/d3-3.3.3.js'], function(none){ + return d3; +}); + +require(['jquery' +, 'd3' +, 'mod/contribut_info' +, 'mod/watch' ], function($, d3){ + //put your home code here. + + function activity_graph(data) { + var commits = data["data"]; + var w = 30, + h = 90; + var x = d3.scale.linear() + .domain([0, 1]) + .range([0, w]); + var y = d3.scale.linear() + .domain([0, 100]) + .rangeRound([0, h]); + var chart = d3.select("ul.graph-container").append("svg") + .attr("class", "chart") + .attr("width", w * 26) + .attr("height", h); + + chart.selectAll("rect") + .data(commits) + .enter().append("rect") + .attr("x", function(d, i) { return x(i) - .5; }) + .attr("y", function(d) { return h - y(d.commits/d.commits_peak*h) - .5; }) + .attr("width", w) + .attr("height", function(d) { return y(d.commits/d.commits_peak*h); }); + }; + + function commits_graph(data1) { + var data = data1["data"]; + var names = data1["authors"]; + + var margin = {top: 20, right: 130, bottom: 30, left: 50}, + width = 940 - margin.left - margin.right, + height = 500 - margin.top - margin.bottom; + + var parseDate = d3.time.format("%Y-%m-%d").parse; + + var x = d3.time.scale() + .range([0, width]); + + var y = d3.scale.linear() + .range([height, 0]); + + var color = d3.scale.category10(); + + var xAxis = d3.svg.axis() + .scale(x) + .orient("bottom"); + + var yAxis = d3.svg.axis() + .scale(y) + .orient("left"); + + var line = d3.svg.line() + .interpolate("basis") + .x(function(d) { return x(d.date); }) + .y(function(d) { return y(d.commits); }); + + var svg = d3.select("ul.commits-container").append("svg") + .attr("width", width + margin.left + margin.right) + .attr("height", height + margin.top + margin.bottom) + .append("g") + .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); + + color.domain(names); + + data.forEach(function(d) { + d.date = parseDate(d.date); + }); + + var authors = names.map(function(name) { + return { + name: name, + values: data.map(function(d) { + return {date: d.date, commits: +d[name]}; + }) + }; + }); + + x.domain(d3.extent(data, function(d) { return d.date; })); + + y.domain([ + d3.min(authors, function(c) { + return d3.min(c.values, function(v) { + return v.commits; }); }), + d3.max(authors, function(c) { + return d3.max(c.values, function(v) { + return v.commits; }); }) + ]); + + svg.append("g") + .attr("class", "x axis") + .attr("transform", "translate(0," + height + ")") + .call(xAxis); + + svg.append("g") + .attr("class", "y axis") + .call(yAxis) + .append("text") + .attr("transform", "rotate(-90)") + .attr("y", 6) + .attr("dy", ".71em") + .style("text-anchor", "end") + .text("Commits"); + + var author = svg.selectAll(".author") + .data(authors) + .enter().append("g") + .attr("class", "author"); + + author.append("path") + .attr("class", "line") + .attr("d", function(d) { return line(d.values); }) + .style("stroke", function(d) { return color(d.name); }); + + author.append("text") + .datum(function(d) { return {name: d.name, value: d.values[d.values.length - 1]}; }) + .attr("transform", function(d) { return "translate(" + x(d.value.date) + "," + y(d.value.commits) + ")"; }) + .attr("x", 2) + .attr("dy", ".35em") + .text(function(d) { return d.name; }); + }; + + function extensions_graph(data) { + var newdata = data["data"]; + var width = 465, + height = 400, + radius = Math.min(width, height) / 2 ; + var color = d3.scale.category20b(); + var arc = d3.svg.arc() + .outerRadius(radius - 10) + .innerRadius(0); + var pie = d3.layout.pie() + .sort(function(a, b) { return b.value - a.value; }) + .value(function(d) { return d.value; }); + var pie2 = d3.layout.pie() + .sort(function(a, b) { return b.files - a.files; }) + .value(function(d) { return d.files; }); + var svg = d3.select("div.ext-lines-container") + .append("svg") + .attr("width", width) + .attr("height", height) + .data(newdata) + .append("g") + .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")"); + + var svg2 = d3.select("div.ext-files-container") + .append("svg") + .attr("width", width) + .attr("height", height) + .data(newdata) + .append("g") + .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")"); + + var arcs = svg.selectAll(".arc") + .data(pie(newdata)) + .enter().append("g") + .attr("class", "arc"); + arcs.append("svg:path") + .attr("fill", function(d, i) { return color(i); }) + .attr("d", arc); + + arcs.filter(function(d) { return d.endAngle - d.startAngle > .2; }).append("svg:text") + .attr("transform", function(d) { + d.innerRadius = 0; + d.outerRadius = radius; + return "translate(" + arc.centroid(d) + ")"; + }) + .attr("text-anchor", "middle") + .text(function(d, i) { return d.data.name+"("+d.data.loc_p+"%"+")"; }); + + var arcs2 = svg2.selectAll(".arc") + .data(pie2(newdata)) + .enter().append("g") + .attr("class", "arc"); + arcs2.append("svg:path") + .attr("fill", function(d, i) { return color(i); }) + .attr("d", arc); + + arcs2.filter(function(d) { return d.endAngle - d.startAngle > .2; }).append("svg:text") + .attr("transform", function(d) { + d.innerRadius = 0; + d.outerRadius = radius; + return "translate(" + arc.centroid(d) + ")"; + }) + .attr("text-anchor", "middle") + .text(function(d, i) { return d.data.name+"("+d.data.foc_p+"%"+")"; }); + function angle(d) { + var a = (d.startAngle + d.endAngle) * 90 / Math.PI - 90; + return a > 90 ? a - 180 : a; + }; + }; + + function lines_graph(data) { + var margin = {top: 20, right: 20, bottom: 30, left: 50}, + width = 940 - margin.left - margin.right, + height = 470 - margin.top - margin.bottom; + + var newdata = data["data"]; + + var parseDate = d3.time.format("%Y-%m-%d").parse; + + var x = d3.time.scale() + .range([0, width]); + + var y = d3.scale.linear() + .range([height, 0]); + + var xAxis = d3.svg.axis() + .scale(x) + .orient("bottom"); + + var yAxis = d3.svg.axis() + .scale(y) + .orient("left"); + + var line = d3.svg.line() + .x(function(d) { return x(d.date); }) + .y(function(d) { return y(d.lines); }); + var svg = d3.select("ul.lines-container").append("svg") + .data(newdata) + .attr("width", width + margin.left + margin.right) + .attr("height", height + margin.top + margin.bottom) + .append("g") + .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); + + newdata.forEach(function(d) { + d.date = parseDate(d.date); + d.lines = +d.lines; + }); + + x.domain(d3.extent(newdata, function(d) { return d.date; })); + y.domain(d3.extent(newdata, function(d) { return d.lines; })); + + svg.append("g") + .attr("class", "x axis") + .attr("transform", "translate(0," + height + ")") + .call(xAxis); + + svg.append("g") + .attr("class", "y axis") + .call(yAxis) + .append("text") + .attr("transform", "rotate(-90)") + .attr("y", 6) + .attr("dy", ".71em") + .style("text-anchor", "end") + .text("Lines"); + + svg.append("path") + .datum(newdata) + .attr("class", "line") + .attr("d", line); + + }; + + var url = $(location).attr('href'); + $.getJSON( url + "data", function(data) { + console.log(data); + activity_graph(data["activity"]); + lines_graph(data["lines"]); + commits_graph(data["commits"]); + extensions_graph(data["extensions"]); + }); + +}); diff --git a/hub/static/js/app/home/main.js b/hub/static/js/app/home/main.js new file mode 100644 index 0000000..a0475c5 --- /dev/null +++ b/hub/static/js/app/home/main.js @@ -0,0 +1,8 @@ +require(['jquery' +, 'bootbox' +, 'mod/user_profile_card' +, 'mod/badge_info' +, 'mod/newsfeed' +, 'mod/userfeed_pagination'], function($){ + //put your home code here. +}); diff --git a/hub/static/js/app/home/settings.js b/hub/static/js/app/home/settings.js new file mode 100644 index 0000000..98eb54c --- /dev/null +++ b/hub/static/js/app/home/settings.js @@ -0,0 +1,139 @@ +require(['jquery', 'bootstrap', 'mod/watch', 'mod/confirm', 'mod/proj_del_btn'], function($) { + // remove committer + var showRev = function () { + $(this).children('.del-committer-btn').animate({ + top: '-=23' + }, 500); + }, + hideRev = function () { + $(this).children('.del-committer-btn').animate({ + top: '+=23' + }, 500); + }, + delCommitter = function () { + var username = $(this).prev().attr('title'); + $('#del-committer-modal .username').val(username); + $('.del-committer-name').text(username); + }, + delGroup = function () { + var username = $(this).prev().attr('title'); + $('#del-group-modal .group').val(username); + $('.del-group-name').text(username); + }; + $('.info-container .avatar').bind('mouseenter', showRev); + $('.info-container .avatar').bind('mouseleave', hideRev); + $('.del-committer-btn').bind('click', delCommitter); + $('.del-group-btn').bind('click', delGroup); + $('.js-repository-name').on('keypress keyup keydown focus', function () { + var rule = /[^0-9A-Za-z_\.]/g; + var note = $(".js-form-note"); + var button = $(".js-rename-repository-button"); + var $this = $(this); + note.html("Will be renamed as <code>" + this.value.replace(rule, "-") + "</code>"); + rule.test(this.value) ? note.is(":hidden") && note.fadeIn() : this.value || note.fadeOut(); + this.value && this.value !== $(this).attr("data-original-name") ? button.prop("disabled", !1) : button.prop("disabled", !0); + }); + $('#product').on('change', function() { + var select = $(this); + var project_name = select.data('project-name'); + $.ajax({ + type: 'POST', + data: JSON.stringify({ + 'content': select.val() + }), + contentType: 'application/json; charset=UTF-8', + url: '/api/repos/' + project_name + '/product/', + dataType: 'json', + success: function (ret) { + if (ret.status == 201) { + select.find('option:selected').removeAttr('selected'); + select.find('option[value="' + ret.content + '"]').attr("selected",true); + } + } + }); + }); + $('#update_summary').on('click', function() { + var btn = $(this); + var summary = btn.parent().find('#summary')[0].value; + var project_name = btn.data('project-name'); + $.ajax({ + type: 'POST', + data: JSON.stringify({ + 'content': summary + }), + contentType: 'application/json; charset=UTF-8', + url: '/api/repos/' + project_name + '/summary/', + dataType: 'json', + success: function (ret) { + location.reload(); + } + }); + }); + $('#intern_banned').on('click', function() { + var checkbox = $(this); + var banned = null; + var type = 'DELETE'; + var project_name = checkbox.data('project-name'); + if (checkbox.attr("checked") == "checked") { + banned = 'on'; + type = 'POST'; + } + $.ajax({ + type: type, + data: JSON.stringify({ + 'content': banned + }), + contentType: 'application/json; charset=UTF-8', + url: '/api/repos/' + project_name + '/intern_banned/', + dataType: 'json', + success: function (ret) { + if (ret && ret.content == 'on'){ + checkbox.prop("checked", "checked"); + } + } + }); + }); + $('#default_branch').on('change', function() { + var select = $(this); + var project_name = select.data('project-name'); + $.ajax({ + type: 'POST', + data: JSON.stringify({ + 'content': select.val() + }), + contentType: 'application/json; charset=UTF-8', + url: '/api/repos/' + project_name + '/default_branch/', + dataType: 'json', + success: function (ret) { + if (ret.status == 201) { + select.find('option:selected').removeAttr('selected'); + select.find('option[value="' + ret.content + '"]').attr("selected",true); + } + } + }); + }); + $('#can_push').on('click', function() { + var checkbox = $(this); + var banned = null; + var type = 'POST'; + var project_name = checkbox.data('project-name'); + if (checkbox.attr("checked") == "checked") { + banned = 'on'; + type = 'DELETE'; + } + $.ajax({ + type: type, + data: JSON.stringify({ + 'content': banned + }), + contentType: 'application/json; charset=UTF-8', + url: '/api/repos/' + project_name + '/can_push/', + dataType: 'json', + success: function (ret) { + if (ret && ret.content == 'on'){ + checkbox.prop("checked", "checked"); + } + } + }); + }); +}); diff --git a/hub/static/js/app/home/userfeed_timeline.js b/hub/static/js/app/home/userfeed_timeline.js new file mode 100644 index 0000000..28de867 --- /dev/null +++ b/hub/static/js/app/home/userfeed_timeline.js @@ -0,0 +1,16 @@ +require(['jquery' +, 'mod/connect' +, 'mod/count' +, 'mod/relative_date' +, 'mod/user_avatar' +], function($, connectNode, countDict, updateRelativeDate, loadAvatar){ + var username = $('#get-username').attr('data-username'); + var channel = 'feed:private:user:v2:' + username; + var io = connectNode(channel); + io.on('announce', function(data) { + countDict.userfeed_num += 1; + $('.timeline>ul').prepend(data.send_message); + updateRelativeDate(); + loadAvatar(); + }); +}); diff --git a/hub/static/js/app/hook/main.js b/hub/static/js/app/hook/main.js new file mode 100644 index 0000000..fa15c4d --- /dev/null +++ b/hub/static/js/app/hook/main.js @@ -0,0 +1,44 @@ +define('jquery-scrollto', 'lib/jquery.scrollTo.js'); +require(['jquery', 'jquery-unobstrusive', 'jquery-scrollto', 'mod/watch', 'jquery-tooltipster'], function($){ + $('.btn-details').tooltipster({ + content: $('<p>If this feature opening. When open a new pull request, all flake8 errors found ' + + 'by Telchar will send to CODE. visit <a href="http://code.dapps.douban.com/telchar" ' + + 'target="_blank">Telchar</a></p>'), + minWidth: 300, + maxWidth: 300, + position: 'right', + interactive: true + }); + + $('.mute').on('click', function (e) { + var target = $(this); + $.ajax({ + type: "GET", + url: target.data('href'), + dataType: "json", + success: function (rs) { + if (rs.r === 0) { + var $muteOn = $('.mute-on'), + $muteOff = $('.mute-off'); + if (rs.status === 0) { + $muteOn.removeClass('btn-success'); + $muteOff.addClass('btn-warning'); + } else { + $muteOn.addClass('btn-success'); + $muteOff.removeClass('btn-warning'); + } + } + } + }); + }); + + $(".js-hook-target").on('click', function (e) { + var target = $(this); + var group = $(".js-hook-group"); + target.parents("li").removeClass("selected"); + target.parents("li").addClass("selected"); + group.hide(); + $(this.hash).show().scrollTo(); + e.preventDefault(); + }); +}); diff --git a/hub/static/js/app/issue/issues.js b/hub/static/js/app/issue/issues.js new file mode 100644 index 0000000..1f1acca --- /dev/null +++ b/hub/static/js/app/issue/issues.js @@ -0,0 +1,5 @@ +require(['jquery' +, 'mod/watch' +, 'mod/issue_tag'], function($){ + //put your home code here. +}); diff --git a/hub/static/js/app/issue/main.js b/hub/static/js/app/issue/main.js new file mode 100644 index 0000000..17e7ec1 --- /dev/null +++ b/hub/static/js/app/issue/main.js @@ -0,0 +1,115 @@ +define('mousetrap', 'lib/mousetrap.js'); +define('tag-it', 'lib/tag-it.js'); + +require(['jquery', + 'jquery-caret', + 'jquery-atwho', + 'jquery-forms', + 'bootstrap', + 'lib/pixastic.custom', + 'mod/liveupdate', + 'mod/relative_date', + 'mod/input-ext', + 'mod/user_following', + 'mod/user_avatar', + 'mod/watch', + 'mod/user_profile_card', + 'mod/tasklist', + 'mod/issue_body', + 'tag-it', + 'mousetrap'], + function ($, _, _, _, _, _, live, updateRelativeDate, inputExt, userFollowing) { + $(function () { + // FIXME: comment edit后不显示相对时间 + + // liveupdate + var channel_id = "code_issue_"+$('#issue').attr('data-url'); + + // people in room + live.emit('ready', {channel: channel_id, msg: ''}); + $('textarea#new_comment_content').live('keypress', (function(e) { + var username = $('textarea#new_comment_content').data('current-user'); + live.emit('ready', {channel: channel_id, type: 'typing', username: username}); + })); + + // new comment + $('#add-comment-form').ajaxForm( + {dataType: 'json', + delegation: true, + beforeSend: function () { + var commentForm = $('#add-comment-form'); + commentForm.find('button[type="submit"]').attr('disabled', true).addClass('disabled') + .end().find('.loader').show(); + }, + success: function(r) { + var commentForm = $('#add-comment-form'); + if (r.r == 0) { + if (r.reload && r.redirect_to) { + window.location.href = r.redirect_to; + return true; + } else if (r.html && r.participants_html) { + commentForm.find('textarea').val(''); + $('#changelog').append(r.html); + $('#participants-block').html(r.participants_html); + live.emit('ready', {channel: channel_id, msg:r.html}); + } + } else if(r.error){ + alert(r.error); + } + commentForm.removeClass('submitting').find('button[type="submit"]').attr('disabled', false) + .removeClass('disabled').end().find('.loader').hide(); + updateRelativeDate(); + return true; + }}); + + // inputExt + var loadCommentInputExt = function () { + var participants = JSON.parse($('#participants').val() || '[]'); + var teams = JSON.parse($('#all-teams').val() || '[]'); + var following = userFollowing.val(); + var users = $.unique( + participants.concat(following, teams) + ); + $('textarea#new_comment_content, textarea#issue_body') + .atwho("@", {data:users, limit:7}); + + var newCommentInput = $('textarea#new_comment_content'); + inputExt.enableEmojiInput(newCommentInput); + inputExt.enablePullsInput(newCommentInput); + inputExt.shortcut2submit(newCommentInput); + inputExt.enableZenMode(newCommentInput); + inputExt.enableQuickQuotes(newCommentInput); + + var uploader = $('#form-file-upload'), + textarea = $('#add-comment-form').find('textarea'); + inputExt.enableUpload(uploader, textarea); + }; + loadCommentInputExt(); + + $('#fav-button').click(function (e) { + var btn = $(this), + data = {tid: btn.data('tid'), + tkind: btn.data('tkind')}; + if (!btn.hasClass('faved')) { + $.post('/j/fav/', data, + function (r) { + if (r.r == 0) { + btn.addClass('faved'); + } + }, 'json'); + } else { + $.ajax({url: '/j/fav/', + type: 'DELETE', + data: data, + dataType: 'json', + success: function(r) { + if (r.r == 0) { + btn.removeClass('faved'); + } + } + }); + } + }); + }); + } +); diff --git a/hub/static/js/app/issue/new.js b/hub/static/js/app/issue/new.js new file mode 100644 index 0000000..424f9ab --- /dev/null +++ b/hub/static/js/app/issue/new.js @@ -0,0 +1,42 @@ +define('mousetrap', 'lib/mousetrap.js'); +define('tag-it', 'lib/tag-it.js'); + +require( + ['jquery' + , 'mod/input-ext' + , 'jquery-caret' + , 'jquery-atwho' + , 'jquery-timeago' + , 'bootstrap' + , 'mod/watch' + , 'mousetrap' + , 'tag-it'], + function($, inputExt){ + $(function () { + inputExt.enableZenMode('#pull_body'); + inputExt.enableAutoCompleteFollowingAndTeam('#pull_body'); + //previewable-comment-form + $('.previewable-comment-form .js-preview-tabs a.preview-tab').on('show', function(e) { + $('#preview_bucket p').html("Loading preview..."); + }).on('shown', function(e) { + var url = $('#preview_bucket .content-body').data('api-url'); + var text = $('#write_bucket textarea').val(); + $('#preview_bucket .content-body').load(url, {text: text}); + }); + + $('.new-issue form').submit( + function () { + $(this).find('button[type="submit"]').attr('disabled', true).addClass('disabled'); + //Google Analytic Events + ga('send', 'event', 'issue', 'create'); + } + ); + + var uploader = $('#form-file-upload'), + textarea = $('#write_bucket textarea'); + inputExt.enableUpload(uploader, textarea); + + $('#issue-tags').tagit({input_name: 'issue_tags', tag_list: $('.label')}); + + }); + }); diff --git a/hub/static/js/app/issue/team-issue.js b/hub/static/js/app/issue/team-issue.js new file mode 100644 index 0000000..374356f --- /dev/null +++ b/hub/static/js/app/issue/team-issue.js @@ -0,0 +1,85 @@ +define('mousetrap', 'lib/mousetrap.js'); +define('tag-it', 'lib/tag-it.js'); + +require( + ['jquery' + , 'jquery-caret' + , 'jquery-atwho' + , 'jquery-forms' + , 'bootstrap' + , 'lib/pixastic.custom' + , 'mod/liveupdate' + , 'mod/relative_date' + , 'mod/input-ext' + , 'mod/user_avatar' + , 'mod/watch' + , 'mod/user_profile_card' + , 'mod/tasklist' + , 'mod/issue_body' + , 'mod/team_header' + , 'tag-it' + , 'mousetrap'], + function($, _, _, _, _, _, live, updateRelativeDate, inputExt){ + $(function () { + + // liveupdate + var channel_id = "code_team_issue_"+$('#issue').attr('data-url'); + + // people in room + live.emit('ready', {channel: channel_id, msg: ''}); + $('textarea#new_comment_content').live('keypress', (function(e) { + var username = $('textarea#new_comment_content').data('current-user'); + live.emit('ready', {channel: channel_id, type: 'typing', username: username}); + })); + + // new comment + $('#add-comment-form').ajaxForm( + {dataType: 'json', + delegation: true, + beforeSend: function () { + var commentForm = $('#add-comment-form'); + commentForm.find('button[type="submit"]').attr('disabled', true).addClass('disabled') + .end().find('.loader').show(); + }, + success: function(r) { + var commentForm = $('#add-comment-form'); + if (r.r == 0) { + if (r.reload && r.redirect_to) { + window.location.href = r.redirect_to; + return true; + } else if (r.html && r.participants_html) { + commentForm.find('textarea').val(''); + $('#changelog').append(r.html); + $('#participants-block').html(r.participants_html); + live.emit('ready', {channel: channel_id, msg:r.html}); + } + } else if(r.error){ + alert(r.error); + } + commentForm.removeClass('submitting').find('button[type="submit"]').attr('disabled', false) + .removeClass('disabled').end().find('.loader').hide(); + updateRelativeDate(); + return true; + }}); + + // inputExt + var loadCommentInputExt = function () { + if ($('#participants').length > 0) { + var participants = JSON.parse($('#participants').val()); + $('textarea#new_comment_content').atwho("@", {data:participants, limit:7}); + } + var newCommentInput = $('textarea#new_comment_content'); + inputExt.enableEmojiInput(newCommentInput); + //inputExt.enablePullsInput(newCommentInput); // team do not support pulls + inputExt.shortcut2submit(newCommentInput); + inputExt.enableZenMode(newCommentInput); + inputExt.enableQuickQuotes(newCommentInput); + + var uploader = $('#form-file-upload'), + textarea = $('#add-comment-form').find('textarea'); + inputExt.enableUpload(uploader, textarea); + }; + loadCommentInputExt(); + + }); + }); diff --git a/hub/static/js/app/m/gist/main.js b/hub/static/js/app/m/gist/main.js new file mode 100644 index 0000000..1b1af56 --- /dev/null +++ b/hub/static/js/app/m/gist/main.js @@ -0,0 +1,4 @@ +define('codemirror', ['lib/codemirror.js'], function(none){ + return CodeMirror; +}); +require(['codemirror', 'mod/gist-editor', 'mod/drop'], function(){}); diff --git a/hub/static/js/app/m/main.js b/hub/static/js/app/m/main.js new file mode 100644 index 0000000..e1f17de --- /dev/null +++ b/hub/static/js/app/m/main.js @@ -0,0 +1,25 @@ +define('jquery-pullToRefresh', ['jquery'], 'lib/jquery.plugin.pullToRefresh.js'); +require(['jquery', 'jquery-pullToRefresh'], + function($){ + $(function () { + var timeline = $('.timeline dl'), isPublic = $('#is-public-timeline').val() == 'True' ? true : false; + var loadNews = function (defer) { + $.ajax({url:'/m/actions', + data:{since_id:timeline.children().first().attr('id') || '', + is_public:isPublic}, + dataTyep:'html', + success:function (r) { + timeline.prepend(r); + defer && defer.resolve(); + }}); + }; + loadNews(); + + $('.scrollable').pullToRefresh( + {callback:function() { + var def = $.Deferred(); + loadNews(def); + return def.promise(); + }}); + }); + }); \ No newline at end of file diff --git a/hub/static/js/app/people/main.js b/hub/static/js/app/people/main.js new file mode 100644 index 0000000..5d40d2e --- /dev/null +++ b/hub/static/js/app/people/main.js @@ -0,0 +1,43 @@ +define('cal-heatmap', 'lib/cal-heatmap.js'); + +require(['jquery', + 'cal-heatmap', + 'mod/badge_info', + 'mod/praise', + 'mod/commit_graph', + 'mod/follow', + 'mod/newsfeed'], + function($, _, _, _, _, follow){ + $('.timeline .loader').hide(); + $(function () { + var currentURL = location.href.split('?')[0]; // remove the querystring + + if (typeof CalHeatMap != 'undefined') { + var getDetailByDate = function (date) { + $.get(currentURL + 'contribution_detail', {date:date.toISOString()}, + function (r) { + $('#contribution-details').html(r); + } + ); + }; + + var today = new Date(); + var cal = new CalHeatMap(); + cal.init({id: 'cal-heatmap', + data: currentURL + 'contributions', + start: new Date(today.setMonth(today.getMonth() - 6)), + domain: 'month', + subDomain: 'day', + range: 8, + cellsize: 12, + onClick: function(date, count) { + getDetailByDate(date); + }}); + // get contribution of yesterday by default + var d = new Date(); + getDetailByDate(new Date(d.setDate(d.getDate() - 1))); + } + + follow.button(".follow-btn .btn"); + }); + }); diff --git a/hub/static/js/app/praise/main.js b/hub/static/js/app/praise/main.js new file mode 100644 index 0000000..f2ca8a3 --- /dev/null +++ b/hub/static/js/app/praise/main.js @@ -0,0 +1 @@ +require(['mod/praise'], function ($) {}); diff --git a/hub/static/js/app/pull/main.js b/hub/static/js/app/pull/main.js new file mode 100644 index 0000000..edae5e8 --- /dev/null +++ b/hub/static/js/app/pull/main.js @@ -0,0 +1,462 @@ +define('mousetrap', 'lib/mousetrap.js'); + +require([ + 'jquery', + 'jquery-caret', + 'jquery-atwho', + 'jquery-forms', + 'bootstrap', + 'lib/pixastic.custom', + 'mod/liveupdate', + 'mod/input-ext', + 'mod/quick_emoji', + 'mod/user_following', + 'mod/watch', + //'mod/commit', // delegate of .js-comment-edit-button // plz refac... + 'mod/diff', // diff js + 'mod/user_profile_card', + 'mod/tasklist', + 'mod/mute', + 'mousetrap', + 'mod/pull_key', + ], + function ($, _, _, _, _, _, live, inputExt, quick_emoji, userFollowing) { + $(function () { + var channel_id = "code_pr_"+$('.discussion-tab-link').attr('data-url'); + var linecomment_channel_id = channel_id + 'linecomment'; + live.emit('ready', {channel: channel_id, msg: ''}); + $('textarea#new_comment_content').live( + 'keypress', + (function (e) { + var username = $('textarea#new_comment_content').data('current-user'); + live.emit('ready', {channel: channel_id, type: 'typing', username: username}); + }) + ); + + // pull-nav + var getAnchor = function (url) { + var index = url.indexOf('#'); + if (index != -1) { + return url.substring(index + 1); + } + return ''; + }; + var loadTabContent = function (tab, isFirstLoad) { + var container = $('#' + $(tab).attr('data-tab-container')), + url = $(tab).attr('data-j-url'); + + if (container && container.children().length == 0) { + $('.loader').show(); + container.load(url, {}, function () { + $('.loader').hide(); + if (container.is('#discussion-pane') || container.is('#files-pane') || container.is("#commits-pane")) { + loadMergeGuide(container, function(st){ + window.initState = st; + }); + + loadCommentInputExt(); + + $('#watch-ci').on('click', function(){ + if ($(this).attr('checked')) { + CINotification.init(); + window.ciWatcher = window.setInterval(function(){ + loadMergeGuide(container, function(st){ + var msg, prName = $('h2').text(); + if (st !== window.initState) { + if (st === 'clean') { + msg = 'PR "'+ prName +'" can merge now'; + clearTimeout(window.ciWatcher); + } else if (st === 'error') { + msg = 'PR "'+ prName +'" occurred an error'; + window.initState = 'error'; + } else if (st === 'dirty') { + msg = 'PR "'+ prName +'" got a qaci'; + window.initState = 'dirty'; + } else { + msg = 'Something wrong... ping xutao!' + } + CINotification.create('Code need your Attention!', msg); + } + }); + }, 5000); + } else { + clearTimeout(window.ciWatcher); + } + }); + + } + if (isFirstLoad) { + var anchor = getAnchor(location.href); + if (anchor !== '') { + var anchorEl = $(document.getElementById(anchor)); + if (anchorEl.length > 0) { + $('html, body').animate({scrollTop:anchorEl.offset().top}, 500); + } + } + } + }); + } + }; + + /* notification */ + var CINotification = { + init: function () { + var webkitNotify = window.webkitNotifications, + notify = window.Notification; + + if (webkitNotify) { + var st = webkitNotify.checkPermission(); + if (st === 1) { + webkitNotify.requestPermission(); + } else if (st === 2) { + alert('你拒绝了通知授权,请在通知设置里打开。') + } + } else if (notify && notify.permission !== "granted") { + notify.requestPermission(function (status) { + if (notify.permission !== status) { + notify.permission = status; + } + }); + } + }, + + create: function(title,msg) { + var webkitNotify = window.webkitNotifications, + notify = window.Notification, + icon = '/static/img/code_lover.png'; + + if (webkitNotify) { + if (webkitNotify.checkPermission() != 0) { + message.init(); + } else { + var n = webkitNotify.createNotification(icon,title, msg); + n.show(); + /* + n.ondisplay = function() { }; + n.onclose = function() { }; + setTimeout(function(){n.cancle}, 5000); + */ + } + } else if (notify) { + if (notify.permission == "granted") { + var n = new notify(title, { icon: icon, body: msg }); + } else { + message.init(); + } + } + } + } + + $('.pull-nav a[data-toggle="tab"]').on('show', function (e) { + window.history.pushState('', '', $(e.target).attr('data-url')); + loadTabContent($(e.target), false); + }); + loadTabContent($('.pull-nav .active a'), true); + var tabUrls = [], tabs = {}; + $('.pull-nav a[data-toggle="tab"]').each( + function (i, t) { + var url = $(t).attr('data-url'); + tabUrls.push(url); + tabs[url] = $(t); + }); + $(window).bind( + "popstate", function(e) { + var location = e.target.location, + path = location.href.split(location.protocol + '//' + location.host)[1], + anchorIndex = path.indexOf('#'); + if (anchorIndex !== -1) { + path = path.substring(0, anchorIndex); + } + if (path) { + for (var i=0, l=tabUrls.length; i<l; i++) { + if (path === tabUrls[i]) { + tabs[tabUrls[i]].tab('show'); + break; + } + } + } + }); + + // ticket-content-edit-form + $('#ticket-content-edit-form').ajaxForm({ + dataType: 'json', + delegation: true, + success: function(r) { + if (r.r == '0') { + var ticket = $('#ticket'); + ticket.find('h2').html(r.title_html); + ticket.find('.comment-content .comment-body').html(r.content_html); + // update ticket content in edit form + $('#ticket-content-edit-form').find('#issue_title').val(r.title); + $('#ticket-content-edit-form').find('#issue_body').val(r.content); + } + $('#ticket .comment-content').removeClass('is-comment-editing'); + } + }); + + // comment & linecomment edit + $('body').delegate('.js-comment-edit-button', 'click', function (e) { + var form_content = $(this).parents('.comment-header') + .next('.comment-content') + .children('.form-content'); + if (form_content != undefined) { + form_content.show().find('textarea').focus(); + form_content.find('form.js-comment-update').ajaxForm({ + dataType: 'json', + beforeSend: function() { + form_content.find('button[type="submit"]').attr('disabled', true).addClass('disabled') + .end().find('.loader').show(); + }, + success: function(r) { + if (r.r == 0 && r.html) { + if (form_content.find('textarea').attr('name') === 'pull_request_review_comment'){ + form_content.parents('.js-comments-holder').append(r.html); + form_content.parents('.comment').remove(); + } else { + var comment = form_content.parents('.change'); + var avatar = comment.prev('.side-avatar'); + form_content.parents('#changelog').append(r.html); + comment.remove(); + avatar.remove(); + } + } + return true; + } + }); + } else { + return false; + } + }); + + $('body').delegate('.form-content .comment-cancel-button', 'click', function (e) { + var form_content = $(this).parents('.form-content'); + if (form_content != undefined) { + form_content.hide(); + } else { + return false; + } + }); + + $('#discussion-pane').delegate('.comment-edit-button', 'click', function () { + $('#ticket .comment-content').addClass('is-comment-editing').find('.form-content').show(); + }); + $('#discussion-pane').delegate('.comment-cancel-button', 'click', function () { + $('#ticket .comment-content').removeClass('is-comment-editing'); + }); + + $('#discussion-pane').delegate( + '#fav-button', 'click', function (e) { + var btn = $(this), + data = {tid: btn.data('tid'), + tkind: btn.data('tkind')}; + if (!btn.hasClass('faved')) { + $.post('/j/fav/', data, + function (r) { + if (r.r == 0) { + btn.addClass('faved'); + } + }, 'json'); + } else { + $.ajax({url: '/j/fav/', + type: 'DELETE', + data: data, + dataType: 'json', + success: function(r) { + if (r.r == 0) { + btn.removeClass('faved'); + } + } + }); + } + }); + + // diff_image + $('#files-pane').delegate('#diff_image', 'click', function() { + var imgid = $(this).attr("imgid"); + $("#org_image_div_"+imgid).hide(); + $("#diff_image_div_"+imgid).show(); + Pixastic.process( + document.getElementById("result_pic_"+imgid), + "blend", + { + mode: "difference", + image: $("#new_pic_"+imgid).get(0) + } + ); + }); + $('#files-pane').delegate('#up_image', 'click', function(){ + var imgid = $(this).attr("imgid"); + $("#org_image_div_"+imgid).show(); + $("#diff_image_div_"+imgid).hide(); + }); + + // pull files-pane patch toggle + $('body').delegate('#files-pane #files div.meta', 'click', function(e){ + if (!$(e.target).parents('.actions').length > 0){ + var inline = $(this).siblings('div .inline'); + var side = $(this).siblings('div .side'); + if (inline.css('display') === 'none' && side.css('display') === 'none'){ + inline.show(); + side.hide(); + }else{ + inline.hide(); + side.hide(); + } + } + }); + + // merge guide + var loadMergeGuide = function (container, cb) { + if (!container) + return; + var mergeGuide = container.find('#merge-guide'); + if (mergeGuide.length) { + var url = mergeGuide.attr('data-url'); + mergeGuide.load( + url, + function () { + var mergeForm = mergeGuide.find('.merge-form'), + cancelBtn = mergeGuide.find('#merge-pr-cancel-btn'); + mergeGuide.find('#merge-pr-confirm-btn').click(function () { + $(this).closest('.mergeable.clean').hide(); + mergeForm.show(); + }); + cancelBtn.click(function () { + if (!$(this).hasClass('disabled')) { + mergeForm.hide(); + mergeGuide.find('.mergeable.clean').show(); + } + }); + mergeForm.submit(function () { + $(this).find('button[type="submit"]').attr('disabled', true).addClass('disabled'); + cancelBtn.addClass('disabled'); + var username = $('textarea#new_comment_content').data('current-user'); + live.emit('ready', {channel: channel_id, type: 'merge', username: username}); + return true; + }); + + cb(container.find('.merge-branch').data('mst')); + } + ); + } + }; + + $('#discussion-pane').delegate('#add-comment-form #close', 'click', function () { + var commentForm = $('#add-comment-form'); + if (commentForm.find('[name=comment_and_close]').length == 0) { + var input = $('<input>').attr('type', 'hidden').attr('name', 'comment_and_close').val('1'); + commentForm.append(input); + } + }); + + $('#discussion-pane').delegate('#add-comment-form #reopen', 'click', function () { + var commentForm = $('#add-comment-form'); + if (commentForm.find('[name=comment_and_reopen]').length == 0) { + var input = $('<input>').attr('type', 'hidden').attr('name', 'comment_and_reopen').val('1'); + commentForm.append(input); + } + }); + + $('#discussion-pane').delegate('.outdated_mark', 'click', function () { + $(this).toggle(); + $(this).next().toggle(); + }); + + // delete pr comment + $('#discussion-pane').delegate('.change-header .delete-pr-note-button', 'click', function (e) { + if (!confirm('Are you sure you want to delete this?')) { + return false; + } + var comment = $(this).parents('.change'); + var avatar = comment.prev('.side-avatar'); + $.getJSON( + $(this).attr('href'), + function(r) { + if (r.r == '1'){ + comment.remove(); + avatar.remove(); + } + } + ); + return false; + }); + + $('#add-comment-form').ajaxForm({ + dataType: 'json', + delegation: true, + beforeSend: function () { + var commentForm = $('#add-comment-form'); + commentForm.find('button[type="submit"]').attr('disabled', true).addClass('disabled') + .end().find('.loader').show(); + }, + success: function(r) { + var commentForm = $('#add-comment-form'); + if (r.r == 0) { + if (r.reload && r.redirect_to) { + window.location.href = r.redirect_to; + return true; + } else if (r.html) { + commentForm.find('textarea').val(''); + $('#changelog').append(r.html); + live.emit('ready', {channel: channel_id, msg:r.html}); + } + } else if(r.error){ + alert(r.error); + } + commentForm.removeClass('submitting').find('button[type="submit"]').attr('disabled', false) + .removeClass('disabled').end().find('.loader').hide(); + return true; + } + }); + + $('.tabnav-tabs a').live('click', function () { + $(this).closest('.tabnav-tabs').find('a').removeClass('selected'); + $(this).addClass('selected'); + }); + + $('.write-tab').live('click', function () { + var form = $(this).closest('.previewable-comment-form'); + $(this).closest('.previewable-comment-form').removeClass('preview-selected').addClass('write-selected'); + form.find('#write_bucket').addClass('active').end().find('#preview_bucket').removeClass('active'); + }); + $('.preview-tab').live('click', function () { + var form = $(this).closest('.previewable-comment-form'); + form.removeClass('write-selected').addClass('preview-selected'); + form.find('#write_bucket').removeClass('active').end().find('#preview_bucket').addClass('active'); + form.find('#preview_bucket p').html("Loading preview..."); + var url = form.find('#preview_bucket .content-body').data('api-url'), + text = form.find('#write_bucket textarea').val(); + form.find('#preview_bucket .content-body').load(url, {text: text}); + }); + + var loadCommentInputExt = function () { + if ($('#participants').length > 0) { + var participants = JSON.parse($('#participants').val()); + var teams = JSON.parse($('#all-teams').val() || '[]'); + var following = userFollowing.val(); + var users = $.unique( + participants.concat(following, teams) + ); + $('textarea#new_comment_content, textarea#issue_body') + .atwho("@", {data:users, limit:7}); + } + var newCommentInput = $('textarea#new_comment_content'); + inputExt.enableEmojiInput(newCommentInput); + inputExt.enablePullsInput(newCommentInput); + inputExt.shortcut2submit(newCommentInput); + inputExt.enableZenMode(newCommentInput); + inputExt.enableQuickQuotes(newCommentInput); + + var uploader = $('#form-file-upload'), + textarea = $('#add-comment-form').find('textarea'); + inputExt.enableUpload(uploader, textarea); + + $('#add-comment-form button[type="submit"]').tooltip(); + }; + loadCommentInputExt(); + + }); + + quick_emoji.enable('#new_comment_content'); + } +); diff --git a/hub/static/js/app/pull/new.js b/hub/static/js/app/pull/new.js new file mode 100644 index 0000000..a1136c9 --- /dev/null +++ b/hub/static/js/app/pull/new.js @@ -0,0 +1,87 @@ +define('mousetrap', 'lib/mousetrap.js'); + +require( + ['jquery' + , 'mod/input-ext' + , 'jquery-caret' + , 'jquery-atwho' + , 'jquery-timeago' + , 'bootstrap' + , 'mod/watch' + //, 'mod/commit' + , 'mod/diff' // diff js + , 'mousetrap'], + function($, inputExt){ + $(function () { + inputExt.enableZenMode('#pull_body'); + inputExt.enableAutoCompleteFollowingAndTeam('#pull_body'); + + //pull.js + $('.editor-expander').click( + function() { + var $editor = $('.range-editor'); + $('.pull-tabs').css('opacity', $editor.css('display') == 'none' ? 0.45 : 1); + $editor.slideToggle('fast'); + return false; + }); + + var update_preview = function($box) { + var proj_name = $box.find('select').val(); + var url = '/api/' + proj_name + '/git/branches'; + + $.getJSON(url, function(branches){ + $box.find('.typeahead').data('source', branches); + }); + + url = $box.data('preview-url-base') + proj_name + ':' + $box.find('input.js-ref').val(); + $box.find('.commit-preview').load(url); + }; + + $('.range-editor select[name=base_repo]').change( + function() { + var $box = $(this).parents('.chooser-box'); + update_preview($box); + }); + + $('.range-editor input[type=text]').change( + function() { + var $box = $(this).parents('.chooser-box'); + update_preview($box); + }); + + $('#update_commit_range').click( + function() { + var $form = $(this).parents('form'); + $form.attr('action', $(this).data('url')).submit(); + }); + //previewable-comment-form + $('.previewable-comment-form .js-preview-tabs a.preview-tab').on( + 'show', function(e) { + $('#preview_bucket p').html("Loading preview..."); + }).on('shown', function(e) { + var url = $('#preview_bucket .content-body').data('api-url'); + var text = $('#write_bucket textarea').val(); + $('#preview_bucket .content-body').load(url, {text: text}); + }); + + $('.new-pull-request form').submit( + function () { + $(this).find('button[type="submit"]').attr('disabled', true).addClass('disabled'); + //Google Analytic Events + ga('send', 'event', 'pullrequest', 'create'); + }); + + var uploader = $('#form-file-upload'), + textarea = $('#write_bucket textarea'); + inputExt.enableUpload(uploader, textarea); + + $('a[data-toggle="tab"]').on( + 'shown', function (e) { + if ($(e.target).hasClass('preview-discussion-tab')) { + $('#form-file-upload').show(); + } else { + $('#form-file-upload').hide(); + } + }); + }); + }); diff --git a/hub/static/js/app/pull/pulls.js b/hub/static/js/app/pull/pulls.js new file mode 100644 index 0000000..563729a --- /dev/null +++ b/hub/static/js/app/pull/pulls.js @@ -0,0 +1,4 @@ +require(['jquery' +, 'mod/watch'], function($){ + //put your home code here. +}); diff --git a/hub/static/js/app/search/search.js b/hub/static/js/app/search/search.js new file mode 100644 index 0000000..0ad30fd --- /dev/null +++ b/hub/static/js/app/search/search.js @@ -0,0 +1,38 @@ +require(['jquery', 'jquery-timeago'], function($, Spinner) { + var fetch = function(data) { + $.post('count', data, function(ret) { + ret = $.parseJSON(ret); + $('.mini-icon-public-repo + .counter').text(ret.repos); + $('.mini-icon-code + .counter').text(ret.codes); + $('.mini-icon-person + .counter').text(ret.users); + $('.mini-icon-doc + .counter').text(ret.docs); + $('.mini-icon-pull + .counter').text(ret.pulls); + $('.mini-icon-issue + .counter').text(ret.issues); + }); + } + $(function() { + var q = $("#command-bar").val(); + var language = $("input[name='language']").val(); + var state = $("input[name='state']").val(); + var doctype = $("input[name='doctype']").val(); + var data = {q:q, language:language, state:state, doctype:doctype}; + fetch(data); + }); + + $('select[name="s"]').change(function() { + $(this).parent().submit(); + }); + + $('#tip').click(function() { + $('#tip-content').toggle(); + }); + + $('a.path-url').each(function (){ + var url = $(this).attr('href'); + $(this).parents('.public').find('.linenodiv a').each(function (){ + var href = $(this).attr('href'); + $(this).attr('href', url + href); + }); + }); +}); + diff --git a/hub/static/js/app/settings/codereview.js b/hub/static/js/app/settings/codereview.js new file mode 100644 index 0000000..f6b9b88 --- /dev/null +++ b/hub/static/js/app/settings/codereview.js @@ -0,0 +1,52 @@ +require(['jquery'], function(){ + var is_enable = 1; + var field = [ + 'dblclick_comment', + ]; + + for(var i = 0; i < field.length; i++){ + $('#' + field[i]).click(function() { + var checkbox = $(this); + if(checkbox.attr("checked") == "checked"){ + is_enable = 1; + }else{ + is_enable = 0; + } + + $.ajax({ + type: 'POST', + data: { + 'field': checkbox.val(), + 'is_enable': is_enable + }, + url: '/settings/codereview/setting', + dataType: 'json', + success: function (ret) { + if(ret.result == 'fail'){ + checkbox.prop("checked", "checked"); + } + } + }); + }); + } + + $('#text_font').on('change', function() { + var select = $(this); + $.ajax({ + type: 'POST', + data: { + 'field': 'text_font', + 'is_enable': select.val() + }, + url: '/settings/codereview/setting', + dataType: 'json', + success: function (ret) { + if(ret.result == 'fail'){ + select.find('option:selected').removeAttr('selected'); + select.find('option[value="' + ret.origin + '"]').attr("selected",true); + } + } + }); + }); +}); + diff --git a/hub/static/js/app/settings/notification.js b/hub/static/js/app/settings/notification.js new file mode 100644 index 0000000..2c0ee4f --- /dev/null +++ b/hub/static/js/app/settings/notification.js @@ -0,0 +1,36 @@ +require(['jquery'], function(){ + var is_on = 1; + var notifications_meta = ['participating_email', + 'participating_irc', + 'participating_web', + 'watching_email', + 'watching_irc', + 'watching_web']; + + for(var i = 0; i < notifications_meta.length; i++){ + $('#' + notifications_meta[i]).click(function() { + var checkbox = $(this); + if(checkbox.attr("checked") == "checked"){ + is_on = 1; + }else{ + is_on = 0; + } + + $.ajax({ + type: 'POST', + data: { + 'notifications_meta': checkbox.val(), + 'is_on': is_on + }, + url: '/settings/notification/setting', + dataType: 'json', + success: function (ret) { + if(ret.result == 'fail'){ + checkbox.prop("checked", "checked"); + } + } + }); + }); + } +}); + diff --git a/hub/static/js/app/src/commit.js b/hub/static/js/app/src/commit.js new file mode 100644 index 0000000..a7611b0 --- /dev/null +++ b/hub/static/js/app/src/commit.js @@ -0,0 +1,9 @@ +define('mousetrap', 'lib/mousetrap.js'); + +require(['mod/quick_emoji' +, 'mousetrap' +, 'mod/commit' +, 'mod/diff' // diff js +, 'mod/zclip' ], function(quick_emoji){ + quick_emoji.enable("#new_comment_content"); +}); diff --git a/hub/static/js/app/src/compare.js b/hub/static/js/app/src/compare.js new file mode 100644 index 0000000..75f76c2 --- /dev/null +++ b/hub/static/js/app/src/compare.js @@ -0,0 +1,6 @@ +require(['mod/compare' +, 'mod/zclip' +, 'mod/diff' // no use yet +], function(){ + //do any thing? +}); diff --git a/hub/static/js/app/src/editor.js b/hub/static/js/app/src/editor.js new file mode 100644 index 0000000..7eb6279 --- /dev/null +++ b/hub/static/js/app/src/editor.js @@ -0,0 +1,7 @@ +define('codemirror', ['lib/codemirror.js'], function(none){ + return CodeMirror; +}); + +require(['codemirror', 'mod/editor', 'mod/zclip'], function(){ + //do any thing? +}); diff --git a/hub/static/js/app/src/src.js b/hub/static/js/app/src/src.js new file mode 100644 index 0000000..d26f603 --- /dev/null +++ b/hub/static/js/app/src/src.js @@ -0,0 +1,158 @@ +define('key', ['lib/keymaster.js'], function(none){ + return key; +}); +define('string-score', 'lib/string_score.js'); +define('jquery-media', 'lib/jquery.media.js'); +define('jquery-commits-graph', 'lib/jquery.commits-graph.js'); +define('pjax', 'lib/jquery.pjax.js'); + +require(['jquery' +, 'spin' +, 'jquery-timeago' +, 'bootstrap' +, 'mod/type_search' +, 'mod/watch' +, 'mod/fetch' +, 'mod/shortcut' +, 'mod/zclip' +, 'key' +, 'string-score' +, 'pjax' +, 'jquery-media' +, 'jquery-commits-graph' +], function($, Spinner){ + + var init_source_info = function () { + var get_src = function (path, ref) { + var is_image = /^.+\.(jpg|png|gif|jpeg)$/i.test(path); + if(is_image){ + apiurl = '/'.concat(projectName, '/raw/', ref, '/', path); + file.html('<img src="'+apiurl+'">'); + } + else{ + $.ajax({type: 'GET', + data: {'path': path, 'ref': ref}, + url: '/api/'.concat(projectName, '/src'), + dataType: 'json', + success: function (ret) { + if (ret.type == 'blob') { + //if (ret.parser == 'markdown' || ret.parser == 'docutils') { + // // reuse markdown's css + // file.addClass('markdown-body'); + //} + file.html(ret.src); + $('.media').media({width:938, height:600}); + var anchor = window.location.hash; + var highlight_re = /#L(\d+)-(\d+)$/; + var scroll_re = /#L-?(\d+)$/; + if (anchor && anchor.match(scroll_re) != undefined){ + var paras = anchor.match(scroll_re); + var line_num = parseInt(paras[1]); + $('a[name="'+'L-'+line_num.toString()+'"]'). + parent('div').css('background-color', 'rgb(255, 255, 204)'); + $('a[href='.concat('#L-'+line_num.toString(), "]")).get(0).scrollIntoView(); + } + else if (anchor && anchor.match(highlight_re) != undefined){ + var paras = anchor.match(highlight_re); + var start = parseInt(paras[1]); + var end = parseInt(paras[2]); + var h = end - start; + $('a[name="'+'L-'+start.toString()+'"]'). + parent('div').css('background-color', 'rgb(255, 255, 204)') + .nextAll('div').slice(0, h).css('background-color', 'rgb(255, 255, 204)'); + $('a[href='.concat('#L-'+paras[1], "]")).get(0).scrollIntoView(); + } + } + }}); + } + }; + var get_commits = function (path, ref) { + $.ajax({type: 'GET', + data: {'path': path, 'ref': ref}, + url: '/api/'.concat(projectName, '/commits_by_path'), + dataType: 'json', + success: function (ret) { + if (ret.r) { + var commits = ret.commits; + treeBrowser.find('.tree-item').each( + function (idx) { + var id = $(this).attr('id') + var c = commits[id]; + $(this).children('.age').text(c.age); + if (!c.contributor_url) { + $(this).children('.message').html( + '<a class="message" href="/'.concat(projectName, '/commit/', c.sha, '">', c.message_with_emoji, '</a>', + ' [', '<span>', c.contributor, '</span>]')); + } else { + $(this).children('.message').html( + '<a class="message" href="/'.concat(projectName, '/commit/', c.sha, '">', c.message_with_emoji, '</a>', + ' [', '<a href="', c.contributor_url, '">', c.contributor, '</a>]')); + } + }); + } + }}); + }; + + var drawSpinner = function (elem, isSmall) { + var opts = { lines: 9, length: 6, width: 4, radius: 9, rotate: 12, + color: '#000', speed: 1, trail: 60, shadow: false, + hwaccel: false, className: 'spinner', zIndex: 2e9, + top: 'auto', left: 'auto' }; + if (isSmall) { + opts.length = 4; + opts.width = 2; + opts.radius = 4; + } + return new Spinner(opts).spin(elem); + }; + + // main + + var projectName = $('#project_name').val(), + blob = $('#blob'), file = $('.file'), + tree = $('#tree'), treeBrowser = $('.tree-browser'); + if (tree.length > 0) { + drawSpinner($('.tree-browser td.message:first')[0], true); + // get commits details + var path = tree.attr('data-path'), + ref = tree.attr('data-ref'); + get_commits(path, ref); + } + if (blob.length > 0) { + drawSpinner($('.file')[0]); + var path = blob.attr('data-path'), + ref = blob.attr('data-ref'); + get_src(path, ref); + } + + }; + + $(document).pjax('#pjax_container #tree .content a', '#pjax_container', {timeout:1500}); + $(document).pjax('#pjax_container #blob .content a', '#pjax_container', {timeout:1500}); + $(document).on('pjax:end', function() { + init_source_info(); + }); + + init_source_info(); + + $('body').delegate('#http', 'click', function (e) { + var git_url = $(this).parents('.git-url'); + git_url.removeClass('ssh'); + git_url.addClass('http'); + git_url.find('#git-label').text('HTTP'); + return true; + }); + $('body').delegate('#ssh', 'click', function (e) { + var git_url = $(this).parents('.git-url'); + git_url.removeClass('http'); + git_url.addClass('ssh'); + git_url.find('#git-label').text('SSH'); + return true; + }); + + $('#commits-graph').commits({ + width: 200, + height: 1200, + y_step: 59 + }); +}); diff --git a/hub/static/js/app/stat/main.js b/hub/static/js/app/stat/main.js new file mode 100644 index 0000000..c7b7fef --- /dev/null +++ b/hub/static/js/app/stat/main.js @@ -0,0 +1,7 @@ +require(['jquery', 'lib/odometer'], function() { + $.getJSON('/hub/stat/source', function( data ) { + $.each( data, function(className, val) { + $('.odometer.' + className).html(val); + }); + }); +}); diff --git a/hub/static/js/app/team/add_project.js b/hub/static/js/app/team/add_project.js new file mode 100644 index 0000000..3ea0c45 --- /dev/null +++ b/hub/static/js/app/team/add_project.js @@ -0,0 +1,18 @@ +require([ + 'jquery', + 'mod/drop_down_list' +], function($, drop_down_list){ + var addProjectForm = $('#add-project-form'); + var success = function (data) { + addProjectForm.submit(); + }; + + // search for repos + var reqUrl = '/api/autocomplete_repos'; + var templ = $('#templ-repos-autocomplete'); + + $('#project_id').focusin(function(){ + var inputObj = $(this); + drop_down_list(inputObj, success, 'dd', reqUrl, templ, "repos", ''); + }); +}); diff --git a/hub/static/js/app/team/group.js b/hub/static/js/app/team/group.js new file mode 100644 index 0000000..3790749 --- /dev/null +++ b/hub/static/js/app/team/group.js @@ -0,0 +1,117 @@ +require( + ['jquery', 'jquery-tmpl', 'bootstrap'], + function ($) { + var member_query_cache = {}; + var project_query_cache = {}; + var autocomplete_member = function (query, process) { + var $input = $('input.js-group-member') + var group_name = $input.data('group-name'); + var team_name = $input.data('team-name'); + + // if in cache use cached value, if don't wanto use cache remove this if statement + if(member_query_cache[query]){ + process(member_query_cache[query]); + return; + } + if( typeof searching != "undefined") { + clearTimeout(searching); + process([]); + } + searching = setTimeout(function() { + return $.getJSON( + '/api/teams/' + team_name + '/members/', + { query: query }, + function(data){ + var new_data = []; + $.each(data, function(){ + new_data.push(this.name); + }); + // save result to cache, remove next line if you don't want to use cache + member_query_cache[query] = new_data; + // only search if stop typing for 300ms aka fast typers + return process(new_data); + } + ); + }, 300); // 300 ms + } + var autocomplete_project = function (query, process) { + var $input = $('input.js-group-project') + var group_name = $input.data('group-name'); + var team_name = $input.data('team-name'); + + // if in cache use cached value, if don't wanto use cache remove this if statement + if(project_query_cache[query]){ + process(project_query_cache[query]); + return; + } + if( typeof searching != "undefined") { + clearTimeout(searching); + process([]); + } + searching = setTimeout(function() { + return $.getJSON( + '/api/teams/' + team_name + '/projects/', + { query: query }, + function(data){ + var new_data = []; + $.each(data, function(){ + new_data.push(this.name); + }); + // save result to cache, remove next line if you don't want to use cache + project_query_cache[query] = new_data; + // only search if stop typing for 300ms aka fast typers + return process(new_data); + } + ); + }, 300); // 300 ms + } + $('input.js-group-member').typeahead({source: autocomplete_member}); + $('input.js-group-project').typeahead({source: autocomplete_project}); + $(".js-add-group-member").on('click', function () { + var tmpl = $("#tmpl-group-member"); + var $input = $(this).parents().find('input.js-group-member'); + var group_id = $input.data('group'); + var team_id = $input.data('team'); + var group_name = $input.data('group-name'); + var team_name = $input.data('team-name'); + var val = $input.val() + if (val === '' || val === undefined) + return; + $.ajax({ + type: 'POST', + data: JSON.stringify({ + 'name': $input.val() + }), + contentType: 'application/json; charset=UTF-8', + url: '/api/teams/' + team_name + '/groups/' + group_name + '/members/', + dataType: 'json', + success: function (ret) { + $("ul#group-members").append($.tmpl(tmpl, ret)) + } + }); + }); + $(".js-add-group-project").on('click', function () { + var tmpl = $("#tmpl-group-project"); + var $input = $(this).parents().find('input.js-group-project'); + var group_id = $input.data('group'); + var team_id = $input.data('team'); + var group_name = $input.data('group-name'); + var team_name = $input.data('team-name'); + var val = $input.val() + if (val === '' || val === undefined) + return; + $.ajax({ + type: 'POST', + data: JSON.stringify({ + 'name': $input.val() + }), + contentType: 'application/json; charset=UTF-8', + url: '/api/teams/' + team_name + '/groups/' + group_name + '/projects/', + dataType: 'json', + success: function (ret) { + $("ul#group-projects").append($.tmpl(tmpl, ret)) + } + }); + }); + } +); diff --git a/hub/static/js/app/team/main.js b/hub/static/js/app/team/main.js new file mode 100644 index 0000000..6c65a6d --- /dev/null +++ b/hub/static/js/app/team/main.js @@ -0,0 +1,32 @@ +require( + ['jquery' + , 'bootbox' + , 'mod/newsfeed' + , 'mod/teamfeed_pagination' + , 'mod/issue_tag' + , 'mod/team_header'], + function($){ + + // FIXME: 单纯用 css :hover 搞不定吗? + $('.my_projects li').hover( + function () {$(this).addClass('hover');}, + function () {$(this).removeClass('hover');} + ); + + var delProj = function (proj, team, onSuccess) { + bootbox.confirm("Are you sure?", function(confirmed) { + if (confirmed) { + $.post('/hub/team/' + team + '/remove_project', {"project_name": proj}, function (ret) { + if (ret.r === 0) { + onSuccess(); + } + }, 'json'); + } + }); + }; + $('.my_projects li .delete-btn').click(function () { + var delBtn = $(this), proj = delBtn.attr('data-proj'), team = delBtn.attr('data-team'); + delProj(proj, team, function () { delBtn.closest('li').remove(); }); + }); + + }); diff --git a/hub/static/js/app/team/settings.js b/hub/static/js/app/team/settings.js new file mode 100644 index 0000000..f94c8a0 --- /dev/null +++ b/hub/static/js/app/team/settings.js @@ -0,0 +1,150 @@ +require.config({ enable_ozma: true }); +require(['jquery', 'bootbox', 'mod/drop_down_list'], + function($, bootbox, drop_down_list){ + $(function () { + var post_data = function (field_id) { + var fieldObj = $(field_id), + user_id = fieldObj.find('.input_user_id').val(), + team_uid = fieldObj.find('.input_user_id').attr('team_uid'), + identity = fieldObj.find('.input_identity').val(); + if (user_id === ''){ + var msg = 'uid不能为空'; + show_error(fieldObj, msg); + return false; + }else{ + $.ajax({ + url: '/hub/team/' + team_uid + '/add_user', + type: 'POST', + data: {'user_id': user_id, 'identity': identity}, + dataType: 'json', + success: function (msg) { + if (msg.r === 0){ + var user_id = msg.uid, + avatar_url = msg.avatar_url, + new_user = '<li><img height="20" src="'+avatar_url+'" width="20"><a href="/people/'+user_id+'/">'+user_id+'</a><a href="Javascript:void(0);" user_id="'+user_id+'" team_uid="'+team_uid+'" class="remove-user remove action">(remove)</a></li>'; + fieldObj.find('.usernames').find('li:last').parent().append(new_user); + fieldObj.find('.alert-error').remove(); + } else { + var error = msg.error; + show_error(fieldObj, error); + } + } + }); + } + }, + reqUrl = '/api/autocomplete_users', + templ = $('#templ-users-autocomplete'); + + $('.add_team_member_btn').live('click', function () { + var btnObj = $(this), + field_id = btnObj.parent().parent().attr('id'); + post_data('#'+field_id); + $('#'+field_id).find('.add-item-menu').remove(); + }); + + $('.input_user_id').one('focusin', function (){ + var inputObj = $(this), + field_id = inputObj.parent().parent().attr('id'), + form_id = inputObj.parent().attr('id'); + $('#'+field_id).find('.add-item-menu').remove(); + $('#'+field_id).find('.alert-error').remove(); + drop_down_list(inputObj, post_data, '#'+form_id, reqUrl, templ, "users", '#'+field_id); + $('#'+field_id).find('.add-item-menu').remove(); + }); + + $('.remove-user').live('click', function(event){ + var removeBtn = $(this), + field_id = removeBtn.parent().parent().parent().attr('id'), + user_id = removeBtn.attr('user_id'), + team_uid = removeBtn.attr('team_uid'), + fieldObj = $('#'+field_id); + $('#'+field_id).find('.alert-error').remove(); + + $.ajax({ + url: '/hub/team/' + team_uid + '/remove_user', + type: 'POST', + data: {'user_id': user_id}, + dataType: 'json', + success: function (msg) { + if (msg.r === 0){ + $('.remove-user[user_id='+user_id+']').parent().remove(); + } else { + var error = msg.error; + show_error(fieldObj, error); + } + } + }); + }); + + var delete_team_btn = $('#settings_del_team'); + delete_team_btn.click(function () { + var team_id = $(this).attr('data-team'); + bootbox.confirm("Are you sure?", function(confirmed){ + if (confirmed) { + $.ajax({ + url: '/hub/team/' + team_id + '/remove', + type: 'POST', + data: {}, + dataType: 'json', + success: function (msg) { + if (msg.r === 0){ + location.href = '/hub/teams'; + } + } + }); + } + }); + }); + + function show_error(targetObj, msg) { + var html = '<p class="alert alert-error">'+msg+'</p>'; + targetObj.find('.alert-error').remove(); + targetObj.append(html); + } + }); + $('#doc_project').on('change', function() { + var select = $(this); + var team_name = select.data('team-uid'); + $.ajax({ + type: 'POST', + data: JSON.stringify({ + 'content': select.val() + }), + contentType: 'application/json; charset=UTF-8', + url: '/api/teams/' + team_name + '/doc_project/', + dataType: 'json', + success: function (ret) { + if (ret.status == 201) { + select.find('option:selected').removeAttr('selected'); + select.find('option[value="' + ret.content + '"]').attr("selected",true); + } + } + }); + }); + + var enableImageUpload = function (uploader){ + uploader.submit( + function() { + $(this).ajaxSubmit({ + dataType: 'json', + delegation: true, + success: function(r){ + var team_id = uploader.data('team-uid'); + var url = "/teams/" + team_id + "/upload_profile"; + $.post(url,r,function(ret){ + if (ret.r == 0){ + var img = document.getElementById("profile_url"); + img.src = r.url; + } + }, 'json'); + }, + error: function(r) { + alert("上传错误,请确认您上传的文件类型合法"); + } + }); + return false; + }); + }; + var uploader = $('#form-file-upload'); + enableImageUpload(uploader); +}); diff --git a/hub/static/js/app/team/teamfeed_timeline.js b/hub/static/js/app/team/teamfeed_timeline.js new file mode 100644 index 0000000..cffe055 --- /dev/null +++ b/hub/static/js/app/team/teamfeed_timeline.js @@ -0,0 +1,21 @@ +require(['jquery' +, 'mod/connect' +, 'mod/count' +, 'mod/relative_date' +, 'mod/user_avatar' +, 'mod/user_profile_card' +], function($, connectNode, countDict, updateRelativeDate, loadAvatar) { + var btn = $('.join-or-leave-btn'); + if (btn.length == 0) { + btn = $('.btn-success'); + } + var team_id = btn.attr("data-teamid"); + var channel = 'feed:public:team:v2:' + team_id; + var io = connectNode(channel); + io.on('announce', function(data) { + countDict.teamfeed_num += 1; + $('.timeline>ul').prepend(data.send_message); + updateRelativeDate(); + loadAvatar(); + }); +}); diff --git a/hub/static/js/app/watching/main.js b/hub/static/js/app/watching/main.js new file mode 100644 index 0000000..5f2ad33 --- /dev/null +++ b/hub/static/js/app/watching/main.js @@ -0,0 +1,74 @@ +require(['jquery'], function($){ + $(function() { + var watch_btn = $(".watch-btn"); + var countLabel = $('#watched-count'); + + var updateLabelBy = function (n) { + var count = Number(countLabel.text()) || 0; + if (count === 0 && n <= 0) { return; } + + count += n; + countLabel.text(count.toString()); + }; + + $.each(watch_btn, function(index,value){ + $(value).click(function() { + + if($(value).hasClass('watch')) { + $.post("/watch/"+$(value).attr('proj_id'), function(data) { + if (!data.error) { + $(value).html('<i class="icon-eye-open"></i> Unwatch'); + $(value).addClass('unwatch'); + $(value).removeClass('watch'); + updateLabelBy(1); + } else { + // show error notification to user + show_error("关注失败"); + } + }); + } + else{ + $.ajax("/watch/"+$(value).attr('proj_id'), { + type: "DELETE", + success: function(data) { + if (!data.error) { + $(value).html('<i class="icon-eye-open"></i> Watch'); + $(value).addClass('watch'); + $(value).removeClass('unwatch'); + updateLabelBy(-1); + } else { + show_error("取消关注失败"); + } + }, + error: function(e) { + show_error("取消关注失败"); + } + }); + } + }); + + }); + + function show_success(msg) { + var successDiv = $(".navbar .success"); + if (successDiv.size() === 0 ) { + successDiv= $("<div>").addClass("success").addClass("alert-success"); + $("div.navbar").append(successDiv); + } + successDiv.html(msg); + successDiv.fadeOut(1500, function () { + $(this).remove(); + }); + } + + function show_error(msg) { + var errorDiv = $(".navbar .error"); + if (errorDiv.size() === 0 ) { + errorDiv = $("<div>").addClass("error").addClass("alert-error"); + $("div.navbar").append(errorDiv); + } + errorDiv.html(msg); + } + + }); +}); diff --git a/vilya/static/js/lib/ZeroClipboard.swf b/hub/static/js/lib/ZeroClipboard.swf similarity index 100% rename from vilya/static/js/lib/ZeroClipboard.swf rename to hub/static/js/lib/ZeroClipboard.swf diff --git a/hub/static/js/lib/bootbox.js b/hub/static/js/lib/bootbox.js new file mode 100644 index 0000000..57d8eb5 --- /dev/null +++ b/hub/static/js/lib/bootbox.js @@ -0,0 +1,551 @@ +/** + * bootbox.js v2.5.1 + * + * http://bootboxjs.com/license.txt + */ +var bootbox = window.bootbox || (function($) { + + var _locale = 'en', + _defaultLocale = 'en', + _animate = true, + _backdrop = 'static', + _defaultHref = 'javascript:;', + _classes = '', + _icons = {}, + /* last var should always be the public object we'll return */ + that = {}; + + /** + * standard locales. Please add more according to ISO 639-1 standard. Multiple language variants are + * unlikely to be required. If this gets too large it can be split out into separate JS files. + */ + var _locales = { + 'en' : { + OK : 'OK', + CANCEL : 'Cancel', + CONFIRM : 'OK' + }, + 'fr' : { + OK : 'OK', + CANCEL : 'Annuler', + CONFIRM : 'D\'accord' + }, + 'de' : { + OK : 'OK', + CANCEL : 'Abbrechen', + CONFIRM : 'Akzeptieren' + }, + 'es' : { + OK : 'OK', + CANCEL : 'Cancelar', + CONFIRM : 'Aceptar' + }, + 'br' : { + OK : 'OK', + CANCEL : 'Cancelar', + CONFIRM : 'Sim' + }, + 'nl' : { + OK : 'OK', + CANCEL : 'Annuleren', + CONFIRM : 'Accepteren' + }, + 'ru' : { + OK : 'OK', + CANCEL : 'Отмена', + CONFIRM : 'Применить' + }, + 'it' : { + OK : 'OK', + CANCEL : 'Annulla', + CONFIRM : 'Conferma' + } + }; + + /** + * private methods + */ + function _translate(str, locale) { + // we assume if no target locale is probided then we should take it from current setting + if (locale == null) { + locale = _locale; + } + if (typeof _locales[locale][str] == 'string') { + return _locales[locale][str]; + } + + // if we couldn't find a lookup then try and fallback to a default translation + + if (locale != _defaultLocale) { + return _translate(str, _defaultLocale); + } + + // if we can't do anything then bail out with whatever string was passed in - last resort + return str; + } + + /** + * public API + */ + that.setLocale = function(locale) { + for (var i in _locales) { + if (i == locale) { + _locale = locale; + return; + } + } + throw new Error('Invalid locale: '+locale); + }; + + that.addLocale = function(locale, translations) { + if (typeof _locales[locale] == 'undefined') { + _locales[locale] = {}; + } + for (var str in translations) { + _locales[locale][str] = translations[str]; + } + }; + + that.setIcons = function(icons) { + _icons = icons; + if (typeof _icons !== 'object' || _icons == null) { + _icons = {}; + } + }; + + that.alert = function(/*str, label, cb*/) { + var str = "", + label = _translate('OK'), + cb = null; + + switch (arguments.length) { + case 1: + // no callback, default button label + str = arguments[0]; + break; + case 2: + // callback *or* custom button label dependent on type + str = arguments[0]; + if (typeof arguments[1] == 'function') { + cb = arguments[1]; + } else { + label = arguments[1]; + } + break; + case 3: + // callback and custom button label + str = arguments[0]; + label = arguments[1]; + cb = arguments[2]; + break; + default: + throw new Error("Incorrect number of arguments: expected 1-3"); + break; + } + + return that.dialog(str, { + "label": label, + "icon" : _icons.OK, + "callback": cb + }, { + "onEscape": cb + }); + }; + + that.confirm = function(/*str, labelCancel, labelOk, cb*/) { + var str = "", + labelCancel = _translate('CANCEL'), + labelOk = _translate('CONFIRM'), + cb = null; + + switch (arguments.length) { + case 1: + str = arguments[0]; + break; + case 2: + str = arguments[0]; + if (typeof arguments[1] == 'function') { + cb = arguments[1]; + } else { + labelCancel = arguments[1]; + } + break; + case 3: + str = arguments[0]; + labelCancel = arguments[1]; + if (typeof arguments[2] == 'function') { + cb = arguments[2]; + } else { + labelOk = arguments[2]; + } + break; + case 4: + str = arguments[0]; + labelCancel = arguments[1]; + labelOk = arguments[2]; + cb = arguments[3]; + break; + default: + throw new Error("Incorrect number of arguments: expected 1-4"); + break; + } + + return that.dialog(str, [{ + "label": labelCancel, + "icon" : _icons.CANCEL, + "callback": function() { + if (typeof cb == 'function') { + cb(false); + } + } + }, { + "label": labelOk, + "icon" : _icons.CONFIRM, + "callback": function() { + if (typeof cb == 'function') { + cb(true); + } + } + }]); + }; + + that.prompt = function(/*str, labelCancel, labelOk, cb, defaultVal*/) { + var str = "", + labelCancel = _translate('CANCEL'), + labelOk = _translate('CONFIRM'), + cb = null, + defaultVal = ""; + + switch (arguments.length) { + case 1: + str = arguments[0]; + break; + case 2: + str = arguments[0]; + if (typeof arguments[1] == 'function') { + cb = arguments[1]; + } else { + labelCancel = arguments[1]; + } + break; + case 3: + str = arguments[0]; + labelCancel = arguments[1]; + if (typeof arguments[2] == 'function') { + cb = arguments[2]; + } else { + labelOk = arguments[2]; + } + break; + case 4: + str = arguments[0]; + labelCancel = arguments[1]; + labelOk = arguments[2]; + cb = arguments[3]; + break; + case 5: + str = arguments[0]; + labelCancel = arguments[1]; + labelOk = arguments[2]; + cb = arguments[3]; + defaultVal = arguments[4]; + break; + default: + throw new Error("Incorrect number of arguments: expected 1-5"); + break; + } + + var header = str; + + // let's keep a reference to the form object for later + var form = $("<form></form>"); + form.append("<input autocomplete=off type=text value='" + defaultVal + "' />"); + + var div = that.dialog(form, [{ + "label": labelCancel, + "icon" : _icons.CANCEL, + "callback": function() { + if (typeof cb == 'function') { + cb(null); + } + } + }, { + "label": labelOk, + "icon" : _icons.CONFIRM, + "callback": function() { + if (typeof cb == 'function') { + cb( + form.find("input[type=text]").val() + ); + } + } + }], { + "header": header + }); + + div.on("shown", function() { + form.find("input[type=text]").focus(); + + // ensure that submitting the form (e.g. with the enter key) + // replicates the behaviour of a normal prompt() + form.on("submit", function(e) { + e.preventDefault(); + div.find(".btn-primary").click(); + }); + }); + + return div; + }; + + that.modal = function(/*str, label, options*/) { + var str; + var label; + var options; + + var defaultOptions = { + "onEscape": null, + "keyboard": true, + "backdrop": _backdrop + }; + + switch (arguments.length) { + case 1: + str = arguments[0]; + break; + case 2: + str = arguments[0]; + if (typeof arguments[1] == 'object') { + options = arguments[1]; + } else { + label = arguments[1]; + } + break; + case 3: + str = arguments[0]; + label = arguments[1]; + options = arguments[2]; + break; + default: + throw new Error("Incorrect number of arguments: expected 1-3"); + break; + } + + defaultOptions['header'] = label; + + if (typeof options == 'object') { + options = $.extend(defaultOptions, options); + } else { + options = defaultOptions; + } + + return that.dialog(str, [], options); + }; + + that.dialog = function(str, handlers, options) { + var hideSource = null, + buttons = "", + callbacks = [], + options = options || {}; + + // check for single object and convert to array if necessary + if (handlers == null) { + handlers = []; + } else if (typeof handlers.length == 'undefined') { + handlers = [handlers]; + } + + var i = handlers.length; + while (i--) { + var label = null, + href = null, + _class = null, + icon = '', + callback = null; + + if (typeof handlers[i]['label'] == 'undefined' && + typeof handlers[i]['class'] == 'undefined' && + typeof handlers[i]['callback'] == 'undefined') { + // if we've got nothing we expect, check for condensed format + + var propCount = 0, // condensed will only match if this == 1 + property = null; // save the last property we found + + // be nicer to count the properties without this, but don't think it's possible... + for (var j in handlers[i]) { + property = j; + if (++propCount > 1) { + // forget it, too many properties + break; + } + } + + if (propCount == 1 && typeof handlers[i][j] == 'function') { + // matches condensed format of label -> function + handlers[i]['label'] = property; + handlers[i]['callback'] = handlers[i][j]; + } + } + + if (typeof handlers[i]['callback']== 'function') { + callback = handlers[i]['callback']; + } + + if (handlers[i]['class']) { + _class = handlers[i]['class']; + } else if (i == handlers.length -1 && handlers.length <= 2) { + // always add a primary to the main option in a two-button dialog + _class = 'btn-primary'; + } + + if (handlers[i]['label']) { + label = handlers[i]['label']; + } else { + label = "Option "+(i+1); + } + + if (handlers[i]['icon']) { + icon = "<i class='"+handlers[i]['icon']+"'></i> "; + } + + if (handlers[i]['href']) { + href = handlers[i]['href']; + } + else { + href = _defaultHref; + } + + buttons += "<a data-handler='"+i+"' class='btn "+_class+"' href='" + href + "'>"+icon+""+label+"</a>"; + + callbacks[i] = callback; + } + + // @see https://github.com/makeusabrew/bootbox/issues/46#issuecomment-8235302 + // and https://github.com/twitter/bootstrap/issues/4474 + // for an explanation of the inline overflow: hidden + + var parts = ["<div class='bootbox modal' style='overflow:hidden;'>"]; + + if (options['header']) { + var closeButton = ''; + if (typeof options['headerCloseButton'] == 'undefined' || options['headerCloseButton']) { + closeButton = "<a href='"+_defaultHref+"' class='close'>×</a>"; + } + + parts.push("<div class='modal-header'>"+closeButton+"<h3>"+options['header']+"</h3></div>"); + } + + // push an empty body into which we'll inject the proper content later + parts.push("<div class='modal-body'></div>"); + + if (buttons) { + parts.push("<div class='modal-footer'>"+buttons+"</div>"); + } + + parts.push("</div>"); + + var div = $(parts.join("\n")); + + // check whether we should fade in/out + var shouldFade = (typeof options.animate === 'undefined') ? _animate : options.animate; + + if (shouldFade) { + div.addClass("fade"); + } + + var optionalClasses = (typeof options.classes === 'undefined') ? _classes : options.classes; + if( optionalClasses ) { + div.addClass( optionalClasses ); + } + + // now we've built up the div properly we can inject the content whether it was a string or a jQuery object + $(".modal-body", div).html(str); + + div.bind('hidden', function() { + div.remove(); + }); + + div.bind('hide', function() { + if (hideSource == 'escape' && + typeof options.onEscape == 'function') { + options.onEscape(); + } + }); + + // hook into the modal's keyup trigger to check for the escape key + $(document).bind('keyup.modal', function ( e ) { + if (e.which == 27) { + hideSource = 'escape'; + } + }); + + // well, *if* we have a primary - give the last dom element (first displayed) focus + div.bind('shown', function() { + $("a.btn-primary:last", div).focus(); + }); + + // wire up button handlers + div.on('click', '.modal-footer a, a.close', function(e) { + + var handler = $(this).data("handler"), + cb = callbacks[handler], + hideModal = null; + + // sort of @see https://github.com/makeusabrew/bootbox/pull/68 - heavily adapted + // if we've got a custom href attribute, all bets are off + if (typeof handler !== 'undefined' && + typeof handlers[handler]['href'] !== 'undefined') { + + return; + } + + e.preventDefault(); + + if (typeof cb == 'function') { + hideModal = cb(); + } + + // the only way hideModal *will* be false is if a callback exists and + // returns it as a value. in those situations, don't hide the dialog + // @see https://github.com/makeusabrew/bootbox/pull/25 + if (hideModal !== false) { + hideSource = 'button'; + div.modal("hide"); + } + }); + + if (options.keyboard == null) { + options.keyboard = (typeof options.onEscape == 'function'); + } + + $("body").append(div); + + div.modal({ + "backdrop" : (typeof options.backdrop === 'undefined') ? _backdrop : options.backdrop, + "keyboard" : options.keyboard + }); + + return div; + }; + + that.hideAll = function() { + $(".bootbox").modal("hide"); + }; + + that.animate = function(animate) { + _animate = animate; + }; + + that.backdrop = function(backdrop) { + _backdrop = backdrop; + }; + + that.classes = function(classes) { + _classes = classes; + }; + + return that; + +})( window.jQuery ); + +// @see https://github.com/makeusabrew/bootbox/issues/71 +window.bootbox = bootbox; diff --git a/vilya/static/js/lib/bootstrap-amd.js b/hub/static/js/lib/bootstrap-amd.js similarity index 100% rename from vilya/static/js/lib/bootstrap-amd.js rename to hub/static/js/lib/bootstrap-amd.js diff --git a/vilya/static/js/lib/bootstrap.js b/hub/static/js/lib/bootstrap.js similarity index 100% rename from vilya/static/js/lib/bootstrap.js rename to hub/static/js/lib/bootstrap.js diff --git a/vilya/static/js/lib/bootstrap.min.js b/hub/static/js/lib/bootstrap.min.js similarity index 100% rename from vilya/static/js/lib/bootstrap.min.js rename to hub/static/js/lib/bootstrap.min.js diff --git a/vilya/static/js/lib/cal-heatmap.js b/hub/static/js/lib/cal-heatmap.js similarity index 100% rename from vilya/static/js/lib/cal-heatmap.js rename to hub/static/js/lib/cal-heatmap.js diff --git a/vilya/static/js/lib/codemirror.js b/hub/static/js/lib/codemirror.js similarity index 100% rename from vilya/static/js/lib/codemirror.js rename to hub/static/js/lib/codemirror.js diff --git a/hub/static/js/lib/coloreditor.js b/hub/static/js/lib/coloreditor.js new file mode 100644 index 0000000..32c0dd0 --- /dev/null +++ b/hub/static/js/lib/coloreditor.js @@ -0,0 +1,408 @@ +// Generated by CoffeeScript 1.3.3 +(function() { + var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; + + define(['lib/tinycolor'], function(tinycolor) { + 'use strict'; + + var ColorEditor; + return ColorEditor = (function() { + + ColorEditor.prototype.defaultColor = 'rgba(0,0,0,1)'; + + ColorEditor.prototype.hsv = tinycolor('rgba(0,0,0,1)').toHsv(); + + function ColorEditor(element, color, callback, swatches) { + this.element = element; + this.callback = callback != null ? callback : null; + this.swatches = swatches != null ? swatches : null; + this.registerFocusHandler = __bind(this.registerFocusHandler, this); + + this.handleOpacityFocus = __bind(this.handleOpacityFocus, this); + + this.handleHueFocus = __bind(this.handleHueFocus, this); + + this.handleSelectionFocus = __bind(this.handleSelectionFocus, this); + + this.registerDragHandler = __bind(this.registerDragHandler, this); + + this.handleOpacityDrag = __bind(this.handleOpacityDrag, this); + + this.handleHueDrag = __bind(this.handleHueDrag, this); + + this.handleSelectionFieldDrag = __bind(this.handleSelectionFieldDrag, this); + + this.color = tinycolor(color); + this.lastColor = color; + this.$element = $(this.element); + this.$colorValue = this.$element.find('.color_value'); + this.$buttonList = this.$element.find('ul.button-bar'); + this.$rgbaButton = this.$element.find('.rgba'); + this.$hexButton = this.$element.find('.hex'); + this.$hslButton = this.$element.find('.hsla'); + this.$currentColor = this.$element.find('.current_color'); + this.$lastColor = this.$element.find('.last_color'); + this.$selection = this.$element.find('.color_selection_field'); + this.$selectionBase = this.$element.find('.color_selection_field .selector_base'); + this.$hueBase = this.$element.find('.hue_slider .selector_base'); + this.$opacityGradient = this.$element.find('.opacity_gradient'); + this.$hueSlider = this.$element.find('.hue_slider'); + this.$opacitySlider = this.$element.find('.opacity_slider'); + this.$hueSelector = this.$element.find('.hue_slider .selector_base'); + this.$opacitySlider = this.$element.find('.opacity_slider'); + this.$opacitySelector = this.$element.find('.opacity_slider .selector_base'); + this.$swatches = this.$element.find('.swatches'); + this.addFieldListeners(); + this.addSwatches(); + this.$lastColor.css('background-color', this.lastColor); + this.commitColor(color); + } + + ColorEditor.prototype.addFieldListeners = function() { + this.bindColorFormatToRadioButton('rgba'); + this.bindColorFormatToRadioButton('hex'); + this.bindColorFormatToRadioButton('hsla'); + this.$colorValue.change(this.colorSetter); + this.bindOriginalColorButton(); + this.bindColorSwatches(); + this.registerDragHandler('.color_selection_field', this.handleSelectionFieldDrag); + this.registerDragHandler('.hue_slider', this.handleHueDrag); + this.registerDragHandler('.opacity_slider', this.handleOpacityDrag); + this.registerFocusHandler(this.$selection.find('.selector_base'), this.handleSelectionFocus); + this.registerFocusHandler(this.$hueSlider.find('.selector_base'), this.handleHueFocus); + return this.registerFocusHandler(this.$opacitySlider.find('.selector_base'), this.handleOpacityFocus); + }; + + ColorEditor.prototype.synchronize = function() { + var colorObject, colorValue, hueColor; + colorValue = this.getColor().toString(); + colorObject = tinycolor(colorValue); + hueColor = 'hsl(' + this.hsv.h + ', 100%, 50%)'; + this.updateColorTypeRadioButtons(colorObject.format); + this.$colorValue.attr('value', colorValue); + this.$currentColor.css('background-color', colorValue); + this.$selection.css('background-color', hueColor); + this.$hueBase.css('background-color', hueColor); + this.$selectionBase.css('background-color', colorObject.toHexString()); + this.$opacityGradient.css('background-image', '-webkit-gradient(linear, 0% 0%, 0% 100%, from(' + hueColor + '), to(transparent))'); + this.$hueSelector.css('bottom', (this.hsv.h / 360 * 100) + "%"); + this.$opacitySelector.css('bottom', (this.hsv.a * 100) + "%"); + if (!isNaN(this.hsv.s)) { + this.hsv.s = (this.hsv.s * 100) + '%'; + } + if (!isNaN(this.hsv.v)) { + this.hsv.v = (this.hsv.v * 100) + '%'; + } + return this.$selectionBase.css({ + left: this.hsv.s, + bottom: this.hsv.v + }); + }; + + ColorEditor.prototype.focus = function() { + if (!this.$selection.find('.selector_base').is(":focus")) { + this.$selection.find('.selector_base').focus(); + return true; + } + return false; + }; + + ColorEditor.prototype.colorSetter = function() { + var newColor, newValue; + newValue = $.trim(this.$colorValue.val()); + newColor = tinycolor(newValue); + if (!newColor.ok) { + newValue = this.getColor(); + newColor = tinycolor(newValue); + } + this.commitColor(newValue, true); + this.hsv = newColor.toHsv(); + return this.synchronize(); + }; + + ColorEditor.prototype.getColor = function() { + return this.color || this.defaultColor; + }; + + ColorEditor.prototype.updateColorTypeRadioButtons = function(format) { + this.$buttonList.find('li').removeClass('selected'); + this.$buttonList.find('.' + format).parent().addClass('selected'); + switch (format) { + case 'rgb': + return this.$buttonList.find('.rgba').parent().addClass('selected'); + case 'hex': + case 'name': + return this.$buttonList.find('.hex').parent().addClass('selected'); + case 'hsl': + return this.$buttonList.find('.hsla').parent().addClass('selected'); + } + }; + + ColorEditor.prototype.bindColorFormatToRadioButton = function(buttonClass, propertyName, value) { + var handler, + _this = this; + handler = function(event) { + var colorObject, newColor, newFormat; + newFormat = $(event.currentTarget).html().toLowerCase(); + newColor = _this.getColor(); + colorObject = tinycolor(newColor); + switch (newFormat) { + case 'hsla': + newColor = colorObject.toHslString(); + break; + case 'rgba': + newColor = colorObject.toRgbString(); + break; + case 'hex': + newColor = colorObject.toHexString(); + _this.hsv.a = 1; + _this.synchronize(); + } + return _this.commitColor(newColor, false); + }; + return this.$element.find('.' + buttonClass).click(handler); + }; + + ColorEditor.prototype.bindOriginalColorButton = function() { + var _this = this; + return this.$lastColor.click(function(event) { + return _this.commitColor(_this.lastColor, true); + }); + }; + + ColorEditor.prototype.bindColorSwatches = function() { + var handler; + handler = function(event) { + var $swatch, color, hsvColor; + $swatch = $(event.currentTarget); + if ($swatch.attr('style').length > 0) { + color = $swatch.css('background-color'); + } + if (color.length > 0) { + hsvColor = tinycolor(color).toHsv(); + return this.setColorAsHsv(hsvColor, true); + } + }; + return this.$element.find('.color_swatch').click(handler); + }; + + ColorEditor.prototype.addSwatches = function() { + var index, swatch, _i, _len, _ref, + _this = this; + _ref = this.swatches; + for (index = _i = 0, _len = _ref.length; _i < _len; index = ++_i) { + swatch = _ref[index]; + this.$swatches.append("<li><div class=\"swatch_bg\"><div class=\"swatch\" style=\"background-color: " + swatch.value + ";\"></div></div> <span class=\"value\">" + swatch.value + "</span></li>"); + } + return this.$swatches.find('li').click(function(event) { + return _this.commitColor($(event.currentTarget).find('.value').html()); + }); + }; + + ColorEditor.prototype.setColorAsHsv = function(hsv, commitHsv) { + var colorVal, k, newColor, newHsv, oldColor, oldFormat, v; + newHsv = this.hsv; + for (k in hsv) { + v = hsv[k]; + newHsv[k] = v; + } + newColor = tinycolor(newHsv); + oldColor = tinycolor(this.getColor()); + oldFormat = oldColor.format; + colorVal; + + switch (oldFormat) { + case 'hsl': + colorVal = newColor.toHslString(); + break; + case 'rgb': + colorVal = newColor.toRgbString(); + break; + case 'hex': + case 'name': + colorVal = this.hsv.a < 1 ? newColor.toRgbString() : newColor.toHexString(); + } + return this.commitColor(colorVal, commitHsv); + }; + + ColorEditor.prototype.commitColor = function(colorVal, resetHsv) { + var colorObj; + if (resetHsv == null) { + resetHsv = true; + } + this.callback(colorVal); + this.color = colorVal; + this.$colorValue.val(colorVal); + if (resetHsv) { + colorObj = tinycolor(colorVal); + this.hsv = colorObj.toHsv(); + this.color = colorObj; + } + return this.synchronize(); + }; + + ColorEditor.prototype.handleSelectionFieldDrag = function(event) { + var height, hsv, width, xOffset, yOffset; + yOffset = event.clientY - this.$selection.offset().top; + xOffset = event.clientX - this.$selection.offset().left; + height = this.$selection.height(); + width = this.$selection.width(); + xOffset = Math.min(width, Math.max(0, xOffset)); + yOffset = Math.min(height, Math.max(0, yOffset)); + hsv = {}; + hsv.s = xOffset / width; + hsv.v = 1 - yOffset / height; + this.setColorAsHsv(hsv, false); + if (!this.$selection.find('.selector_base').is(":focus")) { + return this.$selection.find('.selector_base').focus(); + } + }; + + ColorEditor.prototype.handleHueDrag = function(event) { + var height, hsv, offset; + offset = event.clientY - this.$hueSlider.offset().top; + height = this.$hueSlider.height(); + offset = Math.min(height, Math.max(0, offset)); + hsv = {}; + hsv.h = (1 - offset / height) * 360; + this.setColorAsHsv(hsv, false); + if (!this.$hueSlider.find('.selector_base').is(":focus")) { + return this.$hueSlider.find('.selector_base').focus(); + } + }; + + ColorEditor.prototype.handleOpacityDrag = function(event) { + var height, hsv, offset; + offset = event.clientY - this.$opacitySlider.offset().top; + height = this.$opacitySlider.height(); + offset = Math.min(height, Math.max(0, offset)); + hsv = {}; + hsv.a = 1 - offset / height; + this.setColorAsHsv(hsv, false); + if (!this.$opacitySlider.find('.selector_base').is(":focus")) { + return this.$opacitySlider.find('.selector_base').focus(); + } + }; + + ColorEditor.prototype.registerDragHandler = function(selector, handler) { + var element, mouseupHandler; + element = this.$element.find(selector); + element.mousedown(handler); + mouseupHandler = function(event) { + $(window).unbind('mousemove', handler); + return $(window).unbind('mouseup', mouseupHandler); + }; + return element.mousedown(function(event) { + $(window).bind('mousemove', handler); + return $(window).bind('mouseup', mouseupHandler); + }); + }; + + ColorEditor.prototype.handleSelectionFocus = function(event) { + var hsv, step, xOffset, yOffset; + switch (event.keyCode) { + case 37: + step = 1.5; + step = event.shiftKey ? step * 5 : step; + xOffset = Number($.trim(this.$selectionBase.css('left').replace('%', ''))); + xOffset = Math.min(100, Math.max(0, xOffset - step)); + hsv = {}; + hsv.s = xOffset / 100; + this.setColorAsHsv(hsv, false); + return false; + case 39: + step = 1.5; + step = event.shiftKey ? step * 5 : step; + xOffset = Number($.trim(this.$selectionBase.css('left').replace('%', ''))); + xOffset = Math.min(100, Math.max(0, xOffset + step)); + hsv = {}; + hsv.s = xOffset / 100; + this.setColorAsHsv(hsv, false); + return false; + case 40: + step = 1.5; + step = event.shiftKey ? step * 5 : step; + yOffset = Number($.trim(this.$selectionBase.css('bottom').replace('%', ''))); + yOffset = Math.min(100, Math.max(0, yOffset - step)); + hsv = {}; + hsv.v = yOffset / 100; + this.setColorAsHsv(hsv, false); + return false; + case 38: + step = 1.5; + step = event.shiftKey ? step * 5 : step; + yOffset = Number($.trim(this.$selectionBase.css('bottom').replace('%', ''))); + yOffset = Math.min(100, Math.max(0, yOffset + step)); + hsv = {}; + hsv.v = yOffset / 100; + this.setColorAsHsv(hsv, false); + return false; + } + }; + + ColorEditor.prototype.handleHueFocus = function(event) { + var hsv, hue, step; + switch (event.keyCode) { + case 40: + step = 3.6; + step = event.shiftKey ? step * 5 : step; + hsv = {}; + hue = Number(this.hsv.h); + if (hue > 0) { + hsv.h = (hue - step) <= 0 ? 360 - step : hue - step; + this.setColorAsHsv(hsv); + } + return false; + case 38: + step = 3.6; + step = event.shiftKey ? step * 5 : step; + hsv = {}; + hue = Number(this.hsv.h); + if (hue < 360) { + hsv.h = (hue + step) >= 360 ? step : hue + step; + this.setColorAsHsv(hsv); + } + return false; + } + }; + + ColorEditor.prototype.handleOpacityFocus = function(event) { + var alpha, hsv, step; + switch (event.keyCode) { + case 40: + step = 0.01; + step = event.shiftKey ? step * 5 : step; + hsv = {}; + alpha = this.hsv.a; + if (alpha > 0) { + hsv.a = (alpha - step) <= 0 ? 0 : alpha - step; + this.setColorAsHsv(hsv); + } + return false; + case 38: + step = 0.01; + step = event.shiftKey ? step * 5 : step; + hsv = {}; + alpha = this.hsv.a; + if (alpha < 100) { + hsv.a = (alpha + step) >= 1 ? 1 : alpha + step; + return this.setColorAsHsv(hsv); + } + } + }; + + ColorEditor.prototype.registerFocusHandler = function(element, handler) { + element.focus(function(event) { + return element.bind('keydown', handler); + }); + return element.blur(function(event) { + return element.unbind('keydown', handler); + }); + }; + + return ColorEditor; + + })(); + }); + +}).call(this); diff --git a/hub/static/js/lib/d3-3.3.3.js b/hub/static/js/lib/d3-3.3.3.js new file mode 100644 index 0000000..e64eb85 --- /dev/null +++ b/hub/static/js/lib/d3-3.3.3.js @@ -0,0 +1,8981 @@ +d3 = function() { + var d3 = { + version: "3.3.3" + }; + if (!Date.now) Date.now = function() { + return +new Date(); + }; + var d3_arraySlice = [].slice, d3_array = function(list) { + return d3_arraySlice.call(list); + }; + var d3_document = document, d3_documentElement = d3_document.documentElement, d3_window = window; + try { + d3_array(d3_documentElement.childNodes)[0].nodeType; + } catch (e) { + d3_array = function(list) { + var i = list.length, array = new Array(i); + while (i--) array[i] = list[i]; + return array; + }; + } + try { + d3_document.createElement("div").style.setProperty("opacity", 0, ""); + } catch (error) { + var d3_element_prototype = d3_window.Element.prototype, d3_element_setAttribute = d3_element_prototype.setAttribute, d3_element_setAttributeNS = d3_element_prototype.setAttributeNS, d3_style_prototype = d3_window.CSSStyleDeclaration.prototype, d3_style_setProperty = d3_style_prototype.setProperty; + d3_element_prototype.setAttribute = function(name, value) { + d3_element_setAttribute.call(this, name, value + ""); + }; + d3_element_prototype.setAttributeNS = function(space, local, value) { + d3_element_setAttributeNS.call(this, space, local, value + ""); + }; + d3_style_prototype.setProperty = function(name, value, priority) { + d3_style_setProperty.call(this, name, value + "", priority); + }; + } + d3.ascending = function(a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; + }; + d3.descending = function(a, b) { + return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; + }; + d3.min = function(array, f) { + var i = -1, n = array.length, a, b; + if (arguments.length === 1) { + while (++i < n && !((a = array[i]) != null && a <= a)) a = undefined; + while (++i < n) if ((b = array[i]) != null && a > b) a = b; + } else { + while (++i < n && !((a = f.call(array, array[i], i)) != null && a <= a)) a = undefined; + while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b; + } + return a; + }; + d3.max = function(array, f) { + var i = -1, n = array.length, a, b; + if (arguments.length === 1) { + while (++i < n && !((a = array[i]) != null && a <= a)) a = undefined; + while (++i < n) if ((b = array[i]) != null && b > a) a = b; + } else { + while (++i < n && !((a = f.call(array, array[i], i)) != null && a <= a)) a = undefined; + while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b; + } + return a; + }; + d3.extent = function(array, f) { + var i = -1, n = array.length, a, b, c; + if (arguments.length === 1) { + while (++i < n && !((a = c = array[i]) != null && a <= a)) a = c = undefined; + while (++i < n) if ((b = array[i]) != null) { + if (a > b) a = b; + if (c < b) c = b; + } + } else { + while (++i < n && !((a = c = f.call(array, array[i], i)) != null && a <= a)) a = undefined; + while (++i < n) if ((b = f.call(array, array[i], i)) != null) { + if (a > b) a = b; + if (c < b) c = b; + } + } + return [ a, c ]; + }; + d3.sum = function(array, f) { + var s = 0, n = array.length, a, i = -1; + if (arguments.length === 1) { + while (++i < n) if (!isNaN(a = +array[i])) s += a; + } else { + while (++i < n) if (!isNaN(a = +f.call(array, array[i], i))) s += a; + } + return s; + }; + function d3_number(x) { + return x != null && !isNaN(x); + } + d3.mean = function(array, f) { + var n = array.length, a, m = 0, i = -1, j = 0; + if (arguments.length === 1) { + while (++i < n) if (d3_number(a = array[i])) m += (a - m) / ++j; + } else { + while (++i < n) if (d3_number(a = f.call(array, array[i], i))) m += (a - m) / ++j; + } + return j ? m : undefined; + }; + d3.quantile = function(values, p) { + var H = (values.length - 1) * p + 1, h = Math.floor(H), v = +values[h - 1], e = H - h; + return e ? v + e * (values[h] - v) : v; + }; + d3.median = function(array, f) { + if (arguments.length > 1) array = array.map(f); + array = array.filter(d3_number); + return array.length ? d3.quantile(array.sort(d3.ascending), .5) : undefined; + }; + d3.bisector = function(f) { + return { + left: function(a, x, lo, hi) { + if (arguments.length < 3) lo = 0; + if (arguments.length < 4) hi = a.length; + while (lo < hi) { + var mid = lo + hi >>> 1; + if (f.call(a, a[mid], mid) < x) lo = mid + 1; else hi = mid; + } + return lo; + }, + right: function(a, x, lo, hi) { + if (arguments.length < 3) lo = 0; + if (arguments.length < 4) hi = a.length; + while (lo < hi) { + var mid = lo + hi >>> 1; + if (x < f.call(a, a[mid], mid)) hi = mid; else lo = mid + 1; + } + return lo; + } + }; + }; + var d3_bisector = d3.bisector(function(d) { + return d; + }); + d3.bisectLeft = d3_bisector.left; + d3.bisect = d3.bisectRight = d3_bisector.right; + d3.shuffle = function(array) { + var m = array.length, t, i; + while (m) { + i = Math.random() * m-- | 0; + t = array[m], array[m] = array[i], array[i] = t; + } + return array; + }; + d3.permute = function(array, indexes) { + var i = indexes.length, permutes = new Array(i); + while (i--) permutes[i] = array[indexes[i]]; + return permutes; + }; + d3.pairs = function(array) { + var i = 0, n = array.length - 1, p0, p1 = array[0], pairs = new Array(n < 0 ? 0 : n); + while (i < n) pairs[i] = [ p0 = p1, p1 = array[++i] ]; + return pairs; + }; + d3.zip = function() { + if (!(n = arguments.length)) return []; + for (var i = -1, m = d3.min(arguments, d3_zipLength), zips = new Array(m); ++i < m; ) { + for (var j = -1, n, zip = zips[i] = new Array(n); ++j < n; ) { + zip[j] = arguments[j][i]; + } + } + return zips; + }; + function d3_zipLength(d) { + return d.length; + } + d3.transpose = function(matrix) { + return d3.zip.apply(d3, matrix); + }; + d3.keys = function(map) { + var keys = []; + for (var key in map) keys.push(key); + return keys; + }; + d3.values = function(map) { + var values = []; + for (var key in map) values.push(map[key]); + return values; + }; + d3.entries = function(map) { + var entries = []; + for (var key in map) entries.push({ + key: key, + value: map[key] + }); + return entries; + }; + d3.merge = function(arrays) { + return Array.prototype.concat.apply([], arrays); + }; + d3.range = function(start, stop, step) { + if (arguments.length < 3) { + step = 1; + if (arguments.length < 2) { + stop = start; + start = 0; + } + } + if ((stop - start) / step === Infinity) throw new Error("infinite range"); + var range = [], k = d3_range_integerScale(Math.abs(step)), i = -1, j; + start *= k, stop *= k, step *= k; + if (step < 0) while ((j = start + step * ++i) > stop) range.push(j / k); else while ((j = start + step * ++i) < stop) range.push(j / k); + return range; + }; + function d3_range_integerScale(x) { + var k = 1; + while (x * k % 1) k *= 10; + return k; + } + function d3_class(ctor, properties) { + try { + for (var key in properties) { + Object.defineProperty(ctor.prototype, key, { + value: properties[key], + enumerable: false + }); + } + } catch (e) { + ctor.prototype = properties; + } + } + d3.map = function(object) { + var map = new d3_Map(); + if (object instanceof d3_Map) object.forEach(function(key, value) { + map.set(key, value); + }); else for (var key in object) map.set(key, object[key]); + return map; + }; + function d3_Map() {} + d3_class(d3_Map, { + has: function(key) { + return d3_map_prefix + key in this; + }, + get: function(key) { + return this[d3_map_prefix + key]; + }, + set: function(key, value) { + return this[d3_map_prefix + key] = value; + }, + remove: function(key) { + key = d3_map_prefix + key; + return key in this && delete this[key]; + }, + keys: function() { + var keys = []; + this.forEach(function(key) { + keys.push(key); + }); + return keys; + }, + values: function() { + var values = []; + this.forEach(function(key, value) { + values.push(value); + }); + return values; + }, + entries: function() { + var entries = []; + this.forEach(function(key, value) { + entries.push({ + key: key, + value: value + }); + }); + return entries; + }, + forEach: function(f) { + for (var key in this) { + if (key.charCodeAt(0) === d3_map_prefixCode) { + f.call(this, key.substring(1), this[key]); + } + } + } + }); + var d3_map_prefix = "\0", d3_map_prefixCode = d3_map_prefix.charCodeAt(0); + d3.nest = function() { + var nest = {}, keys = [], sortKeys = [], sortValues, rollup; + function map(mapType, array, depth) { + if (depth >= keys.length) return rollup ? rollup.call(nest, array) : sortValues ? array.sort(sortValues) : array; + var i = -1, n = array.length, key = keys[depth++], keyValue, object, setter, valuesByKey = new d3_Map(), values; + while (++i < n) { + if (values = valuesByKey.get(keyValue = key(object = array[i]))) { + values.push(object); + } else { + valuesByKey.set(keyValue, [ object ]); + } + } + if (mapType) { + object = mapType(); + setter = function(keyValue, values) { + object.set(keyValue, map(mapType, values, depth)); + }; + } else { + object = {}; + setter = function(keyValue, values) { + object[keyValue] = map(mapType, values, depth); + }; + } + valuesByKey.forEach(setter); + return object; + } + function entries(map, depth) { + if (depth >= keys.length) return map; + var array = [], sortKey = sortKeys[depth++]; + map.forEach(function(key, keyMap) { + array.push({ + key: key, + values: entries(keyMap, depth) + }); + }); + return sortKey ? array.sort(function(a, b) { + return sortKey(a.key, b.key); + }) : array; + } + nest.map = function(array, mapType) { + return map(mapType, array, 0); + }; + nest.entries = function(array) { + return entries(map(d3.map, array, 0), 0); + }; + nest.key = function(d) { + keys.push(d); + return nest; + }; + nest.sortKeys = function(order) { + sortKeys[keys.length - 1] = order; + return nest; + }; + nest.sortValues = function(order) { + sortValues = order; + return nest; + }; + nest.rollup = function(f) { + rollup = f; + return nest; + }; + return nest; + }; + d3.set = function(array) { + var set = new d3_Set(); + if (array) for (var i = 0, n = array.length; i < n; ++i) set.add(array[i]); + return set; + }; + function d3_Set() {} + d3_class(d3_Set, { + has: function(value) { + return d3_map_prefix + value in this; + }, + add: function(value) { + this[d3_map_prefix + value] = true; + return value; + }, + remove: function(value) { + value = d3_map_prefix + value; + return value in this && delete this[value]; + }, + values: function() { + var values = []; + this.forEach(function(value) { + values.push(value); + }); + return values; + }, + forEach: function(f) { + for (var value in this) { + if (value.charCodeAt(0) === d3_map_prefixCode) { + f.call(this, value.substring(1)); + } + } + } + }); + d3.behavior = {}; + d3.rebind = function(target, source) { + var i = 1, n = arguments.length, method; + while (++i < n) target[method = arguments[i]] = d3_rebind(target, source, source[method]); + return target; + }; + function d3_rebind(target, source, method) { + return function() { + var value = method.apply(source, arguments); + return value === source ? target : value; + }; + } + function d3_vendorSymbol(object, name) { + if (name in object) return name; + name = name.charAt(0).toUpperCase() + name.substring(1); + for (var i = 0, n = d3_vendorPrefixes.length; i < n; ++i) { + var prefixName = d3_vendorPrefixes[i] + name; + if (prefixName in object) return prefixName; + } + } + var d3_vendorPrefixes = [ "webkit", "ms", "moz", "Moz", "o", "O" ]; + function d3_noop() {} + d3.dispatch = function() { + var dispatch = new d3_dispatch(), i = -1, n = arguments.length; + while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch); + return dispatch; + }; + function d3_dispatch() {} + d3_dispatch.prototype.on = function(type, listener) { + var i = type.indexOf("."), name = ""; + if (i >= 0) { + name = type.substring(i + 1); + type = type.substring(0, i); + } + if (type) return arguments.length < 2 ? this[type].on(name) : this[type].on(name, listener); + if (arguments.length === 2) { + if (listener == null) for (type in this) { + if (this.hasOwnProperty(type)) this[type].on(name, null); + } + return this; + } + }; + function d3_dispatch_event(dispatch) { + var listeners = [], listenerByName = new d3_Map(); + function event() { + var z = listeners, i = -1, n = z.length, l; + while (++i < n) if (l = z[i].on) l.apply(this, arguments); + return dispatch; + } + event.on = function(name, listener) { + var l = listenerByName.get(name), i; + if (arguments.length < 2) return l && l.on; + if (l) { + l.on = null; + listeners = listeners.slice(0, i = listeners.indexOf(l)).concat(listeners.slice(i + 1)); + listenerByName.remove(name); + } + if (listener) listeners.push(listenerByName.set(name, { + on: listener + })); + return dispatch; + }; + return event; + } + d3.event = null; + function d3_eventPreventDefault() { + d3.event.preventDefault(); + } + function d3_eventSource() { + var e = d3.event, s; + while (s = e.sourceEvent) e = s; + return e; + } + function d3_eventDispatch(target) { + var dispatch = new d3_dispatch(), i = 0, n = arguments.length; + while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch); + dispatch.of = function(thiz, argumentz) { + return function(e1) { + try { + var e0 = e1.sourceEvent = d3.event; + e1.target = target; + d3.event = e1; + dispatch[e1.type].apply(thiz, argumentz); + } finally { + d3.event = e0; + } + }; + }; + return dispatch; + } + d3.requote = function(s) { + return s.replace(d3_requote_re, "\\$&"); + }; + var d3_requote_re = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g; + var d3_subclass = {}.__proto__ ? function(object, prototype) { + object.__proto__ = prototype; + } : function(object, prototype) { + for (var property in prototype) object[property] = prototype[property]; + }; + function d3_selection(groups) { + d3_subclass(groups, d3_selectionPrototype); + return groups; + } + var d3_select = function(s, n) { + return n.querySelector(s); + }, d3_selectAll = function(s, n) { + return n.querySelectorAll(s); + }, d3_selectMatcher = d3_documentElement[d3_vendorSymbol(d3_documentElement, "matchesSelector")], d3_selectMatches = function(n, s) { + return d3_selectMatcher.call(n, s); + }; + if (typeof Sizzle === "function") { + d3_select = function(s, n) { + return Sizzle(s, n)[0] || null; + }; + d3_selectAll = function(s, n) { + return Sizzle.uniqueSort(Sizzle(s, n)); + }; + d3_selectMatches = Sizzle.matchesSelector; + } + d3.selection = function() { + return d3_selectionRoot; + }; + var d3_selectionPrototype = d3.selection.prototype = []; + d3_selectionPrototype.select = function(selector) { + var subgroups = [], subgroup, subnode, group, node; + selector = d3_selection_selector(selector); + for (var j = -1, m = this.length; ++j < m; ) { + subgroups.push(subgroup = []); + subgroup.parentNode = (group = this[j]).parentNode; + for (var i = -1, n = group.length; ++i < n; ) { + if (node = group[i]) { + subgroup.push(subnode = selector.call(node, node.__data__, i, j)); + if (subnode && "__data__" in node) subnode.__data__ = node.__data__; + } else { + subgroup.push(null); + } + } + } + return d3_selection(subgroups); + }; + function d3_selection_selector(selector) { + return typeof selector === "function" ? selector : function() { + return d3_select(selector, this); + }; + } + d3_selectionPrototype.selectAll = function(selector) { + var subgroups = [], subgroup, node; + selector = d3_selection_selectorAll(selector); + for (var j = -1, m = this.length; ++j < m; ) { + for (var group = this[j], i = -1, n = group.length; ++i < n; ) { + if (node = group[i]) { + subgroups.push(subgroup = d3_array(selector.call(node, node.__data__, i, j))); + subgroup.parentNode = node; + } + } + } + return d3_selection(subgroups); + }; + function d3_selection_selectorAll(selector) { + return typeof selector === "function" ? selector : function() { + return d3_selectAll(selector, this); + }; + } + var d3_nsPrefix = { + svg: "http://www.w3.org/2000/svg", + xhtml: "http://www.w3.org/1999/xhtml", + xlink: "http://www.w3.org/1999/xlink", + xml: "http://www.w3.org/XML/1998/namespace", + xmlns: "http://www.w3.org/2000/xmlns/" + }; + d3.ns = { + prefix: d3_nsPrefix, + qualify: function(name) { + var i = name.indexOf(":"), prefix = name; + if (i >= 0) { + prefix = name.substring(0, i); + name = name.substring(i + 1); + } + return d3_nsPrefix.hasOwnProperty(prefix) ? { + space: d3_nsPrefix[prefix], + local: name + } : name; + } + }; + d3_selectionPrototype.attr = function(name, value) { + if (arguments.length < 2) { + if (typeof name === "string") { + var node = this.node(); + name = d3.ns.qualify(name); + return name.local ? node.getAttributeNS(name.space, name.local) : node.getAttribute(name); + } + for (value in name) this.each(d3_selection_attr(value, name[value])); + return this; + } + return this.each(d3_selection_attr(name, value)); + }; + function d3_selection_attr(name, value) { + name = d3.ns.qualify(name); + function attrNull() { + this.removeAttribute(name); + } + function attrNullNS() { + this.removeAttributeNS(name.space, name.local); + } + function attrConstant() { + this.setAttribute(name, value); + } + function attrConstantNS() { + this.setAttributeNS(name.space, name.local, value); + } + function attrFunction() { + var x = value.apply(this, arguments); + if (x == null) this.removeAttribute(name); else this.setAttribute(name, x); + } + function attrFunctionNS() { + var x = value.apply(this, arguments); + if (x == null) this.removeAttributeNS(name.space, name.local); else this.setAttributeNS(name.space, name.local, x); + } + return value == null ? name.local ? attrNullNS : attrNull : typeof value === "function" ? name.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant; + } + function d3_collapse(s) { + return s.trim().replace(/\s+/g, " "); + } + d3_selectionPrototype.classed = function(name, value) { + if (arguments.length < 2) { + if (typeof name === "string") { + var node = this.node(), n = (name = name.trim().split(/^|\s+/g)).length, i = -1; + if (value = node.classList) { + while (++i < n) if (!value.contains(name[i])) return false; + } else { + value = node.getAttribute("class"); + while (++i < n) if (!d3_selection_classedRe(name[i]).test(value)) return false; + } + return true; + } + for (value in name) this.each(d3_selection_classed(value, name[value])); + return this; + } + return this.each(d3_selection_classed(name, value)); + }; + function d3_selection_classedRe(name) { + return new RegExp("(?:^|\\s+)" + d3.requote(name) + "(?:\\s+|$)", "g"); + } + function d3_selection_classed(name, value) { + name = name.trim().split(/\s+/).map(d3_selection_classedName); + var n = name.length; + function classedConstant() { + var i = -1; + while (++i < n) name[i](this, value); + } + function classedFunction() { + var i = -1, x = value.apply(this, arguments); + while (++i < n) name[i](this, x); + } + return typeof value === "function" ? classedFunction : classedConstant; + } + function d3_selection_classedName(name) { + var re = d3_selection_classedRe(name); + return function(node, value) { + if (c = node.classList) return value ? c.add(name) : c.remove(name); + var c = node.getAttribute("class") || ""; + if (value) { + re.lastIndex = 0; + if (!re.test(c)) node.setAttribute("class", d3_collapse(c + " " + name)); + } else { + node.setAttribute("class", d3_collapse(c.replace(re, " "))); + } + }; + } + d3_selectionPrototype.style = function(name, value, priority) { + var n = arguments.length; + if (n < 3) { + if (typeof name !== "string") { + if (n < 2) value = ""; + for (priority in name) this.each(d3_selection_style(priority, name[priority], value)); + return this; + } + if (n < 2) return d3_window.getComputedStyle(this.node(), null).getPropertyValue(name); + priority = ""; + } + return this.each(d3_selection_style(name, value, priority)); + }; + function d3_selection_style(name, value, priority) { + function styleNull() { + this.style.removeProperty(name); + } + function styleConstant() { + this.style.setProperty(name, value, priority); + } + function styleFunction() { + var x = value.apply(this, arguments); + if (x == null) this.style.removeProperty(name); else this.style.setProperty(name, x, priority); + } + return value == null ? styleNull : typeof value === "function" ? styleFunction : styleConstant; + } + d3_selectionPrototype.property = function(name, value) { + if (arguments.length < 2) { + if (typeof name === "string") return this.node()[name]; + for (value in name) this.each(d3_selection_property(value, name[value])); + return this; + } + return this.each(d3_selection_property(name, value)); + }; + function d3_selection_property(name, value) { + function propertyNull() { + delete this[name]; + } + function propertyConstant() { + this[name] = value; + } + function propertyFunction() { + var x = value.apply(this, arguments); + if (x == null) delete this[name]; else this[name] = x; + } + return value == null ? propertyNull : typeof value === "function" ? propertyFunction : propertyConstant; + } + d3_selectionPrototype.text = function(value) { + return arguments.length ? this.each(typeof value === "function" ? function() { + var v = value.apply(this, arguments); + this.textContent = v == null ? "" : v; + } : value == null ? function() { + this.textContent = ""; + } : function() { + this.textContent = value; + }) : this.node().textContent; + }; + d3_selectionPrototype.html = function(value) { + return arguments.length ? this.each(typeof value === "function" ? function() { + var v = value.apply(this, arguments); + this.innerHTML = v == null ? "" : v; + } : value == null ? function() { + this.innerHTML = ""; + } : function() { + this.innerHTML = value; + }) : this.node().innerHTML; + }; + d3_selectionPrototype.append = function(name) { + name = d3_selection_creator(name); + return this.select(function() { + return this.appendChild(name.apply(this, arguments)); + }); + }; + function d3_selection_creator(name) { + return typeof name === "function" ? name : (name = d3.ns.qualify(name)).local ? function() { + return d3_document.createElementNS(name.space, name.local); + } : function() { + return d3_document.createElementNS(this.namespaceURI, name); + }; + } + d3_selectionPrototype.insert = function(name, before) { + name = d3_selection_creator(name); + before = d3_selection_selector(before); + return this.select(function() { + return this.insertBefore(name.apply(this, arguments), before.apply(this, arguments)); + }); + }; + d3_selectionPrototype.remove = function() { + return this.each(function() { + var parent = this.parentNode; + if (parent) parent.removeChild(this); + }); + }; + d3_selectionPrototype.data = function(value, key) { + var i = -1, n = this.length, group, node; + if (!arguments.length) { + value = new Array(n = (group = this[0]).length); + while (++i < n) { + if (node = group[i]) { + value[i] = node.__data__; + } + } + return value; + } + function bind(group, groupData) { + var i, n = group.length, m = groupData.length, n0 = Math.min(n, m), updateNodes = new Array(m), enterNodes = new Array(m), exitNodes = new Array(n), node, nodeData; + if (key) { + var nodeByKeyValue = new d3_Map(), dataByKeyValue = new d3_Map(), keyValues = [], keyValue; + for (i = -1; ++i < n; ) { + keyValue = key.call(node = group[i], node.__data__, i); + if (nodeByKeyValue.has(keyValue)) { + exitNodes[i] = node; + } else { + nodeByKeyValue.set(keyValue, node); + } + keyValues.push(keyValue); + } + for (i = -1; ++i < m; ) { + keyValue = key.call(groupData, nodeData = groupData[i], i); + if (node = nodeByKeyValue.get(keyValue)) { + updateNodes[i] = node; + node.__data__ = nodeData; + } else if (!dataByKeyValue.has(keyValue)) { + enterNodes[i] = d3_selection_dataNode(nodeData); + } + dataByKeyValue.set(keyValue, nodeData); + nodeByKeyValue.remove(keyValue); + } + for (i = -1; ++i < n; ) { + if (nodeByKeyValue.has(keyValues[i])) { + exitNodes[i] = group[i]; + } + } + } else { + for (i = -1; ++i < n0; ) { + node = group[i]; + nodeData = groupData[i]; + if (node) { + node.__data__ = nodeData; + updateNodes[i] = node; + } else { + enterNodes[i] = d3_selection_dataNode(nodeData); + } + } + for (;i < m; ++i) { + enterNodes[i] = d3_selection_dataNode(groupData[i]); + } + for (;i < n; ++i) { + exitNodes[i] = group[i]; + } + } + enterNodes.update = updateNodes; + enterNodes.parentNode = updateNodes.parentNode = exitNodes.parentNode = group.parentNode; + enter.push(enterNodes); + update.push(updateNodes); + exit.push(exitNodes); + } + var enter = d3_selection_enter([]), update = d3_selection([]), exit = d3_selection([]); + if (typeof value === "function") { + while (++i < n) { + bind(group = this[i], value.call(group, group.parentNode.__data__, i)); + } + } else { + while (++i < n) { + bind(group = this[i], value); + } + } + update.enter = function() { + return enter; + }; + update.exit = function() { + return exit; + }; + return update; + }; + function d3_selection_dataNode(data) { + return { + __data__: data + }; + } + d3_selectionPrototype.datum = function(value) { + return arguments.length ? this.property("__data__", value) : this.property("__data__"); + }; + d3_selectionPrototype.filter = function(filter) { + var subgroups = [], subgroup, group, node; + if (typeof filter !== "function") filter = d3_selection_filter(filter); + for (var j = 0, m = this.length; j < m; j++) { + subgroups.push(subgroup = []); + subgroup.parentNode = (group = this[j]).parentNode; + for (var i = 0, n = group.length; i < n; i++) { + if ((node = group[i]) && filter.call(node, node.__data__, i)) { + subgroup.push(node); + } + } + } + return d3_selection(subgroups); + }; + function d3_selection_filter(selector) { + return function() { + return d3_selectMatches(this, selector); + }; + } + d3_selectionPrototype.order = function() { + for (var j = -1, m = this.length; ++j < m; ) { + for (var group = this[j], i = group.length - 1, next = group[i], node; --i >= 0; ) { + if (node = group[i]) { + if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next); + next = node; + } + } + } + return this; + }; + d3_selectionPrototype.sort = function(comparator) { + comparator = d3_selection_sortComparator.apply(this, arguments); + for (var j = -1, m = this.length; ++j < m; ) this[j].sort(comparator); + return this.order(); + }; + function d3_selection_sortComparator(comparator) { + if (!arguments.length) comparator = d3.ascending; + return function(a, b) { + return a && b ? comparator(a.__data__, b.__data__) : !a - !b; + }; + } + d3_selectionPrototype.each = function(callback) { + return d3_selection_each(this, function(node, i, j) { + callback.call(node, node.__data__, i, j); + }); + }; + function d3_selection_each(groups, callback) { + for (var j = 0, m = groups.length; j < m; j++) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; i++) { + if (node = group[i]) callback(node, i, j); + } + } + return groups; + } + d3_selectionPrototype.call = function(callback) { + var args = d3_array(arguments); + callback.apply(args[0] = this, args); + return this; + }; + d3_selectionPrototype.empty = function() { + return !this.node(); + }; + d3_selectionPrototype.node = function() { + for (var j = 0, m = this.length; j < m; j++) { + for (var group = this[j], i = 0, n = group.length; i < n; i++) { + var node = group[i]; + if (node) return node; + } + } + return null; + }; + d3_selectionPrototype.size = function() { + var n = 0; + this.each(function() { + ++n; + }); + return n; + }; + function d3_selection_enter(selection) { + d3_subclass(selection, d3_selection_enterPrototype); + return selection; + } + var d3_selection_enterPrototype = []; + d3.selection.enter = d3_selection_enter; + d3.selection.enter.prototype = d3_selection_enterPrototype; + d3_selection_enterPrototype.append = d3_selectionPrototype.append; + d3_selection_enterPrototype.empty = d3_selectionPrototype.empty; + d3_selection_enterPrototype.node = d3_selectionPrototype.node; + d3_selection_enterPrototype.call = d3_selectionPrototype.call; + d3_selection_enterPrototype.size = d3_selectionPrototype.size; + d3_selection_enterPrototype.select = function(selector) { + var subgroups = [], subgroup, subnode, upgroup, group, node; + for (var j = -1, m = this.length; ++j < m; ) { + upgroup = (group = this[j]).update; + subgroups.push(subgroup = []); + subgroup.parentNode = group.parentNode; + for (var i = -1, n = group.length; ++i < n; ) { + if (node = group[i]) { + subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i, j)); + subnode.__data__ = node.__data__; + } else { + subgroup.push(null); + } + } + } + return d3_selection(subgroups); + }; + d3_selection_enterPrototype.insert = function(name, before) { + if (arguments.length < 2) before = d3_selection_enterInsertBefore(this); + return d3_selectionPrototype.insert.call(this, name, before); + }; + function d3_selection_enterInsertBefore(enter) { + var i0, j0; + return function(d, i, j) { + var group = enter[j].update, n = group.length, node; + if (j != j0) j0 = j, i0 = 0; + if (i >= i0) i0 = i + 1; + while (!(node = group[i0]) && ++i0 < n) ; + return node; + }; + } + d3_selectionPrototype.transition = function() { + var id = d3_transitionInheritId || ++d3_transitionId, subgroups = [], subgroup, node, transition = d3_transitionInherit || { + time: Date.now(), + ease: d3_ease_cubicInOut, + delay: 0, + duration: 250 + }; + for (var j = -1, m = this.length; ++j < m; ) { + subgroups.push(subgroup = []); + for (var group = this[j], i = -1, n = group.length; ++i < n; ) { + if (node = group[i]) d3_transitionNode(node, i, id, transition); + subgroup.push(node); + } + } + return d3_transition(subgroups, id); + }; + d3_selectionPrototype.interrupt = function() { + return this.each(d3_selection_interrupt); + }; + function d3_selection_interrupt() { + var lock = this.__transition__; + if (lock) ++lock.active; + } + d3.select = function(node) { + var group = [ typeof node === "string" ? d3_select(node, d3_document) : node ]; + group.parentNode = d3_documentElement; + return d3_selection([ group ]); + }; + d3.selectAll = function(nodes) { + var group = d3_array(typeof nodes === "string" ? d3_selectAll(nodes, d3_document) : nodes); + group.parentNode = d3_documentElement; + return d3_selection([ group ]); + }; + var d3_selectionRoot = d3.select(d3_documentElement); + d3_selectionPrototype.on = function(type, listener, capture) { + var n = arguments.length; + if (n < 3) { + if (typeof type !== "string") { + if (n < 2) listener = false; + for (capture in type) this.each(d3_selection_on(capture, type[capture], listener)); + return this; + } + if (n < 2) return (n = this.node()["__on" + type]) && n._; + capture = false; + } + return this.each(d3_selection_on(type, listener, capture)); + }; + function d3_selection_on(type, listener, capture) { + var name = "__on" + type, i = type.indexOf("."), wrap = d3_selection_onListener; + if (i > 0) type = type.substring(0, i); + var filter = d3_selection_onFilters.get(type); + if (filter) type = filter, wrap = d3_selection_onFilter; + function onRemove() { + var l = this[name]; + if (l) { + this.removeEventListener(type, l, l.$); + delete this[name]; + } + } + function onAdd() { + var l = wrap(listener, d3_array(arguments)); + onRemove.call(this); + this.addEventListener(type, this[name] = l, l.$ = capture); + l._ = listener; + } + function removeAll() { + var re = new RegExp("^__on([^.]+)" + d3.requote(type) + "$"), match; + for (var name in this) { + if (match = name.match(re)) { + var l = this[name]; + this.removeEventListener(match[1], l, l.$); + delete this[name]; + } + } + } + return i ? listener ? onAdd : onRemove : listener ? d3_noop : removeAll; + } + var d3_selection_onFilters = d3.map({ + mouseenter: "mouseover", + mouseleave: "mouseout" + }); + d3_selection_onFilters.forEach(function(k) { + if ("on" + k in d3_document) d3_selection_onFilters.remove(k); + }); + function d3_selection_onListener(listener, argumentz) { + return function(e) { + var o = d3.event; + d3.event = e; + argumentz[0] = this.__data__; + try { + listener.apply(this, argumentz); + } finally { + d3.event = o; + } + }; + } + function d3_selection_onFilter(listener, argumentz) { + var l = d3_selection_onListener(listener, argumentz); + return function(e) { + var target = this, related = e.relatedTarget; + if (!related || related !== target && !(related.compareDocumentPosition(target) & 8)) { + l.call(target, e); + } + }; + } + var d3_event_dragSelect = d3_vendorSymbol(d3_documentElement.style, "userSelect"), d3_event_dragId = 0; + function d3_event_dragSuppress() { + var name = ".dragsuppress-" + ++d3_event_dragId, touchmove = "touchmove" + name, selectstart = "selectstart" + name, dragstart = "dragstart" + name, click = "click" + name, w = d3.select(d3_window).on(touchmove, d3_eventPreventDefault).on(selectstart, d3_eventPreventDefault).on(dragstart, d3_eventPreventDefault), style = d3_documentElement.style, select = style[d3_event_dragSelect]; + style[d3_event_dragSelect] = "none"; + return function(suppressClick) { + w.on(name, null); + style[d3_event_dragSelect] = select; + if (suppressClick) { + function off() { + w.on(click, null); + } + w.on(click, function() { + d3_eventPreventDefault(); + off(); + }, true); + setTimeout(off, 0); + } + }; + } + d3.mouse = function(container) { + return d3_mousePoint(container, d3_eventSource()); + }; + var d3_mouse_bug44083 = /WebKit/.test(d3_window.navigator.userAgent) ? -1 : 0; + function d3_mousePoint(container, e) { + if (e.changedTouches) e = e.changedTouches[0]; + var svg = container.ownerSVGElement || container; + if (svg.createSVGPoint) { + var point = svg.createSVGPoint(); + if (d3_mouse_bug44083 < 0 && (d3_window.scrollX || d3_window.scrollY)) { + svg = d3.select("body").append("svg").style({ + position: "absolute", + top: 0, + left: 0, + margin: 0, + padding: 0, + border: "none" + }, "important"); + var ctm = svg[0][0].getScreenCTM(); + d3_mouse_bug44083 = !(ctm.f || ctm.e); + svg.remove(); + } + if (d3_mouse_bug44083) point.x = e.pageX, point.y = e.pageY; else point.x = e.clientX, + point.y = e.clientY; + point = point.matrixTransform(container.getScreenCTM().inverse()); + return [ point.x, point.y ]; + } + var rect = container.getBoundingClientRect(); + return [ e.clientX - rect.left - container.clientLeft, e.clientY - rect.top - container.clientTop ]; + } + d3.touches = function(container, touches) { + if (arguments.length < 2) touches = d3_eventSource().touches; + return touches ? d3_array(touches).map(function(touch) { + var point = d3_mousePoint(container, touch); + point.identifier = touch.identifier; + return point; + }) : []; + }; + d3.behavior.drag = function() { + var event = d3_eventDispatch(drag, "drag", "dragstart", "dragend"), origin = null, mousedown = dragstart(d3_noop, d3.mouse, "mousemove", "mouseup"), touchstart = dragstart(touchid, touchposition, "touchmove", "touchend"); + function drag() { + this.on("mousedown.drag", mousedown).on("touchstart.drag", touchstart); + } + function touchid() { + return d3.event.changedTouches[0].identifier; + } + function touchposition(parent, id) { + return d3.touches(parent).filter(function(p) { + return p.identifier === id; + })[0]; + } + function dragstart(id, position, move, end) { + return function() { + var target = this, parent = target.parentNode, event_ = event.of(target, arguments), eventTarget = d3.event.target, eventId = id(), drag = eventId == null ? "drag" : "drag-" + eventId, origin_ = position(parent, eventId), dragged = 0, offset, w = d3.select(d3_window).on(move + "." + drag, moved).on(end + "." + drag, ended), dragRestore = d3_event_dragSuppress(); + if (origin) { + offset = origin.apply(target, arguments); + offset = [ offset.x - origin_[0], offset.y - origin_[1] ]; + } else { + offset = [ 0, 0 ]; + } + event_({ + type: "dragstart" + }); + function moved() { + if (!parent) return ended(); + var p = position(parent, eventId), dx = p[0] - origin_[0], dy = p[1] - origin_[1]; + dragged |= dx | dy; + origin_ = p; + event_({ + type: "drag", + x: p[0] + offset[0], + y: p[1] + offset[1], + dx: dx, + dy: dy + }); + } + function ended() { + w.on(move + "." + drag, null).on(end + "." + drag, null); + dragRestore(dragged && d3.event.target === eventTarget); + event_({ + type: "dragend" + }); + } + }; + } + drag.origin = function(x) { + if (!arguments.length) return origin; + origin = x; + return drag; + }; + return d3.rebind(drag, event, "on"); + }; + var π = Math.PI, ε = 1e-6, ε2 = ε * ε, d3_radians = π / 180, d3_degrees = 180 / π; + function d3_sgn(x) { + return x > 0 ? 1 : x < 0 ? -1 : 0; + } + function d3_acos(x) { + return x > 1 ? 0 : x < -1 ? π : Math.acos(x); + } + function d3_asin(x) { + return x > 1 ? π / 2 : x < -1 ? -π / 2 : Math.asin(x); + } + function d3_sinh(x) { + return (Math.exp(x) - Math.exp(-x)) / 2; + } + function d3_cosh(x) { + return (Math.exp(x) + Math.exp(-x)) / 2; + } + function d3_tanh(x) { + return d3_sinh(x) / d3_cosh(x); + } + function d3_haversin(x) { + return (x = Math.sin(x / 2)) * x; + } + var ρ = Math.SQRT2, ρ2 = 2, ρ4 = 4; + d3.interpolateZoom = function(p0, p1) { + var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2]; + var dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + ρ4 * d2) / (2 * w0 * ρ2 * d1), b1 = (w1 * w1 - w0 * w0 - ρ4 * d2) / (2 * w1 * ρ2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1), dr = r1 - r0, S = (dr || Math.log(w1 / w0)) / ρ; + function interpolate(t) { + var s = t * S; + if (dr) { + var coshr0 = d3_cosh(r0), u = w0 / (ρ2 * d1) * (coshr0 * d3_tanh(ρ * s + r0) - d3_sinh(r0)); + return [ ux0 + u * dx, uy0 + u * dy, w0 * coshr0 / d3_cosh(ρ * s + r0) ]; + } + return [ ux0 + t * dx, uy0 + t * dy, w0 * Math.exp(ρ * s) ]; + } + interpolate.duration = S * 1e3; + return interpolate; + }; + d3.behavior.zoom = function() { + var view = { + x: 0, + y: 0, + k: 1 + }, translate0, center, size = [ 960, 500 ], scaleExtent = d3_behavior_zoomInfinity, mousedown = "mousedown.zoom", mousemove = "mousemove.zoom", mouseup = "mouseup.zoom", mousewheelTimer, touchstart = "touchstart.zoom", touchtime, event = d3_eventDispatch(zoom, "zoomstart", "zoom", "zoomend"), x0, x1, y0, y1; + function zoom(g) { + g.on(mousedown, mousedowned).on(d3_behavior_zoomWheel + ".zoom", mousewheeled).on(mousemove, mousewheelreset).on("dblclick.zoom", dblclicked).on(touchstart, touchstarted); + } + zoom.event = function(g) { + g.each(function() { + var event_ = event.of(this, arguments), view1 = view; + if (d3_transitionInheritId) { + d3.select(this).transition().each("start.zoom", function() { + view = this.__chart__ || { + x: 0, + y: 0, + k: 1 + }; + zoomstarted(event_); + }).tween("zoom:zoom", function() { + var dx = size[0], dy = size[1], cx = dx / 2, cy = dy / 2, i = d3.interpolateZoom([ (cx - view.x) / view.k, (cy - view.y) / view.k, dx / view.k ], [ (cx - view1.x) / view1.k, (cy - view1.y) / view1.k, dx / view1.k ]); + return function(t) { + var l = i(t), k = dx / l[2]; + this.__chart__ = view = { + x: cx - l[0] * k, + y: cy - l[1] * k, + k: k + }; + zoomed(event_); + }; + }).each("end.zoom", function() { + zoomended(event_); + }); + } else { + this.__chart__ = view; + zoomstarted(event_); + zoomed(event_); + zoomended(event_); + } + }); + }; + zoom.translate = function(_) { + if (!arguments.length) return [ view.x, view.y ]; + view = { + x: +_[0], + y: +_[1], + k: view.k + }; + rescale(); + return zoom; + }; + zoom.scale = function(_) { + if (!arguments.length) return view.k; + view = { + x: view.x, + y: view.y, + k: +_ + }; + rescale(); + return zoom; + }; + zoom.scaleExtent = function(_) { + if (!arguments.length) return scaleExtent; + scaleExtent = _ == null ? d3_behavior_zoomInfinity : [ +_[0], +_[1] ]; + return zoom; + }; + zoom.center = function(_) { + if (!arguments.length) return center; + center = _ && [ +_[0], +_[1] ]; + return zoom; + }; + zoom.size = function(_) { + if (!arguments.length) return size; + size = _ && [ +_[0], +_[1] ]; + return zoom; + }; + zoom.x = function(z) { + if (!arguments.length) return x1; + x1 = z; + x0 = z.copy(); + view = { + x: 0, + y: 0, + k: 1 + }; + return zoom; + }; + zoom.y = function(z) { + if (!arguments.length) return y1; + y1 = z; + y0 = z.copy(); + view = { + x: 0, + y: 0, + k: 1 + }; + return zoom; + }; + function location(p) { + return [ (p[0] - view.x) / view.k, (p[1] - view.y) / view.k ]; + } + function point(l) { + return [ l[0] * view.k + view.x, l[1] * view.k + view.y ]; + } + function scaleTo(s) { + view.k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], s)); + } + function translateTo(p, l) { + l = point(l); + view.x += p[0] - l[0]; + view.y += p[1] - l[1]; + } + function rescale() { + if (x1) x1.domain(x0.range().map(function(x) { + return (x - view.x) / view.k; + }).map(x0.invert)); + if (y1) y1.domain(y0.range().map(function(y) { + return (y - view.y) / view.k; + }).map(y0.invert)); + } + function zoomstarted(event) { + event({ + type: "zoomstart" + }); + } + function zoomed(event) { + rescale(); + event({ + type: "zoom", + scale: view.k, + translate: [ view.x, view.y ] + }); + } + function zoomended(event) { + event({ + type: "zoomend" + }); + } + function mousedowned() { + var target = this, event_ = event.of(target, arguments), eventTarget = d3.event.target, dragged = 0, w = d3.select(d3_window).on(mousemove, moved).on(mouseup, ended), l = location(d3.mouse(target)), dragRestore = d3_event_dragSuppress(); + d3_selection_interrupt.call(target); + zoomstarted(event_); + function moved() { + dragged = 1; + translateTo(d3.mouse(target), l); + zoomed(event_); + } + function ended() { + w.on(mousemove, d3_window === target ? mousewheelreset : null).on(mouseup, null); + dragRestore(dragged && d3.event.target === eventTarget); + zoomended(event_); + } + } + function touchstarted() { + var target = this, event_ = event.of(target, arguments), locations0 = {}, distance0 = 0, scale0, eventId = d3.event.changedTouches[0].identifier, touchmove = "touchmove.zoom-" + eventId, touchend = "touchend.zoom-" + eventId, w = d3.select(d3_window).on(touchmove, moved).on(touchend, ended), t = d3.select(target).on(mousedown, null).on(touchstart, started), dragRestore = d3_event_dragSuppress(); + d3_selection_interrupt.call(target); + started(); + zoomstarted(event_); + function relocate() { + var touches = d3.touches(target); + scale0 = view.k; + touches.forEach(function(t) { + if (t.identifier in locations0) locations0[t.identifier] = location(t); + }); + return touches; + } + function started() { + var changed = d3.event.changedTouches; + for (var i = 0, n = changed.length; i < n; ++i) { + locations0[changed[i].identifier] = null; + } + var touches = relocate(), now = Date.now(); + if (touches.length === 1) { + if (now - touchtime < 500) { + var p = touches[0], l = locations0[p.identifier]; + scaleTo(view.k * 2); + translateTo(p, l); + d3_eventPreventDefault(); + zoomed(event_); + } + touchtime = now; + } else if (touches.length > 1) { + var p = touches[0], q = touches[1], dx = p[0] - q[0], dy = p[1] - q[1]; + distance0 = dx * dx + dy * dy; + } + } + function moved() { + var touches = d3.touches(target), p0, l0, p1, l1; + for (var i = 0, n = touches.length; i < n; ++i, l1 = null) { + p1 = touches[i]; + if (l1 = locations0[p1.identifier]) { + if (l0) break; + p0 = p1, l0 = l1; + } + } + if (l1) { + var distance1 = (distance1 = p1[0] - p0[0]) * distance1 + (distance1 = p1[1] - p0[1]) * distance1, scale1 = distance0 && Math.sqrt(distance1 / distance0); + p0 = [ (p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2 ]; + l0 = [ (l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2 ]; + scaleTo(scale1 * scale0); + } + touchtime = null; + translateTo(p0, l0); + zoomed(event_); + } + function ended() { + if (d3.event.touches.length) { + var changed = d3.event.changedTouches; + for (var i = 0, n = changed.length; i < n; ++i) { + delete locations0[changed[i].identifier]; + } + for (var identifier in locations0) { + return void relocate(); + } + } + w.on(touchmove, null).on(touchend, null); + t.on(mousedown, mousedowned).on(touchstart, touchstarted); + dragRestore(); + zoomended(event_); + } + } + function mousewheeled() { + var event_ = event.of(this, arguments); + if (mousewheelTimer) clearTimeout(mousewheelTimer); else d3_selection_interrupt.call(this), + zoomstarted(event_); + mousewheelTimer = setTimeout(function() { + mousewheelTimer = null; + zoomended(event_); + }, 50); + d3_eventPreventDefault(); + var point = center || d3.mouse(this); + if (!translate0) translate0 = location(point); + scaleTo(Math.pow(2, d3_behavior_zoomDelta() * .002) * view.k); + translateTo(point, translate0); + zoomed(event_); + } + function mousewheelreset() { + translate0 = null; + } + function dblclicked() { + var event_ = event.of(this, arguments), p = d3.mouse(this), l = location(p), k = Math.log(view.k) / Math.LN2; + zoomstarted(event_); + scaleTo(Math.pow(2, d3.event.shiftKey ? Math.ceil(k) - 1 : Math.floor(k) + 1)); + translateTo(p, l); + zoomed(event_); + zoomended(event_); + } + return d3.rebind(zoom, event, "on"); + }; + var d3_behavior_zoomInfinity = [ 0, Infinity ]; + var d3_behavior_zoomDelta, d3_behavior_zoomWheel = "onwheel" in d3_document ? (d3_behavior_zoomDelta = function() { + return -d3.event.deltaY * (d3.event.deltaMode ? 120 : 1); + }, "wheel") : "onmousewheel" in d3_document ? (d3_behavior_zoomDelta = function() { + return d3.event.wheelDelta; + }, "mousewheel") : (d3_behavior_zoomDelta = function() { + return -d3.event.detail; + }, "MozMousePixelScroll"); + function d3_Color() {} + d3_Color.prototype.toString = function() { + return this.rgb() + ""; + }; + d3.hsl = function(h, s, l) { + return arguments.length === 1 ? h instanceof d3_Hsl ? d3_hsl(h.h, h.s, h.l) : d3_rgb_parse("" + h, d3_rgb_hsl, d3_hsl) : d3_hsl(+h, +s, +l); + }; + function d3_hsl(h, s, l) { + return new d3_Hsl(h, s, l); + } + function d3_Hsl(h, s, l) { + this.h = h; + this.s = s; + this.l = l; + } + var d3_hslPrototype = d3_Hsl.prototype = new d3_Color(); + d3_hslPrototype.brighter = function(k) { + k = Math.pow(.7, arguments.length ? k : 1); + return d3_hsl(this.h, this.s, this.l / k); + }; + d3_hslPrototype.darker = function(k) { + k = Math.pow(.7, arguments.length ? k : 1); + return d3_hsl(this.h, this.s, k * this.l); + }; + d3_hslPrototype.rgb = function() { + return d3_hsl_rgb(this.h, this.s, this.l); + }; + function d3_hsl_rgb(h, s, l) { + var m1, m2; + h = isNaN(h) ? 0 : (h %= 360) < 0 ? h + 360 : h; + s = isNaN(s) ? 0 : s < 0 ? 0 : s > 1 ? 1 : s; + l = l < 0 ? 0 : l > 1 ? 1 : l; + m2 = l <= .5 ? l * (1 + s) : l + s - l * s; + m1 = 2 * l - m2; + function v(h) { + if (h > 360) h -= 360; else if (h < 0) h += 360; + if (h < 60) return m1 + (m2 - m1) * h / 60; + if (h < 180) return m2; + if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60; + return m1; + } + function vv(h) { + return Math.round(v(h) * 255); + } + return d3_rgb(vv(h + 120), vv(h), vv(h - 120)); + } + d3.hcl = function(h, c, l) { + return arguments.length === 1 ? h instanceof d3_Hcl ? d3_hcl(h.h, h.c, h.l) : h instanceof d3_Lab ? d3_lab_hcl(h.l, h.a, h.b) : d3_lab_hcl((h = d3_rgb_lab((h = d3.rgb(h)).r, h.g, h.b)).l, h.a, h.b) : d3_hcl(+h, +c, +l); + }; + function d3_hcl(h, c, l) { + return new d3_Hcl(h, c, l); + } + function d3_Hcl(h, c, l) { + this.h = h; + this.c = c; + this.l = l; + } + var d3_hclPrototype = d3_Hcl.prototype = new d3_Color(); + d3_hclPrototype.brighter = function(k) { + return d3_hcl(this.h, this.c, Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1))); + }; + d3_hclPrototype.darker = function(k) { + return d3_hcl(this.h, this.c, Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1))); + }; + d3_hclPrototype.rgb = function() { + return d3_hcl_lab(this.h, this.c, this.l).rgb(); + }; + function d3_hcl_lab(h, c, l) { + if (isNaN(h)) h = 0; + if (isNaN(c)) c = 0; + return d3_lab(l, Math.cos(h *= d3_radians) * c, Math.sin(h) * c); + } + d3.lab = function(l, a, b) { + return arguments.length === 1 ? l instanceof d3_Lab ? d3_lab(l.l, l.a, l.b) : l instanceof d3_Hcl ? d3_hcl_lab(l.l, l.c, l.h) : d3_rgb_lab((l = d3.rgb(l)).r, l.g, l.b) : d3_lab(+l, +a, +b); + }; + function d3_lab(l, a, b) { + return new d3_Lab(l, a, b); + } + function d3_Lab(l, a, b) { + this.l = l; + this.a = a; + this.b = b; + } + var d3_lab_K = 18; + var d3_lab_X = .95047, d3_lab_Y = 1, d3_lab_Z = 1.08883; + var d3_labPrototype = d3_Lab.prototype = new d3_Color(); + d3_labPrototype.brighter = function(k) { + return d3_lab(Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)), this.a, this.b); + }; + d3_labPrototype.darker = function(k) { + return d3_lab(Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)), this.a, this.b); + }; + d3_labPrototype.rgb = function() { + return d3_lab_rgb(this.l, this.a, this.b); + }; + function d3_lab_rgb(l, a, b) { + var y = (l + 16) / 116, x = y + a / 500, z = y - b / 200; + x = d3_lab_xyz(x) * d3_lab_X; + y = d3_lab_xyz(y) * d3_lab_Y; + z = d3_lab_xyz(z) * d3_lab_Z; + return d3_rgb(d3_xyz_rgb(3.2404542 * x - 1.5371385 * y - .4985314 * z), d3_xyz_rgb(-.969266 * x + 1.8760108 * y + .041556 * z), d3_xyz_rgb(.0556434 * x - .2040259 * y + 1.0572252 * z)); + } + function d3_lab_hcl(l, a, b) { + return l > 0 ? d3_hcl(Math.atan2(b, a) * d3_degrees, Math.sqrt(a * a + b * b), l) : d3_hcl(NaN, NaN, l); + } + function d3_lab_xyz(x) { + return x > .206893034 ? x * x * x : (x - 4 / 29) / 7.787037; + } + function d3_xyz_lab(x) { + return x > .008856 ? Math.pow(x, 1 / 3) : 7.787037 * x + 4 / 29; + } + function d3_xyz_rgb(r) { + return Math.round(255 * (r <= .00304 ? 12.92 * r : 1.055 * Math.pow(r, 1 / 2.4) - .055)); + } + d3.rgb = function(r, g, b) { + return arguments.length === 1 ? r instanceof d3_Rgb ? d3_rgb(r.r, r.g, r.b) : d3_rgb_parse("" + r, d3_rgb, d3_hsl_rgb) : d3_rgb(~~r, ~~g, ~~b); + }; + function d3_rgbNumber(value) { + return d3_rgb(value >> 16, value >> 8 & 255, value & 255); + } + function d3_rgbString(value) { + return d3_rgbNumber(value) + ""; + } + function d3_rgb(r, g, b) { + return new d3_Rgb(r, g, b); + } + function d3_Rgb(r, g, b) { + this.r = r; + this.g = g; + this.b = b; + } + var d3_rgbPrototype = d3_Rgb.prototype = new d3_Color(); + d3_rgbPrototype.brighter = function(k) { + k = Math.pow(.7, arguments.length ? k : 1); + var r = this.r, g = this.g, b = this.b, i = 30; + if (!r && !g && !b) return d3_rgb(i, i, i); + if (r && r < i) r = i; + if (g && g < i) g = i; + if (b && b < i) b = i; + return d3_rgb(Math.min(255, ~~(r / k)), Math.min(255, ~~(g / k)), Math.min(255, ~~(b / k))); + }; + d3_rgbPrototype.darker = function(k) { + k = Math.pow(.7, arguments.length ? k : 1); + return d3_rgb(~~(k * this.r), ~~(k * this.g), ~~(k * this.b)); + }; + d3_rgbPrototype.hsl = function() { + return d3_rgb_hsl(this.r, this.g, this.b); + }; + d3_rgbPrototype.toString = function() { + return "#" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b); + }; + function d3_rgb_hex(v) { + return v < 16 ? "0" + Math.max(0, v).toString(16) : Math.min(255, v).toString(16); + } + function d3_rgb_parse(format, rgb, hsl) { + var r = 0, g = 0, b = 0, m1, m2, name; + m1 = /([a-z]+)\((.*)\)/i.exec(format); + if (m1) { + m2 = m1[2].split(","); + switch (m1[1]) { + case "hsl": + { + return hsl(parseFloat(m2[0]), parseFloat(m2[1]) / 100, parseFloat(m2[2]) / 100); + } + + case "rgb": + { + return rgb(d3_rgb_parseNumber(m2[0]), d3_rgb_parseNumber(m2[1]), d3_rgb_parseNumber(m2[2])); + } + } + } + if (name = d3_rgb_names.get(format)) return rgb(name.r, name.g, name.b); + if (format != null && format.charAt(0) === "#") { + if (format.length === 4) { + r = format.charAt(1); + r += r; + g = format.charAt(2); + g += g; + b = format.charAt(3); + b += b; + } else if (format.length === 7) { + r = format.substring(1, 3); + g = format.substring(3, 5); + b = format.substring(5, 7); + } + r = parseInt(r, 16); + g = parseInt(g, 16); + b = parseInt(b, 16); + } + return rgb(r, g, b); + } + function d3_rgb_hsl(r, g, b) { + var min = Math.min(r /= 255, g /= 255, b /= 255), max = Math.max(r, g, b), d = max - min, h, s, l = (max + min) / 2; + if (d) { + s = l < .5 ? d / (max + min) : d / (2 - max - min); + if (r == max) h = (g - b) / d + (g < b ? 6 : 0); else if (g == max) h = (b - r) / d + 2; else h = (r - g) / d + 4; + h *= 60; + } else { + h = NaN; + s = l > 0 && l < 1 ? 0 : h; + } + return d3_hsl(h, s, l); + } + function d3_rgb_lab(r, g, b) { + r = d3_rgb_xyz(r); + g = d3_rgb_xyz(g); + b = d3_rgb_xyz(b); + var x = d3_xyz_lab((.4124564 * r + .3575761 * g + .1804375 * b) / d3_lab_X), y = d3_xyz_lab((.2126729 * r + .7151522 * g + .072175 * b) / d3_lab_Y), z = d3_xyz_lab((.0193339 * r + .119192 * g + .9503041 * b) / d3_lab_Z); + return d3_lab(116 * y - 16, 500 * (x - y), 200 * (y - z)); + } + function d3_rgb_xyz(r) { + return (r /= 255) <= .04045 ? r / 12.92 : Math.pow((r + .055) / 1.055, 2.4); + } + function d3_rgb_parseNumber(c) { + var f = parseFloat(c); + return c.charAt(c.length - 1) === "%" ? Math.round(f * 2.55) : f; + } + var d3_rgb_names = d3.map({ + aliceblue: 15792383, + antiquewhite: 16444375, + aqua: 65535, + aquamarine: 8388564, + azure: 15794175, + beige: 16119260, + bisque: 16770244, + black: 0, + blanchedalmond: 16772045, + blue: 255, + blueviolet: 9055202, + brown: 10824234, + burlywood: 14596231, + cadetblue: 6266528, + chartreuse: 8388352, + chocolate: 13789470, + coral: 16744272, + cornflowerblue: 6591981, + cornsilk: 16775388, + crimson: 14423100, + cyan: 65535, + darkblue: 139, + darkcyan: 35723, + darkgoldenrod: 12092939, + darkgray: 11119017, + darkgreen: 25600, + darkgrey: 11119017, + darkkhaki: 12433259, + darkmagenta: 9109643, + darkolivegreen: 5597999, + darkorange: 16747520, + darkorchid: 10040012, + darkred: 9109504, + darksalmon: 15308410, + darkseagreen: 9419919, + darkslateblue: 4734347, + darkslategray: 3100495, + darkslategrey: 3100495, + darkturquoise: 52945, + darkviolet: 9699539, + deeppink: 16716947, + deepskyblue: 49151, + dimgray: 6908265, + dimgrey: 6908265, + dodgerblue: 2003199, + firebrick: 11674146, + floralwhite: 16775920, + forestgreen: 2263842, + fuchsia: 16711935, + gainsboro: 14474460, + ghostwhite: 16316671, + gold: 16766720, + goldenrod: 14329120, + gray: 8421504, + green: 32768, + greenyellow: 11403055, + grey: 8421504, + honeydew: 15794160, + hotpink: 16738740, + indianred: 13458524, + indigo: 4915330, + ivory: 16777200, + khaki: 15787660, + lavender: 15132410, + lavenderblush: 16773365, + lawngreen: 8190976, + lemonchiffon: 16775885, + lightblue: 11393254, + lightcoral: 15761536, + lightcyan: 14745599, + lightgoldenrodyellow: 16448210, + lightgray: 13882323, + lightgreen: 9498256, + lightgrey: 13882323, + lightpink: 16758465, + lightsalmon: 16752762, + lightseagreen: 2142890, + lightskyblue: 8900346, + lightslategray: 7833753, + lightslategrey: 7833753, + lightsteelblue: 11584734, + lightyellow: 16777184, + lime: 65280, + limegreen: 3329330, + linen: 16445670, + magenta: 16711935, + maroon: 8388608, + mediumaquamarine: 6737322, + mediumblue: 205, + mediumorchid: 12211667, + mediumpurple: 9662683, + mediumseagreen: 3978097, + mediumslateblue: 8087790, + mediumspringgreen: 64154, + mediumturquoise: 4772300, + mediumvioletred: 13047173, + midnightblue: 1644912, + mintcream: 16121850, + mistyrose: 16770273, + moccasin: 16770229, + navajowhite: 16768685, + navy: 128, + oldlace: 16643558, + olive: 8421376, + olivedrab: 7048739, + orange: 16753920, + orangered: 16729344, + orchid: 14315734, + palegoldenrod: 15657130, + palegreen: 10025880, + paleturquoise: 11529966, + palevioletred: 14381203, + papayawhip: 16773077, + peachpuff: 16767673, + peru: 13468991, + pink: 16761035, + plum: 14524637, + powderblue: 11591910, + purple: 8388736, + red: 16711680, + rosybrown: 12357519, + royalblue: 4286945, + saddlebrown: 9127187, + salmon: 16416882, + sandybrown: 16032864, + seagreen: 3050327, + seashell: 16774638, + sienna: 10506797, + silver: 12632256, + skyblue: 8900331, + slateblue: 6970061, + slategray: 7372944, + slategrey: 7372944, + snow: 16775930, + springgreen: 65407, + steelblue: 4620980, + tan: 13808780, + teal: 32896, + thistle: 14204888, + tomato: 16737095, + turquoise: 4251856, + violet: 15631086, + wheat: 16113331, + white: 16777215, + whitesmoke: 16119285, + yellow: 16776960, + yellowgreen: 10145074 + }); + d3_rgb_names.forEach(function(key, value) { + d3_rgb_names.set(key, d3_rgbNumber(value)); + }); + function d3_functor(v) { + return typeof v === "function" ? v : function() { + return v; + }; + } + d3.functor = d3_functor; + function d3_identity(d) { + return d; + } + d3.xhr = d3_xhrType(d3_identity); + function d3_xhrType(response) { + return function(url, mimeType, callback) { + if (arguments.length === 2 && typeof mimeType === "function") callback = mimeType, + mimeType = null; + return d3_xhr(url, mimeType, response, callback); + }; + } + function d3_xhr(url, mimeType, response, callback) { + var xhr = {}, dispatch = d3.dispatch("beforesend", "progress", "load", "error"), headers = {}, request = new XMLHttpRequest(), responseType = null; + if (d3_window.XDomainRequest && !("withCredentials" in request) && /^(http(s)?:)?\/\//.test(url)) request = new XDomainRequest(); + "onload" in request ? request.onload = request.onerror = respond : request.onreadystatechange = function() { + request.readyState > 3 && respond(); + }; + function respond() { + var status = request.status, result; + if (!status && request.responseText || status >= 200 && status < 300 || status === 304) { + try { + result = response.call(xhr, request); + } catch (e) { + dispatch.error.call(xhr, e); + return; + } + dispatch.load.call(xhr, result); + } else { + dispatch.error.call(xhr, request); + } + } + request.onprogress = function(event) { + var o = d3.event; + d3.event = event; + try { + dispatch.progress.call(xhr, request); + } finally { + d3.event = o; + } + }; + xhr.header = function(name, value) { + name = (name + "").toLowerCase(); + if (arguments.length < 2) return headers[name]; + if (value == null) delete headers[name]; else headers[name] = value + ""; + return xhr; + }; + xhr.mimeType = function(value) { + if (!arguments.length) return mimeType; + mimeType = value == null ? null : value + ""; + return xhr; + }; + xhr.responseType = function(value) { + if (!arguments.length) return responseType; + responseType = value; + return xhr; + }; + xhr.response = function(value) { + response = value; + return xhr; + }; + [ "get", "post" ].forEach(function(method) { + xhr[method] = function() { + return xhr.send.apply(xhr, [ method ].concat(d3_array(arguments))); + }; + }); + xhr.send = function(method, data, callback) { + if (arguments.length === 2 && typeof data === "function") callback = data, data = null; + request.open(method, url, true); + if (mimeType != null && !("accept" in headers)) headers["accept"] = mimeType + ",*/*"; + if (request.setRequestHeader) for (var name in headers) request.setRequestHeader(name, headers[name]); + if (mimeType != null && request.overrideMimeType) request.overrideMimeType(mimeType); + if (responseType != null) request.responseType = responseType; + if (callback != null) xhr.on("error", callback).on("load", function(request) { + callback(null, request); + }); + dispatch.beforesend.call(xhr, request); + request.send(data == null ? null : data); + return xhr; + }; + xhr.abort = function() { + request.abort(); + return xhr; + }; + d3.rebind(xhr, dispatch, "on"); + return callback == null ? xhr : xhr.get(d3_xhr_fixCallback(callback)); + } + function d3_xhr_fixCallback(callback) { + return callback.length === 1 ? function(error, request) { + callback(error == null ? request : null); + } : callback; + } + d3.dsv = function(delimiter, mimeType) { + var reFormat = new RegExp('["' + delimiter + "\n]"), delimiterCode = delimiter.charCodeAt(0); + function dsv(url, row, callback) { + if (arguments.length < 3) callback = row, row = null; + var xhr = d3.xhr(url, mimeType, callback); + xhr.row = function(_) { + return arguments.length ? xhr.response((row = _) == null ? response : typedResponse(_)) : row; + }; + return xhr.row(row); + } + function response(request) { + return dsv.parse(request.responseText); + } + function typedResponse(f) { + return function(request) { + return dsv.parse(request.responseText, f); + }; + } + dsv.parse = function(text, f) { + var o; + return dsv.parseRows(text, function(row, i) { + if (o) return o(row, i - 1); + var a = new Function("d", "return {" + row.map(function(name, i) { + return JSON.stringify(name) + ": d[" + i + "]"; + }).join(",") + "}"); + o = f ? function(row, i) { + return f(a(row), i); + } : a; + }); + }; + dsv.parseRows = function(text, f) { + var EOL = {}, EOF = {}, rows = [], N = text.length, I = 0, n = 0, t, eol; + function token() { + if (I >= N) return EOF; + if (eol) return eol = false, EOL; + var j = I; + if (text.charCodeAt(j) === 34) { + var i = j; + while (i++ < N) { + if (text.charCodeAt(i) === 34) { + if (text.charCodeAt(i + 1) !== 34) break; + ++i; + } + } + I = i + 2; + var c = text.charCodeAt(i + 1); + if (c === 13) { + eol = true; + if (text.charCodeAt(i + 2) === 10) ++I; + } else if (c === 10) { + eol = true; + } + return text.substring(j + 1, i).replace(/""/g, '"'); + } + while (I < N) { + var c = text.charCodeAt(I++), k = 1; + if (c === 10) eol = true; else if (c === 13) { + eol = true; + if (text.charCodeAt(I) === 10) ++I, ++k; + } else if (c !== delimiterCode) continue; + return text.substring(j, I - k); + } + return text.substring(j); + } + while ((t = token()) !== EOF) { + var a = []; + while (t !== EOL && t !== EOF) { + a.push(t); + t = token(); + } + if (f && !(a = f(a, n++))) continue; + rows.push(a); + } + return rows; + }; + dsv.format = function(rows) { + if (Array.isArray(rows[0])) return dsv.formatRows(rows); + var fieldSet = new d3_Set(), fields = []; + rows.forEach(function(row) { + for (var field in row) { + if (!fieldSet.has(field)) { + fields.push(fieldSet.add(field)); + } + } + }); + return [ fields.map(formatValue).join(delimiter) ].concat(rows.map(function(row) { + return fields.map(function(field) { + return formatValue(row[field]); + }).join(delimiter); + })).join("\n"); + }; + dsv.formatRows = function(rows) { + return rows.map(formatRow).join("\n"); + }; + function formatRow(row) { + return row.map(formatValue).join(delimiter); + } + function formatValue(text) { + return reFormat.test(text) ? '"' + text.replace(/\"/g, '""') + '"' : text; + } + return dsv; + }; + d3.csv = d3.dsv(",", "text/csv"); + d3.tsv = d3.dsv(" ", "text/tab-separated-values"); + var d3_timer_queueHead, d3_timer_queueTail, d3_timer_interval, d3_timer_timeout, d3_timer_active, d3_timer_frame = d3_window[d3_vendorSymbol(d3_window, "requestAnimationFrame")] || function(callback) { + setTimeout(callback, 17); + }; + d3.timer = function(callback, delay, then) { + var n = arguments.length; + if (n < 2) delay = 0; + if (n < 3) then = Date.now(); + var time = then + delay, timer = { + callback: callback, + time: time, + next: null + }; + if (d3_timer_queueTail) d3_timer_queueTail.next = timer; else d3_timer_queueHead = timer; + d3_timer_queueTail = timer; + if (!d3_timer_interval) { + d3_timer_timeout = clearTimeout(d3_timer_timeout); + d3_timer_interval = 1; + d3_timer_frame(d3_timer_step); + } + }; + function d3_timer_step() { + var now = d3_timer_mark(), delay = d3_timer_sweep() - now; + if (delay > 24) { + if (isFinite(delay)) { + clearTimeout(d3_timer_timeout); + d3_timer_timeout = setTimeout(d3_timer_step, delay); + } + d3_timer_interval = 0; + } else { + d3_timer_interval = 1; + d3_timer_frame(d3_timer_step); + } + } + d3.timer.flush = function() { + d3_timer_mark(); + d3_timer_sweep(); + }; + function d3_timer_replace(callback, delay, then) { + var n = arguments.length; + if (n < 2) delay = 0; + if (n < 3) then = Date.now(); + d3_timer_active.callback = callback; + d3_timer_active.time = then + delay; + } + function d3_timer_mark() { + var now = Date.now(); + d3_timer_active = d3_timer_queueHead; + while (d3_timer_active) { + if (now >= d3_timer_active.time) d3_timer_active.flush = d3_timer_active.callback(now - d3_timer_active.time); + d3_timer_active = d3_timer_active.next; + } + return now; + } + function d3_timer_sweep() { + var t0, t1 = d3_timer_queueHead, time = Infinity; + while (t1) { + if (t1.flush) { + t1 = t0 ? t0.next = t1.next : d3_timer_queueHead = t1.next; + } else { + if (t1.time < time) time = t1.time; + t1 = (t0 = t1).next; + } + } + d3_timer_queueTail = t0; + return time; + } + var d3_format_decimalPoint = ".", d3_format_thousandsSeparator = ",", d3_format_grouping = [ 3, 3 ], d3_format_currencySymbol = "$"; + var d3_formatPrefixes = [ "y", "z", "a", "f", "p", "n", "µ", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y" ].map(d3_formatPrefix); + d3.formatPrefix = function(value, precision) { + var i = 0; + if (value) { + if (value < 0) value *= -1; + if (precision) value = d3.round(value, d3_format_precision(value, precision)); + i = 1 + Math.floor(1e-12 + Math.log(value) / Math.LN10); + i = Math.max(-24, Math.min(24, Math.floor((i <= 0 ? i + 1 : i - 1) / 3) * 3)); + } + return d3_formatPrefixes[8 + i / 3]; + }; + function d3_formatPrefix(d, i) { + var k = Math.pow(10, Math.abs(8 - i) * 3); + return { + scale: i > 8 ? function(d) { + return d / k; + } : function(d) { + return d * k; + }, + symbol: d + }; + } + d3.round = function(x, n) { + return n ? Math.round(x * (n = Math.pow(10, n))) / n : Math.round(x); + }; + d3.format = function(specifier) { + var match = d3_format_re.exec(specifier), fill = match[1] || " ", align = match[2] || ">", sign = match[3] || "", symbol = match[4] || "", zfill = match[5], width = +match[6], comma = match[7], precision = match[8], type = match[9], scale = 1, suffix = "", integer = false; + if (precision) precision = +precision.substring(1); + if (zfill || fill === "0" && align === "=") { + zfill = fill = "0"; + align = "="; + if (comma) width -= Math.floor((width - 1) / 4); + } + switch (type) { + case "n": + comma = true; + type = "g"; + break; + + case "%": + scale = 100; + suffix = "%"; + type = "f"; + break; + + case "p": + scale = 100; + suffix = "%"; + type = "r"; + break; + + case "b": + case "o": + case "x": + case "X": + if (symbol === "#") symbol = "0" + type.toLowerCase(); + + case "c": + case "d": + integer = true; + precision = 0; + break; + + case "s": + scale = -1; + type = "r"; + break; + } + if (symbol === "#") symbol = ""; else if (symbol === "$") symbol = d3_format_currencySymbol; + if (type == "r" && !precision) type = "g"; + if (precision != null) { + if (type == "g") precision = Math.max(1, Math.min(21, precision)); else if (type == "e" || type == "f") precision = Math.max(0, Math.min(20, precision)); + } + type = d3_format_types.get(type) || d3_format_typeDefault; + var zcomma = zfill && comma; + return function(value) { + if (integer && value % 1) return ""; + var negative = value < 0 || value === 0 && 1 / value < 0 ? (value = -value, "-") : sign; + if (scale < 0) { + var prefix = d3.formatPrefix(value, precision); + value = prefix.scale(value); + suffix = prefix.symbol; + } else { + value *= scale; + } + value = type(value, precision); + var i = value.lastIndexOf("."), before = i < 0 ? value : value.substring(0, i), after = i < 0 ? "" : d3_format_decimalPoint + value.substring(i + 1); + if (!zfill && comma) before = d3_format_group(before); + var length = symbol.length + before.length + after.length + (zcomma ? 0 : negative.length), padding = length < width ? new Array(length = width - length + 1).join(fill) : ""; + if (zcomma) before = d3_format_group(padding + before); + negative += symbol; + value = before + after; + return (align === "<" ? negative + value + padding : align === ">" ? padding + negative + value : align === "^" ? padding.substring(0, length >>= 1) + negative + value + padding.substring(length) : negative + (zcomma ? value : padding + value)) + suffix; + }; + }; + var d3_format_re = /(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i; + var d3_format_types = d3.map({ + b: function(x) { + return x.toString(2); + }, + c: function(x) { + return String.fromCharCode(x); + }, + o: function(x) { + return x.toString(8); + }, + x: function(x) { + return x.toString(16); + }, + X: function(x) { + return x.toString(16).toUpperCase(); + }, + g: function(x, p) { + return x.toPrecision(p); + }, + e: function(x, p) { + return x.toExponential(p); + }, + f: function(x, p) { + return x.toFixed(p); + }, + r: function(x, p) { + return (x = d3.round(x, d3_format_precision(x, p))).toFixed(Math.max(0, Math.min(20, d3_format_precision(x * (1 + 1e-15), p)))); + } + }); + function d3_format_precision(x, p) { + return p - (x ? Math.ceil(Math.log(x) / Math.LN10) : 1); + } + function d3_format_typeDefault(x) { + return x + ""; + } + var d3_format_group = d3_identity; + if (d3_format_grouping) { + var d3_format_groupingLength = d3_format_grouping.length; + d3_format_group = function(value) { + var i = value.length, t = [], j = 0, g = d3_format_grouping[0]; + while (i > 0 && g > 0) { + t.push(value.substring(i -= g, i + g)); + g = d3_format_grouping[j = (j + 1) % d3_format_groupingLength]; + } + return t.reverse().join(d3_format_thousandsSeparator); + }; + } + d3.geo = {}; + function d3_adder() {} + d3_adder.prototype = { + s: 0, + t: 0, + add: function(y) { + d3_adderSum(y, this.t, d3_adderTemp); + d3_adderSum(d3_adderTemp.s, this.s, this); + if (this.s) this.t += d3_adderTemp.t; else this.s = d3_adderTemp.t; + }, + reset: function() { + this.s = this.t = 0; + }, + valueOf: function() { + return this.s; + } + }; + var d3_adderTemp = new d3_adder(); + function d3_adderSum(a, b, o) { + var x = o.s = a + b, bv = x - a, av = x - bv; + o.t = a - av + (b - bv); + } + d3.geo.stream = function(object, listener) { + if (object && d3_geo_streamObjectType.hasOwnProperty(object.type)) { + d3_geo_streamObjectType[object.type](object, listener); + } else { + d3_geo_streamGeometry(object, listener); + } + }; + function d3_geo_streamGeometry(geometry, listener) { + if (geometry && d3_geo_streamGeometryType.hasOwnProperty(geometry.type)) { + d3_geo_streamGeometryType[geometry.type](geometry, listener); + } + } + var d3_geo_streamObjectType = { + Feature: function(feature, listener) { + d3_geo_streamGeometry(feature.geometry, listener); + }, + FeatureCollection: function(object, listener) { + var features = object.features, i = -1, n = features.length; + while (++i < n) d3_geo_streamGeometry(features[i].geometry, listener); + } + }; + var d3_geo_streamGeometryType = { + Sphere: function(object, listener) { + listener.sphere(); + }, + Point: function(object, listener) { + object = object.coordinates; + listener.point(object[0], object[1], object[2]); + }, + MultiPoint: function(object, listener) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) object = coordinates[i], listener.point(object[0], object[1], object[2]); + }, + LineString: function(object, listener) { + d3_geo_streamLine(object.coordinates, listener, 0); + }, + MultiLineString: function(object, listener) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) d3_geo_streamLine(coordinates[i], listener, 0); + }, + Polygon: function(object, listener) { + d3_geo_streamPolygon(object.coordinates, listener); + }, + MultiPolygon: function(object, listener) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) d3_geo_streamPolygon(coordinates[i], listener); + }, + GeometryCollection: function(object, listener) { + var geometries = object.geometries, i = -1, n = geometries.length; + while (++i < n) d3_geo_streamGeometry(geometries[i], listener); + } + }; + function d3_geo_streamLine(coordinates, listener, closed) { + var i = -1, n = coordinates.length - closed, coordinate; + listener.lineStart(); + while (++i < n) coordinate = coordinates[i], listener.point(coordinate[0], coordinate[1], coordinate[2]); + listener.lineEnd(); + } + function d3_geo_streamPolygon(coordinates, listener) { + var i = -1, n = coordinates.length; + listener.polygonStart(); + while (++i < n) d3_geo_streamLine(coordinates[i], listener, 1); + listener.polygonEnd(); + } + d3.geo.area = function(object) { + d3_geo_areaSum = 0; + d3.geo.stream(object, d3_geo_area); + return d3_geo_areaSum; + }; + var d3_geo_areaSum, d3_geo_areaRingSum = new d3_adder(); + var d3_geo_area = { + sphere: function() { + d3_geo_areaSum += 4 * π; + }, + point: d3_noop, + lineStart: d3_noop, + lineEnd: d3_noop, + polygonStart: function() { + d3_geo_areaRingSum.reset(); + d3_geo_area.lineStart = d3_geo_areaRingStart; + }, + polygonEnd: function() { + var area = 2 * d3_geo_areaRingSum; + d3_geo_areaSum += area < 0 ? 4 * π + area : area; + d3_geo_area.lineStart = d3_geo_area.lineEnd = d3_geo_area.point = d3_noop; + } + }; + function d3_geo_areaRingStart() { + var λ00, φ00, λ0, cosφ0, sinφ0; + d3_geo_area.point = function(λ, φ) { + d3_geo_area.point = nextPoint; + λ0 = (λ00 = λ) * d3_radians, cosφ0 = Math.cos(φ = (φ00 = φ) * d3_radians / 2 + π / 4), + sinφ0 = Math.sin(φ); + }; + function nextPoint(λ, φ) { + λ *= d3_radians; + φ = φ * d3_radians / 2 + π / 4; + var dλ = λ - λ0, cosφ = Math.cos(φ), sinφ = Math.sin(φ), k = sinφ0 * sinφ, u = cosφ0 * cosφ + k * Math.cos(dλ), v = k * Math.sin(dλ); + d3_geo_areaRingSum.add(Math.atan2(v, u)); + λ0 = λ, cosφ0 = cosφ, sinφ0 = sinφ; + } + d3_geo_area.lineEnd = function() { + nextPoint(λ00, φ00); + }; + } + function d3_geo_cartesian(spherical) { + var λ = spherical[0], φ = spherical[1], cosφ = Math.cos(φ); + return [ cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ) ]; + } + function d3_geo_cartesianDot(a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; + } + function d3_geo_cartesianCross(a, b) { + return [ a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0] ]; + } + function d3_geo_cartesianAdd(a, b) { + a[0] += b[0]; + a[1] += b[1]; + a[2] += b[2]; + } + function d3_geo_cartesianScale(vector, k) { + return [ vector[0] * k, vector[1] * k, vector[2] * k ]; + } + function d3_geo_cartesianNormalize(d) { + var l = Math.sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]); + d[0] /= l; + d[1] /= l; + d[2] /= l; + } + function d3_geo_spherical(cartesian) { + return [ Math.atan2(cartesian[1], cartesian[0]), d3_asin(cartesian[2]) ]; + } + function d3_geo_sphericalEqual(a, b) { + return Math.abs(a[0] - b[0]) < ε && Math.abs(a[1] - b[1]) < ε; + } + d3.geo.bounds = function() { + var λ0, φ0, λ1, φ1, λ_, λ__, φ__, p0, dλSum, ranges, range; + var bound = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function() { + bound.point = ringPoint; + bound.lineStart = ringStart; + bound.lineEnd = ringEnd; + dλSum = 0; + d3_geo_area.polygonStart(); + }, + polygonEnd: function() { + d3_geo_area.polygonEnd(); + bound.point = point; + bound.lineStart = lineStart; + bound.lineEnd = lineEnd; + if (d3_geo_areaRingSum < 0) λ0 = -(λ1 = 180), φ0 = -(φ1 = 90); else if (dλSum > ε) φ1 = 90; else if (dλSum < -ε) φ0 = -90; + range[0] = λ0, range[1] = λ1; + } + }; + function point(λ, φ) { + ranges.push(range = [ λ0 = λ, λ1 = λ ]); + if (φ < φ0) φ0 = φ; + if (φ > φ1) φ1 = φ; + } + function linePoint(λ, φ) { + var p = d3_geo_cartesian([ λ * d3_radians, φ * d3_radians ]); + if (p0) { + var normal = d3_geo_cartesianCross(p0, p), equatorial = [ normal[1], -normal[0], 0 ], inflection = d3_geo_cartesianCross(equatorial, normal); + d3_geo_cartesianNormalize(inflection); + inflection = d3_geo_spherical(inflection); + var dλ = λ - λ_, s = dλ > 0 ? 1 : -1, λi = inflection[0] * d3_degrees * s, antimeridian = Math.abs(dλ) > 180; + if (antimeridian ^ (s * λ_ < λi && λi < s * λ)) { + var φi = inflection[1] * d3_degrees; + if (φi > φ1) φ1 = φi; + } else if (λi = (λi + 360) % 360 - 180, antimeridian ^ (s * λ_ < λi && λi < s * λ)) { + var φi = -inflection[1] * d3_degrees; + if (φi < φ0) φ0 = φi; + } else { + if (φ < φ0) φ0 = φ; + if (φ > φ1) φ1 = φ; + } + if (antimeridian) { + if (λ < λ_) { + if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ; + } else { + if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ; + } + } else { + if (λ1 >= λ0) { + if (λ < λ0) λ0 = λ; + if (λ > λ1) λ1 = λ; + } else { + if (λ > λ_) { + if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ; + } else { + if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ; + } + } + } + } else { + point(λ, φ); + } + p0 = p, λ_ = λ; + } + function lineStart() { + bound.point = linePoint; + } + function lineEnd() { + range[0] = λ0, range[1] = λ1; + bound.point = point; + p0 = null; + } + function ringPoint(λ, φ) { + if (p0) { + var dλ = λ - λ_; + dλSum += Math.abs(dλ) > 180 ? dλ + (dλ > 0 ? 360 : -360) : dλ; + } else λ__ = λ, φ__ = φ; + d3_geo_area.point(λ, φ); + linePoint(λ, φ); + } + function ringStart() { + d3_geo_area.lineStart(); + } + function ringEnd() { + ringPoint(λ__, φ__); + d3_geo_area.lineEnd(); + if (Math.abs(dλSum) > ε) λ0 = -(λ1 = 180); + range[0] = λ0, range[1] = λ1; + p0 = null; + } + function angle(λ0, λ1) { + return (λ1 -= λ0) < 0 ? λ1 + 360 : λ1; + } + function compareRanges(a, b) { + return a[0] - b[0]; + } + function withinRange(x, range) { + return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x; + } + return function(feature) { + φ1 = λ1 = -(λ0 = φ0 = Infinity); + ranges = []; + d3.geo.stream(feature, bound); + var n = ranges.length; + if (n) { + ranges.sort(compareRanges); + for (var i = 1, a = ranges[0], b, merged = [ a ]; i < n; ++i) { + b = ranges[i]; + if (withinRange(b[0], a) || withinRange(b[1], a)) { + if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1]; + if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0]; + } else { + merged.push(a = b); + } + } + var best = -Infinity, dλ; + for (var n = merged.length - 1, i = 0, a = merged[n], b; i <= n; a = b, ++i) { + b = merged[i]; + if ((dλ = angle(a[1], b[0])) > best) best = dλ, λ0 = b[0], λ1 = a[1]; + } + } + ranges = range = null; + return λ0 === Infinity || φ0 === Infinity ? [ [ NaN, NaN ], [ NaN, NaN ] ] : [ [ λ0, φ0 ], [ λ1, φ1 ] ]; + }; + }(); + d3.geo.centroid = function(object) { + d3_geo_centroidW0 = d3_geo_centroidW1 = d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0; + d3.geo.stream(object, d3_geo_centroid); + var x = d3_geo_centroidX2, y = d3_geo_centroidY2, z = d3_geo_centroidZ2, m = x * x + y * y + z * z; + if (m < ε2) { + x = d3_geo_centroidX1, y = d3_geo_centroidY1, z = d3_geo_centroidZ1; + if (d3_geo_centroidW1 < ε) x = d3_geo_centroidX0, y = d3_geo_centroidY0, z = d3_geo_centroidZ0; + m = x * x + y * y + z * z; + if (m < ε2) return [ NaN, NaN ]; + } + return [ Math.atan2(y, x) * d3_degrees, d3_asin(z / Math.sqrt(m)) * d3_degrees ]; + }; + var d3_geo_centroidW0, d3_geo_centroidW1, d3_geo_centroidX0, d3_geo_centroidY0, d3_geo_centroidZ0, d3_geo_centroidX1, d3_geo_centroidY1, d3_geo_centroidZ1, d3_geo_centroidX2, d3_geo_centroidY2, d3_geo_centroidZ2; + var d3_geo_centroid = { + sphere: d3_noop, + point: d3_geo_centroidPoint, + lineStart: d3_geo_centroidLineStart, + lineEnd: d3_geo_centroidLineEnd, + polygonStart: function() { + d3_geo_centroid.lineStart = d3_geo_centroidRingStart; + }, + polygonEnd: function() { + d3_geo_centroid.lineStart = d3_geo_centroidLineStart; + } + }; + function d3_geo_centroidPoint(λ, φ) { + λ *= d3_radians; + var cosφ = Math.cos(φ *= d3_radians); + d3_geo_centroidPointXYZ(cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ)); + } + function d3_geo_centroidPointXYZ(x, y, z) { + ++d3_geo_centroidW0; + d3_geo_centroidX0 += (x - d3_geo_centroidX0) / d3_geo_centroidW0; + d3_geo_centroidY0 += (y - d3_geo_centroidY0) / d3_geo_centroidW0; + d3_geo_centroidZ0 += (z - d3_geo_centroidZ0) / d3_geo_centroidW0; + } + function d3_geo_centroidLineStart() { + var x0, y0, z0; + d3_geo_centroid.point = function(λ, φ) { + λ *= d3_radians; + var cosφ = Math.cos(φ *= d3_radians); + x0 = cosφ * Math.cos(λ); + y0 = cosφ * Math.sin(λ); + z0 = Math.sin(φ); + d3_geo_centroid.point = nextPoint; + d3_geo_centroidPointXYZ(x0, y0, z0); + }; + function nextPoint(λ, φ) { + λ *= d3_radians; + var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), w = Math.atan2(Math.sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z); + d3_geo_centroidW1 += w; + d3_geo_centroidX1 += w * (x0 + (x0 = x)); + d3_geo_centroidY1 += w * (y0 + (y0 = y)); + d3_geo_centroidZ1 += w * (z0 + (z0 = z)); + d3_geo_centroidPointXYZ(x0, y0, z0); + } + } + function d3_geo_centroidLineEnd() { + d3_geo_centroid.point = d3_geo_centroidPoint; + } + function d3_geo_centroidRingStart() { + var λ00, φ00, x0, y0, z0; + d3_geo_centroid.point = function(λ, φ) { + λ00 = λ, φ00 = φ; + d3_geo_centroid.point = nextPoint; + λ *= d3_radians; + var cosφ = Math.cos(φ *= d3_radians); + x0 = cosφ * Math.cos(λ); + y0 = cosφ * Math.sin(λ); + z0 = Math.sin(φ); + d3_geo_centroidPointXYZ(x0, y0, z0); + }; + d3_geo_centroid.lineEnd = function() { + nextPoint(λ00, φ00); + d3_geo_centroid.lineEnd = d3_geo_centroidLineEnd; + d3_geo_centroid.point = d3_geo_centroidPoint; + }; + function nextPoint(λ, φ) { + λ *= d3_radians; + var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), cx = y0 * z - z0 * y, cy = z0 * x - x0 * z, cz = x0 * y - y0 * x, m = Math.sqrt(cx * cx + cy * cy + cz * cz), u = x0 * x + y0 * y + z0 * z, v = m && -d3_acos(u) / m, w = Math.atan2(m, u); + d3_geo_centroidX2 += v * cx; + d3_geo_centroidY2 += v * cy; + d3_geo_centroidZ2 += v * cz; + d3_geo_centroidW1 += w; + d3_geo_centroidX1 += w * (x0 + (x0 = x)); + d3_geo_centroidY1 += w * (y0 + (y0 = y)); + d3_geo_centroidZ1 += w * (z0 + (z0 = z)); + d3_geo_centroidPointXYZ(x0, y0, z0); + } + } + function d3_true() { + return true; + } + function d3_geo_clipPolygon(segments, compare, inside, interpolate, listener) { + var subject = [], clip = []; + segments.forEach(function(segment) { + if ((n = segment.length - 1) <= 0) return; + var n, p0 = segment[0], p1 = segment[n]; + if (d3_geo_sphericalEqual(p0, p1)) { + listener.lineStart(); + for (var i = 0; i < n; ++i) listener.point((p0 = segment[i])[0], p0[1]); + listener.lineEnd(); + return; + } + var a = { + point: p0, + points: segment, + other: null, + visited: false, + entry: true, + subject: true + }, b = { + point: p0, + points: [ p0 ], + other: a, + visited: false, + entry: false, + subject: false + }; + a.other = b; + subject.push(a); + clip.push(b); + a = { + point: p1, + points: [ p1 ], + other: null, + visited: false, + entry: false, + subject: true + }; + b = { + point: p1, + points: [ p1 ], + other: a, + visited: false, + entry: true, + subject: false + }; + a.other = b; + subject.push(a); + clip.push(b); + }); + clip.sort(compare); + d3_geo_clipPolygonLinkCircular(subject); + d3_geo_clipPolygonLinkCircular(clip); + if (!subject.length) return; + if (inside) for (var i = 1, e = !inside(clip[0].point), n = clip.length; i < n; ++i) { + clip[i].entry = e = !e; + } + var start = subject[0], current, points, point; + while (1) { + current = start; + while (current.visited) if ((current = current.next) === start) return; + points = current.points; + listener.lineStart(); + do { + current.visited = current.other.visited = true; + if (current.entry) { + if (current.subject) { + for (var i = 0; i < points.length; i++) listener.point((point = points[i])[0], point[1]); + } else { + interpolate(current.point, current.next.point, 1, listener); + } + current = current.next; + } else { + if (current.subject) { + points = current.prev.points; + for (var i = points.length; --i >= 0; ) listener.point((point = points[i])[0], point[1]); + } else { + interpolate(current.point, current.prev.point, -1, listener); + } + current = current.prev; + } + current = current.other; + points = current.points; + } while (!current.visited); + listener.lineEnd(); + } + } + function d3_geo_clipPolygonLinkCircular(array) { + if (!(n = array.length)) return; + var n, i = 0, a = array[0], b; + while (++i < n) { + a.next = b = array[i]; + b.prev = a; + a = b; + } + a.next = b = array[0]; + b.prev = a; + } + function d3_geo_clip(pointVisible, clipLine, interpolate, polygonContains) { + return function(listener) { + var line = clipLine(listener); + var clip = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function() { + clip.point = pointRing; + clip.lineStart = ringStart; + clip.lineEnd = ringEnd; + segments = []; + polygon = []; + listener.polygonStart(); + }, + polygonEnd: function() { + clip.point = point; + clip.lineStart = lineStart; + clip.lineEnd = lineEnd; + segments = d3.merge(segments); + if (segments.length) { + d3_geo_clipPolygon(segments, d3_geo_clipSort, null, interpolate, listener); + } else if (polygonContains(polygon)) { + listener.lineStart(); + interpolate(null, null, 1, listener); + listener.lineEnd(); + } + listener.polygonEnd(); + segments = polygon = null; + }, + sphere: function() { + listener.polygonStart(); + listener.lineStart(); + interpolate(null, null, 1, listener); + listener.lineEnd(); + listener.polygonEnd(); + } + }; + function point(λ, φ) { + if (pointVisible(λ, φ)) listener.point(λ, φ); + } + function pointLine(λ, φ) { + line.point(λ, φ); + } + function lineStart() { + clip.point = pointLine; + line.lineStart(); + } + function lineEnd() { + clip.point = point; + line.lineEnd(); + } + var segments; + var buffer = d3_geo_clipBufferListener(), ringListener = clipLine(buffer), polygon, ring; + function pointRing(λ, φ) { + ringListener.point(λ, φ); + ring.push([ λ, φ ]); + } + function ringStart() { + ringListener.lineStart(); + ring = []; + } + function ringEnd() { + pointRing(ring[0][0], ring[0][1]); + ringListener.lineEnd(); + var clean = ringListener.clean(), ringSegments = buffer.buffer(), segment, n = ringSegments.length; + ring.pop(); + polygon.push(ring); + ring = null; + if (!n) return; + if (clean & 1) { + segment = ringSegments[0]; + var n = segment.length - 1, i = -1, point; + listener.lineStart(); + while (++i < n) listener.point((point = segment[i])[0], point[1]); + listener.lineEnd(); + return; + } + if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift())); + segments.push(ringSegments.filter(d3_geo_clipSegmentLength1)); + } + return clip; + }; + } + function d3_geo_clipSegmentLength1(segment) { + return segment.length > 1; + } + function d3_geo_clipBufferListener() { + var lines = [], line; + return { + lineStart: function() { + lines.push(line = []); + }, + point: function(λ, φ) { + line.push([ λ, φ ]); + }, + lineEnd: d3_noop, + buffer: function() { + var buffer = lines; + lines = []; + line = null; + return buffer; + }, + rejoin: function() { + if (lines.length > 1) lines.push(lines.pop().concat(lines.shift())); + } + }; + } + function d3_geo_clipSort(a, b) { + return ((a = a.point)[0] < 0 ? a[1] - π / 2 - ε : π / 2 - a[1]) - ((b = b.point)[0] < 0 ? b[1] - π / 2 - ε : π / 2 - b[1]); + } + function d3_geo_pointInPolygon(point, polygon) { + var meridian = point[0], parallel = point[1], meridianNormal = [ Math.sin(meridian), -Math.cos(meridian), 0 ], polarAngle = 0, polar = false, southPole = false, winding = 0; + d3_geo_areaRingSum.reset(); + for (var i = 0, n = polygon.length; i < n; ++i) { + var ring = polygon[i], m = ring.length; + if (!m) continue; + var point0 = ring[0], λ0 = point0[0], φ0 = point0[1] / 2 + π / 4, sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), j = 1; + while (true) { + if (j === m) j = 0; + point = ring[j]; + var λ = point[0], φ = point[1] / 2 + π / 4, sinφ = Math.sin(φ), cosφ = Math.cos(φ), dλ = λ - λ0, antimeridian = Math.abs(dλ) > π, k = sinφ0 * sinφ; + d3_geo_areaRingSum.add(Math.atan2(k * Math.sin(dλ), cosφ0 * cosφ + k * Math.cos(dλ))); + if (Math.abs(φ) < ε) southPole = true; + polarAngle += antimeridian ? dλ + (dλ >= 0 ? 2 : -2) * π : dλ; + if (antimeridian ^ λ0 >= meridian ^ λ >= meridian) { + var arc = d3_geo_cartesianCross(d3_geo_cartesian(point0), d3_geo_cartesian(point)); + d3_geo_cartesianNormalize(arc); + var intersection = d3_geo_cartesianCross(meridianNormal, arc); + d3_geo_cartesianNormalize(intersection); + var φarc = (antimeridian ^ dλ >= 0 ? -1 : 1) * d3_asin(intersection[2]); + if (parallel > φarc) { + winding += antimeridian ^ dλ >= 0 ? 1 : -1; + } + } + if (!j++) break; + λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ, point0 = point; + } + if (Math.abs(polarAngle) > ε) polar = true; + } + return (!southPole && !polar && d3_geo_areaRingSum < 0 || polarAngle < -ε) ^ winding & 1; + } + var d3_geo_clipAntimeridian = d3_geo_clip(d3_true, d3_geo_clipAntimeridianLine, d3_geo_clipAntimeridianInterpolate, d3_geo_clipAntimeridianPolygonContains); + function d3_geo_clipAntimeridianLine(listener) { + var λ0 = NaN, φ0 = NaN, sλ0 = NaN, clean; + return { + lineStart: function() { + listener.lineStart(); + clean = 1; + }, + point: function(λ1, φ1) { + var sλ1 = λ1 > 0 ? π : -π, dλ = Math.abs(λ1 - λ0); + if (Math.abs(dλ - π) < ε) { + listener.point(λ0, φ0 = (φ0 + φ1) / 2 > 0 ? π / 2 : -π / 2); + listener.point(sλ0, φ0); + listener.lineEnd(); + listener.lineStart(); + listener.point(sλ1, φ0); + listener.point(λ1, φ0); + clean = 0; + } else if (sλ0 !== sλ1 && dλ >= π) { + if (Math.abs(λ0 - sλ0) < ε) λ0 -= sλ0 * ε; + if (Math.abs(λ1 - sλ1) < ε) λ1 -= sλ1 * ε; + φ0 = d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1); + listener.point(sλ0, φ0); + listener.lineEnd(); + listener.lineStart(); + listener.point(sλ1, φ0); + clean = 0; + } + listener.point(λ0 = λ1, φ0 = φ1); + sλ0 = sλ1; + }, + lineEnd: function() { + listener.lineEnd(); + λ0 = φ0 = NaN; + }, + clean: function() { + return 2 - clean; + } + }; + } + function d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1) { + var cosφ0, cosφ1, sinλ0_λ1 = Math.sin(λ0 - λ1); + return Math.abs(sinλ0_λ1) > ε ? Math.atan((Math.sin(φ0) * (cosφ1 = Math.cos(φ1)) * Math.sin(λ1) - Math.sin(φ1) * (cosφ0 = Math.cos(φ0)) * Math.sin(λ0)) / (cosφ0 * cosφ1 * sinλ0_λ1)) : (φ0 + φ1) / 2; + } + function d3_geo_clipAntimeridianInterpolate(from, to, direction, listener) { + var φ; + if (from == null) { + φ = direction * π / 2; + listener.point(-π, φ); + listener.point(0, φ); + listener.point(π, φ); + listener.point(π, 0); + listener.point(π, -φ); + listener.point(0, -φ); + listener.point(-π, -φ); + listener.point(-π, 0); + listener.point(-π, φ); + } else if (Math.abs(from[0] - to[0]) > ε) { + var s = (from[0] < to[0] ? 1 : -1) * π; + φ = direction * s / 2; + listener.point(-s, φ); + listener.point(0, φ); + listener.point(s, φ); + } else { + listener.point(to[0], to[1]); + } + } + var d3_geo_clipAntimeridianPoint = [ -π, 0 ]; + function d3_geo_clipAntimeridianPolygonContains(polygon) { + return d3_geo_pointInPolygon(d3_geo_clipAntimeridianPoint, polygon); + } + function d3_geo_clipCircle(radius) { + var cr = Math.cos(radius), smallRadius = cr > 0, point = [ radius, 0 ], notHemisphere = Math.abs(cr) > ε, interpolate = d3_geo_circleInterpolate(radius, 6 * d3_radians); + return d3_geo_clip(visible, clipLine, interpolate, polygonContains); + function visible(λ, φ) { + return Math.cos(λ) * Math.cos(φ) > cr; + } + function clipLine(listener) { + var point0, c0, v0, v00, clean; + return { + lineStart: function() { + v00 = v0 = false; + clean = 1; + }, + point: function(λ, φ) { + var point1 = [ λ, φ ], point2, v = visible(λ, φ), c = smallRadius ? v ? 0 : code(λ, φ) : v ? code(λ + (λ < 0 ? π : -π), φ) : 0; + if (!point0 && (v00 = v0 = v)) listener.lineStart(); + if (v !== v0) { + point2 = intersect(point0, point1); + if (d3_geo_sphericalEqual(point0, point2) || d3_geo_sphericalEqual(point1, point2)) { + point1[0] += ε; + point1[1] += ε; + v = visible(point1[0], point1[1]); + } + } + if (v !== v0) { + clean = 0; + if (v) { + listener.lineStart(); + point2 = intersect(point1, point0); + listener.point(point2[0], point2[1]); + } else { + point2 = intersect(point0, point1); + listener.point(point2[0], point2[1]); + listener.lineEnd(); + } + point0 = point2; + } else if (notHemisphere && point0 && smallRadius ^ v) { + var t; + if (!(c & c0) && (t = intersect(point1, point0, true))) { + clean = 0; + if (smallRadius) { + listener.lineStart(); + listener.point(t[0][0], t[0][1]); + listener.point(t[1][0], t[1][1]); + listener.lineEnd(); + } else { + listener.point(t[1][0], t[1][1]); + listener.lineEnd(); + listener.lineStart(); + listener.point(t[0][0], t[0][1]); + } + } + } + if (v && (!point0 || !d3_geo_sphericalEqual(point0, point1))) { + listener.point(point1[0], point1[1]); + } + point0 = point1, v0 = v, c0 = c; + }, + lineEnd: function() { + if (v0) listener.lineEnd(); + point0 = null; + }, + clean: function() { + return clean | (v00 && v0) << 1; + } + }; + } + function intersect(a, b, two) { + var pa = d3_geo_cartesian(a), pb = d3_geo_cartesian(b); + var n1 = [ 1, 0, 0 ], n2 = d3_geo_cartesianCross(pa, pb), n2n2 = d3_geo_cartesianDot(n2, n2), n1n2 = n2[0], determinant = n2n2 - n1n2 * n1n2; + if (!determinant) return !two && a; + var c1 = cr * n2n2 / determinant, c2 = -cr * n1n2 / determinant, n1xn2 = d3_geo_cartesianCross(n1, n2), A = d3_geo_cartesianScale(n1, c1), B = d3_geo_cartesianScale(n2, c2); + d3_geo_cartesianAdd(A, B); + var u = n1xn2, w = d3_geo_cartesianDot(A, u), uu = d3_geo_cartesianDot(u, u), t2 = w * w - uu * (d3_geo_cartesianDot(A, A) - 1); + if (t2 < 0) return; + var t = Math.sqrt(t2), q = d3_geo_cartesianScale(u, (-w - t) / uu); + d3_geo_cartesianAdd(q, A); + q = d3_geo_spherical(q); + if (!two) return q; + var λ0 = a[0], λ1 = b[0], φ0 = a[1], φ1 = b[1], z; + if (λ1 < λ0) z = λ0, λ0 = λ1, λ1 = z; + var δλ = λ1 - λ0, polar = Math.abs(δλ - π) < ε, meridian = polar || δλ < ε; + if (!polar && φ1 < φ0) z = φ0, φ0 = φ1, φ1 = z; + if (meridian ? polar ? φ0 + φ1 > 0 ^ q[1] < (Math.abs(q[0] - λ0) < ε ? φ0 : φ1) : φ0 <= q[1] && q[1] <= φ1 : δλ > π ^ (λ0 <= q[0] && q[0] <= λ1)) { + var q1 = d3_geo_cartesianScale(u, (-w + t) / uu); + d3_geo_cartesianAdd(q1, A); + return [ q, d3_geo_spherical(q1) ]; + } + } + function code(λ, φ) { + var r = smallRadius ? radius : π - radius, code = 0; + if (λ < -r) code |= 1; else if (λ > r) code |= 2; + if (φ < -r) code |= 4; else if (φ > r) code |= 8; + return code; + } + function polygonContains(polygon) { + return d3_geo_pointInPolygon(point, polygon); + } + } + var d3_geo_clipExtentMAX = 1e9; + d3.geo.clipExtent = function() { + var x0, y0, x1, y1, stream, clip, clipExtent = { + stream: function(output) { + if (stream) stream.valid = false; + stream = clip(output); + stream.valid = true; + return stream; + }, + extent: function(_) { + if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ]; + clip = d3_geo_clipExtent(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]); + if (stream) stream.valid = false, stream = null; + return clipExtent; + } + }; + return clipExtent.extent([ [ 0, 0 ], [ 960, 500 ] ]); + }; + function d3_geo_clipExtent(x0, y0, x1, y1) { + return function(listener) { + var listener_ = listener, bufferListener = d3_geo_clipBufferListener(), segments, polygon, ring; + var clip = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function() { + listener = bufferListener; + segments = []; + polygon = []; + }, + polygonEnd: function() { + listener = listener_; + if ((segments = d3.merge(segments)).length) { + listener.polygonStart(); + d3_geo_clipPolygon(segments, compare, inside, interpolate, listener); + listener.polygonEnd(); + } else if (insidePolygon([ x0, y0 ])) { + listener.polygonStart(), listener.lineStart(); + interpolate(null, null, 1, listener); + listener.lineEnd(), listener.polygonEnd(); + } + segments = polygon = ring = null; + } + }; + function inside(point) { + var a = corner(point, -1), i = insidePolygon([ a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0 ]); + return i; + } + function insidePolygon(p) { + var wn = 0, n = polygon.length, y = p[1]; + for (var i = 0; i < n; ++i) { + for (var j = 1, v = polygon[i], m = v.length, a = v[0], b; j < m; ++j) { + b = v[j]; + if (a[1] <= y) { + if (b[1] > y && isLeft(a, b, p) > 0) ++wn; + } else { + if (b[1] <= y && isLeft(a, b, p) < 0) --wn; + } + a = b; + } + } + return wn !== 0; + } + function isLeft(a, b, c) { + return (b[0] - a[0]) * (c[1] - a[1]) - (c[0] - a[0]) * (b[1] - a[1]); + } + function interpolate(from, to, direction, listener) { + var a = 0, a1 = 0; + if (from == null || (a = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoints(from, to) < 0 ^ direction > 0) { + do { + listener.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0); + } while ((a = (a + direction + 4) % 4) !== a1); + } else { + listener.point(to[0], to[1]); + } + } + function visible(x, y) { + return x0 <= x && x <= x1 && y0 <= y && y <= y1; + } + function point(x, y) { + if (visible(x, y)) listener.point(x, y); + } + var x__, y__, v__, x_, y_, v_, first; + function lineStart() { + clip.point = linePoint; + if (polygon) polygon.push(ring = []); + first = true; + v_ = false; + x_ = y_ = NaN; + } + function lineEnd() { + if (segments) { + linePoint(x__, y__); + if (v__ && v_) bufferListener.rejoin(); + segments.push(bufferListener.buffer()); + } + clip.point = point; + if (v_) listener.lineEnd(); + } + function linePoint(x, y) { + x = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, x)); + y = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, y)); + var v = visible(x, y); + if (polygon) ring.push([ x, y ]); + if (first) { + x__ = x, y__ = y, v__ = v; + first = false; + if (v) { + listener.lineStart(); + listener.point(x, y); + } + } else { + if (v && v_) listener.point(x, y); else { + var a = [ x_, y_ ], b = [ x, y ]; + if (clipLine(a, b)) { + if (!v_) { + listener.lineStart(); + listener.point(a[0], a[1]); + } + listener.point(b[0], b[1]); + if (!v) listener.lineEnd(); + } else if (v) { + listener.lineStart(); + listener.point(x, y); + } + } + } + x_ = x, y_ = y, v_ = v; + } + return clip; + }; + function corner(p, direction) { + return Math.abs(p[0] - x0) < ε ? direction > 0 ? 0 : 3 : Math.abs(p[0] - x1) < ε ? direction > 0 ? 2 : 1 : Math.abs(p[1] - y0) < ε ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2; + } + function compare(a, b) { + return comparePoints(a.point, b.point); + } + function comparePoints(a, b) { + var ca = corner(a, 1), cb = corner(b, 1); + return ca !== cb ? ca - cb : ca === 0 ? b[1] - a[1] : ca === 1 ? a[0] - b[0] : ca === 2 ? a[1] - b[1] : b[0] - a[0]; + } + function clipLine(a, b) { + var dx = b[0] - a[0], dy = b[1] - a[1], t = [ 0, 1 ]; + if (Math.abs(dx) < ε && Math.abs(dy) < ε) return x0 <= a[0] && a[0] <= x1 && y0 <= a[1] && a[1] <= y1; + if (d3_geo_clipExtentT(x0 - a[0], dx, t) && d3_geo_clipExtentT(a[0] - x1, -dx, t) && d3_geo_clipExtentT(y0 - a[1], dy, t) && d3_geo_clipExtentT(a[1] - y1, -dy, t)) { + if (t[1] < 1) { + b[0] = a[0] + t[1] * dx; + b[1] = a[1] + t[1] * dy; + } + if (t[0] > 0) { + a[0] += t[0] * dx; + a[1] += t[0] * dy; + } + return true; + } + return false; + } + } + function d3_geo_clipExtentT(num, denominator, t) { + if (Math.abs(denominator) < ε) return num <= 0; + var u = num / denominator; + if (denominator > 0) { + if (u > t[1]) return false; + if (u > t[0]) t[0] = u; + } else { + if (u < t[0]) return false; + if (u < t[1]) t[1] = u; + } + return true; + } + function d3_geo_compose(a, b) { + function compose(x, y) { + return x = a(x, y), b(x[0], x[1]); + } + if (a.invert && b.invert) compose.invert = function(x, y) { + return x = b.invert(x, y), x && a.invert(x[0], x[1]); + }; + return compose; + } + function d3_geo_conic(projectAt) { + var φ0 = 0, φ1 = π / 3, m = d3_geo_projectionMutator(projectAt), p = m(φ0, φ1); + p.parallels = function(_) { + if (!arguments.length) return [ φ0 / π * 180, φ1 / π * 180 ]; + return m(φ0 = _[0] * π / 180, φ1 = _[1] * π / 180); + }; + return p; + } + function d3_geo_conicEqualArea(φ0, φ1) { + var sinφ0 = Math.sin(φ0), n = (sinφ0 + Math.sin(φ1)) / 2, C = 1 + sinφ0 * (2 * n - sinφ0), ρ0 = Math.sqrt(C) / n; + function forward(λ, φ) { + var ρ = Math.sqrt(C - 2 * n * Math.sin(φ)) / n; + return [ ρ * Math.sin(λ *= n), ρ0 - ρ * Math.cos(λ) ]; + } + forward.invert = function(x, y) { + var ρ0_y = ρ0 - y; + return [ Math.atan2(x, ρ0_y) / n, d3_asin((C - (x * x + ρ0_y * ρ0_y) * n * n) / (2 * n)) ]; + }; + return forward; + } + (d3.geo.conicEqualArea = function() { + return d3_geo_conic(d3_geo_conicEqualArea); + }).raw = d3_geo_conicEqualArea; + d3.geo.albers = function() { + return d3.geo.conicEqualArea().rotate([ 96, 0 ]).center([ -.6, 38.7 ]).parallels([ 29.5, 45.5 ]).scale(1070); + }; + d3.geo.albersUsa = function() { + var lower48 = d3.geo.albers(); + var alaska = d3.geo.conicEqualArea().rotate([ 154, 0 ]).center([ -2, 58.5 ]).parallels([ 55, 65 ]); + var hawaii = d3.geo.conicEqualArea().rotate([ 157, 0 ]).center([ -3, 19.9 ]).parallels([ 8, 18 ]); + var point, pointStream = { + point: function(x, y) { + point = [ x, y ]; + } + }, lower48Point, alaskaPoint, hawaiiPoint; + function albersUsa(coordinates) { + var x = coordinates[0], y = coordinates[1]; + point = null; + (lower48Point(x, y), point) || (alaskaPoint(x, y), point) || hawaiiPoint(x, y); + return point; + } + albersUsa.invert = function(coordinates) { + var k = lower48.scale(), t = lower48.translate(), x = (coordinates[0] - t[0]) / k, y = (coordinates[1] - t[1]) / k; + return (y >= .12 && y < .234 && x >= -.425 && x < -.214 ? alaska : y >= .166 && y < .234 && x >= -.214 && x < -.115 ? hawaii : lower48).invert(coordinates); + }; + albersUsa.stream = function(stream) { + var lower48Stream = lower48.stream(stream), alaskaStream = alaska.stream(stream), hawaiiStream = hawaii.stream(stream); + return { + point: function(x, y) { + lower48Stream.point(x, y); + alaskaStream.point(x, y); + hawaiiStream.point(x, y); + }, + sphere: function() { + lower48Stream.sphere(); + alaskaStream.sphere(); + hawaiiStream.sphere(); + }, + lineStart: function() { + lower48Stream.lineStart(); + alaskaStream.lineStart(); + hawaiiStream.lineStart(); + }, + lineEnd: function() { + lower48Stream.lineEnd(); + alaskaStream.lineEnd(); + hawaiiStream.lineEnd(); + }, + polygonStart: function() { + lower48Stream.polygonStart(); + alaskaStream.polygonStart(); + hawaiiStream.polygonStart(); + }, + polygonEnd: function() { + lower48Stream.polygonEnd(); + alaskaStream.polygonEnd(); + hawaiiStream.polygonEnd(); + } + }; + }; + albersUsa.precision = function(_) { + if (!arguments.length) return lower48.precision(); + lower48.precision(_); + alaska.precision(_); + hawaii.precision(_); + return albersUsa; + }; + albersUsa.scale = function(_) { + if (!arguments.length) return lower48.scale(); + lower48.scale(_); + alaska.scale(_ * .35); + hawaii.scale(_); + return albersUsa.translate(lower48.translate()); + }; + albersUsa.translate = function(_) { + if (!arguments.length) return lower48.translate(); + var k = lower48.scale(), x = +_[0], y = +_[1]; + lower48Point = lower48.translate(_).clipExtent([ [ x - .455 * k, y - .238 * k ], [ x + .455 * k, y + .238 * k ] ]).stream(pointStream).point; + alaskaPoint = alaska.translate([ x - .307 * k, y + .201 * k ]).clipExtent([ [ x - .425 * k + ε, y + .12 * k + ε ], [ x - .214 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point; + hawaiiPoint = hawaii.translate([ x - .205 * k, y + .212 * k ]).clipExtent([ [ x - .214 * k + ε, y + .166 * k + ε ], [ x - .115 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point; + return albersUsa; + }; + return albersUsa.scale(1070); + }; + var d3_geo_pathAreaSum, d3_geo_pathAreaPolygon, d3_geo_pathArea = { + point: d3_noop, + lineStart: d3_noop, + lineEnd: d3_noop, + polygonStart: function() { + d3_geo_pathAreaPolygon = 0; + d3_geo_pathArea.lineStart = d3_geo_pathAreaRingStart; + }, + polygonEnd: function() { + d3_geo_pathArea.lineStart = d3_geo_pathArea.lineEnd = d3_geo_pathArea.point = d3_noop; + d3_geo_pathAreaSum += Math.abs(d3_geo_pathAreaPolygon / 2); + } + }; + function d3_geo_pathAreaRingStart() { + var x00, y00, x0, y0; + d3_geo_pathArea.point = function(x, y) { + d3_geo_pathArea.point = nextPoint; + x00 = x0 = x, y00 = y0 = y; + }; + function nextPoint(x, y) { + d3_geo_pathAreaPolygon += y0 * x - x0 * y; + x0 = x, y0 = y; + } + d3_geo_pathArea.lineEnd = function() { + nextPoint(x00, y00); + }; + } + var d3_geo_pathBoundsX0, d3_geo_pathBoundsY0, d3_geo_pathBoundsX1, d3_geo_pathBoundsY1; + var d3_geo_pathBounds = { + point: d3_geo_pathBoundsPoint, + lineStart: d3_noop, + lineEnd: d3_noop, + polygonStart: d3_noop, + polygonEnd: d3_noop + }; + function d3_geo_pathBoundsPoint(x, y) { + if (x < d3_geo_pathBoundsX0) d3_geo_pathBoundsX0 = x; + if (x > d3_geo_pathBoundsX1) d3_geo_pathBoundsX1 = x; + if (y < d3_geo_pathBoundsY0) d3_geo_pathBoundsY0 = y; + if (y > d3_geo_pathBoundsY1) d3_geo_pathBoundsY1 = y; + } + function d3_geo_pathBuffer() { + var pointCircle = d3_geo_pathBufferCircle(4.5), buffer = []; + var stream = { + point: point, + lineStart: function() { + stream.point = pointLineStart; + }, + lineEnd: lineEnd, + polygonStart: function() { + stream.lineEnd = lineEndPolygon; + }, + polygonEnd: function() { + stream.lineEnd = lineEnd; + stream.point = point; + }, + pointRadius: function(_) { + pointCircle = d3_geo_pathBufferCircle(_); + return stream; + }, + result: function() { + if (buffer.length) { + var result = buffer.join(""); + buffer = []; + return result; + } + } + }; + function point(x, y) { + buffer.push("M", x, ",", y, pointCircle); + } + function pointLineStart(x, y) { + buffer.push("M", x, ",", y); + stream.point = pointLine; + } + function pointLine(x, y) { + buffer.push("L", x, ",", y); + } + function lineEnd() { + stream.point = point; + } + function lineEndPolygon() { + buffer.push("Z"); + } + return stream; + } + function d3_geo_pathBufferCircle(radius) { + return "m0," + radius + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius + "z"; + } + var d3_geo_pathCentroid = { + point: d3_geo_pathCentroidPoint, + lineStart: d3_geo_pathCentroidLineStart, + lineEnd: d3_geo_pathCentroidLineEnd, + polygonStart: function() { + d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidRingStart; + }, + polygonEnd: function() { + d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint; + d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidLineStart; + d3_geo_pathCentroid.lineEnd = d3_geo_pathCentroidLineEnd; + } + }; + function d3_geo_pathCentroidPoint(x, y) { + d3_geo_centroidX0 += x; + d3_geo_centroidY0 += y; + ++d3_geo_centroidZ0; + } + function d3_geo_pathCentroidLineStart() { + var x0, y0; + d3_geo_pathCentroid.point = function(x, y) { + d3_geo_pathCentroid.point = nextPoint; + d3_geo_pathCentroidPoint(x0 = x, y0 = y); + }; + function nextPoint(x, y) { + var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy); + d3_geo_centroidX1 += z * (x0 + x) / 2; + d3_geo_centroidY1 += z * (y0 + y) / 2; + d3_geo_centroidZ1 += z; + d3_geo_pathCentroidPoint(x0 = x, y0 = y); + } + } + function d3_geo_pathCentroidLineEnd() { + d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint; + } + function d3_geo_pathCentroidRingStart() { + var x00, y00, x0, y0; + d3_geo_pathCentroid.point = function(x, y) { + d3_geo_pathCentroid.point = nextPoint; + d3_geo_pathCentroidPoint(x00 = x0 = x, y00 = y0 = y); + }; + function nextPoint(x, y) { + var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy); + d3_geo_centroidX1 += z * (x0 + x) / 2; + d3_geo_centroidY1 += z * (y0 + y) / 2; + d3_geo_centroidZ1 += z; + z = y0 * x - x0 * y; + d3_geo_centroidX2 += z * (x0 + x); + d3_geo_centroidY2 += z * (y0 + y); + d3_geo_centroidZ2 += z * 3; + d3_geo_pathCentroidPoint(x0 = x, y0 = y); + } + d3_geo_pathCentroid.lineEnd = function() { + nextPoint(x00, y00); + }; + } + function d3_geo_pathContext(context) { + var pointRadius = 4.5; + var stream = { + point: point, + lineStart: function() { + stream.point = pointLineStart; + }, + lineEnd: lineEnd, + polygonStart: function() { + stream.lineEnd = lineEndPolygon; + }, + polygonEnd: function() { + stream.lineEnd = lineEnd; + stream.point = point; + }, + pointRadius: function(_) { + pointRadius = _; + return stream; + }, + result: d3_noop + }; + function point(x, y) { + context.moveTo(x, y); + context.arc(x, y, pointRadius, 0, 2 * π); + } + function pointLineStart(x, y) { + context.moveTo(x, y); + stream.point = pointLine; + } + function pointLine(x, y) { + context.lineTo(x, y); + } + function lineEnd() { + stream.point = point; + } + function lineEndPolygon() { + context.closePath(); + } + return stream; + } + function d3_geo_resample(project) { + var δ2 = .5, cosMinDistance = Math.cos(30 * d3_radians), maxDepth = 16; + function resample(stream) { + var λ00, φ00, x00, y00, a00, b00, c00, λ0, x0, y0, a0, b0, c0; + var resample = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function() { + stream.polygonStart(); + resample.lineStart = ringStart; + }, + polygonEnd: function() { + stream.polygonEnd(); + resample.lineStart = lineStart; + } + }; + function point(x, y) { + x = project(x, y); + stream.point(x[0], x[1]); + } + function lineStart() { + x0 = NaN; + resample.point = linePoint; + stream.lineStart(); + } + function linePoint(λ, φ) { + var c = d3_geo_cartesian([ λ, φ ]), p = project(λ, φ); + resampleLineTo(x0, y0, λ0, a0, b0, c0, x0 = p[0], y0 = p[1], λ0 = λ, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream); + stream.point(x0, y0); + } + function lineEnd() { + resample.point = point; + stream.lineEnd(); + } + function ringStart() { + lineStart(); + resample.point = ringPoint; + resample.lineEnd = ringEnd; + } + function ringPoint(λ, φ) { + linePoint(λ00 = λ, φ00 = φ), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0; + resample.point = linePoint; + } + function ringEnd() { + resampleLineTo(x0, y0, λ0, a0, b0, c0, x00, y00, λ00, a00, b00, c00, maxDepth, stream); + resample.lineEnd = lineEnd; + lineEnd(); + } + return resample; + } + function resampleLineTo(x0, y0, λ0, a0, b0, c0, x1, y1, λ1, a1, b1, c1, depth, stream) { + var dx = x1 - x0, dy = y1 - y0, d2 = dx * dx + dy * dy; + if (d2 > 4 * δ2 && depth--) { + var a = a0 + a1, b = b0 + b1, c = c0 + c1, m = Math.sqrt(a * a + b * b + c * c), φ2 = Math.asin(c /= m), λ2 = Math.abs(Math.abs(c) - 1) < ε ? (λ0 + λ1) / 2 : Math.atan2(b, a), p = project(λ2, φ2), x2 = p[0], y2 = p[1], dx2 = x2 - x0, dy2 = y2 - y0, dz = dy * dx2 - dx * dy2; + if (dz * dz / d2 > δ2 || Math.abs((dx * dx2 + dy * dy2) / d2 - .5) > .3 || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { + resampleLineTo(x0, y0, λ0, a0, b0, c0, x2, y2, λ2, a /= m, b /= m, c, depth, stream); + stream.point(x2, y2); + resampleLineTo(x2, y2, λ2, a, b, c, x1, y1, λ1, a1, b1, c1, depth, stream); + } + } + } + resample.precision = function(_) { + if (!arguments.length) return Math.sqrt(δ2); + maxDepth = (δ2 = _ * _) > 0 && 16; + return resample; + }; + return resample; + } + d3.geo.transform = function(methods) { + return { + stream: function(stream) { + var transform = new d3_geo_transform(stream); + for (var k in methods) transform[k] = methods[k]; + return transform; + } + }; + }; + function d3_geo_transform(stream) { + this.stream = stream; + } + d3_geo_transform.prototype = { + point: function(x, y) { + this.stream.point(x, y); + }, + sphere: function() { + this.stream.sphere(); + }, + lineStart: function() { + this.stream.lineStart(); + }, + lineEnd: function() { + this.stream.lineEnd(); + }, + polygonStart: function() { + this.stream.polygonStart(); + }, + polygonEnd: function() { + this.stream.polygonEnd(); + } + }; + d3.geo.path = function() { + var pointRadius = 4.5, projection, context, projectStream, contextStream, cacheStream; + function path(object) { + if (object) { + if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments)); + if (!cacheStream || !cacheStream.valid) cacheStream = projectStream(contextStream); + d3.geo.stream(object, cacheStream); + } + return contextStream.result(); + } + path.area = function(object) { + d3_geo_pathAreaSum = 0; + d3.geo.stream(object, projectStream(d3_geo_pathArea)); + return d3_geo_pathAreaSum; + }; + path.centroid = function(object) { + d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0; + d3.geo.stream(object, projectStream(d3_geo_pathCentroid)); + return d3_geo_centroidZ2 ? [ d3_geo_centroidX2 / d3_geo_centroidZ2, d3_geo_centroidY2 / d3_geo_centroidZ2 ] : d3_geo_centroidZ1 ? [ d3_geo_centroidX1 / d3_geo_centroidZ1, d3_geo_centroidY1 / d3_geo_centroidZ1 ] : d3_geo_centroidZ0 ? [ d3_geo_centroidX0 / d3_geo_centroidZ0, d3_geo_centroidY0 / d3_geo_centroidZ0 ] : [ NaN, NaN ]; + }; + path.bounds = function(object) { + d3_geo_pathBoundsX1 = d3_geo_pathBoundsY1 = -(d3_geo_pathBoundsX0 = d3_geo_pathBoundsY0 = Infinity); + d3.geo.stream(object, projectStream(d3_geo_pathBounds)); + return [ [ d3_geo_pathBoundsX0, d3_geo_pathBoundsY0 ], [ d3_geo_pathBoundsX1, d3_geo_pathBoundsY1 ] ]; + }; + path.projection = function(_) { + if (!arguments.length) return projection; + projectStream = (projection = _) ? _.stream || d3_geo_pathProjectStream(_) : d3_identity; + return reset(); + }; + path.context = function(_) { + if (!arguments.length) return context; + contextStream = (context = _) == null ? new d3_geo_pathBuffer() : new d3_geo_pathContext(_); + if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius); + return reset(); + }; + path.pointRadius = function(_) { + if (!arguments.length) return pointRadius; + pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_); + return path; + }; + function reset() { + cacheStream = null; + return path; + } + return path.projection(d3.geo.albersUsa()).context(null); + }; + function d3_geo_pathProjectStream(project) { + var resample = d3_geo_resample(function(x, y) { + return project([ x * d3_degrees, y * d3_degrees ]); + }); + return function(stream) { + var transform = new d3_geo_transform(stream = resample(stream)); + transform.point = function(x, y) { + stream.point(x * d3_radians, y * d3_radians); + }; + return transform; + }; + } + d3.geo.projection = d3_geo_projection; + d3.geo.projectionMutator = d3_geo_projectionMutator; + function d3_geo_projection(project) { + return d3_geo_projectionMutator(function() { + return project; + })(); + } + function d3_geo_projectionMutator(projectAt) { + var project, rotate, projectRotate, projectResample = d3_geo_resample(function(x, y) { + x = project(x, y); + return [ x[0] * k + δx, δy - x[1] * k ]; + }), k = 150, x = 480, y = 250, λ = 0, φ = 0, δλ = 0, δφ = 0, δγ = 0, δx, δy, preclip = d3_geo_clipAntimeridian, postclip = d3_identity, clipAngle = null, clipExtent = null, stream; + function projection(point) { + point = projectRotate(point[0] * d3_radians, point[1] * d3_radians); + return [ point[0] * k + δx, δy - point[1] * k ]; + } + function invert(point) { + point = projectRotate.invert((point[0] - δx) / k, (δy - point[1]) / k); + return point && [ point[0] * d3_degrees, point[1] * d3_degrees ]; + } + projection.stream = function(output) { + if (stream) stream.valid = false; + stream = d3_geo_projectionRadiansRotate(rotate, preclip(projectResample(postclip(output)))); + stream.valid = true; + return stream; + }; + projection.clipAngle = function(_) { + if (!arguments.length) return clipAngle; + preclip = _ == null ? (clipAngle = _, d3_geo_clipAntimeridian) : d3_geo_clipCircle((clipAngle = +_) * d3_radians); + return invalidate(); + }; + projection.clipExtent = function(_) { + if (!arguments.length) return clipExtent; + clipExtent = _; + postclip = _ ? d3_geo_clipExtent(_[0][0], _[0][1], _[1][0], _[1][1]) : d3_identity; + return invalidate(); + }; + projection.scale = function(_) { + if (!arguments.length) return k; + k = +_; + return reset(); + }; + projection.translate = function(_) { + if (!arguments.length) return [ x, y ]; + x = +_[0]; + y = +_[1]; + return reset(); + }; + projection.center = function(_) { + if (!arguments.length) return [ λ * d3_degrees, φ * d3_degrees ]; + λ = _[0] % 360 * d3_radians; + φ = _[1] % 360 * d3_radians; + return reset(); + }; + projection.rotate = function(_) { + if (!arguments.length) return [ δλ * d3_degrees, δφ * d3_degrees, δγ * d3_degrees ]; + δλ = _[0] % 360 * d3_radians; + δφ = _[1] % 360 * d3_radians; + δγ = _.length > 2 ? _[2] % 360 * d3_radians : 0; + return reset(); + }; + d3.rebind(projection, projectResample, "precision"); + function reset() { + projectRotate = d3_geo_compose(rotate = d3_geo_rotation(δλ, δφ, δγ), project); + var center = project(λ, φ); + δx = x - center[0] * k; + δy = y + center[1] * k; + return invalidate(); + } + function invalidate() { + if (stream) stream.valid = false, stream = null; + return projection; + } + return function() { + project = projectAt.apply(this, arguments); + projection.invert = project.invert && invert; + return reset(); + }; + } + function d3_geo_projectionRadiansRotate(rotate, stream) { + var transform = new d3_geo_transform(stream); + transform.point = function(x, y) { + y = rotate(x * d3_radians, y * d3_radians), x = y[0]; + stream.point(x > π ? x - 2 * π : x < -π ? x + 2 * π : x, y[1]); + }; + return transform; + } + function d3_geo_equirectangular(λ, φ) { + return [ λ, φ ]; + } + (d3.geo.equirectangular = function() { + return d3_geo_projection(d3_geo_equirectangular); + }).raw = d3_geo_equirectangular.invert = d3_geo_equirectangular; + d3.geo.rotation = function(rotate) { + rotate = d3_geo_rotation(rotate[0] % 360 * d3_radians, rotate[1] * d3_radians, rotate.length > 2 ? rotate[2] * d3_radians : 0); + function forward(coordinates) { + coordinates = rotate(coordinates[0] * d3_radians, coordinates[1] * d3_radians); + return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates; + } + forward.invert = function(coordinates) { + coordinates = rotate.invert(coordinates[0] * d3_radians, coordinates[1] * d3_radians); + return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates; + }; + return forward; + }; + function d3_geo_rotation(δλ, δφ, δγ) { + return δλ ? δφ || δγ ? d3_geo_compose(d3_geo_rotationλ(δλ), d3_geo_rotationφγ(δφ, δγ)) : d3_geo_rotationλ(δλ) : δφ || δγ ? d3_geo_rotationφγ(δφ, δγ) : d3_geo_equirectangular; + } + function d3_geo_forwardRotationλ(δλ) { + return function(λ, φ) { + return λ += δλ, [ λ > π ? λ - 2 * π : λ < -π ? λ + 2 * π : λ, φ ]; + }; + } + function d3_geo_rotationλ(δλ) { + var rotation = d3_geo_forwardRotationλ(δλ); + rotation.invert = d3_geo_forwardRotationλ(-δλ); + return rotation; + } + function d3_geo_rotationφγ(δφ, δγ) { + var cosδφ = Math.cos(δφ), sinδφ = Math.sin(δφ), cosδγ = Math.cos(δγ), sinδγ = Math.sin(δγ); + function rotation(λ, φ) { + var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδφ + x * sinδφ; + return [ Math.atan2(y * cosδγ - k * sinδγ, x * cosδφ - z * sinδφ), d3_asin(k * cosδγ + y * sinδγ) ]; + } + rotation.invert = function(λ, φ) { + var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδγ - y * sinδγ; + return [ Math.atan2(y * cosδγ + z * sinδγ, x * cosδφ + k * sinδφ), d3_asin(k * cosδφ - x * sinδφ) ]; + }; + return rotation; + } + d3.geo.circle = function() { + var origin = [ 0, 0 ], angle, precision = 6, interpolate; + function circle() { + var center = typeof origin === "function" ? origin.apply(this, arguments) : origin, rotate = d3_geo_rotation(-center[0] * d3_radians, -center[1] * d3_radians, 0).invert, ring = []; + interpolate(null, null, 1, { + point: function(x, y) { + ring.push(x = rotate(x, y)); + x[0] *= d3_degrees, x[1] *= d3_degrees; + } + }); + return { + type: "Polygon", + coordinates: [ ring ] + }; + } + circle.origin = function(x) { + if (!arguments.length) return origin; + origin = x; + return circle; + }; + circle.angle = function(x) { + if (!arguments.length) return angle; + interpolate = d3_geo_circleInterpolate((angle = +x) * d3_radians, precision * d3_radians); + return circle; + }; + circle.precision = function(_) { + if (!arguments.length) return precision; + interpolate = d3_geo_circleInterpolate(angle * d3_radians, (precision = +_) * d3_radians); + return circle; + }; + return circle.angle(90); + }; + function d3_geo_circleInterpolate(radius, precision) { + var cr = Math.cos(radius), sr = Math.sin(radius); + return function(from, to, direction, listener) { + var step = direction * precision; + if (from != null) { + from = d3_geo_circleAngle(cr, from); + to = d3_geo_circleAngle(cr, to); + if (direction > 0 ? from < to : from > to) from += direction * 2 * π; + } else { + from = radius + direction * 2 * π; + to = radius - .5 * step; + } + for (var point, t = from; direction > 0 ? t > to : t < to; t -= step) { + listener.point((point = d3_geo_spherical([ cr, -sr * Math.cos(t), -sr * Math.sin(t) ]))[0], point[1]); + } + }; + } + function d3_geo_circleAngle(cr, point) { + var a = d3_geo_cartesian(point); + a[0] -= cr; + d3_geo_cartesianNormalize(a); + var angle = d3_acos(-a[1]); + return ((-a[2] < 0 ? -angle : angle) + 2 * Math.PI - ε) % (2 * Math.PI); + } + d3.geo.distance = function(a, b) { + var Δλ = (b[0] - a[0]) * d3_radians, φ0 = a[1] * d3_radians, φ1 = b[1] * d3_radians, sinΔλ = Math.sin(Δλ), cosΔλ = Math.cos(Δλ), sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), sinφ1 = Math.sin(φ1), cosφ1 = Math.cos(φ1), t; + return Math.atan2(Math.sqrt((t = cosφ1 * sinΔλ) * t + (t = cosφ0 * sinφ1 - sinφ0 * cosφ1 * cosΔλ) * t), sinφ0 * sinφ1 + cosφ0 * cosφ1 * cosΔλ); + }; + d3.geo.graticule = function() { + var x1, x0, X1, X0, y1, y0, Y1, Y0, dx = 10, dy = dx, DX = 90, DY = 360, x, y, X, Y, precision = 2.5; + function graticule() { + return { + type: "MultiLineString", + coordinates: lines() + }; + } + function lines() { + return d3.range(Math.ceil(X0 / DX) * DX, X1, DX).map(X).concat(d3.range(Math.ceil(Y0 / DY) * DY, Y1, DY).map(Y)).concat(d3.range(Math.ceil(x0 / dx) * dx, x1, dx).filter(function(x) { + return Math.abs(x % DX) > ε; + }).map(x)).concat(d3.range(Math.ceil(y0 / dy) * dy, y1, dy).filter(function(y) { + return Math.abs(y % DY) > ε; + }).map(y)); + } + graticule.lines = function() { + return lines().map(function(coordinates) { + return { + type: "LineString", + coordinates: coordinates + }; + }); + }; + graticule.outline = function() { + return { + type: "Polygon", + coordinates: [ X(X0).concat(Y(Y1).slice(1), X(X1).reverse().slice(1), Y(Y0).reverse().slice(1)) ] + }; + }; + graticule.extent = function(_) { + if (!arguments.length) return graticule.minorExtent(); + return graticule.majorExtent(_).minorExtent(_); + }; + graticule.majorExtent = function(_) { + if (!arguments.length) return [ [ X0, Y0 ], [ X1, Y1 ] ]; + X0 = +_[0][0], X1 = +_[1][0]; + Y0 = +_[0][1], Y1 = +_[1][1]; + if (X0 > X1) _ = X0, X0 = X1, X1 = _; + if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _; + return graticule.precision(precision); + }; + graticule.minorExtent = function(_) { + if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ]; + x0 = +_[0][0], x1 = +_[1][0]; + y0 = +_[0][1], y1 = +_[1][1]; + if (x0 > x1) _ = x0, x0 = x1, x1 = _; + if (y0 > y1) _ = y0, y0 = y1, y1 = _; + return graticule.precision(precision); + }; + graticule.step = function(_) { + if (!arguments.length) return graticule.minorStep(); + return graticule.majorStep(_).minorStep(_); + }; + graticule.majorStep = function(_) { + if (!arguments.length) return [ DX, DY ]; + DX = +_[0], DY = +_[1]; + return graticule; + }; + graticule.minorStep = function(_) { + if (!arguments.length) return [ dx, dy ]; + dx = +_[0], dy = +_[1]; + return graticule; + }; + graticule.precision = function(_) { + if (!arguments.length) return precision; + precision = +_; + x = d3_geo_graticuleX(y0, y1, 90); + y = d3_geo_graticuleY(x0, x1, precision); + X = d3_geo_graticuleX(Y0, Y1, 90); + Y = d3_geo_graticuleY(X0, X1, precision); + return graticule; + }; + return graticule.majorExtent([ [ -180, -90 + ε ], [ 180, 90 - ε ] ]).minorExtent([ [ -180, -80 - ε ], [ 180, 80 + ε ] ]); + }; + function d3_geo_graticuleX(y0, y1, dy) { + var y = d3.range(y0, y1 - ε, dy).concat(y1); + return function(x) { + return y.map(function(y) { + return [ x, y ]; + }); + }; + } + function d3_geo_graticuleY(x0, x1, dx) { + var x = d3.range(x0, x1 - ε, dx).concat(x1); + return function(y) { + return x.map(function(x) { + return [ x, y ]; + }); + }; + } + function d3_source(d) { + return d.source; + } + function d3_target(d) { + return d.target; + } + d3.geo.greatArc = function() { + var source = d3_source, source_, target = d3_target, target_; + function greatArc() { + return { + type: "LineString", + coordinates: [ source_ || source.apply(this, arguments), target_ || target.apply(this, arguments) ] + }; + } + greatArc.distance = function() { + return d3.geo.distance(source_ || source.apply(this, arguments), target_ || target.apply(this, arguments)); + }; + greatArc.source = function(_) { + if (!arguments.length) return source; + source = _, source_ = typeof _ === "function" ? null : _; + return greatArc; + }; + greatArc.target = function(_) { + if (!arguments.length) return target; + target = _, target_ = typeof _ === "function" ? null : _; + return greatArc; + }; + greatArc.precision = function() { + return arguments.length ? greatArc : 0; + }; + return greatArc; + }; + d3.geo.interpolate = function(source, target) { + return d3_geo_interpolate(source[0] * d3_radians, source[1] * d3_radians, target[0] * d3_radians, target[1] * d3_radians); + }; + function d3_geo_interpolate(x0, y0, x1, y1) { + var cy0 = Math.cos(y0), sy0 = Math.sin(y0), cy1 = Math.cos(y1), sy1 = Math.sin(y1), kx0 = cy0 * Math.cos(x0), ky0 = cy0 * Math.sin(x0), kx1 = cy1 * Math.cos(x1), ky1 = cy1 * Math.sin(x1), d = 2 * Math.asin(Math.sqrt(d3_haversin(y1 - y0) + cy0 * cy1 * d3_haversin(x1 - x0))), k = 1 / Math.sin(d); + var interpolate = d ? function(t) { + var B = Math.sin(t *= d) * k, A = Math.sin(d - t) * k, x = A * kx0 + B * kx1, y = A * ky0 + B * ky1, z = A * sy0 + B * sy1; + return [ Math.atan2(y, x) * d3_degrees, Math.atan2(z, Math.sqrt(x * x + y * y)) * d3_degrees ]; + } : function() { + return [ x0 * d3_degrees, y0 * d3_degrees ]; + }; + interpolate.distance = d; + return interpolate; + } + d3.geo.length = function(object) { + d3_geo_lengthSum = 0; + d3.geo.stream(object, d3_geo_length); + return d3_geo_lengthSum; + }; + var d3_geo_lengthSum; + var d3_geo_length = { + sphere: d3_noop, + point: d3_noop, + lineStart: d3_geo_lengthLineStart, + lineEnd: d3_noop, + polygonStart: d3_noop, + polygonEnd: d3_noop + }; + function d3_geo_lengthLineStart() { + var λ0, sinφ0, cosφ0; + d3_geo_length.point = function(λ, φ) { + λ0 = λ * d3_radians, sinφ0 = Math.sin(φ *= d3_radians), cosφ0 = Math.cos(φ); + d3_geo_length.point = nextPoint; + }; + d3_geo_length.lineEnd = function() { + d3_geo_length.point = d3_geo_length.lineEnd = d3_noop; + }; + function nextPoint(λ, φ) { + var sinφ = Math.sin(φ *= d3_radians), cosφ = Math.cos(φ), t = Math.abs((λ *= d3_radians) - λ0), cosΔλ = Math.cos(t); + d3_geo_lengthSum += Math.atan2(Math.sqrt((t = cosφ * Math.sin(t)) * t + (t = cosφ0 * sinφ - sinφ0 * cosφ * cosΔλ) * t), sinφ0 * sinφ + cosφ0 * cosφ * cosΔλ); + λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ; + } + } + function d3_geo_azimuthal(scale, angle) { + function azimuthal(λ, φ) { + var cosλ = Math.cos(λ), cosφ = Math.cos(φ), k = scale(cosλ * cosφ); + return [ k * cosφ * Math.sin(λ), k * Math.sin(φ) ]; + } + azimuthal.invert = function(x, y) { + var ρ = Math.sqrt(x * x + y * y), c = angle(ρ), sinc = Math.sin(c), cosc = Math.cos(c); + return [ Math.atan2(x * sinc, ρ * cosc), Math.asin(ρ && y * sinc / ρ) ]; + }; + return azimuthal; + } + var d3_geo_azimuthalEqualArea = d3_geo_azimuthal(function(cosλcosφ) { + return Math.sqrt(2 / (1 + cosλcosφ)); + }, function(ρ) { + return 2 * Math.asin(ρ / 2); + }); + (d3.geo.azimuthalEqualArea = function() { + return d3_geo_projection(d3_geo_azimuthalEqualArea); + }).raw = d3_geo_azimuthalEqualArea; + var d3_geo_azimuthalEquidistant = d3_geo_azimuthal(function(cosλcosφ) { + var c = Math.acos(cosλcosφ); + return c && c / Math.sin(c); + }, d3_identity); + (d3.geo.azimuthalEquidistant = function() { + return d3_geo_projection(d3_geo_azimuthalEquidistant); + }).raw = d3_geo_azimuthalEquidistant; + function d3_geo_conicConformal(φ0, φ1) { + var cosφ0 = Math.cos(φ0), t = function(φ) { + return Math.tan(π / 4 + φ / 2); + }, n = φ0 === φ1 ? Math.sin(φ0) : Math.log(cosφ0 / Math.cos(φ1)) / Math.log(t(φ1) / t(φ0)), F = cosφ0 * Math.pow(t(φ0), n) / n; + if (!n) return d3_geo_mercator; + function forward(λ, φ) { + var ρ = Math.abs(Math.abs(φ) - π / 2) < ε ? 0 : F / Math.pow(t(φ), n); + return [ ρ * Math.sin(n * λ), F - ρ * Math.cos(n * λ) ]; + } + forward.invert = function(x, y) { + var ρ0_y = F - y, ρ = d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y); + return [ Math.atan2(x, ρ0_y) / n, 2 * Math.atan(Math.pow(F / ρ, 1 / n)) - π / 2 ]; + }; + return forward; + } + (d3.geo.conicConformal = function() { + return d3_geo_conic(d3_geo_conicConformal); + }).raw = d3_geo_conicConformal; + function d3_geo_conicEquidistant(φ0, φ1) { + var cosφ0 = Math.cos(φ0), n = φ0 === φ1 ? Math.sin(φ0) : (cosφ0 - Math.cos(φ1)) / (φ1 - φ0), G = cosφ0 / n + φ0; + if (Math.abs(n) < ε) return d3_geo_equirectangular; + function forward(λ, φ) { + var ρ = G - φ; + return [ ρ * Math.sin(n * λ), G - ρ * Math.cos(n * λ) ]; + } + forward.invert = function(x, y) { + var ρ0_y = G - y; + return [ Math.atan2(x, ρ0_y) / n, G - d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y) ]; + }; + return forward; + } + (d3.geo.conicEquidistant = function() { + return d3_geo_conic(d3_geo_conicEquidistant); + }).raw = d3_geo_conicEquidistant; + var d3_geo_gnomonic = d3_geo_azimuthal(function(cosλcosφ) { + return 1 / cosλcosφ; + }, Math.atan); + (d3.geo.gnomonic = function() { + return d3_geo_projection(d3_geo_gnomonic); + }).raw = d3_geo_gnomonic; + function d3_geo_mercator(λ, φ) { + return [ λ, Math.log(Math.tan(π / 4 + φ / 2)) ]; + } + d3_geo_mercator.invert = function(x, y) { + return [ x, 2 * Math.atan(Math.exp(y)) - π / 2 ]; + }; + function d3_geo_mercatorProjection(project) { + var m = d3_geo_projection(project), scale = m.scale, translate = m.translate, clipExtent = m.clipExtent, clipAuto; + m.scale = function() { + var v = scale.apply(m, arguments); + return v === m ? clipAuto ? m.clipExtent(null) : m : v; + }; + m.translate = function() { + var v = translate.apply(m, arguments); + return v === m ? clipAuto ? m.clipExtent(null) : m : v; + }; + m.clipExtent = function(_) { + var v = clipExtent.apply(m, arguments); + if (v === m) { + if (clipAuto = _ == null) { + var k = π * scale(), t = translate(); + clipExtent([ [ t[0] - k, t[1] - k ], [ t[0] + k, t[1] + k ] ]); + } + } else if (clipAuto) { + v = null; + } + return v; + }; + return m.clipExtent(null); + } + (d3.geo.mercator = function() { + return d3_geo_mercatorProjection(d3_geo_mercator); + }).raw = d3_geo_mercator; + var d3_geo_orthographic = d3_geo_azimuthal(function() { + return 1; + }, Math.asin); + (d3.geo.orthographic = function() { + return d3_geo_projection(d3_geo_orthographic); + }).raw = d3_geo_orthographic; + var d3_geo_stereographic = d3_geo_azimuthal(function(cosλcosφ) { + return 1 / (1 + cosλcosφ); + }, function(ρ) { + return 2 * Math.atan(ρ); + }); + (d3.geo.stereographic = function() { + return d3_geo_projection(d3_geo_stereographic); + }).raw = d3_geo_stereographic; + function d3_geo_transverseMercator(λ, φ) { + var B = Math.cos(φ) * Math.sin(λ); + return [ Math.log((1 + B) / (1 - B)) / 2, Math.atan2(Math.tan(φ), Math.cos(λ)) ]; + } + d3_geo_transverseMercator.invert = function(x, y) { + return [ Math.atan2(d3_sinh(x), Math.cos(y)), d3_asin(Math.sin(y) / d3_cosh(x)) ]; + }; + (d3.geo.transverseMercator = function() { + return d3_geo_mercatorProjection(d3_geo_transverseMercator); + }).raw = d3_geo_transverseMercator; + d3.geom = {}; + d3.svg = {}; + function d3_svg_line(projection) { + var x = d3_svg_lineX, y = d3_svg_lineY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, tension = .7; + function line(data) { + var segments = [], points = [], i = -1, n = data.length, d, fx = d3_functor(x), fy = d3_functor(y); + function segment() { + segments.push("M", interpolate(projection(points), tension)); + } + while (++i < n) { + if (defined.call(this, d = data[i], i)) { + points.push([ +fx.call(this, d, i), +fy.call(this, d, i) ]); + } else if (points.length) { + segment(); + points = []; + } + } + if (points.length) segment(); + return segments.length ? segments.join("") : null; + } + line.x = function(_) { + if (!arguments.length) return x; + x = _; + return line; + }; + line.y = function(_) { + if (!arguments.length) return y; + y = _; + return line; + }; + line.defined = function(_) { + if (!arguments.length) return defined; + defined = _; + return line; + }; + line.interpolate = function(_) { + if (!arguments.length) return interpolateKey; + if (typeof _ === "function") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key; + return line; + }; + line.tension = function(_) { + if (!arguments.length) return tension; + tension = _; + return line; + }; + return line; + } + d3.svg.line = function() { + return d3_svg_line(d3_identity); + }; + function d3_svg_lineX(d) { + return d[0]; + } + function d3_svg_lineY(d) { + return d[1]; + } + var d3_svg_lineInterpolators = d3.map({ + linear: d3_svg_lineLinear, + "linear-closed": d3_svg_lineLinearClosed, + step: d3_svg_lineStep, + "step-before": d3_svg_lineStepBefore, + "step-after": d3_svg_lineStepAfter, + basis: d3_svg_lineBasis, + "basis-open": d3_svg_lineBasisOpen, + "basis-closed": d3_svg_lineBasisClosed, + bundle: d3_svg_lineBundle, + cardinal: d3_svg_lineCardinal, + "cardinal-open": d3_svg_lineCardinalOpen, + "cardinal-closed": d3_svg_lineCardinalClosed, + monotone: d3_svg_lineMonotone + }); + d3_svg_lineInterpolators.forEach(function(key, value) { + value.key = key; + value.closed = /-closed$/.test(key); + }); + function d3_svg_lineLinear(points) { + return points.join("L"); + } + function d3_svg_lineLinearClosed(points) { + return d3_svg_lineLinear(points) + "Z"; + } + function d3_svg_lineStep(points) { + var i = 0, n = points.length, p = points[0], path = [ p[0], ",", p[1] ]; + while (++i < n) path.push("H", (p[0] + (p = points[i])[0]) / 2, "V", p[1]); + if (n > 1) path.push("H", p[0]); + return path.join(""); + } + function d3_svg_lineStepBefore(points) { + var i = 0, n = points.length, p = points[0], path = [ p[0], ",", p[1] ]; + while (++i < n) path.push("V", (p = points[i])[1], "H", p[0]); + return path.join(""); + } + function d3_svg_lineStepAfter(points) { + var i = 0, n = points.length, p = points[0], path = [ p[0], ",", p[1] ]; + while (++i < n) path.push("H", (p = points[i])[0], "V", p[1]); + return path.join(""); + } + function d3_svg_lineCardinalOpen(points, tension) { + return points.length < 4 ? d3_svg_lineLinear(points) : points[1] + d3_svg_lineHermite(points.slice(1, points.length - 1), d3_svg_lineCardinalTangents(points, tension)); + } + function d3_svg_lineCardinalClosed(points, tension) { + return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite((points.push(points[0]), + points), d3_svg_lineCardinalTangents([ points[points.length - 2] ].concat(points, [ points[1] ]), tension)); + } + function d3_svg_lineCardinal(points, tension) { + return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineCardinalTangents(points, tension)); + } + function d3_svg_lineHermite(points, tangents) { + if (tangents.length < 1 || points.length != tangents.length && points.length != tangents.length + 2) { + return d3_svg_lineLinear(points); + } + var quad = points.length != tangents.length, path = "", p0 = points[0], p = points[1], t0 = tangents[0], t = t0, pi = 1; + if (quad) { + path += "Q" + (p[0] - t0[0] * 2 / 3) + "," + (p[1] - t0[1] * 2 / 3) + "," + p[0] + "," + p[1]; + p0 = points[1]; + pi = 2; + } + if (tangents.length > 1) { + t = tangents[1]; + p = points[pi]; + pi++; + path += "C" + (p0[0] + t0[0]) + "," + (p0[1] + t0[1]) + "," + (p[0] - t[0]) + "," + (p[1] - t[1]) + "," + p[0] + "," + p[1]; + for (var i = 2; i < tangents.length; i++, pi++) { + p = points[pi]; + t = tangents[i]; + path += "S" + (p[0] - t[0]) + "," + (p[1] - t[1]) + "," + p[0] + "," + p[1]; + } + } + if (quad) { + var lp = points[pi]; + path += "Q" + (p[0] + t[0] * 2 / 3) + "," + (p[1] + t[1] * 2 / 3) + "," + lp[0] + "," + lp[1]; + } + return path; + } + function d3_svg_lineCardinalTangents(points, tension) { + var tangents = [], a = (1 - tension) / 2, p0, p1 = points[0], p2 = points[1], i = 1, n = points.length; + while (++i < n) { + p0 = p1; + p1 = p2; + p2 = points[i]; + tangents.push([ a * (p2[0] - p0[0]), a * (p2[1] - p0[1]) ]); + } + return tangents; + } + function d3_svg_lineBasis(points) { + if (points.length < 3) return d3_svg_lineLinear(points); + var i = 1, n = points.length, pi = points[0], x0 = pi[0], y0 = pi[1], px = [ x0, x0, x0, (pi = points[1])[0] ], py = [ y0, y0, y0, pi[1] ], path = [ x0, ",", y0, "L", d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ]; + points.push(points[n - 1]); + while (++i <= n) { + pi = points[i]; + px.shift(); + px.push(pi[0]); + py.shift(); + py.push(pi[1]); + d3_svg_lineBasisBezier(path, px, py); + } + points.pop(); + path.push("L", pi); + return path.join(""); + } + function d3_svg_lineBasisOpen(points) { + if (points.length < 4) return d3_svg_lineLinear(points); + var path = [], i = -1, n = points.length, pi, px = [ 0 ], py = [ 0 ]; + while (++i < 3) { + pi = points[i]; + px.push(pi[0]); + py.push(pi[1]); + } + path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px) + "," + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py)); + --i; + while (++i < n) { + pi = points[i]; + px.shift(); + px.push(pi[0]); + py.shift(); + py.push(pi[1]); + d3_svg_lineBasisBezier(path, px, py); + } + return path.join(""); + } + function d3_svg_lineBasisClosed(points) { + var path, i = -1, n = points.length, m = n + 4, pi, px = [], py = []; + while (++i < 4) { + pi = points[i % n]; + px.push(pi[0]); + py.push(pi[1]); + } + path = [ d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ]; + --i; + while (++i < m) { + pi = points[i % n]; + px.shift(); + px.push(pi[0]); + py.shift(); + py.push(pi[1]); + d3_svg_lineBasisBezier(path, px, py); + } + return path.join(""); + } + function d3_svg_lineBundle(points, tension) { + var n = points.length - 1; + if (n) { + var x0 = points[0][0], y0 = points[0][1], dx = points[n][0] - x0, dy = points[n][1] - y0, i = -1, p, t; + while (++i <= n) { + p = points[i]; + t = i / n; + p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx); + p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy); + } + } + return d3_svg_lineBasis(points); + } + function d3_svg_lineDot4(a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]; + } + var d3_svg_lineBasisBezier1 = [ 0, 2 / 3, 1 / 3, 0 ], d3_svg_lineBasisBezier2 = [ 0, 1 / 3, 2 / 3, 0 ], d3_svg_lineBasisBezier3 = [ 0, 1 / 6, 2 / 3, 1 / 6 ]; + function d3_svg_lineBasisBezier(path, x, y) { + path.push("C", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y)); + } + function d3_svg_lineSlope(p0, p1) { + return (p1[1] - p0[1]) / (p1[0] - p0[0]); + } + function d3_svg_lineFiniteDifferences(points) { + var i = 0, j = points.length - 1, m = [], p0 = points[0], p1 = points[1], d = m[0] = d3_svg_lineSlope(p0, p1); + while (++i < j) { + m[i] = (d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1]))) / 2; + } + m[i] = d; + return m; + } + function d3_svg_lineMonotoneTangents(points) { + var tangents = [], d, a, b, s, m = d3_svg_lineFiniteDifferences(points), i = -1, j = points.length - 1; + while (++i < j) { + d = d3_svg_lineSlope(points[i], points[i + 1]); + if (Math.abs(d) < 1e-6) { + m[i] = m[i + 1] = 0; + } else { + a = m[i] / d; + b = m[i + 1] / d; + s = a * a + b * b; + if (s > 9) { + s = d * 3 / Math.sqrt(s); + m[i] = s * a; + m[i + 1] = s * b; + } + } + } + i = -1; + while (++i <= j) { + s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) / (6 * (1 + m[i] * m[i])); + tangents.push([ s || 0, m[i] * s || 0 ]); + } + return tangents; + } + function d3_svg_lineMonotone(points) { + return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points)); + } + d3.geom.hull = function(vertices) { + var x = d3_svg_lineX, y = d3_svg_lineY; + if (arguments.length) return hull(vertices); + function hull(data) { + if (data.length < 3) return []; + var fx = d3_functor(x), fy = d3_functor(y), n = data.length, vertices, plen = n - 1, points = [], stack = [], d, i, j, h = 0, x1, y1, x2, y2, u, v, a, sp; + if (fx === d3_svg_lineX && y === d3_svg_lineY) vertices = data; else for (i = 0, + vertices = []; i < n; ++i) { + vertices.push([ +fx.call(this, d = data[i], i), +fy.call(this, d, i) ]); + } + for (i = 1; i < n; ++i) { + if (vertices[i][1] < vertices[h][1] || vertices[i][1] == vertices[h][1] && vertices[i][0] < vertices[h][0]) h = i; + } + for (i = 0; i < n; ++i) { + if (i === h) continue; + y1 = vertices[i][1] - vertices[h][1]; + x1 = vertices[i][0] - vertices[h][0]; + points.push({ + angle: Math.atan2(y1, x1), + index: i + }); + } + points.sort(function(a, b) { + return a.angle - b.angle; + }); + a = points[0].angle; + v = points[0].index; + u = 0; + for (i = 1; i < plen; ++i) { + j = points[i].index; + if (a == points[i].angle) { + x1 = vertices[v][0] - vertices[h][0]; + y1 = vertices[v][1] - vertices[h][1]; + x2 = vertices[j][0] - vertices[h][0]; + y2 = vertices[j][1] - vertices[h][1]; + if (x1 * x1 + y1 * y1 >= x2 * x2 + y2 * y2) { + points[i].index = -1; + continue; + } else { + points[u].index = -1; + } + } + a = points[i].angle; + u = i; + v = j; + } + stack.push(h); + for (i = 0, j = 0; i < 2; ++j) { + if (points[j].index > -1) { + stack.push(points[j].index); + i++; + } + } + sp = stack.length; + for (;j < plen; ++j) { + if (points[j].index < 0) continue; + while (!d3_geom_hullCCW(stack[sp - 2], stack[sp - 1], points[j].index, vertices)) { + --sp; + } + stack[sp++] = points[j].index; + } + var poly = []; + for (i = sp - 1; i >= 0; --i) poly.push(data[stack[i]]); + return poly; + } + hull.x = function(_) { + return arguments.length ? (x = _, hull) : x; + }; + hull.y = function(_) { + return arguments.length ? (y = _, hull) : y; + }; + return hull; + }; + function d3_geom_hullCCW(i1, i2, i3, v) { + var t, a, b, c, d, e, f; + t = v[i1]; + a = t[0]; + b = t[1]; + t = v[i2]; + c = t[0]; + d = t[1]; + t = v[i3]; + e = t[0]; + f = t[1]; + return (f - b) * (c - a) - (d - b) * (e - a) > 0; + } + d3.geom.polygon = function(coordinates) { + d3_subclass(coordinates, d3_geom_polygonPrototype); + return coordinates; + }; + var d3_geom_polygonPrototype = d3.geom.polygon.prototype = []; + d3_geom_polygonPrototype.area = function() { + var i = -1, n = this.length, a, b = this[n - 1], area = 0; + while (++i < n) { + a = b; + b = this[i]; + area += a[1] * b[0] - a[0] * b[1]; + } + return area * .5; + }; + d3_geom_polygonPrototype.centroid = function(k) { + var i = -1, n = this.length, x = 0, y = 0, a, b = this[n - 1], c; + if (!arguments.length) k = -1 / (6 * this.area()); + while (++i < n) { + a = b; + b = this[i]; + c = a[0] * b[1] - b[0] * a[1]; + x += (a[0] + b[0]) * c; + y += (a[1] + b[1]) * c; + } + return [ x * k, y * k ]; + }; + d3_geom_polygonPrototype.clip = function(subject) { + var input, closed = d3_geom_polygonClosed(subject), i = -1, n = this.length - d3_geom_polygonClosed(this), j, m, a = this[n - 1], b, c, d; + while (++i < n) { + input = subject.slice(); + subject.length = 0; + b = this[i]; + c = input[(m = input.length - closed) - 1]; + j = -1; + while (++j < m) { + d = input[j]; + if (d3_geom_polygonInside(d, a, b)) { + if (!d3_geom_polygonInside(c, a, b)) { + subject.push(d3_geom_polygonIntersect(c, d, a, b)); + } + subject.push(d); + } else if (d3_geom_polygonInside(c, a, b)) { + subject.push(d3_geom_polygonIntersect(c, d, a, b)); + } + c = d; + } + if (closed) subject.push(subject[0]); + a = b; + } + return subject; + }; + function d3_geom_polygonInside(p, a, b) { + return (b[0] - a[0]) * (p[1] - a[1]) < (b[1] - a[1]) * (p[0] - a[0]); + } + function d3_geom_polygonIntersect(c, d, a, b) { + var x1 = c[0], x3 = a[0], x21 = d[0] - x1, x43 = b[0] - x3, y1 = c[1], y3 = a[1], y21 = d[1] - y1, y43 = b[1] - y3, ua = (x43 * (y1 - y3) - y43 * (x1 - x3)) / (y43 * x21 - x43 * y21); + return [ x1 + ua * x21, y1 + ua * y21 ]; + } + function d3_geom_polygonClosed(coordinates) { + var a = coordinates[0], b = coordinates[coordinates.length - 1]; + return !(a[0] - b[0] || a[1] - b[1]); + } + d3.geom.delaunay = function(vertices) { + var edges = vertices.map(function() { + return []; + }), triangles = []; + d3_geom_voronoiTessellate(vertices, function(e) { + edges[e.region.l.index].push(vertices[e.region.r.index]); + }); + edges.forEach(function(edge, i) { + var v = vertices[i], cx = v[0], cy = v[1]; + edge.forEach(function(v) { + v.angle = Math.atan2(v[0] - cx, v[1] - cy); + }); + edge.sort(function(a, b) { + return a.angle - b.angle; + }); + for (var j = 0, m = edge.length - 1; j < m; j++) { + triangles.push([ v, edge[j], edge[j + 1] ]); + } + }); + return triangles; + }; + d3.geom.voronoi = function(points) { + var x = d3_svg_lineX, y = d3_svg_lineY, clipPolygon = null; + if (arguments.length) return voronoi(points); + function voronoi(data) { + var points, polygons = data.map(function() { + return []; + }), fx = d3_functor(x), fy = d3_functor(y), d, i, n = data.length, Z = 1e6; + if (fx === d3_svg_lineX && fy === d3_svg_lineY) points = data; else for (points = new Array(n), + i = 0; i < n; ++i) { + points[i] = [ +fx.call(this, d = data[i], i), +fy.call(this, d, i) ]; + } + d3_geom_voronoiTessellate(points, function(e) { + var s1, s2, x1, x2, y1, y2; + if (e.a === 1 && e.b >= 0) { + s1 = e.ep.r; + s2 = e.ep.l; + } else { + s1 = e.ep.l; + s2 = e.ep.r; + } + if (e.a === 1) { + y1 = s1 ? s1.y : -Z; + x1 = e.c - e.b * y1; + y2 = s2 ? s2.y : Z; + x2 = e.c - e.b * y2; + } else { + x1 = s1 ? s1.x : -Z; + y1 = e.c - e.a * x1; + x2 = s2 ? s2.x : Z; + y2 = e.c - e.a * x2; + } + var v1 = [ x1, y1 ], v2 = [ x2, y2 ]; + polygons[e.region.l.index].push(v1, v2); + polygons[e.region.r.index].push(v1, v2); + }); + polygons = polygons.map(function(polygon, i) { + var cx = points[i][0], cy = points[i][1], angle = polygon.map(function(v) { + return Math.atan2(v[0] - cx, v[1] - cy); + }), order = d3.range(polygon.length).sort(function(a, b) { + return angle[a] - angle[b]; + }); + return order.filter(function(d, i) { + return !i || angle[d] - angle[order[i - 1]] > ε; + }).map(function(d) { + return polygon[d]; + }); + }); + polygons.forEach(function(polygon, i) { + var n = polygon.length; + if (!n) return polygon.push([ -Z, -Z ], [ -Z, Z ], [ Z, Z ], [ Z, -Z ]); + if (n > 2) return; + var p0 = points[i], p1 = polygon[0], p2 = polygon[1], x0 = p0[0], y0 = p0[1], x1 = p1[0], y1 = p1[1], x2 = p2[0], y2 = p2[1], dx = Math.abs(x2 - x1), dy = y2 - y1; + if (Math.abs(dy) < ε) { + var y = y0 < y1 ? -Z : Z; + polygon.push([ -Z, y ], [ Z, y ]); + } else if (dx < ε) { + var x = x0 < x1 ? -Z : Z; + polygon.push([ x, -Z ], [ x, Z ]); + } else { + var y = (x2 - x1) * (y1 - y0) < (x1 - x0) * (y2 - y1) ? Z : -Z, z = Math.abs(dy) - dx; + if (Math.abs(z) < ε) { + polygon.push([ dy < 0 ? y : -y, y ]); + } else { + if (z > 0) y *= -1; + polygon.push([ -Z, y ], [ Z, y ]); + } + } + }); + if (clipPolygon) for (i = 0; i < n; ++i) clipPolygon.clip(polygons[i]); + for (i = 0; i < n; ++i) polygons[i].point = data[i]; + return polygons; + } + voronoi.x = function(_) { + return arguments.length ? (x = _, voronoi) : x; + }; + voronoi.y = function(_) { + return arguments.length ? (y = _, voronoi) : y; + }; + voronoi.clipExtent = function(_) { + if (!arguments.length) return clipPolygon && [ clipPolygon[0], clipPolygon[2] ]; + if (_ == null) clipPolygon = null; else { + var x1 = +_[0][0], y1 = +_[0][1], x2 = +_[1][0], y2 = +_[1][1]; + clipPolygon = d3.geom.polygon([ [ x1, y1 ], [ x1, y2 ], [ x2, y2 ], [ x2, y1 ] ]); + } + return voronoi; + }; + voronoi.size = function(_) { + if (!arguments.length) return clipPolygon && clipPolygon[2]; + return voronoi.clipExtent(_ && [ [ 0, 0 ], _ ]); + }; + voronoi.links = function(data) { + var points, graph = data.map(function() { + return []; + }), links = [], fx = d3_functor(x), fy = d3_functor(y), d, i, n = data.length; + if (fx === d3_svg_lineX && fy === d3_svg_lineY) points = data; else for (points = new Array(n), + i = 0; i < n; ++i) { + points[i] = [ +fx.call(this, d = data[i], i), +fy.call(this, d, i) ]; + } + d3_geom_voronoiTessellate(points, function(e) { + var l = e.region.l.index, r = e.region.r.index; + if (graph[l][r]) return; + graph[l][r] = graph[r][l] = true; + links.push({ + source: data[l], + target: data[r] + }); + }); + return links; + }; + voronoi.triangles = function(data) { + if (x === d3_svg_lineX && y === d3_svg_lineY) return d3.geom.delaunay(data); + var points = new Array(n), fx = d3_functor(x), fy = d3_functor(y), d, i = -1, n = data.length; + while (++i < n) { + (points[i] = [ +fx.call(this, d = data[i], i), +fy.call(this, d, i) ]).data = d; + } + return d3.geom.delaunay(points).map(function(triangle) { + return triangle.map(function(point) { + return point.data; + }); + }); + }; + return voronoi; + }; + var d3_geom_voronoiOpposite = { + l: "r", + r: "l" + }; + function d3_geom_voronoiTessellate(points, callback) { + var Sites = { + list: points.map(function(v, i) { + return { + index: i, + x: v[0], + y: v[1] + }; + }).sort(function(a, b) { + return a.y < b.y ? -1 : a.y > b.y ? 1 : a.x < b.x ? -1 : a.x > b.x ? 1 : 0; + }), + bottomSite: null + }; + var EdgeList = { + list: [], + leftEnd: null, + rightEnd: null, + init: function() { + EdgeList.leftEnd = EdgeList.createHalfEdge(null, "l"); + EdgeList.rightEnd = EdgeList.createHalfEdge(null, "l"); + EdgeList.leftEnd.r = EdgeList.rightEnd; + EdgeList.rightEnd.l = EdgeList.leftEnd; + EdgeList.list.unshift(EdgeList.leftEnd, EdgeList.rightEnd); + }, + createHalfEdge: function(edge, side) { + return { + edge: edge, + side: side, + vertex: null, + l: null, + r: null + }; + }, + insert: function(lb, he) { + he.l = lb; + he.r = lb.r; + lb.r.l = he; + lb.r = he; + }, + leftBound: function(p) { + var he = EdgeList.leftEnd; + do { + he = he.r; + } while (he != EdgeList.rightEnd && Geom.rightOf(he, p)); + he = he.l; + return he; + }, + del: function(he) { + he.l.r = he.r; + he.r.l = he.l; + he.edge = null; + }, + right: function(he) { + return he.r; + }, + left: function(he) { + return he.l; + }, + leftRegion: function(he) { + return he.edge == null ? Sites.bottomSite : he.edge.region[he.side]; + }, + rightRegion: function(he) { + return he.edge == null ? Sites.bottomSite : he.edge.region[d3_geom_voronoiOpposite[he.side]]; + } + }; + var Geom = { + bisect: function(s1, s2) { + var newEdge = { + region: { + l: s1, + r: s2 + }, + ep: { + l: null, + r: null + } + }; + var dx = s2.x - s1.x, dy = s2.y - s1.y, adx = dx > 0 ? dx : -dx, ady = dy > 0 ? dy : -dy; + newEdge.c = s1.x * dx + s1.y * dy + (dx * dx + dy * dy) * .5; + if (adx > ady) { + newEdge.a = 1; + newEdge.b = dy / dx; + newEdge.c /= dx; + } else { + newEdge.b = 1; + newEdge.a = dx / dy; + newEdge.c /= dy; + } + return newEdge; + }, + intersect: function(el1, el2) { + var e1 = el1.edge, e2 = el2.edge; + if (!e1 || !e2 || e1.region.r == e2.region.r) { + return null; + } + var d = e1.a * e2.b - e1.b * e2.a; + if (Math.abs(d) < 1e-10) { + return null; + } + var xint = (e1.c * e2.b - e2.c * e1.b) / d, yint = (e2.c * e1.a - e1.c * e2.a) / d, e1r = e1.region.r, e2r = e2.region.r, el, e; + if (e1r.y < e2r.y || e1r.y == e2r.y && e1r.x < e2r.x) { + el = el1; + e = e1; + } else { + el = el2; + e = e2; + } + var rightOfSite = xint >= e.region.r.x; + if (rightOfSite && el.side === "l" || !rightOfSite && el.side === "r") { + return null; + } + return { + x: xint, + y: yint + }; + }, + rightOf: function(he, p) { + var e = he.edge, topsite = e.region.r, rightOfSite = p.x > topsite.x; + if (rightOfSite && he.side === "l") { + return 1; + } + if (!rightOfSite && he.side === "r") { + return 0; + } + if (e.a === 1) { + var dyp = p.y - topsite.y, dxp = p.x - topsite.x, fast = 0, above = 0; + if (!rightOfSite && e.b < 0 || rightOfSite && e.b >= 0) { + above = fast = dyp >= e.b * dxp; + } else { + above = p.x + p.y * e.b > e.c; + if (e.b < 0) { + above = !above; + } + if (!above) { + fast = 1; + } + } + if (!fast) { + var dxs = topsite.x - e.region.l.x; + above = e.b * (dxp * dxp - dyp * dyp) < dxs * dyp * (1 + 2 * dxp / dxs + e.b * e.b); + if (e.b < 0) { + above = !above; + } + } + } else { + var yl = e.c - e.a * p.x, t1 = p.y - yl, t2 = p.x - topsite.x, t3 = yl - topsite.y; + above = t1 * t1 > t2 * t2 + t3 * t3; + } + return he.side === "l" ? above : !above; + }, + endPoint: function(edge, side, site) { + edge.ep[side] = site; + if (!edge.ep[d3_geom_voronoiOpposite[side]]) return; + callback(edge); + }, + distance: function(s, t) { + var dx = s.x - t.x, dy = s.y - t.y; + return Math.sqrt(dx * dx + dy * dy); + } + }; + var EventQueue = { + list: [], + insert: function(he, site, offset) { + he.vertex = site; + he.ystar = site.y + offset; + for (var i = 0, list = EventQueue.list, l = list.length; i < l; i++) { + var next = list[i]; + if (he.ystar > next.ystar || he.ystar == next.ystar && site.x > next.vertex.x) { + continue; + } else { + break; + } + } + list.splice(i, 0, he); + }, + del: function(he) { + for (var i = 0, ls = EventQueue.list, l = ls.length; i < l && ls[i] != he; ++i) {} + ls.splice(i, 1); + }, + empty: function() { + return EventQueue.list.length === 0; + }, + nextEvent: function(he) { + for (var i = 0, ls = EventQueue.list, l = ls.length; i < l; ++i) { + if (ls[i] == he) return ls[i + 1]; + } + return null; + }, + min: function() { + var elem = EventQueue.list[0]; + return { + x: elem.vertex.x, + y: elem.ystar + }; + }, + extractMin: function() { + return EventQueue.list.shift(); + } + }; + EdgeList.init(); + Sites.bottomSite = Sites.list.shift(); + var newSite = Sites.list.shift(), newIntStar; + var lbnd, rbnd, llbnd, rrbnd, bisector; + var bot, top, temp, p, v; + var e, pm; + while (true) { + if (!EventQueue.empty()) { + newIntStar = EventQueue.min(); + } + if (newSite && (EventQueue.empty() || newSite.y < newIntStar.y || newSite.y == newIntStar.y && newSite.x < newIntStar.x)) { + lbnd = EdgeList.leftBound(newSite); + rbnd = EdgeList.right(lbnd); + bot = EdgeList.rightRegion(lbnd); + e = Geom.bisect(bot, newSite); + bisector = EdgeList.createHalfEdge(e, "l"); + EdgeList.insert(lbnd, bisector); + p = Geom.intersect(lbnd, bisector); + if (p) { + EventQueue.del(lbnd); + EventQueue.insert(lbnd, p, Geom.distance(p, newSite)); + } + lbnd = bisector; + bisector = EdgeList.createHalfEdge(e, "r"); + EdgeList.insert(lbnd, bisector); + p = Geom.intersect(bisector, rbnd); + if (p) { + EventQueue.insert(bisector, p, Geom.distance(p, newSite)); + } + newSite = Sites.list.shift(); + } else if (!EventQueue.empty()) { + lbnd = EventQueue.extractMin(); + llbnd = EdgeList.left(lbnd); + rbnd = EdgeList.right(lbnd); + rrbnd = EdgeList.right(rbnd); + bot = EdgeList.leftRegion(lbnd); + top = EdgeList.rightRegion(rbnd); + v = lbnd.vertex; + Geom.endPoint(lbnd.edge, lbnd.side, v); + Geom.endPoint(rbnd.edge, rbnd.side, v); + EdgeList.del(lbnd); + EventQueue.del(rbnd); + EdgeList.del(rbnd); + pm = "l"; + if (bot.y > top.y) { + temp = bot; + bot = top; + top = temp; + pm = "r"; + } + e = Geom.bisect(bot, top); + bisector = EdgeList.createHalfEdge(e, pm); + EdgeList.insert(llbnd, bisector); + Geom.endPoint(e, d3_geom_voronoiOpposite[pm], v); + p = Geom.intersect(llbnd, bisector); + if (p) { + EventQueue.del(llbnd); + EventQueue.insert(llbnd, p, Geom.distance(p, bot)); + } + p = Geom.intersect(bisector, rrbnd); + if (p) { + EventQueue.insert(bisector, p, Geom.distance(p, bot)); + } + } else { + break; + } + } + for (lbnd = EdgeList.right(EdgeList.leftEnd); lbnd != EdgeList.rightEnd; lbnd = EdgeList.right(lbnd)) { + callback(lbnd.edge); + } + } + d3.geom.quadtree = function(points, x1, y1, x2, y2) { + var x = d3_svg_lineX, y = d3_svg_lineY, compat; + if (compat = arguments.length) { + x = d3_geom_quadtreeCompatX; + y = d3_geom_quadtreeCompatY; + if (compat === 3) { + y2 = y1; + x2 = x1; + y1 = x1 = 0; + } + return quadtree(points); + } + function quadtree(data) { + var d, fx = d3_functor(x), fy = d3_functor(y), xs, ys, i, n, x1_, y1_, x2_, y2_; + if (x1 != null) { + x1_ = x1, y1_ = y1, x2_ = x2, y2_ = y2; + } else { + x2_ = y2_ = -(x1_ = y1_ = Infinity); + xs = [], ys = []; + n = data.length; + if (compat) for (i = 0; i < n; ++i) { + d = data[i]; + if (d.x < x1_) x1_ = d.x; + if (d.y < y1_) y1_ = d.y; + if (d.x > x2_) x2_ = d.x; + if (d.y > y2_) y2_ = d.y; + xs.push(d.x); + ys.push(d.y); + } else for (i = 0; i < n; ++i) { + var x_ = +fx(d = data[i], i), y_ = +fy(d, i); + if (x_ < x1_) x1_ = x_; + if (y_ < y1_) y1_ = y_; + if (x_ > x2_) x2_ = x_; + if (y_ > y2_) y2_ = y_; + xs.push(x_); + ys.push(y_); + } + } + var dx = x2_ - x1_, dy = y2_ - y1_; + if (dx > dy) y2_ = y1_ + dx; else x2_ = x1_ + dy; + function insert(n, d, x, y, x1, y1, x2, y2) { + if (isNaN(x) || isNaN(y)) return; + if (n.leaf) { + var nx = n.x, ny = n.y; + if (nx != null) { + if (Math.abs(nx - x) + Math.abs(ny - y) < .01) { + insertChild(n, d, x, y, x1, y1, x2, y2); + } else { + var nPoint = n.point; + n.x = n.y = n.point = null; + insertChild(n, nPoint, nx, ny, x1, y1, x2, y2); + insertChild(n, d, x, y, x1, y1, x2, y2); + } + } else { + n.x = x, n.y = y, n.point = d; + } + } else { + insertChild(n, d, x, y, x1, y1, x2, y2); + } + } + function insertChild(n, d, x, y, x1, y1, x2, y2) { + var sx = (x1 + x2) * .5, sy = (y1 + y2) * .5, right = x >= sx, bottom = y >= sy, i = (bottom << 1) + right; + n.leaf = false; + n = n.nodes[i] || (n.nodes[i] = d3_geom_quadtreeNode()); + if (right) x1 = sx; else x2 = sx; + if (bottom) y1 = sy; else y2 = sy; + insert(n, d, x, y, x1, y1, x2, y2); + } + var root = d3_geom_quadtreeNode(); + root.add = function(d) { + insert(root, d, +fx(d, ++i), +fy(d, i), x1_, y1_, x2_, y2_); + }; + root.visit = function(f) { + d3_geom_quadtreeVisit(f, root, x1_, y1_, x2_, y2_); + }; + i = -1; + if (x1 == null) { + while (++i < n) { + insert(root, data[i], xs[i], ys[i], x1_, y1_, x2_, y2_); + } + --i; + } else data.forEach(root.add); + xs = ys = data = d = null; + return root; + } + quadtree.x = function(_) { + return arguments.length ? (x = _, quadtree) : x; + }; + quadtree.y = function(_) { + return arguments.length ? (y = _, quadtree) : y; + }; + quadtree.extent = function(_) { + if (!arguments.length) return x1 == null ? null : [ [ x1, y1 ], [ x2, y2 ] ]; + if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = +_[0][0], y1 = +_[0][1], x2 = +_[1][0], + y2 = +_[1][1]; + return quadtree; + }; + quadtree.size = function(_) { + if (!arguments.length) return x1 == null ? null : [ x2 - x1, y2 - y1 ]; + if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = y1 = 0, x2 = +_[0], y2 = +_[1]; + return quadtree; + }; + return quadtree; + }; + function d3_geom_quadtreeCompatX(d) { + return d.x; + } + function d3_geom_quadtreeCompatY(d) { + return d.y; + } + function d3_geom_quadtreeNode() { + return { + leaf: true, + nodes: [], + point: null, + x: null, + y: null + }; + } + function d3_geom_quadtreeVisit(f, node, x1, y1, x2, y2) { + if (!f(node, x1, y1, x2, y2)) { + var sx = (x1 + x2) * .5, sy = (y1 + y2) * .5, children = node.nodes; + if (children[0]) d3_geom_quadtreeVisit(f, children[0], x1, y1, sx, sy); + if (children[1]) d3_geom_quadtreeVisit(f, children[1], sx, y1, x2, sy); + if (children[2]) d3_geom_quadtreeVisit(f, children[2], x1, sy, sx, y2); + if (children[3]) d3_geom_quadtreeVisit(f, children[3], sx, sy, x2, y2); + } + } + d3.interpolateRgb = d3_interpolateRgb; + function d3_interpolateRgb(a, b) { + a = d3.rgb(a); + b = d3.rgb(b); + var ar = a.r, ag = a.g, ab = a.b, br = b.r - ar, bg = b.g - ag, bb = b.b - ab; + return function(t) { + return "#" + d3_rgb_hex(Math.round(ar + br * t)) + d3_rgb_hex(Math.round(ag + bg * t)) + d3_rgb_hex(Math.round(ab + bb * t)); + }; + } + d3.interpolateObject = d3_interpolateObject; + function d3_interpolateObject(a, b) { + var i = {}, c = {}, k; + for (k in a) { + if (k in b) { + i[k] = d3_interpolate(a[k], b[k]); + } else { + c[k] = a[k]; + } + } + for (k in b) { + if (!(k in a)) { + c[k] = b[k]; + } + } + return function(t) { + for (k in i) c[k] = i[k](t); + return c; + }; + } + d3.interpolateNumber = d3_interpolateNumber; + function d3_interpolateNumber(a, b) { + b -= a = +a; + return function(t) { + return a + b * t; + }; + } + d3.interpolateString = d3_interpolateString; + function d3_interpolateString(a, b) { + var m, i, j, s0 = 0, s1 = 0, s = [], q = [], n, o; + a = a + "", b = b + ""; + d3_interpolate_number.lastIndex = 0; + for (i = 0; m = d3_interpolate_number.exec(b); ++i) { + if (m.index) s.push(b.substring(s0, s1 = m.index)); + q.push({ + i: s.length, + x: m[0] + }); + s.push(null); + s0 = d3_interpolate_number.lastIndex; + } + if (s0 < b.length) s.push(b.substring(s0)); + for (i = 0, n = q.length; (m = d3_interpolate_number.exec(a)) && i < n; ++i) { + o = q[i]; + if (o.x == m[0]) { + if (o.i) { + if (s[o.i + 1] == null) { + s[o.i - 1] += o.x; + s.splice(o.i, 1); + for (j = i + 1; j < n; ++j) q[j].i--; + } else { + s[o.i - 1] += o.x + s[o.i + 1]; + s.splice(o.i, 2); + for (j = i + 1; j < n; ++j) q[j].i -= 2; + } + } else { + if (s[o.i + 1] == null) { + s[o.i] = o.x; + } else { + s[o.i] = o.x + s[o.i + 1]; + s.splice(o.i + 1, 1); + for (j = i + 1; j < n; ++j) q[j].i--; + } + } + q.splice(i, 1); + n--; + i--; + } else { + o.x = d3_interpolateNumber(parseFloat(m[0]), parseFloat(o.x)); + } + } + while (i < n) { + o = q.pop(); + if (s[o.i + 1] == null) { + s[o.i] = o.x; + } else { + s[o.i] = o.x + s[o.i + 1]; + s.splice(o.i + 1, 1); + } + n--; + } + if (s.length === 1) { + return s[0] == null ? (o = q[0].x, function(t) { + return o(t) + ""; + }) : function() { + return b; + }; + } + return function(t) { + for (i = 0; i < n; ++i) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }; + } + var d3_interpolate_number = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g; + d3.interpolate = d3_interpolate; + function d3_interpolate(a, b) { + var i = d3.interpolators.length, f; + while (--i >= 0 && !(f = d3.interpolators[i](a, b))) ; + return f; + } + d3.interpolators = [ function(a, b) { + var t = typeof b; + return (t === "string" ? d3_rgb_names.has(b) || /^(#|rgb\(|hsl\()/.test(b) ? d3_interpolateRgb : d3_interpolateString : b instanceof d3_Color ? d3_interpolateRgb : t === "object" ? Array.isArray(b) ? d3_interpolateArray : d3_interpolateObject : d3_interpolateNumber)(a, b); + } ]; + d3.interpolateArray = d3_interpolateArray; + function d3_interpolateArray(a, b) { + var x = [], c = [], na = a.length, nb = b.length, n0 = Math.min(a.length, b.length), i; + for (i = 0; i < n0; ++i) x.push(d3_interpolate(a[i], b[i])); + for (;i < na; ++i) c[i] = a[i]; + for (;i < nb; ++i) c[i] = b[i]; + return function(t) { + for (i = 0; i < n0; ++i) c[i] = x[i](t); + return c; + }; + } + var d3_ease_default = function() { + return d3_identity; + }; + var d3_ease = d3.map({ + linear: d3_ease_default, + poly: d3_ease_poly, + quad: function() { + return d3_ease_quad; + }, + cubic: function() { + return d3_ease_cubic; + }, + sin: function() { + return d3_ease_sin; + }, + exp: function() { + return d3_ease_exp; + }, + circle: function() { + return d3_ease_circle; + }, + elastic: d3_ease_elastic, + back: d3_ease_back, + bounce: function() { + return d3_ease_bounce; + } + }); + var d3_ease_mode = d3.map({ + "in": d3_identity, + out: d3_ease_reverse, + "in-out": d3_ease_reflect, + "out-in": function(f) { + return d3_ease_reflect(d3_ease_reverse(f)); + } + }); + d3.ease = function(name) { + var i = name.indexOf("-"), t = i >= 0 ? name.substring(0, i) : name, m = i >= 0 ? name.substring(i + 1) : "in"; + t = d3_ease.get(t) || d3_ease_default; + m = d3_ease_mode.get(m) || d3_identity; + return d3_ease_clamp(m(t.apply(null, Array.prototype.slice.call(arguments, 1)))); + }; + function d3_ease_clamp(f) { + return function(t) { + return t <= 0 ? 0 : t >= 1 ? 1 : f(t); + }; + } + function d3_ease_reverse(f) { + return function(t) { + return 1 - f(1 - t); + }; + } + function d3_ease_reflect(f) { + return function(t) { + return .5 * (t < .5 ? f(2 * t) : 2 - f(2 - 2 * t)); + }; + } + function d3_ease_quad(t) { + return t * t; + } + function d3_ease_cubic(t) { + return t * t * t; + } + function d3_ease_cubicInOut(t) { + if (t <= 0) return 0; + if (t >= 1) return 1; + var t2 = t * t, t3 = t2 * t; + return 4 * (t < .5 ? t3 : 3 * (t - t2) + t3 - .75); + } + function d3_ease_poly(e) { + return function(t) { + return Math.pow(t, e); + }; + } + function d3_ease_sin(t) { + return 1 - Math.cos(t * π / 2); + } + function d3_ease_exp(t) { + return Math.pow(2, 10 * (t - 1)); + } + function d3_ease_circle(t) { + return 1 - Math.sqrt(1 - t * t); + } + function d3_ease_elastic(a, p) { + var s; + if (arguments.length < 2) p = .45; + if (arguments.length) s = p / (2 * π) * Math.asin(1 / a); else a = 1, s = p / 4; + return function(t) { + return 1 + a * Math.pow(2, 10 * -t) * Math.sin((t - s) * 2 * π / p); + }; + } + function d3_ease_back(s) { + if (!s) s = 1.70158; + return function(t) { + return t * t * ((s + 1) * t - s); + }; + } + function d3_ease_bounce(t) { + return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t + .984375; + } + d3.interpolateHcl = d3_interpolateHcl; + function d3_interpolateHcl(a, b) { + a = d3.hcl(a); + b = d3.hcl(b); + var ah = a.h, ac = a.c, al = a.l, bh = b.h - ah, bc = b.c - ac, bl = b.l - al; + if (isNaN(bc)) bc = 0, ac = isNaN(ac) ? b.c : ac; + if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360; + return function(t) { + return d3_hcl_lab(ah + bh * t, ac + bc * t, al + bl * t) + ""; + }; + } + d3.interpolateHsl = d3_interpolateHsl; + function d3_interpolateHsl(a, b) { + a = d3.hsl(a); + b = d3.hsl(b); + var ah = a.h, as = a.s, al = a.l, bh = b.h - ah, bs = b.s - as, bl = b.l - al; + if (isNaN(bs)) bs = 0, as = isNaN(as) ? b.s : as; + if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360; + return function(t) { + return d3_hsl_rgb(ah + bh * t, as + bs * t, al + bl * t) + ""; + }; + } + d3.interpolateLab = d3_interpolateLab; + function d3_interpolateLab(a, b) { + a = d3.lab(a); + b = d3.lab(b); + var al = a.l, aa = a.a, ab = a.b, bl = b.l - al, ba = b.a - aa, bb = b.b - ab; + return function(t) { + return d3_lab_rgb(al + bl * t, aa + ba * t, ab + bb * t) + ""; + }; + } + d3.interpolateRound = d3_interpolateRound; + function d3_interpolateRound(a, b) { + b -= a; + return function(t) { + return Math.round(a + b * t); + }; + } + d3.transform = function(string) { + var g = d3_document.createElementNS(d3.ns.prefix.svg, "g"); + return (d3.transform = function(string) { + if (string != null) { + g.setAttribute("transform", string); + var t = g.transform.baseVal.consolidate(); + } + return new d3_transform(t ? t.matrix : d3_transformIdentity); + })(string); + }; + function d3_transform(m) { + var r0 = [ m.a, m.b ], r1 = [ m.c, m.d ], kx = d3_transformNormalize(r0), kz = d3_transformDot(r0, r1), ky = d3_transformNormalize(d3_transformCombine(r1, r0, -kz)) || 0; + if (r0[0] * r1[1] < r1[0] * r0[1]) { + r0[0] *= -1; + r0[1] *= -1; + kx *= -1; + kz *= -1; + } + this.rotate = (kx ? Math.atan2(r0[1], r0[0]) : Math.atan2(-r1[0], r1[1])) * d3_degrees; + this.translate = [ m.e, m.f ]; + this.scale = [ kx, ky ]; + this.skew = ky ? Math.atan2(kz, ky) * d3_degrees : 0; + } + d3_transform.prototype.toString = function() { + return "translate(" + this.translate + ")rotate(" + this.rotate + ")skewX(" + this.skew + ")scale(" + this.scale + ")"; + }; + function d3_transformDot(a, b) { + return a[0] * b[0] + a[1] * b[1]; + } + function d3_transformNormalize(a) { + var k = Math.sqrt(d3_transformDot(a, a)); + if (k) { + a[0] /= k; + a[1] /= k; + } + return k; + } + function d3_transformCombine(a, b, k) { + a[0] += k * b[0]; + a[1] += k * b[1]; + return a; + } + var d3_transformIdentity = { + a: 1, + b: 0, + c: 0, + d: 1, + e: 0, + f: 0 + }; + d3.interpolateTransform = d3_interpolateTransform; + function d3_interpolateTransform(a, b) { + var s = [], q = [], n, A = d3.transform(a), B = d3.transform(b), ta = A.translate, tb = B.translate, ra = A.rotate, rb = B.rotate, wa = A.skew, wb = B.skew, ka = A.scale, kb = B.scale; + if (ta[0] != tb[0] || ta[1] != tb[1]) { + s.push("translate(", null, ",", null, ")"); + q.push({ + i: 1, + x: d3_interpolateNumber(ta[0], tb[0]) + }, { + i: 3, + x: d3_interpolateNumber(ta[1], tb[1]) + }); + } else if (tb[0] || tb[1]) { + s.push("translate(" + tb + ")"); + } else { + s.push(""); + } + if (ra != rb) { + if (ra - rb > 180) rb += 360; else if (rb - ra > 180) ra += 360; + q.push({ + i: s.push(s.pop() + "rotate(", null, ")") - 2, + x: d3_interpolateNumber(ra, rb) + }); + } else if (rb) { + s.push(s.pop() + "rotate(" + rb + ")"); + } + if (wa != wb) { + q.push({ + i: s.push(s.pop() + "skewX(", null, ")") - 2, + x: d3_interpolateNumber(wa, wb) + }); + } else if (wb) { + s.push(s.pop() + "skewX(" + wb + ")"); + } + if (ka[0] != kb[0] || ka[1] != kb[1]) { + n = s.push(s.pop() + "scale(", null, ",", null, ")"); + q.push({ + i: n - 4, + x: d3_interpolateNumber(ka[0], kb[0]) + }, { + i: n - 2, + x: d3_interpolateNumber(ka[1], kb[1]) + }); + } else if (kb[0] != 1 || kb[1] != 1) { + s.push(s.pop() + "scale(" + kb + ")"); + } + n = q.length; + return function(t) { + var i = -1, o; + while (++i < n) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }; + } + function d3_uninterpolateNumber(a, b) { + b = b - (a = +a) ? 1 / (b - a) : 0; + return function(x) { + return (x - a) * b; + }; + } + function d3_uninterpolateClamp(a, b) { + b = b - (a = +a) ? 1 / (b - a) : 0; + return function(x) { + return Math.max(0, Math.min(1, (x - a) * b)); + }; + } + d3.layout = {}; + d3.layout.bundle = function() { + return function(links) { + var paths = [], i = -1, n = links.length; + while (++i < n) paths.push(d3_layout_bundlePath(links[i])); + return paths; + }; + }; + function d3_layout_bundlePath(link) { + var start = link.source, end = link.target, lca = d3_layout_bundleLeastCommonAncestor(start, end), points = [ start ]; + while (start !== lca) { + start = start.parent; + points.push(start); + } + var k = points.length; + while (end !== lca) { + points.splice(k, 0, end); + end = end.parent; + } + return points; + } + function d3_layout_bundleAncestors(node) { + var ancestors = [], parent = node.parent; + while (parent != null) { + ancestors.push(node); + node = parent; + parent = parent.parent; + } + ancestors.push(node); + return ancestors; + } + function d3_layout_bundleLeastCommonAncestor(a, b) { + if (a === b) return a; + var aNodes = d3_layout_bundleAncestors(a), bNodes = d3_layout_bundleAncestors(b), aNode = aNodes.pop(), bNode = bNodes.pop(), sharedNode = null; + while (aNode === bNode) { + sharedNode = aNode; + aNode = aNodes.pop(); + bNode = bNodes.pop(); + } + return sharedNode; + } + d3.layout.chord = function() { + var chord = {}, chords, groups, matrix, n, padding = 0, sortGroups, sortSubgroups, sortChords; + function relayout() { + var subgroups = {}, groupSums = [], groupIndex = d3.range(n), subgroupIndex = [], k, x, x0, i, j; + chords = []; + groups = []; + k = 0, i = -1; + while (++i < n) { + x = 0, j = -1; + while (++j < n) { + x += matrix[i][j]; + } + groupSums.push(x); + subgroupIndex.push(d3.range(n)); + k += x; + } + if (sortGroups) { + groupIndex.sort(function(a, b) { + return sortGroups(groupSums[a], groupSums[b]); + }); + } + if (sortSubgroups) { + subgroupIndex.forEach(function(d, i) { + d.sort(function(a, b) { + return sortSubgroups(matrix[i][a], matrix[i][b]); + }); + }); + } + k = (2 * π - padding * n) / k; + x = 0, i = -1; + while (++i < n) { + x0 = x, j = -1; + while (++j < n) { + var di = groupIndex[i], dj = subgroupIndex[di][j], v = matrix[di][dj], a0 = x, a1 = x += v * k; + subgroups[di + "-" + dj] = { + index: di, + subindex: dj, + startAngle: a0, + endAngle: a1, + value: v + }; + } + groups[di] = { + index: di, + startAngle: x0, + endAngle: x, + value: (x - x0) / k + }; + x += padding; + } + i = -1; + while (++i < n) { + j = i - 1; + while (++j < n) { + var source = subgroups[i + "-" + j], target = subgroups[j + "-" + i]; + if (source.value || target.value) { + chords.push(source.value < target.value ? { + source: target, + target: source + } : { + source: source, + target: target + }); + } + } + } + if (sortChords) resort(); + } + function resort() { + chords.sort(function(a, b) { + return sortChords((a.source.value + a.target.value) / 2, (b.source.value + b.target.value) / 2); + }); + } + chord.matrix = function(x) { + if (!arguments.length) return matrix; + n = (matrix = x) && matrix.length; + chords = groups = null; + return chord; + }; + chord.padding = function(x) { + if (!arguments.length) return padding; + padding = x; + chords = groups = null; + return chord; + }; + chord.sortGroups = function(x) { + if (!arguments.length) return sortGroups; + sortGroups = x; + chords = groups = null; + return chord; + }; + chord.sortSubgroups = function(x) { + if (!arguments.length) return sortSubgroups; + sortSubgroups = x; + chords = null; + return chord; + }; + chord.sortChords = function(x) { + if (!arguments.length) return sortChords; + sortChords = x; + if (chords) resort(); + return chord; + }; + chord.chords = function() { + if (!chords) relayout(); + return chords; + }; + chord.groups = function() { + if (!groups) relayout(); + return groups; + }; + return chord; + }; + d3.layout.force = function() { + var force = {}, event = d3.dispatch("start", "tick", "end"), size = [ 1, 1 ], drag, alpha, friction = .9, linkDistance = d3_layout_forceLinkDistance, linkStrength = d3_layout_forceLinkStrength, charge = -30, gravity = .1, theta = .8, nodes = [], links = [], distances, strengths, charges; + function repulse(node) { + return function(quad, x1, _, x2) { + if (quad.point !== node) { + var dx = quad.cx - node.x, dy = quad.cy - node.y, dn = 1 / Math.sqrt(dx * dx + dy * dy); + if ((x2 - x1) * dn < theta) { + var k = quad.charge * dn * dn; + node.px -= dx * k; + node.py -= dy * k; + return true; + } + if (quad.point && isFinite(dn)) { + var k = quad.pointCharge * dn * dn; + node.px -= dx * k; + node.py -= dy * k; + } + } + return !quad.charge; + }; + } + force.tick = function() { + if ((alpha *= .99) < .005) { + event.end({ + type: "end", + alpha: alpha = 0 + }); + return true; + } + var n = nodes.length, m = links.length, q, i, o, s, t, l, k, x, y; + for (i = 0; i < m; ++i) { + o = links[i]; + s = o.source; + t = o.target; + x = t.x - s.x; + y = t.y - s.y; + if (l = x * x + y * y) { + l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l; + x *= l; + y *= l; + t.x -= x * (k = s.weight / (t.weight + s.weight)); + t.y -= y * k; + s.x += x * (k = 1 - k); + s.y += y * k; + } + } + if (k = alpha * gravity) { + x = size[0] / 2; + y = size[1] / 2; + i = -1; + if (k) while (++i < n) { + o = nodes[i]; + o.x += (x - o.x) * k; + o.y += (y - o.y) * k; + } + } + if (charge) { + d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes), alpha, charges); + i = -1; + while (++i < n) { + if (!(o = nodes[i]).fixed) { + q.visit(repulse(o)); + } + } + } + i = -1; + while (++i < n) { + o = nodes[i]; + if (o.fixed) { + o.x = o.px; + o.y = o.py; + } else { + o.x -= (o.px - (o.px = o.x)) * friction; + o.y -= (o.py - (o.py = o.y)) * friction; + } + } + event.tick({ + type: "tick", + alpha: alpha + }); + }; + force.nodes = function(x) { + if (!arguments.length) return nodes; + nodes = x; + return force; + }; + force.links = function(x) { + if (!arguments.length) return links; + links = x; + return force; + }; + force.size = function(x) { + if (!arguments.length) return size; + size = x; + return force; + }; + force.linkDistance = function(x) { + if (!arguments.length) return linkDistance; + linkDistance = typeof x === "function" ? x : +x; + return force; + }; + force.distance = force.linkDistance; + force.linkStrength = function(x) { + if (!arguments.length) return linkStrength; + linkStrength = typeof x === "function" ? x : +x; + return force; + }; + force.friction = function(x) { + if (!arguments.length) return friction; + friction = +x; + return force; + }; + force.charge = function(x) { + if (!arguments.length) return charge; + charge = typeof x === "function" ? x : +x; + return force; + }; + force.gravity = function(x) { + if (!arguments.length) return gravity; + gravity = +x; + return force; + }; + force.theta = function(x) { + if (!arguments.length) return theta; + theta = +x; + return force; + }; + force.alpha = function(x) { + if (!arguments.length) return alpha; + x = +x; + if (alpha) { + if (x > 0) alpha = x; else alpha = 0; + } else if (x > 0) { + event.start({ + type: "start", + alpha: alpha = x + }); + d3.timer(force.tick); + } + return force; + }; + force.start = function() { + var i, j, n = nodes.length, m = links.length, w = size[0], h = size[1], neighbors, o; + for (i = 0; i < n; ++i) { + (o = nodes[i]).index = i; + o.weight = 0; + } + for (i = 0; i < m; ++i) { + o = links[i]; + if (typeof o.source == "number") o.source = nodes[o.source]; + if (typeof o.target == "number") o.target = nodes[o.target]; + ++o.source.weight; + ++o.target.weight; + } + for (i = 0; i < n; ++i) { + o = nodes[i]; + if (isNaN(o.x)) o.x = position("x", w); + if (isNaN(o.y)) o.y = position("y", h); + if (isNaN(o.px)) o.px = o.x; + if (isNaN(o.py)) o.py = o.y; + } + distances = []; + if (typeof linkDistance === "function") for (i = 0; i < m; ++i) distances[i] = +linkDistance.call(this, links[i], i); else for (i = 0; i < m; ++i) distances[i] = linkDistance; + strengths = []; + if (typeof linkStrength === "function") for (i = 0; i < m; ++i) strengths[i] = +linkStrength.call(this, links[i], i); else for (i = 0; i < m; ++i) strengths[i] = linkStrength; + charges = []; + if (typeof charge === "function") for (i = 0; i < n; ++i) charges[i] = +charge.call(this, nodes[i], i); else for (i = 0; i < n; ++i) charges[i] = charge; + function position(dimension, size) { + var neighbors = neighbor(i), j = -1, m = neighbors.length, x; + while (++j < m) if (!isNaN(x = neighbors[j][dimension])) return x; + return Math.random() * size; + } + function neighbor() { + if (!neighbors) { + neighbors = []; + for (j = 0; j < n; ++j) { + neighbors[j] = []; + } + for (j = 0; j < m; ++j) { + var o = links[j]; + neighbors[o.source.index].push(o.target); + neighbors[o.target.index].push(o.source); + } + } + return neighbors[i]; + } + return force.resume(); + }; + force.resume = function() { + return force.alpha(.1); + }; + force.stop = function() { + return force.alpha(0); + }; + force.drag = function() { + if (!drag) drag = d3.behavior.drag().origin(d3_identity).on("dragstart.force", d3_layout_forceDragstart).on("drag.force", dragmove).on("dragend.force", d3_layout_forceDragend); + if (!arguments.length) return drag; + this.on("mouseover.force", d3_layout_forceMouseover).on("mouseout.force", d3_layout_forceMouseout).call(drag); + }; + function dragmove(d) { + d.px = d3.event.x, d.py = d3.event.y; + force.resume(); + } + return d3.rebind(force, event, "on"); + }; + function d3_layout_forceDragstart(d) { + d.fixed |= 2; + } + function d3_layout_forceDragend(d) { + d.fixed &= ~6; + } + function d3_layout_forceMouseover(d) { + d.fixed |= 4; + d.px = d.x, d.py = d.y; + } + function d3_layout_forceMouseout(d) { + d.fixed &= ~4; + } + function d3_layout_forceAccumulate(quad, alpha, charges) { + var cx = 0, cy = 0; + quad.charge = 0; + if (!quad.leaf) { + var nodes = quad.nodes, n = nodes.length, i = -1, c; + while (++i < n) { + c = nodes[i]; + if (c == null) continue; + d3_layout_forceAccumulate(c, alpha, charges); + quad.charge += c.charge; + cx += c.charge * c.cx; + cy += c.charge * c.cy; + } + } + if (quad.point) { + if (!quad.leaf) { + quad.point.x += Math.random() - .5; + quad.point.y += Math.random() - .5; + } + var k = alpha * charges[quad.point.index]; + quad.charge += quad.pointCharge = k; + cx += k * quad.point.x; + cy += k * quad.point.y; + } + quad.cx = cx / quad.charge; + quad.cy = cy / quad.charge; + } + var d3_layout_forceLinkDistance = 20, d3_layout_forceLinkStrength = 1; + d3.layout.hierarchy = function() { + var sort = d3_layout_hierarchySort, children = d3_layout_hierarchyChildren, value = d3_layout_hierarchyValue; + function recurse(node, depth, nodes) { + var childs = children.call(hierarchy, node, depth); + node.depth = depth; + nodes.push(node); + if (childs && (n = childs.length)) { + var i = -1, n, c = node.children = [], v = 0, j = depth + 1, d; + while (++i < n) { + d = recurse(childs[i], j, nodes); + d.parent = node; + c.push(d); + v += d.value; + } + if (sort) c.sort(sort); + if (value) node.value = v; + } else if (value) { + node.value = +value.call(hierarchy, node, depth) || 0; + } + return node; + } + function revalue(node, depth) { + var children = node.children, v = 0; + if (children && (n = children.length)) { + var i = -1, n, j = depth + 1; + while (++i < n) v += revalue(children[i], j); + } else if (value) { + v = +value.call(hierarchy, node, depth) || 0; + } + if (value) node.value = v; + return v; + } + function hierarchy(d) { + var nodes = []; + recurse(d, 0, nodes); + return nodes; + } + hierarchy.sort = function(x) { + if (!arguments.length) return sort; + sort = x; + return hierarchy; + }; + hierarchy.children = function(x) { + if (!arguments.length) return children; + children = x; + return hierarchy; + }; + hierarchy.value = function(x) { + if (!arguments.length) return value; + value = x; + return hierarchy; + }; + hierarchy.revalue = function(root) { + revalue(root, 0); + return root; + }; + return hierarchy; + }; + function d3_layout_hierarchyRebind(object, hierarchy) { + d3.rebind(object, hierarchy, "sort", "children", "value"); + object.nodes = object; + object.links = d3_layout_hierarchyLinks; + return object; + } + function d3_layout_hierarchyChildren(d) { + return d.children; + } + function d3_layout_hierarchyValue(d) { + return d.value; + } + function d3_layout_hierarchySort(a, b) { + return b.value - a.value; + } + function d3_layout_hierarchyLinks(nodes) { + return d3.merge(nodes.map(function(parent) { + return (parent.children || []).map(function(child) { + return { + source: parent, + target: child + }; + }); + })); + } + d3.layout.partition = function() { + var hierarchy = d3.layout.hierarchy(), size = [ 1, 1 ]; + function position(node, x, dx, dy) { + var children = node.children; + node.x = x; + node.y = node.depth * dy; + node.dx = dx; + node.dy = dy; + if (children && (n = children.length)) { + var i = -1, n, c, d; + dx = node.value ? dx / node.value : 0; + while (++i < n) { + position(c = children[i], x, d = c.value * dx, dy); + x += d; + } + } + } + function depth(node) { + var children = node.children, d = 0; + if (children && (n = children.length)) { + var i = -1, n; + while (++i < n) d = Math.max(d, depth(children[i])); + } + return 1 + d; + } + function partition(d, i) { + var nodes = hierarchy.call(this, d, i); + position(nodes[0], 0, size[0], size[1] / depth(nodes[0])); + return nodes; + } + partition.size = function(x) { + if (!arguments.length) return size; + size = x; + return partition; + }; + return d3_layout_hierarchyRebind(partition, hierarchy); + }; + d3.layout.pie = function() { + var value = Number, sort = d3_layout_pieSortByValue, startAngle = 0, endAngle = 2 * π; + function pie(data) { + var values = data.map(function(d, i) { + return +value.call(pie, d, i); + }); + var a = +(typeof startAngle === "function" ? startAngle.apply(this, arguments) : startAngle); + var k = ((typeof endAngle === "function" ? endAngle.apply(this, arguments) : endAngle) - a) / d3.sum(values); + var index = d3.range(data.length); + if (sort != null) index.sort(sort === d3_layout_pieSortByValue ? function(i, j) { + return values[j] - values[i]; + } : function(i, j) { + return sort(data[i], data[j]); + }); + var arcs = []; + index.forEach(function(i) { + var d; + arcs[i] = { + data: data[i], + value: d = values[i], + startAngle: a, + endAngle: a += d * k + }; + }); + return arcs; + } + pie.value = function(x) { + if (!arguments.length) return value; + value = x; + return pie; + }; + pie.sort = function(x) { + if (!arguments.length) return sort; + sort = x; + return pie; + }; + pie.startAngle = function(x) { + if (!arguments.length) return startAngle; + startAngle = x; + return pie; + }; + pie.endAngle = function(x) { + if (!arguments.length) return endAngle; + endAngle = x; + return pie; + }; + return pie; + }; + var d3_layout_pieSortByValue = {}; + d3.layout.stack = function() { + var values = d3_identity, order = d3_layout_stackOrderDefault, offset = d3_layout_stackOffsetZero, out = d3_layout_stackOut, x = d3_layout_stackX, y = d3_layout_stackY; + function stack(data, index) { + var series = data.map(function(d, i) { + return values.call(stack, d, i); + }); + var points = series.map(function(d) { + return d.map(function(v, i) { + return [ x.call(stack, v, i), y.call(stack, v, i) ]; + }); + }); + var orders = order.call(stack, points, index); + series = d3.permute(series, orders); + points = d3.permute(points, orders); + var offsets = offset.call(stack, points, index); + var n = series.length, m = series[0].length, i, j, o; + for (j = 0; j < m; ++j) { + out.call(stack, series[0][j], o = offsets[j], points[0][j][1]); + for (i = 1; i < n; ++i) { + out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]); + } + } + return data; + } + stack.values = function(x) { + if (!arguments.length) return values; + values = x; + return stack; + }; + stack.order = function(x) { + if (!arguments.length) return order; + order = typeof x === "function" ? x : d3_layout_stackOrders.get(x) || d3_layout_stackOrderDefault; + return stack; + }; + stack.offset = function(x) { + if (!arguments.length) return offset; + offset = typeof x === "function" ? x : d3_layout_stackOffsets.get(x) || d3_layout_stackOffsetZero; + return stack; + }; + stack.x = function(z) { + if (!arguments.length) return x; + x = z; + return stack; + }; + stack.y = function(z) { + if (!arguments.length) return y; + y = z; + return stack; + }; + stack.out = function(z) { + if (!arguments.length) return out; + out = z; + return stack; + }; + return stack; + }; + function d3_layout_stackX(d) { + return d.x; + } + function d3_layout_stackY(d) { + return d.y; + } + function d3_layout_stackOut(d, y0, y) { + d.y0 = y0; + d.y = y; + } + var d3_layout_stackOrders = d3.map({ + "inside-out": function(data) { + var n = data.length, i, j, max = data.map(d3_layout_stackMaxIndex), sums = data.map(d3_layout_stackReduceSum), index = d3.range(n).sort(function(a, b) { + return max[a] - max[b]; + }), top = 0, bottom = 0, tops = [], bottoms = []; + for (i = 0; i < n; ++i) { + j = index[i]; + if (top < bottom) { + top += sums[j]; + tops.push(j); + } else { + bottom += sums[j]; + bottoms.push(j); + } + } + return bottoms.reverse().concat(tops); + }, + reverse: function(data) { + return d3.range(data.length).reverse(); + }, + "default": d3_layout_stackOrderDefault + }); + var d3_layout_stackOffsets = d3.map({ + silhouette: function(data) { + var n = data.length, m = data[0].length, sums = [], max = 0, i, j, o, y0 = []; + for (j = 0; j < m; ++j) { + for (i = 0, o = 0; i < n; i++) o += data[i][j][1]; + if (o > max) max = o; + sums.push(o); + } + for (j = 0; j < m; ++j) { + y0[j] = (max - sums[j]) / 2; + } + return y0; + }, + wiggle: function(data) { + var n = data.length, x = data[0], m = x.length, i, j, k, s1, s2, s3, dx, o, o0, y0 = []; + y0[0] = o = o0 = 0; + for (j = 1; j < m; ++j) { + for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1]; + for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) { + for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) { + s3 += (data[k][j][1] - data[k][j - 1][1]) / dx; + } + s2 += s3 * data[i][j][1]; + } + y0[j] = o -= s1 ? s2 / s1 * dx : 0; + if (o < o0) o0 = o; + } + for (j = 0; j < m; ++j) y0[j] -= o0; + return y0; + }, + expand: function(data) { + var n = data.length, m = data[0].length, k = 1 / n, i, j, o, y0 = []; + for (j = 0; j < m; ++j) { + for (i = 0, o = 0; i < n; i++) o += data[i][j][1]; + if (o) for (i = 0; i < n; i++) data[i][j][1] /= o; else for (i = 0; i < n; i++) data[i][j][1] = k; + } + for (j = 0; j < m; ++j) y0[j] = 0; + return y0; + }, + zero: d3_layout_stackOffsetZero + }); + function d3_layout_stackOrderDefault(data) { + return d3.range(data.length); + } + function d3_layout_stackOffsetZero(data) { + var j = -1, m = data[0].length, y0 = []; + while (++j < m) y0[j] = 0; + return y0; + } + function d3_layout_stackMaxIndex(array) { + var i = 1, j = 0, v = array[0][1], k, n = array.length; + for (;i < n; ++i) { + if ((k = array[i][1]) > v) { + j = i; + v = k; + } + } + return j; + } + function d3_layout_stackReduceSum(d) { + return d.reduce(d3_layout_stackSum, 0); + } + function d3_layout_stackSum(p, d) { + return p + d[1]; + } + d3.layout.histogram = function() { + var frequency = true, valuer = Number, ranger = d3_layout_histogramRange, binner = d3_layout_histogramBinSturges; + function histogram(data, i) { + var bins = [], values = data.map(valuer, this), range = ranger.call(this, values, i), thresholds = binner.call(this, range, values, i), bin, i = -1, n = values.length, m = thresholds.length - 1, k = frequency ? 1 : 1 / n, x; + while (++i < m) { + bin = bins[i] = []; + bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]); + bin.y = 0; + } + if (m > 0) { + i = -1; + while (++i < n) { + x = values[i]; + if (x >= range[0] && x <= range[1]) { + bin = bins[d3.bisect(thresholds, x, 1, m) - 1]; + bin.y += k; + bin.push(data[i]); + } + } + } + return bins; + } + histogram.value = function(x) { + if (!arguments.length) return valuer; + valuer = x; + return histogram; + }; + histogram.range = function(x) { + if (!arguments.length) return ranger; + ranger = d3_functor(x); + return histogram; + }; + histogram.bins = function(x) { + if (!arguments.length) return binner; + binner = typeof x === "number" ? function(range) { + return d3_layout_histogramBinFixed(range, x); + } : d3_functor(x); + return histogram; + }; + histogram.frequency = function(x) { + if (!arguments.length) return frequency; + frequency = !!x; + return histogram; + }; + return histogram; + }; + function d3_layout_histogramBinSturges(range, values) { + return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1)); + } + function d3_layout_histogramBinFixed(range, n) { + var x = -1, b = +range[0], m = (range[1] - b) / n, f = []; + while (++x <= n) f[x] = m * x + b; + return f; + } + function d3_layout_histogramRange(values) { + return [ d3.min(values), d3.max(values) ]; + } + d3.layout.tree = function() { + var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = false; + function tree(d, i) { + var nodes = hierarchy.call(this, d, i), root = nodes[0]; + function firstWalk(node, previousSibling) { + var children = node.children, layout = node._tree; + if (children && (n = children.length)) { + var n, firstChild = children[0], previousChild, ancestor = firstChild, child, i = -1; + while (++i < n) { + child = children[i]; + firstWalk(child, previousChild); + ancestor = apportion(child, previousChild, ancestor); + previousChild = child; + } + d3_layout_treeShift(node); + var midpoint = .5 * (firstChild._tree.prelim + child._tree.prelim); + if (previousSibling) { + layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling); + layout.mod = layout.prelim - midpoint; + } else { + layout.prelim = midpoint; + } + } else { + if (previousSibling) { + layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling); + } + } + } + function secondWalk(node, x) { + node.x = node._tree.prelim + x; + var children = node.children; + if (children && (n = children.length)) { + var i = -1, n; + x += node._tree.mod; + while (++i < n) { + secondWalk(children[i], x); + } + } + } + function apportion(node, previousSibling, ancestor) { + if (previousSibling) { + var vip = node, vop = node, vim = previousSibling, vom = node.parent.children[0], sip = vip._tree.mod, sop = vop._tree.mod, sim = vim._tree.mod, som = vom._tree.mod, shift; + while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) { + vom = d3_layout_treeLeft(vom); + vop = d3_layout_treeRight(vop); + vop._tree.ancestor = node; + shift = vim._tree.prelim + sim - vip._tree.prelim - sip + separation(vim, vip); + if (shift > 0) { + d3_layout_treeMove(d3_layout_treeAncestor(vim, node, ancestor), node, shift); + sip += shift; + sop += shift; + } + sim += vim._tree.mod; + sip += vip._tree.mod; + som += vom._tree.mod; + sop += vop._tree.mod; + } + if (vim && !d3_layout_treeRight(vop)) { + vop._tree.thread = vim; + vop._tree.mod += sim - sop; + } + if (vip && !d3_layout_treeLeft(vom)) { + vom._tree.thread = vip; + vom._tree.mod += sip - som; + ancestor = node; + } + } + return ancestor; + } + d3_layout_treeVisitAfter(root, function(node, previousSibling) { + node._tree = { + ancestor: node, + prelim: 0, + mod: 0, + change: 0, + shift: 0, + number: previousSibling ? previousSibling._tree.number + 1 : 0 + }; + }); + firstWalk(root); + secondWalk(root, -root._tree.prelim); + var left = d3_layout_treeSearch(root, d3_layout_treeLeftmost), right = d3_layout_treeSearch(root, d3_layout_treeRightmost), deep = d3_layout_treeSearch(root, d3_layout_treeDeepest), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2, y1 = deep.depth || 1; + d3_layout_treeVisitAfter(root, nodeSize ? function(node) { + node.x *= size[0]; + node.y = node.depth * size[1]; + delete node._tree; + } : function(node) { + node.x = (node.x - x0) / (x1 - x0) * size[0]; + node.y = node.depth / y1 * size[1]; + delete node._tree; + }); + return nodes; + } + tree.separation = function(x) { + if (!arguments.length) return separation; + separation = x; + return tree; + }; + tree.size = function(x) { + if (!arguments.length) return nodeSize ? null : size; + nodeSize = (size = x) == null; + return tree; + }; + tree.nodeSize = function(x) { + if (!arguments.length) return nodeSize ? size : null; + nodeSize = (size = x) != null; + return tree; + }; + return d3_layout_hierarchyRebind(tree, hierarchy); + }; + function d3_layout_treeSeparation(a, b) { + return a.parent == b.parent ? 1 : 2; + } + function d3_layout_treeLeft(node) { + var children = node.children; + return children && children.length ? children[0] : node._tree.thread; + } + function d3_layout_treeRight(node) { + var children = node.children, n; + return children && (n = children.length) ? children[n - 1] : node._tree.thread; + } + function d3_layout_treeSearch(node, compare) { + var children = node.children; + if (children && (n = children.length)) { + var child, n, i = -1; + while (++i < n) { + if (compare(child = d3_layout_treeSearch(children[i], compare), node) > 0) { + node = child; + } + } + } + return node; + } + function d3_layout_treeRightmost(a, b) { + return a.x - b.x; + } + function d3_layout_treeLeftmost(a, b) { + return b.x - a.x; + } + function d3_layout_treeDeepest(a, b) { + return a.depth - b.depth; + } + function d3_layout_treeVisitAfter(node, callback) { + function visit(node, previousSibling) { + var children = node.children; + if (children && (n = children.length)) { + var child, previousChild = null, i = -1, n; + while (++i < n) { + child = children[i]; + visit(child, previousChild); + previousChild = child; + } + } + callback(node, previousSibling); + } + visit(node, null); + } + function d3_layout_treeShift(node) { + var shift = 0, change = 0, children = node.children, i = children.length, child; + while (--i >= 0) { + child = children[i]._tree; + child.prelim += shift; + child.mod += shift; + shift += child.shift + (change += child.change); + } + } + function d3_layout_treeMove(ancestor, node, shift) { + ancestor = ancestor._tree; + node = node._tree; + var change = shift / (node.number - ancestor.number); + ancestor.change += change; + node.change -= change; + node.shift += shift; + node.prelim += shift; + node.mod += shift; + } + function d3_layout_treeAncestor(vim, node, ancestor) { + return vim._tree.ancestor.parent == node.parent ? vim._tree.ancestor : ancestor; + } + d3.layout.pack = function() { + var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), padding = 0, size = [ 1, 1 ], radius; + function pack(d, i) { + var nodes = hierarchy.call(this, d, i), root = nodes[0], w = size[0], h = size[1], r = radius == null ? Math.sqrt : typeof radius === "function" ? radius : function() { + return radius; + }; + root.x = root.y = 0; + d3_layout_treeVisitAfter(root, function(d) { + d.r = +r(d.value); + }); + d3_layout_treeVisitAfter(root, d3_layout_packSiblings); + if (padding) { + var dr = padding * (radius ? 1 : Math.max(2 * root.r / w, 2 * root.r / h)) / 2; + d3_layout_treeVisitAfter(root, function(d) { + d.r += dr; + }); + d3_layout_treeVisitAfter(root, d3_layout_packSiblings); + d3_layout_treeVisitAfter(root, function(d) { + d.r -= dr; + }); + } + d3_layout_packTransform(root, w / 2, h / 2, radius ? 1 : 1 / Math.max(2 * root.r / w, 2 * root.r / h)); + return nodes; + } + pack.size = function(_) { + if (!arguments.length) return size; + size = _; + return pack; + }; + pack.radius = function(_) { + if (!arguments.length) return radius; + radius = _ == null || typeof _ === "function" ? _ : +_; + return pack; + }; + pack.padding = function(_) { + if (!arguments.length) return padding; + padding = +_; + return pack; + }; + return d3_layout_hierarchyRebind(pack, hierarchy); + }; + function d3_layout_packSort(a, b) { + return a.value - b.value; + } + function d3_layout_packInsert(a, b) { + var c = a._pack_next; + a._pack_next = b; + b._pack_prev = a; + b._pack_next = c; + c._pack_prev = b; + } + function d3_layout_packSplice(a, b) { + a._pack_next = b; + b._pack_prev = a; + } + function d3_layout_packIntersects(a, b) { + var dx = b.x - a.x, dy = b.y - a.y, dr = a.r + b.r; + return .999 * dr * dr > dx * dx + dy * dy; + } + function d3_layout_packSiblings(node) { + if (!(nodes = node.children) || !(n = nodes.length)) return; + var nodes, xMin = Infinity, xMax = -Infinity, yMin = Infinity, yMax = -Infinity, a, b, c, i, j, k, n; + function bound(node) { + xMin = Math.min(node.x - node.r, xMin); + xMax = Math.max(node.x + node.r, xMax); + yMin = Math.min(node.y - node.r, yMin); + yMax = Math.max(node.y + node.r, yMax); + } + nodes.forEach(d3_layout_packLink); + a = nodes[0]; + a.x = -a.r; + a.y = 0; + bound(a); + if (n > 1) { + b = nodes[1]; + b.x = b.r; + b.y = 0; + bound(b); + if (n > 2) { + c = nodes[2]; + d3_layout_packPlace(a, b, c); + bound(c); + d3_layout_packInsert(a, c); + a._pack_prev = c; + d3_layout_packInsert(c, b); + b = a._pack_next; + for (i = 3; i < n; i++) { + d3_layout_packPlace(a, b, c = nodes[i]); + var isect = 0, s1 = 1, s2 = 1; + for (j = b._pack_next; j !== b; j = j._pack_next, s1++) { + if (d3_layout_packIntersects(j, c)) { + isect = 1; + break; + } + } + if (isect == 1) { + for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) { + if (d3_layout_packIntersects(k, c)) { + break; + } + } + } + if (isect) { + if (s1 < s2 || s1 == s2 && b.r < a.r) d3_layout_packSplice(a, b = j); else d3_layout_packSplice(a = k, b); + i--; + } else { + d3_layout_packInsert(a, c); + b = c; + bound(c); + } + } + } + } + var cx = (xMin + xMax) / 2, cy = (yMin + yMax) / 2, cr = 0; + for (i = 0; i < n; i++) { + c = nodes[i]; + c.x -= cx; + c.y -= cy; + cr = Math.max(cr, c.r + Math.sqrt(c.x * c.x + c.y * c.y)); + } + node.r = cr; + nodes.forEach(d3_layout_packUnlink); + } + function d3_layout_packLink(node) { + node._pack_next = node._pack_prev = node; + } + function d3_layout_packUnlink(node) { + delete node._pack_next; + delete node._pack_prev; + } + function d3_layout_packTransform(node, x, y, k) { + var children = node.children; + node.x = x += k * node.x; + node.y = y += k * node.y; + node.r *= k; + if (children) { + var i = -1, n = children.length; + while (++i < n) d3_layout_packTransform(children[i], x, y, k); + } + } + function d3_layout_packPlace(a, b, c) { + var db = a.r + c.r, dx = b.x - a.x, dy = b.y - a.y; + if (db && (dx || dy)) { + var da = b.r + c.r, dc = dx * dx + dy * dy; + da *= da; + db *= db; + var x = .5 + (db - da) / (2 * dc), y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc); + c.x = a.x + x * dx + y * dy; + c.y = a.y + x * dy - y * dx; + } else { + c.x = a.x + db; + c.y = a.y; + } + } + d3.layout.cluster = function() { + var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = false; + function cluster(d, i) { + var nodes = hierarchy.call(this, d, i), root = nodes[0], previousNode, x = 0; + d3_layout_treeVisitAfter(root, function(node) { + var children = node.children; + if (children && children.length) { + node.x = d3_layout_clusterX(children); + node.y = d3_layout_clusterY(children); + } else { + node.x = previousNode ? x += separation(node, previousNode) : 0; + node.y = 0; + previousNode = node; + } + }); + var left = d3_layout_clusterLeft(root), right = d3_layout_clusterRight(root), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2; + d3_layout_treeVisitAfter(root, nodeSize ? function(node) { + node.x = (node.x - root.x) * size[0]; + node.y = (root.y - node.y) * size[1]; + } : function(node) { + node.x = (node.x - x0) / (x1 - x0) * size[0]; + node.y = (1 - (root.y ? node.y / root.y : 1)) * size[1]; + }); + return nodes; + } + cluster.separation = function(x) { + if (!arguments.length) return separation; + separation = x; + return cluster; + }; + cluster.size = function(x) { + if (!arguments.length) return nodeSize ? null : size; + nodeSize = (size = x) == null; + return cluster; + }; + cluster.nodeSize = function(x) { + if (!arguments.length) return nodeSize ? size : null; + nodeSize = (size = x) != null; + return cluster; + }; + return d3_layout_hierarchyRebind(cluster, hierarchy); + }; + function d3_layout_clusterY(children) { + return 1 + d3.max(children, function(child) { + return child.y; + }); + } + function d3_layout_clusterX(children) { + return children.reduce(function(x, child) { + return x + child.x; + }, 0) / children.length; + } + function d3_layout_clusterLeft(node) { + var children = node.children; + return children && children.length ? d3_layout_clusterLeft(children[0]) : node; + } + function d3_layout_clusterRight(node) { + var children = node.children, n; + return children && (n = children.length) ? d3_layout_clusterRight(children[n - 1]) : node; + } + d3.layout.treemap = function() { + var hierarchy = d3.layout.hierarchy(), round = Math.round, size = [ 1, 1 ], padding = null, pad = d3_layout_treemapPadNull, sticky = false, stickies, mode = "squarify", ratio = .5 * (1 + Math.sqrt(5)); + function scale(children, k) { + var i = -1, n = children.length, child, area; + while (++i < n) { + area = (child = children[i]).value * (k < 0 ? 0 : k); + child.area = isNaN(area) || area <= 0 ? 0 : area; + } + } + function squarify(node) { + var children = node.children; + if (children && children.length) { + var rect = pad(node), row = [], remaining = children.slice(), child, best = Infinity, score, u = mode === "slice" ? rect.dx : mode === "dice" ? rect.dy : mode === "slice-dice" ? node.depth & 1 ? rect.dy : rect.dx : Math.min(rect.dx, rect.dy), n; + scale(remaining, rect.dx * rect.dy / node.value); + row.area = 0; + while ((n = remaining.length) > 0) { + row.push(child = remaining[n - 1]); + row.area += child.area; + if (mode !== "squarify" || (score = worst(row, u)) <= best) { + remaining.pop(); + best = score; + } else { + row.area -= row.pop().area; + position(row, u, rect, false); + u = Math.min(rect.dx, rect.dy); + row.length = row.area = 0; + best = Infinity; + } + } + if (row.length) { + position(row, u, rect, true); + row.length = row.area = 0; + } + children.forEach(squarify); + } + } + function stickify(node) { + var children = node.children; + if (children && children.length) { + var rect = pad(node), remaining = children.slice(), child, row = []; + scale(remaining, rect.dx * rect.dy / node.value); + row.area = 0; + while (child = remaining.pop()) { + row.push(child); + row.area += child.area; + if (child.z != null) { + position(row, child.z ? rect.dx : rect.dy, rect, !remaining.length); + row.length = row.area = 0; + } + } + children.forEach(stickify); + } + } + function worst(row, u) { + var s = row.area, r, rmax = 0, rmin = Infinity, i = -1, n = row.length; + while (++i < n) { + if (!(r = row[i].area)) continue; + if (r < rmin) rmin = r; + if (r > rmax) rmax = r; + } + s *= s; + u *= u; + return s ? Math.max(u * rmax * ratio / s, s / (u * rmin * ratio)) : Infinity; + } + function position(row, u, rect, flush) { + var i = -1, n = row.length, x = rect.x, y = rect.y, v = u ? round(row.area / u) : 0, o; + if (u == rect.dx) { + if (flush || v > rect.dy) v = rect.dy; + while (++i < n) { + o = row[i]; + o.x = x; + o.y = y; + o.dy = v; + x += o.dx = Math.min(rect.x + rect.dx - x, v ? round(o.area / v) : 0); + } + o.z = true; + o.dx += rect.x + rect.dx - x; + rect.y += v; + rect.dy -= v; + } else { + if (flush || v > rect.dx) v = rect.dx; + while (++i < n) { + o = row[i]; + o.x = x; + o.y = y; + o.dx = v; + y += o.dy = Math.min(rect.y + rect.dy - y, v ? round(o.area / v) : 0); + } + o.z = false; + o.dy += rect.y + rect.dy - y; + rect.x += v; + rect.dx -= v; + } + } + function treemap(d) { + var nodes = stickies || hierarchy(d), root = nodes[0]; + root.x = 0; + root.y = 0; + root.dx = size[0]; + root.dy = size[1]; + if (stickies) hierarchy.revalue(root); + scale([ root ], root.dx * root.dy / root.value); + (stickies ? stickify : squarify)(root); + if (sticky) stickies = nodes; + return nodes; + } + treemap.size = function(x) { + if (!arguments.length) return size; + size = x; + return treemap; + }; + treemap.padding = function(x) { + if (!arguments.length) return padding; + function padFunction(node) { + var p = x.call(treemap, node, node.depth); + return p == null ? d3_layout_treemapPadNull(node) : d3_layout_treemapPad(node, typeof p === "number" ? [ p, p, p, p ] : p); + } + function padConstant(node) { + return d3_layout_treemapPad(node, x); + } + var type; + pad = (padding = x) == null ? d3_layout_treemapPadNull : (type = typeof x) === "function" ? padFunction : type === "number" ? (x = [ x, x, x, x ], + padConstant) : padConstant; + return treemap; + }; + treemap.round = function(x) { + if (!arguments.length) return round != Number; + round = x ? Math.round : Number; + return treemap; + }; + treemap.sticky = function(x) { + if (!arguments.length) return sticky; + sticky = x; + stickies = null; + return treemap; + }; + treemap.ratio = function(x) { + if (!arguments.length) return ratio; + ratio = x; + return treemap; + }; + treemap.mode = function(x) { + if (!arguments.length) return mode; + mode = x + ""; + return treemap; + }; + return d3_layout_hierarchyRebind(treemap, hierarchy); + }; + function d3_layout_treemapPadNull(node) { + return { + x: node.x, + y: node.y, + dx: node.dx, + dy: node.dy + }; + } + function d3_layout_treemapPad(node, padding) { + var x = node.x + padding[3], y = node.y + padding[0], dx = node.dx - padding[1] - padding[3], dy = node.dy - padding[0] - padding[2]; + if (dx < 0) { + x += dx / 2; + dx = 0; + } + if (dy < 0) { + y += dy / 2; + dy = 0; + } + return { + x: x, + y: y, + dx: dx, + dy: dy + }; + } + d3.random = { + normal: function(µ, σ) { + var n = arguments.length; + if (n < 2) σ = 1; + if (n < 1) µ = 0; + return function() { + var x, y, r; + do { + x = Math.random() * 2 - 1; + y = Math.random() * 2 - 1; + r = x * x + y * y; + } while (!r || r > 1); + return µ + σ * x * Math.sqrt(-2 * Math.log(r) / r); + }; + }, + logNormal: function() { + var random = d3.random.normal.apply(d3, arguments); + return function() { + return Math.exp(random()); + }; + }, + irwinHall: function(m) { + return function() { + for (var s = 0, j = 0; j < m; j++) s += Math.random(); + return s / m; + }; + } + }; + d3.scale = {}; + function d3_scaleExtent(domain) { + var start = domain[0], stop = domain[domain.length - 1]; + return start < stop ? [ start, stop ] : [ stop, start ]; + } + function d3_scaleRange(scale) { + return scale.rangeExtent ? scale.rangeExtent() : d3_scaleExtent(scale.range()); + } + function d3_scale_bilinear(domain, range, uninterpolate, interpolate) { + var u = uninterpolate(domain[0], domain[1]), i = interpolate(range[0], range[1]); + return function(x) { + return i(u(x)); + }; + } + function d3_scale_nice(domain, nice) { + var i0 = 0, i1 = domain.length - 1, x0 = domain[i0], x1 = domain[i1], dx; + if (x1 < x0) { + dx = i0, i0 = i1, i1 = dx; + dx = x0, x0 = x1, x1 = dx; + } + domain[i0] = nice.floor(x0); + domain[i1] = nice.ceil(x1); + return domain; + } + function d3_scale_niceStep(step) { + return step ? { + floor: function(x) { + return Math.floor(x / step) * step; + }, + ceil: function(x) { + return Math.ceil(x / step) * step; + } + } : d3_scale_niceIdentity; + } + var d3_scale_niceIdentity = { + floor: d3_identity, + ceil: d3_identity + }; + function d3_scale_polylinear(domain, range, uninterpolate, interpolate) { + var u = [], i = [], j = 0, k = Math.min(domain.length, range.length) - 1; + if (domain[k] < domain[0]) { + domain = domain.slice().reverse(); + range = range.slice().reverse(); + } + while (++j <= k) { + u.push(uninterpolate(domain[j - 1], domain[j])); + i.push(interpolate(range[j - 1], range[j])); + } + return function(x) { + var j = d3.bisect(domain, x, 1, k) - 1; + return i[j](u[j](x)); + }; + } + d3.scale.linear = function() { + return d3_scale_linear([ 0, 1 ], [ 0, 1 ], d3_interpolate, false); + }; + function d3_scale_linear(domain, range, interpolate, clamp) { + var output, input; + function rescale() { + var linear = Math.min(domain.length, range.length) > 2 ? d3_scale_polylinear : d3_scale_bilinear, uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber; + output = linear(domain, range, uninterpolate, interpolate); + input = linear(range, domain, uninterpolate, d3_interpolate); + return scale; + } + function scale(x) { + return output(x); + } + scale.invert = function(y) { + return input(y); + }; + scale.domain = function(x) { + if (!arguments.length) return domain; + domain = x.map(Number); + return rescale(); + }; + scale.range = function(x) { + if (!arguments.length) return range; + range = x; + return rescale(); + }; + scale.rangeRound = function(x) { + return scale.range(x).interpolate(d3_interpolateRound); + }; + scale.clamp = function(x) { + if (!arguments.length) return clamp; + clamp = x; + return rescale(); + }; + scale.interpolate = function(x) { + if (!arguments.length) return interpolate; + interpolate = x; + return rescale(); + }; + scale.ticks = function(m) { + return d3_scale_linearTicks(domain, m); + }; + scale.tickFormat = function(m, format) { + return d3_scale_linearTickFormat(domain, m, format); + }; + scale.nice = function(m) { + d3_scale_linearNice(domain, m); + return rescale(); + }; + scale.copy = function() { + return d3_scale_linear(domain, range, interpolate, clamp); + }; + return rescale(); + } + function d3_scale_linearRebind(scale, linear) { + return d3.rebind(scale, linear, "range", "rangeRound", "interpolate", "clamp"); + } + function d3_scale_linearNice(domain, m) { + return d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2])); + } + function d3_scale_linearTickRange(domain, m) { + if (m == null) m = 10; + var extent = d3_scaleExtent(domain), span = extent[1] - extent[0], step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)), err = m / span * step; + if (err <= .15) step *= 10; else if (err <= .35) step *= 5; else if (err <= .75) step *= 2; + extent[0] = Math.ceil(extent[0] / step) * step; + extent[1] = Math.floor(extent[1] / step) * step + step * .5; + extent[2] = step; + return extent; + } + function d3_scale_linearTicks(domain, m) { + return d3.range.apply(d3, d3_scale_linearTickRange(domain, m)); + } + function d3_scale_linearTickFormat(domain, m, format) { + var precision = -Math.floor(Math.log(d3_scale_linearTickRange(domain, m)[2]) / Math.LN10 + .01); + return d3.format(format ? format.replace(d3_format_re, function(a, b, c, d, e, f, g, h, i, j) { + return [ b, c, d, e, f, g, h, i || "." + (precision - (j === "%") * 2), j ].join(""); + }) : ",." + precision + "f"); + } + d3.scale.log = function() { + return d3_scale_log(d3.scale.linear().domain([ 0, 1 ]), 10, true, [ 1, 10 ]); + }; + function d3_scale_log(linear, base, positive, domain) { + function log(x) { + return (positive ? Math.log(x < 0 ? 0 : x) : -Math.log(x > 0 ? 0 : -x)) / Math.log(base); + } + function pow(x) { + return positive ? Math.pow(base, x) : -Math.pow(base, -x); + } + function scale(x) { + return linear(log(x)); + } + scale.invert = function(x) { + return pow(linear.invert(x)); + }; + scale.domain = function(x) { + if (!arguments.length) return domain; + positive = x[0] >= 0; + linear.domain((domain = x.map(Number)).map(log)); + return scale; + }; + scale.base = function(_) { + if (!arguments.length) return base; + base = +_; + linear.domain(domain.map(log)); + return scale; + }; + scale.nice = function() { + var niced = d3_scale_nice(domain.map(log), positive ? Math : d3_scale_logNiceNegative); + linear.domain(niced); + domain = niced.map(pow); + return scale; + }; + scale.ticks = function() { + var extent = d3_scaleExtent(domain), ticks = [], u = extent[0], v = extent[1], i = Math.floor(log(u)), j = Math.ceil(log(v)), n = base % 1 ? 2 : base; + if (isFinite(j - i)) { + if (positive) { + for (;i < j; i++) for (var k = 1; k < n; k++) ticks.push(pow(i) * k); + ticks.push(pow(i)); + } else { + ticks.push(pow(i)); + for (;i++ < j; ) for (var k = n - 1; k > 0; k--) ticks.push(pow(i) * k); + } + for (i = 0; ticks[i] < u; i++) {} + for (j = ticks.length; ticks[j - 1] > v; j--) {} + ticks = ticks.slice(i, j); + } + return ticks; + }; + scale.tickFormat = function(n, format) { + if (!arguments.length) return d3_scale_logFormat; + if (arguments.length < 2) format = d3_scale_logFormat; else if (typeof format !== "function") format = d3.format(format); + var k = Math.max(.1, n / scale.ticks().length), f = positive ? (e = 1e-12, Math.ceil) : (e = -1e-12, + Math.floor), e; + return function(d) { + return d / pow(f(log(d) + e)) <= k ? format(d) : ""; + }; + }; + scale.copy = function() { + return d3_scale_log(linear.copy(), base, positive, domain); + }; + return d3_scale_linearRebind(scale, linear); + } + var d3_scale_logFormat = d3.format(".0e"), d3_scale_logNiceNegative = { + floor: function(x) { + return -Math.ceil(-x); + }, + ceil: function(x) { + return -Math.floor(-x); + } + }; + d3.scale.pow = function() { + return d3_scale_pow(d3.scale.linear(), 1, [ 0, 1 ]); + }; + function d3_scale_pow(linear, exponent, domain) { + var powp = d3_scale_powPow(exponent), powb = d3_scale_powPow(1 / exponent); + function scale(x) { + return linear(powp(x)); + } + scale.invert = function(x) { + return powb(linear.invert(x)); + }; + scale.domain = function(x) { + if (!arguments.length) return domain; + linear.domain((domain = x.map(Number)).map(powp)); + return scale; + }; + scale.ticks = function(m) { + return d3_scale_linearTicks(domain, m); + }; + scale.tickFormat = function(m, format) { + return d3_scale_linearTickFormat(domain, m, format); + }; + scale.nice = function(m) { + return scale.domain(d3_scale_linearNice(domain, m)); + }; + scale.exponent = function(x) { + if (!arguments.length) return exponent; + powp = d3_scale_powPow(exponent = x); + powb = d3_scale_powPow(1 / exponent); + linear.domain(domain.map(powp)); + return scale; + }; + scale.copy = function() { + return d3_scale_pow(linear.copy(), exponent, domain); + }; + return d3_scale_linearRebind(scale, linear); + } + function d3_scale_powPow(e) { + return function(x) { + return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e); + }; + } + d3.scale.sqrt = function() { + return d3.scale.pow().exponent(.5); + }; + d3.scale.ordinal = function() { + return d3_scale_ordinal([], { + t: "range", + a: [ [] ] + }); + }; + function d3_scale_ordinal(domain, ranger) { + var index, range, rangeBand; + function scale(x) { + return range[((index.get(x) || index.set(x, domain.push(x))) - 1) % range.length]; + } + function steps(start, step) { + return d3.range(domain.length).map(function(i) { + return start + step * i; + }); + } + scale.domain = function(x) { + if (!arguments.length) return domain; + domain = []; + index = new d3_Map(); + var i = -1, n = x.length, xi; + while (++i < n) if (!index.has(xi = x[i])) index.set(xi, domain.push(xi)); + return scale[ranger.t].apply(scale, ranger.a); + }; + scale.range = function(x) { + if (!arguments.length) return range; + range = x; + rangeBand = 0; + ranger = { + t: "range", + a: arguments + }; + return scale; + }; + scale.rangePoints = function(x, padding) { + if (arguments.length < 2) padding = 0; + var start = x[0], stop = x[1], step = (stop - start) / (Math.max(1, domain.length - 1) + padding); + range = steps(domain.length < 2 ? (start + stop) / 2 : start + step * padding / 2, step); + rangeBand = 0; + ranger = { + t: "rangePoints", + a: arguments + }; + return scale; + }; + scale.rangeBands = function(x, padding, outerPadding) { + if (arguments.length < 2) padding = 0; + if (arguments.length < 3) outerPadding = padding; + var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = (stop - start) / (domain.length - padding + 2 * outerPadding); + range = steps(start + step * outerPadding, step); + if (reverse) range.reverse(); + rangeBand = step * (1 - padding); + ranger = { + t: "rangeBands", + a: arguments + }; + return scale; + }; + scale.rangeRoundBands = function(x, padding, outerPadding) { + if (arguments.length < 2) padding = 0; + if (arguments.length < 3) outerPadding = padding; + var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = Math.floor((stop - start) / (domain.length - padding + 2 * outerPadding)), error = stop - start - (domain.length - padding) * step; + range = steps(start + Math.round(error / 2), step); + if (reverse) range.reverse(); + rangeBand = Math.round(step * (1 - padding)); + ranger = { + t: "rangeRoundBands", + a: arguments + }; + return scale; + }; + scale.rangeBand = function() { + return rangeBand; + }; + scale.rangeExtent = function() { + return d3_scaleExtent(ranger.a[0]); + }; + scale.copy = function() { + return d3_scale_ordinal(domain, ranger); + }; + return scale.domain(domain); + } + d3.scale.category10 = function() { + return d3.scale.ordinal().range(d3_category10); + }; + d3.scale.category20 = function() { + return d3.scale.ordinal().range(d3_category20); + }; + d3.scale.category20b = function() { + return d3.scale.ordinal().range(d3_category20b); + }; + d3.scale.category20c = function() { + return d3.scale.ordinal().range(d3_category20c); + }; + var d3_category10 = [ 2062260, 16744206, 2924588, 14034728, 9725885, 9197131, 14907330, 8355711, 12369186, 1556175 ].map(d3_rgbString); + var d3_category20 = [ 2062260, 11454440, 16744206, 16759672, 2924588, 10018698, 14034728, 16750742, 9725885, 12955861, 9197131, 12885140, 14907330, 16234194, 8355711, 13092807, 12369186, 14408589, 1556175, 10410725 ].map(d3_rgbString); + var d3_category20b = [ 3750777, 5395619, 7040719, 10264286, 6519097, 9216594, 11915115, 13556636, 9202993, 12426809, 15186514, 15190932, 8666169, 11356490, 14049643, 15177372, 8077683, 10834324, 13528509, 14589654 ].map(d3_rgbString); + var d3_category20c = [ 3244733, 7057110, 10406625, 13032431, 15095053, 16616764, 16625259, 16634018, 3253076, 7652470, 10607003, 13101504, 7695281, 10394312, 12369372, 14342891, 6513507, 9868950, 12434877, 14277081 ].map(d3_rgbString); + d3.scale.quantile = function() { + return d3_scale_quantile([], []); + }; + function d3_scale_quantile(domain, range) { + var thresholds; + function rescale() { + var k = 0, q = range.length; + thresholds = []; + while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q); + return scale; + } + function scale(x) { + if (!isNaN(x = +x)) return range[d3.bisect(thresholds, x)]; + } + scale.domain = function(x) { + if (!arguments.length) return domain; + domain = x.filter(function(d) { + return !isNaN(d); + }).sort(d3.ascending); + return rescale(); + }; + scale.range = function(x) { + if (!arguments.length) return range; + range = x; + return rescale(); + }; + scale.quantiles = function() { + return thresholds; + }; + scale.invertExtent = function(y) { + y = range.indexOf(y); + return y < 0 ? [ NaN, NaN ] : [ y > 0 ? thresholds[y - 1] : domain[0], y < thresholds.length ? thresholds[y] : domain[domain.length - 1] ]; + }; + scale.copy = function() { + return d3_scale_quantile(domain, range); + }; + return rescale(); + } + d3.scale.quantize = function() { + return d3_scale_quantize(0, 1, [ 0, 1 ]); + }; + function d3_scale_quantize(x0, x1, range) { + var kx, i; + function scale(x) { + return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))]; + } + function rescale() { + kx = range.length / (x1 - x0); + i = range.length - 1; + return scale; + } + scale.domain = function(x) { + if (!arguments.length) return [ x0, x1 ]; + x0 = +x[0]; + x1 = +x[x.length - 1]; + return rescale(); + }; + scale.range = function(x) { + if (!arguments.length) return range; + range = x; + return rescale(); + }; + scale.invertExtent = function(y) { + y = range.indexOf(y); + y = y < 0 ? NaN : y / kx + x0; + return [ y, y + 1 / kx ]; + }; + scale.copy = function() { + return d3_scale_quantize(x0, x1, range); + }; + return rescale(); + } + d3.scale.threshold = function() { + return d3_scale_threshold([ .5 ], [ 0, 1 ]); + }; + function d3_scale_threshold(domain, range) { + function scale(x) { + if (x <= x) return range[d3.bisect(domain, x)]; + } + scale.domain = function(_) { + if (!arguments.length) return domain; + domain = _; + return scale; + }; + scale.range = function(_) { + if (!arguments.length) return range; + range = _; + return scale; + }; + scale.invertExtent = function(y) { + y = range.indexOf(y); + return [ domain[y - 1], domain[y] ]; + }; + scale.copy = function() { + return d3_scale_threshold(domain, range); + }; + return scale; + } + d3.scale.identity = function() { + return d3_scale_identity([ 0, 1 ]); + }; + function d3_scale_identity(domain) { + function identity(x) { + return +x; + } + identity.invert = identity; + identity.domain = identity.range = function(x) { + if (!arguments.length) return domain; + domain = x.map(identity); + return identity; + }; + identity.ticks = function(m) { + return d3_scale_linearTicks(domain, m); + }; + identity.tickFormat = function(m, format) { + return d3_scale_linearTickFormat(domain, m, format); + }; + identity.copy = function() { + return d3_scale_identity(domain); + }; + return identity; + } + d3.svg.arc = function() { + var innerRadius = d3_svg_arcInnerRadius, outerRadius = d3_svg_arcOuterRadius, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle; + function arc() { + var r0 = innerRadius.apply(this, arguments), r1 = outerRadius.apply(this, arguments), a0 = startAngle.apply(this, arguments) + d3_svg_arcOffset, a1 = endAngle.apply(this, arguments) + d3_svg_arcOffset, da = (a1 < a0 && (da = a0, + a0 = a1, a1 = da), a1 - a0), df = da < π ? "0" : "1", c0 = Math.cos(a0), s0 = Math.sin(a0), c1 = Math.cos(a1), s1 = Math.sin(a1); + return da >= d3_svg_arcMax ? r0 ? "M0," + r1 + "A" + r1 + "," + r1 + " 0 1,1 0," + -r1 + "A" + r1 + "," + r1 + " 0 1,1 0," + r1 + "M0," + r0 + "A" + r0 + "," + r0 + " 0 1,0 0," + -r0 + "A" + r0 + "," + r0 + " 0 1,0 0," + r0 + "Z" : "M0," + r1 + "A" + r1 + "," + r1 + " 0 1,1 0," + -r1 + "A" + r1 + "," + r1 + " 0 1,1 0," + r1 + "Z" : r0 ? "M" + r1 * c0 + "," + r1 * s0 + "A" + r1 + "," + r1 + " 0 " + df + ",1 " + r1 * c1 + "," + r1 * s1 + "L" + r0 * c1 + "," + r0 * s1 + "A" + r0 + "," + r0 + " 0 " + df + ",0 " + r0 * c0 + "," + r0 * s0 + "Z" : "M" + r1 * c0 + "," + r1 * s0 + "A" + r1 + "," + r1 + " 0 " + df + ",1 " + r1 * c1 + "," + r1 * s1 + "L0,0" + "Z"; + } + arc.innerRadius = function(v) { + if (!arguments.length) return innerRadius; + innerRadius = d3_functor(v); + return arc; + }; + arc.outerRadius = function(v) { + if (!arguments.length) return outerRadius; + outerRadius = d3_functor(v); + return arc; + }; + arc.startAngle = function(v) { + if (!arguments.length) return startAngle; + startAngle = d3_functor(v); + return arc; + }; + arc.endAngle = function(v) { + if (!arguments.length) return endAngle; + endAngle = d3_functor(v); + return arc; + }; + arc.centroid = function() { + var r = (innerRadius.apply(this, arguments) + outerRadius.apply(this, arguments)) / 2, a = (startAngle.apply(this, arguments) + endAngle.apply(this, arguments)) / 2 + d3_svg_arcOffset; + return [ Math.cos(a) * r, Math.sin(a) * r ]; + }; + return arc; + }; + var d3_svg_arcOffset = -π / 2, d3_svg_arcMax = 2 * π - 1e-6; + function d3_svg_arcInnerRadius(d) { + return d.innerRadius; + } + function d3_svg_arcOuterRadius(d) { + return d.outerRadius; + } + function d3_svg_arcStartAngle(d) { + return d.startAngle; + } + function d3_svg_arcEndAngle(d) { + return d.endAngle; + } + d3.svg.line.radial = function() { + var line = d3_svg_line(d3_svg_lineRadial); + line.radius = line.x, delete line.x; + line.angle = line.y, delete line.y; + return line; + }; + function d3_svg_lineRadial(points) { + var point, i = -1, n = points.length, r, a; + while (++i < n) { + point = points[i]; + r = point[0]; + a = point[1] + d3_svg_arcOffset; + point[0] = r * Math.cos(a); + point[1] = r * Math.sin(a); + } + return points; + } + function d3_svg_area(projection) { + var x0 = d3_svg_lineX, x1 = d3_svg_lineX, y0 = 0, y1 = d3_svg_lineY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, interpolateReverse = interpolate, L = "L", tension = .7; + function area(data) { + var segments = [], points0 = [], points1 = [], i = -1, n = data.length, d, fx0 = d3_functor(x0), fy0 = d3_functor(y0), fx1 = x0 === x1 ? function() { + return x; + } : d3_functor(x1), fy1 = y0 === y1 ? function() { + return y; + } : d3_functor(y1), x, y; + function segment() { + segments.push("M", interpolate(projection(points1), tension), L, interpolateReverse(projection(points0.reverse()), tension), "Z"); + } + while (++i < n) { + if (defined.call(this, d = data[i], i)) { + points0.push([ x = +fx0.call(this, d, i), y = +fy0.call(this, d, i) ]); + points1.push([ +fx1.call(this, d, i), +fy1.call(this, d, i) ]); + } else if (points0.length) { + segment(); + points0 = []; + points1 = []; + } + } + if (points0.length) segment(); + return segments.length ? segments.join("") : null; + } + area.x = function(_) { + if (!arguments.length) return x1; + x0 = x1 = _; + return area; + }; + area.x0 = function(_) { + if (!arguments.length) return x0; + x0 = _; + return area; + }; + area.x1 = function(_) { + if (!arguments.length) return x1; + x1 = _; + return area; + }; + area.y = function(_) { + if (!arguments.length) return y1; + y0 = y1 = _; + return area; + }; + area.y0 = function(_) { + if (!arguments.length) return y0; + y0 = _; + return area; + }; + area.y1 = function(_) { + if (!arguments.length) return y1; + y1 = _; + return area; + }; + area.defined = function(_) { + if (!arguments.length) return defined; + defined = _; + return area; + }; + area.interpolate = function(_) { + if (!arguments.length) return interpolateKey; + if (typeof _ === "function") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key; + interpolateReverse = interpolate.reverse || interpolate; + L = interpolate.closed ? "M" : "L"; + return area; + }; + area.tension = function(_) { + if (!arguments.length) return tension; + tension = _; + return area; + }; + return area; + } + d3_svg_lineStepBefore.reverse = d3_svg_lineStepAfter; + d3_svg_lineStepAfter.reverse = d3_svg_lineStepBefore; + d3.svg.area = function() { + return d3_svg_area(d3_identity); + }; + d3.svg.area.radial = function() { + var area = d3_svg_area(d3_svg_lineRadial); + area.radius = area.x, delete area.x; + area.innerRadius = area.x0, delete area.x0; + area.outerRadius = area.x1, delete area.x1; + area.angle = area.y, delete area.y; + area.startAngle = area.y0, delete area.y0; + area.endAngle = area.y1, delete area.y1; + return area; + }; + d3.svg.chord = function() { + var source = d3_source, target = d3_target, radius = d3_svg_chordRadius, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle; + function chord(d, i) { + var s = subgroup(this, source, d, i), t = subgroup(this, target, d, i); + return "M" + s.p0 + arc(s.r, s.p1, s.a1 - s.a0) + (equals(s, t) ? curve(s.r, s.p1, s.r, s.p0) : curve(s.r, s.p1, t.r, t.p0) + arc(t.r, t.p1, t.a1 - t.a0) + curve(t.r, t.p1, s.r, s.p0)) + "Z"; + } + function subgroup(self, f, d, i) { + var subgroup = f.call(self, d, i), r = radius.call(self, subgroup, i), a0 = startAngle.call(self, subgroup, i) + d3_svg_arcOffset, a1 = endAngle.call(self, subgroup, i) + d3_svg_arcOffset; + return { + r: r, + a0: a0, + a1: a1, + p0: [ r * Math.cos(a0), r * Math.sin(a0) ], + p1: [ r * Math.cos(a1), r * Math.sin(a1) ] + }; + } + function equals(a, b) { + return a.a0 == b.a0 && a.a1 == b.a1; + } + function arc(r, p, a) { + return "A" + r + "," + r + " 0 " + +(a > π) + ",1 " + p; + } + function curve(r0, p0, r1, p1) { + return "Q 0,0 " + p1; + } + chord.radius = function(v) { + if (!arguments.length) return radius; + radius = d3_functor(v); + return chord; + }; + chord.source = function(v) { + if (!arguments.length) return source; + source = d3_functor(v); + return chord; + }; + chord.target = function(v) { + if (!arguments.length) return target; + target = d3_functor(v); + return chord; + }; + chord.startAngle = function(v) { + if (!arguments.length) return startAngle; + startAngle = d3_functor(v); + return chord; + }; + chord.endAngle = function(v) { + if (!arguments.length) return endAngle; + endAngle = d3_functor(v); + return chord; + }; + return chord; + }; + function d3_svg_chordRadius(d) { + return d.radius; + } + d3.svg.diagonal = function() { + var source = d3_source, target = d3_target, projection = d3_svg_diagonalProjection; + function diagonal(d, i) { + var p0 = source.call(this, d, i), p3 = target.call(this, d, i), m = (p0.y + p3.y) / 2, p = [ p0, { + x: p0.x, + y: m + }, { + x: p3.x, + y: m + }, p3 ]; + p = p.map(projection); + return "M" + p[0] + "C" + p[1] + " " + p[2] + " " + p[3]; + } + diagonal.source = function(x) { + if (!arguments.length) return source; + source = d3_functor(x); + return diagonal; + }; + diagonal.target = function(x) { + if (!arguments.length) return target; + target = d3_functor(x); + return diagonal; + }; + diagonal.projection = function(x) { + if (!arguments.length) return projection; + projection = x; + return diagonal; + }; + return diagonal; + }; + function d3_svg_diagonalProjection(d) { + return [ d.x, d.y ]; + } + d3.svg.diagonal.radial = function() { + var diagonal = d3.svg.diagonal(), projection = d3_svg_diagonalProjection, projection_ = diagonal.projection; + diagonal.projection = function(x) { + return arguments.length ? projection_(d3_svg_diagonalRadialProjection(projection = x)) : projection; + }; + return diagonal; + }; + function d3_svg_diagonalRadialProjection(projection) { + return function() { + var d = projection.apply(this, arguments), r = d[0], a = d[1] + d3_svg_arcOffset; + return [ r * Math.cos(a), r * Math.sin(a) ]; + }; + } + d3.svg.symbol = function() { + var type = d3_svg_symbolType, size = d3_svg_symbolSize; + function symbol(d, i) { + return (d3_svg_symbols.get(type.call(this, d, i)) || d3_svg_symbolCircle)(size.call(this, d, i)); + } + symbol.type = function(x) { + if (!arguments.length) return type; + type = d3_functor(x); + return symbol; + }; + symbol.size = function(x) { + if (!arguments.length) return size; + size = d3_functor(x); + return symbol; + }; + return symbol; + }; + function d3_svg_symbolSize() { + return 64; + } + function d3_svg_symbolType() { + return "circle"; + } + function d3_svg_symbolCircle(size) { + var r = Math.sqrt(size / π); + return "M0," + r + "A" + r + "," + r + " 0 1,1 0," + -r + "A" + r + "," + r + " 0 1,1 0," + r + "Z"; + } + var d3_svg_symbols = d3.map({ + circle: d3_svg_symbolCircle, + cross: function(size) { + var r = Math.sqrt(size / 5) / 2; + return "M" + -3 * r + "," + -r + "H" + -r + "V" + -3 * r + "H" + r + "V" + -r + "H" + 3 * r + "V" + r + "H" + r + "V" + 3 * r + "H" + -r + "V" + r + "H" + -3 * r + "Z"; + }, + diamond: function(size) { + var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)), rx = ry * d3_svg_symbolTan30; + return "M0," + -ry + "L" + rx + ",0" + " 0," + ry + " " + -rx + ",0" + "Z"; + }, + square: function(size) { + var r = Math.sqrt(size) / 2; + return "M" + -r + "," + -r + "L" + r + "," + -r + " " + r + "," + r + " " + -r + "," + r + "Z"; + }, + "triangle-down": function(size) { + var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2; + return "M0," + ry + "L" + rx + "," + -ry + " " + -rx + "," + -ry + "Z"; + }, + "triangle-up": function(size) { + var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2; + return "M0," + -ry + "L" + rx + "," + ry + " " + -rx + "," + ry + "Z"; + } + }); + d3.svg.symbolTypes = d3_svg_symbols.keys(); + var d3_svg_symbolSqrt3 = Math.sqrt(3), d3_svg_symbolTan30 = Math.tan(30 * d3_radians); + function d3_transition(groups, id) { + d3_subclass(groups, d3_transitionPrototype); + groups.id = id; + return groups; + } + var d3_transitionPrototype = [], d3_transitionId = 0, d3_transitionInheritId, d3_transitionInherit; + d3_transitionPrototype.call = d3_selectionPrototype.call; + d3_transitionPrototype.empty = d3_selectionPrototype.empty; + d3_transitionPrototype.node = d3_selectionPrototype.node; + d3_transitionPrototype.size = d3_selectionPrototype.size; + d3.transition = function(selection) { + return arguments.length ? d3_transitionInheritId ? selection.transition() : selection : d3_selectionRoot.transition(); + }; + d3.transition.prototype = d3_transitionPrototype; + d3_transitionPrototype.select = function(selector) { + var id = this.id, subgroups = [], subgroup, subnode, node; + selector = d3_selection_selector(selector); + for (var j = -1, m = this.length; ++j < m; ) { + subgroups.push(subgroup = []); + for (var group = this[j], i = -1, n = group.length; ++i < n; ) { + if ((node = group[i]) && (subnode = selector.call(node, node.__data__, i, j))) { + if ("__data__" in node) subnode.__data__ = node.__data__; + d3_transitionNode(subnode, i, id, node.__transition__[id]); + subgroup.push(subnode); + } else { + subgroup.push(null); + } + } + } + return d3_transition(subgroups, id); + }; + d3_transitionPrototype.selectAll = function(selector) { + var id = this.id, subgroups = [], subgroup, subnodes, node, subnode, transition; + selector = d3_selection_selectorAll(selector); + for (var j = -1, m = this.length; ++j < m; ) { + for (var group = this[j], i = -1, n = group.length; ++i < n; ) { + if (node = group[i]) { + transition = node.__transition__[id]; + subnodes = selector.call(node, node.__data__, i, j); + subgroups.push(subgroup = []); + for (var k = -1, o = subnodes.length; ++k < o; ) { + if (subnode = subnodes[k]) d3_transitionNode(subnode, k, id, transition); + subgroup.push(subnode); + } + } + } + } + return d3_transition(subgroups, id); + }; + d3_transitionPrototype.filter = function(filter) { + var subgroups = [], subgroup, group, node; + if (typeof filter !== "function") filter = d3_selection_filter(filter); + for (var j = 0, m = this.length; j < m; j++) { + subgroups.push(subgroup = []); + for (var group = this[j], i = 0, n = group.length; i < n; i++) { + if ((node = group[i]) && filter.call(node, node.__data__, i)) { + subgroup.push(node); + } + } + } + return d3_transition(subgroups, this.id); + }; + d3_transitionPrototype.tween = function(name, tween) { + var id = this.id; + if (arguments.length < 2) return this.node().__transition__[id].tween.get(name); + return d3_selection_each(this, tween == null ? function(node) { + node.__transition__[id].tween.remove(name); + } : function(node) { + node.__transition__[id].tween.set(name, tween); + }); + }; + function d3_transition_tween(groups, name, value, tween) { + var id = groups.id; + return d3_selection_each(groups, typeof value === "function" ? function(node, i, j) { + node.__transition__[id].tween.set(name, tween(value.call(node, node.__data__, i, j))); + } : (value = tween(value), function(node) { + node.__transition__[id].tween.set(name, value); + })); + } + d3_transitionPrototype.attr = function(nameNS, value) { + if (arguments.length < 2) { + for (value in nameNS) this.attr(value, nameNS[value]); + return this; + } + var interpolate = nameNS == "transform" ? d3_interpolateTransform : d3_interpolate, name = d3.ns.qualify(nameNS); + function attrNull() { + this.removeAttribute(name); + } + function attrNullNS() { + this.removeAttributeNS(name.space, name.local); + } + function attrTween(b) { + return b == null ? attrNull : (b += "", function() { + var a = this.getAttribute(name), i; + return a !== b && (i = interpolate(a, b), function(t) { + this.setAttribute(name, i(t)); + }); + }); + } + function attrTweenNS(b) { + return b == null ? attrNullNS : (b += "", function() { + var a = this.getAttributeNS(name.space, name.local), i; + return a !== b && (i = interpolate(a, b), function(t) { + this.setAttributeNS(name.space, name.local, i(t)); + }); + }); + } + return d3_transition_tween(this, "attr." + nameNS, value, name.local ? attrTweenNS : attrTween); + }; + d3_transitionPrototype.attrTween = function(nameNS, tween) { + var name = d3.ns.qualify(nameNS); + function attrTween(d, i) { + var f = tween.call(this, d, i, this.getAttribute(name)); + return f && function(t) { + this.setAttribute(name, f(t)); + }; + } + function attrTweenNS(d, i) { + var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local)); + return f && function(t) { + this.setAttributeNS(name.space, name.local, f(t)); + }; + } + return this.tween("attr." + nameNS, name.local ? attrTweenNS : attrTween); + }; + d3_transitionPrototype.style = function(name, value, priority) { + var n = arguments.length; + if (n < 3) { + if (typeof name !== "string") { + if (n < 2) value = ""; + for (priority in name) this.style(priority, name[priority], value); + return this; + } + priority = ""; + } + function styleNull() { + this.style.removeProperty(name); + } + function styleString(b) { + return b == null ? styleNull : (b += "", function() { + var a = d3_window.getComputedStyle(this, null).getPropertyValue(name), i; + return a !== b && (i = d3_interpolate(a, b), function(t) { + this.style.setProperty(name, i(t), priority); + }); + }); + } + return d3_transition_tween(this, "style." + name, value, styleString); + }; + d3_transitionPrototype.styleTween = function(name, tween, priority) { + if (arguments.length < 3) priority = ""; + function styleTween(d, i) { + var f = tween.call(this, d, i, d3_window.getComputedStyle(this, null).getPropertyValue(name)); + return f && function(t) { + this.style.setProperty(name, f(t), priority); + }; + } + return this.tween("style." + name, styleTween); + }; + d3_transitionPrototype.text = function(value) { + return d3_transition_tween(this, "text", value, d3_transition_text); + }; + function d3_transition_text(b) { + if (b == null) b = ""; + return function() { + this.textContent = b; + }; + } + d3_transitionPrototype.remove = function() { + return this.each("end.transition", function() { + var p; + if (this.__transition__.count < 2 && (p = this.parentNode)) p.removeChild(this); + }); + }; + d3_transitionPrototype.ease = function(value) { + var id = this.id; + if (arguments.length < 1) return this.node().__transition__[id].ease; + if (typeof value !== "function") value = d3.ease.apply(d3, arguments); + return d3_selection_each(this, function(node) { + node.__transition__[id].ease = value; + }); + }; + d3_transitionPrototype.delay = function(value) { + var id = this.id; + return d3_selection_each(this, typeof value === "function" ? function(node, i, j) { + node.__transition__[id].delay = +value.call(node, node.__data__, i, j); + } : (value = +value, function(node) { + node.__transition__[id].delay = value; + })); + }; + d3_transitionPrototype.duration = function(value) { + var id = this.id; + return d3_selection_each(this, typeof value === "function" ? function(node, i, j) { + node.__transition__[id].duration = Math.max(1, value.call(node, node.__data__, i, j)); + } : (value = Math.max(1, value), function(node) { + node.__transition__[id].duration = value; + })); + }; + d3_transitionPrototype.each = function(type, listener) { + var id = this.id; + if (arguments.length < 2) { + var inherit = d3_transitionInherit, inheritId = d3_transitionInheritId; + d3_transitionInheritId = id; + d3_selection_each(this, function(node, i, j) { + d3_transitionInherit = node.__transition__[id]; + type.call(node, node.__data__, i, j); + }); + d3_transitionInherit = inherit; + d3_transitionInheritId = inheritId; + } else { + d3_selection_each(this, function(node) { + var transition = node.__transition__[id]; + (transition.event || (transition.event = d3.dispatch("start", "end"))).on(type, listener); + }); + } + return this; + }; + d3_transitionPrototype.transition = function() { + var id0 = this.id, id1 = ++d3_transitionId, subgroups = [], subgroup, group, node, transition; + for (var j = 0, m = this.length; j < m; j++) { + subgroups.push(subgroup = []); + for (var group = this[j], i = 0, n = group.length; i < n; i++) { + if (node = group[i]) { + transition = Object.create(node.__transition__[id0]); + transition.delay += transition.duration; + d3_transitionNode(node, i, id1, transition); + } + subgroup.push(node); + } + } + return d3_transition(subgroups, id1); + }; + function d3_transitionNode(node, i, id, inherit) { + var lock = node.__transition__ || (node.__transition__ = { + active: 0, + count: 0 + }), transition = lock[id]; + if (!transition) { + var time = inherit.time; + transition = lock[id] = { + tween: new d3_Map(), + time: time, + ease: inherit.ease, + delay: inherit.delay, + duration: inherit.duration + }; + ++lock.count; + d3.timer(function(elapsed) { + var d = node.__data__, ease = transition.ease, delay = transition.delay, duration = transition.duration, tweened = []; + if (delay <= elapsed) return start(elapsed); + d3_timer_replace(start, delay, time); + function start(elapsed) { + if (lock.active > id) return stop(); + lock.active = id; + transition.event && transition.event.start.call(node, d, i); + transition.tween.forEach(function(key, value) { + if (value = value.call(node, d, i)) { + tweened.push(value); + } + }); + if (tick(elapsed)) return 1; + d3_timer_replace(tick, 0, time); + } + function tick(elapsed) { + if (lock.active !== id) return stop(); + var t = (elapsed - delay) / duration, e = ease(t), n = tweened.length; + while (n > 0) { + tweened[--n].call(node, e); + } + if (t >= 1) { + transition.event && transition.event.end.call(node, d, i); + return stop(); + } + } + function stop() { + if (--lock.count) delete lock[id]; else delete node.__transition__; + return 1; + } + }, 0, time); + } + } + d3.svg.axis = function() { + var scale = d3.scale.linear(), orient = d3_svg_axisDefaultOrient, innerTickSize = 6, outerTickSize = 6, tickPadding = 3, tickArguments_ = [ 10 ], tickValues = null, tickFormat_; + function axis(g) { + g.each(function() { + var g = d3.select(this); + var ticks = tickValues == null ? scale.ticks ? scale.ticks.apply(scale, tickArguments_) : scale.domain() : tickValues, tickFormat = tickFormat_ == null ? scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments_) : d3_identity : tickFormat_, tick = g.selectAll(".tick").data(ticks, d3_identity), tickEnter = tick.enter().insert("g", ".domain").attr("class", "tick").style("opacity", 1e-6), tickExit = d3.transition(tick.exit()).style("opacity", 1e-6).remove(), tickUpdate = d3.transition(tick).style("opacity", 1), tickTransform; + var range = d3_scaleRange(scale), path = g.selectAll(".domain").data([ 0 ]), pathUpdate = (path.enter().append("path").attr("class", "domain"), + d3.transition(path)); + var scale1 = scale.copy(), scale0 = this.__chart__ || scale1; + this.__chart__ = scale1; + tickEnter.append("line"); + tickEnter.append("text"); + var lineEnter = tickEnter.select("line"), lineUpdate = tickUpdate.select("line"), text = tick.select("text").text(tickFormat), textEnter = tickEnter.select("text"), textUpdate = tickUpdate.select("text"); + switch (orient) { + case "bottom": + { + tickTransform = d3_svg_axisX; + lineEnter.attr("y2", innerTickSize); + textEnter.attr("y", Math.max(innerTickSize, 0) + tickPadding); + lineUpdate.attr("x2", 0).attr("y2", innerTickSize); + textUpdate.attr("x", 0).attr("y", Math.max(innerTickSize, 0) + tickPadding); + text.attr("dy", ".71em").style("text-anchor", "middle"); + pathUpdate.attr("d", "M" + range[0] + "," + outerTickSize + "V0H" + range[1] + "V" + outerTickSize); + break; + } + + case "top": + { + tickTransform = d3_svg_axisX; + lineEnter.attr("y2", -innerTickSize); + textEnter.attr("y", -(Math.max(innerTickSize, 0) + tickPadding)); + lineUpdate.attr("x2", 0).attr("y2", -innerTickSize); + textUpdate.attr("x", 0).attr("y", -(Math.max(innerTickSize, 0) + tickPadding)); + text.attr("dy", "0em").style("text-anchor", "middle"); + pathUpdate.attr("d", "M" + range[0] + "," + -outerTickSize + "V0H" + range[1] + "V" + -outerTickSize); + break; + } + + case "left": + { + tickTransform = d3_svg_axisY; + lineEnter.attr("x2", -innerTickSize); + textEnter.attr("x", -(Math.max(innerTickSize, 0) + tickPadding)); + lineUpdate.attr("x2", -innerTickSize).attr("y2", 0); + textUpdate.attr("x", -(Math.max(innerTickSize, 0) + tickPadding)).attr("y", 0); + text.attr("dy", ".32em").style("text-anchor", "end"); + pathUpdate.attr("d", "M" + -outerTickSize + "," + range[0] + "H0V" + range[1] + "H" + -outerTickSize); + break; + } + + case "right": + { + tickTransform = d3_svg_axisY; + lineEnter.attr("x2", innerTickSize); + textEnter.attr("x", Math.max(innerTickSize, 0) + tickPadding); + lineUpdate.attr("x2", innerTickSize).attr("y2", 0); + textUpdate.attr("x", Math.max(innerTickSize, 0) + tickPadding).attr("y", 0); + text.attr("dy", ".32em").style("text-anchor", "start"); + pathUpdate.attr("d", "M" + outerTickSize + "," + range[0] + "H0V" + range[1] + "H" + outerTickSize); + break; + } + } + if (scale.rangeBand) { + var dx = scale1.rangeBand() / 2, x = function(d) { + return scale1(d) + dx; + }; + tickEnter.call(tickTransform, x); + tickUpdate.call(tickTransform, x); + } else { + tickEnter.call(tickTransform, scale0); + tickUpdate.call(tickTransform, scale1); + tickExit.call(tickTransform, scale1); + } + }); + } + axis.scale = function(x) { + if (!arguments.length) return scale; + scale = x; + return axis; + }; + axis.orient = function(x) { + if (!arguments.length) return orient; + orient = x in d3_svg_axisOrients ? x + "" : d3_svg_axisDefaultOrient; + return axis; + }; + axis.ticks = function() { + if (!arguments.length) return tickArguments_; + tickArguments_ = arguments; + return axis; + }; + axis.tickValues = function(x) { + if (!arguments.length) return tickValues; + tickValues = x; + return axis; + }; + axis.tickFormat = function(x) { + if (!arguments.length) return tickFormat_; + tickFormat_ = x; + return axis; + }; + axis.tickSize = function(x) { + var n = arguments.length; + if (!n) return innerTickSize; + innerTickSize = +x; + outerTickSize = +arguments[n - 1]; + return axis; + }; + axis.innerTickSize = function(x) { + if (!arguments.length) return innerTickSize; + innerTickSize = +x; + return axis; + }; + axis.outerTickSize = function(x) { + if (!arguments.length) return outerTickSize; + outerTickSize = +x; + return axis; + }; + axis.tickPadding = function(x) { + if (!arguments.length) return tickPadding; + tickPadding = +x; + return axis; + }; + axis.tickSubdivide = function() { + return arguments.length && axis; + }; + return axis; + }; + var d3_svg_axisDefaultOrient = "bottom", d3_svg_axisOrients = { + top: 1, + right: 1, + bottom: 1, + left: 1 + }; + function d3_svg_axisX(selection, x) { + selection.attr("transform", function(d) { + return "translate(" + x(d) + ",0)"; + }); + } + function d3_svg_axisY(selection, y) { + selection.attr("transform", function(d) { + return "translate(0," + y(d) + ")"; + }); + } + d3.svg.brush = function() { + var event = d3_eventDispatch(brush, "brushstart", "brush", "brushend"), x = null, y = null, xExtent = [ 0, 0 ], yExtent = [ 0, 0 ], xExtentDomain, yExtentDomain, xClamp = true, yClamp = true, resizes = d3_svg_brushResizes[0]; + function brush(g) { + g.each(function() { + var g = d3.select(this).style("pointer-events", "all").style("-webkit-tap-highlight-color", "rgba(0,0,0,0)").on("mousedown.brush", brushstart).on("touchstart.brush", brushstart); + var background = g.selectAll(".background").data([ 0 ]); + background.enter().append("rect").attr("class", "background").style("visibility", "hidden").style("cursor", "crosshair"); + g.selectAll(".extent").data([ 0 ]).enter().append("rect").attr("class", "extent").style("cursor", "move"); + var resize = g.selectAll(".resize").data(resizes, d3_identity); + resize.exit().remove(); + resize.enter().append("g").attr("class", function(d) { + return "resize " + d; + }).style("cursor", function(d) { + return d3_svg_brushCursor[d]; + }).append("rect").attr("x", function(d) { + return /[ew]$/.test(d) ? -3 : null; + }).attr("y", function(d) { + return /^[ns]/.test(d) ? -3 : null; + }).attr("width", 6).attr("height", 6).style("visibility", "hidden"); + resize.style("display", brush.empty() ? "none" : null); + var gUpdate = d3.transition(g), backgroundUpdate = d3.transition(background), range; + if (x) { + range = d3_scaleRange(x); + backgroundUpdate.attr("x", range[0]).attr("width", range[1] - range[0]); + redrawX(gUpdate); + } + if (y) { + range = d3_scaleRange(y); + backgroundUpdate.attr("y", range[0]).attr("height", range[1] - range[0]); + redrawY(gUpdate); + } + redraw(gUpdate); + }); + } + brush.event = function(g) { + g.each(function() { + var event_ = event.of(this, arguments), extent1 = { + x: xExtent, + y: yExtent, + i: xExtentDomain, + j: yExtentDomain + }, extent0 = this.__chart__ || extent1; + this.__chart__ = extent1; + if (d3_transitionInheritId) { + d3.select(this).transition().each("start.brush", function() { + xExtentDomain = extent0.i; + yExtentDomain = extent0.j; + xExtent = extent0.x; + yExtent = extent0.y; + event_({ + type: "brushstart" + }); + }).tween("brush:brush", function() { + var xi = d3_interpolateArray(xExtent, extent1.x), yi = d3_interpolateArray(yExtent, extent1.y); + xExtentDomain = yExtentDomain = null; + return function(t) { + xExtent = extent1.x = xi(t); + yExtent = extent1.y = yi(t); + event_({ + type: "brush", + mode: "resize" + }); + }; + }).each("end.brush", function() { + xExtentDomain = extent1.i; + yExtentDomain = extent1.j; + event_({ + type: "brush", + mode: "resize" + }); + event_({ + type: "brushend" + }); + }); + } else { + event_({ + type: "brushstart" + }); + event_({ + type: "brush", + mode: "resize" + }); + event_({ + type: "brushend" + }); + } + }); + }; + function redraw(g) { + g.selectAll(".resize").attr("transform", function(d) { + return "translate(" + xExtent[+/e$/.test(d)] + "," + yExtent[+/^s/.test(d)] + ")"; + }); + } + function redrawX(g) { + g.select(".extent").attr("x", xExtent[0]); + g.selectAll(".extent,.n>rect,.s>rect").attr("width", xExtent[1] - xExtent[0]); + } + function redrawY(g) { + g.select(".extent").attr("y", yExtent[0]); + g.selectAll(".extent,.e>rect,.w>rect").attr("height", yExtent[1] - yExtent[0]); + } + function brushstart() { + var target = this, eventTarget = d3.select(d3.event.target), event_ = event.of(target, arguments), g = d3.select(target), resizing = eventTarget.datum(), resizingX = !/^(n|s)$/.test(resizing) && x, resizingY = !/^(e|w)$/.test(resizing) && y, dragging = eventTarget.classed("extent"), dragRestore = d3_event_dragSuppress(), center, origin = d3.mouse(target), offset; + var w = d3.select(d3_window).on("keydown.brush", keydown).on("keyup.brush", keyup); + if (d3.event.changedTouches) { + w.on("touchmove.brush", brushmove).on("touchend.brush", brushend); + } else { + w.on("mousemove.brush", brushmove).on("mouseup.brush", brushend); + } + g.interrupt().selectAll("*").interrupt(); + if (dragging) { + origin[0] = xExtent[0] - origin[0]; + origin[1] = yExtent[0] - origin[1]; + } else if (resizing) { + var ex = +/w$/.test(resizing), ey = +/^n/.test(resizing); + offset = [ xExtent[1 - ex] - origin[0], yExtent[1 - ey] - origin[1] ]; + origin[0] = xExtent[ex]; + origin[1] = yExtent[ey]; + } else if (d3.event.altKey) center = origin.slice(); + g.style("pointer-events", "none").selectAll(".resize").style("display", null); + d3.select("body").style("cursor", eventTarget.style("cursor")); + event_({ + type: "brushstart" + }); + brushmove(); + function keydown() { + if (d3.event.keyCode == 32) { + if (!dragging) { + center = null; + origin[0] -= xExtent[1]; + origin[1] -= yExtent[1]; + dragging = 2; + } + d3_eventPreventDefault(); + } + } + function keyup() { + if (d3.event.keyCode == 32 && dragging == 2) { + origin[0] += xExtent[1]; + origin[1] += yExtent[1]; + dragging = 0; + d3_eventPreventDefault(); + } + } + function brushmove() { + var point = d3.mouse(target), moved = false; + if (offset) { + point[0] += offset[0]; + point[1] += offset[1]; + } + if (!dragging) { + if (d3.event.altKey) { + if (!center) center = [ (xExtent[0] + xExtent[1]) / 2, (yExtent[0] + yExtent[1]) / 2 ]; + origin[0] = xExtent[+(point[0] < center[0])]; + origin[1] = yExtent[+(point[1] < center[1])]; + } else center = null; + } + if (resizingX && move1(point, x, 0)) { + redrawX(g); + moved = true; + } + if (resizingY && move1(point, y, 1)) { + redrawY(g); + moved = true; + } + if (moved) { + redraw(g); + event_({ + type: "brush", + mode: dragging ? "move" : "resize" + }); + } + } + function move1(point, scale, i) { + var range = d3_scaleRange(scale), r0 = range[0], r1 = range[1], position = origin[i], extent = i ? yExtent : xExtent, size = extent[1] - extent[0], min, max; + if (dragging) { + r0 -= position; + r1 -= size + position; + } + min = (i ? yClamp : xClamp) ? Math.max(r0, Math.min(r1, point[i])) : point[i]; + if (dragging) { + max = (min += position) + size; + } else { + if (center) position = Math.max(r0, Math.min(r1, 2 * center[i] - min)); + if (position < min) { + max = min; + min = position; + } else { + max = position; + } + } + if (extent[0] != min || extent[1] != max) { + if (i) yExtentDomain = null; else xExtentDomain = null; + extent[0] = min; + extent[1] = max; + return true; + } + } + function brushend() { + brushmove(); + g.style("pointer-events", "all").selectAll(".resize").style("display", brush.empty() ? "none" : null); + d3.select("body").style("cursor", null); + w.on("mousemove.brush", null).on("mouseup.brush", null).on("touchmove.brush", null).on("touchend.brush", null).on("keydown.brush", null).on("keyup.brush", null); + dragRestore(); + event_({ + type: "brushend" + }); + } + } + brush.x = function(z) { + if (!arguments.length) return x; + x = z; + resizes = d3_svg_brushResizes[!x << 1 | !y]; + return brush; + }; + brush.y = function(z) { + if (!arguments.length) return y; + y = z; + resizes = d3_svg_brushResizes[!x << 1 | !y]; + return brush; + }; + brush.clamp = function(z) { + if (!arguments.length) return x && y ? [ xClamp, yClamp ] : x ? xClamp : y ? yClamp : null; + if (x && y) xClamp = !!z[0], yClamp = !!z[1]; else if (x) xClamp = !!z; else if (y) yClamp = !!z; + return brush; + }; + brush.extent = function(z) { + var x0, x1, y0, y1, t; + if (!arguments.length) { + if (x) { + if (xExtentDomain) { + x0 = xExtentDomain[0], x1 = xExtentDomain[1]; + } else { + x0 = xExtent[0], x1 = xExtent[1]; + if (x.invert) x0 = x.invert(x0), x1 = x.invert(x1); + if (x1 < x0) t = x0, x0 = x1, x1 = t; + } + } + if (y) { + if (yExtentDomain) { + y0 = yExtentDomain[0], y1 = yExtentDomain[1]; + } else { + y0 = yExtent[0], y1 = yExtent[1]; + if (y.invert) y0 = y.invert(y0), y1 = y.invert(y1); + if (y1 < y0) t = y0, y0 = y1, y1 = t; + } + } + return x && y ? [ [ x0, y0 ], [ x1, y1 ] ] : x ? [ x0, x1 ] : y && [ y0, y1 ]; + } + if (x) { + x0 = z[0], x1 = z[1]; + if (y) x0 = x0[0], x1 = x1[0]; + xExtentDomain = [ x0, x1 ]; + if (x.invert) x0 = x(x0), x1 = x(x1); + if (x1 < x0) t = x0, x0 = x1, x1 = t; + if (x0 != xExtent[0] || x1 != xExtent[1]) xExtent = [ x0, x1 ]; + } + if (y) { + y0 = z[0], y1 = z[1]; + if (x) y0 = y0[1], y1 = y1[1]; + yExtentDomain = [ y0, y1 ]; + if (y.invert) y0 = y(y0), y1 = y(y1); + if (y1 < y0) t = y0, y0 = y1, y1 = t; + if (y0 != yExtent[0] || y1 != yExtent[1]) yExtent = [ y0, y1 ]; + } + return brush; + }; + brush.clear = function() { + if (!brush.empty()) { + xExtent = [ 0, 0 ], yExtent = [ 0, 0 ]; + xExtentDomain = yExtentDomain = null; + } + return brush; + }; + brush.empty = function() { + return !!x && xExtent[0] == xExtent[1] || !!y && yExtent[0] == yExtent[1]; + }; + return d3.rebind(brush, event, "on"); + }; + var d3_svg_brushCursor = { + n: "ns-resize", + e: "ew-resize", + s: "ns-resize", + w: "ew-resize", + nw: "nwse-resize", + ne: "nesw-resize", + se: "nwse-resize", + sw: "nesw-resize" + }; + var d3_svg_brushResizes = [ [ "n", "e", "s", "w", "nw", "ne", "se", "sw" ], [ "e", "w" ], [ "n", "s" ], [] ]; + var d3_time = d3.time = {}, d3_date = Date, d3_time_daySymbols = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ]; + function d3_date_utc() { + this._ = new Date(arguments.length > 1 ? Date.UTC.apply(this, arguments) : arguments[0]); + } + d3_date_utc.prototype = { + getDate: function() { + return this._.getUTCDate(); + }, + getDay: function() { + return this._.getUTCDay(); + }, + getFullYear: function() { + return this._.getUTCFullYear(); + }, + getHours: function() { + return this._.getUTCHours(); + }, + getMilliseconds: function() { + return this._.getUTCMilliseconds(); + }, + getMinutes: function() { + return this._.getUTCMinutes(); + }, + getMonth: function() { + return this._.getUTCMonth(); + }, + getSeconds: function() { + return this._.getUTCSeconds(); + }, + getTime: function() { + return this._.getTime(); + }, + getTimezoneOffset: function() { + return 0; + }, + valueOf: function() { + return this._.valueOf(); + }, + setDate: function() { + d3_time_prototype.setUTCDate.apply(this._, arguments); + }, + setDay: function() { + d3_time_prototype.setUTCDay.apply(this._, arguments); + }, + setFullYear: function() { + d3_time_prototype.setUTCFullYear.apply(this._, arguments); + }, + setHours: function() { + d3_time_prototype.setUTCHours.apply(this._, arguments); + }, + setMilliseconds: function() { + d3_time_prototype.setUTCMilliseconds.apply(this._, arguments); + }, + setMinutes: function() { + d3_time_prototype.setUTCMinutes.apply(this._, arguments); + }, + setMonth: function() { + d3_time_prototype.setUTCMonth.apply(this._, arguments); + }, + setSeconds: function() { + d3_time_prototype.setUTCSeconds.apply(this._, arguments); + }, + setTime: function() { + d3_time_prototype.setTime.apply(this._, arguments); + } + }; + var d3_time_prototype = Date.prototype; + var d3_time_formatDateTime = "%a %b %e %X %Y", d3_time_formatDate = "%m/%d/%Y", d3_time_formatTime = "%H:%M:%S"; + var d3_time_days = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ], d3_time_dayAbbreviations = [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ], d3_time_months = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ], d3_time_monthAbbreviations = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ]; + function d3_time_interval(local, step, number) { + function round(date) { + var d0 = local(date), d1 = offset(d0, 1); + return date - d0 < d1 - date ? d0 : d1; + } + function ceil(date) { + step(date = local(new d3_date(date - 1)), 1); + return date; + } + function offset(date, k) { + step(date = new d3_date(+date), k); + return date; + } + function range(t0, t1, dt) { + var time = ceil(t0), times = []; + if (dt > 1) { + while (time < t1) { + if (!(number(time) % dt)) times.push(new Date(+time)); + step(time, 1); + } + } else { + while (time < t1) times.push(new Date(+time)), step(time, 1); + } + return times; + } + function range_utc(t0, t1, dt) { + try { + d3_date = d3_date_utc; + var utc = new d3_date_utc(); + utc._ = t0; + return range(utc, t1, dt); + } finally { + d3_date = Date; + } + } + local.floor = local; + local.round = round; + local.ceil = ceil; + local.offset = offset; + local.range = range; + var utc = local.utc = d3_time_interval_utc(local); + utc.floor = utc; + utc.round = d3_time_interval_utc(round); + utc.ceil = d3_time_interval_utc(ceil); + utc.offset = d3_time_interval_utc(offset); + utc.range = range_utc; + return local; + } + function d3_time_interval_utc(method) { + return function(date, k) { + try { + d3_date = d3_date_utc; + var utc = new d3_date_utc(); + utc._ = date; + return method(utc, k)._; + } finally { + d3_date = Date; + } + }; + } + d3_time.year = d3_time_interval(function(date) { + date = d3_time.day(date); + date.setMonth(0, 1); + return date; + }, function(date, offset) { + date.setFullYear(date.getFullYear() + offset); + }, function(date) { + return date.getFullYear(); + }); + d3_time.years = d3_time.year.range; + d3_time.years.utc = d3_time.year.utc.range; + d3_time.day = d3_time_interval(function(date) { + var day = new d3_date(2e3, 0); + day.setFullYear(date.getFullYear(), date.getMonth(), date.getDate()); + return day; + }, function(date, offset) { + date.setDate(date.getDate() + offset); + }, function(date) { + return date.getDate() - 1; + }); + d3_time.days = d3_time.day.range; + d3_time.days.utc = d3_time.day.utc.range; + d3_time.dayOfYear = function(date) { + var year = d3_time.year(date); + return Math.floor((date - year - (date.getTimezoneOffset() - year.getTimezoneOffset()) * 6e4) / 864e5); + }; + d3_time_daySymbols.forEach(function(day, i) { + day = day.toLowerCase(); + i = 7 - i; + var interval = d3_time[day] = d3_time_interval(function(date) { + (date = d3_time.day(date)).setDate(date.getDate() - (date.getDay() + i) % 7); + return date; + }, function(date, offset) { + date.setDate(date.getDate() + Math.floor(offset) * 7); + }, function(date) { + var day = d3_time.year(date).getDay(); + return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7) - (day !== i); + }); + d3_time[day + "s"] = interval.range; + d3_time[day + "s"].utc = interval.utc.range; + d3_time[day + "OfYear"] = function(date) { + var day = d3_time.year(date).getDay(); + return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7); + }; + }); + d3_time.week = d3_time.sunday; + d3_time.weeks = d3_time.sunday.range; + d3_time.weeks.utc = d3_time.sunday.utc.range; + d3_time.weekOfYear = d3_time.sundayOfYear; + d3_time.format = d3_time_format; + function d3_time_format(template) { + var n = template.length; + function format(date) { + var string = [], i = -1, j = 0, c, p, f; + while (++i < n) { + if (template.charCodeAt(i) === 37) { + string.push(template.substring(j, i)); + if ((p = d3_time_formatPads[c = template.charAt(++i)]) != null) c = template.charAt(++i); + if (f = d3_time_formats[c]) c = f(date, p == null ? c === "e" ? " " : "0" : p); + string.push(c); + j = i + 1; + } + } + string.push(template.substring(j, i)); + return string.join(""); + } + format.parse = function(string) { + var d = { + y: 1900, + m: 0, + d: 1, + H: 0, + M: 0, + S: 0, + L: 0, + Z: null + }, i = d3_time_parse(d, template, string, 0); + if (i != string.length) return null; + if ("p" in d) d.H = d.H % 12 + d.p * 12; + var localZ = d.Z != null && d3_date !== d3_date_utc, date = new (localZ ? d3_date_utc : d3_date)(); + if ("j" in d) date.setFullYear(d.y, 0, d.j); else if ("w" in d && ("W" in d || "U" in d)) { + date.setFullYear(d.y, 0, 1); + date.setFullYear(d.y, 0, "W" in d ? (d.w + 6) % 7 + d.W * 7 - (date.getDay() + 5) % 7 : d.w + d.U * 7 - (date.getDay() + 6) % 7); + } else date.setFullYear(d.y, d.m, d.d); + date.setHours(d.H + Math.floor(d.Z / 100), d.M + d.Z % 100, d.S, d.L); + return localZ ? date._ : date; + }; + format.toString = function() { + return template; + }; + return format; + } + function d3_time_parse(date, template, string, j) { + var c, p, t, i = 0, n = template.length, m = string.length; + while (i < n) { + if (j >= m) return -1; + c = template.charCodeAt(i++); + if (c === 37) { + t = template.charAt(i++); + p = d3_time_parsers[t in d3_time_formatPads ? template.charAt(i++) : t]; + if (!p || (j = p(date, string, j)) < 0) return -1; + } else if (c != string.charCodeAt(j++)) { + return -1; + } + } + return j; + } + function d3_time_formatRe(names) { + return new RegExp("^(?:" + names.map(d3.requote).join("|") + ")", "i"); + } + function d3_time_formatLookup(names) { + var map = new d3_Map(), i = -1, n = names.length; + while (++i < n) map.set(names[i].toLowerCase(), i); + return map; + } + function d3_time_formatPad(value, fill, width) { + var sign = value < 0 ? "-" : "", string = (sign ? -value : value) + "", length = string.length; + return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string); + } + var d3_time_dayRe = d3_time_formatRe(d3_time_days), d3_time_dayLookup = d3_time_formatLookup(d3_time_days), d3_time_dayAbbrevRe = d3_time_formatRe(d3_time_dayAbbreviations), d3_time_dayAbbrevLookup = d3_time_formatLookup(d3_time_dayAbbreviations), d3_time_monthRe = d3_time_formatRe(d3_time_months), d3_time_monthLookup = d3_time_formatLookup(d3_time_months), d3_time_monthAbbrevRe = d3_time_formatRe(d3_time_monthAbbreviations), d3_time_monthAbbrevLookup = d3_time_formatLookup(d3_time_monthAbbreviations), d3_time_percentRe = /^%/; + var d3_time_formatPads = { + "-": "", + _: " ", + "0": "0" + }; + var d3_time_formats = { + a: function(d) { + return d3_time_dayAbbreviations[d.getDay()]; + }, + A: function(d) { + return d3_time_days[d.getDay()]; + }, + b: function(d) { + return d3_time_monthAbbreviations[d.getMonth()]; + }, + B: function(d) { + return d3_time_months[d.getMonth()]; + }, + c: d3_time_format(d3_time_formatDateTime), + d: function(d, p) { + return d3_time_formatPad(d.getDate(), p, 2); + }, + e: function(d, p) { + return d3_time_formatPad(d.getDate(), p, 2); + }, + H: function(d, p) { + return d3_time_formatPad(d.getHours(), p, 2); + }, + I: function(d, p) { + return d3_time_formatPad(d.getHours() % 12 || 12, p, 2); + }, + j: function(d, p) { + return d3_time_formatPad(1 + d3_time.dayOfYear(d), p, 3); + }, + L: function(d, p) { + return d3_time_formatPad(d.getMilliseconds(), p, 3); + }, + m: function(d, p) { + return d3_time_formatPad(d.getMonth() + 1, p, 2); + }, + M: function(d, p) { + return d3_time_formatPad(d.getMinutes(), p, 2); + }, + p: function(d) { + return d.getHours() >= 12 ? "PM" : "AM"; + }, + S: function(d, p) { + return d3_time_formatPad(d.getSeconds(), p, 2); + }, + U: function(d, p) { + return d3_time_formatPad(d3_time.sundayOfYear(d), p, 2); + }, + w: function(d) { + return d.getDay(); + }, + W: function(d, p) { + return d3_time_formatPad(d3_time.mondayOfYear(d), p, 2); + }, + x: d3_time_format(d3_time_formatDate), + X: d3_time_format(d3_time_formatTime), + y: function(d, p) { + return d3_time_formatPad(d.getFullYear() % 100, p, 2); + }, + Y: function(d, p) { + return d3_time_formatPad(d.getFullYear() % 1e4, p, 4); + }, + Z: d3_time_zone, + "%": function() { + return "%"; + } + }; + var d3_time_parsers = { + a: d3_time_parseWeekdayAbbrev, + A: d3_time_parseWeekday, + b: d3_time_parseMonthAbbrev, + B: d3_time_parseMonth, + c: d3_time_parseLocaleFull, + d: d3_time_parseDay, + e: d3_time_parseDay, + H: d3_time_parseHour24, + I: d3_time_parseHour24, + j: d3_time_parseDayOfYear, + L: d3_time_parseMilliseconds, + m: d3_time_parseMonthNumber, + M: d3_time_parseMinutes, + p: d3_time_parseAmPm, + S: d3_time_parseSeconds, + U: d3_time_parseWeekNumberSunday, + w: d3_time_parseWeekdayNumber, + W: d3_time_parseWeekNumberMonday, + x: d3_time_parseLocaleDate, + X: d3_time_parseLocaleTime, + y: d3_time_parseYear, + Y: d3_time_parseFullYear, + Z: d3_time_parseZone, + "%": d3_time_parseLiteralPercent + }; + function d3_time_parseWeekdayAbbrev(date, string, i) { + d3_time_dayAbbrevRe.lastIndex = 0; + var n = d3_time_dayAbbrevRe.exec(string.substring(i)); + return n ? (date.w = d3_time_dayAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + } + function d3_time_parseWeekday(date, string, i) { + d3_time_dayRe.lastIndex = 0; + var n = d3_time_dayRe.exec(string.substring(i)); + return n ? (date.w = d3_time_dayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + } + function d3_time_parseWeekdayNumber(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.substring(i, i + 1)); + return n ? (date.w = +n[0], i + n[0].length) : -1; + } + function d3_time_parseWeekNumberSunday(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.substring(i)); + return n ? (date.U = +n[0], i + n[0].length) : -1; + } + function d3_time_parseWeekNumberMonday(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.substring(i)); + return n ? (date.W = +n[0], i + n[0].length) : -1; + } + function d3_time_parseMonthAbbrev(date, string, i) { + d3_time_monthAbbrevRe.lastIndex = 0; + var n = d3_time_monthAbbrevRe.exec(string.substring(i)); + return n ? (date.m = d3_time_monthAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + } + function d3_time_parseMonth(date, string, i) { + d3_time_monthRe.lastIndex = 0; + var n = d3_time_monthRe.exec(string.substring(i)); + return n ? (date.m = d3_time_monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + } + function d3_time_parseLocaleFull(date, string, i) { + return d3_time_parse(date, d3_time_formats.c.toString(), string, i); + } + function d3_time_parseLocaleDate(date, string, i) { + return d3_time_parse(date, d3_time_formats.x.toString(), string, i); + } + function d3_time_parseLocaleTime(date, string, i) { + return d3_time_parse(date, d3_time_formats.X.toString(), string, i); + } + function d3_time_parseFullYear(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.substring(i, i + 4)); + return n ? (date.y = +n[0], i + n[0].length) : -1; + } + function d3_time_parseYear(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.substring(i, i + 2)); + return n ? (date.y = d3_time_expandYear(+n[0]), i + n[0].length) : -1; + } + function d3_time_parseZone(date, string, i) { + return /^[+-]\d{4}$/.test(string = string.substring(i, i + 5)) ? (date.Z = +string, + i + 5) : -1; + } + function d3_time_expandYear(d) { + return d + (d > 68 ? 1900 : 2e3); + } + function d3_time_parseMonthNumber(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.substring(i, i + 2)); + return n ? (date.m = n[0] - 1, i + n[0].length) : -1; + } + function d3_time_parseDay(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.substring(i, i + 2)); + return n ? (date.d = +n[0], i + n[0].length) : -1; + } + function d3_time_parseDayOfYear(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.substring(i, i + 3)); + return n ? (date.j = +n[0], i + n[0].length) : -1; + } + function d3_time_parseHour24(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.substring(i, i + 2)); + return n ? (date.H = +n[0], i + n[0].length) : -1; + } + function d3_time_parseMinutes(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.substring(i, i + 2)); + return n ? (date.M = +n[0], i + n[0].length) : -1; + } + function d3_time_parseSeconds(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.substring(i, i + 2)); + return n ? (date.S = +n[0], i + n[0].length) : -1; + } + function d3_time_parseMilliseconds(date, string, i) { + d3_time_numberRe.lastIndex = 0; + var n = d3_time_numberRe.exec(string.substring(i, i + 3)); + return n ? (date.L = +n[0], i + n[0].length) : -1; + } + var d3_time_numberRe = /^\s*\d+/; + function d3_time_parseAmPm(date, string, i) { + var n = d3_time_amPmLookup.get(string.substring(i, i += 2).toLowerCase()); + return n == null ? -1 : (date.p = n, i); + } + var d3_time_amPmLookup = d3.map({ + am: 0, + pm: 1 + }); + function d3_time_zone(d) { + var z = d.getTimezoneOffset(), zs = z > 0 ? "-" : "+", zh = ~~(Math.abs(z) / 60), zm = Math.abs(z) % 60; + return zs + d3_time_formatPad(zh, "0", 2) + d3_time_formatPad(zm, "0", 2); + } + function d3_time_parseLiteralPercent(date, string, i) { + d3_time_percentRe.lastIndex = 0; + var n = d3_time_percentRe.exec(string.substring(i, i + 1)); + return n ? i + n[0].length : -1; + } + d3_time_format.utc = d3_time_formatUtc; + function d3_time_formatUtc(template) { + var local = d3_time_format(template); + function format(date) { + try { + d3_date = d3_date_utc; + var utc = new d3_date(); + utc._ = date; + return local(utc); + } finally { + d3_date = Date; + } + } + format.parse = function(string) { + try { + d3_date = d3_date_utc; + var date = local.parse(string); + return date && date._; + } finally { + d3_date = Date; + } + }; + format.toString = local.toString; + return format; + } + var d3_time_formatIso = d3_time_formatUtc("%Y-%m-%dT%H:%M:%S.%LZ"); + d3_time_format.iso = Date.prototype.toISOString && +new Date("2000-01-01T00:00:00.000Z") ? d3_time_formatIsoNative : d3_time_formatIso; + function d3_time_formatIsoNative(date) { + return date.toISOString(); + } + d3_time_formatIsoNative.parse = function(string) { + var date = new Date(string); + return isNaN(date) ? null : date; + }; + d3_time_formatIsoNative.toString = d3_time_formatIso.toString; + d3_time.second = d3_time_interval(function(date) { + return new d3_date(Math.floor(date / 1e3) * 1e3); + }, function(date, offset) { + date.setTime(date.getTime() + Math.floor(offset) * 1e3); + }, function(date) { + return date.getSeconds(); + }); + d3_time.seconds = d3_time.second.range; + d3_time.seconds.utc = d3_time.second.utc.range; + d3_time.minute = d3_time_interval(function(date) { + return new d3_date(Math.floor(date / 6e4) * 6e4); + }, function(date, offset) { + date.setTime(date.getTime() + Math.floor(offset) * 6e4); + }, function(date) { + return date.getMinutes(); + }); + d3_time.minutes = d3_time.minute.range; + d3_time.minutes.utc = d3_time.minute.utc.range; + d3_time.hour = d3_time_interval(function(date) { + var timezone = date.getTimezoneOffset() / 60; + return new d3_date((Math.floor(date / 36e5 - timezone) + timezone) * 36e5); + }, function(date, offset) { + date.setTime(date.getTime() + Math.floor(offset) * 36e5); + }, function(date) { + return date.getHours(); + }); + d3_time.hours = d3_time.hour.range; + d3_time.hours.utc = d3_time.hour.utc.range; + d3_time.month = d3_time_interval(function(date) { + date = d3_time.day(date); + date.setDate(1); + return date; + }, function(date, offset) { + date.setMonth(date.getMonth() + offset); + }, function(date) { + return date.getMonth(); + }); + d3_time.months = d3_time.month.range; + d3_time.months.utc = d3_time.month.utc.range; + function d3_time_scale(linear, methods, format) { + function scale(x) { + return linear(x); + } + scale.invert = function(x) { + return d3_time_scaleDate(linear.invert(x)); + }; + scale.domain = function(x) { + if (!arguments.length) return linear.domain().map(d3_time_scaleDate); + linear.domain(x); + return scale; + }; + function tickMethod(extent, count) { + var span = extent[1] - extent[0], target = span / count, i = d3.bisect(d3_time_scaleSteps, target); + return i == d3_time_scaleSteps.length ? [ methods.year, d3_scale_linearTickRange(extent.map(function(d) { + return d / 31536e6; + }), count)[2] ] : !i ? [ d3_time_scaleMilliseconds, d3_scale_linearTickRange(extent, count)[2] ] : methods[target / d3_time_scaleSteps[i - 1] < d3_time_scaleSteps[i] / target ? i - 1 : i]; + } + scale.nice = function(interval, skip) { + var domain = scale.domain(), extent = d3_scaleExtent(domain), method = interval == null ? tickMethod(extent, 10) : typeof interval === "number" && tickMethod(extent, interval); + if (method) interval = method[0], skip = method[1]; + function skipped(date) { + return !isNaN(date) && !interval.range(date, d3_time_scaleDate(+date + 1), skip).length; + } + return scale.domain(d3_scale_nice(domain, skip > 1 ? { + floor: function(date) { + while (skipped(date = interval.floor(date))) date = d3_time_scaleDate(date - 1); + return date; + }, + ceil: function(date) { + while (skipped(date = interval.ceil(date))) date = d3_time_scaleDate(+date + 1); + return date; + } + } : interval)); + }; + scale.ticks = function(interval, skip) { + var extent = d3_scaleExtent(scale.domain()), method = interval == null ? tickMethod(extent, 10) : typeof interval === "number" ? tickMethod(extent, interval) : !interval.range && [ { + range: interval + }, skip ]; + if (method) interval = method[0], skip = method[1]; + return interval.range(extent[0], d3_time_scaleDate(+extent[1] + 1), skip); + }; + scale.tickFormat = function() { + return format; + }; + scale.copy = function() { + return d3_time_scale(linear.copy(), methods, format); + }; + return d3_scale_linearRebind(scale, linear); + } + function d3_time_scaleDate(t) { + return new Date(t); + } + function d3_time_scaleFormat(formats) { + return function(date) { + var i = formats.length - 1, f = formats[i]; + while (!f[1](date)) f = formats[--i]; + return f[0](date); + }; + } + var d3_time_scaleSteps = [ 1e3, 5e3, 15e3, 3e4, 6e4, 3e5, 9e5, 18e5, 36e5, 108e5, 216e5, 432e5, 864e5, 1728e5, 6048e5, 2592e6, 7776e6, 31536e6 ]; + var d3_time_scaleLocalMethods = [ [ d3_time.second, 1 ], [ d3_time.second, 5 ], [ d3_time.second, 15 ], [ d3_time.second, 30 ], [ d3_time.minute, 1 ], [ d3_time.minute, 5 ], [ d3_time.minute, 15 ], [ d3_time.minute, 30 ], [ d3_time.hour, 1 ], [ d3_time.hour, 3 ], [ d3_time.hour, 6 ], [ d3_time.hour, 12 ], [ d3_time.day, 1 ], [ d3_time.day, 2 ], [ d3_time.week, 1 ], [ d3_time.month, 1 ], [ d3_time.month, 3 ], [ d3_time.year, 1 ] ]; + var d3_time_scaleLocalFormats = [ [ d3_time_format("%Y"), d3_true ], [ d3_time_format("%B"), function(d) { + return d.getMonth(); + } ], [ d3_time_format("%b %d"), function(d) { + return d.getDate() != 1; + } ], [ d3_time_format("%a %d"), function(d) { + return d.getDay() && d.getDate() != 1; + } ], [ d3_time_format("%I %p"), function(d) { + return d.getHours(); + } ], [ d3_time_format("%I:%M"), function(d) { + return d.getMinutes(); + } ], [ d3_time_format(":%S"), function(d) { + return d.getSeconds(); + } ], [ d3_time_format(".%L"), function(d) { + return d.getMilliseconds(); + } ] ]; + var d3_time_scaleLocalFormat = d3_time_scaleFormat(d3_time_scaleLocalFormats); + d3_time_scaleLocalMethods.year = d3_time.year; + d3_time.scale = function() { + return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat); + }; + var d3_time_scaleMilliseconds = { + range: function(start, stop, step) { + return d3.range(+start, +stop, step).map(d3_time_scaleDate); + } + }; + var d3_time_scaleUTCMethods = d3_time_scaleLocalMethods.map(function(m) { + return [ m[0].utc, m[1] ]; + }); + var d3_time_scaleUTCFormats = [ [ d3_time_formatUtc("%Y"), d3_true ], [ d3_time_formatUtc("%B"), function(d) { + return d.getUTCMonth(); + } ], [ d3_time_formatUtc("%b %d"), function(d) { + return d.getUTCDate() != 1; + } ], [ d3_time_formatUtc("%a %d"), function(d) { + return d.getUTCDay() && d.getUTCDate() != 1; + } ], [ d3_time_formatUtc("%I %p"), function(d) { + return d.getUTCHours(); + } ], [ d3_time_formatUtc("%I:%M"), function(d) { + return d.getUTCMinutes(); + } ], [ d3_time_formatUtc(":%S"), function(d) { + return d.getUTCSeconds(); + } ], [ d3_time_formatUtc(".%L"), function(d) { + return d.getUTCMilliseconds(); + } ] ]; + var d3_time_scaleUTCFormat = d3_time_scaleFormat(d3_time_scaleUTCFormats); + d3_time_scaleUTCMethods.year = d3_time.year.utc; + d3_time.scale.utc = function() { + return d3_time_scale(d3.scale.linear(), d3_time_scaleUTCMethods, d3_time_scaleUTCFormat); + }; + d3.text = d3_xhrType(function(request) { + return request.responseText; + }); + d3.json = function(url, callback) { + return d3_xhr(url, "application/json", d3_json, callback); + }; + function d3_json(request) { + return JSON.parse(request.responseText); + } + d3.html = function(url, callback) { + return d3_xhr(url, "text/html", d3_html, callback); + }; + function d3_html(request) { + var range = d3_document.createRange(); + range.selectNode(d3_document.body); + return range.createContextualFragment(request.responseText); + } + d3.xml = d3_xhrType(function(request) { + return request.responseXML; + }); + return d3; +}(); \ No newline at end of file diff --git a/hub/static/js/lib/d3.v3.min.js b/hub/static/js/lib/d3.v3.min.js new file mode 100644 index 0000000..a4a9070 --- /dev/null +++ b/hub/static/js/lib/d3.v3.min.js @@ -0,0 +1,4 @@ +(function(){function t(t){return t.target}function n(t){return t.source}function e(t,n){try{for(var e in n)Object.defineProperty(t.prototype,e,{value:n[e],enumerable:!1})}catch(r){t.prototype=n}}function r(t){for(var n=-1,e=t.length,r=[];e>++n;)r.push(t[n]);return r}function u(t){return Array.prototype.slice.call(t)}function i(){}function a(t){return t}function o(){return!0}function c(t){return"function"==typeof t?t:function(){return t}}function l(t,n,e){return function(){var r=e.apply(n,arguments);return arguments.length?t:r}}function s(t){return null!=t&&!isNaN(t)}function f(t){return t.length}function h(t){return t.trim().replace(/\s+/g," ")}function d(t){for(var n=1;t*n%1;)n*=10;return n}function g(t){return 1===t.length?function(n,e){t(null==n?e:null)}:t}function p(t){return t.responseText}function m(t){return JSON.parse(t.responseText)}function v(t){var n=document.createRange();return n.selectNode(document.body),n.createContextualFragment(t.responseText)}function y(t){return t.responseXML}function M(){}function b(t){function n(){for(var n,r=e,u=-1,i=r.length;i>++u;)(n=r[u].on)&&n.apply(this,arguments);return t}var e=[],r=new i;return n.on=function(n,u){var i,a=r.get(n);return 2>arguments.length?a&&a.on:(a&&(a.on=null,e=e.slice(0,i=e.indexOf(a)).concat(e.slice(i+1)),r.remove(n)),u&&e.push(r.set(n,{on:u})),t)},n}function x(t,n){return n-(t?1+Math.floor(Math.log(t+Math.pow(10,1+Math.floor(Math.log(t)/Math.LN10)-n))/Math.LN10):1)}function _(t){return t+""}function w(t,n){var e=Math.pow(10,3*Math.abs(8-n));return{scale:n>8?function(t){return t/e}:function(t){return t*e},symbol:t}}function S(t){return function(n){return 0>=n?0:n>=1?1:t(n)}}function k(t){return function(n){return 1-t(1-n)}}function E(t){return function(n){return.5*(.5>n?t(2*n):2-t(2-2*n))}}function A(t){return t*t}function N(t){return t*t*t}function T(t){if(0>=t)return 0;if(t>=1)return 1;var n=t*t,e=n*t;return 4*(.5>t?e:3*(t-n)+e-.75)}function q(t){return function(n){return Math.pow(n,t)}}function C(t){return 1-Math.cos(t*Ri/2)}function z(t){return Math.pow(2,10*(t-1))}function D(t){return 1-Math.sqrt(1-t*t)}function L(t,n){var e;return 2>arguments.length&&(n=.45),arguments.length?e=n/(2*Ri)*Math.asin(1/t):(t=1,e=n/4),function(r){return 1+t*Math.pow(2,10*-r)*Math.sin(2*(r-e)*Ri/n)}}function F(t){return t||(t=1.70158),function(n){return n*n*((t+1)*n-t)}}function H(t){return 1/2.75>t?7.5625*t*t:2/2.75>t?7.5625*(t-=1.5/2.75)*t+.75:2.5/2.75>t?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375}function R(){d3.event.stopPropagation(),d3.event.preventDefault()}function P(){for(var t,n=d3.event;t=n.sourceEvent;)n=t;return n}function j(t){for(var n=new M,e=0,r=arguments.length;r>++e;)n[arguments[e]]=b(n);return n.of=function(e,r){return function(u){try{var i=u.sourceEvent=d3.event;u.target=t,d3.event=u,n[u.type].apply(e,r)}finally{d3.event=i}}},n}function O(t){var n=[t.a,t.b],e=[t.c,t.d],r=U(n),u=Y(n,e),i=U(I(e,n,-u))||0;n[0]*e[1]<e[0]*n[1]&&(n[0]*=-1,n[1]*=-1,r*=-1,u*=-1),this.rotate=(r?Math.atan2(n[1],n[0]):Math.atan2(-e[0],e[1]))*Oi,this.translate=[t.e,t.f],this.scale=[r,i],this.skew=i?Math.atan2(u,i)*Oi:0}function Y(t,n){return t[0]*n[0]+t[1]*n[1]}function U(t){var n=Math.sqrt(Y(t,t));return n&&(t[0]/=n,t[1]/=n),n}function I(t,n,e){return t[0]+=e*n[0],t[1]+=e*n[1],t}function V(t){return"transform"==t?d3.interpolateTransform:d3.interpolate}function X(t,n){return n=n-(t=+t)?1/(n-t):0,function(e){return(e-t)*n}}function Z(t,n){return n=n-(t=+t)?1/(n-t):0,function(e){return Math.max(0,Math.min(1,(e-t)*n))}}function B(){}function $(t,n,e){return new J(t,n,e)}function J(t,n,e){this.r=t,this.g=n,this.b=e}function G(t){return 16>t?"0"+Math.max(0,t).toString(16):Math.min(255,t).toString(16)}function K(t,n,e){var r,u,i,a=0,o=0,c=0;if(r=/([a-z]+)\((.*)\)/i.exec(t))switch(u=r[2].split(","),r[1]){case"hsl":return e(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case"rgb":return n(nn(u[0]),nn(u[1]),nn(u[2]))}return(i=aa.get(t))?n(i.r,i.g,i.b):(null!=t&&"#"===t.charAt(0)&&(4===t.length?(a=t.charAt(1),a+=a,o=t.charAt(2),o+=o,c=t.charAt(3),c+=c):7===t.length&&(a=t.substring(1,3),o=t.substring(3,5),c=t.substring(5,7)),a=parseInt(a,16),o=parseInt(o,16),c=parseInt(c,16)),n(a,o,c))}function W(t,n,e){var r,u,i=Math.min(t/=255,n/=255,e/=255),a=Math.max(t,n,e),o=a-i,c=(a+i)/2;return o?(u=.5>c?o/(a+i):o/(2-a-i),r=t==a?(n-e)/o+(e>n?6:0):n==a?(e-t)/o+2:(t-n)/o+4,r*=60):u=r=0,en(r,u,c)}function Q(t,n,e){t=tn(t),n=tn(n),e=tn(e);var r=gn((.4124564*t+.3575761*n+.1804375*e)/sa),u=gn((.2126729*t+.7151522*n+.072175*e)/fa),i=gn((.0193339*t+.119192*n+.9503041*e)/ha);return ln(116*u-16,500*(r-u),200*(u-i))}function tn(t){return.04045>=(t/=255)?t/12.92:Math.pow((t+.055)/1.055,2.4)}function nn(t){var n=parseFloat(t);return"%"===t.charAt(t.length-1)?Math.round(2.55*n):n}function en(t,n,e){return new rn(t,n,e)}function rn(t,n,e){this.h=t,this.s=n,this.l=e}function un(t,n,e){function r(t){return t>360?t-=360:0>t&&(t+=360),60>t?i+(a-i)*t/60:180>t?a:240>t?i+(a-i)*(240-t)/60:i}function u(t){return Math.round(255*r(t))}var i,a;return t%=360,0>t&&(t+=360),n=0>n?0:n>1?1:n,e=0>e?0:e>1?1:e,a=.5>=e?e*(1+n):e+n-e*n,i=2*e-a,$(u(t+120),u(t),u(t-120))}function an(t,n,e){return new on(t,n,e)}function on(t,n,e){this.h=t,this.c=n,this.l=e}function cn(t,n,e){return ln(e,Math.cos(t*=ji)*n,Math.sin(t)*n)}function ln(t,n,e){return new sn(t,n,e)}function sn(t,n,e){this.l=t,this.a=n,this.b=e}function fn(t,n,e){var r=(t+16)/116,u=r+n/500,i=r-e/200;return u=dn(u)*sa,r=dn(r)*fa,i=dn(i)*ha,$(pn(3.2404542*u-1.5371385*r-.4985314*i),pn(-.969266*u+1.8760108*r+.041556*i),pn(.0556434*u-.2040259*r+1.0572252*i))}function hn(t,n,e){return an(180*(Math.atan2(e,n)/Ri),Math.sqrt(n*n+e*e),t)}function dn(t){return t>.206893034?t*t*t:(t-4/29)/7.787037}function gn(t){return t>.008856?Math.pow(t,1/3):7.787037*t+4/29}function pn(t){return Math.round(255*(.00304>=t?12.92*t:1.055*Math.pow(t,1/2.4)-.055))}function mn(t){return Ii(t,Ma),t}function vn(t){return function(){return ga(t,this)}}function yn(t){return function(){return pa(t,this)}}function Mn(t,n){function e(){this.removeAttribute(t)}function r(){this.removeAttributeNS(t.space,t.local)}function u(){this.setAttribute(t,n)}function i(){this.setAttributeNS(t.space,t.local,n)}function a(){var e=n.apply(this,arguments);null==e?this.removeAttribute(t):this.setAttribute(t,e)}function o(){var e=n.apply(this,arguments);null==e?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,e)}return t=d3.ns.qualify(t),null==n?t.local?r:e:"function"==typeof n?t.local?o:a:t.local?i:u}function bn(t){return RegExp("(?:^|\\s+)"+d3.requote(t)+"(?:\\s+|$)","g")}function xn(t,n){function e(){for(var e=-1;u>++e;)t[e](this,n)}function r(){for(var e=-1,r=n.apply(this,arguments);u>++e;)t[e](this,r)}t=t.trim().split(/\s+/).map(_n);var u=t.length;return"function"==typeof n?r:e}function _n(t){var n=bn(t);return function(e,r){if(u=e.classList)return r?u.add(t):u.remove(t);var u=e.className,i=null!=u.baseVal,a=i?u.baseVal:u;r?(n.lastIndex=0,n.test(a)||(a=h(a+" "+t),i?u.baseVal=a:e.className=a)):a&&(a=h(a.replace(n," ")),i?u.baseVal=a:e.className=a)}}function wn(t,n,e){function r(){this.style.removeProperty(t)}function u(){this.style.setProperty(t,n,e)}function i(){var r=n.apply(this,arguments);null==r?this.style.removeProperty(t):this.style.setProperty(t,r,e)}return null==n?r:"function"==typeof n?i:u}function Sn(t,n){function e(){delete this[t]}function r(){this[t]=n}function u(){var e=n.apply(this,arguments);null==e?delete this[t]:this[t]=e}return null==n?e:"function"==typeof n?u:r}function kn(t){return{__data__:t}}function En(t){return function(){return ya(this,t)}}function An(t){return arguments.length||(t=d3.ascending),function(n,e){return t(n&&n.__data__,e&&e.__data__)}}function Nn(t,n,e){function r(){var n=this[i];n&&(this.removeEventListener(t,n,n.$),delete this[i])}function u(){function u(t){var e=d3.event;d3.event=t,o[0]=a.__data__;try{n.apply(a,o)}finally{d3.event=e}}var a=this,o=Yi(arguments);r.call(this),this.addEventListener(t,this[i]=u,u.$=e),u._=n}var i="__on"+t,a=t.indexOf(".");return a>0&&(t=t.substring(0,a)),n?u:r}function Tn(t,n){for(var e=0,r=t.length;r>e;e++)for(var u,i=t[e],a=0,o=i.length;o>a;a++)(u=i[a])&&n(u,a,e);return t}function qn(t){return Ii(t,xa),t}function Cn(t,n){return Ii(t,wa),t.id=n,t}function zn(t,n,e,r){var u=t.__transition__||(t.__transition__={active:0,count:0}),a=u[e];if(!a){var o=r.time;return a=u[e]={tween:new i,event:d3.dispatch("start","end"),time:o,ease:r.ease,delay:r.delay,duration:r.duration},++u.count,d3.timer(function(r){function i(r){return u.active>e?l():(u.active=e,h.start.call(t,s,n),a.tween.forEach(function(e,r){(r=r.call(t,s,n))&&p.push(r)}),c(r)||d3.timer(c,0,o),1)}function c(r){if(u.active!==e)return l();for(var i=(r-d)/g,a=f(i),o=p.length;o>0;)p[--o].call(t,a);return i>=1?(l(),h.end.call(t,s,n),1):void 0}function l(){return--u.count?delete u[e]:delete t.__transition__,1}var s=t.__data__,f=a.ease,h=a.event,d=a.delay,g=a.duration,p=[];return r>=d?i(r):d3.timer(i,d,o),1},0,o),a}}function Dn(t){return null==t&&(t=""),function(){this.textContent=t}}function Ln(t,n,e,r){var u=t.id;return Tn(t,"function"==typeof e?function(t,i,a){t.__transition__[u].tween.set(n,r(e.call(t,t.__data__,i,a)))}:(e=r(e),function(t){t.__transition__[u].tween.set(n,e)}))}function Fn(){for(var t,n=Date.now(),e=qa;e;)t=n-e.then,t>=e.delay&&(e.flush=e.callback(t)),e=e.next;var r=Hn()-n;r>24?(isFinite(r)&&(clearTimeout(Aa),Aa=setTimeout(Fn,r)),Ea=0):(Ea=1,Ca(Fn))}function Hn(){for(var t=null,n=qa,e=1/0;n;)n.flush?(delete Ta[n.callback.id],n=t?t.next=n.next:qa=n.next):(e=Math.min(e,n.then+n.delay),n=(t=n).next);return e}function Rn(t,n){var e=t.ownerSVGElement||t;if(e.createSVGPoint){var r=e.createSVGPoint();if(0>za&&(window.scrollX||window.scrollY)){e=d3.select(document.body).append("svg").style("position","absolute").style("top",0).style("left",0);var u=e[0][0].getScreenCTM();za=!(u.f||u.e),e.remove()}return za?(r.x=n.pageX,r.y=n.pageY):(r.x=n.clientX,r.y=n.clientY),r=r.matrixTransform(t.getScreenCTM().inverse()),[r.x,r.y]}var i=t.getBoundingClientRect();return[n.clientX-i.left-t.clientLeft,n.clientY-i.top-t.clientTop]}function Pn(){}function jn(t){var n=t[0],e=t[t.length-1];return e>n?[n,e]:[e,n]}function On(t){return t.rangeExtent?t.rangeExtent():jn(t.range())}function Yn(t,n){var e,r=0,u=t.length-1,i=t[r],a=t[u];return i>a&&(e=r,r=u,u=e,e=i,i=a,a=e),(n=n(a-i))&&(t[r]=n.floor(i),t[u]=n.ceil(a)),t}function Un(){return Math}function In(t,n,e,r){function u(){var u=Math.min(t.length,n.length)>2?Gn:Jn,c=r?Z:X;return a=u(t,n,c,e),o=u(n,t,c,d3.interpolate),i}function i(t){return a(t)}var a,o;return i.invert=function(t){return o(t)},i.domain=function(n){return arguments.length?(t=n.map(Number),u()):t},i.range=function(t){return arguments.length?(n=t,u()):n},i.rangeRound=function(t){return i.range(t).interpolate(d3.interpolateRound)},i.clamp=function(t){return arguments.length?(r=t,u()):r},i.interpolate=function(t){return arguments.length?(e=t,u()):e},i.ticks=function(n){return Bn(t,n)},i.tickFormat=function(n){return $n(t,n)},i.nice=function(){return Yn(t,Xn),u()},i.copy=function(){return In(t,n,e,r)},u()}function Vn(t,n){return d3.rebind(t,n,"range","rangeRound","interpolate","clamp")}function Xn(t){return t=Math.pow(10,Math.round(Math.log(t)/Math.LN10)-1),t&&{floor:function(n){return Math.floor(n/t)*t},ceil:function(n){return Math.ceil(n/t)*t}}}function Zn(t,n){var e=jn(t),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/n)/Math.LN10)),i=n/r*u;return.15>=i?u*=10:.35>=i?u*=5:.75>=i&&(u*=2),e[0]=Math.ceil(e[0]/u)*u,e[1]=Math.floor(e[1]/u)*u+.5*u,e[2]=u,e}function Bn(t,n){return d3.range.apply(d3,Zn(t,n))}function $n(t,n){return d3.format(",."+Math.max(0,-Math.floor(Math.log(Zn(t,n)[2])/Math.LN10+.01))+"f")}function Jn(t,n,e,r){var u=e(t[0],t[1]),i=r(n[0],n[1]);return function(t){return i(u(t))}}function Gn(t,n,e,r){var u=[],i=[],a=0,o=Math.min(t.length,n.length)-1;for(t[o]<t[0]&&(t=t.slice().reverse(),n=n.slice().reverse());o>=++a;)u.push(e(t[a-1],t[a])),i.push(r(n[a-1],n[a]));return function(n){var e=d3.bisect(t,n,1,o)-1;return i[e](u[e](n))}}function Kn(t,n){function e(e){return t(n(e))}var r=n.pow;return e.invert=function(n){return r(t.invert(n))},e.domain=function(u){return arguments.length?(n=0>u[0]?Qn:Wn,r=n.pow,t.domain(u.map(n)),e):t.domain().map(r)},e.nice=function(){return t.domain(Yn(t.domain(),Un)),e},e.ticks=function(){var e=jn(t.domain()),u=[];if(e.every(isFinite)){var i=Math.floor(e[0]),a=Math.ceil(e[1]),o=r(e[0]),c=r(e[1]);if(n===Qn)for(u.push(r(i));a>i++;)for(var l=9;l>0;l--)u.push(r(i)*l);else{for(;a>i;i++)for(var l=1;10>l;l++)u.push(r(i)*l);u.push(r(i))}for(i=0;o>u[i];i++);for(a=u.length;u[a-1]>c;a--);u=u.slice(i,a)}return u},e.tickFormat=function(t,u){if(2>arguments.length&&(u=Da),!arguments.length)return u;var i,a=Math.max(.1,t/e.ticks().length),o=n===Qn?(i=-1e-12,Math.floor):(i=1e-12,Math.ceil);return function(t){return a>=t/r(o(n(t)+i))?u(t):""}},e.copy=function(){return Kn(t.copy(),n)},Vn(e,t)}function Wn(t){return Math.log(0>t?0:t)/Math.LN10}function Qn(t){return-Math.log(t>0?0:-t)/Math.LN10}function te(t,n){function e(n){return t(r(n))}var r=ne(n),u=ne(1/n);return e.invert=function(n){return u(t.invert(n))},e.domain=function(n){return arguments.length?(t.domain(n.map(r)),e):t.domain().map(u)},e.ticks=function(t){return Bn(e.domain(),t)},e.tickFormat=function(t){return $n(e.domain(),t)},e.nice=function(){return e.domain(Yn(e.domain(),Xn))},e.exponent=function(t){if(!arguments.length)return n;var i=e.domain();return r=ne(n=t),u=ne(1/n),e.domain(i)},e.copy=function(){return te(t.copy(),n)},Vn(e,t)}function ne(t){return function(n){return 0>n?-Math.pow(-n,t):Math.pow(n,t)}}function ee(t,n){function e(n){return a[((u.get(n)||u.set(n,t.push(n)))-1)%a.length]}function r(n,e){return d3.range(t.length).map(function(t){return n+e*t})}var u,a,o;return e.domain=function(r){if(!arguments.length)return t;t=[],u=new i;for(var a,o=-1,c=r.length;c>++o;)u.has(a=r[o])||u.set(a,t.push(a));return e[n.t].apply(e,n.a)},e.range=function(t){return arguments.length?(a=t,o=0,n={t:"range",a:arguments},e):a},e.rangePoints=function(u,i){2>arguments.length&&(i=0);var c=u[0],l=u[1],s=(l-c)/(Math.max(1,t.length-1)+i);return a=r(2>t.length?(c+l)/2:c+s*i/2,s),o=0,n={t:"rangePoints",a:arguments},e},e.rangeBands=function(u,i,c){2>arguments.length&&(i=0),3>arguments.length&&(c=i);var l=u[1]<u[0],s=u[l-0],f=u[1-l],h=(f-s)/(t.length-i+2*c);return a=r(s+h*c,h),l&&a.reverse(),o=h*(1-i),n={t:"rangeBands",a:arguments},e},e.rangeRoundBands=function(u,i,c){2>arguments.length&&(i=0),3>arguments.length&&(c=i);var l=u[1]<u[0],s=u[l-0],f=u[1-l],h=Math.floor((f-s)/(t.length-i+2*c)),d=f-s-(t.length-i)*h;return a=r(s+Math.round(d/2),h),l&&a.reverse(),o=Math.round(h*(1-i)),n={t:"rangeRoundBands",a:arguments},e},e.rangeBand=function(){return o},e.rangeExtent=function(){return jn(n.a[0])},e.copy=function(){return ee(t,n)},e.domain(t)}function re(t,n){function e(){var e=0,i=n.length;for(u=[];i>++e;)u[e-1]=d3.quantile(t,e/i);return r}function r(t){return isNaN(t=+t)?0/0:n[d3.bisect(u,t)]}var u;return r.domain=function(n){return arguments.length?(t=n.filter(function(t){return!isNaN(t)}).sort(d3.ascending),e()):t},r.range=function(t){return arguments.length?(n=t,e()):n},r.quantiles=function(){return u},r.copy=function(){return re(t,n)},e()}function ue(t,n,e){function r(n){return e[Math.max(0,Math.min(a,Math.floor(i*(n-t))))]}function u(){return i=e.length/(n-t),a=e.length-1,r}var i,a;return r.domain=function(e){return arguments.length?(t=+e[0],n=+e[e.length-1],u()):[t,n]},r.range=function(t){return arguments.length?(e=t,u()):e},r.copy=function(){return ue(t,n,e)},u()}function ie(t,n){function e(e){return n[d3.bisect(t,e)]}return e.domain=function(n){return arguments.length?(t=n,e):t},e.range=function(t){return arguments.length?(n=t,e):n},e.copy=function(){return ie(t,n)},e}function ae(t){function n(t){return+t}return n.invert=n,n.domain=n.range=function(e){return arguments.length?(t=e.map(n),n):t},n.ticks=function(n){return Bn(t,n)},n.tickFormat=function(n){return $n(t,n)},n.copy=function(){return ae(t)},n}function oe(t){return t.innerRadius}function ce(t){return t.outerRadius}function le(t){return t.startAngle}function se(t){return t.endAngle}function fe(t){function n(n){function a(){s.push("M",i(t(f),l))}for(var o,s=[],f=[],h=-1,d=n.length,g=c(e),p=c(r);d>++h;)u.call(this,o=n[h],h)?f.push([+g.call(this,o,h),+p.call(this,o,h)]):f.length&&(a(),f=[]);return f.length&&a(),s.length?s.join(""):null}var e=he,r=de,u=o,i=ge,a=i.key,l=.7;return n.x=function(t){return arguments.length?(e=t,n):e},n.y=function(t){return arguments.length?(r=t,n):r},n.defined=function(t){return arguments.length?(u=t,n):u},n.interpolate=function(t){return arguments.length?(a="function"==typeof t?i=t:(i=Oa.get(t)||ge).key,n):a},n.tension=function(t){return arguments.length?(l=t,n):l},n}function he(t){return t[0]}function de(t){return t[1]}function ge(t){return t.join("L")}function pe(t){return ge(t)+"Z"}function me(t){for(var n=0,e=t.length,r=t[0],u=[r[0],",",r[1]];e>++n;)u.push("V",(r=t[n])[1],"H",r[0]);return u.join("")}function ve(t){for(var n=0,e=t.length,r=t[0],u=[r[0],",",r[1]];e>++n;)u.push("H",(r=t[n])[0],"V",r[1]);return u.join("")}function ye(t,n){return 4>t.length?ge(t):t[1]+xe(t.slice(1,t.length-1),_e(t,n))}function Me(t,n){return 3>t.length?ge(t):t[0]+xe((t.push(t[0]),t),_e([t[t.length-2]].concat(t,[t[1]]),n))}function be(t,n){return 3>t.length?ge(t):t[0]+xe(t,_e(t,n))}function xe(t,n){if(1>n.length||t.length!=n.length&&t.length!=n.length+2)return ge(t);var e=t.length!=n.length,r="",u=t[0],i=t[1],a=n[0],o=a,c=1;if(e&&(r+="Q"+(i[0]-2*a[0]/3)+","+(i[1]-2*a[1]/3)+","+i[0]+","+i[1],u=t[1],c=2),n.length>1){o=n[1],i=t[c],c++,r+="C"+(u[0]+a[0])+","+(u[1]+a[1])+","+(i[0]-o[0])+","+(i[1]-o[1])+","+i[0]+","+i[1];for(var l=2;n.length>l;l++,c++)i=t[c],o=n[l],r+="S"+(i[0]-o[0])+","+(i[1]-o[1])+","+i[0]+","+i[1]}if(e){var s=t[c];r+="Q"+(i[0]+2*o[0]/3)+","+(i[1]+2*o[1]/3)+","+s[0]+","+s[1]}return r}function _e(t,n){for(var e,r=[],u=(1-n)/2,i=t[0],a=t[1],o=1,c=t.length;c>++o;)e=i,i=a,a=t[o],r.push([u*(a[0]-e[0]),u*(a[1]-e[1])]);return r}function we(t){if(3>t.length)return ge(t);var n=1,e=t.length,r=t[0],u=r[0],i=r[1],a=[u,u,u,(r=t[1])[0]],o=[i,i,i,r[1]],c=[u,",",i];for(Ne(c,a,o);e>++n;)r=t[n],a.shift(),a.push(r[0]),o.shift(),o.push(r[1]),Ne(c,a,o);for(n=-1;2>++n;)a.shift(),a.push(r[0]),o.shift(),o.push(r[1]),Ne(c,a,o);return c.join("")}function Se(t){if(4>t.length)return ge(t);for(var n,e=[],r=-1,u=t.length,i=[0],a=[0];3>++r;)n=t[r],i.push(n[0]),a.push(n[1]);for(e.push(Ae(Ia,i)+","+Ae(Ia,a)),--r;u>++r;)n=t[r],i.shift(),i.push(n[0]),a.shift(),a.push(n[1]),Ne(e,i,a);return e.join("")}function ke(t){for(var n,e,r=-1,u=t.length,i=u+4,a=[],o=[];4>++r;)e=t[r%u],a.push(e[0]),o.push(e[1]);for(n=[Ae(Ia,a),",",Ae(Ia,o)],--r;i>++r;)e=t[r%u],a.shift(),a.push(e[0]),o.shift(),o.push(e[1]),Ne(n,a,o);return n.join("")}function Ee(t,n){var e=t.length-1;if(e)for(var r,u,i=t[0][0],a=t[0][1],o=t[e][0]-i,c=t[e][1]-a,l=-1;e>=++l;)r=t[l],u=l/e,r[0]=n*r[0]+(1-n)*(i+u*o),r[1]=n*r[1]+(1-n)*(a+u*c);return we(t)}function Ae(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]+t[3]*n[3]}function Ne(t,n,e){t.push("C",Ae(Ya,n),",",Ae(Ya,e),",",Ae(Ua,n),",",Ae(Ua,e),",",Ae(Ia,n),",",Ae(Ia,e))}function Te(t,n){return(n[1]-t[1])/(n[0]-t[0])}function qe(t){for(var n=0,e=t.length-1,r=[],u=t[0],i=t[1],a=r[0]=Te(u,i);e>++n;)r[n]=(a+(a=Te(u=i,i=t[n+1])))/2;return r[n]=a,r}function Ce(t){for(var n,e,r,u,i=[],a=qe(t),o=-1,c=t.length-1;c>++o;)n=Te(t[o],t[o+1]),1e-6>Math.abs(n)?a[o]=a[o+1]=0:(e=a[o]/n,r=a[o+1]/n,u=e*e+r*r,u>9&&(u=3*n/Math.sqrt(u),a[o]=u*e,a[o+1]=u*r));for(o=-1;c>=++o;)u=(t[Math.min(c,o+1)][0]-t[Math.max(0,o-1)][0])/(6*(1+a[o]*a[o])),i.push([u||0,a[o]*u||0]);return i}function ze(t){return 3>t.length?ge(t):t[0]+xe(t,Ce(t))}function De(t){for(var n,e,r,u=-1,i=t.length;i>++u;)n=t[u],e=n[0],r=n[1]+Pa,n[0]=e*Math.cos(r),n[1]=e*Math.sin(r);return t}function Le(t){function n(n){function o(){m.push("M",l(t(y),d),h,f(t(v.reverse()),d),"Z")}for(var s,g,p,m=[],v=[],y=[],M=-1,b=n.length,x=c(e),_=c(u),w=e===r?function(){return g}:c(r),S=u===i?function(){return p}:c(i);b>++M;)a.call(this,s=n[M],M)?(v.push([g=+x.call(this,s,M),p=+_.call(this,s,M)]),y.push([+w.call(this,s,M),+S.call(this,s,M)])):v.length&&(o(),v=[],y=[]);return v.length&&o(),m.length?m.join(""):null}var e=he,r=he,u=0,i=de,a=o,l=ge,s=l.key,f=l,h="L",d=.7;return n.x=function(t){return arguments.length?(e=r=t,n):r},n.x0=function(t){return arguments.length?(e=t,n):e},n.x1=function(t){return arguments.length?(r=t,n):r},n.y=function(t){return arguments.length?(u=i=t,n):i},n.y0=function(t){return arguments.length?(u=t,n):u},n.y1=function(t){return arguments.length?(i=t,n):i},n.defined=function(t){return arguments.length?(a=t,n):a},n.interpolate=function(t){return arguments.length?(s="function"==typeof t?l=t:(l=Oa.get(t)||ge).key,f=l.reverse||l,h=l.closed?"M":"L",n):s},n.tension=function(t){return arguments.length?(d=t,n):d},n}function Fe(t){return t.radius}function He(t){return[t.x,t.y]}function Re(t){return function(){var n=t.apply(this,arguments),e=n[0],r=n[1]+Pa;return[e*Math.cos(r),e*Math.sin(r)]}}function Pe(){return 64}function je(){return"circle"}function Oe(t){var n=Math.sqrt(t/Ri);return"M0,"+n+"A"+n+","+n+" 0 1,1 0,"+-n+"A"+n+","+n+" 0 1,1 0,"+n+"Z"}function Ye(t,n){t.attr("transform",function(t){return"translate("+n(t)+",0)"})}function Ue(t,n){t.attr("transform",function(t){return"translate(0,"+n(t)+")"})}function Ie(t,n,e){if(r=[],e&&n.length>1){for(var r,u,i,a=jn(t.domain()),o=-1,c=n.length,l=(n[1]-n[0])/++e;c>++o;)for(u=e;--u>0;)(i=+n[o]-u*l)>=a[0]&&r.push(i);for(--o,u=0;e>++u&&(i=+n[o]+u*l)<a[1];)r.push(i)}return r}function Ve(){Ja||(Ja=d3.select("body").append("div").style("visibility","hidden").style("top",0).style("height",0).style("width",0).style("overflow-y","scroll").append("div").style("height","2000px").node().parentNode);var t,n=d3.event;try{Ja.scrollTop=1e3,Ja.dispatchEvent(n),t=1e3-Ja.scrollTop}catch(e){t=n.wheelDelta||5*-n.detail}return t}function Xe(t){for(var n=t.source,e=t.target,r=Be(n,e),u=[n];n!==r;)n=n.parent,u.push(n);for(var i=u.length;e!==r;)u.splice(i,0,e),e=e.parent;return u}function Ze(t){for(var n=[],e=t.parent;null!=e;)n.push(t),t=e,e=e.parent;return n.push(t),n}function Be(t,n){if(t===n)return t;for(var e=Ze(t),r=Ze(n),u=e.pop(),i=r.pop(),a=null;u===i;)a=u,u=e.pop(),i=r.pop();return a}function $e(t){t.fixed|=2}function Je(t){t.fixed&=1}function Ge(t){t.fixed|=4,t.px=t.x,t.py=t.y}function Ke(t){t.fixed&=3}function We(t,n,e){var r=0,u=0;if(t.charge=0,!t.leaf)for(var i,a=t.nodes,o=a.length,c=-1;o>++c;)i=a[c],null!=i&&(We(i,n,e),t.charge+=i.charge,r+=i.charge*i.cx,u+=i.charge*i.cy);if(t.point){t.leaf||(t.point.x+=Math.random()-.5,t.point.y+=Math.random()-.5);var l=n*e[t.point.index];t.charge+=t.pointCharge=l,r+=l*t.point.x,u+=l*t.point.y}t.cx=r/t.charge,t.cy=u/t.charge}function Qe(){return 20}function tr(){return 1}function nr(t){return t.x}function er(t){return t.y}function rr(t,n,e){t.y0=n,t.y=e}function ur(t){return d3.range(t.length)}function ir(t){for(var n=-1,e=t[0].length,r=[];e>++n;)r[n]=0;return r}function ar(t){for(var n,e=1,r=0,u=t[0][1],i=t.length;i>e;++e)(n=t[e][1])>u&&(r=e,u=n);return r}function or(t){return t.reduce(cr,0)}function cr(t,n){return t+n[1]}function lr(t,n){return sr(t,Math.ceil(Math.log(n.length)/Math.LN2+1))}function sr(t,n){for(var e=-1,r=+t[0],u=(t[1]-r)/n,i=[];n>=++e;)i[e]=u*e+r;return i}function fr(t){return[d3.min(t),d3.max(t)]}function hr(t,n){return d3.rebind(t,n,"sort","children","value"),t.nodes=t,t.links=mr,t}function dr(t){return t.children}function gr(t){return t.value}function pr(t,n){return n.value-t.value}function mr(t){return d3.merge(t.map(function(t){return(t.children||[]).map(function(n){return{source:t,target:n}})}))}function vr(t,n){return t.value-n.value}function yr(t,n){var e=t._pack_next;t._pack_next=n,n._pack_prev=t,n._pack_next=e,e._pack_prev=n}function Mr(t,n){t._pack_next=n,n._pack_prev=t}function br(t,n){var e=n.x-t.x,r=n.y-t.y,u=t.r+n.r;return u*u-e*e-r*r>.001}function xr(t){function n(t){s=Math.min(t.x-t.r,s),f=Math.max(t.x+t.r,f),h=Math.min(t.y-t.r,h),d=Math.max(t.y+t.r,d)}if((e=t.children)&&(l=e.length)){var e,r,u,i,a,o,c,l,s=1/0,f=-1/0,h=1/0,d=-1/0;if(e.forEach(_r),r=e[0],r.x=-r.r,r.y=0,n(r),l>1&&(u=e[1],u.x=u.r,u.y=0,n(u),l>2))for(i=e[2],kr(r,u,i),n(i),yr(r,i),r._pack_prev=i,yr(i,u),u=r._pack_next,a=3;l>a;a++){kr(r,u,i=e[a]);var g=0,p=1,m=1;for(o=u._pack_next;o!==u;o=o._pack_next,p++)if(br(o,i)){g=1;break}if(1==g)for(c=r._pack_prev;c!==o._pack_prev&&!br(c,i);c=c._pack_prev,m++);g?(m>p||p==m&&u.r<r.r?Mr(r,u=o):Mr(r=c,u),a--):(yr(r,i),u=i,n(i))}var v=(s+f)/2,y=(h+d)/2,M=0;for(a=0;l>a;a++)i=e[a],i.x-=v,i.y-=y,M=Math.max(M,i.r+Math.sqrt(i.x*i.x+i.y*i.y));t.r=M,e.forEach(wr)}}function _r(t){t._pack_next=t._pack_prev=t}function wr(t){delete t._pack_next,delete t._pack_prev}function Sr(t,n,e,r){var u=t.children;if(t.x=n+=r*t.x,t.y=e+=r*t.y,t.r*=r,u)for(var i=-1,a=u.length;a>++i;)Sr(u[i],n,e,r)}function kr(t,n,e){var r=t.r+e.r,u=n.x-t.x,i=n.y-t.y;if(r&&(u||i)){var a=n.r+e.r,o=u*u+i*i;a*=a,r*=r;var c=.5+(r-a)/(2*o),l=Math.sqrt(Math.max(0,2*a*(r+o)-(r-=o)*r-a*a))/(2*o);e.x=t.x+c*u+l*i,e.y=t.y+c*i-l*u}else e.x=t.x+r,e.y=t.y}function Er(t){return 1+d3.max(t,function(t){return t.y})}function Ar(t){return t.reduce(function(t,n){return t+n.x},0)/t.length}function Nr(t){var n=t.children;return n&&n.length?Nr(n[0]):t}function Tr(t){var n,e=t.children;return e&&(n=e.length)?Tr(e[n-1]):t}function qr(t,n){return t.parent==n.parent?1:2}function Cr(t){var n=t.children;return n&&n.length?n[0]:t._tree.thread}function zr(t){var n,e=t.children;return e&&(n=e.length)?e[n-1]:t._tree.thread}function Dr(t,n){var e=t.children;if(e&&(u=e.length))for(var r,u,i=-1;u>++i;)n(r=Dr(e[i],n),t)>0&&(t=r);return t}function Lr(t,n){return t.x-n.x}function Fr(t,n){return n.x-t.x}function Hr(t,n){return t.depth-n.depth}function Rr(t,n){function e(t,r){var u=t.children;if(u&&(a=u.length))for(var i,a,o=null,c=-1;a>++c;)i=u[c],e(i,o),o=i;n(t,r)}e(t,null)}function Pr(t){for(var n,e=0,r=0,u=t.children,i=u.length;--i>=0;)n=u[i]._tree,n.prelim+=e,n.mod+=e,e+=n.shift+(r+=n.change)}function jr(t,n,e){t=t._tree,n=n._tree;var r=e/(n.number-t.number);t.change+=r,n.change-=r,n.shift+=e,n.prelim+=e,n.mod+=e}function Or(t,n,e){return t._tree.ancestor.parent==n.parent?t._tree.ancestor:e}function Yr(t){return{x:t.x,y:t.y,dx:t.dx,dy:t.dy}}function Ur(t,n){var e=t.x+n[3],r=t.y+n[0],u=t.dx-n[1]-n[3],i=t.dy-n[0]-n[2];return 0>u&&(e+=u/2,u=0),0>i&&(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function Ir(t,n){function e(t,e){return d3.xhr(t,n,e).response(r)}function r(t){return e.parse(t.responseText)}function u(n){return n.map(i).join(t)}function i(t){return a.test(t)?'"'+t.replace(/\"/g,'""')+'"':t}var a=RegExp('["'+t+"\n]"),o=t.charCodeAt(0);return e.parse=function(t){var n;return e.parseRows(t,function(t){return n?n(t):(n=Function("d","return {"+t.map(function(t,n){return JSON.stringify(t)+": d["+n+"]"}).join(",")+"}"),void 0)})},e.parseRows=function(t,n){function e(){if(s>=l)return a;if(u)return u=!1,i;var n=s;if(34===t.charCodeAt(n)){for(var e=n;l>e++;)if(34===t.charCodeAt(e)){if(34!==t.charCodeAt(e+1))break;++e}s=e+2;var r=t.charCodeAt(e+1);return 13===r?(u=!0,10===t.charCodeAt(e+2)&&++s):10===r&&(u=!0),t.substring(n+1,e).replace(/""/g,'"')}for(;l>s;){var r=t.charCodeAt(s++),c=1;if(10===r)u=!0;else if(13===r)u=!0,10===t.charCodeAt(s)&&(++s,++c);else if(r!==o)continue;return t.substring(n,s-c)}return t.substring(n)}for(var r,u,i={},a={},c=[],l=t.length,s=0,f=0;(r=e())!==a;){for(var h=[];r!==i&&r!==a;)h.push(r),r=e();(!n||(h=n(h,f++)))&&c.push(h)}return c},e.format=function(t){return t.map(u).join("\n")},e}function Vr(t,n){no.hasOwnProperty(t.type)&&no[t.type](t,n)}function Xr(t,n,e){var r,u=-1,i=t.length-e;for(n.lineStart();i>++u;)r=t[u],n.point(r[0],r[1]);n.lineEnd()}function Zr(t,n){var e=-1,r=t.length;for(n.polygonStart();r>++e;)Xr(t[e],n,1);n.polygonEnd()}function Br(t){return[Math.atan2(t[1],t[0]),Math.asin(Math.max(-1,Math.min(1,t[2])))]}function $r(t,n){return Pi>Math.abs(t[0]-n[0])&&Pi>Math.abs(t[1]-n[1])}function Jr(t){var n=t[0],e=t[1],r=Math.cos(e);return[r*Math.cos(n),r*Math.sin(n),Math.sin(e)]}function Gr(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]}function Kr(t,n){return[t[1]*n[2]-t[2]*n[1],t[2]*n[0]-t[0]*n[2],t[0]*n[1]-t[1]*n[0]]}function Wr(t,n){t[0]+=n[0],t[1]+=n[1],t[2]+=n[2]}function Qr(t,n){return[t[0]*n,t[1]*n,t[2]*n]}function tu(t){var n=Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);t[0]/=n,t[1]/=n,t[2]/=n}function nu(t){function n(n){function r(e,r){e=t(e,r),n.point(e[0],e[1])}function i(){s=0/0,p.point=a,n.lineStart()}function a(r,i){var a=Jr([r,i]),o=t(r,i);e(s,f,l,h,d,g,s=o[0],f=o[1],l=r,h=a[0],d=a[1],g=a[2],u,n),n.point(s,f)}function o(){p.point=r,n.lineEnd()}function c(){var t,r,c,m,v,y,M;i(),p.point=function(n,e){a(t=n,r=e),c=s,m=f,v=h,y=d,M=g,p.point=a},p.lineEnd=function(){e(s,f,l,h,d,g,c,m,t,v,y,M,u,n),p.lineEnd=o,o()}}var l,s,f,h,d,g,p={point:r,lineStart:i,lineEnd:o,polygonStart:function(){n.polygonStart(),p.lineStart=c},polygonEnd:function(){n.polygonEnd(),p.lineStart=i}};return p}function e(n,u,i,a,o,c,l,s,f,h,d,g,p,m){var v=l-n,y=s-u,M=v*v+y*y;if(M>4*r&&p--){var b=a+h,x=o+d,_=c+g,w=Math.sqrt(b*b+x*x+_*_),S=Math.asin(_/=w),k=Pi>Math.abs(Math.abs(_)-1)?(i+f)/2:Math.atan2(x,b),E=t(k,S),A=E[0],N=E[1],T=A-n,q=N-u,C=y*T-v*q;(C*C/M>r||Math.abs((v*T+y*q)/M-.5)>.3)&&(e(n,u,i,a,o,c,A,N,k,b/=w,x/=w,_,p,m),m.point(A,N),e(A,N,k,b,x,_,l,s,f,h,d,g,p,m))}}var r=.5,u=16;return n.precision=function(t){return arguments.length?(u=(r=t*t)>0&&16,n):Math.sqrt(r)},n}function eu(t,n){function e(t,n){var e=Math.sqrt(i-2*u*Math.sin(n))/u;return[e*Math.sin(t*=u),a-e*Math.cos(t)]}var r=Math.sin(t),u=(r+Math.sin(n))/2,i=1+r*(2*u-r),a=Math.sqrt(i)/u;return e.invert=function(t,n){var e=a-n;return[Math.atan2(t,e)/u,Math.asin((i-(t*t+e*e)*u*u)/(2*u))]},e}function ru(t){function n(t,n){r>t&&(r=t),t>i&&(i=t),u>n&&(u=n),n>a&&(a=n)}function e(){o.point=o.lineEnd=Pn}var r,u,i,a,o={point:n,lineStart:Pn,lineEnd:Pn,polygonStart:function(){o.lineEnd=e},polygonEnd:function(){o.point=n}},c=t?t.stream(o):o;return function(t){return a=i=-(r=u=1/0),d3.geo.stream(t,c),[[r,u],[i,a]]}}function uu(t,n){if(!uo){++io,t*=ji;var e=Math.cos(n*=ji);ao+=(e*Math.cos(t)-ao)/io,oo+=(e*Math.sin(t)-oo)/io,co+=(Math.sin(n)-co)/io}}function iu(){var t,n;2>uo&&(uo=2,io=ao=oo=co=0),uo=1,au(),uo=2;var e=lo.point;lo.point=function(r,u){e(t=r,n=u)},lo.lineEnd=function(){lo.point(t,n),ou(),lo.lineEnd=ou}}function au(){function t(t,u){t*=ji;var i=Math.cos(u*=ji),a=i*Math.cos(t),o=i*Math.sin(t),c=Math.sin(u),l=Math.atan2(Math.sqrt((l=e*c-r*o)*l+(l=r*a-n*c)*l+(l=n*o-e*a)*l),n*a+e*o+r*c);io+=l,ao+=l*(n+(n=a)),oo+=l*(e+(e=o)),co+=l*(r+(r=c))}var n,e,r;if(1!==uo){if(!(1>uo))return;uo=1,io=ao=oo=co=0}lo.point=function(u,i){u*=ji;var a=Math.cos(i*=ji);n=a*Math.cos(u),e=a*Math.sin(u),r=Math.sin(i),lo.point=t}}function ou(){lo.point=uu}function cu(t,n){var e=Math.cos(t),r=Math.sin(t);return function(u,i,a,o){null!=u?(u=lu(e,u),i=lu(e,i),(a>0?i>u:u>i)&&(u+=2*a*Ri)):(u=t+2*a*Ri,i=t);for(var c,l=a*n,s=u;a>0?s>i:i>s;s-=l)o.point((c=Br([e,-r*Math.cos(s),-r*Math.sin(s)]))[0],c[1])}}function lu(t,n){var e=Jr(n);e[0]-=t,tu(e);var r=Math.acos(Math.max(-1,Math.min(1,-e[1])));return((0>-e[2]?-r:r)+2*Math.PI-Pi)%(2*Math.PI)}function su(t,n,e){return function(r){function u(n,e){t(n,e)&&r.point(n,e)}function i(t,n){m.point(t,n)}function a(){v.point=i,m.lineStart()}function o(){v.point=u,m.lineEnd()}function c(t,n){M.point(t,n),p.push([t,n])}function l(){M.lineStart(),p=[]}function s(){c(p[0][0],p[0][1]),M.lineEnd();var t,n=M.clean(),e=y.buffer(),u=e.length;if(!u)return g=!0,d+=mu(p,-1),p=null,void 0;if(p=null,1&n){t=e[0],h+=mu(t,1);var i,u=t.length-1,a=-1;for(r.lineStart();u>++a;)r.point((i=t[a])[0],i[1]);return r.lineEnd(),void 0}u>1&&2&n&&e.push(e.pop().concat(e.shift())),f.push(e.filter(gu))}var f,h,d,g,p,m=n(r),v={point:u,lineStart:a,lineEnd:o,polygonStart:function(){v.point=c,v.lineStart=l,v.lineEnd=s,g=!1,d=h=0,f=[],r.polygonStart() +},polygonEnd:function(){v.point=u,v.lineStart=a,v.lineEnd=o,f=d3.merge(f),f.length?fu(f,e,r):(-Pi>h||g&&-Pi>d)&&(r.lineStart(),e(null,null,1,r),r.lineEnd()),r.polygonEnd(),f=null},sphere:function(){r.polygonStart(),r.lineStart(),e(null,null,1,r),r.lineEnd(),r.polygonEnd()}},y=pu(),M=n(y);return v}}function fu(t,n,e){var r=[],u=[];if(t.forEach(function(t){var n=t.length;if(!(1>=n)){var e=t[0],i=t[n-1],a={point:e,points:t,other:null,visited:!1,entry:!0,subject:!0},o={point:e,points:[e],other:a,visited:!1,entry:!1,subject:!1};a.other=o,r.push(a),u.push(o),a={point:i,points:[i],other:null,visited:!1,entry:!1,subject:!0},o={point:i,points:[i],other:a,visited:!1,entry:!0,subject:!1},a.other=o,r.push(a),u.push(o)}}),u.sort(du),hu(r),hu(u),r.length)for(var i,a,o,c=r[0];;){for(i=c;i.visited;)if((i=i.next)===c)return;a=i.points,e.lineStart();do{if(i.visited=i.other.visited=!0,i.entry){if(i.subject)for(var l=0;a.length>l;l++)e.point((o=a[l])[0],o[1]);else n(i.point,i.next.point,1,e);i=i.next}else{if(i.subject){a=i.prev.points;for(var l=a.length;--l>=0;)e.point((o=a[l])[0],o[1])}else n(i.point,i.prev.point,-1,e);i=i.prev}i=i.other,a=i.points}while(!i.visited);e.lineEnd()}}function hu(t){if(n=t.length){for(var n,e,r=0,u=t[0];n>++r;)u.next=e=t[r],e.prev=u,u=e;u.next=e=t[0],e.prev=u}}function du(t,n){return(0>(t=t.point)[0]?t[1]-Ri/2-Pi:Ri/2-t[1])-(0>(n=n.point)[0]?n[1]-Ri/2-Pi:Ri/2-n[1])}function gu(t){return t.length>1}function pu(){var t,n=[];return{lineStart:function(){n.push(t=[])},point:function(n,e){t.push([n,e])},lineEnd:Pn,buffer:function(){var e=n;return n=[],t=null,e}}}function mu(t,n){if(!(e=t.length))return 0;for(var e,r,u,i=0,a=0,o=t[0],c=o[0],l=o[1],s=Math.cos(l),f=Math.atan2(n*Math.sin(c)*s,Math.sin(l)),h=1-n*Math.cos(c)*s,d=f;e>++i;)o=t[i],s=Math.cos(l=o[1]),r=Math.atan2(n*Math.sin(c=o[0])*s,Math.sin(l)),u=1-n*Math.cos(c)*s,Pi>Math.abs(h-2)&&Pi>Math.abs(u-2)||(Pi>Math.abs(u)||Pi>Math.abs(h)||(Pi>Math.abs(Math.abs(r-f)-Ri)?u+h>2&&(a+=4*(r-f)):a+=Pi>Math.abs(h-2)?4*(r-d):((3*Ri+r-f)%(2*Ri)-Ri)*(h+u)),d=f,f=r,h=u);return a}function vu(t){var n,e=0/0,r=0/0,u=0/0;return{lineStart:function(){t.lineStart(),n=1},point:function(i,a){var o=i>0?Ri:-Ri,c=Math.abs(i-e);Pi>Math.abs(c-Ri)?(t.point(e,r=(r+a)/2>0?Ri/2:-Ri/2),t.point(u,r),t.lineEnd(),t.lineStart(),t.point(o,r),t.point(i,r),n=0):u!==o&&c>=Ri&&(Pi>Math.abs(e-u)&&(e-=u*Pi),Pi>Math.abs(i-o)&&(i-=o*Pi),r=yu(e,r,i,a),t.point(u,r),t.lineEnd(),t.lineStart(),t.point(o,r),n=0),t.point(e=i,r=a),u=o},lineEnd:function(){t.lineEnd(),e=r=0/0},clean:function(){return 2-n}}}function yu(t,n,e,r){var u,i,a=Math.sin(t-e);return Math.abs(a)>Pi?Math.atan((Math.sin(n)*(i=Math.cos(r))*Math.sin(e)-Math.sin(r)*(u=Math.cos(n))*Math.sin(t))/(u*i*a)):(n+r)/2}function Mu(t,n,e,r){var u;if(null==t)u=e*Ri/2,r.point(-Ri,u),r.point(0,u),r.point(Ri,u),r.point(Ri,0),r.point(Ri,-u),r.point(0,-u),r.point(-Ri,-u),r.point(-Ri,0),r.point(-Ri,u);else if(Math.abs(t[0]-n[0])>Pi){var i=(t[0]<n[0]?1:-1)*Ri;u=e*i/2,r.point(-i,u),r.point(0,u),r.point(i,u)}else r.point(n[0],n[1])}function bu(t){function n(t,n){return Math.cos(t)*Math.cos(n)>i}function e(t){var e,u,i,a;return{lineStart:function(){i=u=!1,a=1},point:function(o,c){var l,s=[o,c],f=n(o,c);!e&&(i=u=f)&&t.lineStart(),f!==u&&(l=r(e,s),($r(e,l)||$r(s,l))&&(s[0]+=Pi,s[1]+=Pi,f=n(s[0],s[1]))),f!==u&&(a=0,(u=f)?(t.lineStart(),l=r(s,e),t.point(l[0],l[1])):(l=r(e,s),t.point(l[0],l[1]),t.lineEnd()),e=l),!f||e&&$r(e,s)||t.point(s[0],s[1]),e=s},lineEnd:function(){u&&t.lineEnd(),e=null},clean:function(){return a|(i&&u)<<1}}}function r(t,n){var e=Jr(t,0),r=Jr(n,0),u=[1,0,0],a=Kr(e,r),o=Gr(a,a),c=a[0],l=o-c*c;if(!l)return t;var s=i*o/l,f=-i*c/l,h=Kr(u,a),d=Qr(u,s),g=Qr(a,f);Wr(d,g);var p=h,m=Gr(d,p),v=Gr(p,p),y=Math.sqrt(m*m-v*(Gr(d,d)-1)),M=Qr(p,(-m-y)/v);return Wr(M,d),Br(M)}var u=t*ji,i=Math.cos(u),a=cu(u,6*ji);return su(n,e,a)}function xu(t,n){function e(e,r){return e=t(e,r),n(e[0],e[1])}return t.invert&&n.invert&&(e.invert=function(e,r){return e=n.invert(e,r),t.invert(e[0],e[1])}),e}function _u(t,n){return[t,n]}function wu(t,n,e){var r=d3.range(t,n-Pi,e).concat(n);return function(t){return r.map(function(n){return[t,n]})}}function Su(t,n,e){var r=d3.range(t,n-Pi,e).concat(n);return function(t){return r.map(function(n){return[n,t]})}}function ku(t,n,e,r){function u(t){var n=Math.sin(t*=d)*g,e=Math.sin(d-t)*g,r=e*l+n*f,u=e*s+n*h,i=e*a+n*c;return[Math.atan2(u,r)/ji,Math.atan2(i,Math.sqrt(r*r+u*u))/ji]}var i=Math.cos(n),a=Math.sin(n),o=Math.cos(r),c=Math.sin(r),l=i*Math.cos(t),s=i*Math.sin(t),f=o*Math.cos(e),h=o*Math.sin(e),d=Math.acos(Math.max(-1,Math.min(1,a*c+i*o*Math.cos(e-t)))),g=1/Math.sin(d);return u.distance=d,u}function Eu(t,n){return[t/(2*Ri),Math.max(-.5,Math.min(.5,Math.log(Math.tan(Ri/4+n/2))/(2*Ri)))]}function Au(t){return"m0,"+t+"a"+t+","+t+" 0 1,1 0,"+-2*t+"a"+t+","+t+" 0 1,1 0,"+2*t+"z"}function Nu(t){var n=nu(function(n,e){return t([n*Oi,e*Oi])});return function(t){return t=n(t),{point:function(n,e){t.point(n*ji,e*ji)},sphere:function(){t.sphere()},lineStart:function(){t.lineStart()},lineEnd:function(){t.lineEnd()},polygonStart:function(){t.polygonStart()},polygonEnd:function(){t.polygonEnd()}}}}function Tu(){function t(t,n){a.push("M",t,",",n,i)}function n(t,n){a.push("M",t,",",n),o.point=e}function e(t,n){a.push("L",t,",",n)}function r(){o.point=t}function u(){a.push("Z")}var i=Au(4.5),a=[],o={point:t,lineStart:function(){o.point=n},lineEnd:r,polygonStart:function(){o.lineEnd=u},polygonEnd:function(){o.lineEnd=r,o.point=t},pointRadius:function(t){return i=Au(t),o},result:function(){if(a.length){var t=a.join("");return a=[],t}}};return o}function qu(t){function n(n,e){t.moveTo(n,e),t.arc(n,e,a,0,2*Ri)}function e(n,e){t.moveTo(n,e),o.point=r}function r(n,e){t.lineTo(n,e)}function u(){o.point=n}function i(){t.closePath()}var a=4.5,o={point:n,lineStart:function(){o.point=e},lineEnd:u,polygonStart:function(){o.lineEnd=i},polygonEnd:function(){o.lineEnd=u,o.point=n},pointRadius:function(t){return a=t,o},result:Pn};return o}function Cu(){function t(t,n){po+=u*t-r*n,r=t,u=n}var n,e,r,u;mo.point=function(i,a){mo.point=t,n=r=i,e=u=a},mo.lineEnd=function(){t(n,e)}}function zu(t,n){uo||(ao+=t,oo+=n,++co)}function Du(){function t(t,r){var u=t-n,i=r-e,a=Math.sqrt(u*u+i*i);ao+=a*(n+t)/2,oo+=a*(e+r)/2,co+=a,n=t,e=r}var n,e;if(1!==uo){if(!(1>uo))return;uo=1,ao=oo=co=0}vo.point=function(r,u){vo.point=t,n=r,e=u}}function Lu(){vo.point=zu}function Fu(){function t(t,n){var e=u*t-r*n;ao+=e*(r+t),oo+=e*(u+n),co+=3*e,r=t,u=n}var n,e,r,u;2>uo&&(uo=2,ao=oo=co=0),vo.point=function(i,a){vo.point=t,n=r=i,e=u=a},vo.lineEnd=function(){t(n,e)}}function Hu(){function t(t,n){if(t*=ji,n*=ji,!(Pi>Math.abs(Math.abs(i)-Ri/2)&&Pi>Math.abs(Math.abs(n)-Ri/2))){var e=Math.cos(n),c=Math.sin(n);if(Pi>Math.abs(i-Ri/2))Mo+=2*(t-r);else{var l=t-u,s=Math.cos(l),f=Math.atan2(Math.sqrt((f=e*Math.sin(l))*f+(f=a*c-o*e*s)*f),o*c+a*e*s),h=(f+Ri+i+n)/4;Mo+=(0>l&&l>-Ri||l>Ri?-4:4)*Math.atan(Math.sqrt(Math.abs(Math.tan(h)*Math.tan(h-f/2)*Math.tan(h-Ri/4-i/2)*Math.tan(h-Ri/4-n/2))))}r=u,u=t,i=n,a=e,o=c}}var n,e,r,u,i,a,o;bo.point=function(c,l){bo.point=t,r=u=(n=c)*ji,i=(e=l)*ji,a=Math.cos(i),o=Math.sin(i)},bo.lineEnd=function(){t(n,e)}}function Ru(t){return Pu(function(){return t})()}function Pu(t){function n(t){return t=a(t[0]*ji,t[1]*ji),[t[0]*s+o,c-t[1]*s]}function e(t){return t=a.invert((t[0]-o)/s,(c-t[1])/s),[t[0]*Oi,t[1]*Oi]}function r(){a=xu(i=Ou(p,m,v),u);var t=u(d,g);return o=f-t[0]*s,c=h+t[1]*s,n}var u,i,a,o,c,l=nu(function(t,n){return t=u(t,n),[t[0]*s+o,c-t[1]*s]}),s=150,f=480,h=250,d=0,g=0,p=0,m=0,v=0,y=so,M=null;return n.stream=function(t){return ju(i,y(l(t)))},n.clipAngle=function(t){return arguments.length?(y=null==t?(M=t,so):bu(M=+t),n):M},n.scale=function(t){return arguments.length?(s=+t,r()):s},n.translate=function(t){return arguments.length?(f=+t[0],h=+t[1],r()):[f,h]},n.center=function(t){return arguments.length?(d=t[0]%360*ji,g=t[1]%360*ji,r()):[d*Oi,g*Oi]},n.rotate=function(t){return arguments.length?(p=t[0]%360*ji,m=t[1]%360*ji,v=t.length>2?t[2]%360*ji:0,r()):[p*Oi,m*Oi,v*Oi]},d3.rebind(n,l,"precision"),function(){return u=t.apply(this,arguments),n.invert=u.invert&&e,r()}}function ju(t,n){return{point:function(e,r){r=t(e*ji,r*ji),e=r[0],n.point(e>Ri?e-2*Ri:-Ri>e?e+2*Ri:e,r[1])},sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function Ou(t,n,e){return t?n||e?xu(Uu(t),Iu(n,e)):Uu(t):n||e?Iu(n,e):_u}function Yu(t){return function(n,e){return n+=t,[n>Ri?n-2*Ri:-Ri>n?n+2*Ri:n,e]}}function Uu(t){var n=Yu(t);return n.invert=Yu(-t),n}function Iu(t,n){function e(t,n){var e=Math.cos(n),o=Math.cos(t)*e,c=Math.sin(t)*e,l=Math.sin(n),s=l*r+o*u;return[Math.atan2(c*i-s*a,o*r-l*u),Math.asin(Math.max(-1,Math.min(1,s*i+c*a)))]}var r=Math.cos(t),u=Math.sin(t),i=Math.cos(n),a=Math.sin(n);return e.invert=function(t,n){var e=Math.cos(n),o=Math.cos(t)*e,c=Math.sin(t)*e,l=Math.sin(n),s=l*i-c*a;return[Math.atan2(c*i+l*a,o*r+s*u),Math.asin(Math.max(-1,Math.min(1,s*r-o*u)))]},e}function Vu(t,n){function e(n,e){var r=Math.cos(n),u=Math.cos(e),i=t(r*u);return[i*u*Math.sin(n),i*Math.sin(e)]}return e.invert=function(t,e){var r=Math.sqrt(t*t+e*e),u=n(r),i=Math.sin(u),a=Math.cos(u);return[Math.atan2(t*i,r*a),Math.asin(r&&e*i/r)]},e}function Xu(t,n,e,r){var u,i,a,o,c,l,s;return u=r[t],i=u[0],a=u[1],u=r[n],o=u[0],c=u[1],u=r[e],l=u[0],s=u[1],(s-a)*(o-i)-(c-a)*(l-i)>0}function Zu(t,n,e){return(e[0]-n[0])*(t[1]-n[1])<(e[1]-n[1])*(t[0]-n[0])}function Bu(t,n,e,r){var u=t[0],i=e[0],a=n[0]-u,o=r[0]-i,c=t[1],l=e[1],s=n[1]-c,f=r[1]-l,h=(o*(c-l)-f*(u-i))/(f*a-o*s);return[u+h*a,c+h*s]}function $u(t,n){var e={list:t.map(function(t,n){return{index:n,x:t[0],y:t[1]}}).sort(function(t,n){return t.y<n.y?-1:t.y>n.y?1:t.x<n.x?-1:t.x>n.x?1:0}),bottomSite:null},r={list:[],leftEnd:null,rightEnd:null,init:function(){r.leftEnd=r.createHalfEdge(null,"l"),r.rightEnd=r.createHalfEdge(null,"l"),r.leftEnd.r=r.rightEnd,r.rightEnd.l=r.leftEnd,r.list.unshift(r.leftEnd,r.rightEnd)},createHalfEdge:function(t,n){return{edge:t,side:n,vertex:null,l:null,r:null}},insert:function(t,n){n.l=t,n.r=t.r,t.r.l=n,t.r=n},leftBound:function(t){var n=r.leftEnd;do n=n.r;while(n!=r.rightEnd&&u.rightOf(n,t));return n=n.l},del:function(t){t.l.r=t.r,t.r.l=t.l,t.edge=null},right:function(t){return t.r},left:function(t){return t.l},leftRegion:function(t){return null==t.edge?e.bottomSite:t.edge.region[t.side]},rightRegion:function(t){return null==t.edge?e.bottomSite:t.edge.region[_o[t.side]]}},u={bisect:function(t,n){var e={region:{l:t,r:n},ep:{l:null,r:null}},r=n.x-t.x,u=n.y-t.y,i=r>0?r:-r,a=u>0?u:-u;return e.c=t.x*r+t.y*u+.5*(r*r+u*u),i>a?(e.a=1,e.b=u/r,e.c/=r):(e.b=1,e.a=r/u,e.c/=u),e},intersect:function(t,n){var e=t.edge,r=n.edge;if(!e||!r||e.region.r==r.region.r)return null;var u=e.a*r.b-e.b*r.a;if(1e-10>Math.abs(u))return null;var i,a,o=(e.c*r.b-r.c*e.b)/u,c=(r.c*e.a-e.c*r.a)/u,l=e.region.r,s=r.region.r;l.y<s.y||l.y==s.y&&l.x<s.x?(i=t,a=e):(i=n,a=r);var f=o>=a.region.r.x;return f&&"l"===i.side||!f&&"r"===i.side?null:{x:o,y:c}},rightOf:function(t,n){var e=t.edge,r=e.region.r,u=n.x>r.x;if(u&&"l"===t.side)return 1;if(!u&&"r"===t.side)return 0;if(1===e.a){var i=n.y-r.y,a=n.x-r.x,o=0,c=0;if(!u&&0>e.b||u&&e.b>=0?c=o=i>=e.b*a:(c=n.x+n.y*e.b>e.c,0>e.b&&(c=!c),c||(o=1)),!o){var l=r.x-e.region.l.x;c=e.b*(a*a-i*i)<l*i*(1+2*a/l+e.b*e.b),0>e.b&&(c=!c)}}else{var s=e.c-e.a*n.x,f=n.y-s,h=n.x-r.x,d=s-r.y;c=f*f>h*h+d*d}return"l"===t.side?c:!c},endPoint:function(t,e,r){t.ep[e]=r,t.ep[_o[e]]&&n(t)},distance:function(t,n){var e=t.x-n.x,r=t.y-n.y;return Math.sqrt(e*e+r*r)}},i={list:[],insert:function(t,n,e){t.vertex=n,t.ystar=n.y+e;for(var r=0,u=i.list,a=u.length;a>r;r++){var o=u[r];if(!(t.ystar>o.ystar||t.ystar==o.ystar&&n.x>o.vertex.x))break}u.splice(r,0,t)},del:function(t){for(var n=0,e=i.list,r=e.length;r>n&&e[n]!=t;++n);e.splice(n,1)},empty:function(){return 0===i.list.length},nextEvent:function(t){for(var n=0,e=i.list,r=e.length;r>n;++n)if(e[n]==t)return e[n+1];return null},min:function(){var t=i.list[0];return{x:t.vertex.x,y:t.ystar}},extractMin:function(){return i.list.shift()}};r.init(),e.bottomSite=e.list.shift();for(var a,o,c,l,s,f,h,d,g,p,m,v,y,M=e.list.shift();;)if(i.empty()||(a=i.min()),M&&(i.empty()||M.y<a.y||M.y==a.y&&M.x<a.x))o=r.leftBound(M),c=r.right(o),h=r.rightRegion(o),v=u.bisect(h,M),f=r.createHalfEdge(v,"l"),r.insert(o,f),p=u.intersect(o,f),p&&(i.del(o),i.insert(o,p,u.distance(p,M))),o=f,f=r.createHalfEdge(v,"r"),r.insert(o,f),p=u.intersect(f,c),p&&i.insert(f,p,u.distance(p,M)),M=e.list.shift();else{if(i.empty())break;o=i.extractMin(),l=r.left(o),c=r.right(o),s=r.right(c),h=r.leftRegion(o),d=r.rightRegion(c),m=o.vertex,u.endPoint(o.edge,o.side,m),u.endPoint(c.edge,c.side,m),r.del(o),i.del(c),r.del(c),y="l",h.y>d.y&&(g=h,h=d,d=g,y="r"),v=u.bisect(h,d),f=r.createHalfEdge(v,y),r.insert(l,f),u.endPoint(v,_o[y],m),p=u.intersect(l,f),p&&(i.del(l),i.insert(l,p,u.distance(p,h))),p=u.intersect(f,s),p&&i.insert(f,p,u.distance(p,h))}for(o=r.right(r.leftEnd);o!=r.rightEnd;o=r.right(o))n(o.edge)}function Ju(){return{leaf:!0,nodes:[],point:null}}function Gu(t,n,e,r,u,i){if(!t(n,e,r,u,i)){var a=.5*(e+u),o=.5*(r+i),c=n.nodes;c[0]&&Gu(t,c[0],e,r,a,o),c[1]&&Gu(t,c[1],a,r,u,o),c[2]&&Gu(t,c[2],e,o,a,i),c[3]&&Gu(t,c[3],a,o,u,i)}}function Ku(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function Wu(t,n,e,r){for(var u,i,a=0,o=n.length,c=e.length;o>a;){if(r>=c)return-1;if(u=n.charCodeAt(a++),37===u){if(i=Yo[n.charAt(a++)],!i||0>(r=i(t,e,r)))return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function Qu(t){return RegExp("^(?:"+t.map(d3.requote).join("|")+")","i")}function ti(t){for(var n=new i,e=-1,r=t.length;r>++e;)n.set(t[e].toLowerCase(),e);return n}function ni(t,n,e){t+="";var r=t.length;return e>r?Array(e-r+1).join(n)+t:t}function ei(t,n,e){Lo.lastIndex=0;var r=Lo.exec(n.substring(e));return r?e+=r[0].length:-1}function ri(t,n,e){Do.lastIndex=0;var r=Do.exec(n.substring(e));return r?e+=r[0].length:-1}function ui(t,n,e){Ro.lastIndex=0;var r=Ro.exec(n.substring(e));return r?(t.m=Po.get(r[0].toLowerCase()),e+=r[0].length):-1}function ii(t,n,e){Fo.lastIndex=0;var r=Fo.exec(n.substring(e));return r?(t.m=Ho.get(r[0].toLowerCase()),e+=r[0].length):-1}function ai(t,n,e){return Wu(t,""+Oo.c,n,e)}function oi(t,n,e){return Wu(t,""+Oo.x,n,e)}function ci(t,n,e){return Wu(t,""+Oo.X,n,e)}function li(t,n,e){Uo.lastIndex=0;var r=Uo.exec(n.substring(e,e+4));return r?(t.y=+r[0],e+=r[0].length):-1}function si(t,n,e){Uo.lastIndex=0;var r=Uo.exec(n.substring(e,e+2));return r?(t.y=fi(+r[0]),e+=r[0].length):-1}function fi(t){return t+(t>68?1900:2e3)}function hi(t,n,e){Uo.lastIndex=0;var r=Uo.exec(n.substring(e,e+2));return r?(t.m=r[0]-1,e+=r[0].length):-1}function di(t,n,e){Uo.lastIndex=0;var r=Uo.exec(n.substring(e,e+2));return r?(t.d=+r[0],e+=r[0].length):-1}function gi(t,n,e){Uo.lastIndex=0;var r=Uo.exec(n.substring(e,e+2));return r?(t.H=+r[0],e+=r[0].length):-1}function pi(t,n,e){Uo.lastIndex=0;var r=Uo.exec(n.substring(e,e+2));return r?(t.M=+r[0],e+=r[0].length):-1}function mi(t,n,e){Uo.lastIndex=0;var r=Uo.exec(n.substring(e,e+2));return r?(t.S=+r[0],e+=r[0].length):-1}function vi(t,n,e){Uo.lastIndex=0;var r=Uo.exec(n.substring(e,e+3));return r?(t.L=+r[0],e+=r[0].length):-1}function yi(t,n,e){var r=Io.get(n.substring(e,e+=2).toLowerCase());return null==r?-1:(t.p=r,e)}function Mi(t){var n=t.getTimezoneOffset(),e=n>0?"-":"+",r=~~(Math.abs(n)/60),u=Math.abs(n)%60;return e+ni(r,"0",2)+ni(u,"0",2)}function bi(t){return t.toISOString()}function xi(t,n,e){function r(n){var e=t(n),r=i(e,1);return r-n>n-e?e:r}function u(e){return n(e=t(new wo(e-1)),1),e}function i(t,e){return n(t=new wo(+t),e),t}function a(t,r,i){var a=u(t),o=[];if(i>1)for(;r>a;)e(a)%i||o.push(new Date(+a)),n(a,1);else for(;r>a;)o.push(new Date(+a)),n(a,1);return o}function o(t,n,e){try{wo=Ku;var r=new Ku;return r._=t,a(r,n,e)}finally{wo=Date}}t.floor=t,t.round=r,t.ceil=u,t.offset=i,t.range=a;var c=t.utc=_i(t);return c.floor=c,c.round=_i(r),c.ceil=_i(u),c.offset=_i(i),c.range=o,t}function _i(t){return function(n,e){try{wo=Ku;var r=new Ku;return r._=n,t(r,e)._}finally{wo=Date}}}function wi(t,n,e){function r(n){return t(n)}return r.invert=function(n){return ki(t.invert(n))},r.domain=function(n){return arguments.length?(t.domain(n),r):t.domain().map(ki)},r.nice=function(t){return r.domain(Yn(r.domain(),function(){return t}))},r.ticks=function(e,u){var i=Si(r.domain());if("function"!=typeof e){var a=i[1]-i[0],o=a/e,c=d3.bisect(Xo,o);if(c==Xo.length)return n.year(i,e);if(!c)return t.ticks(e).map(ki);Math.log(o/Xo[c-1])<Math.log(Xo[c]/o)&&--c,e=n[c],u=e[1],e=e[0].range}return e(i[0],new Date(+i[1]+1),u)},r.tickFormat=function(){return e},r.copy=function(){return wi(t.copy(),n,e)},d3.rebind(r,t,"range","rangeRound","interpolate","clamp")}function Si(t){var n=t[0],e=t[t.length-1];return e>n?[n,e]:[e,n]}function ki(t){return new Date(t)}function Ei(t){return function(n){for(var e=t.length-1,r=t[e];!r[1](n);)r=t[--e];return r[0](n)}}function Ai(t){var n=new Date(t,0,1);return n.setFullYear(t),n}function Ni(t){var n=t.getFullYear(),e=Ai(n),r=Ai(n+1);return n+(t-e)/(r-e)}function Ti(t){var n=new Date(Date.UTC(t,0,1));return n.setUTCFullYear(t),n}function qi(t){var n=t.getUTCFullYear(),e=Ti(n),r=Ti(n+1);return n+(t-e)/(r-e)}var Ci=".",zi=",",Di=[3,3];Date.now||(Date.now=function(){return+new Date});try{document.createElement("div").style.setProperty("opacity",0,"")}catch(Li){var Fi=CSSStyleDeclaration.prototype,Hi=Fi.setProperty;Fi.setProperty=function(t,n,e){Hi.call(this,t,n+"",e)}}d3={version:"3.0.0"};var Ri=Math.PI,Pi=1e-6,ji=Ri/180,Oi=180/Ri,Yi=u;try{Yi(document.documentElement.childNodes)[0].nodeType}catch(Ui){Yi=r}var Ii=[].__proto__?function(t,n){t.__proto__=n}:function(t,n){for(var e in n)t[e]=n[e]};d3.map=function(t){var n=new i;for(var e in t)n.set(e,t[e]);return n},e(i,{has:function(t){return Vi+t in this},get:function(t){return this[Vi+t]},set:function(t,n){return this[Vi+t]=n},remove:function(t){return t=Vi+t,t in this&&delete this[t]},keys:function(){var t=[];return this.forEach(function(n){t.push(n)}),t},values:function(){var t=[];return this.forEach(function(n,e){t.push(e)}),t},entries:function(){var t=[];return this.forEach(function(n,e){t.push({key:n,value:e})}),t},forEach:function(t){for(var n in this)n.charCodeAt(0)===Xi&&t.call(this,n.substring(1),this[n])}});var Vi="\0",Xi=Vi.charCodeAt(0);d3.functor=c,d3.rebind=function(t,n){for(var e,r=1,u=arguments.length;u>++r;)t[e=arguments[r]]=l(t,n,n[e]);return t},d3.ascending=function(t,n){return n>t?-1:t>n?1:t>=n?0:0/0},d3.descending=function(t,n){return t>n?-1:n>t?1:n>=t?0:0/0},d3.mean=function(t,n){var e,r=t.length,u=0,i=-1,a=0;if(1===arguments.length)for(;r>++i;)s(e=t[i])&&(u+=(e-u)/++a);else for(;r>++i;)s(e=n.call(t,t[i],i))&&(u+=(e-u)/++a);return a?u:void 0},d3.median=function(t,n){return arguments.length>1&&(t=t.map(n)),t=t.filter(s),t.length?d3.quantile(t.sort(d3.ascending),.5):void 0},d3.min=function(t,n){var e,r,u=-1,i=t.length;if(1===arguments.length){for(;i>++u&&(null==(e=t[u])||e!=e);)e=void 0;for(;i>++u;)null!=(r=t[u])&&e>r&&(e=r)}else{for(;i>++u&&(null==(e=n.call(t,t[u],u))||e!=e);)e=void 0;for(;i>++u;)null!=(r=n.call(t,t[u],u))&&e>r&&(e=r)}return e},d3.max=function(t,n){var e,r,u=-1,i=t.length;if(1===arguments.length){for(;i>++u&&(null==(e=t[u])||e!=e);)e=void 0;for(;i>++u;)null!=(r=t[u])&&r>e&&(e=r)}else{for(;i>++u&&(null==(e=n.call(t,t[u],u))||e!=e);)e=void 0;for(;i>++u;)null!=(r=n.call(t,t[u],u))&&r>e&&(e=r)}return e},d3.extent=function(t,n){var e,r,u,i=-1,a=t.length;if(1===arguments.length){for(;a>++i&&(null==(e=u=t[i])||e!=e);)e=u=void 0;for(;a>++i;)null!=(r=t[i])&&(e>r&&(e=r),r>u&&(u=r))}else{for(;a>++i&&(null==(e=u=n.call(t,t[i],i))||e!=e);)e=void 0;for(;a>++i;)null!=(r=n.call(t,t[i],i))&&(e>r&&(e=r),r>u&&(u=r))}return[e,u]},d3.random={normal:function(t,n){var e=arguments.length;return 2>e&&(n=1),1>e&&(t=0),function(){var e,r,u;do e=2*Math.random()-1,r=2*Math.random()-1,u=e*e+r*r;while(!u||u>1);return t+n*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(t,n){var e=arguments.length;2>e&&(n=1),1>e&&(t=0);var r=d3.random.normal();return function(){return Math.exp(t+n*r())}},irwinHall:function(t){return function(){for(var n=0,e=0;t>e;e++)n+=Math.random();return n/t}}},d3.sum=function(t,n){var e,r=0,u=t.length,i=-1;if(1===arguments.length)for(;u>++i;)isNaN(e=+t[i])||(r+=e);else for(;u>++i;)isNaN(e=+n.call(t,t[i],i))||(r+=e);return r},d3.quantile=function(t,n){var e=(t.length-1)*n+1,r=Math.floor(e),u=+t[r-1],i=e-r;return i?u+i*(t[r]-u):u},d3.shuffle=function(t){for(var n,e,r=t.length;r;)e=0|Math.random()*r--,n=t[r],t[r]=t[e],t[e]=n;return t},d3.transpose=function(t){return d3.zip.apply(d3,t)},d3.zip=function(){if(!(r=arguments.length))return[];for(var t=-1,n=d3.min(arguments,f),e=Array(n);n>++t;)for(var r,u=-1,i=e[t]=Array(r);r>++u;)i[u]=arguments[u][t];return e},d3.bisector=function(t){return{left:function(n,e,r,u){for(3>arguments.length&&(r=0),4>arguments.length&&(u=n.length);u>r;){var i=r+u>>>1;e>t.call(n,n[i],i)?r=i+1:u=i}return r},right:function(n,e,r,u){for(3>arguments.length&&(r=0),4>arguments.length&&(u=n.length);u>r;){var i=r+u>>>1;t.call(n,n[i],i)>e?u=i:r=i+1}return r}}};var Zi=d3.bisector(function(t){return t});d3.bisectLeft=Zi.left,d3.bisect=d3.bisectRight=Zi.right,d3.nest=function(){function t(n,o){if(o>=a.length)return r?r.call(u,n):e?n.sort(e):n;for(var c,l,s,f=-1,h=n.length,d=a[o++],g=new i,p={};h>++f;)(s=g.get(c=d(l=n[f])))?s.push(l):g.set(c,[l]);return g.forEach(function(n,e){p[n]=t(e,o)}),p}function n(t,e){if(e>=a.length)return t;var r,u=[],i=o[e++];for(r in t)u.push({key:r,values:n(t[r],e)});return i&&u.sort(function(t,n){return i(t.key,n.key)}),u}var e,r,u={},a=[],o=[];return u.map=function(n){return t(n,0)},u.entries=function(e){return n(t(e,0),0)},u.key=function(t){return a.push(t),u},u.sortKeys=function(t){return o[a.length-1]=t,u},u.sortValues=function(t){return e=t,u},u.rollup=function(t){return r=t,u},u},d3.keys=function(t){var n=[];for(var e in t)n.push(e);return n},d3.values=function(t){var n=[];for(var e in t)n.push(t[e]);return n},d3.entries=function(t){var n=[];for(var e in t)n.push({key:e,value:t[e]});return n},d3.permute=function(t,n){for(var e=[],r=-1,u=n.length;u>++r;)e[r]=t[n[r]];return e},d3.merge=function(t){return Array.prototype.concat.apply([],t)},d3.range=function(t,n,e){if(3>arguments.length&&(e=1,2>arguments.length&&(n=t,t=0)),1/0===(n-t)/e)throw Error("infinite range");var r,u=[],i=d(Math.abs(e)),a=-1;if(t*=i,n*=i,e*=i,0>e)for(;(r=t+e*++a)>n;)u.push(r/i);else for(;n>(r=t+e*++a);)u.push(r/i);return u},d3.requote=function(t){return t.replace(Bi,"\\$&")};var Bi=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;d3.round=function(t,n){return n?Math.round(t*(n=Math.pow(10,n)))/n:Math.round(t)},d3.xhr=function(t,n,e){function r(){var t=l.status;!t&&l.responseText||t>=200&&300>t||304===t?i.load.call(u,c.call(u,l)):i.error.call(u,l)}var u={},i=d3.dispatch("progress","load","error"),o={},c=a,l=new(window.XDomainRequest&&/^(http(s)?:)?\/\//.test(t)?XDomainRequest:XMLHttpRequest);return"onload"in l?l.onload=l.onerror=r:l.onreadystatechange=function(){l.readyState>3&&r()},l.onprogress=function(t){var n=d3.event;d3.event=t;try{i.progress.call(u,l)}finally{d3.event=n}},u.header=function(t,n){return t=(t+"").toLowerCase(),2>arguments.length?o[t]:(null==n?delete o[t]:o[t]=n+"",u)},u.mimeType=function(t){return arguments.length?(n=null==t?null:t+"",u):n},u.response=function(t){return c=t,u},["get","post"].forEach(function(t){u[t]=function(){return u.send.apply(u,[t].concat(Yi(arguments)))}}),u.send=function(e,r,i){if(2===arguments.length&&"function"==typeof r&&(i=r,r=null),l.open(e,t,!0),null==n||"accept"in o||(o.accept=n+",*/*"),l.setRequestHeader)for(var a in o)l.setRequestHeader(a,o[a]);return null!=n&&l.overrideMimeType&&l.overrideMimeType(n),null!=i&&u.on("error",i).on("load",function(t){i(null,t)}),l.send(null==r?null:r),u},u.abort=function(){return l.abort(),u},d3.rebind(u,i,"on"),2===arguments.length&&"function"==typeof n&&(e=n,n=null),null==e?u:u.get(g(e))},d3.text=function(){return d3.xhr.apply(d3,arguments).response(p)},d3.json=function(t,n){return d3.xhr(t,"application/json",n).response(m)},d3.html=function(t,n){return d3.xhr(t,"text/html",n).response(v)},d3.xml=function(){return d3.xhr.apply(d3,arguments).response(y)};var $i={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};d3.ns={prefix:$i,qualify:function(t){var n=t.indexOf(":"),e=t;return n>=0&&(e=t.substring(0,n),t=t.substring(n+1)),$i.hasOwnProperty(e)?{space:$i[e],local:t}:t}},d3.dispatch=function(){for(var t=new M,n=-1,e=arguments.length;e>++n;)t[arguments[n]]=b(t);return t},M.prototype.on=function(t,n){var e=t.indexOf("."),r="";return e>0&&(r=t.substring(e+1),t=t.substring(0,e)),2>arguments.length?this[t].on(r):this[t].on(r,n)},d3.format=function(t){var n=Ji.exec(t),e=n[1]||" ",r=n[2]||">",u=n[3]||"",i=n[4]||"",a=n[5],o=+n[6],c=n[7],l=n[8],s=n[9],f=1,h="",d=!1;switch(l&&(l=+l.substring(1)),(a||"0"===e&&"="===r)&&(a=e="0",r="=",c&&(o-=Math.floor((o-1)/4))),s){case"n":c=!0,s="g";break;case"%":f=100,h="%",s="f";break;case"p":f=100,h="%",s="r";break;case"b":case"o":case"x":case"X":i&&(i="0"+s.toLowerCase());case"c":case"d":d=!0,l=0;break;case"s":f=-1,s="r"}"#"===i&&(i=""),"r"!=s||l||(s="g"),s=Gi.get(s)||_;var g=a&&c;return function(t){if(d&&t%1)return"";var n=0>t||0===t&&0>1/t?(t=-t,"-"):u;if(0>f){var p=d3.formatPrefix(t,l);t=p.scale(t),h=p.symbol}else t*=f;t=s(t,l),!a&&c&&(t=Ki(t));var m=i.length+t.length+(g?0:n.length),v=o>m?Array(m=o-m+1).join(e):"";return g&&(t=Ki(v+t)),Ci&&t.replace(".",Ci),n+=i,("<"===r?n+t+v:">"===r?v+n+t:"^"===r?v.substring(0,m>>=1)+n+t+v.substring(m):n+(g?t:v+t))+h}};var Ji=/(?:([^{])?([<>=^]))?([+\- ])?(#)?(0)?([0-9]+)?(,)?(\.[0-9]+)?([a-zA-Z%])?/,Gi=d3.map({b:function(t){return t.toString(2)},c:function(t){return String.fromCharCode(t)},o:function(t){return t.toString(8)},x:function(t){return t.toString(16)},X:function(t){return t.toString(16).toUpperCase()},g:function(t,n){return t.toPrecision(n)},e:function(t,n){return t.toExponential(n)},f:function(t,n){return t.toFixed(n)},r:function(t,n){return d3.round(t,n=x(t,n)).toFixed(Math.max(0,Math.min(20,n)))}}),Ki=a;if(Di){var Wi=Di.length;Ki=function(t){for(var n=t.lastIndexOf("."),e=n>=0?"."+t.substring(n+1):(n=t.length,""),r=[],u=0,i=Di[0];n>0&&i>0;)r.push(t.substring(n-=i,n+i)),i=Di[u=(u+1)%Wi];return r.reverse().join(zi||"")+e}}var Qi=["y","z","a","f","p","n","μ","m","","k","M","G","T","P","E","Z","Y"].map(w);d3.formatPrefix=function(t,n){var e=0;return t&&(0>t&&(t*=-1),n&&(t=d3.round(t,x(t,n))),e=1+Math.floor(1e-12+Math.log(t)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((0>=e?e+1:e-1)/3)))),Qi[8+e/3]};var ta=function(){return a},na=d3.map({linear:ta,poly:q,quad:function(){return A},cubic:function(){return N},sin:function(){return C},exp:function(){return z},circle:function(){return D},elastic:L,back:F,bounce:function(){return H}}),ea=d3.map({"in":a,out:k,"in-out":E,"out-in":function(t){return E(k(t))}});d3.ease=function(t){var n=t.indexOf("-"),e=n>=0?t.substring(0,n):t,r=n>=0?t.substring(n+1):"in";return e=na.get(e)||ta,r=ea.get(r)||a,S(r(e.apply(null,Array.prototype.slice.call(arguments,1))))},d3.event=null,d3.transform=function(t){var n=document.createElementNS(d3.ns.prefix.svg,"g");return(d3.transform=function(t){n.setAttribute("transform",t);var e=n.transform.baseVal.consolidate();return new O(e?e.matrix:ra)})(t)},O.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var ra={a:1,b:0,c:0,d:1,e:0,f:0};d3.interpolate=function(t,n){for(var e,r=d3.interpolators.length;--r>=0&&!(e=d3.interpolators[r](t,n)););return e},d3.interpolateNumber=function(t,n){return n-=t,function(e){return t+n*e}},d3.interpolateRound=function(t,n){return n-=t,function(e){return Math.round(t+n*e)}},d3.interpolateString=function(t,n){var e,r,u,i,a,o=0,c=0,l=[],s=[];for(ua.lastIndex=0,r=0;e=ua.exec(n);++r)e.index&&l.push(n.substring(o,c=e.index)),s.push({i:l.length,x:e[0]}),l.push(null),o=ua.lastIndex;for(n.length>o&&l.push(n.substring(o)),r=0,i=s.length;(e=ua.exec(t))&&i>r;++r)if(a=s[r],a.x==e[0]){if(a.i)if(null==l[a.i+1])for(l[a.i-1]+=a.x,l.splice(a.i,1),u=r+1;i>u;++u)s[u].i--;else for(l[a.i-1]+=a.x+l[a.i+1],l.splice(a.i,2),u=r+1;i>u;++u)s[u].i-=2;else if(null==l[a.i+1])l[a.i]=a.x;else for(l[a.i]=a.x+l[a.i+1],l.splice(a.i+1,1),u=r+1;i>u;++u)s[u].i--;s.splice(r,1),i--,r--}else a.x=d3.interpolateNumber(parseFloat(e[0]),parseFloat(a.x));for(;i>r;)a=s.pop(),null==l[a.i+1]?l[a.i]=a.x:(l[a.i]=a.x+l[a.i+1],l.splice(a.i+1,1)),i--;return 1===l.length?null==l[0]?s[0].x:function(){return n}:function(t){for(r=0;i>r;++r)l[(a=s[r]).i]=a.x(t);return l.join("")}},d3.interpolateTransform=function(t,n){var e,r=[],u=[],i=d3.transform(t),a=d3.transform(n),o=i.translate,c=a.translate,l=i.rotate,s=a.rotate,f=i.skew,h=a.skew,d=i.scale,g=a.scale;return o[0]!=c[0]||o[1]!=c[1]?(r.push("translate(",null,",",null,")"),u.push({i:1,x:d3.interpolateNumber(o[0],c[0])},{i:3,x:d3.interpolateNumber(o[1],c[1])})):c[0]||c[1]?r.push("translate("+c+")"):r.push(""),l!=s?(l-s>180?s+=360:s-l>180&&(l+=360),u.push({i:r.push(r.pop()+"rotate(",null,")")-2,x:d3.interpolateNumber(l,s)})):s&&r.push(r.pop()+"rotate("+s+")"),f!=h?u.push({i:r.push(r.pop()+"skewX(",null,")")-2,x:d3.interpolateNumber(f,h)}):h&&r.push(r.pop()+"skewX("+h+")"),d[0]!=g[0]||d[1]!=g[1]?(e=r.push(r.pop()+"scale(",null,",",null,")"),u.push({i:e-4,x:d3.interpolateNumber(d[0],g[0])},{i:e-2,x:d3.interpolateNumber(d[1],g[1])})):(1!=g[0]||1!=g[1])&&r.push(r.pop()+"scale("+g+")"),e=u.length,function(t){for(var n,i=-1;e>++i;)r[(n=u[i]).i]=n.x(t);return r.join("")}},d3.interpolateRgb=function(t,n){t=d3.rgb(t),n=d3.rgb(n);var e=t.r,r=t.g,u=t.b,i=n.r-e,a=n.g-r,o=n.b-u;return function(t){return"#"+G(Math.round(e+i*t))+G(Math.round(r+a*t))+G(Math.round(u+o*t))}},d3.interpolateHsl=function(t,n){t=d3.hsl(t),n=d3.hsl(n);var e=t.h,r=t.s,u=t.l,i=n.h-e,a=n.s-r,o=n.l-u;return i>180?i-=360:-180>i&&(i+=360),function(t){return un(e+i*t,r+a*t,u+o*t)+""}},d3.interpolateLab=function(t,n){t=d3.lab(t),n=d3.lab(n);var e=t.l,r=t.a,u=t.b,i=n.l-e,a=n.a-r,o=n.b-u;return function(t){return fn(e+i*t,r+a*t,u+o*t)+""}},d3.interpolateHcl=function(t,n){t=d3.hcl(t),n=d3.hcl(n);var e=t.h,r=t.c,u=t.l,i=n.h-e,a=n.c-r,o=n.l-u;return i>180?i-=360:-180>i&&(i+=360),function(t){return cn(e+i*t,r+a*t,u+o*t)+""}},d3.interpolateArray=function(t,n){var e,r=[],u=[],i=t.length,a=n.length,o=Math.min(t.length,n.length);for(e=0;o>e;++e)r.push(d3.interpolate(t[e],n[e]));for(;i>e;++e)u[e]=t[e];for(;a>e;++e)u[e]=n[e];return function(t){for(e=0;o>e;++e)u[e]=r[e](t);return u}},d3.interpolateObject=function(t,n){var e,r={},u={};for(e in t)e in n?r[e]=V(e)(t[e],n[e]):u[e]=t[e];for(e in n)e in t||(u[e]=n[e]);return function(t){for(e in r)u[e]=r[e](t);return u}};var ua=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;d3.interpolators=[d3.interpolateObject,function(t,n){return n instanceof Array&&d3.interpolateArray(t,n)},function(t,n){return("string"==typeof t||"string"==typeof n)&&d3.interpolateString(t+"",n+"")},function(t,n){return("string"==typeof n?aa.has(n)||/^(#|rgb\(|hsl\()/.test(n):n instanceof B)&&d3.interpolateRgb(t,n)},function(t,n){return!isNaN(t=+t)&&!isNaN(n=+n)&&d3.interpolateNumber(t,n)}],B.prototype.toString=function(){return this.rgb()+""},d3.rgb=function(t,n,e){return 1===arguments.length?t instanceof J?$(t.r,t.g,t.b):K(""+t,$,un):$(~~t,~~n,~~e)};var ia=J.prototype=new B;ia.brighter=function(t){t=Math.pow(.7,arguments.length?t:1);var n=this.r,e=this.g,r=this.b,u=30;return n||e||r?(n&&u>n&&(n=u),e&&u>e&&(e=u),r&&u>r&&(r=u),$(Math.min(255,Math.floor(n/t)),Math.min(255,Math.floor(e/t)),Math.min(255,Math.floor(r/t)))):$(u,u,u)},ia.darker=function(t){return t=Math.pow(.7,arguments.length?t:1),$(Math.floor(t*this.r),Math.floor(t*this.g),Math.floor(t*this.b)) +},ia.hsl=function(){return W(this.r,this.g,this.b)},ia.toString=function(){return"#"+G(this.r)+G(this.g)+G(this.b)};var aa=d3.map({aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"});aa.forEach(function(t,n){aa.set(t,K(n,$,un))}),d3.hsl=function(t,n,e){return 1===arguments.length?t instanceof rn?en(t.h,t.s,t.l):K(""+t,W,en):en(+t,+n,+e)};var oa=rn.prototype=new B;oa.brighter=function(t){return t=Math.pow(.7,arguments.length?t:1),en(this.h,this.s,this.l/t)},oa.darker=function(t){return t=Math.pow(.7,arguments.length?t:1),en(this.h,this.s,t*this.l)},oa.rgb=function(){return un(this.h,this.s,this.l)},d3.hcl=function(t,n,e){return 1===arguments.length?t instanceof on?an(t.h,t.c,t.l):t instanceof sn?hn(t.l,t.a,t.b):hn((t=Q((t=d3.rgb(t)).r,t.g,t.b)).l,t.a,t.b):an(+t,+n,+e)};var ca=on.prototype=new B;ca.brighter=function(t){return an(this.h,this.c,Math.min(100,this.l+la*(arguments.length?t:1)))},ca.darker=function(t){return an(this.h,this.c,Math.max(0,this.l-la*(arguments.length?t:1)))},ca.rgb=function(){return cn(this.h,this.c,this.l).rgb()},d3.lab=function(t,n,e){return 1===arguments.length?t instanceof sn?ln(t.l,t.a,t.b):t instanceof on?cn(t.l,t.c,t.h):Q((t=d3.rgb(t)).r,t.g,t.b):ln(+t,+n,+e)};var la=18,sa=.95047,fa=1,ha=1.08883,da=sn.prototype=new B;da.brighter=function(t){return ln(Math.min(100,this.l+la*(arguments.length?t:1)),this.a,this.b)},da.darker=function(t){return ln(Math.max(0,this.l-la*(arguments.length?t:1)),this.a,this.b)},da.rgb=function(){return fn(this.l,this.a,this.b)};var ga=function(t,n){return n.querySelector(t)},pa=function(t,n){return n.querySelectorAll(t)},ma=document.documentElement,va=ma.matchesSelector||ma.webkitMatchesSelector||ma.mozMatchesSelector||ma.msMatchesSelector||ma.oMatchesSelector,ya=function(t,n){return va.call(t,n)};"function"==typeof Sizzle&&(ga=function(t,n){return Sizzle(t,n)[0]||null},pa=function(t,n){return Sizzle.uniqueSort(Sizzle(t,n))},ya=Sizzle.matchesSelector);var Ma=[];d3.selection=function(){return ba},d3.selection.prototype=Ma,Ma.select=function(t){var n,e,r,u,i=[];"function"!=typeof t&&(t=vn(t));for(var a=-1,o=this.length;o>++a;){i.push(n=[]),n.parentNode=(r=this[a]).parentNode;for(var c=-1,l=r.length;l>++c;)(u=r[c])?(n.push(e=t.call(u,u.__data__,c)),e&&"__data__"in u&&(e.__data__=u.__data__)):n.push(null)}return mn(i)},Ma.selectAll=function(t){var n,e,r=[];"function"!=typeof t&&(t=yn(t));for(var u=-1,i=this.length;i>++u;)for(var a=this[u],o=-1,c=a.length;c>++o;)(e=a[o])&&(r.push(n=Yi(t.call(e,e.__data__,o))),n.parentNode=e);return mn(r)},Ma.attr=function(t,n){if(2>arguments.length){if("string"==typeof t){var e=this.node();return t=d3.ns.qualify(t),t.local?e.getAttributeNS(t.space,t.local):e.getAttribute(t)}for(n in t)this.each(Mn(n,t[n]));return this}return this.each(Mn(t,n))},Ma.classed=function(t,n){if(2>arguments.length){if("string"==typeof t){var e=this.node(),r=(t=t.trim().split(/^|\s+/g)).length,u=-1;if(n=e.classList){for(;r>++u;)if(!n.contains(t[u]))return!1}else for(n=e.className,null!=n.baseVal&&(n=n.baseVal);r>++u;)if(!bn(t[u]).test(n))return!1;return!0}for(n in t)this.each(xn(n,t[n]));return this}return this.each(xn(t,n))},Ma.style=function(t,n,e){var r=arguments.length;if(3>r){if("string"!=typeof t){2>r&&(n="");for(e in t)this.each(wn(e,t[e],n));return this}if(2>r)return getComputedStyle(this.node(),null).getPropertyValue(t);e=""}return this.each(wn(t,n,e))},Ma.property=function(t,n){if(2>arguments.length){if("string"==typeof t)return this.node()[t];for(n in t)this.each(Sn(n,t[n]));return this}return this.each(Sn(t,n))},Ma.text=function(t){return arguments.length?this.each("function"==typeof t?function(){var n=t.apply(this,arguments);this.textContent=null==n?"":n}:null==t?function(){this.textContent=""}:function(){this.textContent=t}):this.node().textContent},Ma.html=function(t){return arguments.length?this.each("function"==typeof t?function(){var n=t.apply(this,arguments);this.innerHTML=null==n?"":n}:null==t?function(){this.innerHTML=""}:function(){this.innerHTML=t}):this.node().innerHTML},Ma.append=function(t){function n(){return this.appendChild(document.createElementNS(this.namespaceURI,t))}function e(){return this.appendChild(document.createElementNS(t.space,t.local))}return t=d3.ns.qualify(t),this.select(t.local?e:n)},Ma.insert=function(t,n){function e(){return this.insertBefore(document.createElementNS(this.namespaceURI,t),ga(n,this))}function r(){return this.insertBefore(document.createElementNS(t.space,t.local),ga(n,this))}return t=d3.ns.qualify(t),this.select(t.local?r:e)},Ma.remove=function(){return this.each(function(){var t=this.parentNode;t&&t.removeChild(this)})},Ma.data=function(t,n){function e(t,e){var r,u,a,o=t.length,f=e.length,h=Math.min(o,f),d=Math.max(o,f),g=[],p=[],m=[];if(n){var v,y=new i,M=[],b=e.length;for(r=-1;o>++r;)v=n.call(u=t[r],u.__data__,r),y.has(v)?m[b++]=u:y.set(v,u),M.push(v);for(r=-1;f>++r;)v=n.call(e,a=e[r],r),y.has(v)?(g[r]=u=y.get(v),u.__data__=a,p[r]=m[r]=null):(p[r]=kn(a),g[r]=m[r]=null),y.remove(v);for(r=-1;o>++r;)y.has(M[r])&&(m[r]=t[r])}else{for(r=-1;h>++r;)u=t[r],a=e[r],u?(u.__data__=a,g[r]=u,p[r]=m[r]=null):(p[r]=kn(a),g[r]=m[r]=null);for(;f>r;++r)p[r]=kn(e[r]),g[r]=m[r]=null;for(;d>r;++r)m[r]=t[r],p[r]=g[r]=null}p.update=g,p.parentNode=g.parentNode=m.parentNode=t.parentNode,c.push(p),l.push(g),s.push(m)}var r,u,a=-1,o=this.length;if(!arguments.length){for(t=Array(o=(r=this[0]).length);o>++a;)(u=r[a])&&(t[a]=u.__data__);return t}var c=qn([]),l=mn([]),s=mn([]);if("function"==typeof t)for(;o>++a;)e(r=this[a],t.call(r,r.parentNode.__data__,a));else for(;o>++a;)e(r=this[a],t);return l.enter=function(){return c},l.exit=function(){return s},l},Ma.datum=function(t){return arguments.length?this.property("__data__",t):this.property("__data__")},Ma.filter=function(t){var n,e,r,u=[];"function"!=typeof t&&(t=En(t));for(var i=0,a=this.length;a>i;i++){u.push(n=[]),n.parentNode=(e=this[i]).parentNode;for(var o=0,c=e.length;c>o;o++)(r=e[o])&&t.call(r,r.__data__,o)&&n.push(r)}return mn(u)},Ma.order=function(){for(var t=-1,n=this.length;n>++t;)for(var e,r=this[t],u=r.length-1,i=r[u];--u>=0;)(e=r[u])&&(i&&i!==e.nextSibling&&i.parentNode.insertBefore(e,i),i=e);return this},Ma.sort=function(t){t=An.apply(this,arguments);for(var n=-1,e=this.length;e>++n;)this[n].sort(t);return this.order()},Ma.on=function(t,n,e){var r=arguments.length;if(3>r){if("string"!=typeof t){2>r&&(n=!1);for(e in t)this.each(Nn(e,t[e],n));return this}if(2>r)return(r=this.node()["__on"+t])&&r._;e=!1}return this.each(Nn(t,n,e))},Ma.each=function(t){return Tn(this,function(n,e,r){t.call(n,n.__data__,e,r)})},Ma.call=function(t){var n=Yi(arguments);return t.apply(n[0]=this,n),this},Ma.empty=function(){return!this.node()},Ma.node=function(){for(var t=0,n=this.length;n>t;t++)for(var e=this[t],r=0,u=e.length;u>r;r++){var i=e[r];if(i)return i}return null},Ma.transition=function(){var t,n,e=_a||++Sa,r=[],u=Object.create(ka);u.time=Date.now();for(var i=-1,a=this.length;a>++i;){r.push(t=[]);for(var o=this[i],c=-1,l=o.length;l>++c;)(n=o[c])&&zn(n,c,e,u),t.push(n)}return Cn(r,e)};var ba=mn([[document]]);ba[0].parentNode=ma,d3.select=function(t){return"string"==typeof t?ba.select(t):mn([[t]])},d3.selectAll=function(t){return"string"==typeof t?ba.selectAll(t):mn([Yi(t)])};var xa=[];d3.selection.enter=qn,d3.selection.enter.prototype=xa,xa.append=Ma.append,xa.insert=Ma.insert,xa.empty=Ma.empty,xa.node=Ma.node,xa.select=function(t){for(var n,e,r,u,i,a=[],o=-1,c=this.length;c>++o;){r=(u=this[o]).update,a.push(n=[]),n.parentNode=u.parentNode;for(var l=-1,s=u.length;s>++l;)(i=u[l])?(n.push(r[l]=e=t.call(u.parentNode,i.__data__,l)),e.__data__=i.__data__):n.push(null)}return mn(a)};var _a,wa=[],Sa=0,ka={ease:T,delay:0,duration:250};wa.call=Ma.call,wa.empty=Ma.empty,wa.node=Ma.node,d3.transition=function(t){return arguments.length?_a?t.transition():t:ba.transition()},d3.transition.prototype=wa,wa.select=function(t){var n,e,r,u=this.id,i=[];"function"!=typeof t&&(t=vn(t));for(var a=-1,o=this.length;o>++a;){i.push(n=[]);for(var c=this[a],l=-1,s=c.length;s>++l;)(r=c[l])&&(e=t.call(r,r.__data__,l))?("__data__"in r&&(e.__data__=r.__data__),zn(e,l,u,r.__transition__[u]),n.push(e)):n.push(null)}return Cn(i,u)},wa.selectAll=function(t){var n,e,r,u,i,a=this.id,o=[];"function"!=typeof t&&(t=yn(t));for(var c=-1,l=this.length;l>++c;)for(var s=this[c],f=-1,h=s.length;h>++f;)if(r=s[f]){i=r.__transition__[a],e=t.call(r,r.__data__,f),o.push(n=[]);for(var d=-1,g=e.length;g>++d;)zn(u=e[d],d,a,i),n.push(u)}return Cn(o,a)},wa.filter=function(t){var n,e,r,u=[];"function"!=typeof t&&(t=En(t));for(var i=0,a=this.length;a>i;i++){u.push(n=[]);for(var e=this[i],o=0,c=e.length;c>o;o++)(r=e[o])&&t.call(r,r.__data__,o)&&n.push(r)}return Cn(u,this.id,this.time).ease(this.ease())},wa.attr=function(t,n){function e(){this.removeAttribute(i)}function r(){this.removeAttributeNS(i.space,i.local)}if(2>arguments.length){for(n in t)this.attr(n,t[n]);return this}var u=V(t),i=d3.ns.qualify(t);return Ln(this,"attr."+t,n,function(t){function n(){var n,e=this.getAttribute(i);return e!==t&&(n=u(e,t),function(t){this.setAttribute(i,n(t))})}function a(){var n,e=this.getAttributeNS(i.space,i.local);return e!==t&&(n=u(e,t),function(t){this.setAttributeNS(i.space,i.local,n(t))})}return null==t?i.local?r:e:(t+="",i.local?a:n)})},wa.attrTween=function(t,n){function e(t,e){var r=n.call(this,t,e,this.getAttribute(u));return r&&function(t){this.setAttribute(u,r(t))}}function r(t,e){var r=n.call(this,t,e,this.getAttributeNS(u.space,u.local));return r&&function(t){this.setAttributeNS(u.space,u.local,r(t))}}var u=d3.ns.qualify(t);return this.tween("attr."+t,u.local?r:e)},wa.style=function(t,n,e){function r(){this.style.removeProperty(t)}var u=arguments.length;if(3>u){if("string"!=typeof t){2>u&&(n="");for(e in t)this.style(e,t[e],n);return this}e=""}var i=V(t);return Ln(this,"style."+t,n,function(n){function u(){var r,u=getComputedStyle(this,null).getPropertyValue(t);return u!==n&&(r=i(u,n),function(n){this.style.setProperty(t,r(n),e)})}return null==n?r:(n+="",u)})},wa.styleTween=function(t,n,e){return 3>arguments.length&&(e=""),this.tween("style."+t,function(r,u){var i=n.call(this,r,u,getComputedStyle(this,null).getPropertyValue(t));return i&&function(n){this.style.setProperty(t,i(n),e)}})},wa.text=function(t){return Ln(this,"text",t,Dn)},wa.remove=function(){return this.each("end.transition",function(){var t;!this.__transition__&&(t=this.parentNode)&&t.removeChild(this)})},wa.ease=function(t){var n=this.id;return 1>arguments.length?this.node().__transition__[n].ease:("function"!=typeof t&&(t=d3.ease.apply(d3,arguments)),Tn(this,function(e){e.__transition__[n].ease=t}))},wa.delay=function(t){var n=this.id;return Tn(this,"function"==typeof t?function(e,r,u){e.__transition__[n].delay=0|t.call(e,e.__data__,r,u)}:(t|=0,function(e){e.__transition__[n].delay=t}))},wa.duration=function(t){var n=this.id;return Tn(this,"function"==typeof t?function(e,r,u){e.__transition__[n].duration=Math.max(1,0|t.call(e,e.__data__,r,u))}:(t=Math.max(1,0|t),function(e){e.__transition__[n].duration=t}))},wa.each=function(t,n){var e=this.id;if(2>arguments.length){var r=ka,u=_a;_a=e,Tn(this,function(n,r,u){ka=n.__transition__[e],t.call(n,n.__data__,r,u)}),ka=r,_a=u}else Tn(this,function(r){r.__transition__[e].event.on(t,n)});return this},wa.transition=function(){for(var t,n,e,r,u=this.id,i=++Sa,a=[],o=0,c=this.length;c>o;o++){a.push(t=[]);for(var n=this[o],l=0,s=n.length;s>l;l++)(e=n[l])&&(r=Object.create(e.__transition__[u]),r.delay+=r.duration,zn(e,l,i,r)),t.push(e)}return Cn(a,i)},wa.tween=function(t,n){var e=this.id;return 2>arguments.length?this.node().__transition__[e].tween.get(t):Tn(this,null==n?function(n){n.__transition__[e].tween.remove(t)}:function(r){r.__transition__[e].tween.set(t,n)})};var Ea,Aa,Na=0,Ta={},qa=null;d3.timer=function(t,n,e){if(3>arguments.length){if(2>arguments.length)n=0;else if(!isFinite(n))return;e=Date.now()}var r=Ta[t.id];r&&r.callback===t?(r.then=e,r.delay=n):Ta[t.id=++Na]=qa={callback:t,then:e,delay:n,next:qa},Ea||(Aa=clearTimeout(Aa),Ea=1,Ca(Fn))},d3.timer.flush=function(){for(var t,n=Date.now(),e=qa;e;)t=n-e.then,e.delay||(e.flush=e.callback(t)),e=e.next;Hn()};var Ca=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){setTimeout(t,17)};d3.mouse=function(t){return Rn(t,P())};var za=/WebKit/.test(navigator.userAgent)?-1:0;d3.touches=function(t,n){return 2>arguments.length&&(n=P().touches),n?Yi(n).map(function(n){var e=Rn(t,n);return e.identifier=n.identifier,e}):[]},d3.scale={},d3.scale.linear=function(){return In([0,1],[0,1],d3.interpolate,!1)},d3.scale.log=function(){return Kn(d3.scale.linear(),Wn)};var Da=d3.format(".0e");Wn.pow=function(t){return Math.pow(10,t)},Qn.pow=function(t){return-Math.pow(10,-t)},d3.scale.pow=function(){return te(d3.scale.linear(),1)},d3.scale.sqrt=function(){return d3.scale.pow().exponent(.5)},d3.scale.ordinal=function(){return ee([],{t:"range",a:[[]]})},d3.scale.category10=function(){return d3.scale.ordinal().range(La)},d3.scale.category20=function(){return d3.scale.ordinal().range(Fa)},d3.scale.category20b=function(){return d3.scale.ordinal().range(Ha)},d3.scale.category20c=function(){return d3.scale.ordinal().range(Ra)};var La=["#1f77b4","#ff7f0e","#2ca02c","#d62728","#9467bd","#8c564b","#e377c2","#7f7f7f","#bcbd22","#17becf"],Fa=["#1f77b4","#aec7e8","#ff7f0e","#ffbb78","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5","#8c564b","#c49c94","#e377c2","#f7b6d2","#7f7f7f","#c7c7c7","#bcbd22","#dbdb8d","#17becf","#9edae5"],Ha=["#393b79","#5254a3","#6b6ecf","#9c9ede","#637939","#8ca252","#b5cf6b","#cedb9c","#8c6d31","#bd9e39","#e7ba52","#e7cb94","#843c39","#ad494a","#d6616b","#e7969c","#7b4173","#a55194","#ce6dbd","#de9ed6"],Ra=["#3182bd","#6baed6","#9ecae1","#c6dbef","#e6550d","#fd8d3c","#fdae6b","#fdd0a2","#31a354","#74c476","#a1d99b","#c7e9c0","#756bb1","#9e9ac8","#bcbddc","#dadaeb","#636363","#969696","#bdbdbd","#d9d9d9"];d3.scale.quantile=function(){return re([],[])},d3.scale.quantize=function(){return ue(0,1,[0,1])},d3.scale.threshold=function(){return ie([.5],[0,1])},d3.scale.identity=function(){return ae([0,1])},d3.svg={},d3.svg.arc=function(){function t(){var t=n.apply(this,arguments),i=e.apply(this,arguments),a=r.apply(this,arguments)+Pa,o=u.apply(this,arguments)+Pa,c=(a>o&&(c=a,a=o,o=c),o-a),l=Ri>c?"0":"1",s=Math.cos(a),f=Math.sin(a),h=Math.cos(o),d=Math.sin(o);return c>=ja?t?"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 0,"+i+"M0,"+t+"A"+t+","+t+" 0 1,0 0,"+-t+"A"+t+","+t+" 0 1,0 0,"+t+"Z":"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 0,"+i+"Z":t?"M"+i*s+","+i*f+"A"+i+","+i+" 0 "+l+",1 "+i*h+","+i*d+"L"+t*h+","+t*d+"A"+t+","+t+" 0 "+l+",0 "+t*s+","+t*f+"Z":"M"+i*s+","+i*f+"A"+i+","+i+" 0 "+l+",1 "+i*h+","+i*d+"L0,0"+"Z"}var n=oe,e=ce,r=le,u=se;return t.innerRadius=function(e){return arguments.length?(n=c(e),t):n},t.outerRadius=function(n){return arguments.length?(e=c(n),t):e},t.startAngle=function(n){return arguments.length?(r=c(n),t):r},t.endAngle=function(n){return arguments.length?(u=c(n),t):u},t.centroid=function(){var t=(n.apply(this,arguments)+e.apply(this,arguments))/2,i=(r.apply(this,arguments)+u.apply(this,arguments))/2+Pa;return[Math.cos(i)*t,Math.sin(i)*t]},t};var Pa=-Ri/2,ja=2*Ri-1e-6;d3.svg.line=function(){return fe(a)};var Oa=d3.map({linear:ge,"linear-closed":pe,"step-before":me,"step-after":ve,basis:we,"basis-open":Se,"basis-closed":ke,bundle:Ee,cardinal:be,"cardinal-open":ye,"cardinal-closed":Me,monotone:ze});Oa.forEach(function(t,n){n.key=t,n.closed=/-closed$/.test(t)});var Ya=[0,2/3,1/3,0],Ua=[0,1/3,2/3,0],Ia=[0,1/6,2/3,1/6];d3.svg.line.radial=function(){var t=fe(De);return t.radius=t.x,delete t.x,t.angle=t.y,delete t.y,t},me.reverse=ve,ve.reverse=me,d3.svg.area=function(){return Le(a)},d3.svg.area.radial=function(){var t=Le(De);return t.radius=t.x,delete t.x,t.innerRadius=t.x0,delete t.x0,t.outerRadius=t.x1,delete t.x1,t.angle=t.y,delete t.y,t.startAngle=t.y0,delete t.y0,t.endAngle=t.y1,delete t.y1,t},d3.svg.chord=function(){function e(t,n){var e=r(this,o,t,n),c=r(this,l,t,n);return"M"+e.p0+i(e.r,e.p1,e.a1-e.a0)+(u(e,c)?a(e.r,e.p1,e.r,e.p0):a(e.r,e.p1,c.r,c.p0)+i(c.r,c.p1,c.a1-c.a0)+a(c.r,c.p1,e.r,e.p0))+"Z"}function r(t,n,e,r){var u=n.call(t,e,r),i=s.call(t,u,r),a=f.call(t,u,r)+Pa,o=h.call(t,u,r)+Pa;return{r:i,a0:a,a1:o,p0:[i*Math.cos(a),i*Math.sin(a)],p1:[i*Math.cos(o),i*Math.sin(o)]}}function u(t,n){return t.a0==n.a0&&t.a1==n.a1}function i(t,n,e){return"A"+t+","+t+" 0 "+ +(e>Ri)+",1 "+n}function a(t,n,e,r){return"Q 0,0 "+r}var o=n,l=t,s=Fe,f=le,h=se;return e.radius=function(t){return arguments.length?(s=c(t),e):s},e.source=function(t){return arguments.length?(o=c(t),e):o},e.target=function(t){return arguments.length?(l=c(t),e):l},e.startAngle=function(t){return arguments.length?(f=c(t),e):f},e.endAngle=function(t){return arguments.length?(h=c(t),e):h},e},d3.svg.diagonal=function(){function e(t,n){var e=r.call(this,t,n),a=u.call(this,t,n),o=(e.y+a.y)/2,c=[e,{x:e.x,y:o},{x:a.x,y:o},a];return c=c.map(i),"M"+c[0]+"C"+c[1]+" "+c[2]+" "+c[3]}var r=n,u=t,i=He;return e.source=function(t){return arguments.length?(r=c(t),e):r},e.target=function(t){return arguments.length?(u=c(t),e):u},e.projection=function(t){return arguments.length?(i=t,e):i},e},d3.svg.diagonal.radial=function(){var t=d3.svg.diagonal(),n=He,e=t.projection;return t.projection=function(t){return arguments.length?e(Re(n=t)):n},t},d3.svg.symbol=function(){function t(t,r){return(Va.get(n.call(this,t,r))||Oe)(e.call(this,t,r))}var n=je,e=Pe;return t.type=function(e){return arguments.length?(n=c(e),t):n},t.size=function(n){return arguments.length?(e=c(n),t):e},t};var Va=d3.map({circle:Oe,cross:function(t){var n=Math.sqrt(t/5)/2;return"M"+-3*n+","+-n+"H"+-n+"V"+-3*n+"H"+n+"V"+-n+"H"+3*n+"V"+n+"H"+n+"V"+3*n+"H"+-n+"V"+n+"H"+-3*n+"Z"},diamond:function(t){var n=Math.sqrt(t/(2*Za)),e=n*Za;return"M0,"+-n+"L"+e+",0"+" 0,"+n+" "+-e+",0"+"Z"},square:function(t){var n=Math.sqrt(t)/2;return"M"+-n+","+-n+"L"+n+","+-n+" "+n+","+n+" "+-n+","+n+"Z"},"triangle-down":function(t){var n=Math.sqrt(t/Xa),e=n*Xa/2;return"M0,"+e+"L"+n+","+-e+" "+-n+","+-e+"Z"},"triangle-up":function(t){var n=Math.sqrt(t/Xa),e=n*Xa/2;return"M0,"+-e+"L"+n+","+e+" "+-n+","+e+"Z"}});d3.svg.symbolTypes=Va.keys();var Xa=Math.sqrt(3),Za=Math.tan(30*ji);d3.svg.axis=function(){function t(t){t.each(function(){var t,f=d3.select(this),h=null==l?e.ticks?e.ticks.apply(e,c):e.domain():l,d=null==n?e.tickFormat?e.tickFormat.apply(e,c):String:n,g=Ie(e,h,s),p=f.selectAll(".minor").data(g,String),m=p.enter().insert("line","g").attr("class","tick minor").style("opacity",1e-6),v=d3.transition(p.exit()).style("opacity",1e-6).remove(),y=d3.transition(p).style("opacity",1),M=f.selectAll("g").data(h,String),b=M.enter().insert("g","path").style("opacity",1e-6),x=d3.transition(M.exit()).style("opacity",1e-6).remove(),_=d3.transition(M).style("opacity",1),w=On(e),S=f.selectAll(".domain").data([0]),k=d3.transition(S),E=e.copy(),A=this.__chart__||E;this.__chart__=E,S.enter().append("path").attr("class","domain"),b.append("line").attr("class","tick"),b.append("text");var N=b.select("line"),T=_.select("line"),q=M.select("text").text(d),C=b.select("text"),z=_.select("text");switch(r){case"bottom":t=Ye,m.attr("y2",i),y.attr("x2",0).attr("y2",i),N.attr("y2",u),C.attr("y",Math.max(u,0)+o),T.attr("x2",0).attr("y2",u),z.attr("x",0).attr("y",Math.max(u,0)+o),q.attr("dy",".71em").style("text-anchor","middle"),k.attr("d","M"+w[0]+","+a+"V0H"+w[1]+"V"+a);break;case"top":t=Ye,m.attr("y2",-i),y.attr("x2",0).attr("y2",-i),N.attr("y2",-u),C.attr("y",-(Math.max(u,0)+o)),T.attr("x2",0).attr("y2",-u),z.attr("x",0).attr("y",-(Math.max(u,0)+o)),q.attr("dy","0em").style("text-anchor","middle"),k.attr("d","M"+w[0]+","+-a+"V0H"+w[1]+"V"+-a);break;case"left":t=Ue,m.attr("x2",-i),y.attr("x2",-i).attr("y2",0),N.attr("x2",-u),C.attr("x",-(Math.max(u,0)+o)),T.attr("x2",-u).attr("y2",0),z.attr("x",-(Math.max(u,0)+o)).attr("y",0),q.attr("dy",".32em").style("text-anchor","end"),k.attr("d","M"+-a+","+w[0]+"H0V"+w[1]+"H"+-a);break;case"right":t=Ue,m.attr("x2",i),y.attr("x2",i).attr("y2",0),N.attr("x2",u),C.attr("x",Math.max(u,0)+o),T.attr("x2",u).attr("y2",0),z.attr("x",Math.max(u,0)+o).attr("y",0),q.attr("dy",".32em").style("text-anchor","start"),k.attr("d","M"+a+","+w[0]+"H0V"+w[1]+"H"+a)}if(e.ticks)b.call(t,A),_.call(t,E),x.call(t,E),m.call(t,A),y.call(t,E),v.call(t,E);else{var D=E.rangeBand()/2,L=function(t){return E(t)+D};b.call(t,L),_.call(t,L)}})}var n,e=d3.scale.linear(),r="bottom",u=6,i=6,a=6,o=3,c=[10],l=null,s=0;return t.scale=function(n){return arguments.length?(e=n,t):e},t.orient=function(n){return arguments.length?(r=n,t):r},t.ticks=function(){return arguments.length?(c=arguments,t):c},t.tickValues=function(n){return arguments.length?(l=n,t):l},t.tickFormat=function(e){return arguments.length?(n=e,t):n},t.tickSize=function(n,e){if(!arguments.length)return u;var r=arguments.length-1;return u=+n,i=r>1?+e:u,a=r>0?+arguments[r]:u,t},t.tickPadding=function(n){return arguments.length?(o=+n,t):o},t.tickSubdivide=function(n){return arguments.length?(s=+n,t):s},t},d3.svg.brush=function(){function t(i){i.each(function(){var i,a=d3.select(this),s=a.selectAll(".background").data([0]),f=a.selectAll(".extent").data([0]),h=a.selectAll(".resize").data(l,String);a.style("pointer-events","all").on("mousedown.brush",u).on("touchstart.brush",u),s.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),f.enter().append("rect").attr("class","extent").style("cursor","move"),h.enter().append("g").attr("class",function(t){return"resize "+t}).style("cursor",function(t){return Ba[t]}).append("rect").attr("x",function(t){return/[ew]$/.test(t)?-3:null}).attr("y",function(t){return/^[ns]/.test(t)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),h.style("display",t.empty()?"none":null),h.exit().remove(),o&&(i=On(o),s.attr("x",i[0]).attr("width",i[1]-i[0]),e(a)),c&&(i=On(c),s.attr("y",i[0]).attr("height",i[1]-i[0]),r(a)),n(a)})}function n(t){t.selectAll(".resize").attr("transform",function(t){return"translate("+s[+/e$/.test(t)][0]+","+s[+/^s/.test(t)][1]+")"})}function e(t){t.select(".extent").attr("x",s[0][0]),t.selectAll(".extent,.n>rect,.s>rect").attr("width",s[1][0]-s[0][0])}function r(t){t.select(".extent").attr("y",s[0][1]),t.selectAll(".extent,.e>rect,.w>rect").attr("height",s[1][1]-s[0][1])}function u(){function u(){var t=d3.event.changedTouches;return t?d3.touches(v,t)[0]:d3.mouse(v)}function l(){32==d3.event.keyCode&&(S||(p=null,k[0]-=s[1][0],k[1]-=s[1][1],S=2),R())}function f(){32==d3.event.keyCode&&2==S&&(k[0]+=s[1][0],k[1]+=s[1][1],S=0,R())}function h(){var t=u(),i=!1;m&&(t[0]+=m[0],t[1]+=m[1]),S||(d3.event.altKey?(p||(p=[(s[0][0]+s[1][0])/2,(s[0][1]+s[1][1])/2]),k[0]=s[+(t[0]<p[0])][0],k[1]=s[+(t[1]<p[1])][1]):p=null),_&&d(t,o,0)&&(e(b),i=!0),w&&d(t,c,1)&&(r(b),i=!0),i&&(n(b),M({type:"brush",mode:S?"move":"resize"}))}function d(t,n,e){var r,u,a=On(n),o=a[0],c=a[1],l=k[e],f=s[1][e]-s[0][e];return S&&(o-=l,c-=f+l),r=Math.max(o,Math.min(c,t[e])),S?u=(r+=l)+f:(p&&(l=Math.max(o,Math.min(c,2*p[e]-r))),r>l?(u=r,r=l):u=l),s[0][e]!==r||s[1][e]!==u?(i=null,s[0][e]=r,s[1][e]=u,!0):void 0}function g(){h(),b.style("pointer-events","all").selectAll(".resize").style("display",t.empty()?"none":null),d3.select("body").style("cursor",null),E.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),M({type:"brushend"}),R()}var p,m,v=this,y=d3.select(d3.event.target),M=a.of(v,arguments),b=d3.select(v),x=y.datum(),_=!/^(n|s)$/.test(x)&&o,w=!/^(e|w)$/.test(x)&&c,S=y.classed("extent"),k=u(),E=d3.select(window).on("mousemove.brush",h).on("mouseup.brush",g).on("touchmove.brush",h).on("touchend.brush",g).on("keydown.brush",l).on("keyup.brush",f);if(S)k[0]=s[0][0]-k[0],k[1]=s[0][1]-k[1];else if(x){var A=+/w$/.test(x),N=+/^n/.test(x);m=[s[1-A][0]-k[0],s[1-N][1]-k[1]],k[0]=s[A][0],k[1]=s[N][1]}else d3.event.altKey&&(p=k.slice());b.style("pointer-events","none").selectAll(".resize").style("display",null),d3.select("body").style("cursor",y.style("cursor")),M({type:"brushstart"}),h(),R()}var i,a=j(t,"brushstart","brush","brushend"),o=null,c=null,l=$a[0],s=[[0,0],[0,0]];return t.x=function(n){return arguments.length?(o=n,l=$a[!o<<1|!c],t):o},t.y=function(n){return arguments.length?(c=n,l=$a[!o<<1|!c],t):c},t.extent=function(n){var e,r,u,a,l;return arguments.length?(i=[[0,0],[0,0]],o&&(e=n[0],r=n[1],c&&(e=e[0],r=r[0]),i[0][0]=e,i[1][0]=r,o.invert&&(e=o(e),r=o(r)),e>r&&(l=e,e=r,r=l),s[0][0]=0|e,s[1][0]=0|r),c&&(u=n[0],a=n[1],o&&(u=u[1],a=a[1]),i[0][1]=u,i[1][1]=a,c.invert&&(u=c(u),a=c(a)),u>a&&(l=u,u=a,a=l),s[0][1]=0|u,s[1][1]=0|a),t):(n=i||s,o&&(e=n[0][0],r=n[1][0],i||(e=s[0][0],r=s[1][0],o.invert&&(e=o.invert(e),r=o.invert(r)),e>r&&(l=e,e=r,r=l))),c&&(u=n[0][1],a=n[1][1],i||(u=s[0][1],a=s[1][1],c.invert&&(u=c.invert(u),a=c.invert(a)),u>a&&(l=u,u=a,a=l))),o&&c?[[e,u],[r,a]]:o?[e,r]:c&&[u,a])},t.clear=function(){return i=null,s[0][0]=s[0][1]=s[1][0]=s[1][1]=0,t},t.empty=function(){return o&&s[0][0]===s[1][0]||c&&s[0][1]===s[1][1]},d3.rebind(t,a,"on")};var Ba={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},$a=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]];d3.behavior={},d3.behavior.drag=function(){function t(){this.on("mousedown.drag",n).on("touchstart.drag",n)}function n(){function t(){var t=o.parentNode;return null!=s?d3.touches(t).filter(function(t){return t.identifier===s})[0]:d3.mouse(t)}function n(){if(!o.parentNode)return u();var n=t(),e=n[0]-f[0],r=n[1]-f[1];h|=e|r,f=n,R(),c({type:"drag",x:n[0]+a[0],y:n[1]+a[1],dx:e,dy:r})}function u(){c({type:"dragend"}),h&&(R(),d3.event.target===l&&d.on("click.drag",i,!0)),d.on(null!=s?"touchmove.drag-"+s:"mousemove.drag",null).on(null!=s?"touchend.drag-"+s:"mouseup.drag",null)}function i(){R(),d.on("click.drag",null)}var a,o=this,c=e.of(o,arguments),l=d3.event.target,s=d3.event.touches?d3.event.changedTouches[0].identifier:null,f=t(),h=0,d=d3.select(window).on(null!=s?"touchmove.drag-"+s:"mousemove.drag",n).on(null!=s?"touchend.drag-"+s:"mouseup.drag",u,!0);r?(a=r.apply(o,arguments),a=[a.x-f[0],a.y-f[1]]):a=[0,0],null==s&&R(),c({type:"dragstart"})}var e=j(t,"drag","dragstart","dragend"),r=null;return t.origin=function(n){return arguments.length?(r=n,t):r},d3.rebind(t,e,"on")},d3.behavior.zoom=function(){function t(){this.on("mousedown.zoom",o).on("mousewheel.zoom",c).on("mousemove.zoom",l).on("DOMMouseScroll.zoom",c).on("dblclick.zoom",s).on("touchstart.zoom",f).on("touchmove.zoom",h).on("touchend.zoom",f)}function n(t){return[(t[0]-b[0])/x,(t[1]-b[1])/x]}function e(t){return[t[0]*x+b[0],t[1]*x+b[1]]}function r(t){x=Math.max(_[0],Math.min(_[1],t))}function u(t,n){n=e(n),b[0]+=t[0]-n[0],b[1]+=t[1]-n[1]}function i(){m&&m.domain(p.range().map(function(t){return(t-b[0])/x}).map(p.invert)),y&&y.domain(v.range().map(function(t){return(t-b[1])/x}).map(v.invert))}function a(t){i(),d3.event.preventDefault(),t({type:"zoom",scale:x,translate:b})}function o(){function t(){l=1,u(d3.mouse(i),f),a(o)}function e(){l&&R(),s.on("mousemove.zoom",null).on("mouseup.zoom",null),l&&d3.event.target===c&&s.on("click.zoom",r,!0)}function r(){R(),s.on("click.zoom",null)}var i=this,o=w.of(i,arguments),c=d3.event.target,l=0,s=d3.select(window).on("mousemove.zoom",t).on("mouseup.zoom",e),f=n(d3.mouse(i));window.focus(),R()}function c(){d||(d=n(d3.mouse(this))),r(Math.pow(2,.002*Ve())*x),u(d3.mouse(this),d),a(w.of(this,arguments))}function l(){d=null}function s(){var t=d3.mouse(this),e=n(t),i=Math.log(x)/Math.LN2;r(Math.pow(2,d3.event.shiftKey?Math.ceil(i)-1:Math.floor(i)+1)),u(t,e),a(w.of(this,arguments))}function f(){var t=d3.touches(this),e=Date.now();if(g=x,d={},t.forEach(function(t){d[t.identifier]=n(t)}),R(),1===t.length){if(500>e-M){var i=t[0],o=n(t[0]);r(2*x),u(i,o),a(w.of(this,arguments))}M=e}}function h(){var t=d3.touches(this),n=t[0],e=d[n.identifier];if(i=t[1]){var i,o=d[i.identifier];n=[(n[0]+i[0])/2,(n[1]+i[1])/2],e=[(e[0]+o[0])/2,(e[1]+o[1])/2],r(d3.event.scale*g)}u(n,e),M=null,a(w.of(this,arguments))}var d,g,p,m,v,y,M,b=[0,0],x=1,_=Ga,w=j(t,"zoom");return t.translate=function(n){return arguments.length?(b=n.map(Number),i(),t):b},t.scale=function(n){return arguments.length?(x=+n,i(),t):x},t.scaleExtent=function(n){return arguments.length?(_=null==n?Ga:n.map(Number),t):_},t.x=function(n){return arguments.length?(m=n,p=n.copy(),b=[0,0],x=1,t):m},t.y=function(n){return arguments.length?(y=n,v=n.copy(),b=[0,0],x=1,t):y},d3.rebind(t,w,"on")};var Ja,Ga=[0,1/0];d3.layout={},d3.layout.bundle=function(){return function(t){for(var n=[],e=-1,r=t.length;r>++e;)n.push(Xe(t[e]));return n}},d3.layout.chord=function(){function t(){var t,l,f,h,d,g={},p=[],m=d3.range(i),v=[];for(e=[],r=[],t=0,h=-1;i>++h;){for(l=0,d=-1;i>++d;)l+=u[h][d];p.push(l),v.push(d3.range(i)),t+=l}for(a&&m.sort(function(t,n){return a(p[t],p[n]) +}),o&&v.forEach(function(t,n){t.sort(function(t,e){return o(u[n][t],u[n][e])})}),t=(2*Ri-s*i)/t,l=0,h=-1;i>++h;){for(f=l,d=-1;i>++d;){var y=m[h],M=v[y][d],b=u[y][M],x=l,_=l+=b*t;g[y+"-"+M]={index:y,subindex:M,startAngle:x,endAngle:_,value:b}}r[y]={index:y,startAngle:f,endAngle:l,value:(l-f)/t},l+=s}for(h=-1;i>++h;)for(d=h-1;i>++d;){var w=g[h+"-"+d],S=g[d+"-"+h];(w.value||S.value)&&e.push(w.value<S.value?{source:S,target:w}:{source:w,target:S})}c&&n()}function n(){e.sort(function(t,n){return c((t.source.value+t.target.value)/2,(n.source.value+n.target.value)/2)})}var e,r,u,i,a,o,c,l={},s=0;return l.matrix=function(t){return arguments.length?(i=(u=t)&&u.length,e=r=null,l):u},l.padding=function(t){return arguments.length?(s=t,e=r=null,l):s},l.sortGroups=function(t){return arguments.length?(a=t,e=r=null,l):a},l.sortSubgroups=function(t){return arguments.length?(o=t,e=null,l):o},l.sortChords=function(t){return arguments.length?(c=t,e&&n(),l):c},l.chords=function(){return e||t(),e},l.groups=function(){return r||t(),r},l},d3.layout.force=function(){function t(t){return function(n,e,r,u){if(n.point!==t){var i=n.cx-t.x,a=n.cy-t.y,o=1/Math.sqrt(i*i+a*a);if(v>(u-e)*o){var c=n.charge*o*o;return t.px-=i*c,t.py-=a*c,!0}if(n.point&&isFinite(o)){var c=n.pointCharge*o*o;t.px-=i*c,t.py-=a*c}}return!n.charge}}function n(t){t.px=d3.event.x,t.py=d3.event.y,l.resume()}var e,r,u,i,o,l={},s=d3.dispatch("start","tick","end"),f=[1,1],h=.9,d=Qe,g=tr,p=-30,m=.1,v=.8,y=[],M=[];return l.tick=function(){if(.005>(r*=.99))return s.end({type:"end",alpha:r=0}),!0;var n,e,a,c,l,d,g,v,b,x=y.length,_=M.length;for(e=0;_>e;++e)a=M[e],c=a.source,l=a.target,v=l.x-c.x,b=l.y-c.y,(d=v*v+b*b)&&(d=r*i[e]*((d=Math.sqrt(d))-u[e])/d,v*=d,b*=d,l.x-=v*(g=c.weight/(l.weight+c.weight)),l.y-=b*g,c.x+=v*(g=1-g),c.y+=b*g);if((g=r*m)&&(v=f[0]/2,b=f[1]/2,e=-1,g))for(;x>++e;)a=y[e],a.x+=(v-a.x)*g,a.y+=(b-a.y)*g;if(p)for(We(n=d3.geom.quadtree(y),r,o),e=-1;x>++e;)(a=y[e]).fixed||n.visit(t(a));for(e=-1;x>++e;)a=y[e],a.fixed?(a.x=a.px,a.y=a.py):(a.x-=(a.px-(a.px=a.x))*h,a.y-=(a.py-(a.py=a.y))*h);s.tick({type:"tick",alpha:r})},l.nodes=function(t){return arguments.length?(y=t,l):y},l.links=function(t){return arguments.length?(M=t,l):M},l.size=function(t){return arguments.length?(f=t,l):f},l.linkDistance=function(t){return arguments.length?(d=c(t),l):d},l.distance=l.linkDistance,l.linkStrength=function(t){return arguments.length?(g=c(t),l):g},l.friction=function(t){return arguments.length?(h=t,l):h},l.charge=function(t){return arguments.length?(p="function"==typeof t?t:+t,l):p},l.gravity=function(t){return arguments.length?(m=t,l):m},l.theta=function(t){return arguments.length?(v=t,l):v},l.alpha=function(t){return arguments.length?(r?r=t>0?t:0:t>0&&(s.start({type:"start",alpha:r=t}),d3.timer(l.tick)),l):r},l.start=function(){function t(t,r){for(var u,i=n(e),a=-1,o=i.length;o>++a;)if(!isNaN(u=i[a][t]))return u;return Math.random()*r}function n(){if(!a){for(a=[],r=0;s>r;++r)a[r]=[];for(r=0;h>r;++r){var t=M[r];a[t.source.index].push(t.target),a[t.target.index].push(t.source)}}return a[e]}var e,r,a,c,s=y.length,h=M.length,m=f[0],v=f[1];for(e=0;s>e;++e)(c=y[e]).index=e,c.weight=0;for(u=[],i=[],e=0;h>e;++e)c=M[e],"number"==typeof c.source&&(c.source=y[c.source]),"number"==typeof c.target&&(c.target=y[c.target]),u[e]=d.call(this,c,e),i[e]=g.call(this,c,e),++c.source.weight,++c.target.weight;for(e=0;s>e;++e)c=y[e],isNaN(c.x)&&(c.x=t("x",m)),isNaN(c.y)&&(c.y=t("y",v)),isNaN(c.px)&&(c.px=c.x),isNaN(c.py)&&(c.py=c.y);if(o=[],"function"==typeof p)for(e=0;s>e;++e)o[e]=+p.call(this,y[e],e);else for(e=0;s>e;++e)o[e]=p;return l.resume()},l.resume=function(){return l.alpha(.1)},l.stop=function(){return l.alpha(0)},l.drag=function(){e||(e=d3.behavior.drag().origin(a).on("dragstart",$e).on("drag",n).on("dragend",Je)),this.on("mouseover.force",Ge).on("mouseout.force",Ke).call(e)},d3.rebind(l,s,"on")},d3.layout.partition=function(){function t(n,e,r,u){var i=n.children;if(n.x=e,n.y=n.depth*u,n.dx=r,n.dy=u,i&&(a=i.length)){var a,o,c,l=-1;for(r=n.value?r/n.value:0;a>++l;)t(o=i[l],e,c=o.value*r,u),e+=c}}function n(t){var e=t.children,r=0;if(e&&(u=e.length))for(var u,i=-1;u>++i;)r=Math.max(r,n(e[i]));return 1+r}function e(e,i){var a=r.call(this,e,i);return t(a[0],0,u[0],u[1]/n(a[0])),a}var r=d3.layout.hierarchy(),u=[1,1];return e.size=function(t){return arguments.length?(u=t,e):u},hr(e,r)},d3.layout.pie=function(){function t(i){var a=i.map(function(e,r){return+n.call(t,e,r)}),o=+("function"==typeof r?r.apply(this,arguments):r),c=(("function"==typeof u?u.apply(this,arguments):u)-r)/d3.sum(a),l=d3.range(i.length);null!=e&&l.sort(e===Ka?function(t,n){return a[n]-a[t]}:function(t,n){return e(i[t],i[n])});var s=[];return l.forEach(function(t){var n;s[t]={data:i[t],value:n=a[t],startAngle:o,endAngle:o+=n*c}}),s}var n=Number,e=Ka,r=0,u=2*Ri;return t.value=function(e){return arguments.length?(n=e,t):n},t.sort=function(n){return arguments.length?(e=n,t):e},t.startAngle=function(n){return arguments.length?(r=n,t):r},t.endAngle=function(n){return arguments.length?(u=n,t):u},t};var Ka={};d3.layout.stack=function(){function t(a,c){var l=a.map(function(e,r){return n.call(t,e,r)}),s=l.map(function(n){return n.map(function(n,e){return[i.call(t,n,e),o.call(t,n,e)]})}),f=e.call(t,s,c);l=d3.permute(l,f),s=d3.permute(s,f);var h,d,g,p=r.call(t,s,c),m=l.length,v=l[0].length;for(d=0;v>d;++d)for(u.call(t,l[0][d],g=p[d],s[0][d][1]),h=1;m>h;++h)u.call(t,l[h][d],g+=s[h-1][d][1],s[h][d][1]);return a}var n=a,e=ur,r=ir,u=rr,i=nr,o=er;return t.values=function(e){return arguments.length?(n=e,t):n},t.order=function(n){return arguments.length?(e="function"==typeof n?n:Wa.get(n)||ur,t):e},t.offset=function(n){return arguments.length?(r="function"==typeof n?n:Qa.get(n)||ir,t):r},t.x=function(n){return arguments.length?(i=n,t):i},t.y=function(n){return arguments.length?(o=n,t):o},t.out=function(n){return arguments.length?(u=n,t):u},t};var Wa=d3.map({"inside-out":function(t){var n,e,r=t.length,u=t.map(ar),i=t.map(or),a=d3.range(r).sort(function(t,n){return u[t]-u[n]}),o=0,c=0,l=[],s=[];for(n=0;r>n;++n)e=a[n],c>o?(o+=i[e],l.push(e)):(c+=i[e],s.push(e));return s.reverse().concat(l)},reverse:function(t){return d3.range(t.length).reverse()},"default":ur}),Qa=d3.map({silhouette:function(t){var n,e,r,u=t.length,i=t[0].length,a=[],o=0,c=[];for(e=0;i>e;++e){for(n=0,r=0;u>n;n++)r+=t[n][e][1];r>o&&(o=r),a.push(r)}for(e=0;i>e;++e)c[e]=(o-a[e])/2;return c},wiggle:function(t){var n,e,r,u,i,a,o,c,l,s=t.length,f=t[0],h=f.length,d=[];for(d[0]=c=l=0,e=1;h>e;++e){for(n=0,u=0;s>n;++n)u+=t[n][e][1];for(n=0,i=0,o=f[e][0]-f[e-1][0];s>n;++n){for(r=0,a=(t[n][e][1]-t[n][e-1][1])/(2*o);n>r;++r)a+=(t[r][e][1]-t[r][e-1][1])/o;i+=a*t[n][e][1]}d[e]=c-=u?i/u*o:0,l>c&&(l=c)}for(e=0;h>e;++e)d[e]-=l;return d},expand:function(t){var n,e,r,u=t.length,i=t[0].length,a=1/u,o=[];for(e=0;i>e;++e){for(n=0,r=0;u>n;n++)r+=t[n][e][1];if(r)for(n=0;u>n;n++)t[n][e][1]/=r;else for(n=0;u>n;n++)t[n][e][1]=a}for(e=0;i>e;++e)o[e]=0;return o},zero:ir});d3.layout.histogram=function(){function t(t,i){for(var a,o,c=[],l=t.map(e,this),s=r.call(this,l,i),f=u.call(this,s,l,i),i=-1,h=l.length,d=f.length-1,g=n?1:1/h;d>++i;)a=c[i]=[],a.dx=f[i+1]-(a.x=f[i]),a.y=0;if(d>0)for(i=-1;h>++i;)o=l[i],o>=s[0]&&s[1]>=o&&(a=c[d3.bisect(f,o,1,d)-1],a.y+=g,a.push(t[i]));return c}var n=!0,e=Number,r=fr,u=lr;return t.value=function(n){return arguments.length?(e=n,t):e},t.range=function(n){return arguments.length?(r=c(n),t):r},t.bins=function(n){return arguments.length?(u="number"==typeof n?function(t){return sr(t,n)}:c(n),t):u},t.frequency=function(e){return arguments.length?(n=!!e,t):n},t},d3.layout.hierarchy=function(){function t(n,a,o){var c=u.call(e,n,a);if(n.depth=a,o.push(n),c&&(l=c.length)){for(var l,s,f=-1,h=n.children=[],d=0,g=a+1;l>++f;)s=t(c[f],g,o),s.parent=n,h.push(s),d+=s.value;r&&h.sort(r),i&&(n.value=d)}else i&&(n.value=+i.call(e,n,a)||0);return n}function n(t,r){var u=t.children,a=0;if(u&&(o=u.length))for(var o,c=-1,l=r+1;o>++c;)a+=n(u[c],l);else i&&(a=+i.call(e,t,r)||0);return i&&(t.value=a),a}function e(n){var e=[];return t(n,0,e),e}var r=pr,u=dr,i=gr;return e.sort=function(t){return arguments.length?(r=t,e):r},e.children=function(t){return arguments.length?(u=t,e):u},e.value=function(t){return arguments.length?(i=t,e):i},e.revalue=function(t){return n(t,0),t},e},d3.layout.pack=function(){function t(t,u){var i=n.call(this,t,u),a=i[0];a.x=0,a.y=0,Rr(a,function(t){t.r=Math.sqrt(t.value)}),Rr(a,xr);var o=r[0],c=r[1],l=Math.max(2*a.r/o,2*a.r/c);if(e>0){var s=e*l/2;Rr(a,function(t){t.r+=s}),Rr(a,xr),Rr(a,function(t){t.r-=s}),l=Math.max(2*a.r/o,2*a.r/c)}return Sr(a,o/2,c/2,1/l),i}var n=d3.layout.hierarchy().sort(vr),e=0,r=[1,1];return t.size=function(n){return arguments.length?(r=n,t):r},t.padding=function(n){return arguments.length?(e=+n,t):e},hr(t,n)},d3.layout.cluster=function(){function t(t,u){var i,a=n.call(this,t,u),o=a[0],c=0;Rr(o,function(t){var n=t.children;n&&n.length?(t.x=Ar(n),t.y=Er(n)):(t.x=i?c+=e(t,i):0,t.y=0,i=t)});var l=Nr(o),s=Tr(o),f=l.x-e(l,s)/2,h=s.x+e(s,l)/2;return Rr(o,function(t){t.x=(t.x-f)/(h-f)*r[0],t.y=(1-(o.y?t.y/o.y:1))*r[1]}),a}var n=d3.layout.hierarchy().sort(null).value(null),e=qr,r=[1,1];return t.separation=function(n){return arguments.length?(e=n,t):e},t.size=function(n){return arguments.length?(r=n,t):r},hr(t,n)},d3.layout.tree=function(){function t(t,u){function i(t,n){var r=t.children,u=t._tree;if(r&&(a=r.length)){for(var a,c,l,s=r[0],f=s,h=-1;a>++h;)l=r[h],i(l,c),f=o(l,c,f),c=l;Pr(t);var d=.5*(s._tree.prelim+l._tree.prelim);n?(u.prelim=n._tree.prelim+e(t,n),u.mod=u.prelim-d):u.prelim=d}else n&&(u.prelim=n._tree.prelim+e(t,n))}function a(t,n){t.x=t._tree.prelim+n;var e=t.children;if(e&&(r=e.length)){var r,u=-1;for(n+=t._tree.mod;r>++u;)a(e[u],n)}}function o(t,n,r){if(n){for(var u,i=t,a=t,o=n,c=t.parent.children[0],l=i._tree.mod,s=a._tree.mod,f=o._tree.mod,h=c._tree.mod;o=zr(o),i=Cr(i),o&&i;)c=Cr(c),a=zr(a),a._tree.ancestor=t,u=o._tree.prelim+f-i._tree.prelim-l+e(o,i),u>0&&(jr(Or(o,t,r),t,u),l+=u,s+=u),f+=o._tree.mod,l+=i._tree.mod,h+=c._tree.mod,s+=a._tree.mod;o&&!zr(a)&&(a._tree.thread=o,a._tree.mod+=f-s),i&&!Cr(c)&&(c._tree.thread=i,c._tree.mod+=l-h,r=t)}return r}var c=n.call(this,t,u),l=c[0];Rr(l,function(t,n){t._tree={ancestor:t,prelim:0,mod:0,change:0,shift:0,number:n?n._tree.number+1:0}}),i(l),a(l,-l._tree.prelim);var s=Dr(l,Fr),f=Dr(l,Lr),h=Dr(l,Hr),d=s.x-e(s,f)/2,g=f.x+e(f,s)/2,p=h.depth||1;return Rr(l,function(t){t.x=(t.x-d)/(g-d)*r[0],t.y=t.depth/p*r[1],delete t._tree}),c}var n=d3.layout.hierarchy().sort(null).value(null),e=qr,r=[1,1];return t.separation=function(n){return arguments.length?(e=n,t):e},t.size=function(n){return arguments.length?(r=n,t):r},hr(t,n)},d3.layout.treemap=function(){function t(t,n){for(var e,r,u=-1,i=t.length;i>++u;)r=(e=t[u]).value*(0>n?0:n),e.area=isNaN(r)||0>=r?0:r}function n(e){var i=e.children;if(i&&i.length){var a,o,c,l=f(e),s=[],h=i.slice(),g=1/0,p="slice"===d?l.dx:"dice"===d||"slice-dice"===d&&1&e.depth?l.dy:Math.min(l.dx,l.dy);for(t(h,l.dx*l.dy/e.value),s.area=0;(c=h.length)>0;)s.push(a=h[c-1]),s.area+=a.area,"squarify"!==d||g>=(o=r(s,p))?(h.pop(),g=o):(s.area-=s.pop().area,u(s,p,l,!1),p=Math.min(l.dx,l.dy),s.length=s.area=0,g=1/0);s.length&&(u(s,p,l,!0),s.length=s.area=0),i.forEach(n)}}function e(n){var r=n.children;if(r&&r.length){var i,a=f(n),o=r.slice(),c=[];for(t(o,a.dx*a.dy/n.value),c.area=0;i=o.pop();)c.push(i),c.area+=i.area,null!=i.z&&(u(c,i.z?a.dx:a.dy,a,!o.length),c.length=c.area=0);r.forEach(e)}}function r(t,n){for(var e,r=t.area,u=0,i=1/0,a=-1,o=t.length;o>++a;)(e=t[a].area)&&(i>e&&(i=e),e>u&&(u=e));return r*=r,n*=n,r?Math.max(n*u*g/r,r/(n*i*g)):1/0}function u(t,n,e,r){var u,i=-1,a=t.length,o=e.x,l=e.y,s=n?c(t.area/n):0;if(n==e.dx){for((r||s>e.dy)&&(s=e.dy);a>++i;)u=t[i],u.x=o,u.y=l,u.dy=s,o+=u.dx=Math.min(e.x+e.dx-o,s?c(u.area/s):0);u.z=!0,u.dx+=e.x+e.dx-o,e.y+=s,e.dy-=s}else{for((r||s>e.dx)&&(s=e.dx);a>++i;)u=t[i],u.x=o,u.y=l,u.dx=s,l+=u.dy=Math.min(e.y+e.dy-l,s?c(u.area/s):0);u.z=!1,u.dy+=e.y+e.dy-l,e.x+=s,e.dx-=s}}function i(r){var u=a||o(r),i=u[0];return i.x=0,i.y=0,i.dx=l[0],i.dy=l[1],a&&o.revalue(i),t([i],i.dx*i.dy/i.value),(a?e:n)(i),h&&(a=u),u}var a,o=d3.layout.hierarchy(),c=Math.round,l=[1,1],s=null,f=Yr,h=!1,d="squarify",g=.5*(1+Math.sqrt(5));return i.size=function(t){return arguments.length?(l=t,i):l},i.padding=function(t){function n(n){var e=t.call(i,n,n.depth);return null==e?Yr(n):Ur(n,"number"==typeof e?[e,e,e,e]:e)}function e(n){return Ur(n,t)}if(!arguments.length)return s;var r;return f=null==(s=t)?Yr:"function"==(r=typeof t)?n:"number"===r?(t=[t,t,t,t],e):e,i},i.round=function(t){return arguments.length?(c=t?Math.round:Number,i):c!=Number},i.sticky=function(t){return arguments.length?(h=t,a=null,i):h},i.ratio=function(t){return arguments.length?(g=t,i):g},i.mode=function(t){return arguments.length?(d=t+"",i):d},hr(i,o)},d3.csv=Ir(",","text/csv"),d3.tsv=Ir(" ","text/tab-separated-values"),d3.geo={},d3.geo.stream=function(t,n){to.hasOwnProperty(t.type)?to[t.type](t,n):Vr(t,n)};var to={Feature:function(t,n){Vr(t.geometry,n)},FeatureCollection:function(t,n){for(var e=t.features,r=-1,u=e.length;u>++r;)Vr(e[r].geometry,n)},GeometryCollection:function(t,n){for(var e=t.geometries,r=-1,u=e.length;u>++r;)Vr(e[r],n)}},no={Sphere:function(t,n){n.sphere()},Point:function(t,n){var e=t.coordinates;n.point(e[0],e[1])},MultiPoint:function(t,n){for(var e,r=t.coordinates,u=-1,i=r.length;i>++u;)e=r[u],n.point(e[0],e[1])},LineString:function(t,n){Xr(t.coordinates,n,0)},MultiLineString:function(t,n){for(var e=t.coordinates,r=-1,u=e.length;u>++r;)Xr(e[r],n,0)},Polygon:function(t,n){Zr(t.coordinates,n)},MultiPolygon:function(t,n){for(var e=t.coordinates,r=-1,u=e.length;u>++r;)Zr(e[r],n)}};d3.geo.albersUsa=function(){function t(t){return n(t)(t)}function n(t){var n=t[0],a=t[1];return a>50?r:-140>n?u:21>a?i:e}var e=d3.geo.albers(),r=d3.geo.albers().rotate([160,0]).center([0,60]).parallels([55,65]),u=d3.geo.albers().rotate([160,0]).center([0,20]).parallels([8,18]),i=d3.geo.albers().rotate([60,0]).center([0,10]).parallels([8,18]);return t.scale=function(n){return arguments.length?(e.scale(n),r.scale(.6*n),u.scale(n),i.scale(1.5*n),t.translate(e.translate())):e.scale()},t.translate=function(n){if(!arguments.length)return e.translate();var a=e.scale(),o=n[0],c=n[1];return e.translate(n),r.translate([o-.4*a,c+.17*a]),u.translate([o-.19*a,c+.2*a]),i.translate([o+.58*a,c+.43*a]),t},t.scale(e.scale())},(d3.geo.albers=function(){var t=29.5*ji,n=45.5*ji,e=Pu(eu),r=e(t,n);return r.parallels=function(r){return arguments.length?e(t=r[0]*ji,n=r[1]*ji):[t*Oi,n*Oi]},r.rotate([98,0]).center([0,38]).scale(1e3)}).raw=eu;var eo=Vu(function(t){return Math.sqrt(2/(1+t))},function(t){return 2*Math.asin(t/2)});(d3.geo.azimuthalEqualArea=function(){return Ru(eo)}).raw=eo;var ro=Vu(function(t){var n=Math.acos(t);return n&&n/Math.sin(n)},a);(d3.geo.azimuthalEquidistant=function(){return Ru(ro)}).raw=ro,d3.geo.bounds=ru(),d3.geo.centroid=function(t){uo=io=ao=oo=co=0,d3.geo.stream(t,lo);var n;return io&&Math.abs(n=Math.sqrt(ao*ao+oo*oo+co*co))>Pi?[Math.atan2(oo,ao)*Oi,Math.asin(Math.max(-1,Math.min(1,co/n)))*Oi]:void 0};var uo,io,ao,oo,co,lo={sphere:Pn,point:uu,lineStart:au,lineEnd:ou,polygonStart:function(){uo=2,lo.lineStart=iu},polygonEnd:function(){lo.lineStart=au}};d3.geo.circle=function(){function t(){var t="function"==typeof r?r.apply(this,arguments):r,n=Ou(t[0]*ji,t[1]*ji,0),u=[];return e(null,null,1,{point:function(t,e){u.push(t=n(t,e)),t[0]*=Oi,t[1]*=Oi}}),{type:"Polygon",coordinates:[u]}}var n,e,r=[0,0],u=6;return t.origin=function(n){return arguments.length?(r=n,t):r},t.angle=function(r){return arguments.length?(e=cu((n=+r)*ji,u*ji),t):n},t.precision=function(r){return arguments.length?(e=cu(n*ji,(u=+r)*ji),t):u},t.angle(90)};var so=su(o,vu,Mu);(d3.geo.equirectangular=function(){return Ru(_u).scale(250/Ri)}).raw=_u.invert=_u;var fo=Vu(function(t){return 1/t},Math.atan);(d3.geo.gnomonic=function(){return Ru(fo)}).raw=fo,d3.geo.graticule=function(){function t(){return{type:"MultiLineString",coordinates:n()}}function n(){return d3.range(Math.ceil(r/c)*c,e,c).map(a).concat(d3.range(Math.ceil(i/l)*l,u,l).map(o))}var e,r,u,i,a,o,c=22.5,l=c,s=2.5;return t.lines=function(){return n().map(function(t){return{type:"LineString",coordinates:t}})},t.outline=function(){return{type:"Polygon",coordinates:[a(r).concat(o(u).slice(1),a(e).reverse().slice(1),o(i).reverse().slice(1))]}},t.extent=function(n){return arguments.length?(r=+n[0][0],e=+n[1][0],i=+n[0][1],u=+n[1][1],r>e&&(n=r,r=e,e=n),i>u&&(n=i,i=u,u=n),t.precision(s)):[[r,i],[e,u]]},t.step=function(n){return arguments.length?(c=+n[0],l=+n[1],t):[c,l]},t.precision=function(n){return arguments.length?(s=+n,a=wu(i,u,s),o=Su(r,e,s),t):s},t.extent([[-180+Pi,-90+Pi],[180-Pi,90-Pi]])},d3.geo.interpolate=function(t,n){return ku(t[0]*ji,t[1]*ji,n[0]*ji,n[1]*ji)},d3.geo.greatArc=function(){function e(){for(var t=r||a.apply(this,arguments),n=u||o.apply(this,arguments),e=i||d3.geo.interpolate(t,n),u=0,l=c/e.distance,s=[t];1>(u+=l);)s.push(e(u));return s.push(n),{type:"LineString",coordinates:s}}var r,u,i,a=n,o=t,c=6*ji;return e.distance=function(){return(i||d3.geo.interpolate(r||a.apply(this,arguments),u||o.apply(this,arguments))).distance},e.source=function(t){return arguments.length?(a=t,r="function"==typeof t?null:t,i=r&&u?d3.geo.interpolate(r,u):null,e):a},e.target=function(t){return arguments.length?(o=t,u="function"==typeof t?null:t,i=r&&u?d3.geo.interpolate(r,u):null,e):o},e.precision=function(t){return arguments.length?(c=t*ji,e):c/ji},e},Eu.invert=function(t,n){return[2*Ri*t,2*Math.atan(Math.exp(2*Ri*n))-Ri/2]},(d3.geo.mercator=function(){return Ru(Eu).scale(500)}).raw=Eu;var ho=Vu(function(){return 1},Math.asin);(d3.geo.orthographic=function(){return Ru(ho)}).raw=ho,d3.geo.path=function(){function t(t){return t&&d3.geo.stream(t,r(u.pointRadius("function"==typeof i?+i.apply(this,arguments):i))),u.result()}var n,e,r,u,i=4.5;return t.area=function(t){return go=0,d3.geo.stream(t,r(mo)),go},t.centroid=function(t){return uo=ao=oo=co=0,d3.geo.stream(t,r(vo)),co?[ao/co,oo/co]:void 0},t.bounds=function(t){return ru(n)(t)},t.projection=function(e){return arguments.length?(r=(n=e)?e.stream||Nu(e):a,t):n},t.context=function(n){return arguments.length?(u=null==(e=n)?new Tu:new qu(n),t):e},t.pointRadius=function(n){return arguments.length?(i="function"==typeof n?n:+n,t):i},t.projection(d3.geo.albersUsa()).context(null)};var go,po,mo={point:Pn,lineStart:Pn,lineEnd:Pn,polygonStart:function(){po=0,mo.lineStart=Cu},polygonEnd:function(){mo.lineStart=mo.lineEnd=mo.point=Pn,go+=Math.abs(po/2)}},vo={point:zu,lineStart:Du,lineEnd:Lu,polygonStart:function(){vo.lineStart=Fu},polygonEnd:function(){vo.point=zu,vo.lineStart=Du,vo.lineEnd=Lu}};d3.geo.area=function(t){return yo=0,d3.geo.stream(t,bo),yo};var yo,Mo,bo={sphere:function(){yo+=4*Ri},point:Pn,lineStart:Pn,lineEnd:Pn,polygonStart:function(){Mo=0,bo.lineStart=Hu},polygonEnd:function(){yo+=0>Mo?4*Ri+Mo:Mo,bo.lineStart=bo.lineEnd=bo.point=Pn}};d3.geo.projection=Ru,d3.geo.projectionMutator=Pu;var xo=Vu(function(t){return 1/(1+t)},function(t){return 2*Math.atan(t)});(d3.geo.stereographic=function(){return Ru(xo)}).raw=xo,d3.geom={},d3.geom.hull=function(t){if(3>t.length)return[];var n,e,r,u,i,a,o,c,l,s,f=t.length,h=f-1,d=[],g=[],p=0;for(n=1;f>n;++n)t[n][1]<t[p][1]?p=n:t[n][1]==t[p][1]&&(p=t[n][0]<t[p][0]?n:p);for(n=0;f>n;++n)n!==p&&(u=t[n][1]-t[p][1],r=t[n][0]-t[p][0],d.push({angle:Math.atan2(u,r),index:n}));for(d.sort(function(t,n){return t.angle-n.angle}),l=d[0].angle,c=d[0].index,o=0,n=1;h>n;++n)e=d[n].index,l==d[n].angle?(r=t[c][0]-t[p][0],u=t[c][1]-t[p][1],i=t[e][0]-t[p][0],a=t[e][1]-t[p][1],r*r+u*u>=i*i+a*a?d[n].index=-1:(d[o].index=-1,l=d[n].angle,o=n,c=e)):(l=d[n].angle,o=n,c=e);for(g.push(p),n=0,e=0;2>n;++e)-1!==d[e].index&&(g.push(d[e].index),n++);for(s=g.length;h>e;++e)if(-1!==d[e].index){for(;!Xu(g[s-2],g[s-1],d[e].index,t);)--s;g[s++]=d[e].index}var m=[];for(n=0;s>n;++n)m.push(t[g[n]]);return m},d3.geom.polygon=function(t){return t.area=function(){for(var n=0,e=t.length,r=t[e-1][1]*t[0][0]-t[e-1][0]*t[0][1];e>++n;)r+=t[n-1][1]*t[n][0]-t[n-1][0]*t[n][1];return.5*r},t.centroid=function(n){var e,r,u=-1,i=t.length,a=0,o=0,c=t[i-1];for(arguments.length||(n=-1/(6*t.area()));i>++u;)e=c,c=t[u],r=e[0]*c[1]-c[0]*e[1],a+=(e[0]+c[0])*r,o+=(e[1]+c[1])*r;return[a*n,o*n]},t.clip=function(n){for(var e,r,u,i,a,o,c=-1,l=t.length,s=t[l-1];l>++c;){for(e=n.slice(),n.length=0,i=t[c],a=e[(u=e.length)-1],r=-1;u>++r;)o=e[r],Zu(o,s,i)?(Zu(a,s,i)||n.push(Bu(a,o,s,i)),n.push(o)):Zu(a,s,i)&&n.push(Bu(a,o,s,i)),a=o;s=i}return n},t},d3.geom.voronoi=function(t){var n=t.map(function(){return[]}),e=1e6;return $u(t,function(t){var r,u,i,a,o,c;1===t.a&&t.b>=0?(r=t.ep.r,u=t.ep.l):(r=t.ep.l,u=t.ep.r),1===t.a?(o=r?r.y:-e,i=t.c-t.b*o,c=u?u.y:e,a=t.c-t.b*c):(i=r?r.x:-e,o=t.c-t.a*i,a=u?u.x:e,c=t.c-t.a*a);var l=[i,o],s=[a,c];n[t.region.l.index].push(l,s),n[t.region.r.index].push(l,s)}),n=n.map(function(n,e){var r=t[e][0],u=t[e][1],i=n.map(function(t){return Math.atan2(t[0]-r,t[1]-u)});return d3.range(n.length).sort(function(t,n){return i[t]-i[n]}).filter(function(t,n,e){return!n||i[t]-i[e[n-1]]>Pi}).map(function(t){return n[t]})}),n.forEach(function(n,r){var u=n.length;if(!u)return n.push([-e,-e],[-e,e],[e,e],[e,-e]);if(!(u>2)){var i=t[r],a=n[0],o=n[1],c=i[0],l=i[1],s=a[0],f=a[1],h=o[0],d=o[1],g=Math.abs(h-s),p=d-f;if(Pi>Math.abs(p)){var m=f>l?-e:e;n.push([-e,m],[e,m])}else if(Pi>g){var v=s>c?-e:e;n.push([v,-e],[v,e])}else{var m=(s-c)*(d-f)>(h-s)*(f-l)?e:-e,y=Math.abs(p)-g;Pi>Math.abs(y)?n.push([0>p?m:-m,m]):(y>0&&(m*=-1),n.push([-e,m],[e,m]))}}}),n};var _o={l:"r",r:"l"};d3.geom.delaunay=function(t){var n=t.map(function(){return[]}),e=[];return $u(t,function(e){n[e.region.l.index].push(t[e.region.r.index])}),n.forEach(function(n,r){var u=t[r],i=u[0],a=u[1];n.forEach(function(t){t.angle=Math.atan2(t[0]-i,t[1]-a)}),n.sort(function(t,n){return t.angle-n.angle});for(var o=0,c=n.length-1;c>o;o++)e.push([u,n[o],n[o+1]])}),e},d3.geom.quadtree=function(t,n,e,r,u){function i(t,n,e,r,u,i){if(!isNaN(n.x)&&!isNaN(n.y))if(t.leaf){var o=t.point;o?.01>Math.abs(o.x-n.x)+Math.abs(o.y-n.y)?a(t,n,e,r,u,i):(t.point=null,a(t,o,e,r,u,i),a(t,n,e,r,u,i)):t.point=n}else a(t,n,e,r,u,i)}function a(t,n,e,r,u,a){var o=.5*(e+u),c=.5*(r+a),l=n.x>=o,s=n.y>=c,f=(s<<1)+l;t.leaf=!1,t=t.nodes[f]||(t.nodes[f]=Ju()),l?e=o:u=o,s?r=c:a=c,i(t,n,e,r,u,a)}var o,c=-1,l=t.length;if(5>arguments.length)if(3===arguments.length)u=e,r=n,e=n=0;else for(n=e=1/0,r=u=-1/0;l>++c;)o=t[c],n>o.x&&(n=o.x),e>o.y&&(e=o.y),o.x>r&&(r=o.x),o.y>u&&(u=o.y);var s=r-n,f=u-e;s>f?u=e+s:r=n+f;var h=Ju();return h.add=function(t){i(h,t,n,e,r,u)},h.visit=function(t){Gu(t,h,n,e,r,u)},t.forEach(h.add),h},d3.time={};var wo=Date,So=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];Ku.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){ko.setUTCDate.apply(this._,arguments)},setDay:function(){ko.setUTCDay.apply(this._,arguments)},setFullYear:function(){ko.setUTCFullYear.apply(this._,arguments)},setHours:function(){ko.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){ko.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){ko.setUTCMinutes.apply(this._,arguments)},setMonth:function(){ko.setUTCMonth.apply(this._,arguments)},setSeconds:function(){ko.setUTCSeconds.apply(this._,arguments)},setTime:function(){ko.setTime.apply(this._,arguments)}};var ko=Date.prototype,Eo="%a %b %e %X %Y",Ao="%m/%d/%Y",No="%H:%M:%S",To=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],qo=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],Co=["January","February","March","April","May","June","July","August","September","October","November","December"],zo=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];d3.time.format=function(t){function n(n){for(var r,u,i,a=[],o=-1,c=0;e>++o;)37===t.charCodeAt(o)&&(a.push(t.substring(c,o)),null!=(u=jo[r=t.charAt(++o)])&&(r=t.charAt(++o)),(i=Oo[r])&&(r=i(n,null==u?"e"===r?" ":"0":u)),a.push(r),c=o+1);return a.push(t.substring(c,o)),a.join("")}var e=t.length;return n.parse=function(n){var e={y:1900,m:0,d:1,H:0,M:0,S:0,L:0},r=Wu(e,t,n,0);if(r!=n.length)return null;"p"in e&&(e.H=e.H%12+12*e.p);var u=new wo;return u.setFullYear(e.y,e.m,e.d),u.setHours(e.H,e.M,e.S,e.L),u},n.toString=function(){return t},n};var Do=Qu(To),Lo=Qu(qo),Fo=Qu(Co),Ho=ti(Co),Ro=Qu(zo),Po=ti(zo),jo={"-":"",_:" ",0:"0"},Oo={a:function(t){return qo[t.getDay()]},A:function(t){return To[t.getDay()]},b:function(t){return zo[t.getMonth()]},B:function(t){return Co[t.getMonth()]},c:d3.time.format(Eo),d:function(t,n){return ni(t.getDate(),n,2)},e:function(t,n){return ni(t.getDate(),n,2)},H:function(t,n){return ni(t.getHours(),n,2)},I:function(t,n){return ni(t.getHours()%12||12,n,2)},j:function(t,n){return ni(1+d3.time.dayOfYear(t),n,3)},L:function(t,n){return ni(t.getMilliseconds(),n,3)},m:function(t,n){return ni(t.getMonth()+1,n,2)},M:function(t,n){return ni(t.getMinutes(),n,2)},p:function(t){return t.getHours()>=12?"PM":"AM"},S:function(t,n){return ni(t.getSeconds(),n,2)},U:function(t,n){return ni(d3.time.sundayOfYear(t),n,2)},w:function(t){return t.getDay()},W:function(t,n){return ni(d3.time.mondayOfYear(t),n,2)},x:d3.time.format(Ao),X:d3.time.format(No),y:function(t,n){return ni(t.getFullYear()%100,n,2)},Y:function(t,n){return ni(t.getFullYear()%1e4,n,4)},Z:Mi,"%":function(){return"%"}},Yo={a:ei,A:ri,b:ui,B:ii,c:ai,d:di,e:di,H:gi,I:gi,L:vi,m:hi,M:pi,p:yi,S:mi,x:oi,X:ci,y:si,Y:li},Uo=/^\s*\d+/,Io=d3.map({am:0,pm:1});d3.time.format.utc=function(t){function n(t){try{wo=Ku;var n=new wo;return n._=t,e(n)}finally{wo=Date}}var e=d3.time.format(t);return n.parse=function(t){try{wo=Ku;var n=e.parse(t);return n&&n._}finally{wo=Date}},n.toString=e.toString,n};var Vo=d3.time.format.utc("%Y-%m-%dT%H:%M:%S.%LZ");d3.time.format.iso=Date.prototype.toISOString?bi:Vo,bi.parse=function(t){var n=new Date(t);return isNaN(n)?null:n},bi.toString=Vo.toString,d3.time.second=xi(function(t){return new wo(1e3*Math.floor(t/1e3))},function(t,n){t.setTime(t.getTime()+1e3*Math.floor(n))},function(t){return t.getSeconds()}),d3.time.seconds=d3.time.second.range,d3.time.seconds.utc=d3.time.second.utc.range,d3.time.minute=xi(function(t){return new wo(6e4*Math.floor(t/6e4))},function(t,n){t.setTime(t.getTime()+6e4*Math.floor(n))},function(t){return t.getMinutes()}),d3.time.minutes=d3.time.minute.range,d3.time.minutes.utc=d3.time.minute.utc.range,d3.time.hour=xi(function(t){var n=t.getTimezoneOffset()/60;return new wo(36e5*(Math.floor(t/36e5-n)+n))},function(t,n){t.setTime(t.getTime()+36e5*Math.floor(n))},function(t){return t.getHours()}),d3.time.hours=d3.time.hour.range,d3.time.hours.utc=d3.time.hour.utc.range,d3.time.day=xi(function(t){var n=new wo(1970,0);return n.setFullYear(t.getFullYear(),t.getMonth(),t.getDate()),n},function(t,n){t.setDate(t.getDate()+n)},function(t){return t.getDate()-1}),d3.time.days=d3.time.day.range,d3.time.days.utc=d3.time.day.utc.range,d3.time.dayOfYear=function(t){var n=d3.time.year(t);return Math.floor((t-n-6e4*(t.getTimezoneOffset()-n.getTimezoneOffset()))/864e5)},So.forEach(function(t,n){t=t.toLowerCase(),n=7-n;var e=d3.time[t]=xi(function(t){return(t=d3.time.day(t)).setDate(t.getDate()-(t.getDay()+n)%7),t},function(t,n){t.setDate(t.getDate()+7*Math.floor(n))},function(t){var e=d3.time.year(t).getDay();return Math.floor((d3.time.dayOfYear(t)+(e+n)%7)/7)-(e!==n)});d3.time[t+"s"]=e.range,d3.time[t+"s"].utc=e.utc.range,d3.time[t+"OfYear"]=function(t){var e=d3.time.year(t).getDay();return Math.floor((d3.time.dayOfYear(t)+(e+n)%7)/7)}}),d3.time.week=d3.time.sunday,d3.time.weeks=d3.time.sunday.range,d3.time.weeks.utc=d3.time.sunday.utc.range,d3.time.weekOfYear=d3.time.sundayOfYear,d3.time.month=xi(function(t){return t=d3.time.day(t),t.setDate(1),t},function(t,n){t.setMonth(t.getMonth()+n)},function(t){return t.getMonth()}),d3.time.months=d3.time.month.range,d3.time.months.utc=d3.time.month.utc.range,d3.time.year=xi(function(t){return t=d3.time.day(t),t.setMonth(0,1),t},function(t,n){t.setFullYear(t.getFullYear()+n)},function(t){return t.getFullYear()}),d3.time.years=d3.time.year.range,d3.time.years.utc=d3.time.year.utc.range;var Xo=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Zo=[[d3.time.second,1],[d3.time.second,5],[d3.time.second,15],[d3.time.second,30],[d3.time.minute,1],[d3.time.minute,5],[d3.time.minute,15],[d3.time.minute,30],[d3.time.hour,1],[d3.time.hour,3],[d3.time.hour,6],[d3.time.hour,12],[d3.time.day,1],[d3.time.day,2],[d3.time.week,1],[d3.time.month,1],[d3.time.month,3],[d3.time.year,1]],Bo=[[d3.time.format("%Y"),o],[d3.time.format("%B"),function(t){return t.getMonth()}],[d3.time.format("%b %d"),function(t){return 1!=t.getDate()}],[d3.time.format("%a %d"),function(t){return t.getDay()&&1!=t.getDate()}],[d3.time.format("%I %p"),function(t){return t.getHours()}],[d3.time.format("%I:%M"),function(t){return t.getMinutes()}],[d3.time.format(":%S"),function(t){return t.getSeconds()}],[d3.time.format(".%L"),function(t){return t.getMilliseconds()}]],$o=d3.scale.linear(),Jo=Ei(Bo);Zo.year=function(t,n){return $o.domain(t.map(Ni)).ticks(n).map(Ai)},d3.time.scale=function(){return wi(d3.scale.linear(),Zo,Jo)};var Go=Zo.map(function(t){return[t[0].utc,t[1]]}),Ko=[[d3.time.format.utc("%Y"),o],[d3.time.format.utc("%B"),function(t){return t.getUTCMonth()}],[d3.time.format.utc("%b %d"),function(t){return 1!=t.getUTCDate()}],[d3.time.format.utc("%a %d"),function(t){return t.getUTCDay()&&1!=t.getUTCDate()}],[d3.time.format.utc("%I %p"),function(t){return t.getUTCHours()}],[d3.time.format.utc("%I:%M"),function(t){return t.getUTCMinutes()}],[d3.time.format.utc(":%S"),function(t){return t.getUTCSeconds()}],[d3.time.format.utc(".%L"),function(t){return t.getUTCMilliseconds()}]],Wo=Ei(Ko);Go.year=function(t,n){return $o.domain(t.map(qi)).ticks(n).map(Ti)},d3.time.scale.utc=function(){return wi(d3.scale.linear(),Go,Wo)}})(); \ No newline at end of file diff --git a/hub/static/js/lib/date.extensions.js b/hub/static/js/lib/date.extensions.js new file mode 100644 index 0000000..c7af433 --- /dev/null +++ b/hub/static/js/lib/date.extensions.js @@ -0,0 +1,149 @@ +/** + * Returns a description of this date in relative terms. + + * Examples, where new Date().toString() == "Mon Nov 23 2009 17:36:51 GMT-0500 (EST)": + * + * new Date().toRelativeTime() + * --> 'Just now' + * + * new Date("Nov 21, 2009").toRelativeTime() + * --> '2 days ago' + * + * new Date("Nov 25, 2009").toRelativeTime() + * --> '2 days from now' + * + * // One second ago + * new Date("Nov 23 2009 17:36:50 GMT-0500 (EST)").toRelativeTime() + * --> '1 second ago' + * + * toRelativeTime() takes an optional argument - a configuration object. + * It can have the following properties: + * - now - Date object that defines "now" for the purpose of conversion. + * By default, current date & time is used (i.e. new Date()) + * - nowThreshold - Threshold in milliseconds which is considered "Just now" + * for times in the past or "Right now" for now or the immediate future + * - smartDays - If enabled, dates within a week of now will use Today/Yesterday/Tomorrow + * or weekdays along with time, e.g. "Thursday at 15:10:34" + * rather than "4 days ago" or "Tomorrow at 20:12:01" + * instead of "1 day from now" + * + * If a single number is given as argument, it is interpreted as nowThreshold: + * + * // One second ago, now setting a now_threshold to 5 seconds + * new Date("Nov 23 2009 17:36:50 GMT-0500 (EST)").toRelativeTime(5000) + * --> 'Just now' + * + * // One second in the future, now setting a now_threshold to 5 seconds + * new Date("Nov 23 2009 17:36:52 GMT-0500 (EST)").toRelativeTime(5000) + * --> 'Right now' + * + */ +var TRANSLATIONS = { + 'Right now':'现在', + 'Just now':'刚刚', + 'from now':'之后', + 'ago':'前', + 'Today':'今天', + 'Yesterday':'昨天', + 'Tomorrow':'明天', + ' at ':'', + 's':'', + ' ':'', + 'millisecond':'毫秒', + 'second':'秒', + 'minute':'分钟', + 'hour':'小时', + 'day':'天', + 'month':'个月', + 'year':'年', + 'Sunday':'星期天', + 'Monday':'星期六', + 'Tuesday':'星期二', + 'Wednesday':'星期三', + 'Thursday':'星期四', + 'Friday':'星期五', + 'Saturday':'星期六' +}, +_t = function (key) {return TRANSLATIONS[key];}; + + Date.prototype.toRelativeTime = (function() { + + var _ = function(options) { + var opts = processOptions(options); + + var now = opts.now || new Date(); + var delta = now - this; + var future = (delta <= 0); + delta = Math.abs(delta); + + // special cases controlled by options + if (delta <= opts.nowThreshold) { + return future ? _t('Right now') : _t('Just now'); + } + if (opts.smartDays && delta <= 6 * MS_IN_DAY) { + return toSmartDays(this, now); + } + + var units = null; + for (var key in CONVERSIONS) { + if (delta < CONVERSIONS[key]) + break; + units = _t(key); // keeps track of the selected key over the iteration + delta = delta / CONVERSIONS[key]; + } + + // pluralize a unit when the difference is greater than 1. + delta = Math.floor(delta); + if (delta !== 1) { units += _t("s"); } + return [delta, units, future ? _t("from now") : _t("ago")].join(_t(" ")); + }; + + var processOptions = function(arg) { + if (!arg) arg = 0; + if (typeof arg === 'string') { + arg = parseInt(arg, 10); + } + if (typeof arg === 'number') { + if (isNaN(arg)) arg = 0; + return {nowThreshold: arg}; + } + return arg; + }; + + var toSmartDays = function(date, now) { + var day; + var weekday = date.getDay(), + dayDiff = weekday - now.getDay(); + if (dayDiff == 0) day = _t('Today'); + else if (dayDiff == -1) day = _t('Yesterday'); + else if (dayDiff == 1 && date > now) day = _t('Tomorrow'); + else day = WEEKDAYS[weekday]; + return day + _t(" at ") + date.toLocaleTimeString(); + }; + + var CONVERSIONS = { + millisecond: 1, // ms -> ms + second: 1000, // ms -> sec + minute: 60, // sec -> min + hour: 60, // min -> hour + day: 24, // hour -> day + month: 30, // day -> month (roughly) + year: 12 // month -> year + }; + var MS_IN_DAY = (CONVERSIONS.millisecond * CONVERSIONS.second * CONVERSIONS.minute * CONVERSIONS.hour * CONVERSIONS.day); + + var WEEKDAYS = [_t('Sunday'), _t('Monday'), _t('Tuesday'), _t('Wednesday'), _t('Thursday'), _t('Friday'), _t('Saturday')]; + + return _; + +})(); + + + +/* + * Wraps up a common pattern used with this plugin whereby you take a String + * representation of a Date, and want back a date object. + */ +Date.fromString = function(str) { + return new Date(Date.parse(str)); +}; diff --git a/hub/static/js/lib/jquery-1.10.2.js b/hub/static/js/lib/jquery-1.10.2.js new file mode 100644 index 0000000..c5c6482 --- /dev/null +++ b/hub/static/js/lib/jquery-1.10.2.js @@ -0,0 +1,9789 @@ +/*! + * jQuery JavaScript Library v1.10.2 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2013-07-03T13:48Z + */ +(function( window, undefined ) { + +// Can't do this because several apps including ASP.NET trace +// the stack via arguments.caller.callee and Firefox dies if +// you try to trace through "use strict" call chains. (#13335) +// Support: Firefox 18+ +//"use strict"; +var + // The deferred used on DOM ready + readyList, + + // A central reference to the root jQuery(document) + rootjQuery, + + // Support: IE<10 + // For `typeof xmlNode.method` instead of `xmlNode.method !== undefined` + core_strundefined = typeof undefined, + + // Use the correct document accordingly with window argument (sandbox) + location = window.location, + document = window.document, + docElem = document.documentElement, + + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$, + + // [[Class]] -> type pairs + class2type = {}, + + // List of deleted data cache ids, so we can reuse them + core_deletedIds = [], + + core_version = "1.10.2", + + // Save a reference to some core methods + core_concat = core_deletedIds.concat, + core_push = core_deletedIds.push, + core_slice = core_deletedIds.slice, + core_indexOf = core_deletedIds.indexOf, + core_toString = class2type.toString, + core_hasOwn = class2type.hasOwnProperty, + core_trim = core_version.trim, + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context, rootjQuery ); + }, + + // Used for matching numbers + core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, + + // Used for splitting on whitespace + core_rnotwhite = /\S+/g, + + // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE) + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // A simple way to check for HTML strings + // Prioritize #id over <tag> to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, + + // Match a standalone tag + rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, + + // JSON RegExp + rvalidchars = /^[\],:{}\s]*$/, + rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, + rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g, + rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([\da-z])/gi, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }, + + // The ready event handler + completed = function( event ) { + + // readyState === "complete" is good enough for us to call the dom ready in oldIE + if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) { + detach(); + jQuery.ready(); + } + }, + // Clean-up method for dom ready events + detach = function() { + if ( document.addEventListener ) { + document.removeEventListener( "DOMContentLoaded", completed, false ); + window.removeEventListener( "load", completed, false ); + + } else { + document.detachEvent( "onreadystatechange", completed ); + window.detachEvent( "onload", completed ); + } + }; + +jQuery.fn = jQuery.prototype = { + // The current version of jQuery being used + jquery: core_version, + + constructor: jQuery, + init: function( selector, context, rootjQuery ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + + // scripts is true for back-compat + jQuery.merge( this, jQuery.parseHTML( + match[1], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || rootjQuery ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return rootjQuery.ready( selector ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }, + + // Start with an empty selector + selector: "", + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return core_slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == null ? + + // Return a 'clean' array + this.toArray() : + + // Return just the object + ( num < 0 ? this[ this.length + num ] : this[ num ] ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + ret.context = this.context; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + ready: function( fn ) { + // Add the callback + jQuery.ready.promise().done( fn ); + + return this; + }, + + slice: function() { + return this.pushStack( core_slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: core_push, + sort: [].sort, + splice: [].splice +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +jQuery.extend = jQuery.fn.extend = function() { + var src, copyIsArray, copy, name, options, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( length === i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + // Unique for each copy of jQuery on the page + // Non-digits removed to match rinlinejQuery + expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ), + + noConflict: function( deep ) { + if ( window.$ === jQuery ) { + window.$ = _$; + } + + if ( deep && window.jQuery === jQuery ) { + window.jQuery = _jQuery; + } + + return jQuery; + }, + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.trigger ) { + jQuery( document ).trigger("ready").off("ready"); + } + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + isWindow: function( obj ) { + /* jshint eqeqeq: false */ + return obj != null && obj == obj.window; + }, + + isNumeric: function( obj ) { + return !isNaN( parseFloat(obj) ) && isFinite( obj ); + }, + + type: function( obj ) { + if ( obj == null ) { + return String( obj ); + } + return typeof obj === "object" || typeof obj === "function" ? + class2type[ core_toString.call(obj) ] || "object" : + typeof obj; + }, + + isPlainObject: function( obj ) { + var key; + + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + // Not own constructor property must be Object + if ( obj.constructor && + !core_hasOwn.call(obj, "constructor") && + !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + } catch ( e ) { + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Support: IE<9 + // Handle iteration over inherited properties before own properties. + if ( jQuery.support.ownLast ) { + for ( key in obj ) { + return core_hasOwn.call( obj, key ); + } + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + for ( key in obj ) {} + + return key === undefined || core_hasOwn.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + var name; + for ( name in obj ) { + return false; + } + return true; + }, + + error: function( msg ) { + throw new Error( msg ); + }, + + // data: string of html + // context (optional): If specified, the fragment will be created in this context, defaults to document + // keepScripts (optional): If true, will include scripts passed in the html string + parseHTML: function( data, context, keepScripts ) { + if ( !data || typeof data !== "string" ) { + return null; + } + if ( typeof context === "boolean" ) { + keepScripts = context; + context = false; + } + context = context || document; + + var parsed = rsingleTag.exec( data ), + scripts = !keepScripts && []; + + // Single tag + if ( parsed ) { + return [ context.createElement( parsed[1] ) ]; + } + + parsed = jQuery.buildFragment( [ data ], context, scripts ); + if ( scripts ) { + jQuery( scripts ).remove(); + } + return jQuery.merge( [], parsed.childNodes ); + }, + + parseJSON: function( data ) { + // Attempt to parse using the native JSON parser first + if ( window.JSON && window.JSON.parse ) { + return window.JSON.parse( data ); + } + + if ( data === null ) { + return data; + } + + if ( typeof data === "string" ) { + + // Make sure leading/trailing whitespace is removed (IE can't handle it) + data = jQuery.trim( data ); + + if ( data ) { + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if ( rvalidchars.test( data.replace( rvalidescape, "@" ) + .replace( rvalidtokens, "]" ) + .replace( rvalidbraces, "")) ) { + + return ( new Function( "return " + data ) )(); + } + } + } + + jQuery.error( "Invalid JSON: " + data ); + }, + + // Cross-browser xml parsing + parseXML: function( data ) { + var xml, tmp; + if ( !data || typeof data !== "string" ) { + return null; + } + try { + if ( window.DOMParser ) { // Standard + tmp = new DOMParser(); + xml = tmp.parseFromString( data , "text/xml" ); + } else { // IE + xml = new ActiveXObject( "Microsoft.XMLDOM" ); + xml.async = "false"; + xml.loadXML( data ); + } + } catch( e ) { + xml = undefined; + } + if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; + }, + + noop: function() {}, + + // Evaluates a script in a global context + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && jQuery.trim( data ) ) { + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + // args is for internal usage only + each: function( obj, callback, args ) { + var value, + i = 0, + length = obj.length, + isArray = isArraylike( obj ); + + if ( args ) { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } + } + + return obj; + }, + + // Use native String.trim function wherever possible + trim: core_trim && !core_trim.call("\uFEFF\xA0") ? + function( text ) { + return text == null ? + "" : + core_trim.call( text ); + } : + + // Otherwise use our own trimming functionality + function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArraylike( Object(arr) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + core_push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + var len; + + if ( arr ) { + if ( core_indexOf ) { + return core_indexOf.call( arr, elem, i ); + } + + len = arr.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + // Skip accessing in sparse arrays + if ( i in arr && arr[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var l = second.length, + i = first.length, + j = 0; + + if ( typeof l === "number" ) { + for ( ; j < l; j++ ) { + first[ i++ ] = second[ j ]; + } + } else { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, inv ) { + var retVal, + ret = [], + i = 0, + length = elems.length; + inv = !!inv; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + retVal = !!callback( elems[ i ], i ); + if ( inv !== retVal ) { + ret.push( elems[ i ] ); + } + } + + return ret; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, + i = 0, + length = elems.length, + isArray = isArraylike( elems ), + ret = []; + + // Go through the array, translating each of the items to their + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + } + + // Flatten any nested arrays + return core_concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var args, proxy, tmp; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = core_slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + // Multifunctional method to get and set values of a collection + // The value/s can optionally be executed if it's a function + access: function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + length = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < length; i++ ) { + fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); + } + } + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + length ? fn( elems[0], key ) : emptyGet; + }, + + now: function() { + return ( new Date() ).getTime(); + }, + + // A method for quickly swapping in/out CSS properties to get correct calculations. + // Note: this method belongs to the css module but it's needed here for the support module. + // If support gets modularized, this method should be moved back to the css module. + swap: function( elem, options, callback, args ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.apply( elem, args || [] ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; + } +}); + +jQuery.ready.promise = function( obj ) { + if ( !readyList ) { + + readyList = jQuery.Deferred(); + + // Catch cases where $(document).ready() is called after the browser event has already occurred. + // we once tried to use readyState "interactive" here, but it caused issues like the one + // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + setTimeout( jQuery.ready ); + + // Standards-based browsers support DOMContentLoaded + } else if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed, false ); + + // If IE event model is used + } else { + // Ensure firing before onload, maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", completed ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", completed ); + + // If IE and not a frame + // continually check to see if the document is ready + var top = false; + + try { + top = window.frameElement == null && document.documentElement; + } catch(e) {} + + if ( top && top.doScroll ) { + (function doScrollCheck() { + if ( !jQuery.isReady ) { + + try { + // Use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + top.doScroll("left"); + } catch(e) { + return setTimeout( doScrollCheck, 50 ); + } + + // detach all dom ready events + detach(); + + // and execute any waiting functions + jQuery.ready(); + } + })(); + } + } + } + return readyList.promise( obj ); +}; + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +function isArraylike( obj ) { + var length = obj.length, + type = jQuery.type( obj ); + + if ( jQuery.isWindow( obj ) ) { + return false; + } + + if ( obj.nodeType === 1 && length ) { + return true; + } + + return type === "array" || type !== "function" && + ( length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj ); +} + +// All jQuery objects should point back to these +rootjQuery = jQuery(document); +/*! + * Sizzle CSS Selector Engine v1.10.2 + * http://sizzlejs.com/ + * + * Copyright 2013 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2013-07-03 + */ +(function( window, undefined ) { + +var i, + support, + cachedruns, + Expr, + getText, + isXML, + compile, + outermostContext, + sortInput, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + -(new Date()), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + hasDuplicate = false, + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + return 0; + } + return 0; + }, + + // General-purpose constants + strundefined = typeof undefined, + MAX_NEGATIVE = 1 << 31, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf if we can't use a native one + indexOf = arr.indexOf || function( elem ) { + var i = 0, + len = this.length; + for ( ; i < len; i++ ) { + if ( this[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + // http://www.w3.org/TR/css3-syntax/#characters + characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + + // Loosely modeled on CSS identifier characters + // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors + // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = characterEncoding.replace( "w", "w#" ), + + // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace + + "*(?:([*^$|!~]?=)" + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]", + + // Prefer arguments quoted, + // then not containing pseudos/brackets, + // then attribute selectors/non-parenthetical expressions, + // then anything else + // These preferences are here to reduce the number of selectors + // needing tokenize in the PSEUDO preFilter + pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rsibling = new RegExp( whitespace + "*[+~]" ), + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + characterEncoding + ")" ), + "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), + "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rescape = /'|\\/g, + + // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + // BMP codepoint + high < 0 ? + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }; + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var match, elem, m, nodeType, + // QSA vars + i, groups, old, nid, newContext, newSelector; + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + + context = context || document; + results = results || []; + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) { + return []; + } + + if ( documentIsHTML && !seed ) { + + // Shortcuts + if ( (match = rquickExpr.exec( selector )) ) { + // Speed-up: Sizzle("#ID") + if ( (m = match[1]) ) { + if ( nodeType === 9 ) { + elem = context.getElementById( m ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE, Opera, and Webkit return items + // by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + } else { + // Context is not a document + if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && + contains( context, elem ) && elem.id === m ) { + results.push( elem ); + return results; + } + } + + // Speed-up: Sizzle("TAG") + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Speed-up: Sizzle(".CLASS") + } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) { + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // QSA path + if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + nid = old = expando; + newContext = context; + newSelector = nodeType === 9 && selector; + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + groups = tokenize( selector ); + + if ( (old = context.getAttribute("id")) ) { + nid = old.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", nid ); + } + nid = "[id='" + nid + "'] "; + + i = groups.length; + while ( i-- ) { + groups[i] = nid + toSelector( groups[i] ); + } + newContext = rsibling.test( selector ) && context.parentNode || context; + newSelector = groups.join(","); + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch(qsaError) { + } finally { + if ( !old ) { + context.removeAttribute("id"); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {Function(string, Object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key += " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ +function assert( fn ) { + var div = document.createElement("div"); + + try { + return !!fn( div ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( div.parentNode ) { + div.parentNode.removeChild( div ); + } + // release memory in IE + div = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = attrs.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + ( ~b.sourceIndex || MAX_NEGATIVE ) - + ( ~a.sourceIndex || MAX_NEGATIVE ); + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Detect xml + * @param {Element|Object} elem An element or a document + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var doc = node ? node.ownerDocument || node : preferredDoc, + parent = doc.defaultView; + + // If no document and documentElement is available, return + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Set our document + document = doc; + docElem = doc.documentElement; + + // Support tests + documentIsHTML = !isXML( doc ); + + // Support: IE>8 + // If iframe document is assigned to "document" variable and if iframe has been reloaded, + // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 + // IE6-8 do not support the defaultView property so parent will be undefined + if ( parent && parent.attachEvent && parent !== parent.top ) { + parent.attachEvent( "onbeforeunload", function() { + setDocument(); + }); + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans) + support.attributes = assert(function( div ) { + div.className = "i"; + return !div.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( div ) { + div.appendChild( doc.createComment("") ); + return !div.getElementsByTagName("*").length; + }); + + // Check if getElementsByClassName can be trusted + support.getElementsByClassName = assert(function( div ) { + div.innerHTML = "<div class='a'></div><div class='a i'></div>"; + + // Support: Safari<4 + // Catch class over-caching + div.firstChild.className = "i"; + // Support: Opera<10 + // Catch gEBCN failure to find non-leading classes + return div.getElementsByClassName("i").length === 2; + }); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( div ) { + docElem.appendChild( div ).id = expando; + return !doc.getElementsByName || !doc.getElementsByName( expando ).length; + }); + + // ID find and filter + if ( support.getById ) { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== strundefined && documentIsHTML ) { + var m = context.getElementById( id ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [m] : []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + } else { + // Support: IE6/7 + // getElementById is not reliable as a find shortcut + delete Expr.find["ID"]; + + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== strundefined ) { + return context.getElementsByTagName( tag ); + } + } : + function( tag, context ) { + var elem, + tmp = [], + i = 0, + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See http://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( div ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + div.innerHTML = "<select><option selected=''></option></select>"; + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + }); + + assert(function( div ) { + + // Support: Opera 10-12/IE8 + // ^= $= *= and empty values + // Should not select anything + // Support: Windows 8 Native Apps + // The type attribute is restricted during .innerHTML assignment + var input = doc.createElement("input"); + input.setAttribute( "type", "hidden" ); + div.appendChild( input ).setAttribute( "t", "" ); + + if ( div.querySelectorAll("[t^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + div.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( div, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + + // Element contains another + // Purposefully does not implement inclusive descendent + // As in, an element does not contain itself + contains = rnative.test( docElem.contains ) || docElem.compareDocumentPosition ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = docElem.compareDocumentPosition ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b ); + + if ( compare ) { + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === doc || contains(preferredDoc, a) ) { + return -1; + } + if ( b === doc || contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } + + // Not directly comparable, sort on existence of method + return a.compareDocumentPosition ? -1 : 1; + } : + function( a, b ) { + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + + // Parentless nodes are either documents or disconnected + } else if ( !aup || !bup ) { + return a === doc ? -1 : + b === doc ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return doc; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch(e) {} + } + + return Sizzle( expr, document, null, [elem] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val === undefined ? + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null : + val; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + for ( ; (node = elem[i]); i++ ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (see #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[5] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] && match[4] !== undefined ) { + match[2] = match[4]; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, outerCache, node, diff, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + // Seek `elem` from a previously-cached index + outerCache = parent[ expando ] || (parent[ expando ] = {}); + cache = outerCache[ type ] || []; + nodeIndex = cache[0] === dirruns && cache[1]; + diff = cache[0] === dirruns && cache[2]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + outerCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + // Use previously-cached element index if available + } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { + diff = cache[1]; + + // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) + } else { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { + // Cache the index of each encountered element + if ( useCache ) { + (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf.call( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": function( elem ) { + return elem.disabled === false; + }, + + "disabled": function( elem ) { + return elem.disabled === true; + }, + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)), + // not comment, processing instructions, or others + // Thanks to Diego Perini for the nodeName shortcut + // Greater than "@" means alpha characters (specifically not starting with "#" or "?") + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) + // use getAttribute instead to test this case + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +function tokenize( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( tokens = [] ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +} + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var data, cache, outerCache, + dirkey = dirruns + " " + doneName; + + // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) { + if ( (data = cache[1]) === true || data === cachedruns ) { + return data === true; + } + } else { + cache = outerCache[ dir ] = [ dirkey ]; + cache[1] = matcher( elem, context, xml ) || cachedruns; + if ( cache[1] === true ) { + return true; + } + } + } + } + } + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf.call( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + return ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + // A counter to specify which element is currently being matched + var matcherCachedRuns = 0, + bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, expandContext ) { + var elem, j, matcher, + setMatched = [], + matchedCount = 0, + i = "0", + unmatched = seed && [], + outermost = expandContext != null, + contextBackup = outermostContext, + // We must always have either seed elements or context + elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1); + + if ( outermost ) { + outermostContext = context !== document && context; + cachedruns = matcherCachedRuns; + } + + // Add elements passing elementMatchers directly to results + // Keep `i` a string if there are no elements so `matchedCount` will be "00" below + for ( ; (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + cachedruns = ++matcherCachedRuns; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // Apply set filters to unmatched elements + matchedCount += i; + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !group ) { + group = tokenize( selector ); + } + i = group.length; + while ( i-- ) { + cached = matcherFromTokens( group[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + } + return cached; +}; + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function select( selector, context, results, seed ) { + var i, tokens, token, type, find, + match = tokenize( selector ); + + if ( !seed ) { + // Try to minimize operations if there is only one group + if ( match.length === 1 ) { + + // Take a shortcut and set the context if the root selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + support.getById && context.nodeType === 9 && documentIsHTML && + Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + } + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && context.parentNode || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + } + + // Compile and execute a filtering function + // Provide `match` to avoid retokenization if we modified the selector above + compile( selector, match )( + seed, + context, + !documentIsHTML, + results, + rsibling.test( selector ) + ); + return results; +} + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome<14 +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( div1 ) { + // Should return 1, but returns 4 (following) + return div1.compareDocumentPosition( document.createElement("div") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( div ) { + div.innerHTML = "<a href='#'></a>"; + return div.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( div ) { + div.innerHTML = "<input/>"; + div.firstChild.setAttribute( "value", "" ); + return div.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( div ) { + return div.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + elem[ name ] === true ? name.toLowerCase() : null; + } + }); +} + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.pseudos; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + +})( window ); +// String to Object options format cache +var optionsCache = {}; + +// Convert String-formatted options into Object-formatted ones and store in cache +function createOptions( options ) { + var object = optionsCache[ options ] = {}; + jQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) { + object[ flag ] = true; + }); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + ( optionsCache[ options ] || createOptions( options ) ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + // Last fire value (for non-forgettable lists) + memory, + // Flag to know if list was already fired + fired, + // End of the loop when firing + firingLength, + // Index of currently firing callback (modified by remove if needed) + firingIndex, + // First callback to fire (used internally by add and fireWith) + firingStart, + // Actual callback list + list = [], + // Stack of fire calls for repeatable lists + stack = !options.once && [], + // Fire callbacks + fire = function( data ) { + memory = options.memory && data; + fired = true; + firingIndex = firingStart || 0; + firingStart = 0; + firingLength = list.length; + firing = true; + for ( ; list && firingIndex < firingLength; firingIndex++ ) { + if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { + memory = false; // To prevent further calls using add + break; + } + } + firing = false; + if ( list ) { + if ( stack ) { + if ( stack.length ) { + fire( stack.shift() ); + } + } else if ( memory ) { + list = []; + } else { + self.disable(); + } + } + }, + // Actual Callbacks object + self = { + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + // First, we save the current length + var start = list.length; + (function add( args ) { + jQuery.each( args, function( _, arg ) { + var type = jQuery.type( arg ); + if ( type === "function" ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && type !== "string" ) { + // Inspect recursively + add( arg ); + } + }); + })( arguments ); + // Do we need to add the callbacks to the + // current firing batch? + if ( firing ) { + firingLength = list.length; + // With memory, if we're not firing then + // we should call right away + } else if ( memory ) { + firingStart = start; + fire( memory ); + } + } + return this; + }, + // Remove a callback from the list + remove: function() { + if ( list ) { + jQuery.each( arguments, function( _, arg ) { + var index; + while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + // Handle firing indexes + if ( firing ) { + if ( index <= firingLength ) { + firingLength--; + } + if ( index <= firingIndex ) { + firingIndex--; + } + } + } + }); + } + return this; + }, + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); + }, + // Remove all callbacks from the list + empty: function() { + list = []; + firingLength = 0; + return this; + }, + // Have the list do nothing anymore + disable: function() { + list = stack = memory = undefined; + return this; + }, + // Is it disabled? + disabled: function() { + return !list; + }, + // Lock the list in its current state + lock: function() { + stack = undefined; + if ( !memory ) { + self.disable(); + } + return this; + }, + // Is it locked? + locked: function() { + return !stack; + }, + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( list && ( !fired || stack ) ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + if ( firing ) { + stack.push( args ); + } else { + fire( args ); + } + } + return this; + }, + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; +jQuery.extend({ + + Deferred: function( func ) { + var tuples = [ + // action, add listener, listener list, final state + [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], + [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], + [ "notify", "progress", jQuery.Callbacks("memory") ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + then: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + return jQuery.Deferred(function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + var action = tuple[ 0 ], + fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; + // deferred[ done | fail | progress ] for forwarding actions to newDefer + deferred[ tuple[1] ](function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .done( newDefer.resolve ) + .fail( newDefer.reject ) + .progress( newDefer.notify ); + } else { + newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); + } + }); + }); + fns = null; + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 3 ]; + + // promise[ done | fail | progress ] = list.add + promise[ tuple[1] ] = list.add; + + // Handle state + if ( stateString ) { + list.add(function() { + // state = [ resolved | rejected ] + state = stateString; + + // [ reject_list | resolve_list ].disable; progress_list.lock + }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); + } + + // deferred[ resolve | reject | notify ] + deferred[ tuple[0] ] = function() { + deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); + return this; + }; + deferred[ tuple[0] + "With" ] = list.fireWith; + }); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( subordinate /* , ..., subordinateN */ ) { + var i = 0, + resolveValues = core_slice.call( arguments ), + length = resolveValues.length, + + // the count of uncompleted subordinates + remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + + // the master Deferred. If resolveValues consist of only a single Deferred, just use that. + deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + + // Update function for both resolve and progress values + updateFunc = function( i, contexts, values ) { + return function( value ) { + contexts[ i ] = this; + values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value; + if( values === progressValues ) { + deferred.notifyWith( contexts, values ); + } else if ( !( --remaining ) ) { + deferred.resolveWith( contexts, values ); + } + }; + }, + + progressValues, progressContexts, resolveContexts; + + // add listeners to Deferred subordinates; treat others as resolved + if ( length > 1 ) { + progressValues = new Array( length ); + progressContexts = new Array( length ); + resolveContexts = new Array( length ); + for ( ; i < length; i++ ) { + if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { + resolveValues[ i ].promise() + .done( updateFunc( i, resolveContexts, resolveValues ) ) + .fail( deferred.reject ) + .progress( updateFunc( i, progressContexts, progressValues ) ); + } else { + --remaining; + } + } + } + + // if we're not waiting on anything, resolve the master + if ( !remaining ) { + deferred.resolveWith( resolveContexts, resolveValues ); + } + + return deferred.promise(); + } +}); +jQuery.support = (function( support ) { + + var all, a, input, select, fragment, opt, eventName, isSupported, i, + div = document.createElement("div"); + + // Setup + div.setAttribute( "className", "t" ); + div.innerHTML = " <link/><table></table><a href='/a'>a</a><input type='checkbox'/>"; + + // Finish early in limited (non-browser) environments + all = div.getElementsByTagName("*") || []; + a = div.getElementsByTagName("a")[ 0 ]; + if ( !a || !a.style || !all.length ) { + return support; + } + + // First batch of tests + select = document.createElement("select"); + opt = select.appendChild( document.createElement("option") ); + input = div.getElementsByTagName("input")[ 0 ]; + + a.style.cssText = "top:1px;float:left;opacity:.5"; + + // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) + support.getSetAttribute = div.className !== "t"; + + // IE strips leading whitespace when .innerHTML is used + support.leadingWhitespace = div.firstChild.nodeType === 3; + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + support.tbody = !div.getElementsByTagName("tbody").length; + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + support.htmlSerialize = !!div.getElementsByTagName("link").length; + + // Get the style information from getAttribute + // (IE uses .cssText instead) + support.style = /top/.test( a.getAttribute("style") ); + + // Make sure that URLs aren't manipulated + // (IE normalizes it by default) + support.hrefNormalized = a.getAttribute("href") === "/a"; + + // Make sure that element opacity exists + // (IE uses filter instead) + // Use a regex to work around a WebKit issue. See #5145 + support.opacity = /^0.5/.test( a.style.opacity ); + + // Verify style float existence + // (IE uses styleFloat instead of cssFloat) + support.cssFloat = !!a.style.cssFloat; + + // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere) + support.checkOn = !!input.value; + + // Make sure that a selected-by-default option has a working selected property. + // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) + support.optSelected = opt.selected; + + // Tests for enctype support on a form (#6743) + support.enctype = !!document.createElement("form").enctype; + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + support.html5Clone = document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>"; + + // Will be defined later + support.inlineBlockNeedsLayout = false; + support.shrinkWrapBlocks = false; + support.pixelPosition = false; + support.deleteExpando = true; + support.noCloneEvent = true; + support.reliableMarginRight = true; + support.boxSizingReliable = true; + + // Make sure checked status is properly cloned + input.checked = true; + support.noCloneChecked = input.cloneNode( true ).checked; + + // Make sure that the options inside disabled selects aren't marked as disabled + // (WebKit marks them as disabled) + select.disabled = true; + support.optDisabled = !opt.disabled; + + // Support: IE<9 + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + + // Check if we can trust getAttribute("value") + input = document.createElement("input"); + input.setAttribute( "value", "" ); + support.input = input.getAttribute( "value" ) === ""; + + // Check if an input maintains its value after becoming a radio + input.value = "t"; + input.setAttribute( "type", "radio" ); + support.radioValue = input.value === "t"; + + // #11217 - WebKit loses check when the name is after the checked attribute + input.setAttribute( "checked", "t" ); + input.setAttribute( "name", "t" ); + + fragment = document.createDocumentFragment(); + fragment.appendChild( input ); + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + support.appendChecked = input.checked; + + // WebKit doesn't clone checked state correctly in fragments + support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE<9 + // Opera does not clone events (and typeof div.attachEvent === undefined). + // IE9-10 clones events bound via attachEvent, but they don't trigger with .click() + if ( div.attachEvent ) { + div.attachEvent( "onclick", function() { + support.noCloneEvent = false; + }); + + div.cloneNode( true ).click(); + } + + // Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event) + // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) + for ( i in { submit: true, change: true, focusin: true }) { + div.setAttribute( eventName = "on" + i, "t" ); + + support[ i + "Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false; + } + + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + // Support: IE<9 + // Iteration over object's inherited properties before its own. + for ( i in jQuery( support ) ) { + break; + } + support.ownLast = i !== "0"; + + // Run tests that need a body at doc ready + jQuery(function() { + var container, marginDiv, tds, + divReset = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;", + body = document.getElementsByTagName("body")[0]; + + if ( !body ) { + // Return for frameset docs that don't have a body + return; + } + + container = document.createElement("div"); + container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px"; + + body.appendChild( container ).appendChild( div ); + + // Support: IE8 + // Check if table cells still have offsetWidth/Height when they are set + // to display:none and there are still other visible table cells in a + // table row; if so, offsetWidth/Height are not reliable for use when + // determining if an element has been hidden directly using + // display:none (it is still safe to use offsets if a parent element is + // hidden; don safety goggles and see bug #4512 for more information). + div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>"; + tds = div.getElementsByTagName("td"); + tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none"; + isSupported = ( tds[ 0 ].offsetHeight === 0 ); + + tds[ 0 ].style.display = ""; + tds[ 1 ].style.display = "none"; + + // Support: IE8 + // Check if empty table cells still have offsetWidth/Height + support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); + + // Check box-sizing and margin behavior. + div.innerHTML = ""; + div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;"; + + // Workaround failing boxSizing test due to offsetWidth returning wrong value + // with some non-1 values of body zoom, ticket #13543 + jQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() { + support.boxSizing = div.offsetWidth === 4; + }); + + // Use window.getComputedStyle because jsdom on node.js will break without it. + if ( window.getComputedStyle ) { + support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%"; + support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px"; + + // Check if div with explicit width and no margin-right incorrectly + // gets computed margin-right based on width of container. (#3333) + // Fails in WebKit before Feb 2011 nightlies + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + marginDiv = div.appendChild( document.createElement("div") ); + marginDiv.style.cssText = div.style.cssText = divReset; + marginDiv.style.marginRight = marginDiv.style.width = "0"; + div.style.width = "1px"; + + support.reliableMarginRight = + !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight ); + } + + if ( typeof div.style.zoom !== core_strundefined ) { + // Support: IE<8 + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + div.innerHTML = ""; + div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1"; + support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 ); + + // Support: IE6 + // Check if elements with layout shrink-wrap their children + div.style.display = "block"; + div.innerHTML = "<div></div>"; + div.firstChild.style.width = "5px"; + support.shrinkWrapBlocks = ( div.offsetWidth !== 3 ); + + if ( support.inlineBlockNeedsLayout ) { + // Prevent IE 6 from affecting layout for positioned elements #11048 + // Prevent IE from shrinking the body in IE 7 mode #12869 + // Support: IE<8 + body.style.zoom = 1; + } + } + + body.removeChild( container ); + + // Null elements to avoid leaks in IE + container = div = tds = marginDiv = null; + }); + + // Null elements to avoid leaks in IE + all = select = fragment = opt = a = input = null; + + return support; +})({}); + +var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/, + rmultiDash = /([A-Z])/g; + +function internalData( elem, name, data, pvt /* Internal Use Only */ ){ + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var ret, thisCache, + internalKey = jQuery.expando, + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + id = elem[ internalKey ] = core_deletedIds.pop() || jQuery.guid++; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + // Avoid exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + cache[ id ] = isNode ? {} : { toJSON: jQuery.noop }; + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( typeof name === "string" ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; +} + +function internalRemoveData( elem, name, pvt ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, i, + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split(" "); + } + } + } else { + // If "name" is an array of keys... + // When data is initially created, via ("key", "val") signature, + // keys will be converted to camelCase. + // Since there is no way to tell _how_ a key was added, remove + // both plain key and camelCase key. #12786 + // This will only penalize the array argument path. + name = name.concat( jQuery.map( name, jQuery.camelCase ) ); + } + + i = name.length; + while ( i-- ) { + delete thisCache[ name[i] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject( cache[ id ] ) ) { + return; + } + } + + // Destroy the cache + if ( isNode ) { + jQuery.cleanData( [ elem ], true ); + + // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) + /* jshint eqeqeq: false */ + } else if ( jQuery.support.deleteExpando || cache != cache.window ) { + /* jshint eqeqeq: true */ + delete cache[ id ]; + + // When all else fails, null + } else { + cache[ id ] = null; + } +} + +jQuery.extend({ + cache: {}, + + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "applet": true, + "embed": true, + // Ban all objects except for Flash (which handle expandos) + "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data ) { + return internalData( elem, name, data ); + }, + + removeData: function( elem, name ) { + return internalRemoveData( elem, name ); + }, + + // For internal use only. + _data: function( elem, name, data ) { + return internalData( elem, name, data, true ); + }, + + _removeData: function( elem, name ) { + return internalRemoveData( elem, name, true ); + }, + + // A method for determining if a DOM node can handle the data expando + acceptData: function( elem ) { + // Do not set data on non-element because it will not be cleared (#8335). + if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) { + return false; + } + + var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ]; + + // nodes accept data unless otherwise specified; rejection can be conditional + return !noData || noData !== true && elem.getAttribute("classid") === noData; + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var attrs, name, + data = null, + i = 0, + elem = this[0]; + + // Special expections of .data basically thwart jQuery.access, + // so implement the relevant behavior ourselves + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = jQuery.data( elem ); + + if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { + attrs = elem.attributes; + for ( ; i < attrs.length; i++ ) { + name = attrs[i].name; + + if ( name.indexOf("data-") === 0 ) { + name = jQuery.camelCase( name.slice(5) ); + + dataAttr( elem, name, data[ name ] ); + } + } + jQuery._data( elem, "parsedAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + return arguments.length > 1 ? + + // Sets one value + this.each(function() { + jQuery.data( this, key, value ); + }) : + + // Gets one value + // Try to fetch any internally stored data first + elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null; + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + // Only convert to a number if it doesn't change the string + +data + "" === data ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + var name; + for ( name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} +jQuery.extend({ + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || jQuery.isArray(data) ) { + queue = jQuery._data( elem, type, jQuery.makeArray(data) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // not intended for public consumption - generates a queueHooks object, or returns the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return jQuery._data( elem, key ) || jQuery._data( elem, key, { + empty: jQuery.Callbacks("once memory").add(function() { + jQuery._removeData( elem, type + "queue" ); + jQuery._removeData( elem, key ); + }) + }); + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[0], type ); + } + + return data === undefined ? + this : + this.each(function() { + var queue = jQuery.queue( this, type, data ); + + // ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + // Based off of the plugin by Clint Helfers, with permission. + // http://blindsignals.com/index.php/2009/07/jquery-delay/ + delay: function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = setTimeout( next, time ); + hooks.stop = function() { + clearTimeout( timeout ); + }; + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while( i-- ) { + tmp = jQuery._data( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +}); +var nodeHook, boolHook, + rclass = /[\t\r\n\f]/g, + rreturn = /\r/g, + rfocusable = /^(?:input|select|textarea|button|object)$/i, + rclickable = /^(?:a|area)$/i, + ruseDefault = /^(?:checked|selected)$/i, + getSetAttribute = jQuery.support.getSetAttribute, + getSetInput = jQuery.support.input; + +jQuery.fn.extend({ + attr: function( name, value ) { + return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each(function() { + jQuery.removeAttr( this, name ); + }); + }, + + prop: function( name, value ) { + return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + name = jQuery.propFix[ name ] || name; + return this.each(function() { + // try/catch handles cases where IE balks (such as removing a property on window) + try { + this[ name ] = undefined; + delete this[ name ]; + } catch( e ) {} + }); + }, + + addClass: function( value ) { + var classes, elem, cur, clazz, j, + i = 0, + len = this.length, + proceed = typeof value === "string" && value; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).addClass( value.call( this, j, this.className ) ); + }); + } + + if ( proceed ) { + // The disjunction here is for better compressibility (see removeClass) + classes = ( value || "" ).match( core_rnotwhite ) || []; + + for ( ; i < len; i++ ) { + elem = this[ i ]; + cur = elem.nodeType === 1 && ( elem.className ? + ( " " + elem.className + " " ).replace( rclass, " " ) : + " " + ); + + if ( cur ) { + j = 0; + while ( (clazz = classes[j++]) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + elem.className = jQuery.trim( cur ); + + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, clazz, j, + i = 0, + len = this.length, + proceed = arguments.length === 0 || typeof value === "string" && value; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).removeClass( value.call( this, j, this.className ) ); + }); + } + if ( proceed ) { + classes = ( value || "" ).match( core_rnotwhite ) || []; + + for ( ; i < len; i++ ) { + elem = this[ i ]; + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( elem.className ? + ( " " + elem.className + " " ).replace( rclass, " " ) : + "" + ); + + if ( cur ) { + j = 0; + while ( (clazz = classes[j++]) ) { + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) >= 0 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + elem.className = value ? jQuery.trim( cur ) : ""; + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value; + + if ( typeof stateVal === "boolean" && type === "string" ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( jQuery.isFunction( value ) ) { + return this.each(function( i ) { + jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); + }); + } + + return this.each(function() { + if ( type === "string" ) { + // toggle individual class names + var className, + i = 0, + self = jQuery( this ), + classNames = value.match( core_rnotwhite ) || []; + + while ( (className = classNames[ i++ ]) ) { + // check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( type === core_strundefined || type === "boolean" ) { + if ( this.className ) { + // store className if set + jQuery._data( this, "__className__", this.className ); + } + + // If the element has a class name or if we're passed "false", + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; + } + }); + }, + + hasClass: function( selector ) { + var className = " " + selector + " ", + i = 0, + l = this.length; + for ( ; i < l; i++ ) { + if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) { + return true; + } + } + + return false; + }, + + val: function( value ) { + var ret, hooks, isFunction, + elem = this[0]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { + return ret; + } + + ret = elem.value; + + return typeof ret === "string" ? + // handle most common string cases + ret.replace(rreturn, "") : + // handle cases where value is null/undef or number + ret == null ? "" : ret; + } + + return; + } + + isFunction = jQuery.isFunction( value ); + + return this.each(function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + } else if ( typeof val === "number" ) { + val += ""; + } else if ( jQuery.isArray( val ) ) { + val = jQuery.map(val, function ( value ) { + return value == null ? "" : value + ""; + }); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + }); + } +}); + +jQuery.extend({ + valHooks: { + option: { + get: function( elem ) { + // Use proper attribute retrieval(#6932, #12072) + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + elem.text; + } + }, + select: { + get: function( elem ) { + var value, option, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one" || index < 0, + values = one ? null : [], + max = one ? index + 1 : options.length, + i = index < 0 ? + max : + one ? index : 0; + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // oldIE doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + // Don't return options that are disabled or in a disabled optgroup + ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) && + ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + if ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) { + optionSet = true; + } + } + + // force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + }, + + attr: function( elem, name, value ) { + var hooks, ret, + nType = elem.nodeType; + + // don't get/set attributes on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === core_strundefined ) { + return jQuery.prop( elem, name, value ); + } + + // All attributes are lowercase + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + name = name.toLowerCase(); + hooks = jQuery.attrHooks[ name ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook ); + } + + if ( value !== undefined ) { + + if ( value === null ) { + jQuery.removeAttr( elem, name ); + + } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + elem.setAttribute( name, value + "" ); + return value; + } + + } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? + undefined : + ret; + } + }, + + removeAttr: function( elem, value ) { + var name, propName, + i = 0, + attrNames = value && value.match( core_rnotwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( (name = attrNames[i++]) ) { + propName = jQuery.propFix[ name ] || name; + + // Boolean attributes get special treatment (#10870) + if ( jQuery.expr.match.bool.test( name ) ) { + // Set corresponding property to false + if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) { + elem[ propName ] = false; + // Support: IE<9 + // Also clear defaultChecked/defaultSelected (if appropriate) + } else { + elem[ jQuery.camelCase( "default-" + name ) ] = + elem[ propName ] = false; + } + + // See #9699 for explanation of this approach (setting first, then removal) + } else { + jQuery.attr( elem, name, "" ); + } + + elem.removeAttribute( getSetAttribute ? name : propName ); + } + } + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { + // Setting the type on a radio button after the value resets the value in IE6-9 + // Reset value to default in case type is set after value during creation + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + }, + + prop: function( elem, name, value ) { + var ret, hooks, notxml, + nType = elem.nodeType; + + // don't get/set properties on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + if ( notxml ) { + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ? + ret : + ( elem[ name ] = value ); + + } else { + return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ? + ret : + elem[ name ]; + } + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + return tabindex ? + parseInt( tabindex, 10 ) : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + -1; + } + } + } +}); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) { + // IE<8 needs the *property* name + elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name ); + + // Use defaultChecked and defaultSelected for oldIE + } else { + elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true; + } + + return name; + } +}; +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { + var getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr; + + jQuery.expr.attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ? + function( elem, name, isXML ) { + var fn = jQuery.expr.attrHandle[ name ], + ret = isXML ? + undefined : + /* jshint eqeqeq: false */ + (jQuery.expr.attrHandle[ name ] = undefined) != + getter( elem, name, isXML ) ? + + name.toLowerCase() : + null; + jQuery.expr.attrHandle[ name ] = fn; + return ret; + } : + function( elem, name, isXML ) { + return isXML ? + undefined : + elem[ jQuery.camelCase( "default-" + name ) ] ? + name.toLowerCase() : + null; + }; +}); + +// fix oldIE attroperties +if ( !getSetInput || !getSetAttribute ) { + jQuery.attrHooks.value = { + set: function( elem, value, name ) { + if ( jQuery.nodeName( elem, "input" ) ) { + // Does not return so that setAttribute is also used + elem.defaultValue = value; + } else { + // Use nodeHook if defined (#1954); otherwise setAttribute is fine + return nodeHook && nodeHook.set( elem, value, name ); + } + } + }; +} + +// IE6/7 do not support getting/setting some attributes with get/setAttribute +if ( !getSetAttribute ) { + + // Use this for any attribute in IE6/7 + // This fixes almost every IE6/7 issue + nodeHook = { + set: function( elem, value, name ) { + // Set the existing or create a new attribute node + var ret = elem.getAttributeNode( name ); + if ( !ret ) { + elem.setAttributeNode( + (ret = elem.ownerDocument.createAttribute( name )) + ); + } + + ret.value = value += ""; + + // Break association with cloned elements by also using setAttribute (#9646) + return name === "value" || value === elem.getAttribute( name ) ? + value : + undefined; + } + }; + jQuery.expr.attrHandle.id = jQuery.expr.attrHandle.name = jQuery.expr.attrHandle.coords = + // Some attributes are constructed with empty-string values when not defined + function( elem, name, isXML ) { + var ret; + return isXML ? + undefined : + (ret = elem.getAttributeNode( name )) && ret.value !== "" ? + ret.value : + null; + }; + jQuery.valHooks.button = { + get: function( elem, name ) { + var ret = elem.getAttributeNode( name ); + return ret && ret.specified ? + ret.value : + undefined; + }, + set: nodeHook.set + }; + + // Set contenteditable to false on removals(#10429) + // Setting to empty string throws an error as an invalid value + jQuery.attrHooks.contenteditable = { + set: function( elem, value, name ) { + nodeHook.set( elem, value === "" ? false : value, name ); + } + }; + + // Set width and height to auto instead of 0 on empty string( Bug #8150 ) + // This is for removals + jQuery.each([ "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = { + set: function( elem, value ) { + if ( value === "" ) { + elem.setAttribute( name, "auto" ); + return value; + } + } + }; + }); +} + + +// Some attributes require a special call on IE +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !jQuery.support.hrefNormalized ) { + // href/src property should get the full normalized URL (#10299/#12915) + jQuery.each([ "href", "src" ], function( i, name ) { + jQuery.propHooks[ name ] = { + get: function( elem ) { + return elem.getAttribute( name, 4 ); + } + }; + }); +} + +if ( !jQuery.support.style ) { + jQuery.attrHooks.style = { + get: function( elem ) { + // Return undefined in the case of empty string + // Note: IE uppercases css property names, but if we were to .toLowerCase() + // .cssText, that would destroy case senstitivity in URL's, like in "background" + return elem.style.cssText || undefined; + }, + set: function( elem, value ) { + return ( elem.style.cssText = value + "" ); + } + }; +} + +// Safari mis-reports the default selected property of an option +// Accessing the parent's selectedIndex property fixes it +if ( !jQuery.support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + var parent = elem.parentNode; + + if ( parent ) { + parent.selectedIndex; + + // Make sure that it also works with optgroups, see #5701 + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + return null; + } + }; +} + +jQuery.each([ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +}); + +// IE6/7 call enctype encoding +if ( !jQuery.support.enctype ) { + jQuery.propFix.enctype = "encoding"; +} + +// Radios and checkboxes getter/setter +jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( jQuery.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); + } + } + }; + if ( !jQuery.support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + // Support: Webkit + // "" is returned instead of "on" if a value isn't specified + return elem.getAttribute("value") === null ? "on" : elem.value; + }; + } +}); +var rformElems = /^(?:input|select|textarea)$/i, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|contextmenu)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + var tmp, events, t, handleObjIn, + special, eventHandle, handleObj, + handlers, type, namespaces, origType, + elemData = jQuery._data( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !(events = elemData.events) ) { + events = elemData.events = {}; + } + if ( !(eventHandle = elemData.handle) ) { + eventHandle = elemData.handle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( core_rnotwhite ) || [""]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join(".") + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !(handlers = events[ type ]) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + var j, handleObj, tmp, + origCount, t, events, + special, handlers, type, + namespaces, origType, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ); + + if ( !elemData || !(events = elemData.events) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( core_rnotwhite ) || [""]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + delete elemData.handle; + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery._removeData( elem, "events" ); + } + }, + + trigger: function( event, data, elem, onlyHandlers ) { + var handle, ontype, cur, + bubbleType, special, tmp, i, + eventPath = [ elem || document ], + type = core_hasOwn.call( event, "type" ) ? event.type : event, + namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf(".") >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf(":") < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join("."); + event.namespace_re = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === (elem.ownerDocument || document) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) { + event.preventDefault(); + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && + jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + try { + elem[ type ](); + } catch ( e ) { + // IE<9 dies on focus/blur to hidden element (#1486,#12518) + // only reproducible on winXP IE8 native, not IE9 in IE8 mode + } + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event ); + + var i, ret, handleObj, matched, j, + handlerQueue = [], + args = core_slice.call( arguments ), + handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). + if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) + .apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( (event.result = ret) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var sel, handleObj, matches, i, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + // Black-hole SVG <use> instance trees (#13180) + // Avoid non-left-click bubbling in Firefox (#3861) + if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { + + /* jshint eqeqeq: false */ + for ( ; cur != this; cur = cur.parentNode || this ) { + /* jshint eqeqeq: true */ + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) { + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matches[ sel ] === undefined ) { + matches[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) >= 0 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matches[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push({ elem: cur, handlers: matches }); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( delegateCount < handlers.length ) { + handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); + } + + return handlerQueue; + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, copy, + type = event.type, + originalEvent = event, + fixHook = this.fixHooks[ type ]; + + if ( !fixHook ) { + this.fixHooks[ type ] = fixHook = + rmouseEvent.test( type ) ? this.mouseHooks : + rkeyEvent.test( type ) ? this.keyHooks : + {}; + } + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = new jQuery.Event( originalEvent ); + + i = copy.length; + while ( i-- ) { + prop = copy[ i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Support: IE<9 + // Fix target property (#1925) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Support: Chrome 23+, Safari? + // Target should not be a text node (#504, #13143) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Support: IE<9 + // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) + event.metaKey = !!event.metaKey; + + return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + filter: function( event, original ) { + var body, eventDoc, doc, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + special: { + load: { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + try { + this.focus(); + return false; + } catch ( e ) { + // Support: IE<9 + // If we error on focus to hidden element (#1486, #12518), + // let .trigger() run the handlers + } + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return jQuery.nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Even when returnValue equals to undefined Firefox will still show alert + if ( event.result !== undefined ) { + event.originalEvent.returnValue = event.result; + } + } + } + }, + + simulate: function( type, elem, event, bubble ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true, + originalEvent: {} + } + ); + if ( bubble ) { + jQuery.event.trigger( e, null, elem ); + } else { + jQuery.event.dispatch.call( elem, e ); + } + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + var name = "on" + type; + + if ( elem.detachEvent ) { + + // #8545, #7054, preventing memory leaks for custom events in IE6-8 + // detachEvent needed property on element, by name of that event, to properly expose it to GC + if ( typeof elem[ name ] === core_strundefined ) { + elem[ name ] = null; + } + + elem.detachEvent( name, handle ); + } + }; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !(this instanceof jQuery.Event) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || + src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + if ( !e ) { + return; + } + + // If preventDefault exists, run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // Support: IE + // Otherwise set the returnValue property of the original event to false + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + if ( !e ) { + return; + } + // If stopPropagation exists, run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + + // Support: IE + // Set the cancelBubble property of the original event to true + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + } +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || (related !== target && !jQuery.contains( target, related )) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +}); + +// IE submit delegation +if ( !jQuery.support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; + if ( form && !jQuery._data( form, "submitBubbles" ) ) { + jQuery.event.add( form, "submit._submit", function( event ) { + event._submit_bubble = true; + }); + jQuery._data( form, "submitBubbles", true ); + } + }); + // return undefined since we don't need an event listener + }, + + postDispatch: function( event ) { + // If form was submitted by the user, bubble the event up the tree + if ( event._submit_bubble ) { + delete event._submit_bubble; + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event, true ); + } + } + }, + + teardown: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !jQuery.support.changeBubbles ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._just_changed = true; + } + }); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._just_changed && !event.isTrigger ) { + this._just_changed = false; + } + // Allow triggered, simulated change events (#11500) + jQuery.event.simulate( "change", this, event, true ); + }); + } + return false; + } + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event, true ); + } + }); + jQuery._data( elem, "changeBubbles", true ); + } + }); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return !rformElems.test( this.nodeName ); + } + }; +} + +// Create "bubbling" focus and blur events +if ( !jQuery.support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler while someone wants focusin/focusout + var attaches = 0, + handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + if ( attaches++ === 0 ) { + document.addEventListener( orig, handler, true ); + } + }, + teardown: function() { + if ( --attaches === 0 ) { + document.removeEventListener( orig, handler, true ); + } + } + }; + }); +} + +jQuery.fn.extend({ + + on: function( types, selector, data, fn, /*INTERNAL*/ one ) { + var type, origFn; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + this.on( type, selector, data, types[ type ], one ); + } + return this; + } + + if ( data == null && fn == null ) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return this; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return this.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + }); + }, + one: function( types, selector, data, fn ) { + return this.on( types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each(function() { + jQuery.event.remove( this, types, fn, selector ); + }); + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + triggerHandler: function( type, data ) { + var elem = this[0]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +}); +var isSimple = /^.[^:#\[\.,]*$/, + rparentsprev = /^(?:parents|prev(?:Until|All))/, + rneedsContext = jQuery.expr.match.needsContext, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend({ + find: function( selector ) { + var i, + ret = [], + self = this, + len = self.length; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter(function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }) ); + } + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + // Needed because $( selector, context ) becomes $( context ).find( selector ) + ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); + ret.selector = this.selector ? this.selector + " " + selector : selector; + return ret; + }, + + has: function( target ) { + var i, + targets = jQuery( target, this ), + len = targets.length; + + return this.filter(function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + not: function( selector ) { + return this.pushStack( winnow(this, selector || [], true) ); + }, + + filter: function( selector ) { + return this.pushStack( winnow(this, selector || [], false) ); + }, + + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + ret = [], + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( ; i < l; i++ ) { + for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { + // Always skip document fragments + if ( cur.nodeType < 11 && (pos ? + pos.index(cur) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector(cur, selectors)) ) { + + cur = ret.push( cur ); + break; + } + } + } + + return this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[0], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + var set = typeof selector === "string" ? + jQuery( selector, context ) : + jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), + all = jQuery.merge( this.get(), set ); + + return this.pushStack( jQuery.unique(all) ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter(selector) + ); + } +}); + +function sibling( cur, dir ) { + do { + cur = cur[ dir ]; + } while ( cur && cur.nodeType !== 1 ); + + return cur; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + if ( this.length > 1 ) { + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + ret = jQuery.unique( ret ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + } + + return this.pushStack( ret ); + }; +}); + +jQuery.extend({ + filter: function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 && elem.nodeType === 1 ? + jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : + jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + })); + }, + + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + /* jshint -W018 */ + return !!qualifier.call( elem, i, elem ) !== not; + }); + + } + + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + }); + + } + + if ( typeof qualifier === "string" ) { + if ( isSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + qualifier = jQuery.filter( qualifier, elements ); + } + + return jQuery.grep( elements, function( elem ) { + return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not; + }); +} +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + +var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", + rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, + rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"), + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, + rtagName = /<([\w:]+)/, + rtbody = /<tbody/i, + rhtml = /<|&#?\w+;/, + rnoInnerhtml = /<(?:script|style|link)/i, + manipulation_rcheckableType = /^(?:checkbox|radio)$/i, + // checked="checked" or checked + rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, + rscriptType = /^$|\/(?:java|ecma)script/i, + rscriptTypeMasked = /^true\/(.*)/, + rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g, + + // We have to close these tags to support XHTML (#13200) + wrapMap = { + option: [ 1, "<select multiple='multiple'>", "</select>" ], + legend: [ 1, "<fieldset>", "</fieldset>" ], + area: [ 1, "<map>", "</map>" ], + param: [ 1, "<object>", "</object>" ], + thead: [ 1, "<table>", "</table>" ], + tr: [ 2, "<table><tbody>", "</tbody></table>" ], + col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ], + td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ], + + // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, + // unless wrapped in a div with non-breaking characters in front of it. + _default: jQuery.support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>" ] + }, + safeFragment = createSafeFragment( document ), + fragmentDiv = safeFragment.appendChild( document.createElement("div") ); + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +jQuery.fn.extend({ + text: function( value ) { + return jQuery.access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) ); + }, null, value, arguments.length ); + }, + + append: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + }); + }, + + prepend: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + }); + }, + + before: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + }); + }, + + after: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + }); + }, + + // keepData is for internal use only--do not document + remove: function( selector, keepData ) { + var elem, + elems = selector ? jQuery.filter( selector, this ) : this, + i = 0; + + for ( ; (elem = elems[i]) != null; i++ ) { + + if ( !keepData && elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem ) ); + } + + if ( elem.parentNode ) { + if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { + setGlobalEval( getAll( elem, "script" ) ); + } + elem.parentNode.removeChild( elem ); + } + } + + return this; + }, + + empty: function() { + var elem, + i = 0; + + for ( ; (elem = this[i]) != null; i++ ) { + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + } + + // Remove any remaining nodes + while ( elem.firstChild ) { + elem.removeChild( elem.firstChild ); + } + + // If this is a select, ensure that it displays empty (#12336) + // Support: IE<9 + if ( elem.options && jQuery.nodeName( elem, "select" ) ) { + elem.options.length = 0; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function () { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + }); + }, + + html: function( value ) { + return jQuery.access( this, function( value ) { + var elem = this[0] || {}, + i = 0, + l = this.length; + + if ( value === undefined ) { + return elem.nodeType === 1 ? + elem.innerHTML.replace( rinlinejQuery, "" ) : + undefined; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + ( jQuery.support.htmlSerialize || !rnoshimcache.test( value ) ) && + ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && + !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) { + + value = value.replace( rxhtmlTag, "<$1></$2>" ); + + try { + for (; i < l; i++ ) { + // Remove element nodes and prevent memory leaks + elem = this[i] || {}; + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch(e) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var + // Snapshot the DOM in case .domManip sweeps something relevant into its fragment + args = jQuery.map( this, function( elem ) { + return [ elem.nextSibling, elem.parentNode ]; + }), + i = 0; + + // Make the changes, replacing each context element with the new content + this.domManip( arguments, function( elem ) { + var next = args[ i++ ], + parent = args[ i++ ]; + + if ( parent ) { + // Don't use the snapshot next if it has moved (#13810) + if ( next && next.parentNode !== parent ) { + next = this.nextSibling; + } + jQuery( this ).remove(); + parent.insertBefore( elem, next ); + } + // Allow new content to include elements from the context set + }, true ); + + // Force removal if there was no new content (e.g., from empty arguments) + return i ? this : this.remove(); + }, + + detach: function( selector ) { + return this.remove( selector, true ); + }, + + domManip: function( args, callback, allowIntersection ) { + + // Flatten any nested arrays + args = core_concat.apply( [], args ); + + var first, node, hasScripts, + scripts, doc, fragment, + i = 0, + l = this.length, + set = this, + iNoClone = l - 1, + value = args[0], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) { + return this.each(function( index ) { + var self = set.eq( index ); + if ( isFunction ) { + args[0] = value.call( this, index, self.html() ); + } + self.domManip( args, callback, allowIntersection ); + }); + } + + if ( l ) { + fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + if ( first ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( this[i], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) { + + if ( node.src ) { + // Hope ajax is available... + jQuery._evalUrl( node.src ); + } else { + jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) ); + } + } + } + } + + // Fix #11809: Avoid leaking memory + fragment = first = null; + } + } + + return this; + } +}); + +// Support: IE<8 +// Manipulating tables requires a tbody +function manipulationTarget( elem, content ) { + return jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType === 1 ? content : content.firstChild, "tr" ) ? + + elem.getElementsByTagName("tbody")[0] || + elem.appendChild( elem.ownerDocument.createElement("tbody") ) : + elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + if ( match ) { + elem.type = match[1]; + } else { + elem.removeAttribute("type"); + } + return elem; +} + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var elem, + i = 0; + for ( ; (elem = elems[i]) != null; i++ ) { + jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) ); + } +} + +function cloneCopyEvent( src, dest ) { + + if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { + return; + } + + var type, i, l, + oldData = jQuery._data( src ), + curData = jQuery._data( dest, oldData ), + events = oldData.events; + + if ( events ) { + delete curData.handle; + curData.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + + // make the cloned public data object a copy from the original + if ( curData.data ) { + curData.data = jQuery.extend( {}, curData.data ); + } +} + +function fixCloneNodeIssues( src, dest ) { + var nodeName, e, data; + + // We do not need to do anything for non-Elements + if ( dest.nodeType !== 1 ) { + return; + } + + nodeName = dest.nodeName.toLowerCase(); + + // IE6-8 copies events bound via attachEvent when using cloneNode. + if ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) { + data = jQuery._data( dest ); + + for ( e in data.events ) { + jQuery.removeEvent( dest, e, data.handle ); + } + + // Event data gets referenced instead of copied if the expando gets copied too + dest.removeAttribute( jQuery.expando ); + } + + // IE blanks contents when cloning scripts, and tries to evaluate newly-set text + if ( nodeName === "script" && dest.text !== src.text ) { + disableScript( dest ).text = src.text; + restoreScript( dest ); + + // IE6-10 improperly clones children of object elements using classid. + // IE10 throws NoModificationAllowedError if parent is null, #12132. + } else if ( nodeName === "object" ) { + if ( dest.parentNode ) { + dest.outerHTML = src.outerHTML; + } + + // This path appears unavoidable for IE9. When cloning an object + // element in IE9, the outerHTML strategy above is not sufficient. + // If the src has innerHTML and the destination does not, + // copy the src.innerHTML into the dest.innerHTML. #10324 + if ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) { + dest.innerHTML = src.innerHTML; + } + + } else if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) { + // IE6-8 fails to persist the checked state of a cloned checkbox + // or radio button. Worse, IE6-7 fail to give the cloned element + // a checked appearance if the defaultChecked value isn't also set + + dest.defaultChecked = dest.checked = src.checked; + + // IE6-7 get confused and end up setting the value of a cloned + // checkbox/radio button to an empty string instead of "on" + if ( dest.value !== src.value ) { + dest.value = src.value; + } + + // IE6-8 fails to return the selected option to the default selected + // state when cloning options + } else if ( nodeName === "option" ) { + dest.defaultSelected = dest.selected = src.defaultSelected; + + // IE6-8 fails to set the defaultValue to the correct value when + // cloning other types of input fields + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + i = 0, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone(true); + jQuery( insert[i] )[ original ]( elems ); + + // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() + core_push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +}); + +function getAll( context, tag ) { + var elems, elem, + i = 0, + found = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || "*" ) : + typeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || "*" ) : + undefined; + + if ( !found ) { + for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) { + if ( !tag || jQuery.nodeName( elem, tag ) ) { + found.push( elem ); + } else { + jQuery.merge( found, getAll( elem, tag ) ); + } + } + } + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], found ) : + found; +} + +// Used in buildFragment, fixes the defaultChecked property +function fixDefaultChecked( elem ) { + if ( manipulation_rcheckableType.test( elem.type ) ) { + elem.defaultChecked = elem.checked; + } +} + +jQuery.extend({ + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var destElements, node, clone, i, srcElements, + inPage = jQuery.contains( elem.ownerDocument, elem ); + + if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { + clone = elem.cloneNode( true ); + + // IE<=8 does not properly clone detached, unknown element nodes + } else { + fragmentDiv.innerHTML = elem.outerHTML; + fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); + } + + if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) && + (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { + + // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + // Fix all IE cloning issues + for ( i = 0; (node = srcElements[i]) != null; ++i ) { + // Ensure that the destination node is not null; Fixes #9587 + if ( destElements[i] ) { + fixCloneNodeIssues( node, destElements[i] ); + } + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0; (node = srcElements[i]) != null; i++ ) { + cloneCopyEvent( node, destElements[i] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + destElements = srcElements = node = null; + + // Return the cloned set + return clone; + }, + + buildFragment: function( elems, context, scripts, selection ) { + var j, elem, contains, + tmp, tag, tbody, wrap, + l = elems.length, + + // Ensure a safe fragment + safe = createSafeFragment( context ), + + nodes = [], + i = 0; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || safe.appendChild( context.createElement("div") ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + + tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[2]; + + // Descend through wrappers to the right content + j = wrap[0]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Manually add leading whitespace removed by IE + if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { + nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) ); + } + + // Remove IE's autoinserted <tbody> from table fragments + if ( !jQuery.support.tbody ) { + + // String was a <table>, *may* have spurious <tbody> + elem = tag === "table" && !rtbody.test( elem ) ? + tmp.firstChild : + + // String was a bare <thead> or <tfoot> + wrap[1] === "<table>" && !rtbody.test( elem ) ? + tmp : + 0; + + j = elem && elem.childNodes.length; + while ( j-- ) { + if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) { + elem.removeChild( tbody ); + } + } + } + + jQuery.merge( nodes, tmp.childNodes ); + + // Fix #12392 for WebKit and IE > 9 + tmp.textContent = ""; + + // Fix #12392 for oldIE + while ( tmp.firstChild ) { + tmp.removeChild( tmp.firstChild ); + } + + // Remember the top-level container for proper cleanup + tmp = safe.lastChild; + } + } + } + + // Fix #11356: Clear elements from fragment + if ( tmp ) { + safe.removeChild( tmp ); + } + + // Reset defaultChecked for any radios and checkboxes + // about to be appended to the DOM in IE 6/7 (#8060) + if ( !jQuery.support.appendChecked ) { + jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); + } + + i = 0; + while ( (elem = nodes[ i++ ]) ) { + + // #4087 - If origin and destination elements are the same, and this is + // that element, do not do anything + if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( safe.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( (elem = tmp[ j++ ]) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + tmp = null; + + return safe; + }, + + cleanData: function( elems, /* internal */ acceptData ) { + var elem, type, id, data, + i = 0, + internalKey = jQuery.expando, + cache = jQuery.cache, + deleteExpando = jQuery.support.deleteExpando, + special = jQuery.event.special; + + for ( ; (elem = elems[i]) != null; i++ ) { + + if ( acceptData || jQuery.acceptData( elem ) ) { + + id = elem[ internalKey ]; + data = id && cache[ id ]; + + if ( data ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Remove cache only if it was not already removed by jQuery.event.remove + if ( cache[ id ] ) { + + delete cache[ id ]; + + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( deleteExpando ) { + delete elem[ internalKey ]; + + } else if ( typeof elem.removeAttribute !== core_strundefined ) { + elem.removeAttribute( internalKey ); + + } else { + elem[ internalKey ] = null; + } + + core_deletedIds.push( id ); + } + } + } + } + }, + + _evalUrl: function( url ) { + return jQuery.ajax({ + url: url, + type: "GET", + dataType: "script", + async: false, + global: false, + "throws": true + }); + } +}); +jQuery.fn.extend({ + wrapAll: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each(function(i) { + jQuery(this).wrapAll( html.call(this, i) ); + }); + } + + if ( this[0] ) { + // The elements to wrap the target around + var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true); + + if ( this[0].parentNode ) { + wrap.insertBefore( this[0] ); + } + + wrap.map(function() { + var elem = this; + + while ( elem.firstChild && elem.firstChild.nodeType === 1 ) { + elem = elem.firstChild; + } + + return elem; + }).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each(function(i) { + jQuery(this).wrapInner( html.call(this, i) ); + }); + } + + return this.each(function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + }); + }, + + wrap: function( html ) { + var isFunction = jQuery.isFunction( html ); + + return this.each(function(i) { + jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html ); + }); + }, + + unwrap: function() { + return this.parent().each(function() { + if ( !jQuery.nodeName( this, "body" ) ) { + jQuery( this ).replaceWith( this.childNodes ); + } + }).end(); + } +}); +var iframe, getStyles, curCSS, + ralpha = /alpha\([^)]*\)/i, + ropacity = /opacity\s*=\s*([^)]*)/, + rposition = /^(top|right|bottom|left)$/, + // swappable if display is none or starts with table except "table", "table-cell", or "table-caption" + // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rmargin = /^margin/, + rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ), + rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ), + rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ), + elemdisplay = { BODY: "block" }, + + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: 0, + fontWeight: 400 + }, + + cssExpand = [ "Top", "Right", "Bottom", "Left" ], + cssPrefixes = [ "Webkit", "O", "Moz", "ms" ]; + +// return a css property mapped to a potentially vendor prefixed property +function vendorPropName( style, name ) { + + // shortcut for names that are not vendor prefixed + if ( name in style ) { + return name; + } + + // check for vendor prefixed names + var capName = name.charAt(0).toUpperCase() + name.slice(1), + origName = name, + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in style ) { + return name; + } + } + + return origName; +} + +function isHidden( elem, el ) { + // isHidden might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); +} + +function showHide( elements, show ) { + var display, elem, hidden, + values = [], + index = 0, + length = elements.length; + + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + values[ index ] = jQuery._data( elem, "olddisplay" ); + display = elem.style.display; + if ( show ) { + // Reset the inline display of this element to learn if it is + // being hidden by cascaded rules or not + if ( !values[ index ] && display === "none" ) { + elem.style.display = ""; + } + + // Set elements which have been overridden with display: none + // in a stylesheet to whatever the default browser style is + // for such an element + if ( elem.style.display === "" && isHidden( elem ) ) { + values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) ); + } + } else { + + if ( !values[ index ] ) { + hidden = isHidden( elem ); + + if ( display && display !== "none" || !hidden ) { + jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) ); + } + } + } + } + + // Set the display of most of the elements in a second loop + // to avoid the constant reflow + for ( index = 0; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + if ( !show || elem.style.display === "none" || elem.style.display === "" ) { + elem.style.display = show ? values[ index ] || "" : "none"; + } + } + + return elements; +} + +jQuery.fn.extend({ + css: function( name, value ) { + return jQuery.access( this, function( elem, name, value ) { + var len, styles, + map = {}, + i = 0; + + if ( jQuery.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + }, + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each(function() { + if ( isHidden( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + }); + } +}); + +jQuery.extend({ + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "columnCount": true, + "fillOpacity": true, + "fontWeight": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: { + // normalize float css property + "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat" + }, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = jQuery.camelCase( name ), + style = elem.style; + + name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) ); + + // gets hook for the prefixed version + // followed by the unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // convert relative number strings (+= or -=) to relative numbers. #7345 + if ( type === "string" && (ret = rrelNum.exec( value )) ) { + value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) ); + // Fixes bug #9237 + type = "number"; + } + + // Make sure that NaN and null values aren't set. See: #7116 + if ( value == null || type === "number" && isNaN( value ) ) { + return; + } + + // If a number was passed in, add 'px' to the (except for certain CSS properties) + if ( type === "number" && !jQuery.cssNumber[ origName ] ) { + value += "px"; + } + + // Fixes #8908, it can be done more correctly by specifing setters in cssHooks, + // but it would mean to define eight (for every problematic property) identical functions + if ( !jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) { + + // Wrapped to prevent IE from throwing errors when 'invalid' values are provided + // Fixes bug #5509 + try { + style[ name ] = value; + } catch(e) {} + } + + } else { + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) { + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var num, val, hooks, + origName = jQuery.camelCase( name ); + + // Make sure that we're working with the right name + name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) ); + + // gets hook for the prefixed version + // followed by the unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + //convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Return, converting to number if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || jQuery.isNumeric( num ) ? num || 0 : val; + } + return val; + } +}); + +// NOTE: we've included the "window" in window.getComputedStyle +// because jsdom on node.js will break without it. +if ( window.getComputedStyle ) { + getStyles = function( elem ) { + return window.getComputedStyle( elem, null ); + }; + + curCSS = function( elem, name, _computed ) { + var width, minWidth, maxWidth, + computed = _computed || getStyles( elem ), + + // getPropertyValue is only needed for .css('filter') in IE9, see #12537 + ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined, + style = elem.style; + + if ( computed ) { + + if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right + // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels + // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values + if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret; + }; +} else if ( document.documentElement.currentStyle ) { + getStyles = function( elem ) { + return elem.currentStyle; + }; + + curCSS = function( elem, name, _computed ) { + var left, rs, rsLeft, + computed = _computed || getStyles( elem ), + ret = computed ? computed[ name ] : undefined, + style = elem.style; + + // Avoid setting ret to empty string here + // so we don't default to auto + if ( ret == null && style && style[ name ] ) { + ret = style[ name ]; + } + + // From the awesome hack by Dean Edwards + // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 + + // If we're not dealing with a regular pixel number + // but a number that has a weird ending, we need to convert it to pixels + // but not position css attributes, as those are proportional to the parent element instead + // and we can't measure the parent instead because it might trigger a "stacking dolls" problem + if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) { + + // Remember the original values + left = style.left; + rs = elem.runtimeStyle; + rsLeft = rs && rs.left; + + // Put in the new values to get a computed value out + if ( rsLeft ) { + rs.left = elem.currentStyle.left; + } + style.left = name === "fontSize" ? "1em" : ret; + ret = style.pixelLeft + "px"; + + // Revert the changed values + style.left = left; + if ( rsLeft ) { + rs.left = rsLeft; + } + } + + return ret === "" ? "auto" : ret; + }; +} + +function setPositiveNumber( elem, value, subtract ) { + var matches = rnumsplit.exec( value ); + return matches ? + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) : + value; +} + +function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { + var i = extra === ( isBorderBox ? "border" : "content" ) ? + // If we already have the right measurement, avoid augmentation + 4 : + // Otherwise initialize for horizontal or vertical properties + name === "width" ? 1 : 0, + + val = 0; + + for ( ; i < 4; i += 2 ) { + // both box models exclude margin, so add it if we want it + if ( extra === "margin" ) { + val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); + } + + if ( isBorderBox ) { + // border-box includes padding, so remove it if we want content + if ( extra === "content" ) { + val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // at this point, extra isn't border nor margin, so remove border + if ( extra !== "margin" ) { + val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } else { + // at this point, extra isn't content, so add padding + val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // at this point, extra isn't content nor padding, so add border + if ( extra !== "padding" ) { + val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + return val; +} + +function getWidthOrHeight( elem, name, extra ) { + + // Start with offset property, which is equivalent to the border-box value + var valueIsBorderBox = true, + val = name === "width" ? elem.offsetWidth : elem.offsetHeight, + styles = getStyles( elem ), + isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // some non-html elements return undefined for offsetWidth, so check for null/undefined + // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285 + // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668 + if ( val <= 0 || val == null ) { + // Fall back to computed then uncomputed css if necessary + val = curCSS( elem, name, styles ); + if ( val < 0 || val == null ) { + val = elem.style[ name ]; + } + + // Computed unit is not pixels. Stop here and return. + if ( rnumnonpx.test(val) ) { + return val; + } + + // we need the check for style in case a browser which returns unreliable values + // for getComputedStyle silently falls back to the reliable elem.style + valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] ); + + // Normalize "", auto, and prepare for extra + val = parseFloat( val ) || 0; + } + + // use the active box-sizing model to add/subtract irrelevant styles + return ( val + + augmentWidthOrHeight( + elem, + name, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles + ) + ) + "px"; +} + +// Try to determine the default display value of an element +function css_defaultDisplay( nodeName ) { + var doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + display = actualDisplay( nodeName, doc ); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + // Use the already-created iframe if possible + iframe = ( iframe || + jQuery("<iframe frameborder='0' width='0' height='0'/>") + .css( "cssText", "display:block !important" ) + ).appendTo( doc.documentElement ); + + // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse + doc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document; + doc.write("<!doctype html><html><body>"); + doc.close(); + + display = actualDisplay( nodeName, doc ); + iframe.detach(); + } + + // Store the correct default display + elemdisplay[ nodeName ] = display; + } + + return display; +} + +// Called ONLY from within css_defaultDisplay +function actualDisplay( name, doc ) { + var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), + display = jQuery.css( elem[0], "display" ); + elem.remove(); + return display; +} + +jQuery.each([ "height", "width" ], function( i, name ) { + jQuery.cssHooks[ name ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + // certain elements can have dimension info if we invisibly show them + // however, it must have a current display style that would benefit from this + return elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, "display" ) ) ? + jQuery.swap( elem, cssShow, function() { + return getWidthOrHeight( elem, name, extra ); + }) : + getWidthOrHeight( elem, name, extra ); + } + }, + + set: function( elem, value, extra ) { + var styles = extra && getStyles( elem ); + return setPositiveNumber( elem, value, extra ? + augmentWidthOrHeight( + elem, + name, + extra, + jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + styles + ) : 0 + ); + } + }; +}); + +if ( !jQuery.support.opacity ) { + jQuery.cssHooks.opacity = { + get: function( elem, computed ) { + // IE uses filters for opacity + return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ? + ( 0.01 * parseFloat( RegExp.$1 ) ) + "" : + computed ? "1" : ""; + }, + + set: function( elem, value ) { + var style = elem.style, + currentStyle = elem.currentStyle, + opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "", + filter = currentStyle && currentStyle.filter || style.filter || ""; + + // IE has trouble with opacity if it does not have layout + // Force it by setting the zoom level + style.zoom = 1; + + // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652 + // if value === "", then remove inline opacity #12685 + if ( ( value >= 1 || value === "" ) && + jQuery.trim( filter.replace( ralpha, "" ) ) === "" && + style.removeAttribute ) { + + // Setting style.filter to null, "" & " " still leave "filter:" in the cssText + // if "filter:" is present at all, clearType is disabled, we want to avoid this + // style.removeAttribute is IE Only, but so apparently is this code path... + style.removeAttribute( "filter" ); + + // if there is no filter style applied in a css rule or unset inline opacity, we are done + if ( value === "" || currentStyle && !currentStyle.filter ) { + return; + } + } + + // otherwise, set new filter values + style.filter = ralpha.test( filter ) ? + filter.replace( ralpha, opacity ) : + filter + " " + opacity; + } + }; +} + +// These hooks cannot be added until DOM ready because the support test +// for it is not run until after DOM ready +jQuery(function() { + if ( !jQuery.support.reliableMarginRight ) { + jQuery.cssHooks.marginRight = { + get: function( elem, computed ) { + if ( computed ) { + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + // Work around by temporarily setting element display to inline-block + return jQuery.swap( elem, { "display": "inline-block" }, + curCSS, [ elem, "marginRight" ] ); + } + } + }; + } + + // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084 + // getComputedStyle returns percent when specified for top/left/bottom/right + // rather than make the css module depend on the offset module, we just check for it here + if ( !jQuery.support.pixelPosition && jQuery.fn.position ) { + jQuery.each( [ "top", "left" ], function( i, prop ) { + jQuery.cssHooks[ prop ] = { + get: function( elem, computed ) { + if ( computed ) { + computed = curCSS( elem, prop ); + // if curCSS returns percentage, fallback to offset + return rnumnonpx.test( computed ) ? + jQuery( elem ).position()[ prop ] + "px" : + computed; + } + } + }; + }); + } + +}); + +if ( jQuery.expr && jQuery.expr.filters ) { + jQuery.expr.filters.hidden = function( elem ) { + // Support: Opera <= 12.12 + // Opera reports offsetWidths and offsetHeights less than zero on some elements + return elem.offsetWidth <= 0 && elem.offsetHeight <= 0 || + (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none"); + }; + + jQuery.expr.filters.visible = function( elem ) { + return !jQuery.expr.filters.hidden( elem ); + }; +} + +// These hooks are used by animate to expand properties +jQuery.each({ + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // assumes a single number if not a string + parts = typeof value === "string" ? value.split(" ") : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( !rmargin.test( prefix ) ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +}); +var r20 = /%20/g, + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + +jQuery.fn.extend({ + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map(function(){ + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + }) + .filter(function(){ + var type = this.type; + // Use .is(":disabled") so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !manipulation_rcheckableType.test( type ) ); + }) + .map(function( i, elem ){ + var val = jQuery( this ).val(); + + return val == null ? + null : + jQuery.isArray( val ) ? + jQuery.map( val, function( val ){ + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + }) : + { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + }).get(); + } +}); + +//Serialize an array of form elements or a set of +//key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, value ) { + // If value is a function, invoke it and return its value + value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value ); + s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value ); + }; + + // Set traditional to true for jQuery <= 1.3.2 behavior. + if ( traditional === undefined ) { + traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional; + } + + // If an array was passed in, assume that it is an array of form elements. + if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + }); + + } else { + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ).replace( r20, "+" ); +}; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( jQuery.isArray( obj ) ) { + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + // Item is non-scalar (array or object), encode its numeric index. + buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add ); + } + }); + + } else if ( !traditional && jQuery.type( obj ) === "object" ) { + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + // Serialize scalar item. + add( prefix, obj ); + } +} +jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + return arguments.length > 0 ? + this.on( name, null, data, fn ) : + this.trigger( name ); + }; +}); + +jQuery.fn.extend({ + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + }, + + bind: function( types, data, fn ) { + return this.on( types, null, data, fn ); + }, + unbind: function( types, fn ) { + return this.off( types, null, fn ); + }, + + delegate: function( selector, types, data, fn ) { + return this.on( types, selector, data, fn ); + }, + undelegate: function( selector, types, fn ) { + // ( namespace ) or ( selector, types [, fn] ) + return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn ); + } +}); +var + // Document location + ajaxLocParts, + ajaxLocation, + ajax_nonce = jQuery.now(), + + ajax_rquery = /\?/, + rhash = /#.*$/, + rts = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + rurl = /^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/, + + // Keep a copy of the old load method + _load = jQuery.fn.load, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = "*/".concat("*"); + +// #8138, IE may throw an exception when accessing +// a field from window.location if document.domain has been set +try { + ajaxLocation = location.href; +} catch( e ) { + // Use the href attribute of an A element + // since IE will modify it given document.location + ajaxLocation = document.createElement( "a" ); + ajaxLocation.href = ""; + ajaxLocation = ajaxLocation.href; +} + +// Segment location into parts +ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || []; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( core_rnotwhite ) || []; + + if ( jQuery.isFunction( func ) ) { + // For each dataType in the dataTypeExpression + while ( (dataType = dataTypes[i++]) ) { + // Prepend if requested + if ( dataType[0] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + (structure[ dataType ] = structure[ dataType ] || []).unshift( func ); + + // Otherwise append + } else { + (structure[ dataType ] = structure[ dataType ] || []).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + }); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var deep, key, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +jQuery.fn.load = function( url, params, callback ) { + if ( typeof url !== "string" && _load ) { + return _load.apply( this, arguments ); + } + + var selector, response, type, + self = this, + off = url.indexOf(" "); + + if ( off >= 0 ) { + selector = url.slice( off, url.length ); + url = url.slice( 0, off ); + } + + // If it's a function + if ( jQuery.isFunction( params ) ) { + + // We assume that it's the callback + callback = params; + params = undefined; + + // Otherwise, build a param string + } else if ( params && typeof params === "object" ) { + type = "POST"; + } + + // If we have elements to modify, make the request + if ( self.length > 0 ) { + jQuery.ajax({ + url: url, + + // if "type" variable is undefined, then "GET" method will be used + type: type, + dataType: "html", + data: params + }).done(function( responseText ) { + + // Save response for use in complete callback + response = arguments; + + self.html( selector ? + + // If a selector was specified, locate the right elements in a dummy div + // Exclude scripts to avoid IE 'Permission Denied' errors + jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) : + + // Otherwise use the full result + responseText ); + + }).complete( callback && function( jqXHR, status ) { + self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] ); + }); + } + + return this; +}; + +// Attach a bunch of functions for handling common AJAX events +jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ){ + jQuery.fn[ type ] = function( fn ){ + return this.on( type, fn ); + }; +}); + +jQuery.extend({ + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: ajaxLocation, + type: "GET", + isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /xml/, + html: /html/, + json: /json/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": jQuery.parseJSON, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var // Cross-domain detection vars + parts, + // Loop variable + i, + // URL without anti-cache param + cacheURL, + // Response headers as string + responseHeadersString, + // timeout handle + timeoutTimer, + + // To know if global events are to be dispatched + fireGlobals, + + transport, + // Response headers + responseHeaders, + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + // Callbacks context + callbackContext = s.context || s, + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks("once memory"), + // Status-dependent callbacks + statusCode = s.statusCode || {}, + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + // The jqXHR state + state = 0, + // Default abort message + strAbort = "canceled", + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( state === 2 ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( (match = rheaders.exec( responseHeadersString )) ) { + responseHeaders[ match[1].toLowerCase() ] = match[ 2 ]; + } + } + match = responseHeaders[ key.toLowerCase() ]; + } + return match == null ? null : match; + }, + + // Raw string + getAllResponseHeaders: function() { + return state === 2 ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + var lname = name.toLowerCase(); + if ( !state ) { + name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( !state ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( state < 2 ) { + for ( code in map ) { + // Lazy-add the new callback in a way that preserves old ones + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } else { + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ).complete = completeDeferred.add; + jqXHR.success = jqXHR.done; + jqXHR.error = jqXHR.fail; + + // Remove hash character (#7531: and string promotion) + // Add protocol if not provided (#5866: IE7 issue with protocol-less urls) + // Handle falsy url in the settings object (#10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" ); + + // Alias method option to type as per ticket #12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( core_rnotwhite ) || [""]; + + // A cross-domain request is in order when we have a protocol:host:port mismatch + if ( s.crossDomain == null ) { + parts = rurl.exec( s.url.toLowerCase() ); + s.crossDomain = !!( parts && + ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] || + ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !== + ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) ) + ); + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( state === 2 ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + fireGlobals = s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger("ajaxStart"); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + cacheURL = s.url; + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // If data is available, append data to url + if ( s.data ) { + cacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + s.data ); + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add anti-cache in url if needed + if ( s.cache === false ) { + s.url = rts.test( cacheURL ) ? + + // If there is already a '_' parameter, set its value + cacheURL.replace( rts, "$1_=" + ajax_nonce++ ) : + + // Otherwise add one to the end + cacheURL + ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ajax_nonce++; + } + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ? + s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) { + // Abort if not done already and return + return jqXHR.abort(); + } + + // aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + for ( i in { success: 1, error: 1, complete: 1 } ) { + jqXHR[ i ]( s[ i ] ); + } + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = setTimeout(function() { + jqXHR.abort("timeout"); + }, s.timeout ); + } + + try { + state = 1; + transport.send( requestHeaders, done ); + } catch ( e ) { + // Propagate exception as error if not done + if ( state < 2 ) { + done( -1, e ); + // Simply rethrow otherwise + } else { + throw e; + } + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Called once + if ( state === 2 ) { + return; + } + + // State is "done" now + state = 2; + + // Clear timeout if it exists + if ( timeoutTimer ) { + clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader("Last-Modified"); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader("etag"); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + // We extract error from statusText + // then normalize statusText and status for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger("ajaxStop"); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } +}); + +jQuery.each( [ "get", "post" ], function( i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + // shift arguments if data argument was omitted + if ( jQuery.isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + return jQuery.ajax({ + url: url, + type: method, + dataType: type, + data: data, + success: callback + }); + }; +}); + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + var firstDataType, ct, finalDataType, type, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader("Content-Type"); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s[ "throws" ] ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} +// Install script dataType +jQuery.ajaxSetup({ + accepts: { + script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /(?:java|ecma)script/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +}); + +// Handle cache's special case and global +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + s.global = false; + } +}); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function(s) { + + // This transport only deals with cross domain requests + if ( s.crossDomain ) { + + var script, + head = document.head || jQuery("head")[0] || document.documentElement; + + return { + + send: function( _, callback ) { + + script = document.createElement("script"); + + script.async = true; + + if ( s.scriptCharset ) { + script.charset = s.scriptCharset; + } + + script.src = s.url; + + // Attach handlers for all browsers + script.onload = script.onreadystatechange = function( _, isAbort ) { + + if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) { + + // Handle memory leak in IE + script.onload = script.onreadystatechange = null; + + // Remove the script + if ( script.parentNode ) { + script.parentNode.removeChild( script ); + } + + // Dereference the script + script = null; + + // Callback if not abort + if ( !isAbort ) { + callback( 200, "success" ); + } + } + }; + + // Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending + // Use native DOM manipulation to avoid our domManip AJAX trickery + head.insertBefore( script, head.firstChild ); + }, + + abort: function() { + if ( script ) { + script.onload( undefined, true ); + } + } + }; + } +}); +var oldCallbacks = [], + rjsonp = /(=)\?(?=&|$)|\?\?/; + +// Default jsonp settings +jQuery.ajaxSetup({ + jsonp: "callback", + jsonpCallback: function() { + var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( ajax_nonce++ ) ); + this[ callback ] = true; + return callback; + } +}); + +// Detect, normalize options and install callbacks for jsonp requests +jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { + + var callbackName, overwritten, responseContainer, + jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ? + "url" : + typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data" + ); + + // Handle iff the expected data type is "jsonp" or we have a parameter to set + if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) { + + // Get callback name, remembering preexisting value associated with it + callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ? + s.jsonpCallback() : + s.jsonpCallback; + + // Insert callback into url or form data + if ( jsonProp ) { + s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName ); + } else if ( s.jsonp !== false ) { + s.url += ( ajax_rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName; + } + + // Use data converter to retrieve json after script execution + s.converters["script json"] = function() { + if ( !responseContainer ) { + jQuery.error( callbackName + " was not called" ); + } + return responseContainer[ 0 ]; + }; + + // force json dataType + s.dataTypes[ 0 ] = "json"; + + // Install callback + overwritten = window[ callbackName ]; + window[ callbackName ] = function() { + responseContainer = arguments; + }; + + // Clean-up function (fires after converters) + jqXHR.always(function() { + // Restore preexisting value + window[ callbackName ] = overwritten; + + // Save back as free + if ( s[ callbackName ] ) { + // make sure that re-using the options doesn't screw things around + s.jsonpCallback = originalSettings.jsonpCallback; + + // save the callback name for future use + oldCallbacks.push( callbackName ); + } + + // Call if it was a function and we have a response + if ( responseContainer && jQuery.isFunction( overwritten ) ) { + overwritten( responseContainer[ 0 ] ); + } + + responseContainer = overwritten = undefined; + }); + + // Delegate to script + return "script"; + } +}); +var xhrCallbacks, xhrSupported, + xhrId = 0, + // #5280: Internet Explorer will keep connections alive if we don't abort on unload + xhrOnUnloadAbort = window.ActiveXObject && function() { + // Abort all pending requests + var key; + for ( key in xhrCallbacks ) { + xhrCallbacks[ key ]( undefined, true ); + } + }; + +// Functions to create xhrs +function createStandardXHR() { + try { + return new window.XMLHttpRequest(); + } catch( e ) {} +} + +function createActiveXHR() { + try { + return new window.ActiveXObject("Microsoft.XMLHTTP"); + } catch( e ) {} +} + +// Create the request object +// (This is still attached to ajaxSettings for backward compatibility) +jQuery.ajaxSettings.xhr = window.ActiveXObject ? + /* Microsoft failed to properly + * implement the XMLHttpRequest in IE7 (can't request local files), + * so we use the ActiveXObject when it is available + * Additionally XMLHttpRequest can be disabled in IE7/IE8 so + * we need a fallback. + */ + function() { + return !this.isLocal && createStandardXHR() || createActiveXHR(); + } : + // For all other browsers, use the standard XMLHttpRequest object + createStandardXHR; + +// Determine support properties +xhrSupported = jQuery.ajaxSettings.xhr(); +jQuery.support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +xhrSupported = jQuery.support.ajax = !!xhrSupported; + +// Create transport if the browser can provide an xhr +if ( xhrSupported ) { + + jQuery.ajaxTransport(function( s ) { + // Cross domain only allowed if supported through XMLHttpRequest + if ( !s.crossDomain || jQuery.support.cors ) { + + var callback; + + return { + send: function( headers, complete ) { + + // Get a new xhr + var handle, i, + xhr = s.xhr(); + + // Open the socket + // Passing null username, generates a login popup on Opera (#2865) + if ( s.username ) { + xhr.open( s.type, s.url, s.async, s.username, s.password ); + } else { + xhr.open( s.type, s.url, s.async ); + } + + // Apply custom fields if provided + if ( s.xhrFields ) { + for ( i in s.xhrFields ) { + xhr[ i ] = s.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( s.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( s.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !s.crossDomain && !headers["X-Requested-With"] ) { + headers["X-Requested-With"] = "XMLHttpRequest"; + } + + // Need an extra try/catch for cross domain requests in Firefox 3 + try { + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + } catch( err ) {} + + // Do send the request + // This may raise an exception which is actually + // handled in jQuery.ajax (so no try/catch here) + xhr.send( ( s.hasContent && s.data ) || null ); + + // Listener + callback = function( _, isAbort ) { + var status, responseHeaders, statusText, responses; + + // Firefox throws exceptions when accessing properties + // of an xhr when a network error occurred + // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE) + try { + + // Was never called and is aborted or complete + if ( callback && ( isAbort || xhr.readyState === 4 ) ) { + + // Only called once + callback = undefined; + + // Do not keep as active anymore + if ( handle ) { + xhr.onreadystatechange = jQuery.noop; + if ( xhrOnUnloadAbort ) { + delete xhrCallbacks[ handle ]; + } + } + + // If it's an abort + if ( isAbort ) { + // Abort it manually if needed + if ( xhr.readyState !== 4 ) { + xhr.abort(); + } + } else { + responses = {}; + status = xhr.status; + responseHeaders = xhr.getAllResponseHeaders(); + + // When requesting binary data, IE6-9 will throw an exception + // on any attempt to access responseText (#11426) + if ( typeof xhr.responseText === "string" ) { + responses.text = xhr.responseText; + } + + // Firefox throws an exception when accessing + // statusText for faulty cross-domain requests + try { + statusText = xhr.statusText; + } catch( e ) { + // We normalize with Webkit giving an empty statusText + statusText = ""; + } + + // Filter status for non standard behaviors + + // If the request is local and we have data: assume a success + // (success with no data won't get notified, that's the best we + // can do given current implementations) + if ( !status && s.isLocal && !s.crossDomain ) { + status = responses.text ? 200 : 404; + // IE - #1450: sometimes returns 1223 when it should be 204 + } else if ( status === 1223 ) { + status = 204; + } + } + } + } catch( firefoxAccessException ) { + if ( !isAbort ) { + complete( -1, firefoxAccessException ); + } + } + + // Call complete if needed + if ( responses ) { + complete( status, statusText, responses, responseHeaders ); + } + }; + + if ( !s.async ) { + // if we're in sync mode we fire the callback + callback(); + } else if ( xhr.readyState === 4 ) { + // (IE6 & IE7) if it's in cache and has been + // retrieved directly we need to fire the callback + setTimeout( callback ); + } else { + handle = ++xhrId; + if ( xhrOnUnloadAbort ) { + // Create the active xhrs callbacks list if needed + // and attach the unload handler + if ( !xhrCallbacks ) { + xhrCallbacks = {}; + jQuery( window ).unload( xhrOnUnloadAbort ); + } + // Add to list of active xhrs callbacks + xhrCallbacks[ handle ] = callback; + } + xhr.onreadystatechange = callback; + } + }, + + abort: function() { + if ( callback ) { + callback( undefined, true ); + } + } + }; + } + }); +} +var fxNow, timerId, + rfxtypes = /^(?:toggle|show|hide)$/, + rfxnum = new RegExp( "^(?:([+-])=|)(" + core_pnum + ")([a-z%]*)$", "i" ), + rrun = /queueHooks$/, + animationPrefilters = [ defaultPrefilter ], + tweeners = { + "*": [function( prop, value ) { + var tween = this.createTween( prop, value ), + target = tween.cur(), + parts = rfxnum.exec( value ), + unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) && + rfxnum.exec( jQuery.css( tween.elem, prop ) ), + scale = 1, + maxIterations = 20; + + if ( start && start[ 3 ] !== unit ) { + // Trust units reported by jQuery.css + unit = unit || start[ 3 ]; + + // Make sure we update the tween properties later on + parts = parts || []; + + // Iteratively approximate from a nonzero starting point + start = +target || 1; + + do { + // If previous iteration zeroed out, double until we get *something* + // Use a string for doubling factor so we don't accidentally see scale as unchanged below + scale = scale || ".5"; + + // Adjust and apply + start = start / scale; + jQuery.style( tween.elem, prop, start + unit ); + + // Update scale, tolerating zero or NaN from tween.cur() + // And breaking the loop if scale is unchanged or perfect, or if we've just had enough + } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations ); + } + + // Update tween properties + if ( parts ) { + start = tween.start = +start || +target || 0; + tween.unit = unit; + // If a +=/-= token was provided, we're doing a relative animation + tween.end = parts[ 1 ] ? + start + ( parts[ 1 ] + 1 ) * parts[ 2 ] : + +parts[ 2 ]; + } + + return tween; + }] + }; + +// Animations created synchronously will run synchronously +function createFxNow() { + setTimeout(function() { + fxNow = undefined; + }); + return ( fxNow = jQuery.now() ); +} + +function createTween( value, prop, animation ) { + var tween, + collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( (tween = collection[ index ].call( animation, prop, value )) ) { + + // we're done with this property + return tween; + } + } +} + +function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = animationPrefilters.length, + deferred = jQuery.Deferred().always( function() { + // don't match elem in the :animated selector + delete tick.elem; + }), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length ; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ]); + + if ( percent < 1 && length ) { + return remaining; + } else { + deferred.resolveWith( elem, [ animation ] ); + return false; + } + }, + animation = deferred.promise({ + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { specialEasing: {} }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + // if we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length ; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // resolve when we played the last frame + // otherwise, reject + if ( gotoEnd ) { + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + }), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length ; index++ ) { + result = animationPrefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( jQuery.isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + }) + ); + + // attach callbacks from options + return animation.progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = jQuery.camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( jQuery.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // not quite $.extend, this wont overwrite keys already present. + // also - reusing 'index' from above because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweener: function( props, callback ) { + if ( jQuery.isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.split(" "); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length ; index++ ) { + prop = props[ index ]; + tweeners[ prop ] = tweeners[ prop ] || []; + tweeners[ prop ].unshift( callback ); + } + }, + + prefilter: function( callback, prepend ) { + if ( prepend ) { + animationPrefilters.unshift( callback ); + } else { + animationPrefilters.push( callback ); + } + } +}); + +function defaultPrefilter( elem, props, opts ) { + /* jshint validthis: true */ + var prop, value, toggle, tween, hooks, oldfire, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHidden( elem ), + dataShow = jQuery._data( elem, "fxshow" ); + + // handle queue: false promises + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always(function() { + // doing this makes sure that the complete handler will be called + // before this completes + anim.always(function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + }); + }); + } + + // height/width overflow pass + if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) { + // Make sure that nothing sneaks out + // Record all 3 overflow attributes because IE does not + // change the overflow attribute when overflowX and + // overflowY are set to the same value + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Set display property to inline-block for height/width + // animations on inline elements that are having width/height animated + if ( jQuery.css( elem, "display" ) === "inline" && + jQuery.css( elem, "float" ) === "none" ) { + + // inline-level elements accept inline-block; + // block-level elements need to be inline with layout + if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) { + style.display = "inline-block"; + + } else { + style.zoom = 1; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + if ( !jQuery.support.shrinkWrapBlocks ) { + anim.always(function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + }); + } + } + + + // show/hide pass + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.exec( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + continue; + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + if ( !jQuery.isEmptyObject( orig ) ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = jQuery._data( elem, "fxshow", {} ); + } + + // store state if its toggle - enables .stop().toggle() to "reverse" + if ( toggle ) { + dataShow.hidden = !hidden; + } + if ( hidden ) { + jQuery( elem ).show(); + } else { + anim.done(function() { + jQuery( elem ).hide(); + }); + } + anim.done(function() { + var prop; + jQuery._removeData( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + }); + for ( prop in orig ) { + tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = tween.start; + if ( hidden ) { + tween.end = tween.start; + tween.start = prop === "width" || prop === "height" ? 1 : 0; + } + } + } + } +} + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || "swing"; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + if ( tween.elem[ tween.prop ] != null && + (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) { + return tween.elem[ tween.prop ]; + } + + // passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails + // so, simple values such as "10px" are parsed to Float. + // complex values such as "rotate(1rad)" are returned as is. + result = jQuery.css( tween.elem, tween.prop, "" ); + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + // use step hook for back compat - use cssHook if its there - use .style if its + // available and use plain properties where available + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Support: IE <=9 +// Panic based approach to setting things on disconnected nodes + +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.each([ "toggle", "show", "hide" ], function( i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +}); + +jQuery.fn.extend({ + fadeTo: function( speed, to, easing, callback ) { + + // show any hidden elements after setting opacity to 0 + return this.filter( isHidden ).css( "opacity", 0 ).show() + + // animate to the value specified + .end().animate({ opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || jQuery._data( this, "finish" ) ) { + anim.stop( true ); + } + }; + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue && type !== false ) { + this.queue( type || "fx", [] ); + } + + return this.each(function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = jQuery._data( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) { + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // start the next in the queue if the last step wasn't forced + // timers currently will call their complete callbacks, which will dequeue + // but only if they were gotoEnd + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + }); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each(function() { + var index, + data = jQuery._data( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // enable finishing flag on private data + data.finish = true; + + // empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // turn off finishing flag + delete data.finish; + }); + } +}); + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + attrs = { height: type }, + i = 0; + + // if we include width, step value is 1 to do all cssExpand values, + // if we don't include width, step value is 2 to skip over Left and Right + includeWidth = includeWidth? 1 : 0; + for( ; i < 4 ; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +// Generate shortcuts for custom animations +jQuery.each({ + slideDown: genFx("show"), + slideUp: genFx("hide"), + slideToggle: genFx("toggle"), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +}); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + jQuery.isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing + }; + + opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration : + opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default; + + // normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( jQuery.isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p*Math.PI ) / 2; + } +}; + +jQuery.timers = []; +jQuery.fx = Tween.prototype.init; +jQuery.fx.tick = function() { + var timer, + timers = jQuery.timers, + i = 0; + + fxNow = jQuery.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + // Checks the timer has not already been removed + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + if ( timer() && jQuery.timers.push( timer ) ) { + jQuery.fx.start(); + } +}; + +jQuery.fx.interval = 13; + +jQuery.fx.start = function() { + if ( !timerId ) { + timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval ); + } +}; + +jQuery.fx.stop = function() { + clearInterval( timerId ); + timerId = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + // Default speed + _default: 400 +}; + +// Back Compat <1.8 extension point +jQuery.fx.step = {}; + +if ( jQuery.expr && jQuery.expr.filters ) { + jQuery.expr.filters.animated = function( elem ) { + return jQuery.grep(jQuery.timers, function( fn ) { + return elem === fn.elem; + }).length; + }; +} +jQuery.fn.offset = function( options ) { + if ( arguments.length ) { + return options === undefined ? + this : + this.each(function( i ) { + jQuery.offset.setOffset( this, options, i ); + }); + } + + var docElem, win, + box = { top: 0, left: 0 }, + elem = this[ 0 ], + doc = elem && elem.ownerDocument; + + if ( !doc ) { + return; + } + + docElem = doc.documentElement; + + // Make sure it's not a disconnected DOM node + if ( !jQuery.contains( docElem, elem ) ) { + return box; + } + + // If we don't have gBCR, just use 0,0 rather than error + // BlackBerry 5, iOS 3 (original iPhone) + if ( typeof elem.getBoundingClientRect !== core_strundefined ) { + box = elem.getBoundingClientRect(); + } + win = getWindow( doc ); + return { + top: box.top + ( win.pageYOffset || docElem.scrollTop ) - ( docElem.clientTop || 0 ), + left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 ) + }; +}; + +jQuery.offset = { + + setOffset: function( elem, options, i ) { + var position = jQuery.css( elem, "position" ); + + // set position first, in-case top/left are set even on static elem + if ( position === "static" ) { + elem.style.position = "relative"; + } + + var curElem = jQuery( elem ), + curOffset = curElem.offset(), + curCSSTop = jQuery.css( elem, "top" ), + curCSSLeft = jQuery.css( elem, "left" ), + calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1, + props = {}, curPosition = {}, curTop, curLeft; + + // need to be able to calculate position if either top or left is auto and position is either absolute or fixed + if ( calculatePosition ) { + curPosition = curElem.position(); + curTop = curPosition.top; + curLeft = curPosition.left; + } else { + curTop = parseFloat( curCSSTop ) || 0; + curLeft = parseFloat( curCSSLeft ) || 0; + } + + if ( jQuery.isFunction( options ) ) { + options = options.call( elem, i, curOffset ); + } + + if ( options.top != null ) { + props.top = ( options.top - curOffset.top ) + curTop; + } + if ( options.left != null ) { + props.left = ( options.left - curOffset.left ) + curLeft; + } + + if ( "using" in options ) { + options.using.call( elem, props ); + } else { + curElem.css( props ); + } + } +}; + + +jQuery.fn.extend({ + + position: function() { + if ( !this[ 0 ] ) { + return; + } + + var offsetParent, offset, + parentOffset = { top: 0, left: 0 }, + elem = this[ 0 ]; + + // fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent + if ( jQuery.css( elem, "position" ) === "fixed" ) { + // we assume that getBoundingClientRect is available when computed position is fixed + offset = elem.getBoundingClientRect(); + } else { + // Get *real* offsetParent + offsetParent = this.offsetParent(); + + // Get correct offsets + offset = this.offset(); + if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) { + parentOffset = offsetParent.offset(); + } + + // Add offsetParent borders + parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true ); + parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true ); + } + + // Subtract parent offsets and element margins + // note: when an element has margin: auto the offsetLeft and marginLeft + // are the same in Safari causing offset.left to incorrectly be 0 + return { + top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ), + left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true) + }; + }, + + offsetParent: function() { + return this.map(function() { + var offsetParent = this.offsetParent || docElem; + while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position") === "static" ) ) { + offsetParent = offsetParent.offsetParent; + } + return offsetParent || docElem; + }); + } +}); + + +// Create scrollLeft and scrollTop methods +jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) { + var top = /Y/.test( prop ); + + jQuery.fn[ method ] = function( val ) { + return jQuery.access( this, function( elem, method, val ) { + var win = getWindow( elem ); + + if ( val === undefined ) { + return win ? (prop in win) ? win[ prop ] : + win.document.documentElement[ method ] : + elem[ method ]; + } + + if ( win ) { + win.scrollTo( + !top ? val : jQuery( win ).scrollLeft(), + top ? val : jQuery( win ).scrollTop() + ); + + } else { + elem[ method ] = val; + } + }, method, val, arguments.length, null ); + }; +}); + +function getWindow( elem ) { + return jQuery.isWindow( elem ) ? + elem : + elem.nodeType === 9 ? + elem.defaultView || elem.parentWindow : + false; +} +// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods +jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { + jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) { + // margin is only for outerHeight, outerWidth + jQuery.fn[ funcName ] = function( margin, value ) { + var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ), + extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" ); + + return jQuery.access( this, function( elem, type, value ) { + var doc; + + if ( jQuery.isWindow( elem ) ) { + // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there + // isn't a whole lot we can do. See pull request at this URL for discussion: + // https://github.com/jquery/jquery/pull/764 + return elem.document.documentElement[ "client" + name ]; + } + + // Get document width or height + if ( elem.nodeType === 9 ) { + doc = elem.documentElement; + + // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest + // unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it. + return Math.max( + elem.body[ "scroll" + name ], doc[ "scroll" + name ], + elem.body[ "offset" + name ], doc[ "offset" + name ], + doc[ "client" + name ] + ); + } + + return value === undefined ? + // Get width or height on the element, requesting but not forcing parseFloat + jQuery.css( elem, type, extra ) : + + // Set width or height on the element + jQuery.style( elem, type, value, extra ); + }, type, chainable ? margin : undefined, chainable, null ); + }; + }); +}); +// Limit scope pollution from any deprecated API +// (function() { + +// The number of elements contained in the matched element set +jQuery.fn.size = function() { + return this.length; +}; + +jQuery.fn.andSelf = jQuery.fn.addBack; + +// })(); +if ( typeof module === "object" && module && typeof module.exports === "object" ) { + // Expose jQuery as module.exports in loaders that implement the Node + // module pattern (including browserify). Do not create the global, since + // the user will be storing it themselves locally, and globals are frowned + // upon in the Node module world. + module.exports = jQuery; +} else { + // Otherwise expose jQuery to the global object as usual + window.jQuery = window.$ = jQuery; + + // Register as a named AMD module, since jQuery can be concatenated with other + // files that may use define, but not via a proper concatenation script that + // understands anonymous AMD modules. A named AMD is safest and most robust + // way to register. Lowercase jquery is used because AMD module names are + // derived from file names, and jQuery is normally delivered in a lowercase + // file name. Do this after creating the global so that if an AMD module wants + // to call noConflict to hide this version of jQuery, it will work. + if ( typeof define === "function" && define.amd ) { + define( "jquery", [], function () { return jQuery; } ); + } +} + +})( window ); diff --git a/vilya/static/js/lib/jquery-1.11.0.js b/hub/static/js/lib/jquery-1.11.0.js similarity index 100% rename from vilya/static/js/lib/jquery-1.11.0.js rename to hub/static/js/lib/jquery-1.11.0.js diff --git a/hub/static/js/lib/jquery-1.8.3.js b/hub/static/js/lib/jquery-1.8.3.js new file mode 100644 index 0000000..8c24ffc --- /dev/null +++ b/hub/static/js/lib/jquery-1.8.3.js @@ -0,0 +1,9472 @@ +/*! + * jQuery JavaScript Library v1.8.3 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright 2012 jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: Tue Nov 13 2012 08:20:33 GMT-0500 (Eastern Standard Time) + */ +(function( window, undefined ) { +var + // A central reference to the root jQuery(document) + rootjQuery, + + // The deferred used on DOM ready + readyList, + + // Use the correct document accordingly with window argument (sandbox) + document = window.document, + location = window.location, + navigator = window.navigator, + + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$, + + // Save a reference to some core methods + core_push = Array.prototype.push, + core_slice = Array.prototype.slice, + core_indexOf = Array.prototype.indexOf, + core_toString = Object.prototype.toString, + core_hasOwn = Object.prototype.hasOwnProperty, + core_trim = String.prototype.trim, + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context, rootjQuery ); + }, + + // Used for matching numbers + core_pnum = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source, + + // Used for detecting and trimming whitespace + core_rnotwhite = /\S/, + core_rspace = /\s+/, + + // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE) + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // A simple way to check for HTML strings + // Prioritize #id over <tag> to avoid XSS via location.hash (#9521) + rquickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, + + // Match a standalone tag + rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, + + // JSON RegExp + rvalidchars = /^[\],:{}\s]*$/, + rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, + rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g, + rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([\da-z])/gi, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return ( letter + "" ).toUpperCase(); + }, + + // The ready event handler and self cleanup method + DOMContentLoaded = function() { + if ( document.addEventListener ) { + document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + jQuery.ready(); + } else if ( document.readyState === "complete" ) { + // we're here because readyState === "complete" in oldIE + // which is good enough for us to call the dom ready! + document.detachEvent( "onreadystatechange", DOMContentLoaded ); + jQuery.ready(); + } + }, + + // [[Class]] -> type pairs + class2type = {}; + +jQuery.fn = jQuery.prototype = { + constructor: jQuery, + init: function( selector, context, rootjQuery ) { + var match, elem, ret, doc; + + // Handle $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + doc = ( context && context.nodeType ? context.ownerDocument || context : document ); + + // scripts is true for back-compat + selector = jQuery.parseHTML( match[1], doc, true ); + if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { + this.attr.call( selector, context, true ); + } + + return jQuery.merge( this, selector ); + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || rootjQuery ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return rootjQuery.ready( selector ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.8.3", + + // The default length of a jQuery object is 0 + length: 0, + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + toArray: function() { + return core_slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == null ? + + // Return a 'clean' array + this.toArray() : + + // Return just the object + ( num < 0 ? this[ this.length + num ] : this[ num ] ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) { + ret.selector = this.selector + ( this.selector ? " " : "" ) + selector; + } else if ( name ) { + ret.selector = this.selector + "." + name + "(" + selector + ")"; + } + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + ready: function( fn ) { + // Add the callback + jQuery.ready.promise().done( fn ); + + return this; + }, + + eq: function( i ) { + i = +i; + return i === -1 ? + this.slice( i ) : + this.slice( i, i + 1 ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + slice: function() { + return this.pushStack( core_slice.apply( this, arguments ), + "slice", core_slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: core_push, + sort: [].sort, + splice: [].splice +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( length === i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + noConflict: function( deep ) { + if ( window.$ === jQuery ) { + window.$ = _$; + } + + if ( deep && window.jQuery === jQuery ) { + window.jQuery = _jQuery; + } + + return jQuery; + }, + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready, 1 ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.trigger ) { + jQuery( document ).trigger("ready").off("ready"); + } + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + isWindow: function( obj ) { + return obj != null && obj == obj.window; + }, + + isNumeric: function( obj ) { + return !isNaN( parseFloat(obj) ) && isFinite( obj ); + }, + + type: function( obj ) { + return obj == null ? + String( obj ) : + class2type[ core_toString.call(obj) ] || "object"; + }, + + isPlainObject: function( obj ) { + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + // Not own constructor property must be Object + if ( obj.constructor && + !core_hasOwn.call(obj, "constructor") && + !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + } catch ( e ) { + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + + var key; + for ( key in obj ) {} + + return key === undefined || core_hasOwn.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + var name; + for ( name in obj ) { + return false; + } + return true; + }, + + error: function( msg ) { + throw new Error( msg ); + }, + + // data: string of html + // context (optional): If specified, the fragment will be created in this context, defaults to document + // scripts (optional): If true, will include scripts passed in the html string + parseHTML: function( data, context, scripts ) { + var parsed; + if ( !data || typeof data !== "string" ) { + return null; + } + if ( typeof context === "boolean" ) { + scripts = context; + context = 0; + } + context = context || document; + + // Single tag + if ( (parsed = rsingleTag.exec( data )) ) { + return [ context.createElement( parsed[1] ) ]; + } + + parsed = jQuery.buildFragment( [ data ], context, scripts ? null : [] ); + return jQuery.merge( [], + (parsed.cacheable ? jQuery.clone( parsed.fragment ) : parsed.fragment).childNodes ); + }, + + parseJSON: function( data ) { + if ( !data || typeof data !== "string") { + return null; + } + + // Make sure leading/trailing whitespace is removed (IE can't handle it) + data = jQuery.trim( data ); + + // Attempt to parse using the native JSON parser first + if ( window.JSON && window.JSON.parse ) { + return window.JSON.parse( data ); + } + + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if ( rvalidchars.test( data.replace( rvalidescape, "@" ) + .replace( rvalidtokens, "]" ) + .replace( rvalidbraces, "")) ) { + + return ( new Function( "return " + data ) )(); + + } + jQuery.error( "Invalid JSON: " + data ); + }, + + // Cross-browser xml parsing + parseXML: function( data ) { + var xml, tmp; + if ( !data || typeof data !== "string" ) { + return null; + } + try { + if ( window.DOMParser ) { // Standard + tmp = new DOMParser(); + xml = tmp.parseFromString( data , "text/xml" ); + } else { // IE + xml = new ActiveXObject( "Microsoft.XMLDOM" ); + xml.async = "false"; + xml.loadXML( data ); + } + } catch( e ) { + xml = undefined; + } + if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; + }, + + noop: function() {}, + + // Evaluates a script in a global context + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && core_rnotwhite.test( data ) ) { + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + // args is for internal usage only + each: function( obj, callback, args ) { + var name, + i = 0, + length = obj.length, + isObj = length === undefined || jQuery.isFunction( obj ); + + if ( args ) { + if ( isObj ) { + for ( name in obj ) { + if ( callback.apply( obj[ name ], args ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.apply( obj[ i++ ], args ) === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isObj ) { + for ( name in obj ) { + if ( callback.call( obj[ name ], name, obj[ name ] ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.call( obj[ i ], i, obj[ i++ ] ) === false ) { + break; + } + } + } + } + + return obj; + }, + + // Use native String.trim function wherever possible + trim: core_trim && !core_trim.call("\uFEFF\xA0") ? + function( text ) { + return text == null ? + "" : + core_trim.call( text ); + } : + + // Otherwise use our own trimming functionality + function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var type, + ret = results || []; + + if ( arr != null ) { + // The window, strings (and functions) also have 'length' + // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 + type = jQuery.type( arr ); + + if ( arr.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( arr ) ) { + core_push.call( ret, arr ); + } else { + jQuery.merge( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + var len; + + if ( arr ) { + if ( core_indexOf ) { + return core_indexOf.call( arr, elem, i ); + } + + len = arr.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + // Skip accessing in sparse arrays + if ( i in arr && arr[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var l = second.length, + i = first.length, + j = 0; + + if ( typeof l === "number" ) { + for ( ; j < l; j++ ) { + first[ i++ ] = second[ j ]; + } + + } else { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, inv ) { + var retVal, + ret = [], + i = 0, + length = elems.length; + inv = !!inv; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + retVal = !!callback( elems[ i ], i ); + if ( inv !== retVal ) { + ret.push( elems[ i ] ); + } + } + + return ret; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, key, + ret = [], + i = 0, + length = elems.length, + // jquery objects are treated as arrays + isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; + + // Go through the array, translating each of the items to their + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + + // Go through every key on the object, + } else { + for ( key in elems ) { + value = callback( elems[ key ], key, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + } + + // Flatten any nested arrays + return ret.concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var tmp, args, proxy; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = core_slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context, args.concat( core_slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + // Multifunctional method to get and set values of a collection + // The value/s can optionally be executed if it's a function + access: function( elems, fn, key, value, chainable, emptyGet, pass ) { + var exec, + bulk = key == null, + i = 0, + length = elems.length; + + // Sets many values + if ( key && typeof key === "object" ) { + for ( i in key ) { + jQuery.access( elems, fn, i, key[i], 1, emptyGet, value ); + } + chainable = 1; + + // Sets one value + } else if ( value !== undefined ) { + // Optionally, function values get executed if exec is true + exec = pass === undefined && jQuery.isFunction( value ); + + if ( bulk ) { + // Bulk operations only iterate when executing function values + if ( exec ) { + exec = fn; + fn = function( elem, key, value ) { + return exec.call( jQuery( elem ), value ); + }; + + // Otherwise they run against the entire set + } else { + fn.call( elems, value ); + fn = null; + } + } + + if ( fn ) { + for (; i < length; i++ ) { + fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); + } + } + + chainable = 1; + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + length ? fn( elems[0], key ) : emptyGet; + }, + + now: function() { + return ( new Date() ).getTime(); + } +}); + +jQuery.ready.promise = function( obj ) { + if ( !readyList ) { + + readyList = jQuery.Deferred(); + + // Catch cases where $(document).ready() is called after the browser event has already occurred. + // we once tried to use readyState "interactive" here, but it caused issues like the one + // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + setTimeout( jQuery.ready, 1 ); + + // Standards-based browsers support DOMContentLoaded + } else if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", jQuery.ready, false ); + + // If IE event model is used + } else { + // Ensure firing before onload, maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", DOMContentLoaded ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", jQuery.ready ); + + // If IE and not a frame + // continually check to see if the document is ready + var top = false; + + try { + top = window.frameElement == null && document.documentElement; + } catch(e) {} + + if ( top && top.doScroll ) { + (function doScrollCheck() { + if ( !jQuery.isReady ) { + + try { + // Use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + top.doScroll("left"); + } catch(e) { + return setTimeout( doScrollCheck, 50 ); + } + + // and execute any waiting functions + jQuery.ready(); + } + })(); + } + } + } + return readyList.promise( obj ); +}; + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +// All jQuery objects should point back to these +rootjQuery = jQuery(document); +// String to Object options format cache +var optionsCache = {}; + +// Convert String-formatted options into Object-formatted ones and store in cache +function createOptions( options ) { + var object = optionsCache[ options ] = {}; + jQuery.each( options.split( core_rspace ), function( _, flag ) { + object[ flag ] = true; + }); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + ( optionsCache[ options ] || createOptions( options ) ) : + jQuery.extend( {}, options ); + + var // Last fire value (for non-forgettable lists) + memory, + // Flag to know if list was already fired + fired, + // Flag to know if list is currently firing + firing, + // First callback to fire (used internally by add and fireWith) + firingStart, + // End of the loop when firing + firingLength, + // Index of currently firing callback (modified by remove if needed) + firingIndex, + // Actual callback list + list = [], + // Stack of fire calls for repeatable lists + stack = !options.once && [], + // Fire callbacks + fire = function( data ) { + memory = options.memory && data; + fired = true; + firingIndex = firingStart || 0; + firingStart = 0; + firingLength = list.length; + firing = true; + for ( ; list && firingIndex < firingLength; firingIndex++ ) { + if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { + memory = false; // To prevent further calls using add + break; + } + } + firing = false; + if ( list ) { + if ( stack ) { + if ( stack.length ) { + fire( stack.shift() ); + } + } else if ( memory ) { + list = []; + } else { + self.disable(); + } + } + }, + // Actual Callbacks object + self = { + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + // First, we save the current length + var start = list.length; + (function add( args ) { + jQuery.each( args, function( _, arg ) { + var type = jQuery.type( arg ); + if ( type === "function" ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && type !== "string" ) { + // Inspect recursively + add( arg ); + } + }); + })( arguments ); + // Do we need to add the callbacks to the + // current firing batch? + if ( firing ) { + firingLength = list.length; + // With memory, if we're not firing then + // we should call right away + } else if ( memory ) { + firingStart = start; + fire( memory ); + } + } + return this; + }, + // Remove a callback from the list + remove: function() { + if ( list ) { + jQuery.each( arguments, function( _, arg ) { + var index; + while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + // Handle firing indexes + if ( firing ) { + if ( index <= firingLength ) { + firingLength--; + } + if ( index <= firingIndex ) { + firingIndex--; + } + } + } + }); + } + return this; + }, + // Control if a given callback is in the list + has: function( fn ) { + return jQuery.inArray( fn, list ) > -1; + }, + // Remove all callbacks from the list + empty: function() { + list = []; + return this; + }, + // Have the list do nothing anymore + disable: function() { + list = stack = memory = undefined; + return this; + }, + // Is it disabled? + disabled: function() { + return !list; + }, + // Lock the list in its current state + lock: function() { + stack = undefined; + if ( !memory ) { + self.disable(); + } + return this; + }, + // Is it locked? + locked: function() { + return !stack; + }, + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + if ( list && ( !fired || stack ) ) { + if ( firing ) { + stack.push( args ); + } else { + fire( args ); + } + } + return this; + }, + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; +jQuery.extend({ + + Deferred: function( func ) { + var tuples = [ + // action, add listener, listener list, final state + [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], + [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], + [ "notify", "progress", jQuery.Callbacks("memory") ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + then: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + return jQuery.Deferred(function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + var action = tuple[ 0 ], + fn = fns[ i ]; + // deferred[ done | fail | progress ] for forwarding actions to newDefer + deferred[ tuple[1] ]( jQuery.isFunction( fn ) ? + function() { + var returned = fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .done( newDefer.resolve ) + .fail( newDefer.reject ) + .progress( newDefer.notify ); + } else { + newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); + } + } : + newDefer[ action ] + ); + }); + fns = null; + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 3 ]; + + // promise[ done | fail | progress ] = list.add + promise[ tuple[1] ] = list.add; + + // Handle state + if ( stateString ) { + list.add(function() { + // state = [ resolved | rejected ] + state = stateString; + + // [ reject_list | resolve_list ].disable; progress_list.lock + }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); + } + + // deferred[ resolve | reject | notify ] = list.fire + deferred[ tuple[0] ] = list.fire; + deferred[ tuple[0] + "With" ] = list.fireWith; + }); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( subordinate /* , ..., subordinateN */ ) { + var i = 0, + resolveValues = core_slice.call( arguments ), + length = resolveValues.length, + + // the count of uncompleted subordinates + remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + + // the master Deferred. If resolveValues consist of only a single Deferred, just use that. + deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + + // Update function for both resolve and progress values + updateFunc = function( i, contexts, values ) { + return function( value ) { + contexts[ i ] = this; + values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value; + if( values === progressValues ) { + deferred.notifyWith( contexts, values ); + } else if ( !( --remaining ) ) { + deferred.resolveWith( contexts, values ); + } + }; + }, + + progressValues, progressContexts, resolveContexts; + + // add listeners to Deferred subordinates; treat others as resolved + if ( length > 1 ) { + progressValues = new Array( length ); + progressContexts = new Array( length ); + resolveContexts = new Array( length ); + for ( ; i < length; i++ ) { + if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { + resolveValues[ i ].promise() + .done( updateFunc( i, resolveContexts, resolveValues ) ) + .fail( deferred.reject ) + .progress( updateFunc( i, progressContexts, progressValues ) ); + } else { + --remaining; + } + } + } + + // if we're not waiting on anything, resolve the master + if ( !remaining ) { + deferred.resolveWith( resolveContexts, resolveValues ); + } + + return deferred.promise(); + } +}); +jQuery.support = (function() { + + var support, + all, + a, + select, + opt, + input, + fragment, + eventName, + i, + isSupported, + clickFn, + div = document.createElement("div"); + + // Setup + div.setAttribute( "className", "t" ); + div.innerHTML = " <link/><table></table><a href='/a'>a</a><input type='checkbox'/>"; + + // Support tests won't run in some limited or non-browser environments + all = div.getElementsByTagName("*"); + a = div.getElementsByTagName("a")[ 0 ]; + if ( !all || !a || !all.length ) { + return {}; + } + + // First batch of tests + select = document.createElement("select"); + opt = select.appendChild( document.createElement("option") ); + input = div.getElementsByTagName("input")[ 0 ]; + + a.style.cssText = "top:1px;float:left;opacity:.5"; + support = { + // IE strips leading whitespace when .innerHTML is used + leadingWhitespace: ( div.firstChild.nodeType === 3 ), + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + tbody: !div.getElementsByTagName("tbody").length, + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + htmlSerialize: !!div.getElementsByTagName("link").length, + + // Get the style information from getAttribute + // (IE uses .cssText instead) + style: /top/.test( a.getAttribute("style") ), + + // Make sure that URLs aren't manipulated + // (IE normalizes it by default) + hrefNormalized: ( a.getAttribute("href") === "/a" ), + + // Make sure that element opacity exists + // (IE uses filter instead) + // Use a regex to work around a WebKit issue. See #5145 + opacity: /^0.5/.test( a.style.opacity ), + + // Verify style float existence + // (IE uses styleFloat instead of cssFloat) + cssFloat: !!a.style.cssFloat, + + // Make sure that if no value is specified for a checkbox + // that it defaults to "on". + // (WebKit defaults to "" instead) + checkOn: ( input.value === "on" ), + + // Make sure that a selected-by-default option has a working selected property. + // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) + optSelected: opt.selected, + + // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) + getSetAttribute: div.className !== "t", + + // Tests for enctype support on a form (#6743) + enctype: !!document.createElement("form").enctype, + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>", + + // jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode + boxModel: ( document.compatMode === "CSS1Compat" ), + + // Will be defined later + submitBubbles: true, + changeBubbles: true, + focusinBubbles: false, + deleteExpando: true, + noCloneEvent: true, + inlineBlockNeedsLayout: false, + shrinkWrapBlocks: false, + reliableMarginRight: true, + boxSizingReliable: true, + pixelPosition: false + }; + + // Make sure checked status is properly cloned + input.checked = true; + support.noCloneChecked = input.cloneNode( true ).checked; + + // Make sure that the options inside disabled selects aren't marked as disabled + // (WebKit marks them as disabled) + select.disabled = true; + support.optDisabled = !opt.disabled; + + // Test to see if it's possible to delete an expando from an element + // Fails in Internet Explorer + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + + if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { + div.attachEvent( "onclick", clickFn = function() { + // Cloning a node shouldn't copy over any + // bound event handlers (IE does this) + support.noCloneEvent = false; + }); + div.cloneNode( true ).fireEvent("onclick"); + div.detachEvent( "onclick", clickFn ); + } + + // Check if a radio maintains its value + // after being appended to the DOM + input = document.createElement("input"); + input.value = "t"; + input.setAttribute( "type", "radio" ); + support.radioValue = input.value === "t"; + + input.setAttribute( "checked", "checked" ); + + // #11217 - WebKit loses check when the name is after the checked attribute + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + fragment = document.createDocumentFragment(); + fragment.appendChild( div.lastChild ); + + // WebKit doesn't clone checked state correctly in fragments + support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + support.appendChecked = input.checked; + + fragment.removeChild( input ); + fragment.appendChild( div ); + + // Technique from Juriy Zaytsev + // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ + // We only care about the case where non-standard event systems + // are used, namely in IE. Short-circuiting here helps us to + // avoid an eval call (in setAttribute) which can cause CSP + // to go haywire. See: https://developer.mozilla.org/en/Security/CSP + if ( div.attachEvent ) { + for ( i in { + submit: true, + change: true, + focusin: true + }) { + eventName = "on" + i; + isSupported = ( eventName in div ); + if ( !isSupported ) { + div.setAttribute( eventName, "return;" ); + isSupported = ( typeof div[ eventName ] === "function" ); + } + support[ i + "Bubbles" ] = isSupported; + } + } + + // Run tests that need a body at doc ready + jQuery(function() { + var container, div, tds, marginDiv, + divReset = "padding:0;margin:0;border:0;display:block;overflow:hidden;", + body = document.getElementsByTagName("body")[0]; + + if ( !body ) { + // Return for frameset docs that don't have a body + return; + } + + container = document.createElement("div"); + container.style.cssText = "visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px"; + body.insertBefore( container, body.firstChild ); + + // Construct the test element + div = document.createElement("div"); + container.appendChild( div ); + + // Check if table cells still have offsetWidth/Height when they are set + // to display:none and there are still other visible table cells in a + // table row; if so, offsetWidth/Height are not reliable for use when + // determining if an element has been hidden directly using + // display:none (it is still safe to use offsets if a parent element is + // hidden; don safety goggles and see bug #4512 for more information). + // (only IE 8 fails this test) + div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>"; + tds = div.getElementsByTagName("td"); + tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none"; + isSupported = ( tds[ 0 ].offsetHeight === 0 ); + + tds[ 0 ].style.display = ""; + tds[ 1 ].style.display = "none"; + + // Check if empty table cells still have offsetWidth/Height + // (IE <= 8 fail this test) + support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); + + // Check box-sizing and margin behavior + div.innerHTML = ""; + div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;"; + support.boxSizing = ( div.offsetWidth === 4 ); + support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 ); + + // NOTE: To any future maintainer, we've window.getComputedStyle + // because jsdom on node.js will break without it. + if ( window.getComputedStyle ) { + support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%"; + support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px"; + + // Check if div with explicit width and no margin-right incorrectly + // gets computed margin-right based on width of container. For more + // info see bug #3333 + // Fails in WebKit before Feb 2011 nightlies + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + marginDiv = document.createElement("div"); + marginDiv.style.cssText = div.style.cssText = divReset; + marginDiv.style.marginRight = marginDiv.style.width = "0"; + div.style.width = "1px"; + div.appendChild( marginDiv ); + support.reliableMarginRight = + !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight ); + } + + if ( typeof div.style.zoom !== "undefined" ) { + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + // (IE < 8 does this) + div.innerHTML = ""; + div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1"; + support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 ); + + // Check if elements with layout shrink-wrap their children + // (IE 6 does this) + div.style.display = "block"; + div.style.overflow = "visible"; + div.innerHTML = "<div></div>"; + div.firstChild.style.width = "5px"; + support.shrinkWrapBlocks = ( div.offsetWidth !== 3 ); + + container.style.zoom = 1; + } + + // Null elements to avoid leaks in IE + body.removeChild( container ); + container = div = tds = marginDiv = null; + }); + + // Null elements to avoid leaks in IE + fragment.removeChild( div ); + all = a = select = opt = input = fragment = div = null; + + return support; +})(); +var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/, + rmultiDash = /([A-Z])/g; + +jQuery.extend({ + cache: {}, + + deletedIds: [], + + // Remove at next major release (1.9/2.0) + uuid: 0, + + // Unique for each copy of jQuery on the page + // Non-digits removed to match rinlinejQuery + expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), + + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "embed": true, + // Ban all objects except for Flash (which handle expandos) + "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", + "applet": true + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, ret, + internalKey = jQuery.expando, + getByName = typeof name === "string", + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + elem[ internalKey ] = id = jQuery.deletedIds.pop() || jQuery.guid++; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + cache[ id ] = {}; + + // Avoids exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( getByName ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; + }, + + removeData: function( elem, name, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, i, l, + + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split(" "); + } + } + } + + for ( i = 0, l = name.length; i < l; i++ ) { + delete thisCache[ name[i] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject( cache[ id ] ) ) { + return; + } + } + + // Destroy the cache + if ( isNode ) { + jQuery.cleanData( [ elem ], true ); + + // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) + } else if ( jQuery.support.deleteExpando || cache != cache.window ) { + delete cache[ id ]; + + // When all else fails, null + } else { + cache[ id ] = null; + } + }, + + // For internal use only. + _data: function( elem, name, data ) { + return jQuery.data( elem, name, data, true ); + }, + + // A method for determining if a DOM node can handle the data expando + acceptData: function( elem ) { + var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ]; + + // nodes accept data unless otherwise specified; rejection can be conditional + return !noData || noData !== true && elem.getAttribute("classid") === noData; + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var parts, part, attr, name, l, + elem = this[0], + i = 0, + data = null; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = jQuery.data( elem ); + + if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { + attr = elem.attributes; + for ( l = attr.length; i < l; i++ ) { + name = attr[i].name; + + if ( !name.indexOf( "data-" ) ) { + name = jQuery.camelCase( name.substring(5) ); + + dataAttr( elem, name, data[ name ] ); + } + } + jQuery._data( elem, "parsedAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + parts = key.split( ".", 2 ); + parts[1] = parts[1] ? "." + parts[1] : ""; + part = parts[1] + "!"; + + return jQuery.access( this, function( value ) { + + if ( value === undefined ) { + data = this.triggerHandler( "getData" + part, [ parts[0] ] ); + + // Try to fetch any internally stored data first + if ( data === undefined && elem ) { + data = jQuery.data( elem, key ); + data = dataAttr( elem, key, data ); + } + + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + } + + parts[1] = value; + this.each(function() { + var self = jQuery( this ); + + self.triggerHandler( "setData" + part, parts ); + jQuery.data( this, key, value ); + self.triggerHandler( "changeData" + part, parts ); + }); + }, null, value, arguments.length > 1, null, false ); + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + // Only convert to a number if it doesn't change the string + +data + "" === data ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + var name; + for ( name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} +jQuery.extend({ + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || jQuery.isArray(data) ) { + queue = jQuery._data( elem, type, jQuery.makeArray(data) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // not intended for public consumption - generates a queueHooks object, or returns the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return jQuery._data( elem, key ) || jQuery._data( elem, key, { + empty: jQuery.Callbacks("once memory").add(function() { + jQuery.removeData( elem, type + "queue", true ); + jQuery.removeData( elem, key, true ); + }) + }); + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[0], type ); + } + + return data === undefined ? + this : + this.each(function() { + var queue = jQuery.queue( this, type, data ); + + // ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + // Based off of the plugin by Clint Helfers, with permission. + // http://blindsignals.com/index.php/2009/07/jquery-delay/ + delay: function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = setTimeout( next, time ); + hooks.stop = function() { + clearTimeout( timeout ); + }; + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while( i-- ) { + tmp = jQuery._data( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +}); +var nodeHook, boolHook, fixSpecified, + rclass = /[\t\r\n]/g, + rreturn = /\r/g, + rtype = /^(?:button|input)$/i, + rfocusable = /^(?:button|input|object|select|textarea)$/i, + rclickable = /^a(?:rea|)$/i, + rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, + getSetAttribute = jQuery.support.getSetAttribute; + +jQuery.fn.extend({ + attr: function( name, value ) { + return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each(function() { + jQuery.removeAttr( this, name ); + }); + }, + + prop: function( name, value ) { + return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + name = jQuery.propFix[ name ] || name; + return this.each(function() { + // try/catch handles cases where IE balks (such as removing a property on window) + try { + this[ name ] = undefined; + delete this[ name ]; + } catch( e ) {} + }); + }, + + addClass: function( value ) { + var classNames, i, l, elem, + setClass, c, cl; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).addClass( value.call(this, j, this.className) ); + }); + } + + if ( value && typeof value === "string" ) { + classNames = value.split( core_rspace ); + + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; + + if ( elem.nodeType === 1 ) { + if ( !elem.className && classNames.length === 1 ) { + elem.className = value; + + } else { + setClass = " " + elem.className + " "; + + for ( c = 0, cl = classNames.length; c < cl; c++ ) { + if ( setClass.indexOf( " " + classNames[ c ] + " " ) < 0 ) { + setClass += classNames[ c ] + " "; + } + } + elem.className = jQuery.trim( setClass ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var removes, className, elem, c, cl, i, l; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).removeClass( value.call(this, j, this.className) ); + }); + } + if ( (value && typeof value === "string") || value === undefined ) { + removes = ( value || "" ).split( core_rspace ); + + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; + if ( elem.nodeType === 1 && elem.className ) { + + className = (" " + elem.className + " ").replace( rclass, " " ); + + // loop over each item in the removal list + for ( c = 0, cl = removes.length; c < cl; c++ ) { + // Remove until there is nothing to remove, + while ( className.indexOf(" " + removes[ c ] + " ") >= 0 ) { + className = className.replace( " " + removes[ c ] + " " , " " ); + } + } + elem.className = value ? jQuery.trim( className ) : ""; + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isBool = typeof stateVal === "boolean"; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( i ) { + jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); + }); + } + + return this.each(function() { + if ( type === "string" ) { + // toggle individual class names + var className, + i = 0, + self = jQuery( this ), + state = stateVal, + classNames = value.split( core_rspace ); + + while ( (className = classNames[ i++ ]) ) { + // check each className given, space separated list + state = isBool ? state : !self.hasClass( className ); + self[ state ? "addClass" : "removeClass" ]( className ); + } + + } else if ( type === "undefined" || type === "boolean" ) { + if ( this.className ) { + // store className if set + jQuery._data( this, "__className__", this.className ); + } + + // toggle whole className + this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; + } + }); + }, + + hasClass: function( selector ) { + var className = " " + selector + " ", + i = 0, + l = this.length; + for ( ; i < l; i++ ) { + if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) { + return true; + } + } + + return false; + }, + + val: function( value ) { + var hooks, ret, isFunction, + elem = this[0]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { + return ret; + } + + ret = elem.value; + + return typeof ret === "string" ? + // handle most common string cases + ret.replace(rreturn, "") : + // handle cases where value is null/undef or number + ret == null ? "" : ret; + } + + return; + } + + isFunction = jQuery.isFunction( value ); + + return this.each(function( i ) { + var val, + self = jQuery(this); + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, self.val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + } else if ( typeof val === "number" ) { + val += ""; + } else if ( jQuery.isArray( val ) ) { + val = jQuery.map(val, function ( value ) { + return value == null ? "" : value + ""; + }); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + }); + } +}); + +jQuery.extend({ + valHooks: { + option: { + get: function( elem ) { + // attributes.value is undefined in Blackberry 4.7 but + // uses .value. See #6932 + var val = elem.attributes.value; + return !val || val.specified ? elem.value : elem.text; + } + }, + select: { + get: function( elem ) { + var value, option, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one" || index < 0, + values = one ? null : [], + max = one ? index + 1 : options.length, + i = index < 0 ? + max : + one ? index : 0; + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // oldIE doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + // Don't return options that are disabled or in a disabled optgroup + ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) && + ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var values = jQuery.makeArray( value ); + + jQuery(elem).find("option").each(function() { + this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; + }); + + if ( !values.length ) { + elem.selectedIndex = -1; + } + return values; + } + } + }, + + // Unused in 1.8, left in so attrFn-stabbers won't die; remove in 1.9 + attrFn: {}, + + attr: function( elem, name, value, pass ) { + var ret, hooks, notxml, + nType = elem.nodeType; + + // don't get/set attributes on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( pass && jQuery.isFunction( jQuery.fn[ name ] ) ) { + return jQuery( elem )[ name ]( value ); + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + // All attributes are lowercase + // Grab necessary hook if one is defined + if ( notxml ) { + name = name.toLowerCase(); + hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook ); + } + + if ( value !== undefined ) { + + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + + } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + elem.setAttribute( name, value + "" ); + return value; + } + + } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + + ret = elem.getAttribute( name ); + + // Non-existent attributes return null, we normalize to undefined + return ret === null ? + undefined : + ret; + } + }, + + removeAttr: function( elem, value ) { + var propName, attrNames, name, isBool, + i = 0; + + if ( value && elem.nodeType === 1 ) { + + attrNames = value.split( core_rspace ); + + for ( ; i < attrNames.length; i++ ) { + name = attrNames[ i ]; + + if ( name ) { + propName = jQuery.propFix[ name ] || name; + isBool = rboolean.test( name ); + + // See #9699 for explanation of this approach (setting first, then removal) + // Do not do this for boolean attributes (see #10870) + if ( !isBool ) { + jQuery.attr( elem, name, "" ); + } + elem.removeAttribute( getSetAttribute ? name : propName ); + + // Set corresponding property to false for boolean attributes + if ( isBool && propName in elem ) { + elem[ propName ] = false; + } + } + } + } + }, + + attrHooks: { + type: { + set: function( elem, value ) { + // We can't allow the type property to be changed (since it causes problems in IE) + if ( rtype.test( elem.nodeName ) && elem.parentNode ) { + jQuery.error( "type property can't be changed" ); + } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { + // Setting the type on a radio button after the value resets the value in IE6-9 + // Reset value to it's default in case type is set after value + // This is for element creation + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + }, + // Use the value property for back compat + // Use the nodeHook for button elements in IE6/7 (#1954) + value: { + get: function( elem, name ) { + if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { + return nodeHook.get( elem, name ); + } + return name in elem ? + elem.value : + null; + }, + set: function( elem, value, name ) { + if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { + return nodeHook.set( elem, value, name ); + } + // Does not return so that setAttribute is also used + elem.value = value; + } + } + }, + + propFix: { + tabindex: "tabIndex", + readonly: "readOnly", + "for": "htmlFor", + "class": "className", + maxlength: "maxLength", + cellspacing: "cellSpacing", + cellpadding: "cellPadding", + rowspan: "rowSpan", + colspan: "colSpan", + usemap: "useMap", + frameborder: "frameBorder", + contenteditable: "contentEditable" + }, + + prop: function( elem, name, value ) { + var ret, hooks, notxml, + nType = elem.nodeType; + + // don't get/set properties on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + if ( notxml ) { + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + return ( elem[ name ] = value ); + } + + } else { + if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + return elem[ name ]; + } + } + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + var attributeNode = elem.getAttributeNode("tabindex"); + + return attributeNode && attributeNode.specified ? + parseInt( attributeNode.value, 10 ) : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + undefined; + } + } + } +}); + +// Hook for boolean attributes +boolHook = { + get: function( elem, name ) { + // Align boolean attributes with corresponding properties + // Fall back to attribute presence where some booleans are not supported + var attrNode, + property = jQuery.prop( elem, name ); + return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ? + name.toLowerCase() : + undefined; + }, + set: function( elem, value, name ) { + var propName; + if ( value === false ) { + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + // value is true since we know at this point it's type boolean and not false + // Set boolean attributes to the same name and set the DOM property + propName = jQuery.propFix[ name ] || name; + if ( propName in elem ) { + // Only set the IDL specifically if it already exists on the element + elem[ propName ] = true; + } + + elem.setAttribute( name, name.toLowerCase() ); + } + return name; + } +}; + +// IE6/7 do not support getting/setting some attributes with get/setAttribute +if ( !getSetAttribute ) { + + fixSpecified = { + name: true, + id: true, + coords: true + }; + + // Use this for any attribute in IE6/7 + // This fixes almost every IE6/7 issue + nodeHook = jQuery.valHooks.button = { + get: function( elem, name ) { + var ret; + ret = elem.getAttributeNode( name ); + return ret && ( fixSpecified[ name ] ? ret.value !== "" : ret.specified ) ? + ret.value : + undefined; + }, + set: function( elem, value, name ) { + // Set the existing or create a new attribute node + var ret = elem.getAttributeNode( name ); + if ( !ret ) { + ret = document.createAttribute( name ); + elem.setAttributeNode( ret ); + } + return ( ret.value = value + "" ); + } + }; + + // Set width and height to auto instead of 0 on empty string( Bug #8150 ) + // This is for removals + jQuery.each([ "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + set: function( elem, value ) { + if ( value === "" ) { + elem.setAttribute( name, "auto" ); + return value; + } + } + }); + }); + + // Set contenteditable to false on removals(#10429) + // Setting to empty string throws an error as an invalid value + jQuery.attrHooks.contenteditable = { + get: nodeHook.get, + set: function( elem, value, name ) { + if ( value === "" ) { + value = "false"; + } + nodeHook.set( elem, value, name ); + } + }; +} + + +// Some attributes require a special call on IE +if ( !jQuery.support.hrefNormalized ) { + jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + get: function( elem ) { + var ret = elem.getAttribute( name, 2 ); + return ret === null ? undefined : ret; + } + }); + }); +} + +if ( !jQuery.support.style ) { + jQuery.attrHooks.style = { + get: function( elem ) { + // Return undefined in the case of empty string + // Normalize to lowercase since IE uppercases css property names + return elem.style.cssText.toLowerCase() || undefined; + }, + set: function( elem, value ) { + return ( elem.style.cssText = value + "" ); + } + }; +} + +// Safari mis-reports the default selected property of an option +// Accessing the parent's selectedIndex property fixes it +if ( !jQuery.support.optSelected ) { + jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { + get: function( elem ) { + var parent = elem.parentNode; + + if ( parent ) { + parent.selectedIndex; + + // Make sure that it also works with optgroups, see #5701 + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + return null; + } + }); +} + +// IE6/7 call enctype encoding +if ( !jQuery.support.enctype ) { + jQuery.propFix.enctype = "encoding"; +} + +// Radios and checkboxes getter/setter +if ( !jQuery.support.checkOn ) { + jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + get: function( elem ) { + // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified + return elem.getAttribute("value") === null ? "on" : elem.value; + } + }; + }); +} +jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { + set: function( elem, value ) { + if ( jQuery.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); + } + } + }); +}); +var rformElems = /^(?:textarea|input|select)$/i, + rtypenamespace = /^([^\.]*|)(?:\.(.+)|)$/, + rhoverHack = /(?:^|\s)hover(\.\S+|)\b/, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|contextmenu)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + hoverHack = function( events ) { + return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" ); + }; + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + add: function( elem, types, handler, data, selector ) { + + var elemData, eventHandle, events, + t, tns, type, namespaces, handleObj, + handleObjIn, handlers, special; + + // Don't attach events to noData or text/comment nodes (allow plain objects tho) + if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + events = elemData.events; + if ( !events ) { + elemData.events = events = {}; + } + eventHandle = elemData.handle; + if ( !eventHandle ) { + elemData.handle = eventHandle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + // jQuery(...).bind("mouseover mouseout", fn); + types = jQuery.trim( hoverHack(types) ).split( " " ); + for ( t = 0; t < types.length; t++ ) { + + tns = rtypenamespace.exec( types[t] ) || []; + type = tns[1]; + namespaces = ( tns[2] || "" ).split( "." ).sort(); + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: tns[1], + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join(".") + }, handleObjIn ); + + // Init the event handler queue if we're the first + handlers = events[ type ]; + if ( !handlers ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + global: {}, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var t, tns, type, origType, namespaces, origCount, + j, events, special, eventType, handleObj, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ); + + if ( !elemData || !(events = elemData.events) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = jQuery.trim( hoverHack( types || "" ) ).split(" "); + for ( t = 0; t < types.length; t++ ) { + tns = rtypenamespace.exec( types[t] ) || []; + type = origType = tns[1]; + namespaces = tns[2]; + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector? special.delegateType : special.bindType ) || type; + eventType = events[ type ] || []; + origCount = eventType.length; + namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.|)") + "(\\.|$)") : null; + + // Remove matching events + for ( j = 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !namespaces || namespaces.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + eventType.splice( j--, 1 ); + + if ( handleObj.selector ) { + eventType.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( eventType.length === 0 && origCount !== eventType.length ) { + if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + delete elemData.handle; + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery.removeData( elem, "events", true ); + } + }, + + // Events that are safe to short-circuit if no handlers are attached. + // Native DOM events should not be added, they may have inline handlers. + customEvent: { + "getData": true, + "setData": true, + "changeData": true + }, + + trigger: function( event, data, elem, onlyHandlers ) { + // Don't do events on text and comment nodes + if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) { + return; + } + + // Event object or event type + var cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType, + type = event.type || event, + namespaces = []; + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "!" ) >= 0 ) { + // Exclusive events trigger only for the exact event (no namespaces) + type = type.slice(0, -1); + exclusive = true; + } + + if ( type.indexOf( "." ) >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + + if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { + // No jQuery handlers for this event type, and it can't have inline handlers + return; + } + + // Caller can pass in an Event, Object, or just an event type string + event = typeof event === "object" ? + // jQuery.Event object + event[ jQuery.expando ] ? event : + // Object literal + new jQuery.Event( type, event ) : + // Just the event type (string) + new jQuery.Event( type ); + + event.type = type; + event.isTrigger = true; + event.exclusive = exclusive; + event.namespace = namespaces.join( "." ); + event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null; + ontype = type.indexOf( ":" ) < 0 ? "on" + type : ""; + + // Handle a global trigger + if ( !elem ) { + + // TODO: Stop taunting the data cache; remove global events and always attach to document + cache = jQuery.cache; + for ( i in cache ) { + if ( cache[ i ].events && cache[ i ].events[ type ] ) { + jQuery.event.trigger( event, data, cache[ i ].handle.elem, true ); + } + } + return; + } + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data != null ? jQuery.makeArray( data ) : []; + data.unshift( event ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + eventPath = [[ elem, special.bindType || type ]]; + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode; + for ( old = elem; cur; cur = cur.parentNode ) { + eventPath.push([ cur, bubbleType ]); + old = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( old === (elem.ownerDocument || document) ) { + eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]); + } + } + + // Fire handlers on the event path + for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) { + + cur = eventPath[i][0]; + event.type = eventPath[i][1]; + + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + // Note that this is a bare JS function and not a jQuery handler + handle = ontype && cur[ ontype ]; + if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) { + event.preventDefault(); + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) && + !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + // IE<9 dies on focus/blur to hidden element (#1486) + if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + old = elem[ ontype ]; + + if ( old ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + elem[ type ](); + jQuery.event.triggered = undefined; + + if ( old ) { + elem[ ontype ] = old; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event || window.event ); + + var i, j, cur, ret, selMatch, matched, matches, handleObj, sel, related, + handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []), + delegateCount = handlers.delegateCount, + args = core_slice.call( arguments ), + run_all = !event.exclusive && !event.namespace, + special = jQuery.event.special[ event.type ] || {}, + handlerQueue = []; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers that should run if there are delegated events + // Avoid non-left-click bubbling in Firefox (#3861) + if ( delegateCount && !(event.button && event.type === "click") ) { + + for ( cur = event.target; cur != this; cur = cur.parentNode || this ) { + + // Don't process clicks (ONLY) on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.disabled !== true || event.type !== "click" ) { + selMatch = {}; + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + sel = handleObj.selector; + + if ( selMatch[ sel ] === undefined ) { + selMatch[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) >= 0 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( selMatch[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push({ elem: cur, matches: matches }); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( handlers.length > delegateCount ) { + handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) }); + } + + // Run delegates first; they may want to stop propagation beneath us + for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) { + matched = handlerQueue[ i ]; + event.currentTarget = matched.elem; + + for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) { + handleObj = matched.matches[ j ]; + + // Triggered event must either 1) be non-exclusive and have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). + if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) { + + event.data = handleObj.data; + event.handleObj = handleObj; + + ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) + .apply( matched.elem, args ); + + if ( ret !== undefined ) { + event.result = ret; + if ( ret === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 *** + props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + filter: function( event, original ) { + var eventDoc, doc, body, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, + originalEvent = event, + fixHook = jQuery.event.fixHooks[ event.type ] || {}, + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = jQuery.Event( originalEvent ); + + for ( i = copy.length; i; ) { + prop = copy[ --i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Target should not be a text node (#504, Safari) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // For mouse/key events, metaKey==false if it's undefined (#3368, #11328; IE6/7/8) + event.metaKey = !!event.metaKey; + + return fixHook.filter? fixHook.filter( event, originalEvent ) : event; + }, + + special: { + load: { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + + focus: { + delegateType: "focusin" + }, + blur: { + delegateType: "focusout" + }, + + beforeunload: { + setup: function( data, namespaces, eventHandle ) { + // We only want to do this special case on windows + if ( jQuery.isWindow( this ) ) { + this.onbeforeunload = eventHandle; + } + }, + + teardown: function( namespaces, eventHandle ) { + if ( this.onbeforeunload === eventHandle ) { + this.onbeforeunload = null; + } + } + } + }, + + simulate: function( type, elem, event, bubble ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + var e = jQuery.extend( + new jQuery.Event(), + event, + { type: type, + isSimulated: true, + originalEvent: {} + } + ); + if ( bubble ) { + jQuery.event.trigger( e, null, elem ); + } else { + jQuery.event.dispatch.call( elem, e ); + } + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +// Some plugins are using, but it's undocumented/deprecated and will be removed. +// The 1.7 special event interface should provide all the hooks needed now. +jQuery.event.handle = jQuery.event.dispatch; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + var name = "on" + type; + + if ( elem.detachEvent ) { + + // #8545, #7054, preventing memory leaks for custom events in IE6-8 + // detachEvent needed property on element, by name of that event, to properly expose it to GC + if ( typeof elem[ name ] === "undefined" ) { + elem[ name ] = null; + } + + elem.detachEvent( name, handle ); + } + }; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !(this instanceof jQuery.Event) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || + src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +function returnFalse() { + return false; +} +function returnTrue() { + return true; +} + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + preventDefault: function() { + this.isDefaultPrevented = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + + // if preventDefault exists run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // otherwise set the returnValue property of the original event to false (IE) + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + this.isPropagationStopped = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + // if stopPropagation exists run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + // otherwise set the cancelBubble property of the original event to true (IE) + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + }, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj, + selector = handleObj.selector; + + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || (related !== target && !jQuery.contains( target, related )) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +}); + +// IE submit delegation +if ( !jQuery.support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; + if ( form && !jQuery._data( form, "_submit_attached" ) ) { + jQuery.event.add( form, "submit._submit", function( event ) { + event._submit_bubble = true; + }); + jQuery._data( form, "_submit_attached", true ); + } + }); + // return undefined since we don't need an event listener + }, + + postDispatch: function( event ) { + // If form was submitted by the user, bubble the event up the tree + if ( event._submit_bubble ) { + delete event._submit_bubble; + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event, true ); + } + } + }, + + teardown: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !jQuery.support.changeBubbles ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._just_changed = true; + } + }); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._just_changed && !event.isTrigger ) { + this._just_changed = false; + } + // Allow triggered, simulated change events (#11500) + jQuery.event.simulate( "change", this, event, true ); + }); + } + return false; + } + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "_change_attached" ) ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event, true ); + } + }); + jQuery._data( elem, "_change_attached", true ); + } + }); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return !rformElems.test( this.nodeName ); + } + }; +} + +// Create "bubbling" focus and blur events +if ( !jQuery.support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler while someone wants focusin/focusout + var attaches = 0, + handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + if ( attaches++ === 0 ) { + document.addEventListener( orig, handler, true ); + } + }, + teardown: function() { + if ( --attaches === 0 ) { + document.removeEventListener( orig, handler, true ); + } + } + }; + }); +} + +jQuery.fn.extend({ + + on: function( types, selector, data, fn, /*INTERNAL*/ one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { // && selector != null + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + this.on( type, selector, data, types[ type ], one ); + } + return this; + } + + if ( data == null && fn == null ) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return this; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return this.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + }); + }, + one: function( types, selector, data, fn ) { + return this.on( types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each(function() { + jQuery.event.remove( this, types, fn, selector ); + }); + }, + + bind: function( types, data, fn ) { + return this.on( types, null, data, fn ); + }, + unbind: function( types, fn ) { + return this.off( types, null, fn ); + }, + + live: function( types, data, fn ) { + jQuery( this.context ).on( types, this.selector, data, fn ); + return this; + }, + die: function( types, fn ) { + jQuery( this.context ).off( types, this.selector || "**", fn ); + return this; + }, + + delegate: function( selector, types, data, fn ) { + return this.on( types, selector, data, fn ); + }, + undelegate: function( selector, types, fn ) { + // ( namespace ) or ( selector, types [, fn] ) + return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn ); + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + triggerHandler: function( type, data ) { + if ( this[0] ) { + return jQuery.event.trigger( type, data, this[0], true ); + } + }, + + toggle: function( fn ) { + // Save reference to arguments for access in closure + var args = arguments, + guid = fn.guid || jQuery.guid++, + i = 0, + toggler = function( event ) { + // Figure out which function to execute + var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; + jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); + + // Make sure that clicks stop + event.preventDefault(); + + // and execute the function + return args[ lastToggle ].apply( this, arguments ) || false; + }; + + // link all the functions, so any of them can unbind this click handler + toggler.guid = guid; + while ( i < args.length ) { + args[ i++ ].guid = guid; + } + + return this.click( toggler ); + }, + + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +}); + +jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + if ( fn == null ) { + fn = data; + data = null; + } + + return arguments.length > 0 ? + this.on( name, null, data, fn ) : + this.trigger( name ); + }; + + if ( rkeyEvent.test( name ) ) { + jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks; + } + + if ( rmouseEvent.test( name ) ) { + jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks; + } +}); +/*! + * Sizzle CSS Selector Engine + * Copyright 2012 jQuery Foundation and other contributors + * Released under the MIT license + * http://sizzlejs.com/ + */ +(function( window, undefined ) { + +var cachedruns, + assertGetIdNotName, + Expr, + getText, + isXML, + contains, + compile, + sortOrder, + hasDuplicate, + outermostContext, + + baseHasDuplicate = true, + strundefined = "undefined", + + expando = ( "sizcache" + Math.random() ).replace( ".", "" ), + + Token = String, + document = window.document, + docElem = document.documentElement, + dirruns = 0, + done = 0, + pop = [].pop, + push = [].push, + slice = [].slice, + // Use a stripped-down indexOf if a native one is unavailable + indexOf = [].indexOf || function( elem ) { + var i = 0, + len = this.length; + for ( ; i < len; i++ ) { + if ( this[i] === elem ) { + return i; + } + } + return -1; + }, + + // Augment a function for special use by Sizzle + markFunction = function( fn, value ) { + fn[ expando ] = value == null || value; + return fn; + }, + + createCache = function() { + var cache = {}, + keys = []; + + return markFunction(function( key, value ) { + // Only keep the most recent entries + if ( keys.push( key ) > Expr.cacheLength ) { + delete cache[ keys.shift() ]; + } + + // Retrieve with (key + " ") to avoid collision with native Object.prototype properties (see Issue #157) + return (cache[ key + " " ] = value); + }, cache ); + }, + + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + + // Regex + + // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + // http://www.w3.org/TR/css3-syntax/#characters + characterEncoding = "(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+", + + // Loosely modeled on CSS identifier characters + // An unquoted value should be a CSS identifier (http://www.w3.org/TR/css3-selectors/#attribute-selectors) + // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = characterEncoding.replace( "w", "w#" ), + + // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors + operators = "([*^$|!~]?=)", + attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace + + "*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]", + + // Prefer arguments not in parens/brackets, + // then attribute selectors and non-pseudos (denoted by :), + // then anything else + // These preferences are here to reduce the number of selectors + // needing tokenize in the PSEUDO preFilter + pseudos = ":(" + characterEncoding + ")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:" + attributes + ")|[^:]|\\\\.)*|.*))\\)|)", + + // For matchExpr.POS and matchExpr.needsContext + pos = ":(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ), + rpseudo = new RegExp( pseudos ), + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/, + + rnot = /^:not/, + rsibling = /[\x20\t\r\n\f]*[+~]/, + rendsWithNot = /:not\($/, + + rheader = /h\d/i, + rinputs = /input|select|textarea|button/i, + + rbackslash = /\\(?!\\)/g, + + matchExpr = { + "ID": new RegExp( "^#(" + characterEncoding + ")" ), + "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), + "NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ), + "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "POS": new RegExp( pos, "i" ), + "CHILD": new RegExp( "^:(only|nth|first|last)-child(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + // For use in libraries implementing .is() + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|" + pos, "i" ) + }, + + // Support + + // Used for testing something on an element + assert = function( fn ) { + var div = document.createElement("div"); + + try { + return fn( div ); + } catch (e) { + return false; + } finally { + // release memory in IE + div = null; + } + }, + + // Check if getElementsByTagName("*") returns only elements + assertTagNameNoComments = assert(function( div ) { + div.appendChild( document.createComment("") ); + return !div.getElementsByTagName("*").length; + }), + + // Check if getAttribute returns normalized href attributes + assertHrefNotNormalized = assert(function( div ) { + div.innerHTML = "<a href='#'></a>"; + return div.firstChild && typeof div.firstChild.getAttribute !== strundefined && + div.firstChild.getAttribute("href") === "#"; + }), + + // Check if attributes should be retrieved by attribute nodes + assertAttributes = assert(function( div ) { + div.innerHTML = "<select></select>"; + var type = typeof div.lastChild.getAttribute("multiple"); + // IE8 returns a string for some attributes even when not present + return type !== "boolean" && type !== "string"; + }), + + // Check if getElementsByClassName can be trusted + assertUsableClassName = assert(function( div ) { + // Opera can't find a second classname (in 9.6) + div.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>"; + if ( !div.getElementsByClassName || !div.getElementsByClassName("e").length ) { + return false; + } + + // Safari 3.2 caches class attributes and doesn't catch changes + div.lastChild.className = "e"; + return div.getElementsByClassName("e").length === 2; + }), + + // Check if getElementById returns elements by name + // Check if getElementsByName privileges form controls or returns elements by ID + assertUsableName = assert(function( div ) { + // Inject content + div.id = expando + 0; + div.innerHTML = "<a name='" + expando + "'></a><div name='" + expando + "'></div>"; + docElem.insertBefore( div, docElem.firstChild ); + + // Test + var pass = document.getElementsByName && + // buggy browsers will return fewer than the correct 2 + document.getElementsByName( expando ).length === 2 + + // buggy browsers will return more than the correct 0 + document.getElementsByName( expando + 0 ).length; + assertGetIdNotName = !document.getElementById( expando ); + + // Cleanup + docElem.removeChild( div ); + + return pass; + }); + +// If slice is not available, provide a backup +try { + slice.call( docElem.childNodes, 0 )[0].nodeType; +} catch ( e ) { + slice = function( i ) { + var elem, + results = []; + for ( ; (elem = this[i]); i++ ) { + results.push( elem ); + } + return results; + }; +} + +function Sizzle( selector, context, results, seed ) { + results = results || []; + context = context || document; + var match, elem, xml, m, + nodeType = context.nodeType; + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + if ( nodeType !== 1 && nodeType !== 9 ) { + return []; + } + + xml = isXML( context ); + + if ( !xml && !seed ) { + if ( (match = rquickExpr.exec( selector )) ) { + // Speed-up: Sizzle("#ID") + if ( (m = match[1]) ) { + if ( nodeType === 9 ) { + elem = context.getElementById( m ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE, Opera, and Webkit return items + // by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + } else { + // Context is not a document + if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && + contains( context, elem ) && elem.id === m ) { + results.push( elem ); + return results; + } + } + + // Speed-up: Sizzle("TAG") + } else if ( match[2] ) { + push.apply( results, slice.call(context.getElementsByTagName( selector ), 0) ); + return results; + + // Speed-up: Sizzle(".CLASS") + } else if ( (m = match[3]) && assertUsableClassName && context.getElementsByClassName ) { + push.apply( results, slice.call(context.getElementsByClassName( m ), 0) ); + return results; + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed, xml ); +} + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + return Sizzle( expr, null, null, [ elem ] ).length > 0; +}; + +// Returns a function to use in pseudos for input types +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +// Returns a function to use in pseudos for buttons +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +// Returns a function to use in pseudos for positionals +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( nodeType ) { + if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (see #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + } else { + + // If no nodeType, this is expected to be an array + for ( ; (node = elem[i]); i++ ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } + return ret; +}; + +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +// Element contains another +contains = Sizzle.contains = docElem.contains ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && adown.contains && adown.contains(bup) ); + } : + docElem.compareDocumentPosition ? + function( a, b ) { + return b && !!( a.compareDocumentPosition( b ) & 16 ); + } : + function( a, b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + return false; + }; + +Sizzle.attr = function( elem, name ) { + var val, + xml = isXML( elem ); + + if ( !xml ) { + name = name.toLowerCase(); + } + if ( (val = Expr.attrHandle[ name ]) ) { + return val( elem ); + } + if ( xml || assertAttributes ) { + return elem.getAttribute( name ); + } + val = elem.getAttributeNode( name ); + return val ? + typeof elem[ name ] === "boolean" ? + elem[ name ] ? name : null : + val.specified ? val.value : null : + null; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + // IE6/7 return a modified href + attrHandle: assertHrefNotNormalized ? + {} : + { + "href": function( elem ) { + return elem.getAttribute( "href", 2 ); + }, + "type": function( elem ) { + return elem.getAttribute("type"); + } + }, + + find: { + "ID": assertGetIdNotName ? + function( id, context, xml ) { + if ( typeof context.getElementById !== strundefined && !xml ) { + var m = context.getElementById( id ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [m] : []; + } + } : + function( id, context, xml ) { + if ( typeof context.getElementById !== strundefined && !xml ) { + var m = context.getElementById( id ); + + return m ? + m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ? + [m] : + undefined : + []; + } + }, + + "TAG": assertTagNameNoComments ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== strundefined ) { + return context.getElementsByTagName( tag ); + } + } : + function( tag, context ) { + var results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + var elem, + tmp = [], + i = 0; + + for ( ; (elem = results[i]); i++ ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }, + + "NAME": assertUsableName && function( tag, context ) { + if ( typeof context.getElementsByName !== strundefined ) { + return context.getElementsByName( name ); + } + }, + + "CLASS": assertUsableClassName && function( className, context, xml ) { + if ( typeof context.getElementsByClassName !== strundefined && !xml ) { + return context.getElementsByClassName( className ); + } + } + }, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( rbackslash, "" ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[4] || match[5] || "" ).replace( rbackslash, "" ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 3 xn-component of xn+y argument ([+-]?\d*n|) + 4 sign of xn-component + 5 x of xn-component + 6 sign of y-component + 7 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1] === "nth" ) { + // nth-child requires argument + if ( !match[2] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[3] = +( match[3] ? match[4] + (match[5] || 1) : 2 * ( match[2] === "even" || match[2] === "odd" ) ); + match[4] = +( ( match[6] + match[7] ) || match[2] === "odd" ); + + // other types prohibit arguments + } else if ( match[2] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var unquoted, excess; + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + if ( match[3] ) { + match[2] = match[3]; + } else if ( (unquoted = match[4]) ) { + // Only check arguments that contain a pseudo + if ( rpseudo.test(unquoted) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + unquoted = unquoted.slice( 0, excess ); + match[0] = match[0].slice( 0, excess ); + } + match[2] = unquoted; + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + "ID": assertGetIdNotName ? + function( id ) { + id = id.replace( rbackslash, "" ); + return function( elem ) { + return elem.getAttribute("id") === id; + }; + } : + function( id ) { + id = id.replace( rbackslash, "" ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id"); + return node && node.value === id; + }; + }, + + "TAG": function( nodeName ) { + if ( nodeName === "*" ) { + return function() { return true; }; + } + nodeName = nodeName.replace( rbackslash, "" ).toLowerCase(); + + return function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ expando ][ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem, context ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.substr( result.length - check.length ) === check : + operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.substr( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, argument, first, last ) { + + if ( type === "nth" ) { + return function( elem ) { + var node, diff, + parent = elem.parentNode; + + if ( first === 1 && last === 0 ) { + return true; + } + + if ( parent ) { + diff = 0; + for ( node = parent.firstChild; node; node = node.nextSibling ) { + if ( node.nodeType === 1 ) { + diff++; + if ( elem === node ) { + break; + } + } + } + } + + // Incorporate the offset (or cast to NaN), then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + }; + } + + return function( elem ) { + var node = elem; + + switch ( type ) { + case "only": + case "first": + while ( (node = node.previousSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + if ( type === "first" ) { + return true; + } + + node = elem; + + /* falls through */ + case "last": + while ( (node = node.nextSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + return true; + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf.call( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + "enabled": function( elem ) { + return elem.disabled === false; + }, + + "disabled": function( elem ) { + return elem.disabled === true; + }, + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)), + // not comment, processing instructions, or others + // Thanks to Diego Perini for the nodeName shortcut + // Greater than "@" means alpha characters (specifically not starting with "#" or "?") + var nodeType; + elem = elem.firstChild; + while ( elem ) { + if ( elem.nodeName > "@" || (nodeType = elem.nodeType) === 3 || nodeType === 4 ) { + return false; + } + elem = elem.nextSibling; + } + return true; + }, + + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "text": function( elem ) { + var type, attr; + // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) + // use getAttribute instead to test this case + return elem.nodeName.toLowerCase() === "input" && + (type = elem.type) === "text" && + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === type ); + }, + + // Input types + "radio": createInputPseudo("radio"), + "checkbox": createInputPseudo("checkbox"), + "file": createInputPseudo("file"), + "password": createInputPseudo("password"), + "image": createInputPseudo("image"), + + "submit": createButtonPseudo("submit"), + "reset": createButtonPseudo("reset"), + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "focus": function( elem ) { + var doc = elem.ownerDocument; + return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + "active": function( elem ) { + return elem === elem.ownerDocument.activeElement; + }, + + // Positional types + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + for ( var i = 0; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + for ( var i = 1; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + for ( var i = argument < 0 ? argument + length : argument; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + for ( var i = argument < 0 ? argument + length : argument; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +function siblingCheck( a, b, ret ) { + if ( a === b ) { + return ret; + } + + var cur = a.nextSibling; + + while ( cur ) { + if ( cur === b ) { + return -1; + } + + cur = cur.nextSibling; + } + + return 1; +} + +sortOrder = docElem.compareDocumentPosition ? + function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + return ( !a.compareDocumentPosition || !b.compareDocumentPosition ? + a.compareDocumentPosition : + a.compareDocumentPosition(b) & 4 + ) ? -1 : 1; + } : + function( a, b ) { + // The nodes are identical, we can exit early + if ( a === b ) { + hasDuplicate = true; + return 0; + + // Fallback to using sourceIndex (in IE) if it's available on both nodes + } else if ( a.sourceIndex && b.sourceIndex ) { + return a.sourceIndex - b.sourceIndex; + } + + var al, bl, + ap = [], + bp = [], + aup = a.parentNode, + bup = b.parentNode, + cur = aup; + + // If the nodes are siblings (or identical) we can do a quick check + if ( aup === bup ) { + return siblingCheck( a, b ); + + // If no parents were found then the nodes are disconnected + } else if ( !aup ) { + return -1; + + } else if ( !bup ) { + return 1; + } + + // Otherwise they're somewhere else in the tree so we need + // to build up a full list of the parentNodes for comparison + while ( cur ) { + ap.unshift( cur ); + cur = cur.parentNode; + } + + cur = bup; + + while ( cur ) { + bp.unshift( cur ); + cur = cur.parentNode; + } + + al = ap.length; + bl = bp.length; + + // Start walking down the tree looking for a discrepancy + for ( var i = 0; i < al && i < bl; i++ ) { + if ( ap[i] !== bp[i] ) { + return siblingCheck( ap[i], bp[i] ); + } + } + + // We ended someplace up the tree so do a sibling check + return i === al ? + siblingCheck( a, bp[i], -1 ) : + siblingCheck( ap[i], b, 1 ); + }; + +// Always assume the presence of duplicates if sort doesn't +// pass them to our comparison function (as in Google Chrome). +[0, 0].sort( sortOrder ); +baseHasDuplicate = !hasDuplicate; + +// Document sorting and removing duplicates +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + i = 1, + j = 0; + + hasDuplicate = baseHasDuplicate; + results.sort( sortOrder ); + + if ( hasDuplicate ) { + for ( ; (elem = results[i]); i++ ) { + if ( elem === results[ i - 1 ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + return results; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +function tokenize( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ expando ][ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( tokens = [] ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + tokens.push( matched = new Token( match.shift() ) ); + soFar = soFar.slice( matched.length ); + + // Cast descendant combinators to space + matched.type = match[0].replace( rtrim, " " ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + + tokens.push( matched = new Token( match.shift() ) ); + soFar = soFar.slice( matched.length ); + matched.type = type; + matched.matches = match; + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && combinator.dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( checkNonElements || elem.nodeType === 1 ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching + if ( !xml ) { + var cache, + dirkey = dirruns + " " + doneName + " ", + cachedkey = dirkey + cachedruns; + while ( (elem = elem[ dir ]) ) { + if ( checkNonElements || elem.nodeType === 1 ) { + if ( (cache = elem[ expando ]) === cachedkey ) { + return elem.sizset; + } else if ( typeof cache === "string" && cache.indexOf(dirkey) === 0 ) { + if ( elem.sizset ) { + return elem; + } + } else { + elem[ expando ] = cachedkey; + if ( matcher( elem, context, xml ) ) { + elem.sizset = true; + return elem; + } + elem.sizset = false; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( checkNonElements || elem.nodeType === 1 ) { + if ( matcher( elem, context, xml ) ) { + return elem; + } + } + } + } + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf.call( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + return ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && tokens.slice( 0, i - 1 ).join("").replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && tokens.join("") + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, expandContext ) { + var elem, j, matcher, + setMatched = [], + matchedCount = 0, + i = "0", + unmatched = seed && [], + outermost = expandContext != null, + contextBackup = outermostContext, + // We must always have either seed elements or context + elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ), + // Nested matchers should use non-integer dirruns + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.E); + + if ( outermost ) { + outermostContext = context !== document && context; + cachedruns = superMatcher.el; + } + + // Add elements passing elementMatchers directly to results + for ( ; (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + for ( j = 0; (matcher = elementMatchers[j]); j++ ) { + if ( matcher( elem, context, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + cachedruns = ++superMatcher.el; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // Apply set filters to unmatched elements + matchedCount += i; + if ( bySet && i !== matchedCount ) { + for ( j = 0; (matcher = setMatchers[j]); j++ ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + superMatcher.el = 0; + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ expando ][ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !group ) { + group = tokenize( selector ); + } + i = group.length; + while ( i-- ) { + cached = matcherFromTokens( group[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + } + return cached; +}; + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function select( selector, context, results, seed, xml ) { + var i, tokens, token, type, find, + match = tokenize( selector ), + j = match.length; + + if ( !seed ) { + // Try to minimize operations if there is only one group + if ( match.length === 1 ) { + + // Take a shortcut and set the context if the root selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + context.nodeType === 9 && !xml && + Expr.relative[ tokens[1].type ] ) { + + context = Expr.find["ID"]( token.matches[0].replace( rbackslash, "" ), context, xml )[0]; + if ( !context ) { + return results; + } + + selector = selector.slice( tokens.shift().length ); + } + + // Fetch a seed set for right-to-left matching + for ( i = matchExpr["POS"].test( selector ) ? -1 : tokens.length - 1; i >= 0; i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( rbackslash, "" ), + rsibling.test( tokens[0].type ) && context.parentNode || context, + xml + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && tokens.join(""); + if ( !selector ) { + push.apply( results, slice.call( seed, 0 ) ); + return results; + } + + break; + } + } + } + } + } + + // Compile and execute a filtering function + // Provide `match` to avoid retokenization if we modified the selector above + compile( selector, match )( + seed, + context, + xml, + results, + rsibling.test( selector ) + ); + return results; +} + +if ( document.querySelectorAll ) { + (function() { + var disconnectedMatch, + oldSelect = select, + rescape = /'|\\/g, + rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g, + + // qSa(:focus) reports false when true (Chrome 21), no need to also add to buggyMatches since matches checks buggyQSA + // A support test would require too much code (would include document ready) + rbuggyQSA = [ ":focus" ], + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + // A support test would require too much code (would include document ready) + // just skip matchesSelector for :active + rbuggyMatches = [ ":active" ], + matches = docElem.matchesSelector || + docElem.mozMatchesSelector || + docElem.webkitMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector; + + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( div ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explictly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + div.innerHTML = "<select><option selected=''></option></select>"; + + // IE8 - Some boolean attributes are not treated correctly + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" ); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here (do not put tests after this one) + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + }); + + assert(function( div ) { + + // Opera 10-12/IE9 - ^= $= *= and empty values + // Should not select anything + div.innerHTML = "<p test=''></p>"; + if ( div.querySelectorAll("[test^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here (do not put tests after this one) + div.innerHTML = "<input type='hidden'/>"; + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push(":enabled", ":disabled"); + } + }); + + // rbuggyQSA always contains :focus, so no need for a length check + rbuggyQSA = /* rbuggyQSA.length && */ new RegExp( rbuggyQSA.join("|") ); + + select = function( selector, context, results, seed, xml ) { + // Only use querySelectorAll when not filtering, + // when this is not xml, + // and when no QSA bugs apply + if ( !seed && !xml && !rbuggyQSA.test( selector ) ) { + var groups, i, + old = true, + nid = expando, + newContext = context, + newSelector = context.nodeType === 9 && selector; + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + groups = tokenize( selector ); + + if ( (old = context.getAttribute("id")) ) { + nid = old.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", nid ); + } + nid = "[id='" + nid + "'] "; + + i = groups.length; + while ( i-- ) { + groups[i] = nid + groups[i].join(""); + } + newContext = rsibling.test( selector ) && context.parentNode || context; + newSelector = groups.join(","); + } + + if ( newSelector ) { + try { + push.apply( results, slice.call( newContext.querySelectorAll( + newSelector + ), 0 ) ); + return results; + } catch(qsaError) { + } finally { + if ( !old ) { + context.removeAttribute("id"); + } + } + } + } + + return oldSelect( selector, context, results, seed, xml ); + }; + + if ( matches ) { + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + try { + matches.call( div, "[test!='']:sizzle" ); + rbuggyMatches.push( "!=", pseudos ); + } catch ( e ) {} + }); + + // rbuggyMatches always contains :active and :focus, so no need for a length check + rbuggyMatches = /* rbuggyMatches.length && */ new RegExp( rbuggyMatches.join("|") ); + + Sizzle.matchesSelector = function( elem, expr ) { + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + // rbuggyMatches always contains :active, so no need for an existence check + if ( !isXML( elem ) && !rbuggyMatches.test( expr ) && !rbuggyQSA.test( expr ) ) { + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch(e) {} + } + + return Sizzle( expr, null, null, [ elem ] ).length > 0; + }; + } + })(); +} + +// Deprecated +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Back-compat +function setFilters() {} +Expr.filters = setFilters.prototype = Expr.pseudos; +Expr.setFilters = new setFilters(); + +// Override sizzle attribute retrieval +Sizzle.attr = jQuery.attr; +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.pseudos; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + +})( window ); +var runtil = /Until$/, + rparentsprev = /^(?:parents|prev(?:Until|All))/, + isSimple = /^.[^:#\[\.,]*$/, + rneedsContext = jQuery.expr.match.needsContext, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend({ + find: function( selector ) { + var i, l, length, n, r, ret, + self = this; + + if ( typeof selector !== "string" ) { + return jQuery( selector ).filter(function() { + for ( i = 0, l = self.length; i < l; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }); + } + + ret = this.pushStack( "", "find", selector ); + + for ( i = 0, l = this.length; i < l; i++ ) { + length = ret.length; + jQuery.find( selector, this[i], ret ); + + if ( i > 0 ) { + // Make sure that the results are unique + for ( n = length; n < ret.length; n++ ) { + for ( r = 0; r < length; r++ ) { + if ( ret[r] === ret[n] ) { + ret.splice(n--, 1); + break; + } + } + } + } + } + + return ret; + }, + + has: function( target ) { + var i, + targets = jQuery( target, this ), + len = targets.length; + + return this.filter(function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + not: function( selector ) { + return this.pushStack( winnow(this, selector, false), "not", selector); + }, + + filter: function( selector ) { + return this.pushStack( winnow(this, selector, true), "filter", selector ); + }, + + is: function( selector ) { + return !!selector && ( + typeof selector === "string" ? + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + rneedsContext.test( selector ) ? + jQuery( selector, this.context ).index( this[0] ) >= 0 : + jQuery.filter( selector, this ).length > 0 : + this.filter( selector ).length > 0 ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + ret = [], + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( ; i < l; i++ ) { + cur = this[i]; + + while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) { + if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { + ret.push( cur ); + break; + } + cur = cur.parentNode; + } + } + + ret = ret.length > 1 ? jQuery.unique( ret ) : ret; + + return this.pushStack( ret, "closest", selectors ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[0], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + var set = typeof selector === "string" ? + jQuery( selector, context ) : + jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), + all = jQuery.merge( this.get(), set ); + + return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? + all : + jQuery.unique( all ) ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter(selector) + ); + } +}); + +jQuery.fn.andSelf = jQuery.fn.addBack; + +// A painfully simple check to see if an element is disconnected +// from a document (should be improved, where feasible). +function isDisconnected( node ) { + return !node || !node.parentNode || node.parentNode.nodeType === 11; +} + +function sibling( cur, dir ) { + do { + cur = cur[ dir ]; + } while ( cur && cur.nodeType !== 1 ); + + return cur; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( !runtil.test( name ) ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; + + if ( this.length > 1 && rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + + return this.pushStack( ret, name, core_slice.call( arguments ).join(",") ); + }; +}); + +jQuery.extend({ + filter: function( expr, elems, not ) { + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 ? + jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : + jQuery.find.matches(expr, elems); + }, + + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, keep ) { + + // Can't pass null or undefined to indexOf in Firefox 4 + // Set to 0 to skip string check + qualifier = qualifier || 0; + + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep(elements, function( elem, i ) { + var retVal = !!qualifier.call( elem, i, elem ); + return retVal === keep; + }); + + } else if ( qualifier.nodeType ) { + return jQuery.grep(elements, function( elem, i ) { + return ( elem === qualifier ) === keep; + }); + + } else if ( typeof qualifier === "string" ) { + var filtered = jQuery.grep(elements, function( elem ) { + return elem.nodeType === 1; + }); + + if ( isSimple.test( qualifier ) ) { + return jQuery.filter(qualifier, filtered, !keep); + } else { + qualifier = jQuery.filter( qualifier, filtered ); + } + } + + return jQuery.grep(elements, function( elem, i ) { + return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep; + }); +} +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + +var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", + rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, + rtagName = /<([\w:]+)/, + rtbody = /<tbody/i, + rhtml = /<|&#?\w+;/, + rnoInnerhtml = /<(?:script|style|link)/i, + rnocache = /<(?:script|object|embed|option|style)/i, + rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"), + rcheckableType = /^(?:checkbox|radio)$/, + // checked="checked" or checked + rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, + rscriptType = /\/(java|ecma)script/i, + rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g, + wrapMap = { + option: [ 1, "<select multiple='multiple'>", "</select>" ], + legend: [ 1, "<fieldset>", "</fieldset>" ], + thead: [ 1, "<table>", "</table>" ], + tr: [ 2, "<table><tbody>", "</tbody></table>" ], + td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ], + col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ], + area: [ 1, "<map>", "</map>" ], + _default: [ 0, "", "" ] + }, + safeFragment = createSafeFragment( document ), + fragmentDiv = safeFragment.appendChild( document.createElement("div") ); + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, +// unless wrapped in a div with non-breaking characters in front of it. +if ( !jQuery.support.htmlSerialize ) { + wrapMap._default = [ 1, "X<div>", "</div>" ]; +} + +jQuery.fn.extend({ + text: function( value ) { + return jQuery.access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) ); + }, null, value, arguments.length ); + }, + + wrapAll: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each(function(i) { + jQuery(this).wrapAll( html.call(this, i) ); + }); + } + + if ( this[0] ) { + // The elements to wrap the target around + var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true); + + if ( this[0].parentNode ) { + wrap.insertBefore( this[0] ); + } + + wrap.map(function() { + var elem = this; + + while ( elem.firstChild && elem.firstChild.nodeType === 1 ) { + elem = elem.firstChild; + } + + return elem; + }).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each(function(i) { + jQuery(this).wrapInner( html.call(this, i) ); + }); + } + + return this.each(function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + }); + }, + + wrap: function( html ) { + var isFunction = jQuery.isFunction( html ); + + return this.each(function(i) { + jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html ); + }); + }, + + unwrap: function() { + return this.parent().each(function() { + if ( !jQuery.nodeName( this, "body" ) ) { + jQuery( this ).replaceWith( this.childNodes ); + } + }).end(); + }, + + append: function() { + return this.domManip(arguments, true, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 ) { + this.appendChild( elem ); + } + }); + }, + + prepend: function() { + return this.domManip(arguments, true, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 ) { + this.insertBefore( elem, this.firstChild ); + } + }); + }, + + before: function() { + if ( !isDisconnected( this[0] ) ) { + return this.domManip(arguments, false, function( elem ) { + this.parentNode.insertBefore( elem, this ); + }); + } + + if ( arguments.length ) { + var set = jQuery.clean( arguments ); + return this.pushStack( jQuery.merge( set, this ), "before", this.selector ); + } + }, + + after: function() { + if ( !isDisconnected( this[0] ) ) { + return this.domManip(arguments, false, function( elem ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + }); + } + + if ( arguments.length ) { + var set = jQuery.clean( arguments ); + return this.pushStack( jQuery.merge( this, set ), "after", this.selector ); + } + }, + + // keepData is for internal use only--do not document + remove: function( selector, keepData ) { + var elem, + i = 0; + + for ( ; (elem = this[i]) != null; i++ ) { + if ( !selector || jQuery.filter( selector, [ elem ] ).length ) { + if ( !keepData && elem.nodeType === 1 ) { + jQuery.cleanData( elem.getElementsByTagName("*") ); + jQuery.cleanData( [ elem ] ); + } + + if ( elem.parentNode ) { + elem.parentNode.removeChild( elem ); + } + } + } + + return this; + }, + + empty: function() { + var elem, + i = 0; + + for ( ; (elem = this[i]) != null; i++ ) { + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( elem.getElementsByTagName("*") ); + } + + // Remove any remaining nodes + while ( elem.firstChild ) { + elem.removeChild( elem.firstChild ); + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function () { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + }); + }, + + html: function( value ) { + return jQuery.access( this, function( value ) { + var elem = this[0] || {}, + i = 0, + l = this.length; + + if ( value === undefined ) { + return elem.nodeType === 1 ? + elem.innerHTML.replace( rinlinejQuery, "" ) : + undefined; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + ( jQuery.support.htmlSerialize || !rnoshimcache.test( value ) ) && + ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && + !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) { + + value = value.replace( rxhtmlTag, "<$1></$2>" ); + + try { + for (; i < l; i++ ) { + // Remove element nodes and prevent memory leaks + elem = this[i] || {}; + if ( elem.nodeType === 1 ) { + jQuery.cleanData( elem.getElementsByTagName( "*" ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch(e) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function( value ) { + if ( !isDisconnected( this[0] ) ) { + // Make sure that the elements are removed from the DOM before they are inserted + // this can help fix replacing a parent with child elements + if ( jQuery.isFunction( value ) ) { + return this.each(function(i) { + var self = jQuery(this), old = self.html(); + self.replaceWith( value.call( this, i, old ) ); + }); + } + + if ( typeof value !== "string" ) { + value = jQuery( value ).detach(); + } + + return this.each(function() { + var next = this.nextSibling, + parent = this.parentNode; + + jQuery( this ).remove(); + + if ( next ) { + jQuery(next).before( value ); + } else { + jQuery(parent).append( value ); + } + }); + } + + return this.length ? + this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) : + this; + }, + + detach: function( selector ) { + return this.remove( selector, true ); + }, + + domManip: function( args, table, callback ) { + + // Flatten any nested arrays + args = [].concat.apply( [], args ); + + var results, first, fragment, iNoClone, + i = 0, + value = args[0], + scripts = [], + l = this.length; + + // We can't cloneNode fragments that contain checked, in WebKit + if ( !jQuery.support.checkClone && l > 1 && typeof value === "string" && rchecked.test( value ) ) { + return this.each(function() { + jQuery(this).domManip( args, table, callback ); + }); + } + + if ( jQuery.isFunction(value) ) { + return this.each(function(i) { + var self = jQuery(this); + args[0] = value.call( this, i, table ? self.html() : undefined ); + self.domManip( args, table, callback ); + }); + } + + if ( this[0] ) { + results = jQuery.buildFragment( args, this, scripts ); + fragment = results.fragment; + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + if ( first ) { + table = table && jQuery.nodeName( first, "tr" ); + + // Use the original fragment for the last item instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + // Fragments from the fragment cache must always be cloned and never used in place. + for ( iNoClone = results.cacheable || l - 1; i < l; i++ ) { + callback.call( + table && jQuery.nodeName( this[i], "table" ) ? + findOrAppend( this[i], "tbody" ) : + this[i], + i === iNoClone ? + fragment : + jQuery.clone( fragment, true, true ) + ); + } + } + + // Fix #11809: Avoid leaking memory + fragment = first = null; + + if ( scripts.length ) { + jQuery.each( scripts, function( i, elem ) { + if ( elem.src ) { + if ( jQuery.ajax ) { + jQuery.ajax({ + url: elem.src, + type: "GET", + dataType: "script", + async: false, + global: false, + "throws": true + }); + } else { + jQuery.error("no ajax"); + } + } else { + jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "" ) ); + } + + if ( elem.parentNode ) { + elem.parentNode.removeChild( elem ); + } + }); + } + } + + return this; + } +}); + +function findOrAppend( elem, tag ) { + return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) ); +} + +function cloneCopyEvent( src, dest ) { + + if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { + return; + } + + var type, i, l, + oldData = jQuery._data( src ), + curData = jQuery._data( dest, oldData ), + events = oldData.events; + + if ( events ) { + delete curData.handle; + curData.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + + // make the cloned public data object a copy from the original + if ( curData.data ) { + curData.data = jQuery.extend( {}, curData.data ); + } +} + +function cloneFixAttributes( src, dest ) { + var nodeName; + + // We do not need to do anything for non-Elements + if ( dest.nodeType !== 1 ) { + return; + } + + // clearAttributes removes the attributes, which we don't want, + // but also removes the attachEvent events, which we *do* want + if ( dest.clearAttributes ) { + dest.clearAttributes(); + } + + // mergeAttributes, in contrast, only merges back on the + // original attributes, not the events + if ( dest.mergeAttributes ) { + dest.mergeAttributes( src ); + } + + nodeName = dest.nodeName.toLowerCase(); + + if ( nodeName === "object" ) { + // IE6-10 improperly clones children of object elements using classid. + // IE10 throws NoModificationAllowedError if parent is null, #12132. + if ( dest.parentNode ) { + dest.outerHTML = src.outerHTML; + } + + // This path appears unavoidable for IE9. When cloning an object + // element in IE9, the outerHTML strategy above is not sufficient. + // If the src has innerHTML and the destination does not, + // copy the src.innerHTML into the dest.innerHTML. #10324 + if ( jQuery.support.html5Clone && (src.innerHTML && !jQuery.trim(dest.innerHTML)) ) { + dest.innerHTML = src.innerHTML; + } + + } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + // IE6-8 fails to persist the checked state of a cloned checkbox + // or radio button. Worse, IE6-7 fail to give the cloned element + // a checked appearance if the defaultChecked value isn't also set + + dest.defaultChecked = dest.checked = src.checked; + + // IE6-7 get confused and end up setting the value of a cloned + // checkbox/radio button to an empty string instead of "on" + if ( dest.value !== src.value ) { + dest.value = src.value; + } + + // IE6-8 fails to return the selected option to the default selected + // state when cloning options + } else if ( nodeName === "option" ) { + dest.selected = src.defaultSelected; + + // IE6-8 fails to set the defaultValue to the correct value when + // cloning other types of input fields + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + + // IE blanks contents when cloning scripts + } else if ( nodeName === "script" && dest.text !== src.text ) { + dest.text = src.text; + } + + // Event data gets referenced instead of copied if the expando + // gets copied too + dest.removeAttribute( jQuery.expando ); +} + +jQuery.buildFragment = function( args, context, scripts ) { + var fragment, cacheable, cachehit, + first = args[ 0 ]; + + // Set context from what may come in as undefined or a jQuery collection or a node + // Updated to fix #12266 where accessing context[0] could throw an exception in IE9/10 & + // also doubles as fix for #8950 where plain objects caused createDocumentFragment exception + context = context || document; + context = !context.nodeType && context[0] || context; + context = context.ownerDocument || context; + + // Only cache "small" (1/2 KB) HTML strings that are associated with the main document + // Cloning options loses the selected state, so don't cache them + // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment + // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache + // Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501 + if ( args.length === 1 && typeof first === "string" && first.length < 512 && context === document && + first.charAt(0) === "<" && !rnocache.test( first ) && + (jQuery.support.checkClone || !rchecked.test( first )) && + (jQuery.support.html5Clone || !rnoshimcache.test( first )) ) { + + // Mark cacheable and look for a hit + cacheable = true; + fragment = jQuery.fragments[ first ]; + cachehit = fragment !== undefined; + } + + if ( !fragment ) { + fragment = context.createDocumentFragment(); + jQuery.clean( args, context, fragment, scripts ); + + // Update the cache, but only store false + // unless this is a second parsing of the same content + if ( cacheable ) { + jQuery.fragments[ first ] = cachehit && fragment; + } + } + + return { fragment: fragment, cacheable: cacheable }; +}; + +jQuery.fragments = {}; + +jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + i = 0, + ret = [], + insert = jQuery( selector ), + l = insert.length, + parent = this.length === 1 && this[0].parentNode; + + if ( (parent == null || parent && parent.nodeType === 11 && parent.childNodes.length === 1) && l === 1 ) { + insert[ original ]( this[0] ); + return this; + } else { + for ( ; i < l; i++ ) { + elems = ( i > 0 ? this.clone(true) : this ).get(); + jQuery( insert[i] )[ original ]( elems ); + ret = ret.concat( elems ); + } + + return this.pushStack( ret, name, insert.selector ); + } + }; +}); + +function getAll( elem ) { + if ( typeof elem.getElementsByTagName !== "undefined" ) { + return elem.getElementsByTagName( "*" ); + + } else if ( typeof elem.querySelectorAll !== "undefined" ) { + return elem.querySelectorAll( "*" ); + + } else { + return []; + } +} + +// Used in clean, fixes the defaultChecked property +function fixDefaultChecked( elem ) { + if ( rcheckableType.test( elem.type ) ) { + elem.defaultChecked = elem.checked; + } +} + +jQuery.extend({ + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var srcElements, + destElements, + i, + clone; + + if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { + clone = elem.cloneNode( true ); + + // IE<=8 does not properly clone detached, unknown element nodes + } else { + fragmentDiv.innerHTML = elem.outerHTML; + fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); + } + + if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) && + (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { + // IE copies events bound via attachEvent when using cloneNode. + // Calling detachEvent on the clone will also remove the events + // from the original. In order to get around this, we use some + // proprietary methods to clear the events. Thanks to MooTools + // guys for this hotness. + + cloneFixAttributes( elem, clone ); + + // Using Sizzle here is crazy slow, so we use getElementsByTagName instead + srcElements = getAll( elem ); + destElements = getAll( clone ); + + // Weird iteration because IE will replace the length property + // with an element if you are cloning the body and one of the + // elements on the page has a name or id of "length" + for ( i = 0; srcElements[i]; ++i ) { + // Ensure that the destination node is not null; Fixes #9587 + if ( destElements[i] ) { + cloneFixAttributes( srcElements[i], destElements[i] ); + } + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + cloneCopyEvent( elem, clone ); + + if ( deepDataAndEvents ) { + srcElements = getAll( elem ); + destElements = getAll( clone ); + + for ( i = 0; srcElements[i]; ++i ) { + cloneCopyEvent( srcElements[i], destElements[i] ); + } + } + } + + srcElements = destElements = null; + + // Return the cloned set + return clone; + }, + + clean: function( elems, context, fragment, scripts ) { + var i, j, elem, tag, wrap, depth, div, hasBody, tbody, len, handleScript, jsTags, + safe = context === document && safeFragment, + ret = []; + + // Ensure that context is a document + if ( !context || typeof context.createDocumentFragment === "undefined" ) { + context = document; + } + + // Use the already-created safe fragment if context permits + for ( i = 0; (elem = elems[i]) != null; i++ ) { + if ( typeof elem === "number" ) { + elem += ""; + } + + if ( !elem ) { + continue; + } + + // Convert html string into DOM nodes + if ( typeof elem === "string" ) { + if ( !rhtml.test( elem ) ) { + elem = context.createTextNode( elem ); + } else { + // Ensure a safe container in which to render the html + safe = safe || createSafeFragment( context ); + div = context.createElement("div"); + safe.appendChild( div ); + + // Fix "XHTML"-style tags in all browsers + elem = elem.replace(rxhtmlTag, "<$1></$2>"); + + // Go to html and back, then peel off extra wrappers + tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + depth = wrap[0]; + div.innerHTML = wrap[1] + elem + wrap[2]; + + // Move to the right depth + while ( depth-- ) { + div = div.lastChild; + } + + // Remove IE's autoinserted <tbody> from table fragments + if ( !jQuery.support.tbody ) { + + // String was a <table>, *may* have spurious <tbody> + hasBody = rtbody.test(elem); + tbody = tag === "table" && !hasBody ? + div.firstChild && div.firstChild.childNodes : + + // String was a bare <thead> or <tfoot> + wrap[1] === "<table>" && !hasBody ? + div.childNodes : + []; + + for ( j = tbody.length - 1; j >= 0 ; --j ) { + if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) { + tbody[ j ].parentNode.removeChild( tbody[ j ] ); + } + } + } + + // IE completely kills leading whitespace when innerHTML is used + if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { + div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild ); + } + + elem = div.childNodes; + + // Take out of fragment container (we need a fresh div each time) + div.parentNode.removeChild( div ); + } + } + + if ( elem.nodeType ) { + ret.push( elem ); + } else { + jQuery.merge( ret, elem ); + } + } + + // Fix #11356: Clear elements from safeFragment + if ( div ) { + elem = div = safe = null; + } + + // Reset defaultChecked for any radios and checkboxes + // about to be appended to the DOM in IE 6/7 (#8060) + if ( !jQuery.support.appendChecked ) { + for ( i = 0; (elem = ret[i]) != null; i++ ) { + if ( jQuery.nodeName( elem, "input" ) ) { + fixDefaultChecked( elem ); + } else if ( typeof elem.getElementsByTagName !== "undefined" ) { + jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked ); + } + } + } + + // Append elements to a provided document fragment + if ( fragment ) { + // Special handling of each script element + handleScript = function( elem ) { + // Check if we consider it executable + if ( !elem.type || rscriptType.test( elem.type ) ) { + // Detach the script and store it in the scripts array (if provided) or the fragment + // Return truthy to indicate that it has been handled + return scripts ? + scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) : + fragment.appendChild( elem ); + } + }; + + for ( i = 0; (elem = ret[i]) != null; i++ ) { + // Check if we're done after handling an executable script + if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) { + // Append to fragment and handle embedded scripts + fragment.appendChild( elem ); + if ( typeof elem.getElementsByTagName !== "undefined" ) { + // handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration + jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript ); + + // Splice the scripts into ret after their former ancestor and advance our index beyond them + ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) ); + i += jsTags.length; + } + } + } + } + + return ret; + }, + + cleanData: function( elems, /* internal */ acceptData ) { + var data, id, elem, type, + i = 0, + internalKey = jQuery.expando, + cache = jQuery.cache, + deleteExpando = jQuery.support.deleteExpando, + special = jQuery.event.special; + + for ( ; (elem = elems[i]) != null; i++ ) { + + if ( acceptData || jQuery.acceptData( elem ) ) { + + id = elem[ internalKey ]; + data = id && cache[ id ]; + + if ( data ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Remove cache only if it was not already removed by jQuery.event.remove + if ( cache[ id ] ) { + + delete cache[ id ]; + + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( deleteExpando ) { + delete elem[ internalKey ]; + + } else if ( elem.removeAttribute ) { + elem.removeAttribute( internalKey ); + + } else { + elem[ internalKey ] = null; + } + + jQuery.deletedIds.push( id ); + } + } + } + } + } +}); +// Limit scope pollution from any deprecated API +(function() { + +var matched, browser; + +// Use of jQuery.browser is frowned upon. +// More details: http://api.jquery.com/jQuery.browser +// jQuery.uaMatch maintained for back-compat +jQuery.uaMatch = function( ua ) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) || + /(webkit)[ \/]([\w.]+)/.exec( ua ) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) || + /(msie) ([\w.]+)/.exec( ua ) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; +}; + +matched = jQuery.uaMatch( navigator.userAgent ); +browser = {}; + +if ( matched.browser ) { + browser[ matched.browser ] = true; + browser.version = matched.version; +} + +// Chrome is Webkit, but Webkit is also Safari. +if ( browser.chrome ) { + browser.webkit = true; +} else if ( browser.webkit ) { + browser.safari = true; +} + +jQuery.browser = browser; + +jQuery.sub = function() { + function jQuerySub( selector, context ) { + return new jQuerySub.fn.init( selector, context ); + } + jQuery.extend( true, jQuerySub, this ); + jQuerySub.superclass = this; + jQuerySub.fn = jQuerySub.prototype = this(); + jQuerySub.fn.constructor = jQuerySub; + jQuerySub.sub = this.sub; + jQuerySub.fn.init = function init( selector, context ) { + if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { + context = jQuerySub( context ); + } + + return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); + }; + jQuerySub.fn.init.prototype = jQuerySub.fn; + var rootjQuerySub = jQuerySub(document); + return jQuerySub; +}; + +})(); +var curCSS, iframe, iframeDoc, + ralpha = /alpha\([^)]*\)/i, + ropacity = /opacity=([^)]*)/, + rposition = /^(top|right|bottom|left)$/, + // swappable if display is none or starts with table except "table", "table-cell", or "table-caption" + // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rmargin = /^margin/, + rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ), + rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ), + rrelNum = new RegExp( "^([-+])=(" + core_pnum + ")", "i" ), + elemdisplay = { BODY: "block" }, + + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: 0, + fontWeight: 400 + }, + + cssExpand = [ "Top", "Right", "Bottom", "Left" ], + cssPrefixes = [ "Webkit", "O", "Moz", "ms" ], + + eventsToggle = jQuery.fn.toggle; + +// return a css property mapped to a potentially vendor prefixed property +function vendorPropName( style, name ) { + + // shortcut for names that are not vendor prefixed + if ( name in style ) { + return name; + } + + // check for vendor prefixed names + var capName = name.charAt(0).toUpperCase() + name.slice(1), + origName = name, + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in style ) { + return name; + } + } + + return origName; +} + +function isHidden( elem, el ) { + elem = el || elem; + return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); +} + +function showHide( elements, show ) { + var elem, display, + values = [], + index = 0, + length = elements.length; + + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + values[ index ] = jQuery._data( elem, "olddisplay" ); + if ( show ) { + // Reset the inline display of this element to learn if it is + // being hidden by cascaded rules or not + if ( !values[ index ] && elem.style.display === "none" ) { + elem.style.display = ""; + } + + // Set elements which have been overridden with display: none + // in a stylesheet to whatever the default browser style is + // for such an element + if ( elem.style.display === "" && isHidden( elem ) ) { + values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) ); + } + } else { + display = curCSS( elem, "display" ); + + if ( !values[ index ] && display !== "none" ) { + jQuery._data( elem, "olddisplay", display ); + } + } + } + + // Set the display of most of the elements in a second loop + // to avoid the constant reflow + for ( index = 0; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + if ( !show || elem.style.display === "none" || elem.style.display === "" ) { + elem.style.display = show ? values[ index ] || "" : "none"; + } + } + + return elements; +} + +jQuery.fn.extend({ + css: function( name, value ) { + return jQuery.access( this, function( elem, name, value ) { + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + }, + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state, fn2 ) { + var bool = typeof state === "boolean"; + + if ( jQuery.isFunction( state ) && jQuery.isFunction( fn2 ) ) { + return eventsToggle.apply( this, arguments ); + } + + return this.each(function() { + if ( bool ? state : isHidden( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + }); + } +}); + +jQuery.extend({ + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + + } + } + } + }, + + // Exclude the following css properties to add px + cssNumber: { + "fillOpacity": true, + "fontWeight": true, + "lineHeight": true, + "opacity": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: { + // normalize float css property + "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat" + }, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = jQuery.camelCase( name ), + style = elem.style; + + name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) ); + + // gets hook for the prefixed version + // followed by the unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // convert relative number strings (+= or -=) to relative numbers. #7345 + if ( type === "string" && (ret = rrelNum.exec( value )) ) { + value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) ); + // Fixes bug #9237 + type = "number"; + } + + // Make sure that NaN and null values aren't set. See: #7116 + if ( value == null || type === "number" && isNaN( value ) ) { + return; + } + + // If a number was passed in, add 'px' to the (except for certain CSS properties) + if ( type === "number" && !jQuery.cssNumber[ origName ] ) { + value += "px"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) { + // Wrapped to prevent IE from throwing errors when 'invalid' values are provided + // Fixes bug #5509 + try { + style[ name ] = value; + } catch(e) {} + } + + } else { + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) { + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, numeric, extra ) { + var val, num, hooks, + origName = jQuery.camelCase( name ); + + // Make sure that we're working with the right name + name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) ); + + // gets hook for the prefixed version + // followed by the unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name ); + } + + //convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Return, converting to number if forced or a qualifier was provided and val looks numeric + if ( numeric || extra !== undefined ) { + num = parseFloat( val ); + return numeric || jQuery.isNumeric( num ) ? num || 0 : val; + } + return val; + }, + + // A method for quickly swapping in/out CSS properties to get correct calculations + swap: function( elem, options, callback ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.call( elem ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; + } +}); + +// NOTE: To any future maintainer, we've window.getComputedStyle +// because jsdom on node.js will break without it. +if ( window.getComputedStyle ) { + curCSS = function( elem, name ) { + var ret, width, minWidth, maxWidth, + computed = window.getComputedStyle( elem, null ), + style = elem.style; + + if ( computed ) { + + // getPropertyValue is only needed for .css('filter') in IE9, see #12537 + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right + // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels + // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values + if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) { + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret; + }; +} else if ( document.documentElement.currentStyle ) { + curCSS = function( elem, name ) { + var left, rsLeft, + ret = elem.currentStyle && elem.currentStyle[ name ], + style = elem.style; + + // Avoid setting ret to empty string here + // so we don't default to auto + if ( ret == null && style && style[ name ] ) { + ret = style[ name ]; + } + + // From the awesome hack by Dean Edwards + // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 + + // If we're not dealing with a regular pixel number + // but a number that has a weird ending, we need to convert it to pixels + // but not position css attributes, as those are proportional to the parent element instead + // and we can't measure the parent instead because it might trigger a "stacking dolls" problem + if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) { + + // Remember the original values + left = style.left; + rsLeft = elem.runtimeStyle && elem.runtimeStyle.left; + + // Put in the new values to get a computed value out + if ( rsLeft ) { + elem.runtimeStyle.left = elem.currentStyle.left; + } + style.left = name === "fontSize" ? "1em" : ret; + ret = style.pixelLeft + "px"; + + // Revert the changed values + style.left = left; + if ( rsLeft ) { + elem.runtimeStyle.left = rsLeft; + } + } + + return ret === "" ? "auto" : ret; + }; +} + +function setPositiveNumber( elem, value, subtract ) { + var matches = rnumsplit.exec( value ); + return matches ? + Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) : + value; +} + +function augmentWidthOrHeight( elem, name, extra, isBorderBox ) { + var i = extra === ( isBorderBox ? "border" : "content" ) ? + // If we already have the right measurement, avoid augmentation + 4 : + // Otherwise initialize for horizontal or vertical properties + name === "width" ? 1 : 0, + + val = 0; + + for ( ; i < 4; i += 2 ) { + // both box models exclude margin, so add it if we want it + if ( extra === "margin" ) { + // we use jQuery.css instead of curCSS here + // because of the reliableMarginRight CSS hook! + val += jQuery.css( elem, extra + cssExpand[ i ], true ); + } + + // From this point on we use curCSS for maximum performance (relevant in animations) + if ( isBorderBox ) { + // border-box includes padding, so remove it if we want content + if ( extra === "content" ) { + val -= parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0; + } + + // at this point, extra isn't border nor margin, so remove border + if ( extra !== "margin" ) { + val -= parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0; + } + } else { + // at this point, extra isn't content, so add padding + val += parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0; + + // at this point, extra isn't content nor padding, so add border + if ( extra !== "padding" ) { + val += parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0; + } + } + } + + return val; +} + +function getWidthOrHeight( elem, name, extra ) { + + // Start with offset property, which is equivalent to the border-box value + var val = name === "width" ? elem.offsetWidth : elem.offsetHeight, + valueIsBorderBox = true, + isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box"; + + // some non-html elements return undefined for offsetWidth, so check for null/undefined + // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285 + // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668 + if ( val <= 0 || val == null ) { + // Fall back to computed then uncomputed css if necessary + val = curCSS( elem, name ); + if ( val < 0 || val == null ) { + val = elem.style[ name ]; + } + + // Computed unit is not pixels. Stop here and return. + if ( rnumnonpx.test(val) ) { + return val; + } + + // we need the check for style in case a browser which returns unreliable values + // for getComputedStyle silently falls back to the reliable elem.style + valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] ); + + // Normalize "", auto, and prepare for extra + val = parseFloat( val ) || 0; + } + + // use the active box-sizing model to add/subtract irrelevant styles + return ( val + + augmentWidthOrHeight( + elem, + name, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox + ) + ) + "px"; +} + + +// Try to determine the default display value of an element +function css_defaultDisplay( nodeName ) { + if ( elemdisplay[ nodeName ] ) { + return elemdisplay[ nodeName ]; + } + + var elem = jQuery( "<" + nodeName + ">" ).appendTo( document.body ), + display = elem.css("display"); + elem.remove(); + + // If the simple way fails, + // get element's real default display by attaching it to a temp iframe + if ( display === "none" || display === "" ) { + // Use the already-created iframe if possible + iframe = document.body.appendChild( + iframe || jQuery.extend( document.createElement("iframe"), { + frameBorder: 0, + width: 0, + height: 0 + }) + ); + + // Create a cacheable copy of the iframe document on first call. + // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML + // document to it; WebKit & Firefox won't allow reusing the iframe document. + if ( !iframeDoc || !iframe.createElement ) { + iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document; + iframeDoc.write("<!doctype html><html><body>"); + iframeDoc.close(); + } + + elem = iframeDoc.body.appendChild( iframeDoc.createElement(nodeName) ); + + display = curCSS( elem, "display" ); + document.body.removeChild( iframe ); + } + + // Store the correct default display + elemdisplay[ nodeName ] = display; + + return display; +} + +jQuery.each([ "height", "width" ], function( i, name ) { + jQuery.cssHooks[ name ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + // certain elements can have dimension info if we invisibly show them + // however, it must have a current display style that would benefit from this + if ( elem.offsetWidth === 0 && rdisplayswap.test( curCSS( elem, "display" ) ) ) { + return jQuery.swap( elem, cssShow, function() { + return getWidthOrHeight( elem, name, extra ); + }); + } else { + return getWidthOrHeight( elem, name, extra ); + } + } + }, + + set: function( elem, value, extra ) { + return setPositiveNumber( elem, value, extra ? + augmentWidthOrHeight( + elem, + name, + extra, + jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box" + ) : 0 + ); + } + }; +}); + +if ( !jQuery.support.opacity ) { + jQuery.cssHooks.opacity = { + get: function( elem, computed ) { + // IE uses filters for opacity + return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ? + ( 0.01 * parseFloat( RegExp.$1 ) ) + "" : + computed ? "1" : ""; + }, + + set: function( elem, value ) { + var style = elem.style, + currentStyle = elem.currentStyle, + opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "", + filter = currentStyle && currentStyle.filter || style.filter || ""; + + // IE has trouble with opacity if it does not have layout + // Force it by setting the zoom level + style.zoom = 1; + + // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652 + if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" && + style.removeAttribute ) { + + // Setting style.filter to null, "" & " " still leave "filter:" in the cssText + // if "filter:" is present at all, clearType is disabled, we want to avoid this + // style.removeAttribute is IE Only, but so apparently is this code path... + style.removeAttribute( "filter" ); + + // if there there is no filter style applied in a css rule, we are done + if ( currentStyle && !currentStyle.filter ) { + return; + } + } + + // otherwise, set new filter values + style.filter = ralpha.test( filter ) ? + filter.replace( ralpha, opacity ) : + filter + " " + opacity; + } + }; +} + +// These hooks cannot be added until DOM ready because the support test +// for it is not run until after DOM ready +jQuery(function() { + if ( !jQuery.support.reliableMarginRight ) { + jQuery.cssHooks.marginRight = { + get: function( elem, computed ) { + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + // Work around by temporarily setting element display to inline-block + return jQuery.swap( elem, { "display": "inline-block" }, function() { + if ( computed ) { + return curCSS( elem, "marginRight" ); + } + }); + } + }; + } + + // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084 + // getComputedStyle returns percent when specified for top/left/bottom/right + // rather than make the css module depend on the offset module, we just check for it here + if ( !jQuery.support.pixelPosition && jQuery.fn.position ) { + jQuery.each( [ "top", "left" ], function( i, prop ) { + jQuery.cssHooks[ prop ] = { + get: function( elem, computed ) { + if ( computed ) { + var ret = curCSS( elem, prop ); + // if curCSS returns percentage, fallback to offset + return rnumnonpx.test( ret ) ? jQuery( elem ).position()[ prop ] + "px" : ret; + } + } + }; + }); + } + +}); + +if ( jQuery.expr && jQuery.expr.filters ) { + jQuery.expr.filters.hidden = function( elem ) { + return ( elem.offsetWidth === 0 && elem.offsetHeight === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || curCSS( elem, "display" )) === "none"); + }; + + jQuery.expr.filters.visible = function( elem ) { + return !jQuery.expr.filters.hidden( elem ); + }; +} + +// These hooks are used by animate to expand properties +jQuery.each({ + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i, + + // assumes a single number if not a string + parts = typeof value === "string" ? value.split(" ") : [ value ], + expanded = {}; + + for ( i = 0; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( !rmargin.test( prefix ) ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +}); +var r20 = /%20/g, + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i, + rselectTextarea = /^(?:select|textarea)/i; + +jQuery.fn.extend({ + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map(function(){ + return this.elements ? jQuery.makeArray( this.elements ) : this; + }) + .filter(function(){ + return this.name && !this.disabled && + ( this.checked || rselectTextarea.test( this.nodeName ) || + rinput.test( this.type ) ); + }) + .map(function( i, elem ){ + var val = jQuery( this ).val(); + + return val == null ? + null : + jQuery.isArray( val ) ? + jQuery.map( val, function( val, i ){ + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + }) : + { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + }).get(); + } +}); + +//Serialize an array of form elements or a set of +//key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, value ) { + // If value is a function, invoke it and return its value + value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value ); + s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value ); + }; + + // Set traditional to true for jQuery <= 1.3.2 behavior. + if ( traditional === undefined ) { + traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional; + } + + // If an array was passed in, assume that it is an array of form elements. + if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + }); + + } else { + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ).replace( r20, "+" ); +}; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( jQuery.isArray( obj ) ) { + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + // If array item is non-scalar (array or object), encode its + // numeric index to resolve deserialization ambiguity issues. + // Note that rack (as of 1.0.0) can't currently deserialize + // nested arrays properly, and attempting to do so may cause + // a server error. Possible fixes are to modify rack's + // deserialization algorithm or to provide an option or flag + // to force array serialization to be shallow. + buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add ); + } + }); + + } else if ( !traditional && jQuery.type( obj ) === "object" ) { + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + // Serialize scalar item. + add( prefix, obj ); + } +} +var + // Document location + ajaxLocParts, + ajaxLocation, + + rhash = /#.*$/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + rquery = /\?/, + rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, + rts = /([?&])_=[^&]*/, + rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/, + + // Keep a copy of the old load method + _load = jQuery.fn.load, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = ["*/"] + ["*"]; + +// #8138, IE may throw an exception when accessing +// a field from window.location if document.domain has been set +try { + ajaxLocation = location.href; +} catch( e ) { + // Use the href attribute of an A element + // since IE will modify it given document.location + ajaxLocation = document.createElement( "a" ); + ajaxLocation.href = ""; + ajaxLocation = ajaxLocation.href; +} + +// Segment location into parts +ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || []; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, list, placeBefore, + dataTypes = dataTypeExpression.toLowerCase().split( core_rspace ), + i = 0, + length = dataTypes.length; + + if ( jQuery.isFunction( func ) ) { + // For each dataType in the dataTypeExpression + for ( ; i < length; i++ ) { + dataType = dataTypes[ i ]; + // We control if we're asked to add before + // any existing element + placeBefore = /^\+/.test( dataType ); + if ( placeBefore ) { + dataType = dataType.substr( 1 ) || "*"; + } + list = structure[ dataType ] = structure[ dataType ] || []; + // then we add to the structure accordingly + list[ placeBefore ? "unshift" : "push" ]( func ); + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR, + dataType /* internal */, inspected /* internal */ ) { + + dataType = dataType || options.dataTypes[ 0 ]; + inspected = inspected || {}; + + inspected[ dataType ] = true; + + var selection, + list = structure[ dataType ], + i = 0, + length = list ? list.length : 0, + executeOnly = ( structure === prefilters ); + + for ( ; i < length && ( executeOnly || !selection ); i++ ) { + selection = list[ i ]( options, originalOptions, jqXHR ); + // If we got redirected to another dataType + // we try there if executing only and not done already + if ( typeof selection === "string" ) { + if ( !executeOnly || inspected[ selection ] ) { + selection = undefined; + } else { + options.dataTypes.unshift( selection ); + selection = inspectPrefiltersOrTransports( + structure, options, originalOptions, jqXHR, selection, inspected ); + } + } + } + // If we're only executing or nothing was selected + // we try the catchall dataType if not done already + if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) { + selection = inspectPrefiltersOrTransports( + structure, options, originalOptions, jqXHR, "*", inspected ); + } + // unnecessary when only executing (prefilters) + // but it'll be ignored by the caller in that case + return selection; +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } +} + +jQuery.fn.load = function( url, params, callback ) { + if ( typeof url !== "string" && _load ) { + return _load.apply( this, arguments ); + } + + // Don't do a request if no elements are being requested + if ( !this.length ) { + return this; + } + + var selector, type, response, + self = this, + off = url.indexOf(" "); + + if ( off >= 0 ) { + selector = url.slice( off, url.length ); + url = url.slice( 0, off ); + } + + // If it's a function + if ( jQuery.isFunction( params ) ) { + + // We assume that it's the callback + callback = params; + params = undefined; + + // Otherwise, build a param string + } else if ( params && typeof params === "object" ) { + type = "POST"; + } + + // Request the remote document + jQuery.ajax({ + url: url, + + // if "type" variable is undefined, then "GET" method will be used + type: type, + dataType: "html", + data: params, + complete: function( jqXHR, status ) { + if ( callback ) { + self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] ); + } + } + }).done(function( responseText ) { + + // Save response for use in complete callback + response = arguments; + + // See if a selector was specified + self.html( selector ? + + // Create a dummy div to hold the results + jQuery("<div>") + + // inject the contents of the document in, removing the scripts + // to avoid any 'Permission Denied' errors in IE + .append( responseText.replace( rscript, "" ) ) + + // Locate the specified elements + .find( selector ) : + + // If not, just inject the full result + responseText ); + + }); + + return this; +}; + +// Attach a bunch of functions for handling common AJAX events +jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){ + jQuery.fn[ o ] = function( f ){ + return this.on( o, f ); + }; +}); + +jQuery.each( [ "get", "post" ], function( i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + // shift arguments if data argument was omitted + if ( jQuery.isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + return jQuery.ajax({ + type: method, + url: url, + data: data, + success: callback, + dataType: type + }); + }; +}); + +jQuery.extend({ + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + if ( settings ) { + // Building a settings object + ajaxExtend( target, jQuery.ajaxSettings ); + } else { + // Extending ajaxSettings + settings = target; + target = jQuery.ajaxSettings; + } + ajaxExtend( target, settings ); + return target; + }, + + ajaxSettings: { + url: ajaxLocation, + isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ), + global: true, + type: "GET", + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + processData: true, + async: true, + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + xml: "application/xml, text/xml", + html: "text/html", + text: "text/plain", + json: "application/json, text/javascript", + "*": allTypes + }, + + contents: { + xml: /xml/, + html: /html/, + json: /json/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText" + }, + + // List of data converters + // 1) key format is "source_type destination_type" (a single space in-between) + // 2) the catchall symbol "*" can be used for source_type + converters: { + + // Convert anything to text + "* text": window.String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": jQuery.parseJSON, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + context: true, + url: true + } + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var // ifModified key + ifModifiedKey, + // Response headers + responseHeadersString, + responseHeaders, + // transport + transport, + // timeout handle + timeoutTimer, + // Cross-domain detection vars + parts, + // To know if global events are to be dispatched + fireGlobals, + // Loop variable + i, + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + // Callbacks context + callbackContext = s.context || s, + // Context for global events + // It's the callbackContext if one was provided in the options + // and if it's a DOM node or a jQuery collection + globalEventContext = callbackContext !== s && + ( callbackContext.nodeType || callbackContext instanceof jQuery ) ? + jQuery( callbackContext ) : jQuery.event, + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + // Status-dependent callbacks + statusCode = s.statusCode || {}, + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + // The jqXHR state + state = 0, + // Default abort message + strAbort = "canceled", + // Fake xhr + jqXHR = { + + readyState: 0, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( !state ) { + var lname = name.toLowerCase(); + name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Raw string + getAllResponseHeaders: function() { + return state === 2 ? responseHeadersString : null; + }, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( state === 2 ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[1].toLowerCase() ] = match[ 2 ]; + } + } + match = responseHeaders[ key.toLowerCase() ]; + } + return match === undefined ? null : match; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( !state ) { + s.mimeType = type; + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + statusText = statusText || strAbort; + if ( transport ) { + transport.abort( statusText ); + } + done( 0, statusText ); + return this; + } + }; + + // Callback for when everything is done + // It is defined here because jslint complains if it is declared + // at the end of the function (which would be more logical and readable) + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Called once + if ( state === 2 ) { + return; + } + + // State is "done" now + state = 2; + + // Clear timeout if it exists + if ( timeoutTimer ) { + clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // If successful, handle type chaining + if ( status >= 200 && status < 300 || status === 304 ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + + modified = jqXHR.getResponseHeader("Last-Modified"); + if ( modified ) { + jQuery.lastModified[ ifModifiedKey ] = modified; + } + modified = jqXHR.getResponseHeader("Etag"); + if ( modified ) { + jQuery.etag[ ifModifiedKey ] = modified; + } + } + + // If not modified + if ( status === 304 ) { + + statusText = "notmodified"; + isSuccess = true; + + // If we have data + } else { + + isSuccess = ajaxConvert( s, response ); + statusText = isSuccess.state; + success = isSuccess.data; + error = isSuccess.error; + isSuccess = !error; + } + } else { + // We extract error from statusText + // then normalize statusText and status for non-aborts + error = statusText; + if ( !statusText || status ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ), + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + // Attach deferreds + deferred.promise( jqXHR ); + jqXHR.success = jqXHR.done; + jqXHR.error = jqXHR.fail; + jqXHR.complete = completeDeferred.add; + + // Status-dependent callbacks + jqXHR.statusCode = function( map ) { + if ( map ) { + var tmp; + if ( state < 2 ) { + for ( tmp in map ) { + statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ]; + } + } else { + tmp = map[ jqXHR.status ]; + jqXHR.always( tmp ); + } + } + return this; + }; + + // Remove hash character (#7531: and string promotion) + // Add protocol if not provided (#5866: IE7 issue with protocol-less urls) + // We also use the url parameter if available + s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" ); + + // Extract dataTypes list + s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( core_rspace ); + + // A cross-domain request is in order when we have a protocol:host:port mismatch + if ( s.crossDomain == null ) { + parts = rurl.exec( s.url.toLowerCase() ); + s.crossDomain = !!( parts && + ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] || + ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) != + ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) ) + ); + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( state === 2 ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + fireGlobals = s.global; + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // If data is available, append data to url + if ( s.data ) { + s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data; + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Get ifModifiedKey before adding the anti-cache parameter + ifModifiedKey = s.url; + + // Add anti-cache in url if needed + if ( s.cache === false ) { + + var ts = jQuery.now(), + // try replacing _= if it is there + ret = s.url.replace( rts, "$1_=" + ts ); + + // if nothing was replaced, add timestamp to the end + s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + ifModifiedKey = ifModifiedKey || s.url; + if ( jQuery.lastModified[ ifModifiedKey ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] ); + } + if ( jQuery.etag[ ifModifiedKey ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] ); + } + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ? + s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) { + // Abort if not done already and return + return jqXHR.abort(); + + } + + // aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + for ( i in { success: 1, error: 1, complete: 1 } ) { + jqXHR[ i ]( s[ i ] ); + } + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = setTimeout( function(){ + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + state = 1; + transport.send( requestHeaders, done ); + } catch (e) { + // Propagate exception as error if not done + if ( state < 2 ) { + done( -1, e ); + // Simply rethrow otherwise + } else { + throw e; + } + } + } + + return jqXHR; + }, + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {} + +}); + +/* Handles responses to an ajax request: + * - sets all responseXXX fields accordingly + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes, + responseFields = s.responseFields; + + // Fill responseXXX fields + for ( type in responseFields ) { + if ( type in responses ) { + jqXHR[ responseFields[type] ] = responses[ type ]; + } + } + + // Remove auto dataType and get content-type in the process + while( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "content-type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +// Chain conversions given the request and the original response +function ajaxConvert( s, response ) { + + var conv, conv2, current, tmp, + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(), + prev = dataTypes[ 0 ], + converters = {}, + i = 0; + + // Apply the dataFilter if provided + if ( s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + // Convert to each sequential dataType, tolerating list modification + for ( ; (current = dataTypes[++i]); ) { + + // There's only work to do if current dataType is non-auto + if ( current !== "*" ) { + + // Convert response if prev dataType is non-auto and differs from current + if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split(" "); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.splice( i--, 0, current ); + } + + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s["throws"] ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current }; + } + } + } + } + + // Update prev for next iteration + prev = current; + } + } + + return { state: "success", data: response }; +} +var oldCallbacks = [], + rquestion = /\?/, + rjsonp = /(=)\?(?=&|$)|\?\?/, + nonce = jQuery.now(); + +// Default jsonp settings +jQuery.ajaxSetup({ + jsonp: "callback", + jsonpCallback: function() { + var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) ); + this[ callback ] = true; + return callback; + } +}); + +// Detect, normalize options and install callbacks for jsonp requests +jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { + + var callbackName, overwritten, responseContainer, + data = s.data, + url = s.url, + hasCallback = s.jsonp !== false, + replaceInUrl = hasCallback && rjsonp.test( url ), + replaceInData = hasCallback && !replaceInUrl && typeof data === "string" && + !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && + rjsonp.test( data ); + + // Handle iff the expected data type is "jsonp" or we have a parameter to set + if ( s.dataTypes[ 0 ] === "jsonp" || replaceInUrl || replaceInData ) { + + // Get callback name, remembering preexisting value associated with it + callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ? + s.jsonpCallback() : + s.jsonpCallback; + overwritten = window[ callbackName ]; + + // Insert callback into url or form data + if ( replaceInUrl ) { + s.url = url.replace( rjsonp, "$1" + callbackName ); + } else if ( replaceInData ) { + s.data = data.replace( rjsonp, "$1" + callbackName ); + } else if ( hasCallback ) { + s.url += ( rquestion.test( url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName; + } + + // Use data converter to retrieve json after script execution + s.converters["script json"] = function() { + if ( !responseContainer ) { + jQuery.error( callbackName + " was not called" ); + } + return responseContainer[ 0 ]; + }; + + // force json dataType + s.dataTypes[ 0 ] = "json"; + + // Install callback + window[ callbackName ] = function() { + responseContainer = arguments; + }; + + // Clean-up function (fires after converters) + jqXHR.always(function() { + // Restore preexisting value + window[ callbackName ] = overwritten; + + // Save back as free + if ( s[ callbackName ] ) { + // make sure that re-using the options doesn't screw things around + s.jsonpCallback = originalSettings.jsonpCallback; + + // save the callback name for future use + oldCallbacks.push( callbackName ); + } + + // Call if it was a function and we have a response + if ( responseContainer && jQuery.isFunction( overwritten ) ) { + overwritten( responseContainer[ 0 ] ); + } + + responseContainer = overwritten = undefined; + }); + + // Delegate to script + return "script"; + } +}); +// Install script dataType +jQuery.ajaxSetup({ + accepts: { + script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /javascript|ecmascript/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +}); + +// Handle cache's special case and global +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + s.global = false; + } +}); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function(s) { + + // This transport only deals with cross domain requests + if ( s.crossDomain ) { + + var script, + head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement; + + return { + + send: function( _, callback ) { + + script = document.createElement( "script" ); + + script.async = "async"; + + if ( s.scriptCharset ) { + script.charset = s.scriptCharset; + } + + script.src = s.url; + + // Attach handlers for all browsers + script.onload = script.onreadystatechange = function( _, isAbort ) { + + if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) { + + // Handle memory leak in IE + script.onload = script.onreadystatechange = null; + + // Remove the script + if ( head && script.parentNode ) { + head.removeChild( script ); + } + + // Dereference the script + script = undefined; + + // Callback if not abort + if ( !isAbort ) { + callback( 200, "success" ); + } + } + }; + // Use insertBefore instead of appendChild to circumvent an IE6 bug. + // This arises when a base node is used (#2709 and #4378). + head.insertBefore( script, head.firstChild ); + }, + + abort: function() { + if ( script ) { + script.onload( 0, 1 ); + } + } + }; + } +}); +var xhrCallbacks, + // #5280: Internet Explorer will keep connections alive if we don't abort on unload + xhrOnUnloadAbort = window.ActiveXObject ? function() { + // Abort all pending requests + for ( var key in xhrCallbacks ) { + xhrCallbacks[ key ]( 0, 1 ); + } + } : false, + xhrId = 0; + +// Functions to create xhrs +function createStandardXHR() { + try { + return new window.XMLHttpRequest(); + } catch( e ) {} +} + +function createActiveXHR() { + try { + return new window.ActiveXObject( "Microsoft.XMLHTTP" ); + } catch( e ) {} +} + +// Create the request object +// (This is still attached to ajaxSettings for backward compatibility) +jQuery.ajaxSettings.xhr = window.ActiveXObject ? + /* Microsoft failed to properly + * implement the XMLHttpRequest in IE7 (can't request local files), + * so we use the ActiveXObject when it is available + * Additionally XMLHttpRequest can be disabled in IE7/IE8 so + * we need a fallback. + */ + function() { + return !this.isLocal && createStandardXHR() || createActiveXHR(); + } : + // For all other browsers, use the standard XMLHttpRequest object + createStandardXHR; + +// Determine support properties +(function( xhr ) { + jQuery.extend( jQuery.support, { + ajax: !!xhr, + cors: !!xhr && ( "withCredentials" in xhr ) + }); +})( jQuery.ajaxSettings.xhr() ); + +// Create transport if the browser can provide an xhr +if ( jQuery.support.ajax ) { + + jQuery.ajaxTransport(function( s ) { + // Cross domain only allowed if supported through XMLHttpRequest + if ( !s.crossDomain || jQuery.support.cors ) { + + var callback; + + return { + send: function( headers, complete ) { + + // Get a new xhr + var handle, i, + xhr = s.xhr(); + + // Open the socket + // Passing null username, generates a login popup on Opera (#2865) + if ( s.username ) { + xhr.open( s.type, s.url, s.async, s.username, s.password ); + } else { + xhr.open( s.type, s.url, s.async ); + } + + // Apply custom fields if provided + if ( s.xhrFields ) { + for ( i in s.xhrFields ) { + xhr[ i ] = s.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( s.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( s.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !s.crossDomain && !headers["X-Requested-With"] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Need an extra try/catch for cross domain requests in Firefox 3 + try { + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + } catch( _ ) {} + + // Do send the request + // This may raise an exception which is actually + // handled in jQuery.ajax (so no try/catch here) + xhr.send( ( s.hasContent && s.data ) || null ); + + // Listener + callback = function( _, isAbort ) { + + var status, + statusText, + responseHeaders, + responses, + xml; + + // Firefox throws exceptions when accessing properties + // of an xhr when a network error occurred + // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE) + try { + + // Was never called and is aborted or complete + if ( callback && ( isAbort || xhr.readyState === 4 ) ) { + + // Only called once + callback = undefined; + + // Do not keep as active anymore + if ( handle ) { + xhr.onreadystatechange = jQuery.noop; + if ( xhrOnUnloadAbort ) { + delete xhrCallbacks[ handle ]; + } + } + + // If it's an abort + if ( isAbort ) { + // Abort it manually if needed + if ( xhr.readyState !== 4 ) { + xhr.abort(); + } + } else { + status = xhr.status; + responseHeaders = xhr.getAllResponseHeaders(); + responses = {}; + xml = xhr.responseXML; + + // Construct response list + if ( xml && xml.documentElement /* #4958 */ ) { + responses.xml = xml; + } + + // When requesting binary data, IE6-9 will throw an exception + // on any attempt to access responseText (#11426) + try { + responses.text = xhr.responseText; + } catch( e ) { + } + + // Firefox throws an exception when accessing + // statusText for faulty cross-domain requests + try { + statusText = xhr.statusText; + } catch( e ) { + // We normalize with Webkit giving an empty statusText + statusText = ""; + } + + // Filter status for non standard behaviors + + // If the request is local and we have data: assume a success + // (success with no data won't get notified, that's the best we + // can do given current implementations) + if ( !status && s.isLocal && !s.crossDomain ) { + status = responses.text ? 200 : 404; + // IE - #1450: sometimes returns 1223 when it should be 204 + } else if ( status === 1223 ) { + status = 204; + } + } + } + } catch( firefoxAccessException ) { + if ( !isAbort ) { + complete( -1, firefoxAccessException ); + } + } + + // Call complete if needed + if ( responses ) { + complete( status, statusText, responses, responseHeaders ); + } + }; + + if ( !s.async ) { + // if we're in sync mode we fire the callback + callback(); + } else if ( xhr.readyState === 4 ) { + // (IE6 & IE7) if it's in cache and has been + // retrieved directly we need to fire the callback + setTimeout( callback, 0 ); + } else { + handle = ++xhrId; + if ( xhrOnUnloadAbort ) { + // Create the active xhrs callbacks list if needed + // and attach the unload handler + if ( !xhrCallbacks ) { + xhrCallbacks = {}; + jQuery( window ).unload( xhrOnUnloadAbort ); + } + // Add to list of active xhrs callbacks + xhrCallbacks[ handle ] = callback; + } + xhr.onreadystatechange = callback; + } + }, + + abort: function() { + if ( callback ) { + callback(0,1); + } + } + }; + } + }); +} +var fxNow, timerId, + rfxtypes = /^(?:toggle|show|hide)$/, + rfxnum = new RegExp( "^(?:([-+])=|)(" + core_pnum + ")([a-z%]*)$", "i" ), + rrun = /queueHooks$/, + animationPrefilters = [ defaultPrefilter ], + tweeners = { + "*": [function( prop, value ) { + var end, unit, + tween = this.createTween( prop, value ), + parts = rfxnum.exec( value ), + target = tween.cur(), + start = +target || 0, + scale = 1, + maxIterations = 20; + + if ( parts ) { + end = +parts[2]; + unit = parts[3] || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + + // We need to compute starting value + if ( unit !== "px" && start ) { + // Iteratively approximate from a nonzero starting point + // Prefer the current property, because this process will be trivial if it uses the same units + // Fallback to end or a simple constant + start = jQuery.css( tween.elem, prop, true ) || end || 1; + + do { + // If previous iteration zeroed out, double until we get *something* + // Use a string for doubling factor so we don't accidentally see scale as unchanged below + scale = scale || ".5"; + + // Adjust and apply + start = start / scale; + jQuery.style( tween.elem, prop, start + unit ); + + // Update scale, tolerating zero or NaN from tween.cur() + // And breaking the loop if scale is unchanged or perfect, or if we've just had enough + } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations ); + } + + tween.unit = unit; + tween.start = start; + // If a +=/-= token was provided, we're doing a relative animation + tween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end; + } + return tween; + }] + }; + +// Animations created synchronously will run synchronously +function createFxNow() { + setTimeout(function() { + fxNow = undefined; + }, 0 ); + return ( fxNow = jQuery.now() ); +} + +function createTweens( animation, props ) { + jQuery.each( props, function( prop, value ) { + var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( collection[ index ].call( animation, prop, value ) ) { + + // we're done with this property + return; + } + } + }); +} + +function Animation( elem, properties, options ) { + var result, + index = 0, + tweenerIndex = 0, + length = animationPrefilters.length, + deferred = jQuery.Deferred().always( function() { + // don't match elem in the :animated selector + delete tick.elem; + }), + tick = function() { + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length ; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ]); + + if ( percent < 1 && length ) { + return remaining; + } else { + deferred.resolveWith( elem, [ animation ] ); + return false; + } + }, + animation = deferred.promise({ + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { specialEasing: {} }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end, easing ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + // if we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + + for ( ; index < length ; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // resolve when we played the last frame + // otherwise, reject + if ( gotoEnd ) { + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + }), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length ; index++ ) { + result = animationPrefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + return result; + } + } + + createTweens( animation, props ); + + if ( jQuery.isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + jQuery.fx.timer( + jQuery.extend( tick, { + anim: animation, + queue: animation.opts.queue, + elem: elem + }) + ); + + // attach callbacks from options + return animation.progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = jQuery.camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( jQuery.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // not quite $.extend, this wont overwrite keys already present. + // also - reusing 'index' from above because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweener: function( props, callback ) { + if ( jQuery.isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.split(" "); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length ; index++ ) { + prop = props[ index ]; + tweeners[ prop ] = tweeners[ prop ] || []; + tweeners[ prop ].unshift( callback ); + } + }, + + prefilter: function( callback, prepend ) { + if ( prepend ) { + animationPrefilters.unshift( callback ); + } else { + animationPrefilters.push( callback ); + } + } +}); + +function defaultPrefilter( elem, props, opts ) { + var index, prop, value, length, dataShow, toggle, tween, hooks, oldfire, + anim = this, + style = elem.style, + orig = {}, + handled = [], + hidden = elem.nodeType && isHidden( elem ); + + // handle queue: false promises + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always(function() { + // doing this makes sure that the complete handler will be called + // before this completes + anim.always(function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + }); + }); + } + + // height/width overflow pass + if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) { + // Make sure that nothing sneaks out + // Record all 3 overflow attributes because IE does not + // change the overflow attribute when overflowX and + // overflowY are set to the same value + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Set display property to inline-block for height/width + // animations on inline elements that are having width/height animated + if ( jQuery.css( elem, "display" ) === "inline" && + jQuery.css( elem, "float" ) === "none" ) { + + // inline-level elements accept inline-block; + // block-level elements need to be inline with layout + if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) { + style.display = "inline-block"; + + } else { + style.zoom = 1; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + if ( !jQuery.support.shrinkWrapBlocks ) { + anim.done(function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + }); + } + } + + + // show/hide pass + for ( index in props ) { + value = props[ index ]; + if ( rfxtypes.exec( value ) ) { + delete props[ index ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + continue; + } + handled.push( index ); + } + } + + length = handled.length; + if ( length ) { + dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} ); + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + + // store state if its toggle - enables .stop().toggle() to "reverse" + if ( toggle ) { + dataShow.hidden = !hidden; + } + if ( hidden ) { + jQuery( elem ).show(); + } else { + anim.done(function() { + jQuery( elem ).hide(); + }); + } + anim.done(function() { + var prop; + jQuery.removeData( elem, "fxshow", true ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + }); + for ( index = 0 ; index < length ; index++ ) { + prop = handled[ index ]; + tween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 ); + orig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop ); + + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = tween.start; + if ( hidden ) { + tween.end = tween.start; + tween.start = prop === "width" || prop === "height" ? 1 : 0; + } + } + } + } +} + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || "swing"; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + if ( tween.elem[ tween.prop ] != null && + (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) { + return tween.elem[ tween.prop ]; + } + + // passing any value as a 4th parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails + // so, simple values such as "10px" are parsed to Float. + // complex values such as "rotate(1rad)" are returned as is. + result = jQuery.css( tween.elem, tween.prop, false, "" ); + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + // use step hook for back compat - use cssHook if its there - use .style if its + // available and use plain properties where available + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Remove in 2.0 - this supports IE8's panic based approach +// to setting things on disconnected nodes + +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.each([ "toggle", "show", "hide" ], function( i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" || + // special check for .toggle( handler, handler, ... ) + ( !i && jQuery.isFunction( speed ) && jQuery.isFunction( easing ) ) ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +}); + +jQuery.fn.extend({ + fadeTo: function( speed, to, easing, callback ) { + + // show any hidden elements after setting opacity to 0 + return this.filter( isHidden ).css( "opacity", 0 ).show() + + // animate to the value specified + .end().animate({ opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations resolve immediately + if ( empty ) { + anim.stop( true ); + } + }; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue && type !== false ) { + this.queue( type || "fx", [] ); + } + + return this.each(function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = jQuery._data( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) { + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // start the next in the queue if the last step wasn't forced + // timers currently will call their complete callbacks, which will dequeue + // but only if they were gotoEnd + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + }); + } +}); + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + attrs = { height: type }, + i = 0; + + // if we include width, step value is 1 to do all cssExpand values, + // if we don't include width, step value is 2 to skip over Left and Right + includeWidth = includeWidth? 1 : 0; + for( ; i < 4 ; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +// Generate shortcuts for custom animations +jQuery.each({ + slideDown: genFx("show"), + slideUp: genFx("hide"), + slideToggle: genFx("toggle"), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +}); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + jQuery.isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing + }; + + opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration : + opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default; + + // normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( jQuery.isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p*Math.PI ) / 2; + } +}; + +jQuery.timers = []; +jQuery.fx = Tween.prototype.init; +jQuery.fx.tick = function() { + var timer, + timers = jQuery.timers, + i = 0; + + fxNow = jQuery.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + // Checks the timer has not already been removed + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + if ( timer() && jQuery.timers.push( timer ) && !timerId ) { + timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval ); + } +}; + +jQuery.fx.interval = 13; + +jQuery.fx.stop = function() { + clearInterval( timerId ); + timerId = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + // Default speed + _default: 400 +}; + +// Back Compat <1.8 extension point +jQuery.fx.step = {}; + +if ( jQuery.expr && jQuery.expr.filters ) { + jQuery.expr.filters.animated = function( elem ) { + return jQuery.grep(jQuery.timers, function( fn ) { + return elem === fn.elem; + }).length; + }; +} +var rroot = /^(?:body|html)$/i; + +jQuery.fn.offset = function( options ) { + if ( arguments.length ) { + return options === undefined ? + this : + this.each(function( i ) { + jQuery.offset.setOffset( this, options, i ); + }); + } + + var docElem, body, win, clientTop, clientLeft, scrollTop, scrollLeft, + box = { top: 0, left: 0 }, + elem = this[ 0 ], + doc = elem && elem.ownerDocument; + + if ( !doc ) { + return; + } + + if ( (body = doc.body) === elem ) { + return jQuery.offset.bodyOffset( elem ); + } + + docElem = doc.documentElement; + + // Make sure it's not a disconnected DOM node + if ( !jQuery.contains( docElem, elem ) ) { + return box; + } + + // If we don't have gBCR, just use 0,0 rather than error + // BlackBerry 5, iOS 3 (original iPhone) + if ( typeof elem.getBoundingClientRect !== "undefined" ) { + box = elem.getBoundingClientRect(); + } + win = getWindow( doc ); + clientTop = docElem.clientTop || body.clientTop || 0; + clientLeft = docElem.clientLeft || body.clientLeft || 0; + scrollTop = win.pageYOffset || docElem.scrollTop; + scrollLeft = win.pageXOffset || docElem.scrollLeft; + return { + top: box.top + scrollTop - clientTop, + left: box.left + scrollLeft - clientLeft + }; +}; + +jQuery.offset = { + + bodyOffset: function( body ) { + var top = body.offsetTop, + left = body.offsetLeft; + + if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) { + top += parseFloat( jQuery.css(body, "marginTop") ) || 0; + left += parseFloat( jQuery.css(body, "marginLeft") ) || 0; + } + + return { top: top, left: left }; + }, + + setOffset: function( elem, options, i ) { + var position = jQuery.css( elem, "position" ); + + // set position first, in-case top/left are set even on static elem + if ( position === "static" ) { + elem.style.position = "relative"; + } + + var curElem = jQuery( elem ), + curOffset = curElem.offset(), + curCSSTop = jQuery.css( elem, "top" ), + curCSSLeft = jQuery.css( elem, "left" ), + calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1, + props = {}, curPosition = {}, curTop, curLeft; + + // need to be able to calculate position if either top or left is auto and position is either absolute or fixed + if ( calculatePosition ) { + curPosition = curElem.position(); + curTop = curPosition.top; + curLeft = curPosition.left; + } else { + curTop = parseFloat( curCSSTop ) || 0; + curLeft = parseFloat( curCSSLeft ) || 0; + } + + if ( jQuery.isFunction( options ) ) { + options = options.call( elem, i, curOffset ); + } + + if ( options.top != null ) { + props.top = ( options.top - curOffset.top ) + curTop; + } + if ( options.left != null ) { + props.left = ( options.left - curOffset.left ) + curLeft; + } + + if ( "using" in options ) { + options.using.call( elem, props ); + } else { + curElem.css( props ); + } + } +}; + + +jQuery.fn.extend({ + + position: function() { + if ( !this[0] ) { + return; + } + + var elem = this[0], + + // Get *real* offsetParent + offsetParent = this.offsetParent(), + + // Get correct offsets + offset = this.offset(), + parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset(); + + // Subtract element margins + // note: when an element has margin: auto the offsetLeft and marginLeft + // are the same in Safari causing offset.left to incorrectly be 0 + offset.top -= parseFloat( jQuery.css(elem, "marginTop") ) || 0; + offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0; + + // Add offsetParent borders + parentOffset.top += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0; + parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0; + + // Subtract the two offsets + return { + top: offset.top - parentOffset.top, + left: offset.left - parentOffset.left + }; + }, + + offsetParent: function() { + return this.map(function() { + var offsetParent = this.offsetParent || document.body; + while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) { + offsetParent = offsetParent.offsetParent; + } + return offsetParent || document.body; + }); + } +}); + + +// Create scrollLeft and scrollTop methods +jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) { + var top = /Y/.test( prop ); + + jQuery.fn[ method ] = function( val ) { + return jQuery.access( this, function( elem, method, val ) { + var win = getWindow( elem ); + + if ( val === undefined ) { + return win ? (prop in win) ? win[ prop ] : + win.document.documentElement[ method ] : + elem[ method ]; + } + + if ( win ) { + win.scrollTo( + !top ? val : jQuery( win ).scrollLeft(), + top ? val : jQuery( win ).scrollTop() + ); + + } else { + elem[ method ] = val; + } + }, method, val, arguments.length, null ); + }; +}); + +function getWindow( elem ) { + return jQuery.isWindow( elem ) ? + elem : + elem.nodeType === 9 ? + elem.defaultView || elem.parentWindow : + false; +} +// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods +jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { + jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) { + // margin is only for outerHeight, outerWidth + jQuery.fn[ funcName ] = function( margin, value ) { + var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ), + extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" ); + + return jQuery.access( this, function( elem, type, value ) { + var doc; + + if ( jQuery.isWindow( elem ) ) { + // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there + // isn't a whole lot we can do. See pull request at this URL for discussion: + // https://github.com/jquery/jquery/pull/764 + return elem.document.documentElement[ "client" + name ]; + } + + // Get document width or height + if ( elem.nodeType === 9 ) { + doc = elem.documentElement; + + // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest + // unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it. + return Math.max( + elem.body[ "scroll" + name ], doc[ "scroll" + name ], + elem.body[ "offset" + name ], doc[ "offset" + name ], + doc[ "client" + name ] + ); + } + + return value === undefined ? + // Get width or height on the element, requesting but not forcing parseFloat + jQuery.css( elem, type, value, extra ) : + + // Set width or height on the element + jQuery.style( elem, type, value, extra ); + }, type, chainable ? margin : undefined, chainable, null ); + }; + }); +}); +// Expose jQuery to the global object +window.jQuery = window.$ = jQuery; + +// Expose jQuery as an AMD module, but only for AMD loaders that +// understand the issues with loading multiple versions of jQuery +// in a page that all might call define(). The loader will indicate +// they have special allowances for multiple jQuery versions by +// specifying define.amd.jQuery = true. Register as a named module, +// since jQuery can be concatenated with other files that may use define, +// but not use a proper concatenation script that understands anonymous +// AMD modules. A named AMD is safest and most robust way to register. +// Lowercase jquery is used because AMD module names are derived from +// file names, and jQuery is normally delivered in a lowercase file name. +// Do this after creating the global so that if an AMD module wants to call +// noConflict to hide this version of jQuery, it will work. +if ( typeof define === "function" && define.amd && define.amd.jQuery ) { + define( "jquery", [], function () { return jQuery; } ); +} + +})( window ); diff --git a/vilya/static/js/lib/jquery.atwho.js b/hub/static/js/lib/jquery.atwho.js similarity index 100% rename from vilya/static/js/lib/jquery.atwho.js rename to hub/static/js/lib/jquery.atwho.js diff --git a/vilya/static/js/lib/jquery.caret.js b/hub/static/js/lib/jquery.caret.js similarity index 100% rename from vilya/static/js/lib/jquery.caret.js rename to hub/static/js/lib/jquery.caret.js diff --git a/hub/static/js/lib/jquery.commits-graph.js b/hub/static/js/lib/jquery.commits-graph.js new file mode 100644 index 0000000..cb92990 --- /dev/null +++ b/hub/static/js/lib/jquery.commits-graph.js @@ -0,0 +1,228 @@ +/* + * jQuery Commits Graph - v0.1.3 + * A jQuery plugin to display git commits graph using HTML5/Canvas. + * https://github.com/tclh123/commits-graph + * + * Copyright (c) 2014 + * MIT License + */ + +// -- Route -------------------------------------------------------- + +function Route( commit, data, options ) { + var self = this; + + self._data = data; + self.commit = commit; + self.options = options; + self.from = data[0]; + self.to = data[1]; + self.branch = data[2]; +} + +Route.prototype.drawRoute = function ( ctx ) { + var self = this; + + var from_x = self.options.width * self.options.scaleFactor - (self.from + 1) * self.options.x_step * self.options.scaleFactor; + var from_y = (self.commit.idx + 0.5) * self.options.y_step * self.options.scaleFactor; + + var to_x = self.options.width * self.options.scaleFactor - (self.to + 1) * self.options.x_step * self.options.scaleFactor; + var to_y = (self.commit.idx + 0.5 + 1) * self.options.y_step * self.options.scaleFactor; + + + ctx.strokeStyle = self.commit.graph.get_color(self.branch); + ctx.beginPath(); + ctx.moveTo(from_x, from_y); + if (from_x == to_x) { + ctx.lineTo(to_x, to_y); + } else { + ctx.bezierCurveTo(from_x - self.options.x_step * self.options.scaleFactor / 4, + from_y + self.options.y_step * self.options.scaleFactor / 3 * 2, + to_x + self.options.x_step * self.options.scaleFactor / 4, + to_y - self.options.y_step * self.options.scaleFactor / 3 * 2, + to_x, to_y); + } + ctx.stroke(); +} + +// -- Commit Node -------------------------------------------------------- + +function Commit(graph, idx, data, options ) { + var self = this; + + self._data = data; + self.graph = graph; + self.idx = idx; + self.options = options; + self.sha = data[0]; + self.dot = data[1]; + self.dot_offset = self.dot[0]; + self.dot_branch = self.dot[1]; + self.routes = $.map(data[2], function(e) { return new Route(self, e, options) }); +} + +Commit.prototype.drawDot = function ( ctx ) { + var self = this; + + var x = self.options.width * self.options.scaleFactor - (self.dot_offset + 1) * self.options.x_step * self.options.scaleFactor; + var y = (self.idx + 0.5) * self.options.y_step * self.options.scaleFactor; + + // ctx.strokeStyle = self.graph.get_color(self.dot_branch); + ctx.fillStyle = self.graph.get_color(self.dot_branch); + ctx.beginPath(); + var radius = 3; + ctx.arc(x, y, radius * self.options.scaleFactor, 0, 2 * Math.PI, true); + // ctx.stroke(); + ctx.fill(); +} + +// -- Graph Canvas -------------------------------------------------------- + +function backingScale() { + if ('devicePixelRatio' in window) { + if (window.devicePixelRatio > 1) { + return window.devicePixelRatio; + } + } + return 1; +} + +function GraphCanvas( data, options ) { + var self = this; + + self.data = data; + self.options = options; + self.canvas = document.createElement("canvas"); + self.canvas.style.height = options.height + "px"; + self.canvas.style.width = options.width + "px"; + self.canvas.height = options.height; + self.canvas.width = options.width; + + var scaleFactor = backingScale(); + if (scaleFactor > 1) { + self.canvas.width = self.canvas.width * scaleFactor; + self.canvas.height = self.canvas.height * scaleFactor; + } + self.options.scaleFactor = scaleFactor + + // or use context.scale(2,2) // not tested + + self.colors = [ + "#e11d21" + //, "#eb6420" + , "#fbca04" + , "#009800" + , "#006b75" + , "#207de5" + , "#0052cc" + , "#5319e7" + , "#f7c6c7" + , "#fad8c7" + , "#fef2c0" + , "#bfe5bf" + , "#c7def8" + , "#bfdadc" + , "#bfd4f2" + , "#d4c5f9" + , "#cccccc" + , "#84b6eb" + , "#e6e6e6" + , "#ffffff" + , "#cc317c" + ] + // self.branch_color = {}; +} + +GraphCanvas.prototype.toHTML = function () { + var self = this; + + self.draw(); + + return $(self.canvas); +}; + +GraphCanvas.prototype.get_color = function (branch) { + var self = this; + + var n = self.colors.length; + return self.colors[branch % n]; +}; + +/* + +[ + sha, + [offset, branch], //dot + [ + [from, to, branch], // route1 + [from, to, branch], // route2 + [from, to, branch], + ] // routes +], + +*/ +// draw +GraphCanvas.prototype.draw = function () { + var self = this, + ctx = self.canvas.getContext("2d"); + + ctx.lineWidth = 2; + console.log(self.data); + + var n_commits = self.data.length; + for (var i=0; i<n_commits; i++) { + var commit = new Commit(self, i, self.data[i], self.options); + + commit.drawDot(ctx); + for (var j=0; j<commit.routes.length; j++) { + var route = commit.routes[j]; + route.drawRoute(ctx); + } + } +}; + +// -- Graph Plugin ------------------------------------------------------------ + +function Graph( element, options ) { + var self = this, + defaults = { + height: 800, + width: 200, + // y_step: 30, + y_step: 20, + x_step: 20, + }; + + self.element = element; + self.$container = $( element ); + self.data = self.$container.data( "graph" ); + + self.options = $.extend( {}, defaults, options ) ; + + self._defaults = defaults; + + self.applyTemplate(); +} + +// Apply results to HTML template +Graph.prototype.applyTemplate = function () { + var self = this, + graphCanvas = new GraphCanvas( self.data, self.options ), + $canvas = graphCanvas.toHTML(); + + $canvas.appendTo( self.$container ); +}; + +// -- Attach plugin to jQuery's prototype -------------------------------------- + +;( function ( $, window, undefined ) { + + $.fn.commits = function ( options ) { + return this.each(function () { + if ( !$( this ).data( "plugin_commits_graph" ) ) { + $( this ).data( "plugin_commits_graph", new Graph( this, options ) ); + } + }); + }; + +}( window.jQuery, window ) ); diff --git a/vilya/static/js/lib/jquery.forms.js b/hub/static/js/lib/jquery.forms.js similarity index 100% rename from vilya/static/js/lib/jquery.forms.js rename to hub/static/js/lib/jquery.forms.js diff --git a/vilya/static/js/lib/jquery.lazyload.js b/hub/static/js/lib/jquery.lazyload.js similarity index 100% rename from vilya/static/js/lib/jquery.lazyload.js rename to hub/static/js/lib/jquery.lazyload.js diff --git a/vilya/static/js/lib/jquery.lazyload.min.js b/hub/static/js/lib/jquery.lazyload.min.js similarity index 100% rename from vilya/static/js/lib/jquery.lazyload.min.js rename to hub/static/js/lib/jquery.lazyload.min.js diff --git a/vilya/static/js/lib/jquery.media.js b/hub/static/js/lib/jquery.media.js similarity index 100% rename from vilya/static/js/lib/jquery.media.js rename to hub/static/js/lib/jquery.media.js diff --git a/vilya/static/js/lib/jquery.mobile-1.3.0.min.js b/hub/static/js/lib/jquery.mobile-1.3.0.min.js similarity index 100% rename from vilya/static/js/lib/jquery.mobile-1.3.0.min.js rename to hub/static/js/lib/jquery.mobile-1.3.0.min.js diff --git a/vilya/static/js/lib/jquery.pjax.js b/hub/static/js/lib/jquery.pjax.js similarity index 92% rename from vilya/static/js/lib/jquery.pjax.js rename to hub/static/js/lib/jquery.pjax.js index 1c16324..5cec3f2 100644 --- a/vilya/static/js/lib/jquery.pjax.js +++ b/hub/static/js/lib/jquery.pjax.js @@ -82,11 +82,14 @@ function handleClick(event, container, options) { if (link.href === location.href + '#') return + // Ignore event with default prevented + if (event.isDefaultPrevented()) + return + var defaults = { url: link.href, container: $(link).attr('data-pjax'), - target: link, - fragment: null + target: link } var opts = $.extend({}, defaults, options) @@ -96,6 +99,7 @@ function handleClick(event, container, options) { if (!clickEvent.isDefaultPrevented()) { pjax(opts) event.preventDefault() + $(link).trigger('pjax:clicked', [opts]) } } @@ -127,8 +131,7 @@ function handleSubmit(event, container, options) { url: form.action, data: $(form).serializeArray(), container: $(form).attr('data-pjax'), - target: form, - fragment: null + target: form } pjax($.extend({}, defaults, options)) @@ -175,8 +178,10 @@ function pjax(options) { if (!options.data) options.data = {} options.data._pjax = context.selector - function fire(type, args) { - var event = $.Event(type, { relatedTarget: target }) + function fire(type, args, props) { + if (!props) props = {} + props.relatedTarget = target + var event = $.Event(type, props) context.trigger(event, args) return !event.isDefaultPrevented() } @@ -228,6 +233,8 @@ function pjax(options) { } options.success = function(data, status, xhr) { + var previousState = pjax.state; + // If $.pjax.defaults.version is a function, invoke it first. // Otherwise it can be a static string. var currentVersion = (typeof $.pjax.defaults.version === 'function') ? @@ -263,18 +270,35 @@ function pjax(options) { window.history.replaceState(pjax.state, container.title, container.url) } + // Clear out any focused controls before inserting new page contents. + try { + document.activeElement.blur() + } catch (e) { } + if (container.title) document.title = container.title + + fire('pjax:beforeReplace', [container.contents, options], { + state: pjax.state, + previousState: previousState + }) context.html(container.contents) + + // FF bug: Won't autofocus fields that are inserted via JS. + // This behavior is incorrect. So if theres no current focus, autofocus + // the last field. + // + // http://www.w3.org/html/wg/drafts/html/master/forms.html + var autofocusEl = context.find('input[autofocus], textarea[autofocus]').last()[0] + if (autofocusEl && document.activeElement !== autofocusEl) { + autofocusEl.focus(); + } + executeScriptTags(container.scripts) // Scroll to top by default if (typeof options.scrollTo === 'number') $(window).scrollTop(options.scrollTo) - // Google Analytics support - if ( (options.replace || options.push) && window._gaq ) - _gaq.push(['_trackPageview']) - // If the URL has a hash in it, make sure the browser // knows to navigate to the hash. if ( hash !== '' ) { @@ -375,19 +399,29 @@ if (initialState && initialState.container) { pjax.state = initialState } +// Non-webkit browsers don't fire an initial popstate event +if ('state' in window.history) { + initialPop = false +} + // popstate handler takes care of the back and forward buttons // // You probably shouldn't use pjax on pages with other pushState // stuff yet. function onPjaxPopstate(event) { + var previousState = pjax.state; var state = event.state if (state && state.container) { - // When coming forward from a seperate history session, will get an + // When coming forward from a separate history session, will get an // initial pop with a state we are already at. Skip reloading the current // page. if (initialPop && initialURL == state.url) return + // If popping back to the same state, just skip. + // Could be clicking back from hashchange rather than a pushState. + if (pjax.state && pjax.state.id === state.id) return + var container = $(state.container) if (container.length) { var direction, contents = cacheMapping[state.id] @@ -421,9 +455,14 @@ function onPjaxPopstate(event) { if (contents) { container.trigger('pjax:start', [null, options]) + pjax.state = state if (state.title) document.title = state.title + var beforeReplaceEvent = $.Event('pjax:beforeReplace', { + state: state, + previousState: previousState + }) + container.trigger(beforeReplaceEvent, [contents, options]) container.html(contents) - pjax.state = state container.trigger('pjax:end', [null, options]) } else { @@ -647,7 +686,7 @@ function extractContainer(data, xhr, options) { // Remove any parent title elements obj.contents = obj.contents.not(function() { return $(this).is('title') }) - // Then scrub any titles from their descendents + // Then scrub any titles from their descendants obj.contents.find('title').remove() // Gather all script[src] elements @@ -778,7 +817,7 @@ function enable() { maxCacheLength: 20, version: findVersion } - $(window).bind('popstate.pjax', onPjaxPopstate) + $(window).on('popstate.pjax', onPjaxPopstate) } // Disable pushState behavior. @@ -801,7 +840,7 @@ function disable() { $.pjax.submit = $.noop $.pjax.reload = function() { window.location.reload() } - $(window).unbind('popstate.pjax', onPjaxPopstate) + $(window).off('popstate.pjax', onPjaxPopstate) } @@ -810,7 +849,7 @@ function disable() { if ( $.inArray('state', $.event.props) < 0 ) $.event.props.push('state') - // Is pjax supported by this browser? +// Is pjax supported by this browser? $.support.pjax = window.history && window.history.pushState && window.history.replaceState && // pushState isn't reliable on iOS until 5. diff --git a/vilya/static/js/lib/jquery.plugin.pullToRefresh.js b/hub/static/js/lib/jquery.plugin.pullToRefresh.js similarity index 100% rename from vilya/static/js/lib/jquery.plugin.pullToRefresh.js rename to hub/static/js/lib/jquery.plugin.pullToRefresh.js diff --git a/vilya/static/js/lib/jquery.scrollTo.js b/hub/static/js/lib/jquery.scrollTo.js similarity index 100% rename from vilya/static/js/lib/jquery.scrollTo.js rename to hub/static/js/lib/jquery.scrollTo.js diff --git a/vilya/static/js/lib/jquery.timeago.js b/hub/static/js/lib/jquery.timeago.js similarity index 100% rename from vilya/static/js/lib/jquery.timeago.js rename to hub/static/js/lib/jquery.timeago.js diff --git a/vilya/static/js/lib/jquery.tmpl.js b/hub/static/js/lib/jquery.tmpl.js similarity index 100% rename from vilya/static/js/lib/jquery.tmpl.js rename to hub/static/js/lib/jquery.tmpl.js diff --git a/vilya/static/js/lib/jquery.tmpl.min.js b/hub/static/js/lib/jquery.tmpl.min.js similarity index 100% rename from vilya/static/js/lib/jquery.tmpl.min.js rename to hub/static/js/lib/jquery.tmpl.min.js diff --git a/hub/static/js/lib/jquery.tooltipster.js b/hub/static/js/lib/jquery.tooltipster.js new file mode 100644 index 0000000..f36f3c8 --- /dev/null +++ b/hub/static/js/lib/jquery.tooltipster.js @@ -0,0 +1,1327 @@ +/* + + Tooltipster 3.3.0 | 2014-11-08 + A rockin' custom tooltip jQuery plugin + + Developed by Caleb Jacob under the MIT license http://opensource.org/licenses/MIT + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + */ + +;(function ($, window, document) { + + var pluginName = "tooltipster", + defaults = { + animation: 'fade', + arrow: true, + arrowColor: '', + autoClose: true, + content: null, + contentAsHTML: false, + contentCloning: true, + debug: true, + delay: 200, + minWidth: 0, + maxWidth: null, + functionInit: function(origin, content) {}, + functionBefore: function(origin, continueTooltip) { + continueTooltip(); + }, + functionReady: function(origin, tooltip) {}, + functionAfter: function(origin) {}, + hideOnClick: false, + icon: '(?)', + iconCloning: true, + iconDesktop: false, + iconTouch: false, + iconTheme: 'tooltipster-icon', + interactive: false, + interactiveTolerance: 350, + multiple: false, + offsetX: 0, + offsetY: 0, + onlyOne: false, + position: 'top', + positionTracker: false, + positionTrackerCallback: function(origin){ + // the default tracker callback will close the tooltip when the trigger is + // 'hover' (see https://github.com/iamceege/tooltipster/pull/253) + if(this.option('trigger') == 'hover' && this.option('autoClose')) { + this.hide(); + } + }, + restoration: 'current', + speed: 350, + timer: 0, + theme: 'tooltipster-default', + touchDevices: true, + trigger: 'hover', + updateAnimation: true + }; + + function Plugin(element, options) { + + // list of instance variables + + this.bodyOverflowX; + // stack of custom callbacks provided as parameters to API methods + this.callbacks = { + hide: [], + show: [] + }; + this.checkInterval = null; + // this will be the user content shown in the tooltip. A capital "C" is used because there is also a method called content() + this.Content; + // this is the original element which is being applied the tooltipster plugin + this.$el = $(element); + // this will be the element which triggers the appearance of the tooltip on hover/click/custom events. + // it will be the same as this.$el if icons are not used (see in the options), otherwise it will correspond to the created icon + this.$elProxy; + this.elProxyPosition; + this.enabled = true; + this.options = $.extend({}, defaults, options); + this.mouseIsOverProxy = false; + // a unique namespace per instance, for easy selective unbinding + this.namespace = 'tooltipster-'+ Math.round(Math.random()*100000); + // Status (capital S) can be either : appearing, shown, disappearing, hidden + this.Status = 'hidden'; + this.timerHide = null; + this.timerShow = null; + // this will be the tooltip element (jQuery wrapped HTML element) + this.$tooltip; + + // for backward compatibility + this.options.iconTheme = this.options.iconTheme.replace('.', ''); + this.options.theme = this.options.theme.replace('.', ''); + + // launch + + this._init(); + } + + Plugin.prototype = { + + _init: function() { + + var self = this; + + // disable the plugin on old browsers (including IE7 and lower) + if (document.querySelector) { + + // note : the content is null (empty) by default and can stay that way if the plugin remains initialized but not fed any content. The tooltip will just not appear. + + // let's save the initial value of the title attribute for later restoration if need be. + var initialTitle = null; + // it will already have been saved in case of multiple tooltips + if (self.$el.data('tooltipster-initialTitle') === undefined) { + + initialTitle = self.$el.attr('title'); + + // we do not want initialTitle to have the value "undefined" because of how jQuery's .data() method works + if (initialTitle === undefined) initialTitle = null; + + self.$el.data('tooltipster-initialTitle', initialTitle); + } + + // if content is provided in the options, its has precedence over the title attribute. + // Note : an empty string is considered content, only 'null' represents the absence of content. + // Also, an existing title="" attribute will result in an empty string content + if (self.options.content !== null){ + self._content_set(self.options.content); + } + else { + self._content_set(initialTitle); + } + + var c = self.options.functionInit.call(self.$el, self.$el, self.Content); + if(typeof c !== 'undefined') self._content_set(c); + + self.$el + // strip the title off of the element to prevent the default tooltips from popping up + .removeAttr('title') + // to be able to find all instances on the page later (upon window events in particular) + .addClass('tooltipstered'); + + // detect if we're changing the tooltip origin to an icon + // note about this condition : if the device has touch capability and self.options.iconTouch is false, you'll have no icons event though you may consider your device as a desktop if it also has a mouse. Not sure why someone would have this use case though. + if ((!deviceHasTouchCapability && self.options.iconDesktop) || (deviceHasTouchCapability && self.options.iconTouch)) { + + // TODO : the tooltip should be automatically be given an absolute position to be near the origin. Otherwise, when the origin is floating or what, it's going to be nowhere near it and disturb the position flow of the page elements. It will imply that the icon also detects when its origin moves, to follow it : not trivial. + // Until it's done, the icon feature does not really make sense since the user still has most of the work to do by himself + + // if the icon provided is in the form of a string + if(typeof self.options.icon === 'string'){ + // wrap it in a span with the icon class + self.$elProxy = $('<span class="'+ self.options.iconTheme +'"></span>'); + self.$elProxy.text(self.options.icon); + } + // if it is an object (sensible choice) + else { + // (deep) clone the object if iconCloning == true, to make sure every instance has its own proxy. We use the icon without wrapping, no need to. We do not give it a class either, as the user will undoubtedly style the object on his own and since our css properties may conflict with his own + if (self.options.iconCloning) self.$elProxy = self.options.icon.clone(true); + else self.$elProxy = self.options.icon; + } + + self.$elProxy.insertAfter(self.$el); + } + else { + self.$elProxy = self.$el; + } + + // for 'click' and 'hover' triggers : bind on events to open the tooltip. Closing is now handled in _showNow() because of its bindings. + // Notes about touch events : + // - mouseenter, mouseleave and clicks happen even on pure touch devices because they are emulated. deviceIsPureTouch() is a simple attempt to detect them. + // - on hybrid devices, we do not prevent touch gesture from opening tooltips. It would be too complex to differentiate real mouse events from emulated ones. + // - we check deviceIsPureTouch() at each event rather than prior to binding because the situation may change during browsing + if (self.options.trigger == 'hover') { + + // these binding are for mouse interaction only + self.$elProxy + .on('mouseenter.'+ self.namespace, function() { + if (!deviceIsPureTouch() || self.options.touchDevices) { + self.mouseIsOverProxy = true; + self._show(); + } + }) + .on('mouseleave.'+ self.namespace, function() { + if (!deviceIsPureTouch() || self.options.touchDevices) { + self.mouseIsOverProxy = false; + } + }); + + // for touch interaction only + if (deviceHasTouchCapability && self.options.touchDevices) { + + // for touch devices, we immediately display the tooltip because we cannot rely on mouseleave to handle the delay + self.$elProxy.on('touchstart.'+ self.namespace, function() { + self._showNow(); + }); + } + } + else if (self.options.trigger == 'click') { + + // note : for touch devices, we do not bind on touchstart, we only rely on the emulated clicks (triggered by taps) + self.$elProxy.on('click.'+ self.namespace, function() { + if (!deviceIsPureTouch() || self.options.touchDevices) { + self._show(); + } + }); + } + } + }, + + // this function will schedule the opening of the tooltip after the delay, if there is one + _show: function() { + + var self = this; + + if (self.Status != 'shown' && self.Status != 'appearing') { + + if (self.options.delay) { + self.timerShow = setTimeout(function(){ + + // for hover trigger, we check if the mouse is still over the proxy, otherwise we do not show anything + if (self.options.trigger == 'click' || (self.options.trigger == 'hover' && self.mouseIsOverProxy)) { + self._showNow(); + } + }, self.options.delay); + } + else self._showNow(); + } + }, + + // this function will open the tooltip right away + _showNow: function(callback) { + + var self = this; + + // call our constructor custom function before continuing + self.options.functionBefore.call(self.$el, self.$el, function() { + + // continue only if the tooltip is enabled and has any content + if (self.enabled && self.Content !== null) { + + // save the method callback and cancel hide method callbacks + if (callback) self.callbacks.show.push(callback); + self.callbacks.hide = []; + + //get rid of any appearance timer + clearTimeout(self.timerShow); + self.timerShow = null; + clearTimeout(self.timerHide); + self.timerHide = null; + + // if we only want one tooltip open at a time, close all auto-closing tooltips currently open and not already disappearing + if (self.options.onlyOne) { + $('.tooltipstered').not(self.$el).each(function(i,el) { + + var $el = $(el), + nss = $el.data('tooltipster-ns'); + + // iterate on all tooltips of the element + $.each(nss, function(i, ns){ + var instance = $el.data(ns), + // we have to use the public methods here + s = instance.status(), + ac = instance.option('autoClose'); + + if (s !== 'hidden' && s !== 'disappearing' && ac) { + instance.hide(); + } + }); + }); + } + + var finish = function() { + self.Status = 'shown'; + + // trigger any show method custom callbacks and reset them + $.each(self.callbacks.show, function(i,c) { c.call(self.$el); }); + self.callbacks.show = []; + }; + + // if this origin already has its tooltip open + if (self.Status !== 'hidden') { + + // the timer (if any) will start (or restart) right now + var extraTime = 0; + + // if it was disappearing, cancel that + if (self.Status === 'disappearing') { + + self.Status = 'appearing'; + + if (supportsTransitions()) { + + self.$tooltip + .clearQueue() + .removeClass('tooltipster-dying') + .addClass('tooltipster-'+ self.options.animation +'-show'); + + if (self.options.speed > 0) self.$tooltip.delay(self.options.speed); + + self.$tooltip.queue(finish); + } + else { + // in case the tooltip was currently fading out, bring it back to life + self.$tooltip + .stop() + .fadeIn(finish); + } + } + // if the tooltip is already open, we still need to trigger the method custom callback + else if(self.Status === 'shown') { + finish(); + } + } + // if the tooltip isn't already open, open that sucker up! + else { + + self.Status = 'appearing'; + + // the timer (if any) will start when the tooltip has fully appeared after its transition + var extraTime = self.options.speed; + + // disable horizontal scrollbar to keep overflowing tooltips from jacking with it and then restore it to its previous value + self.bodyOverflowX = $('body').css('overflow-x'); + $('body').css('overflow-x', 'hidden'); + + // get some other settings related to building the tooltip + var animation = 'tooltipster-' + self.options.animation, + animationSpeed = '-webkit-transition-duration: '+ self.options.speed +'ms; -webkit-animation-duration: '+ self.options.speed +'ms; -moz-transition-duration: '+ self.options.speed +'ms; -moz-animation-duration: '+ self.options.speed +'ms; -o-transition-duration: '+ self.options.speed +'ms; -o-animation-duration: '+ self.options.speed +'ms; -ms-transition-duration: '+ self.options.speed +'ms; -ms-animation-duration: '+ self.options.speed +'ms; transition-duration: '+ self.options.speed +'ms; animation-duration: '+ self.options.speed +'ms;', + minWidth = self.options.minWidth ? 'min-width:'+ Math.round(self.options.minWidth) +'px;' : '', + maxWidth = self.options.maxWidth ? 'max-width:'+ Math.round(self.options.maxWidth) +'px;' : '', + pointerEvents = self.options.interactive ? 'pointer-events: auto;' : ''; + + // build the base of our tooltip + self.$tooltip = $('<div class="tooltipster-base '+ self.options.theme +'" style="'+ minWidth +' '+ maxWidth +' '+ pointerEvents +' '+ animationSpeed +'"><div class="tooltipster-content"></div></div>'); + + // only add the animation class if the user has a browser that supports animations + if (supportsTransitions()) self.$tooltip.addClass(animation); + + // insert the content + self._content_insert(); + + // attach + self.$tooltip.appendTo('body'); + + // do all the crazy calculations and positioning + self.reposition(); + + // call our custom callback since the content of the tooltip is now part of the DOM + self.options.functionReady.call(self.$el, self.$el, self.$tooltip); + + // animate in the tooltip + if (supportsTransitions()) { + + self.$tooltip.addClass(animation + '-show'); + + if(self.options.speed > 0) self.$tooltip.delay(self.options.speed); + + self.$tooltip.queue(finish); + } + else { + self.$tooltip.css('display', 'none').fadeIn(self.options.speed, finish); + } + + // will check if our tooltip origin is removed while the tooltip is shown + self._interval_set(); + + // reposition on scroll (otherwise position:fixed element's tooltips will move away form their origin) and on resize (in case position can/has to be changed) + $(window).on('scroll.'+ self.namespace +' resize.'+ self.namespace, function() { + self.reposition(); + }); + + // auto-close bindings + if (self.options.autoClose) { + + // in case a listener is already bound for autoclosing (mouse or touch, hover or click), unbind it first + $('body').off('.'+ self.namespace); + + // here we'll have to set different sets of bindings for both touch and mouse + if (self.options.trigger == 'hover') { + + // if the user touches the body, hide + if (deviceHasTouchCapability) { + // timeout 0 : explanation below in click section + setTimeout(function() { + // we don't want to bind on click here because the initial touchstart event has not yet triggered its click event, which is thus about to happen + $('body').on('touchstart.'+ self.namespace, function() { + self.hide(); + }); + }, 0); + } + + // if we have to allow interaction + if (self.options.interactive) { + + // touch events inside the tooltip must not close it + if (deviceHasTouchCapability) { + self.$tooltip.on('touchstart.'+ self.namespace, function(event) { + event.stopPropagation(); + }); + } + + // as for mouse interaction, we get rid of the tooltip only after the mouse has spent some time out of it + var tolerance = null; + + self.$elProxy.add(self.$tooltip) + // hide after some time out of the proxy and the tooltip + .on('mouseleave.'+ self.namespace + '-autoClose', function() { + clearTimeout(tolerance); + tolerance = setTimeout(function(){ + self.hide(); + }, self.options.interactiveTolerance); + }) + // suspend timeout when the mouse is over the proxy or the tooltip + .on('mouseenter.'+ self.namespace + '-autoClose', function() { + clearTimeout(tolerance); + }); + } + // if this is a non-interactive tooltip, get rid of it if the mouse leaves + else { + self.$elProxy.on('mouseleave.'+ self.namespace + '-autoClose', function() { + self.hide(); + }); + } + + // close the tooltip when the proxy gets a click (common behavior of native tooltips) + if (self.options.hideOnClick) { + + self.$elProxy.on('click.'+ self.namespace + '-autoClose', function() { + self.hide(); + }); + } + } + // here we'll set the same bindings for both clicks and touch on the body to hide the tooltip + else if(self.options.trigger == 'click'){ + + // use a timeout to prevent immediate closing if the method was called on a click event and if options.delay == 0 (because of bubbling) + setTimeout(function() { + $('body').on('click.'+ self.namespace +' touchstart.'+ self.namespace, function() { + self.hide(); + }); + }, 0); + + // if interactive, we'll stop the events that were emitted from inside the tooltip to stop autoClosing + if (self.options.interactive) { + + // note : the touch events will just not be used if the plugin is not enabled on touch devices + self.$tooltip.on('click.'+ self.namespace +' touchstart.'+ self.namespace, function(event) { + event.stopPropagation(); + }); + } + } + } + } + + // if we have a timer set, let the countdown begin + if (self.options.timer > 0) { + + self.timerHide = setTimeout(function() { + self.timerHide = null; + self.hide(); + }, self.options.timer + extraTime); + } + } + }); + }, + + _interval_set: function() { + + var self = this; + + self.checkInterval = setInterval(function() { + + // if the tooltip and/or its interval should be stopped + if ( + // if the origin has been removed + $('body').find(self.$el).length === 0 + // if the elProxy has been removed + || $('body').find(self.$elProxy).length === 0 + // if the tooltip has been closed + || self.Status == 'hidden' + // if the tooltip has somehow been removed + || $('body').find(self.$tooltip).length === 0 + ) { + // remove the tooltip if it's still here + if (self.Status == 'shown' || self.Status == 'appearing') self.hide(); + + // clear this interval as it is no longer necessary + self._interval_cancel(); + } + // if everything is alright + else { + // compare the former and current positions of the elProxy to reposition the tooltip if need be + if(self.options.positionTracker){ + + var p = self._repositionInfo(self.$elProxy), + identical = false; + + // compare size first (a change requires repositioning too) + if(areEqual(p.dimension, self.elProxyPosition.dimension)){ + + // for elements with a fixed position, we track the top and left properties (relative to window) + if(self.$elProxy.css('position') === 'fixed'){ + if(areEqual(p.position, self.elProxyPosition.position)) identical = true; + } + // otherwise, track total offset (relative to document) + else { + if(areEqual(p.offset, self.elProxyPosition.offset)) identical = true; + } + } + + if(!identical){ + self.reposition(); + self.options.positionTrackerCallback.call(self, self.$el); + } + } + } + }, 200); + }, + + _interval_cancel: function() { + clearInterval(this.checkInterval); + // clean delete + this.checkInterval = null; + }, + + _content_set: function(content) { + // clone if asked. Cloning the object makes sure that each instance has its own version of the content (in case a same object were provided for several instances) + // reminder : typeof null === object + if (typeof content === 'object' && content !== null && this.options.contentCloning) { + content = content.clone(true); + } + this.Content = content; + }, + + _content_insert: function() { + + var self = this, + $d = this.$tooltip.find('.tooltipster-content'); + + if (typeof self.Content === 'string' && !self.options.contentAsHTML) { + $d.text(self.Content); + } + else { + $d + .empty() + .append(self.Content); + } + }, + + _update: function(content) { + + var self = this; + + // change the content + self._content_set(content); + + if (self.Content !== null) { + + // update the tooltip if it is open + if (self.Status !== 'hidden') { + + // reset the content in the tooltip + self._content_insert(); + + // reposition and resize the tooltip + self.reposition(); + + // if we want to play a little animation showing the content changed + if (self.options.updateAnimation) { + + if (supportsTransitions()) { + + self.$tooltip.css({ + 'width': '', + '-webkit-transition': 'all ' + self.options.speed + 'ms, width 0ms, height 0ms, left 0ms, top 0ms', + '-moz-transition': 'all ' + self.options.speed + 'ms, width 0ms, height 0ms, left 0ms, top 0ms', + '-o-transition': 'all ' + self.options.speed + 'ms, width 0ms, height 0ms, left 0ms, top 0ms', + '-ms-transition': 'all ' + self.options.speed + 'ms, width 0ms, height 0ms, left 0ms, top 0ms', + 'transition': 'all ' + self.options.speed + 'ms, width 0ms, height 0ms, left 0ms, top 0ms' + }).addClass('tooltipster-content-changing'); + + // reset the CSS transitions and finish the change animation + setTimeout(function() { + + if(self.Status != 'hidden'){ + + self.$tooltip.removeClass('tooltipster-content-changing'); + + // after the changing animation has completed, reset the CSS transitions + setTimeout(function() { + + if(self.Status !== 'hidden'){ + self.$tooltip.css({ + '-webkit-transition': self.options.speed + 'ms', + '-moz-transition': self.options.speed + 'ms', + '-o-transition': self.options.speed + 'ms', + '-ms-transition': self.options.speed + 'ms', + 'transition': self.options.speed + 'ms' + }); + } + }, self.options.speed); + } + }, self.options.speed); + } + else { + self.$tooltip.fadeTo(self.options.speed, 0.5, function() { + if(self.Status != 'hidden'){ + self.$tooltip.fadeTo(self.options.speed, 1); + } + }); + } + } + } + } + else { + self.hide(); + } + }, + + _repositionInfo: function($el) { + return { + dimension: { + height: $el.outerHeight(false), + width: $el.outerWidth(false) + }, + offset: $el.offset(), + position: { + left: parseInt($el.css('left')), + top: parseInt($el.css('top')) + } + }; + }, + + hide: function(callback) { + + var self = this; + + // save the method custom callback and cancel any show method custom callbacks + if (callback) self.callbacks.hide.push(callback); + self.callbacks.show = []; + + // get rid of any appearance timeout + clearTimeout(self.timerShow); + self.timerShow = null; + clearTimeout(self.timerHide); + self.timerHide = null; + + var finishCallbacks = function() { + // trigger any hide method custom callbacks and reset them + $.each(self.callbacks.hide, function(i,c) { c.call(self.$el); }); + self.callbacks.hide = []; + }; + + // hide + if (self.Status == 'shown' || self.Status == 'appearing') { + + self.Status = 'disappearing'; + + var finish = function() { + + self.Status = 'hidden'; + + // detach our content object first, so the next jQuery's remove() call does not unbind its event handlers + if (typeof self.Content == 'object' && self.Content !== null) { + self.Content.detach(); + } + + self.$tooltip.remove(); + self.$tooltip = null; + + // unbind orientationchange, scroll and resize listeners + $(window).off('.'+ self.namespace); + + $('body') + // unbind any auto-closing click/touch listeners + .off('.'+ self.namespace) + .css('overflow-x', self.bodyOverflowX); + + // unbind any auto-closing click/touch listeners + $('body').off('.'+ self.namespace); + + // unbind any auto-closing hover listeners + self.$elProxy.off('.'+ self.namespace + '-autoClose'); + + // call our constructor custom callback function + self.options.functionAfter.call(self.$el, self.$el); + + // call our method custom callbacks functions + finishCallbacks(); + }; + + if (supportsTransitions()) { + + self.$tooltip + .clearQueue() + .removeClass('tooltipster-' + self.options.animation + '-show') + // for transitions only + .addClass('tooltipster-dying'); + + if(self.options.speed > 0) self.$tooltip.delay(self.options.speed); + + self.$tooltip.queue(finish); + } + else { + self.$tooltip + .stop() + .fadeOut(self.options.speed, finish); + } + } + // if the tooltip is already hidden, we still need to trigger the method custom callback + else if(self.Status == 'hidden') { + finishCallbacks(); + } + + return self; + }, + + // the public show() method is actually an alias for the private showNow() method + show: function(callback) { + this._showNow(callback); + return this; + }, + + // 'update' is deprecated in favor of 'content' but is kept for backward compatibility + update: function(c) { + return this.content(c); + }, + content: function(c) { + // getter method + if(typeof c === 'undefined'){ + return this.Content; + } + // setter method + else { + this._update(c); + return this; + } + }, + + reposition: function() { + + var self = this; + + // in case the tooltip has been removed from DOM manually + if ($('body').find(self.$tooltip).length !== 0) { + + // reset width + self.$tooltip.css('width', ''); + + // find variables to determine placement + self.elProxyPosition = self._repositionInfo(self.$elProxy); + var arrowReposition = null, + windowWidth = $(window).width(), + // shorthand + proxy = self.elProxyPosition, + tooltipWidth = self.$tooltip.outerWidth(false), + tooltipInnerWidth = self.$tooltip.innerWidth() + 1, // this +1 stops FireFox from sometimes forcing an additional text line + tooltipHeight = self.$tooltip.outerHeight(false); + + // if this is an <area> tag inside a <map>, all hell breaks loose. Recalculate all the measurements based on coordinates + if (self.$elProxy.is('area')) { + var areaShape = self.$elProxy.attr('shape'), + mapName = self.$elProxy.parent().attr('name'), + map = $('img[usemap="#'+ mapName +'"]'), + mapOffsetLeft = map.offset().left, + mapOffsetTop = map.offset().top, + areaMeasurements = self.$elProxy.attr('coords') !== undefined ? self.$elProxy.attr('coords').split(',') : undefined; + + if (areaShape == 'circle') { + var areaLeft = parseInt(areaMeasurements[0]), + areaTop = parseInt(areaMeasurements[1]), + areaWidth = parseInt(areaMeasurements[2]); + proxy.dimension.height = areaWidth * 2; + proxy.dimension.width = areaWidth * 2; + proxy.offset.top = mapOffsetTop + areaTop - areaWidth; + proxy.offset.left = mapOffsetLeft + areaLeft - areaWidth; + } + else if (areaShape == 'rect') { + var areaLeft = parseInt(areaMeasurements[0]), + areaTop = parseInt(areaMeasurements[1]), + areaRight = parseInt(areaMeasurements[2]), + areaBottom = parseInt(areaMeasurements[3]); + proxy.dimension.height = areaBottom - areaTop; + proxy.dimension.width = areaRight - areaLeft; + proxy.offset.top = mapOffsetTop + areaTop; + proxy.offset.left = mapOffsetLeft + areaLeft; + } + else if (areaShape == 'poly') { + var areaXs = [], + areaYs = [], + areaSmallestX = 0, + areaSmallestY = 0, + areaGreatestX = 0, + areaGreatestY = 0, + arrayAlternate = 'even'; + + for (var i = 0; i < areaMeasurements.length; i++) { + var areaNumber = parseInt(areaMeasurements[i]); + + if (arrayAlternate == 'even') { + if (areaNumber > areaGreatestX) { + areaGreatestX = areaNumber; + if (i === 0) { + areaSmallestX = areaGreatestX; + } + } + + if (areaNumber < areaSmallestX) { + areaSmallestX = areaNumber; + } + + arrayAlternate = 'odd'; + } + else { + if (areaNumber > areaGreatestY) { + areaGreatestY = areaNumber; + if (i == 1) { + areaSmallestY = areaGreatestY; + } + } + + if (areaNumber < areaSmallestY) { + areaSmallestY = areaNumber; + } + + arrayAlternate = 'even'; + } + } + + proxy.dimension.height = areaGreatestY - areaSmallestY; + proxy.dimension.width = areaGreatestX - areaSmallestX; + proxy.offset.top = mapOffsetTop + areaSmallestY; + proxy.offset.left = mapOffsetLeft + areaSmallestX; + } + else { + proxy.dimension.height = map.outerHeight(false); + proxy.dimension.width = map.outerWidth(false); + proxy.offset.top = mapOffsetTop; + proxy.offset.left = mapOffsetLeft; + } + } + + // our function and global vars for positioning our tooltip + var myLeft = 0, + myLeftMirror = 0, + myTop = 0, + offsetY = parseInt(self.options.offsetY), + offsetX = parseInt(self.options.offsetX), + // this is the arrow position that will eventually be used. It may differ from the position option if the tooltip cannot be displayed in this position + practicalPosition = self.options.position; + + // a function to detect if the tooltip is going off the screen horizontally. If so, reposition the crap out of it! + function dontGoOffScreenX() { + + var windowLeft = $(window).scrollLeft(); + + // if the tooltip goes off the left side of the screen, line it up with the left side of the window + if((myLeft - windowLeft) < 0) { + arrowReposition = myLeft - windowLeft; + myLeft = windowLeft; + } + + // if the tooltip goes off the right of the screen, line it up with the right side of the window + if (((myLeft + tooltipWidth) - windowLeft) > windowWidth) { + arrowReposition = myLeft - ((windowWidth + windowLeft) - tooltipWidth); + myLeft = (windowWidth + windowLeft) - tooltipWidth; + } + } + + // a function to detect if the tooltip is going off the screen vertically. If so, switch to the opposite! + function dontGoOffScreenY(switchTo, switchFrom) { + // if it goes off the top off the page + if(((proxy.offset.top - $(window).scrollTop() - tooltipHeight - offsetY - 12) < 0) && (switchFrom.indexOf('top') > -1)) { + practicalPosition = switchTo; + } + + // if it goes off the bottom of the page + if (((proxy.offset.top + proxy.dimension.height + tooltipHeight + 12 + offsetY) > ($(window).scrollTop() + $(window).height())) && (switchFrom.indexOf('bottom') > -1)) { + practicalPosition = switchTo; + myTop = (proxy.offset.top - tooltipHeight) - offsetY - 12; + } + } + + if(practicalPosition == 'top') { + var leftDifference = (proxy.offset.left + tooltipWidth) - (proxy.offset.left + proxy.dimension.width); + myLeft = (proxy.offset.left + offsetX) - (leftDifference / 2); + myTop = (proxy.offset.top - tooltipHeight) - offsetY - 12; + dontGoOffScreenX(); + dontGoOffScreenY('bottom', 'top'); + } + + if(practicalPosition == 'top-left') { + myLeft = proxy.offset.left + offsetX; + myTop = (proxy.offset.top - tooltipHeight) - offsetY - 12; + dontGoOffScreenX(); + dontGoOffScreenY('bottom-left', 'top-left'); + } + + if(practicalPosition == 'top-right') { + myLeft = (proxy.offset.left + proxy.dimension.width + offsetX) - tooltipWidth; + myTop = (proxy.offset.top - tooltipHeight) - offsetY - 12; + dontGoOffScreenX(); + dontGoOffScreenY('bottom-right', 'top-right'); + } + + if(practicalPosition == 'bottom') { + var leftDifference = (proxy.offset.left + tooltipWidth) - (proxy.offset.left + proxy.dimension.width); + myLeft = proxy.offset.left - (leftDifference / 2) + offsetX; + myTop = (proxy.offset.top + proxy.dimension.height) + offsetY + 12; + dontGoOffScreenX(); + dontGoOffScreenY('top', 'bottom'); + } + + if(practicalPosition == 'bottom-left') { + myLeft = proxy.offset.left + offsetX; + myTop = (proxy.offset.top + proxy.dimension.height) + offsetY + 12; + dontGoOffScreenX(); + dontGoOffScreenY('top-left', 'bottom-left'); + } + + if(practicalPosition == 'bottom-right') { + myLeft = (proxy.offset.left + proxy.dimension.width + offsetX) - tooltipWidth; + myTop = (proxy.offset.top + proxy.dimension.height) + offsetY + 12; + dontGoOffScreenX(); + dontGoOffScreenY('top-right', 'bottom-right'); + } + + if(practicalPosition == 'left') { + myLeft = proxy.offset.left - offsetX - tooltipWidth - 12; + myLeftMirror = proxy.offset.left + offsetX + proxy.dimension.width + 12; + var topDifference = (proxy.offset.top + tooltipHeight) - (proxy.offset.top + proxy.dimension.height); + myTop = proxy.offset.top - (topDifference / 2) - offsetY; + + // if the tooltip goes off boths sides of the page + if((myLeft < 0) && ((myLeftMirror + tooltipWidth) > windowWidth)) { + var borderWidth = parseFloat(self.$tooltip.css('border-width')) * 2, + newWidth = (tooltipWidth + myLeft) - borderWidth; + self.$tooltip.css('width', newWidth + 'px'); + + tooltipHeight = self.$tooltip.outerHeight(false); + myLeft = proxy.offset.left - offsetX - newWidth - 12 - borderWidth; + topDifference = (proxy.offset.top + tooltipHeight) - (proxy.offset.top + proxy.dimension.height); + myTop = proxy.offset.top - (topDifference / 2) - offsetY; + } + + // if it only goes off one side, flip it to the other side + else if(myLeft < 0) { + myLeft = proxy.offset.left + offsetX + proxy.dimension.width + 12; + arrowReposition = 'left'; + } + } + + if(practicalPosition == 'right') { + myLeft = proxy.offset.left + offsetX + proxy.dimension.width + 12; + myLeftMirror = proxy.offset.left - offsetX - tooltipWidth - 12; + var topDifference = (proxy.offset.top + tooltipHeight) - (proxy.offset.top + proxy.dimension.height); + myTop = proxy.offset.top - (topDifference / 2) - offsetY; + + // if the tooltip goes off boths sides of the page + if(((myLeft + tooltipWidth) > windowWidth) && (myLeftMirror < 0)) { + var borderWidth = parseFloat(self.$tooltip.css('border-width')) * 2, + newWidth = (windowWidth - myLeft) - borderWidth; + self.$tooltip.css('width', newWidth + 'px'); + + tooltipHeight = self.$tooltip.outerHeight(false); + topDifference = (proxy.offset.top + tooltipHeight) - (proxy.offset.top + proxy.dimension.height); + myTop = proxy.offset.top - (topDifference / 2) - offsetY; + } + + // if it only goes off one side, flip it to the other side + else if((myLeft + tooltipWidth) > windowWidth) { + myLeft = proxy.offset.left - offsetX - tooltipWidth - 12; + arrowReposition = 'right'; + } + } + + // if arrow is set true, style it and append it + if (self.options.arrow) { + + var arrowClass = 'tooltipster-arrow-' + practicalPosition; + + // set color of the arrow + if(self.options.arrowColor.length < 1) { + var arrowColor = self.$tooltip.css('background-color'); + } + else { + var arrowColor = self.options.arrowColor; + } + + // if the tooltip was going off the page and had to re-adjust, we need to update the arrow's position + if (!arrowReposition) { + arrowReposition = ''; + } + else if (arrowReposition == 'left') { + arrowClass = 'tooltipster-arrow-right'; + arrowReposition = ''; + } + else if (arrowReposition == 'right') { + arrowClass = 'tooltipster-arrow-left'; + arrowReposition = ''; + } + else { + arrowReposition = 'left:'+ Math.round(arrowReposition) +'px;'; + } + + // building the logic to create the border around the arrow of the tooltip + if ((practicalPosition == 'top') || (practicalPosition == 'top-left') || (practicalPosition == 'top-right')) { + var tooltipBorderWidth = parseFloat(self.$tooltip.css('border-bottom-width')), + tooltipBorderColor = self.$tooltip.css('border-bottom-color'); + } + else if ((practicalPosition == 'bottom') || (practicalPosition == 'bottom-left') || (practicalPosition == 'bottom-right')) { + var tooltipBorderWidth = parseFloat(self.$tooltip.css('border-top-width')), + tooltipBorderColor = self.$tooltip.css('border-top-color'); + } + else if (practicalPosition == 'left') { + var tooltipBorderWidth = parseFloat(self.$tooltip.css('border-right-width')), + tooltipBorderColor = self.$tooltip.css('border-right-color'); + } + else if (practicalPosition == 'right') { + var tooltipBorderWidth = parseFloat(self.$tooltip.css('border-left-width')), + tooltipBorderColor = self.$tooltip.css('border-left-color'); + } + else { + var tooltipBorderWidth = parseFloat(self.$tooltip.css('border-bottom-width')), + tooltipBorderColor = self.$tooltip.css('border-bottom-color'); + } + + if (tooltipBorderWidth > 1) { + tooltipBorderWidth++; + } + + var arrowBorder = ''; + if (tooltipBorderWidth !== 0) { + var arrowBorderSize = '', + arrowBorderColor = 'border-color: '+ tooltipBorderColor +';'; + if (arrowClass.indexOf('bottom') !== -1) { + arrowBorderSize = 'margin-top: -'+ Math.round(tooltipBorderWidth) +'px;'; + } + else if (arrowClass.indexOf('top') !== -1) { + arrowBorderSize = 'margin-bottom: -'+ Math.round(tooltipBorderWidth) +'px;'; + } + else if (arrowClass.indexOf('left') !== -1) { + arrowBorderSize = 'margin-right: -'+ Math.round(tooltipBorderWidth) +'px;'; + } + else if (arrowClass.indexOf('right') !== -1) { + arrowBorderSize = 'margin-left: -'+ Math.round(tooltipBorderWidth) +'px;'; + } + arrowBorder = '<span class="tooltipster-arrow-border" style="'+ arrowBorderSize +' '+ arrowBorderColor +';"></span>'; + } + + // if the arrow already exists, remove and replace it + self.$tooltip.find('.tooltipster-arrow').remove(); + + // build out the arrow and append it + var arrowConstruct = '<div class="'+ arrowClass +' tooltipster-arrow" style="'+ arrowReposition +'">'+ arrowBorder +'<span style="border-color:'+ arrowColor +';"></span></div>'; + self.$tooltip.append(arrowConstruct); + } + + // position the tooltip + self.$tooltip.css({'top': Math.round(myTop) + 'px', 'left': Math.round(myLeft) + 'px'}); + } + + return self; + }, + + enable: function() { + this.enabled = true; + return this; + }, + + disable: function() { + // hide first, in case the tooltip would not disappear on its own (autoClose false) + this.hide(); + this.enabled = false; + return this; + }, + + destroy: function() { + + var self = this; + + self.hide(); + + // remove the icon, if any + if (self.$el[0] !== self.$elProxy[0]) { + self.$elProxy.remove(); + } + + self.$el + .removeData(self.namespace) + .off('.'+ self.namespace); + + var ns = self.$el.data('tooltipster-ns'); + + // if there are no more tooltips on this element + if(ns.length === 1){ + + // optional restoration of a title attribute + var title = null; + if (self.options.restoration === 'previous'){ + title = self.$el.data('tooltipster-initialTitle'); + } + else if(self.options.restoration === 'current'){ + + // old school technique to stringify when outerHTML is not supported + title = + (typeof self.Content === 'string') ? + self.Content : + $('<div></div>').append(self.Content).html(); + } + + if (title) { + self.$el.attr('title', title); + } + + // final cleaning + self.$el + .removeClass('tooltipstered') + .removeData('tooltipster-ns') + .removeData('tooltipster-initialTitle'); + } + else { + // remove the instance namespace from the list of namespaces of tooltips present on the element + ns = $.grep(ns, function(el, i){ + return el !== self.namespace; + }); + self.$el.data('tooltipster-ns', ns); + } + + return self; + }, + + elementIcon: function() { + return (this.$el[0] !== this.$elProxy[0]) ? this.$elProxy[0] : undefined; + }, + + elementTooltip: function() { + return this.$tooltip ? this.$tooltip[0] : undefined; + }, + + // public methods but for internal use only + // getter if val is ommitted, setter otherwise + option: function(o, val) { + if (typeof val == 'undefined') return this.options[o]; + else { + this.options[o] = val; + return this; + } + }, + status: function() { + return this.Status; + } + }; + + $.fn[pluginName] = function () { + + // for using in closures + var args = arguments; + + // if we are not in the context of jQuery wrapped HTML element(s) : + // this happens when calling static methods in the form $.fn.tooltipster('methodName'), or when calling $(sel).tooltipster('methodName or options') where $(sel) does not match anything + if (this.length === 0) { + + // if the first argument is a method name + if (typeof args[0] === 'string') { + + var methodIsStatic = true; + + // list static methods here (usable by calling $.fn.tooltipster('methodName');) + switch (args[0]) { + + case 'setDefaults': + // change default options for all future instances + $.extend(defaults, args[1]); + break; + + default: + methodIsStatic = false; + break; + } + + // $.fn.tooltipster('methodName') calls will return true + if (methodIsStatic) return true; + // $(sel).tooltipster('methodName') calls will return the list of objects event though it's empty because chaining should work on empty lists + else return this; + } + // the first argument is undefined or an object of options : we are initalizing but there is no element matched by selector + else { + // still chainable : same as above + return this; + } + } + // this happens when calling $(sel).tooltipster('methodName or options') where $(sel) matches one or more elements + else { + + // method calls + if (typeof args[0] === 'string') { + + var v = '#*$~&'; + + this.each(function() { + + // retrieve the namepaces of the tooltip(s) that exist on that element. We will interact with the first tooltip only. + var ns = $(this).data('tooltipster-ns'), + // self represents the instance of the first tooltipster plugin associated to the current HTML object of the loop + self = ns ? $(this).data(ns[0]) : null; + + // if the current element holds a tooltipster instance + if (self) { + + if (typeof self[args[0]] === 'function') { + // note : args[1] and args[2] may not be defined + var resp = self[args[0]](args[1], args[2]); + } + else { + throw new Error('Unknown method .tooltipster("' + args[0] + '")'); + } + + // if the function returned anything other than the instance itself (which implies chaining) + if (resp !== self){ + v = resp; + // return false to stop .each iteration on the first element matched by the selector + return false; + } + } + else { + throw new Error('You called Tooltipster\'s "' + args[0] + '" method on an uninitialized element'); + } + }); + + return (v !== '#*$~&') ? v : this; + } + // first argument is undefined or an object : the tooltip is initializing + else { + + var instances = [], + // is there a defined value for the multiple option in the options object ? + multipleIsSet = args[0] && typeof args[0].multiple !== 'undefined', + // if the multiple option is set to true, or if it's not defined but set to true in the defaults + multiple = (multipleIsSet && args[0].multiple) || (!multipleIsSet && defaults.multiple), + // same for debug + debugIsSet = args[0] && typeof args[0].debug !== 'undefined', + debug = (debugIsSet && args[0].debug) || (!debugIsSet && defaults.debug); + + // initialize a tooltipster instance for each element if it doesn't already have one or if the multiple option is set, and attach the object to it + this.each(function () { + + var go = false, + ns = $(this).data('tooltipster-ns'), + instance = null; + + if (!ns) { + go = true; + } + else if (multiple) { + go = true; + } + else if (debug) { + console.log('Tooltipster: one or more tooltips are already attached to this element: ignoring. Use the "multiple" option to attach more tooltips.'); + } + + if (go) { + instance = new Plugin(this, args[0]); + + // save the reference of the new instance + if (!ns) ns = []; + ns.push(instance.namespace); + $(this).data('tooltipster-ns', ns) + + // save the instance itself + $(this).data(instance.namespace, instance); + } + + instances.push(instance); + }); + + if (multiple) return instances; + else return this; + } + } + }; + + // quick & dirty compare function (not bijective nor multidimensional) + function areEqual(a,b) { + var same = true; + $.each(a, function(i, el){ + if(typeof b[i] === 'undefined' || a[i] !== b[i]){ + same = false; + return false; + } + }); + return same; + } + + // detect if this device can trigger touch events + var deviceHasTouchCapability = !!('ontouchstart' in window); + + // we'll assume the device has no mouse until we detect any mouse movement + var deviceHasMouse = false; + $('body').one('mousemove', function() { + deviceHasMouse = true; + }); + + function deviceIsPureTouch() { + return (!deviceHasMouse && deviceHasTouchCapability); + } + + // detecting support for CSS transitions + function supportsTransitions() { + var b = document.body || document.documentElement, + s = b.style, + p = 'transition'; + + if(typeof s[p] == 'string') {return true; } + + v = ['Moz', 'Webkit', 'Khtml', 'O', 'ms'], + p = p.charAt(0).toUpperCase() + p.substr(1); + for(var i=0; i<v.length; i++) { + if(typeof s[v[i] + p] == 'string') { return true; } + } + return false; + } +})( jQuery, window, document ); diff --git a/vilya/static/js/lib/jquery.zclip.js b/hub/static/js/lib/jquery.zclip.js similarity index 100% rename from vilya/static/js/lib/jquery.zclip.js rename to hub/static/js/lib/jquery.zclip.js diff --git a/hub/static/js/lib/keymaster.js b/hub/static/js/lib/keymaster.js new file mode 100644 index 0000000..7494e21 --- /dev/null +++ b/hub/static/js/lib/keymaster.js @@ -0,0 +1,226 @@ +// keymaster.js +// (c) 2011-2012 Thomas Fuchs +// keymaster.js may be freely distributed under the MIT license. + +;(function(global){ + var k, + _handlers = {}, + _mods = { 16: false, 18: false, 17: false, 91: false }, + _scope = 'all', + // modifier keys + _MODIFIERS = { + '⇧': 16, shift: 16, + '⌥': 18, alt: 18, option: 18, + '⌃': 17, ctrl: 17, control: 17, + '⌘': 91, command: 91 + }, + // special keys + _MAP = { + backspace: 8, tab: 9, clear: 12, + enter: 13, 'return': 13, + esc: 27, escape: 27, space: 32, + left: 37, up: 38, + right: 39, down: 40, + del: 46, 'delete': 46, + home: 36, end: 35, + pageup: 33, pagedown: 34, + ',': 188, '.': 190, '/': 191, + '`': 192, '-': 189, '=': 187, + ';': 186, '\'': 222, + '[': 219, ']': 221, '\\': 220 + }, + _downKeys = []; + + for(k=1;k<20;k++) _MODIFIERS['f'+k] = 111+k; + + // IE doesn't support Array#indexOf, so have a simple replacement + function index(array, item){ + var i = array.length; + while(i--) if(array[i]===item) return i; + return -1; + } + + // handle keydown event + function dispatch(event, scope){ + var key, handler, k, i, modifiersMatch; + key = event.keyCode; + + if (index(_downKeys, key) == -1) { + _downKeys.push(key); + } + + // if a modifier key, set the key.<modifierkeyname> property to true and return + if(key == 93 || key == 224) key = 91; // right command on webkit, command on Gecko + if(key in _mods) { + _mods[key] = true; + // 'assignKey' from inside this closure is exported to window.key + for(k in _MODIFIERS) if(_MODIFIERS[k] == key) assignKey[k] = true; + return; + } + + // see if we need to ignore the keypress (filter() can can be overridden) + // by default ignore key presses if a select, textarea, or input is focused + if(!assignKey.filter.call(this, event)) return; + + // abort if no potentially matching shortcuts found + if (!(key in _handlers)) return; + + // for each potential shortcut + for (i = 0; i < _handlers[key].length; i++) { + handler = _handlers[key][i]; + + // see if it's in the current scope + if(handler.scope == scope || handler.scope == 'all'){ + // check if modifiers match if any + modifiersMatch = handler.mods.length > 0; + for(k in _mods) + if((!_mods[k] && index(handler.mods, +k) > -1) || + (_mods[k] && index(handler.mods, +k) == -1)) modifiersMatch = false; + // call the handler and stop the event if neccessary + if((handler.mods.length == 0 && !_mods[16] && !_mods[18] && !_mods[17] && !_mods[91]) || modifiersMatch){ + if(handler.method(event, handler)===false){ + if(event.preventDefault) event.preventDefault(); + else event.returnValue = false; + if(event.stopPropagation) event.stopPropagation(); + if(event.cancelBubble) event.cancelBubble = true; + } + } + } + } + }; + + // unset modifier keys on keyup + function clearModifier(event){ + var key = event.keyCode, k, + i = index(_downKeys, key); + + // remove key from _downKeys + if (i >= 0) { + _downKeys.splice(i, 1); + } + + if(key == 93 || key == 224) key = 91; + if(key in _mods) { + _mods[key] = false; + for(k in _MODIFIERS) if(_MODIFIERS[k] == key) assignKey[k] = false; + } + }; + + function resetModifiers() { + for(k in _mods) _mods[k] = false; + for(k in _MODIFIERS) assignKey[k] = false; + } + + // parse and assign shortcut + function assignKey(key, scope, method){ + var keys, mods, i, mi; + if (method === undefined) { + method = scope; + scope = 'all'; + } + key = key.replace(/\s/g,''); + keys = key.split(','); + + if((keys[keys.length-1])=='') + keys[keys.length-2] += ','; + // for each shortcut + for (i = 0; i < keys.length; i++) { + // set modifier keys if any + mods = []; + key = keys[i].split('+'); + if(key.length > 1){ + mods = key.slice(0,key.length-1); + for (mi = 0; mi < mods.length; mi++) + mods[mi] = _MODIFIERS[mods[mi]]; + key = [key[key.length-1]]; + } + // convert to keycode and... + key = key[0] + key = _MAP[key] || key.toUpperCase().charCodeAt(0); + // ...store handler + if (!(key in _handlers)) _handlers[key] = []; + _handlers[key].push({ shortcut: keys[i], scope: scope, method: method, key: keys[i], mods: mods }); + } + }; + + // Returns true if the key with code 'keyCode' is currently down + // Converts strings into key codes. + function isPressed(keyCode) { + if (typeof(keyCode)=='string') { + if (keyCode.length == 1) { + keyCode = (keyCode.toUpperCase()).charCodeAt(0); + } else { + return false; + } + } + return index(_downKeys, keyCode) != -1; + } + + function getPressedKeyCodes() { + return _downKeys; + } + + function filter(event){ + var tagName = (event.target || event.srcElement).tagName; + // ignore keypressed in any elements that support keyboard data input + return !(tagName == 'INPUT' || tagName == 'SELECT' || tagName == 'TEXTAREA'); + } + + // initialize key.<modifier> to false + for(k in _MODIFIERS) assignKey[k] = false; + + // set current scope (default 'all') + function setScope(scope){ _scope = scope || 'all' }; + function getScope(){ return _scope || 'all' }; + + // delete all handlers for a given scope + function deleteScope(scope){ + var key, handlers, i; + + for (key in _handlers) { + handlers = _handlers[key]; + for (i = 0; i < handlers.length; ) { + if (handlers[i].scope === scope) handlers.splice(i, 1); + else i++; + } + } + }; + + // cross-browser events + function addEvent(object, event, method) { + if (object.addEventListener) + object.addEventListener(event, method, false); + else if(object.attachEvent) + object.attachEvent('on'+event, function(){ method(window.event) }); + }; + + // set the handlers globally on document + addEvent(document, 'keydown', function(event) { dispatch(event, _scope) }); // Passing _scope to a callback to ensure it remains the same by execution. Fixes #48 + addEvent(document, 'keyup', clearModifier); + + // reset modifiers to false whenever the window is (re)focused. + addEvent(window, 'focus', resetModifiers); + + // store previously defined key + var previousKey = global.key; + + // restore previously defined key and return reference to our key object + function noConflict() { + var k = global.key; + global.key = previousKey; + return k; + } + + // set window.key and window.key.set/get/deleteScope, and the default filter + global.key = assignKey; + global.key.setScope = setScope; + global.key.getScope = getScope; + global.key.deleteScope = deleteScope; + global.key.filter = filter; + global.key.isPressed = isPressed; + global.key.getPressedKeyCodes = getPressedKeyCodes; + global.key.noConflict = noConflict; + + if(typeof module !== 'undefined') module.exports = key; + +})(this); diff --git a/vilya/static/js/lib/mode/asterisk.js b/hub/static/js/lib/mode/asterisk.js similarity index 100% rename from vilya/static/js/lib/mode/asterisk.js rename to hub/static/js/lib/mode/asterisk.js diff --git a/vilya/static/js/lib/mode/clike.js b/hub/static/js/lib/mode/clike.js similarity index 100% rename from vilya/static/js/lib/mode/clike.js rename to hub/static/js/lib/mode/clike.js diff --git a/vilya/static/js/lib/mode/clojure.js b/hub/static/js/lib/mode/clojure.js similarity index 100% rename from vilya/static/js/lib/mode/clojure.js rename to hub/static/js/lib/mode/clojure.js diff --git a/vilya/static/js/lib/mode/coffeescript.js b/hub/static/js/lib/mode/coffeescript.js similarity index 100% rename from vilya/static/js/lib/mode/coffeescript.js rename to hub/static/js/lib/mode/coffeescript.js diff --git a/vilya/static/js/lib/mode/commonlisp.js b/hub/static/js/lib/mode/commonlisp.js similarity index 100% rename from vilya/static/js/lib/mode/commonlisp.js rename to hub/static/js/lib/mode/commonlisp.js diff --git a/vilya/static/js/lib/mode/css.js b/hub/static/js/lib/mode/css.js similarity index 100% rename from vilya/static/js/lib/mode/css.js rename to hub/static/js/lib/mode/css.js diff --git a/vilya/static/js/lib/mode/d.js b/hub/static/js/lib/mode/d.js similarity index 100% rename from vilya/static/js/lib/mode/d.js rename to hub/static/js/lib/mode/d.js diff --git a/vilya/static/js/lib/mode/diff.js b/hub/static/js/lib/mode/diff.js similarity index 100% rename from vilya/static/js/lib/mode/diff.js rename to hub/static/js/lib/mode/diff.js diff --git a/vilya/static/js/lib/mode/ecl.js b/hub/static/js/lib/mode/ecl.js similarity index 100% rename from vilya/static/js/lib/mode/ecl.js rename to hub/static/js/lib/mode/ecl.js diff --git a/vilya/static/js/lib/mode/gfm.js b/hub/static/js/lib/mode/gfm.js similarity index 100% rename from vilya/static/js/lib/mode/gfm.js rename to hub/static/js/lib/mode/gfm.js diff --git a/vilya/static/js/lib/mode/go.js b/hub/static/js/lib/mode/go.js similarity index 100% rename from vilya/static/js/lib/mode/go.js rename to hub/static/js/lib/mode/go.js diff --git a/vilya/static/js/lib/mode/groovy.js b/hub/static/js/lib/mode/groovy.js similarity index 100% rename from vilya/static/js/lib/mode/groovy.js rename to hub/static/js/lib/mode/groovy.js diff --git a/vilya/static/js/lib/mode/haskell.js b/hub/static/js/lib/mode/haskell.js similarity index 100% rename from vilya/static/js/lib/mode/haskell.js rename to hub/static/js/lib/mode/haskell.js diff --git a/vilya/static/js/lib/mode/haxe.js b/hub/static/js/lib/mode/haxe.js similarity index 100% rename from vilya/static/js/lib/mode/haxe.js rename to hub/static/js/lib/mode/haxe.js diff --git a/vilya/static/js/lib/mode/htmlembedded.js b/hub/static/js/lib/mode/htmlembedded.js similarity index 100% rename from vilya/static/js/lib/mode/htmlembedded.js rename to hub/static/js/lib/mode/htmlembedded.js diff --git a/vilya/static/js/lib/mode/htmlmixed.js b/hub/static/js/lib/mode/htmlmixed.js similarity index 100% rename from vilya/static/js/lib/mode/htmlmixed.js rename to hub/static/js/lib/mode/htmlmixed.js diff --git a/vilya/static/js/lib/mode/http.js b/hub/static/js/lib/mode/http.js similarity index 100% rename from vilya/static/js/lib/mode/http.js rename to hub/static/js/lib/mode/http.js diff --git a/vilya/static/js/lib/mode/javascript.js b/hub/static/js/lib/mode/javascript.js similarity index 100% rename from vilya/static/js/lib/mode/javascript.js rename to hub/static/js/lib/mode/javascript.js diff --git a/vilya/static/js/lib/mode/jinja2.js b/hub/static/js/lib/mode/jinja2.js similarity index 100% rename from vilya/static/js/lib/mode/jinja2.js rename to hub/static/js/lib/mode/jinja2.js diff --git a/vilya/static/js/lib/mode/less.js b/hub/static/js/lib/mode/less.js similarity index 100% rename from vilya/static/js/lib/mode/less.js rename to hub/static/js/lib/mode/less.js diff --git a/vilya/static/js/lib/mode/lua.js b/hub/static/js/lib/mode/lua.js similarity index 100% rename from vilya/static/js/lib/mode/lua.js rename to hub/static/js/lib/mode/lua.js diff --git a/hub/static/js/lib/mode/markdown.js b/hub/static/js/lib/mode/markdown.js new file mode 100644 index 0000000..a73c06e --- /dev/null +++ b/hub/static/js/lib/mode/markdown.js @@ -0,0 +1,768 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE +CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) { + + var htmlFound = CodeMirror.modes.hasOwnProperty("xml"); + var htmlMode = CodeMirror.getMode(cmCfg, htmlFound ? {name: "xml", htmlMode: true} : "text/plain"); + + function getMode(name) { + if (CodeMirror.findModeByName) { + var found = CodeMirror.findModeByName(name); + if (found) name = found.mime || found.mimes[0]; + } + var mode = CodeMirror.getMode(cmCfg, name); + return mode.name == "null" ? null : mode; + } + + // Should characters that affect highlighting be highlighted separate? + // Does not include characters that will be output (such as `1.` and `-` for lists) + if (modeCfg.highlightFormatting === undefined) + modeCfg.highlightFormatting = false; + + // Maximum number of nested blockquotes. Set to 0 for infinite nesting. + // Excess `>` will emit `error` token. + if (modeCfg.maxBlockquoteDepth === undefined) + modeCfg.maxBlockquoteDepth = 0; + + // Should underscores in words open/close em/strong? + if (modeCfg.underscoresBreakWords === undefined) + modeCfg.underscoresBreakWords = true; + + // Turn on fenced code blocks? ("```" to start/end) + if (modeCfg.fencedCodeBlocks === undefined) modeCfg.fencedCodeBlocks = false; + + // Turn on task lists? ("- [ ] " and "- [x] ") + if (modeCfg.taskLists === undefined) modeCfg.taskLists = false; + + // Turn on strikethrough syntax + if (modeCfg.strikethrough === undefined) + modeCfg.strikethrough = false; + + var codeDepth = 0; + + var header = 'header' + , code = 'comment' + , quote = 'quote' + , list1 = 'variable-2' + , list2 = 'variable-3' + , list3 = 'keyword' + , hr = 'hr' + , image = 'tag' + , formatting = 'formatting' + , linkinline = 'link' + , linkemail = 'link' + , linktext = 'link' + , linkhref = 'string' + , em = 'em' + , strong = 'strong' + , strikethrough = 'strikethrough'; + + var hrRE = /^([*\-_])(?:\s*\1){2,}\s*$/ + , ulRE = /^[*\-+]\s+/ + , olRE = /^[0-9]+([.)])\s+/ + , taskListRE = /^\[(x| )\](?=\s)/ // Must follow ulRE or olRE + , atxHeaderRE = /^(#+)(?: |$)/ + , setextHeaderRE = /^ *(?:\={1,}|-{1,})\s*$/ + , textRE = /^[^#!\[\]*_\\<>` "'(~]+/; + + function switchInline(stream, state, f) { + state.f = state.inline = f; + return f(stream, state); + } + + function switchBlock(stream, state, f) { + state.f = state.block = f; + return f(stream, state); + } + + + // Blocks + + function blankLine(state) { + // Reset linkTitle state + state.linkTitle = false; + // Reset EM state + state.em = false; + // Reset STRONG state + state.strong = false; + // Reset strikethrough state + state.strikethrough = false; + // Reset state.quote + state.quote = 0; + // Reset state.indentedCode + state.indentedCode = false; + if (!htmlFound && state.f == htmlBlock) { + state.f = inlineNormal; + state.block = blockNormal; + } + // Reset state.trailingSpace + state.trailingSpace = 0; + state.trailingSpaceNewLine = false; + // Mark this line as blank + state.thisLineHasContent = false; + return null; + } + + function blockNormal(stream, state) { + + var sol = stream.sol(); + + var prevLineIsList = state.list !== false, + prevLineIsIndentedCode = state.indentedCode; + + state.indentedCode = false; + + if (prevLineIsList) { + if (state.indentationDiff >= 0) { // Continued list + if (state.indentationDiff < 4) { // Only adjust indentation if *not* a code block + state.indentation -= state.indentationDiff; + } + state.list = null; + } else if (state.indentation > 0) { + state.list = null; + state.listDepth = Math.floor(state.indentation / 4); + } else { // No longer a list + state.list = false; + state.listDepth = 0; + } + } + + var match = null; + if (state.indentationDiff >= 4) { + stream.skipToEnd(); + if (prevLineIsIndentedCode || !state.prevLineHasContent) { + state.indentation -= 4; + state.indentedCode = true; + return code; + } else { + return null; + } + } else if (stream.eatSpace()) { + return null; + } else if ((match = stream.match(atxHeaderRE)) && match[1].length <= 6) { + state.header = match[1].length; + if (modeCfg.highlightFormatting) state.formatting = "header"; + state.f = state.inline; + return getType(state); + } else if (state.prevLineHasContent && !state.quote && !prevLineIsList && !prevLineIsIndentedCode && (match = stream.match(setextHeaderRE))) { + state.header = match[0].charAt(0) == '=' ? 1 : 2; + if (modeCfg.highlightFormatting) state.formatting = "header"; + state.f = state.inline; + return getType(state); + } else if (stream.eat('>')) { + state.quote = sol ? 1 : state.quote + 1; + if (modeCfg.highlightFormatting) state.formatting = "quote"; + stream.eatSpace(); + return getType(state); + } else if (stream.peek() === '[') { + return switchInline(stream, state, footnoteLink); + } else if (stream.match(hrRE, true)) { + state.hr = true; + return hr; + } else if ((!state.prevLineHasContent || prevLineIsList) && (stream.match(ulRE, false) || stream.match(olRE, false))) { + var listType = null; + if (stream.match(ulRE, true)) { + listType = 'ul'; + } else { + stream.match(olRE, true); + listType = 'ol'; + } + state.indentation += 4; + state.list = true; + state.listDepth++; + if (modeCfg.taskLists && stream.match(taskListRE, false)) { + state.taskList = true; + } + state.f = state.inline; + if (modeCfg.highlightFormatting) state.formatting = ["list", "list-" + listType]; + return getType(state); + } else if (modeCfg.fencedCodeBlocks && stream.match(/^```[ \t]*([\w+#]*)/, true)) { + // try switching mode + state.localMode = getMode(RegExp.$1); + if (state.localMode) state.localState = state.localMode.startState(); + state.f = state.block = local; + if (modeCfg.highlightFormatting) state.formatting = "code-block"; + state.code = true; + return getType(state); + } + + return switchInline(stream, state, state.inline); + } + + function htmlBlock(stream, state) { + var style = htmlMode.token(stream, state.htmlState); + if ((htmlFound && state.htmlState.tagStart === null && + (!state.htmlState.context && state.htmlState.tokenize.isInText)) || + (state.md_inside && stream.current().indexOf(">") > -1)) { + state.f = inlineNormal; + state.block = blockNormal; + state.htmlState = null; + } + return style; + } + + function local(stream, state) { + if (stream.sol() && stream.match("```", false)) { + state.localMode = state.localState = null; + state.f = state.block = leavingLocal; + return null; + } else if (state.localMode) { + return state.localMode.token(stream, state.localState); + } else { + stream.skipToEnd(); + return code; + } + } + + function leavingLocal(stream, state) { + stream.match("```"); + state.block = blockNormal; + state.f = inlineNormal; + if (modeCfg.highlightFormatting) state.formatting = "code-block"; + state.code = true; + var returnType = getType(state); + state.code = false; + return returnType; + } + + // Inline + function getType(state) { + var styles = []; + + if (state.formatting) { + styles.push(formatting); + + if (typeof state.formatting === "string") state.formatting = [state.formatting]; + + for (var i = 0; i < state.formatting.length; i++) { + styles.push(formatting + "-" + state.formatting[i]); + + if (state.formatting[i] === "header") { + styles.push(formatting + "-" + state.formatting[i] + "-" + state.header); + } + + // Add `formatting-quote` and `formatting-quote-#` for blockquotes + // Add `error` instead if the maximum blockquote nesting depth is passed + if (state.formatting[i] === "quote") { + if (!modeCfg.maxBlockquoteDepth || modeCfg.maxBlockquoteDepth >= state.quote) { + styles.push(formatting + "-" + state.formatting[i] + "-" + state.quote); + } else { + styles.push("error"); + } + } + } + } + + if (state.taskOpen) { + styles.push("meta"); + return styles.length ? styles.join(' ') : null; + } + if (state.taskClosed) { + styles.push("property"); + return styles.length ? styles.join(' ') : null; + } + + if (state.linkHref) { + styles.push(linkhref, "url"); + } else { // Only apply inline styles to non-url text + if (state.strong) { styles.push(strong); } + if (state.em) { styles.push(em); } + if (state.strikethrough) { styles.push(strikethrough); } + + if (state.linkText) { styles.push(linktext); } + + if (state.code) { styles.push(code); } + } + + if (state.header) { styles.push(header); styles.push(header + "-" + state.header); } + + if (state.quote) { + styles.push(quote); + + // Add `quote-#` where the maximum for `#` is modeCfg.maxBlockquoteDepth + if (!modeCfg.maxBlockquoteDepth || modeCfg.maxBlockquoteDepth >= state.quote) { + styles.push(quote + "-" + state.quote); + } else { + styles.push(quote + "-" + modeCfg.maxBlockquoteDepth); + } + } + + if (state.list !== false) { + var listMod = (state.listDepth - 1) % 3; + if (!listMod) { + styles.push(list1); + } else if (listMod === 1) { + styles.push(list2); + } else { + styles.push(list3); + } + } + + if (state.trailingSpaceNewLine) { + styles.push("trailing-space-new-line"); + } else if (state.trailingSpace) { + styles.push("trailing-space-" + (state.trailingSpace % 2 ? "a" : "b")); + } + + return styles.length ? styles.join(' ') : null; + } + + function handleText(stream, state) { + if (stream.match(textRE, true)) { + return getType(state); + } + return undefined; + } + + function inlineNormal(stream, state) { + var style = state.text(stream, state); + if (typeof style !== 'undefined') + return style; + + if (state.list) { // List marker (*, +, -, 1., etc) + state.list = null; + return getType(state); + } + + if (state.taskList) { + var taskOpen = stream.match(taskListRE, true)[1] !== "x"; + if (taskOpen) state.taskOpen = true; + else state.taskClosed = true; + if (modeCfg.highlightFormatting) state.formatting = "task"; + state.taskList = false; + return getType(state); + } + + state.taskOpen = false; + state.taskClosed = false; + + if (state.header && stream.match(/^#+$/, true)) { + if (modeCfg.highlightFormatting) state.formatting = "header"; + return getType(state); + } + + // Get sol() value now, before character is consumed + var sol = stream.sol(); + + var ch = stream.next(); + + if (ch === '\\') { + stream.next(); + if (modeCfg.highlightFormatting) { + var type = getType(state); + return type ? type + " formatting-escape" : "formatting-escape"; + } + } + + // Matches link titles present on next line + if (state.linkTitle) { + state.linkTitle = false; + var matchCh = ch; + if (ch === '(') { + matchCh = ')'; + } + matchCh = (matchCh+'').replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1"); + var regex = '^\\s*(?:[^' + matchCh + '\\\\]+|\\\\\\\\|\\\\.)' + matchCh; + if (stream.match(new RegExp(regex), true)) { + return linkhref; + } + } + + // If this block is changed, it may need to be updated in GFM mode + if (ch === '`') { + var previousFormatting = state.formatting; + if (modeCfg.highlightFormatting) state.formatting = "code"; + var t = getType(state); + var before = stream.pos; + stream.eatWhile('`'); + var difference = 1 + stream.pos - before; + if (!state.code) { + codeDepth = difference; + state.code = true; + return getType(state); + } else { + if (difference === codeDepth) { // Must be exact + state.code = false; + return t; + } + state.formatting = previousFormatting; + return getType(state); + } + } else if (state.code) { + return getType(state); + } + + if (ch === '!' && stream.match(/\[[^\]]*\] ?(?:\(|\[)/, false)) { + stream.match(/\[[^\]]*\]/); + state.inline = state.f = linkHref; + return image; + } + + if (ch === '[' && stream.match(/.*\](\(.*\)| ?\[.*\])/, false)) { + state.linkText = true; + if (modeCfg.highlightFormatting) state.formatting = "link"; + return getType(state); + } + + if (ch === ']' && state.linkText && stream.match(/\(.*\)| ?\[.*\]/, false)) { + if (modeCfg.highlightFormatting) state.formatting = "link"; + var type = getType(state); + state.linkText = false; + state.inline = state.f = linkHref; + return type; + } + + if (ch === '<' && stream.match(/^(https?|ftps?):\/\/(?:[^\\>]|\\.)+>/, false)) { + state.f = state.inline = linkInline; + if (modeCfg.highlightFormatting) state.formatting = "link"; + var type = getType(state); + if (type){ + type += " "; + } else { + type = ""; + } + return type + linkinline; + } + + if (ch === '<' && stream.match(/^[^> \\]+@(?:[^\\>]|\\.)+>/, false)) { + state.f = state.inline = linkInline; + if (modeCfg.highlightFormatting) state.formatting = "link"; + var type = getType(state); + if (type){ + type += " "; + } else { + type = ""; + } + return type + linkemail; + } + + if (ch === '<' && stream.match(/^(!--|\w)/, false)) { + var end = stream.string.indexOf(">", stream.pos); + if (end != -1) { + var atts = stream.string.substring(stream.start, end); + if (/markdown\s*=\s*('|"){0,1}1('|"){0,1}/.test(atts)) state.md_inside = true; + } + stream.backUp(1); + state.htmlState = CodeMirror.startState(htmlMode); + return switchBlock(stream, state, htmlBlock); + } + + if (ch === '<' && stream.match(/^\/\w*?>/)) { + state.md_inside = false; + return "tag"; + } + + var ignoreUnderscore = false; + if (!modeCfg.underscoresBreakWords) { + if (ch === '_' && stream.peek() !== '_' && stream.match(/(\w)/, false)) { + var prevPos = stream.pos - 2; + if (prevPos >= 0) { + var prevCh = stream.string.charAt(prevPos); + if (prevCh !== '_' && prevCh.match(/(\w)/, false)) { + ignoreUnderscore = true; + } + } + } + } + if (ch === '*' || (ch === '_' && !ignoreUnderscore)) { + if (sol && stream.peek() === ' ') { + // Do nothing, surrounded by newline and space + } else if (state.strong === ch && stream.eat(ch)) { // Remove STRONG + if (modeCfg.highlightFormatting) state.formatting = "strong"; + var t = getType(state); + state.strong = false; + return t; + } else if (!state.strong && stream.eat(ch)) { // Add STRONG + state.strong = ch; + if (modeCfg.highlightFormatting) state.formatting = "strong"; + return getType(state); + } else if (state.em === ch) { // Remove EM + if (modeCfg.highlightFormatting) state.formatting = "em"; + var t = getType(state); + state.em = false; + return t; + } else if (!state.em) { // Add EM + state.em = ch; + if (modeCfg.highlightFormatting) state.formatting = "em"; + return getType(state); + } + } else if (ch === ' ') { + if (stream.eat('*') || stream.eat('_')) { // Probably surrounded by spaces + if (stream.peek() === ' ') { // Surrounded by spaces, ignore + return getType(state); + } else { // Not surrounded by spaces, back up pointer + stream.backUp(1); + } + } + } + + if (modeCfg.strikethrough) { + if (ch === '~' && stream.eatWhile(ch)) { + if (state.strikethrough) {// Remove strikethrough + if (modeCfg.highlightFormatting) state.formatting = "strikethrough"; + var t = getType(state); + state.strikethrough = false; + return t; + } else if (stream.match(/^[^\s]/, false)) {// Add strikethrough + state.strikethrough = true; + if (modeCfg.highlightFormatting) state.formatting = "strikethrough"; + return getType(state); + } + } else if (ch === ' ') { + if (stream.match(/^~~/, true)) { // Probably surrounded by space + if (stream.peek() === ' ') { // Surrounded by spaces, ignore + return getType(state); + } else { // Not surrounded by spaces, back up pointer + stream.backUp(2); + } + } + } + } + + if (ch === ' ') { + if (stream.match(/ +$/, false)) { + state.trailingSpace++; + } else if (state.trailingSpace) { + state.trailingSpaceNewLine = true; + } + } + + return getType(state); + } + + function linkInline(stream, state) { + var ch = stream.next(); + + if (ch === ">") { + state.f = state.inline = inlineNormal; + if (modeCfg.highlightFormatting) state.formatting = "link"; + var type = getType(state); + if (type){ + type += " "; + } else { + type = ""; + } + return type + linkinline; + } + + stream.match(/^[^>]+/, true); + + return linkinline; + } + + function linkHref(stream, state) { + // Check if space, and return NULL if so (to avoid marking the space) + if(stream.eatSpace()){ + return null; + } + var ch = stream.next(); + if (ch === '(' || ch === '[') { + state.f = state.inline = getLinkHrefInside(ch === "(" ? ")" : "]"); + if (modeCfg.highlightFormatting) state.formatting = "link-string"; + state.linkHref = true; + return getType(state); + } + return 'error'; + } + + function getLinkHrefInside(endChar) { + return function(stream, state) { + var ch = stream.next(); + + if (ch === endChar) { + state.f = state.inline = inlineNormal; + if (modeCfg.highlightFormatting) state.formatting = "link-string"; + var returnState = getType(state); + state.linkHref = false; + return returnState; + } + + if (stream.match(inlineRE(endChar), true)) { + stream.backUp(1); + } + + state.linkHref = true; + return getType(state); + }; + } + + function footnoteLink(stream, state) { + if (stream.match(/^[^\]]*\]:/, false)) { + state.f = footnoteLinkInside; + stream.next(); // Consume [ + if (modeCfg.highlightFormatting) state.formatting = "link"; + state.linkText = true; + return getType(state); + } + return switchInline(stream, state, inlineNormal); + } + + function footnoteLinkInside(stream, state) { + if (stream.match(/^\]:/, true)) { + state.f = state.inline = footnoteUrl; + if (modeCfg.highlightFormatting) state.formatting = "link"; + var returnType = getType(state); + state.linkText = false; + return returnType; + } + + stream.match(/^[^\]]+/, true); + + return linktext; + } + + function footnoteUrl(stream, state) { + // Check if space, and return NULL if so (to avoid marking the space) + if(stream.eatSpace()){ + return null; + } + // Match URL + stream.match(/^[^\s]+/, true); + // Check for link title + if (stream.peek() === undefined) { // End of line, set flag to check next line + state.linkTitle = true; + } else { // More content on line, check if link title + stream.match(/^(?:\s+(?:"(?:[^"\\]|\\\\|\\.)+"|'(?:[^'\\]|\\\\|\\.)+'|\((?:[^)\\]|\\\\|\\.)+\)))?/, true); + } + state.f = state.inline = inlineNormal; + return linkhref + " url"; + } + + var savedInlineRE = []; + function inlineRE(endChar) { + if (!savedInlineRE[endChar]) { + // Escape endChar for RegExp (taken from http://stackoverflow.com/a/494122/526741) + endChar = (endChar+'').replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1"); + // Match any non-endChar, escaped character, as well as the closing + // endChar. + savedInlineRE[endChar] = new RegExp('^(?:[^\\\\]|\\\\.)*?(' + endChar + ')'); + } + return savedInlineRE[endChar]; + } + + var mode = { + startState: function() { + return { + f: blockNormal, + + prevLineHasContent: false, + thisLineHasContent: false, + + block: blockNormal, + htmlState: null, + indentation: 0, + + inline: inlineNormal, + text: handleText, + + formatting: false, + linkText: false, + linkHref: false, + linkTitle: false, + em: false, + strong: false, + header: 0, + hr: false, + taskList: false, + list: false, + listDepth: 0, + quote: 0, + trailingSpace: 0, + trailingSpaceNewLine: false, + strikethrough: false + }; + }, + + copyState: function(s) { + return { + f: s.f, + + prevLineHasContent: s.prevLineHasContent, + thisLineHasContent: s.thisLineHasContent, + + block: s.block, + htmlState: s.htmlState && CodeMirror.copyState(htmlMode, s.htmlState), + indentation: s.indentation, + + localMode: s.localMode, + localState: s.localMode ? CodeMirror.copyState(s.localMode, s.localState) : null, + + inline: s.inline, + text: s.text, + formatting: false, + linkTitle: s.linkTitle, + em: s.em, + strong: s.strong, + strikethrough: s.strikethrough, + header: s.header, + hr: s.hr, + taskList: s.taskList, + list: s.list, + listDepth: s.listDepth, + quote: s.quote, + indentedCode: s.indentedCode, + trailingSpace: s.trailingSpace, + trailingSpaceNewLine: s.trailingSpaceNewLine, + md_inside: s.md_inside + }; + }, + + token: function(stream, state) { + + // Reset state.formatting + state.formatting = false; + + if (stream.sol()) { + var forceBlankLine = !!state.header || state.hr; + + // Reset state.header and state.hr + state.header = 0; + state.hr = false; + + if (stream.match(/^\s*$/, true) || forceBlankLine) { + state.prevLineHasContent = false; + blankLine(state); + return forceBlankLine ? this.token(stream, state) : null; + } else { + state.prevLineHasContent = state.thisLineHasContent; + state.thisLineHasContent = true; + } + + // Reset state.taskList + state.taskList = false; + + // Reset state.code + state.code = false; + + // Reset state.trailingSpace + state.trailingSpace = 0; + state.trailingSpaceNewLine = false; + + state.f = state.block; + var indentation = stream.match(/^\s*/, true)[0].replace(/\t/g, ' ').length; + var difference = Math.floor((indentation - state.indentation) / 4) * 4; + if (difference > 4) difference = 4; + var adjustedIndentation = state.indentation + difference; + state.indentationDiff = adjustedIndentation - state.indentation; + state.indentation = adjustedIndentation; + if (indentation > 0) return null; + } + return state.f(stream, state); + }, + + innerMode: function(state) { + if (state.block == htmlBlock) return {state: state.htmlState, mode: htmlMode}; + if (state.localState) return {state: state.localState, mode: state.localMode}; + return {state: state, mode: mode}; + }, + + blankLine: blankLine, + + getType: getType, + + fold: "markdown" + }; + return mode; +}, "xml"); + +CodeMirror.defineMIME("text/x-markdown", "markdown"); diff --git a/vilya/static/js/lib/mode/mysql.js b/hub/static/js/lib/mode/mysql.js similarity index 100% rename from vilya/static/js/lib/mode/mysql.js rename to hub/static/js/lib/mode/mysql.js diff --git a/vilya/static/js/lib/mode/ntriples.js b/hub/static/js/lib/mode/ntriples.js similarity index 100% rename from vilya/static/js/lib/mode/ntriples.js rename to hub/static/js/lib/mode/ntriples.js diff --git a/vilya/static/js/lib/mode/ocaml.js b/hub/static/js/lib/mode/ocaml.js similarity index 100% rename from vilya/static/js/lib/mode/ocaml.js rename to hub/static/js/lib/mode/ocaml.js diff --git a/vilya/static/js/lib/mode/pascal.js b/hub/static/js/lib/mode/pascal.js similarity index 100% rename from vilya/static/js/lib/mode/pascal.js rename to hub/static/js/lib/mode/pascal.js diff --git a/vilya/static/js/lib/mode/perl.js b/hub/static/js/lib/mode/perl.js similarity index 100% rename from vilya/static/js/lib/mode/perl.js rename to hub/static/js/lib/mode/perl.js diff --git a/vilya/static/js/lib/mode/php.js b/hub/static/js/lib/mode/php.js similarity index 100% rename from vilya/static/js/lib/mode/php.js rename to hub/static/js/lib/mode/php.js diff --git a/vilya/static/js/lib/mode/pig.js b/hub/static/js/lib/mode/pig.js similarity index 100% rename from vilya/static/js/lib/mode/pig.js rename to hub/static/js/lib/mode/pig.js diff --git a/vilya/static/js/lib/mode/plsql.js b/hub/static/js/lib/mode/plsql.js similarity index 100% rename from vilya/static/js/lib/mode/plsql.js rename to hub/static/js/lib/mode/plsql.js diff --git a/vilya/static/js/lib/mode/properties.js b/hub/static/js/lib/mode/properties.js similarity index 100% rename from vilya/static/js/lib/mode/properties.js rename to hub/static/js/lib/mode/properties.js diff --git a/vilya/static/js/lib/mode/python.js b/hub/static/js/lib/mode/python.js similarity index 100% rename from vilya/static/js/lib/mode/python.js rename to hub/static/js/lib/mode/python.js diff --git a/vilya/static/js/lib/mode/r.js b/hub/static/js/lib/mode/r.js similarity index 100% rename from vilya/static/js/lib/mode/r.js rename to hub/static/js/lib/mode/r.js diff --git a/vilya/static/js/lib/mode/rst.js b/hub/static/js/lib/mode/rst.js similarity index 100% rename from vilya/static/js/lib/mode/rst.js rename to hub/static/js/lib/mode/rst.js diff --git a/vilya/static/js/lib/mode/ruby.js b/hub/static/js/lib/mode/ruby.js similarity index 100% rename from vilya/static/js/lib/mode/ruby.js rename to hub/static/js/lib/mode/ruby.js diff --git a/vilya/static/js/lib/mode/rust.js b/hub/static/js/lib/mode/rust.js similarity index 100% rename from vilya/static/js/lib/mode/rust.js rename to hub/static/js/lib/mode/rust.js diff --git a/vilya/static/js/lib/mode/sass.js b/hub/static/js/lib/mode/sass.js similarity index 100% rename from vilya/static/js/lib/mode/sass.js rename to hub/static/js/lib/mode/sass.js diff --git a/vilya/static/js/lib/mode/scheme.js b/hub/static/js/lib/mode/scheme.js similarity index 100% rename from vilya/static/js/lib/mode/scheme.js rename to hub/static/js/lib/mode/scheme.js diff --git a/vilya/static/js/lib/mode/shell.js b/hub/static/js/lib/mode/shell.js similarity index 100% rename from vilya/static/js/lib/mode/shell.js rename to hub/static/js/lib/mode/shell.js diff --git a/vilya/static/js/lib/mode/sieve.js b/hub/static/js/lib/mode/sieve.js similarity index 100% rename from vilya/static/js/lib/mode/sieve.js rename to hub/static/js/lib/mode/sieve.js diff --git a/vilya/static/js/lib/mode/smalltalk.js b/hub/static/js/lib/mode/smalltalk.js similarity index 100% rename from vilya/static/js/lib/mode/smalltalk.js rename to hub/static/js/lib/mode/smalltalk.js diff --git a/vilya/static/js/lib/mode/smarty.js b/hub/static/js/lib/mode/smarty.js similarity index 100% rename from vilya/static/js/lib/mode/smarty.js rename to hub/static/js/lib/mode/smarty.js diff --git a/vilya/static/js/lib/mode/sparql.js b/hub/static/js/lib/mode/sparql.js similarity index 100% rename from vilya/static/js/lib/mode/sparql.js rename to hub/static/js/lib/mode/sparql.js diff --git a/vilya/static/js/lib/mode/sql.js b/hub/static/js/lib/mode/sql.js similarity index 100% rename from vilya/static/js/lib/mode/sql.js rename to hub/static/js/lib/mode/sql.js diff --git a/vilya/static/js/lib/mode/stex.js b/hub/static/js/lib/mode/stex.js similarity index 100% rename from vilya/static/js/lib/mode/stex.js rename to hub/static/js/lib/mode/stex.js diff --git a/vilya/static/js/lib/mode/text.js b/hub/static/js/lib/mode/text.js similarity index 100% rename from vilya/static/js/lib/mode/text.js rename to hub/static/js/lib/mode/text.js diff --git a/vilya/static/js/lib/mode/tiddlywiki.js b/hub/static/js/lib/mode/tiddlywiki.js similarity index 100% rename from vilya/static/js/lib/mode/tiddlywiki.js rename to hub/static/js/lib/mode/tiddlywiki.js diff --git a/vilya/static/js/lib/mode/tiki.js b/hub/static/js/lib/mode/tiki.js similarity index 100% rename from vilya/static/js/lib/mode/tiki.js rename to hub/static/js/lib/mode/tiki.js diff --git a/vilya/static/js/lib/mode/vb.js b/hub/static/js/lib/mode/vb.js similarity index 100% rename from vilya/static/js/lib/mode/vb.js rename to hub/static/js/lib/mode/vb.js diff --git a/vilya/static/js/lib/mode/vbscript.js b/hub/static/js/lib/mode/vbscript.js similarity index 100% rename from vilya/static/js/lib/mode/vbscript.js rename to hub/static/js/lib/mode/vbscript.js diff --git a/vilya/static/js/lib/mode/velocity.js b/hub/static/js/lib/mode/velocity.js similarity index 100% rename from vilya/static/js/lib/mode/velocity.js rename to hub/static/js/lib/mode/velocity.js diff --git a/vilya/static/js/lib/mode/verilog.js b/hub/static/js/lib/mode/verilog.js similarity index 100% rename from vilya/static/js/lib/mode/verilog.js rename to hub/static/js/lib/mode/verilog.js diff --git a/vilya/static/js/lib/mode/xml.js b/hub/static/js/lib/mode/xml.js similarity index 100% rename from vilya/static/js/lib/mode/xml.js rename to hub/static/js/lib/mode/xml.js diff --git a/vilya/static/js/lib/mode/xquery.js b/hub/static/js/lib/mode/xquery.js similarity index 100% rename from vilya/static/js/lib/mode/xquery.js rename to hub/static/js/lib/mode/xquery.js diff --git a/vilya/static/js/lib/mode/yaml.js b/hub/static/js/lib/mode/yaml.js similarity index 100% rename from vilya/static/js/lib/mode/yaml.js rename to hub/static/js/lib/mode/yaml.js diff --git a/vilya/static/js/lib/mode/z80.js b/hub/static/js/lib/mode/z80.js similarity index 100% rename from vilya/static/js/lib/mode/z80.js rename to hub/static/js/lib/mode/z80.js diff --git a/hub/static/js/lib/mousetrap.js b/hub/static/js/lib/mousetrap.js new file mode 100644 index 0000000..bc9f191 --- /dev/null +++ b/hub/static/js/lib/mousetrap.js @@ -0,0 +1,818 @@ +/** + * Copyright 2012 Craig Campbell + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Mousetrap is a simple keyboard shortcut library for Javascript with + * no external dependencies + * + * @version 1.2.2 + * @url craig.is/killing/mice + */ +(function() { + + /** + * mapping of special keycodes to their corresponding keys + * + * everything in this dictionary cannot use keypress events + * so it has to be here to map to the correct keycodes for + * keyup/keydown events + * + * @type {Object} + */ + var _MAP = { + 8: 'backspace', + 9: 'tab', + 13: 'enter', + 16: 'shift', + 17: 'ctrl', + 18: 'alt', + 20: 'capslock', + 27: 'esc', + 32: 'space', + 33: 'pageup', + 34: 'pagedown', + 35: 'end', + 36: 'home', + 37: 'left', + 38: 'up', + 39: 'right', + 40: 'down', + 45: 'ins', + 46: 'del', + 91: 'meta', + 93: 'meta', + 224: 'meta' + }, + + /** + * mapping for special characters so they can support + * + * this dictionary is only used incase you want to bind a + * keyup or keydown event to one of these keys + * + * @type {Object} + */ + _KEYCODE_MAP = { + 106: '*', + 107: '+', + 109: '-', + 110: '.', + 111 : '/', + 186: ';', + 187: '=', + 188: ',', + 189: '-', + 190: '.', + 191: '/', + 192: '`', + 219: '[', + 220: '\\', + 221: ']', + 222: '\'' + }, + + /** + * this is a mapping of keys that require shift on a US keypad + * back to the non shift equivelents + * + * this is so you can use keyup events with these keys + * + * note that this will only work reliably on US keyboards + * + * @type {Object} + */ + _SHIFT_MAP = { + '~': '`', + '!': '1', + '@': '2', + '#': '3', + '$': '4', + '%': '5', + '^': '6', + '&': '7', + '*': '8', + '(': '9', + ')': '0', + '_': '-', + '+': '=', + ':': ';', + '\"': '\'', + '<': ',', + '>': '.', + '?': '/', + '|': '\\' + }, + + /** + * this is a list of special strings you can use to map + * to modifier keys when you specify your keyboard shortcuts + * + * @type {Object} + */ + _SPECIAL_ALIASES = { + 'option': 'alt', + 'command': 'meta', + 'return': 'enter', + 'escape': 'esc' + }, + + /** + * variable to store the flipped version of _MAP from above + * needed to check if we should use keypress or not when no action + * is specified + * + * @type {Object|undefined} + */ + _REVERSE_MAP, + + /** + * a list of all the callbacks setup via Mousetrap.bind() + * + * @type {Object} + */ + _callbacks = {}, + + /** + * direct map of string combinations to callbacks used for trigger() + * + * @type {Object} + */ + _direct_map = {}, + + /** + * keeps track of what level each sequence is at since multiple + * sequences can start out with the same sequence + * + * @type {Object} + */ + _sequence_levels = {}, + + /** + * variable to store the setTimeout call + * + * @type {null|number} + */ + _reset_timer, + + /** + * temporary state where we will ignore the next keyup + * + * @type {boolean|string} + */ + _ignore_next_keyup = false, + + /** + * are we currently inside of a sequence? + * type of action ("keyup" or "keydown" or "keypress") or false + * + * @type {boolean|string} + */ + _sequence_type = false; + + /** + * loop through the f keys, f1 to f19 and add them to the map + * programatically + */ + for (var i = 1; i < 20; ++i) { + _MAP[111 + i] = 'f' + i; + } + + /** + * loop through to map numbers on the numeric keypad + */ + for (i = 0; i <= 9; ++i) { + _MAP[i + 96] = i; + } + + /** + * cross browser add event method + * + * @param {Element|HTMLDocument} object + * @param {string} type + * @param {Function} callback + * @returns void + */ + function _addEvent(object, type, callback) { + if (object.addEventListener) { + object.addEventListener(type, callback, false); + return; + } + + object.attachEvent('on' + type, callback); + } + + /** + * takes the event and returns the key character + * + * @param {Event} e + * @return {string} + */ + function _characterFromEvent(e) { + + // for keypress events we should return the character as is + if (e.type == 'keypress') { + return String.fromCharCode(e.which); + } + + // for non keypress events the special maps are needed + if (_MAP[e.which]) { + return _MAP[e.which]; + } + + if (_KEYCODE_MAP[e.which]) { + return _KEYCODE_MAP[e.which]; + } + + // if it is not in the special map + return String.fromCharCode(e.which).toLowerCase(); + } + + /** + * checks if two arrays are equal + * + * @param {Array} modifiers1 + * @param {Array} modifiers2 + * @returns {boolean} + */ + function _modifiersMatch(modifiers1, modifiers2) { + return modifiers1.sort().join(',') === modifiers2.sort().join(','); + } + + /** + * resets all sequence counters except for the ones passed in + * + * @param {Object} do_not_reset + * @returns void + */ + function _resetSequences(do_not_reset, max_level) { + do_not_reset = do_not_reset || {}; + + var active_sequences = false, + key; + + for (key in _sequence_levels) { + if (do_not_reset[key] && _sequence_levels[key] > max_level) { + active_sequences = true; + continue; + } + _sequence_levels[key] = 0; + } + + if (!active_sequences) { + _sequence_type = false; + } + } + + /** + * finds all callbacks that match based on the keycode, modifiers, + * and action + * + * @param {string} character + * @param {Array} modifiers + * @param {Event|Object} e + * @param {boolean=} remove - should we remove any matches + * @param {string=} combination + * @returns {Array} + */ + function _getMatches(character, modifiers, e, remove, combination) { + var i, + callback, + matches = [], + action = e.type; + + // if there are no events related to this keycode + if (!_callbacks[character]) { + return []; + } + + // if a modifier key is coming up on its own we should allow it + if (action == 'keyup' && _isModifier(character)) { + modifiers = [character]; + } + + // loop through all callbacks for the key that was pressed + // and see if any of them match + for (i = 0; i < _callbacks[character].length; ++i) { + callback = _callbacks[character][i]; + + // if this is a sequence but it is not at the right level + // then move onto the next match + if (callback.seq && _sequence_levels[callback.seq] != callback.level) { + continue; + } + + // if the action we are looking for doesn't match the action we got + // then we should keep going + if (action != callback.action) { + continue; + } + + // if this is a keypress event and the meta key and control key + // are not pressed that means that we need to only look at the + // character, otherwise check the modifiers as well + // + // chrome will not fire a keypress if meta or control is down + // safari will fire a keypress if meta or meta+shift is down + // firefox will fire a keypress if meta or control is down + if ((action == 'keypress' && !e.metaKey && !e.ctrlKey) || _modifiersMatch(modifiers, callback.modifiers)) { + + // remove is used so if you change your mind and call bind a + // second time with a new function the first one is overwritten + if (remove && callback.combo == combination) { + _callbacks[character].splice(i, 1); + } + + matches.push(callback); + } + } + + return matches; + } + + /** + * takes a key event and figures out what the modifiers are + * + * @param {Event} e + * @returns {Array} + */ + function _eventModifiers(e) { + var modifiers = []; + + if (e.shiftKey) { + modifiers.push('shift'); + } + + if (e.altKey) { + modifiers.push('alt'); + } + + if (e.ctrlKey) { + modifiers.push('ctrl'); + } + + if (e.metaKey) { + modifiers.push('meta'); + } + + return modifiers; + } + + /** + * actually calls the callback function + * + * if your callback function returns false this will use the jquery + * convention - prevent default and stop propogation on the event + * + * @param {Function} callback + * @param {Event} e + * @returns void + */ + function _fireCallback(callback, e, combo) { + + // if this event should not happen stop here + if (Mousetrap.stopCallback(e, e.target || e.srcElement, combo)) { + return; + } + + if (callback(e, combo) === false) { + if (e.preventDefault) { + e.preventDefault(); + } + + if (e.stopPropagation) { + e.stopPropagation(); + } + + e.returnValue = false; + e.cancelBubble = true; + } + } + + /** + * handles a character key event + * + * @param {string} character + * @param {Event} e + * @returns void + */ + function _handleCharacter(character, e) { + var callbacks = _getMatches(character, _eventModifiers(e), e), + i, + do_not_reset = {}, + max_level = 0, + processed_sequence_callback = false; + + // loop through matching callbacks for this key event + for (i = 0; i < callbacks.length; ++i) { + + // fire for all sequence callbacks + // this is because if for example you have multiple sequences + // bound such as "g i" and "g t" they both need to fire the + // callback for matching g cause otherwise you can only ever + // match the first one + if (callbacks[i].seq) { + processed_sequence_callback = true; + + // as we loop through keep track of the max + // any sequence at a lower level will be discarded + max_level = Math.max(max_level, callbacks[i].level); + + // keep a list of which sequences were matches for later + do_not_reset[callbacks[i].seq] = 1; + _fireCallback(callbacks[i].callback, e, callbacks[i].combo); + continue; + } + + // if there were no sequence matches but we are still here + // that means this is a regular match so we should fire that + if (!processed_sequence_callback && !_sequence_type) { + _fireCallback(callbacks[i].callback, e, callbacks[i].combo); + } + } + + // if you are inside of a sequence and the key you are pressing + // is not a modifier key then we should reset all sequences + // that were not matched by this key event + if (e.type == _sequence_type && !_isModifier(character)) { + _resetSequences(do_not_reset, max_level); + } + } + + /** + * handles a keydown event + * + * @param {Event} e + * @returns void + */ + function _handleKey(e) { + + // normalize e.which for key events + // @see http://stackoverflow.com/questions/4285627/javascript-keycode-vs-charcode-utter-confusion + if (typeof e.which !== 'number') { + e.which = e.keyCode; + } + + var character = _characterFromEvent(e); + + // no character found then stop + if (!character) { + return; + } + + if (e.type == 'keyup' && _ignore_next_keyup == character) { + _ignore_next_keyup = false; + return; + } + + _handleCharacter(character, e); + } + + /** + * determines if the keycode specified is a modifier key or not + * + * @param {string} key + * @returns {boolean} + */ + function _isModifier(key) { + return key == 'shift' || key == 'ctrl' || key == 'alt' || key == 'meta'; + } + + /** + * called to set a 1 second timeout on the specified sequence + * + * this is so after each key press in the sequence you have 1 second + * to press the next key before you have to start over + * + * @returns void + */ + function _resetSequenceTimer() { + clearTimeout(_reset_timer); + _reset_timer = setTimeout(_resetSequences, 1000); + } + + /** + * reverses the map lookup so that we can look for specific keys + * to see what can and can't use keypress + * + * @return {Object} + */ + function _getReverseMap() { + if (!_REVERSE_MAP) { + _REVERSE_MAP = {}; + for (var key in _MAP) { + + // pull out the numeric keypad from here cause keypress should + // be able to detect the keys from the character + if (key > 95 && key < 112) { + continue; + } + + if (_MAP.hasOwnProperty(key)) { + _REVERSE_MAP[_MAP[key]] = key; + } + } + } + return _REVERSE_MAP; + } + + /** + * picks the best action based on the key combination + * + * @param {string} key - character for key + * @param {Array} modifiers + * @param {string=} action passed in + */ + function _pickBestAction(key, modifiers, action) { + + // if no action was picked in we should try to pick the one + // that we think would work best for this key + if (!action) { + action = _getReverseMap()[key] ? 'keydown' : 'keypress'; + } + + // modifier keys don't work as expected with keypress, + // switch to keydown + if (action == 'keypress' && modifiers.length) { + action = 'keydown'; + } + + return action; + } + + /** + * binds a key sequence to an event + * + * @param {string} combo - combo specified in bind call + * @param {Array} keys + * @param {Function} callback + * @param {string=} action + * @returns void + */ + function _bindSequence(combo, keys, callback, action) { + + // start off by adding a sequence level record for this combination + // and setting the level to 0 + _sequence_levels[combo] = 0; + + // if there is no action pick the best one for the first key + // in the sequence + if (!action) { + action = _pickBestAction(keys[0], []); + } + + /** + * callback to increase the sequence level for this sequence and reset + * all other sequences that were active + * + * @param {Event} e + * @returns void + */ + var _increaseSequence = function(e) { + _sequence_type = action; + ++_sequence_levels[combo]; + _resetSequenceTimer(); + }, + + /** + * wraps the specified callback inside of another function in order + * to reset all sequence counters as soon as this sequence is done + * + * @param {Event} e + * @returns void + */ + _callbackAndReset = function(e) { + _fireCallback(callback, e, combo); + + // we should ignore the next key up if the action is key down + // or keypress. this is so if you finish a sequence and + // release the key the final key will not trigger a keyup + if (action !== 'keyup') { + _ignore_next_keyup = _characterFromEvent(e); + } + + // weird race condition if a sequence ends with the key + // another sequence begins with + setTimeout(_resetSequences, 10); + }, + i; + + // loop through keys one at a time and bind the appropriate callback + // function. for any key leading up to the final one it should + // increase the sequence. after the final, it should reset all sequences + for (i = 0; i < keys.length; ++i) { + _bindSingle(keys[i], i < keys.length - 1 ? _increaseSequence : _callbackAndReset, action, combo, i); + } + } + + /** + * binds a single keyboard combination + * + * @param {string} combination + * @param {Function} callback + * @param {string=} action + * @param {string=} sequence_name - name of sequence if part of sequence + * @param {number=} level - what part of the sequence the command is + * @returns void + */ + function _bindSingle(combination, callback, action, sequence_name, level) { + + // make sure multiple spaces in a row become a single space + combination = combination.replace(/\s+/g, ' '); + + var sequence = combination.split(' '), + i, + key, + keys, + modifiers = []; + + // if this pattern is a sequence of keys then run through this method + // to reprocess each pattern one key at a time + if (sequence.length > 1) { + _bindSequence(combination, sequence, callback, action); + return; + } + + // take the keys from this pattern and figure out what the actual + // pattern is all about + keys = combination === '+' ? ['+'] : combination.split('+'); + + for (i = 0; i < keys.length; ++i) { + key = keys[i]; + + // normalize key names + if (_SPECIAL_ALIASES[key]) { + key = _SPECIAL_ALIASES[key]; + } + + // if this is not a keypress event then we should + // be smart about using shift keys + // this will only work for US keyboards however + if (action && action != 'keypress' && _SHIFT_MAP[key]) { + key = _SHIFT_MAP[key]; + modifiers.push('shift'); + } + + // if this key is a modifier then add it to the list of modifiers + if (_isModifier(key)) { + modifiers.push(key); + } + } + + // depending on what the key combination is + // we will try to pick the best event for it + action = _pickBestAction(key, modifiers, action); + + // make sure to initialize array if this is the first time + // a callback is added for this key + if (!_callbacks[key]) { + _callbacks[key] = []; + } + + // remove an existing match if there is one + _getMatches(key, modifiers, {type: action}, !sequence_name, combination); + + // add this call back to the array + // if it is a sequence put it at the beginning + // if not put it at the end + // + // this is important because the way these are processed expects + // the sequence ones to come first + _callbacks[key][sequence_name ? 'unshift' : 'push']({ + callback: callback, + modifiers: modifiers, + action: action, + seq: sequence_name, + level: level, + combo: combination + }); + } + + /** + * binds multiple combinations to the same callback + * + * @param {Array} combinations + * @param {Function} callback + * @param {string|undefined} action + * @returns void + */ + function _bindMultiple(combinations, callback, action) { + for (var i = 0; i < combinations.length; ++i) { + _bindSingle(combinations[i], callback, action); + } + } + + // start! + _addEvent(document, 'keypress', _handleKey); + _addEvent(document, 'keydown', _handleKey); + _addEvent(document, 'keyup', _handleKey); + + var Mousetrap = { + + /** + * binds an event to mousetrap + * + * can be a single key, a combination of keys separated with +, + * an array of keys, or a sequence of keys separated by spaces + * + * be sure to list the modifier keys first to make sure that the + * correct key ends up getting bound (the last key in the pattern) + * + * @param {string|Array} keys + * @param {Function} callback + * @param {string=} action - 'keypress', 'keydown', or 'keyup' + * @returns void + */ + bind: function(keys, callback, action) { + _bindMultiple(keys instanceof Array ? keys : [keys], callback, action); + _direct_map[keys + ':' + action] = callback; + return this; + }, + + /** + * unbinds an event to mousetrap + * + * the unbinding sets the callback function of the specified key combo + * to an empty function and deletes the corresponding key in the + * _direct_map dict. + * + * the keycombo+action has to be exactly the same as + * it was defined in the bind method + * + * TODO: actually remove this from the _callbacks dictionary instead + * of binding an empty function + * + * @param {string|Array} keys + * @param {string} action + * @returns void + */ + unbind: function(keys, action) { + if (_direct_map[keys + ':' + action]) { + delete _direct_map[keys + ':' + action]; + this.bind(keys, function() {}, action); + } + return this; + }, + + /** + * triggers an event that has already been bound + * + * @param {string} keys + * @param {string=} action + * @returns void + */ + trigger: function(keys, action) { + _direct_map[keys + ':' + action](); + return this; + }, + + /** + * resets the library back to its initial state. this is useful + * if you want to clear out the current keyboard shortcuts and bind + * new ones - for example if you switch to another page + * + * @returns void + */ + reset: function() { + _callbacks = {}; + _direct_map = {}; + return this; + }, + + /** + * should we stop this event before firing off callbacks + * + * @param {Event} e + * @param {Element} element + * @return {boolean} + */ + stopCallback: function(e, element, combo) { + + // if the element has the class "mousetrap" then no need to stop + if ((' ' + element.className + ' ').indexOf(' mousetrap ') > -1) { + return false; + } + + // stop for input, select, and textarea + return element.tagName == 'INPUT' || element.tagName == 'SELECT' || element.tagName == 'TEXTAREA' || (element.contentEditable && element.contentEditable == 'true'); + } + }; + + // expose mousetrap to the global object + window.Mousetrap = Mousetrap; + + // expose mousetrap as an AMD module + if (typeof define === 'function' && define.amd) { + define(Mousetrap); + } +}) (); diff --git a/vilya/static/js/lib/mustache.js b/hub/static/js/lib/mustache.js similarity index 100% rename from vilya/static/js/lib/mustache.js rename to hub/static/js/lib/mustache.js diff --git a/hub/static/js/lib/odometer.js b/hub/static/js/lib/odometer.js new file mode 100644 index 0000000..9fb9d56 --- /dev/null +++ b/hub/static/js/lib/odometer.js @@ -0,0 +1,653 @@ +(function() { + var COUNT_FRAMERATE, COUNT_MS_PER_FRAME, DIGIT_FORMAT, DIGIT_HTML, DIGIT_SPEEDBOOST, DURATION, FORMAT_MARK_HTML, FORMAT_PARSER, FRAMERATE, FRAMES_PER_VALUE, MS_PER_FRAME, MutationObserver, Odometer, RIBBON_HTML, TRANSITION_END_EVENTS, TRANSITION_SUPPORT, VALUE_HTML, addClass, createFromHTML, fractionalPart, now, removeClass, requestAnimationFrame, round, transitionCheckStyles, trigger, truncate, wrapJQuery, _jQueryWrapped, _old, _ref, _ref1, + __slice = [].slice; + + VALUE_HTML = '<span class="odometer-value"></span>'; + + RIBBON_HTML = '<span class="odometer-ribbon"><span class="odometer-ribbon-inner">' + VALUE_HTML + '</span></span>'; + + DIGIT_HTML = '<span class="odometer-digit"><span class="odometer-digit-spacer">8</span><span class="odometer-digit-inner">' + RIBBON_HTML + '</span></span>'; + + FORMAT_MARK_HTML = '<span class="odometer-formatting-mark"></span>'; + + DIGIT_FORMAT = '(,ddd).dd'; + + FORMAT_PARSER = /^\(?([^)]*)\)?(?:(.)(d+))?$/; + + FRAMERATE = 30; + + DURATION = 2000; + + COUNT_FRAMERATE = 20; + + FRAMES_PER_VALUE = 2; + + DIGIT_SPEEDBOOST = .5; + + MS_PER_FRAME = 1000 / FRAMERATE; + + COUNT_MS_PER_FRAME = 1000 / COUNT_FRAMERATE; + + TRANSITION_END_EVENTS = 'transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd'; + + transitionCheckStyles = document.createElement('div').style; + + TRANSITION_SUPPORT = (transitionCheckStyles.transition != null) || (transitionCheckStyles.webkitTransition != null) || (transitionCheckStyles.mozTransition != null) || (transitionCheckStyles.oTransition != null); + + requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame; + + MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver; + + createFromHTML = function(html) { + var el; + el = document.createElement('div'); + el.innerHTML = html; + return el.children[0]; + }; + + removeClass = function(el, name) { + return el.className = el.className.replace(new RegExp("(^| )" + (name.split(' ').join('|')) + "( |$)", 'gi'), ' '); + }; + + addClass = function(el, name) { + removeClass(el, name); + return el.className += " " + name; + }; + + trigger = function(el, name) { + var evt; + if (document.createEvent != null) { + evt = document.createEvent('HTMLEvents'); + evt.initEvent(name, true, true); + return el.dispatchEvent(evt); + } + }; + + now = function() { + var _ref, _ref1; + return (_ref = (_ref1 = window.performance) != null ? typeof _ref1.now === "function" ? _ref1.now() : void 0 : void 0) != null ? _ref : +(new Date); + }; + + round = function(val, precision) { + if (precision == null) { + precision = 0; + } + if (!precision) { + return Math.round(val); + } + val *= Math.pow(10, precision); + val += 0.5; + val = Math.floor(val); + return val /= Math.pow(10, precision); + }; + + truncate = function(val) { + if (val < 0) { + return Math.ceil(val); + } else { + return Math.floor(val); + } + }; + + fractionalPart = function(val) { + return val - round(val); + }; + + _jQueryWrapped = false; + + (wrapJQuery = function() { + var property, _i, _len, _ref, _results; + if (_jQueryWrapped) { + return; + } + if (window.jQuery != null) { + _jQueryWrapped = true; + _ref = ['html', 'text']; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + property = _ref[_i]; + _results.push((function(property) { + var old; + old = window.jQuery.fn[property]; + return window.jQuery.fn[property] = function(val) { + var _ref1; + if ((val == null) || (((_ref1 = this[0]) != null ? _ref1.odometer : void 0) == null)) { + return old.apply(this, arguments); + } + return this[0].odometer.update(val); + }; + })(property)); + } + return _results; + } + })(); + + setTimeout(wrapJQuery, 0); + + Odometer = (function() { + function Odometer(options) { + var e, k, property, v, _base, _i, _len, _ref, _ref1, _ref2, + _this = this; + this.options = options; + this.el = this.options.el; + if (this.el.odometer != null) { + return this.el.odometer; + } + this.el.odometer = this; + _ref = Odometer.options; + for (k in _ref) { + v = _ref[k]; + if (this.options[k] == null) { + this.options[k] = v; + } + } + if ((_base = this.options).duration == null) { + _base.duration = DURATION; + } + this.MAX_VALUES = ((this.options.duration / MS_PER_FRAME) / FRAMES_PER_VALUE) | 0; + this.resetFormat(); + this.value = this.cleanValue((_ref1 = this.options.value) != null ? _ref1 : ''); + this.renderInside(); + this.render(); + try { + _ref2 = ['innerHTML', 'innerText', 'textContent']; + for (_i = 0, _len = _ref2.length; _i < _len; _i++) { + property = _ref2[_i]; + if (this.el[property] != null) { + (function(property) { + return Object.defineProperty(_this.el, property, { + get: function() { + var _ref3; + if (property === 'innerHTML') { + return _this.inside.outerHTML; + } else { + return (_ref3 = _this.inside.innerText) != null ? _ref3 : _this.inside.textContent; + } + }, + set: function(val) { + return _this.update(val); + } + }); + })(property); + } + } + } catch (_error) { + e = _error; + this.watchForMutations(); + } + this; + } + + Odometer.prototype.renderInside = function() { + this.inside = document.createElement('div'); + this.inside.className = 'odometer-inside'; + this.el.innerHTML = ''; + return this.el.appendChild(this.inside); + }; + + Odometer.prototype.watchForMutations = function() { + var e, + _this = this; + if (MutationObserver == null) { + return; + } + try { + if (this.observer == null) { + this.observer = new MutationObserver(function(mutations) { + var newVal; + newVal = _this.el.innerText; + _this.renderInside(); + _this.render(_this.value); + return _this.update(newVal); + }); + } + this.watchMutations = true; + return this.startWatchingMutations(); + } catch (_error) { + e = _error; + } + }; + + Odometer.prototype.startWatchingMutations = function() { + if (this.watchMutations) { + return this.observer.observe(this.el, { + childList: true + }); + } + }; + + Odometer.prototype.stopWatchingMutations = function() { + var _ref; + return (_ref = this.observer) != null ? _ref.disconnect() : void 0; + }; + + Odometer.prototype.cleanValue = function(val) { + var _ref; + if (typeof val === 'string') { + val = val.replace((_ref = this.format.radix) != null ? _ref : '.', '<radix>'); + val = val.replace(/[.,]/g, ''); + val = val.replace('<radix>', '.'); + val = parseFloat(val, 10) || 0; + } + return round(val, this.format.precision); + }; + + Odometer.prototype.bindTransitionEnd = function() { + var event, renderEnqueued, _i, _len, _ref, _results, + _this = this; + if (this.transitionEndBound) { + return; + } + this.transitionEndBound = true; + renderEnqueued = false; + _ref = TRANSITION_END_EVENTS.split(' '); + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + event = _ref[_i]; + _results.push(this.el.addEventListener(event, function() { + if (renderEnqueued) { + return true; + } + renderEnqueued = true; + setTimeout(function() { + _this.render(); + renderEnqueued = false; + return trigger(_this.el, 'odometerdone'); + }, 0); + return true; + }, false)); + } + return _results; + }; + + Odometer.prototype.resetFormat = function() { + var format, fractional, parsed, precision, radix, repeating, _ref, _ref1; + format = (_ref = this.options.format) != null ? _ref : DIGIT_FORMAT; + format || (format = 'd'); + parsed = FORMAT_PARSER.exec(format); + if (!parsed) { + throw new Error("Odometer: Unparsable digit format"); + } + _ref1 = parsed.slice(1, 4), repeating = _ref1[0], radix = _ref1[1], fractional = _ref1[2]; + precision = (fractional != null ? fractional.length : void 0) || 0; + return this.format = { + repeating: repeating, + radix: radix, + precision: precision + }; + }; + + Odometer.prototype.render = function(value) { + var classes, cls, match, newClasses, theme, _i, _len; + if (value == null) { + value = this.value; + } + this.stopWatchingMutations(); + this.resetFormat(); + this.inside.innerHTML = ''; + theme = this.options.theme; + classes = this.el.className.split(' '); + newClasses = []; + for (_i = 0, _len = classes.length; _i < _len; _i++) { + cls = classes[_i]; + if (!cls.length) { + continue; + } + if (match = /^odometer-theme-(.+)$/.exec(cls)) { + theme = match[1]; + continue; + } + if (/^odometer(-|$)/.test(cls)) { + continue; + } + newClasses.push(cls); + } + newClasses.push('odometer'); + if (!TRANSITION_SUPPORT) { + newClasses.push('odometer-no-transitions'); + } + if (theme) { + newClasses.push("odometer-theme-" + theme); + } else { + newClasses.push("odometer-auto-theme"); + } + this.el.className = newClasses.join(' '); + this.ribbons = {}; + this.formatDigits(value); + return this.startWatchingMutations(); + }; + + Odometer.prototype.formatDigits = function(value) { + var digit, valueDigit, valueString, wholePart, _i, _j, _len, _len1, _ref, _ref1; + this.digits = []; + if (this.options.formatFunction) { + valueString = this.options.formatFunction(value); + _ref = valueString.split('').reverse(); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + valueDigit = _ref[_i]; + if (valueDigit.match(/0-9/)) { + digit = this.renderDigit(); + digit.querySelector('.odometer-value').innerHTML = valueDigit; + this.digits.push(digit); + this.insertDigit(digit); + } else { + this.addSpacer(valueDigit); + } + } + } else { + wholePart = !this.format.precision || !fractionalPart(value) || false; + _ref1 = value.toString().split('').reverse(); + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + digit = _ref1[_j]; + if (digit === '.') { + wholePart = true; + } + this.addDigit(digit, wholePart); + } + } + }; + + Odometer.prototype.update = function(newValue) { + var diff, + _this = this; + newValue = this.cleanValue(newValue); + if (!(diff = newValue - this.value)) { + return; + } + removeClass(this.el, 'odometer-animating-up odometer-animating-down odometer-animating'); + if (diff > 0) { + addClass(this.el, 'odometer-animating-up'); + } else { + addClass(this.el, 'odometer-animating-down'); + } + this.stopWatchingMutations(); + this.animate(newValue); + this.startWatchingMutations(); + setTimeout(function() { + _this.el.offsetHeight; + return addClass(_this.el, 'odometer-animating'); + }, 0); + return this.value = newValue; + }; + + Odometer.prototype.renderDigit = function() { + return createFromHTML(DIGIT_HTML); + }; + + Odometer.prototype.insertDigit = function(digit, before) { + if (before != null) { + return this.inside.insertBefore(digit, before); + } else if (!this.inside.children.length) { + return this.inside.appendChild(digit); + } else { + return this.inside.insertBefore(digit, this.inside.children[0]); + } + }; + + Odometer.prototype.addSpacer = function(chr, before, extraClasses) { + var spacer; + spacer = createFromHTML(FORMAT_MARK_HTML); + spacer.innerHTML = chr; + if (extraClasses) { + addClass(spacer, extraClasses); + } + return this.insertDigit(spacer, before); + }; + + Odometer.prototype.addDigit = function(value, repeating) { + var chr, digit, resetted, _ref; + if (repeating == null) { + repeating = true; + } + if (value === '-') { + return this.addSpacer(value, null, 'odometer-negation-mark'); + } + if (value === '.') { + return this.addSpacer((_ref = this.format.radix) != null ? _ref : '.', null, 'odometer-radix-mark'); + } + if (repeating) { + resetted = false; + while (true) { + if (!this.format.repeating.length) { + if (resetted) { + throw new Error("Bad odometer format without digits"); + } + this.resetFormat(); + resetted = true; + } + chr = this.format.repeating[this.format.repeating.length - 1]; + this.format.repeating = this.format.repeating.substring(0, this.format.repeating.length - 1); + if (chr === 'd') { + break; + } + this.addSpacer(chr); + } + } + digit = this.renderDigit(); + digit.querySelector('.odometer-value').innerHTML = value; + this.digits.push(digit); + return this.insertDigit(digit); + }; + + Odometer.prototype.animate = function(newValue) { + if (!TRANSITION_SUPPORT || this.options.animation === 'count') { + return this.animateCount(newValue); + } else { + return this.animateSlide(newValue); + } + }; + + Odometer.prototype.animateCount = function(newValue) { + var cur, diff, last, start, tick, + _this = this; + if (!(diff = +newValue - this.value)) { + return; + } + start = last = now(); + cur = this.value; + return (tick = function() { + var delta, dist, fraction; + if ((now() - start) > _this.options.duration) { + _this.value = newValue; + _this.render(); + trigger(_this.el, 'odometerdone'); + return; + } + delta = now() - last; + if (delta > COUNT_MS_PER_FRAME) { + last = now(); + fraction = delta / _this.options.duration; + dist = diff * fraction; + cur += dist; + _this.render(Math.round(cur)); + } + if (requestAnimationFrame != null) { + return requestAnimationFrame(tick); + } else { + return setTimeout(tick, COUNT_MS_PER_FRAME); + } + })(); + }; + + Odometer.prototype.getDigitCount = function() { + var i, max, value, values, _i, _len; + values = 1 <= arguments.length ? __slice.call(arguments, 0) : []; + for (i = _i = 0, _len = values.length; _i < _len; i = ++_i) { + value = values[i]; + values[i] = Math.abs(value); + } + max = Math.max.apply(Math, values); + return Math.ceil(Math.log(max + 1) / Math.log(10)); + }; + + Odometer.prototype.getFractionalDigitCount = function() { + var i, parser, parts, value, values, _i, _len; + values = 1 <= arguments.length ? __slice.call(arguments, 0) : []; + parser = /^\-?\d*\.(\d*?)0*$/; + for (i = _i = 0, _len = values.length; _i < _len; i = ++_i) { + value = values[i]; + values[i] = value.toString(); + parts = parser.exec(values[i]); + if (parts == null) { + values[i] = 0; + } else { + values[i] = parts[1].length; + } + } + return Math.max.apply(Math, values); + }; + + Odometer.prototype.resetDigits = function() { + this.digits = []; + this.ribbons = []; + this.inside.innerHTML = ''; + return this.resetFormat(); + }; + + Odometer.prototype.animateSlide = function(newValue) { + var boosted, cur, diff, digitCount, digits, dist, end, fractionalCount, frame, frames, i, incr, j, mark, numEl, oldValue, start, _base, _i, _j, _k, _l, _len, _len1, _len2, _m, _ref, _results; + oldValue = this.value; + fractionalCount = this.getFractionalDigitCount(oldValue, newValue); + if (fractionalCount) { + newValue = newValue * Math.pow(10, fractionalCount); + oldValue = oldValue * Math.pow(10, fractionalCount); + } + if (!(diff = newValue - oldValue)) { + return; + } + this.bindTransitionEnd(); + digitCount = this.getDigitCount(oldValue, newValue); + digits = []; + boosted = 0; + for (i = _i = 0; 0 <= digitCount ? _i < digitCount : _i > digitCount; i = 0 <= digitCount ? ++_i : --_i) { + start = truncate(oldValue / Math.pow(10, digitCount - i - 1)); + end = truncate(newValue / Math.pow(10, digitCount - i - 1)); + dist = end - start; + if (Math.abs(dist) > this.MAX_VALUES) { + frames = []; + incr = dist / (this.MAX_VALUES + this.MAX_VALUES * boosted * DIGIT_SPEEDBOOST); + cur = start; + while ((dist > 0 && cur < end) || (dist < 0 && cur > end)) { + frames.push(Math.round(cur)); + cur += incr; + } + if (frames[frames.length - 1] !== end) { + frames.push(end); + } + boosted++; + } else { + frames = (function() { + _results = []; + for (var _j = start; start <= end ? _j <= end : _j >= end; start <= end ? _j++ : _j--){ _results.push(_j); } + return _results; + }).apply(this); + } + for (i = _k = 0, _len = frames.length; _k < _len; i = ++_k) { + frame = frames[i]; + frames[i] = Math.abs(frame % 10); + } + digits.push(frames); + } + this.resetDigits(); + _ref = digits.reverse(); + for (i = _l = 0, _len1 = _ref.length; _l < _len1; i = ++_l) { + frames = _ref[i]; + if (!this.digits[i]) { + this.addDigit(' ', i >= fractionalCount); + } + if ((_base = this.ribbons)[i] == null) { + _base[i] = this.digits[i].querySelector('.odometer-ribbon-inner'); + } + this.ribbons[i].innerHTML = ''; + if (diff < 0) { + frames = frames.reverse(); + } + for (j = _m = 0, _len2 = frames.length; _m < _len2; j = ++_m) { + frame = frames[j]; + numEl = document.createElement('div'); + numEl.className = 'odometer-value'; + numEl.innerHTML = frame; + this.ribbons[i].appendChild(numEl); + if (j === frames.length - 1) { + addClass(numEl, 'odometer-last-value'); + } + if (j === 0) { + addClass(numEl, 'odometer-first-value'); + } + } + } + if (start < 0) { + this.addDigit('-'); + } + mark = this.inside.querySelector('.odometer-radix-mark'); + if (mark != null) { + mark.parent.removeChild(mark); + } + if (fractionalCount) { + return this.addSpacer(this.format.radix, this.digits[fractionalCount - 1], 'odometer-radix-mark'); + } + }; + + return Odometer; + + })(); + + Odometer.options = (_ref = window.odometerOptions) != null ? _ref : {}; + + setTimeout(function() { + var k, v, _base, _ref1, _results; + if (window.odometerOptions) { + _ref1 = window.odometerOptions; + _results = []; + for (k in _ref1) { + v = _ref1[k]; + _results.push((_base = Odometer.options)[k] != null ? (_base = Odometer.options)[k] : _base[k] = v); + } + return _results; + } + }, 0); + + Odometer.init = function() { + var el, elements, _i, _len, _ref1, _results; + if (document.querySelectorAll == null) { + return; + } + elements = document.querySelectorAll(Odometer.options.selector || '.odometer'); + _results = []; + for (_i = 0, _len = elements.length; _i < _len; _i++) { + el = elements[_i]; + _results.push(el.odometer = new Odometer({ + el: el, + value: (_ref1 = el.innerText) != null ? _ref1 : el.textContent + })); + } + return _results; + }; + + if ((((_ref1 = document.documentElement) != null ? _ref1.doScroll : void 0) != null) && (document.createEventObject != null)) { + _old = document.onreadystatechange; + document.onreadystatechange = function() { + if (document.readyState === 'complete' && Odometer.options.auto !== false) { + Odometer.init(); + } + return _old != null ? _old.apply(this, arguments) : void 0; + }; + } else { + document.addEventListener('DOMContentLoaded', function() { + if (Odometer.options.auto !== false) { + return Odometer.init(); + } + }, false); + } + + if (typeof define === 'function' && define.amd) { + define(['jquery'], function() { + return Odometer; + }); + } else if (typeof exports === !'undefined') { + module.exports = Odometer; + } else { + window.Odometer = Odometer; + } + +}).call(this); diff --git a/hub/static/js/lib/oz.js b/hub/static/js/lib/oz.js new file mode 100644 index 0000000..d325b98 --- /dev/null +++ b/hub/static/js/lib/oz.js @@ -0,0 +1,605 @@ +/** + * OzJS: microkernel for modular javascript + * compatible with AMD (Asynchronous Module Definition) + * see http://ozjs.org for details + * + * Copyright (C) 2010-2012, Dexter.Yy, MIT License + * vim: et:ts=4:sw=4:sts=4 + */ +(function(){ + +var window = this, + _toString = Object.prototype.toString, + _RE_PLUGIN = /(.*)!(.+)/, + _RE_DEPS = /\Wrequire\((['"]).+?\1\)/g, //' + _RE_SUFFIX = /\.(js|json)$/, + _RE_RELPATH = /^\.+?\/.+/, + _RE_DOT = /(^|\/)\.\//g, + _RE_ALIAS_IN_MID = /^([\w\-]+)\//, + _builtin_mods = { "require": 1, "exports": 1, "module": 1, "host": 1, "finish": 1 }, + + _config = { + mods: {} + }, + _scripts = {}, + _delays = {}, + _refers = {}, + _waitings = {}, + _latest_mod, + _scope, + _resets = {}, + + forEach = Array.prototype.forEach || function(fn, sc){ + for(var i = 0, l = this.length; i < l; i++){ + if (i in this) + fn.call(sc, this[i], i, this); + } + }; + +/** + * @public define / register a module and its meta information + * @param {string} module name. optional as unique module in a script file + * @param {string[]} dependencies + * @param {function} module code, execute only once on the first call + * + * @note + * + * define('', [""], func) + * define([""], func) + * define('', func) + * define(func) + * + * define('', "") + * define('', [""], "") + * define('', [""]) + * + */ +function define(name, deps, block){ + var is_remote = typeof block === 'string'; + if (!block) { + if (deps) { + if (isArray(deps)) { + block = filesuffix(realname(basename(name))); + } else { + block = deps; + deps = null; + } + } else { + block = name; + name = ""; + } + if (typeof name !== 'string') { + deps = name; + name = ""; + } else { + is_remote = typeof block === 'string'; + if (!is_remote && !deps) { + deps = seek(block); + } + } + } + name = name && realname(name); + var mod = name && _config.mods[name]; + if (!_config.debug && mod && mod.name + && (is_remote && mod.loaded == 2 || mod.exports)) { + return; + } + if (is_remote && _config.enable_ozma) { + deps = null; + } + var host = isWindow(this) ? this : window; + mod = _config.mods[name] = { + name: name, + url: mod && mod.url, + host: host, + deps: deps || [] + }; + if (name === "") { // capture anonymous module + _latest_mod = mod; + } + if (typeof block !== 'string') { + mod.block = block; + mod.loaded = 2; + } else { // remote module + var alias = _config.aliases; + if (alias) { + block = block.replace(/\{(\w+)\}/g, function(e1, e2){ + return alias[e2] || ""; + }); + } + mod.url = block; + } + if (mod.block && !isFunction(mod.block)) { // json module + mod.exports = block; + } +} + +/** + * @public run a code block its dependencies + * @param {string[]} [module name] dependencies + * @param {function} + */ +function require(deps, block, _self_mod) { + if (typeof deps === 'string') { + if (!block) { + return (_config.mods[realname(basename(deps, _scope))] + || {}).exports; + } + deps = [deps]; + } else if (!block) { + block = deps; + deps = seek(block); + } + var host = isWindow(this) ? this : window; + if (!_self_mod) { + _self_mod = { url: _scope && _scope.url }; + } + var m, remotes = 0, // counter for remote scripts + list = scan.call(host, deps, _self_mod); // calculate dependencies, find all required modules + for (var i = 0, l = list.length; i < l; i++) { + m = list[i]; + if (m.is_reset) { + m = _config.mods[m.name]; + } + if (m.url && m.loaded !== 2) { // remote module + remotes++; + m.loaded = 1; // status: loading + fetch(m, function(){ + this.loaded = 2; // status: loaded + var lm = _latest_mod; + if (lm) { // capture anonymous module + lm.name = this.name; + lm.url = this.url; + _config.mods[this.name] = lm; + _latest_mod = null; + } + // loaded all modules, calculate dependencies all over again + if (--remotes <= 0) { + require.call(host, deps, block, _self_mod); + } + }); + } + } + if (!remotes) { + _self_mod.deps = deps; + _self_mod.host = host; + _self_mod.block = block; + setTimeout(function(){ + tidy(deps, _self_mod); + list.push(_self_mod); + exec(list.reverse()); + }, 0); + } +} + +/** + * @private execute modules in a sequence of dependency + * @param {object[]} [module object] + */ +var exec = function(list){ + var mod, mid, tid, result, isAsync, deps, + depObjs, exportObj, moduleObj, rmod, + wt = _waitings; + while (mod = list.pop()) { + if (mod.is_reset) { + rmod = clone(_config.mods[mod.name]); + rmod.host = mod.host; + rmod.newname = mod.newname; + mod = rmod; + if (!_resets[mod.newname]) { + _resets[mod.newname] = []; + } + _resets[mod.newname].push(mod); + mod.exports = undefined; + } else if (mod.name) { + mod = _config.mods[mod.name] || mod; + } + if (!mod.block || !mod.running && mod.exports !== undefined) { + continue; + } + depObjs = []; + exportObj = {}; // for "exports" module + moduleObj = { id: mod.name, filename: mod.url, exports: exportObj }; + deps = mod.deps.slice(); + deps[mod.block.hiddenDeps ? 'unshift' : 'push']("require", "exports", "module"); + for (var i = 0, l = deps.length; i < l; i++) { + mid = deps[i]; + switch(mid) { + case 'require': + depObjs.push(require); + break; + case 'exports': + depObjs.push(exportObj); + break; + case 'module': + depObjs.push(moduleObj); + break; + case 'host': // deprecated + depObjs.push(mod.host); + break; + case 'finish': // execute asynchronously + tid = mod.name; + if (!wt[tid]) // for delay execute + wt[tid] = [list]; + else + wt[tid].push(list); + depObjs.push(function(result){ + // HACK: no guarantee that this function will be invoked after while() loop termination in Chrome/Safari + setTimeout(function(){ + // 'mod' equal to 'list[list.length-1]' + if (result !== undefined) { + mod.exports = result; + } + if (!wt[tid]) + return; + forEach.call(wt[tid], function(list){ + this(list); + }, exec); + delete wt[tid]; + mod.running = 0; + }, 0); + }); + isAsync = 1; + break; + default: + depObjs.push(( + (_resets[mid] || []).pop() + || _config.mods[realname(mid)] + || {} + ).exports); + break; + } + } + if (!mod.running) { + // execute module code. arguments: [dep1, dep2, ..., require, exports, module] + _scope = mod; + result = mod.block.apply(mod.host, depObjs) || null; + _scope = false; + exportObj = moduleObj.exports; + mod.exports = result !== undefined ? result : exportObj; // use empty exportObj for "finish" + for (var v in exportObj) { + if (v) { + mod.exports = exportObj; + } + break; + } + } + if (isAsync) { // skip, wait for finish() + mod.running = 1; + break; + } + } +}; + +/** + * @private observer for script loader, prevent duplicate requests + * @param {object} module object + * @param {function} callback + */ +var fetch = function(m, cb){ + var url = m.url, + observers = _scripts[url]; + if (!observers) { + var mname = m.name, delays = _delays; + if (m.deps && m.deps.length && delays[mname] !== 1) { + delays[mname] = [m.deps.length, cb]; + forEach.call(m.deps, function(dep){ + var d = _config.mods[realname(dep)]; + if (this[dep] !== 1 && d.url && d.loaded !== 2) { + if (!this[dep]) { + this[dep] = []; + } + this[dep].push(m); + } else { + delays[mname][0]--; + } + }, _refers); + if (delays[mname][0] > 0) { + return; + } else { + delays[mname] = 1; + } + } + observers = _scripts[url] = [[cb, m]]; + var true_url = /^\w+:\/\//.test(url) ? url + : (_config.enable_ozma && _config.distUrl || _config.baseUrl || '') + + (_config.enableAutoSuffix ? namesuffix(url) : url); + getScript.call(m.host || this, true_url, function(){ + forEach.call(observers, function(args){ + args[0].call(args[1]); + }); + _scripts[url] = 1; + if (_refers[mname] && _refers[mname] !== 1) { + forEach.call(_refers[mname], function(dm){ + var b = this[dm.name]; + if (--b[0] <= 0) { + this[dm.name] = 1; + fetch(dm, b[1]); + } + }, delays); + _refers[mname] = 1; + } + }); + } else if (observers === 1) { + cb.call(m); + } else { + observers.push([cb, m]); + } +}; + +/** + * @private search and sequence all dependencies, based on DFS + * @param {string[]} a set of module names + * @param {object[]} + * @param {object[]} a sequence of modules, for recursion + * @return {object[]} a sequence of modules + */ +function scan(m, file_mod, list){ + list = list || []; + if (!m[0]) { + return list; + } + var deps, + history = list.history; + if (!history) { + history = list.history = {}; + } + if (m[1]) { + deps = m; + m = false; + } else { + var truename, + _mid = m[0], + plugin = _RE_PLUGIN.exec(_mid); + if (plugin) { + _mid = plugin[2]; + plugin = plugin[1]; + } + var mid = realname(_mid); + if (!_config.mods[mid] && !_builtin_mods[mid]) { + var true_mid = realname(basename(_mid, file_mod)); + if (mid !== true_mid) { + _config.mods[file_mod.url + ':' + mid] = true_mid; + mid = true_mid; + } + if (!_config.mods[true_mid]) { + define(true_mid, filesuffix(true_mid)); + } + } + m = file_mod = _config.mods[mid]; + if (m) { + if (plugin === "new") { + m = { + is_reset: true, + deps: m.deps, + name: mid, + newname: plugin + "!" + mid, + host: this + }; + } else { + truename = m.name; + } + if (history[truename]) { + return list; + } + } else { + return list; + } + if (!history[truename]) { + deps = m.deps || []; + // find require information within the code + // for server-side style module + //deps = deps.concat(seek(m)); + if (truename) { + history[truename] = true; + } + } else { + deps = []; + } + } + for (var i = deps.length - 1; i >= 0; i--) { + if (!history[deps[i]]) { + scan.call(this, [deps[i]], file_mod, list); + } + } + if (m) { + tidy(deps, m); + list.push(m); + } + return list; +} + +/** + * @experiment + * @private analyse module code + * to find out dependencies which have no explicit declaration + * @param {object} module object + */ +function seek(block){ + var hdeps = block.hiddenDeps || []; + if (!block.hiddenDeps) { + var code = block.toString(), + h = null; + hdeps = block.hiddenDeps = []; + while (h = _RE_DEPS.exec(code)) { + hdeps.push(h[0].slice(10, -2)); + } + } + return hdeps.slice(); +} + +function tidy(deps, m){ + forEach.call(deps.slice(), function(dep, i){ + var true_mid = this[m.url + ':' + realname(dep)]; + if (typeof true_mid === 'string') { + deps[i] = true_mid; + } + }, _config.mods); +} + +function config(opt){ + for (var i in opt) { + if (i === 'aliases') { + if (!_config[i]) { + _config[i] = {}; + } + for (var j in opt[i]) { + _config[i][j] = opt[i][j]; + } + var mods = _config.mods; + for (var k in mods) { + mods[k].name = realname(k); + mods[mods[k].name] = mods[k]; + } + } else { + _config[i] = opt[i]; + } + } +} + +/** + * @note naming pattern: + * _g_src.js + * _g_combo.js + * + * jquery.js + * jquery_pack.js + * + * _yy_src.pack.js + * _yy_combo.js + * + * _yy_bak.pack.js + * _yy_bak.pack_pack.js + */ +function namesuffix(file){ + return file.replace(/(.+?)(_src.*)?(\.\w+)$/, function($0, $1, $2, $3){ + return $1 + ($2 && '_combo' || '_pack') + $3; + }); +} + +function filesuffix(mid){ + return _RE_SUFFIX.test(mid) ? mid : mid + '.js'; +} + +function realname(mid){ + var alias = _config.aliases; + if (alias) { + mid = mid.replace(_RE_ALIAS_IN_MID, function(e1, e2){ + return alias[e2] || (e2 + '/'); + }); + } + return mid; +} + +function basename(mid, file_mod){ + var rel_path = _RE_RELPATH.exec(mid); + if (rel_path && file_mod) { // resolve relative path in Module ID + mid = (file_mod.url || '').replace(/[^\/]+$/, '') + rel_path[0]; + } + return resolvename(mid); +} + +function resolvename(url){ + url = url.replace(_RE_DOT, '$1'); + var dots, dots_n, url_dup = url, RE_DOTS = /(\.\.\/)+/g; + while (dots = (RE_DOTS.exec(url_dup) || [])[0]) { + dots_n = dots.match(/\.\.\//g).length; + dots = dots.replace(/\./, '\\.'); + url = url.replace(new RegExp('([^/\\.]+/){' + dots_n + '}' + dots), ''); + } + return url.replace(/\/\//g, '/'); +} + +/** + * @public non-blocking script loader + * @param {string} + * @param {object} config + */ +function getScript(url, op){ + var doc = isWindow(this) ? this.document : document, + s = doc.createElement("script"); + s.type = "text/javascript"; + s.async = "async"; //for firefox3.6 + if (!op) + op = {}; + else if (isFunction(op)) + op = { callback: op }; + if (op.charset) + s.charset = op.charset; + s.src = url; + var h = doc.getElementsByTagName("head")[0]; + s.onload = s.onreadystatechange = function(__, isAbort){ + if ( isAbort || !s.readyState || /loaded|complete/.test(s.readyState) ) { + s.onload = s.onreadystatechange = null; + if (h && s.parentNode) { + h.removeChild(s); + } + s = undefined; + if (!isAbort && op.callback) { + op.callback(); + } + } + }; + h.insertBefore(s, h.firstChild); +} + +function isFunction(obj) { + return _toString.call(obj) === "[object Function]"; +} + +function isArray(obj) { + return _toString.call(obj) === "[object Array]"; +} + +function isWindow(obj) { + return "setInterval" in obj; +} + +function clone(obj) { // be careful of using `delete` + function NewObj(){} + NewObj.prototype = obj; + return new NewObj(); +} + +var oz = { + define: define, + require: require, + config: config, + seek: seek, + fetch: fetch, + realname: realname, + basename: basename, + filesuffix: filesuffix, + namesuffix: namesuffix, + // non-core + _getScript: getScript, + _clone: clone, + _forEach: forEach, + _isFunction: isFunction, + _isWindow: isWindow +}; + +require.config = config; +define.amd = {}; + +if (!window.window) { // for nodejs + exports.oz = oz; + exports._config = _config; + // hook for build tool + for (var i in oz) { + exports[i] = oz[i]; + } + var hooking = function(fname){ + return function(){ return exports[fname].apply(this, arguments); }; + }; + exec = hooking('exec'); + fetch = hooking('fetch'); + require = hooking('require'); + require.config = config; +} else { + window.oz = oz; + window.define = define; + window.require = require; +} + +})(); diff --git a/hub/static/js/lib/pixastic.custom.js b/hub/static/js/lib/pixastic.custom.js new file mode 100644 index 0000000..aff5878 --- /dev/null +++ b/hub/static/js/lib/pixastic.custom.js @@ -0,0 +1,191 @@ +/* + * Pixastic - JavaScript Image Processing Library + * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ + * MIT License [http://www.pixastic.com/lib/license.txt] + */ + + +var Pixastic=(function(){function addEvent(el,event,handler){if(el.addEventListener) +el.addEventListener(event,handler,false);else if(el.attachEvent) +el.attachEvent("on"+event,handler);} +function onready(handler){var handlerDone=false;var execHandler=function(){if(!handlerDone){handlerDone=true;handler();}} +document.write("<"+"script defer src=\"//:\" id=\"__onload_ie_pixastic__\"></"+"script>");var script=document.getElementById("__onload_ie_pixastic__");script.onreadystatechange=function(){if(script.readyState=="complete"){script.parentNode.removeChild(script);execHandler();}} +if(document.addEventListener) +document.addEventListener("DOMContentLoaded",execHandler,false);addEvent(window,"load",execHandler);} +function init(){var imgEls=getElementsByClass("pixastic",null,"img");var canvasEls=getElementsByClass("pixastic",null,"canvas");var elements=imgEls.concat(canvasEls);for(var i=0;i<elements.length;i++){(function(){var el=elements[i];var actions=[];var classes=el.className.split(" ");for(var c=0;c<classes.length;c++){var cls=classes[c];if(cls.substring(0,9)=="pixastic-"){var actionName=cls.substring(9);if(actionName!="") +actions.push(actionName);}} +if(actions.length){if(el.tagName.toLowerCase()=="img"){var dataImg=new Image();dataImg.src=el.src;if(dataImg.complete){for(var a=0;a<actions.length;a++){var res=Pixastic.applyAction(el,el,actions[a],null);if(res) +el=res;}}else{dataImg.onload=function(){for(var a=0;a<actions.length;a++){var res=Pixastic.applyAction(el,el,actions[a],null) +if(res) +el=res;}}}}else{setTimeout(function(){for(var a=0;a<actions.length;a++){var res=Pixastic.applyAction(el,el,actions[a],null);if(res) +el=res;}},1);}}})();}} +if(typeof pixastic_parseonload!="undefined"&&pixastic_parseonload) +onready(init);function getElementsByClass(searchClass,node,tag){var classElements=new Array();if(node==null) +node=document;if(tag==null) +tag='*';var els=node.getElementsByTagName(tag);var elsLen=els.length;var pattern=new RegExp("(^|\\s)"+searchClass+"(\\s|$)");for(i=0,j=0;i<elsLen;i++){if(pattern.test(els[i].className)){classElements[j]=els[i];j++;}} +return classElements;} +var debugElement;function writeDebug(text,level){if(!Pixastic.debug)return;try{switch(level){case"warn":console.warn("Pixastic:",text);break;case"error":console.error("Pixastic:",text);break;default:console.log("Pixastic:",text);}}catch(e){} +if(!debugElement){}} +var hasCanvas=(function(){var c=document.createElement("canvas");var val=false;try{val=!!((typeof c.getContext=="function")&&c.getContext("2d"));}catch(e){} +return function(){return val;}})();var hasCanvasImageData=(function(){var c=document.createElement("canvas");var val=false;var ctx;try{if(typeof c.getContext=="function"&&(ctx=c.getContext("2d"))){val=(typeof ctx.getImageData=="function");}}catch(e){} +return function(){return val;}})();var hasGlobalAlpha=(function(){var hasAlpha=false;var red=document.createElement("canvas");if(hasCanvas()&&hasCanvasImageData()){red.width=red.height=1;var redctx=red.getContext("2d");redctx.fillStyle="rgb(255,0,0)";redctx.fillRect(0,0,1,1);var blue=document.createElement("canvas");blue.width=blue.height=1;var bluectx=blue.getContext("2d");bluectx.fillStyle="rgb(0,0,255)";bluectx.fillRect(0,0,1,1);redctx.globalAlpha=0.5;redctx.drawImage(blue,0,0);var reddata=redctx.getImageData(0,0,1,1).data;hasAlpha=(reddata[2]!=255);} +return function(){return hasAlpha;}})();return{parseOnLoad:false,debug:false,applyAction:function(img,dataImg,actionName,options){options=options||{};var imageIsCanvas=(img.tagName.toLowerCase()=="canvas");if(imageIsCanvas&&Pixastic.Client.isIE()){if(Pixastic.debug)writeDebug("Tried to process a canvas element but browser is IE.");return false;} +var canvas,ctx;var hasOutputCanvas=false;if(Pixastic.Client.hasCanvas()){hasOutputCanvas=!!options.resultCanvas;canvas=options.resultCanvas||document.createElement("canvas");ctx=canvas.getContext("2d");} +var w=img.offsetWidth;var h=img.offsetHeight;if(imageIsCanvas){w=img.width;h=img.height;} +if(w==0||h==0){if(img.parentNode==null){var oldpos=img.style.position;var oldleft=img.style.left;img.style.position="absolute";img.style.left="-9999px";document.body.appendChild(img);w=img.offsetWidth;h=img.offsetHeight;document.body.removeChild(img);img.style.position=oldpos;img.style.left=oldleft;}else{if(Pixastic.debug)writeDebug("Image has 0 width and/or height.");return;}} +if(actionName.indexOf("(")>-1){var tmp=actionName;actionName=tmp.substr(0,tmp.indexOf("("));var arg=tmp.match(/\((.*?)\)/);if(arg[1]){arg=arg[1].split(";");for(var a=0;a<arg.length;a++){thisArg=arg[a].split("=");if(thisArg.length==2){if(thisArg[0]=="rect"){var rectVal=thisArg[1].split(",");options[thisArg[0]]={left:parseInt(rectVal[0],10)||0,top:parseInt(rectVal[1],10)||0,width:parseInt(rectVal[2],10)||0,height:parseInt(rectVal[3],10)||0}}else{options[thisArg[0]]=thisArg[1];}}}}} +if(!options.rect){options.rect={left:0,top:0,width:w,height:h};}else{options.rect.left=Math.round(options.rect.left);options.rect.top=Math.round(options.rect.top);options.rect.width=Math.round(options.rect.width);options.rect.height=Math.round(options.rect.height);} +var validAction=false;if(Pixastic.Actions[actionName]&&typeof Pixastic.Actions[actionName].process=="function"){validAction=true;} +if(!validAction){if(Pixastic.debug)writeDebug("Invalid action \""+actionName+"\". Maybe file not included?");return false;} +if(!Pixastic.Actions[actionName].checkSupport()){if(Pixastic.debug)writeDebug("Action \""+actionName+"\" not supported by this browser.");return false;} +if(Pixastic.Client.hasCanvas()){if(canvas!==img){canvas.width=w;canvas.height=h;} +if(!hasOutputCanvas){canvas.style.width=w+"px";canvas.style.height=h+"px";} +ctx.drawImage(dataImg,0,0,w,h);if(!img.__pixastic_org_image){canvas.__pixastic_org_image=img;canvas.__pixastic_org_width=w;canvas.__pixastic_org_height=h;}else{canvas.__pixastic_org_image=img.__pixastic_org_image;canvas.__pixastic_org_width=img.__pixastic_org_width;canvas.__pixastic_org_height=img.__pixastic_org_height;}}else if(Pixastic.Client.isIE()&&typeof img.__pixastic_org_style=="undefined"){img.__pixastic_org_style=img.style.cssText;} +var params={image:img,canvas:canvas,width:w,height:h,useData:true,options:options} +var res=Pixastic.Actions[actionName].process(params);if(!res){return false;} +if(Pixastic.Client.hasCanvas()){if(params.useData){if(Pixastic.Client.hasCanvasImageData()){canvas.getContext("2d").putImageData(params.canvasData,options.rect.left,options.rect.top);canvas.getContext("2d").fillRect(0,0,0,0);}} +if(!options.leaveDOM){canvas.title=img.title;canvas.imgsrc=img.imgsrc;if(!imageIsCanvas)canvas.alt=img.alt;if(!imageIsCanvas)canvas.imgsrc=img.src;canvas.className=img.className;canvas.style.cssText=img.style.cssText;canvas.name=img.name;canvas.tabIndex=img.tabIndex;canvas.id=img.id;if(img.parentNode&&img.parentNode.replaceChild){img.parentNode.replaceChild(canvas,img);}} +options.resultCanvas=canvas;return canvas;} +return img;},prepareData:function(params,getCopy){var ctx=params.canvas.getContext("2d");var rect=params.options.rect;var dataDesc=ctx.getImageData(rect.left,rect.top,rect.width,rect.height);var data=dataDesc.data;if(!getCopy)params.canvasData=dataDesc;return data;},process:function(img,actionName,options,callback){if(img.tagName.toLowerCase()=="img"){var dataImg=new Image();dataImg.src=img.src;if(dataImg.complete){var res=Pixastic.applyAction(img,dataImg,actionName,options);if(callback)callback(res);return res;}else{dataImg.onload=function(){var res=Pixastic.applyAction(img,dataImg,actionName,options) +if(callback)callback(res);}}} +if(img.tagName.toLowerCase()=="canvas"){var res=Pixastic.applyAction(img,img,actionName,options);if(callback)callback(res);return res;}},revert:function(img){if(Pixastic.Client.hasCanvas()){if(img.tagName.toLowerCase()=="canvas"&&img.__pixastic_org_image){img.width=img.__pixastic_org_width;img.height=img.__pixastic_org_height;img.getContext("2d").drawImage(img.__pixastic_org_image,0,0);if(img.parentNode&&img.parentNode.replaceChild){img.parentNode.replaceChild(img.__pixastic_org_image,img);} +return img;}}else if(Pixastic.Client.isIE()){if(typeof img.__pixastic_org_style!="undefined") +img.style.cssText=img.__pixastic_org_style;}},Client:{hasCanvas:hasCanvas,hasCanvasImageData:hasCanvasImageData,hasGlobalAlpha:hasGlobalAlpha,isIE:function(){return!!document.all&&!!window.attachEvent&&!window.opera;}},Actions:{}}})();Pixastic.Actions.blend={process:function(params){var amount=parseFloat(params.options.amount);var mode=(params.options.mode||"normal").toLowerCase();var image=params.options.image;amount=Math.max(0,Math.min(1,amount));if(!image)return false;if(Pixastic.Client.hasCanvasImageData()){var rect=params.options.rect;var data=Pixastic.prepareData(params);var w=rect.width;var h=rect.height;params.useData=false;var otherCanvas=document.createElement("canvas");otherCanvas.width=params.canvas.width;otherCanvas.height=params.canvas.height;var otherCtx=otherCanvas.getContext("2d");otherCtx.drawImage(image,0,0);var params2={canvas:otherCanvas,options:params.options};var data2=Pixastic.prepareData(params2);var dataDesc2=params2.canvasData;var p=w*h;var pix=p*4;var pix1,pix2;var r1,g1,b1;var r2,g2,b2;var r3,g3,b3;var r4,g4,b4;var dataChanged=false;switch(mode){case"normal":break;case"multiply":while(p--){data2[pix-=4]=data[pix]*data2[pix]/255;data2[pix1=pix+1]=data[pix1]*data2[pix1]/255;data2[pix2=pix+2]=data[pix2]*data2[pix2]/255;} +dataChanged=true;break;case"lighten":while(p--){if((r1=data[pix-=4])>data2[pix]) +data2[pix]=r1;if((g1=data[pix1=pix+1])>data2[pix1]) +data2[pix1]=g1;if((b1=data[pix2=pix+2])>data2[pix2]) +data2[pix2]=b1;} +dataChanged=true;break;case"darken":while(p--){if((r1=data[pix-=4])<data2[pix]) +data2[pix]=r1;if((g1=data[pix1=pix+1])<data2[pix1]) +data2[pix1]=g1;if((b1=data[pix2=pix+2])<data2[pix2]) +data2[pix2]=b1;} +dataChanged=true;break;case"darkercolor":while(p--){if(((r1=data[pix-=4])*0.3+(g1=data[pix1=pix+1])*0.59+(b1=data[pix2=pix+2])*0.11)<=(data2[pix]*0.3+data2[pix1]*0.59+data2[pix2]*0.11)){data2[pix]=r1;data2[pix1]=g1;data2[pix2]=b1;}} +dataChanged=true;break;case"lightercolor":while(p--){if(((r1=data[pix-=4])*0.3+(g1=data[pix1=pix+1])*0.59+(b1=data[pix2=pix+2])*0.11)>(data2[pix]*0.3+data2[pix1]*0.59+data2[pix2]*0.11)){data2[pix]=r1;data2[pix1]=g1;data2[pix2]=b1;}} +dataChanged=true;break;case"lineardodge":while(p--){if((r3=data[pix-=4]+data2[pix])>255) +data2[pix]=255;else +data2[pix]=r3;if((g3=data[pix1=pix+1]+data2[pix1])>255) +data2[pix1]=255;else +data2[pix1]=g3;if((b3=data[pix2=pix+2]+data2[pix2])>255) +data2[pix2]=255;else +data2[pix2]=b3;} +dataChanged=true;break;case"linearburn":while(p--){if((r3=data[pix-=4]+data2[pix])<255) +data2[pix]=0;else +data2[pix]=(r3-255);if((g3=data[pix1=pix+1]+data2[pix1])<255) +data2[pix1]=0;else +data2[pix1]=(g3-255);if((b3=data[pix2=pix+2]+data2[pix2])<255) +data2[pix2]=0;else +data2[pix2]=(b3-255);} +dataChanged=true;break;case"difference":while(p--){if((r3=data[pix-=4]-data2[pix])<0) +data2[pix]=-r3;else +data2[pix]=r3;if((g3=data[pix1=pix+1]-data2[pix1])<0) +data2[pix1]=-g3;else +data2[pix1]=g3;if((b3=data[pix2=pix+2]-data2[pix2])<0) +data2[pix2]=-b3;else +data2[pix2]=b3;} +dataChanged=true;break;case"screen":while(p--){data2[pix-=4]=(255-(((255-data2[pix])*(255-data[pix]))>>8));data2[pix1=pix+1]=(255-(((255-data2[pix1])*(255-data[pix1]))>>8));data2[pix2=pix+2]=(255-(((255-data2[pix2])*(255-data[pix2]))>>8));} +dataChanged=true;break;case"exclusion":var div_2_255=2/255;while(p--){data2[pix-=4]=(r1=data[pix])-(r1*div_2_255-1)*data2[pix];data2[pix1=pix+1]=(g1=data[pix1])-(g1*div_2_255-1)*data2[pix1];data2[pix2=pix+2]=(b1=data[pix2])-(b1*div_2_255-1)*data2[pix2];} +dataChanged=true;break;case"overlay":var div_2_255=2/255;while(p--){if((r1=data[pix-=4])<128) +data2[pix]=data2[pix]*r1*div_2_255;else +data2[pix]=255-(255-data2[pix])*(255-r1)*div_2_255;if((g1=data[pix1=pix+1])<128) +data2[pix1]=data2[pix1]*g1*div_2_255;else +data2[pix1]=255-(255-data2[pix1])*(255-g1)*div_2_255;if((b1=data[pix2=pix+2])<128) +data2[pix2]=data2[pix2]*b1*div_2_255;else +data2[pix2]=255-(255-data2[pix2])*(255-b1)*div_2_255;} +dataChanged=true;break;case"softlight":var div_2_255=2/255;while(p--){if((r1=data[pix-=4])<128) +data2[pix]=((data2[pix]>>1)+64)*r1*div_2_255;else +data2[pix]=255-(191-(data2[pix]>>1))*(255-r1)*div_2_255;if((g1=data[pix1=pix+1])<128) +data2[pix1]=((data2[pix1]>>1)+64)*g1*div_2_255;else +data2[pix1]=255-(191-(data2[pix1]>>1))*(255-g1)*div_2_255;if((b1=data[pix2=pix+2])<128) +data2[pix2]=((data2[pix2]>>1)+64)*b1*div_2_255;else +data2[pix2]=255-(191-(data2[pix2]>>1))*(255-b1)*div_2_255;} +dataChanged=true;break;case"hardlight":var div_2_255=2/255;while(p--){if((r2=data2[pix-=4])<128) +data2[pix]=data[pix]*r2*div_2_255;else +data2[pix]=255-(255-data[pix])*(255-r2)*div_2_255;if((g2=data2[pix1=pix+1])<128) +data2[pix1]=data[pix1]*g2*div_2_255;else +data2[pix1]=255-(255-data[pix1])*(255-g2)*div_2_255;if((b2=data2[pix2=pix+2])<128) +data2[pix2]=data[pix2]*b2*div_2_255;else +data2[pix2]=255-(255-data[pix2])*(255-b2)*div_2_255;} +dataChanged=true;break;case"colordodge":while(p--){if((r3=(data[pix-=4]<<8)/(255-(r2=data2[pix])))>255||r2==255) +data2[pix]=255;else +data2[pix]=r3;if((g3=(data[pix1=pix+1]<<8)/(255-(g2=data2[pix1])))>255||g2==255) +data2[pix1]=255;else +data2[pix1]=g3;if((b3=(data[pix2=pix+2]<<8)/(255-(b2=data2[pix2])))>255||b2==255) +data2[pix2]=255;else +data2[pix2]=b3;} +dataChanged=true;break;case"colorburn":while(p--){if((r3=255-((255-data[pix-=4])<<8)/data2[pix])<0||data2[pix]==0) +data2[pix]=0;else +data2[pix]=r3;if((g3=255-((255-data[pix1=pix+1])<<8)/data2[pix1])<0||data2[pix1]==0) +data2[pix1]=0;else +data2[pix1]=g3;if((b3=255-((255-data[pix2=pix+2])<<8)/data2[pix2])<0||data2[pix2]==0) +data2[pix2]=0;else +data2[pix2]=b3;} +dataChanged=true;break;case"linearlight":while(p--){if(((r3=2*(r2=data2[pix-=4])+data[pix]-256)<0)||(r2<128&&r3<0)){data2[pix]=0}else{if(r3>255) +data2[pix]=255;else +data2[pix]=r3;} +if(((g3=2*(g2=data2[pix1=pix+1])+data[pix1]-256)<0)||(g2<128&&g3<0)){data2[pix1]=0}else{if(g3>255) +data2[pix1]=255;else +data2[pix1]=g3;} +if(((b3=2*(b2=data2[pix2=pix+2])+data[pix2]-256)<0)||(b2<128&&b3<0)){data2[pix2]=0}else{if(b3>255) +data2[pix2]=255;else +data2[pix2]=b3;}} +dataChanged=true;break;case"vividlight":while(p--){if((r2=data2[pix-=4])<128){if(r2){if((r3=255-((255-data[pix])<<8)/(2*r2))<0) +data2[pix]=0;else +data2[pix]=r3}else{data2[pix]=0;}}else if((r3=(r4=2*r2-256))<255){if((r3=(data[pix]<<8)/(255-r4))>255) +data2[pix]=255;else +data2[pix]=r3;}else{if(r3<0) +data2[pix]=0;else +data2[pix]=r3} +if((g2=data2[pix1=pix+1])<128){if(g2){if((g3=255-((255-data[pix1])<<8)/(2*g2))<0) +data2[pix1]=0;else +data2[pix1]=g3;}else{data2[pix1]=0;}}else if((g3=(g4=2*g2-256))<255){if((g3=(data[pix1]<<8)/(255-g4))>255) +data2[pix1]=255;else +data2[pix1]=g3;}else{if(g3<0) +data2[pix1]=0;else +data2[pix1]=g3;} +if((b2=data2[pix2=pix+2])<128){if(b2){if((b3=255-((255-data[pix2])<<8)/(2*b2))<0) +data2[pix2]=0;else +data2[pix2]=b3;}else{data2[pix2]=0;}}else if((b3=(b4=2*b2-256))<255){if((b3=(data[pix2]<<8)/(255-b4))>255) +data2[pix2]=255;else +data2[pix2]=b3;}else{if(b3<0) +data2[pix2]=0;else +data2[pix2]=b3;}} +dataChanged=true;break;case"pinlight":while(p--){if((r2=data2[pix-=4])<128) +if((r1=data[pix])<(r4=2*r2)) +data2[pix]=r1;else +data2[pix]=r4;else +if((r1=data[pix])>(r4=2*r2-256)) +data2[pix]=r1;else +data2[pix]=r4;if((g2=data2[pix1=pix+1])<128) +if((g1=data[pix1])<(g4=2*g2)) +data2[pix1]=g1;else +data2[pix1]=g4;else +if((g1=data[pix1])>(g4=2*g2-256)) +data2[pix1]=g1;else +data2[pix1]=g4;if((r2=data2[pix2=pix+2])<128) +if((r1=data[pix2])<(r4=2*r2)) +data2[pix2]=r1;else +data2[pix2]=r4;else +if((r1=data[pix2])>(r4=2*r2-256)) +data2[pix2]=r1;else +data2[pix2]=r4;} +dataChanged=true;break;case"hardmix":while(p--){if((r2=data2[pix-=4])<128) +if(255-((255-data[pix])<<8)/(2*r2)<128||r2==0) +data2[pix]=0;else +data2[pix]=255;else if((r4=2*r2-256)<255&&(data[pix]<<8)/(255-r4)<128) +data2[pix]=0;else +data2[pix]=255;if((g2=data2[pix1=pix+1])<128) +if(255-((255-data[pix1])<<8)/(2*g2)<128||g2==0) +data2[pix1]=0;else +data2[pix1]=255;else if((g4=2*g2-256)<255&&(data[pix1]<<8)/(255-g4)<128) +data2[pix1]=0;else +data2[pix1]=255;if((b2=data2[pix2=pix+2])<128) +if(255-((255-data[pix2])<<8)/(2*b2)<128||b2==0) +data2[pix2]=0;else +data2[pix2]=255;else if((b4=2*b2-256)<255&&(data[pix2]<<8)/(255-b4)<128) +data2[pix2]=0;else +data2[pix2]=255;} +dataChanged=true;break;} +if(dataChanged) +otherCtx.putImageData(dataDesc2,0,0);if(amount!=1&&!Pixastic.Client.hasGlobalAlpha()){var p=w*h;var amount2=amount;var amount1=1-amount;while(p--){var pix=p*4;var r=(data[pix]*amount1+data2[pix]*amount2)>>0;var g=(data[pix+1]*amount1+data2[pix+1]*amount2)>>0;var b=(data[pix+2]*amount1+data2[pix+2]*amount2)>>0;data[pix]=r;data[pix+1]=g;data[pix+2]=b;} +params.useData=true;}else{var ctx=params.canvas.getContext("2d");ctx.save();ctx.globalAlpha=amount;ctx.drawImage(otherCanvas,0,0,rect.width,rect.height,rect.left,rect.top,rect.width,rect.height);ctx.globalAlpha=1;ctx.restore();} +return true;}},checkSupport:function(){return Pixastic.Client.hasCanvasImageData();}} \ No newline at end of file diff --git a/hub/static/js/lib/raven-1.0.8.js b/hub/static/js/lib/raven-1.0.8.js new file mode 100644 index 0000000..3ee3002 --- /dev/null +++ b/hub/static/js/lib/raven-1.0.8.js @@ -0,0 +1,1659 @@ +/*! Raven.js 1.0.8 | github.com/getsentry/raven-js */ + +/* + * Includes TraceKit + * https://github.com/getsentry/TraceKit + * + * Copyright 2013 Matt Robenolt and other contributors + * Released under the BSD license + * https://github.com/getsentry/raven-js/blob/master/LICENSE + * + */ +/* + TraceKit - Cross brower stack traces - github.com/occ/TraceKit + MIT license +*/ + +;(function(window, undefined) { + + +var TraceKit = {}; +var _oldTraceKit = window.TraceKit; + +// global reference to slice +var _slice = [].slice; +var UNKNOWN_FUNCTION = '?'; + + +/** + * _has, a better form of hasOwnProperty + * Example: _has(MainHostObject, property) === true/false + * + * @param {Object} host object to check property + * @param {string} key to check + */ +function _has(object, key) { + return Object.prototype.hasOwnProperty.call(object, key); +} + +function _isUndefined(what) { + return typeof what === 'undefined'; +} + +/** + * TraceKit.noConflict: Export TraceKit out to another variable + * Example: var TK = TraceKit.noConflict() + */ +TraceKit.noConflict = function noConflict() { + window.TraceKit = _oldTraceKit; + return TraceKit; +}; + +/** + * TraceKit.wrap: Wrap any function in a TraceKit reporter + * Example: func = TraceKit.wrap(func); + * + * @param {Function} func Function to be wrapped + * @return {Function} The wrapped func + */ +TraceKit.wrap = function traceKitWrapper(func) { + function wrapped() { + try { + return func.apply(this, arguments); + } catch (e) { + TraceKit.report(e); + throw e; + } + } + return wrapped; +}; + +/** + * TraceKit.report: cross-browser processing of unhandled exceptions + * + * Syntax: + * TraceKit.report.subscribe(function(stackInfo) { ... }) + * TraceKit.report.unsubscribe(function(stackInfo) { ... }) + * TraceKit.report(exception) + * try { ...code... } catch(ex) { TraceKit.report(ex); } + * + * Supports: + * - Firefox: full stack trace with line numbers, plus column number + * on top frame; column number is not guaranteed + * - Opera: full stack trace with line and column numbers + * - Chrome: full stack trace with line and column numbers + * - Safari: line and column number for the top frame only; some frames + * may be missing, and column number is not guaranteed + * - IE: line and column number for the top frame only; some frames + * may be missing, and column number is not guaranteed + * + * In theory, TraceKit should work on all of the following versions: + * - IE5.5+ (only 8.0 tested) + * - Firefox 0.9+ (only 3.5+ tested) + * - Opera 7+ (only 10.50 tested; versions 9 and earlier may require + * Exceptions Have Stacktrace to be enabled in opera:config) + * - Safari 3+ (only 4+ tested) + * - Chrome 1+ (only 5+ tested) + * - Konqueror 3.5+ (untested) + * + * Requires TraceKit.computeStackTrace. + * + * Tries to catch all unhandled exceptions and report them to the + * subscribed handlers. Please note that TraceKit.report will rethrow the + * exception. This is REQUIRED in order to get a useful stack trace in IE. + * If the exception does not reach the top of the browser, you will only + * get a stack trace from the point where TraceKit.report was called. + * + * Handlers receive a stackInfo object as described in the + * TraceKit.computeStackTrace docs. + */ +TraceKit.report = (function reportModuleWrapper() { + var handlers = [], + lastException = null, + lastExceptionStack = null; + + /** + * Add a crash handler. + * @param {Function} handler + */ + function subscribe(handler) { + handlers.push(handler); + } + + /** + * Remove a crash handler. + * @param {Function} handler + */ + function unsubscribe(handler) { + for (var i = handlers.length - 1; i >= 0; --i) { + if (handlers[i] === handler) { + handlers.splice(i, 1); + } + } + } + + /** + * Dispatch stack information to all handlers. + * @param {Object.<string, *>} stack + */ + function notifyHandlers(stack, windowError) { + var exception = null; + if (windowError && !TraceKit.collectWindowErrors) { + return; + } + for (var i in handlers) { + if (_has(handlers, i)) { + try { + handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2))); + } catch (inner) { + exception = inner; + } + } + } + + if (exception) { + throw exception; + } + } + + var _oldOnerrorHandler = window.onerror; + + /** + * Ensures all global unhandled exceptions are recorded. + * Supported by Gecko and IE. + * @param {string} message Error message. + * @param {string} url URL of script that generated the exception. + * @param {(number|string)} lineNo The line number at which the error + * occurred. + */ + window.onerror = function traceKitWindowOnError(message, url, lineNo) { + var stack = null; + + if (lastExceptionStack) { + TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(lastExceptionStack, url, lineNo, message); + stack = lastExceptionStack; + lastExceptionStack = null; + lastException = null; + } else { + var location = { + 'url': url, + 'line': lineNo + }; + location.func = TraceKit.computeStackTrace.guessFunctionName(location.url, location.line); + location.context = TraceKit.computeStackTrace.gatherContext(location.url, location.line); + stack = { + 'mode': 'onerror', + 'message': message, + 'url': document.location.href, + 'stack': [location], + 'useragent': navigator.userAgent + }; + } + + notifyHandlers(stack, 'from window.onerror'); + + if (_oldOnerrorHandler) { + return _oldOnerrorHandler.apply(this, arguments); + } + + return false; + }; + + /** + * Reports an unhandled Error to TraceKit. + * @param {Error} ex + */ + function report(ex) { + var args = _slice.call(arguments, 1); + if (lastExceptionStack) { + if (lastException === ex) { + return; // already caught by an inner catch block, ignore + } else { + var s = lastExceptionStack; + lastExceptionStack = null; + lastException = null; + notifyHandlers.apply(null, [s, null].concat(args)); + } + } + + var stack = TraceKit.computeStackTrace(ex); + lastExceptionStack = stack; + lastException = ex; + + // If the stack trace is incomplete, wait for 2 seconds for + // slow slow IE to see if onerror occurs or not before reporting + // this exception; otherwise, we will end up with an incomplete + // stack trace + window.setTimeout(function () { + if (lastException === ex) { + lastExceptionStack = null; + lastException = null; + notifyHandlers.apply(null, [stack, null].concat(args)); + } + }, (stack.incomplete ? 2000 : 0)); + + throw ex; // re-throw to propagate to the top level (and cause window.onerror) + } + + report.subscribe = subscribe; + report.unsubscribe = unsubscribe; + return report; +}()); + +/** + * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript + * + * Syntax: + * s = TraceKit.computeStackTrace.ofCaller([depth]) + * s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below) + * Returns: + * s.name - exception name + * s.message - exception message + * s.stack[i].url - JavaScript or HTML file URL + * s.stack[i].func - function name, or empty for anonymous functions (if guessing did not work) + * s.stack[i].args - arguments passed to the function, if known + * s.stack[i].line - line number, if known + * s.stack[i].column - column number, if known + * s.stack[i].context - an array of source code lines; the middle element corresponds to the correct line# + * s.mode - 'stack', 'stacktrace', 'multiline', 'callers', 'onerror', or 'failed' -- method used to collect the stack trace + * + * Supports: + * - Firefox: full stack trace with line numbers and unreliable column + * number on top frame + * - Opera 10: full stack trace with line and column numbers + * - Opera 9-: full stack trace with line numbers + * - Chrome: full stack trace with line and column numbers + * - Safari: line and column number for the topmost stacktrace element + * only + * - IE: no line numbers whatsoever + * + * Tries to guess names of anonymous functions by looking for assignments + * in the source code. In IE and Safari, we have to guess source file names + * by searching for function bodies inside all page scripts. This will not + * work for scripts that are loaded cross-domain. + * Here be dragons: some function names may be guessed incorrectly, and + * duplicate functions may be mismatched. + * + * TraceKit.computeStackTrace should only be used for tracing purposes. + * Logging of unhandled exceptions should be done with TraceKit.report, + * which builds on top of TraceKit.computeStackTrace and provides better + * IE support by utilizing the window.onerror event to retrieve information + * about the top of the stack. + * + * Note: In IE and Safari, no stack trace is recorded on the Error object, + * so computeStackTrace instead walks its *own* chain of callers. + * This means that: + * * in Safari, some methods may be missing from the stack trace; + * * in IE, the topmost function in the stack trace will always be the + * caller of computeStackTrace. + * + * This is okay for tracing (because you are likely to be calling + * computeStackTrace from the function you want to be the topmost element + * of the stack trace anyway), but not okay for logging unhandled + * exceptions (because your catch block will likely be far away from the + * inner function that actually caused the exception). + * + * Tracing example: + * function trace(message) { + * var stackInfo = TraceKit.computeStackTrace.ofCaller(); + * var data = message + "\n"; + * for(var i in stackInfo.stack) { + * var item = stackInfo.stack[i]; + * data += (item.func || '[anonymous]') + "() in " + item.url + ":" + (item.line || '0') + "\n"; + * } + * if (window.console) + * console.info(data); + * else + * alert(data); + * } + */ +TraceKit.computeStackTrace = (function computeStackTraceWrapper() { + var debug = false, + sourceCache = {}; + + /** + * Attempts to retrieve source code via XMLHttpRequest, which is used + * to look up anonymous function names. + * @param {string} url URL of source code. + * @return {string} Source contents. + */ + function loadSource(url) { + if (!TraceKit.remoteFetching) { //Only attempt request if remoteFetching is on. + return ''; + } + try { + function getXHR() { + try { + return new window.XMLHttpRequest(); + } catch (e) { + // explicitly bubble up the exception if not found + return new window.ActiveXObject('Microsoft.XMLHTTP'); + } + } + + var request = getXHR(); + request.open('GET', url, false); + request.send(''); + return request.responseText; + } catch (e) { + return ''; + } + } + + /** + * Retrieves source code from the source code cache. + * @param {string} url URL of source code. + * @return {Array.<string>} Source contents. + */ + function getSource(url) { + if (!_has(sourceCache, url)) { + // URL needs to be able to fetched within the acceptable domain. Otherwise, + // cross-domain errors will be triggered. + var source = ''; + if (url.indexOf(document.domain) !== -1) { + source = loadSource(url); + } + sourceCache[url] = source ? source.split('\n') : []; + } + + return sourceCache[url]; + } + + /** + * Tries to use an externally loaded copy of source code to determine + * the name of a function by looking at the name of the variable it was + * assigned to, if any. + * @param {string} url URL of source code. + * @param {(string|number)} lineNo Line number in source code. + * @return {string} The function name, if discoverable. + */ + function guessFunctionName(url, lineNo) { + var reFunctionArgNames = /function ([^(]*)\(([^)]*)\)/, + reGuessFunction = /['"]?([0-9A-Za-z$_]+)['"]?\s*[:=]\s*(function|eval|new Function)/, + line = '', + maxLines = 10, + source = getSource(url), + m; + + if (!source.length) { + return UNKNOWN_FUNCTION; + } + + // Walk backwards from the first line in the function until we find the line which + // matches the pattern above, which is the function definition + for (var i = 0; i < maxLines; ++i) { + line = source[lineNo - i] + line; + + if (!_isUndefined(line)) { + if ((m = reGuessFunction.exec(line))) { + return m[1]; + } else if ((m = reFunctionArgNames.exec(line))) { + return m[1]; + } + } + } + + return UNKNOWN_FUNCTION; + } + + /** + * Retrieves the surrounding lines from where an exception occurred. + * @param {string} url URL of source code. + * @param {(string|number)} line Line number in source code to centre + * around for context. + * @return {?Array.<string>} Lines of source code. + */ + function gatherContext(url, line) { + var source = getSource(url); + + if (!source.length) { + return null; + } + + var context = [], + // linesBefore & linesAfter are inclusive with the offending line. + // if linesOfContext is even, there will be one extra line + // *before* the offending line. + linesBefore = Math.floor(TraceKit.linesOfContext / 2), + // Add one extra line if linesOfContext is odd + linesAfter = linesBefore + (TraceKit.linesOfContext % 2), + start = Math.max(0, line - linesBefore - 1), + end = Math.min(source.length, line + linesAfter - 1); + + line -= 1; // convert to 0-based index + + for (var i = start; i < end; ++i) { + if (!_isUndefined(source[i])) { + context.push(source[i]); + } + } + + return context.length > 0 ? context : null; + } + + /** + * Escapes special characters, except for whitespace, in a string to be + * used inside a regular expression as a string literal. + * @param {string} text The string. + * @return {string} The escaped string literal. + */ + function escapeRegExp(text) { + return text.replace(/[\-\[\]{}()*+?.,\\\^$|#]/g, '\\$&'); + } + + /** + * Escapes special characters in a string to be used inside a regular + * expression as a string literal. Also ensures that HTML entities will + * be matched the same as their literal friends. + * @param {string} body The string. + * @return {string} The escaped string. + */ + function escapeCodeAsRegExpForMatchingInsideHTML(body) { + return escapeRegExp(body).replace('<', '(?:<|<)').replace('>', '(?:>|>)').replace('&', '(?:&|&)').replace('"', '(?:"|")').replace(/\s+/g, '\\s+'); + } + + /** + * Determines where a code fragment occurs in the source code. + * @param {RegExp} re The function definition. + * @param {Array.<string>} urls A list of URLs to search. + * @return {?Object.<string, (string|number)>} An object containing + * the url, line, and column number of the defined function. + */ + function findSourceInUrls(re, urls) { + var source, m; + for (var i = 0, j = urls.length; i < j; ++i) { + // console.log('searching', urls[i]); + if ((source = getSource(urls[i])).length) { + source = source.join('\n'); + if ((m = re.exec(source))) { + // console.log('Found function in ' + urls[i]); + + return { + 'url': urls[i], + 'line': source.substring(0, m.index).split('\n').length, + 'column': m.index - source.lastIndexOf('\n', m.index) - 1 + }; + } + } + } + + // console.log('no match'); + + return null; + } + + /** + * Determines at which column a code fragment occurs on a line of the + * source code. + * @param {string} fragment The code fragment. + * @param {string} url The URL to search. + * @param {(string|number)} line The line number to examine. + * @return {?number} The column number. + */ + function findSourceInLine(fragment, url, line) { + var source = getSource(url), + re = new RegExp('\\b' + escapeRegExp(fragment) + '\\b'), + m; + + line -= 1; + + if (source && source.length > line && (m = re.exec(source[line]))) { + return m.index; + } + + return null; + } + + /** + * Determines where a function was defined within the source code. + * @param {(Function|string)} func A function reference or serialized + * function definition. + * @return {?Object.<string, (string|number)>} An object containing + * the url, line, and column number of the defined function. + */ + function findSourceByFunctionBody(func) { + var urls = [window.location.href], + scripts = document.getElementsByTagName('script'), + body, + code = '' + func, + codeRE = /^function(?:\s+([\w$]+))?\s*\(([\w\s,]*)\)\s*\{\s*(\S[\s\S]*\S)\s*\}\s*$/, + eventRE = /^function on([\w$]+)\s*\(event\)\s*\{\s*(\S[\s\S]*\S)\s*\}\s*$/, + re, + parts, + result; + + for (var i = 0; i < scripts.length; ++i) { + var script = scripts[i]; + if (script.src) { + urls.push(script.src); + } + } + + if (!(parts = codeRE.exec(code))) { + re = new RegExp(escapeRegExp(code).replace(/\s+/g, '\\s+')); + } + + // not sure if this is really necessary, but I don’t have a test + // corpus large enough to confirm that and it was in the original. + else { + var name = parts[1] ? '\\s+' + parts[1] : '', + args = parts[2].split(',').join('\\s*,\\s*'); + + body = escapeRegExp(parts[3]).replace(/;$/, ';?'); // semicolon is inserted if the function ends with a comment.replace(/\s+/g, '\\s+'); + re = new RegExp('function' + name + '\\s*\\(\\s*' + args + '\\s*\\)\\s*{\\s*' + body + '\\s*}'); + } + + // look for a normal function definition + if ((result = findSourceInUrls(re, urls))) { + return result; + } + + // look for an old-school event handler function + if ((parts = eventRE.exec(code))) { + var event = parts[1]; + body = escapeCodeAsRegExpForMatchingInsideHTML(parts[2]); + + // look for a function defined in HTML as an onXXX handler + re = new RegExp('on' + event + '=[\\\'"]\\s*' + body + '\\s*[\\\'"]', 'i'); + + if ((result = findSourceInUrls(re, urls[0]))) { + return result; + } + + // look for ??? + re = new RegExp(body); + + if ((result = findSourceInUrls(re, urls))) { + return result; + } + } + + return null; + } + + // Contents of Exception in various browsers. + // + // SAFARI: + // ex.message = Can't find variable: qq + // ex.line = 59 + // ex.sourceId = 580238192 + // ex.sourceURL = http://... + // ex.expressionBeginOffset = 96 + // ex.expressionCaretOffset = 98 + // ex.expressionEndOffset = 98 + // ex.name = ReferenceError + // + // FIREFOX: + // ex.message = qq is not defined + // ex.fileName = http://... + // ex.lineNumber = 59 + // ex.stack = ...stack trace... (see the example below) + // ex.name = ReferenceError + // + // CHROME: + // ex.message = qq is not defined + // ex.name = ReferenceError + // ex.type = not_defined + // ex.arguments = ['aa'] + // ex.stack = ...stack trace... + // + // INTERNET EXPLORER: + // ex.message = ... + // ex.name = ReferenceError + // + // OPERA: + // ex.message = ...message... (see the example below) + // ex.name = ReferenceError + // ex.opera#sourceloc = 11 (pretty much useless, duplicates the info in ex.message) + // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace' + + /** + * Computes stack trace information from the stack property. + * Chrome and Gecko use this property. + * @param {Error} ex + * @return {?Object.<string, *>} Stack trace information. + */ + function computeStackTraceFromStackProp(ex) { + if (!ex.stack) { + return null; + } + + var chrome = /^\s*at (?:((?:\[object object\])?\S+) )?\(?((?:file|http|https):.*?):(\d+)(?::(\d+))?\)?\s*$/i, + gecko = /^\s*(\S*)(?:\((.*?)\))?@((?:file|http|https).*?):(\d+)(?::(\d+))?\s*$/i, + lines = ex.stack.split('\n'), + stack = [], + parts, + element, + reference = /^(.*) is undefined$/.exec(ex.message); + + for (var i = 0, j = lines.length; i < j; ++i) { + if ((parts = gecko.exec(lines[i]))) { + element = { + 'url': parts[3], + 'func': parts[1] || UNKNOWN_FUNCTION, + 'args': parts[2] ? parts[2].split(',') : '', + 'line': +parts[4], + 'column': parts[5] ? +parts[5] : null + }; + } else if ((parts = chrome.exec(lines[i]))) { + element = { + 'url': parts[2], + 'func': parts[1] || UNKNOWN_FUNCTION, + 'line': +parts[3], + 'column': parts[4] ? +parts[4] : null + }; + } else { + continue; + } + + if (!element.func && element.line) { + element.func = guessFunctionName(element.url, element.line); + } + + if (element.line) { + element.context = gatherContext(element.url, element.line); + } + + stack.push(element); + } + + if (stack[0] && stack[0].line && !stack[0].column && reference) { + stack[0].column = findSourceInLine(reference[1], stack[0].url, stack[0].line); + } + + if (!stack.length) { + return null; + } + + return { + 'mode': 'stack', + 'name': ex.name, + 'message': ex.message, + 'url': document.location.href, + 'stack': stack, + 'useragent': navigator.userAgent + }; + } + + /** + * Computes stack trace information from the stacktrace property. + * Opera 10 uses this property. + * @param {Error} ex + * @return {?Object.<string, *>} Stack trace information. + */ + function computeStackTraceFromStacktraceProp(ex) { + // Access and store the stacktrace property before doing ANYTHING + // else to it because Opera is not very good at providing it + // reliably in other circumstances. + var stacktrace = ex.stacktrace; + + var testRE = / line (\d+), column (\d+) in (?:<anonymous function: ([^>]+)>|([^\)]+))\((.*)\) in (.*):\s*$/i, + lines = stacktrace.split('\n'), + stack = [], + parts; + + for (var i = 0, j = lines.length; i < j; i += 2) { + if ((parts = testRE.exec(lines[i]))) { + var element = { + 'line': +parts[1], + 'column': +parts[2], + 'func': parts[3] || parts[4], + 'args': parts[5] ? parts[5].split(',') : [], + 'url': parts[6] + }; + + if (!element.func && element.line) { + element.func = guessFunctionName(element.url, element.line); + } + if (element.line) { + try { + element.context = gatherContext(element.url, element.line); + } catch (exc) {} + } + + if (!element.context) { + element.context = [lines[i + 1]]; + } + + stack.push(element); + } + } + + if (!stack.length) { + return null; + } + + return { + 'mode': 'stacktrace', + 'name': ex.name, + 'message': ex.message, + 'url': document.location.href, + 'stack': stack, + 'useragent': navigator.userAgent + }; + } + + /** + * NOT TESTED. + * Computes stack trace information from an error message that includes + * the stack trace. + * Opera 9 and earlier use this method if the option to show stack + * traces is turned on in opera:config. + * @param {Error} ex + * @return {?Object.<string, *>} Stack information. + */ + function computeStackTraceFromOperaMultiLineMessage(ex) { + // Opera includes a stack trace into the exception message. An example is: + // + // Statement on line 3: Undefined variable: undefinedFunc + // Backtrace: + // Line 3 of linked script file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.js: In function zzz + // undefinedFunc(a); + // Line 7 of inline#1 script in file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.html: In function yyy + // zzz(x, y, z); + // Line 3 of inline#1 script in file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.html: In function xxx + // yyy(a, a, a); + // Line 1 of function script + // try { xxx('hi'); return false; } catch(ex) { TraceKit.report(ex); } + // ... + + var lines = ex.message.split('\n'); + if (lines.length < 4) { + return null; + } + + var lineRE1 = /^\s*Line (\d+) of linked script ((?:file|http|https)\S+)(?:: in function (\S+))?\s*$/i, + lineRE2 = /^\s*Line (\d+) of inline#(\d+) script in ((?:file|http|https)\S+)(?:: in function (\S+))?\s*$/i, + lineRE3 = /^\s*Line (\d+) of function script\s*$/i, + stack = [], + scripts = document.getElementsByTagName('script'), + inlineScriptBlocks = [], + parts, + i, + len, + source; + + for (i in scripts) { + if (_has(scripts, i) && !scripts[i].src) { + inlineScriptBlocks.push(scripts[i]); + } + } + + for (i = 2, len = lines.length; i < len; i += 2) { + var item = null; + if ((parts = lineRE1.exec(lines[i]))) { + item = { + 'url': parts[2], + 'func': parts[3], + 'line': +parts[1] + }; + } else if ((parts = lineRE2.exec(lines[i]))) { + item = { + 'url': parts[3], + 'func': parts[4] + }; + var relativeLine = (+parts[1]); // relative to the start of the <SCRIPT> block + var script = inlineScriptBlocks[parts[2] - 1]; + if (script) { + source = getSource(item.url); + if (source) { + source = source.join('\n'); + var pos = source.indexOf(script.innerText); + if (pos >= 0) { + item.line = relativeLine + source.substring(0, pos).split('\n').length; + } + } + } + } else if ((parts = lineRE3.exec(lines[i]))) { + var url = window.location.href.replace(/#.*$/, ''), + line = parts[1]; + var re = new RegExp(escapeCodeAsRegExpForMatchingInsideHTML(lines[i + 1])); + source = findSourceInUrls(re, [url]); + item = { + 'url': url, + 'line': source ? source.line : line, + 'func': '' + }; + } + + if (item) { + if (!item.func) { + item.func = guessFunctionName(item.url, item.line); + } + var context = gatherContext(item.url, item.line); + var midline = (context ? context[Math.floor(context.length / 2)] : null); + if (context && midline.replace(/^\s*/, '') === lines[i + 1].replace(/^\s*/, '')) { + item.context = context; + } else { + // if (context) alert("Context mismatch. Correct midline:\n" + lines[i+1] + "\n\nMidline:\n" + midline + "\n\nContext:\n" + context.join("\n") + "\n\nURL:\n" + item.url); + item.context = [lines[i + 1]]; + } + stack.push(item); + } + } + if (!stack.length) { + return null; // could not parse multiline exception message as Opera stack trace + } + + return { + 'mode': 'multiline', + 'name': ex.name, + 'message': lines[0], + 'url': document.location.href, + 'stack': stack, + 'useragent': navigator.userAgent + }; + } + + /** + * Adds information about the first frame to incomplete stack traces. + * Safari and IE require this to get complete data on the first frame. + * @param {Object.<string, *>} stackInfo Stack trace information from + * one of the compute* methods. + * @param {string} url The URL of the script that caused an error. + * @param {(number|string)} lineNo The line number of the script that + * caused an error. + * @param {string=} message The error generated by the browser, which + * hopefully contains the name of the object that caused the error. + * @return {boolean} Whether or not the stack information was + * augmented. + */ + function augmentStackTraceWithInitialElement(stackInfo, url, lineNo, message) { + var initial = { + 'url': url, + 'line': lineNo + }; + + if (initial.url && initial.line) { + stackInfo.incomplete = false; + + if (!initial.func) { + initial.func = guessFunctionName(initial.url, initial.line); + } + + if (!initial.context) { + initial.context = gatherContext(initial.url, initial.line); + } + + var reference = / '([^']+)' /.exec(message); + if (reference) { + initial.column = findSourceInLine(reference[1], initial.url, initial.line); + } + + if (stackInfo.stack.length > 0) { + if (stackInfo.stack[0].url === initial.url) { + if (stackInfo.stack[0].line === initial.line) { + return false; // already in stack trace + } else if (!stackInfo.stack[0].line && stackInfo.stack[0].func === initial.func) { + stackInfo.stack[0].line = initial.line; + stackInfo.stack[0].context = initial.context; + return false; + } + } + } + + stackInfo.stack.unshift(initial); + stackInfo.partial = true; + return true; + } else { + stackInfo.incomplete = true; + } + + return false; + } + + /** + * Computes stack trace information by walking the arguments.caller + * chain at the time the exception occurred. This will cause earlier + * frames to be missed but is the only way to get any stack trace in + * Safari and IE. The top frame is restored by + * {@link augmentStackTraceWithInitialElement}. + * @param {Error} ex + * @return {?Object.<string, *>} Stack trace information. + */ + function computeStackTraceByWalkingCallerChain(ex, depth) { + var functionName = /function\s+([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?\s*\(/i, + stack = [], + funcs = {}, + recursion = false, + parts, + item, + source; + + for (var curr = computeStackTraceByWalkingCallerChain.caller; curr && !recursion; curr = curr.caller) { + if (curr === computeStackTrace || curr === TraceKit.report) { + // console.log('skipping internal function'); + continue; + } + + item = { + 'url': null, + 'func': UNKNOWN_FUNCTION, + 'line': null, + 'column': null + }; + + if (curr.name) { + item.func = curr.name; + } else if ((parts = functionName.exec(curr.toString()))) { + item.func = parts[1]; + } + + if ((source = findSourceByFunctionBody(curr))) { + item.url = source.url; + item.line = source.line; + + if (item.func === UNKNOWN_FUNCTION) { + item.func = guessFunctionName(item.url, item.line); + } + + var reference = / '([^']+)' /.exec(ex.message || ex.description); + if (reference) { + item.column = findSourceInLine(reference[1], source.url, source.line); + } + } + + if (funcs['' + curr]) { + recursion = true; + }else{ + funcs['' + curr] = true; + } + + stack.push(item); + } + + if (depth) { + // console.log('depth is ' + depth); + // console.log('stack is ' + stack.length); + stack.splice(0, depth); + } + + var result = { + 'mode': 'callers', + 'name': ex.name, + 'message': ex.message, + 'url': document.location.href, + 'stack': stack, + 'useragent': navigator.userAgent + }; + augmentStackTraceWithInitialElement(result, ex.sourceURL || ex.fileName, ex.line || ex.lineNumber, ex.message || ex.description); + return result; + } + + /** + * Computes a stack trace for an exception. + * @param {Error} ex + * @param {(string|number)=} depth + */ + function computeStackTrace(ex, depth) { + var stack = null; + depth = (depth == null ? 0 : +depth); + + try { + // This must be tried first because Opera 10 *destroys* + // its stacktrace property if you try to access the stack + // property first!! + stack = computeStackTraceFromStacktraceProp(ex); + if (stack) { + return stack; + } + } catch (e) { + if (debug) { + throw e; + } + } + + try { + stack = computeStackTraceFromStackProp(ex); + if (stack) { + return stack; + } + } catch (e) { + if (debug) { + throw e; + } + } + + try { + stack = computeStackTraceFromOperaMultiLineMessage(ex); + if (stack) { + return stack; + } + } catch (e) { + if (debug) { + throw e; + } + } + + try { + stack = computeStackTraceByWalkingCallerChain(ex, depth + 1); + if (stack) { + return stack; + } + } catch (e) { + if (debug) { + throw e; + } + } + + return { + 'mode': 'failed' + }; + } + + /** + * Logs a stacktrace starting from the previous call and working down. + * @param {(number|string)=} depth How many frames deep to trace. + * @return {Object.<string, *>} Stack trace information. + */ + function computeStackTraceOfCaller(depth) { + depth = (depth == null ? 0 : +depth) + 1; // "+ 1" because "ofCaller" should drop one frame + try { + throw new Error(); + } catch (ex) { + return computeStackTrace(ex, depth + 1); + } + + return null; + } + + computeStackTrace.augmentStackTraceWithInitialElement = augmentStackTraceWithInitialElement; + computeStackTrace.guessFunctionName = guessFunctionName; + computeStackTrace.gatherContext = gatherContext; + computeStackTrace.ofCaller = computeStackTraceOfCaller; + + return computeStackTrace; +}()); + +/** + * Extends support for global error handling for asynchronous browser + * functions. Adopted from Closure Library's errorhandler.js + */ +(function extendToAsynchronousCallbacks() { + var _helper = function _helper(fnName) { + var originalFn = window[fnName]; + window[fnName] = function traceKitAsyncExtension() { + // Make a copy of the arguments + var args = _slice.call(arguments); + var originalCallback = args[0]; + if (typeof (originalCallback) === 'function') { + args[0] = TraceKit.wrap(originalCallback); + } + // IE < 9 doesn't support .call/.apply on setInterval/setTimeout, but it + // also only supports 2 argument and doesn't care what "this" is, so we + // can just call the original function directly. + if (originalFn.apply) { + return originalFn.apply(this, args); + } else { + return originalFn(args[0], args[1]); + } + }; + }; + + _helper('setTimeout'); + _helper('setInterval'); +}()); + +/** + * Extended support for backtraces and global error handling for most + * asynchronous jQuery functions. + */ +(function traceKitAsyncForjQuery($) { + + // quit if jQuery isn't on the page + if (!$) { + return; + } + + var _oldEventAdd = $.event.add; + $.event.add = function traceKitEventAdd(elem, types, handler, data, selector) { + var _handler; + + if (handler.handler) { + _handler = handler.handler; + handler.handler = TraceKit.wrap(handler.handler); + } else { + _handler = handler; + handler = TraceKit.wrap(handler); + } + + // If the handler we are attaching doesn’t have the same guid as + // the original, it will never be removed when someone tries to + // unbind the original function later. Technically as a result of + // this our guids are no longer globally unique, but whatever, that + // never hurt anybody RIGHT?! + if (_handler.guid) { + handler.guid = _handler.guid; + } else { + handler.guid = _handler.guid = $.guid++; + } + + return _oldEventAdd.call(this, elem, types, handler, data, selector); + }; + + var _oldReady = $.fn.ready; + $.fn.ready = function traceKitjQueryReadyWrapper(fn) { + return _oldReady.call(this, TraceKit.wrap(fn)); + }; + + var _oldAjax = $.ajax; + $.ajax = function traceKitAjaxWrapper(url, options) { + var keys = ['complete', 'error', 'success'], key; + + // Taken from https://github.com/jquery/jquery/blob/eee2eaf1d7a189d99106423a4206c224ebd5b848/src/ajax.js#L311-L318 + // If url is an object, simulate pre-1.5 signature + if (typeof url === 'object') { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + while(key = keys.pop()) { + if ($.isFunction(options[key])) { + options[key] = TraceKit.wrap(options[key]); + } + } + + try { + return _oldAjax.call(this, url, options); + } catch (e) { + TraceKit.report(e); + throw e; + } + }; + +}(window.jQuery)); + +//Default options: +if (!TraceKit.remoteFetching) { + TraceKit.remoteFetching = true; +} +if (!TraceKit.collectWindowErrors) { + TraceKit.collectWindowErrors = true; +} +if (!TraceKit.linesOfContext || TraceKit.linesOfContext < 1) { + // 5 lines before, the offending line, 5 lines after + TraceKit.linesOfContext = 11; +} + + + +// Export to global object +window.TraceKit = TraceKit; + +}(window)); +;(function(window, undefined){ +'use strict'; + +// First, check for JSON support +// If there is no JSON, we no-op the core features of Raven +// since JSON is required to encode the payload +var _Raven = window.Raven, + hasJSON = !isUndefined(window.JSON), + globalServer, + globalUser, + globalKey, + globalProject, + globalOptions = { + logger: 'javascript', + ignoreErrors: [], + ignoreUrls: [] + }; + +var TK = TraceKit.noConflict(); + +// Disable Tracekit's remote fetching by default +TK.remoteFetching = false; + +/* + * The core Raven singleton + * + * @this {Raven} + */ +var Raven = { + VERSION: '1.0.8', + + /* + * Allow multiple versions of Raven to be installed. + * Strip Raven from the global context and returns the instance. + * + * @return {Raven} + */ + noConflict: function() { + window.Raven = _Raven; + return Raven; + }, + + /* + * Configure Raven with a DSN and extra options + * + * @param {string} dsn The public Sentry DSN + * @param {object} options Optional set of of global options [optional] + * @return {Raven} + */ + config: function(dsn, options) { + var uri = parseUri(dsn), + lastSlash = uri.path.lastIndexOf('/'), + path = uri.path.substr(1, lastSlash); + + if (options && options.ignoreErrors && window.console && console.warn) { + console.warn('DeprecationWarning: `ignoreErrors` is going to be removed soon.'); + } + + // merge in options + if (options) { + each(options, function(key, value){ + globalOptions[key] = value; + }); + } + + // "Script error." is hard coded into browsers for errors that it can't read. + // this is the result of a script being pulled in from an external domain and CORS. + globalOptions.ignoreErrors.push('Script error.'); + + globalKey = uri.user; + globalProject = ~~uri.path.substr(lastSlash + 1); + + // assemble the endpoint from the uri pieces + globalServer = '//' + uri.host + + (uri.port ? ':' + uri.port : '') + + '/' + path + 'api/' + globalProject + '/store/'; + + if (uri.protocol) { + globalServer = uri.protocol + ':' + globalServer; + } + + if (globalOptions.fetchContext) { + TK.remoteFetching = true; + } + + // return for chaining + return Raven; + }, + + /* + * Installs a global window.onerror error handler + * to capture and report uncaught exceptions. + * At this point, install() is required to be called due + * to the way TraceKit is set up. + * + * @return {Raven} + */ + install: function() { + if (!isSetup()) return; + + TK.report.subscribe(handleStackInfo); + + return Raven; + }, + + /* + * Wrap code within a context so Raven can capture errors + * reliably across domains that is executed immediately. + * + * @param {object} options A specific set of options for this context [optional] + * @param {function} func The callback to be immediately executed within the context + * @param {array} args An array of arguments to be called with the callback [optional] + */ + context: function(options, func, args) { + if (isFunction(options)) { + args = func || []; + func = options; + options = undefined; + } + + Raven.wrap(options, func).apply(this, args); + }, + + /* + * Wrap code within a context and returns back a new function to be executed + * + * @param {object} options A specific set of options for this context [optional] + * @param {function} func The function to be wrapped in a new context + * @return {function} The newly wrapped functions with a context + */ + wrap: function(options, func) { + // options is optional + if (isFunction(options)) { + func = options; + options = undefined; + } + + return function() { + try { + func.apply(this, arguments); + } catch(e) { + Raven.captureException(e, options); + throw e; + } + }; + }, + + /* + * Uninstalls the global error handler. + * + * @return {Raven} + */ + uninstall: function() { + TK.report.unsubscribe(handleStackInfo); + + return Raven; + }, + + /* + * Manually capture an exception and send it over to Sentry + * + * @param {error} ex An exception to be logged + * @param {object} options A specific set of options for this error [optional] + * @return {Raven} + */ + captureException: function(ex, options) { + // If a string is passed through, recall as a message + if (typeof ex === 'string') { + return Raven.captureMessage(ex, options); + } + + // TraceKit.report will re-raise any exception passed to it, + // which means you have to wrap it in try/catch. Instead, we + // can wrap it here and only re-raise if TraceKit.report + // raises an exception different from the one we asked to + // report on. + try { + TK.report(ex, options); + } catch(ex1) { + if(ex !== ex1) { + throw ex1; + } + } + + return Raven; + }, + + /* + * Manually send a message to Sentry + * + * @param {string} msg A plain message to be captured in Sentry + * @param {object} options A specific set of options for this message [optional] + * @return {Raven} + */ + captureMessage: function(msg, options) { + // Fire away! + send( + arrayMerge({ + message: msg + }, options) + ); + + return Raven; + }, + + /* + * Set/clear a user to be sent along with the payload. + * + * @param {object} user An object representing user data [optional] + * @return {Raven} + */ + setUser: function(user) { + globalUser = user; + + return Raven; + } +}; + +var uriKeys = 'source protocol authority userInfo user password host port relative path directory file query anchor'.split(' '), + uriPattern = /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/; + +/**** Private functions ****/ +function parseUri(str) { + var m = uriPattern.exec(str), + uri = {}, + i = 14; + + while (i--) uri[uriKeys[i]] = m[i] || ''; + + return uri; +} + +function isUndefined(what) { + return typeof what === 'undefined'; +} + +function isFunction(what) { + return typeof what === 'function'; +} + +function each(obj, callback) { + var i, j; + + if (isUndefined(obj.length)) { + for (i in obj) { + if (obj.hasOwnProperty(i)) { + callback.call(null, i, obj[i]); + } + } + } else { + for (i = 0, j = obj.length; i < j; i++) { + callback.call(null, i, obj[i]); + } + } +} + +var cachedAuth; + +function getAuthQueryString() { + if (cachedAuth) return cachedAuth; + + var qs = [ + 'sentry_version=2.0', + 'sentry_client=raven-js/' + Raven.VERSION + ]; + if (globalKey) { + qs.push('sentry_key=' + globalKey); + } + + cachedAuth = '?' + qs.join('&'); + return cachedAuth; +} + +function handleStackInfo(stackInfo, options) { + var frames = [], + i = 0, + j, frame; + + if (stackInfo.stack && (j = stackInfo.stack.length)) { + for (; i < j; i++) { + frame = normalizeFrame(stackInfo.stack[i]); + if (frame) { + frames.push(frame); + } + } + } + + processException( + stackInfo.name, + stackInfo.message, + stackInfo.url, + stackInfo.lineno, + frames, + options + ); +} + +function normalizeFrame(frame) { + if (!frame.url) return; + + // normalize the frames data + var normalized = { + filename: frame.url, + lineno: frame.line, + colno: frame.column, + 'function': frame.func || '?' + }, context = extractContextFromFrame(frame); + + if (context) { + var i = 3, keys = ['pre_context', 'context_line', 'post_context']; + while (i--) normalized[keys[i]] = context[i]; + } + + normalized.in_app = !/(Raven|TraceKit)\./.test(normalized['function']); + + return normalized; +} + +function extractContextFromFrame(frame) { + // immediately check if we should even attempt to parse a context + if (!frame.context || !globalOptions.fetchContext) return; + + var context = frame.context, + pivot = ~~(context.length / 2), + i = context.length, isMinified = false; + + while (i--) { + // We're making a guess to see if the source is minified or not. + // To do that, we make the assumption if *any* of the lines passed + // in are greater than 300 characters long, we bail. + // Sentry will see that there isn't a context + if (context[i].length > 300) { + isMinified = true; + break; + } + } + + if (isMinified) { + // The source is minified and we don't know which column. Fuck it. + if (isUndefined(frame.column)) return; + + // If the source is minified and has a frame column + // we take a chunk of the offending line to hopefully shed some light + return [ + [], // no pre_context + context[pivot].substr(frame.column, 50), // grab 50 characters, starting at the offending column + [] // no post_context + ]; + } + + return [ + context.slice(0, pivot), // pre_context + context[pivot], // context_line + context.slice(pivot + 1) // post_context + ]; +} + +function processException(type, message, fileurl, lineno, frames, options) { + var stacktrace, label, i; + + // IE8 really doesn't have Array.prototype.indexOf + // Filter out a message that matches our ignore list + i = globalOptions.ignoreErrors.length; + while (i--) { + if (message === globalOptions.ignoreErrors[i]) { + return; + } + } + + if (frames && frames.length) { + stacktrace = {frames: frames}; + fileurl = fileurl || frames[0].filename; + } else if (fileurl) { + stacktrace = { + frames: [{ + filename: fileurl, + lineno: lineno + }] + }; + } + + i = globalOptions.ignoreUrls.length; + while (i--) { + if (globalOptions.ignoreUrls[i].test(fileurl)) { + return; + } + } + + label = lineno ? message + ' at ' + lineno : message; + + // Fire away! + send( + arrayMerge({ + 'sentry.interfaces.Exception': { + type: type, + value: message + }, + 'sentry.interfaces.Stacktrace': stacktrace, + culprit: fileurl, + message: label + }, options) + ); +} + +function arrayMerge(arr1, arr2) { + if (!arr2) { + return arr1; + } + each(arr2, function(key, value){ + arr1[key] = value; + }); + return arr1; +} + +function getHttpData() { + var http = { + url: window.location.href, + headers: { + 'User-Agent': navigator.userAgent + } + }; + + if (window.document.referrer) { + http.headers.Referer = window.document.referrer; + } + + return http; +} + +function send(data) { + if (!isSetup()) return; + + data = arrayMerge({ + project: globalProject, + logger: globalOptions.logger, + site: globalOptions.site, + platform: 'javascript', + 'sentry.interfaces.Http': getHttpData() + }, data); + + if (globalUser) data['sentry.interfaces.User'] = globalUser; + + if (isFunction(globalOptions.dataCallback)) { + data = globalOptions.dataCallback(data); + } + + makeRequest(data); +} + +function makeRequest(data) { + new Image().src = globalServer + getAuthQueryString() + '&sentry_data=' + encodeURIComponent(JSON.stringify(data)); +} + +function isSetup() { + if (!hasJSON) return false; // needs JSON support + if (!globalServer) { + if (window.console && console.error) { + console.error("Error: Raven has not been configured."); + } + return false; + } + return true; +} + +// Expose Raven to the world +window.Raven = Raven; + +// AMD +if (typeof define === 'function' && define.amd) { + define('raven', [], function() { return Raven; }); +} + +})(window); diff --git a/hub/static/js/lib/socket.io.js b/hub/static/js/lib/socket.io.js new file mode 100644 index 0000000..9e11e3e --- /dev/null +++ b/hub/static/js/lib/socket.io.js @@ -0,0 +1,3873 @@ +/*! Socket.IO.js build:0.9.16, development. Copyright(c) 2011 LearnBoost <dev@learnboost.com> MIT Licensed */ + +var io = ('undefined' === typeof module ? {} : module.exports); +(function() { + +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, global) { + + /** + * IO namespace. + * + * @namespace + */ + + var io = exports; + + /** + * Socket.IO version + * + * @api public + */ + + io.version = '0.9.16'; + + /** + * Protocol implemented. + * + * @api public + */ + + io.protocol = 1; + + /** + * Available transports, these will be populated with the available transports + * + * @api public + */ + + io.transports = []; + + /** + * Keep track of jsonp callbacks. + * + * @api private + */ + + io.j = []; + + /** + * Keep track of our io.Sockets + * + * @api private + */ + io.sockets = {}; + + + /** + * Manages connections to hosts. + * + * @param {String} uri + * @Param {Boolean} force creation of new socket (defaults to false) + * @api public + */ + + io.connect = function (host, details) { + var uri = io.util.parseUri(host) + , uuri + , socket; + + if (global && global.location) { + uri.protocol = uri.protocol || global.location.protocol.slice(0, -1); + uri.host = uri.host || (global.document + ? global.document.domain : global.location.hostname); + uri.port = uri.port || global.location.port; + } + + uuri = io.util.uniqueUri(uri); + + var options = { + host: uri.host + , secure: 'https' == uri.protocol + , port: uri.port || ('https' == uri.protocol ? 443 : 80) + , query: uri.query || '' + }; + + io.util.merge(options, details); + + if (options['force new connection'] || !io.sockets[uuri]) { + socket = new io.Socket(options); + } + + if (!options['force new connection'] && socket) { + io.sockets[uuri] = socket; + } + + socket = socket || io.sockets[uuri]; + + // if path is different from '' or / + return socket.of(uri.path.length > 1 ? uri.path : ''); + }; + +})('object' === typeof module ? module.exports : (this.io = {}), this); +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, global) { + + /** + * Utilities namespace. + * + * @namespace + */ + + var util = exports.util = {}; + + /** + * Parses an URI + * + * @author Steven Levithan <stevenlevithan.com> (MIT license) + * @api public + */ + + var re = /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/; + + var parts = ['source', 'protocol', 'authority', 'userInfo', 'user', 'password', + 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', + 'anchor']; + + util.parseUri = function (str) { + var m = re.exec(str || '') + , uri = {} + , i = 14; + + while (i--) { + uri[parts[i]] = m[i] || ''; + } + + return uri; + }; + + /** + * Produces a unique url that identifies a Socket.IO connection. + * + * @param {Object} uri + * @api public + */ + + util.uniqueUri = function (uri) { + var protocol = uri.protocol + , host = uri.host + , port = uri.port; + + if ('document' in global) { + host = host || document.domain; + port = port || (protocol == 'https' + && document.location.protocol !== 'https:' ? 443 : document.location.port); + } else { + host = host || 'localhost'; + + if (!port && protocol == 'https') { + port = 443; + } + } + + return (protocol || 'http') + '://' + host + ':' + (port || 80); + }; + + /** + * Mergest 2 query strings in to once unique query string + * + * @param {String} base + * @param {String} addition + * @api public + */ + + util.query = function (base, addition) { + var query = util.chunkQuery(base || '') + , components = []; + + util.merge(query, util.chunkQuery(addition || '')); + for (var part in query) { + if (query.hasOwnProperty(part)) { + components.push(part + '=' + query[part]); + } + } + + return components.length ? '?' + components.join('&') : ''; + }; + + /** + * Transforms a querystring in to an object + * + * @param {String} qs + * @api public + */ + + util.chunkQuery = function (qs) { + var query = {} + , params = qs.split('&') + , i = 0 + , l = params.length + , kv; + + for (; i < l; ++i) { + kv = params[i].split('='); + if (kv[0]) { + query[kv[0]] = kv[1]; + } + } + + return query; + }; + + /** + * Executes the given function when the page is loaded. + * + * io.util.load(function () { console.log('page loaded'); }); + * + * @param {Function} fn + * @api public + */ + + var pageLoaded = false; + + util.load = function (fn) { + if ('document' in global && document.readyState === 'complete' || pageLoaded) { + return fn(); + } + + util.on(global, 'load', fn, false); + }; + + /** + * Adds an event. + * + * @api private + */ + + util.on = function (element, event, fn, capture) { + if (element.attachEvent) { + element.attachEvent('on' + event, fn); + } else if (element.addEventListener) { + element.addEventListener(event, fn, capture); + } + }; + + /** + * Generates the correct `XMLHttpRequest` for regular and cross domain requests. + * + * @param {Boolean} [xdomain] Create a request that can be used cross domain. + * @returns {XMLHttpRequest|false} If we can create a XMLHttpRequest. + * @api private + */ + + util.request = function (xdomain) { + + if (xdomain && 'undefined' != typeof XDomainRequest && !util.ua.hasCORS) { + return new XDomainRequest(); + } + + if ('undefined' != typeof XMLHttpRequest && (!xdomain || util.ua.hasCORS)) { + return new XMLHttpRequest(); + } + + if (!xdomain) { + try { + return new window[(['Active'].concat('Object').join('X'))]('Microsoft.XMLHTTP'); + } catch(e) { } + } + + return null; + }; + + /** + * XHR based transport constructor. + * + * @constructor + * @api public + */ + + /** + * Change the internal pageLoaded value. + */ + + if ('undefined' != typeof window) { + util.load(function () { + pageLoaded = true; + }); + } + + /** + * Defers a function to ensure a spinner is not displayed by the browser + * + * @param {Function} fn + * @api public + */ + + util.defer = function (fn) { + if (!util.ua.webkit || 'undefined' != typeof importScripts) { + return fn(); + } + + util.load(function () { + setTimeout(fn, 100); + }); + }; + + /** + * Merges two objects. + * + * @api public + */ + + util.merge = function merge (target, additional, deep, lastseen) { + var seen = lastseen || [] + , depth = typeof deep == 'undefined' ? 2 : deep + , prop; + + for (prop in additional) { + if (additional.hasOwnProperty(prop) && util.indexOf(seen, prop) < 0) { + if (typeof target[prop] !== 'object' || !depth) { + target[prop] = additional[prop]; + seen.push(additional[prop]); + } else { + util.merge(target[prop], additional[prop], depth - 1, seen); + } + } + } + + return target; + }; + + /** + * Merges prototypes from objects + * + * @api public + */ + + util.mixin = function (ctor, ctor2) { + util.merge(ctor.prototype, ctor2.prototype); + }; + + /** + * Shortcut for prototypical and static inheritance. + * + * @api private + */ + + util.inherit = function (ctor, ctor2) { + function f() {}; + f.prototype = ctor2.prototype; + ctor.prototype = new f; + }; + + /** + * Checks if the given object is an Array. + * + * io.util.isArray([]); // true + * io.util.isArray({}); // false + * + * @param Object obj + * @api public + */ + + util.isArray = Array.isArray || function (obj) { + return Object.prototype.toString.call(obj) === '[object Array]'; + }; + + /** + * Intersects values of two arrays into a third + * + * @api public + */ + + util.intersect = function (arr, arr2) { + var ret = [] + , longest = arr.length > arr2.length ? arr : arr2 + , shortest = arr.length > arr2.length ? arr2 : arr; + + for (var i = 0, l = shortest.length; i < l; i++) { + if (~util.indexOf(longest, shortest[i])) + ret.push(shortest[i]); + } + + return ret; + }; + + /** + * Array indexOf compatibility. + * + * @see bit.ly/a5Dxa2 + * @api public + */ + + util.indexOf = function (arr, o, i) { + + for (var j = arr.length, i = i < 0 ? i + j < 0 ? 0 : i + j : i || 0; + i < j && arr[i] !== o; i++) {} + + return j <= i ? -1 : i; + }; + + /** + * Converts enumerables to array. + * + * @api public + */ + + util.toArray = function (enu) { + var arr = []; + + for (var i = 0, l = enu.length; i < l; i++) + arr.push(enu[i]); + + return arr; + }; + + /** + * UA / engines detection namespace. + * + * @namespace + */ + + util.ua = {}; + + /** + * Whether the UA supports CORS for XHR. + * + * @api public + */ + + util.ua.hasCORS = 'undefined' != typeof XMLHttpRequest && (function () { + try { + var a = new XMLHttpRequest(); + } catch (e) { + return false; + } + + return a.withCredentials != undefined; + })(); + + /** + * Detect webkit. + * + * @api public + */ + + util.ua.webkit = 'undefined' != typeof navigator + && /webkit/i.test(navigator.userAgent); + + /** + * Detect iPad/iPhone/iPod. + * + * @api public + */ + + util.ua.iDevice = 'undefined' != typeof navigator + && /iPad|iPhone|iPod/i.test(navigator.userAgent); + +})('undefined' != typeof io ? io : module.exports, this); +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.EventEmitter = EventEmitter; + + /** + * Event emitter constructor. + * + * @api public. + */ + + function EventEmitter () {}; + + /** + * Adds a listener + * + * @api public + */ + + EventEmitter.prototype.on = function (name, fn) { + if (!this.$events) { + this.$events = {}; + } + + if (!this.$events[name]) { + this.$events[name] = fn; + } else if (io.util.isArray(this.$events[name])) { + this.$events[name].push(fn); + } else { + this.$events[name] = [this.$events[name], fn]; + } + + return this; + }; + + EventEmitter.prototype.addListener = EventEmitter.prototype.on; + + /** + * Adds a volatile listener. + * + * @api public + */ + + EventEmitter.prototype.once = function (name, fn) { + var self = this; + + function on () { + self.removeListener(name, on); + fn.apply(this, arguments); + }; + + on.listener = fn; + this.on(name, on); + + return this; + }; + + /** + * Removes a listener. + * + * @api public + */ + + EventEmitter.prototype.removeListener = function (name, fn) { + if (this.$events && this.$events[name]) { + var list = this.$events[name]; + + if (io.util.isArray(list)) { + var pos = -1; + + for (var i = 0, l = list.length; i < l; i++) { + if (list[i] === fn || (list[i].listener && list[i].listener === fn)) { + pos = i; + break; + } + } + + if (pos < 0) { + return this; + } + + list.splice(pos, 1); + + if (!list.length) { + delete this.$events[name]; + } + } else if (list === fn || (list.listener && list.listener === fn)) { + delete this.$events[name]; + } + } + + return this; + }; + + /** + * Removes all listeners for an event. + * + * @api public + */ + + EventEmitter.prototype.removeAllListeners = function (name) { + if (name === undefined) { + this.$events = {}; + return this; + } + + if (this.$events && this.$events[name]) { + this.$events[name] = null; + } + + return this; + }; + + /** + * Gets all listeners for a certain event. + * + * @api publci + */ + + EventEmitter.prototype.listeners = function (name) { + if (!this.$events) { + this.$events = {}; + } + + if (!this.$events[name]) { + this.$events[name] = []; + } + + if (!io.util.isArray(this.$events[name])) { + this.$events[name] = [this.$events[name]]; + } + + return this.$events[name]; + }; + + /** + * Emits an event. + * + * @api public + */ + + EventEmitter.prototype.emit = function (name) { + if (!this.$events) { + return false; + } + + var handler = this.$events[name]; + + if (!handler) { + return false; + } + + var args = Array.prototype.slice.call(arguments, 1); + + if ('function' == typeof handler) { + handler.apply(this, args); + } else if (io.util.isArray(handler)) { + var listeners = handler.slice(); + + for (var i = 0, l = listeners.length; i < l; i++) { + listeners[i].apply(this, args); + } + } else { + return false; + } + + return true; + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +/** + * Based on JSON2 (http://www.JSON.org/js.html). + */ + +(function (exports, nativeJSON) { + "use strict"; + + // use native JSON if it's available + if (nativeJSON && nativeJSON.parse){ + return exports.JSON = { + parse: nativeJSON.parse + , stringify: nativeJSON.stringify + }; + } + + var JSON = exports.JSON = {}; + + function f(n) { + // Format integers to have at least two digits. + return n < 10 ? '0' + n : n; + } + + function date(d, key) { + return isFinite(d.valueOf()) ? + d.getUTCFullYear() + '-' + + f(d.getUTCMonth() + 1) + '-' + + f(d.getUTCDate()) + 'T' + + f(d.getUTCHours()) + ':' + + f(d.getUTCMinutes()) + ':' + + f(d.getUTCSeconds()) + 'Z' : null; + }; + + var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + gap, + indent, + meta = { // table of character substitutions + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '\\': '\\\\' + }, + rep; + + + function quote(string) { + +// If the string contains no control characters, no quote characters, and no +// backslash characters, then we can safely slap some quotes around it. +// Otherwise we must also replace the offending characters with safe escape +// sequences. + + escapable.lastIndex = 0; + return escapable.test(string) ? '"' + string.replace(escapable, function (a) { + var c = meta[a]; + return typeof c === 'string' ? c : + '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }) + '"' : '"' + string + '"'; + } + + + function str(key, holder) { + +// Produce a string from holder[key]. + + var i, // The loop counter. + k, // The member key. + v, // The member value. + length, + mind = gap, + partial, + value = holder[key]; + +// If the value has a toJSON method, call it to obtain a replacement value. + + if (value instanceof Date) { + value = date(key); + } + +// If we were called with a replacer function, then call the replacer to +// obtain a replacement value. + + if (typeof rep === 'function') { + value = rep.call(holder, key, value); + } + +// What happens next depends on the value's type. + + switch (typeof value) { + case 'string': + return quote(value); + + case 'number': + +// JSON numbers must be finite. Encode non-finite numbers as null. + + return isFinite(value) ? String(value) : 'null'; + + case 'boolean': + case 'null': + +// If the value is a boolean or null, convert it to a string. Note: +// typeof null does not produce 'null'. The case is included here in +// the remote chance that this gets fixed someday. + + return String(value); + +// If the type is 'object', we might be dealing with an object or an array or +// null. + + case 'object': + +// Due to a specification blunder in ECMAScript, typeof null is 'object', +// so watch out for that case. + + if (!value) { + return 'null'; + } + +// Make an array to hold the partial results of stringifying this object value. + + gap += indent; + partial = []; + +// Is the value an array? + + if (Object.prototype.toString.apply(value) === '[object Array]') { + +// The value is an array. Stringify every element. Use null as a placeholder +// for non-JSON values. + + length = value.length; + for (i = 0; i < length; i += 1) { + partial[i] = str(i, value) || 'null'; + } + +// Join all of the elements together, separated with commas, and wrap them in +// brackets. + + v = partial.length === 0 ? '[]' : gap ? + '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : + '[' + partial.join(',') + ']'; + gap = mind; + return v; + } + +// If the replacer is an array, use it to select the members to be stringified. + + if (rep && typeof rep === 'object') { + length = rep.length; + for (i = 0; i < length; i += 1) { + if (typeof rep[i] === 'string') { + k = rep[i]; + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } else { + +// Otherwise, iterate through all of the keys in the object. + + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } + +// Join all of the member texts together, separated with commas, +// and wrap them in braces. + + v = partial.length === 0 ? '{}' : gap ? + '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : + '{' + partial.join(',') + '}'; + gap = mind; + return v; + } + } + +// If the JSON object does not yet have a stringify method, give it one. + + JSON.stringify = function (value, replacer, space) { + +// The stringify method takes a value and an optional replacer, and an optional +// space parameter, and returns a JSON text. The replacer can be a function +// that can replace values, or an array of strings that will select the keys. +// A default replacer method can be provided. Use of the space parameter can +// produce text that is more easily readable. + + var i; + gap = ''; + indent = ''; + +// If the space parameter is a number, make an indent string containing that +// many spaces. + + if (typeof space === 'number') { + for (i = 0; i < space; i += 1) { + indent += ' '; + } + +// If the space parameter is a string, it will be used as the indent string. + + } else if (typeof space === 'string') { + indent = space; + } + +// If there is a replacer, it must be a function or an array. +// Otherwise, throw an error. + + rep = replacer; + if (replacer && typeof replacer !== 'function' && + (typeof replacer !== 'object' || + typeof replacer.length !== 'number')) { + throw new Error('JSON.stringify'); + } + +// Make a fake root object containing our value under the key of ''. +// Return the result of stringifying the value. + + return str('', {'': value}); + }; + +// If the JSON object does not yet have a parse method, give it one. + + JSON.parse = function (text, reviver) { + // The parse method takes a text and an optional reviver function, and returns + // a JavaScript value if the text is a valid JSON text. + + var j; + + function walk(holder, key) { + + // The walk method is used to recursively walk the resulting structure so + // that modifications can be made. + + var k, v, value = holder[key]; + if (value && typeof value === 'object') { + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = walk(value, k); + if (v !== undefined) { + value[k] = v; + } else { + delete value[k]; + } + } + } + } + return reviver.call(holder, key, value); + } + + + // Parsing happens in four stages. In the first stage, we replace certain + // Unicode characters with escape sequences. JavaScript handles many characters + // incorrectly, either silently deleting them, or treating them as line endings. + + text = String(text); + cx.lastIndex = 0; + if (cx.test(text)) { + text = text.replace(cx, function (a) { + return '\\u' + + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }); + } + + // In the second stage, we run the text against regular expressions that look + // for non-JSON patterns. We are especially concerned with '()' and 'new' + // because they can cause invocation, and '=' because it can cause mutation. + // But just to be safe, we want to reject all unexpected forms. + + // We split the second stage into 4 regexp operations in order to work around + // crippling inefficiencies in IE's and Safari's regexp engines. First we + // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we + // replace all simple value tokens with ']' characters. Third, we delete all + // open brackets that follow a colon or comma or that begin the text. Finally, + // we look to see that the remaining characters are only whitespace or ']' or + // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. + + if (/^[\],:{}\s]*$/ + .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') + .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') + .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { + + // In the third stage we use the eval function to compile the text into a + // JavaScript structure. The '{' operator is subject to a syntactic ambiguity + // in JavaScript: it can begin a block or an object literal. We wrap the text + // in parens to eliminate the ambiguity. + + j = eval('(' + text + ')'); + + // In the optional fourth stage, we recursively walk the new structure, passing + // each name/value pair to a reviver function for possible transformation. + + return typeof reviver === 'function' ? + walk({'': j}, '') : j; + } + + // If the text is not JSON parseable, then a SyntaxError is thrown. + + throw new SyntaxError('JSON.parse'); + }; + +})( + 'undefined' != typeof io ? io : module.exports + , typeof JSON !== 'undefined' ? JSON : undefined +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Parser namespace. + * + * @namespace + */ + + var parser = exports.parser = {}; + + /** + * Packet types. + */ + + var packets = parser.packets = [ + 'disconnect' + , 'connect' + , 'heartbeat' + , 'message' + , 'json' + , 'event' + , 'ack' + , 'error' + , 'noop' + ]; + + /** + * Errors reasons. + */ + + var reasons = parser.reasons = [ + 'transport not supported' + , 'client not handshaken' + , 'unauthorized' + ]; + + /** + * Errors advice. + */ + + var advice = parser.advice = [ + 'reconnect' + ]; + + /** + * Shortcuts. + */ + + var JSON = io.JSON + , indexOf = io.util.indexOf; + + /** + * Encodes a packet. + * + * @api private + */ + + parser.encodePacket = function (packet) { + var type = indexOf(packets, packet.type) + , id = packet.id || '' + , endpoint = packet.endpoint || '' + , ack = packet.ack + , data = null; + + switch (packet.type) { + case 'error': + var reason = packet.reason ? indexOf(reasons, packet.reason) : '' + , adv = packet.advice ? indexOf(advice, packet.advice) : ''; + + if (reason !== '' || adv !== '') + data = reason + (adv !== '' ? ('+' + adv) : ''); + + break; + + case 'message': + if (packet.data !== '') + data = packet.data; + break; + + case 'event': + var ev = { name: packet.name }; + + if (packet.args && packet.args.length) { + ev.args = packet.args; + } + + data = JSON.stringify(ev); + break; + + case 'json': + data = JSON.stringify(packet.data); + break; + + case 'connect': + if (packet.qs) + data = packet.qs; + break; + + case 'ack': + data = packet.ackId + + (packet.args && packet.args.length + ? '+' + JSON.stringify(packet.args) : ''); + break; + } + + // construct packet with required fragments + var encoded = [ + type + , id + (ack == 'data' ? '+' : '') + , endpoint + ]; + + // data fragment is optional + if (data !== null && data !== undefined) + encoded.push(data); + + return encoded.join(':'); + }; + + /** + * Encodes multiple messages (payload). + * + * @param {Array} messages + * @api private + */ + + parser.encodePayload = function (packets) { + var decoded = ''; + + if (packets.length == 1) + return packets[0]; + + for (var i = 0, l = packets.length; i < l; i++) { + var packet = packets[i]; + decoded += '\ufffd' + packet.length + '\ufffd' + packets[i]; + } + + return decoded; + }; + + /** + * Decodes a packet + * + * @api private + */ + + var regexp = /([^:]+):([0-9]+)?(\+)?:([^:]+)?:?([\s\S]*)?/; + + parser.decodePacket = function (data) { + var pieces = data.match(regexp); + + if (!pieces) return {}; + + var id = pieces[2] || '' + , data = pieces[5] || '' + , packet = { + type: packets[pieces[1]] + , endpoint: pieces[4] || '' + }; + + // whether we need to acknowledge the packet + if (id) { + packet.id = id; + if (pieces[3]) + packet.ack = 'data'; + else + packet.ack = true; + } + + // handle different packet types + switch (packet.type) { + case 'error': + var pieces = data.split('+'); + packet.reason = reasons[pieces[0]] || ''; + packet.advice = advice[pieces[1]] || ''; + break; + + case 'message': + packet.data = data || ''; + break; + + case 'event': + try { + var opts = JSON.parse(data); + packet.name = opts.name; + packet.args = opts.args; + } catch (e) { } + + packet.args = packet.args || []; + break; + + case 'json': + try { + packet.data = JSON.parse(data); + } catch (e) { } + break; + + case 'connect': + packet.qs = data || ''; + break; + + case 'ack': + var pieces = data.match(/^([0-9]+)(\+)?(.*)/); + if (pieces) { + packet.ackId = pieces[1]; + packet.args = []; + + if (pieces[3]) { + try { + packet.args = pieces[3] ? JSON.parse(pieces[3]) : []; + } catch (e) { } + } + } + break; + + case 'disconnect': + case 'heartbeat': + break; + }; + + return packet; + }; + + /** + * Decodes data payload. Detects multiple messages + * + * @return {Array} messages + * @api public + */ + + parser.decodePayload = function (data) { + // IE doesn't like data[i] for unicode chars, charAt works fine + if (data.charAt(0) == '\ufffd') { + var ret = []; + + for (var i = 1, length = ''; i < data.length; i++) { + if (data.charAt(i) == '\ufffd') { + ret.push(parser.decodePacket(data.substr(i + 1).substr(0, length))); + i += Number(length) + 1; + length = ''; + } else { + length += data.charAt(i); + } + } + + return ret; + } else { + return [parser.decodePacket(data)]; + } + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.Transport = Transport; + + /** + * This is the transport template for all supported transport methods. + * + * @constructor + * @api public + */ + + function Transport (socket, sessid) { + this.socket = socket; + this.sessid = sessid; + }; + + /** + * Apply EventEmitter mixin. + */ + + io.util.mixin(Transport, io.EventEmitter); + + + /** + * Indicates whether heartbeats is enabled for this transport + * + * @api private + */ + + Transport.prototype.heartbeats = function () { + return true; + }; + + /** + * Handles the response from the server. When a new response is received + * it will automatically update the timeout, decode the message and + * forwards the response to the onMessage function for further processing. + * + * @param {String} data Response from the server. + * @api private + */ + + Transport.prototype.onData = function (data) { + this.clearCloseTimeout(); + + // If the connection in currently open (or in a reopening state) reset the close + // timeout since we have just received data. This check is necessary so + // that we don't reset the timeout on an explicitly disconnected connection. + if (this.socket.connected || this.socket.connecting || this.socket.reconnecting) { + this.setCloseTimeout(); + } + + if (data !== '') { + // todo: we should only do decodePayload for xhr transports + var msgs = io.parser.decodePayload(data); + + if (msgs && msgs.length) { + for (var i = 0, l = msgs.length; i < l; i++) { + this.onPacket(msgs[i]); + } + } + } + + return this; + }; + + /** + * Handles packets. + * + * @api private + */ + + Transport.prototype.onPacket = function (packet) { + this.socket.setHeartbeatTimeout(); + + if (packet.type == 'heartbeat') { + return this.onHeartbeat(); + } + + if (packet.type == 'connect' && packet.endpoint == '') { + this.onConnect(); + } + + if (packet.type == 'error' && packet.advice == 'reconnect') { + this.isOpen = false; + } + + this.socket.onPacket(packet); + + return this; + }; + + /** + * Sets close timeout + * + * @api private + */ + + Transport.prototype.setCloseTimeout = function () { + if (!this.closeTimeout) { + var self = this; + + this.closeTimeout = setTimeout(function () { + self.onDisconnect(); + }, this.socket.closeTimeout); + } + }; + + /** + * Called when transport disconnects. + * + * @api private + */ + + Transport.prototype.onDisconnect = function () { + if (this.isOpen) this.close(); + this.clearTimeouts(); + this.socket.onDisconnect(); + return this; + }; + + /** + * Called when transport connects + * + * @api private + */ + + Transport.prototype.onConnect = function () { + this.socket.onConnect(); + return this; + }; + + /** + * Clears close timeout + * + * @api private + */ + + Transport.prototype.clearCloseTimeout = function () { + if (this.closeTimeout) { + clearTimeout(this.closeTimeout); + this.closeTimeout = null; + } + }; + + /** + * Clear timeouts + * + * @api private + */ + + Transport.prototype.clearTimeouts = function () { + this.clearCloseTimeout(); + + if (this.reopenTimeout) { + clearTimeout(this.reopenTimeout); + } + }; + + /** + * Sends a packet + * + * @param {Object} packet object. + * @api private + */ + + Transport.prototype.packet = function (packet) { + this.send(io.parser.encodePacket(packet)); + }; + + /** + * Send the received heartbeat message back to server. So the server + * knows we are still connected. + * + * @param {String} heartbeat Heartbeat response from the server. + * @api private + */ + + Transport.prototype.onHeartbeat = function (heartbeat) { + this.packet({ type: 'heartbeat' }); + }; + + /** + * Called when the transport opens. + * + * @api private + */ + + Transport.prototype.onOpen = function () { + this.isOpen = true; + this.clearCloseTimeout(); + this.socket.onOpen(); + }; + + /** + * Notifies the base when the connection with the Socket.IO server + * has been disconnected. + * + * @api private + */ + + Transport.prototype.onClose = function () { + var self = this; + + /* FIXME: reopen delay causing a infinit loop + this.reopenTimeout = setTimeout(function () { + self.open(); + }, this.socket.options['reopen delay']);*/ + + this.isOpen = false; + this.socket.onClose(); + this.onDisconnect(); + }; + + /** + * Generates a connection url based on the Socket.IO URL Protocol. + * See <https://github.com/learnboost/socket.io-node/> for more details. + * + * @returns {String} Connection url + * @api private + */ + + Transport.prototype.prepareUrl = function () { + var options = this.socket.options; + + return this.scheme() + '://' + + options.host + ':' + options.port + '/' + + options.resource + '/' + io.protocol + + '/' + this.name + '/' + this.sessid; + }; + + /** + * Checks if the transport is ready to start a connection. + * + * @param {Socket} socket The socket instance that needs a transport + * @param {Function} fn The callback + * @api private + */ + + Transport.prototype.ready = function (socket, fn) { + fn.call(this); + }; +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + */ + + exports.Socket = Socket; + + /** + * Create a new `Socket.IO client` which can establish a persistent + * connection with a Socket.IO enabled server. + * + * @api public + */ + + function Socket (options) { + this.options = { + port: 80 + , secure: false + , document: 'document' in global ? document : false + , resource: 'socket.io' + , transports: io.transports + , 'connect timeout': 10000 + , 'try multiple transports': true + , 'reconnect': true + , 'reconnection delay': 500 + , 'reconnection limit': Infinity + , 'reopen delay': 3000 + , 'max reconnection attempts': 10 + , 'sync disconnect on unload': false + , 'auto connect': true + , 'flash policy port': 10843 + , 'manualFlush': false + }; + + io.util.merge(this.options, options); + + this.connected = false; + this.open = false; + this.connecting = false; + this.reconnecting = false; + this.namespaces = {}; + this.buffer = []; + this.doBuffer = false; + + if (this.options['sync disconnect on unload'] && + (!this.isXDomain() || io.util.ua.hasCORS)) { + var self = this; + io.util.on(global, 'beforeunload', function () { + self.disconnectSync(); + }, false); + } + + if (this.options['auto connect']) { + this.connect(); + } +}; + + /** + * Apply EventEmitter mixin. + */ + + io.util.mixin(Socket, io.EventEmitter); + + /** + * Returns a namespace listener/emitter for this socket + * + * @api public + */ + + Socket.prototype.of = function (name) { + if (!this.namespaces[name]) { + this.namespaces[name] = new io.SocketNamespace(this, name); + + if (name !== '') { + this.namespaces[name].packet({ type: 'connect' }); + } + } + + return this.namespaces[name]; + }; + + /** + * Emits the given event to the Socket and all namespaces + * + * @api private + */ + + Socket.prototype.publish = function () { + this.emit.apply(this, arguments); + + var nsp; + + for (var i in this.namespaces) { + if (this.namespaces.hasOwnProperty(i)) { + nsp = this.of(i); + nsp.$emit.apply(nsp, arguments); + } + } + }; + + /** + * Performs the handshake + * + * @api private + */ + + function empty () { }; + + Socket.prototype.handshake = function (fn) { + var self = this + , options = this.options; + + function complete (data) { + if (data instanceof Error) { + self.connecting = false; + self.onError(data.message); + } else { + fn.apply(null, data.split(':')); + } + }; + + var url = [ + 'http' + (options.secure ? 's' : '') + ':/' + , options.host + ':' + options.port + , options.resource + , io.protocol + , io.util.query(this.options.query, 't=' + +new Date) + ].join('/'); + + if (this.isXDomain() && !io.util.ua.hasCORS) { + var insertAt = document.getElementsByTagName('script')[0] + , script = document.createElement('script'); + + script.src = url + '&jsonp=' + io.j.length; + insertAt.parentNode.insertBefore(script, insertAt); + + io.j.push(function (data) { + complete(data); + script.parentNode.removeChild(script); + }); + } else { + var xhr = io.util.request(); + + xhr.open('GET', url, true); + if (this.isXDomain()) { + xhr.withCredentials = true; + } + xhr.onreadystatechange = function () { + if (xhr.readyState == 4) { + xhr.onreadystatechange = empty; + + if (xhr.status == 200) { + complete(xhr.responseText); + } else if (xhr.status == 403) { + self.onError(xhr.responseText); + } else { + self.connecting = false; + !self.reconnecting && self.onError(xhr.responseText); + } + } + }; + xhr.send(null); + } + }; + + /** + * Find an available transport based on the options supplied in the constructor. + * + * @api private + */ + + Socket.prototype.getTransport = function (override) { + var transports = override || this.transports, match; + + for (var i = 0, transport; transport = transports[i]; i++) { + if (io.Transport[transport] + && io.Transport[transport].check(this) + && (!this.isXDomain() || io.Transport[transport].xdomainCheck(this))) { + return new io.Transport[transport](this, this.sessionid); + } + } + + return null; + }; + + /** + * Connects to the server. + * + * @param {Function} [fn] Callback. + * @returns {io.Socket} + * @api public + */ + + Socket.prototype.connect = function (fn) { + if (this.connecting) { + return this; + } + + var self = this; + self.connecting = true; + + this.handshake(function (sid, heartbeat, close, transports) { + self.sessionid = sid; + self.closeTimeout = close * 1000; + self.heartbeatTimeout = heartbeat * 1000; + if(!self.transports) + self.transports = self.origTransports = (transports ? io.util.intersect( + transports.split(',') + , self.options.transports + ) : self.options.transports); + + self.setHeartbeatTimeout(); + + function connect (transports){ + if (self.transport) self.transport.clearTimeouts(); + + self.transport = self.getTransport(transports); + if (!self.transport) return self.publish('connect_failed'); + + // once the transport is ready + self.transport.ready(self, function () { + self.connecting = true; + self.publish('connecting', self.transport.name); + self.transport.open(); + + if (self.options['connect timeout']) { + self.connectTimeoutTimer = setTimeout(function () { + if (!self.connected) { + self.connecting = false; + + if (self.options['try multiple transports']) { + var remaining = self.transports; + + while (remaining.length > 0 && remaining.splice(0,1)[0] != + self.transport.name) {} + + if (remaining.length){ + connect(remaining); + } else { + self.publish('connect_failed'); + } + } + } + }, self.options['connect timeout']); + } + }); + } + + connect(self.transports); + + self.once('connect', function (){ + clearTimeout(self.connectTimeoutTimer); + + fn && typeof fn == 'function' && fn(); + }); + }); + + return this; + }; + + /** + * Clears and sets a new heartbeat timeout using the value given by the + * server during the handshake. + * + * @api private + */ + + Socket.prototype.setHeartbeatTimeout = function () { + clearTimeout(this.heartbeatTimeoutTimer); + if(this.transport && !this.transport.heartbeats()) return; + + var self = this; + this.heartbeatTimeoutTimer = setTimeout(function () { + self.transport.onClose(); + }, this.heartbeatTimeout); + }; + + /** + * Sends a message. + * + * @param {Object} data packet. + * @returns {io.Socket} + * @api public + */ + + Socket.prototype.packet = function (data) { + if (this.connected && !this.doBuffer) { + this.transport.packet(data); + } else { + this.buffer.push(data); + } + + return this; + }; + + /** + * Sets buffer state + * + * @api private + */ + + Socket.prototype.setBuffer = function (v) { + this.doBuffer = v; + + if (!v && this.connected && this.buffer.length) { + if (!this.options['manualFlush']) { + this.flushBuffer(); + } + } + }; + + /** + * Flushes the buffer data over the wire. + * To be invoked manually when 'manualFlush' is set to true. + * + * @api public + */ + + Socket.prototype.flushBuffer = function() { + this.transport.payload(this.buffer); + this.buffer = []; + }; + + + /** + * Disconnect the established connect. + * + * @returns {io.Socket} + * @api public + */ + + Socket.prototype.disconnect = function () { + if (this.connected || this.connecting) { + if (this.open) { + this.of('').packet({ type: 'disconnect' }); + } + + // handle disconnection immediately + this.onDisconnect('booted'); + } + + return this; + }; + + /** + * Disconnects the socket with a sync XHR. + * + * @api private + */ + + Socket.prototype.disconnectSync = function () { + // ensure disconnection + var xhr = io.util.request(); + var uri = [ + 'http' + (this.options.secure ? 's' : '') + ':/' + , this.options.host + ':' + this.options.port + , this.options.resource + , io.protocol + , '' + , this.sessionid + ].join('/') + '/?disconnect=1'; + + xhr.open('GET', uri, false); + xhr.send(null); + + // handle disconnection immediately + this.onDisconnect('booted'); + }; + + /** + * Check if we need to use cross domain enabled transports. Cross domain would + * be a different port or different domain name. + * + * @returns {Boolean} + * @api private + */ + + Socket.prototype.isXDomain = function () { + + var port = global.location.port || + ('https:' == global.location.protocol ? 443 : 80); + + return this.options.host !== global.location.hostname + || this.options.port != port; + }; + + /** + * Called upon handshake. + * + * @api private + */ + + Socket.prototype.onConnect = function () { + if (!this.connected) { + this.connected = true; + this.connecting = false; + if (!this.doBuffer) { + // make sure to flush the buffer + this.setBuffer(false); + } + this.emit('connect'); + } + }; + + /** + * Called when the transport opens + * + * @api private + */ + + Socket.prototype.onOpen = function () { + this.open = true; + }; + + /** + * Called when the transport closes. + * + * @api private + */ + + Socket.prototype.onClose = function () { + this.open = false; + clearTimeout(this.heartbeatTimeoutTimer); + }; + + /** + * Called when the transport first opens a connection + * + * @param text + */ + + Socket.prototype.onPacket = function (packet) { + this.of(packet.endpoint).onPacket(packet); + }; + + /** + * Handles an error. + * + * @api private + */ + + Socket.prototype.onError = function (err) { + if (err && err.advice) { + if (err.advice === 'reconnect' && (this.connected || this.connecting)) { + this.disconnect(); + if (this.options.reconnect) { + this.reconnect(); + } + } + } + + this.publish('error', err && err.reason ? err.reason : err); + }; + + /** + * Called when the transport disconnects. + * + * @api private + */ + + Socket.prototype.onDisconnect = function (reason) { + var wasConnected = this.connected + , wasConnecting = this.connecting; + + this.connected = false; + this.connecting = false; + this.open = false; + + if (wasConnected || wasConnecting) { + this.transport.close(); + this.transport.clearTimeouts(); + if (wasConnected) { + this.publish('disconnect', reason); + + if ('booted' != reason && this.options.reconnect && !this.reconnecting) { + this.reconnect(); + } + } + } + }; + + /** + * Called upon reconnection. + * + * @api private + */ + + Socket.prototype.reconnect = function () { + this.reconnecting = true; + this.reconnectionAttempts = 0; + this.reconnectionDelay = this.options['reconnection delay']; + + var self = this + , maxAttempts = this.options['max reconnection attempts'] + , tryMultiple = this.options['try multiple transports'] + , limit = this.options['reconnection limit']; + + function reset () { + if (self.connected) { + for (var i in self.namespaces) { + if (self.namespaces.hasOwnProperty(i) && '' !== i) { + self.namespaces[i].packet({ type: 'connect' }); + } + } + self.publish('reconnect', self.transport.name, self.reconnectionAttempts); + } + + clearTimeout(self.reconnectionTimer); + + self.removeListener('connect_failed', maybeReconnect); + self.removeListener('connect', maybeReconnect); + + self.reconnecting = false; + + delete self.reconnectionAttempts; + delete self.reconnectionDelay; + delete self.reconnectionTimer; + delete self.redoTransports; + + self.options['try multiple transports'] = tryMultiple; + }; + + function maybeReconnect () { + if (!self.reconnecting) { + return; + } + + if (self.connected) { + return reset(); + }; + + if (self.connecting && self.reconnecting) { + return self.reconnectionTimer = setTimeout(maybeReconnect, 1000); + } + + if (self.reconnectionAttempts++ >= maxAttempts) { + if (!self.redoTransports) { + self.on('connect_failed', maybeReconnect); + self.options['try multiple transports'] = true; + self.transports = self.origTransports; + self.transport = self.getTransport(); + self.redoTransports = true; + self.connect(); + } else { + self.publish('reconnect_failed'); + reset(); + } + } else { + if (self.reconnectionDelay < limit) { + self.reconnectionDelay *= 2; // exponential back off + } + + self.connect(); + self.publish('reconnecting', self.reconnectionDelay, self.reconnectionAttempts); + self.reconnectionTimer = setTimeout(maybeReconnect, self.reconnectionDelay); + } + }; + + this.options['try multiple transports'] = false; + this.reconnectionTimer = setTimeout(maybeReconnect, this.reconnectionDelay); + + this.on('connect', maybeReconnect); + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.SocketNamespace = SocketNamespace; + + /** + * Socket namespace constructor. + * + * @constructor + * @api public + */ + + function SocketNamespace (socket, name) { + this.socket = socket; + this.name = name || ''; + this.flags = {}; + this.json = new Flag(this, 'json'); + this.ackPackets = 0; + this.acks = {}; + }; + + /** + * Apply EventEmitter mixin. + */ + + io.util.mixin(SocketNamespace, io.EventEmitter); + + /** + * Copies emit since we override it + * + * @api private + */ + + SocketNamespace.prototype.$emit = io.EventEmitter.prototype.emit; + + /** + * Creates a new namespace, by proxying the request to the socket. This + * allows us to use the synax as we do on the server. + * + * @api public + */ + + SocketNamespace.prototype.of = function () { + return this.socket.of.apply(this.socket, arguments); + }; + + /** + * Sends a packet. + * + * @api private + */ + + SocketNamespace.prototype.packet = function (packet) { + packet.endpoint = this.name; + this.socket.packet(packet); + this.flags = {}; + return this; + }; + + /** + * Sends a message + * + * @api public + */ + + SocketNamespace.prototype.send = function (data, fn) { + var packet = { + type: this.flags.json ? 'json' : 'message' + , data: data + }; + + if ('function' == typeof fn) { + packet.id = ++this.ackPackets; + packet.ack = true; + this.acks[packet.id] = fn; + } + + return this.packet(packet); + }; + + /** + * Emits an event + * + * @api public + */ + + SocketNamespace.prototype.emit = function (name) { + var args = Array.prototype.slice.call(arguments, 1) + , lastArg = args[args.length - 1] + , packet = { + type: 'event' + , name: name + }; + + if ('function' == typeof lastArg) { + packet.id = ++this.ackPackets; + packet.ack = 'data'; + this.acks[packet.id] = lastArg; + args = args.slice(0, args.length - 1); + } + + packet.args = args; + + return this.packet(packet); + }; + + /** + * Disconnects the namespace + * + * @api private + */ + + SocketNamespace.prototype.disconnect = function () { + if (this.name === '') { + this.socket.disconnect(); + } else { + this.packet({ type: 'disconnect' }); + this.$emit('disconnect'); + } + + return this; + }; + + /** + * Handles a packet + * + * @api private + */ + + SocketNamespace.prototype.onPacket = function (packet) { + var self = this; + + function ack () { + self.packet({ + type: 'ack' + , args: io.util.toArray(arguments) + , ackId: packet.id + }); + }; + + switch (packet.type) { + case 'connect': + this.$emit('connect'); + break; + + case 'disconnect': + if (this.name === '') { + this.socket.onDisconnect(packet.reason || 'booted'); + } else { + this.$emit('disconnect', packet.reason); + } + break; + + case 'message': + case 'json': + var params = ['message', packet.data]; + + if (packet.ack == 'data') { + params.push(ack); + } else if (packet.ack) { + this.packet({ type: 'ack', ackId: packet.id }); + } + + this.$emit.apply(this, params); + break; + + case 'event': + var params = [packet.name].concat(packet.args); + + if (packet.ack == 'data') + params.push(ack); + + this.$emit.apply(this, params); + break; + + case 'ack': + if (this.acks[packet.ackId]) { + this.acks[packet.ackId].apply(this, packet.args); + delete this.acks[packet.ackId]; + } + break; + + case 'error': + if (packet.advice){ + this.socket.onError(packet); + } else { + if (packet.reason == 'unauthorized') { + this.$emit('connect_failed', packet.reason); + } else { + this.$emit('error', packet.reason); + } + } + break; + } + }; + + /** + * Flag interface. + * + * @api private + */ + + function Flag (nsp, name) { + this.namespace = nsp; + this.name = name; + }; + + /** + * Send a message + * + * @api public + */ + + Flag.prototype.send = function () { + this.namespace.flags[this.name] = true; + this.namespace.send.apply(this.namespace, arguments); + }; + + /** + * Emit an event + * + * @api public + */ + + Flag.prototype.emit = function () { + this.namespace.flags[this.name] = true; + this.namespace.emit.apply(this.namespace, arguments); + }; + +})( + 'undefined' != typeof io ? io : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + */ + + exports.websocket = WS; + + /** + * The WebSocket transport uses the HTML5 WebSocket API to establish an + * persistent connection with the Socket.IO server. This transport will also + * be inherited by the FlashSocket fallback as it provides a API compatible + * polyfill for the WebSockets. + * + * @constructor + * @extends {io.Transport} + * @api public + */ + + function WS (socket) { + io.Transport.apply(this, arguments); + }; + + /** + * Inherits from Transport. + */ + + io.util.inherit(WS, io.Transport); + + /** + * Transport name + * + * @api public + */ + + WS.prototype.name = 'websocket'; + + /** + * Initializes a new `WebSocket` connection with the Socket.IO server. We attach + * all the appropriate listeners to handle the responses from the server. + * + * @returns {Transport} + * @api public + */ + + WS.prototype.open = function () { + var query = io.util.query(this.socket.options.query) + , self = this + , Socket + + + if (!Socket) { + Socket = global.MozWebSocket || global.WebSocket; + } + + this.websocket = new Socket(this.prepareUrl() + query); + + this.websocket.onopen = function () { + self.onOpen(); + self.socket.setBuffer(false); + }; + this.websocket.onmessage = function (ev) { + self.onData(ev.data); + }; + this.websocket.onclose = function () { + self.onClose(); + self.socket.setBuffer(true); + }; + this.websocket.onerror = function (e) { + self.onError(e); + }; + + return this; + }; + + /** + * Send a message to the Socket.IO server. The message will automatically be + * encoded in the correct message format. + * + * @returns {Transport} + * @api public + */ + + // Do to a bug in the current IDevices browser, we need to wrap the send in a + // setTimeout, when they resume from sleeping the browser will crash if + // we don't allow the browser time to detect the socket has been closed + if (io.util.ua.iDevice) { + WS.prototype.send = function (data) { + var self = this; + setTimeout(function() { + self.websocket.send(data); + },0); + return this; + }; + } else { + WS.prototype.send = function (data) { + this.websocket.send(data); + return this; + }; + } + + /** + * Payload + * + * @api private + */ + + WS.prototype.payload = function (arr) { + for (var i = 0, l = arr.length; i < l; i++) { + this.packet(arr[i]); + } + return this; + }; + + /** + * Disconnect the established `WebSocket` connection. + * + * @returns {Transport} + * @api public + */ + + WS.prototype.close = function () { + this.websocket.close(); + return this; + }; + + /** + * Handle the errors that `WebSocket` might be giving when we + * are attempting to connect or send messages. + * + * @param {Error} e The error. + * @api private + */ + + WS.prototype.onError = function (e) { + this.socket.onError(e); + }; + + /** + * Returns the appropriate scheme for the URI generation. + * + * @api private + */ + WS.prototype.scheme = function () { + return this.socket.options.secure ? 'wss' : 'ws'; + }; + + /** + * Checks if the browser has support for native `WebSockets` and that + * it's not the polyfill created for the FlashSocket transport. + * + * @return {Boolean} + * @api public + */ + + WS.check = function () { + return ('WebSocket' in global && !('__addTask' in WebSocket)) + || 'MozWebSocket' in global; + }; + + /** + * Check if the `WebSocket` transport support cross domain communications. + * + * @returns {Boolean} + * @api public + */ + + WS.xdomainCheck = function () { + return true; + }; + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('websocket'); + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.flashsocket = Flashsocket; + + /** + * The FlashSocket transport. This is a API wrapper for the HTML5 WebSocket + * specification. It uses a .swf file to communicate with the server. If you want + * to serve the .swf file from a other server than where the Socket.IO script is + * coming from you need to use the insecure version of the .swf. More information + * about this can be found on the github page. + * + * @constructor + * @extends {io.Transport.websocket} + * @api public + */ + + function Flashsocket () { + io.Transport.websocket.apply(this, arguments); + }; + + /** + * Inherits from Transport. + */ + + io.util.inherit(Flashsocket, io.Transport.websocket); + + /** + * Transport name + * + * @api public + */ + + Flashsocket.prototype.name = 'flashsocket'; + + /** + * Disconnect the established `FlashSocket` connection. This is done by adding a + * new task to the FlashSocket. The rest will be handled off by the `WebSocket` + * transport. + * + * @returns {Transport} + * @api public + */ + + Flashsocket.prototype.open = function () { + var self = this + , args = arguments; + + WebSocket.__addTask(function () { + io.Transport.websocket.prototype.open.apply(self, args); + }); + return this; + }; + + /** + * Sends a message to the Socket.IO server. This is done by adding a new + * task to the FlashSocket. The rest will be handled off by the `WebSocket` + * transport. + * + * @returns {Transport} + * @api public + */ + + Flashsocket.prototype.send = function () { + var self = this, args = arguments; + WebSocket.__addTask(function () { + io.Transport.websocket.prototype.send.apply(self, args); + }); + return this; + }; + + /** + * Disconnects the established `FlashSocket` connection. + * + * @returns {Transport} + * @api public + */ + + Flashsocket.prototype.close = function () { + WebSocket.__tasks.length = 0; + io.Transport.websocket.prototype.close.call(this); + return this; + }; + + /** + * The WebSocket fall back needs to append the flash container to the body + * element, so we need to make sure we have access to it. Or defer the call + * until we are sure there is a body element. + * + * @param {Socket} socket The socket instance that needs a transport + * @param {Function} fn The callback + * @api private + */ + + Flashsocket.prototype.ready = function (socket, fn) { + function init () { + var options = socket.options + , port = options['flash policy port'] + , path = [ + 'http' + (options.secure ? 's' : '') + ':/' + , options.host + ':' + options.port + , options.resource + , 'static/flashsocket' + , 'WebSocketMain' + (socket.isXDomain() ? 'Insecure' : '') + '.swf' + ]; + + // Only start downloading the swf file when the checked that this browser + // actually supports it + if (!Flashsocket.loaded) { + if (typeof WEB_SOCKET_SWF_LOCATION === 'undefined') { + // Set the correct file based on the XDomain settings + WEB_SOCKET_SWF_LOCATION = path.join('/'); + } + + if (port !== 843) { + WebSocket.loadFlashPolicyFile('xmlsocket://' + options.host + ':' + port); + } + + WebSocket.__initialize(); + Flashsocket.loaded = true; + } + + fn.call(self); + } + + var self = this; + if (document.body) return init(); + + io.util.load(init); + }; + + /** + * Check if the FlashSocket transport is supported as it requires that the Adobe + * Flash Player plug-in version `10.0.0` or greater is installed. And also check if + * the polyfill is correctly loaded. + * + * @returns {Boolean} + * @api public + */ + + Flashsocket.check = function () { + if ( + typeof WebSocket == 'undefined' + || !('__initialize' in WebSocket) || !swfobject + ) return false; + + return swfobject.getFlashPlayerVersion().major >= 10; + }; + + /** + * Check if the FlashSocket transport can be used as cross domain / cross origin + * transport. Because we can't see which type (secure or insecure) of .swf is used + * we will just return true. + * + * @returns {Boolean} + * @api public + */ + + Flashsocket.xdomainCheck = function () { + return true; + }; + + /** + * Disable AUTO_INITIALIZATION + */ + + if (typeof window != 'undefined') { + WEB_SOCKET_DISABLE_AUTO_INITIALIZATION = true; + } + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('flashsocket'); +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); +/* SWFObject v2.2 <http://code.google.com/p/swfobject/> + is released under the MIT License <http://www.opensource.org/licenses/mit-license.php> +*/ +if ('undefined' != typeof window) { +var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O[(['Active'].concat('Object').join('X'))]!=D){try{var ad=new window[(['Active'].concat('Object').join('X'))](W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]()}}function K(X){if(J){X()}else{U[U.length]=X}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener("load",Y,false)}else{if(typeof j.addEventListener!=D){j.addEventListener("load",Y,false)}else{if(typeof O.attachEvent!=D){i(O,"onload",Y)}else{if(typeof O.onload=="function"){var X=O.onload;O.onload=function(){X();Y()}}else{O.onload=Y}}}}}function h(){if(T){V()}else{H()}}function V(){var X=j.getElementsByTagName("body")[0];var aa=C(r);aa.setAttribute("type",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable("$version");if(ab){ab=ab.split(" ")[1].split(",");M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return}}X.removeChild(aa);Z=null;H()})()}else{H()}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute("name").toLowerCase()!="movie"){ah[X[ad].getAttribute("name")]=X[ad].getAttribute("value")}}P(ai,ah,Y,ab)}else{p(ae);if(ab){ab(aa)}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z}ab(aa)}}}}}function z(aa){var X=null;var Y=c(aa);if(Y&&Y.nodeName=="OBJECT"){if(typeof Y.SetVariable!=D){X=Y}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z}}}return X}function A(){return !a&&F("6.0.65")&&(M.win||M.mac)&&!(M.wk&&M.wk<312)}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName=="OBJECT"){l=g(ae);Q=null}else{l=ae;Q=X}aa.id=R;if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width="310"}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height="137"}j.title=j.title.slice(0,47)+" - Flash Player Installation";var ad=M.ie&&M.win?(['Active'].concat('').join('X')):"PlugIn",ac="MMredirectURL="+O.location.toString().replace(/&/g,"%26")+"&MMplayerType="+ad+"&MMdoctitle="+j.title;if(typeof ab.flashvars!=D){ab.flashvars+="&"+ac}else{ab.flashvars=ac}if(M.ie&&M.win&&ae.readyState!=4){var Y=C("div");X+="SWFObjectNew";Y.setAttribute("id",X);ae.parentNode.insertBefore(Y,ae);ae.style.display="none";(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae)}else{setTimeout(arguments.callee,10)}})()}u(aa,ab,X)}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C("div");Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display="none";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.replaceChild(g(Y),Y)}}function g(ab){var aa=C("div");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML}else{var Y=ab.getElementsByTagName(r)[0];if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName=="PARAM")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true))}}}}}return aa}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X}if(aa){if(typeof ai.id==D){ai.id=Y}if(M.ie&&M.win){var ah="";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()=="data"){ag.movie=ai[ae]}else{if(ae.toLowerCase()=="styleclass"){ah+=' class="'+ai[ae]+'"'}else{if(ae.toLowerCase()!="classid"){ah+=" "+ae+'="'+ai[ae]+'"'}}}}}var af="";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name="'+ad+'" value="'+ag[ad]+'" />'}}aa.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+ah+">"+af+"</object>";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2])}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa])}for(var Y in M){M[Y]=null}M=null;for(var X in swfobject){swfobject[X]=null}swfobject=null})}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;w(ab,false)}else{if(Z){Z({success:false,id:ab})}}},getObjectById:function(X){if(M.w3){return z(X)}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+="";ag+="";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al]}}aj.data=ab;aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak]}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+="&"+ai+"="+Z[ai]}else{am.flashvars=ai+"="+Z[ai]}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true)}X.success=true;X.ref=an}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);return}else{w(ah,true)}}if(ac){ac(X)}})}else{if(ac){ac(X)}}},switchOffAutoHideShow:function(){m=false},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]}},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X)}else{return undefined}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y)}},removeSWF:function(X){if(M.w3){y(X)}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X)}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;if(Z){if(/\?/.test(Z)){Z=Z.split("?")[1]}if(aa==null){return L(Z)}var Y=Z.split("&");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf("="))==aa){return L(Y[X].substring((Y[X].indexOf("=")+1)))}}}return""},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display="block"}}if(E){E(B)}}a=false}}}}(); +} +// Copyright: Hiroshi Ichikawa <http://gimite.net/en/> +// License: New BSD License +// Reference: http://dev.w3.org/html5/websockets/ +// Reference: http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol + +(function() { + + if ('undefined' == typeof window || window.WebSocket) return; + + var console = window.console; + if (!console || !console.log || !console.error) { + console = {log: function(){ }, error: function(){ }}; + } + + if (!swfobject.hasFlashPlayerVersion("10.0.0")) { + console.error("Flash Player >= 10.0.0 is required."); + return; + } + if (location.protocol == "file:") { + console.error( + "WARNING: web-socket-js doesn't work in file:///... URL " + + "unless you set Flash Security Settings properly. " + + "Open the page via Web server i.e. http://..."); + } + + /** + * This class represents a faux web socket. + * @param {string} url + * @param {array or string} protocols + * @param {string} proxyHost + * @param {int} proxyPort + * @param {string} headers + */ + WebSocket = function(url, protocols, proxyHost, proxyPort, headers) { + var self = this; + self.__id = WebSocket.__nextId++; + WebSocket.__instances[self.__id] = self; + self.readyState = WebSocket.CONNECTING; + self.bufferedAmount = 0; + self.__events = {}; + if (!protocols) { + protocols = []; + } else if (typeof protocols == "string") { + protocols = [protocols]; + } + // Uses setTimeout() to make sure __createFlash() runs after the caller sets ws.onopen etc. + // Otherwise, when onopen fires immediately, onopen is called before it is set. + setTimeout(function() { + WebSocket.__addTask(function() { + WebSocket.__flash.create( + self.__id, url, protocols, proxyHost || null, proxyPort || 0, headers || null); + }); + }, 0); + }; + + /** + * Send data to the web socket. + * @param {string} data The data to send to the socket. + * @return {boolean} True for success, false for failure. + */ + WebSocket.prototype.send = function(data) { + if (this.readyState == WebSocket.CONNECTING) { + throw "INVALID_STATE_ERR: Web Socket connection has not been established"; + } + // We use encodeURIComponent() here, because FABridge doesn't work if + // the argument includes some characters. We don't use escape() here + // because of this: + // https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Functions#escape_and_unescape_Functions + // But it looks decodeURIComponent(encodeURIComponent(s)) doesn't + // preserve all Unicode characters either e.g. "\uffff" in Firefox. + // Note by wtritch: Hopefully this will not be necessary using ExternalInterface. Will require + // additional testing. + var result = WebSocket.__flash.send(this.__id, encodeURIComponent(data)); + if (result < 0) { // success + return true; + } else { + this.bufferedAmount += result; + return false; + } + }; + + /** + * Close this web socket gracefully. + */ + WebSocket.prototype.close = function() { + if (this.readyState == WebSocket.CLOSED || this.readyState == WebSocket.CLOSING) { + return; + } + this.readyState = WebSocket.CLOSING; + WebSocket.__flash.close(this.__id); + }; + + /** + * Implementation of {@link <a href="http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-registration">DOM 2 EventTarget Interface</a>} + * + * @param {string} type + * @param {function} listener + * @param {boolean} useCapture + * @return void + */ + WebSocket.prototype.addEventListener = function(type, listener, useCapture) { + if (!(type in this.__events)) { + this.__events[type] = []; + } + this.__events[type].push(listener); + }; + + /** + * Implementation of {@link <a href="http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-registration">DOM 2 EventTarget Interface</a>} + * + * @param {string} type + * @param {function} listener + * @param {boolean} useCapture + * @return void + */ + WebSocket.prototype.removeEventListener = function(type, listener, useCapture) { + if (!(type in this.__events)) return; + var events = this.__events[type]; + for (var i = events.length - 1; i >= 0; --i) { + if (events[i] === listener) { + events.splice(i, 1); + break; + } + } + }; + + /** + * Implementation of {@link <a href="http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-registration">DOM 2 EventTarget Interface</a>} + * + * @param {Event} event + * @return void + */ + WebSocket.prototype.dispatchEvent = function(event) { + var events = this.__events[event.type] || []; + for (var i = 0; i < events.length; ++i) { + events[i](event); + } + var handler = this["on" + event.type]; + if (handler) handler(event); + }; + + /** + * Handles an event from Flash. + * @param {Object} flashEvent + */ + WebSocket.prototype.__handleEvent = function(flashEvent) { + if ("readyState" in flashEvent) { + this.readyState = flashEvent.readyState; + } + if ("protocol" in flashEvent) { + this.protocol = flashEvent.protocol; + } + + var jsEvent; + if (flashEvent.type == "open" || flashEvent.type == "error") { + jsEvent = this.__createSimpleEvent(flashEvent.type); + } else if (flashEvent.type == "close") { + // TODO implement jsEvent.wasClean + jsEvent = this.__createSimpleEvent("close"); + } else if (flashEvent.type == "message") { + var data = decodeURIComponent(flashEvent.message); + jsEvent = this.__createMessageEvent("message", data); + } else { + throw "unknown event type: " + flashEvent.type; + } + + this.dispatchEvent(jsEvent); + }; + + WebSocket.prototype.__createSimpleEvent = function(type) { + if (document.createEvent && window.Event) { + var event = document.createEvent("Event"); + event.initEvent(type, false, false); + return event; + } else { + return {type: type, bubbles: false, cancelable: false}; + } + }; + + WebSocket.prototype.__createMessageEvent = function(type, data) { + if (document.createEvent && window.MessageEvent && !window.opera) { + var event = document.createEvent("MessageEvent"); + event.initMessageEvent("message", false, false, data, null, null, window, null); + return event; + } else { + // IE and Opera, the latter one truncates the data parameter after any 0x00 bytes. + return {type: type, data: data, bubbles: false, cancelable: false}; + } + }; + + /** + * Define the WebSocket readyState enumeration. + */ + WebSocket.CONNECTING = 0; + WebSocket.OPEN = 1; + WebSocket.CLOSING = 2; + WebSocket.CLOSED = 3; + + WebSocket.__flash = null; + WebSocket.__instances = {}; + WebSocket.__tasks = []; + WebSocket.__nextId = 0; + + /** + * Load a new flash security policy file. + * @param {string} url + */ + WebSocket.loadFlashPolicyFile = function(url){ + WebSocket.__addTask(function() { + WebSocket.__flash.loadManualPolicyFile(url); + }); + }; + + /** + * Loads WebSocketMain.swf and creates WebSocketMain object in Flash. + */ + WebSocket.__initialize = function() { + if (WebSocket.__flash) return; + + if (WebSocket.__swfLocation) { + // For backword compatibility. + window.WEB_SOCKET_SWF_LOCATION = WebSocket.__swfLocation; + } + if (!window.WEB_SOCKET_SWF_LOCATION) { + console.error("[WebSocket] set WEB_SOCKET_SWF_LOCATION to location of WebSocketMain.swf"); + return; + } + var container = document.createElement("div"); + container.id = "webSocketContainer"; + // Hides Flash box. We cannot use display: none or visibility: hidden because it prevents + // Flash from loading at least in IE. So we move it out of the screen at (-100, -100). + // But this even doesn't work with Flash Lite (e.g. in Droid Incredible). So with Flash + // Lite, we put it at (0, 0). This shows 1x1 box visible at left-top corner but this is + // the best we can do as far as we know now. + container.style.position = "absolute"; + if (WebSocket.__isFlashLite()) { + container.style.left = "0px"; + container.style.top = "0px"; + } else { + container.style.left = "-100px"; + container.style.top = "-100px"; + } + var holder = document.createElement("div"); + holder.id = "webSocketFlash"; + container.appendChild(holder); + document.body.appendChild(container); + // See this article for hasPriority: + // http://help.adobe.com/en_US/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-7ffd.html + swfobject.embedSWF( + WEB_SOCKET_SWF_LOCATION, + "webSocketFlash", + "1" /* width */, + "1" /* height */, + "10.0.0" /* SWF version */, + null, + null, + {hasPriority: true, swliveconnect : true, allowScriptAccess: "always"}, + null, + function(e) { + if (!e.success) { + console.error("[WebSocket] swfobject.embedSWF failed"); + } + }); + }; + + /** + * Called by Flash to notify JS that it's fully loaded and ready + * for communication. + */ + WebSocket.__onFlashInitialized = function() { + // We need to set a timeout here to avoid round-trip calls + // to flash during the initialization process. + setTimeout(function() { + WebSocket.__flash = document.getElementById("webSocketFlash"); + WebSocket.__flash.setCallerUrl(location.href); + WebSocket.__flash.setDebug(!!window.WEB_SOCKET_DEBUG); + for (var i = 0; i < WebSocket.__tasks.length; ++i) { + WebSocket.__tasks[i](); + } + WebSocket.__tasks = []; + }, 0); + }; + + /** + * Called by Flash to notify WebSockets events are fired. + */ + WebSocket.__onFlashEvent = function() { + setTimeout(function() { + try { + // Gets events using receiveEvents() instead of getting it from event object + // of Flash event. This is to make sure to keep message order. + // It seems sometimes Flash events don't arrive in the same order as they are sent. + var events = WebSocket.__flash.receiveEvents(); + for (var i = 0; i < events.length; ++i) { + WebSocket.__instances[events[i].webSocketId].__handleEvent(events[i]); + } + } catch (e) { + console.error(e); + } + }, 0); + return true; + }; + + // Called by Flash. + WebSocket.__log = function(message) { + console.log(decodeURIComponent(message)); + }; + + // Called by Flash. + WebSocket.__error = function(message) { + console.error(decodeURIComponent(message)); + }; + + WebSocket.__addTask = function(task) { + if (WebSocket.__flash) { + task(); + } else { + WebSocket.__tasks.push(task); + } + }; + + /** + * Test if the browser is running flash lite. + * @return {boolean} True if flash lite is running, false otherwise. + */ + WebSocket.__isFlashLite = function() { + if (!window.navigator || !window.navigator.mimeTypes) { + return false; + } + var mimeType = window.navigator.mimeTypes["application/x-shockwave-flash"]; + if (!mimeType || !mimeType.enabledPlugin || !mimeType.enabledPlugin.filename) { + return false; + } + return mimeType.enabledPlugin.filename.match(/flashlite/i) ? true : false; + }; + + if (!window.WEB_SOCKET_DISABLE_AUTO_INITIALIZATION) { + if (window.addEventListener) { + window.addEventListener("load", function(){ + WebSocket.__initialize(); + }, false); + } else { + window.attachEvent("onload", function(){ + WebSocket.__initialize(); + }); + } + } + +})(); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + * + * @api public + */ + + exports.XHR = XHR; + + /** + * XHR constructor + * + * @costructor + * @api public + */ + + function XHR (socket) { + if (!socket) return; + + io.Transport.apply(this, arguments); + this.sendBuffer = []; + }; + + /** + * Inherits from Transport. + */ + + io.util.inherit(XHR, io.Transport); + + /** + * Establish a connection + * + * @returns {Transport} + * @api public + */ + + XHR.prototype.open = function () { + this.socket.setBuffer(false); + this.onOpen(); + this.get(); + + // we need to make sure the request succeeds since we have no indication + // whether the request opened or not until it succeeded. + this.setCloseTimeout(); + + return this; + }; + + /** + * Check if we need to send data to the Socket.IO server, if we have data in our + * buffer we encode it and forward it to the `post` method. + * + * @api private + */ + + XHR.prototype.payload = function (payload) { + var msgs = []; + + for (var i = 0, l = payload.length; i < l; i++) { + msgs.push(io.parser.encodePacket(payload[i])); + } + + this.send(io.parser.encodePayload(msgs)); + }; + + /** + * Send data to the Socket.IO server. + * + * @param data The message + * @returns {Transport} + * @api public + */ + + XHR.prototype.send = function (data) { + this.post(data); + return this; + }; + + /** + * Posts a encoded message to the Socket.IO server. + * + * @param {String} data A encoded message. + * @api private + */ + + function empty () { }; + + XHR.prototype.post = function (data) { + var self = this; + this.socket.setBuffer(true); + + function stateChange () { + if (this.readyState == 4) { + this.onreadystatechange = empty; + self.posting = false; + + if (this.status == 200){ + self.socket.setBuffer(false); + } else { + self.onClose(); + } + } + } + + function onload () { + this.onload = empty; + self.socket.setBuffer(false); + }; + + this.sendXHR = this.request('POST'); + + if (global.XDomainRequest && this.sendXHR instanceof XDomainRequest) { + this.sendXHR.onload = this.sendXHR.onerror = onload; + } else { + this.sendXHR.onreadystatechange = stateChange; + } + + this.sendXHR.send(data); + }; + + /** + * Disconnects the established `XHR` connection. + * + * @returns {Transport} + * @api public + */ + + XHR.prototype.close = function () { + this.onClose(); + return this; + }; + + /** + * Generates a configured XHR request + * + * @param {String} url The url that needs to be requested. + * @param {String} method The method the request should use. + * @returns {XMLHttpRequest} + * @api private + */ + + XHR.prototype.request = function (method) { + var req = io.util.request(this.socket.isXDomain()) + , query = io.util.query(this.socket.options.query, 't=' + +new Date); + + req.open(method || 'GET', this.prepareUrl() + query, true); + + if (method == 'POST') { + try { + if (req.setRequestHeader) { + req.setRequestHeader('Content-type', 'text/plain;charset=UTF-8'); + } else { + // XDomainRequest + req.contentType = 'text/plain'; + } + } catch (e) {} + } + + return req; + }; + + /** + * Returns the scheme to use for the transport URLs. + * + * @api private + */ + + XHR.prototype.scheme = function () { + return this.socket.options.secure ? 'https' : 'http'; + }; + + /** + * Check if the XHR transports are supported + * + * @param {Boolean} xdomain Check if we support cross domain requests. + * @returns {Boolean} + * @api public + */ + + XHR.check = function (socket, xdomain) { + try { + var request = io.util.request(xdomain), + usesXDomReq = (global.XDomainRequest && request instanceof XDomainRequest), + socketProtocol = (socket && socket.options && socket.options.secure ? 'https:' : 'http:'), + isXProtocol = (global.location && socketProtocol != global.location.protocol); + if (request && !(usesXDomReq && isXProtocol)) { + return true; + } + } catch(e) {} + + return false; + }; + + /** + * Check if the XHR transport supports cross domain requests. + * + * @returns {Boolean} + * @api public + */ + + XHR.xdomainCheck = function (socket) { + return XHR.check(socket, true); + }; + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, io) { + + /** + * Expose constructor. + */ + + exports.htmlfile = HTMLFile; + + /** + * The HTMLFile transport creates a `forever iframe` based transport + * for Internet Explorer. Regular forever iframe implementations will + * continuously trigger the browsers buzy indicators. If the forever iframe + * is created inside a `htmlfile` these indicators will not be trigged. + * + * @constructor + * @extends {io.Transport.XHR} + * @api public + */ + + function HTMLFile (socket) { + io.Transport.XHR.apply(this, arguments); + }; + + /** + * Inherits from XHR transport. + */ + + io.util.inherit(HTMLFile, io.Transport.XHR); + + /** + * Transport name + * + * @api public + */ + + HTMLFile.prototype.name = 'htmlfile'; + + /** + * Creates a new Ac...eX `htmlfile` with a forever loading iframe + * that can be used to listen to messages. Inside the generated + * `htmlfile` a reference will be made to the HTMLFile transport. + * + * @api private + */ + + HTMLFile.prototype.get = function () { + this.doc = new window[(['Active'].concat('Object').join('X'))]('htmlfile'); + this.doc.open(); + this.doc.write('<html></html>'); + this.doc.close(); + this.doc.parentWindow.s = this; + + var iframeC = this.doc.createElement('div'); + iframeC.className = 'socketio'; + + this.doc.body.appendChild(iframeC); + this.iframe = this.doc.createElement('iframe'); + + iframeC.appendChild(this.iframe); + + var self = this + , query = io.util.query(this.socket.options.query, 't='+ +new Date); + + this.iframe.src = this.prepareUrl() + query; + + io.util.on(window, 'unload', function () { + self.destroy(); + }); + }; + + /** + * The Socket.IO server will write script tags inside the forever + * iframe, this function will be used as callback for the incoming + * information. + * + * @param {String} data The message + * @param {document} doc Reference to the context + * @api private + */ + + HTMLFile.prototype._ = function (data, doc) { + // unescape all forward slashes. see GH-1251 + data = data.replace(/\\\//g, '/'); + this.onData(data); + try { + var script = doc.getElementsByTagName('script')[0]; + script.parentNode.removeChild(script); + } catch (e) { } + }; + + /** + * Destroy the established connection, iframe and `htmlfile`. + * And calls the `CollectGarbage` function of Internet Explorer + * to release the memory. + * + * @api private + */ + + HTMLFile.prototype.destroy = function () { + if (this.iframe){ + try { + this.iframe.src = 'about:blank'; + } catch(e){} + + this.doc = null; + this.iframe.parentNode.removeChild(this.iframe); + this.iframe = null; + + CollectGarbage(); + } + }; + + /** + * Disconnects the established connection. + * + * @returns {Transport} Chaining. + * @api public + */ + + HTMLFile.prototype.close = function () { + this.destroy(); + return io.Transport.XHR.prototype.close.call(this); + }; + + /** + * Checks if the browser supports this transport. The browser + * must have an `Ac...eXObject` implementation. + * + * @return {Boolean} + * @api public + */ + + HTMLFile.check = function (socket) { + if (typeof window != "undefined" && (['Active'].concat('Object').join('X')) in window){ + try { + var a = new window[(['Active'].concat('Object').join('X'))]('htmlfile'); + return a && io.Transport.XHR.check(socket); + } catch(e){} + } + return false; + }; + + /** + * Check if cross domain requests are supported. + * + * @returns {Boolean} + * @api public + */ + + HTMLFile.xdomainCheck = function () { + // we can probably do handling for sub-domains, we should + // test that it's cross domain but a subdomain here + return false; + }; + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('htmlfile'); + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, io, global) { + + /** + * Expose constructor. + */ + + exports['xhr-polling'] = XHRPolling; + + /** + * The XHR-polling transport uses long polling XHR requests to create a + * "persistent" connection with the server. + * + * @constructor + * @api public + */ + + function XHRPolling () { + io.Transport.XHR.apply(this, arguments); + }; + + /** + * Inherits from XHR transport. + */ + + io.util.inherit(XHRPolling, io.Transport.XHR); + + /** + * Merge the properties from XHR transport + */ + + io.util.merge(XHRPolling, io.Transport.XHR); + + /** + * Transport name + * + * @api public + */ + + XHRPolling.prototype.name = 'xhr-polling'; + + /** + * Indicates whether heartbeats is enabled for this transport + * + * @api private + */ + + XHRPolling.prototype.heartbeats = function () { + return false; + }; + + /** + * Establish a connection, for iPhone and Android this will be done once the page + * is loaded. + * + * @returns {Transport} Chaining. + * @api public + */ + + XHRPolling.prototype.open = function () { + var self = this; + + io.Transport.XHR.prototype.open.call(self); + return false; + }; + + /** + * Starts a XHR request to wait for incoming messages. + * + * @api private + */ + + function empty () {}; + + XHRPolling.prototype.get = function () { + if (!this.isOpen) return; + + var self = this; + + function stateChange () { + if (this.readyState == 4) { + this.onreadystatechange = empty; + + if (this.status == 200) { + self.onData(this.responseText); + self.get(); + } else { + self.onClose(); + } + } + }; + + function onload () { + this.onload = empty; + this.onerror = empty; + self.retryCounter = 1; + self.onData(this.responseText); + self.get(); + }; + + function onerror () { + self.retryCounter ++; + if(!self.retryCounter || self.retryCounter > 3) { + self.onClose(); + } else { + self.get(); + } + }; + + this.xhr = this.request(); + + if (global.XDomainRequest && this.xhr instanceof XDomainRequest) { + this.xhr.onload = onload; + this.xhr.onerror = onerror; + } else { + this.xhr.onreadystatechange = stateChange; + } + + this.xhr.send(null); + }; + + /** + * Handle the unclean close behavior. + * + * @api private + */ + + XHRPolling.prototype.onClose = function () { + io.Transport.XHR.prototype.onClose.call(this); + + if (this.xhr) { + this.xhr.onreadystatechange = this.xhr.onload = this.xhr.onerror = empty; + try { + this.xhr.abort(); + } catch(e){} + this.xhr = null; + } + }; + + /** + * Webkit based browsers show a infinit spinner when you start a XHR request + * before the browsers onload event is called so we need to defer opening of + * the transport until the onload event is called. Wrapping the cb in our + * defer method solve this. + * + * @param {Socket} socket The socket instance that needs a transport + * @param {Function} fn The callback + * @api private + */ + + XHRPolling.prototype.ready = function (socket, fn) { + var self = this; + + io.util.defer(function () { + fn.call(self); + }); + }; + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('xhr-polling'); + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); + +/** + * socket.io + * Copyright(c) 2011 LearnBoost <dev@learnboost.com> + * MIT Licensed + */ + +(function (exports, io, global) { + /** + * There is a way to hide the loading indicator in Firefox. If you create and + * remove a iframe it will stop showing the current loading indicator. + * Unfortunately we can't feature detect that and UA sniffing is evil. + * + * @api private + */ + + var indicator = global.document && "MozAppearance" in + global.document.documentElement.style; + + /** + * Expose constructor. + */ + + exports['jsonp-polling'] = JSONPPolling; + + /** + * The JSONP transport creates an persistent connection by dynamically + * inserting a script tag in the page. This script tag will receive the + * information of the Socket.IO server. When new information is received + * it creates a new script tag for the new data stream. + * + * @constructor + * @extends {io.Transport.xhr-polling} + * @api public + */ + + function JSONPPolling (socket) { + io.Transport['xhr-polling'].apply(this, arguments); + + this.index = io.j.length; + + var self = this; + + io.j.push(function (msg) { + self._(msg); + }); + }; + + /** + * Inherits from XHR polling transport. + */ + + io.util.inherit(JSONPPolling, io.Transport['xhr-polling']); + + /** + * Transport name + * + * @api public + */ + + JSONPPolling.prototype.name = 'jsonp-polling'; + + /** + * Posts a encoded message to the Socket.IO server using an iframe. + * The iframe is used because script tags can create POST based requests. + * The iframe is positioned outside of the view so the user does not + * notice it's existence. + * + * @param {String} data A encoded message. + * @api private + */ + + JSONPPolling.prototype.post = function (data) { + var self = this + , query = io.util.query( + this.socket.options.query + , 't='+ (+new Date) + '&i=' + this.index + ); + + if (!this.form) { + var form = document.createElement('form') + , area = document.createElement('textarea') + , id = this.iframeId = 'socketio_iframe_' + this.index + , iframe; + + form.className = 'socketio'; + form.style.position = 'absolute'; + form.style.top = '0px'; + form.style.left = '0px'; + form.style.display = 'none'; + form.target = id; + form.method = 'POST'; + form.setAttribute('accept-charset', 'utf-8'); + area.name = 'd'; + form.appendChild(area); + document.body.appendChild(form); + + this.form = form; + this.area = area; + } + + this.form.action = this.prepareUrl() + query; + + function complete () { + initIframe(); + self.socket.setBuffer(false); + }; + + function initIframe () { + if (self.iframe) { + self.form.removeChild(self.iframe); + } + + try { + // ie6 dynamic iframes with target="" support (thanks Chris Lambacher) + iframe = document.createElement('<iframe name="'+ self.iframeId +'">'); + } catch (e) { + iframe = document.createElement('iframe'); + iframe.name = self.iframeId; + } + + iframe.id = self.iframeId; + + self.form.appendChild(iframe); + self.iframe = iframe; + }; + + initIframe(); + + // we temporarily stringify until we figure out how to prevent + // browsers from turning `\n` into `\r\n` in form inputs + this.area.value = io.JSON.stringify(data); + + try { + this.form.submit(); + } catch(e) {} + + if (this.iframe.attachEvent) { + iframe.onreadystatechange = function () { + if (self.iframe.readyState == 'complete') { + complete(); + } + }; + } else { + this.iframe.onload = complete; + } + + this.socket.setBuffer(true); + }; + + /** + * Creates a new JSONP poll that can be used to listen + * for messages from the Socket.IO server. + * + * @api private + */ + + JSONPPolling.prototype.get = function () { + var self = this + , script = document.createElement('script') + , query = io.util.query( + this.socket.options.query + , 't='+ (+new Date) + '&i=' + this.index + ); + + if (this.script) { + this.script.parentNode.removeChild(this.script); + this.script = null; + } + + script.async = true; + script.src = this.prepareUrl() + query; + script.onerror = function () { + self.onClose(); + }; + + var insertAt = document.getElementsByTagName('script')[0]; + insertAt.parentNode.insertBefore(script, insertAt); + this.script = script; + + if (indicator) { + setTimeout(function () { + var iframe = document.createElement('iframe'); + document.body.appendChild(iframe); + document.body.removeChild(iframe); + }, 100); + } + }; + + /** + * Callback function for the incoming message stream from the Socket.IO server. + * + * @param {String} data The message + * @api private + */ + + JSONPPolling.prototype._ = function (msg) { + this.onData(msg); + if (this.isOpen) { + this.get(); + } + return this; + }; + + /** + * The indicator hack only works after onload + * + * @param {Socket} socket The socket instance that needs a transport + * @param {Function} fn The callback + * @api private + */ + + JSONPPolling.prototype.ready = function (socket, fn) { + var self = this; + if (!indicator) return fn.call(this); + + io.util.load(function () { + fn.call(self); + }); + }; + + /** + * Checks if browser supports this transport. + * + * @return {Boolean} + * @api public + */ + + JSONPPolling.check = function () { + return 'document' in global; + }; + + /** + * Check if cross domain requests are supported + * + * @returns {Boolean} + * @api public + */ + + JSONPPolling.xdomainCheck = function () { + return true; + }; + + /** + * Add the transport to your public io.transports array. + * + * @api private + */ + + io.transports.push('jsonp-polling'); + +})( + 'undefined' != typeof io ? io.Transport : module.exports + , 'undefined' != typeof io ? io : module.parent.exports + , this +); + +if (typeof define === "function" && define.amd) { + define([], function () { return io; }); +} +})(); \ No newline at end of file diff --git a/hub/static/js/lib/spin.js b/hub/static/js/lib/spin.js new file mode 100644 index 0000000..434d76a --- /dev/null +++ b/hub/static/js/lib/spin.js @@ -0,0 +1,320 @@ +//fgnass.github.com/spin.js#v1.2.7 +!function(window, document, undefined) { + + /** + * Copyright (c) 2011 Felix Gnass [fgnass at neteye dot de] + * Licensed under the MIT license + */ + + var prefixes = ['webkit', 'Moz', 'ms', 'O'] /* Vendor prefixes */ + , animations = {} /* Animation rules keyed by their name */ + , useCssAnimations + + /** + * Utility function to create elements. If no tag name is given, + * a DIV is created. Optionally properties can be passed. + */ + function createEl(tag, prop) { + var el = document.createElement(tag || 'div') + , n + + for(n in prop) el[n] = prop[n] + return el + } + + /** + * Appends children and returns the parent. + */ + function ins(parent /* child1, child2, ...*/) { + for (var i=1, n=arguments.length; i<n; i++) + parent.appendChild(arguments[i]) + + return parent + } + + /** + * Insert a new stylesheet to hold the @keyframe or VML rules. + */ + var sheet = function() { + var el = createEl('style', {type : 'text/css'}) + ins(document.getElementsByTagName('head')[0], el) + return el.sheet || el.styleSheet + }() + + /** + * Creates an opacity keyframe animation rule and returns its name. + * Since most mobile Webkits have timing issues with animation-delay, + * we create separate rules for each line/segment. + */ + function addAnimation(alpha, trail, i, lines) { + var name = ['opacity', trail, ~~(alpha*100), i, lines].join('-') + , start = 0.01 + i/lines*100 + , z = Math.max(1 - (1-alpha) / trail * (100-start), alpha) + , prefix = useCssAnimations.substring(0, useCssAnimations.indexOf('Animation')).toLowerCase() + , pre = prefix && '-'+prefix+'-' || '' + + if (!animations[name]) { + sheet.insertRule( + '@' + pre + 'keyframes ' + name + '{' + + '0%{opacity:' + z + '}' + + start + '%{opacity:' + alpha + '}' + + (start+0.01) + '%{opacity:1}' + + (start+trail) % 100 + '%{opacity:' + alpha + '}' + + '100%{opacity:' + z + '}' + + '}', sheet.cssRules.length) + + animations[name] = 1 + } + return name + } + + /** + * Tries various vendor prefixes and returns the first supported property. + **/ + function vendor(el, prop) { + var s = el.style + , pp + , i + + if(s[prop] !== undefined) return prop + prop = prop.charAt(0).toUpperCase() + prop.slice(1) + for(i=0; i<prefixes.length; i++) { + pp = prefixes[i]+prop + if(s[pp] !== undefined) return pp + } + } + + /** + * Sets multiple style properties at once. + */ + function css(el, prop) { + for (var n in prop) + el.style[vendor(el, n)||n] = prop[n] + + return el + } + + /** + * Fills in default values. + */ + function merge(obj) { + for (var i=1; i < arguments.length; i++) { + var def = arguments[i] + for (var n in def) + if (obj[n] === undefined) obj[n] = def[n] + } + return obj + } + + /** + * Returns the absolute page-offset of the given element. + */ + function pos(el) { + var o = { x:el.offsetLeft, y:el.offsetTop } + while((el = el.offsetParent)) + o.x+=el.offsetLeft, o.y+=el.offsetTop + + return o + } + + var defaults = { + lines: 12, // The number of lines to draw + length: 7, // The length of each line + width: 5, // The line thickness + radius: 10, // The radius of the inner circle + rotate: 0, // Rotation offset + corners: 1, // Roundness (0..1) + color: '#000', // #rgb or #rrggbb + speed: 1, // Rounds per second + trail: 100, // Afterglow percentage + opacity: 1/4, // Opacity of the lines + fps: 20, // Frames per second when using setTimeout() + zIndex: 2e9, // Use a high z-index by default + className: 'spinner', // CSS class to assign to the element + top: 'auto', // center vertically + left: 'auto', // center horizontally + position: 'relative' // element position + } + + /** The constructor */ + var Spinner = function Spinner(o) { + if (!this.spin) return new Spinner(o) + this.opts = merge(o || {}, Spinner.defaults, defaults) + } + + Spinner.defaults = {} + + merge(Spinner.prototype, { + spin: function(target) { + this.stop() + var self = this + , o = self.opts + , el = self.el = css(createEl(0, {className: o.className}), {position: o.position, width: 0, zIndex: o.zIndex}) + , mid = o.radius+o.length+o.width + , ep // element position + , tp // target position + + if (target) { + target.insertBefore(el, target.firstChild||null) + tp = pos(target) + ep = pos(el) + css(el, { + left: (o.left == 'auto' ? tp.x-ep.x + (target.offsetWidth >> 1) : parseInt(o.left, 10) + mid) + 'px', + top: (o.top == 'auto' ? tp.y-ep.y + (target.offsetHeight >> 1) : parseInt(o.top, 10) + mid) + 'px' + }) + } + + el.setAttribute('aria-role', 'progressbar') + self.lines(el, self.opts) + + if (!useCssAnimations) { + // No CSS animation support, use setTimeout() instead + var i = 0 + , fps = o.fps + , f = fps/o.speed + , ostep = (1-o.opacity) / (f*o.trail / 100) + , astep = f/o.lines + + ;(function anim() { + i++; + for (var s=o.lines; s; s--) { + var alpha = Math.max(1-(i+s*astep)%f * ostep, o.opacity) + self.opacity(el, o.lines-s, alpha, o) + } + self.timeout = self.el && setTimeout(anim, ~~(1000/fps)) + })() + } + return self + }, + + stop: function() { + var el = this.el + if (el) { + clearTimeout(this.timeout) + if (el.parentNode) el.parentNode.removeChild(el) + this.el = undefined + } + return this + }, + + lines: function(el, o) { + var i = 0 + , seg + + function fill(color, shadow) { + return css(createEl(), { + position: 'absolute', + width: (o.length+o.width) + 'px', + height: o.width + 'px', + background: color, + boxShadow: shadow, + transformOrigin: 'left', + transform: 'rotate(' + ~~(360/o.lines*i+o.rotate) + 'deg) translate(' + o.radius+'px' +',0)', + borderRadius: (o.corners * o.width>>1) + 'px' + }) + } + + for (; i < o.lines; i++) { + seg = css(createEl(), { + position: 'absolute', + top: 1+~(o.width/2) + 'px', + transform: o.hwaccel ? 'translate3d(0,0,0)' : '', + opacity: o.opacity, + animation: useCssAnimations && addAnimation(o.opacity, o.trail, i, o.lines) + ' ' + 1/o.speed + 's linear infinite' + }) + + if (o.shadow) ins(seg, css(fill('#000', '0 0 4px ' + '#000'), {top: 2+'px'})) + + ins(el, ins(seg, fill(o.color, '0 0 1px rgba(0,0,0,.1)'))) + } + return el + }, + + opacity: function(el, i, val) { + if (i < el.childNodes.length) el.childNodes[i].style.opacity = val + } + + }) + + ///////////////////////////////////////////////////////////////////////// + // VML rendering for IE + ///////////////////////////////////////////////////////////////////////// + + /** + * Check and init VML support + */ + ;(function() { + + function vml(tag, attr) { + return createEl('<' + tag + ' xmlns="urn:schemas-microsoft.com:vml" class="spin-vml">', attr) + } + + var s = css(createEl('group'), {behavior: 'url(#default#VML)'}) + + if (!vendor(s, 'transform') && s.adj) { + + // VML support detected. Insert CSS rule ... + sheet.addRule('.spin-vml', 'behavior:url(#default#VML)') + + Spinner.prototype.lines = function(el, o) { + var r = o.length+o.width + , s = 2*r + + function grp() { + return css( + vml('group', { + coordsize: s + ' ' + s, + coordorigin: -r + ' ' + -r + }), + { width: s, height: s } + ) + } + + var margin = -(o.width+o.length)*2 + 'px' + , g = css(grp(), {position: 'absolute', top: margin, left: margin}) + , i + + function seg(i, dx, filter) { + ins(g, + ins(css(grp(), {rotation: 360 / o.lines * i + 'deg', left: ~~dx}), + ins(css(vml('roundrect', {arcsize: o.corners}), { + width: r, + height: o.width, + left: o.radius, + top: -o.width>>1, + filter: filter + }), + vml('fill', {color: o.color, opacity: o.opacity}), + vml('stroke', {opacity: 0}) // transparent stroke to fix color bleeding upon opacity change + ) + ) + ) + } + + if (o.shadow) + for (i = 1; i <= o.lines; i++) + seg(i, -2, 'progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)') + + for (i = 1; i <= o.lines; i++) seg(i) + return ins(el, g) + } + + Spinner.prototype.opacity = function(el, i, val, o) { + var c = el.firstChild + o = o.shadow && o.lines || 0 + if (c && i+o < c.childNodes.length) { + c = c.childNodes[i+o]; c = c && c.firstChild; c = c && c.firstChild + if (c) c.opacity = val + } + } + } + else + useCssAnimations = vendor(s, 'animation') + })() + + if (typeof define == 'function' && define.amd) + define(function() { return Spinner }) + else + window.Spinner = Spinner + +}(window, document); diff --git a/hub/static/js/lib/store.js b/hub/static/js/lib/store.js new file mode 100644 index 0000000..8446217 --- /dev/null +++ b/hub/static/js/lib/store.js @@ -0,0 +1,152 @@ +;(function(win){ + var store = {}, + doc = win.document, + localStorageName = 'localStorage', + namespace = '__storejs__', + storage + + store.disabled = false + store.set = function(key, value) {} + store.get = function(key) {} + store.remove = function(key) {} + store.clear = function() {} + store.transact = function(key, defaultVal, transactionFn) { + var val = store.get(key) + if (transactionFn == null) { + transactionFn = defaultVal + defaultVal = null + } + if (typeof val == 'undefined') { val = defaultVal || {} } + transactionFn(val) + store.set(key, val) + } + store.getAll = function() {} + + store.serialize = function(value) { + return JSON.stringify(value) + } + store.deserialize = function(value) { + if (typeof value != 'string') { return undefined } + try { return JSON.parse(value) } + catch(e) { return value || undefined } + } + + // Functions to encapsulate questionable FireFox 3.6.13 behavior + // when about.config::dom.storage.enabled === false + // See https://github.com/marcuswestin/store.js/issues#issue/13 + function isLocalStorageNameSupported() { + try { return (localStorageName in win && win[localStorageName]) } + catch(err) { return false } + } + + if (isLocalStorageNameSupported()) { + storage = win[localStorageName] + store.set = function(key, val) { + if (val === undefined) { return store.remove(key) } + storage.setItem(key, store.serialize(val)) + return val + } + store.get = function(key) { return store.deserialize(storage.getItem(key)) } + store.remove = function(key) { storage.removeItem(key) } + store.clear = function() { storage.clear() } + store.getAll = function() { + var ret = {} + for (var i=0; i<storage.length; ++i) { + var key = storage.key(i) + ret[key] = store.get(key) + } + return ret + } + } else if (doc.documentElement.addBehavior) { + var storageOwner, + storageContainer + // Since #userData storage applies only to specific paths, we need to + // somehow link our data to a specific path. We choose /favicon.ico + // as a pretty safe option, since all browsers already make a request to + // this URL anyway and being a 404 will not hurt us here. We wrap an + // iframe pointing to the favicon in an ActiveXObject(htmlfile) object + // (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx) + // since the iframe access rules appear to allow direct access and + // manipulation of the document element, even for a 404 page. This + // document can be used instead of the current document (which would + // have been limited to the current path) to perform #userData storage. + try { + storageContainer = new ActiveXObject('htmlfile') + storageContainer.open() + storageContainer.write('<s' + 'cript>document.w=window</s' + 'cript><iframe src="/favicon.ico"></iframe>') + storageContainer.close() + storageOwner = storageContainer.w.frames[0].document + storage = storageOwner.createElement('div') + } catch(e) { + // somehow ActiveXObject instantiation failed (perhaps some special + // security settings or otherwse), fall back to per-path storage + storage = doc.createElement('div') + storageOwner = doc.body + } + function withIEStorage(storeFunction) { + return function() { + var args = Array.prototype.slice.call(arguments, 0) + args.unshift(storage) + // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx + // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx + storageOwner.appendChild(storage) + storage.addBehavior('#default#userData') + storage.load(localStorageName) + var result = storeFunction.apply(store, args) + storageOwner.removeChild(storage) + return result + } + } + + // In IE7, keys may not contain special chars. See all of https://github.com/marcuswestin/store.js/issues/40 + var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g") + function ieKeyFix(key) { + return key.replace(forbiddenCharsRegex, '___') + } + store.set = withIEStorage(function(storage, key, val) { + key = ieKeyFix(key) + if (val === undefined) { return store.remove(key) } + storage.setAttribute(key, store.serialize(val)) + storage.save(localStorageName) + return val + }) + store.get = withIEStorage(function(storage, key) { + key = ieKeyFix(key) + return store.deserialize(storage.getAttribute(key)) + }) + store.remove = withIEStorage(function(storage, key) { + key = ieKeyFix(key) + storage.removeAttribute(key) + storage.save(localStorageName) + }) + store.clear = withIEStorage(function(storage) { + var attributes = storage.XMLDocument.documentElement.attributes + storage.load(localStorageName) + for (var i=0, attr; attr=attributes[i]; i++) { + storage.removeAttribute(attr.name) + } + storage.save(localStorageName) + }) + store.getAll = withIEStorage(function(storage) { + var attributes = storage.XMLDocument.documentElement.attributes + var ret = {} + for (var i=0, attr; attr=attributes[i]; ++i) { + var key = ieKeyFix(attr.name) + ret[attr.name] = store.deserialize(storage.getAttribute(key)) + } + return ret + }) + } + + try { + store.set(namespace, namespace) + if (store.get(namespace) != namespace) { store.disabled = true } + store.remove(namespace) + } catch(e) { + store.disabled = true + } + store.enabled = !store.disabled + if (typeof module != 'undefined' && module.exports) { module.exports = store } + else if (typeof define === 'function' && define.amd) { define(store) } + else { win.store = store } +})(this.window || global); diff --git a/hub/static/js/lib/string_score.js b/hub/static/js/lib/string_score.js new file mode 100644 index 0000000..82e42be --- /dev/null +++ b/hub/static/js/lib/string_score.js @@ -0,0 +1,116 @@ +/*! + * string_score.js: String Scoring Algorithm 0.1.10 + * + * http://joshaven.com/string_score + * https://github.com/joshaven/string_score + * + * Copyright (C) 2009-2011 Joshaven Potter <yourtech@gmail.com> + * Special thanks to all of the contributors listed here https://github.com/joshaven/string_score + * MIT license: http://www.opensource.org/licenses/mit-license.php + * + * Date: Tue Mar 1 2011 +*/ + +/** + * Scores a string against another string. + * 'Hello World'.score('he'); //=> 0.5931818181818181 + * 'Hello World'.score('Hello'); //=> 0.7318181818181818 + */ +String.prototype.score = function(abbreviation, fuzziness) { + // If the string is equal to the abbreviation, perfect match. + if (this == abbreviation) {return 1;} + //if it's not a perfect match and is empty return 0 + if(abbreviation == "") {return 0;} + + var total_character_score = 0, + abbreviation_length = abbreviation.length, + string = this, + string_length = string.length, + start_of_string_bonus, + abbreviation_score, + fuzzies=1, + final_score; + + // Walk through abbreviation and add up scores. + for (var i = 0, + character_score/* = 0*/, + index_in_string/* = 0*/, + c/* = ''*/, + index_c_lowercase/* = 0*/, + index_c_uppercase/* = 0*/, + min_index/* = 0*/; + i < abbreviation_length; + ++i) { + + // Find the first case-insensitive match of a character. + c = abbreviation.charAt(i); + + index_c_lowercase = string.indexOf(c.toLowerCase()); + index_c_uppercase = string.indexOf(c.toUpperCase()); + min_index = Math.min(index_c_lowercase, index_c_uppercase); + index_in_string = (min_index > -1) ? min_index : Math.max(index_c_lowercase, index_c_uppercase); + + if (index_in_string === -1) { + if (fuzziness) { + fuzzies += 1-fuzziness; + continue; + } else { + return 0; + } + } else { + character_score = 0.1; + } + + // Set base score for matching 'c'. + + // Same case bonus. + if (string[index_in_string] === c) { + character_score += 0.1; + } + + // Consecutive letter & start-of-string Bonus + if (index_in_string === 0) { + // Increase the score when matching first character of the remainder of the string + character_score += 0.6; + if (i === 0) { + // If match is the first character of the string + // & the first character of abbreviation, add a + // start-of-string match bonus. + start_of_string_bonus = 1 //true; + } + } + else { + // Acronym Bonus + // Weighing Logic: Typing the first character of an acronym is as if you + // preceded it with two perfect character matches. + if (string.charAt(index_in_string - 1) === ' ') { + character_score += 0.8; // * Math.min(index_in_string, 5); // Cap bonus at 0.4 * 5 + } + } + + // Left trim the already matched part of the string + // (forces sequential matching). + string = string.substring(index_in_string + 1, string_length); + + total_character_score += character_score; + } // end of for loop + + // Uncomment to weigh smaller words higher. + // return total_character_score / string_length; + + abbreviation_score = total_character_score / abbreviation_length; + //percentage_of_matched_string = abbreviation_length / string_length; + //word_score = abbreviation_score * percentage_of_matched_string; + + // Reduce penalty for longer strings. + //final_score = (word_score + abbreviation_score) / 2; + final_score = ((abbreviation_score * (abbreviation_length / string_length)) + abbreviation_score) / 2; + + final_score = final_score / fuzzies; + + if (start_of_string_bonus && (final_score + 0.15 < 1)) { + final_score += 0.15; + } + + return final_score; +}; diff --git a/hub/static/js/lib/tag-it.js b/hub/static/js/lib/tag-it.js new file mode 100644 index 0000000..3e30af5 --- /dev/null +++ b/hub/static/js/lib/tag-it.js @@ -0,0 +1,125 @@ +(function($) { + + $.fn.tagit = function(options) { + + var el = this; + + const BACKSPACE = 8; + const ENTER = 13; + const SPACE = 32; + const COMMA = 44; + + // add the tagit CSS class. + el.addClass("tagit"); + + // create the input field. + var html_input_field = "<li class=\"tagit-new\"><input class=\"tagit-input\" type=\"text\" /></li>\n"; + el.html (html_input_field); + + tag_input = el.children(".tagit-new").children(".tagit-input"); + + $(this).click(function(e){ + if (e.target.tagName == 'A') { + // Removes a tag when the little 'x' is clicked. + // Event is binded to the UL, otherwise a new tag (LI > A) wouldn't have this event attached to it. + $(e.target).parent().remove(); + } + else { + // Sets the focus() to the input field, if the user clicks anywhere inside the UL. + // This is needed because the input field needs to be of a small size. + tag_input.focus(); + } + }); + + $(this).delegate('.tagit-choice', 'click', function(){ + // the little 'x' is hard to click =.= + $(this).remove(); + }); + + tag_input.blur(function () { + var unhandlerTag = tag_input.val(); + unhandlerTag = unhandlerTag.replace(/,+$/,""); + unhandlerTag = unhandlerTag.trim(); + if (unhandlerTag !== ''){ + if (is_new (unhandlerTag)) { + create_choice (unhandlerTag); + } + // Cleaning the input. + tag_input.val(""); + } + }); + + if (options) { + if (options.hasOwnProperty('tag_list')) { + options.tag_list.click(function(event){ + + var typed = $(event.target).html(); + typed = typed.replace(/,+$/,""); + typed = typed.trim(); + + if (typed != "") { + if (is_new (typed)) { + create_choice (typed); + } + } + }); + } + if (options.hasOwnProperty('fillup')) { + for (var i in options.fillup) { + create_choice(options.fillup[i]); + } + } + } + tag_input.keypress(function(event){ + if (event.which == BACKSPACE) { + if (tag_input.val() == "") { + // When backspace is pressed, the last tag is deleted. + $(el).children(".tagit-choice:last").remove(); + } + } + // Comma/Space/Enter are all valid delimiters for new tags. + else if (event.which == COMMA || event.which == SPACE || event.which == ENTER) { + event.preventDefault(); + + var typed = tag_input.val(); + typed = typed.replace(/,+$/,""); + typed = typed.trim(); + + if (typed != "") { + if (is_new (typed)) { + create_choice (typed); + } + // Cleaning the input. + tag_input.val(""); + } + } + }); + + function is_new (value){ + var is_new = true; + this.tag_input.parents("ul").children(".tagit-choice").each(function(i){ + n = $(this).children("input").val(); + if (value == n) { + is_new = false; + } + }); + return is_new; + } + function create_choice (value){ + var el = ""; + el = "<li class=\"tagit-choice\">\n"; + el += value + "\n"; + el += "<a class=\"tag-close\">x</a>\n"; + el += "<input type=\"hidden\" style=\"display:none;\" value=\""+value+"\" name=\""+ options.input_name +"\">\n"; + el += "</li>\n"; + var li_search_tags = this.tag_input.parent(); + $(el).insertBefore (li_search_tags); + this.tag_input.val(""); + } + }; + + String.prototype.trim = function() { + return this.replace(/^\s+|\s+$/g,""); + }; + +})(jQuery); diff --git a/hub/static/js/lib/tinycolor.js b/hub/static/js/lib/tinycolor.js new file mode 100644 index 0000000..a37833c --- /dev/null +++ b/hub/static/js/lib/tinycolor.js @@ -0,0 +1,963 @@ +// TinyColor v0.9.16 +// https://github.com/bgrins/TinyColor +// 2013-08-10, Brian Grinstead, MIT License + +(function() { + +var trimLeft = /^[\s,#]+/, + trimRight = /\s+$/, + tinyCounter = 0, + math = Math, + mathRound = math.round, + mathMin = math.min, + mathMax = math.max, + mathRandom = math.random; + +function tinycolor (color, opts) { + + color = (color) ? color : ''; + opts = opts || { }; + + // If input is already a tinycolor, return itself + if (typeof color == "object" && color.hasOwnProperty("_tc_id")) { + return color; + } + + var rgb = inputToRGB(color); + var r = rgb.r, + g = rgb.g, + b = rgb.b, + a = rgb.a, + roundA = mathRound(100*a) / 100, + format = opts.format || rgb.format; + + // Don't let the range of [0,255] come back in [0,1]. + // Potentially lose a little bit of precision here, but will fix issues where + // .5 gets interpreted as half of the total, instead of half of 1 + // If it was supposed to be 128, this was already taken care of by `inputToRgb` + if (r < 1) { r = mathRound(r); } + if (g < 1) { g = mathRound(g); } + if (b < 1) { b = mathRound(b); } + + return { + ok: rgb.ok, + format: format, + _tc_id: tinyCounter++, + alpha: a, + getAlpha: function() { + return a; + }, + setAlpha: function(value) { + a = boundAlpha(value); + roundA = mathRound(100*a) / 100; + }, + toHsv: function() { + var hsv = rgbToHsv(r, g, b); + return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: a }; + }, + toHsvString: function() { + var hsv = rgbToHsv(r, g, b); + var h = mathRound(hsv.h * 360), s = mathRound(hsv.s * 100), v = mathRound(hsv.v * 100); + return (a == 1) ? + "hsv(" + h + ", " + s + "%, " + v + "%)" : + "hsva(" + h + ", " + s + "%, " + v + "%, "+ roundA + ")"; + }, + toHsl: function() { + var hsl = rgbToHsl(r, g, b); + return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: a }; + }, + toHslString: function() { + var hsl = rgbToHsl(r, g, b); + var h = mathRound(hsl.h * 360), s = mathRound(hsl.s * 100), l = mathRound(hsl.l * 100); + return (a == 1) ? + "hsl(" + h + ", " + s + "%, " + l + "%)" : + "hsla(" + h + ", " + s + "%, " + l + "%, "+ roundA + ")"; + }, + toHex: function(allow3Char) { + return rgbToHex(r, g, b, allow3Char); + }, + toHexString: function(allow3Char) { + return '#' + this.toHex(allow3Char); + }, + toHex8: function() { + return rgbaToHex(r, g, b, a); + }, + toHex8String: function() { + return '#' + this.toHex8(); + }, + toRgb: function() { + return { r: mathRound(r), g: mathRound(g), b: mathRound(b), a: a }; + }, + toRgbString: function() { + return (a == 1) ? + "rgb(" + mathRound(r) + ", " + mathRound(g) + ", " + mathRound(b) + ")" : + "rgba(" + mathRound(r) + ", " + mathRound(g) + ", " + mathRound(b) + ", " + roundA + ")"; + }, + toPercentageRgb: function() { + return { r: mathRound(bound01(r, 255) * 100) + "%", g: mathRound(bound01(g, 255) * 100) + "%", b: mathRound(bound01(b, 255) * 100) + "%", a: a }; + }, + toPercentageRgbString: function() { + return (a == 1) ? + "rgb(" + mathRound(bound01(r, 255) * 100) + "%, " + mathRound(bound01(g, 255) * 100) + "%, " + mathRound(bound01(b, 255) * 100) + "%)" : + "rgba(" + mathRound(bound01(r, 255) * 100) + "%, " + mathRound(bound01(g, 255) * 100) + "%, " + mathRound(bound01(b, 255) * 100) + "%, " + roundA + ")"; + }, + toName: function() { + if (a === 0) { + return "transparent"; + } + + return hexNames[rgbToHex(r, g, b, true)] || false; + }, + toFilter: function(secondColor) { + var hex8String = '#' + rgbaToHex(r, g, b, a); + var secondHex8String = hex8String; + var gradientType = opts && opts.gradientType ? "GradientType = 1, " : ""; + + if (secondColor) { + var s = tinycolor(secondColor); + secondHex8String = s.toHex8String(); + } + + return "progid:DXImageTransform.Microsoft.gradient("+gradientType+"startColorstr="+hex8String+",endColorstr="+secondHex8String+")"; + }, + toString: function(format) { + var formatSet = !!format; + format = format || this.format; + + var formattedString = false; + var hasAlphaAndFormatNotSet = !formatSet && a < 1 && a > 0; + var formatWithAlpha = hasAlphaAndFormatNotSet && (format === "hex" || format === "hex6" || format === "hex3" || format === "name"); + + if (format === "rgb") { + formattedString = this.toRgbString(); + } + if (format === "prgb") { + formattedString = this.toPercentageRgbString(); + } + if (format === "hex" || format === "hex6") { + formattedString = this.toHexString(); + } + if (format === "hex3") { + formattedString = this.toHexString(true); + } + if (format === "hex8") { + formattedString = this.toHex8String(); + } + if (format === "name") { + formattedString = this.toName(); + } + if (format === "hsl") { + formattedString = this.toHslString(); + } + if (format === "hsv") { + formattedString = this.toHsvString(); + } + + if (formatWithAlpha) { + return this.toRgbString(); + } + + return formattedString || this.toHexString(); + } + }; +} + +// If input is an object, force 1 into "1.0" to handle ratios properly +// String input requires "1.0" as input, so 1 will be treated as 1 +tinycolor.fromRatio = function(color, opts) { + if (typeof color == "object") { + var newColor = {}; + for (var i in color) { + if (color.hasOwnProperty(i)) { + if (i === "a") { + newColor[i] = color[i]; + } + else { + newColor[i] = convertToPercentage(color[i]); + } + } + } + color = newColor; + } + + return tinycolor(color, opts); +}; + +// Given a string or object, convert that input to RGB +// Possible string inputs: +// +// "red" +// "#f00" or "f00" +// "#ff0000" or "ff0000" +// "#ff000000" or "ff000000" +// "rgb 255 0 0" or "rgb (255, 0, 0)" +// "rgb 1.0 0 0" or "rgb (1, 0, 0)" +// "rgba (255, 0, 0, 1)" or "rgba 255, 0, 0, 1" +// "rgba (1.0, 0, 0, 1)" or "rgba 1.0, 0, 0, 1" +// "hsl(0, 100%, 50%)" or "hsl 0 100% 50%" +// "hsla(0, 100%, 50%, 1)" or "hsla 0 100% 50%, 1" +// "hsv(0, 100%, 100%)" or "hsv 0 100% 100%" +// +function inputToRGB(color) { + + var rgb = { r: 0, g: 0, b: 0 }; + var a = 1; + var ok = false; + var format = false; + + if (typeof color == "string") { + color = stringInputToObject(color); + } + + if (typeof color == "object") { + if (color.hasOwnProperty("r") && color.hasOwnProperty("g") && color.hasOwnProperty("b")) { + rgb = rgbToRgb(color.r, color.g, color.b); + ok = true; + format = String(color.r).substr(-1) === "%" ? "prgb" : "rgb"; + } + else if (color.hasOwnProperty("h") && color.hasOwnProperty("s") && color.hasOwnProperty("v")) { + color.s = convertToPercentage(color.s); + color.v = convertToPercentage(color.v); + rgb = hsvToRgb(color.h, color.s, color.v); + ok = true; + format = "hsv"; + } + else if (color.hasOwnProperty("h") && color.hasOwnProperty("s") && color.hasOwnProperty("l")) { + color.s = convertToPercentage(color.s); + color.l = convertToPercentage(color.l); + rgb = hslToRgb(color.h, color.s, color.l); + ok = true; + format = "hsl"; + } + + if (color.hasOwnProperty("a")) { + a = color.a; + } + } + + a = boundAlpha(a); + + return { + ok: ok, + format: color.format || format, + r: mathMin(255, mathMax(rgb.r, 0)), + g: mathMin(255, mathMax(rgb.g, 0)), + b: mathMin(255, mathMax(rgb.b, 0)), + a: a + }; +} + + +// Conversion Functions +// -------------------- + +// `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from: +// <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript> + +// `rgbToRgb` +// Handle bounds / percentage checking to conform to CSS color spec +// <http://www.w3.org/TR/css3-color/> +// *Assumes:* r, g, b in [0, 255] or [0, 1] +// *Returns:* { r, g, b } in [0, 255] +function rgbToRgb(r, g, b){ + return { + r: bound01(r, 255) * 255, + g: bound01(g, 255) * 255, + b: bound01(b, 255) * 255 + }; +} + +// `rgbToHsl` +// Converts an RGB color value to HSL. +// *Assumes:* r, g, and b are contained in [0, 255] or [0, 1] +// *Returns:* { h, s, l } in [0,1] +function rgbToHsl(r, g, b) { + + r = bound01(r, 255); + g = bound01(g, 255); + b = bound01(b, 255); + + var max = mathMax(r, g, b), min = mathMin(r, g, b); + var h, s, l = (max + min) / 2; + + if(max == min) { + h = s = 0; // achromatic + } + else { + var d = max - min; + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + switch(max) { + case r: h = (g - b) / d + (g < b ? 6 : 0); break; + case g: h = (b - r) / d + 2; break; + case b: h = (r - g) / d + 4; break; + } + + h /= 6; + } + + return { h: h, s: s, l: l }; +} + +// `hslToRgb` +// Converts an HSL color value to RGB. +// *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100] +// *Returns:* { r, g, b } in the set [0, 255] +function hslToRgb(h, s, l) { + var r, g, b; + + h = bound01(h, 360); + s = bound01(s, 100); + l = bound01(l, 100); + + function hue2rgb(p, q, t) { + if(t < 0) t += 1; + if(t > 1) t -= 1; + if(t < 1/6) return p + (q - p) * 6 * t; + if(t < 1/2) return q; + if(t < 2/3) return p + (q - p) * (2/3 - t) * 6; + return p; + } + + if(s === 0) { + r = g = b = l; // achromatic + } + else { + var q = l < 0.5 ? l * (1 + s) : l + s - l * s; + var p = 2 * l - q; + r = hue2rgb(p, q, h + 1/3); + g = hue2rgb(p, q, h); + b = hue2rgb(p, q, h - 1/3); + } + + return { r: r * 255, g: g * 255, b: b * 255 }; +} + +// `rgbToHsv` +// Converts an RGB color value to HSV +// *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1] +// *Returns:* { h, s, v } in [0,1] +function rgbToHsv(r, g, b) { + + r = bound01(r, 255); + g = bound01(g, 255); + b = bound01(b, 255); + + var max = mathMax(r, g, b), min = mathMin(r, g, b); + var h, s, v = max; + + var d = max - min; + s = max === 0 ? 0 : d / max; + + if(max == min) { + h = 0; // achromatic + } + else { + switch(max) { + case r: h = (g - b) / d + (g < b ? 6 : 0); break; + case g: h = (b - r) / d + 2; break; + case b: h = (r - g) / d + 4; break; + } + h /= 6; + } + return { h: h, s: s, v: v }; +} + +// `hsvToRgb` +// Converts an HSV color value to RGB. +// *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100] +// *Returns:* { r, g, b } in the set [0, 255] + function hsvToRgb(h, s, v) { + + h = bound01(h, 360) * 6; + s = bound01(s, 100); + v = bound01(v, 100); + + var i = math.floor(h), + f = h - i, + p = v * (1 - s), + q = v * (1 - f * s), + t = v * (1 - (1 - f) * s), + mod = i % 6, + r = [v, q, p, p, t, v][mod], + g = [t, v, v, q, p, p][mod], + b = [p, p, t, v, v, q][mod]; + + return { r: r * 255, g: g * 255, b: b * 255 }; +} + +// `rgbToHex` +// Converts an RGB color to hex +// Assumes r, g, and b are contained in the set [0, 255] +// Returns a 3 or 6 character hex +function rgbToHex(r, g, b, allow3Char) { + + var hex = [ + pad2(mathRound(r).toString(16)), + pad2(mathRound(g).toString(16)), + pad2(mathRound(b).toString(16)) + ]; + + // Return a 3 character hex if possible + if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) { + return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0); + } + + return hex.join(""); +} + // `rgbaToHex` + // Converts an RGBA color plus alpha transparency to hex + // Assumes r, g, b and a are contained in the set [0, 255] + // Returns an 8 character hex + function rgbaToHex(r, g, b, a) { + + var hex = [ + pad2(convertDecimalToHex(a)), + pad2(mathRound(r).toString(16)), + pad2(mathRound(g).toString(16)), + pad2(mathRound(b).toString(16)) + ]; + + return hex.join(""); + } + +// `equals` +// Can be called with any tinycolor input +tinycolor.equals = function (color1, color2) { + if (!color1 || !color2) { return false; } + return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString(); +}; +tinycolor.random = function() { + return tinycolor.fromRatio({ + r: mathRandom(), + g: mathRandom(), + b: mathRandom() + }); +}; + + +// Modification Functions +// ---------------------- +// Thanks to less.js for some of the basics here +// <https://github.com/cloudhead/less.js/blob/master/lib/less/functions.js> + +tinycolor.desaturate = function (color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var hsl = tinycolor(color).toHsl(); + hsl.s -= amount / 100; + hsl.s = clamp01(hsl.s); + return tinycolor(hsl); +}; +tinycolor.saturate = function (color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var hsl = tinycolor(color).toHsl(); + hsl.s += amount / 100; + hsl.s = clamp01(hsl.s); + return tinycolor(hsl); +}; +tinycolor.greyscale = function(color) { + return tinycolor.desaturate(color, 100); +}; +tinycolor.lighten = function(color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var hsl = tinycolor(color).toHsl(); + hsl.l += amount / 100; + hsl.l = clamp01(hsl.l); + return tinycolor(hsl); +}; +tinycolor.darken = function (color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var hsl = tinycolor(color).toHsl(); + hsl.l -= amount / 100; + hsl.l = clamp01(hsl.l); + return tinycolor(hsl); +}; +tinycolor.complement = function(color) { + var hsl = tinycolor(color).toHsl(); + hsl.h = (hsl.h + 180) % 360; + return tinycolor(hsl); +}; + + +// Combination Functions +// --------------------- +// Thanks to jQuery xColor for some of the ideas behind these +// <https://github.com/infusion/jQuery-xcolor/blob/master/jquery.xcolor.js> + +tinycolor.triad = function(color) { + var hsl = tinycolor(color).toHsl(); + var h = hsl.h; + return [ + tinycolor(color), + tinycolor({ h: (h + 120) % 360, s: hsl.s, l: hsl.l }), + tinycolor({ h: (h + 240) % 360, s: hsl.s, l: hsl.l }) + ]; +}; +tinycolor.tetrad = function(color) { + var hsl = tinycolor(color).toHsl(); + var h = hsl.h; + return [ + tinycolor(color), + tinycolor({ h: (h + 90) % 360, s: hsl.s, l: hsl.l }), + tinycolor({ h: (h + 180) % 360, s: hsl.s, l: hsl.l }), + tinycolor({ h: (h + 270) % 360, s: hsl.s, l: hsl.l }) + ]; +}; +tinycolor.splitcomplement = function(color) { + var hsl = tinycolor(color).toHsl(); + var h = hsl.h; + return [ + tinycolor(color), + tinycolor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l}), + tinycolor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l}) + ]; +}; +tinycolor.analogous = function(color, results, slices) { + results = results || 6; + slices = slices || 30; + + var hsl = tinycolor(color).toHsl(); + var part = 360 / slices; + var ret = [tinycolor(color)]; + + for (hsl.h = ((hsl.h - (part * results >> 1)) + 720) % 360; --results; ) { + hsl.h = (hsl.h + part) % 360; + ret.push(tinycolor(hsl)); + } + return ret; +}; +tinycolor.monochromatic = function(color, results) { + results = results || 6; + var hsv = tinycolor(color).toHsv(); + var h = hsv.h, s = hsv.s, v = hsv.v; + var ret = []; + var modification = 1 / results; + + while (results--) { + ret.push(tinycolor({ h: h, s: s, v: v})); + v = (v + modification) % 1; + } + + return ret; +}; + + +// Readability Functions +// --------------------- +// <http://www.w3.org/TR/AERT#color-contrast> + +// `readability` +// Analyze the 2 colors and returns an object with the following properties: +// `brightness`: difference in brightness between the two colors +// `color`: difference in color/hue between the two colors +tinycolor.readability = function(color1, color2) { + var a = tinycolor(color1).toRgb(); + var b = tinycolor(color2).toRgb(); + var brightnessA = (a.r * 299 + a.g * 587 + a.b * 114) / 1000; + var brightnessB = (b.r * 299 + b.g * 587 + b.b * 114) / 1000; + var colorDiff = ( + Math.max(a.r, b.r) - Math.min(a.r, b.r) + + Math.max(a.g, b.g) - Math.min(a.g, b.g) + + Math.max(a.b, b.b) - Math.min(a.b, b.b) + ); + + return { + brightness: Math.abs(brightnessA - brightnessB), + color: colorDiff + }; +}; + +// `readable` +// http://www.w3.org/TR/AERT#color-contrast +// Ensure that foreground and background color combinations provide sufficient contrast. +// *Example* +// tinycolor.readable("#000", "#111") => false +tinycolor.readable = function(color1, color2) { + var readability = tinycolor.readability(color1, color2); + return readability.brightness > 125 && readability.color > 500; +}; + +// `mostReadable` +// Given a base color and a list of possible foreground or background +// colors for that base, returns the most readable color. +// *Example* +// tinycolor.mostReadable("#123", ["#fff", "#000"]) => "#000" +tinycolor.mostReadable = function(baseColor, colorList) { + var bestColor = null; + var bestScore = 0; + var bestIsReadable = false; + for (var i=0; i < colorList.length; i++) { + + // We normalize both around the "acceptable" breaking point, + // but rank brightness constrast higher than hue. + + var readability = tinycolor.readability(baseColor, colorList[i]); + var readable = readability.brightness > 125 && readability.color > 500; + var score = 3 * (readability.brightness / 125) + (readability.color / 500); + + if ((readable && ! bestIsReadable) || + (readable && bestIsReadable && score > bestScore) || + ((! readable) && (! bestIsReadable) && score > bestScore)) { + bestIsReadable = readable; + bestScore = score; + bestColor = tinycolor(colorList[i]); + } + } + return bestColor; +}; + + +// Big List of Colors +// ------------------ +// <http://www.w3.org/TR/css3-color/#svg-color> +var names = tinycolor.names = { + aliceblue: "f0f8ff", + antiquewhite: "faebd7", + aqua: "0ff", + aquamarine: "7fffd4", + azure: "f0ffff", + beige: "f5f5dc", + bisque: "ffe4c4", + black: "000", + blanchedalmond: "ffebcd", + blue: "00f", + blueviolet: "8a2be2", + brown: "a52a2a", + burlywood: "deb887", + burntsienna: "ea7e5d", + cadetblue: "5f9ea0", + chartreuse: "7fff00", + chocolate: "d2691e", + coral: "ff7f50", + cornflowerblue: "6495ed", + cornsilk: "fff8dc", + crimson: "dc143c", + cyan: "0ff", + darkblue: "00008b", + darkcyan: "008b8b", + darkgoldenrod: "b8860b", + darkgray: "a9a9a9", + darkgreen: "006400", + darkgrey: "a9a9a9", + darkkhaki: "bdb76b", + darkmagenta: "8b008b", + darkolivegreen: "556b2f", + darkorange: "ff8c00", + darkorchid: "9932cc", + darkred: "8b0000", + darksalmon: "e9967a", + darkseagreen: "8fbc8f", + darkslateblue: "483d8b", + darkslategray: "2f4f4f", + darkslategrey: "2f4f4f", + darkturquoise: "00ced1", + darkviolet: "9400d3", + deeppink: "ff1493", + deepskyblue: "00bfff", + dimgray: "696969", + dimgrey: "696969", + dodgerblue: "1e90ff", + firebrick: "b22222", + floralwhite: "fffaf0", + forestgreen: "228b22", + fuchsia: "f0f", + gainsboro: "dcdcdc", + ghostwhite: "f8f8ff", + gold: "ffd700", + goldenrod: "daa520", + gray: "808080", + green: "008000", + greenyellow: "adff2f", + grey: "808080", + honeydew: "f0fff0", + hotpink: "ff69b4", + indianred: "cd5c5c", + indigo: "4b0082", + ivory: "fffff0", + khaki: "f0e68c", + lavender: "e6e6fa", + lavenderblush: "fff0f5", + lawngreen: "7cfc00", + lemonchiffon: "fffacd", + lightblue: "add8e6", + lightcoral: "f08080", + lightcyan: "e0ffff", + lightgoldenrodyellow: "fafad2", + lightgray: "d3d3d3", + lightgreen: "90ee90", + lightgrey: "d3d3d3", + lightpink: "ffb6c1", + lightsalmon: "ffa07a", + lightseagreen: "20b2aa", + lightskyblue: "87cefa", + lightslategray: "789", + lightslategrey: "789", + lightsteelblue: "b0c4de", + lightyellow: "ffffe0", + lime: "0f0", + limegreen: "32cd32", + linen: "faf0e6", + magenta: "f0f", + maroon: "800000", + mediumaquamarine: "66cdaa", + mediumblue: "0000cd", + mediumorchid: "ba55d3", + mediumpurple: "9370db", + mediumseagreen: "3cb371", + mediumslateblue: "7b68ee", + mediumspringgreen: "00fa9a", + mediumturquoise: "48d1cc", + mediumvioletred: "c71585", + midnightblue: "191970", + mintcream: "f5fffa", + mistyrose: "ffe4e1", + moccasin: "ffe4b5", + navajowhite: "ffdead", + navy: "000080", + oldlace: "fdf5e6", + olive: "808000", + olivedrab: "6b8e23", + orange: "ffa500", + orangered: "ff4500", + orchid: "da70d6", + palegoldenrod: "eee8aa", + palegreen: "98fb98", + paleturquoise: "afeeee", + palevioletred: "db7093", + papayawhip: "ffefd5", + peachpuff: "ffdab9", + peru: "cd853f", + pink: "ffc0cb", + plum: "dda0dd", + powderblue: "b0e0e6", + purple: "800080", + red: "f00", + rosybrown: "bc8f8f", + royalblue: "4169e1", + saddlebrown: "8b4513", + salmon: "fa8072", + sandybrown: "f4a460", + seagreen: "2e8b57", + seashell: "fff5ee", + sienna: "a0522d", + silver: "c0c0c0", + skyblue: "87ceeb", + slateblue: "6a5acd", + slategray: "708090", + slategrey: "708090", + snow: "fffafa", + springgreen: "00ff7f", + steelblue: "4682b4", + tan: "d2b48c", + teal: "008080", + thistle: "d8bfd8", + tomato: "ff6347", + turquoise: "40e0d0", + violet: "ee82ee", + wheat: "f5deb3", + white: "fff", + whitesmoke: "f5f5f5", + yellow: "ff0", + yellowgreen: "9acd32" +}; + +// Make it easy to access colors via `hexNames[hex]` +var hexNames = tinycolor.hexNames = flip(names); + + +// Utilities +// --------- + +// `{ 'name1': 'val1' }` becomes `{ 'val1': 'name1' }` +function flip(o) { + var flipped = { }; + for (var i in o) { + if (o.hasOwnProperty(i)) { + flipped[o[i]] = i; + } + } + return flipped; +} + +// Return a valid alpha value [0,1] with all invalid values being set to 1 +function boundAlpha(a) { + a = parseFloat(a); + + if (isNaN(a) || a < 0 || a > 1) { + a = 1; + } + + return a; +} + +// Take input from [0, n] and return it as [0, 1] +function bound01(n, max) { + if (isOnePointZero(n)) { n = "100%"; } + + var processPercent = isPercentage(n); + n = mathMin(max, mathMax(0, parseFloat(n))); + + // Automatically convert percentage into number + if (processPercent) { + n = parseInt(n * max, 10) / 100; + } + + // Handle floating point rounding errors + if ((math.abs(n - max) < 0.000001)) { + return 1; + } + + // Convert into [0, 1] range if it isn't already + return (n % max) / parseFloat(max); +} + +// Force a number between 0 and 1 +function clamp01(val) { + return mathMin(1, mathMax(0, val)); +} + +// Parse a base-16 hex value into a base-10 integer +function parseIntFromHex(val) { + return parseInt(val, 16); +} + +// Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1 +// <http://stackoverflow.com/questions/7422072/javascript-how-to-detect-number-as-a-decimal-including-1-0> +function isOnePointZero(n) { + return typeof n == "string" && n.indexOf('.') != -1 && parseFloat(n) === 1; +} + +// Check to see if string passed in is a percentage +function isPercentage(n) { + return typeof n === "string" && n.indexOf('%') != -1; +} + +// Force a hex value to have 2 characters +function pad2(c) { + return c.length == 1 ? '0' + c : '' + c; +} + +// Replace a decimal with it's percentage value +function convertToPercentage(n) { + if (n <= 1) { + n = (n * 100) + "%"; + } + + return n; +} + +// Converts a decimal to a hex value +function convertDecimalToHex(d) { + return Math.round(parseFloat(d) * 255).toString(16); +} +// Converts a hex value to a decimal +function convertHexToDecimal(h) { + return (parseIntFromHex(h) / 255); +} + +var matchers = (function() { + + // <http://www.w3.org/TR/css3-values/#integers> + var CSS_INTEGER = "[-\\+]?\\d+%?"; + + // <http://www.w3.org/TR/css3-values/#number-value> + var CSS_NUMBER = "[-\\+]?\\d*\\.\\d+%?"; + + // Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome. + var CSS_UNIT = "(?:" + CSS_NUMBER + ")|(?:" + CSS_INTEGER + ")"; + + // Actual matching. + // Parentheses and commas are optional, but not required. + // Whitespace can take the place of commas or opening paren + var PERMISSIVE_MATCH3 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?"; + var PERMISSIVE_MATCH4 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?"; + + return { + rgb: new RegExp("rgb" + PERMISSIVE_MATCH3), + rgba: new RegExp("rgba" + PERMISSIVE_MATCH4), + hsl: new RegExp("hsl" + PERMISSIVE_MATCH3), + hsla: new RegExp("hsla" + PERMISSIVE_MATCH4), + hsv: new RegExp("hsv" + PERMISSIVE_MATCH3), + hex3: /^([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/, + hex6: /^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/, + hex8: /^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/ + }; +})(); + +// `stringInputToObject` +// Permissive string parsing. Take in a number of formats, and output an object +// based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}` +function stringInputToObject(color) { + + color = color.replace(trimLeft,'').replace(trimRight, '').toLowerCase(); + var named = false; + if (names[color]) { + color = names[color]; + named = true; + } + else if (color == 'transparent') { + return { r: 0, g: 0, b: 0, a: 0, format: "name" }; + } + + // Try to match string input using regular expressions. + // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360] + // Just return an object and let the conversion functions handle that. + // This way the result will be the same whether the tinycolor is initialized with string or object. + var match; + if ((match = matchers.rgb.exec(color))) { + return { r: match[1], g: match[2], b: match[3] }; + } + if ((match = matchers.rgba.exec(color))) { + return { r: match[1], g: match[2], b: match[3], a: match[4] }; + } + if ((match = matchers.hsl.exec(color))) { + return { h: match[1], s: match[2], l: match[3] }; + } + if ((match = matchers.hsla.exec(color))) { + return { h: match[1], s: match[2], l: match[3], a: match[4] }; + } + if ((match = matchers.hsv.exec(color))) { + return { h: match[1], s: match[2], v: match[3] }; + } + if ((match = matchers.hex8.exec(color))) { + return { + a: convertHexToDecimal(match[1]), + r: parseIntFromHex(match[2]), + g: parseIntFromHex(match[3]), + b: parseIntFromHex(match[4]), + format: named ? "name" : "hex8" + }; + } + if ((match = matchers.hex6.exec(color))) { + return { + r: parseIntFromHex(match[1]), + g: parseIntFromHex(match[2]), + b: parseIntFromHex(match[3]), + format: named ? "name" : "hex" + }; + } + if ((match = matchers.hex3.exec(color))) { + return { + r: parseIntFromHex(match[1] + '' + match[1]), + g: parseIntFromHex(match[2] + '' + match[2]), + b: parseIntFromHex(match[3] + '' + match[3]), + format: named ? "name" : "hex" + }; + } + + return false; +} + +// Node: Export function +if (typeof module !== "undefined" && module.exports) { + module.exports = tinycolor; +} +// AMD/requirejs: Define the module +else if (typeof define !== "undefined") { + define(function () {return tinycolor;}); +} +// Browser: Expose to window +else { + window.tinycolor = tinycolor; +} + +})(); diff --git a/hub/static/js/lib/unobtrusive.js b/hub/static/js/lib/unobtrusive.js new file mode 100644 index 0000000..634cc5c --- /dev/null +++ b/hub/static/js/lib/unobtrusive.js @@ -0,0 +1,121 @@ +jQuery(function ($) { + var csrf_token = $('meta[name=csrf-token]').attr('content'), + csrf_param = $('meta[name=csrf-param]').attr('content'); + + + $.fn.extend({ + triggerAndReturn: function (name, data) { + var event = new $.Event(name); + this.trigger(event, data); + + return event.result !== false; + }, + + /** + * Handles execution of remote calls firing overridable events along the way + */ + callRemote: function () { + var el = this, + method = el.attr('method') || el.attr('data-method') || 'GET', + url = el.attr('action') || el.attr('href'), + dataType = el.attr('data-type') || 'script'; + + if (url === undefined) { + throw "No URL specified for remote call (action or href must be present)."; + } else { + if (el.triggerAndReturn('ajax:before')) { + var data = el.is('form') ? el.serializeArray() : []; + $.ajax({ + url: url, + data: data, + dataType: dataType, + type: method.toUpperCase(), + beforeSend: function (xhr) { + el.trigger('ajax:loading', xhr); + }, + success: function (data, status, xhr) { + el.trigger('ajax:success', [data, status, xhr]); + }, + complete: function (xhr) { + el.trigger('ajax:complete', xhr); + }, + error: function (xhr, status, error) { + el.trigger('ajax:failure', [xhr, status, error]); + } + }); + } + + el.trigger('ajax:after'); + } + } + }); + + /** + * confirmation handler + */ + $('a[data-confirm],input[data-confirm]').on('click', function () { + var el = $(this); + if (el.triggerAndReturn('confirm')) { + if (!confirm(el.attr('data-confirm'))) { + return false; + } + } + }); + + + /** + * remote handlers + */ + $('form[data-remote]').on('submit', function (e) { + $(this).callRemote(); + e.preventDefault(); + }); + + $('a[data-remote],input[data-remote]').on('click', function (e) { + $(this).callRemote(); + e.preventDefault(); + }); + + $('a[data-method]:not([data-remote])').on('click', function (e){ + var link = $(this), + href = link.attr('href'), + method = link.attr('data-method'), + form = $('<form method="post" action="'+href+'"></form>'), + metadata_input = '<input name="_method" value="'+method+'" type="hidden" />'; + + form.hide() + .append(metadata_input) + .appendTo('body'); + + e.preventDefault(); + form.submit(); + }); + + /** + * disable-with handlers + */ + var disable_with_input_selector = 'input[data-disable-with]'; + var disable_with_form_remote_selector = 'form[data-remote]:has(' + disable_with_input_selector + ')'; + var disable_with_form_not_remote_selector = 'form:not([data-remote]):has(' + disable_with_input_selector + ')'; + + var disable_with_input_function = function () { + $(this).find(disable_with_input_selector).each(function () { + var input = $(this); + input.data('enable-with', input.val()) + .attr('value', input.attr('data-disable-with')) + .attr('disabled', 'disabled'); + }); + }; + + $(disable_with_form_remote_selector).on('ajax:before', disable_with_input_function); + $(disable_with_form_not_remote_selector).on('submit', disable_with_input_function); + + $(disable_with_form_remote_selector).on('ajax:complete', function () { + $(this).find(disable_with_input_selector).each(function () { + var input = $(this); + input.removeAttr('disabled') + .val(input.data('enable-with')); + }); + }); + +}); diff --git a/hub/static/js/lib/zen-form.js b/hub/static/js/lib/zen-form.js new file mode 100644 index 0000000..97ceff8 --- /dev/null +++ b/hub/static/js/lib/zen-form.js @@ -0,0 +1,188 @@ +/** Zen Forms 1.0.0 | MIT License | git.io/zen-form */ + +(function($) { + + $.fn.zenForm = function(settings) { + + settings = $.extend({ + trigger: '.go-zen', + theme: 'dark' + }, settings); + + /** + * Helper functions + */ + var Utils = { + + watchEmpty: function($form) { + + $form.find('input, textarea').each(function() { + $(this).on('change', function() { + $(this)[ $(this).val() ? 'removeClass' : 'addClass' ]('empty'); + }).trigger('change'); + }); + + } + + }, // Utils + + /** + * Core functionality + */ + App = { + + /** + * Wrapper element + */ + Environment: null, + + /** + * Functions to create and manipulate environment + */ + env: { + + create: function() { + + var theme = settings.theme == 'dark' ? '' : ' light-theme'; + + return $('<div>', {class: 'zen-forms' + theme}).hide().appendTo('body').fadeIn(200); + + }, // create + + /** + * Update orginal inputs with new values and destroy Environment + */ + destroy: function($elements) { + + // Update orginal inputs with new values + $elements.each(function(i) { + + var $el = $('#zen-forms-input' + i); + + if ( $el.length ) + $(this).val($el.val()); + + }).filter('input:text,textarea').eq(0).focus(); + + $('.zen-forms').fadeOut(200, function() { + $(this).remove(); + }); + + }, // destroy + + /** + * Append inputs, textareas to Environment + */ + add: function($elements) { + + $elements.each(function(i) { + + var $this = $(this), + $wrapper = App.env.addObject(App.Environment, 'div', {class: 'zen-forms-input-wrap'}), + + value = $this.val(), + id = $this.attr('id'), + ID = 'zen-forms-input' + i, + label = $("label[for=" + id + "]").text() || $this.attr('placeholder') || ''; + + // Exclude specified elements + if ( $.inArray( $this.attr('type'), ['checkbox', 'radio', 'submit']) == -1) { + + if ( $this.is('input') ) + App.env.addObject($wrapper, 'input', { + id: ID, + value: value, + type: $this.attr('type') + }); + else + App.env.addObject($wrapper, 'textarea', { + id: ID, + text: value + }); + + App.env.addObject($wrapper, 'label', { + for: ID, + text: label + }); + + } + + }); + + }, // add + + /** + * Wrapper for creating jQuery objects + */ + addObject: function($wrapper, type, params, fn, fnMethod) { + + return $('<'+type+'>', params).on(fnMethod || 'click', fn).appendTo($wrapper); + + }, // addObject + + switchTheme: function() { + + App.Environment.toggleClass('light-theme'); + + } // switchTheme + + }, // env + + zen: function($elements) { + + // Create environment + App.Environment = App.env.create(); + + // Add close button + App.env.addObject(App.Environment, 'a', { + class: 'zen-forms-close-button', + html: '×' + }, function() { + App.env.destroy($elements); + }); + + // Add theme switch button + App.env.addObject(App.Environment, 'a', { + class: 'zen-forms-theme-switch', + html: '•' + }, function() { + App.env.switchTheme(); + }); + + // Add inputs and textareas from form + App.env.add($elements); + + App.Environment.keydown(function(e) { + // Esc close + if (e.which == 27) { + App.env.destroy($elements); + } + }).find('input:text, textarea').eq(0).focus(); + + // Watch inputs and add "empty" class if needed + Utils.watchEmpty(App.Environment); + + }, // zen + + }; // App + + return this.each(function() { + + var $this = $(this); + + function zen() { + App.zen( $this.is('form') ? $this.find('input, textarea') : $this ); + } + + if (!settings.trigger) return zen(); + + $(settings.trigger).on('click', function(event) { + event.preventDefault(); + zen(); + }); + + }); + + }; + +})(jQuery); diff --git a/hub/static/js/mod/ajax_load.js b/hub/static/js/mod/ajax_load.js new file mode 100644 index 0000000..e781f6b --- /dev/null +++ b/hub/static/js/mod/ajax_load.js @@ -0,0 +1,33 @@ +define('mod/ajax_load', [ + 'jquery', + 'mod/count', + 'mod/relative_date', + 'mod/user_avatar', +], function($, countDict, updateRelativeDate, loadAvatar) { + var ajaxLoad = function(url, number_type) { + var maxShown = 35; + $.ajax({type: "GET", + url: url, + dataType: "json", + beforeSend: function() { + $('.timeline .loader').show(); + }, + success: function(data) { + var result = data.result; + var length = data.length; + + $('.timeline>ul').append(result); + $('.timeline .loader').hide(); + if (length < maxShown) { + $('.timeline .pagination').hide(); + } else { + countDict[number_type] += maxShown; + } + updateRelativeDate(); + loadAvatar(); + } + }); + }; + + return ajaxLoad; +}); diff --git a/hub/static/js/mod/badge_info.js b/hub/static/js/mod/badge_info.js new file mode 100644 index 0000000..e30490d --- /dev/null +++ b/hub/static/js/mod/badge_info.js @@ -0,0 +1,19 @@ +define('mod/badge_info', [ + 'jquery', + 'jquery-lazyload', + 'bootstrap', + 'mustache' +], function($, _, Mustache) { + + $(function() { + $("img.badgeInfo").lazyload(); + $(".badgeInfo").each(function(){ + var options = { + title: $(this).attr('data-title'), + content: $(this).attr('data-reason') + }; + $(this).popover(options); + }); + }); + +}); diff --git a/hub/static/js/mod/chat.js b/hub/static/js/mod/chat.js new file mode 100644 index 0000000..b1dde76 --- /dev/null +++ b/hub/static/js/mod/chat.js @@ -0,0 +1,125 @@ +define('mousetrap', 'lib/mousetrap.js'); + +define('mod/chat', [ + 'jquery', + 'jquery-atwho', + 'jquery-forms', + 'mod/connect', + 'mod/user_avatar', + 'mod/input-ext', + 'mousetrap', + 'bootbox' +], function ($, _, _, connectNode, loadAvatar, inputExt) { + $(function () { + var ajaxGet = function (url, nowMessageId) { + $.ajax({type: "GET", + url: url, + dataType: "json", + success: function (data) { + if (data.r === 0) { + $(".alert-error").show(); + location.hash = '#lobby'; + return; + } + + var messages = data.msg; + for (var i = 0; i < messages.length; i++) { + nowMessageId.append(messages[i]); + } + loadAvatar(); + var $d = nowMessageId; + $d[0].scrollTop = $d[0].scrollHeight; + $('#message_input').focus(); + } + }); + }; + + var roomName = "lobby"; + if (location.hash.slice(1)) { + roomName = location.hash.slice(1); + } + var channelPrefix = "chat:room:"; + var roomChannel = channelPrefix + roomName; + var io = connectNode(roomChannel); + io.on('announce', function(data) { + var channel = data.channel; + var room = channel.split(':')[2]; + $('#'+room).append(data.send_message); + loadAvatar(); + var $d= $('#'+room); + $d[0].scrollTop = $d[0].scrollHeight; + }); + var sliceUrl = '#' + roomName; + var lastActive = $('[href=' + sliceUrl + ']').parents('li'); + lastActive.attr("class", "active"); + var lastMessageId = $("#"+roomName); + var nowMessageId = $("#"+roomName); + lastMessageId.hide(); + nowMessageId.show(); + nowMessageId.html(''); + + var urlPrefix = "/j/chat/"; + var url = urlPrefix + roomName; + $('#message-form').attr('action', url); + ajaxGet(url, nowMessageId); + + $(window).on('hashchange',function(){ + roomName = location.hash.slice(1); + sliceUrl = '#' + roomName; + var needActive = $('[href='+sliceUrl+']').parents('li'); + lastActive.attr("class", ""); + needActive.attr("class", "active"); + lastActive = needActive; + + url = urlPrefix + roomName; + $('#message-form').attr('action', url); + lastMessageId.hide(); + nowMessageId = $('#'+roomName); + nowMessageId.show(); + nowMessageId.html(''); + lastMessageId = nowMessageId; + + ajaxGet(url, nowMessageId); + + roomChannel = channelPrefix + roomName; + io.emit('ready', {channel:roomChannel}); + }); + + $('#message_input').focus(); + var messageInput = $('textarea#message_input'); + inputExt.shortcut2submit(messageInput); + inputExt.enableEmojiInput(messageInput); + $('#message-form').ajaxForm({ + dataType: 'json', + success: function(r) { + if (r.r === 1) { + $('#message_input').val(''); + $('#message_input').focus(); + $('#message_input').closest('form').removeClass('submitting'); + } + } + }); + + $('.del-room').on('click', function () { + var roomName = $(this).attr("data-name"), + roomItem = $(this), + msg = '你确定要删除room: ' + roomName + '?'; + + if (roomName) { + bootbox.confirm(msg, function(confirmed) { + if (confirmed) { + $.post(urlPrefix + 'delete_room', {'room_name': roomName}, + function (ret) { + if (ret.r === 1) { + var li = roomItem.parents('li'); + li.remove(); + } + }, + 'json' + ); + } + }); + } + }); + }); +}); diff --git a/hub/static/js/mod/code_version.js b/hub/static/js/mod/code_version.js new file mode 100644 index 0000000..42f9613 --- /dev/null +++ b/hub/static/js/mod/code_version.js @@ -0,0 +1,18 @@ +define('mod/code_version', [ + 'jquery', +], function($) { + + function init(){ + $.getJSON("/api/get_code_version", function(data){ + var sha = data.code_version; + var time = data.release_time; + $('#rev_sha').html(sha); + $('#rel_time').html(time.substr(5,11)); + }); + } + + return { + init: init + }; + +}); diff --git a/hub/static/js/mod/colorcube.js b/hub/static/js/mod/colorcube.js new file mode 100644 index 0000000..2d0bb68 --- /dev/null +++ b/hub/static/js/mod/colorcube.js @@ -0,0 +1,28 @@ +define( + ['jquery'], + function ($) { + var colorcube = {}, cubeWnd; + var showCubeWnd = function (el) { + el = $(el); + if (!cubeWnd) { + cubeWnd = $('<div id="color" class="colorcube"></div>').appendTo('body'); + } + var pos = el.offset(); + pos = {top:pos.top - 40, left:pos.left + el.width()/2 -15}; + cubeWnd.show().offset(pos).css({'background-color':el.data('color')}); + }; + colorcube.init = function (opts) { + if (opts.target) { + $(opts.target).delegate( + '.line .color', 'mouseenter mouseleave', function (e) { + if (e.type === 'mouseenter') { + showCubeWnd(this); + } else { + cubeWnd.hide(); + } + }); + } + }; + return colorcube; + } +); diff --git a/hub/static/js/mod/commit.js b/hub/static/js/mod/commit.js new file mode 100644 index 0000000..d2760ec --- /dev/null +++ b/hub/static/js/mod/commit.js @@ -0,0 +1,118 @@ +define('mod/commit', [ + 'jquery', + 'jquery-tmpl', + 'jquery-caret', + 'jquery-atwho', + 'jquery-forms', + 'bootstrap', + 'mod/input-ext', + 'mod/liveupdate' +], function ($, _, _, _, _, _, inputExt, live) { + $(function () { + + // comment & linecomment edit + $('body').delegate('.js-comment-edit-button', 'click', function (e) { + var form_content = $(this).parents('.comment-header') + .next('.comment-content') + .children('.form-content'); + if (form_content != undefined) { + form_content.show().find('textarea').focus(); + form_content.find('form.js-comment-update').ajaxForm({ + dataType: 'json', + beforeSend: function() { + form_content.find('button[type="submit"]').attr('disabled', true).addClass('disabled') + .end().find('.loader').show(); + }, + success: function(r) { + if (r.r == 0 && r.html) { + if (form_content.find('textarea').attr('name') === 'pull_request_review_comment'){ + form_content.parents('.js-comments-holder').append(r.html); + form_content.parents('.comment').remove(); + } else { + var comment = form_content.parents('.change'); + var avatar = comment.prev('.side-avatar'); + form_content.parents('#changelog').append(r.html); + comment.remove(); + avatar.remove(); + } + } + return true; + } + }); + } else { + return false; + } + }); + + $('body').delegate('.form-content .comment-cancel-button', 'click', function (e) { + var form_content = $(this).parents('.form-content'); + if (form_content != undefined) { + form_content.hide(); + } else { + return false; + } + }); + + inputExt.enableEmojiInput($('#new_comment_content')); + inputExt.shortcut2submit($('#new_comment_content')); + + $('.tabnav-tabs a').live('click', function () { + $(this).closest('.tabnav-tabs').find('a').removeClass('selected'); + $(this).addClass('selected'); + }); + + $('.write-tab').live('click', function () { + var form = $(this).closest('.previewable-comment-form'); + $(this).closest('.previewable-comment-form').removeClass('preview-selected').addClass('write-selected'); + form.find('#write_bucket').addClass('active').end().find('#preview_bucket').removeClass('active'); + }); + $('.preview-tab').live('click', function () { + var form = $(this).closest('.previewable-comment-form'); + form.removeClass('write-selected').addClass('preview-selected'); + form.find('#write_bucket').removeClass('active').end().find('#preview_bucket').addClass('active'); + form.find('#preview_bucket p').html("Loading preview..."); + var url = form.find('#preview_bucket .content-body').data('api-url'), + text = form.find('#write_bucket textarea').val(); + form.find('#preview_bucket .content-body').load(url, {text: text}); + }); + + $('#all-comments .delete-btn').click(function(e) { + e.preventDefault(); + if (!confirm("Are you sure you want to delete this comment?")) { + return; + } + // FIXME: global orig? + orig = this; + $.ajax({ + url: this.href, + type: 'delete', + dataType: 'json', + success: function(resp) { + $(orig).parents('.comment-row').slideUp('fast'); + }, + error: function(resp) { + alert("Unable to delete comment"); + console.log(resp); + } + }); + }); + $(".give_beer").click(function(e) { + if (!$("#new_comment_content")[0].value) { + $("#new_comment_content")[0].value = ":beer:"; + } + $("#new_comment_content").focus(); + }); + $(document).delegate('#toc .minibutton', 'click', function() { + $('#toc .content').toggle(); + }); + $(".comment-popover").popover({placement:'left'}); + + + var cform = $('#new_comment'); + cform.submit(function () { + $(this).find('button[type="submit"]').attr('disabled', true).addClass('disabled'); + return true; + }); + + }); +}); diff --git a/hub/static/js/mod/commit_graph.js b/hub/static/js/mod/commit_graph.js new file mode 100644 index 0000000..a1e98cf --- /dev/null +++ b/hub/static/js/mod/commit_graph.js @@ -0,0 +1,57 @@ +/* +使用commit graph: + - 必须有id属性 + - 元素加上class="commit-graph" + - 设置data-source:/<repo_name>/graph/commits + - 设置data-color + +TODO: 等后端可以获取owner的commits统计时可以生成participation graph +*/ + +define('d3', ['lib/d3-3.3.3.js'], function() { + return d3; +}); + +define('mod/commit_graph', [ + 'jquery', + 'd3' +], function() { + $('.commit-graph').each(function() { + var id = $(this).attr('id'), + url = $(this).attr('data-source'), + color = $(this).attr('data-color') || '#f5f5f5', + width = $(this).width(), + height = $(this).height(); + + $.getJSON(url, function(data) { + var w = (width - data.total) / data.total, + h = height; + + var x = d3.scale.linear() + .domain([0, 1]) + .range([0, w]); + + var y = d3.scale.linear() + .domain([0, height]) + .rangeRound([0, h]); + + var chart = d3.select('#' + id).append('svg') + .attr('class', 'chart') + .attr('width', width) + .attr('height', height); + chart.selectAll('rect').data(data.all) + .enter().append('rect') + .attr('x', function(d, i) { + return x(i) + 1 * i; + }) + .attr('y', function(d) { + return h - y(d * h); + }) + .attr('width', w) + .attr('height', function(d) { + return y(d * h); + }) + .attr('fill', color); + }); + }); +}); diff --git a/hub/static/js/mod/common.js b/hub/static/js/mod/common.js new file mode 100644 index 0000000..e0d1e0a --- /dev/null +++ b/hub/static/js/mod/common.js @@ -0,0 +1,84 @@ +require.config({ + baseUrl: '/js/' +}); + +define('jquery-src', 'lib/jquery-1.8.3.js'); +define('jquery', ['jquery-src'], function(){ + return window.jQuery; +}); + +define('jquery-tmpl', ['jquery'], 'lib/jquery.tmpl.js'); +define('jquery-lazyload', ['jquery'], 'lib/jquery.lazyload.js'); +define('jquery-caret', ['jquery'], 'lib/jquery.caret.js'); +define('jquery-atwho', ['jquery'], 'lib/jquery.atwho.js'); +define('jquery-timeago', ['jquery'], 'lib/jquery.timeago.js'); +define('jquery-forms', ['jquery'], 'lib/jquery.forms.js'); +define('jquery-unobstrusive', ['jquery'], 'lib/unobtrusive.js'); +define('jquery-zclip', ['jquery'], 'lib/jquery.zclip.js'); +define('jquery-tooltipster', ['jquery'], 'lib/jquery.tooltipster.js'); +define('socket.io', 'lib/socket.io.js'); +define('bootstrap', ['jquery'], 'lib/bootstrap-amd.js'); +define('mustache', 'lib/mustache.js'); +define('store', 'lib/store.js'); +define('spin', 'lib/spin.js'); +define('key', ['lib/keymaster.js'], function(none){ + return key; +}); +define('mousetrap', 'lib/mousetrap.js'); +define('codemirror', ['lib/codemirror.js'], function(none){ + return CodeMirror; +}); +define('bootbox-origin', ['jquery'], 'lib/bootbox.js'); + +define('bootbox', ['bootbox-origin'], function(none){ + return bootbox; +}); + +define('d3', ['lib/d3-3.3.3.js'], function(none){ + return d3; +}); +define('string-score', 'lib/string_score.js'); + + +require([ + 'jquery', + 'mod/user_avatar', + 'mod/relative_date', + 'mod/code_version', + 'mod/user_following', + 'mod/search_autocomplete', + 'mod/emoji-hint', + 'jquery-tmpl', + 'jquery-timeago', + 'jquery-lazyload', + 'jquery-caret', + 'jquery-atwho', + 'jquery-forms', + 'jquery-unobstrusive', + 'jquery-zclip', + 'jquery-tooltipster', + 'socket.io', + 'bootstrap', + 'mustache', + 'spin', + 'bootbox' +], function($, loadAvatar, updateRelativeDate, codeVersion, userFollowing) { + $(function () { + setTimeout(loadAvatar, 800); + updateRelativeDate(); + codeVersion.init(); + userFollowing.update(); + + if (("standalone" in window.navigator) && window.navigator.standalone) { + // For iOS Apps + $('a').on('click', function(e){ + e.preventDefault(); + var new_location = $(this).attr('href'); + if (new_location != undefined && new_location.substr(0, 1) != '#' && $(this).attr('data-method') == undefined){ + window.location = new_location; + } + }); + } + + }); +}); diff --git a/hub/static/js/mod/compare.js b/hub/static/js/mod/compare.js new file mode 100644 index 0000000..ca71915 --- /dev/null +++ b/hub/static/js/mod/compare.js @@ -0,0 +1,81 @@ +define('mod/compare', [ 'jquery', 'jquery-tmpl' ], function($){ + + var popup; + var project_name = $('.history a').text(); + $('.compare-button').click(function (e) { + var curRef = $(this).attr('data-ref'), allRef = [], curIdx = 0; + $('.compare-button').each(function (i, el){ + var ref = $(el).attr('data-ref'); + allRef.push(ref); + (ref == curRef) && (curIdx = i); + }); + select_ref = allRef.slice(0, curIdx); + e.preventDefault(); + var start_ref = $(this).attr('data-ref'); + if (!popup) { + popup = $('<div id="compare-popup"></div>').appendTo('body'); + popup.delegate('.close', 'click', function () {popup.hide();}); + popup.delegate('#start-submit', 'click', function () { + var ref = popup.find('.ref-autocompleter').val(); + var link = ''; + location.href = link; + }) + .delegate('#end-submit', 'click', function () { + var ref = popup.find('.ref-autocompleter').val(); + if (ref == "" || ref == undefined || ref != null ||!ref.match('/^[0-9a-bA-B]+$/')){ + var link = '/' + project_name + '/compare/'+start_ref+'...'+ref; + location.href = link; + } else { + popup.remove(); + alert('wrong revision'); + } + }); + } + var data = {}; + if ($(this).hasClass('from')) { + data.mode = 'start'; + } else { + data.mode = 'end'; + } + data.rev = $($('.sha')[0]).text(); + data.revisions = JSON.stringify(select_ref); + popup.empty().append($.tmpl($('#templ-compare-chooser'), data)).show(); + scrollTo(0, 0); + // load commit_preview when sha given + $('.ref-autocompleter').change(function (){ + var ref = $(this).val(); + $('.place_preview').empty(); + var url = '/' + project_name +'/pull/commit_preview/' + project_name+':'+ref; + $.get(url, function(data){ + $('.place_preview').html(data); + }); + }); + }); + + popup = null; + $('.commit-ref').click(function () { + if (!popup) { + popup = $('<div id="compare-popup"></div>').appendTo('body'); + popup.delegate('.close', 'click', function () {popup.hide();}); + popup.delegate('#start-submit', 'click', function () { + var ref = popup.find('.ref-autocompleter').val(); + var link = '/' + project_name + '/compare/'+ref+'...' + '${sha2}'; + location.href = link; + + }) + .delegate('#end-submit', 'click', function () { + var ref = popup.find('.ref-autocompleter').val(); + var link = '/' + project_name + '/compare/'+'${sha1}'+'...' + ref; + location.href = link; + }); + } + var data = {}; + if ($(this).hasClass('from')) { + data.mode = 'start'; + } else { + data.mode = 'end'; + } + popup.empty().append($.tmpl($('#templ-compare-chooser'), data)).show(); + }); + +}); diff --git a/hub/static/js/mod/confirm.js b/hub/static/js/mod/confirm.js new file mode 100644 index 0000000..1347992 --- /dev/null +++ b/hub/static/js/mod/confirm.js @@ -0,0 +1,13 @@ +define('mod/confirm', [ 'jquery', 'bootbox' ], function($){ + + $("a.confirm").click(function(e) { + e.preventDefault(); + var location = $(this).attr('href'); + bootbox.confirm("Are you sure?", function(confirmed) { + if(confirmed){ + window.location.replace(location); + } + }); + }); + +}); diff --git a/hub/static/js/mod/connect.js b/hub/static/js/mod/connect.js new file mode 100644 index 0000000..88c5f98 --- /dev/null +++ b/hub/static/js/mod/connect.js @@ -0,0 +1,15 @@ +define('socket.io', 'lib/socket.io.js'); +define('mod/connect', ['socket.io', 'mod/node_config'], function(_, config) { + var connectNode = function(channel) { + var url = "http://" + config.host + ":" + config.port; + var nodeio = io.connect(url, { + 'reconnect': true, + 'reconnection delay': 500, + 'max reconnection attempts': 10 + }); + nodeio.emit('ready', {channel: channel}); + return nodeio; + } + + return connectNode; +}); diff --git a/hub/static/js/mod/contribut_info.js b/hub/static/js/mod/contribut_info.js new file mode 100644 index 0000000..5ab18ca --- /dev/null +++ b/hub/static/js/mod/contribut_info.js @@ -0,0 +1,16 @@ +define('mod/contribut_info', [ + 'jquery', + 'bootstrap' +], function($) { + + $(function(){ + $(".contributor").each(function(){ + var options = { + title: $(this).attr('data-commits') + ' ' + 'commits', + content: $(this).attr('data-added') + '++' + ' / ' + $(this).attr('data-removed') + '--' + }; + $(this).popover(options); + }); + }); + +}); diff --git a/hub/static/js/mod/count.js b/hub/static/js/mod/count.js new file mode 100644 index 0000000..ab3be35 --- /dev/null +++ b/hub/static/js/mod/count.js @@ -0,0 +1,8 @@ +define('mod/count', [], function() { + var countDict = { + public_num: 35, + teamfeed_num: 35, + userfeed_num: 35, + }; + return countDict; +}); diff --git a/hub/static/js/mod/diff.js b/hub/static/js/mod/diff.js new file mode 100644 index 0000000..e921c84 --- /dev/null +++ b/hub/static/js/mod/diff.js @@ -0,0 +1,466 @@ +define('mod/diff', [ + 'jquery', + 'mod/input-ext', + 'mod/liveupdate', + 'mod/colorcube', +], function ($, inputExt, live, colorcube) { + + //////////////////// linecomment + + // comment form + var hideCommentForm = function () { + $('.inline-comment-form').hide().closest('tr').removeClass('show-inline-comment-form'); + $('.inline-comment-form').each( + function (idx, el) { + if (!$(el).siblings('.comment-holder').children('.comment').length) { + $(el).parents('tr').hide(); + } + } + ); + }; + var openCommentForm = function (curRow) { + hideCommentForm(); + var nextRow = curRow.next('tr'); + // if no comments on curRow yet + if (!nextRow.length || !nextRow.hasClass('inline-comments')) { + nextRow = $.tmpl($('#templ-inline-comments-row'), {}).insertAfter(curRow); + } + // if side by side... plz refactor this + var file = curRow.parents('.file'); + if ((file.children('.side')).length != 0 && file.children('.side').css('display') != 'none') { + $(nextRow.children()[0]).attr('colspan', 1); + } + nextRow.show().addClass('show-inline-comment-form'); + var commentsBlock = nextRow.children('.line-comments'), + commentForm = commentsBlock.find('.inline-comment-form'); + // if no commentForm on nextRow yet + if (!commentForm.length) { + // get form-data + var patch_data = file.children('.meta').find('.patch-data'); + var line_data = curRow.find('.line-data'); + var data = { + from_sha: patch_data.attr('data-from-sha'), + old_path: patch_data.attr('data-old-path'), + new_path: patch_data.attr('data-new-path'), + from_oid: patch_data.attr('data-from-oid'), + to_oid: patch_data.attr('data-to-oid'), + old_no: line_data.attr('data-old'), + new_no: line_data.attr('data-new'), + }; + commentForm = $.tmpl($('#templ-inline-comment-form'), data).appendTo(commentsBlock); + commentForm.find('.js-hide-inline-comment-form').click( + function () { + hideCommentForm(); + } + ).end().find('form').submit( + function () { + $(this).find('button[type="submit"]').attr('disabled', true).addClass('disabled'); + return true; + } + ); + var commentTexarea = commentForm.find('textarea'); + inputExt.enableEmojiInput(commentTexarea); + inputExt.shortcut2submit(commentTexarea); + } + commentForm.show().find('textarea').focus(); + // codelive channel + var linecomment_channel_id; + if ($('.discussion-tab-link').length > 0) { + linecomment_channel_id = "code_pr_"+$('.discussion-tab-link').attr('data-url') + 'linecomment'; + } + // `comment on this line` + commentForm.find('form.js-inline-comment-form').ajaxForm({ + dataType: 'json', + beforeSend: function () { + commentForm.find('button[type="submit"]').attr('disabled', true).addClass('disabled') + .end().find('.loader').show(); + }, + success: function(r) { + if (r.r == 0 && r.html) { + commentForm.siblings('.js-comments-holder').append(r.html); + commentForm.find('textarea').val('').blur(); + hideCommentForm(); + live && linecomment_channel_id && + live.emit('ready', {channel: linecomment_channel_id, msg:r.html_with_diff}); + } else if (r.error){ + alert(r.error); + } + commentForm.find('button[type="submit"]').attr('disabled', false).removeClass('disabled'); + commentForm.find('form.js-inline-comment-form').removeClass('submitting') + .end().find('.loader').hide(); + return true; + }, + error: function () {} + }); + }; + + // add-bubble... + $('body').delegate('.add-bubble', 'click', function () { + var curRow = $(this).parents('tr'); + var nextRow = curRow.next('tr'); + if (nextRow.hasClass('inline-comments') && nextRow.css('display') != 'none') { + nextRow.hide(); + } else { + openCommentForm(curRow); + } + }); + + // `add a line note` + $('body').delegate( + '.js-show-inline-comment-form', 'click', function () { + var curRow = $(this).parents('tr').prev('tr'); + openCommentForm(curRow); + }); + + // linecomment delete + $('body').delegate('.inline-comments .delete-button', 'click', function (e) { + if (!confirm('Are you sure you want to delete this?')) { + return false; + } + var comment = $(this).parents('.comment'); + $.getJSON( + $(this).attr('href'), + function(r) { + // FIXME: global row? + if (r.r == '1') + var row = comment.parents('tr'); + if (comment.siblings('.comment').length || + row.find('.inline-comment-form').length) { + comment.remove(); + } else { + row.remove(); + } + } + ); + return false; + }); + + // comment & linecomment edit + $('body').delegate('.js-comment-edit-button', 'click', function (e) { + var form_content = $(this).parents('.comment-header') + .next('.comment-content') + .children('.form-content'); + if (form_content != undefined) { + form_content.show().find('textarea').focus(); + form_content.find('form.js-comment-update').ajaxForm({ + dataType: 'json', + beforeSend: function() { + form_content.find('button[type="submit"]').attr('disabled', true).addClass('disabled') + .end().find('.loader').show(); + }, + success: function(r) { + if (r.r == 0 && r.html) { + if (form_content.find('textarea').attr('name') === 'pull_request_review_comment'){ + form_content.parents('.js-comments-holder').append(r.html); + form_content.parents('.comment').remove(); + } else { + var comment = form_content.parents('.change'); + var avatar = comment.prev('.side-avatar'); + form_content.parents('#changelog').append(r.html); + comment.remove(); + avatar.remove(); + } + } + return true; + } + }); + } else { + return false; + } + }); + + // show linecomments toggle + $('body').delegate('.file .js-show-inline-comments-toggle', 'change', function () { + var comments = $(this).parents('.file').find('.inline-comments'); + if ($(this).is(':checked')) { + comments.show(); + } else { + comments.hide(); + } + }); + + // generated file toggle + $('body').delegate('.file a.generated', 'click', function() { + var file = $(this).parents('.file'); + var inline = file.children('.inline').show(); + $(this).hide(); + }); + + // patch side diff toggle + $('body').delegate('.file .js-side-diff', 'click', function () { + var file = $(this).parents('.file'); + file.find('a.generated').hide(); + if (file.children('.side').css('display') === 'none' && + file.children('.inline').css('display') === 'none'){ + file.children('.inline').show(); + }else { + var inline = file.children('.inline').toggle(); + var side = file.children('.side').toggle(); + var checkbox = file.find('.js-show-inline-comments-toggle'); + if (file.children('.side').css('display') != 'none') { + checkbox.attr('checked', false); + side.find('.inline-comments').hide(); + } + else { + checkbox.attr('checked', true); + } + } + }); + + // diff patch fullscreen toggle + $('body').delegate('.file .js-fullscreen', 'click', function () { + var fullscreenStage = $('#fullscreen-stage'); + if (fullscreenStage.length == 0) { + var files = $(this).parents('#files'); + fullscreenStage = $('<div id="fullscreen-stage"></div>').appendTo(files); + } + if (fullscreenStage.is(":visible")) { + fullscreenStage.hide(); + $('body').removeClass('fullscreen-mode'); + } else { + var file = $(this).parents('.file'); + fullscreenStage.html(file.clone()).show(); + $('body').addClass('fullscreen-mode'); + fullscreenStage.find('.file .js-fullscreen').text('Exit Full Screen'); + } + }); + + // dblclick open linecomment form + var clearSelection = function () { + if (window.getSelection) { + if (window.getSelection().empty) { // Chrome + window.getSelection().empty(); + } else if (window.getSelection().removeAllRanges) { // Firefox + window.getSelection().removeAllRanges(); + } + } else if (document.selection) { // IE? + document.selection.empty(); + } + } + $('body').delegate('.js-open-comment-form.dblclick-comment', 'dblclick', function () { + clearSelection(); + var curRow = $(this).parents('tr'); + openCommentForm(curRow); + }); + + //////////////////// moreline get_contexts + + // moreline + $('body').delegate('pre.skipped a', 'click', function() { + var curRow = $(this).parents('tr'); + var patch_data = curRow.parents('.file').children('.meta').find('.patch-data'); + var data = curRow.find('.expand-data'); + var url = patch_data.attr('data-context-url'); + $.get( + url, + { + old_sha : patch_data.attr('data-old-sha'), + old_path : patch_data.attr('data-old-path'), + old_start : data.attr('data-old-start'), + new_start : data.attr('data-new-start'), + old_end : data.attr('data-old-end'), + new_end : data.attr('data-new-end'), + type : $(this).attr('data-type'), + }, + function (r) { + curRow.after(r.html); + if (r.html.trim()) { + curRow.remove(); + } + } + ); + }); + + // full diff + $('body').delegate('.ellipsis', 'click', function() { + var $this = $(this); + var fpath = $this.attr('data-path'); + var new_fpath = $this.attr('data-new-path'); + + // for pull/new + var from_proj = $('.new-pull-request form input[name="from_proj"]').attr('value'); + var from_ref = $('.new-pull-request form input[name="from_ref"]').attr('value'); + var to_ref = $('.new-pull-request form input[name="to_ref"]').attr('value'); + var to_proj = $('.new-pull-request form input[name="to_proj"]').attr('value'); + + var url = $this.attr('data-url'); + var table = $this.parents('.data').find('.diff-table'); + $.get(url, + { + filepath: fpath, + new_filepath: new_fpath, + from_proj: from_proj, + from_ref: from_ref, + to_ref: to_ref, + to_proj: to_proj + }, + function(r){ + table.find('tbody').html(r.html); + }); + }); + + // TODO: modify this, after refactor diff api + // toggle whitespace diff + $('body').delegate('.toggle_whitespace', 'click', function() { + var $this = $(this); + var fpath = $this.attr('data-path'); + var new_fpath = $this.attr('data-new-path'); + + // for pull/new + var from_proj = $('.new-pull-request form input[name="from_proj"]').attr('value'); + var from_ref = $('.new-pull-request form input[name="from_ref"]').attr('value'); + var to_ref = $('.new-pull-request form input[name="to_ref"]').attr('value'); + var to_proj = $('.new-pull-request form input[name="to_proj"]').attr('value'); + + var url = $this.attr('data-url'); + var table = $this.parents('.data').find('.diff-table'); + var whitespace = $this.attr('data-w'); + + $.get(url, + { + filepath: fpath, + new_filepath: new_fpath, + from_proj: from_proj, + from_ref: from_ref, + to_ref: to_ref, + to_proj: to_proj, + w: whitespace + }, + function(r){ + table.find('tbody').html(r.html); + $this.attr('data-w', (1 - parseInt(whitespace)).toString()); + }); + }); + + //////////////////// no use ?? + function convertDiff(name, table, pre) { + var inline = $(table).hasClass('inline'); + var ths = table.tHead.rows[0].cells; + var afile, bfile; + if ( inline ) { + afile = ths[0].title; + bfile = ths[1].title; + } else { + afile = $(ths[0]).find('a').text(); + bfile = $(ths[1]).find('a').text(); + } + if ( afile.match(/^Revision /) ) { + afile = 'a/' + name; + bfile = 'b/' + name; + } + var lines = [ + "Index: " + name, + "===================================================================", + "--- " + afile.replace(/File /, ''), + "+++ " + bfile.replace(/File /, ''), + ]; + var sepIndex = 0; + var oldOffset = 0, oldLength = 0, newOffset = 0, newLength = 0; + var title = ""; + if (inline) + title = $(ths[2]).text(); + for (var i = 0; i < table.tBodies.length; i++) { + var tBody = table.tBodies[i]; + if (i == 0 || tBody.className == "skipped") { + if (i > 0) { + if (!oldOffset && oldLength) oldOffset = 1 + if (!newOffset && newLength) newOffset = 1 + lines[sepIndex] = lines[sepIndex] + .replace("{1}", oldOffset).replace("{2}", oldLength) + .replace("{3}", newOffset).replace("{4}", newLength) + .replace("{5}", title); + } + sepIndex = lines.length; + lines.push("@@ -{1},{2} +{3},{4} @@{5}"); + oldOffset = 0, oldLength = 0, newOffset = 0, newLength = 0; + if (tBody.className == "skipped") { + if (inline) + title = $(tBody.rows[0].cells[2]).text(); + continue; + } + } + var tmpLines = []; + for (var j = 0; j < tBody.rows.length; j++) { + var cells = tBody.rows[j].cells; + var oldLineNo = parseInt($(cells[0]).text()); + var newLineNo = parseInt($(cells[inline ? 1 : 2]).text()); + if (tBody.className == 'unmod') { + lines.push(" " + $(cells[inline ? 2 : 1]).text()); + oldLength += 1; + newLength += 1; + if (!oldOffset) oldOffset = oldLineNo; + if (!newOffset) newOffset = newLineNo; + } else { + var oldLine; + var newLine; + var oldTag = "-"; + var newTag = "+"; + if (inline) { + oldLine = newLine = $(cells[2]).text(); + if ($('em', cells[2]).length) oldTag = newTag = "\\"; + } else { + oldLine = $(cells[1]).text(); + if ($('em', cells[1]).length) oldTag = "\\"; + newLine = $(cells[3]).text(); + if ($('em', cells[3]).length) newTag = "\\"; + } + if (!isNaN(oldLineNo)) { + lines.push(oldTag + oldLine); + oldLength += 1; + } + if (!isNaN(newLineNo)) { + tmpLines.push(newTag + newLine); + newLength += 1; + } + } + } + if (tmpLines.length > 0) { + lines = lines.concat(tmpLines); + } + } + if (!oldOffset && oldLength) oldOffset = 1; + if (!newOffset && newLength) newOffset = 1; + lines[sepIndex] = lines[sepIndex] + .replace("{1}", oldOffset).replace("{2}", oldLength) + .replace("{3}", newOffset).replace("{4}", newLength) + .replace("{5}", title); + /* remove trailing   and join lines (with CR for IExplorer) */ + var sep = $.browser.msie ? "\r" : "\n"; + for ( var i = 0; i < lines.length; i++ ) + if ( lines[i] ) + { + var line = lines[i].replace(/\xa0$/, '') + sep; + if ( lines[i][0] == '+' ) + pre.append($('<span class="add">').text(line)); + else if ( lines[i][0] == '-' ) + pre.append($('<span class="rem">').text(line)); + else + pre.append($('<span>').text(line)); + } + } + // no use ?? + $("div.diff h2").each(function() { + console.log('call div.diff h2 !!!'); + var switcher = $("<span class='switch'></span>").prependTo(this); + var name = $.trim($(this).text()); + var table = $(this).siblings("table").get(0); + if (! table) return; + var pre = $('<pre class="diff">').hide().insertAfter(table); + $("<span>" + _("Tabular") + "</span>").click(function() { + $(pre).hide(); + $(table).show(); + $(this).addClass("active").siblings("span").removeClass("active"); + return false; + }).addClass("active").appendTo(switcher); + $("<span>" + _("Unified") + "</span>").click(function() { + $(table).hide(); + if (!pre.get(0).firstChild) convertDiff(name, table, pre); + $(pre).fadeIn("fast") + $(this).addClass("active").siblings("span").removeClass("active"); + return false; + }).appendTo(switcher); + }); + + + colorcube.init({target:'body'}); +}); diff --git a/hub/static/js/mod/drop.js b/hub/static/js/mod/drop.js new file mode 100644 index 0000000..d8ee17d --- /dev/null +++ b/hub/static/js/mod/drop.js @@ -0,0 +1,91 @@ +define('mod/drop', [ + 'jquery' +], function($){ + $(document).ready(function(){ + // var dropzone = document.getElementById("dropzone"); + var dropzone = document.body, + count = 0; + // 拖拽元素进入目标区域 + dropzone.addEventListener('dragenter', dragEnterHandler); + // 拖拽元素在目标区域移动 + dropzone.addEventListener('dragover', dragOverHandler); + // 拖拽元素离开目标区域 + dropzone.addEventListener('dragleave', dragLeaveHandler); + // 将拖拽元素放在目标区域 + dropzone.addEventListener('drop', dropHandler); + + function dragEnterHandler(e){ + e.stopPropagation(); + e.preventDefault(); + $('#dropzone').show(); + if(count<1) count = 0; + count++; + } + + function dragOverHandler(e){ + e.stopPropagation(); + e.preventDefault(); + } + + function dragLeaveHandler(e){ + e.stopPropagation(); + e.preventDefault(); + count--; + if(count<1){ + $('#dropzone').hide(); + count = 0; + } + } + + function dropHandler(e){ + e.stopPropagation(); + e.preventDefault(); + + var fileList = e.dataTransfer.files, + fileNum = fileList.length; + + if (fileNum === 0) return; + file = fileList[0]; + for(var i=0; i<fileNum; i++) actFile(fileList[i]); + + $('#dropzone').hide(); + count = 0; + } + + function actFile(f){ + // is image? ignore + if (f.type.indexOf('image') > -1) return; + + var _reader = new FileReader(), + _name = f.name; + _reader.onload = (function(f) { + return function(e){ + var _edr = getEmptyEditor(), + _index = editors.indexOf(_edr), + _nameInput = $('input[name="gist_name"]')[_index]; + $(_nameInput).val(_name).change(); + _edr.setOption('value', e.target.result); + } + })(f); + _reader.readAsText(f); + } + + function getEmptyEditor(){ + var _edr; + for(var i=0; i<editors.length; i++){ + var _name = $($('input[name="gist_name"]')[i]).val(), + _cont = editors[0].getValue(); + if(_name==''&&_cont==''){ + _edr = editors[i]; + break; + } + } + if(!_edr){ + $('.js-add-gist-file').click(); + _edr = editors[editors.length-1]; + } + return _edr; + } + + }); +}); diff --git a/hub/static/js/mod/drop_down_list.js b/hub/static/js/mod/drop_down_list.js new file mode 100644 index 0000000..72719fd --- /dev/null +++ b/hub/static/js/mod/drop_down_list.js @@ -0,0 +1,97 @@ +define( + 'mod/drop_down_list', + ['jquery'], + function($) { + var addItemMenu = function (inputObj, success, introAppendTo, reqUrl, templ, menuType, successArg){ + var keyCode = {enter:13, esc:27, tab:9, up:38, down:40, ctrl:17, n:78, p:80}, + item_menu, + get_data = function (url){ + if (menuType == "repos"){ + length = url.length, + url = url.slice(1, length - 1); + }else { + url = url.split('/')[2]; + } + return url; + }, + call_success = function (){ + if (menuType == "repos"){ + success(); + } else { + success(successArg); + $(introAppendTo).find('.add-item-menu').remove(); + } + }; + + var hideAddItemMenu = function () { + item_menu && item_menu.empty().remove(); + }; + + var showIntro = function () { + if (!item_menu || item_menu.is(':empty')) { + item_menu = $('<div class="add-item-menu"></div>').appendTo(introAppendTo) + .on('mouseenter', 'li', function () { + item_menu.find('li.active').removeClass('active'); + $(this).addClass('active'); + }) + .on('click', 'li', function (e) { + e.preventDefault(); + var url = $(this).attr('data-url'); + url = get_data(url); + inputObj.val(url); + setTimeout(hideAddItemMenu, 100); + call_success(); + }); + } + }; + + $('body').click(function () {setTimeout(hideAddItemMenu, 100);}); + + inputObj.live('keydown', function (e) { + (e.keyCode == keyCode.enter && item_menu && item_menu.find('li.active').length) && e.preventDefault(); + showIntro(); + }).live('keyup', + function (e) { + showIntro(); + var k = e.keyCode; + if (k == keyCode.up || k == keyCode.down || k==keyCode.ctrl + || k == keyCode.enter || k == keyCode.p || k == keyCode.n){ + if (item_menu && item_menu.find('li').length){ + (k == keyCode.esc) && hideAddItemMenu();// esc key to close the menu + var actItem = item_menu.find('li.active'); + if (actItem.length) { + var a = actItem; + if (k == keyCode.up || + (k == keyCode.p && e.ctrlKey == true)) { // up + var p = a.removeClass('active').prev(); + (p.length ? p : item_menu.find('li:last')).addClass('active'); + } else if (k == keyCode.down || + (k == keyCode.n && e.ctrlKey == true)) { // down + var n = a.removeClass('active').next(); + (n.length ? n : item_menu.find('li:first')).addClass('active'); + } else if (k == keyCode.enter) { // enter key to go to repo + e.preventDefault(); + var url = actItem.attr('data-url'); + url = get_data(url); + inputObj.val(url); + setTimeout(hideAddItemMenu, 100); + call_success(); + } + } else { + item_menu.find('li:first').addClass('active'); + } + } + } else { + var q = $(this).val(); + (q != '') ? $.getJSON( + reqUrl, + {q:q}, + function (r) { + item_menu.html($.tmpl(templ, r)).show(); + }) : showIntro(); + } + } + ); + }; + return addItemMenu; + }); diff --git a/hub/static/js/mod/editor.js b/hub/static/js/mod/editor.js new file mode 100644 index 0000000..a80b570 --- /dev/null +++ b/hub/static/js/mod/editor.js @@ -0,0 +1,20 @@ +define('mod/editor', [ + 'jquery', + 'codemirror', + 'mod/loadmode', + 'mod/overlay', +], function ($, CodeMirror) { + + $(function(){ + var editor = CodeMirror.fromTextArea($('.commit_form textarea[name="code"]')[0], { + mode: {name: "python", version: 2, singleLineStringErrors: false}, + lineNumbers: true, + indentUnit: 4, + tabMode: "shift", + matchBrackets: true + }); + CodeMirror.autoLoadMode(editor, 'python'); + + return editor + }); +}); diff --git a/hub/static/js/mod/emoji-hint.js b/hub/static/js/mod/emoji-hint.js new file mode 100644 index 0000000..587c866 --- /dev/null +++ b/hub/static/js/mod/emoji-hint.js @@ -0,0 +1,20 @@ +define('mod/emoji-hint', [ + 'jquery', + 'key' +], function($, key) { + var emojiHint; + $('#show-emoji-hint').click( + function () { + if (!emojiHint) { + emojiHint = $('<div class="emoji-hint"><iframe src="/hub/emoji" width="650" height="600" frameborder="0"></iframe><a href="javascript:void(0)" id="close">X</a></div>').appendTo('body'); + emojiHint.find('#close').click(function () {emojiHint.hide();}); + $('body').click(function () {emojiHint.hide();}); + } + emojiHint.show().css('top', $(window).scrollTop()); + return false; + }); + + key('esc', function(){ + emojiHint.hide(); + }); +}); diff --git a/hub/static/js/mod/fetch.js b/hub/static/js/mod/fetch.js new file mode 100644 index 0000000..795b423 --- /dev/null +++ b/hub/static/js/mod/fetch.js @@ -0,0 +1,45 @@ +define('mod/fetch', ['jquery'], function($){ + + $(function() { + var fetch_btn = $("#fetch-btn"); + var proj_id = fetch_btn.attr("proj_id"); + + fetch_btn.click(function() { + $.ajax("/fetch/"+proj_id, { + type: "POST", + success: function(data) { + if (!data.error) { + show_success("后台已经开始更新仓库,请耐心等待."); + } else { + show_error("仓库更新失败."); + } + }, + error: function(e) { + show_error("仓库更新失败."); + } + }); + }); + + function show_success(msg) { + var successDiv = $(".navbar .success"); + if (successDiv.size() === 0 ) { + successDiv= $("<div>").addClass("success").addClass("alert-success").addClass("alert"); + $("div.pagehead").append(successDiv); + } + successDiv.html(msg); + successDiv.fadeOut(5000, function () { + $(this).remove(); + }); + } + + function show_error(msg) { + var errorDiv = $(".navbar .error"); + if (errorDiv.size() === 0 ) { + errorDiv = $("<div>").addClass("error").addClass("alert-error").addClass("alert"); + $("div.pagehead").append(errorDiv); + } + errorDiv.html(msg); + } + + }); +}); diff --git a/hub/static/js/mod/follow.js b/hub/static/js/mod/follow.js new file mode 100644 index 0000000..4119d88 --- /dev/null +++ b/hub/static/js/mod/follow.js @@ -0,0 +1,51 @@ +define(['jquery', ], + function ($) { + var follow = {}; + follow.button = function(btn){ + $(btn).click(function(){ + var $btn = $(this); + var link = $btn.attr('href'); + var $followersCount = $('.followers-count'); + var currentCount = parseInt($followersCount.text(), '10'); + + $.ajax($btn.attr('href'), + { + type: 'POST', + dataType:'json', + success:function(res){ + if(res.action>0){ + $followersCount.text(currentCount+1); + $btn.addClass('btn-danger follow'); + $btn.removeClass('btn-success unfollow'); + $btn.find('span').text("Unfollow"); + $btn.attr( + 'href', + link.replace(/follow$/,"unfollow") + ) + } + else if(res.action<0){ + $followersCount.text(currentCount-1); + $btn.addClass('btn-success unfollow'); + $btn.removeClass('btn-danger follow'); + $btn.find('span').text("Follow"); + $btn.attr( + 'href', + link.replace(/unfollow$/,"follow") + ) + } + else{ + if(res.msg) { + alert(res.msg); + } else { + alert("please try again later:("); + } + + return; + } + }, + }); + return false; + }); + } + return follow; + }); diff --git a/hub/static/js/mod/gist-delete.js b/hub/static/js/mod/gist-delete.js new file mode 100644 index 0000000..a32aeaf --- /dev/null +++ b/hub/static/js/mod/gist-delete.js @@ -0,0 +1,12 @@ +define('mod/gist-delete', [ + 'jquery' +], function ($) { + $(function(){ + $('button.danger.js-delete-gist').click(function(){ + if(confirm('Are you positive you want to delete this Gist?')){ + window.location.href = './delete'; + } + }); + }) +}); + diff --git a/hub/static/js/mod/gist-editor.js b/hub/static/js/mod/gist-editor.js new file mode 100644 index 0000000..29df8ce --- /dev/null +++ b/hub/static/js/mod/gist-editor.js @@ -0,0 +1,186 @@ +define('mod/gist-editor', [ + 'jquery', + 'codemirror', + 'mod/loadmode', + 'mod/overlay' +], function ($, CodeMirror) { + $(function(){ + editors = []; + var initEditor = function(item){ + var editor = CodeMirror.fromTextArea(item, { + lineNumbers: true, + tabMode: "shift", + matchBrackets: true + }); + return editor; + } + $.each($('textarea[name="gist_content"]'), function(i, e){ + editor = initEditor(e); + editors.push(editor); + }); + + $("#add-gist").delegate('a', 'click', function(){ + var editorTmpl = document.getElementById('bubble-gist-file').innerHTML; + $("#files .js-gist-files").append(editorTmpl); + var newEditor = $("#files .js-gist-files textarea:eq(-1)")[0]; + editor = initEditor(newEditor); + editors.push(editor); + }); + + $('input[name="gist_name"]').live('blur change', function(){ + setMode(this); + }); + + $('input[name="gist_name"]').live('keydown', function(e){ + if (e.keyCode == 13) return false; + }); + + $(document).ready(function(){ + var _names = $('input[name="gist_name"]'); + setTimeout(function(){ + $.each(_names, function(i, e) { setMode(e) }) + }, 300 * _names.length) + }) + + function setMode(e){ + var editorIndex = $('input[name="gist_name"]').index(e), + editor = editors[editorIndex], + name = $(e).val(), + ext = getExtension(name), + mode = getMode(ext); + CodeMirror.autoLoadMode(editor, mode.file || 'text'); + editor.setOption("mode", mode.mode) + } + + function getExtension(name) { + if (!name) + return null; + + var lastDot = name.lastIndexOf("."); + if (lastDot == -1 || lastDot + 1 == name.length) + return null; + else + return name.substring(lastDot + 1).toLowerCase(); + } + + function getMode(extension) { + var mode = {}; + if (!extension) + return mode; + + switch (extension) { + case "cc": + case "h": + mode.mode = "text/x-csrc"; + mode.file = "clike"; + break; + case "clj": + mode.mode = "text/x-clojure"; + mode.file = "clojure"; + break; + case "coffee": + mode.mode = "text/x-coffeescript"; + mode.file = "coffeescript"; + break; + case "cpp": + mode.mode = "text/x-c++src"; + mode.file = "clike"; + break; + case "cs": + mode.mode = "text/x-csharp"; + mode.file = "clike"; + break; + case "sass": + case "scss": + mode.mode = "text/x-sass"; + mode.file = "sass"; + break; + case "css": + mode.mode = "text/css"; + mode.file = "css"; + break; + case "erl": + mode.mode = "text/x-erlang"; + mode.file = "erlang"; + break; + case "hs": + case "hsc": + mode.mode = "text/x-haskell"; + mode.file = "haskell"; + break; + case "html": + mode.mode = "text/html"; + mode.file = "htmlmixed"; + break; + case "ini": + case "prefs": + mode.mode = "text/x-properties"; + mode.file = "properties"; + break; + case "java": + mode.mode = "text/x-java"; + mode.file = "clike"; + break; + case "gyp": + case "js": + case "json": + mode.mode = "text/javascript"; + mode.file = "javascript"; + break; + case "md": + case "markdown": + mode.mode = "text/x-markdown"; + mode.file = "markdown"; + break; + case "pl": + mode.mode = "text/x-perl"; + mode.file = "perl"; + break; + case "py": + mode.mode = "text/x-python"; + mode.file = "python"; + break; + case "r": + mode.mode = "text/x-rsrc"; + mode.file = extension; + break; + case "rb": + mode.mode = "text/x-ruby"; + mode.file = "ruby"; + break; + case "sh": + case "zsh": + mode.mode = "text/x-sh"; + mode.file = "shell"; + break; + case "sql": + mode.mode = "text/x-mysql"; + mode.file = "mysql"; + break; + case "xq": + case "xqy": + case "xquery": + mode.mode = "application/xquery"; + mode.file = "xquery"; + break; + case "project": + case "classpath": + case "xib": + case "xml": + mode.mode = "application/xml"; + mode.file = "xml"; + break; + case "yml": + case "yaml": + mode.mode = "text/x-yaml"; + mode.file = "yaml"; + break; + default: + mode.mode = "text/x-" + extension; + mode.file = extension; + } + return mode; + } + + }); +}); diff --git a/hub/static/js/mod/input-ext.js b/hub/static/js/mod/input-ext.js new file mode 100644 index 0000000..a9b3ae4 --- /dev/null +++ b/hub/static/js/mod/input-ext.js @@ -0,0 +1,160 @@ +define('mousetrap', 'lib/mousetrap.js'); + +define( + ['jquery', 'mod/user_following','jquery-caret', 'jquery-atwho', 'mousetrap', 'lib/zen-form'], + function ($, userFollowing) { + var inputExt = {}; + var emojis = [ + 'airplane', 'alien', 'art', 'bear', 'beer', 'bike', 'bomb', 'book', + 'bulb', 'bus', 'cake', 'calling', 'clap', 'cocktail', 'code', 'computer', + 'cool', 'cop', 'email', 'feet', 'fire', 'fish', 'fist', 'gift', 'hammer', + 'heart', 'iphone', 'key', 'leaves', 'lgtm', 'lipstick', 'lock', 'mag', 'mega', + 'memo', 'moneybag', 'new', 'octocat', 'ok', 'palm_tree', 'pencil', 'punch', + 'runner', 'scissors', 'ship', 'shipit', 'ski', 'smile', 'smoking', 'sparkles', + 'star', 'sunny', 'taxi', 'thumbsdown', 'thumbsup', 'tm', 'tophat', 'train', + 'trollface', 'v', 'vs', 'warning', 'wheelchair', 'zap', 'zzz', 'see_no_evil', + 'hear_no_evil', 'speak_no_evil', 'monkey', 'monkey_face', 'manybeers', 'beers', + 'hhkb', 'ruby' + ], emoji_list = $.map(emojis, function(value, i) {return {key: value + ':', name:value};}); + inputExt.enableEmojiInput = function (el) { + el.atwho('(?:^|\\s):', + {data:emoji_list, limit:7, + tpl:'<li data-value="${key}">${name} <img src="/static/emoji/${name}.png" height="20" width="20" /></li>'}); + return el; + }; + + inputExt.enableAutoCompleteFollowingAndTeam = function (el) { + var teams = JSON.parse($('#all-teams').val() || '[]'); + var users = teams.concat(userFollowing.val()); + + $(el).atwho("@", { + data: users, + limit: 7 + }); + }; + + // 输入#自动提示pr信息 + inputExt.enablePullsInput = function (el) { + var projectName = el.attr('data-project-name'); + if (!projectName) return el; + $.getJSON('/' + projectName + '/pulls/all_data', function (r) { + var pulls = $.map( + r, function(value, i) { + return {key: value.id, name:value.id + ' ' + value.title, title:value.title}; + }); + el.atwho('(?:^|\\s)#', + {data:pulls, limit:7, + tpl:'<li data-value="${key}"><small>#${key}</small> ${title}</li>'}); + }); + return el; + }; + + inputExt.shortcut2submit = function (el) { + Mousetrap.bind( + ['command+enter', 'ctrl+enter'], + function (e) { + if (el && (e.srcElement || e.target) == $(el)[0] && !$(el).closest('form').hasClass('submitting')) { + e.preventDefault ? e.preventDefault() : (e.returnValue = false); + $(el).closest('form').addClass('submitting').submit(); + } + }, + 'keydown' + ); + }; + + // 进入全屏模式 + inputExt.enableZenMode = function (el) { + var trigger = '.go-zen'; + el = $(el); + el.zenForm({trigger:trigger, theme:'light'}).dblclick(function(e) { + if (!e.altKey) return; + $(this).zenForm({ trigger: null, theme: 'light' }); + fix(); + }); + + $(trigger).click(fix); + + function fix() { + var textarea = $('.zen-forms-input-wrap textarea'); + if (textarea) { + inputExt.enableEmojiInput(textarea); + textarea.attr({ + 'data-project-name': el.attr('data-project-name'), + 'placeholder': el.attr('placeholder') + }); + + inputExt.enablePullsInput(textarea); + + var participants = $('#participants').val(); + if (participants) { + participants = JSON.parse(participants); + textarea.atwho("@", {data:participants, limit:7}); + } + + // 因为zen-form设置的z-index非常高(99999)所以将at-view调更高 + $('#at-view').css('z-index', 100000); + } + } + }; + + var focusToEnd = function(els) { + return $(els).each(function() { + var v = $(this).val(); + $(this).focus().val("").val(v); + }); + }; + + inputExt.enableQuickQuotes = function (el) { + Mousetrap.bind( + ['r'], + function (e) { + var oldVal = $(el).val(), newVal, selVal = window.getSelection().toString(); + selVal = '> ' + selVal.split('\n').join('\n> '); + newVal = oldVal.concat((oldVal != '') ? '\n\n':'', selVal, '\n\n'); + $("html, body").animate({scrollTop: $(document).height()}, "slow"); + $(el).val(newVal); + focusToEnd(el); + }, + 'keyup' + ); + }; + + inputExt.enableFileUpload = function (uploader, textarea, is_image) { + uploader.submit( + function() { + $(this).ajaxSubmit({ + dataType: 'json', + type: 'POST', + delegation: true, + success: function(r) { + var oldText = textarea.val(), + newText = oldText + + (oldText.length == 0 ? '' : '\n') + + (is_image? '!' : '') + + '[' + r.origin_filename + '](' + r.url + ')'; + textarea.val(newText); + }, + error: function(r) { + alert("上传错误,请确认您上传的文件类型合法"); + } + }); + return false; + }); + + uploader.find('input').change(function () { + uploader.submit(); + }); + }; + + inputExt.enableImageUpload = function (uploader, textarea) { + inputExt.enableFileUpload(uploader,textarea, true); + }; + + inputExt.enableUpload = function(upload_widget,textarea){ + inputExt.enableImageUpload(upload_widget.find(".upload-image-form"),textarea); + inputExt.enableFileUpload(upload_widget.find(".upload-file-form"),textarea); + }; + + return inputExt; + } +); diff --git a/hub/static/js/mod/issue_body.js b/hub/static/js/mod/issue_body.js new file mode 100644 index 0000000..53d6747 --- /dev/null +++ b/hub/static/js/mod/issue_body.js @@ -0,0 +1,209 @@ +define('mod/issue_body', ['jquery', 'mod/upvote', 'mod/quick_emoji', 'tag-it'], function($, upvote, quick_emoji) { + $(function(){ + + // edit issue + $('#issue-content-edit-form').ajaxForm( + {dataType: 'json', + delegation: true, + success: function(r) { + if (r.r == '0') { + var issue = $('#summary'); + issue.find('h2').html(r.title_html); + issue.find('.description .markdown-body').html(r.content_html); + // update ticket content in edit form + var form = $('#issue-content-edit-form'); + form.find('#issue_title').val(r.title); + form.find('#issue_body').val(r.content); + } + $('#summary .content').removeClass('is-comment-editing').find('.form-content').hide(); + }}); + + // close & open + $('#issue').delegate( + '#add-comment-form #close', 'click', function () { + var commentForm = $('#add-comment-form'); + if (commentForm.find('[name=comment_and_close]').length == 0) { + var input = $('<input>').attr('type', 'hidden').attr('name', 'comment_and_close').val('1'); + commentForm.append(input); + } + }); + + $('#issue').delegate( + '#add-comment-form #open', 'click', function () { + var commentForm = $('#add-comment-form'); + if (commentForm.find('[name=comment_and_open]').length == 0) { + var input = $('<input>').attr('type', 'hidden').attr('name', 'comment_and_open').val('1'); + commentForm.append(input); + } + }); + + // delete comment + $('#issue').delegate( + '.delete-pr-note-button', 'click', function (e) { + if (!confirm('Are you sure you want to delete this?')) { + return false; + } + var comment = $(this).parents('.change'); + $.getJSON($(this).attr('href'), + function(r) { + if (r.r == '1'){ + comment.remove(); + } + }); + return false; + }); + + // tabs + $('.write-tab').live( + 'click', + function () { + var form = $(this).closest('.previewable-comment-form'); + $(this).closest('.previewable-comment-form').removeClass('preview-selected').addClass('write-selected'); + form.find('#write_bucket').addClass('active').end().find('#preview_bucket').removeClass('active'); + }); + $('.preview-tab').live( + 'click', + function () { + var form = $(this).closest('.previewable-comment-form'); + form.removeClass('write-selected').addClass('preview-selected'); + form.find('#write_bucket').removeClass('active').end().find('#preview_bucket').addClass('active'); + form.find('#preview_bucket p').html("Loading preview..."); + var url = form.find('#preview_bucket .content-body').data('api-url'), + text = form.find('#write_bucket textarea').val(); + form.find('#preview_bucket .content-body').load(url, {text: text}); + }); + + // join issue + var JoinOrLeaveIssue = function (url, onSuccess) { + $.post(url, function (ret) { + if (ret.r === 0) { + onSuccess(); + if (ret.participants_html) { + $('#participants-block').html(ret.participants_html); + } + } else if (ret.r === 1 && ret.msg) { + alert(ret.msg); + } + }, 'json'); + }; + $('.join-issue-btn').click(function () { + var Btn = $(this), _type = Btn.attr('data-type'), + url = Btn.attr('data-url') + _type; + if (_type === "leave") { + JoinOrLeaveIssue(url, function () { + Btn.removeClass('btn-danger'); + Btn.html('Join'); + Btn.attr('data-type', 'join'); + }); + } else { + JoinOrLeaveIssue(url, function () { + Btn.addClass('btn-danger'); + Btn.html('Leave'); + Btn.attr('data-type', 'leave'); + }); + } + }); + + // edit button + $('#issue').delegate( + '.js-edit-button', 'click', + function () { + var comment_content = $(this).parents('.js-edit-container').addClass('is-comment-editing').children('.content'); + //comment_content.addClass('is-comment-editing'); + comment_content.find('.form-content').show(); + }); + + $('#issue').delegate( + '.js-cancel-button', 'click', + function () { + var comment_content = $(this).parents('.js-edit-container'); + comment_content.removeClass('is-comment-editing'); + comment_content.find('.form-content').hide(); + }); + + $('body').delegate('.js-edit-button', 'click', + function (e) { + var form_content = $(this).parents('.js-edit-container') + .children('.content') + .children('.form-content'); + if(form_content != undefined){ + form_content.show().find('textarea').focus(); + form_content.find('form.js-comment-update').ajaxForm( + { + dataType: 'json', + beforeSend: function() { + form_content.find('button[type="submit"]').attr('disabled', true).addClass('disabled') + .end().find('.loader').show(); + }, + success: function(r) { + if (r.r == 0 && r.html) { + if (form_content.find('textarea').attr('name') === 'pull_request_review_comment'){ + // FIXME: + form_content.parents('.js-comments-holder').append(r.html); + form_content.parents('.comment').remove(); + } else { + var comment = form_content.parents('.change'); + form_content.parents('#changelog').append(r.html); + comment.remove(); + } + } + return true; + } + } + ); + }else{ + return false; + } + } + ); + + $('body').delegate('.form-content .comment-cancel-button', 'click', + function (e) { + var form_content = $(this).parents('.form-content'); + if(form_content != undefined){ + form_content.hide(); + }else{ + return false; + } + } + ); + + // others + quick_emoji.enable('#new_comment_content'); + upvote.button("#upvote"); + + // tag + $('#issue-tags').tagit({input_name: 'tags', tag_list: $('.label'), fillup: JSON.parse($("#json-tags")[0].value)}); + + $('.milestone-menu').delegate('a', 'click', + function (e) { + var $a = $(this); + clear_milestone(); + $a.parent().addClass('active').find('input').attr('checked', true);; + } + ); + $('#milestone_title').on('keypress keyup keydown focus', function () { + var $this = $(this); + var value = $this.val(); + console.log(value); + if (value && value !== "") { + clear_milestone(true); + $("#milestone_new").attr('checked', true); + } else { + clear_milestone(); + } + }); + var clear_milestone = function (hide) { + var $menu = $('.milestone-menu'); + $menu.find('li').each(function () { + $(this).removeClass("active"); + }); + if (hide) { + $menu.hide(); + } else { + $menu.show(); + } + }; + + }); +}) diff --git a/hub/static/js/mod/issue_tag.js b/hub/static/js/mod/issue_tag.js new file mode 100644 index 0000000..4adefc1 --- /dev/null +++ b/hub/static/js/mod/issue_tag.js @@ -0,0 +1,104 @@ +define('mod/issue_tag', [ + 'jquery', + 'bootbox', + 'lib/coloreditor' +], function($) { + $(function(){ + var issuesFilter = $('.nav-list-filter'), + issuesEdit = $('.nav-list-edit'), + remove_tag = function (name) { + issuesFilter.find('li').each(function (){ + var tName = $(this).attr('flag-tag'); + + if (name === tName){ + $(this).remove(); + } + }) + }, + clear_href_tag = function () { + var curHref = window.location.href, + url = curHref.split('?')[0], + tagCount = issuesEdit.attr('data-tag-count'); + if ($('.nav-list-edit div').length != tagCount){ + window.location.href = url; + } + }; + + $('.tag-admin').on('click', function() { + var admin = $(this); + if (admin.hasClass('tag-admin-unuse')){ + + admin.html('取消'); + admin.removeClass('tag-admin-unuse'); + admin.addClass('tag-admin-using'); + + issuesFilter.hide(); + issuesEdit.show(); + } else if (admin.hasClass('tag-admin-using')){ + + admin.html('管理'); + admin.removeClass('tag-admin-using'); + admin.addClass('tag-admin-unuse'); + + issuesFilter.show(); + issuesEdit.hide(); + + clear_href_tag(); + } + }); + $('.tag-remove').on('click', function () { + var tagItem = $(this).closest('div'), + tagType = tagItem.attr('data-tag-type'), + tagName = tagItem.attr('data-tag-name'), + tagTargetId = tagItem.attr('data-target-id'), + msg = '你确定要删除tag: ' + tagName + ' ?'; + if (tagName){ + bootbox.confirm(msg, function(confirmed){ + if (confirmed){ + $.post('/j/issue/delete_tag', {'tag_name': tagName, 'tag_type': tagType, 'tag_target_id': tagTargetId}, function (ret) { + var status = ret.r; + if (status === 1){ + tagItem.remove(); + remove_tag(tagName); + } + }, 'json') + } + }) + } + }); + var t, e, n; + e = function(e, n) { + return e.closest(".js-label-editor").find(".js-color-editor-bg").css("background-color", n), e.css("color", t(n, -.5)), e.css("border-color", n) + }, n = function(t) { + var e, n; + return e = "#eee", n = $(t).closest(".js-color-editor"), n.find(".js-color-editor-bg").css("background-color", e), t.css("color", "#c00"), t.css("border-color", e) + }, t = function(t, e) { + var n, s, a; + for (t = String(t).toLowerCase().replace(/[^0-9a-f]/g, ""), t.length < 6 && (t = t[0] + t[0] + t[1] + t[1] + t[2] + t[2]), e = e || 0, a = "#", n = void 0, s = 0; 3 > s; ) + n = parseInt(t.substr(2 * s, 2), 16), n = Math.round(Math.min(Math.max(0, n + n * e), 255)).toString(16), a += ("00" + n).substr(n.length), s++; + return a + }; + $('.js-color-cooser-color').on('click', function () { + var editor = $(this).closest(".js-label-editor"); + var editor_input = editor.find(".js-color-editor-input"); + editor.find(".js-label-editor-submit").removeClass("disabled"); + editor.removeClass("is-valid is-not-valid"); + var color_value = "#" + $(this).data("hex-color"); + editor_input.val(color_value); + e(editor_input, color_value); + }); + $('.js-color-editor-input').on('focusin', function () { + var t, s; + s = $(this), t = $(this).closest(".js-label-editor"), s.on("input.colorEditor", function() { + console.log('co'); + var a; + return "#" !== s.val().charAt(0) && s.val("#" + s.val()), t.removeClass("is-valid is-not-valid"), a = /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(s.val()), + t.find(".js-label-editor-submit").toggleClass("disabled", !a), a ? (t.addClass("is-valid"), e(s, s.val())) : (t.addClass("is-not-valid"), n(s)) + }), s.on("blur.colorEditor", function() { + return s.off(".colorEditor") + }); + console.log('test'); + }); + + }); +}) diff --git a/hub/static/js/mod/liveupdate.js b/hub/static/js/mod/liveupdate.js new file mode 100644 index 0000000..41a7df0 --- /dev/null +++ b/hub/static/js/mod/liveupdate.js @@ -0,0 +1,45 @@ +define('socket.io', 'lib/socket.io.js'); +define('mod/liveupdate', [ + 'jquery', + 'jquery-tmpl', + 'socket.io' +], function ($, _) { + //var server = 'http://doubandev2.intra.douban.com:7076'; + var server = 'http://code.intra.douban.com:7076'; + var live = io.connect(server, { + 'reconnect': true, + 'reconnection delay': 500, + 'max reconnection attempts': 10 + }); + + var roomPeoples = {}; + live.on('announce', function(data){ + var user = data.username; + if(user !== undefined && user in roomPeoples === false) { + roomPeoples[user] = user; + var user_html = '<a class="avatar tooltipped downwards"><img height="24" width="24" alt="'+user+'" src="'+data.avatar+'"></a>'; + $('#room_peoples .quickstat').show(); + $('#room_peoples').append(user_html); + } + + if(data.type === 'typing') { + $('#typing').show(); + $('#typing span').html(data.username+' is typing......'); + } + else if(data.type === 'merge') { + $(".pull-state span").html("Merged"); + $(".merge-guide").hide(); + var merged_time = new Date(); + $("#changelog").append($.tmpl($("#render_node_merge"), + {'merged_time': merged_time, + 'user':data.username, + 'avatar': data.avatar})); + } + else { + $('#typing').hide(); + $('#changelog').append(data.message); + } + }); + + return live; +}); diff --git a/hub/static/js/mod/loadmode.js b/hub/static/js/mod/loadmode.js new file mode 100644 index 0000000..c4cea54 --- /dev/null +++ b/hub/static/js/mod/loadmode.js @@ -0,0 +1,55 @@ +define('mod/loadmode', [ 'codemirror' ], function(CodeMirror){ +(function() { + if (!CodeMirror.modeURL) CodeMirror.modeURL = "/static/js/lib/mode/%N.js"; + + var loading = {}; + function splitCallback(cont, n) { + var countDown = n; + return function() { if (--countDown == 0) cont(); }; + } + function ensureDeps(mode, cont) { + var deps = CodeMirror.modes[mode].dependencies; + if (!deps) return cont(); + var missing = []; + for (var i = 0; i < deps.length; ++i) { + if (!CodeMirror.modes.hasOwnProperty(deps[i])) + missing.push(deps[i]); + } + if (!missing.length) return cont(); + var split = splitCallback(cont, missing.length); + for (var i = 0; i < missing.length; ++i) + CodeMirror.requireMode(missing[i], split); + } + + CodeMirror.requireMode = function(mode, cont) { + if (typeof mode != "string") mode = mode.name; + if (CodeMirror.modes.hasOwnProperty(mode)) return ensureDeps(mode, cont); + if (loading.hasOwnProperty(mode)) return loading[mode].push(cont); + + var script = document.createElement("script"); + script.src = CodeMirror.modeURL.replace(/%N/g, mode); + var others = document.getElementsByTagName("script")[0]; + others.parentNode.insertBefore(script, others); + var list = loading[mode] = [cont]; + var count = 0, poll = setInterval(function() { + if (++count > 100) return clearInterval(poll); + if (CodeMirror.modes.hasOwnProperty(mode)) { + clearInterval(poll); + loading[mode] = null; + ensureDeps(mode, function() { + for (var i = 0; i < list.length; ++i) list[i](); + }); + } + }, 200); + }; + + CodeMirror.autoLoadMode = function(instance, mode) { + if (!CodeMirror.modes.hasOwnProperty(mode)) + CodeMirror.requireMode(mode, function() { + //instance.setOption("mode", instance.getOption("mode")); + instance.setOption("mode", mode); + }); + }; +}()); + +}); diff --git a/hub/static/js/mod/mute.js b/hub/static/js/mod/mute.js new file mode 100644 index 0000000..6594bf9 --- /dev/null +++ b/hub/static/js/mod/mute.js @@ -0,0 +1,19 @@ +define(['jquery', ], + function ($) { + var mute_buttons = $('.mute-buttons'); + mute_buttons.find('a').click(function(){ + var href = $(this).attr("href"); + $.getJSON(href, + function(data){ + var status = data["status"]; + if(status=='on'){ + mute_buttons.find('.mute-on').addClass('btn-success'); + mute_buttons.find('.mute-off').removeClass('btn-warning'); + }else{ + mute_buttons.find('.mute-on').removeClass('btn-success'); + mute_buttons.find('.mute-off').addClass('btn-warning'); + } + }); + return false; + }) + }); diff --git a/hub/static/js/mod/newsfeed.js b/hub/static/js/mod/newsfeed.js new file mode 100644 index 0000000..78dec34 --- /dev/null +++ b/hub/static/js/mod/newsfeed.js @@ -0,0 +1,14 @@ +define('mod/newsfeed', [ + 'jquery', + 'mod/user_avatar', +], function($, loadAvatar) { + $(function () { + $('.timeline').delegate('.expand-rest', 'click', function(){ + var last = $(this).parents('.expand-last'); + last.prevUntil('.expand-first').show(300); + last.hide(); + loadAvatar(); + }); + }); +}); + diff --git a/hub/static/js/mod/newsfeed_pagination.js b/hub/static/js/mod/newsfeed_pagination.js new file mode 100644 index 0000000..b630781 --- /dev/null +++ b/hub/static/js/mod/newsfeed_pagination.js @@ -0,0 +1,15 @@ +define('mod/newsfeed_pagination', [ + 'jquery', + 'mod/ajax_load', + 'mod/count', +], function($, ajaxLoad, countDict) { + $(function () { + $('.timeline .loader').hide(); + $('.timeline .pagination').show().click( + function () { + var number_type = "public_num"; + var url = "/j/more/pub/" + countDict.public_num; + ajaxLoad(url, number_type); + }); + }); +}); diff --git a/hub/static/js/mod/node_config.js b/hub/static/js/mod/node_config.js new file mode 100644 index 0000000..5f9b880 --- /dev/null +++ b/hub/static/js/mod/node_config.js @@ -0,0 +1,7 @@ +define('mod/node_config', function() { + var config = { + port:'7076', + host:'code.intra.douban.com', + };//need to write this when online + return config; +}); diff --git a/hub/static/js/mod/notify_pagination.js b/hub/static/js/mod/notify_pagination.js new file mode 100644 index 0000000..af26d43 --- /dev/null +++ b/hub/static/js/mod/notify_pagination.js @@ -0,0 +1,7 @@ +define('mod/notify_pagination', [ + 'jquery' +], function($) { + $(function () { + $('.timeline .loader').hide(); + }); +}); diff --git a/hub/static/js/mod/overlay.js b/hub/static/js/mod/overlay.js new file mode 100644 index 0000000..847e3a8 --- /dev/null +++ b/hub/static/js/mod/overlay.js @@ -0,0 +1,61 @@ +// Utility function that allows modes to be combined. The mode given +// as the base argument takes care of most of the normal mode +// functionality, but a second (typically simple) mode is used, which +// can override the style of text. Both modes get to parse all of the +// text, but when both assign a non-null style to a piece of code, the +// overlay wins, unless the combine argument was true, in which case +// the styles are combined. + +// overlayParser is the old, deprecated name +define('mod/overlay', [ 'codemirror' ], function(CodeMirror){ +CodeMirror.overlayMode = CodeMirror.overlayParser = function(base, overlay, combine) { + return { + startState: function() { + return { + base: CodeMirror.startState(base), + overlay: CodeMirror.startState(overlay), + basePos: 0, baseCur: null, + overlayPos: 0, overlayCur: null + }; + }, + copyState: function(state) { + return { + base: CodeMirror.copyState(base, state.base), + overlay: CodeMirror.copyState(overlay, state.overlay), + basePos: state.basePos, baseCur: null, + overlayPos: state.overlayPos, overlayCur: null + }; + }, + + token: function(stream, state) { + if (stream.start == state.basePos) { + state.baseCur = base.token(stream, state.base); + state.basePos = stream.pos; + } + if (stream.start == state.overlayPos) { + stream.pos = stream.start; + state.overlayCur = overlay.token(stream, state.overlay); + state.overlayPos = stream.pos; + } + stream.pos = Math.min(state.basePos, state.overlayPos); + if (stream.eol()) state.basePos = state.overlayPos = 0; + + if (state.overlayCur == null) return state.baseCur; + if (state.baseCur != null && combine) return state.baseCur + " " + state.overlayCur; + else return state.overlayCur; + }, + + indent: base.indent && function(state, textAfter) { + return base.indent(state.base, textAfter); + }, + electricChars: base.electricChars, + + innerMode: function(state) { return {state: state.base, mode: base}; }, + + blankLine: function(state) { + if (base.blankLine) base.blankLine(state.base); + if (overlay.blankLine) overlay.blankLine(state.overlay); + } + }; +}; +}); diff --git a/hub/static/js/mod/praise.js b/hub/static/js/mod/praise.js new file mode 100644 index 0000000..d8d738c --- /dev/null +++ b/hub/static/js/mod/praise.js @@ -0,0 +1,40 @@ +define('mod/praise', [ + 'jquery', + 'bootstrap' + ], function($) { + $(function () { + // handle rec btn on people page + var recWnd; + $('.rec .add-rec').not('.mine').click( + function (e) { + e.preventDefault(); + if (!recWnd) { + $.get($(this).attr('href'), {}, function (r) { + recWnd = $('<div class="rec-wnd"></div>').html(r).appendTo('body'); + recWnd.find('textarea').focus().end() + .find('.close-form').click( + function () { + recWnd.hide(); + }); + }, 'html'); + } else recWnd.show(); + }); + + // rec vote + $('.rec-vote').click( + function (e) { + e.preventDefault(); + var btns = $(this).parent('.vote-buttons'); + if (!btns.hasClass('likes') && !btns.hasClass('voted')) { + btns.addClass('likes'); + $.getJSON($(this).attr('href'), + {rec_id:$(this).attr('data-rec-id')}, + function (r) { + if (r.r == '0') { + btns.removeClass('likes'); + } + }); + } + }); + }); + }); diff --git a/hub/static/js/mod/proj_del_btn.js b/hub/static/js/mod/proj_del_btn.js new file mode 100644 index 0000000..375a277 --- /dev/null +++ b/hub/static/js/mod/proj_del_btn.js @@ -0,0 +1,33 @@ +define('mod/proj_del_btn', [ + 'jquery', + 'bootbox' +], function($) { + var delProj = function (proj, onSuccess) { + bootbox.confirm("Are you sure?", function(confirmed) { + if (confirmed) { + $.post('/' + proj + '/remove', function (ret) { + if (ret.r === 1) { + onSuccess(); + } else { + bootbox.alert(ret.err); + } + }, 'json'); + } + }); + }; + + $('.my_projects li').hover( + function () {$(this).addClass('hover');}, + function () {$(this).removeClass('hover');} + ); + + $('.my_projects li .delete-btn').click(function () { + var delBtn = $(this), proj = delBtn.attr('data-proj'); + delProj(proj, function () { delBtn.closest('li').remove(); }); + }); + + $('#settings-del-proj').click(function () { + var delBtn = $(this), proj = delBtn.attr('data-proj'); + delProj(proj, function () { window.location = '/'; }); + }); +}); diff --git a/hub/static/js/mod/pull_key.js b/hub/static/js/mod/pull_key.js new file mode 100644 index 0000000..c878a7d --- /dev/null +++ b/hub/static/js/mod/pull_key.js @@ -0,0 +1,52 @@ +define(['jquery', 'mousetrap'], function ($, mousetrap) { + var keywrap = function (e, action) { + if (e.srcElement && e.srcElement.tagName == 'BODY') { + e.preventDefault ? e.preventDefault() : (e.returnValue = false); + action(e); + } + } + Mousetrap.bind( + 'g g', + function (e) { + keywrap(e, function (e) { + $("html, body").animate({scrollTop: 0}); + }); + } + ); + Mousetrap.bind( + 'g d', + function (e) { + keywrap(e, function (e) { + var tab = $('.pull-nav a[href="#discussion-pane"]'); + if (tab && !tab.parent().hasClass('active')) { + $("html, body").animate({scrollTop: 0}); + tab.click(); + } + }); + } + ); + Mousetrap.bind( + 'g c', + function (e) { + keywrap(e, function (e) { + var tab = $('.pull-nav a[href="#commits-pane"]'); + if (tab && !tab.parent().hasClass('active')) { + $("html, body").animate({scrollTop: 0}); + tab.click(); + } + }); + } + ); + Mousetrap.bind( + 'g f', + function (e) { + keywrap(e, function (e) { + var tab = $('.pull-nav a[href="#files-pane"]'); + if (tab && !tab.parent().hasClass('active')) { + $("html, body").animate({scrollTop: 0}); + tab.click(); + } + }); + } + ); +}) diff --git a/hub/static/js/mod/quick_emoji.js b/hub/static/js/mod/quick_emoji.js new file mode 100644 index 0000000..e54feab --- /dev/null +++ b/hub/static/js/mod/quick_emoji.js @@ -0,0 +1,41 @@ +define([ 'jquery', 'lib/jquery.caret', 'bootstrap', ], + function($) { + var quick_emoji = {}; + quick_emoji.enable = function(textarea_query){ + $('body').delegate('.quick-emoji a', 'click', function(e){ + var emoji = $(this).attr('data-emoji'); + if(emoji){ + textarea = $(textarea_query); + var caretpos = textarea.caretPos(); + var content = textarea.val(); + var result = ""; + if(content) { + result = content.slice(0, caretpos) + ' ' + + emoji + ' ' + content.slice(caretpos); + textarea.val(result); + textarea.caretPos(caretpos + emoji.length + 2); + } + else { + result = emoji; + textarea.val(result); + textarea.caretPos(result.length); + } + } + return false; + }); + + $('body').delegate('.emojis a', 'hover', function(e){ + var $zoomDiv = $('.zoom'); + if (e.type == "mouseenter") { + var $emojiUrl = $(this).find('img').attr('src'); + var $zoomImage = $('.zoom-image'); + var $tabContent = $('.tab-content'); + $zoomImage.attr('src', $emojiUrl); + $zoomDiv.css({'display': 'block'}); + } else { + $zoomDiv.css({'display': 'none'}); + } + }); + } + return quick_emoji; + }); diff --git a/hub/static/js/mod/raven.js b/hub/static/js/mod/raven.js new file mode 100644 index 0000000..006b7d9 --- /dev/null +++ b/hub/static/js/mod/raven.js @@ -0,0 +1,16 @@ +require.config({ + baseUrl: '/js/' +}); +define('raven', 'lib/raven-1.0.8.js'); + +require( + ['raven'], + function(Raven) { + // app.yaml + var sentry_dsn = "http://dda66d28e34741e6ba430d44deebbeba@onimaru-stable.intra.douban.com/10"; + var options = { + includePaths: [/https?:\/\/code\.dapps\.douban\.com/] + }; + Raven.config(sentry_dsn, options).install(); + } +) diff --git a/hub/static/js/mod/relative_date.js b/hub/static/js/mod/relative_date.js new file mode 100644 index 0000000..1b77ae1 --- /dev/null +++ b/hub/static/js/mod/relative_date.js @@ -0,0 +1,15 @@ +define('mod/relative_date', [ + 'jquery', + 'lib/date.extensions' +], function($) { + var updateRelativeDate = function () { + $('.js-relative-date').each( + function (i, el) { + var el = $(el); + var t = (el.attr('datetime') || el.attr('data-time')).split(/[- : + T]/); + var d = new Date(t[0], t[1]-1, t[2], t[3], t[4], t[5]); + !isNaN(d.getTime()) && el.html(d.toRelativeTime({nowThreshold:60*1000})); + }); + }; + return updateRelativeDate; + }); diff --git a/hub/static/js/mod/search_autocomplete.js b/hub/static/js/mod/search_autocomplete.js new file mode 100644 index 0000000..b63b0e9 --- /dev/null +++ b/hub/static/js/mod/search_autocomplete.js @@ -0,0 +1,82 @@ +define('mod/search_autocomplete', [ + 'jquery' +], function($) { + var keyCode = {enter:13, esc:27, tab:9, up:38, down:40, ctrl:17, n:78, p:80}; + var searchInput = $('#global-search-field'), search_repos_menu, + hideReposMenu = function () { + search_repos_menu && !searchInput.is(":focus") + && !search_repos_menu.is(":focus") && search_repos_menu.empty().hide(); + }, + showIntro = function () { + if (!search_repos_menu || search_repos_menu.is(':empty')) { + var introContent = '<ul><li class="intro">Input project name to search <b>project</b> or startswith <span style="color:#4183C4">"@"</span> to search <b>user</b>.</li></ul>'; + search_repos_menu = $('<div id="search-repos-menu"></div>').appendTo('#search') + .on('mouseenter', 'li', function () { + search_repos_menu.find('li.active').removeClass('active'); + $(this).addClass('active'); + }) + .on('click', 'li', function (e) { + e.preventDefault(); + var url = $(this).attr('data-url'); + url && (window.location.href = url); + }); + search_repos_menu.html(introContent).show(); + } + }; + $('body').click(function () {setTimeout(hideReposMenu, 100);}); + searchInput + .focusin(showIntro) + .keydown(function (e) { + (e.keyCode == keyCode.enter && search_repos_menu && search_repos_menu.find('li.active').length) && e.preventDefault(); + }) + .keyup( + function (e) { + var k = e.keyCode; + if (k == keyCode.up || k == keyCode.down || k == keyCode.n + || k == keyCode.p || k == keyCode.ctrl || k == keyCode.enter) { + if (search_repos_menu && search_repos_menu.find('li').length) { + (k == keyCode.esc) && hideReposMenu();// esc key to close the menu + var actItem = search_repos_menu.find('li.active'); + if (actItem.length) { + var a = actItem; + if (k == keyCode.up || + (k == keyCode.p && e.ctrlKey == true)) { // up + var p = a.removeClass('active').prev(); + (p.length ? p : search_repos_menu.find('li:last')).addClass('active'); + } else if (k == keyCode.down || + (k == keyCode.n && e.ctrlKey == true)) { // down + var n = a.removeClass('active').next(); + (n.length ? n : search_repos_menu.find('li:first')).addClass('active'); + } else if (k == keyCode.enter) { // enter key to go to repo + e.preventDefault(); + var url = actItem.attr('data-url'); + url && (window.location.href = url); + } + } else { + search_repos_menu.find('li:first').addClass('active'); + } + } + } else { + var q = $(this).val(), reqUrl, templ; + if (q.substr(0, 1) == '@') { + // search for users + q = q.substring(1); + reqUrl = '/api/autocomplete_users'; + templ = $('#templ-users-autocomplete'); + } else { + // search for repos + reqUrl = '/api/autocomplete_repos'; + templ = $('#templ-repos-autocomplete'); + } + (q != '') ? $.getJSON(reqUrl, + {q:q}, + function (r) { + var current_q = searchInput.val(); + if (current_q === q) { + search_repos_menu.html($.tmpl(templ, r)).show(); + } + }) : showIntro(); + } + }); + +}); diff --git a/hub/static/js/mod/shortcut.js b/hub/static/js/mod/shortcut.js new file mode 100644 index 0000000..b80d1f4 --- /dev/null +++ b/hub/static/js/mod/shortcut.js @@ -0,0 +1,21 @@ +define('mod/shortcut', [ + 'jquery', + 'key' +], function($, key){ + // add shortcut key + var forkBtn = $('#fork-btn'), pullreqBtn = $('#pullrequest-btn'); + /* + if (forkBtn) { + forkBtn.click(function () { + window.location.href = forkBtn.attr("href"); + }); + key('f', function () {forkBtn.click();}); + } + */ + if (pullreqBtn) { + pullreqBtn.click(function () { + window.location.href = pullreqBtn.attr("href"); + }); + key('p', function () {pullreqBtn.click();}); + } +}); diff --git a/hub/static/js/mod/tasklist.js b/hub/static/js/mod/tasklist.js new file mode 100644 index 0000000..3bd3888 --- /dev/null +++ b/hub/static/js/mod/tasklist.js @@ -0,0 +1,23 @@ +define('mod/tasklist', [ + 'jquery', + 'jquery-lazyload' +], function($, _) { + $(function() { + $('body').delegate( + '.tasklist-enabled input[type=checkbox]', 'click', function(){ + var editForm = $(this).parents('.tasklist-enabled').find('.tasklist-form'); + if (editForm && editForm.length) { + var el = editForm.find('#issue_body'), content = el.val(), + p = /- \[[x\s]\]/g, joints = content.match(p), parts = content.split(p), + idx = Number($(this).data('item-index')); + joints[idx] = joints[idx] == '- [x]' ? '- [ ]' : '- [x]', content = ''; + for (var i=0, len=parts.length; i<len; i++) { + parts[i] && (content = content.concat(parts[i])); + joints[i] && (content = content.concat(joints[i])); + } + el.val(content); + editForm.submit(); + } + }); + }); +}); diff --git a/hub/static/js/mod/team_header.js b/hub/static/js/mod/team_header.js new file mode 100644 index 0000000..0e5437e --- /dev/null +++ b/hub/static/js/mod/team_header.js @@ -0,0 +1,30 @@ +define('mod/team_header', ['jquery'], function($){ + $(function(){ + var JoinOrLeaveTeam = function (url, onSuccess) { + $.post(url, function (ret) { + if (ret.r === 0) { + onSuccess(); + } + }, 'json'); + }; + $('.join-or-leave-btn').click(function () { + var Btn = $(this), team = Btn.attr('data-team'), _type = Btn.attr('data-type'), + url = '/hub/team/' + team + '/' + _type; + if (_type === "leave") { + JoinOrLeaveTeam(url, function () { + Btn.removeClass('btn-danger'); + Btn.addClass('btn-success'); + Btn.html('Join'); + Btn.attr('data-type', 'join'); + }); + }else{ + JoinOrLeaveTeam(url, function () { + Btn.removeClass('btn-success'); + Btn.addClass('btn-danger'); + Btn.html('Leave'); + Btn.attr('data-type', 'leave'); + }); + } + }); + }); +}); diff --git a/hub/static/js/mod/teamfeed_pagination.js b/hub/static/js/mod/teamfeed_pagination.js new file mode 100644 index 0000000..cb4d4c6 --- /dev/null +++ b/hub/static/js/mod/teamfeed_pagination.js @@ -0,0 +1,20 @@ +define('mod/teamfeed_pagination', [ + 'jquery', + 'mod/ajax_load', + 'mod/count', +], function($, ajaxLoad, countDict) { + $(function () { + var btn = $('.join-or-leave-btn'); + if (btn.length == 0) { + btn = $('.btn-success'); + } + var team_uid = btn.attr('data-team'); + $('.timeline .loader').hide(); + $('.timeline .pagination').show().click( + function () { + var number_type = "teamfeed_num"; + var url = "/j/more/team/" + team_uid + "/" + countDict.teamfeed_num; + ajaxLoad(url, number_type); + }); + }); +}); diff --git a/hub/static/js/mod/type_search.js b/hub/static/js/mod/type_search.js new file mode 100644 index 0000000..f637031 --- /dev/null +++ b/hub/static/js/mod/type_search.js @@ -0,0 +1,287 @@ +define('mod/type_search',[ + 'jquery', + 'string-score', +], function() { + var typeSearching = false, + projectName = $('#project_name').val(), + currentBranch = $('#current_branch').val(), + fileList, + fileListContainer, + fileListContainerBody, + searchInput = $('<input class="typing-search-input" type="text" autocomplete="off" spellcheck="false">'), + subPathsEle = $('#J_SubPaths'), + FILE_PATH_PREFIX = ['', projectName, 'blob', currentBranch, ''].join('/'), + TAG_MARK = 'mark', + TPL_FILE_LIST_WRAP = '\ + <div class="span12">\ + <table class="tree-browser finder" cellspacing="0" cellpadding="0">\ + <tbody>{ITEMS}</tbody>\ + </table>\ + </div>', + TPL_FILE_LIST_ITEM = '<tr class="tree-item"><td><a href="' + FILE_PATH_PREFIX + '{URL}">{NAME}</td></tr>', + CSS = '\ + input.typing-search-input { display:none; border:none; box-shadow:none; border-radius:none; padding:0; margin-bottom:0; font-size:100%; vertical-align:top; transition:none; }\ + input.typing-search-input:focus { box-shadow:none; }\ + .tree-browser.finder td { padding-left:20px; }\ + .tree-browser.finder tr.hover td { background:#fffeeb; }', + + SCROLLING_HOVER_LOCK = false, + CLICK_LOCK = false, + BLACK_LIST = { 'INPUT': 1, 'TEXTAREA': 1 }; + LOCK_TIMEOUT = 150; + + $('<style>' + CSS + '</style>').appendTo('head'); + + // insert search input + searchInput.insertAfter(subPathsEle); + $(document) + .keydown(function(evt) { + if (typeSearching && evt.keyCode === 27) { + searchInput.blur(); + + evt.preventDefault(); + } + }) + + .keypress(function(evt) { + if (typeSearching || evt.target.nodeName in BLACK_LIST ) return; + + if (!evt.metaKey && evt.charCode === 't'.charCodeAt(0)) { + + typeSearching = true; + + var def = $.Deferred(); + + if (!fileList) { + $.get('/api/' + projectName + '/git/allfiles', {'branch': currentBranch}, function(res) { + fileList = res; + fileListContainer = $(TPL_FILE_LIST_WRAP.replace('{ITEMS}', buildFileListHtml(fileList))).appendTo('.raw'); + fileListContainerBody = fileListContainer.find('tbody'); + + fileListContainerBody + .bind('mouseover mouseout', function(evt) { + // console.log('mouse') + if (SCROLLING_HOVER_LOCK) return; + + var target = evt.target, + ele; + + if (target.nodeName === 'TR') { + ele = $(target); + } else { + ele = $(target).parents('tr'); + } + + if (ele) { + $(this).find('tr').removeClass('hover'); + + if (evt.type === 'mouseover') { + ele.addClass('hover'); + } else { + ele.removeClass('hover'); + } + } + + }) + + .click(function(evt) { + var target = evt.target; + + if (target.nodeName !== 'A') { + window.location = $(target).find('a').attr('href'); + } + + CLICK_LOCK = true; + }); + + def.resolve(); + }, 'json'); + } else { + def.resolve(); + } + + def.done(function() { + searchInput.focus(); + }); + + evt.preventDefault(); + } + }); + + searchInput + .focus(function(evt) { + $(this).show(); + + subPathsEle.hide(); + + fileListContainerBody.html(buildFileListHtml(fileList)); + fileListContainer.show(); + $('#tree').hide(); + $('#readme').hide(); + }) + + .blur(function(evt) { + var self = this; + + setTimeout(function() { + if (CLICK_LOCK) return; + + $(self).hide().val(''); + + subPathsEle.show(); + + fileListContainer && fileListContainer.hide(); + $('#tree').show(); + $('#readme').show(); + + typeSearching = false; + }, LOCK_TIMEOUT); + }) + + .keydown(function(evt) { + var keyCode, item; + + if ((keyCode = evt.keyCode) === 27 || !typeSearching || !fileList) { + return; + } + + switch (keyCode) { + // UP + case 38: + fileSelect(-1); + evt.preventDefault(); + return; + // DOWN + case 40: + fileSelect(1); + evt.preventDefault(); + return; + // ENTER + case 13: + item = fileListContainerBody.find('tr.hover'); + item.click(); + return; + } + + var ele = this; + + setTimeout(function() { + var value = $.trim(ele.value), + result; + + if (!value) { + result = fileList; + } else { + // match + result = matchFileList(fileList, value); + + // sort + result = sortFileList(result); + + // get final fileList + result = $.map(result, function(item) { + return item.file; + }); + + } + + // fileListContainerBody.html(buildFileListHtml(result)); + fileListContainerBody[0].innerHTML = buildFileListHtml(result, value); + + }, 0); + + evt.stopPropagation(); + }); + + function buildFileListHtml(fileList, keyword) { + var html = ''; + + fileList.forEach(function(fileName) { + var name = fileName; + if (keyword) { + name = name.replace(keyword, '<' + TAG_MARK + '>' + keyword + '</' + TAG_MARK + '>'); + } + html += TPL_FILE_LIST_ITEM.replace(/\{URL\}/g, fileName).replace(/\{NAME\}/g, name); + }); + + return html; + } + + function matchFileList(fileList, keyword) { + var result = []; + + fileList.forEach(function(file) { + var score; + if (score = file.score(keyword)) { + result.push({ + score: score, + file: file + }); + } + }); + + return result; + } + + function sortFileList(fileListWithScore) { + return fileListWithScore.sort(function(a, b) { + return b.score - a.score; + }); + } + + function fileSelect(direction) { + var currentFileItem = fileListContainerBody.find('tr.hover'), + fileItems, fileItem; + + if (currentFileItem.length === 0) { + fileItems = fileListContainerBody.find('tr'); + fileItem = direction === 1 ? fileItems.eq(0) : fileItems.eq(-1); + } else { + fileItem = direction === 1 ? currentFileItem.next() : currentFileItem.prev(); + + if (fileItem.length === 0) { + fileItems = fileListContainerBody.find('tr'); + // scroll loop + fileItem = direction === 1 ? fileItems.eq(0) : fileItems.eq(-1); + } + } + + currentFileItem.removeClass('hover'); + fileItem.addClass('hover'); + + scrollIntoView(fileItem); + } + + var lockTimer; + + function scrollIntoView(element) { + element = $(element); + + var offsetTop = element.offset().top, + scrollTop = $(document).scrollTop(), + viewPortHeight = $(window).height(), + diff; + + if ( (diff = offsetTop - scrollTop) <= 0 || + (diff = offsetTop + element.height() - (scrollTop + viewPortHeight)) >= 0 ) { + + window.scrollTo(0, scrollTop + diff); + + // prevent scrolling trigger mouse event + // console.log('lock') + SCROLLING_HOVER_LOCK = true; + + if (lockTimer) { + clearTimeout(lockTimer); + lockTimer = null; + } + + lockTimer = setTimeout(function() { + // console.log('unlock') + SCROLLING_HOVER_LOCK = false; + }, LOCK_TIMEOUT); + } + + } + +}); diff --git a/hub/static/js/mod/upvote.js b/hub/static/js/mod/upvote.js new file mode 100644 index 0000000..f614e01 --- /dev/null +++ b/hub/static/js/mod/upvote.js @@ -0,0 +1,39 @@ +define(['jquery', ], + function ($) { + var upvote = {}; + upvote.button = function(btn){ + $(btn).click(function(){ + var method = 'PUT'; + var $ts = $(this); + if($ts.hasClass("upvoted")) method = 'DELETE'; + + $.ajax("upvote", + { + type:method, + dataType:'json', + success:function(res){ + console.log(res); + if(res.action>0){ + console.log($ts); + $ts.addClass('btn-danger upvoted'); + $ts.find('i').removeClass('icon-chevron-up').addClass('icon-chevron-down'); + $ts.find('span').text("Unvote"); + } + else if(res.action<0){ + $ts.removeClass('btn-danger upvoted'); + $ts.find('i').removeClass('icon-chevron-down').addClass('icon-chevron-up'); + $ts.find('span').text("Vote"); + } + else{ + alert(res.msg); + return; + } + $('#vote-count').text(res.count); + }, + }); + return false; + }); + + } + return upvote; + }); diff --git a/hub/static/js/mod/user_avatar.js b/hub/static/js/mod/user_avatar.js new file mode 100644 index 0000000..f15977b --- /dev/null +++ b/hub/static/js/mod/user_avatar.js @@ -0,0 +1,35 @@ +define('mod/user_avatar', [ + 'jquery', + 'jquery-lazyload' +], function($, _) { + var isRetinaDisplay = window.devicePixelRatio > 1; + + var patchForRetina = function(originalURL) { + var match = /^(.+\Ws=)(\d+)(.*)$/.exec(originalURL); + if (match === null) { + return originalURL; + } + + var oldSize = parseInt(match[2], 10); + var newSize = Math.ceil(window.devicePixelRatio * oldSize); + + return match[1] + newSize.toString(10) + match[3]; + }; + + var checkLoad = function() { + var e = $(this); + if (isRetinaDisplay) { + var dataOriginalURL = e.attr('data-original') || e.attr('src'); + e.attr('data-original', patchForRetina(dataOriginalURL)); + + e.lazyload({effect:"fadeIn", threshold:300}); + } + }; + + var loadAvatar = function () { + // $("img.user-avatar").each(checkLoad); + // $("img.avatar").each(checkLoad); + // $(window).resize(); + }; + return loadAvatar; +}); diff --git a/hub/static/js/mod/user_following.js b/hub/static/js/mod/user_following.js new file mode 100644 index 0000000..8147592 --- /dev/null +++ b/hub/static/js/mod/user_following.js @@ -0,0 +1,38 @@ +define('store', 'lib/store.js'); +define('mod/user_following', [ + 'jquery', + 'store' +], function($, store) { + var API_USER_FOLLOWING_PATH = "/api/user/following" + var USER_FOLLOWING_KEY = "user-following"; + var USER_FOLLOWING_UPDATE_KEY= "date:user-following" + var ONE_DAY_IN_SECONDS = 60*60*24; + + var update = function() { + var currentTime = new Date().getTime(); + var lastTime = store.get(USER_FOLLOWING_UPDATE_KEY); + if (lastTime && (currentTime - lastTime) < ONE_DAY_IN_SECONDS ) { + return; + } + + $.ajax( + API_USER_FOLLOWING_PATH + ).done(function(users){ + var following = $.map(users, function(item){ + return item["username"]; + }); + store.set(USER_FOLLOWING_KEY, following); + store.set(USER_FOLLOWING_UPDATE_KEY, currentTime); + }).fail(function(jqxhr, textStatus, error){ + return; + }); + } + + return { + update: update, + val: function(){ + return store.get(USER_FOLLOWING_KEY) || []; + } + }; + +}); diff --git a/hub/static/js/mod/user_profile_card.js b/hub/static/js/mod/user_profile_card.js new file mode 100644 index 0000000..445da14 --- /dev/null +++ b/hub/static/js/mod/user_profile_card.js @@ -0,0 +1,55 @@ +define('mod/user_profile_card', [ + 'jquery', + 'jquery-tmpl' +], function($) { + $(function () { + var userCard, teamCard, users = {}, user_type = {}; + $(document).delegate( + '.user-link,.user-mention', 'mouseover', + function (e) { + if (!userCard) { + userCard = $('<div class="user-card"></div>').appendTo('body') + .mouseleave(function () { + $(this).hide(); + $('.team-card').hide(); + }); + } + if (!teamCard) { + teamCard = $('<div class="team-card"></div>').appendTo('body') + .mouseleave(function () { + $(this).hide(); + $('.user-card').hide(); + }); + } + var pos = $(this).offset(); + pos.left = pos.left - 5; + pos.top = pos.top - 5; + var name = /@?(\w+)/.exec($(this).text())[1], user = users[name]; + + if (!user) { + $.getJSON('/api/card_info', {user: name}, + function (r) { + if (r.team) { + teamCard.css(pos).empty().show(); + teamCard.append($.tmpl($('#templ-team-card'), r.team)); + user_type[name] = 'team'; + users[name] = r.team; + } else { + userCard.css(pos).empty().show(); + userCard.append($.tmpl($('#templ-user-card'), r.user)); + user_type[name] = 'user'; + users[name] = r.user; + } + }); + } else { + if (user_type[name] === 'team') { + teamCard.css(pos).empty().show(); + teamCard.append($.tmpl($('#templ-team-card'), user)); + } else { + userCard.css(pos).empty().show(); + userCard.append($.tmpl($('#templ-user-card'), user)); + } + } + }); + }); +}); diff --git a/hub/static/js/mod/userfeed_pagination.js b/hub/static/js/mod/userfeed_pagination.js new file mode 100644 index 0000000..f5d4f0f --- /dev/null +++ b/hub/static/js/mod/userfeed_pagination.js @@ -0,0 +1,16 @@ +define('mod/userfeed_pagination', [ + 'jquery', + 'mod/ajax_load', + 'mod/count', +], function($, ajaxLoad, countDict) { + $(function () { + $('.timeline .loader').hide(); + $('.timeline .pagination').show().click( + function () { + var number_type = "userfeed_num"; + var url = "/j/more/userfeed/" + countDict.userfeed_num; + ajaxLoad(url, number_type); + }); + }) +}); + diff --git a/hub/static/js/mod/watch.js b/hub/static/js/mod/watch.js new file mode 100644 index 0000000..af03f93 --- /dev/null +++ b/hub/static/js/mod/watch.js @@ -0,0 +1,73 @@ +define('mod/watch', ['jquery'], function($){ + + $(function() { + var watch_btn = $("#watch-btn"); + var countLabel = $('#watched-count'); + var proj_id = watch_btn.attr("proj_id"); + + var updateLabelBy = function (n) { + var count = Number(countLabel.text()) || 0; + if (count === 0 && n <= 0) { return; } + + count += n; + countLabel.text(count.toString()); + }; + + watch_btn.click(function() { + + if(watch_btn.hasClass('watch')) { + $.post("/watch/"+proj_id, function(data) { + if (!data.error) { + watch_btn.text('Unwatch'); + watch_btn.addClass('unwatch'); + watch_btn.removeClass('watch'); + updateLabelBy(1); + } else { + // show error notification to user + show_error("关注失败"); + } + }); + } + else{ + $.ajax("/watch/"+proj_id, { + type: "DELETE", + success: function(data) { + if (!data.error) { + watch_btn.text('Watch'); + watch_btn.addClass('watch'); + watch_btn.removeClass('unwatch'); + updateLabelBy(-1); + } else { + show_error("取消关注失败"); + } + }, + error: function(e) { + show_error("取消关注失败"); + } + }); + } + }); + + function show_success(msg) { + var successDiv = $(".navbar .success"); + if (successDiv.size() === 0 ) { + successDiv= $("<div>").addClass("success").addClass("alert-success"); + $("div.navbar").append(successDiv); + } + successDiv.html(msg); + successDiv.fadeOut(1500, function () { + $(this).remove(); + }); + } + + function show_error(msg) { + var errorDiv = $(".navbar .error"); + if (errorDiv.size() === 0 ) { + errorDiv = $("<div>").addClass("error").addClass("alert-error"); + $("div.navbar").append(errorDiv); + } + errorDiv.html(msg); + } + + }); +}); diff --git a/hub/static/js/mod/zclip.js b/hub/static/js/mod/zclip.js new file mode 100644 index 0000000..f8b5d3f --- /dev/null +++ b/hub/static/js/mod/zclip.js @@ -0,0 +1,20 @@ +define('mod/zclip', [ + 'jquery', + 'jquery-zclip' +], function($, _) { + $(function () { + $('input.git-url').focus(function(e) { + var elem = this; + setTimeout(function() { + elem.select(); + }, 0); + }); + $('.copy-git-url').zclip({ + path: '/static/js/lib/ZeroClipboard.swf', + copy: function() { + return $('.copy-git-url').attr('data-clipboard-text'); + }, + afterCopy: function() {} + }); + }); +}); diff --git a/hub/static/jsx/components/Icon.jsx b/hub/static/jsx/components/Icon.jsx new file mode 100644 index 0000000..e35e770 --- /dev/null +++ b/hub/static/jsx/components/Icon.jsx @@ -0,0 +1,48 @@ +import React from 'react'; + +export default class Icon extends React.Component { + + render() { + switch(this.props.type) { + + case 'circle_error': + return ( + <svg viewBox="0 0 20 20"> + <path d="M10,0.982c4.973,0,9.018,4.046,9.018,9.018S14.973,19.018,10,19.018S0.982,14.973,0.982,10 + S5.027,0.982,10,0.982 M10,0C4.477,0,0,4.477,0,10c0,5.523,4.477,10,10,10s10-4.477,10-10C20,4.477,15.523,0,10,0L10,0z M9,5.703 + V5.441h2.5v0.262l-0.66,5.779H9.66L9,5.703z M9.44,12.951h1.621v1.491H9.44V12.951z"/> + </svg> + ) + + case 'circle_tick': + return ( + <svg viewBox="0 0 23 23"> + <path d="M11.5,23C5.2,23,0,17.8,0,11.5S5.2,0,11.5,0S23,5.2,23,11.5S17.8,23,11.5,23z M11.5,1C5.7,1,1,5.7,1,11.5S5.7,22,11.5,22 + S22,17.3,22,11.5S17.3,1,11.5,1z M10.4,15.2l6.7-7c0.2-0.2,0.2-0.5,0-0.7c-0.2-0.2-0.5-0.2-0.7,0L10,14.2L7,11 + c-0.2-0.2-0.5-0.2-0.7,0c-0.2,0.2-0.2,0.5,0,0.7l3.4,3.5c0.1,0.1,0.2,0.1,0.3,0.1S10.3,15.3,10.4,15.2z"/> + </svg> + ) + + case 'circle_tick_filled': + return ( + <svg viewBox="0 0 20 20"> + <path fill="#4FB07F" d="M9.5,0C14.7,0,19,4.3,19,9.5S14.7,19,9.5,19S0,14.7,0,9.5S4.3,0,9.5,0z"/> + <path fill="#FFFFFF" d="M8.7,12.9c-0.1,0-0.2,0-0.3-0.1l-2.4-2.5c-0.1-0.1-0.1-0.4,0-0.5c0.1-0.2,0.4-0.2,0.5,0L8.7,12l4.6-5 + c0.1-0.1,0.4-0.1,0.5,0c0.1,0.2,0.1,0.4,0,0.5L9,12.8C9,12.8,8.9,12.9,8.7,12.9C8.8,12.9,8.8,12.9,8.7,12.9z"/> + </svg> + ) + + case 'guthub': + return ( + <svg viewBox="0 0 34 34"> + <path fill-rule="evenodd" clip-rule="evenodd" fill="#191717" d="M32.6,16.3c0,7.2-4.7,13.3-11.1,15.5c-0.8,0.2-1.1-0.3-1.1-0.8 + c0-0.5,0-2.3,0-4.5c0-1.5-0.5-2.5-1.1-3c3.6-0.4,7.4-1.8,7.4-8c0-1.8-0.6-3.2-1.7-4.4c0.2-0.4,0.7-2.1-0.2-4.3c0,0-1.4-0.4-4.5,1.7 + c-1.3-0.4-2.7-0.5-4.1-0.5c-1.4,0-2.8,0.2-4.1,0.5C9.1,6.3,7.7,6.8,7.7,6.8C6.8,9,7.4,10.7,7.6,11.1c-1,1.1-1.7,2.6-1.7,4.4 + c0,6.2,3.8,7.6,7.4,8.1c-0.5,0.4-0.9,1.1-1,2.2c-0.9,0.4-3.3,1.1-4.7-1.4c0,0-0.9-1.6-2.5-1.7c0,0-1.6,0-0.1,1c0,0,1.1,0.5,1.8,2.4 + c0,0,1,3.2,5.5,2.2c0,1.4,0,2.4,0,2.8c0,0.4-0.3,0.9-1.1,0.8C4.7,29.6,0,23.5,0,16.3C0,7.3,7.3,0,16.3,0C25.3,0,32.6,7.3,32.6,16.3z + "/> + </svg> + ) + } + } +} \ No newline at end of file diff --git a/hub/static/jsx/components/Input.jsx b/hub/static/jsx/components/Input.jsx new file mode 100644 index 0000000..1440386 --- /dev/null +++ b/hub/static/jsx/components/Input.jsx @@ -0,0 +1,232 @@ +import React from 'react'; +import _ from 'underscore'; +import Icon from './Icon'; +import InputError from './InputError'; +import PasswordValidator from './PasswordValidator'; +import classNames from 'classnames/bind'; + +let cx = classNames.bind({}); + +export default class Input extends React.Component { + constructor(props) { + super(props); + this.state = { + valid: (this.props.isValid && this.props.isValid()) || true, + empty: _.isEmpty(this.props.value), + focus: false, + value: null, + iconsVisible: !this.props.validator, + errorMessage: this.props.emptyMessage, + validator: this.props.validator, + validatorVisible: false, + type: this.props.type, + minCharacters: this.props.minCharacters, + requireCapitals: this.props.requireCapitals, + requireNumbers: this.props.requireNumbers, + forbiddenWords: this.props.forbiddenWords, + isValidatorValid: { + minChars: false, + capitalLetters: false, + numbers: false, + words: false, + all: false + }, + allValidatorValid: false + }; + } + + handleChange = (event) => { + this.setState({ + value: event.target.value, + empty: _.isEmpty(event.target.value) + }); + + if (this.props.validator) { + this.checkRules(event.target.value) + }; + + if (this.props.validate) { + this.validateInput(event.target.value); + } + + if (this.props.onChange) { + this.props.onChange(event); + } + } + + validateInput = (value) => { + // trigger custom validation method in the parent component + if (this.props.validate && this.props.validate(value)){ + this.setState({ + valid: true, + errorVisible: false + }); + } else { + this.setState({ + valid: false, + errorMessage: !_.isEmpty(value) ? this.props.errorMessage : this.props.emptyMessage + }); + } + + }; + + componentWillReceiveProps = (newProps) => { + // perform update only when new value exists and not empty + if (newProps.value) { + if(!_.isUndefined(newProps.value) && newProps.value.length > 0) { + if (this.props.validate) { + this.validateInput(newProps.value); + } + this.setState({ + value: newProps.value, + empty: _.isEmpty(newProps.value) + }); + } + } + }; + + isValid() { + if (this.props.validate) { + if (_.isEmpty(this.state.value) || !this.props.validate(this.state.value)) { + this.setState({ + valid: false, + errorVisible: true + }); + } + } + + return this.state.valid; + } + + handleFocus = (event) => { + this.setState({ + focus: true, + validatorVisible: true + }); + + if (this.props.validator) { + this.setState({ + errorVisible: false + }); + } + } + + handleBlur = (event) => { + this.setState({ + focus: false, + errorVisible: !this.state.valid, + validatorVisible: false + }); + } + + mouseEnterError() { + this.setState({ + errorVisible: true + }); + } + + hideError() { + this.setState({ + errorVisible: false, + validatorVisible: false + }); + } + + // validator function + checkRules = (value) => { + var validData = { + minChars: !_.isEmpty(value) ? value.length >= parseInt(this.state.minCharacters): false, + capitalLetters: !_.isEmpty(value) ? this.countCapitals(value): false, + numbers: !_.isEmpty(value) ? this.countNumbers(value) > 0 : false, + words: !_.isEmpty(value) ? !this.checkWords(value) : false + }; + var allValid = (validData.minChars && validData.capitalLetters && validData.numbers && validData.words); + + this.setState({ + isValidatorValid: validData, + allValidatorValid: allValid, + valid: allValid + }); + }; + + countCapitals = (value) => { + return value.replace(/[^A-Z]/g, "").length; + }; + + countNumbers = (value) => { + return /\d/.test(value); + }; + + checkWords = (value) => { + return _.some(this.state.forbiddenWords, function (word) { + var matched = (word === value) ? true : ""; + return matched + }); + }; + + render() { + + var inputGroupClasses = cx({ + 'input_group': true, + 'input_valid': this.state.valid, + 'input_error': !this.state.valid, + 'input_empty': this.state.empty, + 'input_hasValue': !this.state.empty, + 'input_focused': this.state.focus, + 'input_unfocused': !this.state.focus + }); + + var validator; + + if (this.state.validator) { + validator = + <PasswordValidator + ref="passwordValidator" + visible={this.state.validatorVisible} + name={this.props.text} + value={this.state.value} + validData={this.state.isValidatorValid} + valid={this.state.allValidatorValid} + forbiddenWords={this.state.forbiddenWords} + minCharacters={this.props.minCharacters} + requireCapitals={this.props.requireCapitals} + requireNumbers={this.props.requireNumbers} + /> + }; + + return ( + <div className={inputGroupClasses}> + + <label className="input_label" htmlFor={this.props.text}> + <span className="label_text">{this.props.text}</span> + </label> + + <input + {...this.props} + placeholder={this.props.placeholder} + className="input" + id={this.props.text} + defaultValue={this.props.defaultValue} + value={this.state.value} + onChange={this.handleChange} + onFocus={this.handleFocus} + onBlur={this.handleBlur} + autoComplete="off" + /> + + <InputError + visible={this.state.errorVisible} + errorMessage={this.state.errorMessage} + /> + + <div className="validationIcons"> + <i className="input_error_icon" onMouseEnter={this.mouseEnterError}> <Icon type="circle_error"/> </i> + <i className="input_valid_icon"> <Icon type="circle_tick"/> </i> + </div> + + {validator} + + </div> + ); + } +}; diff --git a/hub/static/jsx/components/InputError.jsx b/hub/static/jsx/components/InputError.jsx new file mode 100644 index 0000000..e3b712e --- /dev/null +++ b/hub/static/jsx/components/InputError.jsx @@ -0,0 +1,28 @@ +import React from 'react'; +import _ from 'underscore'; +import classNames from 'classnames/bind'; + +let cx = classNames.bind({}); + +export default class InputError extends React.Component { + constructor(props) { + super(props); + this.state = { + message: 'Input is invalid' + }; + } + + render() { + var errorClass = cx({ + 'error_container': true, + 'visible': this.props.visible, + 'invisible': !this.props.visible + }); + + return ( + <div className={errorClass}> + <span>{this.props.errorMessage}</span> + </div> + ) + } +} diff --git a/hub/static/jsx/components/PasswordValidator.jsx b/hub/static/jsx/components/PasswordValidator.jsx new file mode 100644 index 0000000..5bcec27 --- /dev/null +++ b/hub/static/jsx/components/PasswordValidator.jsx @@ -0,0 +1,83 @@ +import React from 'react'; +import _ from 'underscore'; +import Icon from './Icon'; +import classNames from 'classnames/bind'; + +let cx = classNames.bind({}); + +export default class PasswordValidator extends React.Component { + constructor(props) { + super(props); + this.state = { + value: null, + minCharacters: this.props.minCharacters, + requireCapitals: this.props.requireCapitals, + requireNumbers: this.props.requireNumbers, + forbiddenWords: this.props.forbiddenWords, + name: this.props.name + } + } + + render() { + var validatorClass = cx({ + 'password_validator': true, + 'visible': this.props.visible, + 'invisible': !this.props.visible + }); + + var forbiddenWords = this.state.forbiddenWords.map(function(word, i) { + return ( + <span key={i} className="bad_word"> + "{word}" + </span> + ) + }); + + var validatorTitle; + + if (this.props.valid) { + validatorTitle = + <h4 className="validator_title valid"> + {this.props.name} IS OK + </h4> + } else { + validatorTitle = + <h4 className="validator_title invalid"> + {this.props.name} RULES + </h4> + } + + return ( + <div className={validatorClass}> + <div className="validator_container"> + {validatorTitle} + <ul className="rules_list"> + <li className={cx({'valid': this.props.validData.minChars})}> + <i className="icon_valid"> <Icon type="circle_tick_filled"/> </i> + <i className="icon_invalid"> <Icon type="circle_error"/> </i> + <span className="error_message">{this.state.minCharacters} characters minimum</span> + </li> + + <li className={cx({'valid': this.props.validData.capitalLetters})}> + <i className="icon_valid"> <Icon type="circle_tick_filled"/> </i> + <i className="icon_invalid"> <Icon type="circle_error"/> </i> + <span className="error_message">Contains at least {this.state.requireCapitals} capital letter</span> + </li> + + <li className={cx({'valid': this.props.validData.numbers})}> + <i className="icon_valid"> <Icon type="circle_tick_filled"/> </i> + <i className="icon_invalid"> <Icon type="circle_error"/> </i> + <span className="error_message">Contains at least {this.state.requireNumbers} number</span> + </li> + + <li className={cx({'valid': this.props.validData.words})}> + <i className="icon_valid"> <Icon type="circle_tick_filled"/> </i> + <i className="icon_invalid"> <Icon type="circle_error"/> </i> + <span className="error_message">Can't be {forbiddenWords}</span> + </li> + </ul> + </div> + </div> + ) + } +} diff --git a/hub/static/jsx/components/Utils.jsx b/hub/static/jsx/components/Utils.jsx new file mode 100644 index 0000000..d30f5a9 --- /dev/null +++ b/hub/static/jsx/components/Utils.jsx @@ -0,0 +1,10 @@ +export function getQueryVariable(variable) +{ + var query = window.location.search.substring(1); + var vars = query.split("&"); + for (var i=0;i<vars.length;i++) { + var pair = vars[i].split("="); + if(pair[0] == variable){return pair[1];} + } + return '/'; +} diff --git a/hub/static/jsx/login.jsx b/hub/static/jsx/login.jsx new file mode 100644 index 0000000..8eea4da --- /dev/null +++ b/hub/static/jsx/login.jsx @@ -0,0 +1,5 @@ +import ReactDOM from 'react-dom'; +import React from 'react'; +import Login from './signin'; + +ReactDOM.render(<Login/>, document.getElementById('main')); diff --git a/hub/static/jsx/register.jsx b/hub/static/jsx/register.jsx new file mode 100644 index 0000000..da173fd --- /dev/null +++ b/hub/static/jsx/register.jsx @@ -0,0 +1,5 @@ +import ReactDOM from 'react-dom'; +import React from 'react'; +import Register from './signup'; + +ReactDOM.render(<Register/>, document.getElementById('main')); diff --git a/hub/static/jsx/signin.jsx b/hub/static/jsx/signin.jsx new file mode 100644 index 0000000..d7c70d8 --- /dev/null +++ b/hub/static/jsx/signin.jsx @@ -0,0 +1,105 @@ +import React from 'react'; +import _ from 'underscore'; +import $ from 'jquery'; +import Input from './components/Input'; +import Icon from './components/Icon'; +import InputError from './components/InputError'; +import {getQueryVariable} from './components/Utils'; + +export class LoginComponent extends React.Component { + constructor(props) { + super(props); + this.state = { + username: null, + password: null, + errorVisible: false, + errorMessage: '登录失败, 请联系管理员' + }; + } + + saveAndContinue = (event) => { + event.preventDefault(); + let data = { + username: this.state.username, + password: this.state.password, + continue: decodeURIComponent(getQueryVariable('continue')) + }, self = this; + + $.post('/login/', data).done(function(result) { + let res = JSON.parse(result); + if (res.r) { + self.setState({ + errorVisible: true, + errorMessage: res.message + }); + } else { + window.location = res.continue; + } + }); + }; + + handleUsernameInput = (event) => { + this.setState({ + username: event.target.value + }); + }; + + handlePasswordInput = (event) => { + this.setState({ + password: event.target.value + }); + }; + + render() { + return ( + <div className="create_account_screen"> + <div className="create_account_form"> + <h1>登录CODE</h1> + <form onSubmit={this.saveAndContinue}> + + <Input + text="用户名" + ref="username" + type="text" + defaultValue={this.state.username} + value={this.state.username} + onChange={this.handleUsernameInput} + /> + + <Input + text="密码" + type="password" + ref="text" + defaultValue={this.state.username} + value={this.state.passsword} + onChange={this.handlePasswordInput} + /> + + <InputError + visible={this.state.errorVisible} + errorMessage={this.state.errorMessage} + /> + + <button + type="submit" + className="button button_wide"> + 登录 + </button> + </form> + </div> + </div> + ); + } +} + +export default class Login extends React.Component { + render() { + return ( + <div className="application_wrapper"> + <div className="application_routeHandler"> + <LoginComponent/> + </div> + </div> + ); + } +} diff --git a/hub/static/jsx/signup.jsx b/hub/static/jsx/signup.jsx new file mode 100644 index 0000000..7fe7966 --- /dev/null +++ b/hub/static/jsx/signup.jsx @@ -0,0 +1,170 @@ +import React from 'react'; +import _ from 'underscore'; +import $ from 'jquery'; +import Input from './components/Input'; +import Icon from './components/Icon'; +import InputError from './components/InputError'; +import {getQueryVariable} from './components/Utils'; + +export class RegisterComponent extends React.Component { + constructor(props) { + super(props); + this.state = { + email: null, + password: null, + confirmPassword: null, + forbiddenWords: ["password", "user", "username"], + errorVisible: false, + errorMessage: '注册失败, 请联系管理员' + }; + } + + handlePasswordInput = (event) => { + if (!_.isEmpty(this.state.confirmPassword)) { + this.refs.passwordConfirm.isValid(); + }; + this.refs.passwordConfirm.hideError(); + this.setState({ + password: event.target.value + }); + } + + handleConfirmPasswordInput = (event) => { + this.setState({ + confirmPassword: event.target.value + }); + }; + + saveAndContinue = (event) => { + event.preventDefault(); + + var canProceed = this.validateEmail(this.state.email) + && this.refs.password.isValid() + && this.refs.passwordConfirm.isValid(); + + if (canProceed) { + let data = { + email: this.state.email, + password: this.state.password + }, self = this, visible; + + + $.post('/register/', data).done(function(result) { + let res = JSON.parse(result); + if (res.r) { + self.setState({ + errorVisible: true, + errorMessage: res.message + }); + } else { + let next = decodeURIComponent(getQueryVariable('continue')); + window.location = next; + } + }); + } else { + this.refs.email.isValid(); + this.refs.password.isValid(); + this.refs.passwordConfirm.isValid(); + } + }; + + isConfirmedPassword = (event) => { + return (event == this.state.password); + }; + + handleEmailInput = (event) => { + this.setState({ + email: event.target.value + }); + }; + + validateEmail = (event) => { + // from http://stackoverflow.com/questions/46155/validate-email-address-in-javascript + var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; + return re.test(event); + }; + + isEmpty = (value) => { + return !_.isEmpty(value); + }; + + updateStatesValue = (value) => { + this.setState({ + statesValue: value + }); + }; + + render() { + return ( + <div className="create_account_screen"> + <div className="create_account_form"> + <h1>创建新用户</h1> + <p>开启CODE之旅.</p> + <form onSubmit={this.saveAndContinue}> + + <Input + text="邮箱地址" + ref="email" + type="text" + defaultValue={this.state.email} + validate={this.validateEmail} + value={this.state.email} + onChange={this.handleEmailInput} + errorMessage="Email格式错误" + emptyMessage="Email不能为空" + errorVisible={this.state.showEmailError} + /> + + <Input + text="密码" + type="password" + ref="password" + validator="true" + minCharacters="8" + requireCapitals="1" + requireNumbers="1" + forbiddenWords={this.state.forbiddenWords} + value={this.state.passsword} + emptyMessage="密码输入错误" + onChange={this.handlePasswordInput} + /> + + <Input + text="确认密码" + ref="passwordConfirm" + type="password" + validate={this.isConfirmedPassword} + value={this.state.confirmPassword} + onChange={this.handleConfirmPasswordInput} + emptyMessage="密码为必选" + errorMessage="2次输入的密码不相同, 请确认" + /> + + <InputError + visible={this.state.errorVisible} + errorMessage={this.state.errorMessage} + /> + + <button + type="submit" + className="button button_wide"> + 创建 + </button> + </form> + </div> + </div> + ); + } +} + +export default class Register extends React.Component { + render() { + return ( + <div className="application_wrapper"> + <div className="application_routeHandler"> + <RegisterComponent/> + </div> + </div> + ); + } +} diff --git a/hub/static/octicons/octicons-regular-webfont.eot b/hub/static/octicons/octicons-regular-webfont.eot new file mode 100644 index 0000000..6b5ddcb Binary files /dev/null and b/hub/static/octicons/octicons-regular-webfont.eot differ diff --git a/hub/static/octicons/octicons-regular-webfont.svg b/hub/static/octicons/octicons-regular-webfont.svg new file mode 100644 index 0000000..d98925f --- /dev/null +++ b/hub/static/octicons/octicons-regular-webfont.svg @@ -0,0 +1,296 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata></metadata> +<defs> +<font id="octiconsregular" horiz-adv-x="2048" > +<font-face units-per-em="2048" ascent="1638" descent="-410" /> +<missing-glyph horiz-adv-x="500" /> +<glyph /> +<glyph /> +<glyph unicode=" " /> +<glyph unicode="" horiz-adv-x="500" d="M0 0z" /> +<glyph unicode="" d="M1792 1664v-1536q0 -5 -1 -13.5t-7.5 -31t-18.5 -39t-38.5 -30.5t-62.5 -14h-640v-256l-192 192l-192 -192v256h-256q-26 0 -47 7t-34 18.5t-23 25t-14 27t-6.5 25t-3.5 18.5v7v1536q0 26 7 47t18.5 34t25 23t27 14t25 6.5t18.5 3.5h7h1280q48 0 88 -40t40 -88zM384 512 h128v1152h-128v-1152zM896 768h512v384q0 96 -80 176t-176 80t-176 -80t-80 -176v-384zM1280 1152h-256q0 48 40 88t88 40t88 -40t40 -88zM1024 128h512q5 0 13.5 1t31 7.5t39 18.5t30.5 38.5t14 62.5v128h-1280v-128q0 -5 1 -13.5t7.5 -31t18.5 -39t38.5 -30.5t62.5 -14 h128v128h384v-128z" /> +<glyph unicode="" d="M1792 1664v-1536q0 -5 -1 -13.5t-7.5 -31t-18.5 -39t-38.5 -30.5t-62.5 -14h-640v-256l-192 192l-192 -192v256h-256q-26 0 -47 7t-34 18.5t-23 25t-14 27t-6.5 25t-3.5 18.5v7v1536q0 26 7 47t18.5 34t25 23t27 14t25 6.5t18.5 3.5h7h1280q5 0 13.5 -1t31 -7.5t39 -18.5 t30.5 -38.5t14 -62.5zM1664 1664h-1024v-1152h1024v1152zM896 1408h-128v128h128v-128zM896 1152h-128v128h128v-128zM896 896h-128v128h128v-128zM896 640h-128v128h128v-128zM1024 128h512q5 0 13.5 1t31 7.5t39 18.5t30.5 38.5t14 62.5v128h-1280v-128q0 -5 1 -13.5 t7.5 -31t18.5 -39t38.5 -30.5t62.5 -14h128v128h384v-128z" /> +<glyph unicode="" d="M1792 1664v-1536q0 -5 -1 -13.5t-7.5 -31t-18.5 -39t-38.5 -30.5t-62.5 -14h-640v-256l-192 192l-192 -192v256h-256q-26 0 -47 7t-34 18.5t-23 25t-14 27t-6.5 25t-3.5 18.5v7v1536q0 26 7 47t18.5 34t25 23t27 14t25 6.5t18.5 3.5h7h1280q48 0 88 -40t40 -88z M1664 1664h-1024v-1152h1024v1152zM1024 896l-256 256v384h256v-256l128 -128l128 128v256h256v-384l-256 -256v-256h-256v256zM1024 128h512q5 0 13.5 1t31 7.5t39 18.5t30.5 38.5t14 62.5v128h-1280v-128q0 -5 1 -13.5t7.5 -31t18.5 -39t38.5 -30.5t62.5 -14h128v128h384 v-128z" /> +<glyph unicode="" d="M1792 896v-768q0 -5 -1 -13.5t-7.5 -31t-18.5 -39t-38.5 -30.5t-62.5 -14h-640v-256l-192 192l-192 -192v256h-256q-26 0 -47 7t-34 18.5t-23 25t-14 27t-6.5 25t-3.5 18.5v7v1536q0 26 7 47t18.5 34t25 23t27 14t25 6.5t18.5 3.5h7h768v-128h-512v-1152h1024v384h128z M1920 1536v-256h-256v-256h-256v256h-256v256h256v256h256v-256h256zM896 1408h-128v128h128v-128zM896 1152h-128v128h128v-128zM896 896h-128v128h128v-128zM768 768h128v-128h-128v128zM1024 128h512q5 0 13.5 1t31 7.5t39 18.5t30.5 38.5t14 62.5v128h-1280v-128 q0 -5 1 -13.5t7.5 -31t18.5 -39t38.5 -30.5t62.5 -14h128v128h384v-128z" /> +<glyph unicode="" d="M1536 1664h-1280l128 128h1152v-128zM640 1408h-384v128h384v-128zM896 1408h-128v128h128v-128zM1920 1536v-256h-768v256h768zM640 1152h-384v128h384v-128zM896 1152h-128v128h128v-128zM640 896h-384v128h384v-128zM896 896h-128v128h128v-128zM640 640h-384v128h384 v-128zM768 768h128v-128h-128v128zM1664 768h128v-128h-128v128zM256 512h1536v-128h-1536v128zM256 256h1536l-128 -128h-1280zM640 0h128l-128 -128v128zM896 0h128v-128z" /> +<glyph unicode="" d="M1792 1664v-1536q0 -5 -1 -13.5t-7.5 -31t-18.5 -39t-38.5 -30.5t-62.5 -14h-256v128h128q5 0 13.5 1t31 7.5t39 18.5t30.5 38.5t14 62.5v128h-256v128h256v1152h-1024v-1152h256v-128h-512v-128q0 -5 1 -13.5t7.5 -31t18.5 -39t38.5 -30.5t62.5 -14h128v128h256v-256 l-256 -256v256h-256q-26 0 -47 7t-34 18.5t-23 25t-14 27t-6.5 25t-3.5 18.5v7v1536q0 26 7 47t18.5 34t25 23t27 14t25 6.5t18.5 3.5h7h1280q5 0 13.5 -1t31 -7.5t39 -18.5t30.5 -38.5t14 -62.5zM896 1408h-128v128h128v-128zM768 1280h128v-128h-128v128zM1536 640h-256 v-896h-256v896h-256l384 512z" /> +<glyph unicode="" d="M1536 896v-384v-384q0 -5 -1 -13.5t-7.5 -31t-18.5 -39t-38.5 -30.5t-62.5 -14h-640v-256l-192 192l-192 -192v256h-256q-26 0 -47 7t-34 18.5t-23 25t-14 27t-6.5 25t-3.5 18.5v7v1536q0 26 7 47t18.5 34t25 23t27 14t25 6.5t18.5 3.5h7h1280q5 0 13.5 -1t31 -7.5 t39 -18.5t30.5 -38.5t14 -62.5v-256h-128v256h-1024v-1152h1024v384h128zM640 1408h-128v128h128v-128zM1664 768v256h-768v256h768v256l384 -384zM640 1152h-128v128h128v-128zM640 896h-128v128h128v-128zM512 768h128v-128h-128v128zM768 128h512q5 0 13.5 1t31 7.5 t39 18.5t30.5 38.5t14 62.5v128h-1280v-128q0 -5 1 -13.5t7.5 -31t18.5 -39t38.5 -30.5t62.5 -14h128v128h384v-128z" /> +<glyph unicode="" d="M2048 1280v-1152h-256l-128 128h-384l-128 -128h-256l-128 128h-384l-128 -128h-256v1152l256 256h640l128 -128l128 128h640zM1920 1280l-128 128h-640l-128 -128l-128 128h-640l-128 -128v-896l128 128h512l128 -128h128v-128h128v128l128 128h512l128 -128v896z M256 1280h512v-128h-512v128zM1024 1152v128h128v-128h-128zM1280 1280h512v-128h-512v128zM896 1152h128v-128h-128v128zM256 1024h512v-128h-512v128zM1024 896v128h128v-128h-128zM1280 1024h512v-128h-512v128zM896 896h128v-128h-128v128zM256 768h512v-128h-512v128z M1024 640v128h128v-128h-128zM1280 768h512v-128h-512v128zM896 640h128v-128h-128v128zM1152 512v-128h-128v128h128z" /> +<glyph unicode="" d="M1882 1237q166 -181 166 -429q0 -139 -26 -251.5t-72.5 -195.5t-118 -146t-155 -103t-190.5 -65t-218 -35t-245 -10q-133 0 -244 10t-217.5 35t-189.5 65t-154 103t-117 146t-72 195.5t-26 251.5q0 248 166 429q-9 24 -16.5 54.5t-14 87t5 130.5t42.5 151q6 2 16.5 3.5 t50.5 -2.5t86 -17.5t123.5 -52t162.5 -96.5q146 40 400 40q255 0 401 -40q85 58 161.5 96.5t125 52t85 18t52.5 1.5l15 -3q31 -77 42.5 -151t5 -130.5t-14 -87t-16.5 -54.5zM1019 128q107 0 176.5 2t158 11.5t145 26.5t116 48.5t93 76.5t55 111.5t21.5 152.5q0 146 -131 264 q-39 36 -91 54.5t-117.5 21t-125.5 -1t-148 -9.5t-152 -6t-152 6t-148 9.5t-125.5 1t-117.5 -21t-91 -54.5q-131 -120 -131 -264q0 -86 21.5 -152.5t55 -111.5t93 -76.5t116 -48.5t145 -26.5t158 -11.5t176.5 -2zM699 768q64 0 108.5 -66.5t44.5 -161.5t-44.5 -161.5 t-108.5 -66.5t-109 67t-45 161t45 161t109 67zM1341 768q64 0 109 -67t45 -161t-45 -161t-109 -67q-63 0 -108 67t-45 161t45 161t108 67z" /> +<glyph unicode="" d="M1022 1792q208 0 397 -81t325.5 -217.5t217.5 -326t81 -397.5t-81 -397.5t-217.5 -327.5t-325.5 -219.5t-397 -81.5t-397.5 81.5t-326 219.5t-217.5 327.5t-81 397.5t81 397.5t217.5 326t326 217.5t397.5 81zM1277 100v-164q268 96 437 323t169 511q0 175 -68.5 335 t-183.5 275t-274.5 183.5t-334.5 68.5t-335 -68.5t-275 -183.5t-183.5 -275t-68.5 -335q0 -288 172 -515.5t444 -318.5v164q0 122 82 178q-52 5 -95.5 14t-92 26t-87 40.5t-74 61t-59.5 85t-38 114t-14 146.5q0 155 101 264q-46 119 10 261q3 1 10 2t31.5 -1t53 -10.5 t76 -32t100.5 -59.5q117 33 246 33q128 0 247 -33q84 57 151.5 82t93.5 22l25 -3q56 -141 10 -261q101 -109 101 -264q0 -80 -14 -146.5t-38 -114t-59.5 -85t-74 -61t-87 -40.5t-92 -26t-95.5 -14q83 -57 83 -178z" /> +<glyph unicode="" d="M761 93v-285q-215 31 -390 169.5t-273 347t-98 443.5q0 208 81 397.5t217.5 326.5t326 218t397.5 81q207 0 396 -81t326 -218t218 -326.5t81 -397.5q0 -235 -98 -443.5t-273 -347t-390 -169.5v285q0 127 -86 186q78 8 139.5 23t127.5 51t110 88.5t72.5 140.5t28.5 204 q0 159 -105 274q47 126 -10 272q-4 1 -10.5 2t-32 -1.5t-55.5 -11t-79.5 -33t-104.5 -61.5q-125 34 -255 34q-131 0 -256 -34q-55 37 -104 61.5t-80 33t-54 11.5t-33 1l-10 -2q-58 -146 -11 -272q-105 -115 -105 -274q0 -116 28.5 -204t72.5 -140.5t110 -88.5t127.5 -51 t139.5 -23q-85 -59 -86 -186z" /> +<glyph unicode="" d="M768 521v-130q-160 23 -267 142q-60 -21 -117 -21q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5q8 0 51 -5q75 174 234.5 281.5t354.5 107.5t354.5 -107.5t234.5 -281.5q43 5 51 5q159 0 271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5 q-1 0 -3 0.5t-3 0.5q-131 -129 -314 -129q-22 0 -64 6v130q34 -8 64 -8q79 0 148 36.5t113 99.5q30 -8 59 -8q106 0 181 75t75 181t-75 181t-181 75q-73 0 -139 -41q-31 182 -172 303.5t-329 121.5t-329.5 -121t-173.5 -303q-64 40 -137 40q-106 0 -181 -75t-75 -181 t75 -181t181 -75q87 0 159 57q32 -68 91 -114t134 -62zM1152 256h256l-384 -384l-384 384h256v640h256v-640z" /> +<glyph unicode="" d="M768 393v-130q-160 23 -267 142q-60 -21 -117 -21q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5q8 0 51 -5q75 174 234.5 281.5t354.5 107.5t354.5 -107.5t234.5 -281.5q43 5 51 5q159 0 271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5 q-1 0 -3 0.5t-3 0.5q-131 -129 -314 -129q-22 0 -64 6v130q34 -8 64 -8q79 0 148 36.5t113 99.5q30 -8 59 -8q106 0 181 75t75 181t-75 181t-181 75q-73 0 -139 -41q-31 182 -172 303.5t-329 121.5t-329.5 -121t-173.5 -303q-64 40 -137 40q-106 0 -181 -75t-75 -181 t75 -181t181 -75q87 0 159 57q32 -68 91 -114t134 -62zM1408 640h-256v-640h-256v640h-256l384 384z" /> +<glyph unicode="" d="M2048 1536v-1536h-2048v1536h2048zM1920 1408h-1792v-1280h1792v1280zM512 1024h-256v256h256v-256zM768 1024h-128v256h128v-256zM1024 1024h-128v256h128v-256zM1280 1024h-128v256h128v-256zM1536 1024h-128v256h128v-256zM1536 896h128v384h128v-640h-256v256z M384 640h-128v256h128v-256zM512 896h128v-256h-128v256zM768 896h128v-256h-128v256zM1024 896h128v-256h-128v256zM1280 896h128v-256h-128v256zM384 256h-128v256h128v-256zM512 512h128v-256h-128v256zM768 512h640v-256h-640v256zM1536 512h256v-256h-256v256z" /> +<glyph unicode="" d="M1792 1664v-1664h-1536v1664h1536zM1664 1536h-1280v-1408h1280v1408zM1536 1280h-1024q0 5 1 13.5t7.5 31t18.5 39t38.5 30.5t62.5 14h768q26 0 47 -7t34 -18.5t23 -25t14 -27t6.5 -25t3.5 -18.5v-7zM832 384l-320 320l320 320l128 -128l-192 -192l192 -192zM1216 1024 l320 -320l-320 -320l-128 128l192 192l-192 192z" /> +<glyph unicode="" d="M1792 1664v-1664h-1536v1664h1536zM1664 1536h-1280v-1408h1280v1408zM1536 1280h-1024q0 5 1 13.5t7.5 31t18.5 39t38.5 30.5t62.5 14h768q26 0 47 -7t34 -18.5t23 -25t14 -27t6.5 -25t3.5 -18.5v-7zM768 384v384q0 96 80 176t176 80t176 -80t80 -176v-384h-512z M896 768h256q0 48 -40 88t-88 40t-88 -40t-40 -88z" /> +<glyph unicode="" d="M1792 1280v-1408h-1536v1792h1152zM1664 1152l-384 384h-896v-1536h1280v1152zM960 896l-192 -192l192 -192l-128 -128l-320 320l320 320zM1216 1024l320 -320l-320 -320l-128 128l192 192l-192 192z" /> +<glyph unicode="" d="M1792 1280v-1408h-1536v1792h1152zM1664 1152l-384 384h-896v-1536h1280v1152zM1152 1152h-640v128h640v-128zM512 896h1024v-128h-1024v128zM512 640h1024v-128h-1024v128zM512 384h1024v-128h-1024v128z" /> +<glyph unicode="" d="M1792 -128v1408l-384 384h-1152v-1792h1536zM1664 0h-1280v1536h896l384 -384v-1152zM512 256h256q0 96 80 176t176 80q-96 0 -176 80t-80 176t80 176t176 80t176 -80t80 -176t-80 -176t-176 -80q96 0 176 -80t80 -176h256v768l-256 256h-768v-1024z" /> +<glyph unicode="" d="M1792 1280v-1408h-1536v1792h1152zM1664 1152l-384 384h-384v-128h-128v128h-384v-1536h1280v1152zM640 1408h128v-128h-128v128zM768 1152v128h128v-128h-128zM640 1152h128v-128h-128v128zM768 896v128h128v-128h-128zM640 896h128v-128h-128v128zM768 640v128h128 v-128h-128zM640 640h128v-128h128l128 -128v-256h-512v256l128 128v128zM640 384v-128h256v128h-256z" /> +<glyph unicode="" d="M1792 1280v-1408h-1536v1792h1152zM384 1536v-1201q93 81 215 120q29 51 128.5 262.5t130.5 314.5q-34 117 -43 230.5t11 187.5q19 71 70 86h-512zM1664 1152l-384 384h-324q49 0 81 -36.5t23 -109.5q8 -140 -26 -347q18 -51 37 -95t38.5 -77.5t37 -60t38.5 -47.5 l34.5 -34.5t34 -26t28.5 -17.5t26.5 -13.5t20.5 -9.5q84 9 157 9q100 0 178 -50v531zM950 921q-35 -135 -186 -437l-8 -17q79 35 164.5 59t135.5 33t165 27q-8 4 -29.5 12.5t-31 13t-30 17.5t-33 26t-32.5 38t-36 55t-37 74t-42 99zM1664 0v397q-35 -5 -48 -4 q-65 4 -161 30.5t-174 65.5q-187 -19 -375 -66q-2 -1 -27 -9.5t-60.5 -21.5t-69.5 -27q-68 -115 -126.5 -192t-102 -112.5t-73.5 -48t-59 -12.5q-1 0 -2 0.5t-2 0.5v-1h1280z" /> +<glyph unicode="" d="M1920 640l-768 -768l-1024 1024v512l256 256h512zM1152 64l564 576l-896 896h-372l-192 -192v-384zM768 1216q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM576 1152q26 0 45 19t19 45t-19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19z M1536 640l-384 -384l-512 512l384 384zM1152 452l196 188l-324 324l-192 -196z" /> +<glyph unicode="" d="M128 128v1280q0 5 1 13.5t7.5 31t18.5 39t38.5 30.5t62.5 14h640q5 0 13.5 -1t31 -7.5t39 -18.5t30.5 -38.5t14 -62.5q0 -5 1 -13.5t7.5 -31t18.5 -39t38.5 -30.5t62.5 -14h640q5 0 13.5 -1t31 -7.5t39 -18.5t30.5 -38.5t14 -62.5v-1024h-1792zM896 1408h-640v-128h640 v128z" /> +<glyph unicode="" d="M128 128v1280q0 5 1 13.5t7.5 31t18.5 39t38.5 30.5t62.5 14h640q5 0 13.5 -1t31 -7.5t39 -18.5t30.5 -38.5t14 -62.5q0 -5 1 -13.5t7.5 -31t18.5 -39t38.5 -30.5t62.5 -14h640q5 0 13.5 -1t31 -7.5t39 -18.5t30.5 -38.5t14 -62.5v-256h-384q0 5 -1 13.5t-7.5 31 t-18.5 39t-38.5 30.5t-62.5 14h-512q-5 0 -13.5 -1t-31 -7.5t-39 -18.5t-30.5 -38.5t-14 -62.5v-768h-640zM896 1408h-640v-128h640v128zM1408 768h384q5 0 13.5 -1t31 -7.5t39 -18.5t30.5 -38.5t14 -62.5v-512h-1024v640q0 5 1 13.5t7.5 31t18.5 39t38.5 30.5t62.5 14h256 q26 0 47 -7t34 -18.5t23 -25t14 -27t6.5 -25t3.5 -18.5v-7zM1280 768h-256v-128h256v128z" /> +<glyph unicode="" d="M1408 1408q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1024 1152q106 0 181 75t75 181t-75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75zM768 1024h512q106 0 181 -75t75 -181v-256 q0 -106 -75 -181t-181 -75v-512h-512v512q-106 0 -181 75t-75 181v256q0 106 75 181t181 75zM1408 512v256q0 53 -37.5 90.5t-90.5 37.5h-512q-53 0 -90.5 -37.5t-37.5 -90.5v-256q0 -53 37.5 -90.5t90.5 -37.5v256h128v-768h256v768h128v-256q53 0 90.5 37.5t37.5 90.5z " /> +<glyph unicode="" d="M735 1157q-33 -60 -92.5 -96.5t-130.5 -36.5q-106 0 -181 75t-75 181t75 181t181 75q76 0 139 -41q30 129 134 213t239 84t239 -84t134 -213q63 41 139 41q106 0 181 -75t75 -181t-75 -181t-181 -75q-71 0 -130.5 36.5t-92.5 96.5q-117 -133 -289 -133t-289 133z M1024 1664q-106 0 -181 -75t-75 -181t75 -181t181 -75t181 75t75 181t-75 181t-181 75zM512 1152q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5zM1536 1408q-53 0 -90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5zM384 1024h1280q106 0 181 -75t75 -181v-128q0 -69 -35 -127.5t-93 -92.5v-420h-512v-256h-512v256h-512v420q-58 34 -93 92.5t-35 127.5v128q0 106 75 181t181 75zM640 128v164q-58 34 -93 92.5t-35 127.5v256q0 66 36 128h-164 q-53 0 -90.5 -37.5t-37.5 -90.5v-128h128v-512h256zM1280 640v-256q53 0 90.5 37.5t37.5 90.5v256q0 53 -37.5 90.5t-90.5 37.5h-512q-53 0 -90.5 -37.5t-37.5 -90.5v-256q0 -53 37.5 -90.5t90.5 -37.5v256h128v-768h256v768h128zM1792 640v128q0 53 -37.5 90.5t-90.5 37.5 h-164q36 -59 36 -128v-256q0 -69 -35 -127.5t-93 -92.5v-164h256v512h128z" /> +<glyph unicode="" d="M1024 1408q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM640 1152q106 0 181 75t75 181t-75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75zM1920 1408v-256h-256v-256h-256v256h-256v256h256 v256h256v-256h256zM384 1024h512q106 0 181 -75t75 -181v-256q0 -106 -75 -181t-181 -75v-512h-512v512q-106 0 -181 75t-75 181v256q0 106 75 181t181 75zM1024 512v256q0 53 -37.5 90.5t-90.5 37.5h-512q-53 0 -90.5 -37.5t-37.5 -90.5v-256q0 -53 37.5 -90.5t90.5 -37.5 v256h128v-768h256v768h128v-256q53 0 90.5 37.5t37.5 90.5z" /> +<glyph unicode="" d="M896 1664h-512l256 128zM256 1408l-2 123l130 5v-128h-128zM1024 1408h-128v128h128v-128zM1920 1408v-256h-768v256h768zM384 1280l128 -128h-128l-128 128h128zM896 1280h128l-128 -128h-128zM896 1024l256 -128h-1024l256 128h512zM128 768h128v-128h-128v128z M1024 768h128v-128h-128v128zM128 512h128v-128h-128v128zM512 384h-128v128h128v-128zM768 512h128v-128h-128v128zM1024 512h128v-128h-128v128zM384 256h128v-128h-128v128zM768 256h128v-128h-128v128zM384 0h512v-128h-512v128z" /> +<glyph unicode="" d="M1792 1408q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1408 1152q106 0 181 75t75 181t-75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75zM384 1152l384 -384l-384 -384v256h-256v256h256 v256zM1152 1024h512q106 0 181 -75t75 -181v-256q0 -106 -75 -181t-181 -75v-512h-512v512q-106 0 -181 75t-75 181v256q0 106 75 181t181 75zM1792 512v256q0 53 -37.5 90.5t-90.5 37.5h-512q-53 0 -90.5 -37.5t-37.5 -90.5v-256q0 -53 37.5 -90.5t90.5 -37.5v256h128v-768 h256v768h128v-256q53 0 90.5 37.5t37.5 90.5z" /> +<glyph unicode="" d="M2048 1536v-256h-256v-256h-256v256h-256v256h256v256h256v-256h256zM1920 896v125q40 -62 72 -125.5t44 -95.5l12 -32q-5 -13 -15.5 -36t-51 -89.5t-90.5 -127t-136.5 -134.5t-186 -127t-242.5 -89.5t-302 -36.5q-125 0 -240 22t-204 59t-168 85t-136.5 101t-105 106 t-78.5 101t-52.5 85t-30.5 59l-9 22q3 10 9.5 27t31 69.5t54 103.5t79.5 120t106.5 128.5t136.5 120t168 103t202 69.5t237 27h32l65 -260q-41 4 -97 4q-102 0 -193.5 -17.5t-160 -47t-128 -68t-100.5 -81t-74.5 -85t-54 -81t-34 -68t-18.5 -46.5l-5 -18q2 -7 5.5 -18 t18 -46t33.5 -69t53 -80t74.5 -85.5t100.5 -80t128 -69t160 -46.5t195 -18t195 17.5t160.5 47t128 68t100.5 81t74 85t53 81t33.5 68t18.5 46.5l5 18q-9 35 -34 87zM832 768q80 0 136 56t56 136q0 58 -31 105t-82 70q56 17 113 17q159 0 271.5 -112.5t112.5 -271.5 t-112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5q0 57 17 113q23 -51 70 -82t105 -31z" /> +<glyph unicode="" d="M1326 1203l205 205l-205 205l133 133l205 -205l205 205l133 -133l-205 -205l205 -205l-133 -133l-205 205l-205 -205zM1737 896h255q17 -34 31 -66t19 -47l6 -15q-5 -13 -15.5 -36t-51 -89.5t-90.5 -127t-136.5 -134.5t-186 -127t-242.5 -89.5t-302 -36.5q-125 0 -240 22 t-204 59t-168 85t-136.5 101t-105 106t-78.5 101t-52.5 85t-30.5 59l-9 22q3 10 9.5 27t31 69.5t54 103.5t79.5 120t106.5 128.5t136.5 120t168 103t202 69.5t237 27q62 0 128 -8v-248l14 -10q-75 10 -142 10q-102 0 -193.5 -17.5t-160 -47t-128 -68t-100.5 -81t-74.5 -85 t-54 -81t-34 -68t-18.5 -46.5l-5 -18q2 -7 5.5 -18t18 -46t33.5 -69t53 -80t74.5 -85.5t100.5 -80t128 -69t160 -46.5t195 -18t195 17.5t160.5 47t128 68t100.5 81t74 85t53 81t33.5 68t18.5 46.5l5 18q-14 55 -55 128zM913 1134q57 18 111 18q159 0 271.5 -112.5 t112.5 -271.5t-112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5q0 48 18 111q24 -50 70.5 -80.5t103.5 -30.5q80 0 136 56t56 136q0 57 -30.5 103.5t-80.5 70.5z" /> +<glyph unicode="" d="M1920 896v-256h-402q-43 -167 -180.5 -275.5t-313.5 -108.5t-313.5 108.5t-180.5 275.5h-402v256h402q43 167 180.5 275.5t313.5 108.5t313.5 -108.5t180.5 -275.5h402zM1024 512q106 0 181 75t75 181t-75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75z" /> +<glyph unicode="" d="M1280 896v36q-58 34 -93 92t-35 128q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128t-93 -92v-36q0 -7 -0.5 -18t-5.5 -46t-13.5 -69t-27 -80t-43 -85.5t-64.5 -80t-88.5 -69t-118 -46.5t-151.5 -18q-129 0 -196 -83q68 -73 68 -173q0 -98 -76 -177t-180 -79 t-180 79t-76 177q0 69 35 127.5t93 92.5v840q-58 34 -93 92t-35 128q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128t-93 -92v-606q111 58 256 58q52 0 94.5 14t68.5 36.5t45 50t28 55t14 50t6 36.5v14zM640 1536q-53 0 -90.5 -37.5t-37.5 -90.5t37.5 -90.5 t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5zM1408 1024q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5zM640 0q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5 t90.5 -37.5z" /> +<glyph unicode="" d="M768 1188v-619q123 71 256 71q106 0 181 75t75 181h256q0 -212 -150 -362t-362 -150q-114 0 -192 -88q64 -74 64 -168q0 -98 -76 -177t-180 -79t-180 79t-76 177q0 69 35 127.5t93 92.5v840q-58 34 -93 92t-35 128q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128 t-93 -92zM1152 1024v384q0 106 75 181t181 75t181 -75t75 -181v-384h-512zM640 1536q-53 0 -90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5zM1280 1408h256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM640 0 q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5z" /> +<glyph unicode="" d="M1152 1536h128q8 0 22 -1t53.5 -8.5t76 -20.5t81 -41.5t76 -67.5t53.5 -102.5t22 -142.5v-804q58 -34 93 -92.5t35 -127.5q0 -98 -76 -177t-180 -79t-180 79t-76 177q0 69 35 127.5t93 92.5v804q-1 5 -2.5 13.5t-10 31t-21.5 39t-37.5 30.5t-56.5 14h-128v-256l-384 384 l384 384v-256zM384 348v840q-58 34 -93 92t-35 128q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128t-93 -92v-840q58 -34 93 -92.5t35 -127.5q0 -98 -76 -177t-180 -79t-180 79t-76 177q0 69 35 127.5t93 92.5zM512 1280q53 0 90.5 37.5t37.5 90.5t-37.5 90.5 t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5zM512 0q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5zM1536 0q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5 t90.5 -37.5z" /> +<glyph unicode="" d="M384 348v840q-58 34 -93 92t-35 128q0 106 75 181t181 75t181 -75t75 -181q0 -116 -90 -193q69 -188 240.5 -317.5t361.5 -129.5l35 -2q34 59 92.5 94.5t128.5 35.5q106 0 181 -75t75 -181t-75 -181t-181 -75q-70 0 -128.5 35t-92.5 93h-35q-177 0 -326.5 76t-313.5 221 v-461q58 -34 93 -92t35 -128q0 -98 -76 -177t-180 -79t-180 79t-76 177q0 70 35 128t93 92zM512 1280q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5zM1536 512q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5zM512 0q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5z" /> +<glyph unicode="" d="M2048 1152v-1408l-1024 512l-1024 -512v1408l1024 640zM1920 1024l-768 512v-512h-256v512l-768 -512v-1024l768 384v128h256v-128l768 -384v1024zM640 896h768v256l384 -384l-384 -384v256h-768v-256l-384 384l384 384v-256z" /> +<glyph unicode="" d="M2048 1280v-1536l-1024 512l-1024 -512v1536l1024 512zM1920 1152l-768 384v-256h-256v256l-768 -384v-1152l768 384h256l768 -384v1152zM256 832l384 320v-640zM768 512v384q0 5 0.5 14.5t5.5 36t14 50.5t28 53.5t45 51t68.5 36t94.5 14.5t94.5 -14t68.5 -36.5t45 -50 t28 -55t14 -50t6 -36.5v-14v-384h-512zM1792 832l-384 -320v640zM896 896h256q0 5 -1 13.5t-7.5 31t-18.5 39t-38.5 30.5t-62.5 14q-26 0 -47 -7t-34 -18.5t-23 -25t-14 -27t-6.5 -25t-3.5 -18.5v-7z" /> +<glyph unicode="" d="M1024 1664q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM1024 128q174 0 321 85.5t233 233t86 321.5q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51 t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5q0 -174 86 -321.5t233 -233t321 -85.5zM896 1280h256v-640h-256v640zM896 512h256v-256h-256v256z" /> +<glyph unicode="" d="M384 1536l64 -64q288 192 576 192q189 0 355.5 -68.5t285 -187t187 -285t68.5 -355.5q0 -69 -9.5 -130t-31.5 -121.5t-38.5 -96.5t-48.5 -100v192h-192q64 64 64 256q0 288 -176 464t-464 176q-60 0 -132.5 -21.5t-119.5 -42.5t-132 -64l128 -128h-384v384zM1152 640 h-256v640h256v-640zM256 1024h192q-64 -64 -64 -256q0 -288 176 -464t464 -176q60 0 132.5 21.5t119.5 42.5t132 64l-128 128h384v-384l-64 64q-288 -192 -576 -192q-189 0 -355.5 68.5t-285 187t-187 285t-68.5 355.5q0 69 9.5 130t31.5 121.5t38.5 96.5t48.5 100v-192z M896 512h256v-256h-256v256z" /> +<glyph unicode="" d="M1658 1401l-181 -181q-89 89 -206 138.5t-247 49.5t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5q0 -174 86 -321.5t233 -233t321 -85.5q91 0 175.5 24.5t140 58t98.5 70.5t62 59.5t21 28.5l399 399q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191 t-191 286t-71 348t71 348t191 286t286 191t348 71t345.5 -69t288.5 -194zM1538 1026l318 318l192 -192l-512 -512l-320 328l192 192zM1152 640h-256v640h256v-640zM896 512h256v-256h-256v256zM1520 368l1 1z" /> +<glyph unicode="" d="M1523 640l208 -195q-99 -255 -326 -414t-509 -159q-182 0 -348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71q180 0 341.5 -67.5t285.5 -188.5h-627q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5q0 -174 86 -321.5t233 -233t321 -85.5 q231 0 406.5 145.5t220.5 366.5zM1024 640h-256v640h256v-640zM1660 768h-256q-5 0 -13.5 1.5t-30 9.5t-37.5 20t-29.5 37.5t-13.5 59.5v256q0 5 1 13.5t7.5 31t18.5 39t38.5 30.5t62.5 14h512q5 0 13.5 -1t31 -7.5t39 -18.5t30.5 -38.5t14 -62.5v-256q0 -35 -13 -61 t-32 -38t-38 -19.5t-32 -8.5l-13 -1v-256zM768 512h256v-256h-256v256z" /> +<glyph unicode="" d="M755 1105l-627 -77l461 -422l-119 -606l554 298l554 -298l-119 606l461 422l-627 77l-269 559z" /> +<glyph unicode="" d="M512 256h-128q-96 0 -176 80t-80 176v768q0 95 81 175.5t175 80.5h1280q95 0 175.5 -81t80.5 -175v-768q0 -91 -82 -173.5t-174 -82.5h-640l-512 -512v512z" /> +<glyph unicode="" d="M1024 1792q209 0 398.5 -81t326.5 -218t218 -326.5t81 -398.5q0 -208 -81 -397.5t-218 -327t-327 -218.5t-398 -81t-397.5 81t-327 218.5t-218.5 327t-81 397.5t81 398t218.5 327t327 218t397.5 81zM1024 0q209 0 385.5 103t279.5 279.5t103 385.5t-103 385.5 t-279.5 279.5t-385.5 103t-385.5 -103t-279.5 -279.5t-103 -385.5t103 -385.5t279.5 -279.5t385.5 -103zM896 896h-256q0 8 1 22t8.5 54.5t20.5 77t40.5 81.5t64.5 77.5t97 54.5t133 22q102 0 179 -23.5t118 -56t65.5 -76.5t31 -75.5t6.5 -62.5q0 -63 -18.5 -108.5 t-47 -68.5t-61 -43t-61 -33.5t-47 -38.5t-18.5 -59h-260q-3 42 9.5 74t35 51.5t51 34t57.5 25t53 19.5t39 22t15 30q0 67 -27 97.5t-101 30.5q-41 0 -69.5 -13t-39.5 -32t-16 -38t-4 -32zM896 512h256v-256h-256v256z" /> +<glyph unicode="" d="M2048 0h-2048l1024 1792zM256 128h1536l-768 1408zM1152 1024v-512h-256v512h256zM896 384h256v-128h-256v128z" /> +<glyph unicode="" d="M1422 626l498 -498q26 -26 26 -64t-26 -64l-128 -128q-26 -48 -64 -48t-64 48l-498 498q-186 -114 -398 -114q-209 0 -385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5q0 -210 -114 -398zM768 512q212 0 362 150 t150 362t-150 362t-362 150t-362 -150t-150 -362t150 -362t362 -150z" /> +<glyph unicode="" d="M1024 1664q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM1734 691v161l-196 64l-46 112l89 187l-114 115l-184 -94l-112 47l-70 195h-161l-64 -196l-112 -46 l-187 89l-115 -114l94 -184l-46 -111l-196 -71v-161l196 -64l46 -112l-89 -187l114 -115l184 94l112 -47l70 -195h161l64 196l112 46l187 -89l115 114l-94 184l47 111zM1024 1025q106 0 181 -75t75 -182t-75 -182t-181 -75t-181.5 75.5t-75.5 181.5t75.5 181.5t181.5 75.5z " /> +<glyph unicode="" d="M296 1726q25 -25 25 -60.5t-25 -60.5q-130 -133 -130 -324t130 -325q25 -25 25 -60t-25 -60q-24 -26 -58 -26t-59 26q-88 90 -133.5 206t-45.5 239q0 122 45.5 238t133.5 207q27 25 59 25q33 0 58 -25zM1865 1724q88 -90 134 -206t46 -239t-46 -238.5t-134 -206.5 q-25 -25 -58 -25q-32 0 -59 25q-24 25 -24 60t24 61q131 132 131 324q0 191 -131 325q-24 25 -24 60t24 60q25 26 59 26t58 -26zM612 1010q-24 -25 -57.5 -25t-57.5 25q-109 114 -109 271q0 158 109 270q24 25 58 25q33 0 57 -25q24 -24 24 -58.5t-24 -59.5 q-61 -62 -61 -152q0 -89 61 -153q24 -24 24 -58.5t-24 -59.5zM1433 1550q23 25 57 25t58 -25q109 -114 109 -271q0 -158 -109 -270q-24 -25 -58 -25q-33 0 -57 25q-24 24 -24 58.5t24 59.5q61 62 61 152q0 89 -61 153q-24 24 -24 58.5t24 59.5zM1024 1072q-86 0 -146.5 61 t-60.5 147t60.5 147t146.5 61t147 -61t61 -147t-61 -147t-147 -61zM468 -128l403 1073q72 -39 154 -39q79 0 152 38l402 -1072h-191l-108 128h-511l-110 -128h-191zM896 384h256l-128 460zM1280 128l-128 128h-256l-127 -128h511z" /> +<glyph unicode="" d="M459 59l-66 -123l-281 -192l-46 64l178 274l127 68l552 571l-112 116l923 955l313 -324l-923 -954l-113 116zM808 766l-72 -74q-129 136 -163 170q-112 -40 -234 -11t-211 121q-143 148 -112 437l247 -256l242 67l65 251l-247 255q108 32 223 1.5t200 -117.5 q85 -88 114 -208t-3 -233q-23 21 3 -6l52 -51l-216 -230zM1398 614l485 -503q60 -63 60 -159t-60 -144q-15 -23 -32 -37t-38.5 -19.5t-35.5 -6.5t-40 -1q-27 0 -41 1t-35.5 6.5t-38.5 19.5t-31 37l-492 511z" /> +<glyph unicode="" d="M1280 768h128v-640h-640v-384l-768 384v1664h1408v-512h-128v384h-1024l512 -256v-1152h512v512zM1536 640v256h-512v256h512v256l512 -384z" /> +<glyph unicode="" d="M1571 1617q119 59 237.5 102t177.5 57l60 14q-5 -23 -15.5 -65t-54.5 -166.5t-103 -243.5q-139 15 -212 90q-75 73 -90 212zM419 884l356 66q100 139 221 260q188 188 436 332q32 -151 124 -242q91 -92 242 -124q-142 -245 -332 -436q-124 -124 -260 -219l-66 -358 l-419 -419l-11 373l268 269q-86 -42 -167 -68.5t-119 -32.5l-39 -6l-118 118q1 14 5 40.5t29.5 110t66.5 169.5l-263 -263l-373 11z" /> +<glyph unicode="" d="M512 1536q174 0 340 -46t306.5 -128.5t258.5 -200.5t200.5 -258.5t128.5 -306.5t46 -340q0 -5 -1 -13.5t-7.5 -31t-18.5 -39t-38.5 -30.5t-62.5 -14q-26 0 -47 7t-34 18.5t-23 25t-14 27t-6.5 25t-3.5 18.5v7q0 208 -81 397.5t-218.5 327t-327 218.5t-397.5 81 q-5 0 -13.5 1t-31 7.5t-39 18.5t-30.5 38.5t-14 62.5q0 26 7 47t18.5 34t25 23t27 14t25 6.5t18.5 3.5h7zM512 1024q209 0 385.5 -103t279.5 -279.5t103 -385.5q0 -5 -1 -13.5t-7.5 -31t-18.5 -39t-38.5 -30.5t-62.5 -14q-26 0 -47 7t-34 18.5t-23 25t-14 27t-6.5 25 t-3.5 18.5v7q0 212 -150 362t-362 150q-5 0 -13.5 1t-31 8.5t-39 19.5t-30.5 38t-14 61t13 61t32 38t38 19.5t32 8.5zM512 512q106 0 181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181t75 181t181 75z" /> +<glyph unicode="" d="M1536 256h128v-256q0 -48 -40 -88t-88 -40h-1280q-48 0 -88 40t-40 88v1408q0 48 40 88t88 40h384q0 5 0.5 14.5t5.5 36t14 50.5t28 53.5t45 51t68.5 36t94.5 14.5t94.5 -14t68.5 -36.5t45 -50t28 -55t14 -50t6 -36.5v-14h384q48 0 88 -40t40 -88v-640h-128v384h-1280 v-1152h1280v256zM1408 1280l-384 256q0 48 -40 88t-88 40t-88 -40t-40 -88l-384 -256h1024zM1024 896h-640v128h640v-128zM1920 640v-256h-640v-256l-512 384l512 384v-256h640zM640 640h-256v128h256v-128zM384 512h256v-128h-256v128zM384 256h384v-128h-384v128z" /> +<glyph unicode="" d="M1273 1501q-48 -63 -123.5 -102.5t-151.5 -37.5q-13 73 13.5 148.5t75.5 135.5q50 60 126 101.5t147 45.5q22 -150 -87 -291zM1738 1191q-73 -40 -121.5 -102.5t-67 -131t-12 -142.5t37 -138.5t86.5 -118t130 -81.5q-57 -127 -116 -217q-35 -53 -64 -90.5t-70.5 -80.5 t-86.5 -66t-92 -23q-39 0 -75 11.5t-62 26t-71 26.5t-98 12t-98 -12.5t-71.5 -26.5t-63 -25.5t-75.5 -11.5q-47 0 -92 21t-84.5 60t-69 76.5t-62.5 88.5q-102 156 -148 329.5t-32.5 321.5t78.5 249q68 106 169.5 166.5t204.5 60.5q73 0 180.5 -38.5t162.5 -38.5q45 0 97 19 t114 38.5t130 19.5q91 0 182 -48t160 -134z" /> +<glyph unicode="" d="M968 943l-37 -19q-75 47 -136.5 71t-147.5 30q-200 14 -376 -73l-39 21l178 593q7 5 20 13t57 27.5t91 33t119.5 21.5t145.5 1q91 -8 156 -37t147 -85zM2047 1395l-181 -607q-68 -37 -204.5 -70t-266.5 -18q-62 7 -124 31.5t-98.5 45.5t-95.5 60l178 596l41 21 q101 -67 149 -87q62 -25 134 -34q104 -12 210.5 8.5t161.5 46.5l55 27zM1 149l181 605q7 5 20 13t57 27t91.5 32.5t120 21.5t145.5 2q90 -8 155 -36.5t148 -85.5l-183 -609l-37 -19q-75 47 -137 71t-147 30q-198 13 -375 -73zM1028 621l41 21q59 -40 87 -57t82 -37t114 -27 q71 -7 134.5 -2t117 19t92.5 28.5t61 25.5l22 11l41 -21l-185 -646q-14 0 -185 -32t-287 -32q-90 0 -164.5 37t-153.5 104z" /> +<glyph unicode="" d="M512 1792h1024q53 0 90.5 -37.5t37.5 -90.5v-1792q0 -49 -38 -88.5t-90 -39.5h-1024q-52 0 -90 39.5t-38 88.5v1792q0 53 37.5 90.5t90.5 37.5zM1088 1664h-128q-26 0 -45 -19t-19 -45t19 -45t45 -19h128q26 0 45 19t19 45t-19 45t-45 19zM1536 1408h-1024v-1280h1024 v1280zM960 -128h128q17 0 25.5 1t19 6.5t15 19.5t4.5 37t-4.5 37t-15 19.5t-19 6.5t-25.5 1h-128q-17 0 -25.5 -1t-19 -6.5t-15 -19.5t-4.5 -37t4.5 -37t15 -19.5t19 -6.5t25.5 -1z" /> +<glyph unicode="" d="M1527 1559l-93 -179q102 -104 102 -228h-1024q0 124 102 228l-93 178q-14 25 -7 53t30 42q23 15 48.5 7.5t38.5 -32.5l89 -168q137 76 304 76q165 0 304 -76l89 170q13 25 38.5 32.5t48.5 -6.5q23 -15 30 -43.5t-7 -53.5zM832 1280q26 0 45 19t19 45t-19 45t-45 19 t-45 -19t-19 -45t19 -45t45 -19zM1216 1280q26 0 45 19t19 45t-19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19zM256 589v486q0 32 19 54.5t45 22.5t45 -22.5t19 -54.5v-486q0 -32 -19 -54.5t-45 -22.5t-45 22.5t-19 54.5zM1664 589v486q0 32 19 54.5t45 22.5t45 -22.5 t19 -54.5v-486q0 -32 -19 -54.5t-45 -22.5t-45 22.5t-19 54.5zM512 1024h1024v-768q0 -53 -37.5 -90.5t-90.5 -37.5h-128v-192q-3 -7 -9 -17.5t-22.5 -28.5t-32.5 -18t-32 16t-24 32l-8 16v192h-256v-192q-3 -7 -9 -17.5t-22.5 -28.5t-32.5 -18t-32 16t-24 32l-8 16v192 h-128q-53 0 -90.5 37.5t-37.5 90.5v768z" /> +<glyph unicode="" d="M1792 1152l-1024 -1024l-512 512l256 256l256 -256l768 768z" /> +<glyph unicode="" d="M1920 1408v-1280h-1792v1280h1792zM384 1280l640 -528l640 528h-1280zM256 384l504 385l-504 383v-768zM1792 1152l-505 -384l505 -384v768zM1664 256l-508 412l-132 -100l-132 100l-508 -412h1280z" /> +<glyph unicode="" d="M1920 1152v-1280h-1792v1280l256 183v201h282l358 256l358 -256h282v-201zM512 918l512 -422l512 422v490h-1024v-490zM896 1152h-256v128h256v-128zM1280 896h-640v128h640v-128zM256 128l504 385l-504 383v-768zM1792 896l-505 -384l505 -384v768zM1664 0l-508 412 l-132 -100l-132 100l-508 -412h1280z" /> +<glyph unicode="" d="M1664 640h-384v-512h-512v512h-384l640 768z" /> +<glyph unicode="" d="M896 128v384h-512v512h512v384l768 -640z" /> +<glyph unicode="" d="M1664 896l-640 -768l-640 768h384v512h512v-512h384z" /> +<glyph unicode="" d="M1664 1024v-512h-512v-384l-768 640l768 640v-384h512z" /> +<glyph unicode="" d="M1271 1156v153q21 36 56 75q48 43 48 90q0 83 -92.5 136.5t-258.5 53.5q-167 0 -266 -54t-99 -136q0 -47 47 -89q36 -39 65 -88v-129q-29 -56 -70.5 -108t-68.5 -76l-28 -24h1q-101 -69 -101 -153q0 -117 145.5 -206t374.5 -89t374 89t145 206q0 101 -139 176 q-82 80 -133 173zM1022 -256l129 640q-60 -6 -123 -6q-73 0 -133 7z" /> +<glyph unicode="" d="M1025 1024h-129q-133 31 -174 35q-126 14 -225 113t-113 224q-14 126 65 205t205 65q97 -10 180 -74.5t126 -156.5q43 92 126 156.5t180 74.5q126 14 205 -65t65 -205q-14 -125 -113 -224t-225 -113q-18 -2 -61.5 -10.5t-77.5 -16t-34 -8.5zM718 1183q67 -8 110.5 34.5 t35.5 110.5t-61.5 121.5t-121.5 61.5t-110 -35t-35 -111q8 -68 61 -121.5t121 -60.5zM1056 1328q-8 -68 35.5 -110.5t110.5 -34.5q68 7 121 60.5t61 121.5t-34.5 111t-110.5 35t-121.5 -61.5t-61.5 -121.5zM128 1024h768v-384h-768v384zM1792 1024v-384h-768v384h768z M256 512h640v-640h-640v640zM1024 512h640v-640h-640v640z" /> +<glyph unicode="" d="M2048 -128v-128h-2048v2048h256v-128h-128v-256h128v-128h-128v-256h128v-128h-128v-256h128v-128h-128v-256h128v-128h-128v-256h1920zM1408 0h-384v1280h384v-1280zM1920 0h-384v896h384v-896zM896 0h-384v640h384v-640z" /> +<glyph unicode="" d="M1920 1344v-64q0 -94 -55.5 -183.5t-145 -145t-183.5 -55.5h-128l-512 -512v-128q0 -94 -55.5 -183.5t-145 -145t-183.5 -55.5h-64l192 192l-64 256l-256 64l-192 -192v64q0 94 55.5 183.5t145 145t183.5 55.5h128l512 512v128q0 94 55.5 183.5t145 145t183.5 55.5h64 l-192 -192l64 -256l256 -64z" /> +<glyph unicode="" d="M128 1408h1792q48 0 88 -40t40 -88v-1024q0 -48 -40 -88t-88 -40h-1792q-48 0 -88 40t-40 88v1024q0 48 40 88t88 40zM1792 1280h-1536q-48 0 -88 -40t-40 -88h1792q0 48 -40 88t-88 40zM256 256h1536q48 0 88 40t40 88v512h-1792v-512q0 -48 40 -88t88 -40zM768 640 h-512v128h512v-128zM1280 640h-384v128h384v-128zM512 384h-256v128h256v-128zM640 512h256v-128h-256v128z" /> +<glyph unicode="" d="M1024 1664q189 0 355.5 -68.5t285 -187t187 -285t68.5 -355.5t-68.5 -355.5t-187 -285t-285 -187t-355.5 -68.5t-355.5 68.5t-285 187t-187 285t-68.5 355.5t68.5 355.5t187 285t285 187t355.5 68.5zM1024 128q288 0 464 176t176 464q0 120 -47 235t-128.5 205 t-203.5 145t-261 55t-261 -55t-203.5 -145t-128.5 -205t-47 -235q0 -288 176 -464t464 -176zM896 1280l128 128l128 -128v-384h256l128 -128l-128 -128h-512v640z" /> +<glyph unicode="" d="M2048 1024l-1024 -1024l-1024 1024l512 512h1024zM1024 256l768 768l-384 384h-768l-384 -384zM1664 1024l-640 -640v896h384z" /> +<glyph unicode="" d="M714 194l24 -143q-270 91 -440 322.5t-170 522.5q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348q0 -291 -170 -522.5t-440 -322.5l24 143q205 91 331.5 280.5t126.5 421.5q0 209 -103 385.5t-279.5 279.5t-385.5 103t-385.5 -103 t-279.5 -279.5t-103 -385.5q0 -232 126.5 -421.5t331.5 -280.5zM1360 354l31 185q145 150 145 357q0 212 -150 362t-362 150t-362 -150t-150 -362q0 -207 145 -357l31 -185q-139 86 -221.5 229.5t-82.5 312.5q0 130 51 248.5t136.5 204t204 136.5t248.5 51t248.5 -51 t204 -136.5t136.5 -204t51 -248.5q0 -169 -82.5 -312.5t-221.5 -229.5zM1280 1024q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM896 768h256q39 0 67 -13t39.5 -32t17 -38t4.5 -32v-13v-256q0 -3 0.5 -7.5t-1 -17.5t-5 -25.5t-13 -27 t-22.5 -25t-35.5 -18t-51.5 -7.5v-512h-256v512q-39 0 -67 13t-39.5 32t-17 38t-4.5 32v13v256q0 3 -0.5 7.5t1 17.5t5 25.5t13 27t22.5 25t35.5 18t51.5 7.5z" /> +<glyph unicode="" d="M2048 1024v-256l-128 -128l-256 256l-256 -256l-256 256l-256 -256h-128v-128h-128q0 -5 -1 -13.5t-7.5 -31t-18.5 -39t-38.5 -30.5t-62.5 -14h-256q-9 -1 -23 -0.5t-48 16.5t-57 48t-55 80t-53 80l-20 32v384q88 152 128 212q18 27 50 38t55 8l23 -2h256q37 0 64 -13 t38.5 -32t18 -38t7.5 -32v-13h128v-128h1280zM512 1152h-256l256 -128v128zM512 832l-192 192l-192 -192l192 -192zM512 640l-256 -128h256v128z" /> +<glyph unicode="" d="M1792 1664v-1536q0 -5 -0.5 -13.5t-7.5 -31t-19.5 -39t-39.5 -30.5t-65 -14h-252v128h124q5 0 14 1t32 8.5t40 20t31.5 38.5t14.5 60v128h-256v128h256v1152h-1024v-1152h256v-128h-512v-128q0 -5 0.5 -13.5t6.5 -31t17.5 -39t37.5 -30.5t62 -14h132v128h256v-256 l-256 -256v256h-256q-42 0 -70.5 16.5t-39.5 41.5t-14.5 41t-3.5 29v1536q0 36 13 63t32 38.5t38 18.5t32 8h13h1280q5 0 13.5 -0.5t30 -7.5t38 -19t31 -38.5t15.5 -62.5zM1536 640h-256v-896h-256v896h-256l288 384h-288l384 512l384 -512h-288z" /> +<glyph unicode="" d="M512 512h1152v-384q0 -5 -1 -13.5t-7.5 -31t-18.5 -39t-38.5 -30.5t-62.5 -14h-640v-256l-192 192l-192 -192v256h-256q-26 0 -47 7t-34 18.5t-23 25t-14 27t-6.5 25t-3.5 18.5v7v1536q0 26 7 47t18.5 34t25 23t27 14t25 6.5t18.5 3.5h7h1280q5 0 13.5 -1t31 -7.5 t39 -18.5t30.5 -38.5t14 -62.5v-128h-128v128h-1024v-1152zM768 1408h-128v128h128v-128zM1280 1280v-128h192l-256 -320l-256 320h192v256h384v-128h-256zM768 1152h-128v128h128v-128zM1984 896h-192v-256h-384v128h256v128h-192l256 320zM768 896h-128v128h128v-128z M640 768h128v-128h-128v128zM896 128h512q5 0 13.5 1t31 7.5t39 18.5t30.5 38.5t14 62.5v128h-1280v-128q0 -5 1 -13.5t7.5 -31t18.5 -39t38.5 -30.5t62.5 -14h128v128h384v-128z" /> +<glyph unicode="" d="M384 512h1152v-384q0 -5 -1 -13.5t-7.5 -31t-18.5 -39t-38.5 -30.5t-62.5 -14h-640v-256l-192 192l-192 -192v256h-256q-26 0 -47 7t-34 18.5t-23 25t-14 27t-6.5 25t-3.5 18.5v7v1536q0 26 7 47t18.5 34t25 23t27 14t25 6.5t18.5 3.5h7h768v-128h-512v-1152zM2048 1664 v-768l-128 -128h-384v-128h-128v128h-128l-128 128v768l128 128h640zM1920 1664h-512v-512h512v512zM640 1408h-128v128h128v-128zM768 1536l256 -320l-256 -320v640zM640 1152h-128v128h128v-128zM640 896h-128v128h128v-128zM1408 1024h-128v-128h128v128zM1920 1024h-384 v-128h384v128zM512 768h128v-128h-128v128zM768 128h512q5 0 13.5 1t31 7.5t39 18.5t30.5 38.5t14 62.5v128h-1280v-128q0 -5 1 -13.5t7.5 -31t18.5 -39t38.5 -30.5t62.5 -14h128v128h384v-128z" /> +<glyph unicode="" d="M1920 0v1408l-384 384h-1152v-128h1088l320 -320v-1344h128zM1280 1536h-1152v-1792h1536v1408zM1216 1408l320 -320v-1216h-1280v1536h960zM1024 768h256v256h-256v256h-256v-256h-256v-256h256v-256h256v256zM512 0h768v256h-768v-256z" /> +<glyph unicode="" d="M1024 1536q123 0 237 -26.5t202.5 -70.5t167.5 -102t136.5 -121.5t106 -127t80 -121.5t53.5 -102t31 -71l10 -26q-5 -13 -15.5 -36t-51 -89.5t-90.5 -127t-136.5 -134.5t-186 -127t-242.5 -89.5t-302 -36.5q-125 0 -240 22t-204 59t-168 85t-136.5 101t-105 106 t-78.5 101t-52.5 85t-30.5 59l-9 22q3 10 9.5 27t31 69.5t54 103.5t79.5 120t106.5 128.5t136.5 120t168 103t202 69.5t237 27zM1024 256q103 0 195 17.5t160.5 47t128 68t100.5 81t74 85t53 81t33.5 68t18.5 46.5l5 18q-3 11 -9 29.5t-32.5 71.5t-60.5 101.5t-97 107.5 t-138.5 101.5t-188 71.5t-242.5 29q-102 0 -193.5 -17.5t-160 -47t-128 -68t-100.5 -81t-74.5 -85t-54 -81t-34 -68t-18.5 -46.5l-5 -18q2 -7 5.5 -18t18 -46t33.5 -69t53 -80t74.5 -85.5t100.5 -80t128 -69t160 -46.5t195 -18zM1024 1152q159 0 271.5 -112.5t112.5 -271.5 t-112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5q0 57 17 113q23 -51 70 -82t105 -31q80 0 136 56t56 136q0 58 -31 105t-82 70q56 17 113 17z" /> +<glyph unicode="" d="M1276 640h-384q-5 0 -13.5 1.5t-30 9.5t-37.5 20t-29.5 37.5t-13.5 59.5v640q0 5 1 13.5t7.5 31t18.5 39t38.5 30.5t62.5 14h896q5 0 13.5 -1t31 -7.5t39 -18.5t30.5 -38.5t14 -62.5v-640q0 -35 -13 -61t-32 -38t-38 -19.5t-32 -8.5l-13 -1h-128v-384zM640 1152v-384 q0 -5 0.5 -14.5t5.5 -36t14 -50.5t28 -53.5t45 -51t68.5 -36t94.5 -14.5h384v-128q0 -34 -13 -59.5t-31 -38t-36 -20t-31 -8.5l-13 -2h-384l-388 -384v384h-128q-5 0 -13.5 1t-31 8.5t-39 19.5t-30.5 38t-14 61v640q0 5 1 13.5t7.5 31t18.5 39t38.5 30.5t62.5 14h384z" /> +<glyph unicode="" d="M1024 -128q182 0 348 71t286 191t191 286t71 348t-71 348t-191 286t-286 191t-348 71t-348 -71t-286 -191t-191 -286t-71 -348t71 -348t191 -286t286 -191t348 -71zM1024 1408q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5q0 -174 -86 -321.5t-233 -233t-321 -85.5 t-321 85.5t-233 233t-86 321.5q0 130 51 248.5t136.5 204t204 136.5t248.5 51zM1402 555l-213 213l213 213l-165 165l-213 -213l-213 213l-165 -165l213 -213l-213 -213l165 -165l213 213l213 -213z" /> +<glyph unicode="" d="M640 1088l-384 320l384 316v-188h384q5 1 13.5 2t31 -2.5t39 -14.5t30.5 -40t14 -73v-768h-256v640h-256v-192zM1920 1024v-1280h-1792v1280h640v-128h-384l640 -528l640 528h-384v128h640zM256 0l504 385l-504 383v-768zM1792 768l-505 -384l505 -384v768zM1664 -128 l-508 412l-132 -100l-132 100l-508 -412h1280z" /> +<glyph unicode="" d="M1024 248q-212 0 -362 150t-150 362t150 362t362 150t362 -150t150 -362t-150 -362t-362 -150z" /> +<glyph unicode="" d="M1536 1280v-1024h-1024v1024h1024z" /> +<glyph unicode="" d="M1792 768l128 -128l-768 -768l-1024 1024v512l256 256h512l128 -128q-3 -10 -8 -28t-11 -67t-1 -89l-184 184h-372l-192 -192v-384l896 -896l564 576l-128 128h204zM1920 1408v-256h-256v-256h-256v256h-256v256h256v256h256v-256h256zM576 1408q80 0 136 -56t56 -136 t-56 -136t-136 -56t-136 56t-56 136t56 136t136 56zM576 1152q26 0 45 19t19 45t-19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19zM1152 256l-512 512l384 384l512 -512zM832 768l320 -316l196 188l-324 324z" /> +<glyph unicode="" d="M1797 1408l205 -205l-133 -133l-205 205l-205 -205l-133 133l205 205l-205 205l133 133l205 -205l205 205l133 -133zM1664 896l256 -256l-768 -768l-1024 1024v512l256 256h512l256 -256v-204l-332 332h-372l-192 -192v-384l896 -896l564 576l-256 256h204zM576 1408 q80 0 136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136t56 136t136 56zM576 1152q26 0 45 19t19 45t-19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19zM1152 256l-512 512l384 384l512 -512zM832 768l320 -316l196 188l-324 324z" /> +<glyph unicode="" d="M1792 1536v-256h-256v-256h-256v256h-256v256h256v256h256v-256h256zM768 1188v-606q111 58 256 58q52 0 94.5 14t68.5 36.5t45 50t28 55t14 50t6 36.5v14h256q0 -7 -0.5 -18t-5.5 -46t-13.5 -69t-27 -80t-43 -85.5t-64.5 -80t-88.5 -69t-118 -46.5t-151.5 -18 q-129 0 -196 -83q68 -73 68 -173q0 -106 -75 -181t-181 -75t-181 75t-75 181q0 70 35 128t93 93v839q-58 34 -93 92.5t-35 127.5q0 106 75 181t181 75t181 -75t75 -181q0 -69 -35 -127.5t-93 -92.5zM640 1536q-53 0 -90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5zM640 0q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5z" /> +<glyph unicode="" d="M1541 1408l205 -205l-133 -133l-205 205l-205 -205l-133 133l205 205l-205 205l133 133l205 -205l205 205l133 -133zM1408 1024l128 -128q0 -7 -0.5 -18t-5.5 -46t-13.5 -69t-27 -80t-43 -85.5t-64.5 -80t-88.5 -69t-118 -46.5t-151.5 -18q-129 0 -196 -83 q68 -73 68 -173q0 -106 -75 -181t-181 -75t-181 75t-75 181q0 70 35 128t93 93v839q-58 34 -93 92.5t-35 127.5q0 106 75 181t181 75t181 -75t75 -181q0 -69 -35 -127.5t-93 -92.5v-606q111 58 256 58q52 0 94.5 14t68.5 36.5t45 50t28 55t14 50t6 36.5v14zM640 1536 q-53 0 -90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5zM640 0q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5z" /> +<glyph unicode="" d="M1920 1280l-256 -256l-384 384l256 256zM1152 1280l384 -384l-1024 -1025h-384v385zM512 128h-128v128h-128v-256h256v128z" /> +<glyph unicode="" d="M1024 1664q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM1024 128q174 0 321.5 86t233 233t85.5 321q0 130 -50.5 248.5t-136.5 204.5t-204.5 136.5t-248.5 50.5 q-174 0 -321 -85.5t-233 -233t-86 -321.5q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51zM1024 1024q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5zM896 768h-128q0 5 1 13.5t7.5 31t18.5 39t38.5 30.5t62.5 14 h128q5 0 13.5 -0.5t31 -7t39 -18.5t30.5 -38.5t14 -63.5v-384h128q0 -5 -1 -13.5t-7.5 -31t-18.5 -39t-38.5 -30.5t-62.5 -14h-128q-5 0 -13.5 1t-31 7.5t-39 18.5t-30.5 38.5t-14 62.5v384z" /> +<glyph unicode="" d="M1536 768l-768 -767v1535z" /> +<glyph unicode="" d="M1792 1024l-768 -767l-767 767h1535z" /> +<glyph unicode="" d="M1117 640h274q17 70 17 128q0 212 -137.5 362t-331.5 150h-470q-194 0 -331.5 -150t-137.5 -362t137.5 -362t331.5 -150h175q-39 35 -67 74.5t-40 70.5t-18.5 57t-6.5 40v14q-106 0 -181 75t-75 181t75 181t181 75h384q106 0 181 -75t75 -181q0 -68 -35 -128zM1109 256 h470q194 0 331.5 150t137.5 362t-137.5 362t-331.5 150h-171q36 -36 62.5 -75.5t38.5 -70.5t18.5 -56.5t7.5 -39.5l1 -14q106 0 181 -75t75 -181t-75 -181t-181 -75h-384q-106 0 -181 75t-75 181q0 66 36 128h-275q-17 -70 -17 -128q0 -212 137.5 -362t331.5 -150z" /> +<glyph unicode="" d="M1664 896v-256h-512v-512h-256v512h-512v256h512v512h256v-512h512z" /> +<glyph unicode="" d="M1664 1408v-256h-1280v256h1280zM1664 896v-256h-1280v256h1280zM1664 384v-256h-1280v256h1280z" /> +<glyph unicode="" d="M897 1226l-428 -458l428 -458l-171 -184l-599 642l599 642zM1922 768l-600 -642l-171 184l428 458l-428 458l171 184z" /> +<glyph unicode="" d="M1024 1792q130 0 248.5 -50.5t204.5 -136.5t136.5 -204.5t50.5 -248.5q0 -99 -66 -280.5t-160 -369.5t-188 -362t-160 -285l-66 -111q-26 43 -69 116t-153.5 274t-195 373.5t-153.5 359t-69 285.5q0 174 86 321.5t233 233t321 85.5zM1024 896q106 0 181 75t75 181 t-75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75z" /> +<glyph unicode="" d="M128 1664h256v-256h-256v256zM1920 1664v-256h-1280v256h1280zM128 1152h256v-256h-256v256zM640 1152h1280v-256h-1280v256zM128 640h256v-256h-256v256zM640 640h1280v-256h-1280v256zM128 128h256v-256h-256v256zM640 128h1280v-256h-1280v256z" /> +<glyph unicode="" d="M512 1664h128v-768h-128v512h-256v128h256v128zM1920 1664v-256h-1024v256h1024zM896 1152h1024v-256h-1024v256zM128 640h512v-332l-384 -308h384v-128h-512v208l384 308v124h-256v-128h-128v256zM896 640h1024v-256h-1024v256zM896 128h1024v-256h-1024v256z" /> +<glyph unicode="" d="M384 256v512q0 212 150 362t362 150v-256q-106 0 -181 -75t-75 -181h256v-512h-512zM1664 1280v-256q-106 0 -181 -75t-75 -181h256v-512h-512v512q0 212 150 362t362 150z" /> +<glyph unicode="" d="M1920 1408v-1280h-1024v1280h1024zM512 1280h256v-128h-128v-768h128v-128h-256v1024zM128 1152h256v-128h-128v-512h128v-128h-256v768zM1664 1152h-512v-768h512v768z" /> +<glyph unicode="" d="M1792 1536v-1536h-1536v1536h1536zM1664 1408h-1280v-1280z" /> +<glyph unicode="" d="M256 1024h-128v512h512v-128h-384v-384zM1920 1536v-512h-128v384h-384v128h512zM384 1280h1280v-1024h-1280v1024zM640 512h768v512h-768v-512zM256 128h384v-128h-512v512h128v-384zM1792 512h128v-512h-512v128h384v384z" /> +<glyph unicode="" d="M512 1280h-384v128h256v256h128v-384zM1920 1408v-128h-384v384h128v-256h256zM512 1152h1024v-768h-1024v768zM768 640h512v256h-512v-256zM128 256h384v-384h-128v256h-256v128zM1536 256h384v-128h-256v-256h-128v384z" /> +<glyph unicode="" d="M512 1536h-128v256h128v-256zM1536 1536h-128v256h128v-256zM1920 1664v-1792h-1920v1792h256v-256h384v256h640v-256h384v256h256zM1792 1280h-1664v-1280h1664v1280zM640 896h-128v256h128v-256zM896 896h-128v256h128v-256zM1152 896h-128v256h128v-256zM1408 896 h-128v256h128v-256zM1664 896h-128v256h128v-256zM384 512h-128v256h128v-256zM640 512h-128v256h128v-256zM896 512h-128v256h128v-256zM1152 512h-128v256h128v-256zM1408 512h-128v256h128v-256zM1664 512h-128v256h128v-256zM384 128h-128v256h128v-256zM640 128h-128 v256h128v-256zM896 128h-128v256h128v-256zM1152 128h-128v256h128v-256zM1408 128h-128v256h128v-256z" /> +<glyph unicode="" d="M1536 1280h384q5 0 13.5 -1t31 -7.5t39 -18.5t30.5 -38.5t14 -62.5v-768q0 -26 -7 -47t-18.5 -34t-25 -23t-27 -14t-25 -6.5t-18.5 -3.5h-7h-384v-256q0 -69 -94 -128t-256.5 -93.5t-353.5 -34.5t-353.5 34.5t-256.5 93.5t-94 128v1536q0 69 94 128t256.5 93.5 t353.5 34.5t353.5 -34.5t256.5 -93.5t94 -128v-256zM832 1408q186 0 317 37.5t131 90.5t-131 90.5t-317 37.5t-317 -37.5t-131 -90.5t131 -90.5t317 -37.5zM512 1152h-128v-1024h128v1024zM1280 1152h-128v-1024h128v1024zM896 1024h-128v-1024h128v1024zM1792 1024h-256 v-512h256v512z" /> +<glyph unicode="" d="M1536 896h128q53 0 90.5 -37.5t37.5 -90.5v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1280q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h128v384q0 212 150 362t362 150t362 -150t150 -362v-384zM1280 896v384q0 106 -75 181t-181 75t-181 -75t-75 -181v-384 h512zM1280 768h-896v-896h896v128h-768v128h768v128h-768v128h768v128h-768v128h768v128z" /> +<glyph unicode="" d="M256 1664h1536q35 0 61 -13t38 -32t19.5 -38t8.5 -32l1 -13v-1536q0 -35 -13 -61t-32 -38t-38 -19.5t-32 -8.5l-13 -1h-1536q-26 0 -47 7t-34 18.5t-23 25t-14 27t-6.5 25t-3.5 18.5v7v1536q0 26 7 47t18.5 34t25 23t27 14t25 6.5t18.5 3.5h7zM1664 1408h-1280v-1280 h1280v1280zM896 640h-256v256h256v256h256v-256h256v-256h-256v-256h-256v256z" /> +<glyph unicode="" d="M256 1664h1536q35 0 61 -13t38 -32t19.5 -38t8.5 -32l1 -13v-1536q0 -35 -13 -61t-32 -38t-38 -19.5t-32 -8.5l-13 -1h-1536q-26 0 -47 7t-34 18.5t-23 25t-14 27t-6.5 25t-3.5 18.5v7v1536q0 26 7 47t18.5 34t25 23t27 14t25 6.5t18.5 3.5h7zM1664 1408h-1280v-1280 h1280v1280zM1408 640h-768v256h768v-256z" /> +<glyph unicode="" d="M256 1664h1536q35 0 61 -13t38 -32t19.5 -38t8.5 -32l1 -13v-1536q0 -35 -13 -61t-32 -38t-38 -19.5t-32 -8.5l-13 -1h-1536q-26 0 -47 7t-34 18.5t-23 25t-14 27t-6.5 25t-3.5 18.5v7v1536q0 26 7 47t18.5 34t25 23t27 14t25 6.5t18.5 3.5h7zM1664 1408h-1280v-1280 h1280v1280zM1024 512q-106 0 -181 75t-75 181t75 181t181 75t181 -75t75 -181t-75 -181t-181 -75z" /> +<glyph unicode="" d="M256 1664h1536q35 0 61 -13t38 -32t19.5 -38t8.5 -32l1 -13v-1536q0 -35 -13 -61t-32 -38t-38 -19.5t-32 -8.5l-13 -1h-1536q-26 0 -47 7t-34 18.5t-23 25t-14 27t-6.5 25t-3.5 18.5v7v1536q0 26 7 47t18.5 34t25 23t27 14t25 6.5t18.5 3.5h7zM1664 1408h-1280v-1280 h1280v1280zM1024 640h-384v256h384v256l512 -384l-512 -384v256z" /> +<glyph unicode="" d="M384 1664h1280q96 0 176 -80t80 -176v-768q0 -52 -14 -94.5t-36.5 -68.5t-50 -45t-55 -28t-50 -14t-36.5 -6h-14h-128v-512l-512 512h-640q-96 0 -176 80t-80 176v768q0 96 80 176t176 80zM1408 1152h-256v256h-256v-256h-256v-256h256v-256h256v256h256v256z" /> +<glyph unicode="" d="M512 640h-128v768h128v-384h256v384h128v-768h-128v256h-256v-256zM1536 1024v-128h-256v-256h-128v768h384v-128h-256v-256h256zM1536 1024v256h128v-256h-128zM1536 640v256h128v-256h-128zM384 384h1280v-256h-1280v256z" /> +<glyph unicode="" d="M896 384v256h-256v256h256v256l512 -384z" /> +<glyph unicode="" d="M1024 641l-767 767h1535zM1792 384v-256h-1536v256h1536z" /> +<glyph unicode="" d="M1792 1408v-256h-1536v256h1536zM1792 128h-1535l767 768z" /> +<glyph unicode="" d="M0 1408h384v-1280h-384v1280zM2048 1024v-512h-640v-384l-768 640l768 640v-384h640z" /> +<glyph unicode="" d="M1152 1536h-256v256h256v-256zM1920 1152l-256 -256h-1408v512h1408zM1152 1280h-256v-256h256v256zM896 768h256v-1024h-256v1024z" /> +<glyph unicode="" d="M800 736l-96 -96q-48 -72 -48 -160t48 -160l192 -192h-640v1408h1152v-640l-224 -224l-64 64q-48 48 -148 48t-172 -48zM512 1408h-128v-128h128v128zM640 1280h640v128h-640v-128zM512 1152h-128v-128h128v128zM640 1024h640v128h-640v-128zM512 896h-128v-128h128v128z M640 768h128v128h-128v-128zM1792 768v-64l-576 -576h-64l-96 96l-192 224q-24 0 -24 16t24 16l96 128h32l192 -192l448 448h32z" /> +<glyph unicode="" d="M640 -128l-256 639q-41 1 -128 1q-69 0 -128 68.5t-93.5 186.5t-34.5 257t34.5 257t93.5 186.5t128 68.5q236 -1 428 13t314 36.5t216 49.5t153 55t106 50.5t93.5 37t97.5 14.5q104 0 192.5 -103t140 -279.5t51.5 -385.5t-51.5 -385.5t-140 -279.5t-192.5 -103 q-53 0 -101 14.5t-98 38.5t-109.5 50.5t-162 56t-227.5 49.5l186 -465l-128 -256zM1664 512q69 0 128 68.5t93.5 186.5t34.5 257t-34.5 257t-93.5 186.5t-128 68.5t-128 -68.5t-93.5 -186.5t-34.5 -257t34.5 -257t93.5 -186.5t128 -68.5zM640 1290v-277q396 -26 645 -115 q-5 68 -5 126q0 215 55 397q-257 -105 -695 -131zM512 1019v265q-104 -4 -256 -4q-4 0 -4 -47.5t2 -118.5t2 -90q126 0 256 -5z" /> +<glyph unicode="" d="M1537 768l-642 -640l-256 256l384 384l-384 384l256 256z" /> +<glyph unicode="" d="M1792 1664v-1664h-1536v1664h1536zM1664 1536h-1280v-1408h1280v1408zM1536 1280h-1024q0 5 1 13.5t7.5 31t18.5 39t38.5 30.5t62.5 14h768q35 0 61 -13t38 -32t19.5 -38t8.5 -32zM1152 1152h256v-384l-256 -256v-256h-256v256l-256 256v384h256v-260l128 -124l128 128 v256z" /> +<glyph unicode="" d="M1792 1664v-1664h-1536v1664h1536zM1664 1536h-1280v-1408h1280v1408zM1536 1280h-1024q0 5 1 13.5t7.5 31t18.5 39t38.5 30.5t62.5 14h768q35 0 61 -13t38 -32t19.5 -38t8.5 -32zM1152 896h256v-256h-256v-256h-256v256h-256v256h256v256h256v-256z" /> +<glyph unicode="" d="M1408 1536v-1536l-377 263l-391 -263v1536h768z" /> +<glyph unicode="" d="M768 896h-256v512h256v-512zM1536 1280h-256v128h256v-128zM1664 1152v-256h-512v256h512zM384 768h512v-256h-512v256zM1280 768h256v-640h-256v640zM512 384h256v-256h-256v256z" /> +<glyph unicode="" d="M1531 814l204 244q57 -143 57 -290q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103q148 0 290 -57l-244 -204q-40 5 -46 5q-212 0 -362 -150t-150 -362t150 -362t362 -150t362 150t150 362 q0 6 -5 46zM1664 1280l-387 -484q3 -27 3 -28q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75q1 0 28 -3l484 387h128v-128z" /> +<glyph unicode="" d="M384 1664l148 -148q224 148 492 148q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348q0 238 128 455v-199h182q-54 -124 -54 -256q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q174 0 321.5 86 t233 233t85.5 321q0 130 -50.5 248.5t-136.5 204.5t-204.5 136.5t-248.5 50.5q-155 0 -304 -80l176 -176h-512v512zM896 256v384l-128 128l256 256l128 -128h256l128 -128l-128 -128h-256v-384l-130 -126z" /> +<glyph unicode="" d="M1536 640h256v-640h-1536v1536h512v-256h-256v-1024h1024v384zM1792 1536v-768l-256 256l-384 -384l-256 256l384 384l-256 256h768z" /> +<glyph unicode="" d="M1024 1408h128v-1280h-128l-512 384h-256v512h256zM1792 768l190 -193l-129 -129l-189 194l-197 -194l-121 129l190 193l-190 193l125 125l193 -190l189 190l129 -125z" /> +<glyph unicode="" d="M1312 736l416 -416l-256 -256l-416 416l-416 -416l-256 256l416 416l-416 416l256 256l416 -416l416 416l256 -256z" /> +<glyph unicode="" d="M2048 1536v-256h-256v-256h-256v256h-256v256h256v256h256v-256h256zM1776 896l-317 -290l119 -606l-554 298l-554 -298l119 606l-461 423l627 77l269 558l128 -266v-246h256v-256h368z" /> +<glyph unicode="" d="M1797 1408l205 -205l-133 -133l-205 205l-205 -205l-133 133l205 205l-205 205l133 133l205 -205l205 205l133 -133zM1779 899l-320 -293l119 -606l-554 298l-554 -298l119 606l-461 423l627 76l269 559l128 -266v-118l128 -256z" /> +<glyph unicode="" d="M1024 1408q130 0 248.5 -50.5t204.5 -136.5t136.5 -204.5t50.5 -248.5q0 -174 -85.5 -321t-233 -233t-321.5 -86q-130 0 -248.5 51t-204 136.5t-136.5 204t-51 248.5q0 174 86 321.5t233 233t321 85.5zM673 613l506 506q-74 33 -155 33q-159 0 -271.5 -112.5 t-112.5 -271.5q0 -81 33 -155zM1375 924l-509 -506q74 -34 158 -34q159 0 271.5 112.5t112.5 271.5q0 81 -33 156z" /> +<glyph unicode="" d="M1294 700l189 -188h437v256h-331l-323 332l-293 -401l-143 884l-397 -815h-305v-255h463l116 229l112 -693z" /> +<glyph unicode="" d="M1824 -128v1408l-384 384h-1152v-1792h1536zM1696 0h-1280v1536h926l354 -352v-1184zM1184 640h256v256h-256v256h-256v-256h-256v-256h256v-256h256v256z" /> +<glyph unicode="" d="M480 704l-223 31q-7 158 49 307t173 264q135 133 313.5 187t360 23t330.5 -141l164 161l78 -538l-545 77l148 146q-159 106 -356 87.5t-337 -156.5q-95 -99 -136.5 -215t-18.5 -233zM1567 845l225 -44q6 -159 -50 -307.5t-173 -263.5q-135 -133 -313 -187.5t-359.5 -23 t-331.5 141.5l-164 -161l-78 538l545 -78l-147 -145q159 -106 355.5 -87.5t336.5 156.5q94 93 133 214.5t21 246.5z" /> +<glyph unicode="" d="M2015 1529q28 -103 -7 -190t-112 -107l-371 -100q-77 -20 -150.5 37.5t-100.5 160.5q-28 102 7 189t112 108l371 99q76 21 150 -37t101 -160zM1863 1355q25 7 34 48t-5 92q-14 52 -42 83t-53 24q-25 -6 -34 -47t5 -92q13 -51 41 -82.5t54 -25.5zM772 1063l-454 -122 q-52 -13 -97.5 13.5t-59.5 77.5q-14 52 12.5 97.5t77.5 59.5l495 133q-51 -14 -77.5 -60t-13.5 -97q11 -40 44 -65.5t74 -27.5q7 38 30 80q-16 19 -24 46q-14 52 12.5 98t77.5 59l338 223l62 16q-77 -21 -112 -108t-7 -189q27 -103 101 -160.5t151 -37.5l-62 -17l-98 6 q38 -36 38 -64q0 -106 -75 -181t-181 -75t-181 75t-75 181q0 13 4 39zM1152 512l640 -640h-256l-384 256v-256h-256v256l-384 -256h-256l640 640v128h256v-128z" /> +<glyph unicode="" d="M1536 0l256 -256h-1536l256 256h256v185q-72 33 -124 71h-388v128h768q0 159 112.5 271.5t271.5 112.5q0 102 -50.5 188.5t-135.5 137.5l-198 -198l-128 -256h-256l-128 128v256l256 128l512 512h128l128 128l128 -128l-128 -128v-128l-130 -130q120 -89 189 -222.5 t69 -287.5q0 -45 -8 -93q64 -55 100 -130t36 -161q0 -137 -85.5 -241.5t-216.5 -133.5zM1280 384q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5z" /> +<glyph unicode="" d="M512 1664q159 0 271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5zM2048 0l-256 -256l-576 576l-320 -320v896h896l-320 -320z" /> +<glyph unicode="" d="M1280 1280l-768 -768l-128 128l256 256l-512 512l256 256l512 -512l256 256zM1920 128l-256 -256l-512 512l-256 -256l-128 128l768 768l128 -128l-256 -256z" /> +<glyph unicode="" d="M1792 1664v-1664h-1536v1664h1536zM1664 1536h-1280v-1408h1280v1408zM1536 1280h-1024q0 5 1 13.5t8.5 31t19.5 39t38 30.5t61 14h768q26 0 47 -7t34 -18.5t23 -25t14 -27t6.5 -25t3.5 -18.5v-7zM1408 640h-768l128 384l256 -128l256 128zM1536 384h-1024l128 128h768z " /> +<glyph unicode="" d="M640 0h-256q-34 0 -59.5 11.5t-38 27t-20 36t-9 32t-1.5 20.5v1537q0 47 40 87.5t88 40.5h1280q48 0 88 -40t40 -88v-1536q0 -5 -0.5 -13.5t-6.5 -31t-18 -39t-38.5 -30.5t-64.5 -14h-640v-256l-192 192l-192 -192v256zM384 510h128v1154h-128v-1154zM896 766h512v383v3 q0 106 -75 181t-181 75t-181 -75t-75 -181v-3v-383zM1024 1149v3q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5v-3h-256zM1024 255v-128l576 1q3 0 7 0.5t15 4t19.5 9.5t15.5 19t7 31v191q-212 0 -687.5 0.5t-592.5 0.5v-192q0 -3 0.5 -7t4 -15t9.5 -19.5t19 -15.5 t31 -7q34 0 101.5 -0.5t90.5 -0.5v128h384z" /> +<glyph unicode="" d="M384 1792h1280q5 0 13.5 -1t31 -7.5t39 -18.5t30.5 -38.5t14 -62.5v-1536q0 -5 -1 -13.5t-7.5 -31t-18.5 -39t-38.5 -30.5t-62.5 -14h-640v-256l-192 192l-192 -192v256h-256q-26 0 -47 7t-34 18.5t-23 25t-14 27t-6.5 25t-3.5 18.5v7v1536q0 26 7 47t18.5 34t25 23 t27 14t25 6.5t18.5 3.5h7zM1664 1664h-1024v-1152h1024v1152zM896 1408h-128v128h128v-128zM896 1152h-128v128h128v-128zM896 896h-128v128h128v-128zM896 640h-128v128h128v-128zM1024 128h576q3 0 7 0.5t15 4t19.5 9.5t15.5 19t7 31v192h-1280v-192q0 -3 0.5 -7t4 -15 t9.5 -19.5t19 -15.5t31 -7h192v128h384v-128z" /> +<glyph unicode="" d="M384 1792h1280q48 0 88 -40t40 -88v-1536q0 -5 -0.5 -13.5t-6.5 -31t-18 -39t-38.5 -30.5t-64.5 -14h-640v-256l-192 192l-192 -192v256h-256q-34 0 -59.5 11.5t-38 27t-20 36t-9 32t-1.5 20.5v1537q0 47 40 87.5t88 40.5zM1664 1664h-1024v-1154h1024v1154zM832 1216v82 q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5q0 -35 -17.5 -64t-46.5 -46v-22l192 -188l192 192v18q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5q0 -35 -17.5 -64t-46.5 -46v-82l-256 -256v-82q29 -17 46.5 -46 t17.5 -64q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5q0 35 17.5 64t46.5 46v82zM1024 255v-128l576 1q3 0 7 0.5t15 4t19.5 9.5t15.5 19t7 31v191q-212 0 -687.5 0.5t-592.5 0.5v-192q0 -3 0.5 -7t4 -15t9.5 -19.5t19 -15.5t31 -7q34 0 101.5 -0.5t90.5 -0.5v128 h384z" /> +<glyph unicode="" d="M1664 896h128v-768q0 -5 -0.5 -13.5t-6.5 -31t-18 -39t-38.5 -30.5t-64.5 -14h-640v-256l-192 192l-192 -192v256h-256q-42 0 -70.5 16.5t-39.5 41.5t-14.5 41t-3.5 29v1536q0 48 40.5 88t87.5 40h768v-128h-512v-1154h1024v386zM1920 1536v-256h-256v-256h-256v256h-256 v256h256v256h256v-256h256zM896 1408h-128v128h128v-128zM896 1152h-128v128h128v-128zM896 896h-128v128h128v-128zM768 768h128v-128h-128v128zM1024 128h576q3 0 7 0.5t15 4t19.5 10t15.5 19.5t7 30v192h-1280v-192q0 -3 0.5 -7t4 -15t9.5 -19.5t19 -15.5t31 -7l192 -1 v128h384v-127z" /> +<glyph unicode="" d="M1152 1728h-896l128 64h768v-64zM640 1600h-384v64h384v-64zM640 1472h-384v64h384v-64zM896 1472h-128v64h128v-64zM1920 1536v-256h-768v256h768zM640 1344h-384v64h384v-64zM640 1216h-384v64h384v-64zM896 1216h-128v64h128v-64zM640 1088h-384v64h384v-64zM640 960 h-384v64h384v-64zM896 960h-128v64h128v-64zM640 832h-384v64h384v-64zM1664 896h128v-64h-128v64zM640 704h-384v64h384v-64zM768 768h128v-64h-128v64zM1664 768h128v-64h-128v64zM640 576h-384v64h384v-64zM1664 640h128v-64h-128v64zM256 512h1536v-64h-1536v64z M384 320h-128v64h128v-64zM1664 384h128v-64h-128v64zM384 192h-128v64h128v-64zM1664 256h128v-64h-128v64zM1024 255v-63h-384v63h384zM256 128h1536l-64 -64h-1408zM640 0h384v-64h-384v64zM640 -128h128l-64 -64h-64v64zM896 -128h128v-64h-64z" /> +<glyph unicode="" d="M384 1790h1280q5 1 13.5 2t30 -2.5t38 -14.5t31 -40t15.5 -73v-1534q0 -5 -0.5 -13.5t-6.5 -31t-18 -39t-38.5 -30.5t-64.5 -14h-256v128h192q3 0 7 0.5t15 4t19.5 10t15.5 19.5t7 30v191h-256v128h256v1151h-1024v-1151h256v-128h-512v-191v-7t3.5 -15t9.5 -19.5 t19.5 -15.5t31.5 -7h192v127h256v-255l-256 -256v256h-256q-34 0 -59.5 11.5t-38 27t-20 36t-9 32t-1.5 20.5v1v1534q0 36 13 63t32 38.5t38 18.5t32 8h13zM896 1406h-128v128h128v-128zM768 1278h128v-127h-128v127zM1536 639h-256v-895h-256v895h-256l384 512z" /> +<glyph unicode="" d="M1408 894h128v-766q0 -5 -0.5 -13.5t-6.5 -31t-18 -39t-38.5 -30.5t-64.5 -14h-640v-256l-192 192l-192 -192v256h-256q-42 0 -70.5 16.5t-39.5 41.5t-14.5 41t-3.5 29v1536q0 36 13 63t32 38.5t38 18.5t32 8h13h1280q5 0 13.5 -1t30 -7.5t38.5 -18.5t31 -38.5t15 -62.5 v-256h-128v256h-1024v-1154h1024v384zM640 1408h-128v128h128v-128zM1664 768v256h-768v256h768v256l384 -384zM640 1152h-128v128h128v-128zM640 896h-128v128h128v-128zM512 766l128 2v-128h-128v126zM768 255v-128l576 1q3 0 7 0.5t15 4t19.5 10t15.5 19.5t7 30v192 h-1280v-192q0 -3 0.5 -7t4 -15t9.5 -19.5t19 -15.5t31 -7q34 0 101 -0.5t91 -0.5v128h384z" /> +<glyph unicode="" d="M0 128v1280q36 7 104 17.5t301 28.5t491 18q26 0 47 -7t34 -18.5t23 -25t14 -27t6.5 -25t3.5 -18.5v-7q0 5 1 13.5t8.5 31t19.5 39t38 30.5t61 14q257 0 481 -16t319 -32l96 -16v-1280q-12 3 -35.5 7t-107 15t-179 19.5t-251 15.5t-323.5 7q0 -29 -16 -45t-32 -17l-16 -2 h-128q-3 0 -7 0.5t-15 4t-19.5 9.5t-15.5 19t-7 31q-285 0 -509 -16t-305 -32zM128 1280v-960q36 7 99.5 17.5t248 28.5t356.5 18q35 0 61 -6.5t38 -14.5t19.5 -18.5t8.5 -15.5t1 -9v960q0 3 -1 7t-8.5 15t-19.5 19.5t-38 15.5t-61 7q-171 0 -347 -16t-267 -32zM1920 320 v960q-36 7 -99.5 17.5t-248.5 28.5t-356 18q-36 0 -62.5 -6.5t-38.5 -16t-18.5 -19t-7.5 -16.5l-1 -6v-960q0 3 1 7t8.5 15t19.5 19.5t38 15.5t61 7q198 0 374 -16t253 -32zM832 1152h-576q0 3 0.5 7t4 15t9.5 19.5t19 15.5t31 7h448q28 0 44 -16t18 -32zM1792 1152h-576 q0 3 0.5 7t4 15t9.5 19.5t19 15.5t31 7h448q28 0 44 -16t18 -32zM832 1024h-576q0 3 0.5 7t4 15t9.5 19.5t19 15.5t31 7h448q28 0 44 -16t18 -32zM1792 1024h-576q0 3 0.5 7t4 15t9.5 19.5t19 15.5t31 7h448q28 0 44 -16t18 -32zM832 896h-576q0 3 0.5 7t4 15t9.5 19.5 t19 15.5t31 7h448q28 0 44 -16t18 -32zM1792 896h-576q0 3 0.5 7t4 15t9.5 19.5t19 15.5t31 7h448q28 0 44 -16t18 -32zM832 768h-576q0 3 0.5 7t4 15t9.5 19.5t19 15.5t31 7h448q28 0 44 -16t18 -32zM1792 768h-576q0 3 0.5 7t4 15t9.5 19.5t19 15.5t31 7h448q28 0 44 -16 t18 -32zM832 640h-576q0 3 0.5 7t4 15t9.5 19.5t19 15.5t31 7h448q28 0 44 -16t18 -32zM1792 640h-576q0 3 0.5 7t4 15t9.5 19.5t19 15.5t31 7h448q28 0 44 -16t18 -32zM832 512h-576q0 3 0.5 7t4 15t9.5 19.5t19 15.5t31 7h448q28 0 44 -16t18 -32zM1792 512h-576 q0 3 0.5 7t4 15t9.5 19.5t19 15.5t31 7h448q28 0 44 -16t18 -32z" /> +<glyph unicode="" d="M1829 1236q156 -180 156 -429q0 -139 -24.5 -252t-68 -196t-110.5 -145.5t-145.5 -103t-179 -65.5t-205 -35t-229.5 -10t-229 10t-204.5 35t-178.5 65.5t-144.5 103t-110 145.5t-67.5 196t-24 252q0 250 156 429q-9 23 -16 55t-13 88t5 130t40 151q5 2 15.5 3.5 t47.5 -2.5t80.5 -18t116 -52t152.5 -97q137 41 376 41t375 -41q80 59 152 97.5t117.5 51.5t79.5 18t49 2l15 -3q29 -77 39.5 -151t4.5 -130.5t-12.5 -87.5t-15.5 -55zM1024 128q98 0 162.5 2t146 11.5t133 26.5t106.5 48t85.5 76t50.5 111.5t20 151.5q0 145 -120 263 q-36 36 -84 54.5t-108.5 21t-115.5 -1t-136 -9.5t-140 -6t-140 6t-136 9.5t-115.5 1t-108 -21t-83.5 -54.5q-120 -118 -120 -263q0 -85 20 -151.5t50.5 -111.5t85.5 -76t106.5 -48t133 -26.5t145.5 -11.5t162 -2zM672 738q40 0 68 -46.5t28 -113.5q0 -66 -28 -113t-68 -47 t-68 47t-28 113q0 67 28 113.5t68 46.5zM1374 738q40 0 68 -46.5t28 -113.5q0 -66 -28 -113t-68 -47t-68 47t-28 113q0 67 28 113.5t68 46.5zM1023 384q-26 0 -45 9.5t-19 22.5t19 22.5t45 9.5t45 -9.5t19 -22.5t-19 -22.5t-45 -9.5zM1118 308q5 19 22 12q7 -2 10 -9.5 t1 -15.5q-14 -46 -49 -74.5t-78 -28.5t-78 28.5t-49 74.5q-2 8 1 15.5t10 9.5q17 7 22 -12q11 -34 37 -55t57 -21t57 21t37 55z" /> +<glyph unicode="" d="M1023 1792q208 0 398 -81t327 -218.5t218 -327t81 -397.5q0 -209 -81 -398.5t-218 -326.5t-326.5 -218t-398.5 -81q-208 0 -397.5 81t-326.5 218t-218 327t-81 398t81 397.5t218 327t326.5 218.5t397.5 81zM1280 139v-203q268 88 437.5 316.5t169.5 515.5 q0 176 -68.5 336t-184 275.5t-275.5 184t-336 68.5q-175 0 -335 -68.5t-275.5 -184t-184 -275.5t-68.5 -336q0 -287 170.5 -516t438.5 -316v163q-75 -15 -128.5 -9.5t-87.5 26.5t-54 43.5t-27 40.5l-8 17q-18 46 -42.5 78.5t-39.5 42.5l-16 9q-36 26 -34.5 38t20.5 14l20 2 q25 -2 48 -12t38.5 -23t27 -25.5t16.5 -21.5l6 -9q29 -50 69.5 -74.5t80.5 -23t66.5 8.5t49.5 18q12 61 78 81q-63 7 -114.5 18.5t-108 34t-98.5 59t-77 88t-53.5 128t-18.5 171.5q0 157 103 270q-47 123 10 267q3 1 10 2t32 -1.5t54.5 -11t78 -32.5t102.5 -60 q118 32 252 34q133 -2 252 -34q54 36 102 60t78.5 32.5t53 11.5t32.5 1l10 -2q25 -63 28.5 -125.5t-3 -91.5t-15.5 -50q104 -112 104 -270q0 -82 -14.5 -150t-38.5 -116.5t-60.5 -87t-75.5 -62.5t-89 -41.5t-94.5 -26t-97.5 -14.5q84 -57 84 -182z" /> +<glyph unicode="" d="M766 49v-241q-216 31 -392 169t-275 347t-99 445q0 208 81 397.5t218 326.5t327 218t398 81t397.5 -81t326.5 -218t218 -326.5t81 -397.5q0 -236 -99 -445t-275 -347t-392 -169v321q-1 127 -85 183q54 6 98.5 14.5t94.5 26t89 42t75.5 63t61 87.5t39 117.5t14.5 150.5 q0 158 -104 272q9 20 15.5 49.5t3 92t-27.5 125.5q-3 1 -10 2t-32.5 -1t-54.5 -10.5t-78.5 -32.5t-103.5 -61q-118 32 -253 34q-135 -2 -253 -34q-54 37 -103 61t-79.5 32t-53.5 11t-33 1l-10 -2q-25 -63 -28.5 -126t3 -91t15.5 -50q-104 -115 -104 -272q0 -114 28 -201 t72 -139.5t109.5 -87.5t126.5 -50t138 -23q-62 -41 -79 -122q-23 -11 -50 -18.5t-67.5 -9t-81 23t-69.5 74.5q-2 3 -5.5 9t-16.5 21t-28 27t-38.5 22.5t-48.5 12.5h-9t-16 -3t-14.5 -8t3.5 -16t30 -27q2 -1 6.5 -3.5t17 -13t24 -23.5t26 -37.5t25.5 -53.5q1 -2 2.5 -5.5 t7 -14.5t13.5 -21.5t21.5 -24t29.5 -24t40 -19.5t51 -14t63.5 -4t77.5 9z" /> +<glyph unicode="" d="M768 521v-130q-162 25 -267 142q-60 -21 -117 -21q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5q8 0 51 -5q75 174 234.5 281.5t354.5 107.5t354.5 -107.5t234.5 -281.5q43 5 51 5q159 0 271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5 q-1 0 -3 0.5t-3 0.5q-131 -129 -314 -129q-22 0 -64 6v130q34 -8 64 -8q79 0 148 36.5t113 99.5q30 -8 59 -8q106 0 181 75t75 181t-75 181t-181 75q-76 0 -139 -41q-31 182 -172 303.5t-329 121.5t-329.5 -121t-173.5 -303q-64 40 -137 40q-106 0 -181 -75t-75 -181 t75 -181t181 -75q87 0 159 57q32 -68 91 -114t134 -62zM1152 256h256l-384 -384l-384 384h256v640h256v-640z" /> +<glyph unicode="" d="M768 521v-130q-162 25 -267 142q-60 -21 -117 -21q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5q8 0 51 -5q75 174 234.5 281.5t354.5 107.5t354.5 -107.5t234.5 -281.5q43 5 51 5q159 0 271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5 q-1 0 -3 0.5t-3 0.5q-131 -129 -314 -129q-22 0 -64 6v130q34 -8 64 -8q79 0 148 36.5t113 99.5q30 -8 59 -8q106 0 181 75t75 181t-75 181t-181 75q-76 0 -139 -41q-31 182 -172 303.5t-329 121.5t-329.5 -121t-173.5 -303q-64 40 -137 40q-106 0 -181 -75t-75 -181 t75 -181t181 -75q87 0 159 57q32 -68 91 -114t134 -62zM1408 768h-256v-640h-256v640h-256l384 384z" /> +<glyph unicode="" d="M2048 1408v-1280h-2048v1280h2048zM1920 1280h-1792v-1024h1792v1024zM384 1024h-128v128h128v-128zM576 1024h-128v128h128v-128zM768 1024h-128v128h128v-128zM960 1024h-128v128h128v-128zM1152 1024h-128v128h128v-128zM1344 1024h-128v128h128v-128zM1536 1024h-128 v128h128v-128zM1792 1024h-192v128h192v-128zM448 768h-192v128h192v-128zM512 896h128v-128h-128v128zM704 896h128v-128h-128v128zM896 896h128v-128h-128v128zM1088 896h128v-128h-128v128zM1280 896h128v-128h-128v128zM1472 896h128v-128h-128v128zM1664 896h128v-320 h-256v128h128v192zM320 576h-64v128h64v-128zM512 576h-128v128h128v-128zM704 576h-128v128h128v-128zM896 704v-128h-128v128h128zM1088 704v-128h-128v128h128zM1280 704v-128h-128v128h128zM1344 704h128v-128h-128v128zM384 384h-128v128h128v-128zM448 512h128v-128 h-128v128zM640 512h832v-128h-832v128zM1536 512h256v-128h-256v128z" /> +<glyph unicode="" d="M1792 1664v-1664h-1536v1664h1536zM1664 1536h-1280v-1408h1280v1408zM1536 1280h-1024q0 5 1 13.5t8.5 31t19.5 39t38 30.5t61 14h768q26 0 47 -7t34 -18.5t23 -25t14 -27t6.5 -25t3.5 -18.5v-7zM864 356l-352 348l352 352l96 -96l-256 -256l256 -256zM1182 1056 l354 -352l-352 -352l-96 96l256 256l-256 256z" /> +<glyph unicode="" d="M1792 1664v-1664h-1536v1664h1536zM1664 1536h-1280v-1408h1280v1408zM1536 1280h-1024q0 5 1 13.5t7.5 31t18.5 39t38.5 30.5t62.5 14h768q35 0 61 -13t38 -32t19.5 -38t8.5 -32zM768 384v384q0 106 75 181t181 75t181 -75t75 -181v-384h-512zM896 768h256 q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5z" /> +<glyph unicode="" d="M1792 1280v-1408h-1536v1792h1152zM1664 1184l-354 352h-926v-1536h1280v1184zM960 960l-256 -256l256 -256l-96 -96l-352 352l350 354zM1184 1056l352 -352l-356 -350l-92 94l256 256l-256 256z" /> +<glyph unicode="" d="M1792 1280v-1408h-1536v1792h1152zM1664 1216l-320 320h-960v-1536h1280v1216zM768 1344h-256v64h256v-64zM896 1216h-384v64h384v-64zM704 1024h-192v64h192v-64zM768 1088h256v-64h-256v64zM1088 1088h384v-64h-384v64zM832 896h-320v64h320v-64zM896 960h384v-64h-384 v64zM1344 960h192v-64h-192v64zM640 768h-128v64h128v-64zM832 768h-128v64h128v-64zM1152 832v-64h-256v64h256zM1216 832h192v-64h-192v64zM768 640h-256v64h256v-64zM1216 640h-384v64h384v-64zM1280 704h192v-64h-192v64zM704 512h-192v64h192v-64zM768 576h256v-64 h-256v64zM1088 576h448v-64h-448v64zM832 384h-320v64h320v-64zM1280 384h-384v64h384v-64zM1408 448v-64h-64v64h64zM640 256h-128v64h128v-64zM704 256v64h128v-64h-128zM896 320h256v-64h-256v64zM1472 256h-256v64h256v-64zM512 192h256v-64h-256v64zM832 192h384v-64 h-384v64zM1280 192h256v-64h-256v64z" /> +<glyph unicode="" d="M1792 1280v-1408h-1536v1792h1152zM1664 1216l-320 320h-960v-1536h1280v1216zM576 1216h768l128 -128v-768h-192v192q0 53 -37.5 90.5t-90.5 37.5h-256q-53 0 -90.5 -37.5t-37.5 -90.5v-192h-192v896zM1024 1088q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136 t-56 136t-136 56z" /> +<glyph unicode="" d="M1792 1280v-1408h-1536v1792h1152zM1664 1216l-320 320h-448v-64h-128v64h-384v-1536h1280v1216zM640 1472h128v-64h-128v64zM768 1344v64h128v-64h-128zM640 1344h128v-64h-128v64zM768 1216v64h128v-64h-128zM640 1216h128v-64h-128v64zM768 1088v64h128v-64h-128z M640 1088h128v-64h-128v64zM768 960v64h128v-64h-128zM640 960h128v-64h-128v64zM768 832v64h128v-64h-128zM640 832h128v-64h-128v64zM768 704v64h128v-64h-128zM640 704h128v-64h-128v64zM768 576v64h128v-64h-128zM640 576h128v-64h128q26 0 47 -7t34 -18.5t23 -25 t14 -27t6.5 -25t3.5 -18.5v-7v-256h-512v256q0 5 1 13.5t7.5 31t18.5 39t38.5 30.5t62.5 14v64zM640 384v-128h256v128h-256z" /> +<glyph unicode="" d="M1792 1280v-1408h-1536v1792h1152zM1664 1216l-320 320h-960v-1536h1280v1216zM1032 975q13 -38 27.5 -71.5t30 -58.5t29 -45.5t29.5 -36t27 -26.5t26 -20t21.5 -12.5t18.5 -9.5t13 -6q12 1 54 7t63 6q186 0 223 -84q7 -15 8.5 -36t-5 -45t-20.5 -43.5t-42 -31.5t-66 -9 q-47 2 -119 32.5t-132 73.5q-107 -11 -231.5 -42.5t-169.5 -50.5q-97 -163 -160 -218.5t-112 -55.5q-52 0 -78 27.5t-20 67.5q8 49 60 104t104 89.5t93 52.5q25 45 98.5 200.5t96.5 232.5q-72 190 -37 321q8 32 40 50t69.5 13.5t60.5 -30.5q6 -6 13 -18.5t16.5 -43t12 -67 t-7.5 -94.5t-34 -122zM965 1293q-11 1 -23.5 -7t-22 -28t-11.5 -49t12.5 -76.5t45.5 -104.5q45 71 47 165t-48 100zM792 518q185 82 395 113q-12 6 -33.5 22.5t-54.5 48t-68.5 87t-61.5 122.5q-20 -78 -81 -205t-96 -188zM1537 553q6 14 -4.5 29t-63.5 32.5t-177 -0.5 q19 -9 44.5 -23t44.5 -24t41.5 -21t39 -16t32 -6.5t26.5 6t17 23.5zM518 254q79 1 212 226q-23 -9 -59.5 -32t-75 -54.5t-62 -70t-15.5 -69.5z" /> +<glyph unicode="" d="M1920 640l-768 -768l-1024 1024v512l256 256h512zM1152 64l564 576l-896 896h-372l-192 -192v-384zM768 1216q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM576 1152q26 0 45 19t19 45t-19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19z M1536 640l-384 -384l-512 512l384 384zM1152 452l196 188l-324 324l-192 -196z" /> +<glyph unicode="" d="M128 128v1280q0 5 1 13.5t7.5 31t18.5 39t38.5 30.5t62.5 14h640q5 0 13.5 -1t31 -7.5t39 -18.5t30.5 -38.5t14 -62.5q0 -5 1 -13.5t7.5 -31t18.5 -39t38.5 -30.5t62.5 -14h640q5 0 13.5 -1t31 -7.5t39 -18.5t30.5 -38.5t14 -62.5v-1024h-1792zM896 1408h-512h-128v-128 h640v128z" /> +<glyph unicode="" d="M128 384v1280q0 5 1 13.5t7.5 31t18.5 39t38.5 30.5t62.5 14h640q5 0 13.5 -1t31 -7.5t39 -18.5t30.5 -38.5t14 -62.5q0 -5 1 -13.5t7.5 -31t18.5 -39t38.5 -30.5t62.5 -14h640q5 0 13.5 -1t31 -7.5t39 -18.5t30.5 -38.5t14 -62.5v-384h-256q0 5 -1 13.5t-7.5 31 t-18.5 39t-38.5 30.5t-62.5 14h-640q-5 0 -13.5 -1t-31 -7.5t-39 -18.5t-30.5 -38.5t-14 -62.5v-640h-640zM256 1536h640q0 5 -1 13.5t-7.5 31t-18.5 39t-38.5 30.5t-62.5 14h-384q-26 0 -47 -7t-34 -18.5t-23 -25t-14 -27t-6.5 -25t-3.5 -18.5v-7zM1536 896h256 q5 0 13.5 -1t31 -7.5t39 -18.5t30.5 -38.5t14 -62.5v-384h-1024v512q0 5 1 13.5t7.5 31t18.5 39t38.5 30.5t62.5 14h384q26 0 47 -7t34 -18.5t23 -25t14 -27t6.5 -25t3.5 -18.5v-7zM1408 768v128h-128h-256v-128h384z" /> +<glyph unicode="" d="M1024 1088q-133 0 -226.5 93.5t-93.5 226.5t93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5zM1024 1599q-80 0 -135.5 -55.5t-55.5 -135.5t55.5 -135.5t135.5 -55.5t135.5 55.5t55.5 135.5t-55.5 135.5t-135.5 55.5zM768 1024h512 q106 0 181 -75t75 -181v-256q0 -106 -75 -181t-181 -75v-512h-512v512q-106 0 -181 75t-75 181v256q0 106 75 181t181 75zM1408 512v256q0 53 -37.5 90.5t-90.5 37.5h-512q-53 0 -90.5 -37.5t-37.5 -90.5v-256q0 -53 37.5 -90.5t90.5 -37.5v256h128v-768h256v768h128v-256 q53 0 90.5 37.5t37.5 90.5z" /> +<glyph unicode="" d="M749 1311q-29 -71 -93.5 -115t-143.5 -44q-106 0 -181 75t-75 181t75 181t181 75q63 0 116.5 -28t89.5 -77q29 102 113.5 167.5t192.5 65.5t192.5 -65.5t113.5 -167.5q36 49 89.5 77t116.5 28q106 0 181 -75t75 -181t-75 -181t-181 -75q-79 0 -143.5 44t-93.5 115 q-42 -73 -115 -116t-160 -43t-160 43t-115 116zM1024 1663q-80 0 -135.5 -55.5t-55.5 -135.5t55.5 -135.5t135.5 -55.5t135.5 55.5t55.5 135.5t-55.5 135.5t-135.5 55.5zM512 1280q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5 t90.5 -37.5zM1536 1536q-53 0 -90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5zM1344 1152h320q106 0 181 -75t75 -181v-192q0 -69 -35 -127.5t-93 -92.5v-420h-512v-320h-512v320h-512v420q-58 34 -93 92.5t-35 127.5v192 q0 106 75 181t181 75h320q94 0 168 -64h304q74 64 168 64zM640 192v100q-58 34 -93 92.5t-35 127.5v320q0 114 88 192h-216q-53 0 -90.5 -37.5t-37.5 -90.5v-192h128v-512h256zM1792 704v192q0 53 -37.5 90.5t-90.5 37.5h-216q88 -78 88 -192v-320q0 -69 -35 -127.5 t-93 -92.5v-100h256v512h128zM1280 640v-256q53 0 90.5 37.5t37.5 90.5v320q0 53 -37.5 90.5t-90.5 37.5h-512q-53 0 -90.5 -37.5t-37.5 -90.5v-320q0 -53 37.5 -90.5t90.5 -37.5v256h128v-768h256v768h128z" /> +<glyph unicode="" d="M640 1088q-133 0 -226.5 93.5t-93.5 226.5t93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5zM1920 1408v-256h-256v-256h-256v256h-256v256h256v256h256v-256h256zM640 1600q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136t-56 136 t-136 56zM384 1024h512q106 0 181 -75t75 -181v-256q0 -106 -75 -181t-181 -75v-512h-512v512q-106 0 -181 75t-75 181v256q0 106 75 181t181 75zM1024 512v256q0 53 -37.5 90.5t-90.5 37.5h-512q-53 0 -90.5 -37.5t-37.5 -90.5v-256q0 -53 37.5 -90.5t90.5 -37.5v256h128 v-768h256v768h128v-256q53 0 90.5 37.5t37.5 90.5z" /> +<glyph unicode="" d="M849 1728h-418q96 64 209 64t209 -64zM357 1664h283q-94 0 -168 -64h-163q20 33 48 64zM971 1600h-163q-74 64 -168 64h283q28 -31 48 -64zM280 1536h140q-18 -30 -27 -64h-131q6 32 18 64zM1018 1472h-131q-9 34 -27 64h140q12 -32 18 -64zM393 1344h-131q-6 42 -6 64 h128q0 -26 9 -64zM896 1408h128q0 -22 -6 -64h-131q9 38 9 64zM1920 1408v-256h-768v256h768zM280 1280h140q17 -31 54 -64h-164q-18 31 -30 64zM860 1280h140q-12 -33 -30 -64h-165q37 32 55 64zM847 1088h-414q-45 29 -76 64h566q-31 -35 -76 -64zM384 1024h512 q94 0 168 -64h-848q74 64 168 64zM164 896h220q-35 0 -64 -17.5t-46 -46.5h-137q9 34 27 64zM1143 832h-137q-17 29 -46 46.5t-64 17.5h220q18 -30 27 -64zM256 704h-128v64h128v-64zM1024 768h128v-64h-128v64zM256 576h-128v64h128v-64zM512 576h-128v64h128v-64zM896 576 h-128v64h128v-64zM1024 640h128v-64h-128v64zM128 512h128q0 -33 18 -64h-137q-9 38 -9 64zM384 512h128v-64h-128v64zM768 512h128v-64h-128v64zM1143 448h-137q18 31 18 64h128q0 -26 -9 -64zM512 320h-294q-37 33 -54 64h348v-64zM768 384h348q-18 -32 -55 -64h-293v64z M512 192h-128v64h128v-64zM768 256h128v-64h-128v64zM512 64h-128v64h128v-64zM768 128h128v-64h-128v64zM384 0h128v-64h-128v64zM768 0h128v-64h-128v64zM384 -128h512v-64h-512v64z" /> +<glyph unicode="" d="M1408 1088q-133 0 -226.5 93.5t-93.5 226.5t93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5zM1408 1600q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136t-56 136t-136 56zM448 1152l384 -384l-384 -384v256h-320v256h320v256z M1152 1024h512q106 0 181 -75t75 -181v-256q0 -106 -75 -181t-181 -75v-512h-512v512q-106 0 -181 75t-75 181v256q0 106 75 181t181 75zM1792 512v256q0 53 -37.5 90.5t-90.5 37.5h-512q-53 0 -90.5 -37.5t-37.5 -90.5v-256q0 -53 37.5 -90.5t90.5 -37.5v256h128v-768h256 v768h128v-256q53 0 90.5 37.5t37.5 90.5z" /> +<glyph unicode="" d="M2048 1536v-256h-256v-256h-256v256h-256v256h256v256h256v-256h256zM1920 896v104q40 -57 72 -115t44 -87l12 -30q-5 -13 -15.5 -36t-51 -89.5t-90.5 -127t-136.5 -134.5t-186 -127t-242.5 -89.5t-302 -36.5q-125 0 -240 22t-204 59t-168 85t-136.5 101t-105 106 t-78.5 101t-52.5 85t-30.5 59l-9 22q3 9 9.5 24.5t31 63.5t54 95t79.5 110t106.5 117.5t136.5 110.5t168 95t202 63.5t237 24.5q71 0 128 -7v-192q-72 7 -128 7q-102 0 -196 -17.5t-166 -47t-136 -68t-110.5 -81t-85.5 -85t-64 -81t-42 -68t-24 -46.5l-8 -18 q4 -11 12.5 -29.5t41 -71.5t72.5 -101.5t110 -107.5t151 -101.5t197.5 -71.5t247.5 -29q103 0 197 17.5t166.5 47t136.5 68t110.5 81t85 85t63 81t42 68t24.5 46.5l7 18q-21 55 -71 128h135zM640 768q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5 t-112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5zM864 832q40 0 68 28t28 68t-28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28z" /> +<glyph unicode="" d="M1322 1207l209 209l-201 201l133 133l201 -201l201 201l133 -133l-201 -201l209 -209l-133 -133l-209 209l-209 -209zM1773 911l138 101q43 -60 77 -121t47 -92l13 -31q-5 -13 -15.5 -36t-51 -89.5t-90.5 -127t-136.5 -134.5t-186 -127t-242.5 -89.5t-302 -36.5 q-125 0 -240 22t-204 59t-168 85t-136.5 101t-105 106t-78.5 101t-52.5 85t-30.5 59l-9 22q3 9 9.5 24.5t31 63.5t54 95t79.5 110t106.5 117.5t136.5 110.5t168 95t202 63.5t237 24.5q99 0 193 -17l55 -77l-108 -108q-73 10 -140 10q-102 0 -196 -17.5t-166 -47t-136 -68 t-110.5 -81t-85.5 -85t-64 -81t-42 -68t-24 -46.5l-8 -18q4 -11 12.5 -29.5t41 -71.5t72.5 -101.5t110 -107.5t151 -101.5t197.5 -71.5t247.5 -29q103 0 197 17.5t166.5 47t136.5 68t110.5 81t85 85t63 81t42 68t24.5 46.5l7 18q-25 62 -83 143zM640 768q0 159 112.5 271.5 t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5zM864 832q40 0 68 28t28 68t-28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28z" /> +<glyph unicode="" d="M1920 896v-256h-467q-42 -140 -160.5 -230t-268.5 -90t-268.5 90t-160.5 230h-467v256h467q42 140 160.5 230t268.5 90t268.5 -90t160.5 -230h467zM1024 512q106 0 181 75t75 181t-75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75z" /> +<glyph unicode="" d="M1280 896v35q-58 35 -93 93t-35 128q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128t-93 -93v-35q0 -7 -0.5 -18t-5.5 -46t-13.5 -69t-27 -80t-43 -85.5t-64.5 -80t-88.5 -69t-118 -46.5t-151.5 -18q-128 0 -197 -83q69 -72 69 -173q0 -98 -76 -177t-180 -79 t-180 79t-76 177q0 69 35 127.5t93 92.5v840q-58 34 -93 92t-35 128q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128t-93 -92v-606q111 58 256 58q52 0 94.5 14t68.5 36.5t45 50t28 55t14 50t6 36.5v14zM640 1536q-53 0 -90.5 -37.5t-37.5 -90.5t37.5 -90.5 t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5zM1408 1024q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5zM640 0q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5 t90.5 -37.5z" /> +<glyph unicode="" d="M768 1188v-606q57 30 112 44t144 14q52 0 94.5 14t68.5 36.5t45 50t28 55t14 50t6 36.5v14h256q0 -7 -0.5 -18t-5.5 -46t-13.5 -69t-27 -80t-43 -85.5t-64.5 -80t-88.5 -69t-118 -46.5t-151.5 -18q-128 0 -197 -83q69 -72 69 -173q0 -98 -76 -177t-180 -79t-180 79 t-76 177q0 69 35 127.5t93 92.5v840q-58 34 -93 92t-35 128q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128t-93 -92zM1152 1405v3q0 106 75 181t181 75t181 -75t75 -181v-384h-512v381zM640 1536q-53 0 -90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5 t37.5 90.5t-37.5 90.5t-90.5 37.5zM1280 1408h256q0 53 -37.5 90.5t-90.5 37.5q-52 0 -90 -39.5t-38 -88.5zM640 0q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5z" /> +<glyph unicode="" d="M1152 1536h128q8 0 22 -1t53.5 -8.5t76 -20.5t81 -41.5t76 -67.5t53.5 -102.5t22 -142.5v-804q58 -34 93 -92.5t35 -127.5q0 -98 -76 -177t-180 -79t-180 79t-76 177q0 69 35 127.5t93 92.5v804q-1 5 -2.5 13.5t-10 31t-21.5 39t-37.5 30.5t-56.5 14h-128v-256l-384 384 l384 384v-256zM384 348v840q-58 34 -93 92t-35 128q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128t-93 -92v-840q58 -34 93 -92.5t35 -127.5q0 -98 -76 -177t-180 -79t-180 79t-76 177q0 69 35 127.5t93 92.5zM512 1280q53 0 90.5 37.5t37.5 90.5t-37.5 90.5 t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5zM512 0q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5zM1536 0q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5 t90.5 -37.5z" /> +<glyph unicode="" d="M384 348v840q-58 34 -93 92t-35 128q0 106 75 181t181 75t181 -75t75 -181q0 -120 -95 -198q18 -63 45 -119t76.5 -117.5t113 -105t160 -72t212.5 -28.5h36q34 58 92 93t128 35q106 0 181 -75t75 -181t-75 -181t-181 -75q-70 0 -128 35t-92 93h-36q-407 0 -640 242v-406 q58 -34 93 -92.5t35 -127.5q0 -98 -76 -177t-180 -79t-180 79t-76 177q0 69 35 127.5t93 92.5zM512 1280q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5zM1536 512q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5zM512 0q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5z" /> +<glyph unicode="" d="M2048 1152v-1408l-1024 512l-1024 -512v1408l1024 640zM1920 1024l-768 512v-448h-256v448l-768 -512v-1024l768 384v192h256v-192l768 -384v1024zM640 960h768v256l384 -384l-384 -384v256h-768v-256l-384 384l384 384v-256z" /> +<glyph unicode="" d="M2048 1280v-1536l-1024 512l-1024 -512v1536l1024 512zM1920 1152l-768 384v-192h-256v192l-768 -384v-1152l768 384v64h256v-64l768 -384v1152zM768 576v384q0 106 75 181t181 75t181 -75t75 -181v-384h-512zM320 832l320 256v-512zM896 960h256q0 53 -37.5 90.5 t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM1728 832l-320 -256v512z" /> +<glyph unicode="" d="M1024 1664q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM1024 51q146 0 278.5 57t228.5 153t153 228.5t57 278.5t-57 278.5t-153 228.5t-228.5 153t-278.5 57 t-278.5 -57t-228.5 -153t-153 -228.5t-57 -278.5t57 -278.5t153 -228.5t228.5 -153t278.5 -57zM960 1280h128q26 0 45 -19t19 -45v-576q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v576q0 26 19 45t45 19zM1024 512q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5 t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5z" /> +<glyph unicode="" d="M390 1583l99 -98q238 179 535 179q182 0 348 -71t286 -191t191 -286t71 -348q0 -186 -73 -355l-204 19q85 157 85 336q0 143 -55.5 273.5t-150 225t-225 150t-273.5 55.5q-219 0 -398 -125l81 -81l-341 -21zM1088 576h-128q-26 0 -45 19t-19 45v576q0 27 19 45.5t45 18.5 h128q26 0 45 -18.5t19 -45.5v-576q0 -26 -19 -45t-45 -19zM1341 270l341 21l-24 -338l-98 98q-240 -179 -536 -179q-182 0 -348 71t-286 191t-191 286t-71 348q0 186 73 355l204 -19q-85 -157 -85 -336q0 -143 55.5 -273.5t150 -225t225 -150t273.5 -55.5q219 0 398 125z M1024 256q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5z" /> +<glyph unicode="" d="M1592 1461l-107 -162q-199 173 -461 173q-143 0 -273.5 -55.5t-225 -150t-150 -225t-55.5 -273.5t55.5 -273.5t150 -225t225 -150t273.5 -55.5q137 0 262.5 51t218.5 138.5t152 209t68 256.5l195 49q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191 t-191 286t-71 348t71 348t191 286t286 191t348 71q159 0 304.5 -53t263.5 -150zM1536 1024l384 384l128 -128l-512 -512l-256 256l128 128zM1152 1216v-576q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v576q0 26 19 45t45 19h128q26 0 45 -19t19 -45zM1024 512 q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5z" /> +<glyph unicode="" d="M1577 1469h-611q-179 -15 -327 -111.5t-233.5 -252.5t-85.5 -337q0 -143 55.5 -273.5t150 -225t225 -150t273.5 -55.5q231 0 414.5 135t253.5 349l148 -148q-107 -237 -327.5 -382.5t-488.5 -145.5q-182 0 -348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191 t348 71q312 0 553 -195zM1660 832h-256q-5 0 -13.5 1.5t-30 9.5t-37.5 20t-29.5 37.5t-13.5 59.5v256q0 5 1 13.5t7.5 31t18.5 39t38.5 30.5t62.5 14h512q5 0 13.5 -1t31 -7.5t39 -18.5t30.5 -38.5t14 -62.5v-256q0 -35 -13 -61t-32 -38t-38 -19.5t-32 -8.5l-13 -1v-256z M1152 1216v-576q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v576q0 26 19 45t45 19h128q26 0 45 -19t19 -45zM1024 512q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5z" /> +<glyph unicode="" d="M1459 606l119 -606l-554 298l-554 -298l119 606l-461 422l627 77l269 559l269 -559l627 -77z" /> +<glyph unicode="" d="M384 1664h1280q96 0 176 -80t80 -176v-768q0 -96 -80 -176t-176 -80h-640l-512 -512v512h-128q-5 0 -14.5 0.5t-36 5.5t-50.5 14t-53.5 28t-51 45t-36 68.5t-14.5 94.5v768q0 96 80 176t176 80z" /> +<glyph unicode="" d="M1024 1664q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM1024 64q143 0 273.5 55.5t225 150t150 225t55.5 273.5t-55.5 273.5t-150 225t-225 150t-273.5 55.5 t-273.5 -55.5t-225 -150t-150 -225t-55.5 -273.5t55.5 -273.5t150 -225t225 -150t273.5 -55.5zM868 955h-217q9 214 149 304q88 57 218 57q170 0 282 -81t112 -241q0 -98 -48 -164q-29 -41 -110 -104l-53 -41q-44 -35 -57 -79q-10 -32 -10 -89h-204q4 126 24 176 q19 47 101 111l54 43q30 23 44 45q30 40 30 90q0 58 -34 104q-32 47 -121 47q-88 0 -124 -57q-36 -58 -36 -121zM925 415h225v-218h-225v218z" /> +<glyph unicode="" d="M2048 0h-2048l1024 1792zM256 128h1536l-768 1408zM1152 1088v-512h-256v512h256zM896 448h256v-192h-256v192z" /> +<glyph unicode="" d="M1454 530l530 -530q28 -48 28 -64t-28 -64l-64 -64q-28 -48 -64 -48t-64 48l-530 530q-209 -147 -462 -147q-217 0 -401.5 107.5t-291.5 292t-107 401.5q0 163 63.5 311t170.5 255t255 170.5t311 63.5t311.5 -63.5t255.5 -170.5t170.5 -255t63.5 -311q0 -253 -147 -462z M799 384q124 0 236.5 48.5t194 130t130 194t48.5 236.5q0 165 -81.5 305t-222 221.5t-305.5 81.5t-305 -81.5t-221.5 -221.5t-81.5 -305t81.5 -305.5t221.5 -222t305 -81.5z" /> +<glyph unicode="" d="M1024 1664q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM1728 691v161l-194 63l-46 110l88 187l-113 113l-182 -93l-111 46l-69 194h-160l-64 -194l-110 -46 l-187 88l-113 -113l93 -182l-46 -111l-194 -69v-161l194 -63l46 -110l-88 -187l113 -113l182 93l111 -46l69 -194h161l63 194l110 46l187 -88l113 113l-93 182l46 111zM1024 1025q106 0 181 -75t75 -182t-75 -182t-181 -75t-181.5 75.5t-75.5 181.5t75.5 181.5t181.5 75.5z M1024 640q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5z" /> +<glyph unicode="" d="M394 953q21 -23 21 -54t-21 -54q-22 -22 -53 -22t-52 22q-79 81 -120 184.5t-41 213.5t41 214t120 185q22 22 52.5 22t52.5 -22q21 -22 21 -54t-21 -54q-118 -119 -118 -291q0 -171 118 -290zM1759 1642q79 -81 120 -185t41 -214t-41 -213.5t-120 -184.5q-21 -22 -52 -22 t-52 22q-22 23 -22 54t22 54q117 120 117 290q0 171 -117 291q-22 22 -22 54t22 54t52 22t52 -22zM578 975q-31 0 -52 22q-100 103 -100 246q0 144 100 247q22 22 52.5 22t52.5 -22q22 -23 22 -54.5t-22 -53.5q-56 -56 -56 -139q0 -82 56 -139q22 -22 22 -53t-22 -54 q-22 -22 -53 -22zM1417 1490q22 22 52.5 22t52.5 -22q101 -104 99 -247q2 -142 -99 -246q-21 -22 -52 -22t-53 22t-22 53.5t22 53.5q56 57 56 139q0 83 -56 139q-22 22 -22 54t22 54zM1023 1017q-91 0 -155.5 66t-64.5 160t64.5 160.5t155.5 66.5t155.5 -66.5t64.5 -160.5 t-64.5 -160t-155.5 -66zM1024 906h1q81 0 151 39l403 -1073h-191l-44 128h-640l-46 -128h-190l402 1073q72 -39 154 -39zM960 704h128l-65 140zM832 384l194 67l190 -67l-64 192h-256zM1273 178l-248 155l-249 -148l-8 -57h512z" /> +<glyph unicode="" d="M1011 666l-552 -553l-66 -113l-281 -192l-46 64l178 264l127 65l552 553l-112 113l128 128q102 -11 175 62q72 74 61 175l559 560l313 -314l-559 -560q-102 12 -175 -61t-61 -175l-128 -128zM574 890l-1 1q-112 -38 -234 -10.5t-211 116.5q-143 144 -112 424l247 -248 l242 65l65 243l-247 247q108 31 223 1.5t200 -113.5q85 -86 114 -202t-3 -225l105 -104q-16 -7 -35.5 -7.5t-30.5 2.5l-12 4l-180 -180l112 -113l-72 -72zM1280 1216l64 -64l448 448l-64 64zM1152 1024l128 -128l64 64l-128 128zM960 768l128 128l-64 64l-128 -128z M1348 699l535 -536q60 -60 60 -151.5t-60 -139.5q-15 -23 -32 -37t-38.5 -19.5t-35.5 -6.5t-40 -1q-27 0 -41 1t-35.5 6.5t-38.5 19.5t-31 37l-608 609l71 72l113 -113l180 180q-14 40 1 79zM1835 43l-84 84l-103 -28l-28 -99l84 -64h103z" /> +<glyph unicode="" d="M1280 704h128v-576h-640v-384l-768 384v1664h1408v-576h-128v448h-1024l512 -256v-1152h512v448zM1536 576v256h-512v256h512v256l512 -384z" /> +<glyph unicode="" d="M1571 1617q119 59 237.5 102t177.5 57l60 14q-5 -23 -15.5 -65t-54.5 -166.5t-103 -243.5q-139 15 -212 90q-75 73 -90 212zM1728 1472l192 192q-53 -10 -117 -42t-101 -59l-38 -27zM419 884l356 66q100 139 221 260q191 190 436 332q32 -151 124 -242q91 -92 242 -124 q-142 -245 -332 -436q-124 -124 -260 -219l-66 -358l-419 -419l-11 373l268 269q-86 -42 -167 -68.5t-119 -32.5l-39 -6l-118 118q1 14 5 40.5t29.5 110t66.5 169.5l-263 -263l-373 11zM1159 780q80 75 140.5 142t241.5 284q-52 36 -85 86.5t-40 83.5l-8 32 q-100 -64 -212 -160t-174 -160l-62 -64q42 -128 199 -244zM704 640l128 -128q112 91 175 147q-60 48 -104 107t-57 94l-14 36zM768 448l-128 128v-128l64 -64z" /> +<glyph unicode="" d="M512 1536q174 0 340 -46t306.5 -128.5t258.5 -200.5t200.5 -258.5t128.5 -306.5t46 -340q0 -5 -1 -13.5t-7.5 -31t-18.5 -39t-38.5 -30.5t-62.5 -14q-26 0 -47 7t-34 18.5t-23 25t-14 27t-6.5 25t-3.5 18.5v7q0 209 -81 398.5t-218 326.5t-326.5 218t-398.5 81 q-5 0 -13.5 1t-31 7.5t-39 18.5t-30.5 38.5t-14 62.5q0 26 7 47t18.5 34t25 23t27 14t25 6.5t18.5 3.5h7zM512 1024q209 0 385.5 -103t279.5 -279.5t103 -385.5q0 -5 -1 -13.5t-7.5 -31t-18.5 -39t-38.5 -30.5t-62.5 -14q-26 0 -47 7t-34 18.5t-23 25t-14 27t-6.5 25 t-3.5 18.5v7q0 212 -150 362t-362 150q-5 0 -13.5 1t-31 8.5t-39 19.5t-30.5 38t-14 61t13 61t32 38t38 19.5t32 8.5zM512 512q106 0 181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181t75 181t181 75z" /> +<glyph unicode="" d="M1600 256h128v-320q0 -49 -38 -88.5t-90 -39.5h-1280q-52 0 -90 39.5t-38 88.5v1472q0 53 37.5 90.5t90.5 37.5h384q0 106 75 181t181 75t181 -75t75 -181h384q53 0 90.5 -37.5t37.5 -90.5v-640h-128v384h-1280v-1216h1280v320zM448 1280h1024l-384 256q0 53 -37.5 90.5 t-90.5 37.5t-90.5 -37.5t-37.5 -90.5zM960 1472q-26 0 -45 19t-19 45t19 45t45 19t45 -19t19 -45t-19 -45t-45 -19zM1152 1344h-384q0 3 0.5 7t4 15t9.5 19.5t19 15.5t31 7h256q28 0 44 -16t18 -32zM448 1024h256v-64h-256v64zM960 960h-192v64h192v-64zM1344 960h-320v64 h320v-64zM448 896h64v-64h-64v64zM576 896h320v-64h-320v64zM1984 640v-256h-512v-256l-512 384l512 384v-256h512zM1152 832h-192v64h192v-64zM448 768h192v-64h-192v64zM960 704h-256v64h256v-64zM448 640h128v-64h-128v64zM640 640h192v-64h-192v64zM448 512h384v-64 h-384v64zM448 384h192v-64h-192v64zM704 384h256v-64h-256v64zM448 256h128v-64h-128v64zM768 192h-128v64h128v-64zM832 256h256v-64h-256v64zM448 128h256v-64h-256v64zM1024 64h-256v64h256v-64zM1088 128h192v-64h-192v64z" /> +<glyph unicode="" d="M1273 1501q-48 -63 -123.5 -102.5t-151.5 -37.5q-13 73 13.5 148.5t75.5 135.5q50 60 126 101.5t147 45.5q22 -150 -87 -291zM1738 1191q-73 -40 -121.5 -102.5t-67 -131t-12 -142.5t36.5 -138.5t86 -118t130 -81.5q-53 -119 -115 -217q-35 -53 -64 -90.5t-70.5 -80.5 t-86.5 -66t-92 -23q-39 0 -75 11.5t-62 26t-71 26.5t-98 12t-98 -12.5t-71.5 -26.5t-63 -25.5t-75.5 -11.5q-47 0 -92 21t-84.5 60t-69 76.5t-62.5 88.5q-102 156 -148 329.5t-32.5 321.5t78.5 249q68 106 169.5 166.5t204.5 60.5q73 0 180.5 -38.5t162.5 -38.5q45 0 97 19 t113.5 38.5t130.5 19.5q91 0 182 -48t160 -134z" /> +<glyph unicode="" d="M976 487l-37 -19q-80 50 -150 79t-154 34q-197 14 -376 -73l-39 21l190 653q7 5 20 13t57 27.5t91 33t119.5 21.5t145.5 1q90 -8 164 -42t159 -92zM1227 1053l41 21q163 -108 311 -125q104 -12 210.5 8.5t161.5 46.5l55 27l41 -20l-193 -667q-68 -37 -204.5 -70 t-267.5 -18q-160 20 -345 141zM1 -256l189 674q7 5 20 13t57 27t91.5 32.5t119.5 21.5t145 2q90 -8 164 -42t159 -92l-190 -636l-37 -64q-56 41 -92.5 63.5t-95 43.5t-116.5 21q-109 0 -162 -2t-116.5 -17t-97.5 -45h-38zM1008 289l41 21q160 -107 311 -125q71 -7 134.5 -2 t117 19t92 28.5t60.5 25.5l22 11l42 -21l-194 -694q-22 0 -99.5 -16t-181.5 -32t-190 -16q-166 0 -346 128z" /> +<glyph unicode="" d="M576 1792h896q53 0 90.5 -37.5t37.5 -90.5v-1792q0 -49 -38 -88.5t-90 -39.5h-896q-52 0 -90 39.5t-38 88.5v1792q0 53 37.5 90.5t90.5 37.5zM1152 1664h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45t-19 45t-45 19zM1472 1408h-896v-1280h896v1280z M1024 -192q52 0 90 39.5t38 88.5q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5q0 -49 38 -88.5t90 -39.5z" /> +<glyph unicode="" d="M1527 1556l-100 -192q109 -122 109 -276h-1024q0 155 109 277l-100 189q-14 25 -7 53t30 42q23 15 48.5 7.5t38.5 -32.5l92 -173q136 85 301 85t301 -85l92 175q13 25 38.5 32.5t48.5 -6.5q23 -15 30 -43t-7 -53zM832 1213q26 0 45 18.5t19 45.5q0 26 -19 45t-45 19 t-45 -19t-19 -45q0 -27 19 -45.5t45 -18.5zM1216 1213q26 0 45 18.5t19 45.5q0 26 -19 45t-45 19t-45 -19t-19 -45q0 -27 19 -45.5t45 -18.5zM256 421v567q0 41 28 70t68 29t68 -29t28 -70v-567q0 -41 -28 -70.5t-68 -29.5t-68 29.5t-28 70.5zM1600 421v567q0 41 28 70 t68 29t68 -29t28 -70v-567q0 -41 -28 -70.5t-68 -29.5t-68 29.5t-28 70.5zM512 1021h1024v-766q0 -53 -37.5 -90.5t-90.5 -37.5h-128v-191q0 -49 -28.5 -88.5t-67.5 -39.5t-67.5 39.5t-28.5 88.5v191h-128v-191q0 -49 -28.5 -88.5t-67.5 -39.5t-67.5 39.5t-28.5 88.5v191 h-128q-53 0 -90.5 37.5t-37.5 90.5v766z" /> +<glyph unicode="" d="M1728 1152l-896 -896l-448 448l192 192l256 -256l704 704z" /> +<glyph unicode="" d="M1920 1408v-1280h-1792v1280h1792zM348 1280l676 -528l672 528h-1348zM256 348l543 426l-543 412v-838zM1792 1186l-543 -412l543 -426v838zM1696 256l-560 433l-112 -85l-114 86l-562 -434h1348z" /> +<glyph unicode="" d="M1920 -128h-1792v1280l128 91v293h410l358 256l358 -256h410v-293l128 -91v-1280zM888 1536h272l-136 100zM384 996l640 -500l640 503v409h-1280v-412zM768 1216h-256v64h256v-64zM1536 1088h-1024v64h1024v-64zM1408 960h-768v64h768v-64zM256 92l543 426l-543 412v-838 zM1792 930l-543 -412l543 -426v838zM1280 832h-512v64h512v-64zM1088 704h-128v64h128v-64zM1696 0l-560 433l-112 -85l-114 86l-562 -434h1348z" /> +<glyph unicode="" d="M1664 640h-384v-512h-512v512h-384l640 768z" /> +<glyph unicode="" d="M896 128v384h-512v512h512v384l768 -640z" /> +<glyph unicode="" d="M1664 896l-640 -768l-640 768h384v512h512v-512h384z" /> +<glyph unicode="" d="M1664 1024v-512h-512v-384l-768 640l768 640v-384h512z" /> +<glyph unicode="" d="M612 896q-100 -70 -100 -153q0 -117 143.5 -206t368.5 -89t368 89t143 206q0 101 -137 176q-58 56 -118 169v192q0 13 1 24t4 20.5t4.5 15t7.5 14t7 10t9 10.5t9 10q47 42 47 90q0 83 -91 136.5t-254 53.5q-164 0 -261.5 -54t-97.5 -136q0 -48 46 -89q5 -6 19 -19t20 -21 t12 -25t6 -40v-192q-10 -20 -22 -39.5t-23.5 -35.5t-23.5 -30.5t-23 -26t-21 -21.5t-18 -17t-13.5 -12t-8.5 -8zM1022 -256l127 576q-60 -6 -122 -6q-70 0 -130 7z" /> +<glyph unicode="" d="M1792 1021v-383h-768v328h-64v-328h-768v383h493q-94 42 -160 126t-77 182q-14 125 65 204t205 65q80 -9 153 -56t121 -118q48 71 121 118t153 56q126 14 205 -65t65 -204q-11 -98 -77 -182t-160 -126h493zM768 1109q79 -9 129 41t41 130t-71.5 143t-141.5 71 q-80 9 -130 -41t-41 -130q9 -79 71.5 -142t142.5 -72zM1046 1280q-9 -80 41 -130t129 -41t142 72t72 142q9 80 -41 130t-130 41q-79 -8 -141.5 -71t-71.5 -143zM320 575h640v-639h-640v639zM1024 575h640v-639h-640v639z" /> +<glyph unicode="" d="M2048 -128v-128h-2048v2048h256v-64h-128v-128h128v-64h-128v-128h128v-64h-128v-128h128v-64h-128v-128h128v-64h-128v-128h128v-64h-128v-128h128v-64h-128v-128h128v-64h-128v-128h128v-64h-128v-128h128v-64h-128v-128h1920zM1408 0h-384v1472h384v-1472zM1920 0 h-384v1088h384v-1088zM896 0h-384v832h384v-832z" /> +<glyph unicode="" d="M1734 1160l180 180q6 -40 6 -60q0 -159 -112.5 -271.5t-271.5 -112.5q-53 0 -110 18l-548 -548q18 -57 18 -110q0 -159 -112.5 -271.5t-271.5 -112.5h-60l180 186l-68 253l-253 68l-178 -177q-5 45 -5 54q0 159 112.5 271.5t271.5 112.5q53 0 110 -18l548 548 q-18 57 -18 110q0 159 112.5 271.5t271.5 112.5q9 0 54 -5l-177 -178l68 -253z" /> +<glyph unicode="" d="M128 1408h1792q53 0 90.5 -37.5t37.5 -90.5v-1024q0 -53 -37.5 -90.5t-90.5 -37.5h-1792q-53 0 -90.5 37.5t-37.5 90.5v1024q0 53 37.5 90.5t90.5 37.5zM627 896l205 256h1088v64q-1 1 0 7t-2.5 15.5t-8.5 19t-19 16t-34 6.5h-1664q-20 0 -34 -6.5t-19.5 -16t-8.5 -19 t-2 -16.5v-6v-64h397l-205 -256h-192v-576q1 -1 0 -7t2.5 -15.5t8.5 -19t19 -16t34 -6.5h1664q20 0 34 6.5t19.5 16t8.5 19t2 16.5v6v576h-1293zM640 1152h77l-205 -256h-77zM256 768h1088v-128h-1088v128zM1792 640h-320v128h320v-128zM768 512h-512v64h512v-64zM832 576 h256v-64h-256v64zM256 448h256v-64h-256v64zM576 448h256v-64h-256v64zM1664 448h128v-64h-128v64z" /> +<glyph unicode="" d="M1024 1664q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM1024 66q191 0 352.5 94t255.5 255.5t94 352.5t-94 352.5t-255.5 255.5t-352.5 94t-352.5 -94 t-255.5 -255.5t-94 -352.5t94 -352.5t255.5 -255.5t352.5 -94zM1408 832l64 -64l-64 -64h-448v640l64 64l64 -64v-512h320z" /> +<glyph unicode="" d="M2048 1024l-1024 -1024l-1024 1024l512 512h1024zM1024 192l832 832l-384 384h-896l-384 -384zM1728 1024l-704 -704v1024h384z" /> +<glyph unicode="" d="M613 248l11 -153q-224 112 -360 327t-136 474q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348q0 -259 -136 -474t-360 -327l11 153q164 104 260.5 275.5t96.5 372.5q0 209 -103 385.5t-279.5 279.5t-385.5 103t-385.5 -103t-279.5 -279.5 t-103 -385.5q0 -201 96.5 -372.5t260.5 -275.5zM1447 416l15 215q75 124 75 265q0 139 -68.5 257t-187 186.5t-257.5 68.5q-212 0 -362 -150t-150 -362q0 -142 74 -265l15 -215q-102 90 -159.5 214.5t-57.5 265.5q0 130 51 248.5t136.5 204t204 136.5t248.5 51t248.5 -51 t204 -136.5t136.5 -204t51 -248.5q0 -141 -57.5 -265.5t-159.5 -214.5zM1216 1024q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 768h256q39 0 67 -13t39.5 -32t17 -38t4.5 -32v-13v-256q0 -3 0.5 -7.5t-1 -17.5t-5 -25.5t-13 -27 t-22.5 -25t-35.5 -18t-51.5 -7.5v-512h-256v512q-39 0 -67 13t-39.5 32t-17 38t-4.5 32v13v256q0 3 -0.5 7.5t1 17.5t5 25.5t13 27t22.5 25t35.5 18t51.5 7.5z" /> +<glyph unicode="" d="M1920 896v-128l-64 -64h-64l-64 64h-64l-64 64l-128 -128h-64l-128 128l-128 -128l-64 64l-64 -64h-128v-128q0 -3 -0.5 -7t-4 -15t-10 -19.5t-19.5 -15.5t-30 -7h-64q0 -5 -1 -13.5t-7.5 -31t-18.5 -39t-38.5 -30.5t-62.5 -14h-256q-9 -1 -23 0t-48 16.5t-57 47.5 q-42 58 -67.5 95.5t-58.5 93.5t-49.5 104.5t-16.5 90.5q0 36 9.5 72.5t36 84t40 70.5t56 84.5t50.5 72.5q18 26 50 41t55 17l23 2q124 4 256 4q37 0 64 -13t38.5 -32t18 -38t7.5 -32v-13h64q3 0 7 -0.5t15 -4t19.5 -9.5t15.5 -19t7 -31v-128h960zM640 959l-64 193h-192z M384 704l128 128l-128 128l-128 -128zM640 705l-256 -193h192z" /> +<glyph unicode="" d="M384 1790h1280q5 1 13.5 2t30 -2.5t38 -14.5t31 -40t15.5 -73v-1534q0 -5 -0.5 -13.5t-6.5 -31t-18 -39t-38.5 -30.5t-64.5 -14h-256v128h192q3 0 7 0.5t15 4t19.5 10t15.5 19.5t7 30v191h-256v128h256v1151h-1024v-1151h256v-128h-512v-191v-7t3.5 -15t9.5 -19.5 t19.5 -15.5t31.5 -7h192v127h256v-255l-256 -256v256h-256q-34 0 -59.5 11.5t-38 27t-20 36t-9 32t-1.5 20.5v1535q0 36 13 63t32 38.5t38 18.5t32 8h13zM1536 639h-256v-895h-256v895h-256l288 384h-288l384 511l384 -511h-288z" /> +<glyph unicode="" d="M384 512h1152v-384q0 -5 -0.5 -13.5t-6.5 -31t-18 -39t-38.5 -30.5t-64.5 -14h-640v-256l-192 192l-192 -192v256h-256q-42 0 -70.5 16.5t-39.5 41.5t-14.5 41t-3.5 29v1536q0 36 13 63t32 38.5t38 18.5t32 8h13h1280q5 0 13.5 -1t30 -7.5t38.5 -18.5t31 -38.5t15 -62.5 h-1152v-1152zM1110 1541l95 -96q130 100 297.5 89t286.5 -129q137 -139 129 -336l-130 -26q10 74 -13 145.5t-77 125.5q-81 82 -195.5 92.5t-206.5 -51.5l85 -86l-316 -45zM640 1408h-128v128h128v-128zM640 1152h-128v128h128v-128zM1563 907l316 45l-45 -317l-95 96 q-130 -100 -297.5 -89t-286.5 129q-137 139 -129 336l130 26q-10 -74 13 -145.5t77 -125.5q81 -82 195.5 -92.5t206.5 51.5zM640 896h-128v128h128v-128zM512 766l128 2v-128h-128v126zM128 384v-192q0 -3 0.5 -7t4 -15t9.5 -19.5t19 -15.5t31 -7q34 0 101 -0.5t91 -0.5v128 h384v-128l576 1q3 0 7 0.5t15 4t19.5 10t15.5 19.5t7 30v192h-1280z" /> +<glyph unicode="" d="M384 512h1152v-384q0 -5 -0.5 -13.5t-6.5 -31t-18 -39t-38.5 -30.5t-64.5 -14h-640v-256l-192 192l-192 -192v256h-256q-42 0 -70.5 16.5t-39.5 41.5t-14.5 41t-3.5 29v1536q0 36 13 63t32 38.5t38 18.5t32 8h13h960v-128h-704v-1152zM1280 1792h704q3 0 7 -0.5t15 -4 t19.5 -10t15.5 -19.5t7 -30v-896q0 -28 -16 -44t-32 -18l-16 -2h-384v-128l-98 64l-94 -64v128h-128q-3 0 -7 0.5t-15 4t-19.5 10t-15.5 19.5t-7 30v896q0 28 16 44t32 18zM1920 1664h-448v-512h448v512zM640 1408h-128v128h128v-128zM832 960v512l256 -256zM640 1152h-128 v128h128v-128zM640 896h-128v128h128v-128zM1920 1024h-576v-128h64v64h192v-64h320v128zM512 766l128 2v-128h-128v126zM128 384v-192q0 -3 0.5 -7t4 -15t9.5 -19.5t19 -15.5t31 -7q34 0 101 -0.5t91 -0.5v128h384v-128l576 1q3 0 7 0.5t15 4t19.5 10t15.5 19.5t7 30v192 h-1280z" /> +<glyph unicode="" d="M1920 1408v-1408h-128v1344l-320 320h-1088v128h1152zM1280 1536l384 -384v-1408h-1536v1792h1152zM1536 1088l-320 320h-960v-1536h1280v1216zM1024 960h256v-256h-256v-256h-256v256h-256v256h256v256h256v-256zM512 320h768v-256h-768v256z" /> +<glyph unicode="" d="M1024 1472q157 0 298 -39t241.5 -101t185.5 -137t138.5 -150t91 -137t53.5 -101l16 -39q-5 -13 -15.5 -36t-51 -89.5t-90.5 -127t-136.5 -134.5t-186 -127t-242.5 -89.5t-302 -36.5q-125 0 -240 22t-204 59t-168 85t-136.5 101t-105 106t-78.5 101t-52.5 85t-30.5 59 l-9 22q3 9 9.5 24.5t31 63.5t54 95t79.5 110t106.5 117.5t136.5 110.5t168 95t202 63.5t237 24.5zM1024 256q103 0 197 17.5t166.5 47t136.5 68t110.5 81t85 85t63 81t42 68t24.5 46.5l7 18q-4 11 -12.5 29.5t-41.5 71.5t-73 101.5t-110.5 107.5t-151 101.5t-197 71.5 t-246.5 29q-102 0 -196 -17.5t-166 -47t-136 -68t-110.5 -81t-85.5 -85t-64 -81t-42 -68t-24 -46.5l-8 -18q4 -11 12.5 -29.5t41 -71.5t72.5 -101.5t110 -107.5t151 -101.5t197.5 -71.5t247.5 -29zM1024 1152q159 0 271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5 t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5zM864 832q40 0 68 28t28 68t-28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28z" /> +<glyph unicode="" d="M1472 704h-512q-8 0 -21 1t-46 11t-58 28t-46 58t-21 94v512q0 8 1 21t11 46t28 58t58 46t94 21h896q8 0 21 -1t46 -11.5t58 -28.5t46 -57.5t21 -93.5v-512q0 -53 -20 -92.5t-48 -57.5t-56 -28.5t-48 -11.5l-20 -2h-64v-320zM640 1216v-320q0 -7 0.5 -18.5t6.5 -44.5 t17 -63.5t35 -67t56.5 -63.5t85.5 -45t119 -18h320v-64q0 -54 -20 -93.5t-48 -57.5t-56 -28.5t-48 -11.5l-20 -1h-512l-320 -320v320h-64q-8 0 -21 1.5t-46 12.5t-58 29t-46 57t-21 92v512q0 54 20 93.5t48 57.5t56 28.5t48 11.5l20 1h448z" /> +<glyph unicode="" d="M1024 1664q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM1024 64q143 0 273.5 55.5t225 150t150 225t55.5 273.5t-55.5 273.5t-150 225t-225 150t-273.5 55.5 t-273.5 -55.5t-225 -150t-150 -225t-55.5 -273.5t55.5 -273.5t150 -225t225 -150t273.5 -55.5zM1409 994l-225 -225l225 -223l-159 -163l-226 226l-226 -226l-159 159l225 227l-225 225l159 159l226 -224l222 224z" /> +<glyph unicode="" d="M640 1155l-384 320l384 317v-188h384q3 1 7.5 1.5t17.5 0.5t25.5 -3t27 -11.5t25 -22t18 -38t7.5 -56.5v-769h-256v641h-256v-192zM1920 1088v-1280h-1792v1280h640v-128h-420l676 -528l672 528h-416v128h640zM256 28l544 426l-544 412v-838zM1792 866l-543 -412 l543 -426v838zM1696 -64l-560 433l-112 -85l-114 86l-562 -434h1348z" /> +<glyph unicode="" d="M1024 251q-212 0 -362 150t-150 362t150 362t362 150t362 -150t150 -362t-150 -362t-362 -150z" /> +<glyph unicode="" d="M1536 1280v-1024h-1024v1024h1024z" /> +<glyph unicode="" d="M1792 768l128 -128l-768 -768l-1024 1024v512l256 256h512l128 -128v-204l-204 204h-372l-192 -192v-384l896 -896l564 576l-128 128h204zM1920 1408v-256h-256v-256h-256v256h-256v256h256v256h256v-256h256zM576 1408q80 0 136 -56t56 -136t-56 -136t-136 -56t-136 56 t-56 136t56 136t136 56zM576 1152q26 0 45 19t19 45t-19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19zM1152 256l-512 512l384 384l512 -512zM832 768l320 -316l196 188l-324 324z" /> +<glyph unicode="" d="M1322 1207l209 209l-201 201l133 133l201 -201l201 201l133 -133l-201 -201l209 -209l-133 -133l-209 209l-209 -209zM1600 960l320 -320l-768 -768l-1024 1024v512l256 256h512l320 -320l-96 -96l-288 288h-384l-192 -192v-384l896 -896l576 576l-224 224zM576 1408 q80 0 136 -56t56 -136t-56 -136t-136 -56t-136 56t-56 136t56 136t136 56zM576 1152q26 0 45 19t19 45t-19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19zM1152 256l-512 512l384 384l512 -512zM832 768l320 -316l196 188l-324 324z" /> +<glyph unicode="" d="M1792 1536v-256h-256v-256h-256v256h-256v256h256v256h256v-256h256zM768 1188v-606q111 58 256 58q52 0 94.5 14t68.5 36.5t45 50t28 55t14 50t6 36.5v14h256q0 -7 -0.5 -18t-5.5 -46t-13.5 -69t-27 -80t-43 -85.5t-64.5 -80t-88.5 -69t-118 -46.5t-151.5 -18 q-128 0 -197 -83q69 -72 69 -173q0 -106 -75 -181t-181 -75t-181 75t-75 181q0 70 35 128t93 93v839q-58 34 -93 92.5t-35 127.5q0 106 75 181t181 75t181 -75t75 -181q0 -69 -35 -127.5t-93 -92.5zM640 1536q-53 0 -90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5zM640 0q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5z" /> +<glyph unicode="" d="M1750 1207l-133 -133l-209 209l-209 -209l-133 133l209 209l-201 201l133 133l201 -201l201 201l133 -133l-201 -201zM1408 1088l128 -128v-64q0 -7 -0.5 -18t-5.5 -46t-13.5 -69t-27 -80t-43 -85.5t-64.5 -80t-88.5 -69t-118 -46.5t-151.5 -18q-128 0 -197 -83 q69 -72 69 -173q0 -106 -75 -181t-181 -75t-181 75t-75 181q0 70 35 128t93 93v839q-58 34 -93 92.5t-35 127.5q0 106 75 181t181 75t181 -75t75 -181q0 -69 -35 -127.5t-93 -92.5v-606q111 58 256 58q52 0 94.5 14t68.5 36.5t45 50t28 55t14 50t6 36.5v14v64zM640 1536 q-53 0 -90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5zM640 0q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5z" /> +<glyph unicode="" d="M1920 1280l-192 -192l-384 384l192 192zM1280 1408l384 -384l-1152 -1153h-384v385zM512 128h-128v128h-128v-256h256v128z" /> +<glyph unicode="" d="M1024 1664q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM1024 64q143 0 273.5 55.5t225 150t150 225t55.5 273.5t-55.5 273.5t-150 225t-225 150t-273.5 55.5 t-273.5 -55.5t-225 -150t-150 -225t-55.5 -273.5t55.5 -273.5t150 -225t225 -150t273.5 -55.5zM1024 1024q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5zM1152 768v-320q0 -35 13 -61.5t32 -38.5t38 -19t32 -8l13 -1 v-64h-256q-5 0 -13.5 1t-31 7.5t-39 18.5t-30.5 38.5t-14 62.5v320q0 35 -13 61.5t-32 38.5t-38 19t-32 8l-13 1v64h256q5 0 13.5 -0.5t31 -7t39 -18.5t30.5 -38.5t14 -63.5z" /> +<glyph unicode="" d="M1536 768l-768 -767v1535z" /> +<glyph unicode="" d="M1792 1024l-768 -767l-767 767h1535z" /> +<glyph unicode="" d="M512 448h86q66 -113 171 -192h-257q-212 0 -362 150t-150 362t150 362t362 150h384q212 0 362 -150t150 -362q0 -102 -38 -192h-219q65 88 65 192q0 133 -93.5 226.5t-226.5 93.5h-384q-133 0 -226.5 -93.5t-93.5 -226.5t93.5 -226.5t226.5 -93.5zM1279 1280h257 q212 0 362 -150t150 -362t-150 -362t-362 -150h-384q-212 0 -362 150t-150 362q0 99 38 192h219q-65 -88 -65 -192q0 -133 93.5 -226.5t226.5 -93.5h384q133 0 226.5 93.5t93.5 226.5t-93.5 226.5t-226.5 93.5h-86q-66 113 -171 192z" /> +<glyph unicode="" d="M1664 896v-256h-512v-512h-256v512h-512v256h512v512h256v-512h512z" /> +<glyph unicode="" d="M1664 1408v-256h-1280v256h1280zM1664 896v-256h-1280v256h1280zM1664 384v-256h-1280v256h1280z" /> +<glyph unicode="" d="M897 1226l-428 -458l428 -458l-171 -184l-599 642l599 642zM1922 768l-600 -642l-171 184l428 458l-428 458l171 184z" /> +<glyph unicode="" d="M1024 1792q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5q0 -99 -66 -280.5t-160 -369.5t-188 -362t-160 -285l-66 -111q-26 43 -69 116t-153.5 274t-195 373.5t-153.5 359t-69 285.5q0 130 51 248.5t136.5 204t204 136.5t248.5 51zM1024 896q106 0 181 75t75 181 t-75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75z" /> +<glyph unicode="" d="M256 1408h256v-256h-256v256zM1792 1408v-256h-1152v256h1152zM256 896h256v-256h-256v256zM640 896h1152v-256h-1152v256zM256 384h256v-256h-256v256zM640 384h1152v-256h-1152v256z" /> +<glyph unicode="" d="M256 1664h128v-384h-128v192h-128v128h128v64zM1920 1664v-256h-1344v256h1344zM128 1152h256v-166l-128 -154h128v-64h-256v104l128 154v62h-64v-64h-64v128zM576 1152h1344v-256h-1344v256zM320 640l64 -64v-64l-64 -64l64 -64v-64l-64 -64h-192v64h64l64 64l-64 64 h-64v64h64l64 64h-128v64h192zM576 640h1344v-256h-1344v256zM256 128h128v-384h-128v128h-128v256h64v-192h64v192zM576 128h1344v-256h-1344v256z" /> +<glyph unicode="" d="M384 256v512q0 212 150 362t362 150v-256q-106 0 -181 -75t-75 -181h256v-512h-512zM1664 1280v-256q-106 0 -181 -75t-75 -181h256v-512h-512v512q0 212 150 362t362 150z" /> +<glyph unicode="" d="M1920 1408v-1280h-1024v1280h1024zM512 1280h256v-128h-128v-768h128v-128h-256v1024zM128 1152h256v-128h-128v-512h128v-128h-256v768zM1664 1152h-512v-768h512v768z" /> +<glyph unicode="" d="M1792 1536v-1536h-1536v1536h1536zM1664 1408h-1280v-1280z" /> +<glyph unicode="" d="M256 1024h-128v512h512v-128h-384v-384zM1920 1536v-512h-128v384h-384v128h512zM384 1280h1280v-1024h-1280v1024zM640 512h768v512h-768v-512zM256 128h384v-128h-512v512h128v-384zM1792 512h128v-512h-512v128h384v384z" /> +<glyph unicode="" d="M384 1664h128v-384h-384v128h256v256zM1920 1408v-128h-384v384h128v-256h256zM512 1152h1024v-768h-1024v768zM768 640h512v256h-512v-256zM128 256h384v-384h-128v256h-256v128zM1536 256h384v-128h-256v-256h-128v384z" /> +<glyph unicode="" d="M640 1728v-128q0 -3 -0.5 -7t-5 -15t-11 -19.5t-20 -15.5t-31.5 -7q-28 0 -43 16t-16 32l-1 16v128q0 3 0.5 7t4 15t9.5 19.5t19 15.5t31 7q28 0 44 -16t18 -32zM1536 1728v-128q0 -3 -0.5 -7t-5 -15t-11 -19.5t-20 -15.5t-31.5 -7q-28 0 -43 16t-16 32l-1 16v128 q0 3 0.5 7t4 15t9.5 19.5t19 15.5t31 7q28 0 44 -16t18 -32zM1984 1664v-1792h-1920v1792h320v-64q0 -8 0.5 -21t10 -46t27 -58t58 -46t96.5 -21t96.5 20t58 48t27 56t10.5 48v20v64h512v-64q0 -8 0.5 -21t10 -46t27 -58t58 -46t96.5 -21t96.5 20t58 48t27 56t10.5 48v20v64 h320zM1856 1280h-1664v-1280h1664v1280zM960 896h-256v256h256v-256zM1344 896h-256v256h256v-256zM1728 896h-256v256h256v-256zM576 512h-256v256h256v-256zM960 512h-256v256h256v-256zM1344 512h-256v256h256v-256zM1728 512h-256v256h256v-256zM576 128h-256v256h256 v-256zM960 128h-256v256h256v-256zM1344 128h-256v256h256v-256z" /> +<glyph unicode="" d="M1536 1280h384q5 0 13.5 -1t31 -7.5t39 -18.5t30.5 -38.5t14 -62.5v-768q0 -26 -7 -47t-18.5 -34t-25 -23t-27 -14t-25 -6.5t-18.5 -3.5h-7h-384v-256q0 -69 -94 -128t-256.5 -93.5t-353.5 -34.5t-353.5 34.5t-256.5 93.5t-94 128v1536q0 69 94 128t256.5 93.5 t353.5 34.5t353.5 -34.5t256.5 -93.5t94 -128v-256zM832 1408q212 0 362 37.5t150 90.5t-150 90.5t-362 37.5t-362 -37.5t-150 -90.5t150 -90.5t362 -37.5zM512 1088l-128 64v-1024l128 -64v1024zM1280 1152l-128 -64v-1024l128 64v1024zM896 1024h-128v-1024h128v1024z M1792 1024h-256v-512h256v512z" /> +<glyph unicode="" d="M1472 960h128q53 0 90.5 -37.5t37.5 -90.5v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1152q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h128v333q0 180 131.5 307.5t316.5 127.5t316.5 -127.5t131.5 -307.5v-333zM1280 960v320q0 106 -75 181t-181 75 t-181 -75t-75 -181v-320h512zM1280 832h-768q-28 0 -44 -16t-18 -32l-2 -16v-768q0 -3 0.5 -7t4 -15t9.5 -19.5t19 -15.5t31 -7h768v128h-704v128h704v128h-704v128h704v128h-704v128h704v128z" /> +<glyph unicode="" d="M256 1664h1536q35 0 61 -13t38 -32t19.5 -38t8.5 -32l1 -13v-1536q0 -35 -13 -61t-32 -38t-38 -19.5t-32 -8.5l-13 -1h-1536q-26 0 -47 7t-34 18.5t-23 25t-14 27t-6.5 25t-3.5 18.5v7v1536q0 26 7 47t18.5 34t25 23t27 14t25 6.5t18.5 3.5h7zM1728 128v1280q0 3 -0.5 7 t-4 15t-9.5 19.5t-19 15.5t-31 7h-1280q-3 0 -7 -0.5t-15 -4t-19.5 -9.5t-15.5 -19t-7 -31v-1280q0 -3 0.5 -7t4 -15t9.5 -19.5t19 -15.5t31 -7h1280q3 0 7 0.5t15 4t19.5 9.5t15.5 19t7 31zM1152 896h256v-256h-256v-256h-256v256h-256v256h256v256h256v-256z" /> +<glyph unicode="" d="M256 1664h1536q35 0 61 -13t38 -32t19.5 -38t8.5 -32l1 -13v-1536q0 -35 -13 -61t-32 -38t-38 -19.5t-32 -8.5l-13 -1h-1536q-26 0 -47 7t-34 18.5t-23 25t-14 27t-6.5 25t-3.5 18.5v7v1536q0 26 7 47t18.5 34t25 23t27 14t25 6.5t18.5 3.5h7zM1728 128v1280q0 3 -0.5 7 t-4 15t-9.5 19.5t-19 15.5t-31 7h-1280q-3 0 -7 -0.5t-15 -4t-19.5 -9.5t-15.5 -19t-7 -31v-1280q0 -3 0.5 -7t4 -15t9.5 -19.5t19 -15.5t31 -7h1280q3 0 7 0.5t15 4t19.5 9.5t15.5 19t7 31zM640 896h768v-256h-768v256z" /> +<glyph unicode="" d="M256 1664h1536q35 0 61 -13t38 -32t19.5 -38t8.5 -32l1 -13v-1536q0 -35 -13 -61t-32 -38t-38 -19.5t-32 -8.5l-13 -1h-1536q-26 0 -47 7t-34 18.5t-23 25t-14 27t-6.5 25t-3.5 18.5v7v1536q0 26 7 47t18.5 34t25 23t27 14t25 6.5t18.5 3.5h7zM1728 128v1280q0 3 -0.5 7 t-4 15t-9.5 19.5t-19 15.5t-31 7h-1280q-3 0 -7 -0.5t-15 -4t-19.5 -9.5t-15.5 -19t-7 -31v-1280q0 -3 0.5 -7t4 -15t9.5 -19.5t19 -15.5t31 -7h1280q3 0 7 0.5t15 4t19.5 9.5t15.5 19t7 31zM1024 1024q106 0 181 -75t75 -181t-75 -181t-181 -75t-181 75t-75 181t75 181 t181 75z" /> +<glyph unicode="" d="M256 1664h1536q35 0 61 -13t38 -32t19.5 -38t8.5 -32l1 -13v-1536q0 -35 -13 -61t-32 -38t-38 -19.5t-32 -8.5l-13 -1h-1536q-26 0 -47 7t-34 18.5t-23 25t-14 27t-6.5 25t-3.5 18.5v7v1536q0 26 7 47t18.5 34t25 23t27 14t25 6.5t18.5 3.5h7zM1728 128v1280q0 3 -0.5 7 t-4 15t-9.5 19.5t-19 15.5t-31 7h-1280q-3 0 -7 -0.5t-15 -4t-19.5 -9.5t-15.5 -19t-7 -31v-1280q0 -3 0.5 -7t4 -15t9.5 -19.5t19 -15.5t31 -7h1280q3 0 7 0.5t15 4t19.5 9.5t15.5 19t7 31zM1024 1152l448 -384l-448 -384v256h-384v256h384v256z" /> +<glyph unicode="" d="M320 1536h1408q8 0 21 -1t46 -11.5t58 -28.5t46 -57.5t21 -93.5v-896q0 -54 -20 -93.5t-48 -57.5t-56 -28.5t-48 -11.5l-20 -1h-256v-384l-384 384h-768q-8 0 -21 1t-46 11.5t-58 28.5t-46 57.5t-21 93.5v896q0 54 20 93.5t48 57.5t56 28.5t48 11.5zM1408 1024h-256v256 h-256v-256h-256v-256h256v-256h256v256h256v256z" /> +<glyph unicode="" d="M512 640h-128v768h128v-384h256v384h128v-768h-128v256h-256v-256zM1536 1024v-128h-256v-256h-128v768h384v-128h-256v-256h256zM1536 1024v256h128v-256h-128zM1536 640v256h128v-256h-128zM384 384h1280v-256h-1280v256z" /> +<glyph unicode="" d="M896 384v256h-256v256h256v256l512 -384z" /> +<glyph unicode="" d="M1024 641l-767 767h1535zM1792 384v-256h-1536v256h1536z" /> +<glyph unicode="" d="M1792 1408v-256h-1536v256h1536zM1792 128h-1535l767 768z" /> +<glyph unicode="" d="M0 1408h384v-1280h-384v1280zM2048 1024v-512h-640v-384l-768 640l768 640v-384h640z" /> +<glyph unicode="" d="M1152 1536h-256v256h256v-256zM1920 1152l-256 -256h-1408v512h1408zM1088 1216h-128v-128h128v128zM896 768h256v-1024h-256v1024z" /> +<glyph unicode="" d="M876 578l-108 -108q-39 -39 -39 -93q0 -55 39 -94l192 -219h-704q-29 0 -45 16t-17 32l-2 16v1344q0 3 0.5 7t4 15t9.5 19.5t19 15.5t31 7h1152q27 0 43 -16t19 -32l2 -16v-768l-275 -260l-134 134q-37 38 -93 38t-94 -38zM512 1280h-128v-128h128v128zM576 1152h704v128 h-704v-128zM512 1088h-128v-128h128v128zM576 960h704v128h-704v-128zM512 896h-128l-4 -131l132 3v128zM576 768h448v128h-448v-128zM1737 797l108 -108q11 -10 11 -25.5t-11 -25.5l-622 -623q-11 -11 -26 -11t-26 11l-69 69l-39 39l-227 228q-10 11 -10 26t10 25l108 108 q10 10 25 10t26 -10l202 -202l489 489q10 11 25 11t26 -11z" /> +<glyph unicode="" d="M512 -128l-128 575q-41 1 -128 1q-69 0 -128 68.5t-93.5 186.5t-34.5 257t34.5 257t93.5 186.5t128 68.5q236 -1 428 13t314 36.5t216 49.5t153 55t106 50.5t93.5 37t97.5 14.5q104 0 192.5 -103t140 -279.5t51.5 -385.5t-51.5 -385.5t-140 -279.5t-192.5 -103 q-65 0 -131 24t-124.5 55.5t-185 71t-289.5 63.5l90 -406l-128 -192zM1216 960q0 -192 50.5 -343.5t129.5 -206.5q-116 227 -116 550q0 326 116 550q-79 -55 -129.5 -206.5t-50.5 -343.5zM522 820q386 -22 647 -87q-17 110 -17 227q0 280 89 491q-247 -79 -637 -99 q-92 -153 -92 -392q0 -76 10 -140zM1664 384q69 0 128 77t93.5 210t34.5 289q0 266 -90 439q-65 -24 -115.5 -69.5t-81.5 -101t-51 -125t-27.5 -136.5t-7.5 -142.5t5 -136t14 -122.5t15.5 -96.5t13.5 -64.5q33 -21 69 -21zM393 826q-9 64 -9 134q0 234 88 387 q-100 -3 -216 -3q-51 0 -89.5 -122.5t-38.5 -261.5q0 -67 11 -128q135 -1 254 -6z" /> +<glyph unicode="" d="M1537 768l-642 -640l-256 256l384 384l-384 384l256 256z" /> +<glyph unicode="" d="M1792 1664v-1664h-1536v1664h1536zM1664 1536h-1280v-1408h1280v1408zM640 1408h768q35 0 61 -13t38 -32t19.5 -38t8.5 -32l1 -13h-1024q0 5 1 13.5t7.5 31t18.5 39t38.5 30.5t62.5 14zM1216 896v18q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5 t37.5 -90.5q0 -35 -17.5 -64t-46.5 -46v-82l-256 -256v-82q29 -17 46.5 -46t17.5 -64q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5q0 35 17.5 64t46.5 46v82l-256 256v82q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5 q0 -35 -17.5 -64t-46.5 -46v-22l192 -188z" /> +<glyph unicode="" d="M1792 1664v-1664h-1536v1664h1536zM1664 1536h-1280v-1408h1280v1408zM1536 1280h-1024q0 5 1 13.5t7.5 31t18.5 39t38.5 30.5t62.5 14h768q35 0 61 -13t38 -32t19.5 -38t8.5 -32zM1152 832h256v-256h-256v-256h-256v256h-256v256h256v256h256v-256z" /> +<glyph unicode="" d="M1408 1472v-1472l-377 252l-391 -252v1472h768zM1129 975l144 104q9 7 7 12.5t-15 5.5h-176l-55 166q-2 9 -6 12t-8 0t-6 -12l-55 -166h-176q-13 0 -15 -5.5t7 -12.5l144 -104l-54 -167q-4 -13 0 -16.5t15 3.5l144 104l144 -104q11 -7 15 -3.5t0 16.5z" /> +<glyph unicode="" d="M640 960h-192v448h192v-448zM1152 768h-192v640h192v-640zM1664 1152h-192v256h192v-256zM1728 1088v-192h-320v192h320zM384 896h320v-192h-320v192zM1472 832h192v-704h-192v704zM896 704h320v-192h-320v192zM448 640h192v-512h-192v512zM960 448h192v-320h-192v320z " /> +<glyph unicode="" d="M1640 939l138 180q78 -170 78 -351q0 -169 -66 -323t-177 -265.5t-265.5 -177.5t-323.5 -66t-323 66t-265.5 177.5t-177.5 265.5t-66 323t66 323.5t177.5 265.5t265.5 177t323 66q289 0 514 -179l-158 -121q-162 108 -356 108q-130 0 -248.5 -51t-204 -136.5t-136.5 -204 t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5q0 83 -24 171zM1024 863q26 0 50 -6q412 353 654 551q28 23 53 18t28 -28.5t-17 -53.5q-162 -201 -551 -655q6 -22 6 -49q0 -92 -65.5 -157.5t-157.5 -65.5t-157.5 65.5 t-65.5 157.5t65.5 157.5t157.5 65.5zM1088 1280q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 19.5q26 0 45 -19t19 -46zM1344 1216q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM768 1280 q26 0 45 -18.5t19 -45.5q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5zM640 1024q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM1472 768q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5 t19 -45.5q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45zM448 768q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45z" /> +<glyph unicode="" d="M384 1600l100 -119q241 183 540 183q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348q0 164 60 320h212q-78 -150 -78 -320q0 -191 94 -352.5t255.5 -255.5t352.5 -94t352.5 94t255.5 255.5t94 352.5 t-94 352.5t-255.5 255.5t-352.5 94q-229 0 -417 -138l97 -116h-384zM896 256v466q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5q35 0 64 -17.5t46 -46.5h274l64 -64l-64 -64h-274q-17 -29 -46 -46v-466l-64 -64z" /> +<glyph unicode="" d="M1536 640h256v-640h-1537v1536h513v-256h-256v-1024h1024v384zM1792 1536v-768l-256 256l-388 -388l-252 260l384 384l-256 256h768z" /> +<glyph unicode="" d="M256 960h256q7 6 18 16t47 40.5t70.5 60t83 70t91 75t88 70t80 60.5t61.5 40.5t37 15.5q28 0 44 -16t18 -32l2 -16v-1216q0 -3 -0.5 -7t-4 -15t-9.5 -19.5t-19 -15.5t-31 -7q-28 0 -172 112t-274 224l-130 112h-256v448zM1728 768l192 -192l-128 -128l-192 192l-192 -192 l-128 128l192 192l-192 192l128 128l192 -192l192 192l128 -128z" /> +<glyph unicode="" d="M1312 736l416 -416l-256 -256l-416 416l-416 -416l-256 256l416 416l-416 416l256 256l416 -416l416 416l256 -256z" /> +<glyph unicode="" d="M1984 1536v-256h-256v-256h-256v256h-256v256h256v256h256v-256h256zM1395 414l119 -606l-554 298l-554 -298l119 606l-461 422l627 77l269 559l269 -559l628 -77zM680 460l-59 -310q75 117 165.5 215.5t169 161.5t164 113t143 74.5t112.5 42.5l-242 30l-173 365 l-173 -365l-403 -51z" /> +<glyph unicode="" d="M1942 1207l-133 -133l-209 209l-209 -209l-133 133l209 209l-201 201l133 133l201 -201l201 201l133 -133l-201 -201zM1395 414l119 -606l-554 298l-554 -298l119 606l-461 422l627 77l269 559l269 -559l628 -77zM680 460l-59 -310q75 117 165.5 215.5t169 161.5t164 113 t143 74.5t112.5 42.5l-242 30l-173 365l-173 -365l-403 -51z" /> +<glyph unicode="" d="M1024 1408q174 0 321.5 -86t233 -233t85.5 -321t-85.5 -321t-233 -233t-321.5 -86q-130 0 -248.5 51t-204 136.5t-136.5 204t-51 248.5t51 248.5t136.5 204t204 136.5t248.5 51zM674 610l508 508q-74 34 -158 34q-159 0 -271.5 -112.5t-112.5 -271.5q0 -84 34 -158z M1374 926l-508 -508q74 -34 158 -34q159 0 271.5 112.5t112.5 271.5q0 84 -34 158z" /> +<glyph unicode="" d="M1184 704l96 -128h640v192h-512l-288 256l-128 -288l-192 864l-288 -832h-384v-192h512l96 320l192 -768z" /> +<glyph unicode="" d="M1824 -128v1408l-384 384h-1152v-1792h1536zM1696 0h-1280v1536h926l354 -352v-1184zM1184 640h256v256h-256v256h-256v-256h-256v-256h256v-256h256v256z" /> +<glyph unicode="" d="M481 691l-224 44q-7 158 49 307t173 264q135 133 313.5 188t358 24t321.5 -142l175 160l78 -538l-545 77l148 146q-159 106 -356 87.5t-337 -156.5q-94 -93 -133 -214.5t-21 -246.5zM1567 845l225 -44q0 -156 -55 -309.5t-169 -267.5q-217 -193 -497 -212t-506 149 l-164 -161l-77 537l544 -76l-147 -146q159 -106 355.5 -87.5t336.5 156.5q94 93 133 214.5t21 246.5z" /> +<glyph unicode="" d="M2015 1528q17 -70 8.5 -131t-43 -106.5t-84.5 -58.5l-371 -100q-77 -20 -150.5 37.5t-101.5 160.5q-27 102 8 189t112 108l371 99q77 21 150.5 -37t100.5 -161zM1863 1355q25 7 34 48t-5 92q-14 52 -42 83t-53 24q-26 -7 -34 -47.5t5 -92.5q13 -51 41 -82.5t54 -24.5z M1340 1082l-404 26q-52 -14 -97.5 12.5t-59.5 77.5t12.5 97.5t77.5 59.5l338 223l62 16q-77 -21 -112 -108t-7 -189q27 -103 101 -160.5t151 -37.5zM812 1074l-495 -132q-51 -14 -97 12.5t-59 78.5q-14 51 12.5 96.5t77.5 59.5l495 133q-52 -14 -78.5 -60t-12.5 -97 t60 -77.5t97 -13.5zM1152 577l640 -576l13 -16q24 -40 -46 -47q-14 -1 -31 -1q-60 0 -108 16t-66 32l-18 16l-384 320v-384q0 -5 -1 -13.5t-7.5 -31t-18.5 -39t-38.5 -30.5t-62.5 -14q-26 0 -47 7t-34 18.5t-23 25t-14 27t-6.5 25t-3.5 18.5v7v384l-384 -320 q-7 -7 -21.5 -17.5t-64.5 -28.5t-106 -18t-72 16t-4 32l12 16l640 576v320q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5v-320z" /> +<glyph unicode="" d="M1536 0l256 -256h-1536l256 256h256v184q-76 34 -126 72h-386v128h768q0 159 112.5 271.5t271.5 112.5q0 102 -50.5 188.5t-135.5 137.5l-198 -198l-128 -256h-256l-128 128v256l256 128l448 448q18 18 38 25t35.5 3.5t28 -9.5t19.5 -13l7 -6l128 128q3 3 7.5 7t19 11.5 t28.5 10t34.5 -4t38.5 -24.5t25 -38t3.5 -35.5t-9.5 -28t-13 -19.5l-6 -7l-128 -128q3 -3 6.5 -7.5t11.5 -19t10 -29t-4 -34.5t-24 -38l-66 -66q120 -89 189 -222.5t69 -287.5q0 -45 -8 -93q64 -55 100 -130t36 -161q0 -137 -85.5 -241.5t-216.5 -133.5zM1280 384 q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5z" /> +<glyph unicode="" d="M512 1664q159 0 271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5zM2048 0l-256 -256l-576 576l-320 -320v896h896l-320 -320z" /> +<glyph unicode="" d="M1280 1280l-768 -768l-128 128l256 256l-512 512l256 256l512 -512l256 256zM1920 128l-256 -256l-512 512l-256 -256l-128 128l768 768l128 -128l-256 -256z" /> +<glyph unicode="" d="M1792 1600v-1664h-1536v1664h1536zM1664 1472h-1280v-1408h1280v1408zM1536 1216h-1024q0 5 1 13.5t8.5 31t19.5 39t38 30.5t61 14h768q26 0 47 -7t34 -18.5t23 -25t14 -27t6.5 -25t3.5 -18.5v-7zM1280 832h-512l128 256l128 -64l128 64zM1408 704h-768l128 64h512z M768 448l128 -256h-320l-64 320l320 64zM1088 448l64 -256h-256l64 256l-64 128h256zM1536 512l-64 -320h-320l128 256l-64 128z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/hub/static/octicons/octicons-regular-webfont.ttf b/hub/static/octicons/octicons-regular-webfont.ttf new file mode 100644 index 0000000..fe7b45f Binary files /dev/null and b/hub/static/octicons/octicons-regular-webfont.ttf differ diff --git a/hub/static/octicons/octicons-regular-webfont.woff b/hub/static/octicons/octicons-regular-webfont.woff new file mode 100644 index 0000000..5a2899b Binary files /dev/null and b/hub/static/octicons/octicons-regular-webfont.woff differ diff --git a/package.json b/package.json new file mode 120000 index 0000000..96da763 --- /dev/null +++ b/package.json @@ -0,0 +1 @@ +dockerfiles/node/package.json \ No newline at end of file diff --git a/quick_start.sh b/quick_start.sh deleted file mode 100755 index e1f74ad..0000000 --- a/quick_start.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash - -echo "Setup database..." -. ./setup_databases.sh - -echo "Init virtualenv..." -which virtualenv > /dev/null 2>&1 -if [ $? != 0 ];then - echo "Install virtualenv..." - pip install virtualenv -fi -virtualenv venv -. venv/bin/activate -pip install -U setuptools -pip install cython - -which mysql_config > /dev/null 2>&1 -if [ $? != 0 ];then - echo "mysql_config: command not found, must install it!" - exit 1 -fi -pip install -r requirements.txt - -echo "Start serving!!!" -echo -echo -gunicorn -w 2 -b 0.0.0.0:8000 app:app diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 0a34bb6..0000000 --- a/requirements.txt +++ /dev/null @@ -1,18 +0,0 @@ -MySQL-python==1.2.4 -Mako==0.9.0 -docutils==0.9.1 -gunicorn==18.0 -pytest==2.5.0 -redis==2.8.0 -wsgiauth==0.1 -pytz==2013.8 -Werkzeug==0.9.4 -mikoto==0.0.4 --e git+https://github.com/douban/douban-utils.git@5ca697545da191dab3fbe308e6b6776d8da83bd5#egg=DoubanUtils --e git+https://github.com/douban/douban-sqlstore.git@d7136b7cac1075f0b285e8c763af2e85124f8b76#egg=DoubanSQLStore --e git+https://github.com/douban/douban-mc.git@f594ab28af464f25a54263d1cc312e895e65b1f4#egg=DoubanMC --e git+https://github.com/douban/douban-orz.git@208b48177dc847ef2afdadfda302868c39797bdf#egg=ORZ --e git+https://github.com/douban/douban-quixote.git@72fd1b6f1224519709df2c031afc4bd9dbe611e4#egg=Quixote --e git+https://github.com/douban/pygit2.git@c7b13237e9934b5620cf0c351ae7eaea7d14ffc3#egg=pygit2 --e git+https://github.com/douban/ellen.git@e092eddd933a4676c53f016d11782897807f873a#egg=ellen --e git+https://github.com/douban/python-libmemcached.git@71fb66d473bbab82c2b6ddb410a386dd84417fa3#egg=python_libmemcached diff --git a/requirements.txt b/requirements.txt new file mode 120000 index 0000000..9419887 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +dockerfiles/python/requirements.txt \ No newline at end of file diff --git a/scripts/archlinux.sh b/scripts/archlinux.sh index 947213c..a5aeddf 100644 --- a/scripts/archlinux.sh +++ b/scripts/archlinux.sh @@ -1,6 +1,6 @@ -#!/usr/bin/env bash +#!/usr/bin/env bash -#Get generic function +#Get generic function . common.sh echo "Install needed package.This may take some time..." @@ -14,9 +14,6 @@ echo "Setup memcached port to 11311..." sudo sed -i "s/memcached -l/memcached -p 11311 -l/" /usr/lib/systemd/system/memcached.service sudo systemctl start memcached -echo "Install libmemcached..." -install_libmemcached - # Use virtualenv2 sudo mv /usr/bin/virtualenv /usr/bin/virtualenv.bak sudo ln -s /usr/bin/virtualenv2 /usr/bin/virtualenv diff --git a/scripts/centos.sh b/scripts/centos.sh index d807a19..35f52de 100755 --- a/scripts/centos.sh +++ b/scripts/centos.sh @@ -4,7 +4,7 @@ . common.sh echo "Install needed package.This may take some time..." -sudo yum install -y -q git python-virtualenv python-devel memcached gcc gcc-c++ +sudo yum install -y -q git python-virtualenv python-devel memcached gcc gcc-c++ redis-server echo "Install mysql..." sudo yum install -y -q mysql-server mysql mysql-devel @@ -14,9 +14,6 @@ echo "Setup memcached port to 11311..." sudo sed -i "s/PORT=11211/PORT=11311/" /etc/init.d/memcached sudo /etc/init.d/memcached start -echo "Install libmemcached..." -install_libmemcached - echo "Install code..." install_code diff --git a/scripts/code.conf b/scripts/code.conf new file mode 100644 index 0000000..26b6c03 --- /dev/null +++ b/scripts/code.conf @@ -0,0 +1,33 @@ +[program:code] +command=/home/vagrant/code/venv/bin/gunicorn -w 1 -b 0.0.0.0:8200 app:app +directory=/home/vagrant/code +startsecs=0 +stopwaitsecs=0 +redirect_stderr=true +stdout_logfile=/home/vagrant/log/code.log +[program:memcached_7901] +command=memcached -u nobody -l 127.0.0.1 -p 7901 -U 0 +redirect_stderr=true +stdout_logfile=/home/vagrant/log/memcached.log +[program:memcached_7902] +command=memcached -u nobody -l 127.0.0.1 -p 7902 -U 0 +redirect_stderr=true +stdout_logfile=/home/vagrant/log/memcached.log +[program:memcached_7903] +command=memcached -u nobody -l 127.0.0.1 -p 7903 -U 0 +redirect_stderr=true +stdout_logfile=/home/vagrant/log/memcached.log +[program:memcached_11311] +command=memcached -m 64 -p 11311 -l 127.0.0.1 +redirect_stderr=true +stdout_logfile=/home/vagrant/log/memcached.log +[program:grunt_watch] +directory=/home/vagrant/code +command=grunt watch +redirect_stderr=true +stdout_logfile=/home/vagrant/log/watch.log +[program:webpack_watch] +directory=/home/vagrant/code +command=/home/vagrant/code/node_modules/.bin/webpack --progress --colors --watch +redirect_stderr=true +stdout_logfile=/home/vagrant/log/watch.log diff --git a/scripts/common.sh b/scripts/common.sh index b22c080..0212006 100644 --- a/scripts/common.sh +++ b/scripts/common.sh @@ -3,37 +3,26 @@ modify_sudo_time() { sudo sed -i 's/env_reset/env_reset, timestamp_timeout=240/g' /etc/sudoers } -install_libmemcached() { - #check libmemcached has installed - if [ ! -f /usr/local/bin/memping ] ; then - curl -L https://github.com/xtao/douban-patched/raw/master/libmemcached-douban-1.0.18.tar.gz |tar zx - cd libmemcached-1.0.18 - ./configure && make && sudo make install - cd .. - rm -rf libmemcached-1.0.18 - echo "/usr/local/lib" | sudo tee -a /etc/ld.so.conf - sudo /sbin/ldconfig - fi -} - check_virtualenv() { which virtualenv > /dev/null 2>&1 if [ $? != 0 ];then - echo "Install virtualenv..." - sudo pip install virtualenv + echo "Install virtualenv..." + sudo pip install virtualenv fi + virtualenv venv + . venv/bin/activate } setup_database() { read -p "Please input Mysql User(default is root):" user if [ "${user}" = "" ];then - user="root" + user="root" fi read -p "Please input Mysql ${user}'s password(default is ''):" passwd echo "drop database if exists valentine" | mysql --user=${user} --password=${passwd} echo "create database valentine" | mysql --user=${user} --password=${passwd} if [ $? -ne 0 ]; then - exit 1 + exit 1 fi (echo "use valentine"; cat vilya/databases/schema.sql) | mysql --user=${user} --password=${passwd} } @@ -43,17 +32,12 @@ install_code() { cd code echo "Setup database..." setup_database - check_virtualenv - virtualenv venv - . venv/bin/activate + test "$CODE_ENV" != "unset" && check_virtualenv pip install cython # should install first - pip install -U setuptools # python-libmemcached require updated setuptools - if [ -f /etc/arch-release ] ; then - pip install "distribute==0.6.29" # Fixed install MySQL-python on archlinux for #14 - fi + pip install -U setuptools pip install -r requirements.txt } start_app() { - gunicorn -w 2 -b 127.0.0.1:8000 app:app # web & git http daemon + test "$CODE_ENV" != "unset" && gunicorn -w 2 -b 127.0.0.1:8000 app:app # web & git http daemon } diff --git a/scripts/fedora.sh b/scripts/fedora.sh index 9110590..dcd5d19 100755 --- a/scripts/fedora.sh +++ b/scripts/fedora.sh @@ -4,7 +4,7 @@ . common.sh echo "Install needed package.This may take some time..." -sudo yum install -y -q git python-virtualenv python-devel memcached gcc gcc-c++ +sudo yum install -y -q git python-virtualenv python-devel memcached gcc gcc-c++ redis-server echo "Install mysql..." sudo yum install mysql-server mysql mysql-devel @@ -15,9 +15,6 @@ echo "Setup memcached port to 11311..." sudo sed -i "s/PORT=11211/PORT=11311/" /etc/sysconfig/memcached sudo service memcached restart -echo "Install libmemcached..." -install_libmemcached - echo "Install code..." install_code diff --git a/scripts/gentoo.sh b/scripts/gentoo.sh index 62e5594..e2eafba 100755 --- a/scripts/gentoo.sh +++ b/scripts/gentoo.sh @@ -30,10 +30,6 @@ sudo sed -i 's/PORT=\"11211\"/PORT=\"11311\"/g' /etc/conf.d/memcached sudo /etc/init.d/memcached restart $end -$echo "Install libmemcached..." -install_libmemcached -$end - $echo "Install code..." install_code $end diff --git a/scripts/install_code.sh b/scripts/install_code.sh index 1b62031..44e209e 100755 --- a/scripts/install_code.sh +++ b/scripts/install_code.sh @@ -3,7 +3,7 @@ # Check Python version > 2.7 test `python -c 'import sys; print sys.version_info < (2, 7)'` = "True" && echo 'CODE requires Python 2.7.' && exit 1 -url='https://raw.github.com/douban/code/master/scripts' +url='https://raw.githubusercontent.com/douban/code/master/scripts' if [ -f /etc/fedora-release ] ; then file="$url/fedora.sh" diff --git a/scripts/opensuse.sh b/scripts/opensuse.sh index 249867b..5981cbf 100755 --- a/scripts/opensuse.sh +++ b/scripts/opensuse.sh @@ -15,9 +15,6 @@ echo "Setup memcached port to 11311..." sudo sed -i 's/MEMCACHED_PARAMS=\"/MEMCACHED_PARAMS=\"-p 11311 /' /etc/sysconfig/memcached sudo /etc/init.d/memcached restart -echo "Install libmemcached..." -install_libmemcached - echo "Install code..." install_code diff --git a/scripts/supervisord.conf b/scripts/supervisord.conf new file mode 100644 index 0000000..2657a35 --- /dev/null +++ b/scripts/supervisord.conf @@ -0,0 +1,28 @@ +; supervisor config file + +[unix_http_server] +file=/var/run/supervisor.sock ; (the path to the socket file) +chmod=0766 ; sockef file mode (default 0700) + +[supervisord] +logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log) +pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid) +childlogdir=/var/log/supervisor ; ('AUTO' child log dir, default $TEMP) + +; the below section must remain in the config file for RPC +; (supervisorctl/web interface) to work, additional interfaces may be +; added by defining them in separate rpcinterface: sections +[rpcinterface:supervisor] +supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface + +[supervisorctl] +serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket + +; The [include] section can just contain the "files" setting. This +; setting can list multiple files (separated by whitespace or +; newlines). It can also contain wildcards. The filenames are +; interpreted as relative to this file. Included files *cannot* +; include files themselves. + +[include] +files = /etc/supervisor/conf.d/*.conf diff --git a/scripts/ubuntu.sh b/scripts/ubuntu.sh index 2ce3bfe..b176aba 100755 --- a/scripts/ubuntu.sh +++ b/scripts/ubuntu.sh @@ -4,18 +4,16 @@ . common.sh echo "Install needed package.This may take some time..." -sudo apt-get install build-essential g++ git python-pip python-virtualenv python-dev memcached -yq +sudo apt-get install build-essential g++ git python-pip python-virtualenv dh-autoreconf python-dev memcached redis-server libffi-dev -yq echo "Install mysql..." sudo apt-get install mysql-client mysql-server libmysqlclient-dev -yq +sudo /etc/init.d/mysql restart echo "Setup memcached port to 11311..." sudo sed -i "s/11211/11311/g" /etc/memcached.conf sudo /etc/init.d/memcached restart -echo "Install libmemcached..." -install_libmemcached - echo "Install code..." install_code diff --git a/smart_httpd.py b/smart_httpd.py deleted file mode 100644 index 2cb57a2..0000000 --- a/smart_httpd.py +++ /dev/null @@ -1,123 +0,0 @@ -#!/usr/bin/python -# coding:utf8 - -import os.path - -from wsgiauth.basic import BasicAuth - -from vilya.config import DEVELOP_MODE -from vilya.libs.git_http_backend import assemble_WSGI_git_app -from vilya.libs.permdir import get_repo_root -from vilya.models.user import User -from vilya.models.project import Project -from vilya.models.organization import Organization - - -DOUBAN_REALM = "douban wsgi basic auth" - - -def get_proj(path): - ''' - >>> get_proj('/a.git/info/refs') - 'a' - >>> get_proj('/testuser/a.git/info/refs') - 'testuser/a' - ''' - path_split = path.split("/") - git_name = path_split[1] - if not git_name.endswith('.git'): - git_name = "/".join(path_split[1:3]) - assert "." in git_name, "Need a string looking like project.git, got '%s'" % git_name - proj_name, _ = os.path.splitext(git_name) - return proj_name - - -def get_git_path_info(path): - path_split = path.split("/") - git_name = path_split[1] - # raw path: project_id.git - if git_name.endswith('.git'): - project = Project.get_by_name(git_name[:-4]) - if project: - path_split[1] = "%s.git" % project.id - return '/'.join(path_split) - else: - owner_name, git_name = path_split[1:3] - # user project: user/project.git - user = User.get_by_name(owner_name) - if user: - project = Project.get_by_name_and_owner(git_name[:-4], user.id) - if project: - path_split[1] = "" - path_split[2] = "%s.git" % project.id - return '/'.join(path_split[1:]) - return - # org project: org/project.git - org = Organization.get_by_name(owner_name) - if org: - project = Project.get_by_name_and_owner(git_name[:-4], user.id) - if project: - path_split[1] = "" - path_split[2] = "%s.git" % project.id - return '/'.join(path_split[1:]) - - -def authfunc(environ, username, passwd): - # no auth - return True - - if DEVELOP_MODE or (environ['REMOTE_ADDR'] == '127.0.0.1' - and environ['HTTP_HOST'] == 'localhost:8080'): - return True - if not passwd: - return - if username == 'code' and passwd == 'code': - return True - # FIXME: login - is_good = True - if not is_good: - return - is_push = 'service=git-receive-pack' in environ['QUERY_STRING'] or '/git-receive-pack' in environ['PATH_INFO'] - if is_push: - pass - # FIXME: push permission - return True - - -class HTTPAuth(object): - def __init__(self, application, realm, authfunc, scheme, **kw): - self.application = application - self.authenticate = scheme(realm, authfunc, **kw) - self.scheme = scheme.authtype - - def __call__(self, environ, start_response): - path_info = environ['PATH_INFO'] - environ['GIT_PATH_INFO'] = get_git_path_info(path_info) - if environ.get('REMOTE_USER') is None: - result = self.authenticate(environ) - if not isinstance(result, str): - # Request credentials if authentication fails - return result(environ, start_response) - environ['REMOTE_USER'] = result - environ['AUTH_TYPE'] = self.scheme - return self.application(environ, start_response) - - -class WebRedirect(object): - def __init__(self, application, **kw): - self.application = application - - def __call__(self, environ, start_response): - http_accept = environ.get('HTTP_ACCEPT') - path_info = environ.get('PATH_INFO') - proj_name = get_proj(path_info) - if http_accept and 'text/html' in http_accept: - start_response('301 Redirect', - [('Location', '/%s/' % proj_name), ]) - return [] - return self.application(environ, start_response) - - -app = assemble_WSGI_git_app(content_path=get_repo_root()) -app = WebRedirect(app) -app = HTTPAuth(app, DOUBAN_REALM, authfunc, BasicAuth) diff --git a/tasks.py b/tasks.py new file mode 100644 index 0000000..ed0fc9c --- /dev/null +++ b/tasks.py @@ -0,0 +1,167 @@ +# -*- coding: utf-8 -*- +from datetime import datetime + +from ellen.utils import JagareError +from celery.schedules import crontab +from celery.task import periodic_task + +from vilya.libs.store import store +from vilya.models.project import CodeDoubanProject +from vilya.models.doc import DocBuilder +from vilya.models.sphinx_docs import SphinxDocs +from vilya.models.elastic.issue_pr_search import IssuePRSearch +from vilya.models.elastic.indexer import IndexEngine +from vilya.models.user import get_users, clean_user_pulls +from vilya.models.team import Team +from vilya.models.ticket import TicketRank +from vilya.libs.gyt import is_git_dir +from vilya.libs.mq import async + + +# TODO: use sentry to catch exception +# TODO: move data accessors (mc keys) to model + + +def get_teams(): + rs = store.execute('select id from team') + for id, in rs: + yield Team.get(id) + + +def get_projects(): + rs = store.execute('select project_id from codedouban_projects') + for proj_id, in rs: + yield CodeDoubanProject.get(proj_id) + + +def get_origin_projects(): + rs = store.execute( + 'select project_id from codedouban_projects where project_id=origin_project') # noqa + for proj_id, in rs: + yield CodeDoubanProject.get(proj_id) + + +def get_mirror_projects(): + rs = store.execute( + 'select project_id from codedouban_projects where owner_id=mirror') + for proj_id, in rs: + yield CodeDoubanProject.get(proj_id) + + +@async +def sphinx_builds_add(docs): + docs.build_all() + + +@periodic_task(run_every=crontab(minute=0, hour=0)) +def update_user_contributions(): + from vilya.models.contributions import UserContributions + users = get_users() + for user in users: + UserContributions.update_by_user(user.name) + + +@periodic_task(run_every=crontab(minute=0, hour=6, day_of_week='sat')) +def project_fsck_and_gc(): + weekday = datetime.today().weekday() + if weekday != 6: + return + result = get_projects() + for proj in result: + if is_git_dir(proj.git_dir) and not proj.git.is_empty(): + proj.git.call('fsck --full') + proj.git.call('gc') + proj.git.call('repack -adf') + + +@periodic_task(run_every=crontab(minute='*/30')) +def check_doc_builds(): + for proj in get_origin_projects(): + doc = DocBuilder(proj) + if doc.can_build: + sphinx_builds_add(doc) + + +@periodic_task(run_every=crontab(minute='*/30')) +def check_sphinx_builds(): + for proj in get_origin_projects(): + try: + docs = SphinxDocs(proj.name) + except JagareError: + continue + if not docs.enabled or not docs.need_rebuild(): + continue + sphinx_builds_add(docs) + + +@periodic_task(run_every=crontab(minute=0, hour=6)) +def update_elastic_index(): + results = get_projects() + IndexEngine.delete_mapping('pull') + IndexEngine.delete_mapping('issue') + for proj in results: + try: + IssuePRSearch.index_a_project(proj) + except: + pass + + +@periodic_task(run_every=crontab(minute=0, hour=1)) +def fetch_mirror_project(): + results = get_mirror_projects() + for project in results: + project.fetch() + + +@periodic_task(run_every=crontab(minute='*/15')) +def fetch_mirror_project_per_15m(): + results = get_mirror_projects() + for project in results: + mirror = project.mirror + if mirror and mirror.frequency == 15: + project.fetch() + + +@periodic_task(run_every=crontab(minute=15)) +def update_user_pulls(): + users = get_users() + for user in users: + clean_user_pulls(user) + + +@periodic_task(run_every=crontab(minute=0, hour=12, day_of_week='sun')) +def send_team_week_report(): + from dispatches import dispatch + for team in get_teams(): + if team.weekly: + dispatch("weekly", data=dict(team_id=team.id)) + + +@periodic_task(run_every=crontab(minute=0, hour='*')) +def update_ticket_rankscore_null(): + TicketRank.count_ticket_rank(False) + + +@periodic_task(run_every=crontab(minute=0, hour=0)) +def update_ticket_rankscore_closed(): + TicketRank.count_ticket_rank(True) + + +def index_srcs_action(): + pass + + +def index_repos_action(): + pass + + +def index_users_action(): + pass + + +def index_a_project_docs(): + pass + + +def index_a_gist(): + pass diff --git a/vilya/tests/stub/__init__.py b/tests/__init__.py similarity index 100% rename from vilya/tests/stub/__init__.py rename to tests/__init__.py diff --git a/tests/base.py b/tests/base.py new file mode 100644 index 0000000..c8fa959 --- /dev/null +++ b/tests/base.py @@ -0,0 +1,99 @@ +# encoding: UTF-8 + +import os +import glob +import unittest +import webtest +import socket + +from vilya.libs.rdstore import rds +from vilya.libs.gyt import clear_memoizer +from vilya.libs.store import store + +from vilya.models.user import User +from vilya.models.api_key import ApiKey +from vilya.models.gist import Gist +# Notify和Feed这两个引用是必要的的,这样才能使notification和feed的signal正常工作 +from vilya.models.notification import Notification # noqa +from vilya.models.feed import Feed # noqa + +os.environ['CODEDOUBAN_RUNNING_MODE'] = 'unittest' + + +def _mc_server_flush_all(host, port): + assert host in ('127.0.0.1', 'localhost', socket.getfqdn()) + + sock = socket.socket() + sock.connect((host, port)) + req = 'flush_all\r\n' + expected_res = 'OK\r\n' + assert len(req) == sock.send(req) + assert sock.recv(1024) == expected_res + sock.close() + + +def _flush_mc_server(mc): + if not hasattr(mc, 'stats'): + return + + stats = mc.stats() + assert len(stats) == 1 + host, port = stats.keys()[0].split(':') + port = int(port) + _mc_server_flush_all(host, port) + + +def clear_beansdb_for_test(): + pass + + +class TestApp(webtest.TestApp): + + """ + The same with `webtest.TestApp`_ except that the app parameter defaults to + """ + + def __init__(self, app=None, **kwargs): + super(TestApp, self).__init__(app, **kwargs) + + +def remove_files(): + for p in glob.glob('vilya/permdir/test*'): + os.removedirs(p) + + +class TestCase(unittest.TestCase): + + def setUp(self): + _flush_mc_server(None) + clear_beansdb_for_test() + + def tearDown(self): + clear_memoizer() + rds.flushdb() + store.rollback_all(force=True) + + def addUser(self, name='unittest_user'): + return User(name) + + def _add_api_key(self): + name = 'test' + desc = '' + type = ApiKey.TYPE_WEB + url = 'http://www.douban.com' + redirect_uri = 'http://www.douban.com/callback' + owner_id = 'testuser' + return ApiKey.add(name, desc, type, url, redirect_uri, owner_id) + + def _add_gist(self, description='', owner_id='testuser', is_public=1, + gist_names=[], gist_contents=[], fork_from=None): + return Gist.add(description, owner_id, is_public, + gist_names=gist_names, gist_contents=gist_contents, + fork_from=fork_from) + + env_for_git = { + 'GIT_AUTHOR_NAME': 'default_test', + 'GIT_AUTHOR_EMAIL': 'default_test@douban.com', + 'GIT_COMMITTER_NAME': 'default_test', + 'GIT_COMMITTER_EMAIL': 'default_test@douban.com', + } diff --git a/tests/data/bare_empty/HEAD b/tests/data/bare_empty/HEAD new file mode 100644 index 0000000..cb089cd --- /dev/null +++ b/tests/data/bare_empty/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/tests/data/bare_empty/config b/tests/data/bare_empty/config new file mode 100644 index 0000000..07d359d --- /dev/null +++ b/tests/data/bare_empty/config @@ -0,0 +1,4 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true diff --git a/tests/data/bare_empty/description b/tests/data/bare_empty/description new file mode 100644 index 0000000..498b267 --- /dev/null +++ b/tests/data/bare_empty/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/tests/data/bare_empty/hooks/applypatch-msg.sample b/tests/data/bare_empty/hooks/applypatch-msg.sample new file mode 100755 index 0000000..8b2a2fe --- /dev/null +++ b/tests/data/bare_empty/hooks/applypatch-msg.sample @@ -0,0 +1,15 @@ +#!/bin/sh +# +# An example hook script to check the commit log message taken by +# applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. The hook is +# allowed to edit the commit message file. +# +# To enable this hook, rename this file to "applypatch-msg". + +. git-sh-setup +test -x "$GIT_DIR/hooks/commit-msg" && + exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"} +: diff --git a/tests/data/bare_empty/hooks/commit-msg.sample b/tests/data/bare_empty/hooks/commit-msg.sample new file mode 100755 index 0000000..b58d118 --- /dev/null +++ b/tests/data/bare_empty/hooks/commit-msg.sample @@ -0,0 +1,24 @@ +#!/bin/sh +# +# An example hook script to check the commit log message. +# Called by "git commit" with one argument, the name of the file +# that has the commit message. The hook should exit with non-zero +# status after issuing an appropriate message if it wants to stop the +# commit. The hook is allowed to edit the commit message file. +# +# To enable this hook, rename this file to "commit-msg". + +# Uncomment the below to add a Signed-off-by line to the message. +# Doing this in a hook is a bad idea in general, but the prepare-commit-msg +# hook is more suited to it. +# +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" + +# This example catches duplicate Signed-off-by lines. + +test "" = "$(grep '^Signed-off-by: ' "$1" | + sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { + echo >&2 Duplicate Signed-off-by lines. + exit 1 +} diff --git a/tests/data/bare_empty/hooks/post-update.sample b/tests/data/bare_empty/hooks/post-update.sample new file mode 100755 index 0000000..ec17ec1 --- /dev/null +++ b/tests/data/bare_empty/hooks/post-update.sample @@ -0,0 +1,8 @@ +#!/bin/sh +# +# An example hook script to prepare a packed repository for use over +# dumb transports. +# +# To enable this hook, rename this file to "post-update". + +exec git update-server-info diff --git a/tests/data/bare_empty/hooks/pre-applypatch.sample b/tests/data/bare_empty/hooks/pre-applypatch.sample new file mode 100755 index 0000000..b1f187c --- /dev/null +++ b/tests/data/bare_empty/hooks/pre-applypatch.sample @@ -0,0 +1,14 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed +# by applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-applypatch". + +. git-sh-setup +test -x "$GIT_DIR/hooks/pre-commit" && + exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"} +: diff --git a/tests/data/bare_empty/hooks/pre-commit.sample b/tests/data/bare_empty/hooks/pre-commit.sample new file mode 100755 index 0000000..18c4829 --- /dev/null +++ b/tests/data/bare_empty/hooks/pre-commit.sample @@ -0,0 +1,50 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git commit" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message if +# it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-commit". + +if git rev-parse --verify HEAD >/dev/null 2>&1 +then + against=HEAD +else + # Initial commit: diff against an empty tree object + against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 +fi + +# If you want to allow non-ascii filenames set this variable to true. +allownonascii=$(git config hooks.allownonascii) + +# Redirect output to stderr. +exec 1>&2 + +# Cross platform projects tend to avoid non-ascii filenames; prevent +# them from being added to the repository. We exploit the fact that the +# printable range starts at the space character and ends with tilde. +if [ "$allownonascii" != "true" ] && + # Note that the use of brackets around a tr range is ok here, (it's + # even required, for portability to Solaris 10's /usr/bin/tr), since + # the square bracket bytes happen to fall in the designated range. + test $(git diff --cached --name-only --diff-filter=A -z $against | + LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 +then + echo "Error: Attempt to add a non-ascii file name." + echo + echo "This can cause problems if you want to work" + echo "with people on other platforms." + echo + echo "To be portable it is advisable to rename the file ..." + echo + echo "If you know what you are doing you can disable this" + echo "check using:" + echo + echo " git config hooks.allownonascii true" + echo + exit 1 +fi + +# If there are whitespace errors, print the offending file names and fail. +exec git diff-index --check --cached $against -- diff --git a/tests/data/bare_empty/hooks/pre-rebase.sample b/tests/data/bare_empty/hooks/pre-rebase.sample new file mode 100755 index 0000000..9773ed4 --- /dev/null +++ b/tests/data/bare_empty/hooks/pre-rebase.sample @@ -0,0 +1,169 @@ +#!/bin/sh +# +# Copyright (c) 2006, 2008 Junio C Hamano +# +# The "pre-rebase" hook is run just before "git rebase" starts doing +# its job, and can prevent the command from running by exiting with +# non-zero status. +# +# The hook is called with the following parameters: +# +# $1 -- the upstream the series was forked from. +# $2 -- the branch being rebased (or empty when rebasing the current branch). +# +# This sample shows how to prevent topic branches that are already +# merged to 'next' branch from getting rebased, because allowing it +# would result in rebasing already published history. + +publish=next +basebranch="$1" +if test "$#" = 2 +then + topic="refs/heads/$2" +else + topic=`git symbolic-ref HEAD` || + exit 0 ;# we do not interrupt rebasing detached HEAD +fi + +case "$topic" in +refs/heads/??/*) + ;; +*) + exit 0 ;# we do not interrupt others. + ;; +esac + +# Now we are dealing with a topic branch being rebased +# on top of master. Is it OK to rebase it? + +# Does the topic really exist? +git show-ref -q "$topic" || { + echo >&2 "No such branch $topic" + exit 1 +} + +# Is topic fully merged to master? +not_in_master=`git rev-list --pretty=oneline ^master "$topic"` +if test -z "$not_in_master" +then + echo >&2 "$topic is fully merged to master; better remove it." + exit 1 ;# we could allow it, but there is no point. +fi + +# Is topic ever merged to next? If so you should not be rebasing it. +only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` +only_next_2=`git rev-list ^master ${publish} | sort` +if test "$only_next_1" = "$only_next_2" +then + not_in_topic=`git rev-list "^$topic" master` + if test -z "$not_in_topic" + then + echo >&2 "$topic is already up-to-date with master" + exit 1 ;# we could allow it, but there is no point. + else + exit 0 + fi +else + not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` + /usr/bin/perl -e ' + my $topic = $ARGV[0]; + my $msg = "* $topic has commits already merged to public branch:\n"; + my (%not_in_next) = map { + /^([0-9a-f]+) /; + ($1 => 1); + } split(/\n/, $ARGV[1]); + for my $elem (map { + /^([0-9a-f]+) (.*)$/; + [$1 => $2]; + } split(/\n/, $ARGV[2])) { + if (!exists $not_in_next{$elem->[0]}) { + if ($msg) { + print STDERR $msg; + undef $msg; + } + print STDERR " $elem->[1]\n"; + } + } + ' "$topic" "$not_in_next" "$not_in_master" + exit 1 +fi + +exit 0 + +################################################################ + +This sample hook safeguards topic branches that have been +published from being rewound. + +The workflow assumed here is: + + * Once a topic branch forks from "master", "master" is never + merged into it again (either directly or indirectly). + + * Once a topic branch is fully cooked and merged into "master", + it is deleted. If you need to build on top of it to correct + earlier mistakes, a new topic branch is created by forking at + the tip of the "master". This is not strictly necessary, but + it makes it easier to keep your history simple. + + * Whenever you need to test or publish your changes to topic + branches, merge them into "next" branch. + +The script, being an example, hardcodes the publish branch name +to be "next", but it is trivial to make it configurable via +$GIT_DIR/config mechanism. + +With this workflow, you would want to know: + +(1) ... if a topic branch has ever been merged to "next". Young + topic branches can have stupid mistakes you would rather + clean up before publishing, and things that have not been + merged into other branches can be easily rebased without + affecting other people. But once it is published, you would + not want to rewind it. + +(2) ... if a topic branch has been fully merged to "master". + Then you can delete it. More importantly, you should not + build on top of it -- other people may already want to + change things related to the topic as patches against your + "master", so if you need further changes, it is better to + fork the topic (perhaps with the same name) afresh from the + tip of "master". + +Let's look at this example: + + o---o---o---o---o---o---o---o---o---o "next" + / / / / + / a---a---b A / / + / / / / + / / c---c---c---c B / + / / / \ / + / / / b---b C \ / + / / / / \ / + ---o---o---o---o---o---o---o---o---o---o---o "master" + + +A, B and C are topic branches. + + * A has one fix since it was merged up to "next". + + * B has finished. It has been fully merged up to "master" and "next", + and is ready to be deleted. + + * C has not merged to "next" at all. + +We would want to allow C to be rebased, refuse A, and encourage +B to be deleted. + +To compute (1): + + git rev-list ^master ^topic next + git rev-list ^master next + + if these match, topic has not merged in next at all. + +To compute (2): + + git rev-list master..topic + + if this is empty, it is fully merged to "master". diff --git a/tests/data/bare_empty/hooks/prepare-commit-msg.sample b/tests/data/bare_empty/hooks/prepare-commit-msg.sample new file mode 100755 index 0000000..f093a02 --- /dev/null +++ b/tests/data/bare_empty/hooks/prepare-commit-msg.sample @@ -0,0 +1,36 @@ +#!/bin/sh +# +# An example hook script to prepare the commit log message. +# Called by "git commit" with the name of the file that has the +# commit message, followed by the description of the commit +# message's source. The hook's purpose is to edit the commit +# message file. If the hook fails with a non-zero status, +# the commit is aborted. +# +# To enable this hook, rename this file to "prepare-commit-msg". + +# This hook includes three examples. The first comments out the +# "Conflicts:" part of a merge commit. +# +# The second includes the output of "git diff --name-status -r" +# into the message, just before the "git status" output. It is +# commented because it doesn't cope with --amend or with squashed +# commits. +# +# The third example adds a Signed-off-by line to the message, that can +# still be edited. This is rarely a good idea. + +case "$2,$3" in + merge,) + /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;; + +# ,|template,) +# /usr/bin/perl -i.bak -pe ' +# print "\n" . `git diff --cached --name-status -r` +# if /^#/ && $first++ == 0' "$1" ;; + + *) ;; +esac + +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" diff --git a/tests/data/bare_empty/hooks/update.sample b/tests/data/bare_empty/hooks/update.sample new file mode 100755 index 0000000..71ab04e --- /dev/null +++ b/tests/data/bare_empty/hooks/update.sample @@ -0,0 +1,128 @@ +#!/bin/sh +# +# An example hook script to blocks unannotated tags from entering. +# Called by "git receive-pack" with arguments: refname sha1-old sha1-new +# +# To enable this hook, rename this file to "update". +# +# Config +# ------ +# hooks.allowunannotated +# This boolean sets whether unannotated tags will be allowed into the +# repository. By default they won't be. +# hooks.allowdeletetag +# This boolean sets whether deleting tags will be allowed in the +# repository. By default they won't be. +# hooks.allowmodifytag +# This boolean sets whether a tag may be modified after creation. By default +# it won't be. +# hooks.allowdeletebranch +# This boolean sets whether deleting branches will be allowed in the +# repository. By default they won't be. +# hooks.denycreatebranch +# This boolean sets whether remotely creating branches will be denied +# in the repository. By default this is allowed. +# + +# --- Command line +refname="$1" +oldrev="$2" +newrev="$3" + +# --- Safety check +if [ -z "$GIT_DIR" ]; then + echo "Don't run this script from the command line." >&2 + echo " (if you want, you could supply GIT_DIR then run" >&2 + echo " $0 <ref> <oldrev> <newrev>)" >&2 + exit 1 +fi + +if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then + echo "Usage: $0 <ref> <oldrev> <newrev>" >&2 + exit 1 +fi + +# --- Config +allowunannotated=$(git config --bool hooks.allowunannotated) +allowdeletebranch=$(git config --bool hooks.allowdeletebranch) +denycreatebranch=$(git config --bool hooks.denycreatebranch) +allowdeletetag=$(git config --bool hooks.allowdeletetag) +allowmodifytag=$(git config --bool hooks.allowmodifytag) + +# check for no description +projectdesc=$(sed -e '1q' "$GIT_DIR/description") +case "$projectdesc" in +"Unnamed repository"* | "") + echo "*** Project description file hasn't been set" >&2 + exit 1 + ;; +esac + +# --- Check types +# if $newrev is 0000...0000, it's a commit to delete a ref. +zero="0000000000000000000000000000000000000000" +if [ "$newrev" = "$zero" ]; then + newrev_type=delete +else + newrev_type=$(git cat-file -t $newrev) +fi + +case "$refname","$newrev_type" in + refs/tags/*,commit) + # un-annotated tag + short_refname=${refname##refs/tags/} + if [ "$allowunannotated" != "true" ]; then + echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 + echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 + exit 1 + fi + ;; + refs/tags/*,delete) + # delete tag + if [ "$allowdeletetag" != "true" ]; then + echo "*** Deleting a tag is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/tags/*,tag) + # annotated tag + if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 + then + echo "*** Tag '$refname' already exists." >&2 + echo "*** Modifying a tag is not allowed in this repository." >&2 + exit 1 + fi + ;; + refs/heads/*,commit) + # branch + if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then + echo "*** Creating a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/heads/*,delete) + # delete branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/remotes/*,commit) + # tracking branch + ;; + refs/remotes/*,delete) + # delete tracking branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a tracking branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + *) + # Anything else (is there anything else?) + echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 + exit 1 + ;; +esac + +# --- Finished +exit 0 diff --git a/tests/data/bare_empty/info/exclude b/tests/data/bare_empty/info/exclude new file mode 100644 index 0000000..a5196d1 --- /dev/null +++ b/tests/data/bare_empty/info/exclude @@ -0,0 +1,6 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ diff --git a/tests/data/bare_repo1/HEAD b/tests/data/bare_repo1/HEAD new file mode 100644 index 0000000..cb089cd --- /dev/null +++ b/tests/data/bare_repo1/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/tests/data/bare_repo1/config b/tests/data/bare_repo1/config new file mode 100644 index 0000000..07d359d --- /dev/null +++ b/tests/data/bare_repo1/config @@ -0,0 +1,4 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true diff --git a/tests/data/bare_repo1/description b/tests/data/bare_repo1/description new file mode 100644 index 0000000..498b267 --- /dev/null +++ b/tests/data/bare_repo1/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/tests/data/bare_repo1/hooks/applypatch-msg.sample b/tests/data/bare_repo1/hooks/applypatch-msg.sample new file mode 100755 index 0000000..8b2a2fe --- /dev/null +++ b/tests/data/bare_repo1/hooks/applypatch-msg.sample @@ -0,0 +1,15 @@ +#!/bin/sh +# +# An example hook script to check the commit log message taken by +# applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. The hook is +# allowed to edit the commit message file. +# +# To enable this hook, rename this file to "applypatch-msg". + +. git-sh-setup +test -x "$GIT_DIR/hooks/commit-msg" && + exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"} +: diff --git a/tests/data/bare_repo1/hooks/commit-msg.sample b/tests/data/bare_repo1/hooks/commit-msg.sample new file mode 100755 index 0000000..b58d118 --- /dev/null +++ b/tests/data/bare_repo1/hooks/commit-msg.sample @@ -0,0 +1,24 @@ +#!/bin/sh +# +# An example hook script to check the commit log message. +# Called by "git commit" with one argument, the name of the file +# that has the commit message. The hook should exit with non-zero +# status after issuing an appropriate message if it wants to stop the +# commit. The hook is allowed to edit the commit message file. +# +# To enable this hook, rename this file to "commit-msg". + +# Uncomment the below to add a Signed-off-by line to the message. +# Doing this in a hook is a bad idea in general, but the prepare-commit-msg +# hook is more suited to it. +# +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" + +# This example catches duplicate Signed-off-by lines. + +test "" = "$(grep '^Signed-off-by: ' "$1" | + sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { + echo >&2 Duplicate Signed-off-by lines. + exit 1 +} diff --git a/tests/data/bare_repo1/hooks/post-update.sample b/tests/data/bare_repo1/hooks/post-update.sample new file mode 100755 index 0000000..ec17ec1 --- /dev/null +++ b/tests/data/bare_repo1/hooks/post-update.sample @@ -0,0 +1,8 @@ +#!/bin/sh +# +# An example hook script to prepare a packed repository for use over +# dumb transports. +# +# To enable this hook, rename this file to "post-update". + +exec git update-server-info diff --git a/tests/data/bare_repo1/hooks/pre-applypatch.sample b/tests/data/bare_repo1/hooks/pre-applypatch.sample new file mode 100755 index 0000000..b1f187c --- /dev/null +++ b/tests/data/bare_repo1/hooks/pre-applypatch.sample @@ -0,0 +1,14 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed +# by applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-applypatch". + +. git-sh-setup +test -x "$GIT_DIR/hooks/pre-commit" && + exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"} +: diff --git a/tests/data/bare_repo1/hooks/pre-commit.sample b/tests/data/bare_repo1/hooks/pre-commit.sample new file mode 100755 index 0000000..18c4829 --- /dev/null +++ b/tests/data/bare_repo1/hooks/pre-commit.sample @@ -0,0 +1,50 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git commit" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message if +# it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-commit". + +if git rev-parse --verify HEAD >/dev/null 2>&1 +then + against=HEAD +else + # Initial commit: diff against an empty tree object + against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 +fi + +# If you want to allow non-ascii filenames set this variable to true. +allownonascii=$(git config hooks.allownonascii) + +# Redirect output to stderr. +exec 1>&2 + +# Cross platform projects tend to avoid non-ascii filenames; prevent +# them from being added to the repository. We exploit the fact that the +# printable range starts at the space character and ends with tilde. +if [ "$allownonascii" != "true" ] && + # Note that the use of brackets around a tr range is ok here, (it's + # even required, for portability to Solaris 10's /usr/bin/tr), since + # the square bracket bytes happen to fall in the designated range. + test $(git diff --cached --name-only --diff-filter=A -z $against | + LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 +then + echo "Error: Attempt to add a non-ascii file name." + echo + echo "This can cause problems if you want to work" + echo "with people on other platforms." + echo + echo "To be portable it is advisable to rename the file ..." + echo + echo "If you know what you are doing you can disable this" + echo "check using:" + echo + echo " git config hooks.allownonascii true" + echo + exit 1 +fi + +# If there are whitespace errors, print the offending file names and fail. +exec git diff-index --check --cached $against -- diff --git a/tests/data/bare_repo1/hooks/pre-rebase.sample b/tests/data/bare_repo1/hooks/pre-rebase.sample new file mode 100755 index 0000000..9773ed4 --- /dev/null +++ b/tests/data/bare_repo1/hooks/pre-rebase.sample @@ -0,0 +1,169 @@ +#!/bin/sh +# +# Copyright (c) 2006, 2008 Junio C Hamano +# +# The "pre-rebase" hook is run just before "git rebase" starts doing +# its job, and can prevent the command from running by exiting with +# non-zero status. +# +# The hook is called with the following parameters: +# +# $1 -- the upstream the series was forked from. +# $2 -- the branch being rebased (or empty when rebasing the current branch). +# +# This sample shows how to prevent topic branches that are already +# merged to 'next' branch from getting rebased, because allowing it +# would result in rebasing already published history. + +publish=next +basebranch="$1" +if test "$#" = 2 +then + topic="refs/heads/$2" +else + topic=`git symbolic-ref HEAD` || + exit 0 ;# we do not interrupt rebasing detached HEAD +fi + +case "$topic" in +refs/heads/??/*) + ;; +*) + exit 0 ;# we do not interrupt others. + ;; +esac + +# Now we are dealing with a topic branch being rebased +# on top of master. Is it OK to rebase it? + +# Does the topic really exist? +git show-ref -q "$topic" || { + echo >&2 "No such branch $topic" + exit 1 +} + +# Is topic fully merged to master? +not_in_master=`git rev-list --pretty=oneline ^master "$topic"` +if test -z "$not_in_master" +then + echo >&2 "$topic is fully merged to master; better remove it." + exit 1 ;# we could allow it, but there is no point. +fi + +# Is topic ever merged to next? If so you should not be rebasing it. +only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` +only_next_2=`git rev-list ^master ${publish} | sort` +if test "$only_next_1" = "$only_next_2" +then + not_in_topic=`git rev-list "^$topic" master` + if test -z "$not_in_topic" + then + echo >&2 "$topic is already up-to-date with master" + exit 1 ;# we could allow it, but there is no point. + else + exit 0 + fi +else + not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` + /usr/bin/perl -e ' + my $topic = $ARGV[0]; + my $msg = "* $topic has commits already merged to public branch:\n"; + my (%not_in_next) = map { + /^([0-9a-f]+) /; + ($1 => 1); + } split(/\n/, $ARGV[1]); + for my $elem (map { + /^([0-9a-f]+) (.*)$/; + [$1 => $2]; + } split(/\n/, $ARGV[2])) { + if (!exists $not_in_next{$elem->[0]}) { + if ($msg) { + print STDERR $msg; + undef $msg; + } + print STDERR " $elem->[1]\n"; + } + } + ' "$topic" "$not_in_next" "$not_in_master" + exit 1 +fi + +exit 0 + +################################################################ + +This sample hook safeguards topic branches that have been +published from being rewound. + +The workflow assumed here is: + + * Once a topic branch forks from "master", "master" is never + merged into it again (either directly or indirectly). + + * Once a topic branch is fully cooked and merged into "master", + it is deleted. If you need to build on top of it to correct + earlier mistakes, a new topic branch is created by forking at + the tip of the "master". This is not strictly necessary, but + it makes it easier to keep your history simple. + + * Whenever you need to test or publish your changes to topic + branches, merge them into "next" branch. + +The script, being an example, hardcodes the publish branch name +to be "next", but it is trivial to make it configurable via +$GIT_DIR/config mechanism. + +With this workflow, you would want to know: + +(1) ... if a topic branch has ever been merged to "next". Young + topic branches can have stupid mistakes you would rather + clean up before publishing, and things that have not been + merged into other branches can be easily rebased without + affecting other people. But once it is published, you would + not want to rewind it. + +(2) ... if a topic branch has been fully merged to "master". + Then you can delete it. More importantly, you should not + build on top of it -- other people may already want to + change things related to the topic as patches against your + "master", so if you need further changes, it is better to + fork the topic (perhaps with the same name) afresh from the + tip of "master". + +Let's look at this example: + + o---o---o---o---o---o---o---o---o---o "next" + / / / / + / a---a---b A / / + / / / / + / / c---c---c---c B / + / / / \ / + / / / b---b C \ / + / / / / \ / + ---o---o---o---o---o---o---o---o---o---o---o "master" + + +A, B and C are topic branches. + + * A has one fix since it was merged up to "next". + + * B has finished. It has been fully merged up to "master" and "next", + and is ready to be deleted. + + * C has not merged to "next" at all. + +We would want to allow C to be rebased, refuse A, and encourage +B to be deleted. + +To compute (1): + + git rev-list ^master ^topic next + git rev-list ^master next + + if these match, topic has not merged in next at all. + +To compute (2): + + git rev-list master..topic + + if this is empty, it is fully merged to "master". diff --git a/tests/data/bare_repo1/hooks/prepare-commit-msg.sample b/tests/data/bare_repo1/hooks/prepare-commit-msg.sample new file mode 100755 index 0000000..f093a02 --- /dev/null +++ b/tests/data/bare_repo1/hooks/prepare-commit-msg.sample @@ -0,0 +1,36 @@ +#!/bin/sh +# +# An example hook script to prepare the commit log message. +# Called by "git commit" with the name of the file that has the +# commit message, followed by the description of the commit +# message's source. The hook's purpose is to edit the commit +# message file. If the hook fails with a non-zero status, +# the commit is aborted. +# +# To enable this hook, rename this file to "prepare-commit-msg". + +# This hook includes three examples. The first comments out the +# "Conflicts:" part of a merge commit. +# +# The second includes the output of "git diff --name-status -r" +# into the message, just before the "git status" output. It is +# commented because it doesn't cope with --amend or with squashed +# commits. +# +# The third example adds a Signed-off-by line to the message, that can +# still be edited. This is rarely a good idea. + +case "$2,$3" in + merge,) + /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;; + +# ,|template,) +# /usr/bin/perl -i.bak -pe ' +# print "\n" . `git diff --cached --name-status -r` +# if /^#/ && $first++ == 0' "$1" ;; + + *) ;; +esac + +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" diff --git a/tests/data/bare_repo1/hooks/update.sample b/tests/data/bare_repo1/hooks/update.sample new file mode 100755 index 0000000..71ab04e --- /dev/null +++ b/tests/data/bare_repo1/hooks/update.sample @@ -0,0 +1,128 @@ +#!/bin/sh +# +# An example hook script to blocks unannotated tags from entering. +# Called by "git receive-pack" with arguments: refname sha1-old sha1-new +# +# To enable this hook, rename this file to "update". +# +# Config +# ------ +# hooks.allowunannotated +# This boolean sets whether unannotated tags will be allowed into the +# repository. By default they won't be. +# hooks.allowdeletetag +# This boolean sets whether deleting tags will be allowed in the +# repository. By default they won't be. +# hooks.allowmodifytag +# This boolean sets whether a tag may be modified after creation. By default +# it won't be. +# hooks.allowdeletebranch +# This boolean sets whether deleting branches will be allowed in the +# repository. By default they won't be. +# hooks.denycreatebranch +# This boolean sets whether remotely creating branches will be denied +# in the repository. By default this is allowed. +# + +# --- Command line +refname="$1" +oldrev="$2" +newrev="$3" + +# --- Safety check +if [ -z "$GIT_DIR" ]; then + echo "Don't run this script from the command line." >&2 + echo " (if you want, you could supply GIT_DIR then run" >&2 + echo " $0 <ref> <oldrev> <newrev>)" >&2 + exit 1 +fi + +if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then + echo "Usage: $0 <ref> <oldrev> <newrev>" >&2 + exit 1 +fi + +# --- Config +allowunannotated=$(git config --bool hooks.allowunannotated) +allowdeletebranch=$(git config --bool hooks.allowdeletebranch) +denycreatebranch=$(git config --bool hooks.denycreatebranch) +allowdeletetag=$(git config --bool hooks.allowdeletetag) +allowmodifytag=$(git config --bool hooks.allowmodifytag) + +# check for no description +projectdesc=$(sed -e '1q' "$GIT_DIR/description") +case "$projectdesc" in +"Unnamed repository"* | "") + echo "*** Project description file hasn't been set" >&2 + exit 1 + ;; +esac + +# --- Check types +# if $newrev is 0000...0000, it's a commit to delete a ref. +zero="0000000000000000000000000000000000000000" +if [ "$newrev" = "$zero" ]; then + newrev_type=delete +else + newrev_type=$(git cat-file -t $newrev) +fi + +case "$refname","$newrev_type" in + refs/tags/*,commit) + # un-annotated tag + short_refname=${refname##refs/tags/} + if [ "$allowunannotated" != "true" ]; then + echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 + echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 + exit 1 + fi + ;; + refs/tags/*,delete) + # delete tag + if [ "$allowdeletetag" != "true" ]; then + echo "*** Deleting a tag is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/tags/*,tag) + # annotated tag + if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 + then + echo "*** Tag '$refname' already exists." >&2 + echo "*** Modifying a tag is not allowed in this repository." >&2 + exit 1 + fi + ;; + refs/heads/*,commit) + # branch + if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then + echo "*** Creating a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/heads/*,delete) + # delete branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/remotes/*,commit) + # tracking branch + ;; + refs/remotes/*,delete) + # delete tracking branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a tracking branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + *) + # Anything else (is there anything else?) + echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 + exit 1 + ;; +esac + +# --- Finished +exit 0 diff --git a/tests/data/bare_repo1/info/exclude b/tests/data/bare_repo1/info/exclude new file mode 100644 index 0000000..a5196d1 --- /dev/null +++ b/tests/data/bare_repo1/info/exclude @@ -0,0 +1,6 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ diff --git a/tests/data/bare_repo1/objects/01/2a5cc43dc373b37204b9b17708bd95608698bb b/tests/data/bare_repo1/objects/01/2a5cc43dc373b37204b9b17708bd95608698bb new file mode 100644 index 0000000..986b00b Binary files /dev/null and b/tests/data/bare_repo1/objects/01/2a5cc43dc373b37204b9b17708bd95608698bb differ diff --git a/tests/data/bare_repo1/objects/05/dc1678ac5b0cf59d349b7bf5dba604c33cf994 b/tests/data/bare_repo1/objects/05/dc1678ac5b0cf59d349b7bf5dba604c33cf994 new file mode 100644 index 0000000..c7c8d9a Binary files /dev/null and b/tests/data/bare_repo1/objects/05/dc1678ac5b0cf59d349b7bf5dba604c33cf994 differ diff --git a/tests/data/bare_repo1/objects/06/6e9e87baf6c6839827b3fe48e4ca697c28be3f b/tests/data/bare_repo1/objects/06/6e9e87baf6c6839827b3fe48e4ca697c28be3f new file mode 100644 index 0000000..f9f5185 --- /dev/null +++ b/tests/data/bare_repo1/objects/06/6e9e87baf6c6839827b3fe48e4ca697c28be3f @@ -0,0 +1,2 @@ +x; +1@sd.,l'?b<x;38VlAHSt^E1dcp&BVWr ;Z/=BQv”fKV%?k]*K:N.pQM:zCQ3BښOl>d \ No newline at end of file diff --git a/tests/data/bare_repo1/objects/13/a00eab105e95f58f346db646ecf13cc2f170a1 b/tests/data/bare_repo1/objects/13/a00eab105e95f58f346db646ecf13cc2f170a1 new file mode 100644 index 0000000..740cd3e Binary files /dev/null and b/tests/data/bare_repo1/objects/13/a00eab105e95f58f346db646ecf13cc2f170a1 differ diff --git a/tests/data/bare_repo1/objects/1a/868b38d6ac6f1adaea5f9c078ca820cc209c33 b/tests/data/bare_repo1/objects/1a/868b38d6ac6f1adaea5f9c078ca820cc209c33 new file mode 100644 index 0000000..d288a2d Binary files /dev/null and b/tests/data/bare_repo1/objects/1a/868b38d6ac6f1adaea5f9c078ca820cc209c33 differ diff --git a/tests/data/bare_repo1/objects/35/42065401137fc6769a34601015abc863d2d7a9 b/tests/data/bare_repo1/objects/35/42065401137fc6769a34601015abc863d2d7a9 new file mode 100644 index 0000000..61afdc9 --- /dev/null +++ b/tests/data/bare_repo1/objects/35/42065401137fc6769a34601015abc863d2d7a9 @@ -0,0 +1,2 @@ +x= +1@a" v23[5^ۺ.:HUPDKBxƠ$ư6}u*p5'I(2#k`϶ǝ=Gv6*N֋| N^sQeٜ\i? \ No newline at end of file diff --git a/tests/data/bare_repo1/objects/36/acba7b28e18a4ea3f1603120053bec604d31cd b/tests/data/bare_repo1/objects/36/acba7b28e18a4ea3f1603120053bec604d31cd new file mode 100644 index 0000000..3a7b6e4 Binary files /dev/null and b/tests/data/bare_repo1/objects/36/acba7b28e18a4ea3f1603120053bec604d31cd differ diff --git a/tests/data/bare_repo1/objects/3a/89561dfe64403098261081a2f852c45522e06f b/tests/data/bare_repo1/objects/3a/89561dfe64403098261081a2f852c45522e06f new file mode 100644 index 0000000..48d2929 Binary files /dev/null and b/tests/data/bare_repo1/objects/3a/89561dfe64403098261081a2f852c45522e06f differ diff --git a/tests/data/bare_repo1/objects/47/910a23e8c83b553fc2cec98bce8495f3542459 b/tests/data/bare_repo1/objects/47/910a23e8c83b553fc2cec98bce8495f3542459 new file mode 100644 index 0000000..a1f9a4d --- /dev/null +++ b/tests/data/bare_repo1/objects/47/910a23e8c83b553fc2cec98bce8495f3542459 @@ -0,0 +1 @@ +x+)JMU07b040031QrutuMa*;&3GvPyNJ*K-+(aHW~EjW5F \ No newline at end of file diff --git a/tests/data/bare_repo1/objects/4b/c90207e76d68d5cda435e67c5f85a0ce710f44 b/tests/data/bare_repo1/objects/4b/c90207e76d68d5cda435e67c5f85a0ce710f44 new file mode 100644 index 0000000..be1a60b --- /dev/null +++ b/tests/data/bare_repo1/objects/4b/c90207e76d68d5cda435e67c5f85a0ce710f44 @@ -0,0 +1,2 @@ +xA +1 E] i&i "znӦo}xWڲ;xCj8H3 q`ɹNbEEx~nu`ȪȓbdLg~Xy$+;mkwڮ면q5 F8bDtca~?X \ No newline at end of file diff --git a/tests/data/bare_repo1/objects/4c/2d1736b42adec40bf139e8d0db2e2ecf153175 b/tests/data/bare_repo1/objects/4c/2d1736b42adec40bf139e8d0db2e2ecf153175 new file mode 100644 index 0000000..c541362 Binary files /dev/null and b/tests/data/bare_repo1/objects/4c/2d1736b42adec40bf139e8d0db2e2ecf153175 differ diff --git a/tests/data/bare_repo1/objects/52/b93c62d74ba313c57ae40a2ffe24fa6e330764 b/tests/data/bare_repo1/objects/52/b93c62d74ba313c57ae40a2ffe24fa6e330764 new file mode 100644 index 0000000..2625012 Binary files /dev/null and b/tests/data/bare_repo1/objects/52/b93c62d74ba313c57ae40a2ffe24fa6e330764 differ diff --git a/tests/data/bare_repo1/objects/59/0e02bcae97a2d86a8731e38127e6dd7965b7d1 b/tests/data/bare_repo1/objects/59/0e02bcae97a2d86a8731e38127e6dd7965b7d1 new file mode 100644 index 0000000..35b36ee Binary files /dev/null and b/tests/data/bare_repo1/objects/59/0e02bcae97a2d86a8731e38127e6dd7965b7d1 differ diff --git a/tests/data/bare_repo1/objects/64/a69133b4011d219815548be4fcf6f0d1542c1d b/tests/data/bare_repo1/objects/64/a69133b4011d219815548be4fcf6f0d1542c1d new file mode 100644 index 0000000..8b04a2f Binary files /dev/null and b/tests/data/bare_repo1/objects/64/a69133b4011d219815548be4fcf6f0d1542c1d differ diff --git a/tests/data/bare_repo1/objects/64/b0b72d4cf13bd2d30ae8ca055b7b652919d71f b/tests/data/bare_repo1/objects/64/b0b72d4cf13bd2d30ae8ca055b7b652919d71f new file mode 100644 index 0000000..7f308d1 Binary files /dev/null and b/tests/data/bare_repo1/objects/64/b0b72d4cf13bd2d30ae8ca055b7b652919d71f differ diff --git a/tests/data/bare_repo1/objects/65/5f22bd07d13acf39f95d9f4372316d26d43b29 b/tests/data/bare_repo1/objects/65/5f22bd07d13acf39f95d9f4372316d26d43b29 new file mode 100644 index 0000000..453f6c5 Binary files /dev/null and b/tests/data/bare_repo1/objects/65/5f22bd07d13acf39f95d9f4372316d26d43b29 differ diff --git a/tests/data/bare_repo1/objects/74/bfa76dcd0bb5c0d303a02424d4814ae2a43363 b/tests/data/bare_repo1/objects/74/bfa76dcd0bb5c0d303a02424d4814ae2a43363 new file mode 100644 index 0000000..9b11122 Binary files /dev/null and b/tests/data/bare_repo1/objects/74/bfa76dcd0bb5c0d303a02424d4814ae2a43363 differ diff --git a/tests/data/bare_repo1/objects/7a/8a76c619b95af88fb71e5514509e9ac8da6779 b/tests/data/bare_repo1/objects/7a/8a76c619b95af88fb71e5514509e9ac8da6779 new file mode 100644 index 0000000..a0fff41 Binary files /dev/null and b/tests/data/bare_repo1/objects/7a/8a76c619b95af88fb71e5514509e9ac8da6779 differ diff --git a/tests/data/bare_repo1/objects/83/9a951514f8ddd2668790af1d6bda0ec65c0c15 b/tests/data/bare_repo1/objects/83/9a951514f8ddd2668790af1d6bda0ec65c0c15 new file mode 100644 index 0000000..9870fbf --- /dev/null +++ b/tests/data/bare_repo1/objects/83/9a951514f8ddd2668790af1d6bda0ec65c0c15 @@ -0,0 +1,3 @@ +x= +@F 23_fJ؀XX-J>Jl{!.KB>FY`DTLDL#.K該j\vF&ƀ^B<mzIC洬ӰnRXYkʃr +@ZrC}\?x;' DB \ No newline at end of file diff --git a/tests/data/bare_repo1/objects/91/19237c2d5aa2c4a110296e255c7ec194711066 b/tests/data/bare_repo1/objects/91/19237c2d5aa2c4a110296e255c7ec194711066 new file mode 100644 index 0000000..8176c3a Binary files /dev/null and b/tests/data/bare_repo1/objects/91/19237c2d5aa2c4a110296e255c7ec194711066 differ diff --git a/tests/data/bare_repo1/objects/ae/675998385b3705768599cbbe16d3a256a6654f b/tests/data/bare_repo1/objects/ae/675998385b3705768599cbbe16d3a256a6654f new file mode 100644 index 0000000..1ee8e5f Binary files /dev/null and b/tests/data/bare_repo1/objects/ae/675998385b3705768599cbbe16d3a256a6654f differ diff --git a/tests/data/bare_repo1/objects/b3/860fa0bbfe75205388d0978c9596e96ba11017 b/tests/data/bare_repo1/objects/b3/860fa0bbfe75205388d0978c9596e96ba11017 new file mode 100644 index 0000000..493a751 Binary files /dev/null and b/tests/data/bare_repo1/objects/b3/860fa0bbfe75205388d0978c9596e96ba11017 differ diff --git a/tests/data/bare_repo1/objects/b5/f5c98eddb34991a58968379d3c84e30c96e2ba b/tests/data/bare_repo1/objects/b5/f5c98eddb34991a58968379d3c84e30c96e2ba new file mode 100644 index 0000000..cbe5c11 Binary files /dev/null and b/tests/data/bare_repo1/objects/b5/f5c98eddb34991a58968379d3c84e30c96e2ba differ diff --git a/tests/data/bare_repo1/objects/bb/6ab86ec09821a067a4a751803ec5a790d94983 b/tests/data/bare_repo1/objects/bb/6ab86ec09821a067a4a751803ec5a790d94983 new file mode 100644 index 0000000..1865beb Binary files /dev/null and b/tests/data/bare_repo1/objects/bb/6ab86ec09821a067a4a751803ec5a790d94983 differ diff --git a/tests/data/bare_repo1/objects/bc/b54fa4adc5d1a75c834a9ba76def23b0b5631c b/tests/data/bare_repo1/objects/bc/b54fa4adc5d1a75c834a9ba76def23b0b5631c new file mode 100644 index 0000000..a79f6e9 Binary files /dev/null and b/tests/data/bare_repo1/objects/bc/b54fa4adc5d1a75c834a9ba76def23b0b5631c differ diff --git a/tests/data/bare_repo1/objects/be/483ca0381e9a61b76fac84863acdd970b9150f b/tests/data/bare_repo1/objects/be/483ca0381e9a61b76fac84863acdd970b9150f new file mode 100644 index 0000000..23a1548 Binary files /dev/null and b/tests/data/bare_repo1/objects/be/483ca0381e9a61b76fac84863acdd970b9150f differ diff --git a/tests/data/bare_repo1/objects/c4/02b2ab31377a9e98037a91ce787ab2ad070f3b b/tests/data/bare_repo1/objects/c4/02b2ab31377a9e98037a91ce787ab2ad070f3b new file mode 100644 index 0000000..be8766a Binary files /dev/null and b/tests/data/bare_repo1/objects/c4/02b2ab31377a9e98037a91ce787ab2ad070f3b differ diff --git a/tests/data/bare_repo1/objects/d0/5aa234b9323dbcd3d0067da45f98e73203dc15 b/tests/data/bare_repo1/objects/d0/5aa234b9323dbcd3d0067da45f98e73203dc15 new file mode 100644 index 0000000..086f6a8 Binary files /dev/null and b/tests/data/bare_repo1/objects/d0/5aa234b9323dbcd3d0067da45f98e73203dc15 differ diff --git a/tests/data/bare_repo1/objects/db/b594365a921689807d44c341c2d7c8faabe751 b/tests/data/bare_repo1/objects/db/b594365a921689807d44c341c2d7c8faabe751 new file mode 100644 index 0000000..1416ce9 --- /dev/null +++ b/tests/data/bare_repo1/objects/db/b594365a921689807d44c341c2d7c8faabe751 @@ -0,0 +1,2 @@ +xA +1 @Q=EM۴ wpi:b2d;Wpoc_j=[pJCBF#RbJf6Em/F* @L><Qr#q-9S7}>uw:26˩bu17Ij~> \ No newline at end of file diff --git a/tests/data/bare_repo1/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 b/tests/data/bare_repo1/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 new file mode 100644 index 0000000..7112238 Binary files /dev/null and b/tests/data/bare_repo1/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 differ diff --git a/tests/data/bare_repo1/objects/e9/f35005ca7d004d87732598f761b1be3b9d1c61 b/tests/data/bare_repo1/objects/e9/f35005ca7d004d87732598f761b1be3b9d1c61 new file mode 100644 index 0000000..6a25e7e --- /dev/null +++ b/tests/data/bare_repo1/objects/e9/f35005ca7d004d87732598f761b1be3b9d1c61 @@ -0,0 +1,2 @@ +xA +1 @Q=Ef@DmdE <sZk>atU()T@^WNqH)pY3՟qs<:<lpv?KvrN? u tei4q?_2 \ No newline at end of file diff --git a/tests/data/bare_repo1/objects/f0/c794d4092af4f194b4320751c05e83d6261663 b/tests/data/bare_repo1/objects/f0/c794d4092af4f194b4320751c05e83d6261663 new file mode 100644 index 0000000..dbee5c8 Binary files /dev/null and b/tests/data/bare_repo1/objects/f0/c794d4092af4f194b4320751c05e83d6261663 differ diff --git a/tests/data/bare_repo1/objects/f4/1be965b985d1e3e3e6a88f0416167723b9f78d b/tests/data/bare_repo1/objects/f4/1be965b985d1e3e3e6a88f0416167723b9f78d new file mode 100644 index 0000000..56d3b3c Binary files /dev/null and b/tests/data/bare_repo1/objects/f4/1be965b985d1e3e3e6a88f0416167723b9f78d differ diff --git a/tests/data/bare_repo1/refs/heads/chinese b/tests/data/bare_repo1/refs/heads/chinese new file mode 100644 index 0000000..76e5812 --- /dev/null +++ b/tests/data/bare_repo1/refs/heads/chinese @@ -0,0 +1 @@ +839a951514f8ddd2668790af1d6bda0ec65c0c15 diff --git a/tests/data/bare_repo1/refs/heads/master b/tests/data/bare_repo1/refs/heads/master new file mode 100644 index 0000000..a044a3e --- /dev/null +++ b/tests/data/bare_repo1/refs/heads/master @@ -0,0 +1 @@ +9119237c2d5aa2c4a110296e255c7ec194711066 diff --git a/tests/data/bare_repo2/HEAD b/tests/data/bare_repo2/HEAD new file mode 100644 index 0000000..cb089cd --- /dev/null +++ b/tests/data/bare_repo2/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/tests/data/bare_repo2/config b/tests/data/bare_repo2/config new file mode 100644 index 0000000..07d359d --- /dev/null +++ b/tests/data/bare_repo2/config @@ -0,0 +1,4 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true diff --git a/tests/data/bare_repo2/description b/tests/data/bare_repo2/description new file mode 100644 index 0000000..498b267 --- /dev/null +++ b/tests/data/bare_repo2/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/tests/data/bare_repo2/hooks/applypatch-msg.sample b/tests/data/bare_repo2/hooks/applypatch-msg.sample new file mode 100755 index 0000000..8b2a2fe --- /dev/null +++ b/tests/data/bare_repo2/hooks/applypatch-msg.sample @@ -0,0 +1,15 @@ +#!/bin/sh +# +# An example hook script to check the commit log message taken by +# applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. The hook is +# allowed to edit the commit message file. +# +# To enable this hook, rename this file to "applypatch-msg". + +. git-sh-setup +test -x "$GIT_DIR/hooks/commit-msg" && + exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"} +: diff --git a/tests/data/bare_repo2/hooks/commit-msg.sample b/tests/data/bare_repo2/hooks/commit-msg.sample new file mode 100755 index 0000000..b58d118 --- /dev/null +++ b/tests/data/bare_repo2/hooks/commit-msg.sample @@ -0,0 +1,24 @@ +#!/bin/sh +# +# An example hook script to check the commit log message. +# Called by "git commit" with one argument, the name of the file +# that has the commit message. The hook should exit with non-zero +# status after issuing an appropriate message if it wants to stop the +# commit. The hook is allowed to edit the commit message file. +# +# To enable this hook, rename this file to "commit-msg". + +# Uncomment the below to add a Signed-off-by line to the message. +# Doing this in a hook is a bad idea in general, but the prepare-commit-msg +# hook is more suited to it. +# +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" + +# This example catches duplicate Signed-off-by lines. + +test "" = "$(grep '^Signed-off-by: ' "$1" | + sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { + echo >&2 Duplicate Signed-off-by lines. + exit 1 +} diff --git a/tests/data/bare_repo2/hooks/post-update.sample b/tests/data/bare_repo2/hooks/post-update.sample new file mode 100755 index 0000000..ec17ec1 --- /dev/null +++ b/tests/data/bare_repo2/hooks/post-update.sample @@ -0,0 +1,8 @@ +#!/bin/sh +# +# An example hook script to prepare a packed repository for use over +# dumb transports. +# +# To enable this hook, rename this file to "post-update". + +exec git update-server-info diff --git a/tests/data/bare_repo2/hooks/pre-applypatch.sample b/tests/data/bare_repo2/hooks/pre-applypatch.sample new file mode 100755 index 0000000..b1f187c --- /dev/null +++ b/tests/data/bare_repo2/hooks/pre-applypatch.sample @@ -0,0 +1,14 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed +# by applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-applypatch". + +. git-sh-setup +test -x "$GIT_DIR/hooks/pre-commit" && + exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"} +: diff --git a/tests/data/bare_repo2/hooks/pre-commit.sample b/tests/data/bare_repo2/hooks/pre-commit.sample new file mode 100755 index 0000000..18c4829 --- /dev/null +++ b/tests/data/bare_repo2/hooks/pre-commit.sample @@ -0,0 +1,50 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git commit" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message if +# it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-commit". + +if git rev-parse --verify HEAD >/dev/null 2>&1 +then + against=HEAD +else + # Initial commit: diff against an empty tree object + against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 +fi + +# If you want to allow non-ascii filenames set this variable to true. +allownonascii=$(git config hooks.allownonascii) + +# Redirect output to stderr. +exec 1>&2 + +# Cross platform projects tend to avoid non-ascii filenames; prevent +# them from being added to the repository. We exploit the fact that the +# printable range starts at the space character and ends with tilde. +if [ "$allownonascii" != "true" ] && + # Note that the use of brackets around a tr range is ok here, (it's + # even required, for portability to Solaris 10's /usr/bin/tr), since + # the square bracket bytes happen to fall in the designated range. + test $(git diff --cached --name-only --diff-filter=A -z $against | + LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 +then + echo "Error: Attempt to add a non-ascii file name." + echo + echo "This can cause problems if you want to work" + echo "with people on other platforms." + echo + echo "To be portable it is advisable to rename the file ..." + echo + echo "If you know what you are doing you can disable this" + echo "check using:" + echo + echo " git config hooks.allownonascii true" + echo + exit 1 +fi + +# If there are whitespace errors, print the offending file names and fail. +exec git diff-index --check --cached $against -- diff --git a/tests/data/bare_repo2/hooks/pre-rebase.sample b/tests/data/bare_repo2/hooks/pre-rebase.sample new file mode 100755 index 0000000..9773ed4 --- /dev/null +++ b/tests/data/bare_repo2/hooks/pre-rebase.sample @@ -0,0 +1,169 @@ +#!/bin/sh +# +# Copyright (c) 2006, 2008 Junio C Hamano +# +# The "pre-rebase" hook is run just before "git rebase" starts doing +# its job, and can prevent the command from running by exiting with +# non-zero status. +# +# The hook is called with the following parameters: +# +# $1 -- the upstream the series was forked from. +# $2 -- the branch being rebased (or empty when rebasing the current branch). +# +# This sample shows how to prevent topic branches that are already +# merged to 'next' branch from getting rebased, because allowing it +# would result in rebasing already published history. + +publish=next +basebranch="$1" +if test "$#" = 2 +then + topic="refs/heads/$2" +else + topic=`git symbolic-ref HEAD` || + exit 0 ;# we do not interrupt rebasing detached HEAD +fi + +case "$topic" in +refs/heads/??/*) + ;; +*) + exit 0 ;# we do not interrupt others. + ;; +esac + +# Now we are dealing with a topic branch being rebased +# on top of master. Is it OK to rebase it? + +# Does the topic really exist? +git show-ref -q "$topic" || { + echo >&2 "No such branch $topic" + exit 1 +} + +# Is topic fully merged to master? +not_in_master=`git rev-list --pretty=oneline ^master "$topic"` +if test -z "$not_in_master" +then + echo >&2 "$topic is fully merged to master; better remove it." + exit 1 ;# we could allow it, but there is no point. +fi + +# Is topic ever merged to next? If so you should not be rebasing it. +only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` +only_next_2=`git rev-list ^master ${publish} | sort` +if test "$only_next_1" = "$only_next_2" +then + not_in_topic=`git rev-list "^$topic" master` + if test -z "$not_in_topic" + then + echo >&2 "$topic is already up-to-date with master" + exit 1 ;# we could allow it, but there is no point. + else + exit 0 + fi +else + not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` + /usr/bin/perl -e ' + my $topic = $ARGV[0]; + my $msg = "* $topic has commits already merged to public branch:\n"; + my (%not_in_next) = map { + /^([0-9a-f]+) /; + ($1 => 1); + } split(/\n/, $ARGV[1]); + for my $elem (map { + /^([0-9a-f]+) (.*)$/; + [$1 => $2]; + } split(/\n/, $ARGV[2])) { + if (!exists $not_in_next{$elem->[0]}) { + if ($msg) { + print STDERR $msg; + undef $msg; + } + print STDERR " $elem->[1]\n"; + } + } + ' "$topic" "$not_in_next" "$not_in_master" + exit 1 +fi + +exit 0 + +################################################################ + +This sample hook safeguards topic branches that have been +published from being rewound. + +The workflow assumed here is: + + * Once a topic branch forks from "master", "master" is never + merged into it again (either directly or indirectly). + + * Once a topic branch is fully cooked and merged into "master", + it is deleted. If you need to build on top of it to correct + earlier mistakes, a new topic branch is created by forking at + the tip of the "master". This is not strictly necessary, but + it makes it easier to keep your history simple. + + * Whenever you need to test or publish your changes to topic + branches, merge them into "next" branch. + +The script, being an example, hardcodes the publish branch name +to be "next", but it is trivial to make it configurable via +$GIT_DIR/config mechanism. + +With this workflow, you would want to know: + +(1) ... if a topic branch has ever been merged to "next". Young + topic branches can have stupid mistakes you would rather + clean up before publishing, and things that have not been + merged into other branches can be easily rebased without + affecting other people. But once it is published, you would + not want to rewind it. + +(2) ... if a topic branch has been fully merged to "master". + Then you can delete it. More importantly, you should not + build on top of it -- other people may already want to + change things related to the topic as patches against your + "master", so if you need further changes, it is better to + fork the topic (perhaps with the same name) afresh from the + tip of "master". + +Let's look at this example: + + o---o---o---o---o---o---o---o---o---o "next" + / / / / + / a---a---b A / / + / / / / + / / c---c---c---c B / + / / / \ / + / / / b---b C \ / + / / / / \ / + ---o---o---o---o---o---o---o---o---o---o---o "master" + + +A, B and C are topic branches. + + * A has one fix since it was merged up to "next". + + * B has finished. It has been fully merged up to "master" and "next", + and is ready to be deleted. + + * C has not merged to "next" at all. + +We would want to allow C to be rebased, refuse A, and encourage +B to be deleted. + +To compute (1): + + git rev-list ^master ^topic next + git rev-list ^master next + + if these match, topic has not merged in next at all. + +To compute (2): + + git rev-list master..topic + + if this is empty, it is fully merged to "master". diff --git a/tests/data/bare_repo2/hooks/prepare-commit-msg.sample b/tests/data/bare_repo2/hooks/prepare-commit-msg.sample new file mode 100755 index 0000000..f093a02 --- /dev/null +++ b/tests/data/bare_repo2/hooks/prepare-commit-msg.sample @@ -0,0 +1,36 @@ +#!/bin/sh +# +# An example hook script to prepare the commit log message. +# Called by "git commit" with the name of the file that has the +# commit message, followed by the description of the commit +# message's source. The hook's purpose is to edit the commit +# message file. If the hook fails with a non-zero status, +# the commit is aborted. +# +# To enable this hook, rename this file to "prepare-commit-msg". + +# This hook includes three examples. The first comments out the +# "Conflicts:" part of a merge commit. +# +# The second includes the output of "git diff --name-status -r" +# into the message, just before the "git status" output. It is +# commented because it doesn't cope with --amend or with squashed +# commits. +# +# The third example adds a Signed-off-by line to the message, that can +# still be edited. This is rarely a good idea. + +case "$2,$3" in + merge,) + /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;; + +# ,|template,) +# /usr/bin/perl -i.bak -pe ' +# print "\n" . `git diff --cached --name-status -r` +# if /^#/ && $first++ == 0' "$1" ;; + + *) ;; +esac + +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" diff --git a/tests/data/bare_repo2/hooks/update.sample b/tests/data/bare_repo2/hooks/update.sample new file mode 100755 index 0000000..71ab04e --- /dev/null +++ b/tests/data/bare_repo2/hooks/update.sample @@ -0,0 +1,128 @@ +#!/bin/sh +# +# An example hook script to blocks unannotated tags from entering. +# Called by "git receive-pack" with arguments: refname sha1-old sha1-new +# +# To enable this hook, rename this file to "update". +# +# Config +# ------ +# hooks.allowunannotated +# This boolean sets whether unannotated tags will be allowed into the +# repository. By default they won't be. +# hooks.allowdeletetag +# This boolean sets whether deleting tags will be allowed in the +# repository. By default they won't be. +# hooks.allowmodifytag +# This boolean sets whether a tag may be modified after creation. By default +# it won't be. +# hooks.allowdeletebranch +# This boolean sets whether deleting branches will be allowed in the +# repository. By default they won't be. +# hooks.denycreatebranch +# This boolean sets whether remotely creating branches will be denied +# in the repository. By default this is allowed. +# + +# --- Command line +refname="$1" +oldrev="$2" +newrev="$3" + +# --- Safety check +if [ -z "$GIT_DIR" ]; then + echo "Don't run this script from the command line." >&2 + echo " (if you want, you could supply GIT_DIR then run" >&2 + echo " $0 <ref> <oldrev> <newrev>)" >&2 + exit 1 +fi + +if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then + echo "Usage: $0 <ref> <oldrev> <newrev>" >&2 + exit 1 +fi + +# --- Config +allowunannotated=$(git config --bool hooks.allowunannotated) +allowdeletebranch=$(git config --bool hooks.allowdeletebranch) +denycreatebranch=$(git config --bool hooks.denycreatebranch) +allowdeletetag=$(git config --bool hooks.allowdeletetag) +allowmodifytag=$(git config --bool hooks.allowmodifytag) + +# check for no description +projectdesc=$(sed -e '1q' "$GIT_DIR/description") +case "$projectdesc" in +"Unnamed repository"* | "") + echo "*** Project description file hasn't been set" >&2 + exit 1 + ;; +esac + +# --- Check types +# if $newrev is 0000...0000, it's a commit to delete a ref. +zero="0000000000000000000000000000000000000000" +if [ "$newrev" = "$zero" ]; then + newrev_type=delete +else + newrev_type=$(git cat-file -t $newrev) +fi + +case "$refname","$newrev_type" in + refs/tags/*,commit) + # un-annotated tag + short_refname=${refname##refs/tags/} + if [ "$allowunannotated" != "true" ]; then + echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 + echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 + exit 1 + fi + ;; + refs/tags/*,delete) + # delete tag + if [ "$allowdeletetag" != "true" ]; then + echo "*** Deleting a tag is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/tags/*,tag) + # annotated tag + if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 + then + echo "*** Tag '$refname' already exists." >&2 + echo "*** Modifying a tag is not allowed in this repository." >&2 + exit 1 + fi + ;; + refs/heads/*,commit) + # branch + if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then + echo "*** Creating a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/heads/*,delete) + # delete branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/remotes/*,commit) + # tracking branch + ;; + refs/remotes/*,delete) + # delete tracking branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a tracking branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + *) + # Anything else (is there anything else?) + echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 + exit 1 + ;; +esac + +# --- Finished +exit 0 diff --git a/tests/data/bare_repo2/info/exclude b/tests/data/bare_repo2/info/exclude new file mode 100644 index 0000000..a5196d1 --- /dev/null +++ b/tests/data/bare_repo2/info/exclude @@ -0,0 +1,6 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ diff --git a/tests/data/doc_repo/HEAD b/tests/data/doc_repo/HEAD new file mode 100644 index 0000000..cb089cd --- /dev/null +++ b/tests/data/doc_repo/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/tests/data/doc_repo/config b/tests/data/doc_repo/config new file mode 100644 index 0000000..4f7d452 --- /dev/null +++ b/tests/data/doc_repo/config @@ -0,0 +1,6 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true + ignorecase = true + precomposeunicode = false diff --git a/tests/data/doc_repo/description b/tests/data/doc_repo/description new file mode 100644 index 0000000..498b267 --- /dev/null +++ b/tests/data/doc_repo/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/tests/data/doc_repo/hooks/applypatch-msg.sample b/tests/data/doc_repo/hooks/applypatch-msg.sample new file mode 100755 index 0000000..a5008f1 --- /dev/null +++ b/tests/data/doc_repo/hooks/applypatch-msg.sample @@ -0,0 +1,15 @@ +#!/Users/xtao/gentoo/bin/sh +# +# An example hook script to check the commit log message taken by +# applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. The hook is +# allowed to edit the commit message file. +# +# To enable this hook, rename this file to "applypatch-msg". + +. git-sh-setup +test -x "$GIT_DIR/hooks/commit-msg" && + exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"} +: diff --git a/tests/data/doc_repo/hooks/commit-msg.sample b/tests/data/doc_repo/hooks/commit-msg.sample new file mode 100755 index 0000000..0b17717 --- /dev/null +++ b/tests/data/doc_repo/hooks/commit-msg.sample @@ -0,0 +1,24 @@ +#!/Users/xtao/gentoo/bin/sh +# +# An example hook script to check the commit log message. +# Called by "git commit" with one argument, the name of the file +# that has the commit message. The hook should exit with non-zero +# status after issuing an appropriate message if it wants to stop the +# commit. The hook is allowed to edit the commit message file. +# +# To enable this hook, rename this file to "commit-msg". + +# Uncomment the below to add a Signed-off-by line to the message. +# Doing this in a hook is a bad idea in general, but the prepare-commit-msg +# hook is more suited to it. +# +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" + +# This example catches duplicate Signed-off-by lines. + +test "" = "$(grep '^Signed-off-by: ' "$1" | + sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { + echo >&2 Duplicate Signed-off-by lines. + exit 1 +} diff --git a/tests/data/doc_repo/hooks/post-update.sample b/tests/data/doc_repo/hooks/post-update.sample new file mode 100755 index 0000000..1a2f907 --- /dev/null +++ b/tests/data/doc_repo/hooks/post-update.sample @@ -0,0 +1,8 @@ +#!/Users/xtao/gentoo/bin/sh +# +# An example hook script to prepare a packed repository for use over +# dumb transports. +# +# To enable this hook, rename this file to "post-update". + +exec git update-server-info diff --git a/tests/data/doc_repo/hooks/pre-applypatch.sample b/tests/data/doc_repo/hooks/pre-applypatch.sample new file mode 100755 index 0000000..6f4bbc3 --- /dev/null +++ b/tests/data/doc_repo/hooks/pre-applypatch.sample @@ -0,0 +1,14 @@ +#!/Users/xtao/gentoo/bin/sh +# +# An example hook script to verify what is about to be committed +# by applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-applypatch". + +. git-sh-setup +test -x "$GIT_DIR/hooks/pre-commit" && + exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"} +: diff --git a/tests/data/doc_repo/hooks/pre-commit.sample b/tests/data/doc_repo/hooks/pre-commit.sample new file mode 100755 index 0000000..6d9c0ec --- /dev/null +++ b/tests/data/doc_repo/hooks/pre-commit.sample @@ -0,0 +1,50 @@ +#!/Users/xtao/gentoo/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git commit" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message if +# it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-commit". + +if git rev-parse --verify HEAD >/dev/null 2>&1 +then + against=HEAD +else + # Initial commit: diff against an empty tree object + against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 +fi + +# If you want to allow non-ascii filenames set this variable to true. +allownonascii=$(git config hooks.allownonascii) + +# Redirect output to stderr. +exec 1>&2 + +# Cross platform projects tend to avoid non-ascii filenames; prevent +# them from being added to the repository. We exploit the fact that the +# printable range starts at the space character and ends with tilde. +if [ "$allownonascii" != "true" ] && + # Note that the use of brackets around a tr range is ok here, (it's + # even required, for portability to Solaris 10's /usr/bin/tr), since + # the square bracket bytes happen to fall in the designated range. + test $(git diff --cached --name-only --diff-filter=A -z $against | + LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 +then + echo "Error: Attempt to add a non-ascii file name." + echo + echo "This can cause problems if you want to work" + echo "with people on other platforms." + echo + echo "To be portable it is advisable to rename the file ..." + echo + echo "If you know what you are doing you can disable this" + echo "check using:" + echo + echo " git config hooks.allownonascii true" + echo + exit 1 +fi + +# If there are whitespace errors, print the offending file names and fail. +exec git diff-index --check --cached $against -- diff --git a/tests/data/doc_repo/hooks/pre-push.sample b/tests/data/doc_repo/hooks/pre-push.sample new file mode 100755 index 0000000..1fd45d6 --- /dev/null +++ b/tests/data/doc_repo/hooks/pre-push.sample @@ -0,0 +1,53 @@ +#!/Users/xtao/gentoo/bin/sh + +# An example hook script to verify what is about to be pushed. Called by "git +# push" after it has checked the remote status, but before anything has been +# pushed. If this script exits with a non-zero status nothing will be pushed. +# +# This hook is called with the following parameters: +# +# $1 -- Name of the remote to which the push is being done +# $2 -- URL to which the push is being done +# +# If pushing without using a named remote those arguments will be equal. +# +# Information about the commits which are being pushed is supplied as lines to +# the standard input in the form: +# +# <local ref> <local sha1> <remote ref> <remote sha1> +# +# This sample shows how to prevent push of commits where the log message starts +# with "WIP" (work in progress). + +remote="$1" +url="$2" + +z40=0000000000000000000000000000000000000000 + +IFS=' ' +while read local_ref local_sha remote_ref remote_sha +do + if [ "$local_sha" = $z40 ] + then + # Handle delete + else + if [ "$remote_sha" = $z40 ] + then + # New branch, examine all commits + range="$local_sha" + else + # Update to existing branch, examine new commits + range="$remote_sha..$local_sha" + fi + + # Check for WIP commit + commit=`git rev-list -n 1 --grep '^WIP' "$range"` + if [ -n "$commit" ] + then + echo "Found WIP commit in $local_ref, not pushing" + exit 1 + fi + fi +done + +exit 0 diff --git a/tests/data/doc_repo/hooks/pre-rebase.sample b/tests/data/doc_repo/hooks/pre-rebase.sample new file mode 100755 index 0000000..7253f53 --- /dev/null +++ b/tests/data/doc_repo/hooks/pre-rebase.sample @@ -0,0 +1,169 @@ +#!/Users/xtao/gentoo/bin/sh +# +# Copyright (c) 2006, 2008 Junio C Hamano +# +# The "pre-rebase" hook is run just before "git rebase" starts doing +# its job, and can prevent the command from running by exiting with +# non-zero status. +# +# The hook is called with the following parameters: +# +# $1 -- the upstream the series was forked from. +# $2 -- the branch being rebased (or empty when rebasing the current branch). +# +# This sample shows how to prevent topic branches that are already +# merged to 'next' branch from getting rebased, because allowing it +# would result in rebasing already published history. + +publish=next +basebranch="$1" +if test "$#" = 2 +then + topic="refs/heads/$2" +else + topic=`git symbolic-ref HEAD` || + exit 0 ;# we do not interrupt rebasing detached HEAD +fi + +case "$topic" in +refs/heads/??/*) + ;; +*) + exit 0 ;# we do not interrupt others. + ;; +esac + +# Now we are dealing with a topic branch being rebased +# on top of master. Is it OK to rebase it? + +# Does the topic really exist? +git show-ref -q "$topic" || { + echo >&2 "No such branch $topic" + exit 1 +} + +# Is topic fully merged to master? +not_in_master=`git rev-list --pretty=oneline ^master "$topic"` +if test -z "$not_in_master" +then + echo >&2 "$topic is fully merged to master; better remove it." + exit 1 ;# we could allow it, but there is no point. +fi + +# Is topic ever merged to next? If so you should not be rebasing it. +only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` +only_next_2=`git rev-list ^master ${publish} | sort` +if test "$only_next_1" = "$only_next_2" +then + not_in_topic=`git rev-list "^$topic" master` + if test -z "$not_in_topic" + then + echo >&2 "$topic is already up-to-date with master" + exit 1 ;# we could allow it, but there is no point. + else + exit 0 + fi +else + not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` + /Users/xtao/gentoo/usr/bin/perl -e ' + my $topic = $ARGV[0]; + my $msg = "* $topic has commits already merged to public branch:\n"; + my (%not_in_next) = map { + /^([0-9a-f]+) /; + ($1 => 1); + } split(/\n/, $ARGV[1]); + for my $elem (map { + /^([0-9a-f]+) (.*)$/; + [$1 => $2]; + } split(/\n/, $ARGV[2])) { + if (!exists $not_in_next{$elem->[0]}) { + if ($msg) { + print STDERR $msg; + undef $msg; + } + print STDERR " $elem->[1]\n"; + } + } + ' "$topic" "$not_in_next" "$not_in_master" + exit 1 +fi + +exit 0 + +################################################################ + +This sample hook safeguards topic branches that have been +published from being rewound. + +The workflow assumed here is: + + * Once a topic branch forks from "master", "master" is never + merged into it again (either directly or indirectly). + + * Once a topic branch is fully cooked and merged into "master", + it is deleted. If you need to build on top of it to correct + earlier mistakes, a new topic branch is created by forking at + the tip of the "master". This is not strictly necessary, but + it makes it easier to keep your history simple. + + * Whenever you need to test or publish your changes to topic + branches, merge them into "next" branch. + +The script, being an example, hardcodes the publish branch name +to be "next", but it is trivial to make it configurable via +$GIT_DIR/config mechanism. + +With this workflow, you would want to know: + +(1) ... if a topic branch has ever been merged to "next". Young + topic branches can have stupid mistakes you would rather + clean up before publishing, and things that have not been + merged into other branches can be easily rebased without + affecting other people. But once it is published, you would + not want to rewind it. + +(2) ... if a topic branch has been fully merged to "master". + Then you can delete it. More importantly, you should not + build on top of it -- other people may already want to + change things related to the topic as patches against your + "master", so if you need further changes, it is better to + fork the topic (perhaps with the same name) afresh from the + tip of "master". + +Let's look at this example: + + o---o---o---o---o---o---o---o---o---o "next" + / / / / + / a---a---b A / / + / / / / + / / c---c---c---c B / + / / / \ / + / / / b---b C \ / + / / / / \ / + ---o---o---o---o---o---o---o---o---o---o---o "master" + + +A, B and C are topic branches. + + * A has one fix since it was merged up to "next". + + * B has finished. It has been fully merged up to "master" and "next", + and is ready to be deleted. + + * C has not merged to "next" at all. + +We would want to allow C to be rebased, refuse A, and encourage +B to be deleted. + +To compute (1): + + git rev-list ^master ^topic next + git rev-list ^master next + + if these match, topic has not merged in next at all. + +To compute (2): + + git rev-list master..topic + + if this is empty, it is fully merged to "master". diff --git a/tests/data/doc_repo/hooks/prepare-commit-msg.sample b/tests/data/doc_repo/hooks/prepare-commit-msg.sample new file mode 100755 index 0000000..941cfa2 --- /dev/null +++ b/tests/data/doc_repo/hooks/prepare-commit-msg.sample @@ -0,0 +1,36 @@ +#!/Users/xtao/gentoo/bin/sh +# +# An example hook script to prepare the commit log message. +# Called by "git commit" with the name of the file that has the +# commit message, followed by the description of the commit +# message's source. The hook's purpose is to edit the commit +# message file. If the hook fails with a non-zero status, +# the commit is aborted. +# +# To enable this hook, rename this file to "prepare-commit-msg". + +# This hook includes three examples. The first comments out the +# "Conflicts:" part of a merge commit. +# +# The second includes the output of "git diff --name-status -r" +# into the message, just before the "git status" output. It is +# commented because it doesn't cope with --amend or with squashed +# commits. +# +# The third example adds a Signed-off-by line to the message, that can +# still be edited. This is rarely a good idea. + +case "$2,$3" in + merge,) + /Users/xtao/gentoo/usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;; + +# ,|template,) +# /Users/xtao/gentoo/usr/bin/perl -i.bak -pe ' +# print "\n" . `git diff --cached --name-status -r` +# if /^#/ && $first++ == 0' "$1" ;; + + *) ;; +esac + +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" diff --git a/tests/data/doc_repo/hooks/update.sample b/tests/data/doc_repo/hooks/update.sample new file mode 100755 index 0000000..42a5b84 --- /dev/null +++ b/tests/data/doc_repo/hooks/update.sample @@ -0,0 +1,128 @@ +#!/Users/xtao/gentoo/bin/sh +# +# An example hook script to blocks unannotated tags from entering. +# Called by "git receive-pack" with arguments: refname sha1-old sha1-new +# +# To enable this hook, rename this file to "update". +# +# Config +# ------ +# hooks.allowunannotated +# This boolean sets whether unannotated tags will be allowed into the +# repository. By default they won't be. +# hooks.allowdeletetag +# This boolean sets whether deleting tags will be allowed in the +# repository. By default they won't be. +# hooks.allowmodifytag +# This boolean sets whether a tag may be modified after creation. By default +# it won't be. +# hooks.allowdeletebranch +# This boolean sets whether deleting branches will be allowed in the +# repository. By default they won't be. +# hooks.denycreatebranch +# This boolean sets whether remotely creating branches will be denied +# in the repository. By default this is allowed. +# + +# --- Command line +refname="$1" +oldrev="$2" +newrev="$3" + +# --- Safety check +if [ -z "$GIT_DIR" ]; then + echo "Don't run this script from the command line." >&2 + echo " (if you want, you could supply GIT_DIR then run" >&2 + echo " $0 <ref> <oldrev> <newrev>)" >&2 + exit 1 +fi + +if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then + echo "usage: $0 <ref> <oldrev> <newrev>" >&2 + exit 1 +fi + +# --- Config +allowunannotated=$(git config --bool hooks.allowunannotated) +allowdeletebranch=$(git config --bool hooks.allowdeletebranch) +denycreatebranch=$(git config --bool hooks.denycreatebranch) +allowdeletetag=$(git config --bool hooks.allowdeletetag) +allowmodifytag=$(git config --bool hooks.allowmodifytag) + +# check for no description +projectdesc=$(sed -e '1q' "$GIT_DIR/description") +case "$projectdesc" in +"Unnamed repository"* | "") + echo "*** Project description file hasn't been set" >&2 + exit 1 + ;; +esac + +# --- Check types +# if $newrev is 0000...0000, it's a commit to delete a ref. +zero="0000000000000000000000000000000000000000" +if [ "$newrev" = "$zero" ]; then + newrev_type=delete +else + newrev_type=$(git cat-file -t $newrev) +fi + +case "$refname","$newrev_type" in + refs/tags/*,commit) + # un-annotated tag + short_refname=${refname##refs/tags/} + if [ "$allowunannotated" != "true" ]; then + echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 + echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 + exit 1 + fi + ;; + refs/tags/*,delete) + # delete tag + if [ "$allowdeletetag" != "true" ]; then + echo "*** Deleting a tag is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/tags/*,tag) + # annotated tag + if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 + then + echo "*** Tag '$refname' already exists." >&2 + echo "*** Modifying a tag is not allowed in this repository." >&2 + exit 1 + fi + ;; + refs/heads/*,commit) + # branch + if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then + echo "*** Creating a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/heads/*,delete) + # delete branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/remotes/*,commit) + # tracking branch + ;; + refs/remotes/*,delete) + # delete tracking branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a tracking branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + *) + # Anything else (is there anything else?) + echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 + exit 1 + ;; +esac + +# --- Finished +exit 0 diff --git a/tests/data/doc_repo/info/exclude b/tests/data/doc_repo/info/exclude new file mode 100644 index 0000000..a5196d1 --- /dev/null +++ b/tests/data/doc_repo/info/exclude @@ -0,0 +1,6 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ diff --git a/tests/data/doc_repo/objects/04/a4b0cf782194a7f8efb57337a5e3f09a6c5662 b/tests/data/doc_repo/objects/04/a4b0cf782194a7f8efb57337a5e3f09a6c5662 new file mode 100644 index 0000000..8dec78b Binary files /dev/null and b/tests/data/doc_repo/objects/04/a4b0cf782194a7f8efb57337a5e3f09a6c5662 differ diff --git a/tests/data/doc_repo/objects/13/343eb1e2731a40c3eefc6b2ea339d9389ab06e b/tests/data/doc_repo/objects/13/343eb1e2731a40c3eefc6b2ea339d9389ab06e new file mode 100644 index 0000000..1fe6bc3 Binary files /dev/null and b/tests/data/doc_repo/objects/13/343eb1e2731a40c3eefc6b2ea339d9389ab06e differ diff --git a/tests/data/doc_repo/objects/37/a1b81894bb3e6c220b5536de10f159005dbe07 b/tests/data/doc_repo/objects/37/a1b81894bb3e6c220b5536de10f159005dbe07 new file mode 100644 index 0000000..e6aa0b6 Binary files /dev/null and b/tests/data/doc_repo/objects/37/a1b81894bb3e6c220b5536de10f159005dbe07 differ diff --git a/tests/data/doc_repo/objects/52/4f95212fcd23c80c9466d2009be8abae259946 b/tests/data/doc_repo/objects/52/4f95212fcd23c80c9466d2009be8abae259946 new file mode 100644 index 0000000..262c8aa Binary files /dev/null and b/tests/data/doc_repo/objects/52/4f95212fcd23c80c9466d2009be8abae259946 differ diff --git a/tests/data/doc_repo/objects/61/f46b3ceff21f6e4f6bcb387caf03e68cbe6aec b/tests/data/doc_repo/objects/61/f46b3ceff21f6e4f6bcb387caf03e68cbe6aec new file mode 100644 index 0000000..b5211da Binary files /dev/null and b/tests/data/doc_repo/objects/61/f46b3ceff21f6e4f6bcb387caf03e68cbe6aec differ diff --git a/tests/data/doc_repo/objects/65/c4305075cbf9e57addf912c348155c0e859e0c b/tests/data/doc_repo/objects/65/c4305075cbf9e57addf912c348155c0e859e0c new file mode 100644 index 0000000..10949c1 Binary files /dev/null and b/tests/data/doc_repo/objects/65/c4305075cbf9e57addf912c348155c0e859e0c differ diff --git a/tests/data/doc_repo/objects/71/89c09be48f4739548b75eb037bc6f05b2006a2 b/tests/data/doc_repo/objects/71/89c09be48f4739548b75eb037bc6f05b2006a2 new file mode 100644 index 0000000..57bf5b7 Binary files /dev/null and b/tests/data/doc_repo/objects/71/89c09be48f4739548b75eb037bc6f05b2006a2 differ diff --git a/tests/data/doc_repo/objects/99/a8c39bb2079bac0c1902762664a72ae044f7cf b/tests/data/doc_repo/objects/99/a8c39bb2079bac0c1902762664a72ae044f7cf new file mode 100644 index 0000000..13620a5 Binary files /dev/null and b/tests/data/doc_repo/objects/99/a8c39bb2079bac0c1902762664a72ae044f7cf differ diff --git a/tests/data/doc_repo/objects/b4/b6127bafa84c478ebafd66f74eaf6abf324d8c b/tests/data/doc_repo/objects/b4/b6127bafa84c478ebafd66f74eaf6abf324d8c new file mode 100644 index 0000000..c89c830 Binary files /dev/null and b/tests/data/doc_repo/objects/b4/b6127bafa84c478ebafd66f74eaf6abf324d8c differ diff --git a/tests/data/doc_repo/objects/d6/bbae83c2ac2c98c0ddf4434b38d4b98d04d90d b/tests/data/doc_repo/objects/d6/bbae83c2ac2c98c0ddf4434b38d4b98d04d90d new file mode 100644 index 0000000..bc35d8e Binary files /dev/null and b/tests/data/doc_repo/objects/d6/bbae83c2ac2c98c0ddf4434b38d4b98d04d90d differ diff --git a/tests/data/doc_repo/objects/f3/1104c7a8dc076069165f14fa4d44cae9515006 b/tests/data/doc_repo/objects/f3/1104c7a8dc076069165f14fa4d44cae9515006 new file mode 100644 index 0000000..ac524f1 Binary files /dev/null and b/tests/data/doc_repo/objects/f3/1104c7a8dc076069165f14fa4d44cae9515006 differ diff --git a/tests/data/doc_repo/refs/heads/master b/tests/data/doc_repo/refs/heads/master new file mode 100644 index 0000000..31b41eb --- /dev/null +++ b/tests/data/doc_repo/refs/heads/master @@ -0,0 +1 @@ +7189c09be48f4739548b75eb037bc6f05b2006a2 diff --git a/tests/docs/__init__.py b/tests/docs/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/docs/test_doc.py b/tests/docs/test_doc.py new file mode 100644 index 0000000..55710f7 --- /dev/null +++ b/tests/docs/test_doc.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from vilya.models.doc import Doc diff --git a/tests/docs/test_doc_builder.py b/tests/docs/test_doc_builder.py new file mode 100644 index 0000000..e6e6d09 --- /dev/null +++ b/tests/docs/test_doc_builder.py @@ -0,0 +1,75 @@ +# -*- coding: utf-8 -*- + +import os +from vilya.models.doc import DocBuilder +from tests.utils import get_temp_project +from tests.base import TestCase + +DOC_REPO_PATH = os.path.join(os.path.dirname(__file__), + '../data/doc_repo') + + +class TestDocBuilder(TestCase): + + def setUp(self): + super(TestCase, self).setUp() + self.project = get_temp_project(repo_path=DOC_REPO_PATH) + + def tearDown(self): + self.project.delete() + super(TestCase, self).tearDown() + + def test_can_build(self): + project = self.project + builder = DocBuilder(project, 'pickle') + self.assertTrue(builder.can_build) + + def test_up_to_date(self): + project = self.project + builder = DocBuilder(project, 'pickle') + self.assertFalse(builder.up_to_date) + + def test_in_queue(self): + pass + + def test_enqueue(self): + pass + + def test_dequeue(self): + pass + + def test_build(self): + project = self.project + builder = DocBuilder(project, 'pickle') + builder.build() + test_path = builder.option.builder_doc_path + self.assertTrue(os.path.exists("%s/codeep-001.fpickle" % + test_path)) + self.assertTrue(os.path.exists("%s/index.fpickle" % + test_path)) + self.assertTrue(os.path.exists("%s/genindex.fpickle" % + test_path)) + self.assertTrue(os.path.exists("%s/search.fpickle" % + test_path)) + self.assertTrue(os.path.exists("%s/environment.pickle" % + test_path)) + + builder = DocBuilder(project, 'html') + builder.build() + test_path = builder.option.builder_doc_path + self.assertTrue(os.path.exists("%s/codeep-001.html" % + test_path)) + self.assertTrue(os.path.exists("%s/genindex.html" % + test_path)) + self.assertTrue(os.path.exists("%s/search.html" % + test_path)) + self.assertTrue(os.path.exists("%s/index.html" % + test_path)) + + builder = DocBuilder(project, 'raw') + builder.build() + test_path = builder.option.builder_doc_path + self.assertTrue(os.path.exists("%s/code-logo.png" % + test_path)) + self.assertTrue(os.path.exists("%s/index.html" % + test_path)) diff --git a/tests/docs/test_docs.py b/tests/docs/test_docs.py new file mode 100644 index 0000000..5b89aad --- /dev/null +++ b/tests/docs/test_docs.py @@ -0,0 +1,288 @@ +from vilya.models.project import CodeDoubanProject +from vilya.models.sphinx_docs import SphinxDocs + +import nose +from tests.base import TestCase +from tests.utils import delete_project + +base_yaml_conf_old = """ +sphinx_docs: + dir: "" +""" + +base_yaml_conf = """ +docs: + docs: + dir: "" + builder: pickle +""" + + +base_index_rst = """ +Unit testing sphinx docs +======================== + +.. toctree:: + :glob: + + * +""" + +base_document1_rst = """ +Test doc1 +========= + +Something here +""" + +base_document2_rst = """ +Test doc2 +========= + +Something here +""" + + +class TestDocsHelpers(TestCase): + html1 = '<h1>TITLE1**</h1>' + + def _prj(self): + delete_project('test') + prj = CodeDoubanProject.add('test', 'owner', create_trac=False) + return prj + + def _add(self, prj, fn, content): + u = self.addUser() + prj.git.commit_one_file(fn, content, 'add %s' % fn, u) + + +class TestDocs(TestDocsHelpers): + + @nose.tools.raises(Exception) + def test_create_wrong(self): + sd = SphinxDocs('unexisting_project') + assert sd.enabled is False + + def test_create_disabled(self): + prj = self._prj() + conf = """ + sphinx_docs: "" + docs: + docs: + builder: pickle + """ + self._add(prj, 'code_config.yaml', conf) + sd = SphinxDocs(prj.name) + assert sd.enabled is True, "should be enabled by default" + + def test_create_enabled(self): + prj = self._prj() + self._add(prj, 'code_config.yaml', base_yaml_conf) + sd = SphinxDocs(prj.name) + assert sd.enabled is True + + def test_create_with_index_and_doc(self): + prj = self._prj() + self._add(prj, 'code_config.yaml', base_yaml_conf) + self._add(prj, 'index.rst', base_index_rst) + self._add(prj, 'doc1.rst', base_document1_rst) + sd = SphinxDocs(prj.name) + sd.build_all() + builder = sd.get_builder('docs') + doc = builder.template_data('', {}) + assert doc['title'] == 'Unit testing sphinx docs' + + def test_build_info(self): + prj = self._prj() + self._add(prj, 'code_config.yaml', base_yaml_conf) + self._add(prj, 'index.rst', base_index_rst) + self._add(prj, 'doc1.rst', base_document1_rst) + sd = SphinxDocs(prj.name) + sd.build_all() + bi = sd.last_build_info() + assert bi['status'] == 'success' + + def test_need_rebuild(self): + prj = self._prj() + self._add(prj, 'code_config.yaml', base_yaml_conf) + self._add(prj, 'index.rst', base_index_rst) + sd = SphinxDocs(prj.name) + assert sd.need_rebuild() + sd.build_all() + assert not sd.need_rebuild() + self._add(prj, 'doc1.rst', base_document1_rst) + sd = SphinxDocs(prj.name) # Bad, should not have to refresh object + assert sd.need_rebuild() + sd.build_all() + assert not sd.need_rebuild() + + def test_create_with_index_and_doc_and_get_again(self): + prj = self._prj() + self._add(prj, 'code_config.yaml', base_yaml_conf) + self._add(prj, 'index.rst', base_index_rst) + self._add(prj, 'doc1.rst', base_document1_rst) + sd = SphinxDocs(prj.name) + sd.build_all() + sd2 = SphinxDocs(prj.name) + builder = sd2.get_builder('docs') + assert builder.template + doc = builder.template_data('', {}) + assert doc['title'] == 'Unit testing sphinx docs' + + def test_create_with_index_and_doc_and_two_builders(self): + prj = self._prj() + base_yaml_conf_two_builders = """ + docs: + docs: + builder: html + dir: "" + html_theme: default + html_short_title: testsub + docs2: + dir: "" + builder: pickle + """ + self._add(prj, 'code_config.yaml', base_yaml_conf_two_builders) + self._add(prj, 'index.rst', base_index_rst) + self._add(prj, 'doc1.rst', base_document1_rst) + sd = SphinxDocs(prj.name) + sd.build_all() + assert sd.builders == ['docs', 'docs2'] + pickle_builder = sd.get_builder('docs2') + assert pickle_builder.template + doc = pickle_builder.template_data('', {}) + assert doc['title'] == 'Unit testing sphinx docs' + html_builder = sd.get_builder('docs') + assert not html_builder.template + raw = html_builder.raw_content('index.html', {}) + assert "<h1>Unit testing sphinx docs" in raw + + +class TestDocsPages(TestDocsHelpers): + conf = 'docs: {"pages": {"builder": "raw"}}' + builder = 'raw' + + def test_pages_mode(self): + prj = self._prj() + self._add(prj, 'code_config.yaml', self.conf) + self._add(prj, 'pages/index.html', self.html1) + sd = SphinxDocs(prj.name) + assert sd.builders == ['pages'] + assert sd.last_build_info() is None + sd.build_all() + assert sd.last_build_info()['status'] == 'success' + builder = sd.get_builder(sd.builders[0]) + assert builder.raw_content('index.html', {}) == self.html1 + + def test_pages_no_docsdir(self): + prj = self._prj() + self._add(prj, 'code_config.yaml', self.conf) + self._add(prj, 'pagesNOT_THE_SAME/index.html', self.html1) + sd = SphinxDocs(prj.name) + sd.build_all() + assert sd.last_build_info()['status'] == 'no_doc_dir_found' + builder = sd.get_builder(sd.builders[0]) + assert builder.raw_content('index.html', {}) is False + + def test_html_and_raw_builders(self): + prj = self._prj() + base_yaml_conf_two_builders = """ +docs: + docs: + builder: html + html_short_title: testsub + dir: docs + html_theme: default + pages: + builder: raw + dir: docs +""" + self._add(prj, 'code_config.yaml', base_yaml_conf_two_builders) + self._add(prj, 'docs/index.rst', base_index_rst) + self._add(prj, 'docs/index.html', self.html1) + self._add(prj, 'docs/doc1.rst', base_document1_rst) + sd = SphinxDocs(prj.name) + sd.build_all() + assert sd.builders == ['docs', 'pages'] + raw_builder = sd.get_builder('pages') + doc = raw_builder.raw_content('index.html', {}) + assert doc == self.html1 + html_builder = sd.get_builder('docs') + assert not html_builder.template + raw = html_builder.raw_content('index.html', {}) + assert "<h1>Unit testing sphinx docs" in raw + + def test_html_and_raw_builders_in_different_dirs(self): + prj = self._prj() + base_yaml_conf_two_builders = """ +docs: + docs: + builder: html + html_short_title: testsub + dir: html_docs + html_theme: default + pages: + builder: raw + dir: pages +""" + self._add(prj, 'code_config.yaml', base_yaml_conf_two_builders) + self._add(prj, 'html_docs/index.rst', base_index_rst) + self._add(prj, 'html_docs/doc1.rst', base_document1_rst) + self._add(prj, 'pages/index.html', self.html1) + sd = SphinxDocs(prj.name) + sd.build_all() + assert sd.builders == ['docs', 'pages'] + raw_builder = sd.get_builder('pages') + doc = raw_builder.raw_content('index.html', {}) + assert doc == self.html1 + html_builder = sd.get_builder('docs') + assert not html_builder.template + raw = html_builder.raw_content('index.html', {}) + assert "<h1>Unit testing sphinx docs" in raw + + +class TestDocsPagesNewConf(TestDocsHelpers): + def test_two_builders_with_other_config_fmt(self): + prj = self._prj() + base_yaml_conf_two_builders = """ + docs: + docs: + builder: html + html_theme: default + html_short_title: testsub + dir: html_docs + pages: + builder: raw + """ + self._add(prj, 'code_config.yaml', base_yaml_conf_two_builders) + self._add(prj, 'html_docs/index.rst', base_index_rst) + self._add(prj, 'html_docs/doc1.rst', base_document1_rst) + self._add(prj, 'pages/index.html', self.html1) + sd = SphinxDocs(prj.name) + sd.build_all() + assert sd.builders == ['docs', 'pages'] # noqa Sorted alphabetically by default + raw_builder = sd.get_builder('pages') + doc = raw_builder.raw_content('index.html', {}) + assert doc == self.html1 + html_builder = sd.get_builder('docs') + assert not html_builder.template + raw = html_builder.raw_content('index.html', {}) + assert "<h1>Unit testing sphinx docs" in raw + + def test_sort_key(self): + prj = self._prj() + base_yaml_conf_two_builders = """ + sphinx_docs: + docs: + docs: + builder: html + html_theme: default + html_short_title: testsub + sort: 2 + pages: + builder: raw + sort: 1 + """ + self._add(prj, 'code_config.yaml', base_yaml_conf_two_builders) + sd = SphinxDocs(prj.name) + assert sd.builders == ['pages', 'docs'] diff --git a/tests/docs/test_html_doc.py b/tests/docs/test_html_doc.py new file mode 100644 index 0000000..a55c623 --- /dev/null +++ b/tests/docs/test_html_doc.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- + +import os +from vilya.models.doc import HTMLDoc, DocBuilder +from tests.utils import get_temp_project +from tests.base import TestCase + +DOC_REPO_PATH = os.path.join(os.path.dirname(__file__), + '../data/doc_repo') + + +class TestHTMLDoc(TestCase): + + def setUp(self): + super(TestCase, self).setUp() + self.project = get_temp_project(repo_path=DOC_REPO_PATH) + project = self.project + self.builder = DocBuilder(project, 'html') + + def tearDown(self): + self.project.delete() + super(TestCase, self).tearDown() + + def test_exists(self): + doc = HTMLDoc(self.project, 'html', 'codeep-001.html') + self.assertFalse(doc.exists) + + doc = HTMLDoc(self.project, 'html', 'codeep-002.html') + self.assertFalse(doc.exists) + + self.builder.build() + doc = HTMLDoc(self.project, 'html', 'codeep-001.html') + self.assertTrue(doc.exists) + + doc = HTMLDoc(self.project, 'html', 'codeep-002.html') + self.assertFalse(doc.exists) + + def test_is_template(self): + self.builder.build() + doc = HTMLDoc(self.project, 'html', 'codeep-001.html') + self.assertIsNone(doc.is_template) + + def test_content(self): + pass + + def test_content_type(self): + pass + + def test_path(self): + pass + + def test_doc_path(self): + pass + + def teest_doc_id(self): + pass diff --git a/tests/docs/test_pickle_doc.py b/tests/docs/test_pickle_doc.py new file mode 100644 index 0000000..8354ec4 --- /dev/null +++ b/tests/docs/test_pickle_doc.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- + +import os +from vilya.models.doc import PickleDoc, DocBuilder +from tests.utils import get_temp_project +from tests.base import TestCase + +DOC_REPO_PATH = os.path.join(os.path.dirname(__file__), + '../data/doc_repo') + + +class TestPickleDoc(TestCase): + + def setUp(self): + super(TestCase, self).setUp() + self.project = get_temp_project(repo_path=DOC_REPO_PATH) + project = self.project + self.builder = DocBuilder(project, 'pickle') + + def tearDown(self): + self.project.delete() + super(TestCase, self).tearDown() + + def test_exists(self): + doc = PickleDoc(self.project, 'pickle', 'codeep-001') + self.assertIsNone(doc.exists) + + doc = PickleDoc(self.project, 'pickle', 'codeep-002') + self.assertIsNone(doc.exists) + + self.builder.build() + doc = PickleDoc(self.project, 'pickle', 'codeep-001') + self.assertTrue(doc.exists) + + doc = PickleDoc(self.project, 'pickle', 'codeep-002') + self.assertIsNone(doc.exists) + + def test_is_template(self): + self.builder.build() + doc = PickleDoc(self.project, 'pickle', 'codeep-001') + self.assertTrue(doc.is_template) + doc = PickleDoc(self.project, 'pickle', '_sources/codeep-001.txt') + self.assertFalse(doc.is_template) + doc = PickleDoc(self.project, 'pickle', '_static/pygments.css') + self.assertFalse(doc.is_template) + + def test_content(self): + self.builder.build() + doc = PickleDoc(self.project, 'pickle', 'codeep-001') + self.assertTrue(isinstance(doc.content, dict)) + + def test_content_type(self): + pass + + def test_path(self): + pass + + def test_doc_path(self): + pass + + def teest_doc_id(self): + pass diff --git a/vilya/tests/framework.py b/tests/framework.py similarity index 77% rename from vilya/tests/framework.py rename to tests/framework.py index c3d7daa..5e0419c 100644 --- a/vilya/tests/framework.py +++ b/tests/framework.py @@ -8,8 +8,8 @@ sys.path.insert(0, STUB_DIR) memcached = { - 'servers' : [], - 'disabled' : False, -} + 'servers': [], + 'disabled': False, +} -import cmemcached \ No newline at end of file +import cmemcached diff --git a/tests/init/__init__.py b/tests/init/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/init/add_badge.py b/tests/init/add_badge.py new file mode 100644 index 0000000..ae422cb --- /dev/null +++ b/tests/init/add_badge.py @@ -0,0 +1,17 @@ +from vilya.models.badge import Badge + +import os +dir = os.path.join(os.path.dirname(__file__), '../../hub/static/img/badges/') +badge_number = len(os.listdir(dir)) + +badge = Badge.add('code', 'Code Developer') +badge.award('testuser') +badge.award('qingfeng') + +badge2 = Badge.add('bugslayer', 'Bug Slayer') +badge2.award('testuser') + + +for idx in xrange(2, badge_number): + badge = Badge.add("badge%s" % idx, "Badge %s" % idx) + badge.award('testuser') diff --git a/tests/init/add_feed.py b/tests/init/add_feed.py new file mode 100644 index 0000000..38d57af --- /dev/null +++ b/tests/init/add_feed.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- + +import pickle + +from vilya.models.feed import get_public_feed + + +with open('tests/init/feed_actions.pickle', 'r') as f: + actions = pickle.load(f) + + +feed = get_public_feed() +if feed: + for action in actions: + feed.add_action(action) diff --git a/tests/init/add_pr.py b/tests/init/add_pr.py new file mode 100644 index 0000000..d663727 --- /dev/null +++ b/tests/init/add_pr.py @@ -0,0 +1,65 @@ +# coding: utf-8 +import os +import shutil +from os.path import join + +from vilya.libs.permdir import get_repo_root +from vilya.libs.store import store +from vilya.models.project import CodeDoubanProject as Project +from vilya.models.pull import PullRequest +from vilya.models.ticket import Ticket + +from tests.utils import clone + +from local_config import DOMAIN + +p1_name = "project1" +p1_id = None +p1_path = os.path.join(get_repo_root(), "%s.git" % p1_name) +shutil.rmtree(p1_path, ignore_errors=True) +p1 = Project.get_by_name(p1_name) +if p1: + p1_id = p1.id + p1.delete() + +p2_name = "project2" +p2_id = None +p2_path = os.path.join(get_repo_root(), "%s.git" % p2_name) +shutil.rmtree(p2_path, ignore_errors=True) +p2 = Project.get_by_name(p2_name) +if p2: + p2_id = p2.id + p2.delete() + +if p1_id: + store.execute("delete from codedouban_ticket where project_id=%s", p1_id) +if p2_id: + store.execute("delete from pullreq where from_project=%s", p2_id) +store.commit() + + +def setup2repos(proj1, proj2): + path = proj1.git_real_path + with clone(path) as workdir: + with open(join(workdir, 'origin'), 'w') as f: + f.write('origin') + + path = proj2.git_real_path + with clone(path) as workdir: + with open(join(workdir, 'origin'), 'w') as f: + f.write('modified') + +project = Project.add( + p1_name, owner_id="testuser", summary="test", product="") +assert project +project_fork = Project.add( + p2_name, owner_id="testuser", summary="test", product="", + fork_from=project.id) + +setup2repos(project, project_fork) + +pullreq1 = PullRequest.open(project_fork, 'master', project, 'master') +ticket1 = Ticket.add(project.id, 'title', 'content', 'testuser') +pullreq1.insert(ticket1.ticket_number) + +print "PR has been built at: %s" % (DOMAIN + ticket1.url) diff --git a/tests/init/feed_actions.pickle b/tests/init/feed_actions.pickle new file mode 100644 index 0000000..70d45a8 --- /dev/null +++ b/tests/init/feed_actions.pickle @@ -0,0 +1,12264 @@ +(lp0 +(dp1 +S'commit_id' +p2 +V048abd1af1263319c1eaf9dfb09fdff88578e98f +p3 +sS'repo_url' +p4 +Vhttp://code.dapps.douban.com/evaluate +p5 +sS'date' +p6 +cdatetime +datetime +p7 +(S'\x07\xdc\x0c\x19\x0f%#\x00\x00\x00' +p8 +ccopy_reg +_reconstructor +p9 +(cdateutil.tz +tzoffset +p10 +cdatetime +tzinfo +p11 +g11 +(tRp12 +tp13 +Rp14 +(dp15 +S'_offset' +p16 +cdatetime +timedelta +p17 +(I0 +I28800 +I0 +tp18 +Rp19 +sS'_name' +p20 +Nsbtp21 +Rp22 +sS'message' +p23 +VModify page style. +p24 +sS'author' +p25 +Vsunliang +p26 +sS'url' +p27 +Vhttp://code.dapps.douban.com/evaluate/commit/048abd1af1263319c1eaf9dfb09fdff88578e98f +p28 +sS'type' +p29 +S'commit' +p30 +sS'branch' +p31 +Vmaster +p32 +sS'ref' +p33 +Vrefs/heads/master +p34 +sS'email' +p35 +Vi@liangsun.org +p36 +sS'repo_name' +p37 +Vevaluate +p38 +sa(dp39 +g6 +g7 +(S'\x07\xdc\x0c\x19\x0f &\n:\x0e' +p40 +tp41 +Rp42 +sS'uid' +p43 +Vnewcodereview-code-588-464 +p44 +sg25 +S'xueming' +p45 +sg27 +V/code/newpull/588#comment-464 +p46 +sS'text' +p47 +V\u611f\u52a8ing\uff0c\u7ec8\u4e8e\u54b1\u4e5f\u662fcode\u7684\u5f00\u53d1\u8005\u4e86\u3002:fire: +p48 +sS'ticket' +p49 +L588L +sS'receiver' +p50 +Vxueming +p51 +sg29 +S'code_review' +p52 +sS'proj' +p53 +Vcode:master +p54 +sa(dp55 +g2 +Vac4c6a54c4988c6c43cba25dd4003ae1a6122451 +p56 +sg4 +Vhttp://code.dapps.douban.com/blackfire +p57 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0f\x1e\n\x00\x00\x00' +p58 +g9 +(g10 +g11 +g11 +(tRp59 +tp60 +Rp61 +(dp62 +g16 +g17 +(I0 +I28800 +I0 +tp63 +Rp64 +sg20 +Nsbtp65 +Rp66 +sg23 +Vtest cmemcached on bgs +p67 +sg25 +Vchenzheng +p68 +sg27 +Vhttp://code.dapps.douban.com/blackfire/commit/ac4c6a54c4988c6c43cba25dd4003ae1a6122451 +p69 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +Vchenzheng@douban.com +p70 +sg37 +Vblackfire +p71 +sa(dp72 +g2 +Vdade63c9403c6fdafeddad56c46efc482fcf4037 +p73 +sg4 +Vhttp://code.dapps.douban.com/blackpit +p74 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0f\x1d\x0b\x00\x00\x00' +p75 +g9 +(g10 +g11 +g11 +(tRp76 +tp77 +Rp78 +(dp79 +g16 +g17 +(I0 +I28800 +I0 +tp80 +Rp81 +sg20 +Nsbtp82 +Rp83 +sg23 +Vfix syntax errors +p84 +sg25 +Vxingben +p85 +sg27 +Vhttp://code.dapps.douban.com/blackpit/commit/dade63c9403c6fdafeddad56c46efc482fcf4037 +p86 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +Vxingben@douban.com +p87 +sg37 +Vblackpit +p88 +sa(dp89 +S'status' +p90 +S'merged' +p91 +sg43 +Vpullrequest-code-588-merged +p92 +sS'owner' +p93 +Vqingfeng +p94 +sS'from_proj' +p95 +Vcode_xueming:master +p96 +sS'to_proj' +p97 +g54 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0f\x1c\x19\x04\xed\x04' +p98 +tp99 +Rp100 +sS'description' +p101 +V +p102 +sS'title' +p103 +Vbugfix: remove maxlength attribute for project summary +p104 +sg27 +V/code/newpull/588 +p105 +sS'commiter' +p106 +g51 +sg29 +S'pull_request' +p107 +sa(dp108 +g2 +V222b136d2785e1a2c44e13e9872deded1c02beee +p109 +sg4 +Vhttp://code.dapps.douban.com/code +p110 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0f\x1c\x14\x00\x00\x00' +p111 +g9 +(g10 +g11 +g11 +(tRp112 +tp113 +Rp114 +(dp115 +g16 +g17 +(I0 +I28800 +I0 +tp116 +Rp117 +sg20 +Nsbtp118 +Rp119 +sg23 +VMerge pull request #588 from code_xueming:master\u000a \u000a bugfix: remove maxlength attribute for project summary +p120 +sg25 +g94 +sg27 +Vhttp://code.dapps.douban.com/code/commit/222b136d2785e1a2c44e13e9872deded1c02beee +p121 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +Vqingfeng@douban.com +p122 +sg37 +Vcode +p123 +sa(dp124 +g2 +V946bba85159eb7e325f785dfb10cffad463b3a37 +p125 +sg4 +Vhttp://code.dapps.douban.com/dimholt +p126 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0f\x19:\x00\x00\x00' +p127 +g9 +(g10 +g11 +g11 +(tRp128 +tp129 +Rp130 +(dp131 +g16 +g17 +(I0 +I28800 +I0 +tp132 +Rp133 +sg20 +Nsbtp134 +Rp135 +sg23 +VMerge branch 'v6.0' +p136 +sg25 +Vtianzhongbo +p137 +sg27 +Vhttp://code.dapps.douban.com/dimholt/commit/946bba85159eb7e325f785dfb10cffad463b3a37 +p138 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +Vtianzhongbo@douban.com +p139 +sg37 +Vdimholt +p140 +sa(dp141 +g2 +V1b4db6d6cf1fa1616169b65addba2caea37fdb7c +p142 +sg4 +g126 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0f\x192\x00\x00\x00' +p143 +g9 +(g10 +g11 +g11 +(tRp144 +tp145 +Rp146 +(dp147 +g16 +g17 +(I0 +I28800 +I0 +tp148 +Rp149 +sg20 +Nsbtp150 +Rp151 +sg23 +Vfix bug +p152 +sg25 +g137 +sg27 +Vhttp://code.dapps.douban.com/dimholt/commit/1b4db6d6cf1fa1616169b65addba2caea37fdb7c +p153 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g139 +sg37 +g140 +sa(dp154 +g2 +V25997d4ebdc0bfa9c68289ef4a80f7b7119bf5ef +p155 +sg4 +g126 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0f\x10/\x00\x00\x00' +p156 +g9 +(g10 +g11 +g11 +(tRp157 +tp158 +Rp159 +(dp160 +g16 +g17 +(I0 +I28800 +I0 +tp161 +Rp162 +sg20 +Nsbtp163 +Rp164 +sg23 +g136 +sg25 +g137 +sg27 +Vhttp://code.dapps.douban.com/dimholt/commit/25997d4ebdc0bfa9c68289ef4a80f7b7119bf5ef +p165 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g139 +sg37 +g140 +sa(dp166 +g2 +V819c6f16b2074701f9a8edcd0dccdc7f956e1523 +p167 +sg4 +g5 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0f\x10&\x00\x00\x00' +p168 +g9 +(g10 +g11 +g11 +(tRp169 +tp170 +Rp171 +(dp172 +g16 +g17 +(I0 +I28800 +I0 +tp173 +Rp174 +sg20 +Nsbtp175 +Rp176 +sg23 +VModify copywriting. +p177 +sg25 +g26 +sg27 +Vhttp://code.dapps.douban.com/evaluate/commit/819c6f16b2074701f9a8edcd0dccdc7f956e1523 +p178 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g36 +sg37 +g38 +sa(dp179 +g2 +V1f324dd922da3941afdbd9b16471ad37b09a3588 +p180 +sg4 +g126 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0f\x10\x04\x00\x00\x00' +p181 +g9 +(g10 +g11 +g11 +(tRp182 +tp183 +Rp184 +(dp185 +g16 +g17 +(I0 +I28800 +I0 +tp186 +Rp187 +sg20 +Nsbtp188 +Rp189 +sg23 +Vremove event from gloabl +p190 +sg25 +g137 +sg27 +Vhttp://code.dapps.douban.com/dimholt/commit/1f324dd922da3941afdbd9b16471ad37b09a3588 +p191 +sg29 +g30 +sg31 +Vv6.0 +p192 +sg33 +Vrefs/heads/v6.0 +p193 +sg35 +g139 +sg37 +g140 +sa(dp194 +g2 +V056d0ddedb02ec58dac8464dd94bec0854015866 +p195 +sg4 +Vhttp://code.dapps.douban.com/Natalya +p196 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0f\x0c4\x00\x00\x00' +p197 +g9 +(g10 +g11 +g11 +(tRp198 +tp199 +Rp200 +(dp201 +g16 +g17 +(I0 +I28800 +I0 +tp202 +Rp203 +sg20 +Nsbtp204 +Rp205 +sg23 +Vfix import +p206 +sg25 +Vbear +p207 +sg27 +Vhttp://code.dapps.douban.com/Natalya/commit/056d0ddedb02ec58dac8464dd94bec0854015866 +p208 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +Vbeartung@gmail.com +p209 +sg37 +VNatalya +p210 +sa(dp211 +g2 +Vf6533e4a07edc3b9aaacbdf7e3a29e3b8b2403ad +p212 +sg4 +g57 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0f\x0c"\x00\x00\x00' +p213 +g9 +(g10 +g11 +g11 +(tRp214 +tp215 +Rp216 +(dp217 +g16 +g17 +(I0 +I28800 +I0 +tp218 +Rp219 +sg20 +Nsbtp220 +Rp221 +sg23 +Vtest +p222 +sg25 +g68 +sg27 +Vhttp://code.dapps.douban.com/blackfire/commit/f6533e4a07edc3b9aaacbdf7e3a29e3b8b2403ad +p223 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g70 +sg37 +g71 +sa(dp224 +g2 +V5f800d426ff24c0f90677f5cae09b640bd813853 +p225 +sg4 +g5 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0f\x0b-\x00\x00\x00' +p226 +g9 +(g10 +g11 +g11 +(tRp227 +tp228 +Rp229 +(dp230 +g16 +g17 +(I0 +I28800 +I0 +tp231 +Rp232 +sg20 +Nsbtp233 +Rp234 +sg23 +VModified page style. +p235 +sg25 +g26 +sg27 +Vhttp://code.dapps.douban.com/evaluate/commit/5f800d426ff24c0f90677f5cae09b640bd813853 +p236 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g36 +sg37 +g38 +sa(dp237 +g2 +Vdaccdda6cab7379917a7c641cdbcf7030fb123e5 +p238 +sg4 +g196 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0f\t/\x00\x00\x00' +p239 +g9 +(g10 +g11 +g11 +(tRp240 +tp241 +Rp242 +(dp243 +g16 +g17 +(I0 +I28800 +I0 +tp244 +Rp245 +sg20 +Nsbtp246 +Rp247 +sg23 +VMerge remote-tracking branch 'code/master' +p248 +sg25 +g207 +sg27 +Vhttp://code.dapps.douban.com/Natalya/commit/daccdda6cab7379917a7c641cdbcf7030fb123e5 +p249 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g209 +sg37 +g210 +sa(dp250 +g6 +g7 +(S'\x07\xdc\x0c\x19\x0f\t&\x00\x00\x00' +p251 +tp252 +Rp253 +sg43 +S'commit-comment-739' +p254 +sg25 +g94 +sg27 +V/shire_git_RO/commit/96623107b520d35964e0589e10697bb09c11c2ce +p255 +sg29 +S'commit_comment' +p256 +sg23 +V:beer: +p257 +sg33 +V96623107b520d35964e0589e10697bb09c11c2ce +p258 +sg53 +Vshire_git_RO +p259 +sa(dp260 +g2 +V6a12067df25f0f66b070c2d734ba9cb45f400c8c +p261 +sg4 +Vhttp://code.dapps.douban.com/resume +p262 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0f\x08*\x00\x00\x00' +p263 +g9 +(g10 +g11 +g11 +(tRp264 +tp265 +Rp266 +(dp267 +g16 +g17 +(I0 +I28800 +I0 +tp268 +Rp269 +sg20 +Nsbtp270 +Rp271 +sg23 +Vadd +p272 +sg25 +Vliaojinxing.douban.com +p273 +sg27 +Vhttp://code.dapps.douban.com/resume/commit/6a12067df25f0f66b070c2d734ba9cb45f400c8c +p274 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g273 +sg37 +Vresume +p275 +sa(dp276 +g2 +V562bfbea3502d254a22c0f804bbe06b141914e92 +p277 +sg4 +g196 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0f\x08\x1a\x00\x00\x00' +p278 +g9 +(g10 +g11 +g11 +(tRp279 +tp280 +Rp281 +(dp282 +g16 +g17 +(I0 +I28800 +I0 +tp283 +Rp284 +sg20 +Nsbtp285 +Rp286 +sg23 +Vadd reflect +p287 +sg25 +g207 +sg27 +Vhttp://code.dapps.douban.com/Natalya/commit/562bfbea3502d254a22c0f804bbe06b141914e92 +p288 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g209 +sg37 +g210 +sa(dp289 +g2 +Vff96519b089b9537ee73dc1d45312aed8b341c86 +p290 +sg4 +Vhttp://code.dapps.douban.com/rhovanion +p291 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0f\x07.\x00\x00\x00' +p292 +g9 +(g10 +g11 +g11 +(tRp293 +tp294 +Rp295 +(dp296 +g16 +g17 +(I0 +I28800 +I0 +tp297 +Rp298 +sg20 +Nsbtp299 +Rp300 +sg23 +Vadded ga +p301 +sg25 +g85 +sg27 +Vhttp://code.dapps.douban.com/rhovanion/commit/ff96519b089b9537ee73dc1d45312aed8b341c86 +p302 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g87 +sg37 +Vrhovanion +p303 +sa(dp304 +g6 +g7 +(S'\x07\xdc\x0c\x19\x0f\x04\x1b\x03=\xad' +p305 +tp306 +Rp307 +sg43 +Vnewcodereview-joshua-4-463 +p308 +sg25 +S'xingben' +p309 +sg27 +V/joshua/newpull/4#comment-463 +p310 +sg47 +VThis pull request cannot be automatically merged. +p311 +sg49 +L4L +sg50 +Vcyrildou +p312 +sg29 +g52 +sg53 +Vjoshua:master +p313 +sa(dp314 +g90 +g91 +sg43 +Vpullrequest-fm-68-merged +p315 +sg93 +Vsudan +p316 +sg95 +Vfm_su27:bug360 +p317 +sg97 +Vfm:master +p318 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0f\x02\x11\x07j\xdc' +p319 +tp320 +Rp321 +sg101 +V\u770b\u6765\u662f\u4ece\u8f6f\u8fde\u63a5\u8f6c\u7684\u65f6\u5019\u51fa\u7684\u95ee\u9898 +p322 +sg103 +Vwidgtes/ga.html\u91cc\u9762\u7684\u5185\u5bb9\u5c45\u7136\u662f... +p323 +sg27 +V/fm/newpull/68 +p324 +sg106 +g316 +sg29 +g107 +sa(dp325 +g2 +Vc0e195ae19a8c641ee955b495e056e603dc46d1c +p326 +sg4 +Vhttp://code.dapps.douban.com/fm +p327 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0f\x02\x0e\x00\x00\x00' +p328 +g9 +(g10 +g11 +g11 +(tRp329 +tp330 +Rp331 +(dp332 +g16 +g17 +(I0 +I28800 +I0 +tp333 +Rp334 +sg20 +Nsbtp335 +Rp336 +sg23 +VMerge pull request #68 from fm_su27:bug360\u000a \u000a widgtes/ga.html\u91cc\u9762\u7684\u5185\u5bb9\u5c45\u7136\u662f... +p337 +sg25 +g316 +sg27 +Vhttp://code.dapps.douban.com/fm/commit/c0e195ae19a8c641ee955b495e056e603dc46d1c +p338 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +Vsudan@douban.com +p339 +sg37 +Vfm +p340 +sa(dp341 +g2 +V340372b36862feb74f47627a3221e9d5627be38a +p342 +sg4 +Vhttp://code.dapps.douban.com/WoFm +p343 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0f\x00(\x00\x00\x00' +p344 +g9 +(g10 +g11 +g11 +(tRp345 +tp346 +Rp347 +(dp348 +g16 +g17 +(I0 +I28800 +I0 +tp349 +Rp350 +sg20 +Nsbtp351 +Rp352 +sg23 +Vremove jsonize +p353 +sg25 +Vhuangzhongkun +p354 +sg27 +Vhttp://code.dapps.douban.com/WoFm/commit/340372b36862feb74f47627a3221e9d5627be38a +p355 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +Vhuangzhongkun@douban.com +p356 +sg37 +VWoFm +p357 +sa(dp358 +g90 +S'unmerge' +p359 +sg43 +Vpullrequest-joshua-356-unmerge +p360 +sg93 +g85 +sg95 +Vcyrildou_joshua:master +p361 +sg97 +g313 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0e9#\x08\x82\xbb' +p362 +tp363 +Rp364 +sg101 +V\u89e3\u51b3Bug\uff0c\u4e00\u79cd\u5206\u652f\u60c5\u51b5\u6ca1\u6709\u8003\u8651\u5230\u3002 +p365 +sg103 +V\u89e3\u51b3Bug:\u663e\u793a\u81ea\u5df1\u7684\u4e0a\u4e0b\u7ea7\uff0c\u800c\u975e\u81ea\u5df1\u4e0a\u7ea7\u7684\u4e0a\u4e0b\u7ea7 +p366 +sg27 +V/joshua/newpull/4 +p367 +sg106 +g312 +sg29 +g107 +sa(dp368 +g2 +V70292e9d46148794e90a9400e09223b21e276a9a +p369 +sg4 +Vhttp://code.dapps.douban.com/cyrildou_joshua +p370 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0e74\x00\x00\x00' +p371 +g9 +(g10 +g11 +g11 +(tRp372 +tp373 +Rp374 +(dp375 +g16 +g17 +(I0 +I28800 +I0 +tp376 +Rp377 +sg20 +Nsbtp378 +Rp379 +sg23 +g366 +sg25 +g312 +sg27 +Vhttp://code.dapps.douban.com/cyrildou_joshua/commit/70292e9d46148794e90a9400e09223b21e276a9a +p380 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +Vcyrildou@douban.com +p381 +sg37 +Vcyrildou_joshua +p382 +sa(dp383 +g2 +V0fc13ad5efb13b868814ab500177480a4d17f033 +p384 +sg4 +g74 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0e7\x02\x00\x00\x00' +p385 +g9 +(g10 +g11 +g11 +(tRp386 +tp387 +Rp388 +(dp389 +g16 +g17 +(I0 +I28800 +I0 +tp390 +Rp391 +sg20 +Nsbtp392 +Rp393 +sg23 +Vrefine lottery admin +p394 +sg25 +g85 +sg27 +Vhttp://code.dapps.douban.com/blackpit/commit/0fc13ad5efb13b868814ab500177480a4d17f033 +p395 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g87 +sg37 +g88 +sa(dp396 +g2 +Ve73845f3abe7b3a61d1f7349fb59443861057ffd +p397 +sg4 +g126 +sg6 +g7 +(S"\x07\xdc\x0c\x19\x0e6'\x00\x00\x00" +p398 +g9 +(g10 +g11 +g11 +(tRp399 +tp400 +Rp401 +(dp402 +g16 +g17 +(I0 +I28800 +I0 +tp403 +Rp404 +sg20 +Nsbtp405 +Rp406 +sg23 +g136 +sg25 +g137 +sg27 +Vhttp://code.dapps.douban.com/dimholt/commit/e73845f3abe7b3a61d1f7349fb59443861057ffd +p407 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g139 +sg37 +g140 +sa(dp408 +g2 +V35a1b3a0c559777edba29d1f65bb5b63a7d5b3c4 +p409 +sg4 +g126 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0e6\x1d\x00\x00\x00' +p410 +g9 +(g10 +g11 +g11 +(tRp411 +tp412 +Rp413 +(dp414 +g16 +g17 +(I0 +I28800 +I0 +tp415 +Rp416 +sg20 +Nsbtp417 +Rp418 +sg23 +Vadd reputation as rating for note +p419 +sg25 +g137 +sg27 +Vhttp://code.dapps.douban.com/dimholt/commit/35a1b3a0c559777edba29d1f65bb5b63a7d5b3c4 +p420 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g139 +sg37 +g140 +sa(dp421 +g90 +g359 +sg43 +Vpullrequest-fm-355-unmerge +p422 +sg93 +g316 +sg95 +g317 +sg97 +g318 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0e3\x1e\x08C\xda' +p423 +tp424 +Rp425 +sg101 +g322 +sg103 +g323 +sg27 +g324 +sg106 +g316 +sg29 +g107 +sa(dp426 +g2 +Vd5895abcd82fb4eb3db30adaa8e4a345a93c7761 +p427 +sg4 +g327 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0e03\x00\x00\x00' +p428 +g9 +(g10 +g11 +g11 +(tRp429 +tp430 +Rp431 +(dp432 +g16 +g17 +(I0 +I28800 +I0 +tp433 +Rp434 +sg20 +Nsbtp435 +Rp436 +sg23 +Vfix ga.html link +p437 +sg25 +g316 +sg27 +Vhttp://code.dapps.douban.com/fm/commit/d5895abcd82fb4eb3db30adaa8e4a345a93c7761 +p438 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g339 +sg37 +g340 +sa(dp439 +g2 +Vb68303253ce1e23390a35e7cf3924b5d2f4fac54 +p440 +sg4 +Vhttp://code.dapps.douban.com/bazinga +p441 +sg6 +g7 +(S"\x07\xdc\x0c\x19\x0e'6\x00\x00\x00" +p442 +g9 +(g10 +g11 +g11 +(tRp443 +tp444 +Rp445 +(dp446 +g16 +g17 +(I0 +I28800 +I0 +tp447 +Rp448 +sg20 +Nsbtp449 +Rp450 +sg23 +Vtest again +p451 +sg25 +Vliukang +p452 +sg27 +Vhttp://code.dapps.douban.com/bazinga/commit/b68303253ce1e23390a35e7cf3924b5d2f4fac54 +p453 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +Vliukang@douban.com +p454 +sg37 +Vbazinga +p455 +sa(dp456 +g2 +V966342bf221183cc149a4b0ee1913f8c21e0deb4 +p457 +sg4 +Vhttp://code.dapps.douban.com/liyouyang-fm-other +p458 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0e&*\x00\x00\x00' +p459 +g9 +(g10 +g11 +g11 +(tRp460 +tp461 +Rp462 +(dp463 +g16 +g17 +(I0 +I28800 +I0 +tp464 +Rp465 +sg20 +Nsbtp466 +Rp467 +sg23 +VMerge branch 'master' of http://code.dapps.douban.com/liyouyang-fm-other into redtag +p468 +sg25 +g316 +sg27 +Vhttp://code.dapps.douban.com/liyouyang-fm-other/commit/966342bf221183cc149a4b0ee1913f8c21e0deb4 +p469 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g339 +sg37 +Vliyouyang-fm-other +p470 +sa(dp471 +g2 +Vbc5e73f6e25d47d90203413c9f47e8df1ad96385 +p472 +sg4 +g458 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0e&\x0e\x00\x00\x00' +p473 +g9 +(g10 +g11 +g11 +(tRp474 +tp475 +Rp476 +(dp477 +g16 +g17 +(I0 +I28800 +I0 +tp478 +Rp479 +sg20 +Nsbtp480 +Rp481 +sg23 +Vadd red tags channel const +p482 +sg25 +g316 +sg27 +Vhttp://code.dapps.douban.com/liyouyang-fm-other/commit/bc5e73f6e25d47d90203413c9f47e8df1ad96385 +p483 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g339 +sg37 +g470 +sa(dp484 +g2 +V726afce288dd2d4fe2ae87a9517deb62327338ed +p485 +sg4 +g291 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0e%1\x00\x00\x00' +p486 +g9 +(g10 +g11 +g11 +(tRp487 +tp488 +Rp489 +(dp490 +g16 +g17 +(I0 +I28800 +I0 +tp491 +Rp492 +sg20 +Nsbtp493 +Rp494 +sg23 +Vupdate README.md +p495 +sg25 +g85 +sg27 +Vhttp://code.dapps.douban.com/rhovanion/commit/726afce288dd2d4fe2ae87a9517deb62327338ed +p496 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g87 +sg37 +g303 +sa(dp497 +g6 +g7 +(S'\x07\xdc\x0c\x19\x0e#\t\x00\x00\x00' +p498 +tp499 +Rp500 +sg43 +S'commit-comment-738' +p501 +sg25 +Vxieshi +p502 +sg27 +V/shire_git_RO/commit/19222d17f5e82b5a60a3f6a0fcd0105dbc0bc29c +p503 +sg33 +V19222d17f5e82b5a60a3f6a0fcd0105dbc0bc29c +p504 +sg23 +V\u8fd9\u4e2a \u521a\u624d \u6709\u70b9\u7565\u6c57\u2026\u2026 +p505 +sg29 +g256 +sg53 +g259 +sa(dp506 +g6 +g7 +(S'\x07\xdc\x0c\x19\x0e#\x08\x00\x00\x00' +p507 +tp508 +Rp509 +sg43 +S'commit-comment-737' +p510 +sg25 +g502 +sg27 +g503 +sg29 +g256 +sg23 +g505 +sg33 +g504 +sg53 +g259 +sa(dp511 +g2 +Vd4b4bbcdf87b6ebfa659a326bda023a06bb29f2a +p512 +sg4 +g291 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0e#\x01\x00\x00\x00' +p513 +g9 +(g10 +g11 +g11 +(tRp514 +tp515 +Rp516 +(dp517 +g16 +g17 +(I0 +I28800 +I0 +tp518 +Rp519 +sg20 +Nsbtp520 +Rp521 +sg23 +VMerge branch 'master' of http://code.dapps.douban.com/rhovanion +p522 +sg25 +g85 +sg27 +Vhttp://code.dapps.douban.com/rhovanion/commit/d4b4bbcdf87b6ebfa659a326bda023a06bb29f2a +p523 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g87 +sg37 +g303 +sa(dp524 +g2 +V4f3b07390329c61dca886652ff3f6a946a3c5ec9 +p525 +sg4 +g291 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0e"8\x00\x00\x00' +p526 +g9 +(g10 +g11 +g11 +(tRp527 +tp528 +Rp529 +(dp530 +g16 +g17 +(I0 +I28800 +I0 +tp531 +Rp532 +sg20 +Nsbtp533 +Rp534 +sg23 +Vadded frontend env setup in README.md +p535 +sg25 +g85 +sg27 +Vhttp://code.dapps.douban.com/rhovanion/commit/4f3b07390329c61dca886652ff3f6a946a3c5ec9 +p536 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g87 +sg37 +g303 +sa(dp537 +g6 +g7 +(S'\x07\xdc\x0c\x19\x0e\x1f%\t\xe3|' +p538 +tp539 +Rp540 +sg43 +Vnewcodereview-Vasks-18-203 +p541 +sg25 +S'qingfeng' +p542 +sg27 +V/Vasks/newpull/18#review-203 +p543 +sg47 +V\u6216\u8005\u8fd9\u4e2a\u51fd\u6570\u53ef\u4ee5\u8003\u8651\u518d\u7cbe\u7b80\u4e00\u70b9 \u000a \u000a```python \u000aportlist = (get_port(job) for job in joblist) \u000aportlist = (int(port) for port in joblist if port.isdigit()) \u000areturn list(set(portlist)) \u000a``` +p544 +sg49 +L18L +sg50 +Vsunyi +p545 +sg29 +g52 +sg53 +VVasks:master +p546 +sa(dp547 +g6 +g7 +(S'\x07\xdc\x0c\x19\x0e\x1f\x0b\r\xaf\x80' +p548 +tp549 +Rp550 +sg43 +Vnewcodereview-Vasks-18-202 +p551 +sg25 +g542 +sg27 +V/Vasks/newpull/18#review-202 +p552 +sg47 +V\u662f\u5426\u53ef\u4ee5\u8003\u8651\u76f4\u63a5\u628aportlist\u5b9a\u4e49\u4e3aset? \u000a\u8fd9\u6837\u540e\u9762\u5c31\u4e0d\u9700\u8981\u591a\u4e00\u6b65\u7684set\u7684\u8f6c\u6362, \u6700\u540e\u53ea\u8981return list(portlist). \u000a\u5f53\u7136\u5982\u679c\u8fd9\u4e2a\u51fd\u6570\u8fd4\u56de\u53ea\u662f\u904d\u5386, \u5176\u5b9e\u76f4\u63a5\u8fd4\u56deset\u4e5f\u662f\u53ef\u4ee5\u7684 \u000a \u000a +p553 +sg49 +L18L +sg50 +g545 +sg29 +g52 +sg53 +g546 +sa(dp554 +g90 +g91 +sg43 +Vpullrequest-joshua-3-merged +p555 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0e\x19\x18\x05\xa0p' +p556 +tp557 +Rp558 +sg95 +g361 +sg97 +g313 +sg93 +g85 +sg101 +V1.\u5c06\u5b63\u5ea6\u8f6c\u4e3a\u6708\u4efd \u000a2.\u589e\u52a0\u56e2\u961fobject +p559 +sg103 +V\u5b63\u5ea6->\u6708\u4efd, team-object +p560 +sg27 +V/joshua/newpull/3 +p561 +sg106 +g312 +sg29 +g107 +sa(dp562 +g2 +V780ccfcd85785d146ef674ecf4187f9752f3c7da +p563 +sg4 +Vhttp://code.dapps.douban.com/joshua +p564 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0e\x19\x11\x00\x00\x00' +p565 +g9 +(g10 +g11 +g11 +(tRp566 +tp567 +Rp568 +(dp569 +g16 +g17 +(I0 +I28800 +I0 +tp570 +Rp571 +sg20 +Nsbtp572 +Rp573 +sg23 +VMerge pull request #3 from cyrildou_joshua:master\u000a \u000a \u5b63\u5ea6->\u6708\u4efd, team-object +p574 +sg25 +g85 +sg27 +Vhttp://code.dapps.douban.com/joshua/commit/780ccfcd85785d146ef674ecf4187f9752f3c7da +p575 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g87 +sg37 +Vjoshua +p576 +sa(dp577 +g6 +g7 +(S'\x07\xdc\x0c\x19\x0e\x10+\r:\x89' +p578 +tp579 +Rp580 +sg43 +Vnewcodereview-Vasks-18-462 +p581 +sg25 +g542 +sg27 +V/Vasks/newpull/18#comment-462 +p582 +sg47 +VCOOL!! :beer: +p583 +sg49 +L18L +sg50 +g545 +sg29 +g52 +sg53 +g546 +sa(dp584 +g2 +V05436229e4e5b39b3eb8ae2d16c7de6421722002 +p585 +sg4 +Vhttp://code.dapps.douban.com/dae-deploy-test +p586 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0e\x0b\x06\x00\x00\x00' +p587 +g9 +(g10 +g11 +g11 +(tRp588 +tp589 +Rp590 +(dp591 +g16 +g17 +(I0 +I28800 +I0 +tp592 +Rp593 +sg20 +Nsbtp594 +Rp595 +sg23 +VAuto commit created for dae deploy ci testing +p596 +sg25 +Vjenkins +p597 +sg27 +Vhttp://code.dapps.douban.com/dae-deploy-test/commit/05436229e4e5b39b3eb8ae2d16c7de6421722002 +p598 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +Vjenkins@douban.com +p599 +sg37 +Vdae-deploy-test +p600 +sa(dp601 +g2 +Vdab4563674bd53f990e80a8ef2b33de44b00e7eb +p602 +sg4 +Vhttp://code.dapps.douban.com/ideas +p603 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0e\t\x06\x00\x00\x00' +p604 +g9 +(g10 +g11 +g11 +(tRp605 +tp606 +Rp607 +(dp608 +g16 +g17 +(I0 +I28800 +I0 +tp609 +Rp610 +sg20 +Nsbtp611 +Rp612 +sg23 +Vadded momo +p613 +sg25 +Vlijunpeng +p614 +sg27 +Vhttp://code.dapps.douban.com/ideas/commit/dab4563674bd53f990e80a8ef2b33de44b00e7eb +p615 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +Vlijunpeng@douban.com +p616 +sg37 +Videas +p617 +sa(dp618 +g2 +Ve0cdc1d0152cc095029940c229ddbf5db8b8069d +p619 +sg4 +Vhttp://code.dapps.douban.com/biz_maintenance_scripts +p620 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0e\x08\x1d\x00\x00\x00' +p621 +g9 +(g10 +g11 +g11 +(tRp622 +tp623 +Rp624 +(dp625 +g16 +g17 +(I0 +I28800 +I0 +tp626 +Rp627 +sg20 +Nsbtp628 +Rp629 +sg23 +Vtwo script for setting online event cover picture +p630 +sg25 +Vluchuan +p631 +sg27 +Vhttp://code.dapps.douban.com/biz_maintenance_scripts/commit/e0cdc1d0152cc095029940c229ddbf5db8b8069d +p632 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +Vluchuan@douban.com +p633 +sg37 +Vbiz_maintenance_scripts +p634 +sa(dp635 +g2 +Vf05834500a50b6cc9d26e913efd2ea2e487303b8 +p636 +sg4 +g343 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0e\x08\x06\x00\x00\x00' +p637 +g9 +(g10 +g11 +g11 +(tRp638 +tp639 +Rp640 +(dp641 +g16 +g17 +(I0 +I28800 +I0 +tp642 +Rp643 +sg20 +Nsbtp644 +Rp645 +sg23 +Vmodify app.yaml +p646 +sg25 +g354 +sg27 +Vhttp://code.dapps.douban.com/WoFm/commit/f05834500a50b6cc9d26e913efd2ea2e487303b8 +p647 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g356 +sg37 +g357 +sa(dp648 +g2 +Vde4db355e89cdf87dacebc56ef2c3a440c66b02d +p649 +sg4 +g343 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0e\x07\x1f\x00\x00\x00' +p650 +g9 +(g10 +g11 +g11 +(tRp651 +tp652 +Rp653 +(dp654 +g16 +g17 +(I0 +I28800 +I0 +tp655 +Rp656 +sg20 +Nsbtp657 +Rp658 +sg23 +Vrewrite token +p659 +sg25 +g354 +sg27 +Vhttp://code.dapps.douban.com/WoFm/commit/de4db355e89cdf87dacebc56ef2c3a440c66b02d +p660 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g356 +sg37 +g357 +sa(dp661 +g90 +g91 +sg43 +Vpullrequest-Vasks-18-merged +p662 +sg6 +g7 +(S"\x07\xdc\x0c\x19\x0e\x00'\ra\x12" +p663 +tp664 +Rp665 +sg95 +VVasks_sunyi:refactor_libs +p666 +sg97 +g546 +sg93 +Vjollychang +p667 +sg101 +V\u7b2c\u4e00\u6b65\uff0c\u91cd\u6784ark\u76f8\u5173 +p668 +sg103 +Vrefactor. create libs model +p669 +sg27 +V/Vasks/newpull/18 +p670 +sg106 +g545 +sg29 +g107 +sa(dp671 +g2 +V4d82aa281ec6417b3d177e1d642f2bbc86186520 +p672 +sg4 +Vhttp://code.dapps.douban.com/Vasks +p673 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0e\x00$\x00\x00\x00' +p674 +g9 +(g10 +g11 +g11 +(tRp675 +tp676 +Rp677 +(dp678 +g16 +g17 +(I0 +I28800 +I0 +tp679 +Rp680 +sg20 +Nsbtp681 +Rp682 +sg23 +VMerge pull request #18 from Vasks_sunyi:refactor_libs\u000a \u000a refactor. create libs model +p683 +sg25 +g667 +sg27 +Vhttp://code.dapps.douban.com/Vasks/commit/4d82aa281ec6417b3d177e1d642f2bbc86186520 +p684 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +Vjollychang@douban.com +p685 +sg37 +VVasks +p686 +sa(dp687 +g2 +V0d49582b033f43cf7a3212b7bb3ffc1860c03358 +p688 +sg4 +g586 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0e\x00\x1c\x00\x00\x00' +p689 +g9 +(g10 +g11 +g11 +(tRp690 +tp691 +Rp692 +(dp693 +g16 +g17 +(I0 +I28800 +I0 +tp694 +Rp695 +sg20 +Nsbtp696 +Rp697 +sg23 +g596 +sg25 +g597 +sg27 +Vhttp://code.dapps.douban.com/dae-deploy-test/commit/0d49582b033f43cf7a3212b7bb3ffc1860c03358 +p698 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g599 +sg37 +g600 +sa(dp699 +g2 +Veaa25fac172eb11883c79f46ca77119c68fcacdb +p700 +sg4 +g458 +sg6 +g7 +(S'\x07\xdc\x0c\x19\r;\x0f\x00\x00\x00' +p701 +g9 +(g10 +g11 +g11 +(tRp702 +tp703 +Rp704 +(dp705 +g16 +g17 +(I0 +I28800 +I0 +tp706 +Rp707 +sg20 +Nsbtp708 +Rp709 +sg23 +VMerge branch 'master' of http://code.dapps.douban.com/liyouyang-fm-other +p710 +sg25 +Vlantian +p711 +sg27 +Vhttp://code.dapps.douban.com/liyouyang-fm-other/commit/eaa25fac172eb11883c79f46ca77119c68fcacdb +p712 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +Vlantian@douban.com +p713 +sg37 +g470 +sa(dp714 +g2 +V24e80abbdb8e3078f77ced0d09550edf8b7b6d2a +p715 +sg4 +Vhttp://code.dapps.douban.com/mario +p716 +sg6 +g7 +(S'\x07\xdc\x0c\x19\r:5\x00\x00\x00' +p717 +g9 +(g10 +g11 +g11 +(tRp718 +tp719 +Rp720 +(dp721 +g16 +g17 +(I0 +I28800 +I0 +tp722 +Rp723 +sg20 +Nsbtp724 +Rp725 +sg23 +V\u4f7f\u7528\u65b0\u98ce\u683c\u7684dict\u8868\u8fbe\u5f0f +p726 +sg25 +Vwangye +p727 +sg27 +Vhttp://code.dapps.douban.com/mario/commit/24e80abbdb8e3078f77ced0d09550edf8b7b6d2a +p728 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +Vwangye@douban.com +p729 +sg37 +Vmario +p730 +sa(dp731 +g2 +Ve6b9f251fbf2ec4626a805c4dd2652ea01684501 +p732 +sg4 +g458 +sg6 +g7 +(S'\x07\xdc\x0c\x19\r:/\x00\x00\x00' +p733 +g9 +(g10 +g11 +g11 +(tRp734 +tp735 +Rp736 +(dp737 +g16 +g17 +(I0 +I28800 +I0 +tp738 +Rp739 +sg20 +Nsbtp740 +Rp741 +sg23 +g152 +sg25 +g711 +sg27 +Vhttp://code.dapps.douban.com/liyouyang-fm-other/commit/e6b9f251fbf2ec4626a805c4dd2652ea01684501 +p742 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g713 +sg37 +g470 +sa(dp743 +g2 +V3300d8df4983fdee11bdbfaea32b3c60d82f444f +p744 +sg4 +g343 +sg6 +g7 +(S'\x07\xdc\x0c\x19\r43\x00\x00\x00' +p745 +g9 +(g10 +g11 +g11 +(tRp746 +tp747 +Rp748 +(dp749 +g16 +g17 +(I0 +I28800 +I0 +tp750 +Rp751 +sg20 +Nsbtp752 +Rp753 +sg23 +Vadd release +p754 +sg25 +g354 +sg27 +Vhttp://code.dapps.douban.com/WoFm/commit/3300d8df4983fdee11bdbfaea32b3c60d82f444f +p755 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g356 +sg37 +g357 +sa(dp756 +g2 +Vc856a666aabb90413075407d868b0fc6f711118e +p757 +sg4 +Vhttp://code.dapps.douban.com/dae_cz +p758 +sg6 +g7 +(S'\x07\xdc\x0c\x19\r4 \x00\x00\x00' +p759 +g9 +(g10 +g11 +g11 +(tRp760 +tp761 +Rp762 +(dp763 +g16 +g17 +(I0 +I28800 +I0 +tp764 +Rp765 +sg20 +Nsbtp766 +Rp767 +sg23 +VMerge branch 'master' of http://code.dapps.douban.com/dae into nagios-dae-http +p768 +sg25 +g68 +sg27 +Vhttp://code.dapps.douban.com/dae_cz/commit/c856a666aabb90413075407d868b0fc6f711118e +p769 +sg33 +Vrefs/heads/nagios-dae-http +p770 +sg31 +Vnagios-dae-http +p771 +sg29 +g30 +sg35 +g70 +sg37 +Vdae_cz +p772 +sa(dp773 +g90 +g91 +sg43 +Vpullrequest-dae-273-merged +p774 +sg93 +Vanrs +p775 +sg95 +Vdae_cz:nagios-dae-http +p776 +sg97 +Vdae:master +p777 +sg6 +g7 +(S'\x07\xdc\x0c\x19\r3!\x0c\xc6\xe9' +p778 +tp779 +Rp780 +sg101 +g102 +sg103 +Vreplace douban-check with dae-check http, ignore 4xx, 3xx status +p781 +sg27 +V/dae/newpull/273 +p782 +sg106 +g68 +sg29 +g107 +sa(dp783 +g2 +V27f5da81ad29217bb56cefd5bf6030648a7056be +p784 +sg4 +Vhttp://code.dapps.douban.com/dae +p785 +sg6 +g7 +(S'\x07\xdc\x0c\x19\r3\x1d\x00\x00\x00' +p786 +g9 +(g10 +g11 +g11 +(tRp787 +tp788 +Rp789 +(dp790 +g16 +g17 +(I0 +I28800 +I0 +tp791 +Rp792 +sg20 +Nsbtp793 +Rp794 +sg23 +VMerge pull request #273 from dae_cz:nagios-dae-http\u000a \u000a replace douban-check with dae-check http, ignore 4xx, 3xx status +p795 +sg25 +g775 +sg27 +Vhttp://code.dapps.douban.com/dae/commit/27f5da81ad29217bb56cefd5bf6030648a7056be +p796 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +Vanrs@douban.com +p797 +sg37 +Vdae +p798 +sa(dp799 +g90 +g91 +sg43 +Vpullrequest-dae-279-merged +p800 +sg93 +g775 +sg95 +Vdae_cz:mq-worker-daemon +p801 +sg97 +g777 +sg6 +g7 +(S'\x07\xdc\x0c\x19\r2\x07\t\xcd\xfe' +p802 +tp803 +Rp804 +sg101 +V@anrs pls review \u000a \u000adaes-start-daemon \u52a0\u8f7ddaemon cfgs\u65f6\uff0c\u628amq\uff0ccrons\u4e5f\u4f5c\u4e3adaemon\u63d2\u5165\u3002\u76ee\u524d\u4ec5\u9488\u5bf9sync worker\uff0cblackfire\uff0creadthedocs\u4e24\u4e2aapps\u542f\u7528\uff0c\u5176\u4ed6\u65e0\u5f71\u54cd \u000a \u000adaes-supervisor, daes-monitor \u5229\u7528dae_deploy\u7684Configuration\u670d\u52a1\u83b7\u53d6daemon cfgs\uff0c\u9700\u8981\u4fee\u6539dae_deploy(TBD) \u000a \u000a \u000a\u4e00\u4e9b\u95ee\u9898: \u000amq worker\u6ca1\u6709\u505aidle\u5904\u7406\uff0c\u7cfb\u7edf\u4e0d\u4f1a\u56de\u6536\u7a7a\u95f2worker\uff0cdaemon\u6570\u91cf\u9650\u5236\u4e3a1\uff0c\u57fa\u4e8edaemon\u7684mq worker\u8c03\u5ea6\u6709\u5f85\u5b9e\u73b0 \u000a \u000a +p805 +sg103 +Vsync mq worker support +p806 +sg27 +V/dae/newpull/279 +p807 +sg106 +g68 +sg29 +g107 +sa(dp808 +g2 +V28d6b46dbd4f2bafe628112940355c7672839d55 +p809 +sg4 +g785 +sg6 +g7 +(S'\x07\xdc\x0c\x19\r1:\x00\x00\x00' +p810 +g9 +(g10 +g11 +g11 +(tRp811 +tp812 +Rp813 +(dp814 +g16 +g17 +(I0 +I28800 +I0 +tp815 +Rp816 +sg20 +Nsbtp817 +Rp818 +sg23 +VMerge pull request #279 from dae_cz:mq-worker-daemon\u000a \u000a sync mq worker support +p819 +sg25 +g775 +sg27 +Vhttp://code.dapps.douban.com/dae/commit/28d6b46dbd4f2bafe628112940355c7672839d55 +p820 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g797 +sg37 +g798 +sa(dp821 +g2 +V94ec21333fd1e59f07672540bcfcc7c2adae0f24 +p822 +sg4 +g441 +sg6 +g7 +(S'\x07\xdc\x0c\x19\r/$\x00\x00\x00' +p823 +g9 +(g10 +g11 +g11 +(tRp824 +tp825 +Rp826 +(dp827 +g16 +g17 +(I0 +I28800 +I0 +tp828 +Rp829 +sg20 +Nsbtp830 +Rp831 +sg23 +g222 +sg25 +g452 +sg27 +Vhttp://code.dapps.douban.com/bazinga/commit/94ec21333fd1e59f07672540bcfcc7c2adae0f24 +p832 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g454 +sg37 +g455 +sa(dp833 +g90 +g359 +sg43 +Vpullrequest-shire_for_mobile-354-unmerge +p834 +sg6 +g7 +(S'\x07\xdc\x0c\x19\r.\x08\x0by\xae' +p835 +tp836 +Rp837 +sg95 +Vshire_for_mobile_kongzhen:mobile +p838 +sg97 +Vshire_for_mobile:mobileapp +p839 +sg93 +Vdexteryy +p840 +sg101 +V# \u91cd\u6784\u8303\u56f4\uff1a\u7b14\u8bb0\u3001\u4e66\u8bc4\u3001\u8bba\u575b\u3001buyinfo +p841 +sg103 +V\u4e00\u4e9b\u91cd\u6784\uff0c\u548cluzong.utils.cardkit +p842 +sg27 +V/shire_for_mobile/newpull/7 +p843 +sg106 +Vkongzhen +p844 +sg29 +g107 +sa(dp845 +g2 +V865057d11391e832848e14f7a410db429250c7fb +p846 +sg4 +Vhttp://code.dapps.douban.com/shire_for_mobile_kongzhen +p847 +sg6 +g7 +(S'\x07\xdc\x0c\x19\r,\x00\x00\x00\x00' +p848 +g9 +(g10 +g11 +g11 +(tRp849 +tp850 +Rp851 +(dp852 +g16 +g17 +(I0 +I28800 +I0 +tp853 +Rp854 +sg20 +Nsbtp855 +Rp856 +sg23 +Vrm white space +p857 +sg25 +g844 +sg27 +Vhttp://code.dapps.douban.com/shire_for_mobile_kongzhen/commit/865057d11391e832848e14f7a410db429250c7fb +p858 +sg29 +g30 +sg31 +Vmobile +p859 +sg33 +Vrefs/heads/mobile +p860 +sg35 +Vryankung@ieee.org +p861 +sg37 +Vshire_for_mobile_kongzhen +p862 +sa(dp863 +g2 +V1bed03fb0ca412e269542ab03fc80266d0859c37 +p864 +sg4 +g847 +sg6 +g7 +(S"\x07\xdc\x0c\x19\r'\x18\x00\x00\x00" +p865 +g9 +(g10 +g11 +g11 +(tRp866 +tp867 +Rp868 +(dp869 +g16 +g17 +(I0 +I28800 +I0 +tp870 +Rp871 +sg20 +Nsbtp872 +Rp873 +sg23 +Vreflactor and utils of cardkit +p874 +sg25 +g844 +sg27 +Vhttp://code.dapps.douban.com/shire_for_mobile_kongzhen/commit/1bed03fb0ca412e269542ab03fc80266d0859c37 +p875 +sg33 +g860 +sg31 +g859 +sg29 +g30 +sg35 +g861 +sg37 +g862 +sa(dp876 +g90 +g91 +sg43 +Vpullrequest-moria_torpedoallen-7-merged +p877 +sg93 +Vtorpedoallen +p878 +sg95 +Vliyazhou~moria_torpedoallen:master +p879 +sg97 +Vmoria_torpedoallen:master +p880 +sg6 +g7 +(S'\x07\xdc\x0c\x19\r&"\x07M*' +p881 +tp882 +Rp883 +sg101 +Vhi \u4e3b\u5e2d, \u000a \u000a\u521a\u521a\u5c06\u6d3b\u8dc3\u7528\u6237\u6570\u7684\u811a\u672c\u8f6c\u4e3a\u4e86Dpark\u6765\u5b9e\u73b0\uff0c\u540c\u65f6\u53d1\u73b0\u539f\u5148\u88c5\u8f7d\u5230\u6570\u636e\u5e93\u7684\u811a\u672c\u5199\u5f97\u8fc7\u4e8e\u590d\u6742\uff0c\u987a\u4fbf\u5199\u4e86\u4e00\u4e2a\u7b80\u5355\u7684\u7248\u672c\u3002please review ^_^ +p884 +sg103 +V\u5c06\u8ba1\u7b97\u6d3b\u8dc3\u7528\u6237\u6570\u7684\u811a\u672c\u8f6c\u4e3adpark\uff0c\u5e76\u91cd\u5199\u4e86\u88c5\u8f7d\u5230\u6570\u636e\u5e93\u7684\u811a\u672c +p885 +sg27 +V/moria_torpedoallen/newpull/7 +p886 +sg106 +Vliyazhou +p887 +sg29 +g107 +sa(dp888 +g2 +V2a9b3e3e3547e411ab7e5a3fab444a4efc353436 +p889 +sg4 +Vhttp://code.dapps.douban.com/moria_torpedoallen +p890 +sg6 +g7 +(S'\x07\xdc\x0c\x19\r& \x00\x00\x00' +p891 +g9 +(g10 +g11 +g11 +(tRp892 +tp893 +Rp894 +(dp895 +g16 +g17 +(I0 +I28800 +I0 +tp896 +Rp897 +sg20 +Nsbtp898 +Rp899 +sg23 +VMerge pull request #7 from liyazhou~moria_torpedoallen:master\u000a \u000a \u5c06\u8ba1\u7b97\u6d3b\u8dc3\u7528\u6237\u6570\u7684\u811a\u672c\u8f6c\u4e3adpark\uff0c\u5e76\u91cd\u5199\u4e86\u88c5\u8f7d\u5230\u6570\u636e\u5e93\u7684\u811a\u672c +p900 +sg25 +g878 +sg27 +Vhttp://code.dapps.douban.com/moria_torpedoallen/commit/2a9b3e3e3547e411ab7e5a3fab444a4efc353436 +p901 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +Vtorpedoallen@douban.com +p902 +sg37 +Vmoria_torpedoallen +p903 +sa(dp904 +g2 +V7e1e8878006f894bccc08f5341fe4b5c533f1583 +p905 +sg4 +g262 +sg6 +g7 +(S'\x07\xdc\x0c\x19\r%\x04\x00\x00\x00' +p906 +g9 +(g10 +g11 +g11 +(tRp907 +tp908 +Rp909 +(dp910 +g16 +g17 +(I0 +I28800 +I0 +tp911 +Rp912 +sg20 +Nsbtp913 +Rp914 +sg23 +Vreverse for result.html in views.py +p915 +sg25 +g273 +sg27 +Vhttp://code.dapps.douban.com/resume/commit/7e1e8878006f894bccc08f5341fe4b5c533f1583 +p916 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g273 +sg37 +g275 +sa(dp917 +g2 +Va99ca4e7555c8928e3ac499c2d0b512c8eef9810 +p918 +sg4 +Vhttp://code.dapps.douban.com/thoridal +p919 +sg6 +g7 +(S'\x07\xdc\x0c\x19\r!\x1d\x00\x00\x00' +p920 +g9 +(g10 +g11 +g11 +(tRp921 +tp922 +Rp923 +(dp924 +g16 +g17 +(I0 +I28800 +I0 +tp925 +Rp926 +sg20 +Nsbtp927 +Rp928 +sg23 +Vadd submodule +p929 +sg25 +Vhaibo +p930 +sg27 +Vhttp://code.dapps.douban.com/thoridal/commit/a99ca4e7555c8928e3ac499c2d0b512c8eef9810 +p931 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +Vhaibo@douban.com +p932 +sg37 +Vthoridal +p933 +sa(dp934 +g2 +Va16e5e448cf49f0623b94a27835b5ec9d2280dde +p935 +sg4 +g262 +sg6 +g7 +(S'\x07\xdc\x0c\x19\r\x183\x00\x00\x00' +p936 +g9 +(g10 +g11 +g11 +(tRp937 +tp938 +Rp939 +(dp940 +g16 +g17 +(I0 +I28800 +I0 +tp941 +Rp942 +sg20 +Nsbtp943 +Rp944 +sg23 +Vchange submit.js +p945 +sg25 +g273 +sg27 +Vhttp://code.dapps.douban.com/resume/commit/a16e5e448cf49f0623b94a27835b5ec9d2280dde +p946 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g273 +sg37 +g275 +sa(dp947 +g6 +g7 +(S'\x07\xdc\x0c\x19\r\x18%\r3\x8b' +p948 +tp949 +Rp950 +sg43 +Vnewcodereview-Vasks-18-461 +p951 +sg25 +S'jollychang' +p952 +sg27 +V/Vasks/newpull/18#comment-461 +p953 +sg47 +Vlgtm +p954 +sg49 +L18L +sg50 +g545 +sg29 +g52 +sg53 +g546 +sa(dp955 +g2 +V0cdf203e8ec236837421b38af9671ac3f14128f5 +p956 +sg4 +g758 +sg6 +g7 +(S'\x07\xdc\x0c\x19\r\x15\x14\x00\x00\x00' +p957 +g9 +(g10 +g11 +g11 +(tRp958 +tp959 +Rp960 +(dp961 +g16 +g17 +(I0 +I28800 +I0 +tp962 +Rp963 +sg20 +Nsbtp964 +Rp965 +sg23 +VMerge branch 'master' of http://code.dapps.douban.com/dae into mq-worker-daemon +p966 +sg25 +g68 +sg27 +Vhttp://code.dapps.douban.com/dae_cz/commit/0cdf203e8ec236837421b38af9671ac3f14128f5 +p967 +sg29 +g30 +sg31 +Vmq-worker-daemon +p968 +sg33 +Vrefs/heads/mq-worker-daemon +p969 +sg35 +g70 +sg37 +g772 +sa(dp970 +g2 +V035d66152aab47f06dc84c89fa7b4c5829864819 +p971 +sg4 +g603 +sg6 +g7 +(S'\x07\xdc\x0c\x19\r\x14\x16\x00\x00\x00' +p972 +g9 +(g10 +g11 +g11 +(tRp973 +tp974 +Rp975 +(dp976 +g16 +g17 +(I0 +I28800 +I0 +tp977 +Rp978 +sg20 +Nsbtp979 +Rp980 +sg23 +Vadded zengfanyu +p981 +sg25 +g614 +sg27 +Vhttp://code.dapps.douban.com/ideas/commit/035d66152aab47f06dc84c89fa7b4c5829864819 +p982 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g616 +sg37 +g617 +sa(dp983 +g2 +V552098e6c2e660d4af31c867cc8f50c816dd3288 +p984 +sg4 +g370 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0c)\x14\x00\x00\x00' +p985 +g9 +(g10 +g11 +g11 +(tRp986 +tp987 +Rp988 +(dp989 +g16 +g17 +(I0 +I28800 +I0 +tp990 +Rp991 +sg20 +Nsbtp992 +Rp993 +sg23 +Vadd releaser +p994 +sg25 +g312 +sg27 +Vhttp://code.dapps.douban.com/cyrildou_joshua/commit/552098e6c2e660d4af31c867cc8f50c816dd3288 +p995 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g381 +sg37 +g382 +sa(dp996 +g2 +V9161fab168a4c3d826a9e555471889fed18f10c4 +p997 +sg4 +g262 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0c#6\x00\x00\x00' +p998 +g9 +(g10 +g11 +g11 +(tRp999 +tp1000 +Rp1001 +(dp1002 +g16 +g17 +(I0 +I28800 +I0 +tp1003 +Rp1004 +sg20 +Nsbtp1005 +Rp1006 +sg23 +Vsolve encoding +p1007 +sg25 +g273 +sg27 +Vhttp://code.dapps.douban.com/resume/commit/9161fab168a4c3d826a9e555471889fed18f10c4 +p1008 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g273 +sg37 +g275 +sa(dp1009 +g2 +Vc8939bd4e02aebf8d3ecf3e1dce786dbadcc0f44 +p1010 +sg4 +g262 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0c\x1c\x0e\x00\x00\x00' +p1011 +g9 +(g10 +g11 +g11 +(tRp1012 +tp1013 +Rp1014 +(dp1015 +g16 +g17 +(I0 +I28800 +I0 +tp1016 +Rp1017 +sg20 +Nsbtp1018 +Rp1019 +sg23 +Vadd date.js +p1020 +sg25 +g273 +sg27 +Vhttp://code.dapps.douban.com/resume/commit/c8939bd4e02aebf8d3ecf3e1dce786dbadcc0f44 +p1021 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g273 +sg37 +g275 +sa(dp1022 +g6 +g7 +(S'\x07\xdc\x0c\x19\x0c\x1c\x02\x02\xf7\x86' +p1023 +tp1024 +Rp1025 +sg43 +Vnewcodereview-Vasks-18-460 +p1026 +sg25 +S'sunyi' +p1027 +sg27 +V/Vasks/newpull/18#comment-460 +p1028 +sg47 +V@jollychang @qingfeng \u9ebb\u70e6\u770b\u770b\uff1f +p1029 +sg49 +L18L +sg50 +g545 +sg29 +g52 +sg53 +g546 +sa(dp1030 +g2 +Vd3918bda17ae3e7ed2dc872c19c223da3aa0c5f1 +p1031 +sg4 +g262 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0c\x1b.\x00\x00\x00' +p1032 +g9 +(g10 +g11 +g11 +(tRp1033 +tp1034 +Rp1035 +(dp1036 +g16 +g17 +(I0 +I28800 +I0 +tp1037 +Rp1038 +sg20 +Nsbtp1039 +Rp1040 +sg23 +Vfix position in campus_submit, add date.js +p1041 +sg25 +g273 +sg27 +Vhttp://code.dapps.douban.com/resume/commit/d3918bda17ae3e7ed2dc872c19c223da3aa0c5f1 +p1042 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g273 +sg37 +g275 +sa(dp1043 +g90 +g359 +sg43 +Vpullrequest-Vasks-353-unmerge +p1044 +sg93 +g667 +sg95 +g666 +sg97 +g546 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0c\x1b\x00\x08\x0b\x93' +p1045 +tp1046 +Rp1047 +sg101 +g668 +sg103 +g669 +sg27 +g670 +sg106 +g545 +sg29 +g107 +sa(dp1048 +g2 +Ve74e773c2528b18c7f082ca33f6265023ec77c17 +p1049 +sg4 +g126 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0c\x17\x02\x00\x00\x00' +p1050 +g9 +(g10 +g11 +g11 +(tRp1051 +tp1052 +Rp1053 +(dp1054 +g16 +g17 +(I0 +I28800 +I0 +tp1055 +Rp1056 +sg20 +Nsbtp1057 +Rp1058 +sg23 +Vadd rating field to note +p1059 +sg25 +g137 +sg27 +Vhttp://code.dapps.douban.com/dimholt/commit/e74e773c2528b18c7f082ca33f6265023ec77c17 +p1060 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g139 +sg37 +g140 +sa(dp1061 +g6 +g7 +(S'\x07\xdc\x0c\x19\x0c\x144\x08\xcd\x8e' +p1062 +tp1063 +Rp1064 +sg43 +Vnewcodereview-joshua-3-459 +p1065 +sg25 +S'zhangchi' +p1066 +sg27 +V/joshua/newpull/3#comment-459 +p1067 +sg47 +V@cyrildou \u54e6 \u6211\u660e\u767d\u4e86\uff0c\u662f\u4e4b\u524d\u5c31\u4e0d\u4e00\u81f4\u7684\u539f\u56e0\u3002 \u000a \u000a \u8d5e\uff0clgtm, :sparkles: +p1068 +sg49 +L3L +sg50 +g312 +sg29 +g52 +sg53 +g313 +sa(dp1069 +g90 +g91 +sg43 +Vpullrequest-smaug-2-merged +p1070 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0c\x12;\r\xe1\xc5' +p1071 +tp1072 +Rp1073 +sg95 +Vjollychang~smaug:master +p1074 +sg97 +Vsmaug:master +p1075 +sg93 +Vwangfei +p1076 +sg101 +g102 +sg103 +Vkey is string +p1077 +sg27 +V/smaug/newpull/2 +p1078 +sg106 +g667 +sg29 +g107 +sa(dp1079 +g2 +Vb0e780d2da229e91cc7159c74396e74f8e7f954b +p1080 +sg4 +Vhttp://code.dapps.douban.com/smaug +p1081 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0c\x129\x00\x00\x00' +p1082 +g9 +(g10 +g11 +g11 +(tRp1083 +tp1084 +Rp1085 +(dp1086 +g16 +g17 +(I0 +I28800 +I0 +tp1087 +Rp1088 +sg20 +Nsbtp1089 +Rp1090 +sg23 +VMerge pull request #2 from jollychang~smaug:master\u000a \u000a key is string +p1091 +sg25 +g1076 +sg27 +Vhttp://code.dapps.douban.com/smaug/commit/b0e780d2da229e91cc7159c74396e74f8e7f954b +p1092 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +Vwangfei@douban.com +p1093 +sg37 +Vsmaug +p1094 +sa(dp1095 +g2 +V9225922dd7c420ca610c8f894376a5427da60d1a +p1096 +sg4 +Vhttp://code.dapps.douban.com/rohirrim +p1097 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0c\x125\x00\x00\x00' +p1098 +g9 +(g10 +g11 +g11 +(tRp1099 +tp1100 +Rp1101 +(dp1102 +g16 +g17 +(I0 +I28800 +I0 +tp1103 +Rp1104 +sg20 +Nsbtp1105 +Rp1106 +sg23 +Vtest\u000a \u000a <script type="text/javascript">alert('hello world')</script> +p1107 +sg25 +Vlinju +p1108 +sg27 +Vhttp://code.dapps.douban.com/rohirrim/commit/9225922dd7c420ca610c8f894376a5427da60d1a +p1109 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +Vlinju@douban.com +p1110 +sg37 +Vrohirrim +p1111 +sa(dp1112 +g2 +V80d10a1f11d494c904d9ad29d3f207a3f265244d +p1113 +sg4 +g673 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0c\x11\x1e\x00\x00\x00' +p1114 +g9 +(g10 +g11 +g11 +(tRp1115 +tp1116 +Rp1117 +(dp1118 +g16 +g17 +(I0 +I28800 +I0 +tp1119 +Rp1120 +sg20 +Nsbtp1121 +Rp1122 +sg23 +g669 +sg25 +g545 +sg27 +Vhttp://code.dapps.douban.com/Vasks/commit/80d10a1f11d494c904d9ad29d3f207a3f265244d +p1123 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +Vsunyi@douban.com +p1124 +sg37 +g686 +sa(dp1125 +g6 +g7 +(S'\x07\xdc\x0c\x19\x0c\x109\x05\xac\x03' +p1126 +tp1127 +Rp1128 +sg43 +Vnewcodereview-joshua-3-458 +p1129 +sg25 +S'cyrildou' +p1130 +sg27 +V/joshua/newpull/3#comment-458 +p1131 +sg47 +V\u5df2\u7ecfdiff\u8fc7\u4e86\uff0c\u6ca1\u6709\u533a\u522b\u3002makefile\u4e2dcommand\u5df2\u52a0 +p1132 +sg49 +L3L +sg50 +g312 +sg29 +g52 +sg53 +g313 +sa(dp1133 +g2 +Vb37f1a6ee761f6112c36cf6b279d8ef7c0f6d0c2 +p1134 +sg4 +g370 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0c\x0f8\x00\x00\x00' +p1135 +g9 +(g10 +g11 +g11 +(tRp1136 +tp1137 +Rp1138 +(dp1139 +g16 +g17 +(I0 +I28800 +I0 +tp1140 +Rp1141 +sg20 +Nsbtp1142 +Rp1143 +sg23 +Vauto +p1144 +sg25 +g312 +sg27 +Vhttp://code.dapps.douban.com/cyrildou_joshua/commit/b37f1a6ee761f6112c36cf6b279d8ef7c0f6d0c2 +p1145 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g381 +sg37 +g382 +sa(dp1146 +g2 +V16d9bc0338db991787568e5c73c856373a279079 +p1147 +sg4 +Vhttp://code.dapps.douban.com/jollychang~smaug +p1148 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0c\r.\x00\x00\x00' +p1149 +g9 +(g10 +g11 +g11 +(tRp1150 +tp1151 +Rp1152 +(dp1153 +g16 +g17 +(I0 +I28800 +I0 +tp1154 +Rp1155 +sg20 +Nsbtp1156 +Rp1157 +sg23 +VMerge branch 'master' of http://code.dapps.douban.com/smaug +p1158 +sg25 +g667 +sg27 +Vhttp://code.dapps.douban.com/jollychang~smaug/commit/16d9bc0338db991787568e5c73c856373a279079 +p1159 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g685 +sg37 +Vjollychang~smaug +p1160 +sa(dp1161 +g90 +g359 +sg43 +Vpullrequest-smaug-352-unmerge +p1162 +sg93 +Vianoshen +p1163 +sg95 +g1074 +sg97 +g1075 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0c\r\n\t\x17\xe8' +p1164 +tp1165 +Rp1166 +sg101 +g102 +sg103 +g1077 +sg27 +g1078 +sg106 +g667 +sg29 +g107 +sa(dp1167 +g2 +V0d396759be511d0f0d66312101bb17737dac0052 +p1168 +sg4 +g1148 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0c\x0c!\x00\x00\x00' +p1169 +g9 +(g10 +g11 +g11 +(tRp1170 +tp1171 +Rp1172 +(dp1173 +g16 +g17 +(I0 +I28800 +I0 +tp1174 +Rp1175 +sg20 +Nsbtp1176 +Rp1177 +sg23 +g1077 +sg25 +g667 +sg27 +Vhttp://code.dapps.douban.com/jollychang~smaug/commit/0d396759be511d0f0d66312101bb17737dac0052 +p1178 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g685 +sg37 +g1160 +sa(dp1179 +g2 +V43412245165dc89ac4dae673b3fada06a1ffedbb +p1180 +sg4 +Vhttp://code.dapps.douban.com/read-search +p1181 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0c\x0b\t\x00\x00\x00' +p1182 +g9 +(g10 +g11 +g11 +(tRp1183 +tp1184 +Rp1185 +(dp1186 +g16 +g17 +(I0 +I28800 +I0 +tp1187 +Rp1188 +sg20 +Nsbtp1189 +Rp1190 +sg23 +g206 +sg25 +Vjiawei +p1191 +sg27 +Vhttp://code.dapps.douban.com/read-search/commit/43412245165dc89ac4dae673b3fada06a1ffedbb +p1192 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +Vjiawei@douban.com +p1193 +sg37 +Vread-search +p1194 +sa(dp1195 +g90 +g91 +sg43 +Vpullrequest-smaug-1-merged +p1196 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0c\n\x11\t\xd5\x06' +p1197 +tp1198 +Rp1199 +sg95 +g1074 +sg97 +g1075 +sg93 +g1076 +sg101 +g102 +sg103 +V\u5fcd\u4e0d\u4e86126\u3001127\u4e86 +p1200 +sg27 +V/smaug/newpull/1 +p1201 +sg106 +g667 +sg29 +g107 +sa(dp1202 +g2 +V1e05457bc6a72e8427f76459b3e9e342136882ab +p1203 +sg4 +g1081 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0c\n\x0e\x00\x00\x00' +p1204 +g9 +(g10 +g11 +g11 +(tRp1205 +tp1206 +Rp1207 +(dp1208 +g16 +g17 +(I0 +I28800 +I0 +tp1209 +Rp1210 +sg20 +Nsbtp1211 +Rp1212 +sg23 +VMerge pull request #1 from jollychang~smaug:master\u000a \u000a \u5fcd\u4e0d\u4e86126\u3001127\u4e86 +p1213 +sg25 +g1076 +sg27 +Vhttp://code.dapps.douban.com/smaug/commit/1e05457bc6a72e8427f76459b3e9e342136882ab +p1214 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g1093 +sg37 +g1094 +sa(dp1215 +g2 +V31418dacdbef21b46c9efca1a7deb2475d74d794 +p1216 +sg4 +g1148 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0c\t2\x00\x00\x00' +p1217 +g9 +(g10 +g11 +g11 +(tRp1218 +tp1219 +Rp1220 +(dp1221 +g16 +g17 +(I0 +I28800 +I0 +tp1222 +Rp1223 +sg20 +Nsbtp1224 +Rp1225 +sg23 +g1158 +sg25 +g667 +sg27 +Vhttp://code.dapps.douban.com/jollychang~smaug/commit/31418dacdbef21b46c9efca1a7deb2475d74d794 +p1226 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g685 +sg37 +g1160 +sa(dp1227 +g2 +V432ced5ee5bf038bd7c420282e47d03b77cbc9bd +p1228 +sg4 +g1081 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0c\x01\x10\x00\x00\x00' +p1229 +g9 +(g10 +g11 +g11 +(tRp1230 +tp1231 +Rp1232 +(dp1233 +g16 +g17 +(I0 +I28800 +I0 +tp1234 +Rp1235 +sg20 +Nsbtp1236 +Rp1237 +sg23 +Vinc timelinjs timeout to 30000 +p1238 +sg25 +g1076 +sg27 +Vhttp://code.dapps.douban.com/smaug/commit/432ced5ee5bf038bd7c420282e47d03b77cbc9bd +p1239 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g1093 +sg37 +g1094 +sa(dp1240 +g2 +V357b886d79335c2fe521ff3f0861ca1cf43f1cc7 +p1241 +sg4 +Vhttp://code.dapps.douban.com/pre-new +p1242 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b9\x19\x00\x00\x00' +p1243 +g9 +(g10 +g11 +g11 +(tRp1244 +tp1245 +Rp1246 +(dp1247 +g16 +g17 +(I0 +I28800 +I0 +tp1248 +Rp1249 +sg20 +Nsbtp1250 +Rp1251 +sg23 +Vremove <hr> in readme +p1252 +sg25 +Vqianlong +p1253 +sg27 +Vhttp://code.dapps.douban.com/pre-new/commit/357b886d79335c2fe521ff3f0861ca1cf43f1cc7 +p1254 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +Vqianlong@douban.com +p1255 +sg37 +Vpre-new +p1256 +sa(dp1257 +g6 +g7 +(S'\x07\xdc\x0c\x19\x0b8\r\x04\x8eU' +p1258 +tp1259 +Rp1260 +sg43 +Vnewcodereview-code-588-457 +p1261 +sg25 +g45 +sg27 +V/code/newpull/588#comment-457 +p1262 +sg47 +V@qingfeng \u73b0\u5728\u5df2\u7ecf\u597d\u4e86\uff01 +p1263 +sg49 +L588L +sg50 +g51 +sg29 +g52 +sg53 +g54 +sa(dp1264 +g2 +V96877d54ee4b76839a11ef05b433aad609bb695a +p1265 +sg4 +g1242 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b8\x02\x00\x00\x00' +p1266 +g9 +(g10 +g11 +g11 +(tRp1267 +tp1268 +Rp1269 +(dp1270 +g16 +g17 +(I0 +I28800 +I0 +tp1271 +Rp1272 +sg20 +Nsbtp1273 +Rp1274 +sg23 +Vupdate pre help message, and remove some unused oprs +p1275 +sg25 +g1253 +sg27 +Vhttp://code.dapps.douban.com/pre-new/commit/96877d54ee4b76839a11ef05b433aad609bb695a +p1276 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g1255 +sg37 +g1256 +sa(dp1277 +g2 +Ve09686bc2a5a6742af1209e4f975470ac1aa8dd5 +p1278 +sg4 +g1242 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b77\x00\x00\x00' +p1279 +g9 +(g10 +g11 +g11 +(tRp1280 +tp1281 +Rp1282 +(dp1283 +g16 +g17 +(I0 +I28800 +I0 +tp1284 +Rp1285 +sg20 +Nsbtp1286 +Rp1287 +sg23 +Vupdate readme +p1288 +sg25 +g1253 +sg27 +Vhttp://code.dapps.douban.com/pre-new/commit/e09686bc2a5a6742af1209e4f975470ac1aa8dd5 +p1289 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g1255 +sg37 +g1256 +sa(dp1290 +g2 +V2d3f4d8f3c23014256d44ceafccd559532fc6560 +p1291 +sg4 +Vhttp://code.dapps.douban.com/code_xueming +p1292 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b6,\x00\x00\x00' +p1293 +g9 +(g10 +g11 +g11 +(tRp1294 +tp1295 +Rp1296 +(dp1297 +g16 +g17 +(I0 +I28800 +I0 +tp1298 +Rp1299 +sg20 +Nsbtp1300 +Rp1301 +sg23 +VMerge http://code.dapps.douban.com/code +p1302 +sg25 +g51 +sg27 +Vhttp://code.dapps.douban.com/code_xueming/commit/2d3f4d8f3c23014256d44ceafccd559532fc6560 +p1303 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +Vxueming@douban.com +p1304 +sg37 +Vcode_xueming +p1305 +sa(dp1306 +g90 +g91 +sg43 +Vpullrequest-code-598-merged +p1307 +sg93 +g94 +sg95 +Vcode_qingfeng:organization_to_oz +p1308 +sg97 +g54 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b5\x17\x04\x8dR' +p1309 +tp1310 +Rp1311 +sg101 +V@xingben pls, review, thanks +p1312 +sg103 +Vchange to ozjs +p1313 +sg27 +V/code/newpull/598 +p1314 +sg106 +g94 +sg29 +g107 +sa(dp1315 +g2 +Vaa6798d1acf0cc3bbd0d9b3bcc4e6991b02115ba +p1316 +sg4 +g110 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b5\x13\x00\x00\x00' +p1317 +g9 +(g10 +g11 +g11 +(tRp1318 +tp1319 +Rp1320 +(dp1321 +g16 +g17 +(I0 +I28800 +I0 +tp1322 +Rp1323 +sg20 +Nsbtp1324 +Rp1325 +sg23 +VMerge pull request #598 from code_qingfeng:organization_to_oz\u000a \u000a change to ozjs +p1326 +sg25 +g94 +sg27 +Vhttp://code.dapps.douban.com/code/commit/aa6798d1acf0cc3bbd0d9b3bcc4e6991b02115ba +p1327 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g122 +sg37 +g123 +sa(dp1328 +g6 +g7 +(S'\x07\xdc\x0c\x19\x0b48\x0e\xf2\xb5' +p1329 +tp1330 +Rp1331 +sg43 +Vnewcodereview-code-588-456 +p1332 +sg25 +g542 +sg27 +V/code/newpull/588#comment-456 +p1333 +sg47 +V This pull request cannot be automatically merged. @xueming \u000a +p1334 +sg49 +L588L +sg50 +g51 +sg29 +g52 +sg53 +g54 +sa(dp1335 +g6 +g7 +(S'\x07\xdc\x0c\x19\x0b3\x18\x08\x9f\x81' +p1336 +tp1337 +Rp1338 +sg43 +Vnewcodereview-code-598-455 +p1339 +sg25 +g309 +sg27 +V/code/newpull/598#comment-455 +p1340 +sg47 +V:cool: lgtm +p1341 +sg49 +L598L +sg50 +g94 +sg29 +g52 +sg53 +g54 +sa(dp1342 +g6 +g7 +(S'\x07\xdc\x0c\x19\x0b25\x02\xb0n' +p1343 +tp1344 +Rp1345 +sg43 +Vnewcodereview-code-598-201 +p1346 +sg25 +g542 +sg27 +V/code/newpull/598#review-201 +p1347 +sg47 +Vurl\u4e5f\u6539\u52a8\u7684\u8bdd, \u6539\u52a8\u6709\u70b9\u591a, \u7559\u7740\u4e0b\u6b21PR\u5427~ +p1348 +sg49 +L598L +sg50 +g94 +sg29 +g52 +sg53 +g54 +sa(dp1349 +g2 +V85ea70b71ed8c4339b2c255d6e182b5cd97ba9d9 +p1350 +sg4 +g126 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b2 \x00\x00\x00' +p1351 +g9 +(g10 +g11 +g11 +(tRp1352 +tp1353 +Rp1354 +(dp1355 +g16 +g17 +(I0 +I28800 +I0 +tp1356 +Rp1357 +sg20 +Nsbtp1358 +Rp1359 +sg23 +g136 +sg25 +g137 +sg27 +Vhttp://code.dapps.douban.com/dimholt/commit/85ea70b71ed8c4339b2c255d6e182b5cd97ba9d9 +p1360 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g139 +sg37 +g140 +sa(dp1361 +g90 +g91 +sg43 +Vpullrequest-erebor-config-5-merged +p1362 +sg93 +g1076 +sg95 +Vianoshen_erebor-config:master +p1363 +sg97 +Verebor-config:master +p1364 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b2\x16\nh\x94' +p1365 +tp1366 +Rp1367 +sg101 +g102 +sg103 +Vtest push 2 +p1368 +sg27 +V/erebor-config/newpull/5 +p1369 +sg106 +g1163 +sg29 +g107 +sa(dp1370 +g2 +V0756f9f8f64b3949f27bf2655072729de0ad3910 +p1371 +sg4 +Vhttp://code.dapps.douban.com/erebor-config +p1372 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b2\x14\x00\x00\x00' +p1373 +g9 +(g10 +g11 +g11 +(tRp1374 +tp1375 +Rp1376 +(dp1377 +g16 +g17 +(I0 +I28800 +I0 +tp1378 +Rp1379 +sg20 +Nsbtp1380 +Rp1381 +sg23 +VMerge pull request #5 from ianoshen_erebor-config:master\u000a \u000a test push 2 +p1382 +sg25 +g1076 +sg27 +Vhttp://code.dapps.douban.com/erebor-config/commit/0756f9f8f64b3949f27bf2655072729de0ad3910 +p1383 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g1093 +sg37 +Verebor-config +p1384 +sa(dp1385 +g2 +V7cd5ccc00e4040ada48121c96f44422da5608f5d +p1386 +sg4 +g126 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b2\t\x00\x00\x00' +p1387 +g9 +(g10 +g11 +g11 +(tRp1388 +tp1389 +Rp1390 +(dp1391 +g16 +g17 +(I0 +I28800 +I0 +tp1392 +Rp1393 +sg20 +Nsbtp1394 +Rp1395 +sg23 +VMerge branch 'v5.0' into v6.0 +p1396 +sg25 +g137 +sg27 +Vhttp://code.dapps.douban.com/dimholt/commit/7cd5ccc00e4040ada48121c96f44422da5608f5d +p1397 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g139 +sg37 +g140 +sa(dp1398 +g2 +Vf083bdad9933b091285fb5cbe2f3f9b4f4dc9771 +p1399 +sg4 +g919 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b1:\x00\x00\x00' +p1400 +g9 +(g10 +g11 +g11 +(tRp1401 +tp1402 +Rp1403 +(dp1404 +g16 +g17 +(I0 +I28800 +I0 +tp1405 +Rp1406 +sg20 +Nsbtp1407 +Rp1408 +sg23 +Vremove NLTK_test, URL_clustering +p1409 +sg25 +g930 +sg27 +Vhttp://code.dapps.douban.com/thoridal/commit/f083bdad9933b091285fb5cbe2f3f9b4f4dc9771 +p1410 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g932 +sg37 +g933 +sa(dp1411 +g2 +Vb9949737c5b80067c6671f5ea09a01b94b656d8f +p1412 +sg4 +Vhttp://code.dapps.douban.com/ianoshen_erebor-config +p1413 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b1\t\x00\x00\x00' +p1414 +g9 +(g10 +g11 +g11 +(tRp1415 +tp1416 +Rp1417 +(dp1418 +g16 +g17 +(I0 +I28800 +I0 +tp1419 +Rp1420 +sg20 +Nsbtp1421 +Rp1422 +sg23 +VMerge branch 'master' of http://code.dapps.douban.com/erebor-config +p1423 +sg25 +g1163 +sg27 +Vhttp://code.dapps.douban.com/ianoshen_erebor-config/commit/b9949737c5b80067c6671f5ea09a01b94b656d8f +p1424 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +Vianoshen@douban.com +p1425 +sg37 +Vianoshen_erebor-config +p1426 +sa(dp1427 +g90 +g359 +sg43 +Vpullrequest-erebor-config-351-unmerge +p1428 +sg93 +g1163 +sg95 +g1363 +sg97 +g1364 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b05\x0bu\x0f' +p1429 +tp1430 +Rp1431 +sg101 +g102 +sg103 +g1368 +sg27 +g1369 +sg106 +g1163 +sg29 +g107 +sa(dp1432 +g6 +g7 +(S'\x07\xdc\x0c\x19\x0b0.\x03\x87\xab' +p1433 +tp1434 +Rp1435 +sg43 +Vnewcodereview-code-588-453 +p1436 +sg25 +g309 +sg27 +V/code/newpull/588#comment-453 +p1437 +sg47 +V\u8868\u4e5f\u6539\u597d\u4e86? lgtm @qingfeng \u000a \u000a@huanghuang \u6ca1\u660e\u767d\u4e0a\u9762\u8bf4\u7684Github\u91cc\u53ef\u4ee5\u76f4\u63a5\u8bc4\u8bba\u662f\u4ec0\u4e48\u610f\u601d \u662fdiscussion\u9875\u53ef\u4ee5\u76f4\u63a5\u56de\u590d\u5728diff\u9875\u91cc\u9762\u7684\u8bc4\u8bba\u4e48 +p1438 +sg49 +L588L +sg50 +g51 +sg29 +g52 +sg53 +g54 +sa(dp1439 +g2 +V2ad53b5239ed14cdd470568e10f750b423909bc5 +p1440 +sg4 +g1413 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b/-\x00\x00\x00' +p1441 +g9 +(g10 +g11 +g11 +(tRp1442 +tp1443 +Rp1444 +(dp1445 +g16 +g17 +(I0 +I28800 +I0 +tp1446 +Rp1447 +sg20 +Nsbtp1448 +Rp1449 +sg23 +g1368 +sg25 +g1163 +sg27 +Vhttp://code.dapps.douban.com/ianoshen_erebor-config/commit/2ad53b5239ed14cdd470568e10f750b423909bc5 +p1450 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g1425 +sg37 +g1426 +sa(dp1451 +g2 +Vc70801a00eabf57baa08b4ede44f682156a50d5f +p1452 +sg4 +Vhttp://code.dapps.douban.com/authority +p1453 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b/ \x00\x00\x00' +p1454 +g9 +(g10 +g11 +g11 +(tRp1455 +tp1456 +Rp1457 +(dp1458 +g16 +g17 +(I0 +I28800 +I0 +tp1459 +Rp1460 +sg20 +Nsbtp1461 +Rp1462 +sg23 +VMerge branch 'master' of http://code.dapps.douban.com/authority +p1463 +sg25 +Vjinchao +p1464 +sg27 +Vhttp://code.dapps.douban.com/authority/commit/c70801a00eabf57baa08b4ede44f682156a50d5f +p1465 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +Vjinchao@douban.com +p1466 +sg37 +Vauthority +p1467 +sa(dp1468 +g6 +g7 +(S'\x07\xdc\x0c\x19\x0b--\x0c\x7f\x8e' +p1469 +tp1470 +Rp1471 +sg43 +Vnewcodereview-code-598-200 +p1472 +sg25 +g309 +sg27 +V/code/newpull/598#review-200 +p1473 +sg47 +Vurl\u91cc\u7684product\u8981\u4e00\u8d77\u53d8\u4e48? +p1474 +sg49 +L598L +sg50 +g94 +sg29 +g52 +sg53 +g54 +sa(dp1475 +g2 +V067b1819371e5d8567a953ba930c90b1efab3137 +p1476 +sg4 +g1292 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b,\x1b\x00\x00\x00' +p1477 +g9 +(g10 +g11 +g11 +(tRp1478 +tp1479 +Rp1480 +(dp1481 +g16 +g17 +(I0 +I28800 +I0 +tp1482 +Rp1483 +sg20 +Nsbtp1484 +Rp1485 +sg23 +Vmodify project field summary to varchar(255) +p1486 +sg25 +g51 +sg27 +Vhttp://code.dapps.douban.com/code_xueming/commit/067b1819371e5d8567a953ba930c90b1efab3137 +p1487 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g1304 +sg37 +g1305 +sa(dp1488 +g6 +g7 +(S'\x07\xdc\x0c\x19\x0b)9\x01\x0b)' +p1489 +tp1490 +Rp1491 +sg43 +Vnewcodereview-code-598-452 +p1492 +sg25 +g542 +sg27 +V/code/newpull/598#comment-452 +p1493 +sg47 +V@xingben pls, review +p1494 +sg49 +L598L +sg50 +g94 +sg29 +g52 +sg53 +g54 +sa(dp1495 +g90 +g359 +sg43 +Vpullrequest-moria_torpedoallen-350-unmerge +p1496 +sg93 +g878 +sg95 +g879 +sg97 +g880 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b)$\x076\xde' +p1497 +tp1498 +Rp1499 +sg101 +Vhi \u4e3b\u5e2d, \u000a \u000a\u521a\u521a\u5c06\u6d3b\u8dc3\u7528\u6237\u6570\u7684\u811a\u672c\u8f6c\u4e3a\u4e86Dpark\u6765\u5b9e\u73b0\uff0c\u540c\u65f6\u53d1\u73b0\u539f\u5148\u88c5\u8f7d\u5230\u6570\u636e\u5e93\u7684\u811a\u672c\u5199\u5f97\u8fc7\u4e8e\u590d\u6742\uff0c\u987a\u4fbf\u5199\u4e86\u4e00\u4e2a\u7b80\u5355\u7684\u7248\u672c\u3002please review ^_^ +p1500 +sg103 +g885 +sg27 +g886 +sg106 +g887 +sg29 +g107 +sa(dp1501 +g2 +V0e7124305185cd35c95db76e872d6931ffa4a794 +p1502 +sg4 +Vhttp://code.dapps.douban.com/code_qingfeng +p1503 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b)\x06\x00\x00\x00' +p1504 +g9 +(g10 +g11 +g11 +(tRp1505 +tp1506 +Rp1507 +(dp1508 +g16 +g17 +(I0 +I28800 +I0 +tp1509 +Rp1510 +sg20 +Nsbtp1511 +Rp1512 +sg23 +VMerge branch 'master' into organization_to_oz +p1513 +sg25 +g94 +sg27 +Vhttp://code.dapps.douban.com/code_qingfeng/commit/0e7124305185cd35c95db76e872d6931ffa4a794 +p1514 +sg33 +Vrefs/heads/organization_to_oz +p1515 +sg31 +Vorganization_to_oz +p1516 +sg29 +g30 +sg35 +g122 +sg37 +Vcode_qingfeng +p1517 +sa(dp1518 +g2 +Vf1ba66b08de41f3dad7c150598bbcf074ba43364 +p1519 +sg4 +g1453 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b(\x1d\x00\x00\x00' +p1520 +g9 +(g10 +g11 +g11 +(tRp1521 +tp1522 +Rp1523 +(dp1524 +g16 +g17 +(I0 +I28800 +I0 +tp1525 +Rp1526 +sg20 +Nsbtp1527 +Rp1528 +sg23 +Vfix +p1529 +sg25 +g1464 +sg27 +Vhttp://code.dapps.douban.com/authority/commit/f1ba66b08de41f3dad7c150598bbcf074ba43364 +p1530 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g1466 +sg37 +g1467 +sa(dp1531 +g2 +Vdb1dff0707ca066bcd4ce7ab57c4b7a589abf1a9 +p1532 +sg4 +Vhttp://code.dapps.douban.com/pbin +p1533 +sg6 +g7 +(S"\x07\xdc\x0c\x19\x0b'\x19\x00\x00\x00" +p1534 +g9 +(g10 +g11 +g11 +(tRp1535 +tp1536 +Rp1537 +(dp1538 +g16 +g17 +(I0 +I28800 +I0 +tp1539 +Rp1540 +sg20 +Nsbtp1541 +Rp1542 +sg23 +g222 +sg25 +Vjesseyang +p1543 +sg27 +Vhttp://code.dapps.douban.com/pbin/commit/db1dff0707ca066bcd4ce7ab57c4b7a589abf1a9 +p1544 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +Vjesseyang@douban.com +p1545 +sg37 +Vpbin +p1546 +sa(dp1547 +g2 +V73bd4bf5df1a30277f55873a4084eb9e1f560be6 +p1548 +sg4 +g1533 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b%)\x00\x00\x00' +p1549 +g9 +(g10 +g11 +g11 +(tRp1550 +tp1551 +Rp1552 +(dp1553 +g16 +g17 +(I0 +I28800 +I0 +tp1554 +Rp1555 +sg20 +Nsbtp1556 +Rp1557 +sg23 +Vmarkdown syntax +p1558 +sg25 +g1543 +sg27 +Vhttp://code.dapps.douban.com/pbin/commit/73bd4bf5df1a30277f55873a4084eb9e1f560be6 +p1559 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g1545 +sg37 +g1546 +sa(dp1560 +g2 +V01b8d72de24b32fd9e84b19b240e74f09fa890cd +p1561 +sg4 +g1533 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b%)\x00\x00\x00' +p1562 +g9 +(g10 +g11 +g11 +(tRp1563 +tp1564 +Rp1565 +(dp1566 +g16 +g17 +(I0 +I28800 +I0 +tp1567 +Rp1568 +sg20 +Nsbtp1569 +Rp1570 +sg23 +g1558 +sg25 +g1543 +sg27 +Vhttp://code.dapps.douban.com/pbin/commit/01b8d72de24b32fd9e84b19b240e74f09fa890cd +p1571 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g1545 +sg37 +g1546 +sa(dp1572 +g2 +V308eff84acf69c7a3724b103423b6980d02b84b3 +p1573 +sg4 +Vhttp://code.dapps.douban.com/bard +p1574 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b%\x1f\x00\x00\x00' +p1575 +g9 +(g10 +g11 +g11 +(tRp1576 +tp1577 +Rp1578 +(dp1579 +g16 +g17 +(I0 +I28800 +I0 +tp1580 +Rp1581 +sg20 +Nsbtp1582 +Rp1583 +sg23 +Vuse git diff to track file changes +p1584 +sg25 +g1076 +sg27 +Vhttp://code.dapps.douban.com/bard/commit/308eff84acf69c7a3724b103423b6980d02b84b3 +p1585 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g1093 +sg37 +Vbard +p1586 +sa(dp1587 +g2 +Vdc24128413cd274712dfa2d3b30fe944bb3f1e07 +p1588 +sg4 +Vhttp://code.dapps.douban.com/wangfei~erebor-config +p1589 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b%\x02\x00\x00\x00' +p1590 +g9 +(g10 +g11 +g11 +(tRp1591 +tp1592 +Rp1593 +(dp1594 +g16 +g17 +(I0 +I28800 +I0 +tp1595 +Rp1596 +sg20 +Nsbtp1597 +Rp1598 +sg23 +V1 +p1599 +sg25 +g1076 +sg27 +Vhttp://code.dapps.douban.com/wangfei~erebor-config/commit/dc24128413cd274712dfa2d3b30fe944bb3f1e07 +p1600 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g1093 +sg37 +Vwangfei~erebor-config +p1601 +sa(dp1602 +g2 +Vd6fb9a758538179c84f764d674c17d1fb9135d96 +p1603 +sg4 +g1589 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b#1\x00\x00\x00' +p1604 +g9 +(g10 +g11 +g11 +(tRp1605 +tp1606 +Rp1607 +(dp1608 +g16 +g17 +(I0 +I28800 +I0 +tp1609 +Rp1610 +sg20 +Nsbtp1611 +Rp1612 +sg23 +g1599 +sg25 +g1076 +sg27 +Vhttp://code.dapps.douban.com/wangfei~erebor-config/commit/d6fb9a758538179c84f764d674c17d1fb9135d96 +p1613 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g1093 +sg37 +g1601 +sa(dp1614 +g2 +V9c273bae623d06af61241c9e3a78274c2f06a28f +p1615 +sg4 +g1533 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b#\x1d\x00\x00\x00' +p1616 +g9 +(g10 +g11 +g11 +(tRp1617 +tp1618 +Rp1619 +(dp1620 +g16 +g17 +(I0 +I28800 +I0 +tp1621 +Rp1622 +sg20 +Nsbtp1623 +Rp1624 +sg23 +Vadd doc +p1625 +sg25 +g1543 +sg27 +Vhttp://code.dapps.douban.com/pbin/commit/9c273bae623d06af61241c9e3a78274c2f06a28f +p1626 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g1545 +sg37 +g1546 +sa(dp1627 +g2 +V9319ace01325b0f9a26d08d4da006392aa4538f8 +p1628 +sg4 +g1589 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b"(\x00\x00\x00' +p1629 +g9 +(g10 +g11 +g11 +(tRp1630 +tp1631 +Rp1632 +(dp1633 +g16 +g17 +(I0 +I28800 +I0 +tp1634 +Rp1635 +sg20 +Nsbtp1636 +Rp1637 +sg23 +g1599 +sg25 +g1076 +sg27 +Vhttp://code.dapps.douban.com/wangfei~erebor-config/commit/9319ace01325b0f9a26d08d4da006392aa4538f8 +p1638 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g1093 +sg37 +g1601 +sa(dp1639 +g2 +V311ea1dd38af0418b3a9e0b4bfb10ae0d3319eaa +p1640 +sg4 +g1589 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b"\x17\x00\x00\x00' +p1641 +g9 +(g10 +g11 +g11 +(tRp1642 +tp1643 +Rp1644 +(dp1645 +g16 +g17 +(I0 +I28800 +I0 +tp1646 +Rp1647 +sg20 +Nsbtp1648 +Rp1649 +sg23 +g1599 +sg25 +g1076 +sg27 +Vhttp://code.dapps.douban.com/wangfei~erebor-config/commit/311ea1dd38af0418b3a9e0b4bfb10ae0d3319eaa +p1650 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g1093 +sg37 +g1601 +sa(dp1651 +g2 +V6672ef66bf28784fe33ca54cce068c83c2a5b222 +p1652 +sg4 +g1533 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b!+\x00\x00\x00' +p1653 +g9 +(g10 +g11 +g11 +(tRp1654 +tp1655 +Rp1656 +(dp1657 +g16 +g17 +(I0 +I28800 +I0 +tp1658 +Rp1659 +sg20 +Nsbtp1660 +Rp1661 +sg23 +g1288 +sg25 +g1543 +sg27 +Vhttp://code.dapps.douban.com/pbin/commit/6672ef66bf28784fe33ca54cce068c83c2a5b222 +p1662 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g1545 +sg37 +g1546 +sa(dp1663 +g2 +V312ec7771084d27c62fec7a3cdf931af9822853a +p1664 +sg4 +g1589 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b!%\x00\x00\x00' +p1665 +g9 +(g10 +g11 +g11 +(tRp1666 +tp1667 +Rp1668 +(dp1669 +g16 +g17 +(I0 +I28800 +I0 +tp1670 +Rp1671 +sg20 +Nsbtp1672 +Rp1673 +sg23 +g1599 +sg25 +g1076 +sg27 +Vhttp://code.dapps.douban.com/wangfei~erebor-config/commit/312ec7771084d27c62fec7a3cdf931af9822853a +p1674 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g1093 +sg37 +g1601 +sa(dp1675 +g2 +Vba08017f6d470660013d3a6fe00f7fc42a614a81 +p1676 +sg4 +g74 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b\x1c6\x00\x00\x00' +p1677 +g9 +(g10 +g11 +g11 +(tRp1678 +tp1679 +Rp1680 +(dp1681 +g16 +g17 +(I0 +I28800 +I0 +tp1682 +Rp1683 +sg20 +Nsbtp1684 +Rp1685 +sg23 +Vchecksum mc check +p1686 +sg25 +g85 +sg27 +Vhttp://code.dapps.douban.com/blackpit/commit/ba08017f6d470660013d3a6fe00f7fc42a614a81 +p1687 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g87 +sg37 +g88 +sa(dp1688 +g2 +Vdeafd7052d3dd167623f6f6e58e58787fc7f63e1 +p1689 +sg4 +Vhttp://code.dapps.douban.com/DoubanMovie--iOS +p1690 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b\x1c1\x00\x00\x00' +p1691 +g9 +(g10 +g11 +g11 +(tRp1692 +tp1693 +Rp1694 +(dp1695 +g16 +g17 +(I0 +I28800 +I0 +tp1696 +Rp1697 +sg20 +Nsbtp1698 +Rp1699 +sg23 +VShow subject photos correctly. +p1700 +sg25 +Vshayan +p1701 +sg27 +Vhttp://code.dapps.douban.com/DoubanMovie--iOS/commit/deafd7052d3dd167623f6f6e58e58787fc7f63e1 +p1702 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +Vshayan@douban.com +p1703 +sg37 +VDoubanMovie--iOS +p1704 +sa(dp1705 +g2 +V15c5495d3ab7ea9c1c5488597a6250d1b94852b5 +p1706 +sg4 +g458 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b\x1b;\x00\x00\x00' +p1707 +g9 +(g10 +g11 +g11 +(tRp1708 +tp1709 +Rp1710 +(dp1711 +g16 +g17 +(I0 +I28800 +I0 +tp1712 +Rp1713 +sg20 +Nsbtp1714 +Rp1715 +sg23 +g468 +sg25 +g316 +sg27 +Vhttp://code.dapps.douban.com/liyouyang-fm-other/commit/15c5495d3ab7ea9c1c5488597a6250d1b94852b5 +p1716 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g339 +sg37 +g470 +sa(dp1717 +g2 +Vf9839d7facdfbc07d8890d42b6fb71118f11fc11 +p1718 +sg4 +g458 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b\x1b"\x00\x00\x00' +p1719 +g9 +(g10 +g11 +g11 +(tRp1720 +tp1721 +Rp1722 +(dp1723 +g16 +g17 +(I0 +I28800 +I0 +tp1724 +Rp1725 +sg20 +Nsbtp1726 +Rp1727 +sg23 +Vadd tags support to switch +p1728 +sg25 +g316 +sg27 +Vhttp://code.dapps.douban.com/liyouyang-fm-other/commit/f9839d7facdfbc07d8890d42b6fb71118f11fc11 +p1729 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g339 +sg37 +g470 +sa(dp1730 +g2 +Vbde3ef654d70f860ea3fd1ae647213258ddc526d +p1731 +sg4 +Vhttp://code.dapps.douban.com/liukang~fm +p1732 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b\x1b\x1a\x00\x00\x00' +p1733 +g9 +(g10 +g11 +g11 +(tRp1734 +tp1735 +Rp1736 +(dp1737 +g16 +g17 +(I0 +I28800 +I0 +tp1738 +Rp1739 +sg20 +Nsbtp1740 +Rp1741 +sg23 +VMerge branch 'master' into refactor_script +p1742 +sg25 +g452 +sg27 +Vhttp://code.dapps.douban.com/liukang~fm/commit/bde3ef654d70f860ea3fd1ae647213258ddc526d +p1743 +sg29 +g30 +sg31 +Vrefactor_script +p1744 +sg33 +Vrefs/heads/refactor_script +p1745 +sg35 +g454 +sg37 +Vliukang~fm +p1746 +sa(dp1747 +g6 +g7 +(S'\x07\xdc\x0c\x19\x0b\x0e7\x00\x00\x00' +p1748 +tp1749 +Rp1750 +sg43 +S'commit-comment-736' +p1751 +sg25 +Vliaofeng +p1752 +sg27 +V/shire_git_RO/commit/1e1112f309874d0c171af87fed34cb4bbe7b85d0 +p1753 +sg29 +g256 +sg23 +V\u597d\u5427\uff0c\u539f\u6765\u90a3\u5f20\u5927\u56fe\u662f\u56de\u590d\u7684\uff0c\u88ab\u8ff7\u60d1\u4e86:bomb: +p1754 +sg33 +V1e1112f309874d0c171af87fed34cb4bbe7b85d0 +p1755 +sg53 +g259 +sa(dp1756 +g6 +g7 +(S'\x07\xdc\x0c\x19\x0b\x0e4\x00\x00\x00' +p1757 +tp1758 +Rp1759 +sg43 +S'commit-comment-734' +p1760 +sg25 +g1752 +sg27 +g1753 +sg33 +g1755 +sg23 +g1754 +sg29 +g256 +sg53 +g259 +sa(dp1761 +g90 +g91 +sg43 +Vpullrequest-erebor-config-4-merged +p1762 +sg93 +g1163 +sg95 +g1363 +sg97 +g1364 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b\x0e\x17\x05\x14\xbc' +p1763 +tp1764 +Rp1765 +sg101 +g102 +sg103 +Vtest push +p1766 +sg27 +V/erebor-config/newpull/4 +p1767 +sg106 +g1163 +sg29 +g107 +sa(dp1768 +g2 +V690b6e11ba704fb499631367a76e5d409a80576f +p1769 +sg4 +g1372 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b\x0e\x15\x00\x00\x00' +p1770 +g9 +(g10 +g11 +g11 +(tRp1771 +tp1772 +Rp1773 +(dp1774 +g16 +g17 +(I0 +I28800 +I0 +tp1775 +Rp1776 +sg20 +Nsbtp1777 +Rp1778 +sg23 +VMerge pull request #4 from ianoshen_erebor-config:master\u000a \u000a test push +p1779 +sg25 +g1163 +sg27 +Vhttp://code.dapps.douban.com/erebor-config/commit/690b6e11ba704fb499631367a76e5d409a80576f +p1780 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g1425 +sg37 +g1384 +sa(dp1781 +g2 +V32c4244c3db25ee07dbf78003d5056afa60cdfea +p1782 +sg4 +Vhttp://code.dapps.douban.com/brood +p1783 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b\x0e\x06\x00\x00\x00' +p1784 +g9 +(g10 +g11 +g11 +(tRp1785 +tp1786 +Rp1787 +(dp1788 +g16 +g17 +(I0 +I28800 +I0 +tp1789 +Rp1790 +sg20 +Nsbtp1791 +Rp1792 +sg23 +Vsync leftside navbar with basilisk +p1793 +sg25 +g631 +sg27 +Vhttp://code.dapps.douban.com/brood/commit/32c4244c3db25ee07dbf78003d5056afa60cdfea +p1794 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g633 +sg37 +Vbrood +p1795 +sa(dp1796 +g6 +g7 +(S'\x07\xdc\x0c\x19\x0b\r#\x00\x00\x00' +p1797 +tp1798 +Rp1799 +sg43 +S'commit-comment-731' +p1800 +sg25 +g1752 +sg27 +g1753 +sg33 +g1755 +sg23 +V\u54a6\uff0c\u600e\u4e48\u663e\u793a\u6211\u6709\u4e2a\u63d0\u9192\u4f46\u8fc7\u6765\u5374\u6ca1\u770b\u5230\u5462\u3002\u3002\u96be\u9053code\u6709\u4f60\u56de\u590d\u8fc7\u7684repo\u6709\u6700\u65b0\u56de\u590d\u7684\u63d0\u9192\u4e86\uff1f +p1801 +sg29 +g256 +sg53 +g259 +sa(dp1802 +g2 +Vd2ad1810d54837a6361b141a781f87334f275ce9 +p1803 +sg4 +g1413 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b\r\x00\x00\x00\x00' +p1804 +g9 +(g10 +g11 +g11 +(tRp1805 +tp1806 +Rp1807 +(dp1808 +g16 +g17 +(I0 +I28800 +I0 +tp1809 +Rp1810 +sg20 +Nsbtp1811 +Rp1812 +sg23 +g1423 +sg25 +g1163 +sg27 +Vhttp://code.dapps.douban.com/ianoshen_erebor-config/commit/d2ad1810d54837a6361b141a781f87334f275ce9 +p1813 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g1425 +sg37 +g1426 +sa(dp1814 +g6 +g7 +(S'\x07\xdc\x0c\x19\x0b\x0c:\x08W\x95' +p1815 +tp1816 +Rp1817 +sg43 +Vnewcodereview-erebor-config-4-199 +p1818 +sg25 +g952 +sg27 +V/erebor-config/newpull/4#review-199 +p1819 +sg47 +V\u4e3a\u4ec0\u4e48\u6709erebor-dev\u7684link +p1820 +sg49 +L4L +sg50 +g1163 +sg29 +g52 +sg53 +g1364 +sa(dp1821 +g2 +V22db4d90d33c388ac46f1a25afd1855718b9b92a +p1822 +sg4 +Vhttp://code.dapps.douban.com/basilisk +p1823 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b\x0c4\x00\x00\x00' +p1824 +g9 +(g10 +g11 +g11 +(tRp1825 +tp1826 +Rp1827 +(dp1828 +g16 +g17 +(I0 +I28800 +I0 +tp1829 +Rp1830 +sg20 +Nsbtp1831 +Rp1832 +sg23 +Vsync leftside navbar with brood +p1833 +sg25 +g631 +sg27 +Vhttp://code.dapps.douban.com/basilisk/commit/22db4d90d33c388ac46f1a25afd1855718b9b92a +p1834 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g633 +sg37 +Vbasilisk +p1835 +sa(dp1836 +g2 +V589825af6ea78eb0e46db1170ff39710f583ef04 +p1837 +sg4 +Vhttp://code.dapps.douban.com/undermine +p1838 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b\x0c\x1d\x00\x00\x00' +p1839 +g9 +(g10 +g11 +g11 +(tRp1840 +tp1841 +Rp1842 +(dp1843 +g16 +g17 +(I0 +I28800 +I0 +tp1844 +Rp1845 +sg20 +Nsbtp1846 +Rp1847 +sg23 +VMerge branch 'master' of http://code.dapps.douban.com/undermine +p1848 +sg25 +g727 +sg27 +Vhttp://code.dapps.douban.com/undermine/commit/589825af6ea78eb0e46db1170ff39710f583ef04 +p1849 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g729 +sg37 +Vundermine +p1850 +sa(dp1851 +g2 +Vc593dc31eb29bca4d103120c997083bd7f85e78b +p1852 +sg4 +g1838 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b\x0c\x16\x00\x00\x00' +p1853 +g9 +(g10 +g11 +g11 +(tRp1854 +tp1855 +Rp1856 +(dp1857 +g16 +g17 +(I0 +I28800 +I0 +tp1858 +Rp1859 +sg20 +Nsbtp1860 +Rp1861 +sg23 +V\u9002\u5e94mario\u91cd\u6784 +p1862 +sg25 +g727 +sg27 +Vhttp://code.dapps.douban.com/undermine/commit/c593dc31eb29bca4d103120c997083bd7f85e78b +p1863 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g729 +sg37 +g1850 +sa(dp1864 +g90 +g359 +sg43 +Vpullrequest-erebor-config-349-unmerge +p1865 +sg93 +g1163 +sg95 +g1363 +sg97 +g1364 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b\x0c\x07\n\xb8e' +p1866 +tp1867 +Rp1868 +sg101 +g102 +sg103 +g1766 +sg27 +g1767 +sg106 +g1163 +sg29 +g107 +sa(dp1869 +g6 +g7 +(S'\x07\xdc\x0c\x19\x0b\x0b:\x00\x00\x00' +p1870 +tp1871 +Rp1872 +sg43 +S'commit-comment-730' +p1873 +sg25 +g667 +sg27 +g1753 +sg33 +g1755 +sg23 +V![image](http://pastebin.dapps.douban.com/image/06 +p1874 +sg29 +g256 +sg53 +g259 +sa(dp1875 +g2 +V60c6388212f1577f7797e294220929a1ea69b2fb +p1876 +sg4 +g1503 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b\n9\x00\x00\x00' +p1877 +g9 +(g10 +g11 +g11 +(tRp1878 +tp1879 +Rp1880 +(dp1881 +g16 +g17 +(I0 +I28800 +I0 +tp1882 +Rp1883 +sg20 +Nsbtp1884 +Rp1885 +sg23 +V\u5220\u9664\u591a\u4f59\u7684js\u5f15\u7528. product.html -> organization.html +p1886 +sg25 +g94 +sg27 +Vhttp://code.dapps.douban.com/code_qingfeng/commit/60c6388212f1577f7797e294220929a1ea69b2fb +p1887 +sg33 +g1515 +sg31 +g1516 +sg29 +g30 +sg35 +g122 +sg37 +g1517 +sa(dp1888 +g2 +V4a08f1584d337096a913c12bb3154bf0ec1f3cd6 +p1889 +sg4 +g1413 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b\n\x13\x00\x00\x00' +p1890 +g9 +(g10 +g11 +g11 +(tRp1891 +tp1892 +Rp1893 +(dp1894 +g16 +g17 +(I0 +I28800 +I0 +tp1895 +Rp1896 +sg20 +Nsbtp1897 +Rp1898 +sg23 +g1766 +sg25 +g1163 +sg27 +Vhttp://code.dapps.douban.com/ianoshen_erebor-config/commit/4a08f1584d337096a913c12bb3154bf0ec1f3cd6 +p1899 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g1425 +sg37 +g1426 +sa(dp1900 +g2 +V77a07fdfe111ef0404b893ff4baa5c241390cda8 +p1901 +sg4 +Vhttp://code.dapps.douban.com/bridge +p1902 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b\n\x11\x00\x00\x00' +p1903 +g9 +(g10 +g11 +g11 +(tRp1904 +tp1905 +Rp1906 +(dp1907 +g16 +g17 +(I0 +I28800 +I0 +tp1908 +Rp1909 +sg20 +Nsbtp1910 +Rp1911 +sg23 +VAdd get_app_names api to Pool and Node +p1912 +sg25 +g68 +sg27 +Vhttp://code.dapps.douban.com/bridge/commit/77a07fdfe111ef0404b893ff4baa5c241390cda8 +p1913 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g70 +sg37 +Vbridge +p1914 +sa(dp1915 +g6 +g7 +(S'\x07\xdc\x0c\x19\x0b\x06\x07\x0c\xef\x08' +p1916 +tp1917 +Rp1918 +sg43 +Vnewcodereview-code-588-451 +p1919 +sg25 +g309 +sg27 +V/code/newpull/588#comment-451 +p1920 +sg47 +V\u548c @xueming \u786e\u8ba4\u4e86\uff0csummary\u957f\u5ea6\u7684\u4e8b\u60c5\u8981\u53e6\u5916\u6539\u8868\u7ed3\u6784\u6765\u89e3\u51b3\u3002\u8fd9\u91cc\u7684\u524d\u7aef\u91cd\u6784lgtm\u4e86 +p1921 +sg49 +L588L +sg50 +g51 +sg29 +g52 +sg53 +g54 +sa(dp1922 +g2 +Vcebd2f5f56097d1c7f02a8fbabdcef6e7f043763 +p1923 +sg4 +Vhttp://code.dapps.douban.com/biscuit +p1924 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b\x049\x00\x00\x00' +p1925 +g9 +(g10 +g11 +g11 +(tRp1926 +tp1927 +Rp1928 +(dp1929 +g16 +g17 +(I0 +I28800 +I0 +tp1930 +Rp1931 +sg20 +Nsbtp1932 +Rp1933 +sg23 +Vadd release manager +p1934 +sg25 +Vhuanghuang +p1935 +sg27 +Vhttp://code.dapps.douban.com/biscuit/commit/cebd2f5f56097d1c7f02a8fbabdcef6e7f043763 +p1936 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +Vhuanghuang@douban.com +p1937 +sg37 +Vbiscuit +p1938 +sa(dp1939 +g2 +V30da349b39e934cfce8302e285c50d3acba0bcc1 +p1940 +sg4 +g1823 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b\x04+\x00\x00\x00' +p1941 +g9 +(g10 +g11 +g11 +(tRp1942 +tp1943 +Rp1944 +(dp1945 +g16 +g17 +(I0 +I28800 +I0 +tp1946 +Rp1947 +sg20 +Nsbtp1948 +Rp1949 +sg23 +Vsync leftside navbar +p1950 +sg25 +g631 +sg27 +Vhttp://code.dapps.douban.com/basilisk/commit/30da349b39e934cfce8302e285c50d3acba0bcc1 +p1951 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g633 +sg37 +g1835 +sa(dp1952 +g2 +V9282b439c84c1c6a90cce28fec34cf7dde247b79 +p1953 +sg4 +g1924 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b\x03)\x00\x00\x00' +p1954 +g9 +(g10 +g11 +g11 +(tRp1955 +tp1956 +Rp1957 +(dp1958 +g16 +g17 +(I0 +I28800 +I0 +tp1959 +Rp1960 +sg20 +Nsbtp1961 +Rp1962 +sg23 +V\u5c1d\u8bd5\u8c03\u4e0b\uff0c\u5b9d\u4eae\u5bfc\u51fa +p1963 +sg25 +g1935 +sg27 +Vhttp://code.dapps.douban.com/biscuit/commit/9282b439c84c1c6a90cce28fec34cf7dde247b79 +p1964 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g1937 +sg37 +g1938 +sa(dp1965 +g2 +V19a6699982abd4387f78e5eb3456380e9bd64af9 +p1966 +sg4 +Vhttp://code.dapps.douban.com/alabasta +p1967 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b\x02\x10\x00\x00\x00' +p1968 +g9 +(g10 +g11 +g11 +(tRp1969 +tp1970 +Rp1971 +(dp1972 +g16 +g17 +(I0 +I28800 +I0 +tp1973 +Rp1974 +sg20 +Nsbtp1975 +Rp1976 +sg23 +Vlog test again +p1977 +sg25 +g452 +sg27 +Vhttp://code.dapps.douban.com/alabasta/commit/19a6699982abd4387f78e5eb3456380e9bd64af9 +p1978 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g454 +sg37 +Valabasta +p1979 +sa(dp1980 +g6 +g7 +(S'\x07\xdc\x0c\x19\x0b\x016\x0b\xa2\xe1' +p1981 +tp1982 +Rp1983 +sg43 +Vnewcodereview-smaug-1-450 +p1984 +sg25 +g542 +sg27 +V/smaug/newpull/1#comment-450 +p1985 +sg47 +V@jollychang \u5b66\u4e60\u4e86! \u6211\u4ee5\u4e3a\u5c31\u662f\u4e00\u4e2a\u7b11\u8138\u5462! :beer: +p1986 +sg49 +L1L +sg50 +g667 +sg29 +g52 +sg53 +g1075 +sa(dp1987 +g6 +g7 +(S'\x07\xdc\x0c\x19\x0b\x01\x00\x0b\xa4A' +p1988 +tp1989 +Rp1990 +sg43 +Vnewcodereview-code-598-198 +p1991 +sg25 +g542 +sg27 +V/code/newpull/598#review-198 +p1992 +sg47 +V\u590d\u5236\u7c98\u8d34\u5bb3\u6b7b\u4eba\u963f! \u611f\u8c22review! \u000a\u6069, ,\u6a21\u677f\u540d\u5b57\u786e\u5b9e\u662f\u4e2a\u9057\u7559\u95ee\u9898, \u6211mv\u4e00\u4e0b\u5427 +p1993 +sg49 +L598L +sg50 +g94 +sg29 +g52 +sg53 +g54 +sa(dp1994 +g2 +Vf28c9f0da316c9f869589619e5ba247a7f91fb33 +p1995 +sg4 +g603 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x0b\x00\x01\x00\x00\x00' +p1996 +g9 +(g10 +g11 +g11 +(tRp1997 +tp1998 +Rp1999 +(dp2000 +g16 +g17 +(I0 +I28800 +I0 +tp2001 +Rp2002 +sg20 +Nsbtp2003 +Rp2004 +sg23 +Vadded huangkejun +p2005 +sg25 +g614 +sg27 +Vhttp://code.dapps.douban.com/ideas/commit/f28c9f0da316c9f869589619e5ba247a7f91fb33 +p2006 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g616 +sg37 +g617 +sa(dp2007 +g2 +V36989f80d96a42872cbf1693113a65972fc9def8 +p2008 +sg4 +g1589 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n;&\x00\x00\x00' +p2009 +g9 +(g10 +g11 +g11 +(tRp2010 +tp2011 +Rp2012 +(dp2013 +g16 +g17 +(I0 +I28800 +I0 +tp2014 +Rp2015 +sg20 +Nsbtp2016 +Rp2017 +sg23 +g1599 +sg25 +g1076 +sg27 +Vhttp://code.dapps.douban.com/wangfei~erebor-config/commit/36989f80d96a42872cbf1693113a65972fc9def8 +p2018 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g1093 +sg37 +g1601 +sa(dp2019 +g2 +Vbb334ac6a2f16e39eabbc5d4508c690209a90417 +p2020 +sg4 +g1292 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n;!\x00\x00\x00' +p2021 +g9 +(g10 +g11 +g11 +(tRp2022 +tp2023 +Rp2024 +(dp2025 +g16 +g17 +(I0 +I28800 +I0 +tp2026 +Rp2027 +sg20 +Nsbtp2028 +Rp2029 +sg23 +Vreset to head version +p2030 +sg25 +g51 +sg27 +Vhttp://code.dapps.douban.com/code_xueming/commit/bb334ac6a2f16e39eabbc5d4508c690209a90417 +p2031 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g1304 +sg37 +g1305 +sa(dp2032 +g6 +g7 +(S'\x07\xdc\x0c\x19\n:\x1e\x0e\x91\\' +p2033 +tp2034 +Rp2035 +sg43 +Vnewcodereview-code-598-197 +p2036 +sg25 +g309 +sg27 +V/code/newpull/598#review-197 +p2037 +sg47 +Vproduct\u8fd9\u91cc\u5e94\u8be5\u662f\u4ea7\u54c1\u7ebf\u9875\u9762\u5427\uff0c\u6211\u770b\u4e86\u4e0b\u548cpeople\u9875\u9762\u7528\u5230\u7684\u4e24\u4e2a\u7ec4\u4ef6 'mod/badge_info', 'mod/praise' \u5e76\u6ca1\u6709\u4ea4\u96c6\uff1f \u6240\u4ee5\u8fd9\u91cc\u5efa\u8bae\u5c31\u4e0d\u5f15\u5165people/main.js \u6216\u8005\u5efa\u4e00\u4e2a\u65b0\u7684 app/product/main.js \u5427\uff0c\u8fd9\u6837\u672a\u6765\u8fd9\u4e2a\u9875\u9762\u5f15\u5165\u81ea\u5df1\u7684\u7ec4\u5efa\u4e5f\u6709\u5730\u65b9\u53ef\u4ee5\u653e\u3002\uff08\u6bd4\u5982\u6211\u5df2\u7ecf\u89c9\u5f97\u5982\u679ccommit graph\u524d\u7aef\u5316\u505a\u597d\u4e86\u5c31\u53ef\u4ee5\u653e\u5728\u8fd9\u4e2a\u9875\u9762\u91cc\u7684) \u000a \u000a\u53e6\u5916\u5410\u69fd\u4e0bproduct\u8fd9\u4e2a\u540d\u79f0\uff0c\u6211\u89c9\u5f97\u53eborganization\u66f4\u597d\uff0c\u53ebproduct\u4e0d\u591f\u6e05\u6670 +p2038 +sg49 +L598L +sg50 +g94 +sg29 +g52 +sg53 +g54 +sa(dp2039 +g2 +Vf335eef014de7f14b81befe6caf269d15ca984da +p2040 +sg4 +g1292 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n89\x00\x00\x00' +p2041 +g9 +(g10 +g11 +g11 +(tRp2042 +tp2043 +Rp2044 +(dp2045 +g16 +g17 +(I0 +I28800 +I0 +tp2046 +Rp2047 +sg20 +Nsbtp2048 +Rp2049 +sg23 +VMerge branch 'master' of http://code.dapps.douban.com/code_xueming +p2050 +sg25 +g51 +sg27 +Vhttp://code.dapps.douban.com/code_xueming/commit/f335eef014de7f14b81befe6caf269d15ca984da +p2051 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g1304 +sg37 +g1305 +sa(dp2052 +g6 +g7 +(S'\x07\xdc\x0c\x19\n82\x06\xce\xd1' +p2053 +tp2054 +Rp2055 +sg43 +Vnewcodereview-smaug-1-449 +p2056 +sg25 +g952 +sg27 +V/smaug/newpull/1#comment-449 +p2057 +sg47 +V \u000a>Troll Face \u000a>Trollface\uff0c\u53c8\u88ab\u79f0\u4e3a"Coolface"\u3002 \u000a\u3000\u3000\u6700\u8fd1\u5728\u53f0\u6e7e\u67d0\u4e9b\u8bba\u575b\u770b\u5230\u6709\u4eba\u4f7f\u7528\u8fd9\u4e2a\u8868\u60c5\u7b26\u53f7\u6765\u5f53\u4f5c\u7b11\u8138\uff0c\u8ba9\u6211\u611f\u5230\u76f8\u5f53\u7684\u56f0\u6270\uff0c\u56e0\u4e3a\u8bb8\u591a\u4f7f\u7528\u8005\u53ef\u80fd\u53ea\u5c06\u8fd9\u5f20\u8138\u5f53\u4f5c\u4e00\u5f20\u7325\u7410\u5730\u7b11\u7740\u7684\u8700\u9ecd\u7684\u8138\uff0c\u5374\u5b8c\u5168\u4e0d\u77e5\u9053\u5728\u56fd\u5916\u8fd9\u5f20\u7b11\u8138\u80cc\u540e\u7684\u539f\u59cb\u610f\u4e49\u3002 \u000a \u000a>\u4ee5\u4e0b\u662fKnowYourMeme\u7f51\u7ad9\u9488\u5bf9Trollface\u7684\u8bf4\u660e\u6761\u76ee\uff1a \u000a\u3000\u3000Trollface\u7684\u8d77\u6e90\u6765\u81ea\u4e8e2008/9/19\u4e00\u540d\u5728DeviantArt\u4e0a\u7684\u753b\u5bb6\u9488\u5bf9\u5728\u8bba\u575b\u4e0aTrolling(\u95f9\u677f)\u7684\u95f9\u677f\u884c\u4e3a\u7528\u5c0f\u753b\u5bb6\u6240\u5236\u4f5c\u7684\u77ed\u7bc7\u6f2b\u753b\uff0c\u5176\u5185\u5bb9\u5982\u4e0b\uff1a \u000a\u3000\u3000\u8fd9\u7bc7\u6f2b\u753b\u6307\u51fa\uff0c\u95f9\u677f\u8005\u5e0c\u671b\u4f60\u76f8\u4fe1\u5728\u8367\u5e55\u7684\u53e6\u4e00\u7aef\uff0c\u4ed6\u4eec\u975e\u5e38\u9547\u5b9a\uff0c\u5e76\u4e14\u6709\u8ba1\u5212\u7684\u60f3\u8981\u6270\u4e71\u677f\u4e0a\u7684\u79e9\u5e8f\u4ee5\u53ca\u6bcf\u4e00\u4e2a\u4eba\u7684\u5fc3\u60c5\u3002\u4f46\u5b9e\u9645\u4e0a\u5b83\u4eec\u53ea\u662f\u53d1\u75af\u4f3c\u7684\u60f3\u4e3a\u81ea\u5df1\u611a\u8822\u7684\u56de\u5e94\u63a9\u9970\u53ca\u627e\u501f\u53e3\u3002 \u000a\u3000\u3000\u539f\u4f5c\u8005\u5e76\u5ba3\u79f0\u4ed6\u539f\u672c\u5176\u5b9e\u662f\u60f3\u753b\u4e00\u53ea\u540d\u4e3aRape rodent\u7684meme(\u592a\u7a7a\u98de\u9f20\u7684\u53d8\u5f62\u3002) \u000a \u000a<http://baike.baidu.com/view/7383545.htm> +p2058 +sg49 +L1L +sg50 +g667 +sg29 +g52 +sg53 +g1075 +sa(dp2059 +g2 +V2e90bc15f67d7a67a21f3e5667dc9cd4241ce7c6 +p2060 +sg4 +g1292 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n8"\x00\x00\x00' +p2061 +g9 +(g10 +g11 +g11 +(tRp2062 +tp2063 +Rp2064 +(dp2065 +g16 +g17 +(I0 +I28800 +I0 +tp2066 +Rp2067 +sg20 +Nsbtp2068 +Rp2069 +sg23 +Vchange project fork and settings page to ozjs +p2070 +sg25 +g51 +sg27 +Vhttp://code.dapps.douban.com/code_xueming/commit/2e90bc15f67d7a67a21f3e5667dc9cd4241ce7c6 +p2071 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g1304 +sg37 +g1305 +sa(dp2072 +g90 +g91 +sg43 +Vpullrequest-code-597-merged +p2073 +sg93 +g94 +sg95 +Vcode_hh:merged_pr +p2074 +sg97 +g54 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n7\x11\x06\x9e\xd1' +p2075 +tp2076 +Rp2077 +sg101 +V\u6b65\u9aa4\uff1a \u000a1.\u53d1PR \u000a2.\u5408\u5e76PR \u000a3.\u5220\u9664\u53d1\u8d77PR\u7684\u9879\u76ee \u000a4.PR\u53ca\u8bc4\u8bba\u80fd\u6b63\u786e\u663e\u793a +p2078 +sg103 +Vrender merged pr without from_proj +p2079 +sg27 +V/code/newpull/597 +p2080 +sg106 +g1935 +sg29 +g107 +sa(dp2081 +g2 +Ve4dc06606c50fdb5dafb3e5ae5472516202abdf0 +p2082 +sg4 +g110 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n7\x0f\x00\x00\x00' +p2083 +g9 +(g10 +g11 +g11 +(tRp2084 +tp2085 +Rp2086 +(dp2087 +g16 +g17 +(I0 +I28800 +I0 +tp2088 +Rp2089 +sg20 +Nsbtp2090 +Rp2091 +sg23 +VMerge pull request #597 from code_hh:merged_pr\u000a \u000a render merged pr without from_proj +p2092 +sg25 +g94 +sg27 +Vhttp://code.dapps.douban.com/code/commit/e4dc06606c50fdb5dafb3e5ae5472516202abdf0 +p2093 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g122 +sg37 +g123 +sa(dp2094 +g6 +g7 +(S'\x07\xdc\x0c\x19\n66\x04\xa5\x92' +p2095 +tp2096 +Rp2097 +sg43 +Vnewcodereview-code-597-448 +p2098 +sg25 +g542 +sg27 +V/code/newpull/597#comment-448 +p2099 +sg47 +V:beer: +p2100 +sg49 +L597L +sg50 +g1935 +sg29 +g52 +sg53 +g54 +sa(dp2101 +g2 +V01d7779e86f2cf89d9e3c80594ca67d6373a2cea +p2102 +sg4 +g1533 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n6\x13\x00\x00\x00' +p2103 +g9 +(g10 +g11 +g11 +(tRp2104 +tp2105 +Rp2106 +(dp2107 +g16 +g17 +(I0 +I28800 +I0 +tp2108 +Rp2109 +sg20 +Nsbtp2110 +Rp2111 +sg23 +Vpbin close update +p2112 +sg25 +g1543 +sg27 +Vhttp://code.dapps.douban.com/pbin/commit/01d7779e86f2cf89d9e3c80594ca67d6373a2cea +p2113 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g1545 +sg37 +g1546 +sa(dp2114 +g2 +Vefe111ee4475b843b4f0a8fd93d5a7da002dfebd +p2115 +sg4 +g1453 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n6\x02\x00\x00\x00' +p2116 +g9 +(g10 +g11 +g11 +(tRp2117 +tp2118 +Rp2119 +(dp2120 +g16 +g17 +(I0 +I28800 +I0 +tp2121 +Rp2122 +sg20 +Nsbtp2123 +Rp2124 +sg23 +Vadd release_manager +p2125 +sg25 +g930 +sg27 +Vhttp://code.dapps.douban.com/authority/commit/efe111ee4475b843b4f0a8fd93d5a7da002dfebd +p2126 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g932 +sg37 +g1467 +sa(dp2127 +g2 +V40fcc4bdd7cde768dc4266e5e81e1b595976c35e +p2128 +sg4 +g1967 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n5+\x00\x00\x00' +p2129 +g9 +(g10 +g11 +g11 +(tRp2130 +tp2131 +Rp2132 +(dp2133 +g16 +g17 +(I0 +I28800 +I0 +tp2134 +Rp2135 +sg20 +Nsbtp2136 +Rp2137 +sg23 +Vfor test +p2138 +sg25 +g452 +sg27 +Vhttp://code.dapps.douban.com/alabasta/commit/40fcc4bdd7cde768dc4266e5e81e1b595976c35e +p2139 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g454 +sg37 +g1979 +sa(dp2140 +g6 +g7 +(S'\x07\xdc\x0c\x19\n5\x1b\x05:B' +p2141 +tp2142 +Rp2143 +sg43 +Vnewcodereview-code-597-447 +p2144 +sg25 +S'huanghuang' +p2145 +sg27 +V/code/newpull/597#comment-447 +p2146 +sg47 +V\u6c42merge +p2147 +sg49 +L597L +sg50 +g1935 +sg29 +g52 +sg53 +g54 +sa(dp2148 +g6 +g7 +(S'\x07\xdc\x0c\x19\n5\x16\t\xf1\xa0' +p2149 +tp2150 +Rp2151 +sg43 +Vnewcodereview-joshua-3-446 +p2152 +sg25 +g1066 +sg27 +V/joshua/newpull/3#comment-446 +p2153 +sg47 +V`public/js/joshua.js` \u548c `static/js/joshua.js` \u600e\u4e48\u8fd8\u6709\u70b9\u4e0d\u4e00\u6837... \u5f04\u4e00\u81f4\u4e86\u5c31\u597d\u4e86\uff0c\u5176\u4ed6\u6211\u8fd9\u6ca1\u95ee\u9898\u4e86\uff0c\u652f\u6301\u628a\u547d\u4ee4\u653e\u5230 Makefile \u91cc\u3002:cocktail: +p2154 +sg49 +L3L +sg50 +g312 +sg29 +g52 +sg53 +g313 +sa(dp2155 +g6 +g7 +(S'\x07\xdc\x0c\x19\n5\x08\x00\x00\x00' +p2156 +tp2157 +Rp2158 +sg43 +S'commit-comment-729' +p2159 +sg25 +g1752 +sg27 +g1753 +sg29 +g256 +sg23 +g2100 +sg33 +g1755 +sg53 +g259 +sa(dp2160 +g6 +g7 +(S'\x07\xdc\x0c\x19\n5\x07\x00\x00\x00' +p2161 +tp2162 +Rp2163 +sg43 +S'commit-comment-728' +p2164 +sg25 +g1752 +sg27 +g1753 +sg33 +g1755 +sg23 +g2100 +sg29 +g256 +sg53 +g259 +sa(dp2165 +g2 +Vc1bd4a52a18ab64562d47d68a4eee2db8e0fa4a0 +p2166 +sg4 +g1533 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n3-\x00\x00\x00' +p2167 +g9 +(g10 +g11 +g11 +(tRp2168 +tp2169 +Rp2170 +(dp2171 +g16 +g17 +(I0 +I28800 +I0 +tp2172 +Rp2173 +sg20 +Nsbtp2174 +Rp2175 +sg23 +Vupdate style +p2176 +sg25 +g1543 +sg27 +Vhttp://code.dapps.douban.com/pbin/commit/c1bd4a52a18ab64562d47d68a4eee2db8e0fa4a0 +p2177 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g1545 +sg37 +g1546 +sa(dp2178 +g2 +V1a87777670c37e7983028646ae14f4692272d3ad +p2179 +sg4 +g126 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n0#\x00\x00\x00' +p2180 +g9 +(g10 +g11 +g11 +(tRp2181 +tp2182 +Rp2183 +(dp2184 +g16 +g17 +(I0 +I28800 +I0 +tp2185 +Rp2186 +sg20 +Nsbtp2187 +Rp2188 +sg23 +Vchange idf algorithm +p2189 +sg25 +g137 +sg27 +Vhttp://code.dapps.douban.com/dimholt/commit/1a87777670c37e7983028646ae14f4692272d3ad +p2190 +sg29 +g30 +sg31 +Vv5.0 +p2191 +sg33 +Vrefs/heads/v5.0 +p2192 +sg35 +g139 +sg37 +g140 +sa(dp2193 +g2 +V6f9bebe80481dbf1942db4f11d5a84beb20e93fb +p2194 +sg4 +g1533 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n/"\x00\x00\x00' +p2195 +g9 +(g10 +g11 +g11 +(tRp2196 +tp2197 +Rp2198 +(dp2199 +g16 +g17 +(I0 +I28800 +I0 +tp2200 +Rp2201 +sg20 +Nsbtp2202 +Rp2203 +sg23 +Vdiv position is related to scrollY +p2204 +sg25 +g1543 +sg27 +Vhttp://code.dapps.douban.com/pbin/commit/6f9bebe80481dbf1942db4f11d5a84beb20e93fb +p2205 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g1545 +sg37 +g1546 +sa(dp2206 +g6 +g7 +(S'\x07\xdc\x0c\x19\n/\x1f\n\xa7,' +p2207 +tp2208 +Rp2209 +sg43 +Vnewcodereview-joshua-3-444 +p2210 +sg25 +g309 +sg27 +V/joshua/newpull/3#comment-444 +p2211 +sg47 +V@cyrildou \u6240\u4ee5\u628a\u9759\u6001\u6253\u5305\u8fd9\u4e2a\u547d\u4ee4\u653e\u5728 Makefile \u91cc\u9762\u5427\uff0c\u672a\u6765\u65b9\u4fbf\u4e00\u4e9b \u000a \u000a@zhangchi \u770b\u770b\u8fd8\u6709\u4ec0\u4e48\u95ee\u9898\u4e48? +p2212 +sg49 +L3L +sg50 +g312 +sg29 +g52 +sg53 +g313 +sa(dp2213 +g6 +g7 +(S'\x07\xdc\x0c\x19\n.\x05\x0e\x8db' +p2214 +tp2215 +Rp2216 +sg43 +Vnewcodereview-code-600-443 +p2217 +sg25 +g1066 +sg27 +V/code/newpull/600#comment-443 +p2218 +sg47 +V:code: \u7b2c600\u4e2a\u4e86\u554a\uff0c\u65b0PR\u4ece\u5dee\u4e0d\u591a500\u5f00\u59cb\u7684 :fire: ! +p2219 +sg49 +L600L +sg50 +Vzhangchi +p2220 +sg29 +g52 +sg53 +g54 +sa(dp2221 +g6 +g7 +(S'\x07\xdc\x0c\x19\n-6\x0b\x89\x80' +p2222 +tp2223 +Rp2224 +sg43 +Vnewcodereview-smaug-1-442 +p2225 +sg25 +g542 +sg27 +V/smaug/newpull/1#comment-442 +p2226 +sg47 +V:trollface: +p2227 +sg49 +L1L +sg50 +g667 +sg29 +g52 +sg53 +g1075 +sa(dp2228 +g6 +g7 +(S'\x07\xdc\x0c\x19\n-\x1c\x05\xf7\x00' +p2229 +tp2230 +Rp2231 +sg43 +Vnewcodereview-smaug-1-441 +p2232 +sg25 +S'ianoshen' +p2233 +sg27 +V/smaug/newpull/1#comment-441 +p2234 +sg47 +V\u54c8\u54c8\u54c8 +p2235 +sg49 +L1L +sg50 +g667 +sg29 +g52 +sg53 +g1075 +sa(dp2236 +g2 +Vff6b5b73f498c8bcf37e8b2953aae05b35d14680 +p2237 +sg4 +Vhttp://code.dapps.douban.com/code_gist +p2238 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n-\x0c\x00\x00\x00' +p2239 +g9 +(g10 +g11 +g11 +(tRp2240 +tp2241 +Rp2242 +(dp2243 +g16 +g17 +(I0 +I28800 +I0 +tp2244 +Rp2245 +sg20 +Nsbtp2246 +Rp2247 +sg23 +VMerge branch 'master' of http://code.dapps.douban.com/code +p2248 +sg25 +g614 +sg27 +Vhttp://code.dapps.douban.com/code_gist/commit/ff6b5b73f498c8bcf37e8b2953aae05b35d14680 +p2249 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +Vi@liluo.org +p2250 +sg37 +Vcode_gist +p2251 +sa(dp2252 +g2 +V5bba56bb0cbb146384656289de4954f66622fcc1 +p2253 +sg4 +g2238 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n,\x07\x00\x00\x00' +p2254 +g9 +(g10 +g11 +g11 +(tRp2255 +tp2256 +Rp2257 +(dp2258 +g16 +g17 +(I0 +I28800 +I0 +tp2259 +Rp2260 +sg20 +Nsbtp2261 +Rp2262 +sg23 +Vmerged +p2263 +sg25 +g614 +sg27 +Vhttp://code.dapps.douban.com/code_gist/commit/5bba56bb0cbb146384656289de4954f66622fcc1 +p2264 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g2250 +sg37 +g2251 +sa(dp2265 +g6 +g7 +(S'\x07\xdc\x0c\x19\n+\x19\x08\xbf\xb8' +p2266 +tp2267 +Rp2268 +sg43 +Vnewcodereview-code-600-440 +p2269 +sg25 +g542 +sg27 +V/code/newpull/600#comment-440 +p2270 +sg47 +V@zhangchi \u53e6\u5916, \u8fd9\u662f\u7b2c600\u4e2aPR! \u53ef\u559c\u53ef\u8d3a! :beer: :code: +p2271 +sg49 +L600L +sg50 +g2220 +sg29 +g52 +sg53 +g54 +sa(dp2272 +g6 +g7 +(S'\x07\xdc\x0c\x19\n)\x1e\x01\xf3w' +p2273 +tp2274 +Rp2275 +sg43 +Vnewcodereview-code-600-439 +p2276 +sg25 +g1066 +sg27 +V/code/newpull/600#comment-439 +p2277 +sg47 +V:heart: :cocktail: ~ +p2278 +sg49 +L600L +sg50 +g2220 +sg29 +g52 +sg53 +g54 +sa(dp2279 +g90 +g359 +sg43 +Vpullrequest-smaug-348-unmerge +p2280 +sg6 +g7 +(S"\x07\xdc\x0c\x19\n'\x16\x03\x9d-" +p2281 +tp2282 +Rp2283 +sg95 +g1074 +sg97 +g1075 +sg93 +g1163 +sg101 +g102 +sg103 +g1200 +sg27 +g1201 +sg106 +g667 +sg29 +g107 +sa(dp2284 +g2 +V56f2918ce67d156bf74122e0df3b97f4611d92ab +p2285 +sg4 +g1148 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n&1\x00\x00\x00' +p2286 +g9 +(g10 +g11 +g11 +(tRp2287 +tp2288 +Rp2289 +(dp2290 +g16 +g17 +(I0 +I28800 +I0 +tp2291 +Rp2292 +sg20 +Nsbtp2293 +Rp2294 +sg23 +Vrevert mdp +p2295 +sg25 +g667 +sg27 +Vhttp://code.dapps.douban.com/jollychang~smaug/commit/56f2918ce67d156bf74122e0df3b97f4611d92ab +p2296 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g685 +sg37 +g1160 +sa(dp2297 +g90 +g91 +sg43 +Vpullrequest-code-600-merged +p2298 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n&)\x0e-\xc5' +p2299 +tp2300 +Rp2301 +sg95 +Vcode_zc:master +p2302 +sg97 +g54 +sg93 +g94 +sg101 +V1. \u66f4\u65b0\u9875\u9762\u53f3\u4e0b\u89d2\u7684\u8868\u60c5\u8bf4\u660e\u5f39\u51fa\u6846 \u000a2. \u5c1d\u8bd5\u4fee\u6b63\u901a\u77e5\u90ae\u4ef6cc\u53d1\u9001 \u000a3. PR\u521b\u5efa\u65f6\u6743\u9650\u68c0\u67e5\u4ee5\u53ca\u521b\u5efa\u4eba\u663e\u793a\u7684\u4fee\u6b63 \u000a \u000aPls review and merge, thnx! +p2303 +sg103 +V\u8868\u60c5\u8bf4\u660e\u5f39\u51fa\u6846\u66f4\u65b0\u4ee5\u53caPR\u7684\u4fee\u6b63 +p2304 +sg27 +V/code/newpull/600 +p2305 +sg106 +g2220 +sg29 +g107 +sa(dp2306 +g2 +Vca3b277a62313d11724db5ca39aeaa6f43b7c300 +p2307 +sg4 +g110 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n&&\x00\x00\x00' +p2308 +g9 +(g10 +g11 +g11 +(tRp2309 +tp2310 +Rp2311 +(dp2312 +g16 +g17 +(I0 +I28800 +I0 +tp2313 +Rp2314 +sg20 +Nsbtp2315 +Rp2316 +sg23 +VMerge pull request #600 from code_zc:master\u000a \u000a \u8868\u60c5\u8bf4\u660e\u5f39\u51fa\u6846\u66f4\u65b0\u4ee5\u53caPR\u7684\u4fee\u6b63 +p2317 +sg25 +g94 +sg27 +Vhttp://code.dapps.douban.com/code/commit/ca3b277a62313d11724db5ca39aeaa6f43b7c300 +p2318 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g122 +sg37 +g123 +sa(dp2319 +g6 +g7 +(S'\x07\xdc\x0c\x19\n&\x13\x06$\xcf' +p2320 +tp2321 +Rp2322 +sg43 +Vnewcodereview-code-600-438 +p2323 +sg25 +g542 +sg27 +V/code/newpull/600#comment-438 +p2324 +sg47 +V\u5f00\u59cbraise AccessError\u4e86, \u770b\u6765\u6211\u7684403\u9875\u5e94\u8be5\u4e0a\u7ebf\u4e86 +p2325 +sg49 +L600L +sg50 +g2220 +sg29 +g52 +sg53 +g54 +sa(dp2326 +g2 +V244b982698056d420e76670004b3b9b3daa58162 +p2327 +sg4 +Vhttp://code.dapps.douban.com/code_zc +p2328 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n$6\x00\x00\x00' +p2329 +g9 +(g10 +g11 +g11 +(tRp2330 +tp2331 +Rp2332 +(dp2333 +g16 +g17 +(I0 +I28800 +I0 +tp2334 +Rp2335 +sg20 +Nsbtp2336 +Rp2337 +sg23 +g2248 +sg25 +g2220 +sg27 +Vhttp://code.dapps.douban.com/code_zc/commit/244b982698056d420e76670004b3b9b3daa58162 +p2338 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +Vzhangchi@douban.com +p2339 +sg37 +Vcode_zc +p2340 +sa(dp2341 +g90 +g359 +sg43 +Vpullrequest-code-347-unmerge +p2342 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n#7\r\x95\x8e' +p2343 +tp2344 +Rp2345 +sg95 +g2302 +sg97 +g54 +sg93 +g94 +sg101 +V1. \u66f4\u65b0\u9875\u9762\u53f3\u4e0b\u89d2\u7684\u8868\u60c5\u8bf4\u660e\u5f39\u51fa\u6846 \u000a2. \u5c1d\u8bd5\u4fee\u6b63\u901a\u77e5\u90ae\u4ef6cc\u53d1\u9001 \u000a3. PR\u521b\u5efa\u65f6\u6743\u9650\u68c0\u67e5\u4ee5\u53ca\u521b\u5efa\u4eba\u663e\u793a\u7684\u4fee\u6b63 \u000a \u000aPls review and merge, thnx! +p2346 +sg103 +g2304 +sg27 +g2305 +sg106 +g2220 +sg29 +g107 +sa(dp2347 +g2 +V9ad93960ce567d76e7ede01b7a4fe9547d100f34 +p2348 +sg4 +g1148 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n"\x07\x00\x00\x00' +p2349 +g9 +(g10 +g11 +g11 +(tRp2350 +tp2351 +Rp2352 +(dp2353 +g16 +g17 +(I0 +I28800 +I0 +tp2354 +Rp2355 +sg20 +Nsbtp2356 +Rp2357 +sg23 +Vtips filter exclusion +p2358 +sg25 +g667 +sg27 +Vhttp://code.dapps.douban.com/jollychang~smaug/commit/9ad93960ce567d76e7ede01b7a4fe9547d100f34 +p2359 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g685 +sg37 +g1160 +sa(dp2360 +g6 +g7 +(S'\x07\xdc\x0c\x19\n!*\n>\xd9' +p2361 +tp2362 +Rp2363 +sg43 +Vnewcodereview-joshua-3-437 +p2364 +sg25 +g1130 +sg27 +V/joshua/newpull/3#comment-437 +p2365 +sg47 +V\u7531\u4e8e\u6700\u521dpublic\u4e0estatic\u76ee\u5f55\u4ee3\u7801\u770b\u4e86\u4e00\u4e0b\u5c31\u6709\u70b9\u4e0d\u540c\uff0c\u76ee\u524d\u4f7f\u7528\u6b63\u5e38\u7684\u662fstatic\u76ee\u5f55\u4e0b\u7684\uff0c\u6240\u4ee5\u6211\u5c06static\u4e0b\u7684copy\u5230public\u4e0b\uff0c\u800c\u540e\u6267\u884cdae\u547d\u4ee4\u6765\u540c\u6b65\u4e00\u4e0b. \u8fd9\u91cc\u53c8\u5b66\u5230\u4e00\u62db\uff0c\u5bf9\u4f7f\u7528\u673a\u5236\u6709\u4e86\u4e00\u5b9a\u4e86\u89e3.thx \u000a\u53e6\u5916@zhangchi \u6240\u8bf4\u7684\u4e24\u4e2a\u7a7a\u683c\u5df2\u7ecf\u6539\u597d\u3002 thx +p2366 +sg49 +L3L +sg50 +g312 +sg29 +g52 +sg53 +g313 +sa(dp2367 +g90 +g91 +sg43 +Vpullrequest-code-599-merged +p2368 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n!\n\x05\x85M' +p2369 +tp2370 +Rp2371 +sg95 +Vcode_zc:ptlissue +p2372 +sg97 +g54 +sg93 +g94 +sg101 +VRT, please review and merge, thnx! +p2373 +sg103 +V\u4fee\u6b63\u5e7f\u64ad\u6a21\u677f\u6392\u5e8f +p2374 +sg27 +V/code/newpull/599 +p2375 +sg106 +g2220 +sg29 +g107 +sa(dp2376 +g2 +Vdf7738512687b9a81156e64d404797d188027652 +p2377 +sg4 +g110 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n!\x07\x00\x00\x00' +p2378 +g9 +(g10 +g11 +g11 +(tRp2379 +tp2380 +Rp2381 +(dp2382 +g16 +g17 +(I0 +I28800 +I0 +tp2383 +Rp2384 +sg20 +Nsbtp2385 +Rp2386 +sg23 +VMerge pull request #599 from code_zc:ptlissue\u000a \u000a \u4fee\u6b63\u5e7f\u64ad\u6a21\u677f\u6392\u5e8f +p2387 +sg25 +g94 +sg27 +Vhttp://code.dapps.douban.com/code/commit/df7738512687b9a81156e64d404797d188027652 +p2388 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g122 +sg37 +g123 +sa(dp2389 +g2 +Vdf9f0990c409d6d1a0600653c6c9d880df838803 +p2390 +sg4 +g1589 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n ;\x00\x00\x00' +p2391 +g9 +(g10 +g11 +g11 +(tRp2392 +tp2393 +Rp2394 +(dp2395 +g16 +g17 +(I0 +I28800 +I0 +tp2396 +Rp2397 +sg20 +Nsbtp2398 +Rp2399 +sg23 +g1599 +sg25 +g1076 +sg27 +Vhttp://code.dapps.douban.com/wangfei~erebor-config/commit/df9f0990c409d6d1a0600653c6c9d880df838803 +p2400 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g1093 +sg37 +g1601 +sa(dp2401 +g6 +g7 +(S'\x07\xdc\x0c\x19\n 3\t\xc0\x0e' +p2402 +tp2403 +Rp2404 +sg43 +Vnewcodereview-code-599-436 +p2405 +sg25 +g542 +sg27 +V/code/newpull/599#comment-436 +p2406 +sg47 +V:cool: +p2407 +sg49 +L599L +sg50 +g2220 +sg29 +g52 +sg53 +g54 +sa(dp2408 +g90 +g359 +sg43 +Vpullrequest-code-346-unmerge +p2409 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n \x01\x0bD\xa4' +p2410 +tp2411 +Rp2412 +sg95 +g2372 +sg97 +g54 +sg93 +g94 +sg101 +g2373 +sg103 +g2374 +sg27 +g2375 +sg106 +g2220 +sg29 +g107 +sa(dp2413 +g6 +g7 +(S'\x07\xdc\x0c\x19\n\x1e!\x0c.q' +p2414 +tp2415 +Rp2416 +sg43 +Vnewcodereview-code-597-435 +p2417 +sg25 +g1066 +sg27 +V/code/newpull/597#comment-435 +p2418 +sg47 +Vlg2m, :cool: :clap: +p2419 +sg49 +L597L +sg50 +g1935 +sg29 +g52 +sg53 +g54 +sa(dp2420 +g2 +V9c94f367ce87bc7d7c635a45765195deecff4dd9 +p2421 +sg4 +g1589 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n\x1e\x1c\x00\x00\x00' +p2422 +g9 +(g10 +g11 +g11 +(tRp2423 +tp2424 +Rp2425 +(dp2426 +g16 +g17 +(I0 +I28800 +I0 +tp2427 +Rp2428 +sg20 +Nsbtp2429 +Rp2430 +sg23 +g1599 +sg25 +g1076 +sg27 +Vhttp://code.dapps.douban.com/wangfei~erebor-config/commit/9c94f367ce87bc7d7c635a45765195deecff4dd9 +p2431 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g1093 +sg37 +g1601 +sa(dp2432 +g2 +Vdf9238be401dcc3108d02b9b52d6718b004c0416 +p2433 +sg4 +g1533 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n\x1d3\x00\x00\x00' +p2434 +g9 +(g10 +g11 +g11 +(tRp2435 +tp2436 +Rp2437 +(dp2438 +g16 +g17 +(I0 +I28800 +I0 +tp2439 +Rp2440 +sg20 +Nsbtp2441 +Rp2442 +sg23 +Vupdate bookmarklet style +p2443 +sg25 +g1543 +sg27 +Vhttp://code.dapps.douban.com/pbin/commit/df9238be401dcc3108d02b9b52d6718b004c0416 +p2444 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g1545 +sg37 +g1546 +sa(dp2445 +g2 +Vf26e85d6ac782506b0099d514b3a560d4a40d51a +p2446 +sg4 +g370 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n\x1b\x04\x00\x00\x00' +p2447 +g9 +(g10 +g11 +g11 +(tRp2448 +tp2449 +Rp2450 +(dp2451 +g16 +g17 +(I0 +I28800 +I0 +tp2452 +Rp2453 +sg20 +Nsbtp2454 +Rp2455 +sg23 +Vupdate +p2456 +sg25 +g312 +sg27 +Vhttp://code.dapps.douban.com/cyrildou_joshua/commit/f26e85d6ac782506b0099d514b3a560d4a40d51a +p2457 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g381 +sg37 +g382 +sa(dp2458 +g2 +V2739bcbf45217dbe3d1ca405227c7a10beb1fbbb +p2459 +sg4 +g1453 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n\x196\x00\x00\x00' +p2460 +g9 +(g10 +g11 +g11 +(tRp2461 +tp2462 +Rp2463 +(dp2464 +g16 +g17 +(I0 +I28800 +I0 +tp2465 +Rp2466 +sg20 +Nsbtp2467 +Rp2468 +sg23 +g1529 +sg25 +g1464 +sg27 +Vhttp://code.dapps.douban.com/authority/commit/2739bcbf45217dbe3d1ca405227c7a10beb1fbbb +p2469 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g1466 +sg37 +g1467 +sa(dp2470 +g2 +V2d6435037c274261c8c2882ede8ff4da5a97beee +p2471 +sg4 +g1533 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n\x14(\x00\x00\x00' +p2472 +g9 +(g10 +g11 +g11 +(tRp2473 +tp2474 +Rp2475 +(dp2476 +g16 +g17 +(I0 +I28800 +I0 +tp2477 +Rp2478 +sg20 +Nsbtp2479 +Rp2480 +sg23 +g222 +sg25 +g1543 +sg27 +Vhttp://code.dapps.douban.com/pbin/commit/2d6435037c274261c8c2882ede8ff4da5a97beee +p2481 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g1545 +sg37 +g1546 +sa(dp2482 +g2 +V4acf6cbacde80958bcdaf1e04d0445f3c4c3f594 +p2483 +sg4 +g1533 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n\x14(\x00\x00\x00' +p2484 +g9 +(g10 +g11 +g11 +(tRp2485 +tp2486 +Rp2487 +(dp2488 +g16 +g17 +(I0 +I28800 +I0 +tp2489 +Rp2490 +sg20 +Nsbtp2491 +Rp2492 +sg23 +Vuse footnote to add link +p2493 +sg25 +g1543 +sg27 +Vhttp://code.dapps.douban.com/pbin/commit/4acf6cbacde80958bcdaf1e04d0445f3c4c3f594 +p2494 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g1545 +sg37 +g1546 +sa(dp2495 +g90 +g91 +sg43 +Vpullrequest-erebor-68-merged +p2496 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n\x14\x0c\x04f#' +p2497 +tp2498 +Rp2499 +sg95 +Verebor_ianoshen:event-handler +p2500 +sg97 +Verebor:master +p2501 +sg93 +g1076 +sg101 +Vadd event handler for interactive pipline +p2502 +sg103 +Vadd event-handler +p2503 +sg27 +V/erebor/newpull/68 +p2504 +sg106 +g1163 +sg29 +g107 +sa(dp2505 +g2 +Va9bf7dde282f954a617bbd3e17a512e839345c26 +p2506 +sg4 +Vhttp://code.dapps.douban.com/erebor +p2507 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n\x14\t\x00\x00\x00' +p2508 +g9 +(g10 +g11 +g11 +(tRp2509 +tp2510 +Rp2511 +(dp2512 +g16 +g17 +(I0 +I28800 +I0 +tp2513 +Rp2514 +sg20 +Nsbtp2515 +Rp2516 +sg23 +VMerge pull request #68 from erebor_ianoshen:event-handler\u000a \u000a add event-handler +p2517 +sg25 +g1076 +sg27 +Vhttp://code.dapps.douban.com/erebor/commit/a9bf7dde282f954a617bbd3e17a512e839345c26 +p2518 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g1093 +sg37 +Verebor +p2519 +sa(dp2520 +g2 +Vae03a1290a47ccddd2d36aca140c5c61bdb93489 +p2521 +sg4 +Vhttp://code.dapps.douban.com/erebor_ianoshen +p2522 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n\x12&\x00\x00\x00' +p2523 +g9 +(g10 +g11 +g11 +(tRp2524 +tp2525 +Rp2526 +(dp2527 +g16 +g17 +(I0 +I28800 +I0 +tp2528 +Rp2529 +sg20 +Nsbtp2530 +Rp2531 +sg23 +Vfix comma in config.json.sample +p2532 +sg25 +g1163 +sg27 +Vhttp://code.dapps.douban.com/erebor_ianoshen/commit/ae03a1290a47ccddd2d36aca140c5c61bdb93489 +p2533 +sg33 +Vrefs/heads/event-handler +p2534 +sg31 +Vevent-handler +p2535 +sg29 +g30 +sg35 +g1425 +sg37 +Verebor_ianoshen +p2536 +sa(dp2537 +g2 +V0f602bfc97ef523936e30de654b13c4d4e3e7b85 +p2538 +sg4 +g343 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n\x11*\x00\x00\x00' +p2539 +g9 +(g10 +g11 +g11 +(tRp2540 +tp2541 +Rp2542 +(dp2543 +g16 +g17 +(I0 +I28800 +I0 +tp2544 +Rp2545 +sg20 +Nsbtp2546 +Rp2547 +sg23 +Vremove post jsonize +p2548 +sg25 +g354 +sg27 +Vhttp://code.dapps.douban.com/WoFm/commit/0f602bfc97ef523936e30de654b13c4d4e3e7b85 +p2549 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g356 +sg37 +g357 +sa(dp2550 +g90 +g91 +sg43 +Vpullrequest-fm-67-merged +p2551 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n\x11\x14\x03\xbf\\' +p2552 +tp2553 +Rp2554 +sg95 +Vlantian-fm:master +p2555 +sg97 +g318 +sg93 +g711 +sg101 +g102 +sg103 +Valg:remove low rate user dispatch +p2556 +sg27 +V/fm/newpull/67 +p2557 +sg106 +g711 +sg29 +g107 +sa(dp2558 +g2 +Vfad37cf27b74041c32f5dd3b6b3833674c75a112 +p2559 +sg4 +g327 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n\x11\x12\x00\x00\x00' +p2560 +g9 +(g10 +g11 +g11 +(tRp2561 +tp2562 +Rp2563 +(dp2564 +g16 +g17 +(I0 +I28800 +I0 +tp2565 +Rp2566 +sg20 +Nsbtp2567 +Rp2568 +sg23 +VMerge pull request #67 from lantian-fm:master\u000a \u000a alg:remove low rate user dispatch +p2569 +sg25 +g711 +sg27 +Vhttp://code.dapps.douban.com/fm/commit/fad37cf27b74041c32f5dd3b6b3833674c75a112 +p2570 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g713 +sg37 +g340 +sa(dp2571 +g90 +g359 +sg43 +Vpullrequest-fm-345-unmerge +p2572 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n\x11\x07\n\xccS' +p2573 +tp2574 +Rp2575 +sg95 +g2555 +sg97 +g318 +sg93 +g316 +sg101 +g102 +sg103 +g2556 +sg27 +g2557 +sg106 +g711 +sg29 +g107 +sa(dp2576 +g2 +V471799da64b01604ab120c045cf918d5dcc13b9f +p2577 +sg4 +Vhttp://code.dapps.douban.com/momo-Aglarond +p2578 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n\x0f9\x00\x00\x00' +p2579 +g9 +(g10 +g11 +g11 +(tRp2580 +tp2581 +Rp2582 +(dp2583 +g16 +g17 +(I0 +I28800 +I0 +tp2584 +Rp2585 +sg20 +Nsbtp2586 +Rp2587 +sg23 +VDefault unfold +p2588 +sg25 +Vmomo +p2589 +sg27 +Vhttp://code.dapps.douban.com/momo-Aglarond/commit/471799da64b01604ab120c045cf918d5dcc13b9f +p2590 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +Vmomo@douban.com +p2591 +sg37 +Vmomo-Aglarond +p2592 +sa(dp2593 +g2 +V2618d6b97b72eee9e9792a0e28e8ec4cf39f4854 +p2594 +sg4 +g620 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n\r\x06\x00\x00\x00' +p2595 +g9 +(g10 +g11 +g11 +(tRp2596 +tp2597 +Rp2598 +(dp2599 +g16 +g17 +(I0 +I28800 +I0 +tp2600 +Rp2601 +sg20 +Nsbtp2602 +Rp2603 +sg23 +Vexporting site follower info script added +p2604 +sg25 +g631 +sg27 +Vhttp://code.dapps.douban.com/biz_maintenance_scripts/commit/2618d6b97b72eee9e9792a0e28e8ec4cf39f4854 +p2605 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g633 +sg37 +g634 +sa(dp2606 +g90 +g91 +sg43 +Vpullrequest-erebor-config-3-merged +p2607 +sg93 +g1076 +sg95 +g1363 +sg97 +g1364 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n\x0b\x00\x00<\xe9' +p2608 +tp2609 +Rp2610 +sg101 +g102 +sg103 +Vadd celduin_address +p2611 +sg27 +V/erebor-config/newpull/3 +p2612 +sg106 +g1163 +sg29 +g107 +sa(dp2613 +g2 +V55921692e13c529eb1a7eb0cbd7ee91b64021943 +p2614 +sg4 +g1372 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n\n9\x00\x00\x00' +p2615 +g9 +(g10 +g11 +g11 +(tRp2616 +tp2617 +Rp2618 +(dp2619 +g16 +g17 +(I0 +I28800 +I0 +tp2620 +Rp2621 +sg20 +Nsbtp2622 +Rp2623 +sg23 +VMerge pull request #3 from ianoshen_erebor-config:master\u000a \u000a add celduin_address +p2624 +sg25 +g1076 +sg27 +Vhttp://code.dapps.douban.com/erebor-config/commit/55921692e13c529eb1a7eb0cbd7ee91b64021943 +p2625 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g1093 +sg37 +g1384 +sa(dp2626 +g2 +V0d645f85bae056c72d8e2bf2f78717ef3ab59e50 +p2627 +sg4 +Vhttp://code.dapps.douban.com/lantian-fm +p2628 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n\n\t\x00\x00\x00' +p2629 +g9 +(g10 +g11 +g11 +(tRp2630 +tp2631 +Rp2632 +(dp2633 +g16 +g17 +(I0 +I28800 +I0 +tp2634 +Rp2635 +sg20 +Nsbtp2636 +Rp2637 +sg23 +Vremove low rate user dispatch +p2638 +sg25 +g711 +sg27 +Vhttp://code.dapps.douban.com/lantian-fm/commit/0d645f85bae056c72d8e2bf2f78717ef3ab59e50 +p2639 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g713 +sg37 +Vlantian-fm +p2640 +sa(dp2641 +g2 +Vdc382495b63aa0ba94623dbec647c2d16c6cafc9 +p2642 +sg4 +g1690 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n\t8\x00\x00\x00' +p2643 +g9 +(g10 +g11 +g11 +(tRp2644 +tp2645 +Rp2646 +(dp2647 +g16 +g17 +(I0 +I28800 +I0 +tp2648 +Rp2649 +sg20 +Nsbtp2650 +Rp2651 +sg23 +VDelete the MWPhotoBrowser dependency, use source code instead. +p2652 +sg25 +g1701 +sg27 +Vhttp://code.dapps.douban.com/DoubanMovie--iOS/commit/dc382495b63aa0ba94623dbec647c2d16c6cafc9 +p2653 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g1703 +sg37 +g1704 +sa(dp2654 +g90 +g359 +sg43 +Vpullrequest-erebor-config-344-unmerge +p2655 +sg93 +g1163 +sg95 +g1363 +sg97 +g1364 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n\t)\x02\xd4<' +p2656 +tp2657 +Rp2658 +sg101 +g102 +sg103 +g2611 +sg27 +g2612 +sg106 +g1163 +sg29 +g107 +sa(dp2659 +g2 +Vf5f1aa3e7c3193166f35a470de2ee9473e73f839 +p2660 +sg4 +g1413 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n\t\x12\x00\x00\x00' +p2661 +g9 +(g10 +g11 +g11 +(tRp2662 +tp2663 +Rp2664 +(dp2665 +g16 +g17 +(I0 +I28800 +I0 +tp2666 +Rp2667 +sg20 +Nsbtp2668 +Rp2669 +sg23 +g2611 +sg25 +g1163 +sg27 +Vhttp://code.dapps.douban.com/ianoshen_erebor-config/commit/f5f1aa3e7c3193166f35a470de2ee9473e73f839 +p2670 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g1425 +sg37 +g1426 +sa(dp2671 +g2 +V5d9de2d7ee2fa3c6a27da03da2816ee922a4bded +p2672 +sg4 +g603 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n\x02!\x00\x00\x00' +p2673 +g9 +(g10 +g11 +g11 +(tRp2674 +tp2675 +Rp2676 +(dp2677 +g16 +g17 +(I0 +I28800 +I0 +tp2678 +Rp2679 +sg20 +Nsbtp2680 +Rp2681 +sg23 +Vadded guozhuwen +p2682 +sg25 +g614 +sg27 +Vhttp://code.dapps.douban.com/ideas/commit/5d9de2d7ee2fa3c6a27da03da2816ee922a4bded +p2683 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g616 +sg37 +g617 +sa(dp2684 +g2 +V465809b12c9143b087349b7bd3a40a746ef165af +p2685 +sg4 +Vhttp://code.dapps.douban.com/dimholt-simlarity +p2686 +sg6 +g7 +(S'\x07\xdc\x0c\x19\n\x00#\x00\x00\x00' +p2687 +g9 +(g10 +g11 +g11 +(tRp2688 +tp2689 +Rp2690 +(dp2691 +g16 +g17 +(I0 +I28800 +I0 +tp2692 +Rp2693 +sg20 +Nsbtp2694 +Rp2695 +sg23 +VRevert "chang idf algorithm"\u000a \u000a This reverts commit 6edfb0238100b3f66f9f43d1b06655541cc4559d. +p2696 +sg25 +g137 +sg27 +Vhttp://code.dapps.douban.com/dimholt-simlarity/commit/465809b12c9143b087349b7bd3a40a746ef165af +p2697 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g139 +sg37 +Vdimholt-simlarity +p2698 +sa(dp2699 +g90 +g359 +sg43 +Vpullrequest-code-343-unmerge +p2700 +sg93 +g94 +sg95 +g1308 +sg97 +g54 +sg6 +g7 +(S'\x07\xdc\x0c\x19\t8\x0e\r\xbe[' +p2701 +tp2702 +Rp2703 +sg101 +g1312 +sg103 +g1313 +sg27 +g1314 +sg106 +g94 +sg29 +g107 +sa(dp2704 +g2 +Vc1649eceda1ad3473361fea9ca26abff0a074c3f +p2705 +sg4 +Vhttp://code.dapps.douban.com/satoru_fm +p2706 +sg6 +g7 +(S'\x07\xdc\x0c\x19\t76\x00\x00\x00' +p2707 +g9 +(g10 +g11 +g11 +(tRp2708 +tp2709 +Rp2710 +(dp2711 +g16 +g17 +(I0 +I28800 +I0 +tp2712 +Rp2713 +sg20 +Nsbtp2714 +Rp2715 +sg23 +V\u8c03\u6574\u4ee3\u7801\u683c\u5f0f +p2716 +sg25 +Vsatoru +p2717 +sg27 +Vhttp://code.dapps.douban.com/satoru_fm/commit/c1649eceda1ad3473361fea9ca26abff0a074c3f +p2718 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +Vsatoru@douban.com +p2719 +sg37 +Vsatoru_fm +p2720 +sa(dp2721 +g2 +Vea63fcadbef9d4c21d200c8b6edc90b4416edf49 +p2722 +sg4 +g110 +sg6 +g7 +(S'\x07\xdc\x0c\x19\t5 \x00\x00\x00' +p2723 +g9 +(g10 +g11 +g11 +(tRp2724 +tp2725 +Rp2726 +(dp2727 +g16 +g17 +(I0 +I28800 +I0 +tp2728 +Rp2729 +sg20 +Nsbtp2730 +Rp2731 +sg23 +g1313 +sg25 +g94 +sg27 +Vhttp://code.dapps.douban.com/code/commit/ea63fcadbef9d4c21d200c8b6edc90b4416edf49 +p2732 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g122 +sg37 +g123 +sa(dp2733 +g2 +V2f6d45246c9783fafb8927a303c35a5b47873714 +p2734 +sg4 +g1097 +sg6 +g7 +(S'\x07\xdc\x0c\x19\t1\x1d\x00\x00\x00' +p2735 +g9 +(g10 +g11 +g11 +(tRp2736 +tp2737 +Rp2738 +(dp2739 +g16 +g17 +(I0 +I28800 +I0 +tp2740 +Rp2741 +sg20 +Nsbtp2742 +Rp2743 +sg23 +Vmove mq to top level, to avoid 'mq assign requested attr +p2744 +sg25 +g1108 +sg27 +Vhttp://code.dapps.douban.com/rohirrim/commit/2f6d45246c9783fafb8927a303c35a5b47873714 +p2745 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g1110 +sg37 +g1111 +sa(dp2746 +g6 +g7 +(S'\x07\xdc\x0c\x19\t-1\x01\x89\xbf' +p2747 +tp2748 +Rp2749 +sg43 +Vnewcodereview-code-597-196 +p2750 +sg25 +g1066 +sg27 +V/code/newpull/597#review-196 +p2751 +sg47 +V`data-commit-author` \u5728commit\u9875\u7684\u884c\u95f4review\u4e2d\u662f\u7528\u6765\u901a\u77e5commit\u63d0\u4ea4\u8005\u7684\uff0c\u4e0d\u8fc7\u5728PR\u8fd9\u56e0\u4e3a\u5f88\u660e\u786ePR\u7684\u63d0\u4ea4\u8005\uff0c\u6240\u4ee5\u5176\u5b9e\u8d77\u4e0d\u5230\u4ec0\u4e48\u4f5c\u7528\uff0c\u4e0d\u8fc7\u6539\u6210\u8fd9\u6837\u66f4\u6e05\u6670\u70b9\uff0c\u8d5e\u3002 +p2752 +sg49 +L597L +sg50 +g1935 +sg29 +g52 +sg53 +g54 +sa(dp2753 +g2 +V25fe161df143204b9826a32a974ef598c05b29f7 +p2754 +sg4 +g2706 +sg6 +g7 +(S'\x07\xdc\x0c\x19\t-0\x00\x00\x00' +p2755 +g9 +(g10 +g11 +g11 +(tRp2756 +tp2757 +Rp2758 +(dp2759 +g16 +g17 +(I0 +I28800 +I0 +tp2760 +Rp2761 +sg20 +Nsbtp2762 +Rp2763 +sg23 +Vremove unused import +p2764 +sg25 +g2717 +sg27 +Vhttp://code.dapps.douban.com/satoru_fm/commit/25fe161df143204b9826a32a974ef598c05b29f7 +p2765 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g2719 +sg37 +g2720 +sa(dp2766 +g2 +Va8b72ebf1ad563c6dcd27d82ec30010538904cca +p2767 +sg4 +Vhttp://code.dapps.douban.com/seven_day_momo +p2768 +sg6 +g7 +(S'\x07\xdc\x0c\x19\t-*\x00\x00\x00' +p2769 +g9 +(g10 +g11 +g11 +(tRp2770 +tp2771 +Rp2772 +(dp2773 +g16 +g17 +(I0 +I28800 +I0 +tp2774 +Rp2775 +sg20 +Nsbtp2776 +Rp2777 +sg23 +VMerge http://code.dapps.douban.com/seven_day_momo +p2778 +sg25 +Vshibingwen +p2779 +sg27 +Vhttp://code.dapps.douban.com/seven_day_momo/commit/a8b72ebf1ad563c6dcd27d82ec30010538904cca +p2780 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +Vshibingwen@douban.com +p2781 +sg37 +Vseven_day_momo +p2782 +sa(dp2783 +g2 +Vb21bffbeb1410a39bc9311998023d9e4f157bf3e +p2784 +sg4 +g603 +sg6 +g7 +(S'\x07\xdc\x0c\x19\t-\x1e\x00\x00\x00' +p2785 +g9 +(g10 +g11 +g11 +(tRp2786 +tp2787 +Rp2788 +(dp2789 +g16 +g17 +(I0 +I28800 +I0 +tp2790 +Rp2791 +sg20 +Nsbtp2792 +Rp2793 +sg23 +Vadded zhengbin, jianjun, chengzheng +p2794 +sg25 +g614 +sg27 +Vhttp://code.dapps.douban.com/ideas/commit/b21bffbeb1410a39bc9311998023d9e4f157bf3e +p2795 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g616 +sg37 +g617 +sa(dp2796 +g2 +Vbe0dea9efdd455d8a65e53cf357838dc266ab07b +p2797 +sg4 +g2706 +sg6 +g7 +(S'\x07\xdc\x0c\x19\t)\r\x00\x00\x00' +p2798 +g9 +(g10 +g11 +g11 +(tRp2799 +tp2800 +Rp2801 +(dp2802 +g16 +g17 +(I0 +I28800 +I0 +tp2803 +Rp2804 +sg20 +Nsbtp2805 +Rp2806 +sg23 +V\u5c06\u63d2\u5165special treat\u66f2\u76ee\u7684\u4ee3\u7801\u6539\u6210\u4e00\u4e2a\u51fd\u6570 +p2807 +sg25 +g2717 +sg27 +Vhttp://code.dapps.douban.com/satoru_fm/commit/be0dea9efdd455d8a65e53cf357838dc266ab07b +p2808 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g2719 +sg37 +g2720 +sa(dp2809 +g6 +g7 +(S'\x07\xdc\x0c\x19\t"\x0b\x04\x01c' +p2810 +tp2811 +Rp2812 +sg43 +Vnewcodereview-code-597-434 +p2813 +sg25 +g542 +sg27 +V/code/newpull/597#comment-434 +p2814 +sg47 +V@zhangchi pls, review +p2815 +sg49 +L597L +sg50 +g1935 +sg29 +g52 +sg53 +g54 +sa(dp2816 +g2 +Vcdf242b6c3ce963736efa5cbfcb567a5d2ec48bc +p2817 +sg4 +g2768 +sg6 +g7 +(S'\x07\xdc\x0c\x19\t\x038\x00\x00\x00' +p2818 +g9 +(g10 +g11 +g11 +(tRp2819 +tp2820 +Rp2821 +(dp2822 +g16 +g17 +(I0 +I28800 +I0 +tp2823 +Rp2824 +sg20 +Nsbtp2825 +Rp2826 +sg23 +Vdatabase +p2827 +sg25 +g2779 +sg27 +Vhttp://code.dapps.douban.com/seven_day_momo/commit/cdf242b6c3ce963736efa5cbfcb567a5d2ec48bc +p2828 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g2781 +sg37 +g2782 +sa(dp2829 +g2 +V73d31d307b4a3807039e2a7c1fbae4121a771700 +p2830 +sg4 +g2768 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x08:\x00\x00\x00\x00' +p2831 +g9 +(g10 +g11 +g11 +(tRp2832 +tp2833 +Rp2834 +(dp2835 +g16 +g17 +(I0 +I28800 +I0 +tp2836 +Rp2837 +sg20 +Nsbtp2838 +Rp2839 +sg23 +Vfinal import +p2840 +sg25 +g2779 +sg27 +Vhttp://code.dapps.douban.com/seven_day_momo/commit/73d31d307b4a3807039e2a7c1fbae4121a771700 +p2841 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g2781 +sg37 +g2782 +sa(dp2842 +g2 +V243d256fcf444a2eb5e38e0e1cba9f609baae3ac +p2843 +sg4 +g1097 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x08\x1a\x18\x00\x00\x00' +p2844 +g9 +(g10 +g11 +g11 +(tRp2845 +tp2846 +Rp2847 +(dp2848 +g16 +g17 +(I0 +I28800 +I0 +tp2849 +Rp2850 +sg20 +Nsbtp2851 +Rp2852 +sg23 +Vfix test for shop name +p2853 +sg25 +g1108 +sg27 +Vhttp://code.dapps.douban.com/rohirrim/commit/243d256fcf444a2eb5e38e0e1cba9f609baae3ac +p2854 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g1110 +sg37 +g1111 +sa(dp2855 +g2 +V3cabca27d1dcfdb27029125c23cd24179d3be1f1 +p2856 +sg4 +g1097 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x08\x15\r\x00\x00\x00' +p2857 +g9 +(g10 +g11 +g11 +(tRp2858 +tp2859 +Rp2860 +(dp2861 +g16 +g17 +(I0 +I28800 +I0 +tp2862 +Rp2863 +sg20 +Nsbtp2864 +Rp2865 +sg23 +Vuse dynamic import replace manual import in update factory +p2866 +sg25 +g1108 +sg27 +Vhttp://code.dapps.douban.com/rohirrim/commit/3cabca27d1dcfdb27029125c23cd24179d3be1f1 +p2867 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g1110 +sg37 +g1111 +sa(dp2868 +g2 +Vbd1280ab2e876f10f84a78a950a555b4bd366690 +p2869 +sg4 +g716 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x02\x16\x01\x00\x00\x00' +p2870 +g9 +(g10 +g11 +g11 +(tRp2871 +tp2872 +Rp2873 +(dp2874 +g16 +g17 +(I0 +I28800 +I0 +tp2875 +Rp2876 +sg20 +Nsbtp2877 +Rp2878 +sg23 +V\u6539\u540d +p2879 +sg25 +g727 +sg27 +Vhttp://code.dapps.douban.com/mario/commit/bd1280ab2e876f10f84a78a950a555b4bd366690 +p2880 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g729 +sg37 +g730 +sa(dp2881 +g2 +V9952db61c63bf4c29bd5ffe7e193aa8ecae85f8b +p2882 +sg4 +g2578 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x02\x0c\x04\x00\x00\x00' +p2883 +g9 +(g10 +g11 +g11 +(tRp2884 +tp2885 +Rp2886 +(dp2887 +g16 +g17 +(I0 +I28800 +I0 +tp2888 +Rp2889 +sg20 +Nsbtp2890 +Rp2891 +sg23 +VGit remove backup files +p2892 +sg25 +g2589 +sg27 +Vhttp://code.dapps.douban.com/momo-Aglarond/commit/9952db61c63bf4c29bd5ffe7e193aa8ecae85f8b +p2893 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g2591 +sg37 +g2592 +sa(dp2894 +g2 +Vf9b8e57ff6020d6565de2a41488c22955d9fc3d1 +p2895 +sg4 +g716 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x01\x04\x18\x00\x00\x00' +p2896 +g9 +(g10 +g11 +g11 +(tRp2897 +tp2898 +Rp2899 +(dp2900 +g16 +g17 +(I0 +I28800 +I0 +tp2901 +Rp2902 +sg20 +Nsbtp2903 +Rp2904 +sg23 +V\u91cd\u6784\u4e0b\u540d\u5b57 +p2905 +sg25 +g727 +sg27 +Vhttp://code.dapps.douban.com/mario/commit/f9b8e57ff6020d6565de2a41488c22955d9fc3d1 +p2906 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g729 +sg37 +g730 +sa(dp2907 +g6 +g7 +(S'\x07\xdc\x0c\x19\x00&\x07\x0c\xa9p' +p2908 +tp2909 +Rp2910 +sg43 +Vnewcodereview-code-588-433 +p2911 +sg25 +g2145 +sg27 +V/code/newpull/588#comment-433 +p2912 +sg47 +V\u5176\u5b9egithub\u5728discussion\u9875\u4e5f\u53ef\u4ee5\u76f4\u63a5\u8bc4\u8bba\u3002 +p2913 +sg49 +L588L +sg50 +g51 +sg29 +g52 +sg53 +g54 +sa(dp2914 +g6 +g7 +(S'\x07\xdc\x0c\x19\x00%-\x02\xe7\xc5' +p2915 +tp2916 +Rp2917 +sg43 +Vnewcodereview-code-588-432 +p2918 +sg25 +g2145 +sg27 +V/code/newpull/588#comment-432 +p2919 +sg47 +V[Add Line Note] +p2920 +sg49 +L588L +sg50 +g51 +sg29 +g52 +sg53 +g54 +sa(dp2921 +g90 +g359 +sg43 +Vpullrequest-code-342-unmerge +p2922 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x00#\x07\x01\x06,' +p2923 +tp2924 +Rp2925 +sg95 +g2074 +sg97 +g54 +sg93 +g94 +sg101 +V\u6b65\u9aa4\uff1a \u000a1.\u53d1PR \u000a2.\u5408\u5e76PR \u000a3.\u5220\u9664\u53d1\u8d77PR\u7684\u9879\u76ee \u000a4.PR\u53ca\u8bc4\u8bba\u80fd\u6b63\u786e\u663e\u793a +p2926 +sg103 +g2079 +sg27 +g2080 +sg106 +g1935 +sg29 +g107 +sa(dp2927 +g2 +Vc9092ddda3c64cec76558dab2ba78862f1d31815 +p2928 +sg4 +Vhttp://code.dapps.douban.com/code_hh +p2929 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x00!\n\x00\x00\x00' +p2930 +g9 +(g10 +g11 +g11 +(tRp2931 +tp2932 +Rp2933 +(dp2934 +g16 +g17 +(I0 +I28800 +I0 +tp2935 +Rp2936 +sg20 +Nsbtp2937 +Rp2938 +sg23 +g2079 +sg25 +g1935 +sg27 +Vhttp://code.dapps.douban.com/code_hh/commit/c9092ddda3c64cec76558dab2ba78862f1d31815 +p2939 +sg29 +g30 +sg31 +Vmerged_pr +p2940 +sg33 +Vrefs/heads/merged_pr +p2941 +sg35 +g1937 +sg37 +Vcode_hh +p2942 +sa(dp2943 +g6 +g7 +(S'\x07\xdc\x0c\x19\x00\x13\x0f\x04\xab,' +p2944 +tp2945 +Rp2946 +sg43 +Vnewcodereview-code-588-431 +p2947 +sg25 +g1066 +sg27 +V/code/newpull/588#comment-431 +p2948 +sg47 +V@xingben \u6536\u5230\uff0c\u8fd9\u4e2a\u5e94\u8be5\u6709 :palm_tree: +p2949 +sg49 +L588L +sg50 +g51 +sg29 +g52 +sg53 +g54 +sa(dp2950 +g2 +V1d03f8002396e3abec289166a8cdde5c18e7cc14 +p2951 +sg4 +g2328 +sg6 +g7 +(S'\x07\xdc\x0c\x19\x00\r5\x00\x00\x00' +p2952 +g9 +(g10 +g11 +g11 +(tRp2953 +tp2954 +Rp2955 +(dp2956 +g16 +g17 +(I0 +I28800 +I0 +tp2957 +Rp2958 +sg20 +Nsbtp2959 +Rp2960 +sg23 +VPR\u521b\u5efa\u6743\u9650\u68c0\u67e5\u4ee5\u53ca\u521b\u5efa\u4eba\u4fee\u6b63 +p2961 +sg25 +g2220 +sg27 +Vhttp://code.dapps.douban.com/code_zc/commit/1d03f8002396e3abec289166a8cdde5c18e7cc14 +p2962 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g2339 +sg37 +g2340 +sa(dp2963 +g6 +g7 +(S'\x07\xdc\x0c\x18\x17:*\x0c]g' +p2964 +tp2965 +Rp2966 +sg43 +Vnewcodereview-joshua-3-195 +p2967 +sg25 +g309 +sg27 +V/joshua/newpull/3#review-195 +p2968 +sg47 +V@zhangchi \u8bf4\u5f97\u5bf9\uff0c\u8fd9\u91cc\u6211\u90fd\u5fd8\u8bb0\u4e86\uff0c\u800c\u4e14\u8fd9\u4e2a\u5b9e\u8df5\u8c8c\u4f3c\u4e5f\u6ca1\u6709\u5728Makefile\u4e2d\u660e\u786e\u4e0b\u6765\u3002\u6211\u662f\u770b\u4e86\u4e0bjoshua/settings.py\u6587\u4ef6\u624d\u786e\u5b9a\u539f\u6765\u5c31\u662f\u4f7f\u7528\u8fd9\u4e2a\u673a\u5236\u7684\u3002\u7b80\u5355\u8bf4\u5c31\u662f\u5f00\u53d1\u8005\u4fee\u6539js\u6587\u4ef6\u90fd\u5e94\u8be5\u6539public\u76ee\u5f55\u4e0b\u9762\u7684\uff0c\u5728\u53d1\u5e03\u524d\u6267\u884c\u4e0a\u9762\u90a3\u6761\u547d\u4ee4\u81ea\u52a8\u5c06\u9759\u6001\u6587\u4ef6\u590d\u5236\u5230static/\u76ee\u5f55\u4e2d\uff0c\u518d\u63d0\u4ea4\u5e76\u53d1\u5e03 +p2969 +sg49 +L3L +sg50 +g312 +sg29 +g52 +sg53 +g313 +sa(dp2970 +g2 +V47cd3fe1d4c841de7c2b56c1c347e4097b62cd44 +p2971 +sg4 +g2328 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x174\x00\x00\x00\x00' +p2972 +g9 +(g10 +g11 +g11 +(tRp2973 +tp2974 +Rp2975 +(dp2976 +g16 +g17 +(I0 +I28800 +I0 +tp2977 +Rp2978 +sg20 +Nsbtp2979 +Rp2980 +sg23 +V\u5c1d\u8bd5\u4fee\u6b63\u90ae\u4ef6cc\u53d1\u9001 +p2981 +sg25 +g2220 +sg27 +Vhttp://code.dapps.douban.com/code_zc/commit/47cd3fe1d4c841de7c2b56c1c347e4097b62cd44 +p2982 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g2339 +sg37 +g2340 +sa(dp2983 +g6 +g7 +(S'\x07\xdc\x0c\x18\x170\x1b\x03\xda+' +p2984 +tp2985 +Rp2986 +sg43 +Vnewcodereview-code-588-430 +p2987 +sg25 +g309 +sg27 +V/code/newpull/588#comment-430 +p2988 +sg47 +V@xueming \u5728\u4ee3\u7801\u9875\u9762\uff0c\u5728\u8bc4\u8bba\u7684\u90a3\u884c\u4ee3\u7801\u524d\u9762\u70b9\u51fb\u6dfb\u52a0\u8bc4\u8bba\u7684\u6309\u94ae\uff0c\u5c31\u4f1a\u5728\u8bc4\u8bba\u7684\u6700\u4e0b\u9762\u51fa\u73b0\u8f93\u5165\u6846 \u000a \u000a@zhangchi \u8fd9\u4e2a\u95ee\u9898\uff0c\u6211\u4eca\u5929\u5c31\u7ed9\u4e0d\u540c\u7684\u4eba\u89e3\u7b54\u4e24\u6b21\u4e86\uff0c\u770b\u6765\u662f\u4f7f\u7528\u4e0a\u4e00\u4e2a\u5f88\u4e0d\u76f4\u89c2\u7684\u4f53\u9a8c\u4e86\uff0c\u8003\u8651\u5728\u4e0b\u9762\u52a0\u4e2a\u6309\u94ae\u5427\u2026\u2026 +p2989 +sg49 +L588L +sg50 +g51 +sg29 +g52 +sg53 +g54 +sa(dp2990 +g2 +V99f5e6fac860878ec3ca10fc8db2d98341448688 +p2991 +sg4 +g74 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x17-)\x00\x00\x00' +p2992 +g9 +(g10 +g11 +g11 +(tRp2993 +tp2994 +Rp2995 +(dp2996 +g16 +g17 +(I0 +I28800 +I0 +tp2997 +Rp2998 +sg20 +Nsbtp2999 +Rp3000 +sg23 +Vupdate django-dae-auth +p3001 +sg25 +g85 +sg27 +Vhttp://code.dapps.douban.com/blackpit/commit/99f5e6fac860878ec3ca10fc8db2d98341448688 +p3002 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g87 +sg37 +g88 +sa(dp3003 +g2 +V96f5a25178045c62eb521974f57ec3ddcb1d1d99 +p3004 +sg4 +Vhttp://code.dapps.douban.com/Ringwraiths +p3005 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x17,\x18\x00\x00\x00' +p3006 +g9 +(g10 +g11 +g11 +(tRp3007 +tp3008 +Rp3009 +(dp3010 +g16 +g17 +(I0 +I28800 +I0 +tp3011 +Rp3012 +sg20 +Nsbtp3013 +Rp3014 +sg23 +VREADME +p3015 +sg25 +Vfuyuquan +p3016 +sg27 +Vhttp://code.dapps.douban.com/Ringwraiths/commit/96f5a25178045c62eb521974f57ec3ddcb1d1d99 +p3017 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +Vfuyuquan@douban.com +p3018 +sg37 +VRingwraiths +p3019 +sa(dp3020 +g2 +V85cbfff4966d07e63e10d1ae865474e6dbbcec99 +p3021 +sg4 +Vhttp://code.dapps.douban.com/django-dae-auth +p3022 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x17,\x05\x00\x00\x00' +p3023 +g9 +(g10 +g11 +g11 +(tRp3024 +tp3025 +Rp3026 +(dp3027 +g16 +g17 +(I0 +I28800 +I0 +tp3028 +Rp3029 +sg20 +Nsbtp3030 +Rp3031 +sg23 +Vadd code_config +p3032 +sg25 +g85 +sg27 +Vhttp://code.dapps.douban.com/django-dae-auth/commit/85cbfff4966d07e63e10d1ae865474e6dbbcec99 +p3033 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g87 +sg37 +Vdjango-dae-auth +p3034 +sa(dp3035 +g2 +V6cdf104998ec75d1fb77d50853cacb43b44d2bff +p3036 +sg4 +g3022 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x17+8\x00\x00\x00' +p3037 +g9 +(g10 +g11 +g11 +(tRp3038 +tp3039 +Rp3040 +(dp3041 +g16 +g17 +(I0 +I28800 +I0 +tp3042 +Rp3043 +sg20 +Nsbtp3044 +Rp3045 +sg23 +Vupdate README +p3046 +sg25 +g85 +sg27 +Vhttp://code.dapps.douban.com/django-dae-auth/commit/6cdf104998ec75d1fb77d50853cacb43b44d2bff +p3047 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g87 +sg37 +g3034 +sa(dp3048 +g6 +g7 +(S'\x07\xdc\x0c\x18\x17\x1f\x1c\x02\xdd\xf5' +p3049 +tp3050 +Rp3051 +sg43 +Vnewcodereview-code-588-429 +p3052 +sg25 +g45 +sg27 +V/code/newpull/588#comment-429 +p3053 +sg47 +V@qingfeng \u8001\u5e08\uff0c\u600e\u6837\u5728\u4f60\u4eec\u7684\u8bc4\u8bba\u4e0b\u9762\u63a5\u7740\u8bc4\u8bba\uff1f\u5c31\u50cf@xingben\u7684\u8bc4\u8bba\u90a3\u6837\u3002\u3002 +p3054 +sg49 +L588L +sg50 +g51 +sg29 +g52 +sg53 +g54 +sa(dp3055 +g6 +g7 +(S'\x07\xdc\x0c\x18\x17\x1e\n\x01\xb7\xf0' +p3056 +tp3057 +Rp3058 +sg43 +Vnewcodereview-code-588-428 +p3059 +sg25 +g45 +sg27 +V/code/newpull/588#comment-428 +p3060 +sg47 +V@qingfeng @xingben \u55ef\uff0c\u597d\uff01\u8fd9\u4e2a\u6211\u6765\u3002\u4e4b\u524d\u770b\u8fc7\u5728\u5f88\u591a\u4e0d\u9700\u8981js\u7684\u9875\u9762\u6211\u770b\u4e5f\u52a0\u4e86oz.js\uff0c\u73b0\u5728\u660e\u767d\u4e86\u3002 +p3061 +sg49 +L588L +sg50 +g51 +sg29 +g52 +sg53 +g54 +sa(dp3062 +g2 +V7726df3c95205b02a9f5db8b3620d21440ae23a7 +p3063 +sg4 +g2328 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x17\x18\x07\x00\x00\x00' +p3064 +g9 +(g10 +g11 +g11 +(tRp3065 +tp3066 +Rp3067 +(dp3068 +g16 +g17 +(I0 +I28800 +I0 +tp3069 +Rp3070 +sg20 +Nsbtp3071 +Rp3072 +sg23 +V\u66f4\u65b0\u9875\u9762\u53f3\u4e0b\u89d2\u7684\u8868\u60c5\u8bf4\u660e\u5f39\u51fa\u6846 +p3073 +sg25 +g2220 +sg27 +Vhttp://code.dapps.douban.com/code_zc/commit/7726df3c95205b02a9f5db8b3620d21440ae23a7 +p3074 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g2339 +sg37 +g2340 +sa(dp3075 +g2 +Vcb956ffc4a3f04bb2caa4157133a4252ae32b727 +p3076 +sg4 +g74 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x17\x0f%\x00\x00\x00' +p3077 +g9 +(g10 +g11 +g11 +(tRp3078 +tp3079 +Rp3080 +(dp3081 +g16 +g17 +(I0 +I28800 +I0 +tp3082 +Rp3083 +sg20 +Nsbtp3084 +Rp3085 +sg23 +g3001 +sg25 +g85 +sg27 +Vhttp://code.dapps.douban.com/blackpit/commit/cb956ffc4a3f04bb2caa4157133a4252ae32b727 +p3086 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g87 +sg37 +g88 +sa(dp3087 +g2 +V1f2458e379168b871b97a53bde98d7c8597233c8 +p3088 +sg4 +g3022 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x17\x0f\x11\x00\x00\x00' +p3089 +g9 +(g10 +g11 +g11 +(tRp3090 +tp3091 +Rp3092 +(dp3093 +g16 +g17 +(I0 +I28800 +I0 +tp3094 +Rp3095 +sg20 +Nsbtp3096 +Rp3097 +sg23 +Vadd doubanusers +p3098 +sg25 +g85 +sg27 +Vhttp://code.dapps.douban.com/django-dae-auth/commit/1f2458e379168b871b97a53bde98d7c8597233c8 +p3099 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g87 +sg37 +g3034 +sa(dp3100 +g2 +V77b081f976c846818c03537c3a2c6e50456af110 +p3101 +sg4 +g2328 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x169\x1b\x00\x00\x00' +p3102 +g9 +(g10 +g11 +g11 +(tRp3103 +tp3104 +Rp3105 +(dp3106 +g16 +g17 +(I0 +I28800 +I0 +tp3107 +Rp3108 +sg20 +Nsbtp3109 +Rp3110 +sg23 +g2374 +sg25 +g2220 +sg27 +Vhttp://code.dapps.douban.com/code_zc/commit/77b081f976c846818c03537c3a2c6e50456af110 +p3111 +sg29 +g30 +sg31 +Vptlissue +p3112 +sg33 +Vrefs/heads/ptlissue +p3113 +sg35 +g2339 +sg37 +g2340 +sa(dp3114 +g2 +V377f17b5aab48f4ac99f5d74dfd2376bb1a14b0e +p3115 +sg4 +g3005 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x1625\x00\x00\x00' +p3116 +g9 +(g10 +g11 +g11 +(tRp3117 +tp3118 +Rp3119 +(dp3120 +g16 +g17 +(I0 +I28800 +I0 +tp3121 +Rp3122 +sg20 +Nsbtp3123 +Rp3124 +sg23 +Vexport +p3125 +sg25 +g3016 +sg27 +Vhttp://code.dapps.douban.com/Ringwraiths/commit/377f17b5aab48f4ac99f5d74dfd2376bb1a14b0e +p3126 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g3018 +sg37 +g3019 +sa(dp3127 +g2 +V331f053e0ec97f4a5c399378dbfe01e5285d221b +p3128 +sg4 +Vhttp://code.dapps.douban.com/weixin-event +p3129 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x16+\x0c\x00\x00\x00' +p3130 +g9 +(g10 +g11 +g11 +(tRp3131 +tp3132 +Rp3133 +(dp3134 +g16 +g17 +(I0 +I28800 +I0 +tp3135 +Rp3136 +sg20 +Nsbtp3137 +Rp3138 +sg23 +Vvery happy +p3139 +sg25 +g1543 +sg27 +Vhttp://code.dapps.douban.com/weixin-event/commit/331f053e0ec97f4a5c399378dbfe01e5285d221b +p3140 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +Vjyyjcc@gmail.com +p3141 +sg37 +Vweixin-event +p3142 +sa(dp3143 +g2 +Ve78c9c6136391e8b94ac978bfd9c196ebd2b1a78 +p3144 +sg4 +g3129 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x16)\t\x00\x00\x00' +p3145 +g9 +(g10 +g11 +g11 +(tRp3146 +tp3147 +Rp3148 +(dp3149 +g16 +g17 +(I0 +I28800 +I0 +tp3150 +Rp3151 +sg20 +Nsbtp3152 +Rp3153 +sg23 +V\u6211\u64e6 +p3154 +sg25 +g1543 +sg27 +Vhttp://code.dapps.douban.com/weixin-event/commit/e78c9c6136391e8b94ac978bfd9c196ebd2b1a78 +p3155 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g3141 +sg37 +g3142 +sa(dp3156 +g6 +g7 +(S'\x07\xdc\x0c\x18\x16\x1c6\x00\xca\xd9' +p3157 +tp3158 +Rp3159 +sg43 +Vnewcodereview-joshua-3-427 +p3160 +sg25 +g1066 +sg27 +V/joshua/newpull/3#comment-427 +p3161 +sg47 +V\u521a\u770b\u5230\uff0cPR\u7684\u90ae\u4ef6\u901a\u77e5\u8fd8\u6709\u70b9\u95ee\u9898\uff0c\u62b1\u6b49\u56de\u590d\u665a\u4e86\u3002 +p3162 +sg49 +L3L +sg50 +g312 +sg29 +g52 +sg53 +g313 +sa(dp3163 +g6 +g7 +(S'\x07\xdc\x0c\x18\x16\x19#\n\x05\x84' +p3164 +tp3165 +Rp3166 +sg43 +Vnewcodereview-joshua-3-194 +p3167 +sg25 +g1066 +sg27 +V/joshua/newpull/3#review-194 +p3168 +sg47 +V\u8fd9\u91cc\u7684\u4ee3\u7801\u548c public/js/joshua.js \u7684\u4ee3\u7801\u8fd8\u6709\u70b9\u4e0d\u592a\u4e00\u6837\uff0c\u4e4b\u524d\u662f\u8981\u4fdd\u6301\u4e00\u81f4\u7684\uff0cstatic \u76ee\u5f55\u4e0b\u6587\u4ef6\u5e94\u8be5\u662f public \u76ee\u5f55\u590d\u5236\u8fc7\u6765\u7684\uff0c\u901a\u8fc7\u6267\u884c `dae venv python manage.py collectstatic` \u3002 @xingben \u8bf7\u5e2e\u5fd9\u786e\u5b9a\u4e00\u4e0b\uff0c\u76ee\u524d\u662f\u4e0d\u662f\u8fd8\u9700\u8981\u8fd9\u6837\u505a\uff1f +p3169 +sg49 +L3L +sg50 +g312 +sg29 +g52 +sg53 +g313 +sa(dp3170 +g2 +V0b1b2a2e53521c8d59daccb6b2d7efd143b921b7 +p3171 +sg4 +g74 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x16\x103\x00\x00\x00' +p3172 +g9 +(g10 +g11 +g11 +(tRp3173 +tp3174 +Rp3175 +(dp3176 +g16 +g17 +(I0 +I28800 +I0 +tp3177 +Rp3178 +sg20 +Nsbtp3179 +Rp3180 +sg23 +g3001 +sg25 +g85 +sg27 +Vhttp://code.dapps.douban.com/blackpit/commit/0b1b2a2e53521c8d59daccb6b2d7efd143b921b7 +p3181 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g87 +sg37 +g88 +sa(dp3182 +g2 +Vd3aee1350db80b5004340ce37299ae5e7df6dcd5 +p3183 +sg4 +g3022 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x16\x10\x1b\x00\x00\x00' +p3184 +g9 +(g10 +g11 +g11 +(tRp3185 +tp3186 +Rp3187 +(dp3188 +g16 +g17 +(I0 +I28800 +I0 +tp3189 +Rp3190 +sg20 +Nsbtp3191 +Rp3192 +sg23 +Vrename method to lookup +p3193 +sg25 +g85 +sg27 +Vhttp://code.dapps.douban.com/django-dae-auth/commit/d3aee1350db80b5004340ce37299ae5e7df6dcd5 +p3194 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g87 +sg37 +g3034 +sa(dp3195 +g2 +V99400e9c42f3764c69a5c076e823c208b3f9d248 +p3196 +sg4 +g74 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x16\x0c\x07\x00\x00\x00' +p3197 +g9 +(g10 +g11 +g11 +(tRp3198 +tp3199 +Rp3200 +(dp3201 +g16 +g17 +(I0 +I28800 +I0 +tp3202 +Rp3203 +sg20 +Nsbtp3204 +Rp3205 +sg23 +Vadded onimaru-beta +p3206 +sg25 +g85 +sg27 +Vhttp://code.dapps.douban.com/blackpit/commit/99400e9c42f3764c69a5c076e823c208b3f9d248 +p3207 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g87 +sg37 +g88 +sa(dp3208 +g6 +g7 +(S'\x07\xdc\x0c\x18\x16\x06\t\x01zX' +p3209 +tp3210 +Rp3211 +sg43 +Vnewcodereview-joshua-3-193 +p3212 +sg25 +g1066 +sg27 +V/joshua/newpull/3#review-193 +p3213 +sg47 +V\u8fd9\u91cc\u6700\u540e\u90a3\u4e2a\u9017\u53f7\u540e\u9762\u4e5f\u5e94\u8be5\u6709\u7a7a\u683c\uff0c\u6539\u4e00\u4e0b\u5427\u3002 +p3214 +sg49 +L3L +sg50 +g312 +sg29 +g52 +sg53 +g313 +sa(dp3215 +g6 +g7 +(S'\x07\xdc\x0c\x18\x16\x05\x1c\x00=\x16' +p3216 +tp3217 +Rp3218 +sg43 +Vnewcodereview-joshua-3-192 +p3219 +sg25 +g1066 +sg27 +V/joshua/newpull/3#review-192 +p3220 +sg47 +V\u8fd9\u91cc\u9017\u53f7\u540e\u9762\u4e5f\u5e94\u8be5\u6709\u7a7a\u683c\uff0c\u6539\u4e00\u4e0b\u5427\u3002 +p3221 +sg49 +L3L +sg50 +g312 +sg29 +g52 +sg53 +g313 +sa(dp3222 +g2 +V2d5561840dbc62ecb14ddf0727857f12e0f04467 +p3223 +sg4 +g5 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x15\x1d\r\x00\x00\x00' +p3224 +g9 +(g10 +g11 +g11 +(tRp3225 +tp3226 +Rp3227 +(dp3228 +g16 +g17 +(I0 +I28800 +I0 +tp3229 +Rp3230 +sg20 +Nsbtp3231 +Rp3232 +sg23 +VUpdate Django template files. +p3233 +sg25 +g26 +sg27 +Vhttp://code.dapps.douban.com/evaluate/commit/2d5561840dbc62ecb14ddf0727857f12e0f04467 +p3234 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g36 +sg37 +g38 +sa(dp3235 +g2 +V093d8a7d41b72956297503ff36491a97383c2cbf +p3236 +sg4 +g262 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x14\x12\x16\x00\x00\x00' +p3237 +g9 +(g10 +g11 +g11 +(tRp3238 +tp3239 +Rp3240 +(dp3241 +g16 +g17 +(I0 +I28800 +I0 +tp3242 +Rp3243 +sg20 +Nsbtp3244 +Rp3245 +sg23 +Vfix score.html datepicker bug by changing js +p3246 +sg25 +g273 +sg27 +Vhttp://code.dapps.douban.com/resume/commit/093d8a7d41b72956297503ff36491a97383c2cbf +p3247 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g273 +sg37 +g275 +sa(dp3248 +g2 +V288007fb754bafbf20d8684b53f12c058df6f151 +p3249 +sg4 +g2768 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x135\x05\x00\x00\x00' +p3250 +g9 +(g10 +g11 +g11 +(tRp3251 +tp3252 +Rp3253 +(dp3254 +g16 +g17 +(I0 +I28800 +I0 +tp3255 +Rp3256 +sg20 +Nsbtp3257 +Rp3258 +sg23 +Vfinal +p3259 +sg25 +g2779 +sg27 +Vhttp://code.dapps.douban.com/seven_day_momo/commit/288007fb754bafbf20d8684b53f12c058df6f151 +p3260 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g2781 +sg37 +g2782 +sa(dp3261 +g2 +V1c5bae14af10defccf5e6fb76ce7946ff575f2f8 +p3262 +sg4 +g1690 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x13\x1c;\x00\x00\x00' +p3263 +g9 +(g10 +g11 +g11 +(tRp3264 +tp3265 +Rp3266 +(dp3267 +g16 +g17 +(I0 +I28800 +I0 +tp3268 +Rp3269 +sg20 +Nsbtp3270 +Rp3271 +sg23 +VShow trailer and photos. +p3272 +sg25 +g1701 +sg27 +Vhttp://code.dapps.douban.com/DoubanMovie--iOS/commit/1c5bae14af10defccf5e6fb76ce7946ff575f2f8 +p3273 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g1703 +sg37 +g1704 +sa(dp3274 +g2 +V81cac0b0f37527da9076de968e4efbf896e54640 +p3275 +sg4 +g1533 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x126,\x00\x00\x00' +p3276 +g9 +(g10 +g11 +g11 +(tRp3277 +tp3278 +Rp3279 +(dp3280 +g16 +g17 +(I0 +I28800 +I0 +tp3281 +Rp3282 +sg20 +Nsbtp3283 +Rp3284 +sg23 +Vadd a bookmarklet +p3285 +sg25 +g1543 +sg27 +Vhttp://code.dapps.douban.com/pbin/commit/81cac0b0f37527da9076de968e4efbf896e54640 +p3286 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g1545 +sg37 +g1546 +sa(dp3287 +g2 +V9a24048b0846103f433b7114bc9e8c43f6127ad7 +p3288 +sg4 +g74 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x1221\x00\x00\x00' +p3289 +g9 +(g10 +g11 +g11 +(tRp3290 +tp3291 +Rp3292 +(dp3293 +g16 +g17 +(I0 +I28800 +I0 +tp3294 +Rp3295 +sg20 +Nsbtp3296 +Rp3297 +sg23 +g3001 +sg25 +g85 +sg27 +Vhttp://code.dapps.douban.com/blackpit/commit/9a24048b0846103f433b7114bc9e8c43f6127ad7 +p3298 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g87 +sg37 +g88 +sa(dp3299 +g2 +Vac86ba81f5e78f5f58f5499ac7654015385afdb0 +p3300 +sg4 +g3022 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x122\x1d\x00\x00\x00' +p3301 +g9 +(g10 +g11 +g11 +(tRp3302 +tp3303 +Rp3304 +(dp3305 +g16 +g17 +(I0 +I28800 +I0 +tp3306 +Rp3307 +sg20 +Nsbtp3308 +Rp3309 +sg23 +Vfix get cookie +p3310 +sg25 +g85 +sg27 +Vhttp://code.dapps.douban.com/django-dae-auth/commit/ac86ba81f5e78f5f58f5499ac7654015385afdb0 +p3311 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g87 +sg37 +g3034 +sa(dp3312 +g2 +V6eaff83842041b7acd5ce279563add52e5f57143 +p3313 +sg4 +g716 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x121\x00\x00\x00\x00' +p3314 +g9 +(g10 +g11 +g11 +(tRp3315 +tp3316 +Rp3317 +(dp3318 +g16 +g17 +(I0 +I28800 +I0 +tp3319 +Rp3320 +sg20 +Nsbtp3321 +Rp3322 +sg23 +Vbugfix +p3323 +sg25 +g727 +sg27 +Vhttp://code.dapps.douban.com/mario/commit/6eaff83842041b7acd5ce279563add52e5f57143 +p3324 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g729 +sg37 +g730 +sa(dp3325 +g2 +Vdbd60132553833a925cc6f47549085d22ae69f83 +p3326 +sg4 +g74 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x12/"\x00\x00\x00' +p3327 +g9 +(g10 +g11 +g11 +(tRp3328 +tp3329 +Rp3330 +(dp3331 +g16 +g17 +(I0 +I28800 +I0 +tp3332 +Rp3333 +sg20 +Nsbtp3334 +Rp3335 +sg23 +Vusing new version of django-dae-auth +p3336 +sg25 +g85 +sg27 +Vhttp://code.dapps.douban.com/blackpit/commit/dbd60132553833a925cc6f47549085d22ae69f83 +p3337 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g87 +sg37 +g88 +sa(dp3338 +g90 +g91 +sg43 +Vpullrequest-code-596-merged +p3339 +sg93 +g94 +sg95 +g2372 +sg97 +g54 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x12-(\x03\xc1\xfd' +p3340 +tp3341 +Rp3342 +sg101 +VRT\uff0cpls merge\uff0cthnx\uff01 +p3343 +sg103 +V\u56de\u6edatimeline\u6a21\u677f\u4fee\u6539 +p3344 +sg27 +V/code/newpull/596 +p3345 +sg106 +g2220 +sg29 +g107 +sa(dp3346 +g2 +V7d46dfec64d0851ee2a39e6edd6f3534086a8995 +p3347 +sg4 +g110 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x12-%\x00\x00\x00' +p3348 +g9 +(g10 +g11 +g11 +(tRp3349 +tp3350 +Rp3351 +(dp3352 +g16 +g17 +(I0 +I28800 +I0 +tp3353 +Rp3354 +sg20 +Nsbtp3355 +Rp3356 +sg23 +VMerge pull request #596 from code_zc:ptlissue\u000a \u000a \u56de\u6edatimeline\u6a21\u677f\u4fee\u6539 +p3357 +sg25 +g94 +sg27 +Vhttp://code.dapps.douban.com/code/commit/7d46dfec64d0851ee2a39e6edd6f3534086a8995 +p3358 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g122 +sg37 +g123 +sa(dp3359 +g90 +g359 +sg43 +Vpullrequest-code-341-unmerge +p3360 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x12,\t\x03\x93q' +p3361 +tp3362 +Rp3363 +sg95 +g2372 +sg97 +g54 +sg93 +g94 +sg101 +g3343 +sg103 +g3344 +sg27 +g3345 +sg106 +g2220 +sg29 +g107 +sa(dp3364 +g2 +V13541d28180e91d196819d73135f7d427402b957 +p3365 +sg4 +g2328 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x12*:\x00\x00\x00' +p3366 +g9 +(g10 +g11 +g11 +(tRp3367 +tp3368 +Rp3369 +(dp3370 +g16 +g17 +(I0 +I28800 +I0 +tp3371 +Rp3372 +sg20 +Nsbtp3373 +Rp3374 +sg23 +VMerge branch 'master' of http://code.dapps.douban.com/code into hide-delbtn +p3375 +sg25 +g2220 +sg27 +Vhttp://code.dapps.douban.com/code_zc/commit/13541d28180e91d196819d73135f7d427402b957 +p3376 +sg29 +g30 +sg31 +g3112 +sg33 +g3113 +sg35 +g2339 +sg37 +g2340 +sa(dp3377 +g2 +Ve629cb4ce252211cf29a2ba4e16a33fae32328c0 +p3378 +sg4 +g2328 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x12*2\x00\x00\x00' +p3379 +g9 +(g10 +g11 +g11 +(tRp3380 +tp3381 +Rp3382 +(dp3383 +g16 +g17 +(I0 +I28800 +I0 +tp3384 +Rp3385 +sg20 +Nsbtp3386 +Rp3387 +sg23 +Vrollback +p3388 +sg25 +g2220 +sg27 +Vhttp://code.dapps.douban.com/code_zc/commit/e629cb4ce252211cf29a2ba4e16a33fae32328c0 +p3389 +sg29 +g30 +sg31 +g3112 +sg33 +g3113 +sg35 +g2339 +sg37 +g2340 +sa(dp3390 +g2 +V6f94470bb666ccf224a4b31cc78f7cb56d9ba9b6 +p3391 +sg4 +g74 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x12("\x00\x00\x00' +p3392 +g9 +(g10 +g11 +g11 +(tRp3393 +tp3394 +Rp3395 +(dp3396 +g16 +g17 +(I0 +I28800 +I0 +tp3397 +Rp3398 +sg20 +Nsbtp3399 +Rp3400 +sg23 +Vupdate settings +p3401 +sg25 +g85 +sg27 +Vhttp://code.dapps.douban.com/blackpit/commit/6f94470bb666ccf224a4b31cc78f7cb56d9ba9b6 +p3402 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g87 +sg37 +g88 +sa(dp3403 +g6 +g7 +(S'\x07\xdc\x0c\x18\x12$"\n_g' +p3404 +tp3405 +Rp3406 +sg43 +Vnewcodereview-Aglarond-10-426 +p3407 +sg25 +S'momo' +p3408 +sg27 +V/Aglarond/newpull/10#comment-426 +p3409 +sg47 +V\u5df2\u90e8\u7f72~\u611f\u8c22~ +p3410 +sg49 +L10L +sg50 +Vliuyue +p3411 +sg29 +g52 +sg53 +VAglarond:master +p3412 +sa(dp3413 +g2 +V1894d7fb6846e25a140b4cb65866c3b7f6c7776e +p3414 +sg4 +g2238 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x12#\x0b\x00\x00\x00' +p3415 +g9 +(g10 +g11 +g11 +(tRp3416 +tp3417 +Rp3418 +(dp3419 +g16 +g17 +(I0 +I28800 +I0 +tp3420 +Rp3421 +sg20 +Nsbtp3422 +Rp3423 +sg23 +g2248 +sg25 +g614 +sg27 +Vhttp://code.dapps.douban.com/code_gist/commit/1894d7fb6846e25a140b4cb65866c3b7f6c7776e +p3424 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g2250 +sg37 +g2251 +sa(dp3425 +g2 +V3a6d862f9ffc717000494f12e038e4612ef24017 +p3426 +sg4 +g3022 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x12"#\x00\x00\x00' +p3427 +g9 +(g10 +g11 +g11 +(tRp3428 +tp3429 +Rp3430 +(dp3431 +g16 +g17 +(I0 +I28800 +I0 +tp3432 +Rp3433 +sg20 +Nsbtp3434 +Rp3435 +sg23 +Vrefine DAEShireAccountMiddleware +p3436 +sg25 +g85 +sg27 +Vhttp://code.dapps.douban.com/django-dae-auth/commit/3a6d862f9ffc717000494f12e038e4612ef24017 +p3437 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g87 +sg37 +g3034 +sa(dp3438 +g2 +V1db102287efb7605539f83abfef4c07c66a78998 +p3439 +sg4 +g2238 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x12!!\x00\x00\x00' +p3440 +g9 +(g10 +g11 +g11 +(tRp3441 +tp3442 +Rp3443 +(dp3444 +g16 +g17 +(I0 +I28800 +I0 +tp3445 +Rp3446 +sg20 +Nsbtp3447 +Rp3448 +sg23 +VGist \u6dfb\u52a0\u6743\u9650\u63a7\u5236 +p3449 +sg25 +g614 +sg27 +Vhttp://code.dapps.douban.com/code_gist/commit/1db102287efb7605539f83abfef4c07c66a78998 +p3450 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g2250 +sg37 +g2251 +sa(dp3451 +g2 +Vf5e31b080b0e5b776c042983ce14802967592dde +p3452 +sg4 +g2238 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x12!!\x00\x00\x00' +p3453 +g9 +(g10 +g11 +g11 +(tRp3454 +tp3455 +Rp3456 +(dp3457 +g16 +g17 +(I0 +I28800 +I0 +tp3458 +Rp3459 +sg20 +Nsbtp3460 +Rp3461 +sg23 +g3449 +sg25 +g614 +sg27 +Vhttp://code.dapps.douban.com/code_gist/commit/f5e31b080b0e5b776c042983ce14802967592dde +p3462 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g2250 +sg37 +g2251 +sa(dp3463 +g90 +g91 +sg43 +Vpullrequest-code-595-merged +p3464 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x12!\x05\rO\x90' +p3465 +tp3466 +Rp3467 +sg95 +g2372 +sg97 +g54 +sg93 +g94 +sg101 +V\u539f\u56e0\u662f\u4e4b\u524d\u7684\u5e7f\u64ad\u5c55\u793a\u65f6\u5148\u6309\u65e5\u671f\u6392\u5e8f\uff0c\u7136\u540e\u56e0\u4e3a\u9632\u6b62\u663e\u793a\u8fc7\u591a\uff0c\u505a\u4e86\u4e2a\u622a\u65ad\uff0c\u505a\u622a\u65ad\u65f6\u6ca1\u6709\u6309\u7167\u65f6\u95f4\u6392\u5e8f\uff0c\u5bfc\u81f4\u5f53\u4e00\u5929\u7684\u5e7f\u64ad\u8d85\u8fc7\u622a\u65ad\u6570\u65f6\uff0c\u56de\u51fa\u73b0\u6700\u65b0\u7684\u5e7f\u64ad\u88ab\u4e22\u6389\u7684\u95ee\u9898\u3002 \u000a \u000aPls review and merge, thnx! +p3468 +sg103 +V\u89e3\u51b3public timeline\u663e\u793a\u4e0d\u5168\u95ee\u9898 +p3469 +sg27 +V/code/newpull/595 +p3470 +sg106 +g2220 +sg29 +g107 +sa(dp3471 +g2 +V395bfa07e210aca44ce8e9cf39ec01b81bf63311 +p3472 +sg4 +g110 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x12!\x03\x00\x00\x00' +p3473 +g9 +(g10 +g11 +g11 +(tRp3474 +tp3475 +Rp3476 +(dp3477 +g16 +g17 +(I0 +I28800 +I0 +tp3478 +Rp3479 +sg20 +Nsbtp3480 +Rp3481 +sg23 +VMerge pull request #595 from code_zc:ptlissue\u000a \u000a \u89e3\u51b3public timeline\u663e\u793a\u4e0d\u5168\u95ee\u9898 +p3482 +sg25 +g94 +sg27 +Vhttp://code.dapps.douban.com/code/commit/395bfa07e210aca44ce8e9cf39ec01b81bf63311 +p3483 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g122 +sg37 +g123 +sa(dp3484 +g90 +g91 +sg43 +Vpullrequest-Aglarond-10-merged +p3485 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x12\x1f\x16\x04\xa1z' +p3486 +tp3487 +Rp3488 +sg95 +Vliuyue_Aglarond:master +p3489 +sg97 +g3412 +sg93 +g2589 +sg101 +V\u5982\u9898. +p3490 +sg103 +V\u600e\u4e48\u53ef\u4ee5\u6ca1\u6709\u94fe\u63a5\u67e5\u770b\u5927\u56fe +p3491 +sg27 +V/Aglarond/newpull/10 +p3492 +sg106 +g3411 +sg29 +g107 +sa(dp3493 +g2 +V5ba9573cd77cfe61e8f2d00a9813a9e30451283c +p3494 +sg4 +Vhttp://code.dapps.douban.com/Aglarond +p3495 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x12\x1f\x12\x00\x00\x00' +p3496 +g9 +(g10 +g11 +g11 +(tRp3497 +tp3498 +Rp3499 +(dp3500 +g16 +g17 +(I0 +I28800 +I0 +tp3501 +Rp3502 +sg20 +Nsbtp3503 +Rp3504 +sg23 +VMerge pull request #10 from liuyue_Aglarond:master\u000a \u000a \u94fe\u63a5\u67e5\u770b\u5927\u56fe +p3505 +sg25 +g2589 +sg27 +Vhttp://code.dapps.douban.com/Aglarond/commit/5ba9573cd77cfe61e8f2d00a9813a9e30451283c +p3506 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g2591 +sg37 +VAglarond +p3507 +sa(dp3508 +g90 +g359 +sg43 +Vpullrequest-Aglarond-340-unmerge +p3509 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x12\x1d+\x0eG\xc8' +p3510 +tp3511 +Rp3512 +sg95 +g3489 +sg97 +g3412 +sg93 +g2589 +sg101 +g3490 +sg103 +g3491 +sg27 +g3492 +sg106 +g3411 +sg29 +g107 +sa(dp3513 +g2 +V48adc3e0f3d48fc7b8069fa52e47684ad3c0026e +p3514 +sg4 +g3005 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x12\x1c\x1d\x00\x00\x00' +p3515 +g9 +(g10 +g11 +g11 +(tRp3516 +tp3517 +Rp3518 +(dp3519 +g16 +g17 +(I0 +I28800 +I0 +tp3520 +Rp3521 +sg20 +Nsbtp3522 +Rp3523 +sg23 +Vconditional events bug fix && test complement +p3524 +sg25 +g3016 +sg27 +Vhttp://code.dapps.douban.com/Ringwraiths/commit/48adc3e0f3d48fc7b8069fa52e47684ad3c0026e +p3525 +sg29 +g30 +sg31 +g32 +sg33 +g34 +sg35 +g3018 +sg37 +g3019 +sa(dp3526 +g2 +Vfa02a0abb131994e20de8fd2fa93ffe0f36e6e3a +p3527 +sg4 +Vhttp://code.dapps.douban.com/liuyue_Aglarond +p3528 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x12\x1b#\x00\x00\x00' +p3529 +g9 +(g10 +g11 +g11 +(tRp3530 +tp3531 +Rp3532 +(dp3533 +g16 +g17 +(I0 +I28800 +I0 +tp3534 +Rp3535 +sg20 +Nsbtp3536 +Rp3537 +sg23 +VViewing full-sized photo made easy +p3538 +sg25 +g3411 +sg27 +Vhttp://code.dapps.douban.com/liuyue_Aglarond/commit/fa02a0abb131994e20de8fd2fa93ffe0f36e6e3a +p3539 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +Vliuyue@douban.com +p3540 +sg37 +Vliuyue_Aglarond +p3541 +sa(dp3542 +g2 +V8bbae4f102847c5faa98a808f2b9fc1148ae755b +p3543 +sg4 +g2522 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x12\x1a\x18\x00\x00\x00' +p3544 +g9 +(g10 +g11 +g11 +(tRp3545 +tp3546 +Rp3547 +(dp3548 +g16 +g17 +(I0 +I28800 +I0 +tp3549 +Rp3550 +sg20 +Nsbtp3551 +Rp3552 +sg23 +Vadd type into event json +p3553 +sg25 +g1163 +sg27 +Vhttp://code.dapps.douban.com/erebor_ianoshen/commit/8bbae4f102847c5faa98a808f2b9fc1148ae755b +p3554 +sg29 +g30 +sg31 +g2535 +sg33 +g2534 +sg35 +g1425 +sg37 +g2536 +sa(dp3555 +g2 +V6cd84346ede36c1a7cbdd8de508f2c744756c8db +p3556 +sg4 +g1081 +sg6 +g7 +(S'\x07\xdc\x0c\x18\x12\x18\x0e\x00\x00\x00' +p3557 +g9 +(g10 +g11 +g11 +(tRp3558 +tp3559 +Rp3560 +(dp3561 +g16 +g17 +(I0 +I28800 +I0 +tp3562 +Rp3563 +sg20 +Nsbtp3564 +Rp3565 +sg23 +Vfix ad unit page chart problem +p3566 +sg25 +g1076 +sg27 +Vhttp://code.dapps.douban.com/smaug/commit/6cd84346ede36c1a7cbdd8de508f2c744756c8db +p3567 +sg33 +g34 +sg31 +g32 +sg29 +g30 +sg35 +g1093 +sg37 +g1094 +sa. \ No newline at end of file diff --git a/tests/issues/__init__.py b/tests/issues/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/issues/test_issue.py b/tests/issues/test_issue.py new file mode 100644 index 0000000..6f9807e --- /dev/null +++ b/tests/issues/test_issue.py @@ -0,0 +1,126 @@ +# encoding: UTF-8 + +from tests.base import TestCase + +from vilya.models.issue import Issue +from vilya.models.issue_comment import IssueComment + + +class TestIssue(TestCase): + + def test_add_issue(self): + i = Issue.add('test', 'test description', 'test', 'assignee') + assert isinstance(i, Issue) + assert i.title == 'test' + assert i.description == 'test description' + assert i.creator_id == 'test' + assert i.assignee_id == 'assignee' + + def test_update_issue(self): + i = Issue.add('test', 'test description', 'test', 'assignee') + i.update("test1", "test1 description") + i = Issue.get(i.id) + assert i.title == 'test1' + assert i.description == 'test1 description' + assert i.creator_id == 'test' + assert i.assignee_id == 'assignee' + assert i.closer_id is None + + def test_close_issue(self): + i = Issue.add('test', 'test description', 'test', 'assignee') + i.close("test") + i = Issue.get(i.id) + assert i.title == 'test' + assert i.description == 'test description' + assert i.creator_id == 'test' + assert i.closer_id == "test" + assert i.assignee_id == 'assignee' + + def test_get_issue(self): + + issue1 = Issue.add('test1', 'test1 description', 'test', 'assignee') + issue2 = Issue.add('test2', 'test2 description', 'test', 'assignee') + issue2.close("test") + + i1 = Issue.get(issue1.id) + assert isinstance(i1, Issue) + assert i1.title == 'test1' + assert i1.description == 'test1 description' + assert i1.creator_id == 'test' + assert i1.assignee_id == 'assignee' + assert i1.closer_id is None + + i2 = Issue.get(issue2.id) + assert isinstance(i2, Issue) + assert i2.title == 'test2' + assert i2.description == 'test2 description' + assert i2.creator_id == 'test' + assert i2.assignee_id == 'assignee' + assert i2.closer_id == 'test' + + i1 = Issue.get(issue1.id) + assert isinstance(i1, Issue) + assert i1.title == 'test1' + assert i1.description == 'test1 description' + assert i1.creator_id == 'test' + assert i1.assignee_id == 'assignee' + assert i1.closer_id is None + + iss = Issue.gets_by_creator_id("test") + assert all([isinstance(i, Issue) for i in iss]) + assert len(iss) == 4 + + iss = Issue.gets_by_creator_id("test", "open") + assert all([isinstance(i, Issue) for i in iss]) + assert len(iss) == 4 + + iss = Issue.gets_by_creator_id("test", "closed") + assert all([isinstance(i, Issue) for i in iss]) + assert len(iss) == 2 + + iss = Issue.gets_by_assignee_id("assignee") + assert all([isinstance(i, Issue) for i in iss]) + assert len(iss) == 6 + + iss = Issue.gets_by_assignee_id("assignee", "open") + assert all([isinstance(i, Issue) for i in iss]) + assert len(iss) == 4 + + iss = Issue.gets_by_assignee_id("assignee", "closed") + assert all([isinstance(i, Issue) for i in iss]) + assert len(iss) == 2 + + iss = Issue.gets_by_closer_id("test") + assert all([isinstance(i, Issue) for i in iss]) + assert len(iss) == 2 + + def test_add_comment(self): + i = Issue.add('test', 'test description', 'test', 'assignee') + c = IssueComment.add(i.id, 'content', 'test') + assert isinstance(c, IssueComment) + assert c.issue_id == i.id + assert c.content == 'content' + assert c.author_id == 'test' + + def test_get_comment(self): + i = Issue.add('test', 'test description', 'test', 'assignee') + c = IssueComment.add(i.id, 'content', 'test') + c = IssueComment.get(c.id) + assert isinstance(c, IssueComment) + assert c.issue_id == i.id + assert c.content == 'content' + assert c.author_id == 'test' + + c = IssueComment.add(i.id, 'content', 'test') + cs = IssueComment.gets_by_issue_id(i.id) + assert all([isinstance(t, IssueComment) for t in cs]) + assert len(cs) == 2 + + def test_update_comment(self): + i = Issue.add('test', 'test description', 'test', 'assignee') + c = IssueComment.add(i.id, 'content', 'test') + c.update('content1') + c = IssueComment.get(c.id) + assert c.issue_id == i.id + assert c.content == 'content1' + assert c.author_id == 'test' diff --git a/tests/issues/test_issue_milestone.py b/tests/issues/test_issue_milestone.py new file mode 100644 index 0000000..1cddfc0 --- /dev/null +++ b/tests/issues/test_issue_milestone.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- + +from tests.base import TestCase +from tests.utils import get_temp_project +from vilya.models.project_issue import ProjectIssue +from vilya.models.milestone import Milestone +from vilya.models.issue_milestone import IssueMilestone + + +# User mock +class User(object): + + def __init__(self, name): + self.name = name + + +class TestIssueMilestone(TestCase): + + def setUp(self): + super(TestCase, self).setUp() + self.project = get_temp_project() + self.issue = ProjectIssue.add('test', + 'test description', + 'test', + project=self.project.id) + user = User('testuser') + project = self.project + name = "Test Milestone 1" + ms = Milestone.create_by_project(project, name, user) + self.milestone = ms + + def tearDown(self): + self.milestone.delete() + self.project.delete() + super(TestCase, self).tearDown() + + def test_add_issue_milestone(self): + issue = self.issue + milestone = self.milestone + user = User('testuser') + ims = IssueMilestone.create_by_issue(issue, milestone, user) + self.assertEqual(ims.milestone_id, milestone.id) + self.assertEqual(int(ims.issue_id), issue.issue_id) + + def test_get_issue_milestone(self): + issue = self.issue + milestone = self.milestone + user = User('testuser') + ims1 = IssueMilestone.create_by_issue(issue, milestone, user) + ims = IssueMilestone.get_by_issue(issue) + self.assertEqual(ims.id, ims1.id) + self.assertEqual(ims.issue_id, ims1.issue_id) + self.assertEqual(ims.milestone_id, ims1.milestone_id) + self.assertEqual(ims.creator_id, ims1.creator_id) + + def test_get_milestone(self): + issue = self.issue + milestone = self.milestone + user = User('testuser') + ims = IssueMilestone.create_by_issue(issue, milestone, user) + ms = ims.milestone + self.assertEqual(ms.id, milestone.id) + self.assertEqual(ms.target_id, milestone.target_id) + self.assertEqual(ms.target_type, milestone.target_type) + self.assertEqual(ms.target_number, milestone.target_number) + self.assertEqual(ms.creator_id, milestone.creator_id) diff --git a/tests/issues/test_issue_upvote.py b/tests/issues/test_issue_upvote.py new file mode 100644 index 0000000..30f8064 --- /dev/null +++ b/tests/issues/test_issue_upvote.py @@ -0,0 +1,114 @@ +# encoding: UTF-8 + +from tests.base import TestCase + +from vilya.models.issue import Issue +from vilya.models.team_issue import TeamIssue +from vilya.models.project_issue import ProjectIssue + + +class TestIssueUpvote(TestCase): + + def setUp(self): + TestCase.setUp(self) + self.testuser1 = 'testuser1' + self.testuser2 = 'testuser2' + self.testuser3 = 'testuser3' + self.test_team_issue = TeamIssue.add('test', 'test description', + self.testuser1, team=1) + self.test_project_issue = ProjectIssue.add( + 'test', 'test description', self.testuser1, project=1) + + def test_vote_and_unvote_team_issue(self): + assert self.test_team_issue.vote_count == 0 + count = self.test_team_issue.upvote_by_user(self.testuser2) + assert count == 1 + assert self.test_team_issue.vote_count == 1 + # 同一用户upvote两次,vote数不会增加 + count = self.test_team_issue.upvote_by_user(self.testuser2) + assert count == 1 + assert self.test_team_issue.vote_count == 1 + count = self.test_team_issue.upvote_by_user(self.testuser3) + assert count == 2 + assert self.test_team_issue.vote_count == 2 + count = self.test_team_issue.cancel_upvote_by_user(self.testuser2) + assert count == 1 + assert self.test_team_issue.vote_count == 1 + # 同一用户取消vote两次,vote数不会减少 + count = self.test_team_issue.cancel_upvote_by_user(self.testuser2) + assert count == 1 + assert self.test_team_issue.vote_count == 1 + count = self.test_team_issue.cancel_upvote_by_user(self.testuser3) + assert count == 0 + assert self.test_team_issue.vote_count == 0 + + def test_vote_and_unvote_project_issue(self): + assert self.test_project_issue.vote_count == 0 + count = self.test_project_issue.upvote_by_user(self.testuser2) + assert count == 1 + assert self.test_project_issue.vote_count == 1 + # 同一用户upvote两次,vote数不会增加 + count = self.test_project_issue.upvote_by_user(self.testuser2) + assert count == 1 + assert self.test_project_issue.vote_count == 1 + count = self.test_project_issue.upvote_by_user(self.testuser3) + assert count == 2 + assert self.test_project_issue.vote_count == 2 + count = self.test_project_issue.cancel_upvote_by_user(self.testuser2) + assert count == 1 + assert self.test_project_issue.vote_count == 1 + # 同一用户取消vote两次,vote数不会减少 + count = self.test_project_issue.cancel_upvote_by_user(self.testuser2) + assert count == 1 + assert self.test_project_issue.vote_count == 1 + count = self.test_project_issue.cancel_upvote_by_user(self.testuser3) + assert count == 0 + assert self.test_project_issue.vote_count == 0 + + def test_team_issue_has_user_upvoted(self): + count = self.test_team_issue.upvote_by_user(self.testuser2) + assert count == 1 + assert self.test_team_issue.has_user_voted(self.testuser2) + assert not self.test_team_issue.has_user_voted(self.testuser1) + count = self.test_team_issue.cancel_upvote_by_user(self.testuser2) + assert count == 0 + assert not self.test_team_issue.has_user_voted(self.testuser2) + assert not self.test_team_issue.has_user_voted(self.testuser1) + + def test_project_issue_has_user_upvoted(self): + count = self.test_project_issue.upvote_by_user(self.testuser2) + assert count == 1 + assert self.test_project_issue.has_user_voted(self.testuser2) + assert not self.test_project_issue.has_user_voted(self.testuser1) + count = self.test_project_issue.cancel_upvote_by_user(self.testuser2) + assert count == 0 + assert not self.test_project_issue.has_user_voted(self.testuser2) + assert not self.test_project_issue.has_user_voted(self.testuser1) + + def test_creator_of_issue_should_not_vote_or_unvote(self): + count = self.test_team_issue.upvote_by_user(self.testuser1) + assert count == 0 + assert self.test_team_issue.vote_count == 0 + count = self.test_team_issue.cancel_upvote_by_user(self.testuser1) + assert count == 0 + assert self.test_team_issue.vote_count == 0 + + count = self.test_project_issue.upvote_by_user(self.testuser1) + assert count == 0 + assert self.test_project_issue.vote_count == 0 + count = self.test_project_issue.cancel_upvote_by_user(self.testuser1) + assert count == 0 + assert self.test_project_issue.vote_count == 0 + + def test_closed_issue_should_not_vote(self): + self.test_team_issue.close(self.testuser1) + self.test_team_issue = Issue.get_cached_issue( + self.test_team_issue.issue_id) + count = self.test_team_issue.upvote_by_user(self.testuser2) + assert count == 0 + + self.test_project_issue.close(self.testuser1) + self.test_project_issue = Issue.get_cached_issue( + self.test_project_issue.issue_id) + count = self.test_project_issue.upvote_by_user(self.testuser2) + assert count == 0 diff --git a/tests/issues/test_milestone.py b/tests/issues/test_milestone.py new file mode 100644 index 0000000..441a329 --- /dev/null +++ b/tests/issues/test_milestone.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- + +from tests.base import TestCase +from tests.utils import get_temp_project +from vilya.models.milestone import Milestone, PROJECT_MILESTONE_TYPE + + +# User mock +class User(object): + + def __init__(self, name): + self.name = name + + +class TestMilestone(TestCase): + + def setUp(self): + super(TestCase, self).setUp() + self.project = get_temp_project() + + def tearDown(self): + self.project.delete() + super(TestCase, self).tearDown() + + def test_add_milestone(self): + user = User('testuser') + project = self.project + name = "Test Milestone 1" + ms = Milestone.create_by_project(project, name, user) + self.assertEqual(ms.name, name) + self.assertEqual(int(ms.target_id), project.id) + self.assertEqual(int(ms.target_type), PROJECT_MILESTONE_TYPE) + self.assertEqual(ms.creator_id, user.name) + + def test_get_milestone(self): + user1 = User('testuser1') + user2 = User('testuser2') + project = self.project + name1 = "Test Milestone 1" + name2 = "Test Milestone 2" + ms1 = Milestone.create_by_project(project, name1, user1) + ms2 = Milestone.create_by_project(project, name2, user2) + + ms = Milestone.get_by_project(project, number=ms1.target_number) + self.assertEqual(ms.name, name1) + self.assertEqual(int(ms.target_id), project.id) + self.assertEqual(ms.id, ms1.id) + self.assertEqual(ms.target_number, ms1.target_number) + self.assertEqual(ms.creator_id, user1.name) + + ms = Milestone.get_by_project(project, name=name2) + self.assertEqual(ms.name, name2) + self.assertEqual(int(ms.target_id), project.id) + self.assertEqual(ms.id, ms2.id) + self.assertEqual(ms.target_number, ms2.target_number) + self.assertEqual(ms.creator_id, user2.name) diff --git a/tests/issues/test_participant.py b/tests/issues/test_participant.py new file mode 100644 index 0000000..5a6c5e3 --- /dev/null +++ b/tests/issues/test_participant.py @@ -0,0 +1,43 @@ +# encoding: UTF-8 + +from tests.base import TestCase + +from vilya.models.issue_participant import IssueParticipant + + +class TestIssueParticipant(TestCase): + + def test_add(self): + p = IssueParticipant.add(1, 'test1') + assert isinstance(p, IssueParticipant) + assert p.issue_id == 1 + assert p.user_id == 'test1' + p.delete() + + def ttest_get(self): # FIXME + p1 = IssueParticipant.add(1, 'test1') + p2 = IssueParticipant.add(2, 'test1') + p3 = IssueParticipant.add(3, 'test1') + p4 = IssueParticipant.add(1, 'test2') + + ps = IssueParticipant.gets_by_issue_id(1) + assert all([isinstance(_p, IssueParticipant) for _p in ps]) + assert len(ps) == 2 + + ps = IssueParticipant.gets_by_user_id('test1') + assert all([isinstance(_p, IssueParticipant) for _p in ps]) + assert len(ps) == 3 + + p = IssueParticipant.get_by_issue_id_and_user_id(1, 'test1') + assert isinstance(p, IssueParticipant) + assert p.issue_id == 1 + assert p.user_id == 'test1' + for p in [p1, p2, p3, p4]: + p.delete() + + def test_delete(self): + p = IssueParticipant.add(1, 'test2') + + p.delete() + p = IssueParticipant.get_by_issue_id_and_user_id(1, 'test2') + assert p is None diff --git a/tests/issues/test_project_issue.py b/tests/issues/test_project_issue.py new file mode 100644 index 0000000..a85984c --- /dev/null +++ b/tests/issues/test_project_issue.py @@ -0,0 +1,197 @@ +# encoding: UTF-8 + +from tests.base import TestCase + +from vilya.models.issue import Issue +from vilya.models.project_issue import ProjectIssue + + +class TestProjectIssue(TestCase): + + def test_add_issue(self): + p = ProjectIssue.add('test', 'test description', 'test', project=1) + assert isinstance(p, ProjectIssue) + assert p.title == 'test' + assert p.description == 'test description' + assert p.project_id == 1 + p.delete() + + def test_get_issue(self): + p = ProjectIssue.add('test', 'test description', 'test', project=1) + r = ProjectIssue.get(p.project_id, issue_id=p.issue_id) + assert isinstance(r, ProjectIssue) + assert r.project_id == 1 + + r = ProjectIssue.get(p.project_id, number=p.number) + assert isinstance(r, ProjectIssue) + assert r.project_id == 1 + + r = Issue.get_cached_issue(p.issue_id) + assert isinstance(r, ProjectIssue) + assert r.title == 'test' + assert r.description == 'test description' + assert r.project_id == 1 + + p2 = ProjectIssue.add( + 'test2', 'test2 description', 'test', project=1, + assignee='assignee') + p3 = ProjectIssue.add( + 'test3', 'test3 description', 'test', project=1, + assignee='assignee') + p4 = ProjectIssue.add( + 'test4', 'test4 description', 'test', project=1, assignee='test') + p5 = ProjectIssue.add( + 'test5', 'test5 description', 'test1', project=2, assignee='test') + + rs = ProjectIssue._gets_by_project_id(1) + assert len(rs) == 4 + + rs = ProjectIssue._get_issues_by_project_id(1) + assert all([isinstance(i, ProjectIssue) for i in rs]) + assert len(rs) == 4 + + rs = ProjectIssue.gets_by_assignee_id(1, 'assignee') + assert all([isinstance(i, ProjectIssue) for i in rs]) + assert len(rs) == 2 + + rs = ProjectIssue.gets_by_creator_id(1, 'test') + assert all([isinstance(i, ProjectIssue) for i in rs]) + assert len(rs) == 4 + + for p in [p, p2, p3, p4, p5]: + p.delete() + + def test_n_issue(self): + p1 = ProjectIssue.add( + 'test1', 'test1 description', 'test', project=1, + assignee='assignee') + p1.close('test') + p2 = ProjectIssue.add( + 'test2', 'test2 description', 'test', project=1, + assignee='assignee') + p2.close('test') + p3 = ProjectIssue.add( + 'test3', 'test3 description', 'test', project=1, + assignee='assignee') + p4 = ProjectIssue.add( + 'test4', 'test4 description', 'test', project=1, + assignee='test') + p5 = ProjectIssue.add( + 'test5', 'test5 description', 'test1', project=2, + assignee='test') + + count = ProjectIssue.get_count_by_project_id(1) + assert count == 4 + count = ProjectIssue.get_count_by_project_id(1, 'open') + assert count == 2 + count = ProjectIssue.get_count_by_project_id(1, 'closed') + assert count == 2 + + count = ProjectIssue.get_count_by_assignee_id(1, 'assignee') + assert count == 3 + count = ProjectIssue.get_count_by_assignee_id(1, 'assignee', 'open') + assert count == 1 + count = ProjectIssue.get_count_by_assignee_id(1, 'assignee', 'closed') + assert count == 2 + + count = ProjectIssue.get_count_by_creator_id(1, 'test') + assert count == 4 + count = ProjectIssue.get_count_by_creator_id(1, 'test', 'open') + assert count == 2 + count = ProjectIssue.get_count_by_creator_id(1, 'test', 'closed') + assert count == 2 + + r = ProjectIssue.get(p1.project_id, p1.issue_id) + assert isinstance(r, ProjectIssue) + assert r.n_closed_issues == 2 + assert r.n_open_issues == 2 + + for p in [p1, p2, p3, p4, p5]: + p.delete() + + def test_open_and_close_issue(self): + p1 = ProjectIssue.add('test1', 'test1 description', 'test', project=1) + p2 = ProjectIssue.add('test2', 'test2 description', 'test', project=1) + p3 = ProjectIssue.add('test3', 'test3 description', 'test', project=1) + + count = ProjectIssue.get_count_by_project_id(1) + assert count == 3 + p1.close('test') + count = ProjectIssue.get_count_by_project_id(1, 'open') + assert count == 2 + p1.open() + count = ProjectIssue.get_count_by_project_id(1, 'open') + assert count == 3 + + for p in [p1, p2, p3]: + p.delete() + + def test_add_tags(self): + target_id = project_id = 1 + p = ProjectIssue.add( + 'test', 'test description', 'test', project=project_id) + assert isinstance(p, ProjectIssue) + assert p.title == 'test' + assert p.description == 'test description' + assert p.project_id == 1 + + tags = ['tag1', 'tag2', 'tag3'] + + p.add_tags(tags, target_id) + assert len(p.tags) == len(tags) + + tag_names = [t.name for t in p.tags] + assert set(tags) & set(tag_names) == set(tags) + p.delete() + + def test_gets_by_issue_ids(self): + project_id = 1 + p = ProjectIssue.add( + 'test', 'test description', 'test', project=project_id) + assert isinstance(p, ProjectIssue) + assert p.title == 'test' + assert p.description == 'test description' + assert p.project_id == 1 + + project_issues = ProjectIssue._gets_by_issue_ids( + [p.issue_id], state=None) + assert len(project_issues) == 1 + pissue = project_issues[0] + assert isinstance(pissue, ProjectIssue) + assert pissue.project_id == project_id + + project_issues = ProjectIssue._gets_by_issue_ids( + [p.issue_id], state="open") + assert len(project_issues) == 1 + pissue = project_issues[0] + assert isinstance(pissue, ProjectIssue) + assert pissue.project_id == project_id + + project_issues = ProjectIssue._gets_by_issue_ids( + [p.issue_id], state="closed") + assert len(project_issues) == 0 + + pissue.close("test") + + project_issues = ProjectIssue._gets_by_issue_ids( + [p.issue_id], state="open") + assert len(project_issues) == 0 + + project_issues = ProjectIssue._gets_by_issue_ids( + [p.issue_id], state="closed") + assert len(project_issues) == 1 + pissue = project_issues[0] + assert isinstance(pissue, ProjectIssue) + assert pissue.project_id == project_id + p.delete() + + def test_gets_by_project_ids(self): + p1 = ProjectIssue.add('test1', 'desp', 'test', project=1) + p2 = ProjectIssue.add('test2', 'desp', 'test2', project=2) + p3 = ProjectIssue.add('test3', 'desp', 'test3', project=2) + + issues = ProjectIssue.gets_by_project_ids([1, 2]) + + assert len(issues), 3 + for p in [p1, p2, p3]: + p.delete() diff --git a/tests/issues/test_team_issue.py b/tests/issues/test_team_issue.py new file mode 100644 index 0000000..d3fca9e --- /dev/null +++ b/tests/issues/test_team_issue.py @@ -0,0 +1,26 @@ +# encoding: UTF-8 + +from tests.base import TestCase + +from vilya.models.team_issue import TeamIssue + + +class TestTeamIssue(TestCase): + + def test_add_issue(self): + t = TeamIssue.add('test', 'test description', 'test', team=1) + assert isinstance(t, TeamIssue) + assert t.title == 'test' + assert t.description == 'test description' + assert t.team_id == 1 + t.delete() + + def ttest_get_issue(self): # FIXME + TeamIssue.add('test1', 'test1 description', 'test', team=1) + TeamIssue.add('test2', 'test2 description', 'test', team=1) + TeamIssue.add('test3', 'test3 description', 'test', team=1) + TeamIssue.add('test4', 'test4 description', 'test', team=2) + + rs = TeamIssue.gets_by_target(1) + assert all([isinstance(i, TeamIssue) for i in rs]) + assert len(rs) == 3 diff --git a/tests/issues/test_user_issue.py b/tests/issues/test_user_issue.py new file mode 100644 index 0000000..6291857 --- /dev/null +++ b/tests/issues/test_user_issue.py @@ -0,0 +1,45 @@ +# encoding: UTF-8 + +from tests.base import TestCase + +from vilya.libs.store import store + +from vilya.models.user_issue import UserIssue +from vilya.models.project_issue import ProjectIssue + + +class TestUserIssue(TestCase): + def setUp(self): + super(TestCase, self).setUp() + self.clear() + + def tearDown(self): + self.clear() + super(TestCase, self).tearDown() + + def clear(self): + store.execute('delete from issues where 1=1') + store.execute('delete from project_issues where 1=1') + store.commit() + + def test_get_issue(self): + p1 = ProjectIssue.add('test1', 'test1 description', 'test', project=1, + assignee='assignee') + p1.close('test') + p2 = ProjectIssue.add('test2', 'test2 description', 'test', project=1, + assignee='assignee') + p2.close('test') + p3 = ProjectIssue.add('test3', 'test3 description', 'test', project=1, + assignee='assignee') + p4 = ProjectIssue.add('test4', 'test4 description', 'test', project=1, + assignee='test') + p5 = ProjectIssue.add('test5', 'test5 description', 'test1', project=2, + assignee='test') + + rs = UserIssue.gets_by_creator_id('test', state='open') + assert all([isinstance(i, ProjectIssue) for i in rs]) + assert len(rs) == 2 + + rs = UserIssue.gets_by_assignee_id('test', state='open') + assert all([isinstance(i, ProjectIssue) for i in rs]) + assert len(rs) == 2 diff --git a/tests/pulls/__init__.py b/tests/pulls/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/pulls/test_model.py b/tests/pulls/test_model.py new file mode 100644 index 0000000..09ca5d9 --- /dev/null +++ b/tests/pulls/test_model.py @@ -0,0 +1,114 @@ +# encoding: UTF-8 + +import os +from os.path import join +from contextlib import contextmanager + +from nose.tools import eq_, ok_ + +from vilya.models.pull import PullRequest +from vilya.libs import gyt +from tests.base import TestCase +from tests.utils import mkdtemp, chdir, clone, setup_repos, setup2repos +from vilya.models.user import User + + +class TestPullRequest(TestCase): + + def setUp(self): + TestCase.setUp(self) + + @contextmanager + def clone_clean(self, git_dir): + with mkdtemp() as work_path: + gyt.call(['git', 'clone', git_dir, work_path]) + assert os.path.exists(join(work_path, '.git')) + yield work_path + + def test_is_auto_mergable_should_not_commit_merge(self): + """调用 is_auto_mergable() 不应该导致仓库被 merge """ + with setup2repos('prj1') as \ + (path, repo, fork_path, fork_repo): + pullreq = PullRequest.open(fork_repo, 'master', repo, 'master') + ok_(pullreq.is_auto_mergable()) + + with self.clone_clean(path) as workdir: + assert not os.path.exists(join(workdir, 'a')) + + def test_conflict_detection(self): + """有冲突存在时,is_auto_mergable()应返回False""" + with mkdtemp() as tmpdir: + path, repo, fork_path, fork_repo = setup_repos( + tmpdir, 'test_conflict_detection') + + # make conflict changes + + with clone(path) as work_path: + with open(join(work_path, 'a'), 'w') as f: + f.write("asdf") + + with clone(fork_path) as work_path: + with open(join(work_path, 'a'), 'w') as f: + f.write("fdsa") + + # submit a pull request + + pullreq = PullRequest.open(fork_repo, 'master', repo, 'master') + assert not pullreq.is_auto_mergable() + # assure merge --abort + assert not os.path.exists(os.path.join(path, 'MERGE_MODE')) + + def test_merge(self): + """merge()应该将远程代码合并到bare仓库中""" + + with setup2repos('prj_merge') as (path, repo, fork_path, fork_repo): + + pullreq = PullRequest.open(fork_repo, 'master', repo, 'master') + u = User('testmerge') + pullreq.merge(u) + + with self.clone_clean(path) as work_path: + content = open(join(work_path, 'a')).read() + eq_(content, "a_hunk = [('idem', u'/* highlight style */'), ('rem', u'.highlight { color: #008000; font-weight: bold; } /* Keyword */'), ('add', u'.highlight .hll { background-color: #ffffcc; }'), ('add', u'.highlight { backggggground: #ffffff; }'), ('add', u'.high .c { color: #808080; } /* Coomment */'), ('add', u'.highlight .err { color: #F00000; background-color: #F00A0A0; } /* Error */'), ('add', u'.highlight .k { color: #008000; font-weight: bold; } /* Keyword */'), ('idem', u'.highlight .o { color: #303; } /* Operator ****/'), ('idem', u'.highlight .cm { color: #808080; } /* Comment.Multiline */'),('idem', u'adfadsfadsf'), ('idem', u'.highlight .cp { color: #507090; } /* Comment.Preproc */')]\n") # noqa + + def test_is_up_to_date(self): + """应该能探测是否是已经merge过的""" + with setup2repos('prj_uptodate') as (path, repo, fork_path, fork_repo): + + with self.clone_clean(path) as work_path: + with chdir(work_path): + gyt.call(['git', 'pull', fork_path]) + gyt.call(['git', 'push', 'origin', 'master']) + + pullreq = PullRequest.open(fork_repo, 'master', repo, 'master') + ok_(pullreq.is_up_to_date()) + + def test_get_commits(self): + """应该能够得到所有将合并的改动""" + with setup2repos('prj3') as (path, repo, fork_path, fork_repo): + + pullreq = PullRequest.open(fork_repo, 'master', repo, 'master') + commits = pullreq.commits + eq_(len(commits), 1) + + def test_get_diffs(self): + """应该能够得到所有将合并的diff""" + with setup2repos('prj4') as (path, repo, fork_path, fork_repo): + + # make some change in origin repo, too + with clone(path) as work_path: + with chdir(work_path): + with open('b', 'w') as f: + f.write('b') + + pullreq = PullRequest.open(fork_repo, 'master', repo, 'master') + diffs = pullreq.get_diff() + # should not contain file b in origin + eq_(diffs.length, 1) + + def test_get_merge_base(self): + """应该能够得到merge_base,即from_sha、to_sha的最近公共父commit sha""" + with setup2repos('prj5') as (path, repo, fork_path, fork_repo): + pullreq = PullRequest.open(fork_repo, 'master', repo, 'master') + merge_base = pullreq.merge_base + assert merge_base is not None diff --git a/tests/pulls/test_pullrequest.py b/tests/pulls/test_pullrequest.py new file mode 100644 index 0000000..2a337f1 --- /dev/null +++ b/tests/pulls/test_pullrequest.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- + +from tests.base import TestCase +from vilya.models.pull import PullRequest +from vilya.models.ticket import PRCounter, Ticket +from tests.utils import mkdtemp, setup_repos, delete_project + + +class PullRequestTest(TestCase): + + def setUp(self): + TestCase.setUp(self) + for name in ('testproject1', 'testproject2', 'testproject1_fork', + 'testproject2_fork'): + delete_project(name) + _, self.proj1, _, self.proj1_fork = setup_repos(mkdtemp(), + 'testproject1') + _, self.proj2, _, self.proj2_fork = setup_repos(mkdtemp(), + 'testproject2') + + def test_incr_counter(self): + count = PRCounter.incr(self.proj1.id) + assert count == 1 + count = PRCounter.incr(self.proj1.id) + assert count == 2 + count = PRCounter.incr(self.proj2.id) + assert count == 1 + + def test_pullrequest(self): + pullreq1 = PullRequest.open( + self.proj1_fork, 'master', self.proj1, 'master') + ticket1 = Ticket.add(self.proj1.id, 'title', 'content', 'testuser') + pullreq1.insert(ticket1.ticket_number) + + pullreq2 = PullRequest.open( + self.proj2_fork, 'master', self.proj2, 'master') + ticket2 = Ticket.add(self.proj2.id, 'title', 'content', 'testuser') + pullreq2.insert(ticket2.ticket_number) + + opened_prs = self.proj1_fork.open_parent_pulls + assert len(opened_prs) == 1 + + opened_prs = self.proj2_fork.open_parent_pulls + assert len(opened_prs) == 1 + + ticket1.close('testuser') + opened_prs = self.proj1_fork.open_parent_pulls + assert len(opened_prs) == 0 + + ticket2.close('testuser') + opened_prs = self.proj2_fork.open_parent_pulls + assert len(opened_prs) == 0 diff --git a/tests/pulls/test_ticket.py b/tests/pulls/test_ticket.py new file mode 100644 index 0000000..7e43f4e --- /dev/null +++ b/tests/pulls/test_ticket.py @@ -0,0 +1,224 @@ +# -*- coding: utf-8 -*- +from tests.base import TestCase +from vilya.models.pull import PullRequest +from vilya.models.ticket import Ticket, TicketComment +from vilya.models.linecomment import PullLineComment +from tests.utils import mkdtemp, setup_repos +from vilya.models.consts import LINECOMMENT_INDEX_EMPTY + + +class TicketTest(TestCase): + + def setUp(self): + TestCase.setUp(self) + _, self.proj1, _, self.proj1_fork = setup_repos( + mkdtemp(), 'testproject1') + _, self.proj2, _, self.proj2_fork = setup_repos( + mkdtemp(), 'testproject2') + + def test_ticket_gets_by_author(self): + title = 'test title' + desc = 'test desc' + author = 'testuser' + Ticket.add(self.proj1.id, title, desc, author) + assert Ticket.gets_by_author(author) != [] + + def test_ticket_gets_all_opened(self): + title = 'test title' + desc = 'test desc' + author = 'testuser' + Ticket.add(self.proj1.id, title, desc, author) + assert Ticket.gets_all_opened() != [] + + def test_ticket_gets_by_proj(self): + title = 'test title' + desc = 'test desc' + author = 'testuser' + Ticket.add(self.proj1.id, title, desc, author) + assert Ticket.gets_by_proj(self.proj1.id) + + def test_ticket_gets_by_proj_and_author(self): + title = 'test title' + desc = 'test desc' + author = 'testuser' + Ticket.add(self.proj1.id, title, desc, author) + assert Ticket.gets_by_proj_and_author(self.proj1.id, author) + assert not Ticket.gets_by_proj_and_author( + self.proj1.id, author='anonuser') + + def test_ticket(self): + title = 'test title' + desc = 'test desc' + author = 'testuser' + p1_t1 = Ticket.add(self.proj1.id, title, desc, author) + pullreq1 = PullRequest.open( + self.proj1_fork, 'master', self.proj1, 'master') + pullreq1 = pullreq1.insert(p1_t1.ticket_number) + assert p1_t1.ticket_id == 1 + assert p1_t1.title == title + assert p1_t1.description == desc + assert p1_t1.author == author + p2_t1 = Ticket.add(self.proj2.id, title, desc, author) + pullreq2 = PullRequest.open( + self.proj2_fork, 'master', self.proj2, 'master') + pullreq2 = pullreq2.insert(p2_t1.ticket_number) + assert p2_t1.ticket_id == 1 + ticket = Ticket.get_by_projectid_and_ticketnumber( + self.proj1.id, p1_t1.ticket_id) + assert ticket.id == p1_t1.id + ticket = Ticket.get_by_projectid_and_ticketnumber( + self.proj2.id, p2_t1.ticket_id) + assert ticket.id == p2_t1.id + + def test_ticket_commit(self): + title = 'test title' + desc = 'test desc' + author = 'testuser' + p1_t1 = Ticket.add(self.proj1.id, title, desc, author) + pullreq1 = PullRequest.open( + self.proj1_fork, 'master', self.proj1, 'master') + pullreq1 = pullreq1.insert(p1_t1.ticket_number) + + # ticket commits + commits_value = '454418c61cd7ef1a65818121746b45064a5af5d6,454418c61cd7ef1a65818121746b45064a5af574' # noqa + p1_t1.add_commits(commits_value, author) + commits = p1_t1.get_commits() + assert len(commits) == 1 + assert commits[0].commits == commits_value + + def test_ticket_comment(self): + title = 'test title' + desc = 'test desc' + author = 'testuser' + p1_t1 = Ticket.add(self.proj1.id, title, desc, author) + pullreq1 = PullRequest.open( + self.proj1_fork, 'master', self.proj1, 'master') + pullreq1 = pullreq1.insert(p1_t1.ticket_number) + + # add ticket comment + comment = p1_t1.add_comment('comment contet', author) + assert comment is not None + + # update ticket_comment + assert comment.content == 'comment contet' + comment.update('comment content updated') + comment = TicketComment.get(id=comment.id) + assert comment.content == 'comment content updated' + + # delete ticket_comment + assert len(TicketComment.gets_by_ticketid(p1_t1.id)) == 1 + comment.delete() + assert TicketComment.gets_by_ticketid(p1_t1.id) == [] + + # 重构后修改 + def test_ticket_code_review(self): + title = 'test title' + desc = 'test desc' + author = 'testuser' + p1_t1 = Ticket.add(self.proj1.id, title, desc, author) + pullreq1 = PullRequest.open( + self.proj1_fork, 'master', self.proj1, 'master') + pullreq1 = pullreq1.insert(p1_t1.ticket_number) + + # ticket code review + path = '/README.md' + #position = 10 + from_sha = '454418c61cd7ef1a65818121746b45064a5af5d6' + oid = '454418c61cd7ef1a65818121746b45064a5af5d6' + codereview = p1_t1.add_codereview( + from_sha, '', path, path, oid, oid, LINECOMMENT_INDEX_EMPTY, + LINECOMMENT_INDEX_EMPTY, author, 'comment content') + assert codereview.ticket_id == p1_t1.id + assert codereview.path == path + assert codereview.from_sha == from_sha + + # test update content + assert codereview.content == 'comment content' + codereview.update('content updated') + codereview = PullLineComment.get(codereview.id) + assert codereview.content == 'content updated' + + codereviews = PullLineComment.gets_by_target_and_ref( + p1_t1.id, from_sha) + assert len(codereviews) == 1 + p1_t1.add_codereview( + from_sha, '', path, path, oid, oid, LINECOMMENT_INDEX_EMPTY, + LINECOMMENT_INDEX_EMPTY, author, 'another comment content') + codereviews = PullLineComment.gets_by_target_and_ref( + p1_t1.id, from_sha) + assert len(codereviews) == 2 + + # test delete comment + codereview.delete() + codereviews = PullLineComment.gets_by_target_and_ref( + p1_t1.id, from_sha) + assert len(codereviews) == 1 + + def test_ticket_close(self): + # close ticket + title = 'test title' + desc = 'test desc' + author = 'testuser' + + p2_t1 = Ticket.add(self.proj2.id, title, desc, author) + pullreq2 = PullRequest.open( + self.proj2_fork, 'master', self.proj2, 'master') + pullreq2 = pullreq2.insert(p2_t1.ticket_number) + + assert p2_t1.closed is None + p2_t1.close('testuser') + assert Ticket.get(p2_t1.id).closed is not None + + def test_ticket_participants(self): + # test participants + title = 'test title' + desc = 'test desc' + author = 'testuser' + + p1_t2 = Ticket.add(self.proj1.id, title, desc, author) + pullreq = PullRequest.open( + self.proj1_fork, 'master', self.proj1, 'master') + pullreq = pullreq.insert(p1_t2.ticket_number) + assert len(p1_t2.participants) == 1 + assert p1_t2.participants[0] == author + + user2 = 'testuser2' + p1_t2.add_comment('comment contet', user2) + assert len(p1_t2.participants) == 2 + assert p1_t2.participants[0] == author + assert p1_t2.participants[1] == user2 + + def test_ticket_count(self): + title = 'test title' + desc = 'test desc' + author = 'testuser' + + p1_t1 = Ticket.add(self.proj1.id, title, desc, author) + pullreq1 = PullRequest.open( + self.proj1_fork, 'master', self.proj1, 'master') + pullreq1 = pullreq1.insert(p1_t1.ticket_number) + + p1_t2 = Ticket.add(self.proj1.id, title, desc, author) + pullreq = PullRequest.open( + self.proj1_fork, 'master', self.proj1, 'master') + pullreq = pullreq.insert(p1_t2.ticket_number) + + # test ticket count + assert int(Ticket.get_count_by_proj(self.proj1.id)) == 2 + + def test_ticket_update_desc(self): + title = 'test title' + desc = 'test desc' + author = 'testuser' + + p1_t2 = Ticket.add(self.proj1.id, title, desc, author) + pullreq = PullRequest.open( + self.proj1_fork, 'master', self.proj1, 'master') + pullreq = pullreq.insert(p1_t2.ticket_number) + + new_title = 'this is new title' + new_desc = 'this is new desc!' + p1_t2.update(new_title, new_desc) + p1_t2 = Ticket.get(p1_t2.id) + assert p1_t2.title == new_title + assert p1_t2.description == new_desc diff --git a/tests/pulls/test_ticket_node.py b/tests/pulls/test_ticket_node.py new file mode 100644 index 0000000..3004fe0 --- /dev/null +++ b/tests/pulls/test_ticket_node.py @@ -0,0 +1,178 @@ +# -*- coding: utf-8 -*- + +from datetime import datetime, timedelta + +from tests.base import TestCase +from vilya.models.consts import ( + TICKET_NODE_TYPE_OPEN, + TICKET_NODE_TYPE_CLOSE, + TICKET_NODE_TYPE_MERGE, + TICKET_NODE_TYPE_COMMIT, + TICKET_NODE_TYPE_COMMENT, + TICKET_NODE_TYPE_LINECOMMENT) +from vilya.models.ticket import Ticket, TicketRank, TicketNode +from vilya.libs.store import store + + +class TicketNodeTest(TestCase): + + def test_add(self): + type = TICKET_NODE_TYPE_OPEN + type_id = 1 + author = "user1" + ticket_id = 1 + created_at = datetime.now() + node = TicketNode.add(type, type_id, author, ticket_id, created_at) + assert node.type == type + assert node.type_id == type_id + assert node.author == author + assert node.ticket_id == ticket_id + assert node.created_at.timetuple() == created_at.timetuple() + + def test_get(self): + clean_up() + created_at = datetime.now() + node1 = TicketNode.add( + TICKET_NODE_TYPE_CLOSE, 0, 'user1', 1, created_at) + node2 = TicketNode.add( + TICKET_NODE_TYPE_MERGE, 0, 'user1', 1, created_at) + node3 = TicketNode.add( + TICKET_NODE_TYPE_MERGE, 0, 'user1', 2, created_at) + nodes = TicketNode.gets_by_ticket_id(1) + assert len(nodes) == 2 + + node1 = TicketNode.add( + TICKET_NODE_TYPE_LINECOMMENT, 1, 'user1', 2, created_at) + node2 = TicketNode.add( + TICKET_NODE_TYPE_COMMENT, 1, 'user1', 2, created_at) + node = TicketNode.get_by_type_id(TICKET_NODE_TYPE_LINECOMMENT, 1) + assert node.id == node1.id + assert node.type == node1.type + assert node.type_id == node1.type_id + assert node.ticket_id == node1.ticket_id + node = TicketNode.get_by_type_id(TICKET_NODE_TYPE_COMMIT, 1) + assert node is None + + def test_delete(self): + created_at = datetime.now() + node1 = TicketNode.add( + TICKET_NODE_TYPE_CLOSE, 0, 'user1', 1, created_at) + node2 = TicketNode.add( + TICKET_NODE_TYPE_MERGE, 0, 'user1', 1, created_at) + node3 = TicketNode.add( + TICKET_NODE_TYPE_MERGE, 0, 'user1', 2, created_at) + node = TicketNode.get(id=node2.id) + assert node is not None + node2.delete() + node = TicketNode.get(id=node2.id) + assert node is None + + +class Test_Ticket_Rank(TestCase): + def test_get_last_created_time(self): + clean_up() + node1 = TicketNode.add( + TICKET_NODE_TYPE_COMMENT, 0, 'user1', 1, datetime.now()) + node2 = TicketNode.add( + TICKET_NODE_TYPE_COMMENT, 0, 'user1', 1, datetime.now()) + node3 = TicketNode.add( + TICKET_NODE_TYPE_COMMENT, 0, 'user1', 2, datetime.now()) + node4 = TicketNode.add( + TICKET_NODE_TYPE_LINECOMMENT, 0, 'user1', 2, datetime.now()) + created_at = datetime.now() + node5 = TicketNode.add( + TICKET_NODE_TYPE_LINECOMMENT, 0, 'user1', 1, created_at) + testtime = TicketRank.get_last_created_time(1) + assert node5.created_at.timetuple() == testtime.timetuple() + clean_up() + + def test_get_comment_count(self): + clean_up() + created_at = datetime.now() + node1 = TicketNode.add( + TICKET_NODE_TYPE_COMMENT, 0, 'user1', 1, created_at) + node2 = TicketNode.add( + TICKET_NODE_TYPE_COMMENT, 0, 'user1', 1, created_at) + node3 = TicketNode.add( + TICKET_NODE_TYPE_LINECOMMENT, 0, 'user1', 1, created_at) + node4 = TicketNode.add( + TICKET_NODE_TYPE_COMMENT, 0, 'user1', 2, created_at) + node5 = TicketNode.add( + TICKET_NODE_TYPE_LINECOMMENT, 0, 'user1', 2, created_at) + test_count = TicketRank.get_comment_count(1) + assert test_count == 2 + + def test_get_line_comment_count(self): + clean_up() + created_at = datetime.now() + node1 = TicketNode.add( + TICKET_NODE_TYPE_COMMENT, 0, 'user1', 1, created_at) + node2 = TicketNode.add( + TICKET_NODE_TYPE_COMMENT, 0, 'user1', 1, created_at) + node3 = TicketNode.add( + TICKET_NODE_TYPE_LINECOMMENT, 0, 'user1', 1, created_at) + node4 = TicketNode.add( + TICKET_NODE_TYPE_COMMENT, 0, 'user1', 2, created_at) + node5 = TicketNode.add( + TICKET_NODE_TYPE_LINECOMMENT, 0, 'user1', 2, created_at) + test_count = TicketRank.get_line_comment_count(1) + assert test_count == 1 + + def test_get_sum_count(self): + clean_up() + created_at = datetime.now() + node1 = TicketNode.add( + TICKET_NODE_TYPE_COMMENT, 0, 'user1', 1, created_at) + node2 = TicketNode.add( + TICKET_NODE_TYPE_COMMENT, 0, 'user1', 1, created_at) + node3 = TicketNode.add( + TICKET_NODE_TYPE_LINECOMMENT, 0, 'user1', 1, created_at) + node4 = TicketNode.add( + TICKET_NODE_TYPE_COMMENT, 0, 'user1', 2, created_at) + node5 = TicketNode.add( + TICKET_NODE_TYPE_LINECOMMENT, 0, 'user1', 2, created_at) + test_count = TicketRank.get_sum_count(1) + assert test_count == 3.3 + + def test_count_ticket_rank(self): + clean_up() + title = 'test title' + desc = 'test desc' + author = 'testuser' + tick1 = Ticket.add(1, title, desc, author) + tick2 = Ticket.add(2, title, desc, author) + created_at = datetime.now() + aDay = timedelta(days=-1) + yesterday = created_at + aDay + node1 = TicketNode.add( + TICKET_NODE_TYPE_COMMENT, 0, 'user1', tick1.id, created_at) + node2 = TicketNode.add( + TICKET_NODE_TYPE_COMMENT, 0, 'user1', tick1.id, created_at) + node3 = TicketNode.add( + TICKET_NODE_TYPE_LINECOMMENT, 0, 'user1', tick1.id, created_at) + node4 = TicketNode.add( + TICKET_NODE_TYPE_COMMENT, 0, 'user1', tick2.id, yesterday) + node5 = TicketNode.add( + TICKET_NODE_TYPE_LINECOMMENT, 0, 'user1', tick2.id, yesterday) + + # 验证 已经关闭的 ticket + store.execute("update codedouban_ticket set time=%s, closed=%s " + "where id=%s", (yesterday, created_at, tick2.id)) + store.commit() + TicketRank.count_ticket_rank(True) + rank_score2 = TicketRank.get_rank_by_ticket_id(tick2.id) + rank_s2 = rank_score2[0][0] + rank2 = 32.07 + assert rank_s2 == rank2 + + # 验证 没有关闭的 ticket + TicketRank.count_ticket_rank(False) + rank_score1 = TicketRank.get_rank_by_ticket_id(tick1.id) + rank_s1 = rank_score1[0][0] + rank1 = 37.97 + assert rank_s1 == rank1 + + +def clean_up(): + for node in TicketNode.gets(): + node.delete() diff --git a/tests/pulls/test_web_ui.py b/tests/pulls/test_web_ui.py new file mode 100644 index 0000000..36df685 --- /dev/null +++ b/tests/pulls/test_web_ui.py @@ -0,0 +1,58 @@ +# encoding: UTF-8 + +import os + +from vilya.models.project import CodeDoubanProject +from vilya.models.pull import PullRequest + +from tests.base import TestApp +from mock import patch +import tests +from tests.base import TestCase +from tests.utils import clone, mock_method + +data_path = os.path.join(os.path.dirname(tests.__file__), 'data') + + +class TestWebUI(TestCase): + def create_project_and_a_fork(self): + from nose import SkipTest + raise SkipTest( + "These tests have Segmentation Fault") # guibog 20121105 + orig = CodeDoubanProject.add('orig', 'origuser') + with clone(orig.git_real_path) as workdir: + with open(os.path.join(workdir, 'a'), 'w') as f: + f.write("a line of code\n") + + fork = orig.fork('fork', 'forkuser') + with clone(fork.git_real_path) as workdir: + with open(os.path.join(workdir, 'b'), 'w') as f: + f.write("another line of code\n") + + return orig, fork + + def create_an_auto_mergable_pull_request(self, from_proj): + app = TestApp(extra_environ={'REMOTE_USER': str(from_proj.owner_id)}) + res = app.get('/%s' % str(from_proj.name)) + res = res.click("Pull Request") + form = res.forms[1] + form['body'] = "test" + res = form.submit() + while 300 < res.status_int < 400: + res = res.follow() + return res + + def test_new_pull_request_ticket_should_be_created_in_target_project(self): + orig, fork = self.create_project_and_a_fork() + res = self.create_an_auto_mergable_pull_request(fork) + assert res.request.path == '/orig/pull/1' + + @patch.object(PullRequest, 'is_auto_mergable', + mock_method(PullRequest.is_auto_mergable)) + def test_check_auto_mergable_should_be_async_to_speed_up_page_response(self): # noqa + orig, fork = self.create_project_and_a_fork() + res = self.create_an_auto_mergable_pull_request(fork) + pull_url = res.request.path + app = TestApp(extra_environ={'REMOTE_USER': str(orig.owner_id)}) + res = app.get(pull_url) + assert not PullRequest.is_auto_mergable.mock.called diff --git a/tests/stub/__init__.py b/tests/stub/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/vilya/tests/stub/cmemcached.py b/tests/stub/cmemcached.py similarity index 100% rename from vilya/tests/stub/cmemcached.py rename to tests/stub/cmemcached.py diff --git a/vilya/tests/stub/memcache.py b/tests/stub/memcache.py similarity index 100% rename from vilya/tests/stub/memcache.py rename to tests/stub/memcache.py diff --git a/tests/test_api_key.py b/tests/test_api_key.py new file mode 100644 index 0000000..7ddaf7a --- /dev/null +++ b/tests/test_api_key.py @@ -0,0 +1,21 @@ +from tests.base import TestCase +from vilya.models.api_key import ApiKey + +from nose.tools import eq_ + + +class TestApiKey(TestCase): + + def test_create_api_key(self): + apikey = self._add_api_key() + assert apikey is not None + + def test_get_api_key(self): + apikey = self._add_api_key() + target_apikey = ApiKey.get(apikey.id) + eq_(apikey, target_apikey) + + def test_get_by_client_id(self): + apikey = self._add_api_key() + target_apikey = ApiKey.get_by_client_id(apikey.client_id) + eq_(apikey, target_apikey) diff --git a/tests/test_api_token.py b/tests/test_api_token.py new file mode 100644 index 0000000..1d2d749 --- /dev/null +++ b/tests/test_api_token.py @@ -0,0 +1,47 @@ +from datetime import datetime + +from tests.base import TestCase +from vilya.models.api_token import ApiToken + +from nose.tools import eq_ + + +class TestApiToken(TestCase): + + def _add_api_token(self): + apikey = self._add_api_key() + user_id = 'testuser' + return ApiToken.add(apikey.client_id, user_id, datetime.now()) + + def test_create_api_token(self): + token = self._add_api_token() + assert token is not None + + def test_get_api_token(self): + token = self._add_api_token() + target_token = ApiToken.get(token.id) + eq_(token, target_token) + + def test_get_token_by_token(self): + token = self._add_api_token() + target_token = ApiToken.get_by_token(token.token) + eq_(token, target_token) + + def test_get_token_by_refresh_token(self): + token = self._add_api_token() + target_token = ApiToken.get_by_refresh_token(token.refresh_token) + eq_(token, target_token) + + def test_token_dict(self): + token = self._add_api_token() + assert isinstance(token.token_dict(), dict) + + def test_token_revoke(self): + token = self._add_api_token() + token.revoke() + eq_(token.expire_time, token.refresh_expire_time) + + def test_token_refresh(self): + token = self._add_api_token() + new_token = token.refresh() + assert isinstance(new_token, ApiToken) diff --git a/tests/test_auth.py b/tests/test_auth.py new file mode 100644 index 0000000..fbbf56d --- /dev/null +++ b/tests/test_auth.py @@ -0,0 +1,29 @@ +# coding: utf-8 + +from tests.base import TestCase +from webtest import TestApp +import app as M +from base64 import b64encode + + +class BasicAuthTest(TestCase): + + def test_login(self): + app = TestApp(M.app) + headers = { + "authorization": "Basic %s" % b64encode("code:code")} + r = app.get('/', headers=headers) + assert r.status_int == 302 + assert 'teams' in r + + def test_invalid_login(self): + app = TestApp(M.app) + headers = { + "authorization": "Basic%s" % b64encode("code:code")} + app.get('/', headers=headers, status=401) + + def test_unauthorized_login(self): + app = TestApp(M.app) + headers = { + "authorization": "Basic %s" % b64encode("doubugreporter:hobbitsxx")} + app.get('/', headers=headers, status=401) diff --git a/tests/test_badge.py b/tests/test_badge.py new file mode 100644 index 0000000..e735f52 --- /dev/null +++ b/tests/test_badge.py @@ -0,0 +1,54 @@ +# encoding: utf-8 + +from contextlib import contextmanager +from nose.tools import eq_, ok_ +from MySQLdb import connect + +from vilya.models.badge import Badge +from vilya.models.user import User + + +@contextmanager +def new_badge(username=None): + badge = Badge.add(name='测试徽章', summary='测试徽章的描述') + yield badge + badge.delete() + if username: + Badge.clear_new_badges(username) + + +class TestBadge(object): + def tearDown(self): + conn = connect(use_unicode=True) + cursor = conn.cursor() + cursor.execute("delete from badge") + cursor.execute("delete from badge_item") + conn.commit() + + def test_new_badge(self): + with new_badge() as badge: + ok_(badge.name, '测试徽章') + ok_(Badge.get_by_name(badge.name)) + + def test_badge_award_to_user(self): + username = 'qingfeng' + with new_badge(username) as badge: + badge.award(item_id=username) + badges = Badge.get_badges(item_id=username) + eq_(len(badges), 1) + items = badge.get_awarded_items() + eq_(len(items), 1) + + def test_get_user_badges(self): + user = User('qingfeng') + with new_badge(user.username) as badge: + badge.award(item_id=user.username) + eq_(len(user.get_badges()), 2) + + def test_get_user_new_badges(self): + user = User('qingfeng') + with new_badge(user.username) as badge: + badge.award(item_id=user.username) + eq_(len(user.get_new_badges()), 1) + user.clear_new_badges() + eq_(len(user.get_new_badges()), 0) diff --git a/tests/test_basic.py b/tests/test_basic.py new file mode 100644 index 0000000..f3c9793 --- /dev/null +++ b/tests/test_basic.py @@ -0,0 +1,17 @@ +import os +import shutil + +from vilya.libs.permdir import get_repo_root +from vilya.models.project import CodeDoubanProject + +from tests.base import TestCase + + +class TestBasic(TestCase): + def test_create_git_repo(self): + git_path = os.path.join(get_repo_root(), 'abc.git') + CodeDoubanProject.create_git_repo(git_path) + assert os.path.exists(git_path) + info_file = os.path.join(git_path, 'refs') + assert os.path.exists(info_file) + shutil.rmtree(git_path) diff --git a/tests/test_comment.py b/tests/test_comment.py new file mode 100644 index 0000000..735bb1b --- /dev/null +++ b/tests/test_comment.py @@ -0,0 +1,132 @@ +# -*- coding: utf-8 -*- + +from tests.base import TestCase + +from vilya.models import comment + +T_PROJ_ID = 123 +T_PROJ_ID_2 = 135 +T_REF = '2a200e45b0e223d13477e' +T_REF_2 = '2a200e45b0e223d13aaaa' +T_AUTHOR = 'user1' +T_CONTENT = 'test comment content' +T_CONTENT2 = 'test comment content 2' + + +class TestCommentFuncts(TestCase): + def test_add_comment(self): + cid1 = comment.add(T_PROJ_ID, T_REF, T_AUTHOR, T_CONTENT) + assert cid1 + cid2 = comment.add(T_PROJ_ID, T_REF, T_AUTHOR, T_CONTENT) + assert cid2 + assert cid1 != cid2 + + def test_get_comment(self): + cid = comment.add(T_PROJ_ID, T_REF, T_AUTHOR, T_CONTENT) + com = comment.get(cid) + assert com[1] == T_PROJ_ID + assert com[2] == T_REF + + def test_chinese_comment(self): + T_CONTENT_ZH = 'test is 牛B' + cid = comment.add(T_PROJ_ID, T_REF, T_AUTHOR, T_CONTENT_ZH) + com = comment.get(cid) + assert com[4] == T_CONTENT_ZH + + def test_get_unexisting_comment(self): + cid = comment.add(T_PROJ_ID, T_REF, T_AUTHOR, T_CONTENT) + com = comment.get(cid + 1) + assert com is None + + def test_delete_comment(self): + cid = comment.add(T_PROJ_ID, T_REF, T_AUTHOR, T_CONTENT) + assert comment.get(cid) + ok = comment.delete(cid) + assert ok + assert not comment.get(cid) + assert not comment.delete(cid), "Cannot delete twice same comment" + + def test_gets_by_project_id(self): + cid1 = comment.add(T_PROJ_ID, T_REF, T_AUTHOR, T_CONTENT) + comment.add(T_PROJ_ID_2, T_REF, T_AUTHOR, T_CONTENT) + cid2 = comment.add(T_PROJ_ID, T_REF, T_AUTHOR, T_CONTENT2) + cmnts = comment.gets_by_project(T_PROJ_ID, order='desc')[:2] + assert cmnts == [cid2, cid1] + + def test_gets_by_ref(self): + cid1 = comment.add(T_PROJ_ID, T_REF, T_AUTHOR, T_CONTENT) + comment.add(T_PROJ_ID, T_REF_2, T_AUTHOR, T_CONTENT) + cid2 = comment.add(T_PROJ_ID, T_REF, T_AUTHOR, T_CONTENT2) + cmnts = comment.gets_by_ref(T_REF, order='desc')[:2] + assert cmnts == [cid2, cid1] + + def test_gets_by_proj_and_ref(self): + cid1 = comment.add(T_PROJ_ID, T_REF, T_AUTHOR, T_CONTENT) + comment.add(T_PROJ_ID, T_REF_2, T_AUTHOR, T_CONTENT) + cid2 = comment.add(T_PROJ_ID, T_REF, T_AUTHOR, T_CONTENT2) + cmnts = comment.gets_by_proj_and_ref( + T_PROJ_ID, T_REF, order='desc')[:2] + assert cmnts == [cid2, cid1] + + def test_gets_with_order(self): + all_cmnts = [comment.add(T_PROJ_ID, T_REF, T_AUTHOR, T_CONTENT) + for i in range(30)] + assert len(all_cmnts) == 30 + assert comment.gets_by_ref( + T_REF, order='desc')[:30] == list(reversed(all_cmnts)) + + def test_gets_with_proj_with_order(self): + all_cmnts = [comment.add(T_PROJ_ID, T_REF, T_AUTHOR, T_CONTENT) + for i in range(30)] + assert len(all_cmnts) == 30 + assert comment.gets_by_proj_and_ref( + T_PROJ_ID, T_REF, order='desc')[:30] == list(reversed(all_cmnts)) + assert comment.gets_by_proj_and_ref( + T_PROJ_ID, T_REF, start=10, limit=5, order='desc') == all_cmnts[15:20][::-1] # noqa + + def test_modify_comment(self): + cid = comment.add(T_PROJ_ID, T_REF, T_AUTHOR, T_CONTENT) + comment.update(cid, {'content': 'new content'}) + assert comment.get(cid)[4] == 'new content' + +cC = comment.Comment + + +class TestCommentORM(TestCase): + def _add(self, project_id=T_PROJ_ID, ref=T_REF, + author=T_AUTHOR, content=T_CONTENT): + return cC.get(comment.add(project_id, ref, author, content)) + + def test_add(self): + c = self._add(T_PROJ_ID, T_REF, T_AUTHOR, T_CONTENT) + assert c.project_id == T_PROJ_ID + assert c.ref == T_REF + assert c.author == T_AUTHOR + + def test_get(self): + c1 = self._add() + c2 = cC.get(c1.comment_id) + assert c1.comment_id == c2.comment_id + assert c1 == c2 + + def test_delete(self): + c = self._add() + assert cC.get(c.comment_id) + ok = cC.delete(c.comment_id) + assert ok + assert not cC.get(c.comment_id) + + def test_update(self): + c = self._add(content='content1') + assert c.content == 'content1' + assert cC.get(c.comment_id).content == 'content1' + c.update('content2') + assert c.content == 'content2' + assert cC.get(c.comment_id).content == 'content2' + + def test_gets_by_project_id(self): + c1 = self._add(T_PROJ_ID) + self._add(T_PROJ_ID_2) + c2 = self._add(T_PROJ_ID) + clist = cC.gets_by_project(T_PROJ_ID, order='desc')[:2] + assert clist == [c2, c1] diff --git a/tests/test_diff.py b/tests/test_diff.py new file mode 100644 index 0000000..6c76cd6 --- /dev/null +++ b/tests/test_diff.py @@ -0,0 +1,151 @@ +# -*- coding: utf-8 -*- + +import os +import shutil + +from vilya.models.project import CodeDoubanProject +from vilya.models import git + +from tests.base import TestCase + +from vilya.libs import gyt +from vilya.libs.diff import rehunk, linehtml +from vilya.libs.permdir import get_repo_root + +a_hunk = [('idem', u'/* highlight style */'), ('rem', u'.highlight { color: #008000; font-weight: bold; } /* Keyword */'), ('add', u'.highlight .hll { background-color: #ffffcc; }'), ('add', u'.highlight { background: #ffffff; }'), ('add', u'.highlight .c { color: #808080; } /* Comment */'), ('add', u'.highlight .err { color: #F00000; background-color: #F0A0A0; } /* Error */'), ('add', u'.highlight .k { color: #008000; font-weight: bold; } /* Keyword */'), ('idem', u'.highlight .o { color: #303030; } /* Operator */'), ('idem', u'.highlight .cm { color: #808080; } /* Comment.Multiline */'), ('idem', u'.highlight .cp { color: #507090; } /* Comment.Preproc */')] # noqa + + +class TestDiff(TestCase): + def _path(self, name): + return os.path.join(get_repo_root(), '%s.git' % name) + + def _path_work_tree(self, name): + return os.path.join(get_repo_root(), '%s.work_tree' % name) + + def _repo(self, name, bare=True): + git_path = self._path(name) + if bare: + work_tree_path = None + else: + work_tree_path = self._path_work_tree(name) + if os.path.exists(git_path): + shutil.rmtree(git_path, ignore_errors=True) + try: + os.mkdir(work_tree_path) + except OSError: + pass + CodeDoubanProject.create_git_repo(git_path) + repo = git.GitRepo(git_path, work_tree=work_tree_path) + return repo + + def _commit(self, repo, filename, content='testcontent', + message='testmessage'): + # TODO allow commiting more than one file + assert os.path.exists(repo.work_tree), \ + "repo.work_tree must exist, check if repo has been created with bare=False" # noqa + f = open(os.path.join(repo.work_tree, filename), 'w') + f.write(content) + f.close() + rep2 = gyt.repo(repo.path, repo.work_tree, bare=False) + rep2.call(['add', filename]) + rep2.call(['commit', filename, '-m', message], _env=self.env_for_git) + return gyt.repo(repo.path).sha() + + def test_diff(self): + repo = self._repo('test_diff', bare=False) + c1_sha = self._commit(repo, 'testfile', 'content1', 'msg1') + c2_sha = self._commit(repo, 'testfile', 'content2', 'msg2') + diffs = repo.get_3dot_diff(c1_sha, c2_sha) + assert len(diffs) == 1, "Should be only one diff" + diff = diffs[0] + assert len(diff.chunks) == 1, "The diff has only one chunk" + chunk = diff.chunks[0] + assert ('rem', u'-content\x00^1\x01') in chunk.diff_lines, \ + "diff should contain content1 removal" + assert ('add', u'+content\x00^2\x01') in chunk.diff_lines, \ + "diff should contain content2 added" + + def test_diff_one_file(self): + repo = self._repo('test_diff_one_file', bare=False) + c1_sha = self._commit(repo, 'testfile', 'content1', 'msg1') + c2_sha = self._commit(repo, 'testfile', 'content2', 'msg2') + diffs = repo.get_3dot_diff_onefile(c1_sha, c2_sha, 'testfile') + assert len(diffs) == 1, "Should be only one diff" + diff = diffs[0] + assert len(diff.chunks) == 1, "The diff has only one chunk" + chunk = diff.chunks[0] + assert ('rem', u'-content\x00^1\x01') in chunk.diff_lines, \ + "diff should contain content1 removal" + assert ('add', u'+content\x00^2\x01') in chunk.diff_lines, \ + "diff should contain content2 added" + + def test_diff_one_file_with_lines_starting_with_minus(self): + repo = self._repo('test_diff_one_file', bare=False) + c1_sha = self._commit( + repo, 'testfile', '-a\n-test\n-c\n\ncontent1', 'msg1') + c2_sha = self._commit( + repo, 'testfile', '-a\n-test\n-c\n\ncontent2', 'msg2') + diffs = repo.get_3dot_diff_onefile(c1_sha, c2_sha, 'testfile') + assert len(diffs) == 1, "Should be only one diff" + diff = diffs[0] + assert len(diff.chunks) == 1, "The diff has only one chunk" + assert ('deletion', '2', ' ', u'-test') not in diff.diff_content + assert ('normal', '2', '2', u' -test') in diff.diff_content + + def test_parse_merge_diff_empty(self): + repo = self._repo('test_merge_diff', bare=False) + self._commit(repo, 'testfile', 'msg') + not_bare = gyt.repo(repo.path, repo.work_tree) + assert not not_bare.is_bare() + self._commit(repo, 'tf1', 'content1', 'msg1') + not_bare.call('checkout -b test_br') + sha2 = self._commit(repo, 'tf2', 'content2', 'msg2') + not_bare.call('checkout master') + sha3 = self._commit(repo, 'tf3', 'content3', 'msg3') + not_bare.call('merge test_br', _env=self.env_for_git) + sha_merge = repo.pygit2_repo.revparse_single('HEAD').hex + diff = repo.parse_diff(sha_merge) + assert diff['body'] == '' + assert len(diff['difflist']) == 1 + assert diff['parents'] == '%s %s' % (sha3, sha2) + + def test_hunk(self): + hunk = rehunk(a_hunk) + assert hunk == [('idem', u' /* highlight style */'), ('rem', u'-.highlight { color: #008000; font-weight: bold; } /* Keyword */'), ('add', u'+.highlight .hll { background-color: #ffffcc; }'), ('add', u'+.highlight { background: #ffffff; }'), ('add', u'+.highlight .c { color: #808080; } /* Comment */'), ('add', u'+.highlight .err { color: #F00000; background-color: #F0A0A0; } /* Error */'), ('add', u'+.highlight \x00+.k \x01{ color: #008000; font-weight: bold; } /* Keyword */'), ('idem', u' .highlight .o { color: #303030; } /* Operator */'), ('idem', u' .highlight .cm { color: #808080; } /* Comment.Multiline */'), ('idem', u' .highlight .cp { color: #507090; } /* Comment.Preproc */')] # noqa + + def test_color(self): + diff = 'background-color: #3aa253;' + html = 'background-color: <span class="color" data-color="#3aa253">#3aa253</span>;' # noqa + result = linehtml(diff) + assert result == html + + def test_diff_smart_slice(self): + repo = self._repo('test_diff_smart_slice.txt', bare=False) + content1 = 'a\n' * 100 + content2 = 'a\n' * 5 + 'b\n' * 10 + 'a\n' * 20 + 'b\n' * 40 + c1_sha = self._commit(repo, 'testfile', content1, 'msg1') + c2_sha = self._commit(repo, 'testfile', content2, 'msg2') + diffs = repo.get_3dot_diff(c1_sha, c2_sha) + diff = diffs[0] + content = diff.diff_content + + normal_slice1 = content[:11] + smart_slice1 = diff.smart_slice(10) + assert smart_slice1[-1] == normal_slice1[-1] + assert len(smart_slice1) == len(normal_slice1) and len(smart_slice1) <= 15 # noqa + + normal_slice2 = content[:31] + smart_slice2 = diff.smart_slice(30) + + assert smart_slice2[-1] == normal_slice2[-1] + assert len(smart_slice2) < len(normal_slice2) + assert len(smart_slice2) <= 25 + assert smart_slice2[0][0] == 'tips' + + normal_slice3 = content[:101] + smart_slice3 = diff.smart_slice(100) + + assert len(smart_slice3) <= 25 + assert len(smart_slice3) < len(normal_slice3) + assert smart_slice3[-1] == normal_slice3[-1] + assert smart_slice3[0][0] != 'tips' diff --git a/tests/test_feed.py b/tests/test_feed.py new file mode 100644 index 0000000..586f08f --- /dev/null +++ b/tests/test_feed.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- + +from datetime import datetime +from tests.base import TestCase +from vilya.models.feed import ( + Feed, get_user_inbox, get_user_feed, get_public_feed) + + +TEST_ACTION_TYPE = 'code_review' + + +class TestFeed(TestCase): + + def test_feed(self): + key = 'testkey' + feed = Feed.get(key) + assert feed is not None + # feed.add_action will run blinker connect `@rds_pub_signal.connect`, + # and render a piece of mako template + feed.add_action({ + 'type': TEST_ACTION_TYPE, + 'content': 'content', + 'date': datetime.now(), + }) + feed = feed.get(key) + actions = feed.get_actions() + assert actions is not None + assert len(actions) == 1 + assert actions[0]['type'] == TEST_ACTION_TYPE + assert actions[0]['content'] == 'content' + + def test_userinbox(self): + actor = 'testuser1' + all_feed = [ + get_user_inbox(actor), + get_user_feed(actor), + get_public_feed(), + ] + data = dict(type='pull_request', + owner='testuser2', + url='', + title='pr title', + description='pr desc', + date=datetime.now(), + from_proj='10', + to_proj='1', + uid='pullrequest-1-1-unmerge') + for feed in all_feed: + feed.add_action(data) + actions = feed.get_actions() + assert len(actions) == 1 diff --git a/tests/test_fork_project.py b/tests/test_fork_project.py new file mode 100644 index 0000000..cc0c1d4 --- /dev/null +++ b/tests/test_fork_project.py @@ -0,0 +1,48 @@ +import os +import shutil + +from vilya.models.project import CodeDoubanProject +from nose.tools import ok_, eq_ + +from tests.base import TestCase + + +def rmtree(path): + if os.path.exists(path): + shutil.rmtree(path) + + +class TestProject(TestCase): + + def test_fork_project(self): + orig = CodeDoubanProject.add('orig', owner_id="user1") + fork = orig.fork('fork', 'user2') + + ok_(os.path.exists(fork.git_real_path)) + ok_(os.path.exists(os.path.join(fork.git_real_path, 'HEAD'))) + + eq_(fork.owner_id, 'user2') + + def test_get_forked_from_should_return_origin_project(self): + prj = CodeDoubanProject.get_by_name('orig') + prj.delete() + prj = CodeDoubanProject.get_by_name('fork') + prj.delete() + orig = CodeDoubanProject.add('orig', owner_id="test1") + fork = orig.fork('fork', 'user2') + source = fork.get_forked_from() + eq_(source, orig) + + def test_get_fork_network_should_return_all_projects_with_same_origin(self): # noqa + prj = CodeDoubanProject.get_by_name('orig') + prj.delete() + orig = CodeDoubanProject.add('orig', owner_id="test1") + fork = orig.fork('fork1', 'user1') + fork2 = orig.fork('fork2', 'user2') + fork3 = fork.fork('fork3', 'user3') + + expected_network = set([orig, fork, fork2, fork3]) + + for proj in [orig, fork, fork2, fork3]: + network = proj.get_fork_network() + eq_(set(network), expected_network) diff --git a/tests/test_gist.py b/tests/test_gist.py new file mode 100644 index 0000000..dfd097a --- /dev/null +++ b/tests/test_gist.py @@ -0,0 +1,116 @@ +from tests.base import TestCase +from vilya.models.gist import Gist + +from nose.tools import eq_ + + +class TestGist(TestCase): + + def test_gist_star_n_star_unstar_is_starred(self): + gist = self._add_gist() + user_id = 'testuser' + + ret = gist.star(user_id) + eq_(ret, True) + + ret = gist.n_star + eq_(ret, 1) + + ret = gist.is_starred(user_id) + eq_(ret, True) + + ret = gist.unstar(user_id) + eq_(ret, True) + + ret = gist.is_starred(user_id) + eq_(ret, False) + + def test_gist_fork_n_fork_forks(self): + gist = self._add_gist() + user_id = 'testuser' + + ret = gist.fork(user_id) + assert isinstance(ret, Gist) + + ret = gist.n_fork + eq_(ret, 1) + + ret = gist.forks + assert all([isinstance(r, Gist) for r in ret]) + + def test_gist_n_revision_n_comments(self): + gist = self._add_gist() + + ret = gist.n_revision + eq_(ret, 0) + + ret = gist.n_comments + eq_(ret, 0) + + def test_gist_files_n_files(self): + gist = self._add_gist() + + ret = gist.files + eq_(ret, []) + + ret = gist.n_files + eq_(ret, 0) + + def test_gist_update(self): + gist = self._add_gist() + file_name = 'a.md' + file_content = '##h1\nhello' + + gist.update('xx', gist_names=[file_name], gist_contents=[file_content]) + + ret = gist.files + eq_(ret, [file_name]) + + ret = gist.n_files + eq_(ret, 1) + + def test_gist_gets_classmethod(self): + gist = self._add_gist() + user_id = 'testuser' + + ret = Gist.gets_by_owner(user_id) + assert all([isinstance(r, Gist) for r in ret]) + + gist.fork(user_id) + ret = Gist.forks_by_user(user_id) + assert all([isinstance(r, Gist) for r in ret]) + + ret = Gist.publics_by_user(user_id) + assert all([isinstance(r, Gist) for r in ret]) + + ret = Gist.secrets_by_user(user_id) + assert all([isinstance(r, Gist) for r in ret]) + + def test_gist_count_classmethod(self): + gist = self._add_gist() + user_id = 'testuser' + + ret = Gist.count_user_all(user_id) + eq_(ret, 1) + + gist.fork(user_id) + ret = Gist.count_user_fork(user_id) + eq_(ret, 1) + + gist.star(user_id) + ret = Gist.count_user_star(user_id) + eq_(ret, 1) + + ret = Gist.count_public_by_user(user_id) + eq_(ret, 2) + + ret = Gist.count_secret_by_user(user_id) + eq_(ret, 0) + + def test_gist_delete(self): + gist = self._add_gist() + gist_id = gist.id + gist.delete() + + ret = Gist.get(gist_id) + eq_(ret, None) diff --git a/tests/test_gist_comment.py b/tests/test_gist_comment.py new file mode 100644 index 0000000..ae86901 --- /dev/null +++ b/tests/test_gist_comment.py @@ -0,0 +1,30 @@ +from tests.base import TestCase +from vilya.models.gist_comment import GistComment + +from nose.tools import eq_ + + +class TestGistComment(TestCase): + + def test_gist_comment(self): + gist = self._add_gist() + user_id = 'testuser' + content = 'xxoo' + new_content = 'ooxx' + + gc = GistComment.add(gist.id, user_id, content) + assert isinstance(gc, GistComment) + + gcs = GistComment.gets_by_gist_id(gist.id) + eq_(len(gcs), 1) + + assert gc.can_delete(user_id) + + gc.update(new_content) + gc = GistComment.get(gc.id) + + eq_(gc.content, new_content) + + gc.delete() + ret = GistComment.get(gc.id) + eq_(ret, None) diff --git a/tests/test_gist_star.py b/tests/test_gist_star.py new file mode 100644 index 0000000..824077b --- /dev/null +++ b/tests/test_gist_star.py @@ -0,0 +1,40 @@ +from tests.base import TestCase +from vilya.models.gist_star import GistStar + +from nose.tools import eq_ + + +class TestGistStar(TestCase): + + def test_gist_star(self): + gist = self._add_gist() + user_id = 'testuser' + gs = GistStar.gets_by_user(user_id) + gs[0].delete() + ret = GistStar.add(gist.id, user_id) + eq_(ret, True) + + ret = GistStar.gets_by_gist(gist.id) + eq_(len(ret), 1) + + ret = GistStar.gets_by_user(user_id) + eq_(len(ret), 1) + + ret = GistStar.get_by_gist_and_user(gist.id, user_id) + assert isinstance(ret, GistStar) + + ret = GistStar.count_by_gist(gist.id) + eq_(ret, 1) + + ret = GistStar.count_by_user(user_id) + eq_(ret, 1) + + def test_delete_gist_star(self): + gist = self._add_gist() + user_id = 'testuser' + GistStar.add(gist.id, user_id) + gist_star = GistStar.get_by_gist_and_user(gist.id, user_id) + gist_star.delete() + + gist_star = GistStar.get_by_gist_and_user(gist.id, user_id) + eq_(gist_star, None) diff --git a/tests/test_git.py b/tests/test_git.py new file mode 100644 index 0000000..c3d9547 --- /dev/null +++ b/tests/test_git.py @@ -0,0 +1,186 @@ +# -*- coding: utf-8 -*- + +import os +import shutil + +from nose.tools import eq_ + +from vilya.models.project import CodeDoubanProject +from vilya.models import git + +from tests.base import TestCase + +from vilya.libs import gyt +from vilya.libs.permdir import get_repo_root + + +class TestGit(TestCase): + def _path(self, name): + return os.path.join(get_repo_root(), '%s.git' % name) + + def _path_work_tree(self, name): + path = os.path.join(get_repo_root(), '%s.work_tree' % name) + shutil.rmtree(path, ignore_errors=True) + return path + + def _repo(self, name, bare=True): + git_path = self._path(name) + if bare: + work_tree_path = None + else: + work_tree_path = self._path_work_tree(name) + os.mkdir(work_tree_path) + try: + CodeDoubanProject.create_git_repo(git_path) + except: + pass + repo = git.GitRepo(git_path, work_tree=work_tree_path) + return repo + + def _commit(self, repo, filename, content='testcontent', + message='testmessage'): + # TODO allow commiting more than one file + assert os.path.exists(repo.work_tree), \ + "repo.work_tree must exist, check if repo has been created with bare=False" # noqa + f = open(os.path.join(repo.work_tree, filename), 'w') + f.write(content) + f.close() + rep2 = gyt.repo(repo.path, repo.work_tree, bare=False) + rep2.call(['add', filename]) + rep2.call(['commit', filename, '-m', message], _env=self.env_for_git) + return gyt.repo(repo.path).sha() + + def test_create(self): + git_path = os.path.join(get_repo_root(), 'test_create.git') + assert not os.path.exists( + git_path), "git_path should not exist prior repo creation" + CodeDoubanProject.create_git_repo(git_path) + assert os.path.exists( + git_path), "create_git_repo should create git_path" + refs_file = os.path.join(git_path, 'refs') + assert os.path.exists(refs_file), \ + "create_git_repo should create a git repo with refs subdir" + + def test_gitrepo_path(self): + git_path = self._path('test_gitrepo_path') + CodeDoubanProject.create_git_repo(git_path) + repo = git.GitRepo(git_path) + assert repo.path == git_path, "repo.path should be equal to git_path" + + def test_execute_help(self): + repo = self._repo('test_execute_help') + res = repo.call(['help']) + assert res, "executing help should return something" + eq_(type(res), type(u'a string')) + + def test_repo_is_bare(self): + repo = self._repo('test_execute_help') + res = repo.call(['config', 'core.bare']) + assert res.strip() == 'true', "new git repo should be bare" + + def test_object_type(self): + repo = self._repo('test_commit', bare=False) + c1_sha = self._commit( + repo, 'testfile', 'testcontent', 'testmsg\n\nmsg1body\nmsg1body2') + assert repo.object_type(c1_sha) == 'commit' + unused_sha = 'af3d3e81db1559687d1574d368ef578a50ab8971' + if c1_sha != unused_sha: + assert repo.object_type(unused_sha) is False + + def test_commit(self): + repo = self._repo('test_commit', bare=False) + c1_sha = self._commit( + repo, 'testfile', 'testcontent', 'testmsg\n\nmsg1body\nmsg1body2') + assert len(repo.get_branches()) == 1, "should have one ref" + c1 = repo.get_commit(c1_sha) + assert c1.message == 'testmsg\n\nmsg1body\nmsg1body2' + assert c1.message_body == '\nmsg1body\nmsg1body2' + assert c1.shortlog == 'testmsg' + + def test_get_commit_on_unexisting_commit(self): + repo = self._repo('test_commit', bare=False) + c1_sha = self._commit( + repo, 'testfile', 'testcontent', 'testmsg\n\nmsg1body\nmsg1body2') + assert repo.get_commit(c1_sha) + another_sha = '11fb26bace9a2538d200bdc41a1f990bcc06411b' + if another_sha != c1_sha: + assert repo.get_commit(another_sha) is None + + def test_two_commit(self): + repo = self._repo('test_commit', bare=False) + c1_sha = self._commit(repo, 'testfile', 'content1', 'msg1') + c2_sha = self._commit(repo, 'testfile', 'content2', 'msg2') + c2 = repo.get_commit(c2_sha) + c1 = repo.get_commit(c2.parent) + assert c1.sha == c1_sha + assert c1.message == 'msg1' + assert c2.sha == c2_sha + assert c2.message == 'msg2' + + def test_merge_commit(self): + repo = self._repo('test_merge_diff', bare=False) + self._commit(repo, 'testfile', 'msg') + not_bare = gyt.repo(repo.path, repo.work_tree) + self._commit(repo, 'tf1', 'content1', 'msg1') + not_bare.call('checkout -b test_br') + sha2 = self._commit(repo, 'tf2', 'content2', 'msg2') + not_bare.call('checkout master') + self._commit(repo, 'tf3', 'content3', 'msg3') + not_bare.call('merge test_br', _env=self.env_for_git) + sha_merge = repo.pygit2_repo.revparse_single('HEAD').hex + c = repo.get_commit(sha_merge) + assert c.parent == sha2, \ + "This is bad, only one parent for a merge commit" + + def test_branches(self): + repo = self._repo('test_branches', bare=False) + rep2 = gyt.repo(repo.path, repo.work_tree, bare=False) + assert repo.get_branches() == [] + self._commit(repo, 'testfile') + assert repo.get_branches() == ['master'] + rep2.call(['branch', 'test_branch']) + assert repo.get_branches() == ['master', 'test_branch'] + rep2.call(['checkout', 'test_branch']) + assert repo.get_branches() == ['test_branch', 'master'] + rep2.call(['branch', 'test_branch牛逼']) + assert repo.get_branches( + ) == ['test_branch', 'master', u'test_branch\u725b\u903c'] + + def test_rename_detection(self): + repo = self._repo('test', bare=False) + self._commit(repo, 'testfile', 'content', 'msg1') + grepo = gyt.repo(repo.path, work_tree=repo.work_tree) + grepo.call('mv testfile testfile_new') + grepo.call('commit -mmv', _env=self.env_for_git) + assert repo.rename_detection('HEAD') == {'testfile_new': 'testfile'} + + def test_rename_detection_on_first_commit(self): + repo = self._repo('test', bare=False) + self._commit(repo, 'testfile', 'content', 'msg1') + assert repo.rename_detection('HEAD') == {} + + def test_rename_detection_with_manual_mv(self): + repo = self._repo('test', bare=False) + content1 = 'a\na\na\na\na\na\na\na\na\na\nAAA' + self._commit(repo, 'testfile', content1, 'msg1') + with open(os.path.join(repo.work_tree, 'testfile_new'), 'w') as f: + f.write(content1) + grepo = gyt.repo(repo.path, work_tree=repo.work_tree) + grepo.call('rm testfile') + grepo.call('add testfile_new') + grepo.call('commit -ammv', _env=self.env_for_git) + assert repo.rename_detection('HEAD') == {'testfile_new': 'testfile'} + + # def test_rename_detection_with_manual_mv_and_little_change(self): + # repo = self._repo('test', bare=False) + # content1 = 'a\na\na\na\na\na\na\na\na\na\nAAA' + # content2 = 'a\na\na\na\na\na\na\na\na\na\nBBB' + # self._commit(repo, 'testfile', content1, 'msg1') + # with open(os.path.join(repo.work_tree, 'testfile_new'), 'w') as f: + # f.write(content2) + # grepo = gyt.repo(repo.path, work_tree=repo.work_tree) + # grepo.call('rm testfile') + # grepo.call('add testfile_new') + # grepo.call('commit -ammv', _env=self.env_for_git) + # assert repo.rename_detection( + # 'HEAD') == {}, "If files have change, not real rename" diff --git a/tests/test_git_commit_one_file.py b/tests/test_git_commit_one_file.py new file mode 100644 index 0000000..90d42ed --- /dev/null +++ b/tests/test_git_commit_one_file.py @@ -0,0 +1,218 @@ +# -*- coding: utf-8 -*- + +import os + +from vilya.models.project import CodeDoubanProject +from vilya.models import git + +from tests.base import TestCase +from tests.utils import mkdtemp + +from vilya.libs import gyt +from vilya.libs.permdir import get_repo_root + + +class TestGit(TestCase): + + @property + def u(self): + return self.addUser() + + def _path(self, name): + return os.path.join(get_repo_root(), '%s.git' % name) + + def _path_work_tree(self, name): + return os.path.join(get_repo_root(), '%s.work_tree' % name) + + def _repo(self, name, bare=True): + git_path = self._path(name) + if bare: + work_tree_path = None + else: + work_tree_path = self._path_work_tree(name) + if not os.path.exists(work_tree_path): + os.mkdir(work_tree_path) + try: + CodeDoubanProject.create_git_repo(git_path) + except: + pass + repo = git.GitRepo(git_path, work_tree=work_tree_path) + return repo + + def _commit(self, repo, filename, content='testcontent', + message='testmessage'): + # TODO allow commiting more than one file + assert os.path.exists(repo.work_tree), \ + "repo.work_tree must exist, check if repo has been created with bare=False" # noqa + path = os.path.join(repo.work_tree, filename) + dir_ = os.path.dirname(path) + if not os.path.exists(dir_): + os.makedirs(os.path.dirname(path)) + f = open(path, 'w') + f.write(content) + f.close() + rep2 = gyt.repo(repo.path, repo.work_tree, bare=False) + rep2.call(['add', filename]) + rep2.call(['commit', filename, '-m', message], _env=self.env_for_git) + return gyt.repo(repo.path).sha() + + def test_simple_commit(self): + repo = self._repo('test', bare=False) + self._commit(repo, 'testfile1', 'content1', 'msg1') + src = repo.get_src('testfile1') + assert src == ('blob', u'content1') + repo.commit_one_file('testfile1', 'content1 modified', + 'change1', self.u, orig_hash=hash('content1')) + src = repo.get_src('testfile1') + assert src == ('blob', u'content1 modified') + + def test_simple_commit_do_not_delete_other_files(self): + repo = self._repo('test', bare=False) + self._commit(repo, 'testfile1', 'content1', 'msg1') + self._commit(repo, 'testfile2', 'content2', 'msg2') + repo.commit_one_file('testfile1', 'content1 modified', + 'change1', self.u, orig_hash=hash('content1')) + src = repo.get_src('testfile1') + assert src == ('blob', u'content1 modified') + type_, files = repo.get_src('') + assert any(d['path'] == 'testfile2' for d in files), \ + "testfile2 should exists in root tree" + src = repo.get_src('testfile2') + assert src == ('blob', u'content2') + + def test_commit_in_inner_directory(self): + repo = self._repo('test', bare=False) + self._commit(repo, 'test/file1', 'content1', 'msg1') + src = repo.get_src('test/file1') + assert src == ('blob', u'content1') + repo.commit_one_file('test/file1', 'content1 modified', + 'change1', self.u, orig_hash=hash('content1')) + src = repo.get_src('test/file1') + assert src == ('blob', u'content1 modified') + + def test_create_file(self): + repo = self._repo('test', bare=False) + self._commit(repo, 'file1', 'content1', 'msg1') + repo.commit_one_file( + 'file2', 'content2 created', 'create1', self.u) + assert repo.cat('HEAD:file1') == 'content1' + assert repo.cat('HEAD:file2') == 'content2 created' + + def test_create_first_file(self): + repo = self._repo('test', bare=False) + repo.commit_one_file( + 'file1', 'content1 created', 'create1', self.u) + assert repo.cat('HEAD:file1') == 'content1 created' + + def test_create_first_file_and_more(self): + repo = self._repo('test', bare=False) + repo.commit_one_file( + 'file1', 'content1 created', 'create1', self.u) + repo.commit_one_file( + 'file2', 'content2 created', 'create2', self.u) + repo.commit_one_file( + 'file3', 'content3 created', 'create3', self.u) + repo.commit_one_file( + 'file4', 'content4 created', 'create4', self.u) + assert repo.cat('HEAD:file1') == 'content1 created' + assert repo.cat('HEAD:file2') == 'content2 created' + assert repo.cat('HEAD:file3') == 'content3 created' + assert repo.cat('HEAD:file4') == 'content4 created' + + def test_commit_file_on_dirty_index(self): + repo = self._repo('test', bare=False) + repo.commit_one_file( + 'file1', 'content1 created', 'create1', self.u) + repo.commit_one_file( + 'file2', 'content2 created', 'create2', self.u) + repo.commit_one_file( + 'file1', 'content1 modified', 'modify1', self.u) + # Now artificially rewind the index tree state + repo.call('read-tree HEAD^') + repo.commit_one_file( + 'file2', 'content2 modified', 'modify2', self.u) + # the latest commit should not have anything related to file1 + assert 'file1' not in repo.call('log -p -n1') + + def test_create_file_in_dir(self): + repo = self._repo('test', bare=False) + self._commit(repo, 'test/file1', 'content1', 'msg1') + repo.commit_one_file( + 'test/file2', 'content2 created', 'create1', self.u) + assert repo.cat('HEAD:test/file1') == 'content1' + assert repo.cat('HEAD:test/file2') == 'content2 created' + + def test_simple_commit_in_branch(self): + repo = self._repo('test', bare=False) + self._commit(repo, 'testfile1', 'content1', 'msg1') + tmp_branch = repo.temp_branch_name() + repo.commit_one_file('testfile1', 'content1 modified', 'change1', + self.u, orig_hash=hash('content1'), + branch=tmp_branch) + with mkdtemp() as tmpdir: + gyt.call(['git', 'clone', repo.path, tmpdir]) + repo_check = gyt.repo(tmpdir, bare=False) + src = repo_check.call('show HEAD:testfile1') + assert src == u'content1' + repo_check.call('checkout master') + src = repo_check.call('show HEAD:testfile1') + assert src == u'content1' + repo_check.call('checkout %s' % tmp_branch) + src = repo_check.call('show HEAD:testfile1') + assert src == u'content1 modified' + repo_check.call('checkout master') + src = repo_check.call('show HEAD:testfile1') + assert src == u'content1' + + def test_simple_commit_in_branch_in_subdir(self): + repo = self._repo('test', bare=False) + self._commit(repo, 'test/file1', 'content1', 'msg1') + tmp_branch = repo.temp_branch_name() + repo.commit_one_file('test/file1', 'content1 modified', 'change1', + self.u, orig_hash=hash('content1'), + branch=tmp_branch) + with mkdtemp() as tmpdir: + gyt.call(['git', 'clone', repo.path, tmpdir]) + repo_check = gyt.repo(tmpdir, bare=False) + src = repo_check.call('show HEAD:test/file1') + assert src == u'content1' + repo_check.call('checkout master') + src = repo_check.call('show HEAD:test/file1') + assert src == u'content1' + repo_check.call('checkout %s' % tmp_branch) + src = repo_check.call('show HEAD:test/file1') + assert src == u'content1 modified' + repo_check.call('checkout master') + src = repo_check.call('show HEAD:test/file1') + assert src == u'content1' + + def test_simple_commit_in_branch_creates_branch(self): + repo = self._repo('test', bare=False) + self._commit(repo, 'testfile1', 'content1', 'msg1') + assert repo.get_branches() == ['master'] + tmp_branch = repo.temp_branch_name() + repo.commit_one_file('testfile1', 'content1 modified', 'change1', + self.u, orig_hash=hash('content1'), + branch=tmp_branch) + assert repo.get_branches() == ['master', tmp_branch] + + def test_simple_commit_in_branch_and_delete_branch(self): + repo = self._repo('test', bare=False) + self._commit(repo, 'testfile1', 'content1', 'msg1') + tmp_branch = repo.temp_branch_name() + repo.commit_one_file('testfile1', 'content1 modified', 'change1', + self.u, orig_hash=hash('content1'), + branch=tmp_branch) + assert tmp_branch in repo.get_branches() + repo.remove_temp_branch(tmp_branch) + assert tmp_branch not in repo.get_branches() + assert repo.get_branches() == ['master'] + + def test_simple_commit_in_another_branch(self): + repo = self._repo('test', bare=False) + self._commit(repo, 'testfile1', 'content1', 'msg1') + branch = 'mybranch' + repo.commit_one_file('testfile1', 'content1 modified', 'change1', + self.u, orig_hash=hash('content1'), branch=branch) + assert branch in repo.get_branches() + assert set(repo.get_branches()) == set(['master', branch]) diff --git a/tests/test_github.py b/tests/test_github.py new file mode 100644 index 0000000..7837290 --- /dev/null +++ b/tests/test_github.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- + +from tests.base import TestCase + +from vilya.models.user import CodeDoubanUserGithub + + +class TestGithub(TestCase): + + def test_simple_github(self): + github = CodeDoubanUserGithub(-1, 'testu', 'testug') + assert github.user_name == 'testug' + assert github.user_id == 'testu' + + def test_add_github(self): + github = CodeDoubanUserGithub.add('testu', 'testug') + assert github.user_name == 'testug' + assert github.user_id == 'testu' + + def test_get_by_user_name(self): + g1 = CodeDoubanUserGithub.add('testu1', 'testug1') + g2 = CodeDoubanUserGithub.add('testu2', 'testug2') + g3 = CodeDoubanUserGithub.get_by_user_name('testug2') + assert g3.user_id == 'testu2' diff --git a/tests/test_gyt.py b/tests/test_gyt.py new file mode 100644 index 0000000..edaee92 --- /dev/null +++ b/tests/test_gyt.py @@ -0,0 +1,385 @@ +# -*- coding: utf-8 -*- + +import os +import shutil +import tempfile +import datetime as dt +from os.path import join as opj + +import nose + +from tests.base import TestCase +from vilya.libs import gyt + +TEST_REPO = '/tmp/test_gyt/repo/.git' + +ENV_FOR_GIT = { + 'GIT_AUTHOR_NAME': 'default_test', + 'GIT_AUTHOR_EMAIL': 'default_test@douban.com', + 'GIT_COMMITTER_NAME': 'default_test', + 'GIT_COMMITTER_EMAIL': 'default_test@douban.com', +} + +class TestGyt(TestCase): + def _repo(self, bare=False): + if bare: + rep = gyt.repo(self._gd, bare=True, init=True) + else: + rep = gyt.repo(self._gd, self._wt, bare=False, init=True) + return rep + + def _add_file(self, rep, filename, content='', commit=True, + commit_msg=None): + f = open(opj(rep.work_tree, filename), 'w') + f.write(content) + f.close() + rep.call(['add', filename]) + if commit: + if not commit_msg: + commit_msg = 'unit test commit msg for %s' % filename + rep.call(['commit', '-m', commit_msg], _env=ENV_FOR_GIT) + + def setUp(self): + self._gd = tempfile.mkdtemp(prefix='gyt_gd_') # Git dir + self._wt = tempfile.mkdtemp(prefix='gyt_wt_') # Work tree + self._gd2 = tempfile.mkdtemp(prefix='gyt_gd2_') # Git dir + self._wt2 = tempfile.mkdtemp(prefix='gyt_wt2_') # Work tree + self._gdc = tempfile.mkdtemp(prefix='gyt_gd_仓库_') + self._gds = tempfile.mkdtemp(prefix='gyt_gd_ space') + + def tearDown(self): + shutil.rmtree(self._gd) + shutil.rmtree(self._wt) + shutil.rmtree(self._gd2) + shutil.rmtree(self._wt2) + shutil.rmtree(self._gdc) + shutil.rmtree(self._gds) + + def test_git_call_version(self): + out = gyt.call(gyt.GIT_EXECUTABLE, 'version') + assert 'git' in out + + def test_gyt_call_command_as_list(self): + out = gyt.call(gyt.GIT_EXECUTABLE, ['help', 'init']) + assert 'git init' in out + + def test_gyt_call_command_as_string(self): + out = gyt.call(gyt.GIT_EXECUTABLE, ['help', 'init']) + assert 'git init' in out + + def test_git_check_version(self): + _, _, ver = gyt.call(gyt.GIT_EXECUTABLE, 'version').split() + + def _ver_num(ver): + return [int(n) for n in ver.split('.')] + assert _ver_num(ver) >= _ver_num(gyt.GIT_MIN_VERSION) + + def test_git_call_init(self): + gyt.repo(self._gd, init=True) + assert os.path.exists(self._gd) + assert os.path.exists(opj(self._gd, 'refs')) + + def test_git_call_error(self): + out = gyt.call( + gyt.GIT_EXECUTABLE, 'unexisting___command__', _raise=False) + assert out is False + + def test_git_repo_with_space(self): + gd_with_space = self._gd + ' with space and 中文' + wt_with_space = self._wt + ' with space and 中文' + os.mkdir(gd_with_space) + os.mkdir(wt_with_space) + rep = gyt.repo(gd_with_space, wt_with_space, init=True) + self._add_file( + rep, 'test_filename', 'content', commit=True, commit_msg='test') + assert rep + h = rep.logs() + assert h + shutil.rmtree(gd_with_space) + shutil.rmtree(wt_with_space) + + @nose.tools.raises(gyt.GytError) + def test_git_call_error_raise(self): + gyt.call(gyt.GIT_EXECUTABLE, 'unexisting___command__') + + def test_git_call_with_int(self): + ok = gyt.call(gyt.GIT_EXECUTABLE, 'rev-parse', 123, _raise=False) + assert ok == False + + def test_git_call_with_int_in_list(self): + ok = gyt.call([gyt.GIT_EXECUTABLE, 'rev-parse', 123], _raise=False) + assert ok == False + + def xxxxxx_git_call_with_int_in_list(self): + # BROKEN, maybe no need to fix? TODO + ok = gyt.call(gyt.GIT_EXECUTABLE, ['rev-parse', 123], _raise=False) + assert ok == False + + def test_call_with_unicode(self): + assert 'aaaaa' == gyt.call(u"echo aaaaa") + test_str = u"aaaaa太牛了!" + assert test_str == gyt.call("echo '%s'" % test_str) + + def test_is_git_dir(self): + assert not gyt.is_git_dir(self._gd) + gyt.repo(self._gd, init=True) + assert gyt.is_git_dir(self._gd) + + def test_git_init_with_chinese(self): + gyt.repo(self._gdc, init=True) + assert gyt.is_git_dir(self._gdc) + + def test_git_init_with_spaces(self): + gyt.repo(self._gds, init=True) + assert gyt.is_git_dir(self._gds) + + def test_fake_git_dir(self): + os.mkdir(opj(self._gd, 'refs')) + assert os.path.exists(opj(self._gd, 'refs')) + assert not gyt.is_git_dir(self._gd) + + def test_init_bare_repo(self): + rep = gyt.repo(self._gd, init=True) + assert rep.git_dir == self._gd + assert rep.is_bare() + + def test_init_repo(self): + rep = gyt.repo(self._gd, self._wt, init=True) + assert rep.git_dir == self._gd + assert not rep.is_bare() + + def test_init_repo_and_get(self): + rep = gyt.repo(self._gd, init=True) + assert rep + rep2 = gyt.repo(self._gd) + assert rep2 + assert rep.git_dir == rep2.git_dir + + @nose.tools.raises(Exception) + def test_cannot_double_init(self): + rep1 = gyt.repo(self._gd, init=True) + assert rep1 + gyt.repo(self._gd, init=True) + + def test_init_repo_default_behavior(self): + rep = gyt.repo(self._wt, bare=False, init=True) + assert not rep.is_bare() + assert rep.work_tree == self._wt + assert rep.git_dir == opj(self._wt, gyt.GIT_DIR_DEFAULT) + + def test_bare_clone_repo(self): + rep = gyt.repo(self._gd, init=True) + clone = rep.clone(self._gd2, bare=True) + clone2 = gyt.repo(self._gd2, bare=True) + assert clone.config('remote.origin.url') == self._gd + assert clone.is_bare() + clone2 = gyt.repo(self._gd2) + assert clone2.config('remote.origin.url') == self._gd + assert clone2.is_bare() + + def test_not_bare_clone_to_not_bare(self): + rep = gyt.repo(self._gd, init=True, bare=False) + clone = rep.clone(self._wt2, bare=False) + assert not gyt.is_git_dir(self._wt2) + clone = gyt.repo(self._wt2, bare=False) + assert clone.config('remote.origin.url') == rep.git_dir + assert not clone.is_bare() + + def test_bare_clone_to_not_bare(self): + rep = gyt.repo(self._gd, init=True) + assert rep.is_bare() + clone = rep.clone(self._wt2, bare=False) + assert not gyt.is_git_dir(self._wt2) + clone = gyt.repo(self._wt2, bare=False) + assert clone.config('remote.origin.url') == rep.git_dir + assert not clone.is_bare() + + def test_commit_missing_m(self): + rep = self._repo() + # The call below could hang the script + # if not protected by check_cmd, because + # git would wait for commit message + out = rep.call(['commit'], _raise=False) + assert out is False + + def test_commit_missing_message(self): + rep = self._repo() + self._add_file(rep, 'test1', commit=False) + # Will not work, no message passed + out = rep.call(['commit', '-m'], _raise=False) + assert out is False + + def test_head(self): + rep = self._repo() + assert rep.head() == 'refs/heads/master' + assert rep.head(short=True) == 'master' + self._add_file(rep, 'test1') # Need one commit before branching + assert rep.head() == 'refs/heads/master' + rep.call(['branch', 'test_branch']) + rep.call(['checkout', 'test_branch']) + assert rep.head() == 'refs/heads/test_branch' + + def test_refs(self): + rep = self._repo() + assert rep.refs() == [] + self._add_file(rep, 'test1') # Need one commit before branching + assert len(rep.refs()) == 1 + assert rep.refs() == ['refs/heads/master'] + master_ref = rep.ref_details(rep.refs()[0]) + assert master_ref['type'] == 'commit' + assert master_ref['name'] == 'refs/heads/master' + assert master_ref['shortname'] == 'master' + assert rep.cat(master_ref['sha'], only_type=True) == 'commit' + rep.call(['branch', 'test_branch']) + assert rep.refs(short=True) == ['master', 'test_branch'] + assert len(rep.refs()) == 2 + + def test_refs_with_chinese(self): + rep = self._repo() + self._add_file(rep, 'test1') + rep.call(['branch', 'test_branch牛逼']) + assert rep.refs(short=True) == [u'master', u'test_branch\u725b\u903c'] + + def test_refs_with_tags(self): + rep = self._repo() + self._add_file(rep, 'test1') # Need one commit before branching + rep.call(['branch', 'test_branch']) + assert len(rep.refs()) == 2 + rep.call(['tag', 'test_tag1'], _env=ENV_FOR_GIT) + assert len(rep.refs()) == 3 + assert len(rep.refs(select='tags')) == 1 + assert len(rep.refs(select='branches')) == 2 + + def test_refs_current_first(self): + rep = self._repo() + self._add_file(rep, 'test1') # Need one commit before branching + rep.call(['branch', 'a_br']) + rep.call(['branch', 'b_br']) + assert rep.refs(short=True) == ['a_br', 'b_br', 'master'] + assert rep.head(short=True) == 'master' + assert rep.refs( + short=True, current_first=True) == ['master', 'a_br', 'b_br'] + rep.call(['checkout', 'b_br']) + assert rep.head(short=True) == 'b_br' + assert rep.refs(short=True) == ['a_br', 'b_br', 'master'] + assert rep.refs( + short=True, current_first=True) == ['b_br', 'a_br', 'master'] + + def test_commit(self): + rep = self._repo() + self._add_file(rep, 'test1', commit=False) + before = dt.datetime.now() - dt.timedelta(seconds=1) + rep.call( + "commit -m 'test_msg\n\nmsg_body' --author='test author <ta@example.com>'", # noqa + _env=ENV_FOR_GIT) + after = dt.datetime.now() + dt.timedelta(seconds=1) + cmt = rep.cat(rep.head()) + assert cmt['author']['name'] == 'test author' + assert cmt['author']['email'] == 'ta@example.com' + assert before < cmt['author']['date'] < after + assert cmt['message'] == 'test_msg' + assert cmt['body'] == 'msg_body' + assert cmt['tree'] == rep.call('rev-parse HEAD^{tree}') + assert cmt['parent'] == [] + + def test_commit_using_env(self): + rep = self._repo() + self._add_file(rep, 'test1', commit=False) + before = dt.datetime.now() - dt.timedelta(seconds=1) + env = {'GIT_AUTHOR_NAME': 'test author', + 'GIT_AUTHOR_EMAIL': 'ta@example.com', + 'GIT_COMMITTER_NAME': 'test commiter', + 'GIT_COMMITTER_EMAIL': 'tc@example.com', + } + rep.call("commit -m 'test_msg\n\nmsg_body'", _env=env) + after = dt.datetime.now() + dt.timedelta(seconds=1) + cmt = rep.cat(rep.head()) + assert cmt['author']['name'] == 'test author' + assert cmt['author']['email'] == 'ta@example.com' + assert before < cmt['author']['date'] < after + assert cmt['message'] == 'test_msg' + assert cmt['body'] == 'msg_body' + assert cmt['tree'] == rep.call('rev-parse HEAD^{tree}') + assert cmt['parent'] == [] + + def test_merge_commit_has_two_parents(self): + rep = self._repo(bare=False) + with open(opj(rep.work_tree, 'test1'), 'w') as f: + f.write('a\nb\nc\n\d') + rep.call('add test1') + rep.call('commit -mtest_merge1', _env=ENV_FOR_GIT) + rep.call('branch br_a') + rep.call('checkout br_a') + with open(opj(rep.work_tree, 'test1'), 'w') as f: + f.write('a\nb\nc\n\d2') + rep.call('commit -a -mtest_merge2', _env=ENV_FOR_GIT) + parent1 = rep.sha(rep.head()) + rep.call('checkout master') + with open(opj(rep.work_tree, 'test1'), 'w') as f: + f.write('a1\nb\nc\n\d') + rep.call('commit -a -mtest_merge3', _env=ENV_FOR_GIT) + parent2 = rep.sha(rep.head()) + rep.call('merge br_a', _env=ENV_FOR_GIT) + cmt = rep.cat(rep.head()) + assert set(cmt['parent']) == set([parent1, parent2]) + + def test_two_commits(self): + rep = self._repo() + self._add_file(rep, 'test1', commit_msg='msg1') + self._add_file(rep, 'test2', commit_msg='msg2') + log = list(rep.logs()) + assert len(log) == 2 + assert log[0]['sha'] + assert log[0]['message'] == 'msg2' # Beware, reverse time + assert log[1]['message'] == 'msg1' + + def test_empty_log(self): + rep = self._repo() + log = rep.logs() + assert log == [] + + def test_cat_tree(self): + rep = self._repo() + self._add_file(rep, 'test1', commit_msg='msg1') + self._add_file(rep, 'test2', commit_msg='msg2') + assert rep.head() + tree_sha = rep.cat(rep.head())['tree'] + tree = rep.cat(tree_sha) + assert tree[0]['path'] == 'test1' + assert tree[1]['path'] == 'test2' + + def test_cat_blob(self): + rep = self._repo() + fn = 'test1' + content = 'abcd' + self._add_file(rep, fn, commit_msg='msg1', content=content) + sha = rep.call('rev-parse HEAD:%s' % fn) + assert rep.cat(sha) == content + + def test_cat_tag(self): + rep = self._repo() + self._add_file(rep, 'test1', commit_msg='msg1', content='abcd') + tag = 'v1.2.3' + rep.call(['tag', tag, '-m', 'testtag'], _env=ENV_FOR_GIT) + assert rep.call('tag') == tag + tag_sha = rep.call(['rev-parse', tag]) + tag_obj = rep.cat(tag_sha) + assert tag_obj['type'] == 'commit' + assert tag_obj['message'] == 'testtag' + assert tag_obj['tag'] == tag + + def test_cat_blob_with_trailing_spaces(self): + rep = self._repo() + fn = 'test1' + content = '\nabcd \n' + self._add_file(rep, fn, commit_msg='msg1', content=content) + sha = rep.call('rev-parse HEAD:%s' % fn) + assert rep.cat(sha) == content + + def test_cat_blob_with_unicode(self): + rep = self._repo() + fn = 'test1' + content = 'abcd啊呀' + self._add_file(rep, fn, commit_msg='msg1', content=content) + sha = rep.call('rev-parse HEAD:%s' % fn) + assert rep.cat(sha) == content diff --git a/tests/test_gyt_diff.py b/tests/test_gyt_diff.py new file mode 100644 index 0000000..5f0f418 --- /dev/null +++ b/tests/test_gyt_diff.py @@ -0,0 +1,167 @@ +# -*- coding: utf-8 -*- +import shutil +import tempfile +from os.path import join as opj + +from tests.base import TestCase +from vilya.libs import gyt + +TEST_REPO = '/tmp/test_gyt/repo/.git' + +ENV_FOR_GIT = { + 'GIT_AUTHOR_NAME': 'default_test', + 'GIT_AUTHOR_EMAIL': 'default_test@douban.com', + 'GIT_COMMITTER_NAME': 'default_test', + 'GIT_COMMITTER_EMAIL': 'default_test@douban.com', +} + + +class TestGyt(TestCase): + def _repo(self, bare=False): + if bare: + rep = gyt.repo(self._gd, bare=True, init=True) + else: + rep = gyt.repo(self._gd, self._wt, bare=False, init=True) + return rep + + def _add_file(self, rep, filename, content='', commit=True, + commit_msg=None): + f = open(opj(rep.work_tree, filename), 'w') + f.write(content) + f.close() + rep.call(['add', filename]) + if commit: + if not commit_msg: + commit_msg = 'unit test commit msg for %s' % filename + rep.call(['commit', '-m', commit_msg], _env=ENV_FOR_GIT) + + def setUp(self): + self._gd = tempfile.mkdtemp(prefix='gyt_gd_') # Git dir + self._wt = tempfile.mkdtemp(prefix='gyt_wt_') # Work tree + self._gd2 = tempfile.mkdtemp(prefix='gyt_gd2_') # Git dir + self._wt2 = tempfile.mkdtemp(prefix='gyt_wt2_') # Work tree + + def tearDown(self): + shutil.rmtree(self._gd) + shutil.rmtree(self._wt) + shutil.rmtree(self._gd2) + shutil.rmtree(self._wt2) + + def test_one_diff(self): + rep = self._repo() + fn1 = 'test1' + content1a = 'a\nb\nc\nd' + content1b = 'a\nb\ncxxx\nd' + self._add_file(rep, fn1, commit_msg='msg1a', content=content1a) + sha = rep.sha() + self._add_file(rep, fn1, commit_msg='msg1b', content=content1b) + d = rep.diff(sha) + assert len(d) == 1 + d1 = d[0] + assert d1['filename'] == fn1 + assert d1['amode'] == d1['bmode'] == '100644' + assert len(d1['patch']) == 1 + assert d1['patch'][0][0] == '@@ -1,4 +1,4 @@' + chunk = d1['patch'][0][1] + assert chunk == [ + ('idem', u'a'), + ('idem', u'b'), + ('rem', u'c'), + ('add', u'cxxx'), + ('idem', u'd'), + ('other', u' No newline at end of file') + ] + + def test_one_diff_without_patch(self): + rep = self._repo() + fn1 = 'test1' + content1a = 'a\nb\nc\nd' + content1b = 'a\nb\ncxxx\nd' + self._add_file(rep, fn1, commit_msg='msg1a', content=content1a) + sha = rep.sha() + self._add_file(rep, fn1, commit_msg='msg1b', content=content1b) + d = rep.diff(sha, patch=False) + assert 'patch' not in d[0] + + def test_one_diff_without_parsing_patch(self): + rep = self._repo() + fn1 = 'test1' + content1a = 'a\nb\nc\nd' + content1b = 'a\nb\ncxxx\nd' + self._add_file(rep, fn1, commit_msg='msg1a', content=content1a) + sha = rep.sha() + self._add_file(rep, fn1, commit_msg='msg1b', content=content1b) + d = rep.diff(sha, parse_patch=False) + chunk = d[0]['patch'][0][1] + assert chunk == [' a', ' b', '-c', '+cxxx', ' d', + '\\ No newline at end of file'] + + def test_diff_when_only_one_commit(self): + rep = self._repo() + fn1 = 'test1' + fn2 = 'test2' + content1a = 'a' + self._add_file(rep, fn1, commit_msg='msg1a', content=content1a) + sha = rep.sha() + self._add_file(rep, fn2, commit_msg='msg1a', content=content1a) + d = rep.diff(sha) + assert d[0]['patch'][0][1][0] == ('add', u'a') + + def test_diff_when_on_first_commit(self): + rep = self._repo() + fn1 = 'test1' + content1a = 'a' + self._add_file(rep, fn1, commit_msg='msg1a', content=content1a) + d = rep.diff() + assert d[0]['patch'][0][1][0] == ('add', u'a') + + def test_two_diffs(self): + rep = self._repo() + fn1 = 'test1' + fn2 = 'test2' + content1a = 'a\nb\nc\nd' + content1b = 'a\nb\ncxxx\nd' + content2a = '1\n2\n3\n4' + content2b = '1\n2xxx\n3\n4' + self._add_file(rep, fn1, commit_msg='msg1a', content=content1a) + self._add_file(rep, fn2, commit_msg='msg2a', content=content2a) + sha = rep.sha() + self._add_file(rep, fn1, commit_msg='msg1b', content=content1b) + self._add_file(rep, fn2, commit_msg='msg2b', content=content2b) + d = rep.diff(sha) + assert len(d) == 2 + assert d[0]['filename'] == fn1 + assert d[1]['filename'] == fn2 + + def test_diff_with_one_rename(self): + rep = self._repo() + content1a = 'aaaaa' + self._add_file( + rep, 'test_filename', commit_msg='msg1a', content=content1a) + rep.call('mv test_filename test_new_filename') + rep.call('commit -mmv', _env=ENV_FOR_GIT) + d = rep.diff() + assert len(d) == 2, "should have two patches if undetected rename" + d = rep.diff(rename_detection=True) + assert len(d) == 1, "should have one patch if undetected rename" + assert d[0]['filename'] == 'test_filename' + assert d[0]['new_filename'] == 'test_new_filename' + + def test_diff_with_two_renames(self): + rep = self._repo() + self._add_file( + rep, 'test_filename1', commit_msg='msg1a', content='aaaaa') + self._add_file( + rep, 'test_filename2', commit_msg='msg2a', content='bbbbb') + rep.call('mv test_filename1 test_new_filename1') + rep.call('mv test_filename2 test_new_filename2') + rep.call('commit -mmv', _env=ENV_FOR_GIT) + d = rep.diff() + assert len(d) == 4, "should have 4 patches if undetected rename, had %s" % len(d) # noqa + d = rep.diff(rename_detection=True) + assert len(d) == 2, "should have 2 patch if undetected rename" + print d + assert d[0]['filename'] == 'test_filename1' + assert d[0]['new_filename'] == 'test_new_filename1' + assert d[1]['filename'] == 'test_filename2' + assert d[1]['new_filename'] == 'test_new_filename2' diff --git a/tests/test_hook.py b/tests/test_hook.py new file mode 100644 index 0000000..ef9e006 --- /dev/null +++ b/tests/test_hook.py @@ -0,0 +1,45 @@ +import unittest + +from vilya.models.project import CodeDoubanProject +from vilya.models.hook import CodeDoubanHook +from tests.base import TestCase +from tests.utils import delete_project + + +class TestHook(TestCase): + def setUp(self): + TestCase.setUp(self) + + def _prj(self): + delete_project('demo2') + return CodeDoubanProject.add("demo2", owner_id="testuser1") + + def test_add_hook(self): + url = "http://this.is.a.url" + prj = self._prj() + hook = CodeDoubanHook.add(url, prj.id) + hooked_project = CodeDoubanProject.get(hook.project_id) + assert hooked_project + assert hook.__dict__ == hooked_project.hooks[0].__dict__ + + def test_project_validate(self): + wrong_url_hook = CodeDoubanHook(108, 'innotaurl', "100") + wrong_project_id_hook = CodeDoubanHook( + 109, 'http://douaban.com', "noainteger") + ok_hook = CodeDoubanHook(109, 'http://douaban.com', "101") + assert wrong_url_hook.validate() + assert wrong_project_id_hook.validate() + assert not bool(ok_hook.validate()) + + def test_destroy_hook(self): + url = "http://this.is.other.url" + prj = self._prj() + hook = CodeDoubanHook.add(url, prj.id) + hooked_project = CodeDoubanProject.get(hook.project_id) + assert len(hooked_project.hooks) == 1 + hooked_project = CodeDoubanProject.get(hook.project_id) + hook.destroy() + assert len(hooked_project.hooks) == 0 + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_htmlprocessor.py b/tests/test_htmlprocessor.py new file mode 100644 index 0000000..783ed1c --- /dev/null +++ b/tests/test_htmlprocessor.py @@ -0,0 +1,40 @@ +from tests.base import TestCase +from vilya.libs.htmlprocessor import html_index_content + + +class TestHTMLProcessor(TestCase): + + def test_process_whitespaces(self): + html = ''' + <h1>Title</h1> + <br /> + <p>This is a paragraph.</p> + ''' + res = html_index_content(html) + assert res == "Title This is a paragraph." + + def test_remove_script_tags(self): + html = ''' + <h1>Title</h1> + <script type="text/javascript"> + </script> + ''' + res = html_index_content(html) + assert res == "Title" + + def test_unescape(self): + html = ''' + <h1>Title</h1> + <script type="text/javascript"> + </script> + <footer> + <a href="./" class="button_accent"> +    Back to blog + </a> + </footer> + <code> + print 1<3 + </code> + ''' + res = html_index_content(html) + assert res == "Title Back to blog print 1<3" diff --git a/tests/test_linecomment.py b/tests/test_linecomment.py new file mode 100644 index 0000000..73811de --- /dev/null +++ b/tests/test_linecomment.py @@ -0,0 +1,135 @@ +# -*- coding: utf-8 -*- + +from tests.base import TestCase + +from vilya.models.linecomment import CommitLineComment, PullLineComment +from vilya.models.consts import ( + LINECOMMENT_TYPE_COMMIT, LINECOMMENT_TYPE_PULL) + +TARGET_ID = 123 +FROM_SHA = '2a200e45b0e223d13477e' +TO_SHA = '2a200e45b0e223d13477e' +OLD_PATH = 'testfolder/testfile.py' +NEW_PATH = 'testfolder/testfile2.py' +FROM_OID = '2a200e45b0e223d13477e' # TODO: oids +TO_OID = '2a200e45b0e223d13477e' +AUTHOR = 'user1' +CONTENT1 = 'test line comment content' +CONTENT2 = 'another test line comment content' +CONTENT_ZH = u'你好,再见' + + +class LineCommentTest(TestCase): + + def test_add_comment(self): + # commit + c1 = CommitLineComment.add(TARGET_ID, FROM_SHA, TO_SHA, + OLD_PATH, NEW_PATH, FROM_OID, TO_OID, + 20, 30, AUTHOR, CONTENT1) + assert c1.target_id == TARGET_ID + assert c1.target_type == LINECOMMENT_TYPE_COMMIT + assert c1.from_sha == FROM_SHA + assert c1.to_sha == TO_SHA + assert c1.old_path == OLD_PATH + assert c1.new_path == NEW_PATH + assert c1.from_oid == FROM_OID + assert c1.to_oid == TO_OID + assert c1.old_linenum == 20 + assert c1.new_linenum == 30 + assert c1.linenum == (20, 30) + assert c1.author == AUTHOR + assert c1.content == CONTENT1 + assert c1.position is None + assert c1.paths + + # pull + c2 = PullLineComment.add(TARGET_ID, FROM_SHA, TO_SHA, + OLD_PATH, NEW_PATH, FROM_OID, TO_OID, + 20, 30, AUTHOR, CONTENT2) + assert c2.target_id == TARGET_ID + assert c2.target_type == LINECOMMENT_TYPE_PULL + assert c2.from_sha == FROM_SHA + assert c2.to_sha == TO_SHA + assert c2.old_path == OLD_PATH + assert c2.new_path == NEW_PATH + assert c2.from_oid == FROM_OID + assert c2.to_oid == TO_OID + assert c2.old_linenum == 20 + assert c2.new_linenum == 30 + assert c2.linenum == (20, 30) + assert c2.author == AUTHOR + assert c2.content == CONTENT2 + assert c2.position is None + assert c2.paths + + def test_update_comment(self): + # commit + c1 = CommitLineComment.add(TARGET_ID, FROM_SHA, TO_SHA, + OLD_PATH, NEW_PATH, FROM_OID, TO_OID, + 20, 30, AUTHOR, CONTENT1) + assert c1.content == CONTENT1 + c1.update(CONTENT2) + c1 = CommitLineComment.get(c1.id) + assert c1.content == CONTENT2 + + # pull + c2 = PullLineComment.add(TARGET_ID, FROM_SHA, TO_SHA, + OLD_PATH, NEW_PATH, FROM_OID, TO_OID, + 20, 30, AUTHOR, CONTENT2) + assert c2.content == CONTENT2 + c2.update(CONTENT_ZH) + c2 = CommitLineComment.get(c2.id) + assert c2.content == CONTENT_ZH + + def test_delete_comment(self): + # commit + self.clear_comments(CommitLineComment, TARGET_ID, FROM_SHA) + c1 = CommitLineComment.add(TARGET_ID, FROM_SHA, TO_SHA, + OLD_PATH, NEW_PATH, FROM_OID, TO_OID, + 20, 30, AUTHOR, CONTENT1) + cs = CommitLineComment.gets_by_target_and_ref(TARGET_ID, FROM_SHA) + assert len(cs) == 1 + c1.delete() + cs = CommitLineComment.gets_by_target_and_ref(TARGET_ID, FROM_SHA) + assert len(cs) == 0 + + # pull + self.clear_comments(PullLineComment, TARGET_ID, FROM_SHA) + c2 = PullLineComment.add(TARGET_ID, FROM_SHA, TO_SHA, + OLD_PATH, NEW_PATH, FROM_OID, TO_OID, + 20, 30, AUTHOR, CONTENT1) + cs = PullLineComment.gets_by_target_and_ref(TARGET_ID, FROM_SHA) + assert len(cs) == 1 + c2.delete() + cs = PullLineComment.gets_by_target_and_ref(TARGET_ID, FROM_SHA) + assert len(cs) == 0 + + def test_gets_by_target_and_ref(self): + # commit + self.clear_comments(CommitLineComment, TARGET_ID, FROM_SHA) + c1 = CommitLineComment.add(TARGET_ID, FROM_SHA, TO_SHA, + OLD_PATH, NEW_PATH, FROM_OID, TO_OID, + 20, 30, AUTHOR, CONTENT1) + c2 = CommitLineComment.add(TARGET_ID, FROM_SHA, TO_SHA, + OLD_PATH, NEW_PATH, FROM_OID, TO_OID, + 20, 30, AUTHOR, CONTENT1) + c3 = CommitLineComment.add(TARGET_ID, FROM_SHA, TO_SHA, + OLD_PATH, NEW_PATH, FROM_OID, TO_OID, + 20, 30, AUTHOR, CONTENT1) + cs = CommitLineComment.gets_by_target_and_ref(TARGET_ID, FROM_SHA) + assert len(cs) == 3 + + self.clear_comments(PullLineComment, TARGET_ID, FROM_SHA) + # pull + PullLineComment.add(TARGET_ID, FROM_SHA, TO_SHA, + OLD_PATH, NEW_PATH, FROM_OID, TO_OID, + 20, 30, AUTHOR, CONTENT1) + PullLineComment.add(TARGET_ID, FROM_SHA, TO_SHA, + OLD_PATH, NEW_PATH, FROM_OID, TO_OID, + 20, 30, AUTHOR, CONTENT1) + cs = PullLineComment.gets_by_target_and_ref(TARGET_ID, FROM_SHA) + assert len(cs) == 2 + + def clear_comments(self, classObj, TARGET_ID, FROM_SHA): + cs = classObj.gets_by_target_and_ref(TARGET_ID, FROM_SHA) + classObj.delete_multi(cs) diff --git a/tests/test_lru_counter.py b/tests/test_lru_counter.py new file mode 100644 index 0000000..25073f8 --- /dev/null +++ b/tests/test_lru_counter.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- + +from tests.base import TestCase + +from vilya.models.lru_counter import LRUCounter + + +class TestLRUCounter(TestCase): + def test_lru_counter(self): + ids = range(5) + user = 'lihan' + counter = LRUCounter(user, ids) + counter.use(ids[-1]) + ret = counter.sort() + assert ret == [4, 0, 1, 2, 3] diff --git a/tests/test_notification.py b/tests/test_notification.py new file mode 100644 index 0000000..639dbc2 --- /dev/null +++ b/tests/test_notification.py @@ -0,0 +1,60 @@ +import time + +from tests.base import TestCase +from vilya.models.notification import Notification, rds_key_for_receiver +from vilya.libs.rdstore import rds + + +class TestNotification(TestCase): + + def setUp(self): + self.test_user1 = "testuser_for_test" + self.test_user2 = "testuser_for_test2" + self.receivers = [self.test_user1, self.test_user2] + self.uids = [self.gen_uid() for i in range(50)] + + def tearDown(self): + rds.delete(rds_key_for_receiver(self.test_user1)) + rds.delete(rds_key_for_receiver(self.test_user2)) + + def gen_uid(self): + t = time.time() + t1 = int(t) + t2 = int((t-t1)*10E6) + time.sleep(0.01) + return "%x%x" % (t1, t2) + + def test_add_notification(self): + data = {'data': 'some data here'} + for i, uid in enumerate(self.uids[:10], start=1): + Notification(uid, self.receivers, data).send() + assert len(Notification.get_data(self.test_user1)) == i + assert Notification.unread_count(self.test_user1) == i + assert len(Notification.get_data(self.test_user2)) == i + assert Notification.unread_count(self.test_user2) == i + + def test_mark_as_read(self): + data = {'data': 'some data here'} + for uid in self.uids: + Notification(uid, self.receivers, data).send() + + to_mark_as_read = self.uids[:5] + self.uids[20:30] + self.uids[40:50] + + for i, uid in enumerate(to_mark_as_read, start=1): + Notification.mark_as_read(self.test_user1, uid) + assert Notification.unread_count(self.test_user1) == 50-i + + assert Notification.unread_count(self.test_user2) == 50 + Notification.mark_all_as_read(self.test_user2) + assert Notification.unread_count(self.test_user2) == 0 + + def test_get_data(self): + for i, uid in enumerate(self.uids[:10], start=1): + data = {'data': 'test' + uid} + Notification(uid, self.receivers, data).send() + + data = Notification.get_data(self.test_user1) + assert len(data) == 10 + for i, d in enumerate(reversed(data)): + assert d.get('uid') == self.uids[i] + assert d.get('data') == 'test'+self.uids[i] diff --git a/tests/test_oauth.py b/tests/test_oauth.py new file mode 100644 index 0000000..490fc9a --- /dev/null +++ b/tests/test_oauth.py @@ -0,0 +1,24 @@ +# encoding: utf-8 +from tests.base import TestCase +from webtest import TestApp +import app as M + +from vilya.models.api_token import ApiToken + + +class OAuthTest(TestCase): + + def test_login(self): + app = TestApp(M.app) + user_id = 'testuser' + apikey = self._add_api_key() + token = ApiToken.add(apikey.client_id, user_id) + app.get('/', + headers=dict(Authorization="Bearer %s" % token.token), + status=200) + + def test_unauthorized_login(self): + app = TestApp(M.app) + r = app.get( + '/', headers=dict(Authorization="Bearer BAD"), + status=202) diff --git a/tests/test_project.py b/tests/test_project.py new file mode 100644 index 0000000..90bde28 --- /dev/null +++ b/tests/test_project.py @@ -0,0 +1,174 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +import os +from datetime import datetime + +from nose.tools import ok_ + +from tests.base import TestCase + +from vilya.config import DOMAIN +from vilya.models.project import CodeDoubanProject +from vilya.libs.text import gravatar_url +from vilya.libs.permdir import get_repo_root + + +class TestProject(TestCase): + + def test_create_project(self): + project_name = "project" + project = CodeDoubanProject.add( + project_name, owner_id="test1", summary="test", product="fire") + + git_path = os.path.join(get_repo_root(), '%s.git' % project_name) + ok_(os.path.exists(git_path)) + project.delete() + + # 本地开发禁用hook了 + # def test_create_project_with_hook(self): + # project_name = "project2" + # project = CodeDoubanProject.add( + # project_name, owner_id="test1", summary="test", product="fire") + # hookfile_path = "%s/hooks/post-receive" % project.git_real_path + # ok_(os.path.exists(hookfile_path)) + # project.delete() + + def test_project_meta_dict(self): + project_name = "project3" + owner_id = "testuser" + summary = "a summary" + product = "fire" + project = CodeDoubanProject.add( + project_name, owner_id, summary, product) + # hookfile_path = "%s/hooks/post-receive" % project.git_real_path + project = CodeDoubanProject.get_by_name(project_name) + data = { + 'url': "%s/%s" % (DOMAIN, project_name), + 'name': project_name, + 'description': summary, + 'product': product, + 'committers_count': 0, + 'forked_count': 0, + 'open_issues_count': 0, + 'open_tickets_count': 0, + 'watched_count': 0, + 'owner': { + 'name': owner_id, + 'avatar': gravatar_url(owner_id + '@douban.com'), + }, + } + commits = project.git.get_revisions("HEAD~1", "HEAD") + if commits: + data['last_commit'] = commits[0] + ok_(project.get_info() == data) + project.delete() + + def test_project_validate(self): + noname_project = CodeDoubanProject( + 108, '', "test1", "testuser", datetime.now(), "fire", + '/fake_path', '/fake_path') + ok_project = CodeDoubanProject( + 108, 'project6', "testuser", datetime.now(), "test", + "fire", '/fake_path', '/fake_path') + ok_(bool(noname_project.validate())) + ok_(not bool(ok_project.validate())) + + def test_permissions_check(self): + project_name = "project4" + project = CodeDoubanProject.add(project_name, owner_id="admin_user", + summary="test", product="fire") + ok_(project.is_admin("admin_user")) + ok_(not project.is_admin("other_user")) + project.delete() + + def test_delete_project(self): + project_name = "project5" + project = CodeDoubanProject.add(project_name, owner_id="admin_user", + summary="test", product="fire") + + git_path = os.path.join(get_repo_root(), '%s.git' % project_name) + ok_(os.path.isdir(git_path)) + project.delete() + ok_(not os.path.exists(git_path)) + + def test_fork_and_watch_project(self): + p6 = CodeDoubanProject.add('project6', owner_id="admin_user", + summary="test", product="fire") + p7 = CodeDoubanProject.add('project7', owner_id="other_user", + summary="test", product="fire") + + fork_count = CodeDoubanProject.get_forked_count(p6.id) + p6fork = p6.fork('project6_other_user', 'other_user') + fork_count2 = CodeDoubanProject.get_forked_count(p6.id) + ok_(fork_count2 == fork_count + 1) + ok_(CodeDoubanProject.get_forked_count(p6fork.id) == 0) + + p6fork2 = p6fork.fork('project6_fork_other_user', 'other_user') + ok_(CodeDoubanProject.get_forked_count(p6.id) == fork_count + 2) + ok_(CodeDoubanProject.get_forked_count(p6fork.id) == 1) + ok_(CodeDoubanProject.get_forked_count(p6fork2.id) == 0) + + watch_count = CodeDoubanProject.get_watched_count(p7.id) + CodeDoubanProject.add_watch(p7.id, 'admin_user') + watch_count2 = CodeDoubanProject.get_watched_count(p7.id) + ok_(watch_count2 == watch_count + 1) + + ok_(len(p7.get_watch_users()) == watch_count2) + + p6.delete() + p7.delete() + + def test_transfer_project(self): + pname1 = 'project6' + pname2 = 'project7' + proj_owner = 'admin_user' + to_user = 'testuser1' + p = CodeDoubanProject.add(pname1, owner_id=proj_owner, + summary="test", product="fire") + _ = CodeDoubanProject.add(pname2, owner_id=proj_owner, + summary="test", product="fire") + p.transfer_to(to_user) + p1 = CodeDoubanProject.get_by_name(pname1) + assert p1.owner_id == to_user + p2 = CodeDoubanProject.get_by_name(pname2) + assert p2.owner_id == proj_owner + + def test_rename_project(self): + pname1 = 'project8' + pname2 = 'project9' + proj_owner = 'admin_user' + p = CodeDoubanProject.add(pname1, owner_id=proj_owner, + summary="test", product="fire") + p.rename(pname2) + assert p.name == pname2 + git_path = os.path.join(get_repo_root(), '%s.git' % pname2) + ok_(os.path.exists(git_path)) + + def test_rename_bad_project(self): + pname1 = 'project10' + pname2 = '/dad13/' + proj_owner = 'admin_user' + p = CodeDoubanProject.add(pname1, owner_id=proj_owner, + summary="test", product="fire") + assert p.rename(pname2) is False + git_path = os.path.join(get_repo_root(), '%s.git' % pname1) + ok_(os.path.exists(git_path)) + + def test_update_can_push(self): + project_name = "project11" + owner_id = "testuser" + summary = "a summary" + product = "fire" + CodeDoubanProject.add(project_name, + owner_id, + summary, + product) + p = CodeDoubanProject.get_by_name('project11') + assert p.can_push == 1 + p.update_can_push(False) + p = CodeDoubanProject.get_by_name('project11') + assert p.can_push == 0 + p.update_can_push(True) + p = CodeDoubanProject.get_by_name('project11') + assert p.can_push == 1 diff --git a/tests/test_project_conf.py b/tests/test_project_conf.py new file mode 100644 index 0000000..83885be --- /dev/null +++ b/tests/test_project_conf.py @@ -0,0 +1,68 @@ +from tests.base import TestCase + +from vilya.models.project import CodeDoubanProject +from vilya.models.project_conf import PROJECT_CONF_FILE + +from nose.tools import raises + + +class TestProjectConf(TestCase): + + def test_create_project_without_conf(self): + self.clean_up() + project = CodeDoubanProject.add( + 'tp', owner_id="test1", create_trac=False) + assert project.conf['docs'], "enabled by default" + + def test_conf_add_wrong_keys(self): + self.clean_up() + project = CodeDoubanProject.add( + 'tp', owner_id="test1", create_trac=False) + u = self.addUser() + project.git.commit_one_file( + PROJECT_CONF_FILE, + 'unexisting_key_argl1: 1\nunexisting_key_argl2: 2', 'm', u) + assert 'unexisting_key_argl1' not in project.conf + + def test_conf(self): + self.clean_up() + project = CodeDoubanProject.add( + 'tp', owner_id="test1", create_trac=False) + u = self.addUser() + project.git.commit_one_file(PROJECT_CONF_FILE, + 'docs: {Docs: {dir: other_dir}}', 'm', u) + assert project.conf['docs']['Docs']['dir'] == 'other_dir' + + @raises(Exception) + def test_broken_conf(self): + self.clean_up() + project = CodeDoubanProject.add( + 'tp', owner_id="test1", create_trac=False) + u = self.addUser() + project.git.commit_one_file(PROJECT_CONF_FILE, + 'docs {dir: other_dir', 'm', u) + assert project.conf['docs']['dir'] == 'other_dir' + + def test_cannot_set_undefined_first_level_entry(self): + self.clean_up() + project = CodeDoubanProject.add( + 'tp', owner_id="test1", create_trac=False) + u = self.addUser() + project.git.commit_one_file(PROJECT_CONF_FILE, + 'unexisting_key: 123', 'm', u) + # First level key need to be defined in default_code_config.yaml + assert 'unexisting_key' not in project.conf + + def test_can_set_undefined_second_level_entry(self): + self.clean_up() + project = CodeDoubanProject.add( + 'tp', owner_id="test1", create_trac=False) + u = self.addUser() + project.git.commit_one_file(PROJECT_CONF_FILE, + 'docs: {unexisting_key: aaa}', 'm', u) + assert project.conf['docs']['unexisting_key'] == 'aaa' + + def clean_up(self): + prj = CodeDoubanProject.get_by_name('tp') + if prj: + prj.delete() diff --git a/tests/test_project_git_calls.py b/tests/test_project_git_calls.py new file mode 100644 index 0000000..f16862d --- /dev/null +++ b/tests/test_project_git_calls.py @@ -0,0 +1,348 @@ +# -*- coding: utf-8 -*- + +import os + +from vilya.models.project import CodeDoubanProject +from vilya.libs import gyt +from vilya.libs.permdir import get_repo_root + +from tests.base import TestCase +from tests.utils import delete_project + +T_MSG1 = u'msg1呀' +T_AUTHOR = u'Test Author 不是我' +T_AUTHOR_EMAIL = 'test@example.com' +T_AUTHOR2 = u'Test Author 是我' +T_AUTHOR_EMAIL2 = 'test2@example.com' +T_FILE1 = u'是file1' + + +class TestProjectGitCalls(TestCase): + def setUp(self): + TestCase.setUp(self) + + def tearDown(self): + TestCase.tearDown(self) + + def _path_for_clone(self, name): + return os.path.join(get_repo_root(), '%s.clone' % name) + + def _commit_push(self, proj, objs, msg='testmsg', author=T_AUTHOR, + author_email=T_AUTHOR_EMAIL): + repo = gyt.repo(proj.git.path) + clone_path = self._path_for_clone(proj.name) + if os.path.exists(clone_path): + clone = gyt.repo(clone_path, bare=False) + else: + clone = repo.clone(clone_path, bare=False) + # TODO allow commiting more than one file + # assert os.path.exists(repo.work_tree), \ + # noqa "repo.work_tree must exist, check if repo has been created with bare=False" + for filename, content in objs: + f = open(os.path.join(clone.work_tree, filename), 'w') + f.write(content) + f.close() + clone.call(['add', filename]) + clone.call(['commit', '--author', '%s <%s>' % ( + author, author_email), '-m', msg], _env=self.env_for_git) + clone.call('push origin HEAD') + return clone.sha() + + def _proj(self, name='test_proj', owner='test_user'): + delete_project(name) + proj = CodeDoubanProject.add(name, owner, create_trac=False) + return proj + + def test_commit_encoded_chinese(self): + content = 'content1串串' + proj = self._proj('prj') + sha = self._commit_push(proj, [[T_FILE1, content]], T_MSG1) + assert sha + + def test_add(self): + proj = self._proj('prj') + assert proj.name == 'prj' + assert gyt.is_git_dir(proj.git.path) + + def test_fork(self): + proj = self._proj('test_proj') + fork = proj.fork('test_proj_fork', 'user2') + assert gyt.is_git_dir(fork.git.path) + assert fork.fork_from == proj.id + assert fork.id != proj.id + + def test_get_src(self): + proj = self._proj('test_get_src') + self._commit_push(proj, [[T_FILE1, 'content1']], T_MSG1) + src = proj.git.get_src(T_FILE1) + assert src == ('blob', 'content1') + + def test_get_src_with_chinese_in_filename(self): + proj = self._proj('test_get_src') + filename = u'fn文件' + self._commit_push(proj, [[filename, 'content1 space']], T_MSG1) + src = proj.git.get_src() + assert src[1][0]['path'] == filename + + def test_get_src_with_space_in_filename(self): + proj = self._proj('test_get_src') + filename = 'fn space' + self._commit_push(proj, [[filename, 'content1 space']], T_MSG1) + src = proj.git.get_src(filename) + assert src == ('blob', 'content1 space') + + def test_get_src_for_tree_with_space_in_filename(self): + proj = self._proj('test_get_src') + filename = u'fn space' + self._commit_push(proj, [[filename, 'content1 space']], T_MSG1) + src = proj.git.get_src() + assert src[0] == 'tree' + assert src[1][0]['path'] == filename + assert src[1][0]['name'] == filename + assert src[1][0]['type'] == 'blob' + + def test_get_src_commited_twice(self): + proj = self._proj('test_get_src_2') + self._commit_push(proj, [[T_FILE1, 'content1']], T_MSG1) + self._commit_push(proj, [[T_FILE1, 'content1 bis']], T_MSG1) + src = proj.git.get_src(T_FILE1) + assert src == ('blob', 'content1 bis') + + def test_get_src_file_by_commited(self): + proj = self._proj('test_get_src_by_commited') + sha1 = self._commit_push(proj, [[T_FILE1, 'content1']], T_MSG1) + sha2 = self._commit_push(proj, [[T_FILE1, 'content1 bis']], T_MSG1) + src = proj.git.get_src(T_FILE1, ref=sha1) + assert src == ('blob', 'content1') + src = proj.git.get_src(T_FILE1, ref=sha2) + assert src == ('blob', 'content1 bis') + + def test_get_src_tree_by_commited(self): + proj = self._proj('test_get_src_by_commited') + sha1 = self._commit_push(proj, [['f1', 'c1'], ['f2', 'c2']], T_MSG1) + sha2 = self._commit_push(proj, [['f1', 'c1bis'], ['f3', 'c3']], 'msg2') + typ, tree = proj.git.get_src('', ref=sha1) + assert typ == 'tree' + assert len(tree) == 2 + t = tree[0] + assert 'id' in t + assert t['path'] == 'f1' + assert t['name'] == 'f1' + assert t['type'] == 'blob' + assert t['mode'] == '100644' + # second commit + typ, tree = proj.git.get_src('', ref=sha2) + assert typ == 'tree' + assert len(tree) == 3 + assert set(t['name'] for t in tree) == set(['f1', 'f2', 'f3']) + + def test_latest_update_timestamp(self): + proj = self._proj('test_latest_update_timestamp') + import datetime as dt + before = dt.datetime.now() - dt.timedelta(seconds=1) + self._commit_push(proj, [[T_FILE1, 'content1串串']], T_MSG1) + self._commit_push(proj, [[T_FILE1, 'content1 bis串串']], T_MSG1) + after = dt.datetime.now() + dt.timedelta(seconds=1) + ts = proj.git.get_last_update_timestamp() + upd_time = dt.datetime.fromtimestamp(ts) + assert before < upd_time < after + + def test_get_raw_content(self): + proj = self._proj('test') + sha = self._commit_push(proj, [[T_FILE1, 'content1串串']], T_MSG1) + assert proj.git.get_raw_content(T_FILE1) == u'content1串串' + self._commit_push(proj, [[T_FILE1, 'content1 bis串串']], T_MSG1) + assert proj.git.get_raw_content(T_FILE1) == u'content1 bis串串' + assert proj.git.get_raw_content(T_FILE1, sha) == u'content1串串' + + def test_latest_commit(self): + proj = self._proj('test') + fn = 'abcd_ef' + sha = self._commit_push(proj, [[fn, 'cont串串ent1']], T_MSG1) + assert proj.git.latest_commit(fn) == sha + sha = self._commit_push(proj, [[fn, 'cont串串ent2']], 'msg2') + assert proj.git.latest_commit(fn) == sha + + def test_latest_commit_file_with_chinese(self): + proj = self._proj('test') + fn = u'abcd ef 儿儿儿 gh' + sha = self._commit_push(proj, [[fn, 'cont串串ent1']], T_MSG1) + assert proj.git.latest_commit(fn) == sha + sha = self._commit_push(proj, [[fn, 'cont串串ent2']], 'msg2') + assert proj.git.latest_commit(fn) == sha + + def test_get_revisions(self): + proj = self._proj('test') + sha1 = self._commit_push(proj, [[T_FILE1, 'cont串串ent1']], T_MSG1) + sha2 = self._commit_push(proj, [[T_FILE1, 'cont串串ent2']], 'msg2') + sha3 = self._commit_push( + proj, [[T_FILE1, 'cont串串ent3']], 'msg3\n\nmsgbody\ncont.') + revs = proj.git.get_revisions('HEAD~2', 'HEAD') + assert [(r['id'], r['message']) for r in revs] == [( + sha3, 'msg3\n \n msgbody\n cont.'), (sha2, 'msg2')] + revs = proj.git.get_revisions('HEAD~1', 'HEAD') + assert len(revs) == 1 + assert revs[0]['message'] == 'msg3\n \n msgbody\n cont.' + assert 'name' in revs[0] + assert 'date' in revs[0] + assert 'email' in revs[0] + revs = proj.git.get_revisions('HEAD', 'HEAD') + assert revs == [] + + def test_blame_src(self): + proj = self._proj('test') + sha1 = self._commit_push( + proj, [[T_FILE1, 'line1\nline2\nline3\nline4串串']], T_MSG1) + sha2 = self._commit_push( + proj, [[T_FILE1, 'line1\nline2 CHANGED\nline3\nline4串串']], + 'msg2') + header, blames = proj.git.blame_src('HEAD', T_FILE1) + assert header['parents'] == sha1 + assert len(blames) == 4 + assert blames[1][0] == sha2 + assert blames[1][2] == 'test@example.com' + assert blames[1][4] == 'msg2' + assert blames[1][6] == '2' + assert blames[1][10] == 'line2 CHANGED' + assert blames[0][0] == sha1 + assert blames[0][2] == 'test@example.com' + assert blames[0][4] == T_MSG1 + assert blames[0][6] == '1' + assert blames[0][10] == 'line1' + + def test_get_commits(self): + # BE CAREFUL, Do not work with Chinese in filenames + proj = self._proj('test') + commit_sha1 = self._commit_push(proj, [['file1', 'aaaa']], T_MSG1) + commit_sha2 = self._commit_push(proj, [['file2', 'bbbb']], 'msg2') + commit_sha3 = self._commit_push(proj, [['file2', 'bbbb\c']], 'msg3') + commits = proj.git.get_commits() + assert len(commits) == 2 + sha1 = proj.git.call('rev-parse HEAD:file1') + sha2 = proj.git.call('rev-parse HEAD:file2') + assert set(commits.keys()) == set([sha1, sha2]) + c1 = commits[sha1] + assert c1['name'] == 'file1' + assert c1['path'] == 'file1' + assert c1['message'] == T_MSG1 + assert c1['hash'] == commit_sha1 + assert c1['type'] == 'blob' + assert c1['mode'] == '100644' + assert c1['contributor'] == 'test' + assert c1['contributor_url'] == False + assert c1['id'] == sha1 + c2 = commits[sha2] + assert c2['hash'] == commit_sha3 + + def test_get_revlist(self): + proj = self._proj('test') + msg = "msg_title1\n\nmsgbody" + sha1 = self._commit_push(proj, [[T_FILE1, 'aaaa串串']], msg) + rl = proj.git.get_revlist() + assert len(rl) == 1 + assert rl[0]['parents'] == '' + assert rl[0]['commit'] == sha1 + assert rl[0]['message'] == 'msg_title1' # Only the message tiltle + sha2 = self._commit_push(proj, [[T_FILE1, 'bbbb串串']], 'msg2') + rl = proj.git.get_revlist() + assert len(rl) == 2 + assert rl[0]['parents'] == [sha1] + assert rl[0]['commit'] == sha2 + assert rl[0]['message'] == 'msg2' + + def test_get_revlist_by_author(self): + proj = self._proj('test') + msg = "msg_title1\n\nmsgbody" + self._commit_push(proj, [[T_FILE1, 'aaa']], msg, + author='a1', author_email='a1@douban.com') + self._commit_push(proj, [[T_FILE1, 'aab']], msg, + author='a2', author_email='a2@douban.com') + self._commit_push(proj, [[T_FILE1, 'aac']], msg, + author='a1', author_email='a1@douban.com') + rl = proj.git.get_revlist(author='a1@douban.com') + assert len(rl) == 2 + + def test_gitstats(self): + proj = self._proj('test') + self._commit_push(proj, [[T_FILE1, 'aaaa串串']], T_MSG1) + self._commit_push(proj, [['file2', 'bbbb串串']], 'msg2') + self._commit_push(proj, [[T_FILE1, 'cccc串串']], 'msg32') + stats = proj.git.get_gitstats_data() + assert stats.authors[T_AUTHOR]['commits'] == 3 + self._commit_push(proj, [[T_FILE1, 'dddd串串']], 'msg33') + stats = proj.git.get_gitstats_data() + assert stats.authors[T_AUTHOR]['commits'] == 4 + self._commit_push(proj, [[T_FILE1, 'eeeee串']], 'msg34') + stats = proj.git.get_gitstats_data() + assert stats.authors[T_AUTHOR]['commits'] == 5 + self._commit_push(proj, [[T_FILE1, 'ffff串']], 'msg44', + author=T_AUTHOR2, author_email=T_AUTHOR_EMAIL2) + stats = proj.git.get_gitstats_data() + assert stats.authors[T_AUTHOR]['commits'] == 5 + assert stats.authors[T_AUTHOR2]['commits'] == 1 + + def test_parse_diff(self): + proj = self._proj('test') + filename = 'testfile' + sha1 = self._commit_push( + proj, [[filename, 'line1\nline2\nline3\nline4串串']], T_MSG1) + sha2 = self._commit_push( + proj, [[filename, 'line1\nline2 CHANGED\nline3\nline4串串']], + 'msg2\n\nmsg2 body') + pd = proj.git.parse_diff() + assert pd['body'] == 'msg2 body' + assert pd['author'] == T_AUTHOR + assert len(pd['difflist']) == 1 + assert pd['parents'] == sha1 + assert pd['time'] + assert pd['message'] == 'msg2' + assert pd['email'] == T_AUTHOR_EMAIL + diff = pd['difflist'][0] + assert diff.old_sha + assert diff.new_sha + assert diff.filepath == filename + assert len(diff.chunks) == 1 + chunk = diff.chunks[0] + assert chunk.diff_lines == [('idem', u' line1'), ('rem', u'-\x00-line2\x01'), ('add', u'+\x00+line2 CHANGED\x01'), ('idem', u' line3'), ('idem', u' line4\u4e32\u4e32')] # noqa + assert chunk.tip_line == u'@@ -1,4 +1,4 @@' + + def test_parse_diff_chinese_filename(self): + proj = self._proj('test') + filename = u'test 你好file' + sha1 = self._commit_push( + proj, [[filename, 'line1\nline2\nline3\nline4串串']], T_MSG1) + sha2 = self._commit_push(proj, [[filename, 'line1\nline2 CHANGED\nline3\nline4串串']], 'msg2\n\nmsg2 body') # noqa + pd = proj.git.parse_diff() + diff = pd['difflist'][0] + assert diff.filepath == filename + + def test_parse_diff_on_first_commit(self): + proj = self._proj('test') + filename = 'testfile' + self._commit_push( + proj, [[filename, 'line1\nline2\nline3\nline4串串']], T_MSG1) + pd = proj.git.parse_diff() + assert pd['body'] == '' + assert pd['author'] == T_AUTHOR + assert len(pd['difflist']) == 1 + assert pd['parents'] == '' + assert pd['time'] + assert pd['message'] == T_MSG1 + assert pd['email'] == T_AUTHOR_EMAIL + diff = pd['difflist'][0] + assert diff.new_sha + assert diff.filepath == filename + assert len(diff.chunks) == 1 + chunk = diff.chunks[0] + assert chunk, diff_lines == [('add', u'line1'), ('add', u'line2'), ('add', u'line3'), ('add', u'line4\u4e32\u4e32'), ('other', u' No newline at end of file')] # noqa + assert chunk.tip_line == u'@@ -0,0 +1,4 @@' + + def test_parse_diff_with_bad_message(self): + proj = self._proj('test') + filename = 'testfile' + self._commit_push( + proj, [[filename, 'line1\nline2\nline3\nline4串串']], T_MSG1) + self._commit_push(proj, [[filename, 'line1\nline2 CHANGED\nline3\nline4串串']], 'msg2\nmsg2 body') # noqa + pd = proj.git.parse_diff() + assert pd['body'] == '' + assert pd['message'] == 'msg2 msg2 body' diff --git a/tests/test_pygit2_diff.py b/tests/test_pygit2_diff.py new file mode 100644 index 0000000..797cefe --- /dev/null +++ b/tests/test_pygit2_diff.py @@ -0,0 +1,86 @@ +# -*- coding: utf-8 -*- +from vilya.libs import gyt +import shutil +import tempfile +from os.path import join as opj + +from tests.base import TestCase + +TEST_REPO = '/tmp/test_gyt/repo/.git' + +ENV_FOR_GIT = { + 'GIT_AUTHOR_NAME': 'default_test', + 'GIT_AUTHOR_EMAIL': 'default_test@douban.com', + 'GIT_COMMITTER_NAME': 'default_test', + 'GIT_COMMITTER_EMAIL': 'default_test@douban.com', +} + + +class TestGyt(TestCase): + def _repo(self, bare=False): + if bare: + rep = gyt.repo(self._gd, bare=True, init=True) + else: + rep = gyt.repo(self._gd, self._wt, bare=False, init=True) + return rep + + def _add_file(self, rep, filename, content='', commit=True, + commit_msg=None): + f = open(opj(rep.work_tree, filename), 'w') + f.write(content) + f.close() + rep.call(['add', filename]) + if commit: + if not commit_msg: + commit_msg = 'unit test commit msg for %s' % filename + rep.call(['commit', '-m', commit_msg], _env=ENV_FOR_GIT) + + def setUp(self): + self._gd = tempfile.mkdtemp(prefix='gyt_gd_') # Git dir + self._wt = tempfile.mkdtemp(prefix='gyt_wt_') # Work tree + self._gd2 = tempfile.mkdtemp(prefix='gyt_gd2_') # Git dir + self._wt2 = tempfile.mkdtemp(prefix='gyt_wt2_') # Work tree + + def tearDown(self): + shutil.rmtree(self._gd) + shutil.rmtree(self._wt) + shutil.rmtree(self._gd2) + shutil.rmtree(self._wt2) + + def test_one_diff(self): + rep = self._repo() + fn1 = 'test1' + content1a = 'a\nb\nc\nd' + content1b = 'a\nb\ncxxx\nd' + self._add_file(rep, fn1, commit_msg='msg1a', content=content1a) + sha = rep.sha() + self._add_file(rep, fn1, commit_msg='msg1b', content=content1b) + d = rep.diff(sha) + assert len(d) == 1 + d1 = d[0] + assert d1['filename'] == fn1 + assert d1['amode'] == d1['bmode'] == '100644' + assert len(d1['patch']) == 1 + assert d1['patch'][0][0] == '@@ -1,4 +1,4 @@' + chunk = d1['patch'][0][1] + assert chunk == [ + ('idem', u'a'), + ('idem', u'b'), + ('rem', u'c'), + ('add', u'cxxx'), + ('idem', u'd'), + ('other', u' No newline at end of file') + ] + repo = rep.repo + ref_cmt1 = repo.revparse_single(sha) + ref_cmt2 = repo.revparse_single('HEAD') + diff = ref_cmt1.tree.diff(ref_cmt2.tree) + patches, filenames = gyt.parse_raw_diff_patches(diff.patch, True) + assert patches[0][0][1] == [ + ('idem', u'a'), + ('idem', u'b'), + ('rem', u'c'), + ('add', u'cxxx'), + ('idem', u'd'), + ('other', u' No newline at end of file') + ] diff --git a/tests/test_recommendation.py b/tests/test_recommendation.py new file mode 100644 index 0000000..ce59816 --- /dev/null +++ b/tests/test_recommendation.py @@ -0,0 +1,91 @@ +# -*- coding: utf-8 -*- + +from tests.base import TestCase + +from vilya.models.recommendation import Recommendation + + +class RecommendationTest(TestCase): + + def setUp(self): + TestCase.setUp(self) + self.user1 = 'testuser1' + self.user2 = 'testuser2' + self.user3 = 'testuser3' + self.user4 = 'testuser4' + self.user5 = 'testuser5' + + def test_recommendation(self): + self.clean_up() + # lets praise user1 + content = 'Goooooood!' + r1 = Recommendation.add(self.user2, self.user1, content) + assert r1.from_user == self.user2 + assert r1.to_user == self.user1 + assert r1.content == content + + r2 = Recommendation.add(self.user3, self.user1, content) + assert r2.from_user == self.user3 + assert r2.to_user == self.user1 + assert r2.content == content + + r3 = Recommendation.add(self.user4, self.user1, content) + assert r3.from_user == self.user4 + assert r3.to_user == self.user1 + assert r3.content == content + + r4 = Recommendation.add(self.user1, self.user1, content) + assert r4 is None + + rs = Recommendation.gets_by_user(self.user1) + assert len(rs) == len([self.user2, self.user3, self.user4]) + # check default sort + assert rs[0].id == r3.id + + def test_recommendation_vote(self): + self.clean_up() + content = 'Goooooood!' + r1 = Recommendation.add(self.user2, self.user1, content) + assert r1.from_user == self.user2 + assert r1.to_user == self.user1 + assert r1.content == content + + r1.add_vote(self.user3) + r1.add_vote(self.user4) + + assert Recommendation.get( + r1.id).n_vote == len([self.user3, self.user4]) + + # duplicate vote + r1.add_vote(self.user3) + r1 = Recommendation.get(r1.id) + assert Recommendation.get( + r1.id).n_vote == len([self.user3, self.user4]) + + assert r1.is_voted(self.user5) is False + + # last vote + r1.add_vote(self.user5) + assert Recommendation.get( + r1.id).n_vote == len([self.user3, self.user4, self.user5]) + + # check sord, more vote more ahead + r2 = Recommendation.add(self.user3, self.user1, content) + rs = Recommendation.gets_by_user(self.user1) + assert len(rs) == len([self.user2, self.user3]) + # check default sort + assert rs[0].id == r1.id + + assert r1.is_voted(self.user3) + assert r1.is_voted(self.user4) + assert r1.is_voted(self.user5) + assert r1.is_voted(self.user1) is False + + assert r2.is_voted(self.user2) is False + assert r2.is_voted(self.user3) is False + assert r2.is_voted(self.user5) is False + + def clean_up(self): + rcs = Recommendation.gets() + for rc in rcs: + rc.delete() diff --git a/tests/test_search.py b/tests/test_search.py new file mode 100644 index 0000000..960bed9 --- /dev/null +++ b/tests/test_search.py @@ -0,0 +1,506 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +import shutil +import vilya.models.elastic as _el + +from nose import SkipTest + +from tests.base import TestCase +from tests.utils import delete_project + +from vilya.libs.search import code_unittest_client + +import vilya.models.elastic.indexer as _index +import vilya.models.elastic.searcher as _search +import vilya.models.elastic.issue_pr_search as _isprsearch +import vilya.models.elastic.src_search as _srcsearch +import vilya.models.elastic.user_search as _usersearch +import vilya.models.elastic.repo_search as _reposearch +from vilya.models.elastic.issue_pr_search import ( + IssuePRSearch, IssueSearch, PullRequestSearch) +from vilya.models.elastic.searcher import SearchEngine +from vilya.models.project_issue import ProjectIssue +from vilya.models.ticket import Ticket +from vilya.models.project import CodeDoubanProject +from vilya.models.sphinx_docs import SphinxDocs +from vilya.models.gist import Gist +from vilya.models.git import make_git_env +from vilya.models.user import User +from vilya.models.pull import PullRequest, add_pull + +from vilya.libs.permdir import get_tmpdir + +base_yaml_conf = """ +sphinx_docs: + dir: "" +""" + +base_index_rst = """ +Unit testing sphinx docs +======================== + +.. toctree:: + :glob: + + * +""" + +base_document1_rst = """ +Test doc1 +========= + +Something here +""" + +base_document2_rst = """ +Test doc2 +========= + +Something here +""" + +src_source1_py = """ +from elastic import src_search +def test(): + return 'hello' +""" + +src_source2_c = """ +#include <stdio.h> +int main() +{ + printf(\"%d\n\", 3); + return 0; +} +""" + + +SKIP_TEST = True + + +def skip_test(*args, **kwargs): + if SKIP_TEST: + raise SkipTest(*args, **kwargs) + + +_index.IndexEngine.c = code_unittest_client +_search.SearchEngine.c = code_unittest_client +_el.CodeSearch.c = code_unittest_client +_el.SearchEngine.c = code_unittest_client +_isprsearch.SearchEngine.c = code_unittest_client +_isprsearch.IndexEngine.c = code_unittest_client +_srcsearch.SearchEngine.c = code_unittest_client +_srcsearch.IndexEngine.c = code_unittest_client +_reposearch.SearchEngine.c = code_unittest_client +_reposearch.IndexEngine.c = code_unittest_client +_usersearch.SearchEngine.c = code_unittest_client +_usersearch.IndexEngine.c = code_unittest_client + + +class TestProject(TestCase): + + def setUp(self): + super(TestProject, self).setUp() + _el.CodeSearch.c.delete() + + def _prj(self): + delete_project('test') + prj = CodeDoubanProject.add('test', 'owner', create_trac=False) + return prj + + def _add(self, prj, fn, content): + u = self.addUser() + prj.git.commit_one_file(fn, content, 'add %s' % fn, u) + + def test_empty_project(self): + p = self._prj() + _el.CodeSearch.index_a_project_docs(p.id) + ds = _el.DocsSearch(p.id) + ret = ds._doc_file_as_dict('path', 'name', 'doc_dir') + assert not ret + + def test_create_with_index_and_doc(self): + prj = self._prj() +# self._add(prj, 'code_config.yaml', base_yaml_conf) + self._add(prj, 'docs/index.rst', base_index_rst) + self._add(prj, 'docs/doc1.rst', base_document1_rst) + sd = SphinxDocs(prj.name) + sd.build_all() + _el.CodeSearch.index_a_project_docs(prj.id) + ds = _el.DocsSearch(prj.id) + ret = ds._doc_file_as_dict('docs/doc1.rst', 'docs', 'docs') + assert ret['doc_name'] == 'docs' + assert ret['url'] == 'docs/rstdocs/doc1/' + assert ret['content'] == base_document1_rst + assert ret['type'] == 'docs' + assert ret['doc_dir'] == 'docs' + _el.CodeSearch.delete_a_project_docs(prj.id) + + def test_doc_file_datas(self): + skip_test() + prj = self._prj() + self._add(prj, 'docs/index.rst', base_index_rst) + self._add(prj, 'docs/doc1.rst', base_document1_rst) + ds = _el.DocsSearch(prj.id) + big_search_data = ds.doc_file_datas() + assert len(big_search_data) == 2 + _el.CodeSearch.delete_a_project_docs(prj.id) + + def test_index_a_project_docs(self): + skip_test() + prj = self._prj() + self._add(prj, 'docs/index.rst', base_index_rst) + self._add(prj, 'docs/doc1.rst', base_document1_rst) + _el.CodeSearch.index_a_project_docs(prj.id) + res = _el.CodeSearch.search_a_phrase('Something', from_=0, size=100) + res = _el.CodeSearch.format_search_result(res) + assert len(res) == 1 + _el.CodeSearch.delete_a_project_docs(prj.id) + + def test_index_a_project_docs_search_no_result(self): + skip_test() + prj = self._prj() + self._add(prj, 'docs/index.rst', base_index_rst) + self._add(prj, 'docs/doc1.rst', base_document1_rst) + _el.CodeSearch.index_a_project_docs(prj.id) + res = _el.CodeSearch.search_a_phrase( + 'SomethingXXXXXX', from_=0, size=100) + res = _el.CodeSearch.format_search_result(res) + assert len(res) == 0 + _el.CodeSearch.delete_a_project_docs(prj.id) + + def test_html_index_a_project_docs(self): + skip_test() + prj = self._prj() + self._add(prj, 'docs/index.html', "<h1>Test html page</h1>") + _el.CodeSearch.index_a_project_docs(prj.id) + res = _el.CodeSearch.search_a_phrase('Something', from_=0, size=100) + res = _el.CodeSearch.format_search_result(res) + assert len(res) == 0 + _el.CodeSearch.delete_a_project_docs(prj.id) + + def test_cleared_page_not_indexd(self): + skip_test() + prj = self._prj() + self._add(prj, 'docs/index.rst', "aaa") + _el.CodeSearch.index_a_project_docs(prj.id) + res = _el.CodeSearch.search_a_phrase('aaa', from_=0, size=100) + res = _el.CodeSearch.format_search_result(res) + assert len(res) == 1 + self._add(prj, 'docs/index.rst', "") + _el.CodeSearch.index_a_project_docs(prj.id) + res = _el.CodeSearch.search_a_phrase('aaa', from_=0, size=100) + res = _el.CodeSearch.format_search_result(res) + assert len(res) == 0 + _el.CodeSearch.delete_a_project_docs(prj.id) + + def test_removed_page_not_indexd(self): + raise SkipTest("advanced index way doesn't exist now.") + prj = self._prj() + self._add(prj, 'docs/index.rst', base_index_rst) + self._add(prj, 'docs/doc1.rst', 'aaa') + _el.CodeSearch.index_a_project_docs(prj.id) + res = _el.CodeSearch.search_a_phrase('aaa', from_=0, size=100) + res = _el.CodeSearch.format_search_result(res) + assert len(res) == 1 + prj.git.call('read-tree HEAD') + temp_dir = get_tmpdir() + env = make_git_env(is_anonymous=True) + prj.git.call('--work-tree %s checkout-index --force -a' % temp_dir) + prj.git.call(['--work-tree', temp_dir, 'rm', 'docs/doc1.rst']) + prj.git.call(['--work-tree', temp_dir, 'commit', '-m', 'm'], _env=env) + _el.CodeSearch.index_a_project_docs(prj.id) + res = _el.CodeSearch.search_a_phrase('aaa', from_=0, size=100) + res = _el.CodeSearch.format_search_result(res) + assert len(res) == 0, \ + "Should find no results after removing and reindexing" + _el.CodeSearch.delete_a_project_docs(prj.id) + shutil.rmtree(temp_dir) + + +class TestGist(TestCase): + + def setUp(self): + super(TestGist, self).setUp() + _el.CodeSearch.c.delete() + + def _gist(self): + gist = Gist.add('description', 'testuser', is_public=True) + return gist + + def test_empty_repo(self): + skip_test() + gist = self._gist() + _el.CodeSearch.index_a_gist(gist.id) + res = _el.CodeSearch.search_a_phrase('testuser', from_=0, size=100) + res = _el.CodeSearch.format_search_result(res) + assert len(res) == 1 + _el.CodeSearch.delete_a_gist(gist.id) + + def test_search_repo_file(self): + skip_test() + gist = self._gist() + gist.update(description='description', + gist_names=['file1', 'file2'], + gist_contents=['document', 'document']) + _el.CodeSearch.index_a_gist(gist.id) + res = _el.CodeSearch.search_a_phrase('file2', from_=0, size=100) + res = _el.CodeSearch.format_search_result(res) + assert len(res) == 1 + res = _el.CodeSearch.search_a_phrase('document', from_=0, size=100) + res = _el.CodeSearch.format_search_result(res) + assert len(res) == 1 + _el.CodeSearch.delete_a_gist(gist.id) + + def test_change_files(self): + skip_test() + gist = self._gist() + _el.CodeSearch.index_a_gist(gist.id) + res = _el.CodeSearch.search_a_phrase('description', from_=0, size=100) + res = _el.CodeSearch.format_search_result(res) + assert len(res) == 1 + gist.update(description='desc', + gist_names=['file1', 'file2'], + gist_contents=['document', 'document']) + _el.CodeSearch.index_a_gist(gist.id) + res = _el.CodeSearch.search_a_phrase('description', from_=0, size=100) + res = _el.CodeSearch.format_search_result(res) + assert len(res) == 0 + res = _el.CodeSearch.search_a_phrase('file2', from_=0, size=100) + res = _el.CodeSearch.format_search_result(res) + assert len(res) == 1 + gist.update(description='desc', + gist_names=['f1'], + gist_contents=['text']) + _el.CodeSearch.index_a_gist(gist.id) + res = _el.CodeSearch.search_a_phrase('text', from_=0, size=100) + res = _el.CodeSearch.format_search_result(res) + assert len(res) == 1 + res = _el.CodeSearch.search_a_phrase('file2', from_=0, size=100) + res = _el.CodeSearch.format_search_result(res) + assert len(res) == 0 + _el.CodeSearch.delete_a_gist(gist.id) + + +class TestIssue(TestCase): + + def setUp(self): + super(TestIssue, self).setUp() + _index.IndexEngine.c.delete() + + def _prj(self, proj_name): + prj = CodeDoubanProject.add(proj_name, 'owner', create_trac=False) + return prj + + def test_single_project(self): + skip_test() + p = self._prj("test") + iss1 = ProjectIssue.add(title='title1', description='desc1', + creator='owner', project=p.id) + IssueSearch.index_a_project_issue(p) + res = IssueSearch.search_a_phrase('owner', p.id) + res = SearchEngine.decode(res, ('issue_id',)) + res = [id for id, in res] + assert len(res) == 1 + assert res[0] == iss1.id + iss2 = ProjectIssue.add(title='title2', description='desc2', + creator='owner', project=p.id) + IssueSearch.index_a_project_issue(p) + res = IssueSearch.search_a_phrase('owner', p.id) + res = SearchEngine.decode(res, ('issue_id',)) + res = [id for id, in res] + assert len(res) == 2 + assert iss1.id in res + assert iss2.id in res + + def test_multiple_project(self): + skip_test() + p1 = self._prj("test_1") + p2 = self._prj("test_2") + iss1 = ProjectIssue.add(title='title1', description='desc1', + creator='owner', project=p1.id) + iss2 = ProjectIssue.add(title='title1', description='desc1', + creator='owner', project=p2.id) + IssueSearch.index_a_project_issue(p1) + IssueSearch.index_a_project_issue(p2) + res = IssueSearch.search_a_phrase('title1', p1.id) + res = SearchEngine.decode(res, ('issue_id',)) + res = [id for id, in res] + assert len(res) == 1 + assert res[0] == iss1.id + res = IssueSearch.search_a_phrase('title1', p2.id) + res = SearchEngine.decode(res, ('issue_id',)) + res = [id for id, in res] + assert len(res) == 1 + assert res[0] == iss2.id + + +class TestPullRequest(TestCase): + + def setUp(self): + super(TestPullRequest, self).setUp() + _index.IndexEngine.c.delete() + + def _prj(self, proj_name, owner_id, fork_from=None): + prj = CodeDoubanProject.add(proj_name, owner_id, create_trac=False, + fork_from=fork_from) + return prj + + def _add(self, prj, u, fn, content): + prj.git.commit_one_file(fn, content, 'add %s' % fn, u) + + def test_single_project(self): + skip_test() + u_to = User("admin") + u_from = User("testuser") + to_proj = self._prj("test", "admin") + self._add(to_proj, u_to, "README.md", "hi") + from_proj = self._prj("testuser/test", "testuser", to_proj.id) + self._add(from_proj, u_from, "README.md", "hello") + pullreq = PullRequest.open(from_proj, "master", to_proj, "master") + ticket = Ticket(None, None, to_proj.id, "title", "desc", "testuser", + None, None) + pullreq = add_pull(ticket, pullreq, u_from) + ticket = pullreq.ticket + PullRequestSearch.index_a_project_pr(to_proj) + res = PullRequestSearch.search_a_phrase('title', to_proj.id) + res = SearchEngine.decode(res, ('to_proj_id',)) + res = [id for id, in res] + assert len(res) == 1 + + +class TestProjectIssuePR(TestCase): + + def setUp(self): + super(TestProjectIssuePR, self).setUp() + _index.IndexEngine.c.delete() + + def _prj(self, proj_name, owner_id, fork_from=None): + prj = CodeDoubanProject.add(proj_name, owner_id, create_trac=False, + fork_from=fork_from) + return prj + + def _add(self, prj, u, fn, content): + prj.git.commit_one_file(fn, content, 'add %s' % fn, u) + + def test_single_project(self): + skip_test() + u_to = User("admin") + u_from = User("testuser") + to_proj = self._prj("test", "admin") + self._add(to_proj, u_to, "README.md", "hi") + from_proj = self._prj("testuser/test", "testuser", to_proj.id) + self._add(from_proj, u_from, "README.md", "hello") + pullreq = PullRequest.open(from_proj, "master", to_proj, "master") + ticket = Ticket(None, None, to_proj.id, "title", "desc", "testuser", + None, None) + pullreq = add_pull(ticket, pullreq, u_from) + + iss = ProjectIssue.add(title='title1', description='desc1', + creator='owner', project=to_proj.id) + IssuePRSearch.index_a_project(to_proj) + res = IssueSearch.search_a_phrase('title1', to_proj.id) + res = SearchEngine.decode(res, ('issue_id',)) + res = [id for id, in res] + assert len(res) == 1 + assert res[0] == iss.id + res = PullRequestSearch.search_a_phrase('title', to_proj.id) + res = SearchEngine.decode(res, ('issue_id',)) + res = [id for id, in res] + assert len(res) == 1 + + +class TestSrcSearch(TestCase): + + def setUp(self): + super(TestSrcSearch, self).setUp() + _srcsearch.IndexEngine.c.delete() + _srcsearch.IndexEngine.c.put('') + _srcsearch.SrcSearch.update_mapping() + + def _prj(self): + delete_project('test') + prj = CodeDoubanProject.add('test', 'owner', create_trac=False) + return prj + + def _add(self, prj, fn, content): + u = self.addUser() + prj.git.commit_one_file(fn, content, 'add %s' % fn, u) + + def test_get_src_indexes_from_project(self): + p = self._prj() + self._add(p, 'index.rst', base_index_rst) + self._add(p, 'yaml.conf', base_yaml_conf) + self._add(p, 'src/source1.py', src_source1_py) + self._add(p, 'src/source2.c', src_source2_c) + indexes = _srcsearch.SrcSearch.get_src_indexes_from_project(p) + assert len(indexes) == 4 + + indexes_values = [v for k, v in indexes] + names = [data['name'] for data in indexes_values] + for name in ['index.rst', 'yaml.conf', 'src/source1.py', + 'src/source2.c']: + assert name in names + + index_obj_ids = [(k, v['id']) for k, v in indexes] + for index_id, obj_id in index_obj_ids: + assert str(p.id) + obj_id == index_id + + name_data_dict = {data['name']: data for data in indexes_values} + assert name_data_dict['src/source1.py']['language'] == 'Python' + assert name_data_dict['src/source2.c']['language'] == 'C' + assert name_data_dict['yaml.conf']['language'] == 'Text' + assert name_data_dict['index.rst']['language'] == 'Text' + for data in indexes_values: + assert data['project'] == p.name + + def test_single_project_index(self): + skip_test() + p = self._prj() + self._add(p, 'index.rst', base_index_rst) + self._add(p, 'yaml.conf', base_yaml_conf) + self._add(p, 'src/source1.py', src_source1_py) + _srcsearch.SrcSearch.index_a_project(p) + ids = _srcsearch.SrcSearch.query_a_project_objs(p.name, fields=('id',)) + assert len(ids) == 3 + + self._add(p, 'src/source2.c', src_source2_c) + _srcsearch.SrcSearch.update_a_project_index(p) + ids = _srcsearch.SrcSearch.query_a_project_objs(p.name, fields=('id',)) + assert len(ids) == 4 + + _srcsearch.SrcSearch.delete_a_project_index(p) + ids = _srcsearch.SrcSearch.query_a_project_objs(p.name, fields=('id',)) + assert len(ids) == 0 + + +class TestRepoSearch(TestCase): + + def setUp(self): + super(TestRepoSearch, self).setUp() + _reposearch.IndexEngine.c.delete() + + def test_multiple_project_index(self): + skip_test() + for i in range(5): + CodeDoubanProject.add('test%s' % i, 'owner', create_trac=False) + _reposearch.RepoSearch.index_repos() + objs = _reposearch.RepoSearch.query_repo_objs() + assert len(objs) == 5 + + +class TestUserSearch(TestCase): + + def setUp(self): + super(TestUserSearch, self).setUp() + _usersearch.IndexEngine.c.delete() + + def test_multiple_project_index(self): + skip_test() + for i in range(5): + CodeDoubanProject.add( + 'test%s' % i, 'owner%s' % i, create_trac=False) + _usersearch.UserSearch.index_users() + objs = _usersearch.UserSearch.query_user_objs() + assert len(objs) == 5 diff --git a/tests/test_sphinx_docs.py b/tests/test_sphinx_docs.py new file mode 100644 index 0000000..ee54cc7 --- /dev/null +++ b/tests/test_sphinx_docs.py @@ -0,0 +1,583 @@ + +import os + +from vilya.libs.permdir import get_tmpdir +from vilya.models.project import CodeDoubanProject +from vilya.models.sphinx_docs import ( + SphinxDocs, guess_builder_from_path) + +import nose +from tests.base import TestCase + +base_yaml_conf = """ +docs: + pickle: + dir: '' + builder: pickle +""" + +base_index_rst = """ +Unit testing sphinx docs +======================== + +.. toctree:: + :glob: + + * +""" + +base_document1_rst = """ +Test doc1 +========= + +Something here +""" + +base_document2_rst = """ +Test doc2 +========= + +Something here +""" + + +class TestDocsHelpers(TestCase): + html1 = '<h1>TITLE1**</h1>' + + def _prj(self): + prj = CodeDoubanProject.get_by_name('test') + prj.delete() + prj = CodeDoubanProject.add('test', 'owner', create_trac=False) + return prj + + def _add(self, prj, fn, content): + u = self.addUser() + prj.git.commit_one_file(fn, content, 'add %s' % fn, u) + + def setUp(self): + self._nb_dirs_in_tempdir = len(os.listdir(get_tmpdir())) + TestCase.setUp(self) + + def tearDown(self): + new_nb_dirs_in_tmpdir = len(os.listdir(get_tmpdir())) + assert self._nb_dirs_in_tempdir == new_nb_dirs_in_tmpdir, ( + "Builder process should not leave dirs in tmpdir") + TestCase.tearDown(self) + + +class TestDocsWithoutConf(TestDocsHelpers): + + def test_create_enabled(self): + prj = self._prj() + sd = SphinxDocs(prj.name) + assert sd.enabled is True + + def test_create_with_index_and_doc(self): + prj = self._prj() + self._add(prj, 'docs/index.rst', base_index_rst) + self._add(prj, 'docs/doc1.rst', base_document1_rst) + sd = SphinxDocs(prj.name) + sd.build_all() + builder = sd.get_builder() + doc = builder.template_data('', {}) + assert doc['title'] == 'Unit testing sphinx docs' + + def test_build_info(self): + prj = self._prj() + self._add(prj, 'docs/index.rst', base_index_rst) + self._add(prj, 'docs/doc1.rst', base_document1_rst) + sd = SphinxDocs(prj.name) + sd.build_all() + bi = sd.last_build_info() + assert bi['status'] == 'success' + + def test_need_rebuild(self): + prj = self._prj() + self._add(prj, 'docs/index.rst', base_index_rst) + sd = SphinxDocs(prj.name) + assert sd.need_rebuild() + sd.build_all() + assert not sd.need_rebuild() + self._add(prj, 'docs/doc1.rst', base_document1_rst) + sd = SphinxDocs(prj.name) # Bad, should not have to refresh object + assert sd.need_rebuild() + sd.build_all() + assert not sd.need_rebuild() + + def test_create_with_index_and_doc_and_get_again(self): + prj = self._prj() + self._add(prj, 'docs/index.rst', base_index_rst) + self._add(prj, 'docs/doc1.rst', base_document1_rst) + sd = SphinxDocs(prj.name) + sd.build_all() + sd2 = SphinxDocs(prj.name) + builder = sd2.get_builder() + assert builder.template + doc = builder.template_data('', {}) + assert doc['title'] == 'Unit testing sphinx docs' + + def test_create_with_index_and_doc_and_conf_py(self): + conf_content = """rst_epilog = 'Ahhhhhhhhhhhhhhhh la fin' """ + prj = self._prj() + self._add(prj, 'docs/index.rst', base_index_rst) + self._add(prj, 'docs/doc1.rst', base_document1_rst) + self._add(prj, 'docs/conf.py', conf_content) + sd = SphinxDocs(prj.name) + sd.build_all() + builder = sd.get_builder() + doc = builder.template_data('', {}) + assert 'Ahhhhhhhhhhhhhhhh' in doc['body'] + + +class TestDocs(TestDocsHelpers): + + @nose.tools.raises(Exception) + def test_create_wrong(self): + sd = SphinxDocs('unexisting_project') + assert sd.enabled is False + + def test_create_disabled(self): + prj = self._prj() + sd = SphinxDocs(prj.name) + assert sd.enabled is True, "should be enabled by default" + + def test_create_enabled(self): + prj = self._prj() + self._add(prj, 'code_config.yaml', base_yaml_conf) + sd = SphinxDocs(prj.name) + assert sd.enabled is True + + def test_create_with_index_and_doc(self): + prj = self._prj() + self._add(prj, 'code_config.yaml', base_yaml_conf) + self._add(prj, 'index.rst', base_index_rst) + self._add(prj, 'doc1.rst', base_document1_rst) + sd = SphinxDocs(prj.name) + sd.build_all() + builder = sd.get_builder() + doc = builder.template_data('', {}) + assert doc['title'] == 'Unit testing sphinx docs' + + def test_build_info(self): + prj = self._prj() + self._add(prj, 'code_config.yaml', base_yaml_conf) + self._add(prj, 'index.rst', base_index_rst) + self._add(prj, 'doc1.rst', base_document1_rst) + sd = SphinxDocs(prj.name) + sd.build_all() + bi = sd.last_build_info() + assert bi['status'] == 'success' + + def test_need_rebuild(self): + prj = self._prj() + self._add(prj, 'code_config.yaml', base_yaml_conf) + self._add(prj, 'index.rst', base_index_rst) + sd = SphinxDocs(prj.name) + assert sd.need_rebuild() + sd.build_all() + assert not sd.need_rebuild() + self._add(prj, 'doc1.rst', base_document1_rst) + sd = SphinxDocs(prj.name) # Bad, should not have to refresh object + assert sd.need_rebuild() + sd.build_all() + assert not sd.need_rebuild() + + def test_create_with_index_and_doc_and_get_again(self): + prj = self._prj() + self._add(prj, 'code_config.yaml', base_yaml_conf) + self._add(prj, 'index.rst', base_index_rst) + self._add(prj, 'doc1.rst', base_document1_rst) + sd = SphinxDocs(prj.name) + sd.build_all() + sd2 = SphinxDocs(prj.name) + builder = sd2.get_builder() + assert builder.template + doc = builder.template_data('', {}) + assert doc['title'] == 'Unit testing sphinx docs' + + def test_create_with_index_and_doc_and_conf_py(self): + conf_content = """rst_epilog = 'Ahhhhhhhhhhhhhhhh la fin' """ + prj = self._prj() + self._add(prj, 'code_config.yaml', base_yaml_conf) + self._add(prj, 'index.rst', base_index_rst) + self._add(prj, 'doc1.rst', base_document1_rst) + self._add(prj, 'conf.py', conf_content) + sd = SphinxDocs(prj.name) + sd.build_all() + builder = sd.get_builder() + doc = builder.template_data('', {}) + assert 'Ahhhhhhhhhhhhhhhh' in doc['body'] + + def test_create_with_index_and_doc_and_two_builders(self): + prj = self._prj() + base_yaml_conf_two_builders = """ + docs: + html: + dir: '' + builder: html + pickle: + dir: '' + builder: pickle + """ + self._add(prj, 'code_config.yaml', base_yaml_conf_two_builders) + self._add(prj, 'index.rst', base_index_rst) + self._add(prj, 'doc1.rst', base_document1_rst) + sd = SphinxDocs(prj.name) + sd.build_all() + assert sd.builders == ['html', 'pickle'] + pickle_builder = sd.get_builder('pickle') + assert pickle_builder.template + doc = pickle_builder.template_data('', {}) + assert doc['title'] == 'Unit testing sphinx docs' + html_builder = sd.get_builder('html') + assert not html_builder.template + raw = html_builder.raw_content('index.html', {}) + assert "<h1>Unit testing sphinx docs" in raw + + +class TestDocsPages(TestDocsHelpers): + conf = """ + docs: + raw: + dir: pages + builder: raw + """ + builder = 'raw' + + def test_pages_mode(self): + prj = self._prj() + self._add(prj, 'code_config.yaml', self.conf) + self._add(prj, 'pages/index.html', self.html1) + sd = SphinxDocs(prj.name) + assert sd.builders == [self.builder] + assert sd.last_build_info() is None + sd.build_all() + assert sd.last_build_info()['status'] == 'success' + builder = sd.get_builder(sd.builders[0]) + assert builder.raw_content('index.html', {}) == self.html1 + + def test_pages_no_docsdir(self): + prj = self._prj() + self._add(prj, 'code_config.yaml', self.conf) + self._add(prj, 'pagesNOT_THE_SAME/index.html', self.html1) + sd = SphinxDocs(prj.name) + sd.build_all() + assert sd.last_build_info()['status'] == 'no_doc_dir_found' + builder = sd.get_builder(sd.builders[0]) + assert builder.raw_content('index.html', {}) is False + + def test_html_and_raw_builders(self): + prj = self._prj() + base_yaml_conf_two_builders = """ + docs: + html: + dir: docs + builder: html + raw: + dir: docs + builder: raw + """ + self._add(prj, 'code_config.yaml', base_yaml_conf_two_builders) + self._add(prj, 'docs/index.rst', base_index_rst) + self._add(prj, 'docs/index.html', self.html1) + self._add(prj, 'docs/doc1.rst', base_document1_rst) + sd = SphinxDocs(prj.name) + sd.build_all() + assert sd.builders == ['html', 'raw'] + raw_builder = sd.get_builder('raw') + doc = raw_builder.raw_content('index.html', {}) + assert doc == self.html1 + html_builder = sd.get_builder('html') + assert not html_builder.template + raw = html_builder.raw_content('index.html', {}) + assert "<h1>Unit testing sphinx docs" in raw + + def test_html_and_raw_builders_in_different_dirs(self): + prj = self._prj() + base_yaml_conf_two_builders = """ + docs: + html: + dir: html_docs + builder: html + raw: + builder: raw + dir: pages + """ + self._add(prj, 'code_config.yaml', base_yaml_conf_two_builders) + self._add(prj, 'html_docs/index.rst', base_index_rst) + self._add(prj, 'html_docs/doc1.rst', base_document1_rst) + self._add(prj, 'pages/index.html', self.html1) + sd = SphinxDocs(prj.name) + sd.build_all() + assert sd.builders == ['html', 'raw'] + raw_builder = sd.get_builder('raw') + doc = raw_builder.raw_content('index.html', {}) + assert doc == self.html1 + html_builder = sd.get_builder('html') + assert not html_builder.template + raw = html_builder.raw_content('index.html', {}) + assert "<h1>Unit testing sphinx docs" in raw + + +class TestDocsPagesNewConf(TestDocsHelpers): + def test_two_builders_with_other_config_fmt(self): + prj = self._prj() + base_yaml_conf_two_builders = """ + #sphinx_docs: + # dir: "docs" + # builders: + # - html: + # html_theme: default + # html_short_title: testsub + # dir: html_docs + # - raw: + # dir: pages + docs: + docs: + builder: html + html_theme: default + html_short_title: testsub + dir: html_docs + pages: + builder: raw + """ + self._add(prj, 'code_config.yaml', base_yaml_conf_two_builders) + self._add(prj, 'html_docs/index.rst', base_index_rst) + self._add(prj, 'html_docs/doc1.rst', base_document1_rst) + self._add(prj, 'pages/index.html', self.html1) + sd = SphinxDocs(prj.name) + sd.build_all() + assert sd.builders == ['docs', 'pages'] # noqa Sorted alphabetically by default + raw_builder = sd.get_builder('pages') + doc = raw_builder.raw_content('index.html', {}) + assert doc == self.html1 + html_builder = sd.get_builder('docs') + assert not html_builder.template + raw = html_builder.raw_content('index.html', {}) + assert "<h1>Unit testing sphinx docs" in raw + + def test_sort_key(self): + prj = self._prj() + base_yaml_conf_two_builders = """ + docs: + docs: + builder: html + html_theme: default + html_short_title: testsub + sort: 2 + pages: + builder: raw + sort: 1 + """ + self._add(prj, 'code_config.yaml', base_yaml_conf_two_builders) + sd = SphinxDocs(prj.name) + assert sd.builders == ['pages', 'docs'] + + def test_guess_builder_from_path_found(self): + bs = ['build1', 'build2'] + pr = 'testprj' + path = '/testprj/docs/build1/doc1' + builder, found = guess_builder_from_path(bs, pr, path) + assert builder == 'build1' + assert found is True + + def test_guess_builder_from_path_found_second_one(self): + bs = ['build1', 'build2'] + pr = 'testprj' + path = '/testprj/docs/build2/doc1' + builder, found = guess_builder_from_path(bs, pr, path) + assert builder == 'build2' + assert found is True + + def test_guess_builder_from_path_not_found(self): + bs = ['build1', 'build2'] + pr = 'testprj' + path = '/testprj/docs/build__NOTFOUND/doc1' + builder, found = guess_builder_from_path(bs, pr, path) + assert builder == 'build1' + assert found is False + + +class TestDocsPagesFromPath(TestDocsHelpers): + + def test_get_url_from_path_sphinx_doc_builder_default(self): + prj = self._prj() + base_yaml_conf_two_builders = """ + docs: + mypages: + builder: raw + dir: mypagesdir + name: Pages + sort: 1 + mariodocs: + builder: html + dir: htmldocs/1 + name: HTMLDocs + sort: 2 + """ + self._add(prj, 'code_config.yaml', base_yaml_conf_two_builders) + sd = SphinxDocs(prj.name) + path = 'htmldocs/1/index.rst' + url = sd.get_url_from_path(path) + assert url == 'docs/mariodocs/index.html' + + def test_get_url_from_path_sphinx_doc_builder_pickle_no_subdir(self): + prj = self._prj() + base_yaml_conf_two_builders = """ + docs: + mydocs: + dir: mydocsdir/6 + pages: + builder: raw + """ + self._add(prj, 'code_config.yaml', base_yaml_conf_two_builders) + sd = SphinxDocs(prj.name) + path = 'mydocsdir/6/index.rst' + url = sd.get_url_from_path(path) + assert url == 'docs/mydocs/index/' + + def test_get_url_from_path_sphinx_doc_builder_pickle_subdir(self): + prj = self._prj() + base_yaml_conf_two_builders = """ + docs: + mydocs: + dir: mydocsdir + pages: + builder: raw + """ + self._add(prj, 'code_config.yaml', base_yaml_conf_two_builders) + sd = SphinxDocs(prj.name) + path = 'mydocsdir/subdir/doc1.rst' + url = sd.get_url_from_path(path) + assert url == 'docs/mydocs/subdir/doc1/' + + def test_get_url_from_path_sphinx_doc_raw_builder_no_subdir(self): + prj = self._prj() + base_yaml_conf_two_builders = """ + docs: + mydocs: + dir: mydocsdir/3 + builder: raw + """ + self._add(prj, 'code_config.yaml', base_yaml_conf_two_builders) + sd = SphinxDocs(prj.name) + path = 'mydocsdir/3/foo.bar' + url = sd.get_url_from_path(path) + assert url == 'docs/mydocs/foo.bar' + + def test_get_url_from_path_no_dir(self): + prj = self._prj() + base_yaml_conf_two_builders = """ + docs: + mydocs: + dir: mydocsdir + mypages: + builder: raw + + """ + self._add(prj, 'code_config.yaml', base_yaml_conf_two_builders) + sd = SphinxDocs(prj.name) + path = 'mypages/subdir/doc1.html' + url = sd.get_url_from_path(path) + assert url == 'docs/mypages/subdir/doc1.html' + + def test_get_url_from_path_doc_builder_raw(self): + prj = self._prj() + base_yaml_conf_two_builders = """ + docs: + mydocs: + dir: mydocsdir + mypages: + builder: raw + dir: pages/1 + + """ + self._add(prj, 'code_config.yaml', base_yaml_conf_two_builders) + sd = SphinxDocs(prj.name) + path = 'pages/1/subdir/doc1.html' + url = sd.get_url_from_path(path) + assert url == 'docs/mypages/subdir/doc1.html' + + def test_get_url_from_path_old_conf(self): + prj = self._prj() + sd = SphinxDocs(prj.name) + path = 'docs/index.rst' + url = sd.get_url_from_path(path) + assert url == 'docs/rstdocs/index/' + + def test_get_url_from_path_complex_src_dir(self): + prj = self._prj() + base_yaml_conf_two_builders = """ + docs: + mypages: + builder: raw + dir: blog/output + name: Blog + sort: 1 + + """ + self._add(prj, 'code_config.yaml', base_yaml_conf_two_builders) + sd = SphinxDocs(prj.name) + path = 'blog/output/doc1.html' + url = sd.get_url_from_path(path) + assert url == 'docs/mypages/doc1.html' + + def test_get_url_from_path_percent_sign_path(self): + prj = self._prj() + sd = SphinxDocs(prj.name) + path = 'docs/doubanlib%2Fsqlstore.rst' + url = sd.get_url_from_path(path) + assert url == 'docs/rstdocs/doubanlib%252Fsqlstore/' + path = 'docs/%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95.rst' + url = sd.get_url_from_path(path) + assert url == 'docs/rstdocs/%25E6%2580%25A7%25E8%2583%25BD%25E6%25B5%258B%25E8%25AF%2595/' # noqa + + +class TestAutodoc(TestDocsHelpers): + conf_py = """ +import sys, os +sys.path.insert(0, os.path.abspath('..')) +extensions = ['sphinx.ext.autodoc'] + """ + index_rst = """ +Test +==== + +.. automodule:: testapi + :members: + """ + api_py = """ +class C(object): + '''Test C docstring''' + """ + code_config_yaml = """ + docs: + mydocs: + checkout_root: True + link: http://code.dapps.douban.com// + builder: pickle + dir: docs + """ + + def test_use_autodoc_not_configured(self): + prj = self._prj() + self._add(prj, 'docs/conf.py', self.conf_py) + self._add(prj, 'docs/index.rst', self.index_rst) + self._add(prj, 'testapi.py', self.api_py) + sd = SphinxDocs(prj.name) + sd.build_all() + builder = sd.get_builder() + doc = builder.template_data('', {}) + assert "Test C docstring" not in doc['body'] + + def test_use_autodoc_configured(self): + prj = self._prj() + self._add(prj, 'code_config.yaml', self.code_config_yaml) + self._add(prj, 'docs/conf.py', self.conf_py) + self._add(prj, 'docs/index.rst', self.index_rst) + self._add(prj, 'testapi.py', self.api_py) + sd = SphinxDocs(prj.name) + sd.build_all() + builder = sd.get_builder() + doc = builder.template_data('', {}) + assert "Test C docstring" in doc['body'] diff --git a/tests/test_sshkey.py b/tests/test_sshkey.py new file mode 100644 index 0000000..ca3f948 --- /dev/null +++ b/tests/test_sshkey.py @@ -0,0 +1,84 @@ +# -*- coding: utf-8 -*- + +from tests.base import TestCase + +from vilya.models.sshkey import SSHKey + +KEY1 = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9BDCAFpTC9h/0qEqYD62VRCYALKWBkJr"\ + "ll95hR8TDu3AOFLQCDZqEKcjzGrvoeEthwH++PTOv5mvYbwYmwtJb638tY/v7srxnFUCrrnzmZQqqY"\ + "T6ez+nOpJyDmBPPvQkNG9IRCoi14VnSWgsrSoYxCU9+mUldLmSt6N/kHbhTVq962kQOlnpoo0V+Cup"\ + "G1aE6UhuQs2Mug29GtCWMHfhtqv2ewYfUqPs+weFBYVHOj33H19HMeVmvJXWrAGawQiYs3RlLNvmdi"\ + "NOs2Jk7XeZakrkcvwjUbCLVXaNtVII/9Fnxn5dcA3kM43IU0W31RldJi8UI+mVgkjpvrrZHVaUN te"\ + "st@localhost" +KEY1_FINGERPRINT = "29:95:23:72:42:63:1f:97:8a:a7:01:a3:69:0d:0a:1b" +KEY1_TITLE = "test@localhost" + +# incorrect +KEY2 = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9BDCAFpTC9h/0qEqYD62VRCYALKWBkJr"\ + "T6tz+nOpJyDmBPPvQkNG9IRCoi14VnSWgsrSoYxCU9+mUldLmSt6N/kHbhTVq962kQOlnpoo0V+Cup"\ + "G1aE6UhuQs2Mug29GtCWMHfhtqv2ewYfUqPs+weFBYVHOj33H19HMeVmvJXWrAGawQiYs3RlLNvmdi"\ + "NOs2Jg7XeZakrkcvwjUbCLVXaNtVII/9Fnxn5dcA3kM43IU0W31RldJi8UI+mVgkjpvrrZHVaUN te"\ + "st@localhost" +# incorrect +KEY3 = "ssh-fsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9BDCAFpTC9h/0qEqYD62VRCYALKWBkJr"\ + "ll95hR8TDu3AOFLQCDZqEKcjzGrvoeEthwH++PTOv5mvYbwYmwtJb638tY/v7srxnFUCrrnzmZQqqY"\ + "T6tz+nOpJyDmBPPvQkNG9IRCoi14VnSWgsrSoYxCU9+mUldLmSt6N/kHbhTVq962kQOlnpoo0V+Cup"\ + "G1aE6UhuQs2Mug29GtCWMHfhtqv2ewYfUqPs+weFBYVHOj33H19HMeVmvJXWrAGawQiYs3RlLNvmdi"\ + "NOs2Jk7XeZakrkcvwjUbCLVXaNtVII/9Fnxn5dcA3kM43IU0W31RldJi8UI+mVgkjpvrrZHVaUN te"\ + "st@localhost" +# correct +KEY4 = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9BDCAFpTC9h/0qEqYD62VRCYALKWBkJr"\ + "ll95hR8TDu3AOFLQCDZqEKcjzGrvoeEthwH++PTOv5mvYbwYmwtJb638tY/v7srxnFUCrrnzmZQqqY"\ + "T6ez+nOpJyDmBPPvQkNG9IRCoi14VnSWgsrSoYxCU9+mUldLmSt6N/kHbhTVq962kQOlnpoo0V+Cup"\ + "G1aE6UhuQs2Mug29GtCWMHfhtqv2ewYfUqPs+weFBYVHOj33H19HMeVmvJXWrAGawQiYs3RlLNvmdi"\ + "NOs2Jk7XeZakrkcvwjUbCLVXaNtVII/9Fnxn5dcA3kM43IU0W31RldJi8UI+mVgkjpvrrZHVaUN" +# correct +KEY5 = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDOSD1H66ulGN23Sx/TeRClaEDYKEFt0V5Q"\ + "iQOl2nIISxjI2Z2GV+TGhtmqzrnY5tzCFXVUTblGs/+nuu8HSsrpJRgSHmafdm2ZhcG5fsVgJBT6mU6"\ + "v9dhn1Pb/L6yrcS1WiSxpq04v7x88LjyxKb38zoCn+EHA/IBQmUBixPT9kUJZEbzQmFbWnyP78HFHI0"\ + "QSGg+pkLlpqetcMHlLvJOzrTfGW8iARRSdf6CoH/iktWuCriv9OnDdKNQb1HImLRdtchz+iOD1B4gFH"\ + "gJ0XMBgqNRllpNHjn3DR8dFQDo00ooJT/lC0IR2ldt0vdZHPvvdiKHPZHm9QtY9LGa9p00F test5@l"\ + "ocalhost" + + +class TestSSHKey(TestCase): + + def test_add(self): + key = SSHKey.add('test', KEY1) + assert isinstance(key, SSHKey) + assert key.fingerprint == KEY1_FINGERPRINT + assert key.finger == KEY1_FINGERPRINT + assert key.title == KEY1_TITLE + assert key.key == KEY1 + + def test_get(self): + newkey = SSHKey.add('test', KEY1) + key = SSHKey.get(newkey.id) + assert isinstance(key, SSHKey) + assert key.fingerprint == KEY1_FINGERPRINT + assert key.finger == KEY1_FINGERPRINT + assert key.title == KEY1_TITLE + assert key.key == KEY1 + + def test_delete(self): + newkey = SSHKey.add('test', KEY1) + newkey.delete() + key = SSHKey.get(newkey.id) + assert key is None + + def test_validate(self): + r = SSHKey.validate('test', KEY1) + assert r is True + r = SSHKey.validate('test', KEY2) + assert r is None + r = SSHKey.validate('test', KEY3) + assert r is None + r = SSHKey.validate('test', KEY4) + assert r is True + + def test_duplicate(self): + SSHKey.add('test', KEY1) + r = SSHKey.is_duplicated('test', KEY1) + assert r is True + r = SSHKey.is_duplicated('test', KEY5) + assert r is None diff --git a/tests/test_stat.py b/tests/test_stat.py new file mode 100644 index 0000000..a502a43 --- /dev/null +++ b/tests/test_stat.py @@ -0,0 +1,141 @@ +# -*- coding: utf-8 -*- +import os + +from vilya.libs.store import store + +from tests.base import TestCase +from vilya.models.statistics import ( + get_all_project, get_all_gist, get_all_issue, + get_issue_comment_count, get_all_ticket, + get_ticket_comment_count) + +from vilya.models.project import CodeDoubanProject +from vilya.models.issue import Issue +from vilya.models.issue_comment import IssueComment +from vilya.models.pull import PullRequest +from vilya.models.ticket import Ticket +from nose.tools import ok_ +from vilya.libs.permdir import get_repo_root +from tests.utils import mkdtemp, setup_repos + + +class TestStat(TestCase): + + def test_project_stat(self): + store.execute("delete from codedouban_projects where project_id < 5") + project_rs = get_all_project() + assert len(project_rs) == 0 + project_fork_count = len(filter(lambda x: x[1] is not None, + project_rs)) + assert project_fork_count == 0 + + project_name = "project" + project = CodeDoubanProject.add( + project_name, owner_id="test1", summary="test", product="fire") + git_path = os.path.join(get_repo_root(), '%s.git' % project_name) + ok_(os.path.exists(git_path)) + project_rs = get_all_project() + assert len(project_rs) == 1 + project_fork_count = len(filter(lambda x: x[1] is not None, + project_rs)) + assert project_fork_count == 0 + + project_fork = project.fork('project_test_fork', 'test_fork') + project_rs = get_all_project() + assert len(project_rs) == 2 + project_fork_count = len(filter(lambda x: x[1] is not None, + project_rs)) + assert project_fork_count == 1 + + project.delete() + project_fork.delete() + + def test_gist_stat(self): + store.execute("delete from gists where id < 20") + gist_rs = get_all_gist() + assert len(gist_rs) == 0 + g1 = self._add_gist() + gist_rs = get_all_gist() + assert len(gist_rs) == 1 + user_id = "testuser" + g1.fork(user_id) + gist_rs = get_all_gist() + assert len(gist_rs) == 2 + assert len(filter(lambda x: x[1] != 0, gist_rs)) == 1 + + def test_issue_stat(self): + issue_rs = get_all_issue() + store.execute("delete from issues where id < 20") + assert len(issue_rs) == 0 + issue_open_count = len(filter(lambda x: x[1] is None, issue_rs)) + assert issue_open_count == 0 + assert len(issue_rs) - issue_open_count == 0 + + i1 = Issue.add('test1', 'test des1', 'testuser1', 'assignee') + issue_rs = get_all_issue() + assert len(issue_rs) == 1 + issue_open_count = len(filter(lambda x: x[1] is None, issue_rs)) + assert issue_open_count == 1 + assert len(issue_rs) - issue_open_count == 0 + + i2 = Issue.add('test2', 'test des1', 'testuser1', 'assignee') + i3 = Issue.add('test3', 'test des1', 'testuser2', 'assignee') + issue_rs = get_all_issue() + assert len(issue_rs) == 3 + issue_open_count = len(filter(lambda x: x[1] is None, issue_rs)) + assert issue_open_count == 3 + assert len(issue_rs) - issue_open_count == 0 + + i1.close('testuser1') + issue_rs = get_all_issue() + assert len(issue_rs) == 3 + issue_open_count = len(filter(lambda x: x[1] is None, issue_rs)) + assert issue_open_count == 2 + assert len(issue_rs) - issue_open_count == 1 + + issue_comment_count = get_issue_comment_count() + assert issue_comment_count == 0 + IssueComment.add(i2.id, 'content', 'test') + IssueComment.add(i3.id, 'content', 'test1') + issue_comment_count = get_issue_comment_count() + assert issue_comment_count == 2 + + def test_pr_stat(self): + TestCase.setUp(self) + _, self.proj1, _, self.proj1_fork = setup_repos( + mkdtemp(), 'testproject1') + _, self.proj2, _, self.proj2_fork = setup_repos( + mkdtemp(), 'testproject2') + pr_rs = get_all_ticket() + assert len(pr_rs) == 0 + pr_open_count = len(filter(lambda x: x[1] is None, pr_rs)) + assert pr_open_count == 0 + assert len(pr_rs) - pr_open_count == 0 + + pullreq1 = PullRequest.open( + self.proj1_fork, 'master', self.proj1, 'master') + ticket1 = Ticket.add(self.proj1.id, 'title', 'content', 'testuser') + pullreq1 = pullreq1.insert(ticket1.ticket_number) + pullreq2 = PullRequest.open( + self.proj2_fork, 'master', self.proj2, 'master') + ticket2 = Ticket.add(self.proj2.id, 'title', 'content', 'testuser') + pullreq2 = pullreq2.insert(ticket2.ticket_number) + pr_rs = get_all_ticket() + assert len(pr_rs) == 2 + pr_open_count = len(filter(lambda x: x[1] is None, pr_rs)) + assert pr_open_count == 2 + assert len(pr_rs) - pr_open_count == 0 + + ticket1.close("testuser") + pr_rs = get_all_ticket() + assert len(pr_rs) == 2 + pr_open_count = len(filter(lambda x: x[1] is None, pr_rs)) + assert pr_open_count == 1 + assert len(pr_rs) - pr_open_count == 1 + + pr_comment_count = get_ticket_comment_count() + assert(pr_comment_count) == 0 + ticket2.add_comment("comment1", "testuse1") + ticket2.add_comment("comment2", "testuse2") + pr_comment_count = get_ticket_comment_count() + assert(pr_comment_count) == 2 diff --git a/tests/test_tag.py b/tests/test_tag.py new file mode 100644 index 0000000..df98a36 --- /dev/null +++ b/tests/test_tag.py @@ -0,0 +1,190 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from vilya.models.tag import TagName, Tag, TAG_TYPE_PROJECT_ISSUE +from tests.base import TestCase + + +class TestName(TestCase): + + def test_add(self): + name = "tag" + author = "test" + target_type = 2 + target_id = 3 + tag = TagName.add(name, author, target_type, target_id) + assert tag.name == name + assert tag.author_id == author + assert tag.target_type == target_type + assert tag.target_id == target_id + tag.delete() + + def test_get(self): + name = "tag" + author = "test" + target_type = 2 + target_id = 3 + newtag = TagName.add(name, author, target_type, target_id) + tag = TagName.get_by_name_and_target_id(name, target_type, target_id) + assert tag.id == newtag.id + assert tag.name == name + assert tag.author_id == author + assert tag.target_type == target_type + assert tag.target_id == target_id + + tag = TagName.get_by_id(newtag.id) + assert tag.id == newtag.id + assert tag.name == name + assert tag.author_id == author + assert tag.target_type == target_type + assert tag.target_id == target_id + + def test_delete(self): + name = "tag" + author = "test" + target_type = 2 + target_id = 3 + newtag = TagName.add(name, author, target_type, target_id) + newtag.delete() + tag = TagName.get_by_name_and_target_id(name, target_type, target_id) + assert tag is None + + tag = TagName.get_by_id(newtag.id) + assert tag is None + + +class TestTag(TestCase): + + def test_add(self): + tag = Tag.add(1, 1, 1, 'test', 3) + assert tag.tag_id == 1 + assert tag.type == 1 + assert tag.type_id == 1 + assert tag.author_id == 'test' + assert tag.target_id == 3 + + def test_get(self): + tags = Tag.gets() + for tag in tags: + tag.delete() + Tag.add(1, TAG_TYPE_PROJECT_ISSUE, 1, 'test1', 3) + Tag.add(2, TAG_TYPE_PROJECT_ISSUE, 1, 'test2', 3) + Tag.add(1, TAG_TYPE_PROJECT_ISSUE, 2, 'test3', 3) + + tag = Tag.get_by_type_id_and_tag_id(TAG_TYPE_PROJECT_ISSUE, 1, 1) + assert isinstance(tag, Tag) + assert tag.tag_id == 1 + assert tag.type == TAG_TYPE_PROJECT_ISSUE + assert tag.type_id == 1 + assert tag.author_id == 'test1' + assert tag.target_id == 3 + + tags = Tag.gets_by_issue_id(1, TAG_TYPE_PROJECT_ISSUE) + assert all([isinstance(t, Tag) for t in tags]) + assert len(tags) == 2 + + def test_delete(self): + tag1 = Tag.add(1, TAG_TYPE_PROJECT_ISSUE, 1, 'test1', 2) + tag2 = Tag.add(2, TAG_TYPE_PROJECT_ISSUE, 1, 'test2', 2) + tag3 = Tag.add(1, TAG_TYPE_PROJECT_ISSUE, 2, 'test3', 2) + tag2.delete() + tag = Tag.get_by_type_id_and_tag_id(TAG_TYPE_PROJECT_ISSUE, 1, 2) + assert tag is None + + def test_get_type_ids_by_names_and_target_id(self): + name1 = "tag" + author = "test" + type = target_type = TAG_TYPE_PROJECT_ISSUE + target_id = 3 + tag_name1 = TagName.add(name1, author, target_type, target_id) + assert tag_name1.name == name1 + + author_id = 2 + type_id1 = 1 + type_id2 = 2 + type_id3 = 3 + tag1 = Tag.add(tag_name1.id, type, type_id1, author_id, target_id) + tag2 = Tag.add(tag_name1.id, type, type_id2, author_id, target_id) + tag3 = Tag.add(tag_name1.id, type, type_id3, author_id, target_id) + + assert tag1.tag_id == tag2.tag_id == tag3.tag_id + + type_ids = Tag.get_type_ids_by_names_and_target_id( + type, [name1], target_id) + + assert len(type_ids) == 3 + assert type_id1 in type_ids + assert type_id2 in type_ids + assert type_id3 in type_ids + + name2 = "tag2" + tag_name2 = TagName.add(name2, author, target_type, target_id) + assert tag_name2.name == name2 + + type_id4 = 4 + tag3 = Tag.add(tag_name2.id, type, type_id3, author_id, target_id) + tag4 = Tag.add(tag_name2.id, type, type_id4, author_id, target_id) + + type_ids = Tag.get_type_ids_by_names_and_target_id( + type, [name1, name2], target_id) + + print type_ids + assert len(type_ids) == 1 + assert type_id3 in type_ids + + def test_gets_by_target_id(self): + tags = Tag.gets() + for tag in tags: + tag.delete() + name = "tag" + author = "test" + type = target_type = TAG_TYPE_PROJECT_ISSUE + target_id = 3 + tag_name = TagName.add(name, author, target_type, target_id) + assert tag_name.name == name + + author_id = 2 + type_id1 = 1 + type_id2 = 2 + type_id3 = 3 + tag1 = Tag.add(tag_name.id, type, type_id1, author_id, target_id) + tag2 = Tag.add(tag_name.id, type, type_id2, author_id, target_id) + tag3 = Tag.add(tag_name.id, type, type_id3, author_id, target_id) + + assert tag1.tag_id == tag2.tag_id == tag3.tag_id + + tags = Tag.gets_by_target_id(type, target_id) + + assert len(tags) == 3 + + type_ids = [t.type_id for t in tags] + assert type_id1 in type_ids + assert type_id2 in type_ids + assert type_id3 in type_ids + + def test_gets_by_tag_id(self): + name = "tag" + author = "test" + type = target_type = TAG_TYPE_PROJECT_ISSUE + target_id = 3 + tag_name = TagName.add(name, author, target_type, target_id) + assert tag_name.name == name + + author_id = 2 + type_id1 = 1 + type_id2 = 2 + type_id3 = 3 + tag1 = Tag.add(tag_name.id, type, type_id1, author_id, target_id) + tag2 = Tag.add(tag_name.id, type, type_id2, author_id, target_id) + tag3 = Tag.add(tag_name.id, type, type_id3, author_id, target_id) + + assert tag1.tag_id == tag2.tag_id == tag3.tag_id + + tags = Tag.gets_by_tag_id(tag_name.id) + + assert len(tags) == 3 + + type_ids = [t.type_id for t in tags] + assert type_id1 in type_ids + assert type_id2 in type_ids + assert type_id3 in type_ids diff --git a/tests/test_team.py b/tests/test_team.py new file mode 100644 index 0000000..e343322 --- /dev/null +++ b/tests/test_team.py @@ -0,0 +1,93 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from nose.tools import ok_ + +from tests.base import TestCase +from vilya.models.team import Team +from vilya.models.nteam import TeamProjectRelationship, TeamUserRelationship +from vilya.libs.text import get_mentions_from_text + + +class TestTeam(TestCase): + + def test_add_and_delete_team(self): + team_id = "test_team" + team_name = "测试team" + description = "测试" + n_team = len(Team.gets()) + team = Team.add(team_id, team_name, description) + new_n_team = len(Team.gets()) + ok_(new_n_team == n_team + 1) + ok_(team_id == team.uid) + team.delete() + new_n_team = len(Team.gets()) + ok_(new_n_team == n_team) + + def test_add_and_delete_team_user_relationship(self): + team_id = 1111 + user_id = "chengeng" + identity = 2 + rl = TeamUserRelationship.create(team_id=team_id, + user_id=user_id, + identity=identity) + relationship = TeamUserRelationship.get(team_id=team_id, + user_id=user_id) + ok_(rl.id == relationship.id) + rl.delete() + + def test_add_and_delete_team_project_relationship(self): + team_id = 2222 + project_id = 33333 + rl = TeamProjectRelationship.create(team_id=team_id, + project_id=project_id) + relationship = TeamProjectRelationship.get(team_id=team_id, + project_id=project_id) + ok_(rl.id == relationship.id) + rl.delete() + + def test_delete_team_project_relationship_by_project_id(self): + team_id = 2222 + project_id = 2222 + rl = TeamProjectRelationship.create(team_id=team_id, + project_id=project_id) + relationship = TeamProjectRelationship.get(team_id=team_id, + project_id=project_id) + ok_(rl.id == relationship.id) + + TeamProjectRelationship.deletes(project_id=project_id) + relationship = TeamProjectRelationship.get(team_id=team_id, + project_id=project_id) + ok_(relationship is None) + + def ttest_at_team(self): # FIXME + mention = "test_team" + team_name = "测试team" + description = "测试" + team = Team.add(mention, team_name, description) + ok_(team.uid == mention) + + content = "@test_team code" + users = get_mentions_from_text(content) + # ok_(len(users) == 0) + + team_id = team.id + user_id = "chengeng" + identity = 2 + rl = TeamUserRelationship.create(team_id=team_id, + user_id=user_id, + identity=identity) + ok_(rl.user_id == user_id) + + users = get_mentions_from_text(content) + ok_(users[0] == user_id) + + rl.delete() + + users = get_mentions_from_text(content) + ok_(len(users) == 0) + + team.delete() + + users = get_mentions_from_text(content) + ok_(users[0] == mention) diff --git a/tests/test_test.py b/tests/test_test.py new file mode 100644 index 0000000..78366ed --- /dev/null +++ b/tests/test_test.py @@ -0,0 +1,103 @@ +# -*- coding: utf-8 -*- + +from tests.base import TestCase + + +def test_simple_assert(): + assert True + + +class TestTestClass(object): + def test_simple_assert(self): + assert True + + +def test_connect_db(): + from vilya.libs.store import connect_mysql + conn = connect_mysql() + cursor = conn.cursor() + cursor.execute("select * from codedouban_hooks") + r = cursor.fetchone() + assert r is None, "unittest database should not have rows" + + +class TestDb(TestCase): + def test_insert_into_db(self): + from vilya.libs.store import connect_mysql + conn = connect_mysql() + cursor = conn.cursor() + cursor.execute("select * from codedouban_hooks") + assert cursor.fetchall() == () + ok = cursor.execute( + "insert into codedouban_hooks (project_id, url) values " + "(1, 'test')") + assert ok + conn.commit() + cursor.execute("select * from codedouban_hooks") + assert len(cursor.fetchall()) == 1 + cursor.execute("delete from codedouban_hooks") + conn.commit() + + def test_mc(self): + from vilya.libs.store import get_mc + mc = get_mc() + key = "RANDOM________2f3fddd4455" + assert mc.get(key) is None, "Cache should be empty after next run" + mc.set(key, 'a value') + assert mc.get(key) == 'a value' + + def test_mc_called_twice(self): + from vilya.libs.store import get_mc + mc = get_mc() + key = "RANDOM________2f3fddd4455" + assert mc.get(key) is None + mc.set(key, 'a value') + assert mc.get(key) == 'a value' + mc2 = get_mc() + assert mc2.get(key) == 'a value' + + def test_mc_with_strange_key_using_quote(self): + from vilya.libs.store import get_mc + import urllib + mc = get_mc() + key = urllib.quote_plus('sss sés你好的de') + assert mc.get(key) is None, "Cache should be empty after next run" + mc.set(key, 'a value') + assert mc.get(key) == 'a value' + + def test_cache_decorator(self): + from vilya.libs.store import cache + cache_key = 'K2000' + + @cache(cache_key) + def check(): + check.count += 1 + return True # Shit, cannot return None here! + check.count = 0 + assert check.count == 0 + check() + assert check.count == 1, "Should go inside cached function once" + [check() for i in range(10)] + assert check.count == 1, "Should go inside cached function ONLY once" + + def test_cache_decorator_with_params(self): + from vilya.libs.store import cache + cache_key = 'K2000 p1:%s:%s' + + @cache(cache_key % ('{param1}', '{param2}')) + def check(param1, param2): + check.count += 1 + return True # Shit, cannot return None here! + check.count = 0 + check(1, 2) + assert check.count == 1 + check(1, 2) + assert check.count == 1 + check(2, 1) + assert check.count == 2 + check(2, 1) + assert check.count == 2 + check(1, 2) + assert check.count == 2 + check(1, 3) + assert check.count == 3 diff --git a/tests/test_user.py b/tests/test_user.py new file mode 100644 index 0000000..efd94bb --- /dev/null +++ b/tests/test_user.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- + +from tests.base import TestCase + +from vilya.models.user import User + + +class TestUser(TestCase): + def test_simple_user(self): + u = User('testu') + assert u.name == 'testu' + assert 'douvatar' in u.avatar_url + assert u.get_badges() == [] + assert u.email == 'testu@douban.com' + assert u.username == 'testu' + assert u.url == '/people/testu/' + + def test_user_with_email_from_inside_douba(self): + u = User('testu', 'testu_email@douban.com') + assert u.name == 'testu' + assert 'douvatar' in u.avatar_url + assert u.get_badges() == [] + assert u.email == 'testu_email@douban.com' + assert u.username == 'testu' + assert u.url == '/people/testu/' + + def test_user_with_email_from_outside_douba(self): + u = User('testu', 'testu_email@test.com') + assert u.name == 'testu' + assert 'douvatar' in u.avatar_url + assert u.get_badges() == [] + assert u.email == 'testu_email@test.com' + assert u.username == 'testu' + assert u.url == '/people/testu/' + + def ttest_get_current_user(self): # noqa + assert not User.get_current_user() + + def test_user_equal(self): + assert User('tu', 'testu@test.com') == User('tu', 'testu@test.com') + assert User('tu1', 'testu@test.com') != User('tu2', 'testu@test.com') + + def test_follow(self): + User('testuser2').follow('testuser1') + User('testuser3').follow('testuser1') + assert len(User('testuser1').get_followers()) == 2 + User('testuser3').follow('testuser1') + assert len(User('testuser1').get_followers()) == 2 + User('testuser3').unfollow('testuser1') + assert len(User('testuser1').get_followers()) == 1 + User('testuser2').unfollow('testuser1') + assert len(User('testuser1').get_followers()) == 0 + + def test_user_settings(self): + u = User('testu') + assert u.settings.show_tips is None + u.settings.show_tips = True + assert u.settings.show_tips is True diff --git a/tests/test_user_fav.py b/tests/test_user_fav.py new file mode 100644 index 0000000..8379a6a --- /dev/null +++ b/tests/test_user_fav.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- + +from tests.base import TestCase + +from vilya.models.user_fav import UserFavItem +from vilya.models.consts import K_PULL, K_ISSUE + + +class TestUser(TestCase): + + def test_add_fav(self): + user_id = "testuser" + pull_id = 1 + kind = K_PULL + UserFavItem.add(user_id, pull_id, kind) + favs = UserFavItem.gets_by_user_kind(user_id) + assert len(favs) == 1 + fav = favs[0] + assert fav.target_id == pull_id + + target_ids = UserFavItem.get_target_ids_by_user_kind(user_id, K_PULL) + assert len(target_ids) == 1 + assert target_ids[0] == str(pull_id) + + assert UserFavItem.is_liked_by_user(user_id, K_PULL, pull_id), True + + def test_delete_fav(self): + user_id = "testuser" + pull_id = 1 + kind = K_PULL + UserFavItem.add(user_id, pull_id, kind) + + issue_id = 3 + kind = K_ISSUE + UserFavItem.add(user_id, issue_id, kind) + + favs = UserFavItem.gets_by_user_kind(user_id) + assert len(favs) == 2 + + UserFavItem.delete_by_user_target_kind(user_id, pull_id, K_PULL) + favs = UserFavItem.gets_by_user_kind(user_id) + assert len(favs) == 1 + + UserFavItem.delete_by_user_target_kind(user_id, issue_id, K_ISSUE) + favs = UserFavItem.gets_by_user_kind(user_id) + assert len(favs) == 0 diff --git a/tests/test_user_pull_requests.py b/tests/test_user_pull_requests.py new file mode 100644 index 0000000..662aae6 --- /dev/null +++ b/tests/test_user_pull_requests.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +import time + +from tests.base import TestCase + +from vilya.models.user import User +from vilya.models.project import CodeDoubanProject +from vilya.models.ticket import Ticket +from tests.utils import delete_project + + +class TestUserPullRequests(TestCase): + + def setUp(self): + TestCase.setUp(self) + delete_project('test_pr1') + delete_project('test_pr2') + self.proj1 = CodeDoubanProject.add('test_pr1', owner_id='test') + self.proj2 = CodeDoubanProject.add('test_pr2', owner_id='test') + + def test_get_user_pull_requests(self): + u = User('testu%s' % time.time()) + title = 'test title' + desc = 'test desc' + t1 = Ticket.add(self.proj1.id, title, desc, u.username) + + assert u.get_invited_pull_requests() == [] + u.add_invited_pull_request(t1.id) + print u.get_invited_pull_requests() + assert u.get_invited_pull_requests()[0].id == t1.id + assert u.n_open_invited == 1 + + assert u.get_participated_pull_requests()[0].id == t1.id + u.add_participated_pull_request(t1.id) + assert u.get_participated_pull_requests()[0].id == t1.id + assert u.n_open_participated == 1 + + def test_get_user_submitted_pull_requests(self): + title = 'test title' + desc = 'test desc' + u = User('testu%s' % time.time()) + p1_t1 = Ticket.add(self.proj2.id, title, desc, u.username) + assert u.get_user_submit_pull_requests() != [] + assert u.n_user_open_submit_pull_requests == 1 + + p1_t1.close('testuser') + assert u.get_user_submit_pull_requests() == [] + assert u.n_user_open_submit_pull_requests == 0 + + assert u.n_open_pull_requests == 0 diff --git a/tests/test_utils.py b/tests/test_utils.py new file mode 100644 index 0000000..8c5a3ad --- /dev/null +++ b/tests/test_utils.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- + +from tests.base import TestCase + +from vilya.models.utils import check_douban_email + + +class TestUtils(TestCase): + def test_check_douban_email(self): + emails = ('testuser@douban.com', + 'lh_intern@douban.com', + 'lihan@intern.douban.com',) + for e in emails: + assert check_douban_email(e) + + emails = ('testuser@gmail.com', + '', + None, + 'whatsyouremailaddrs') + for e in emails: + assert not check_douban_email(e) diff --git a/tests/test_validators.py b/tests/test_validators.py new file mode 100644 index 0000000..63a626d --- /dev/null +++ b/tests/test_validators.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- + +from tests.base import TestCase + +from vilya.libs.validators import ( + check_name, check_url, check_integer, check_email, + check_git_url, check_user_id, check_project_name) + + +class TestValidators(TestCase): + def test_check_name(self): + assert check_name("Sean") == None + assert check_name("Sean Lee") == None + assert check_name("Sean" * 50) == "Name is too long" + + def test_check_project_name(self): + assert check_project_name("code") == None + assert check_project_name("hubothubot") == None + assert check_project_name("bot" * 50) != None + assert check_project_name("c ode") != None + assert check_project_name("我和你") != None + assert check_project_name("asd/code") != None + assert check_project_name("/////") != None + + def test_check_url(self): + assert check_url("http://www.douban.com/people/ahbei") is None + assert check_url("http://127.0.0.1:8000/") is None + + illegal_url = "wobushigeurl." + very_long_url = "http://douban.com/%s" % "ahbei"* 500 + assert check_url(illegal_url) == "Url is illegal" + assert check_url(very_long_url) == "Url is too long" + + def test_check_integer(self): + assert check_integer("12312") == None + assert check_integer("233.121") == "ID is not a integer" + + def test_check_email(self): + assert check_email("test@douban.com") is None + assert check_email("iseansay@gmail.com") is None + assert check_email("@gmail.com") == "Email is non verified" + + def test_check_git_url(self): + assert check_git_url( + "http://code.dapps.douban.com/lisong_intern/code.git") is None + assert check_git_url("https://github.com/liluo/py-oauth2.git") is None + + def test_check_user_id_(self): + assert check_user_id("qingfeng") is not None + assert check_user_id("verylonglonglonglonglongusername") is None diff --git a/tests/utils.py b/tests/utils.py new file mode 100644 index 0000000..6c23f9a --- /dev/null +++ b/tests/utils.py @@ -0,0 +1,143 @@ +import os +import tempfile +import shutil + +from mock import Mock +from contextlib import contextmanager + +from vilya.libs import gyt +from vilya.libs.permdir import get_repo_root +from ellen.repo import Jagare +from vilya.models.project import CodeDoubanProject + + +TEMP_PROJECT_OWNER = 'testuser' +TEMP_PROJECT_DESCRIPTION = 'This is a test project.' +BARE_REPO_PATH = os.path.join( + os.path.dirname(os.path.abspath(__file__)), + 'data', 'bare_repo1') + +content_a = """a_hunk = [('idem', u'/* highlight style */'), ('rem', u'.highlight { color: #008000; font-weight: bold; } /* Keyword */'), ('add', u'.highlight .hll { background-color: #ffffcc; }'), ('add', u'.highlight { background: #ffffff; }'), ('add', u'.highlight .c { color: #808080; } /* Comment */'), ('add', u'.highlight .err { color: #F00000; background-color: #F0A0A0; } /* Error */'), ('add', u'.highlight .k { color: #008000; font-weight: bold; } /* Keyword */'), ('idem', u'.highlight .o { color: #303030; } /* Operator */'), ('idem', u'.highlight .cm { color: #808080; } /* Comment.Multiline */'), ('idem', u'.highlight .cp { color: #507090; } /* Comment.Preproc */')]""" # noqa +content_b = """a_hunk = [('idem', u'/* highlight style */'), ('rem', u'.highlight { color: #008000; font-weight: bold; } /* Keyword */'), ('add', u'.highlight .hll { background-color: #ffffcc; }'), ('add', u'.highlight { backggggground: #ffffff; }'), ('add', u'.high .c { color: #808080; } /* Coomment */'), ('add', u'.highlight .err { color: #F00000; background-color: #F00A0A0; } /* Error */'), ('add', u'.highlight .k { color: #008000; font-weight: bold; } /* Keyword */'), ('idem', u'.highlight .o { color: #303; } /* Operator ****/'), ('idem', u'.highlight .cm { color: #808080; } /* Comment.Multiline */'),('idem', u'adfadsfadsf'), ('idem', u'.highlight .cp { color: #507090; } /* Comment.Preproc */')]""" # noqa + + +@contextmanager +def mkdtemp(): + tmpdir = tempfile.mkdtemp() + yield tmpdir + shutil.rmtree(tmpdir) + + +@contextmanager +def chdir(dir): + cwd = os.getcwd() + os.chdir(dir) + yield + os.chdir(cwd) + + +class FakeEnv(object): + """A fake trac env""" + + def __init__(self, name): + self.project_name = name + + +@contextmanager +def new_git_bare_repo(): + with mkdtemp() as tmpdir: + gyt.call(['git', 'init', '--bare', tmpdir]) + yield tmpdir + + +@contextmanager +def clone(git_dir): + with mkdtemp() as work_path: + gyt.call(['git', 'clone', git_dir, work_path]) + assert os.path.exists(work_path + '/.git') + yield work_path + + with chdir(work_path): + gyt.call(['git', 'config', 'user.name', 'test author']) + gyt.call(['git', 'config', 'user.email', 'ta@example.com']) + gyt.call(['git', 'add', "."]) + gyt.call(['git', 'commit', '-m', 'test'], _raise=True) + gyt.call(['git', 'push', 'origin', 'master'], _raise=True) + + +def mock_method(real_method): + mock = Mock(wraps=real_method) + + def _(*a, **kw): + return mock(*a, **kw) + _.mock = mock + return _ + + +def setup_repos(tmpdir, prj_name='test_proj'): + delete_project(prj_name) + origin_project = CodeDoubanProject.add(prj_name, 1, + create_trac=False) + path = origin_project.git_real_path + with clone(path) as workdir: + with open(os.path.join(workdir, 'origin'), 'w') as f: + f.write(content_a) + delete_project(prj_name + '_fork') + fork_project = CodeDoubanProject.add(prj_name + '_fork', 2, + fork_from=origin_project.id, + create_trac=False) + fork_path = fork_project.git_real_path + repo = origin_project + fork_repo = fork_project + return path, repo, fork_path, fork_repo + + +@contextmanager +def setup2repos(prj_name): + """setup_2_repos_and_make_changes_in_fork""" + with mkdtemp() as tmpdir: + path, repo, fork_path, fork_repo = setup_repos(tmpdir, prj_name) + + with clone(fork_path) as work_path: + with open(os.path.join(work_path, 'a'), 'w') as f: + f.write(content_b) + + yield path, repo, fork_path, fork_repo + + +def get_temp_project(origin=None, repo_path=BARE_REPO_PATH): + if origin: + prefix_path = get_repo_root() + temp_repo_path = tempfile.mkdtemp(suffix=".git", + prefix="test_", + dir=prefix_path) + project_name = temp_repo_path[len(prefix_path) + 1:][:-4] + project = CodeDoubanProject.add(project_name, + TEMP_PROJECT_OWNER, + TEMP_PROJECT_DESCRIPTION, + fork_from=origin.id, + create_trac=False) + return project + + prefix_path = get_repo_root() + temp_repo_path = tempfile.mkdtemp(suffix=".git", + prefix="test_", + dir=prefix_path) + project_name = temp_repo_path[len(prefix_path) + 1:][:-4] + project = CodeDoubanProject.add(project_name, TEMP_PROJECT_OWNER, + TEMP_PROJECT_DESCRIPTION) + + shutil.rmtree(temp_repo_path) + repo = Jagare(repo_path) + repo.clone(temp_repo_path, bare=True) + + return project + + +def delete_project(names): + if isinstance(names, basestring): + names = [names] + for n in names: + prj = CodeDoubanProject.get_by_name(n) + if prj: + prj.delete() diff --git a/tests/webtests/__init__.py b/tests/webtests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/webtests/api/__init__.py b/tests/webtests/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/webtests/api/base.py b/tests/webtests/api/base.py new file mode 100644 index 0000000..7a4f7c7 --- /dev/null +++ b/tests/webtests/api/base.py @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- + +import shutil + +import app as M + + +from vilya.models.api_key import ApiKey +from vilya.models.api_token import ApiToken +from vilya.models.gist import Gist +from vilya.models.user import User + +from webtest import TestApp +from tests.base import TestCase +from tests.utils import get_temp_project + + +class APITestCase(TestCase): + + def setUp(self): + self.init_temp_project() + super(APITestCase, self).setUp() + self.app = TestApp(M.app) + + def tearDown(self): + super(APITestCase, self).tearDown() + self.clean_temp_project() + + def addUser(self, name='api_test_user'): + return User(name) + + def _add_api_key(self): + name = 'test' + desc = '' + type = ApiKey.TYPE_WEB + url = 'http://www.douban.com' + redirect_uri = 'http://www.douban.com/callback' + owner_id = 'testuser' + return ApiKey.add(name, desc, type, url, redirect_uri, owner_id) + + def _add_api_token(self, user_id): + apikey = self._add_api_key() + return ApiToken.add(apikey.client_id, user_id) + + def create_api_token(self, user_id="test_user"): + return self._add_api_token(user_id) + + def assertProblemType(self, type_a, type_b): + self.assertEquals(type_a, type_b) + + def _add_gist(self, description='', owner_id='testuser', is_public=1, + gist_names=[], gist_contents=[], fork_from=None): + return Gist.add(description, owner_id, is_public, + gist_names=gist_names, gist_contents=gist_contents, + fork_from=fork_from) + + def init_temp_project(self): + self._temp_paths = [] + + def clean_temp_project(self): + for path in self._temp_paths: + shutil.rmtree(path) + + def get_temp_project(self, origin=None): + project = get_temp_project(origin=origin) + self._temp_paths.append(project.repo_path) + return project diff --git a/tests/webtests/api/test_follow.py b/tests/webtests/api/test_follow.py new file mode 100644 index 0000000..1577460 --- /dev/null +++ b/tests/webtests/api/test_follow.py @@ -0,0 +1,86 @@ +# encoding: utf-8 +from .base import APITestCase +from vilya.models.user import User + + +class FollowTest(APITestCase): + def setUp(self): + super(FollowTest, self).setUp() + user_name1 = 'zhangchi' + email = '%s@douban.com' % user_name1 + self.zhangchi = User(user_name1, email) + user_name2 = 'lijunpeng' + email = '%s@douban.com' % user_name2 + self.lijunpeng = User(user_name2, email) + self.api_token_zhangchi = self.create_api_token('zhangchi') + self.api_token_lijunpeng = self.create_api_token('lijunpeng') + + def test_get_auth_user_following(self): + self.zhangchi.follow('qingfeng') + self.zhangchi.follow('lisong_intern') + self.zhangchi.follow('xingben') + + ret = self.app.get( + "/api/user/following/", + status=200 + ).json + self.assertEquals(ret, []) + + ret = self.app.get( + "/api/user/following/", + headers=dict( + Authorization="Bearer %s" % self.api_token_zhangchi.token), + status=200 + ).json + + self.assertEquals(len(ret), 3) + user_name_list = map(lambda x: x['username'], ret) + self.assertTrue('xingben' in user_name_list) + + User('test1', 'test1@douban.com').follow('zhangchi') + User('test2', 'test2@douban.com').follow('zhangchi') + ret = self.app.get( + "/api/user/followers", + headers=dict( + Authorization="Bearer %s" % self.api_token_zhangchi.token), + status=200 + ).json + self.assertEquals(len(ret), 2) + user_name_list = map(lambda x: x['username'], ret) + self.assertTrue('test1' in user_name_list) + + def test_follow(self): + self.app.get( + "/api/user/following/%s/" % (self.lijunpeng.username), + headers=dict( + Authorization="Bearer %s" % self.api_token_zhangchi.token), + status=404 + ) + + self.app.put( + "/api/user/following/%s/" % (self.lijunpeng.username), + headers=dict( + Authorization="Bearer %s" % self.api_token_zhangchi.token), + status=204 + ) + + self.app.get( + "/api/user/following/%s/" % (self.lijunpeng.username), + headers=dict( + Authorization="Bearer %s" % self.api_token_zhangchi.token), + status=204 + ) + + self.app.delete( + "/api/user/following/%s/" % (self.lijunpeng.username), + headers=dict( + Authorization="Bearer %s" % self.api_token_zhangchi.token), + status=204 + ) + + self.app.get( + "/api/user/following/%s/" % (self.lijunpeng.username), + headers=dict( + Authorization="Bearer %s" % self.api_token_zhangchi.token), + status=404 + ) diff --git a/tests/webtests/api/test_gist.py b/tests/webtests/api/test_gist.py new file mode 100644 index 0000000..fb42b81 --- /dev/null +++ b/tests/webtests/api/test_gist.py @@ -0,0 +1,223 @@ +# encoding: utf-8 +from base import APITestCase +from vilya.libs.store import store +from vilya.models.gist_comment import GistComment + + +class GistTest(APITestCase): + def setUp(self): + store.execute('delete from gist_stars where id<10') + super(GistTest, self).setUp() + self.gist1 = self._add_gist( + description='this is my first gist', + owner_id='xutao' + ) + self.gist2 = self._add_gist( + description='this is my second gist', + owner_id='xutao' + ) + self.gist3 = self._add_gist( + description='this is my second gist', + owner_id='lisong_intern', + gist_names=["gistname1.txt", "gistname2.txt"], + gist_contents=["first", "second"] + ) + self.api_token = self.create_api_token('xutao') + self.api_token2 = self.create_api_token('lijunpeng') + + def test_your_gists(self): + ret = self.app.get( + "/api/gists/", + status=200, + headers=dict(Authorization="Bearer %s" % self.api_token.token) + ).json + self.assertEquals(len(ret), 10) + + def test_your_starred_gists(self): + ret = self.app.put( + "/api/gists/%s/star" % self.gist1.id, + status=204, + headers=dict(Authorization="Bearer %s" % self.api_token.token) + ) + ret = self.app.get( + "/api/gists/starred", + status=200, + headers=dict(Authorization="Bearer %s" % self.api_token.token) + ).json + self.assertEquals(len(ret), 1) + + def test_get_a_not_exist_gist(self): + ret = self.app.get( + "/api/gists/%s/" % "444444444", + status=404, + headers=dict(Authorization="Bearer %s" % self.api_token.token) + ).json + self.assertProblemType(ret['type'], "not_found") + self.assertTrue("gist" in ret["message"]) + + def test_get_single_gist(self): + ret = self.app.get( + "/api/gists/%s/" % self.gist1.id, + status=200, + headers=dict(Authorization="Bearer %s" % self.api_token.token) + ).json + self.assertTrue('description' in ret) + self.assertTrue('files' in ret) + self.assertTrue('url' in ret) + self.assertEquals(ret["public"], True) + + def test_get_single_gist_src(self): + ret = self.app.get( + "/api/gists/%s/src" % self.gist3.id, + status=200, + headers=dict(Authorization="Bearer %s" % self.api_token.token) + ).json + self.assertTrue('path' in ret) + self.assertTrue('type' in ret) + self.assertTrue(isinstance(ret['src'], list)) + + def test_get_single_gist_source(self): + ret = self.app.get( + "/api/gists/%s/source" % self.gist3.id, + status=200, + headers=dict(Authorization="Bearer %s" % self.api_token.token) + ).json + self.assertTrue(isinstance(ret['source'], list)) + + def test_create_a_gist(self): + description = "my gist" + filename1 = "file1.txt" + filename2 = "gist.md" + content1 = "sent from icode" + content2 = "##sent from icode" + + ret = self.app.post_json( + "/api/gists/", + dict(description="my gist", files={ + filename1: {"content": content1}, + filename2: {"content": content2} + }), + status=201, + headers=dict(Authorization="Bearer %s" % self.api_token.token) + ).json + + self.assertEquals(ret['description'], description) + self.assertTrue(filename1 in ret["files"]) + self.assertTrue(filename2 in ret["files"]) + + def test_create_a_private_gist(self): + filename1 = "file1.txt" + filename2 = "gist.md" + content1 = "sent from icode" + content2 = "##sent from icode" + + ret = self.app.post_json( + "/api/gists/", + dict(description="my gist", public=False, files={ + filename1: {"content": content1}, + filename2: {"content": content2} + }), + status=201, + headers=dict(Authorization="Bearer %s" % self.api_token.token) + ).json + gist_id = ret["id"] + self.assertEquals(ret['public'], False) + + ret = self.app.get( + "/api/gists/%s/" % gist_id, + status=403, + headers=dict(Authorization="Bearer %s" % self.api_token2.token) + ) + + def test_edit_a_gist(self): + filename1 = "file1.txt" + filename2 = "gist.md" + content1 = "sent from icode" + content2 = "##sent from icode" + + ret = self.app.post_json( + "/api/gists/", + dict(description="my gist", files={ + filename1: {"content": content1}, + filename2: {"content": content2} + }), + status=201, + headers=dict(Authorization="Bearer %s" % self.api_token.token) + ).json + gist_id = ret["id"] + new_description = "new gist" + new_content1 = "########sent from icode" + + ret = self.app.patch_json( + "/api/gists/%s/" % gist_id, + dict(description=new_description, files={ + filename1: {"content": new_content1} + }), + status=200, + headers=dict(Authorization="Bearer %s" % self.api_token.token) + ).json + + self.assertEquals(ret['description'], new_description) + # self.assertEquals(new_content1, self.app.get( + # ret["files"][filename1]['raw_url']).body) + # self.assertEquals(content2, self.app.get( + # ret["files"][filename2]['raw_url']).body) + + def test_star_a_gist(self): + self.app.put( + "/api/gists/%s/star" % self.gist1.id, + status=204, + headers=dict(Authorization="Bearer %s" % self.api_token.token) + ) + + self.app.get( + "/api/gists/%s/star" % self.gist1.id, + status=204, + headers=dict(Authorization="Bearer %s" % self.api_token.token) + ) + + def test_unstar_a_gist(self): + self.app.delete( + "/api/gists/%s/star" % self.gist1.id, + status=204, + headers=dict(Authorization="Bearer %s" % self.api_token.token) + ) + + self.app.get( + "/api/gists/%s/star" % self.gist1.id, + status=404, + headers=dict(Authorization="Bearer %s" % self.api_token.token) + ) + + def test_fork_a_gist(self): + ret = self.app.post( + "/api/gists/%s/forks" % self.gist1.id, + status=201, + headers=dict(Authorization="Bearer %s" % self.api_token2.token) + ).json + self.assertTrue('url' in ret) + + def test_delete_a_gist(self): + self.app.delete( + "/api/gists/%s/" % self.gist1.id, + status=204, + headers=dict(Authorization="Bearer %s" % self.api_token.token) + ) + + self.app.get( + "/api/gists/%s/" % self.gist1.id, + status=404, + headers=dict(Authorization="Bearer %s" % self.api_token.token) + ) + + def test_get_gist_comments(self): + GistComment.add(self.gist1.id, 'xutao', "sent from iCode") + GistComment.add( + self.gist1.id, 'chengeng', "sent from Code for Android") + + ret = self.app.get( + "/api/gists/%s/comments/" % self.gist1.id, + status=200, + headers=dict(Authorization="Bearer %s" % self.api_token.token) + ).json + self.assertEquals(len(ret), 2) diff --git a/tests/webtests/api/test_index.py b/tests/webtests/api/test_index.py new file mode 100644 index 0000000..f983dc9 --- /dev/null +++ b/tests/webtests/api/test_index.py @@ -0,0 +1,17 @@ +# encoding: utf-8 +from base import APITestCase + + +class ApiIndexTest(APITestCase): + + def test_index(self): + ret = self.app.get( + "/api/", + status=200 + ).json + self.assertTrue(isinstance(ret, dict)) + self.assertTrue('current_user_url' in ret) + self.assertTrue('following_url' in ret) + self.assertTrue('user_url' in ret) + self.assertTrue('team_url' in ret) + self.assertTrue('gist_url' in ret) diff --git a/tests/webtests/api/test_project_issue.py b/tests/webtests/api/test_project_issue.py new file mode 100644 index 0000000..1ec013f --- /dev/null +++ b/tests/webtests/api/test_project_issue.py @@ -0,0 +1,179 @@ +# encoding: utf-8 +from base import APITestCase + +from vilya.models.project import CodeDoubanProject +from vilya.models.project_issue import ProjectIssue +from vilya.models.issue_comment import IssueComment +from tests.utils import delete_project + + +class ProjectIssueTest(APITestCase): + + def setUp(self): + super(ProjectIssueTest, self).setUp() + project_name = "code" + product_name = "fire" + summary = "test" + owner_id = "lisong_intern" + delete_project(project_name) + project = CodeDoubanProject.add( + project_name, + owner_id=owner_id, + summary=summary, + product=product_name + ) + self.project = project + self.username = "lisong_intern" + self.username2 = "zhangchi" + self.api_token = self.create_api_token(self.username) + self.api_token2 = self.create_api_token(self.username2) + + def test_project_issues(self): + ret = self.app.get( + "/api/%s/issues/" % self.project.name, + status=200 + ).json + self.assertTrue(isinstance(ret, list)) + + def test_get_single_issue(self): + title = "test title" + description = "test desc" + creator = "test" + issue = ProjectIssue.add( + title, + description, + creator, + project=self.project.id + ) + IssueComment.add(issue.issue_id, 'content', 'test') + ret = self.app.get( + "/api/%s/issues/%s/" % (self.project.name, issue.number), + status=200 + ).json + self.assertEquals(ret['title'], title) + self.assertEquals(ret['description'], description) + self.assertEquals(ret['creator'], creator) + self.assertEquals(ret['project'], self.project.name) + self.assertEquals(ret['comments'], 1) + + def test_create_issue_success(self): + title = "test title" + description = "test desc" + tags = ["tag1", "tag2"] + ret = self.app.post_json( + "/api/%s/issues/" % (self.project.name), + dict( + title=title, + description=description, + tags=tags + ), + headers=dict(Authorization="Bearer %s" % self.api_token.token), + status=201 + ).json + + self.assertEquals(ret['title'], title) + self.assertEquals(ret['description'], description) + self.assertEquals(ret['creator'], self.username) + self.assertEquals(ret['project'], self.project.name) + self.assertEquals(ret['state'], "open") + self.assertEquals(ret['tags'], tags) + + def test_create_issue_without_tags_success(self): + title = "test title" + description = "test desc" + ret = self.app.post_json( + "/api/%s/issues/" % (self.project.name), + dict( + title=title, + description=description + ), + headers=dict(Authorization="Bearer %s" % self.api_token.token), + status=201 + ).json + + self.assertEquals(ret['title'], title) + self.assertEquals(ret['description'], description) + self.assertEquals(ret['creator'], self.username) + self.assertEquals(ret['project'], self.project.name) + + def test_create_issue_without_login_fail(self): + title = "test title" + description = "test desc" + self.app.post_json( + "/api/%s/issues/" % (self.project.name), + dict( + title=title, + description=description + ), + status=401 + ).json + + def test_create_issue_without_title_fail(self): + description = "test desc" + self.app.post_json( + "/api/%s/issues/" % (self.project.name), + dict( + description=description + ), + headers=dict(Authorization="Bearer %s" % self.api_token.token), + status=422 + ).json + + def test_create_issue_with_invalid_tags_fail(self): + title = "test title" + description = "test desc" + self.app.post_json( + "/api/%s/issues/" % (self.project.name), + dict( + title=title, + description=description, + tags={"tag": "a"} + ), + headers=dict(Authorization="Bearer %s" % self.api_token.token), + status=422 + ).json + + def test_upate_issue_not_author_fail(self): + issue = ProjectIssue.add( + 'old title', + 'old desc', + self.username, + project=self.project.id + ) + title = "new title" + description = 'new desc' + ret = self.app.patch_json( + "/api/%s/issues/%s/" % (self.project.name, issue.number), + dict( + title=title, + description=description + ), + headers=dict(Authorization="Bearer %s" % self.api_token2.token), + status=403 + ).json + self.assertProblemType(ret['type'], "not_the_author") + + def test_upate_issue(self): + title = "test title" + description = "test desc" + creator = self.username + issue = ProjectIssue.add( + title, + description, + creator, + project=self.project.id + ) + new_title = "new title" + new_description = 'new desc' + ret = self.app.patch_json( + "/api/%s/issues/%s/" % (self.project.name, issue.number), + dict( + title=new_title, + description=new_description, + state="closed" + ), + headers=dict(Authorization="Bearer %s" % self.api_token.token), + ).json + self.assertEquals(ret["title"], new_title) + self.assertEquals(ret["description"], new_description) + self.assertEquals(ret["state"], "closed") diff --git a/tests/webtests/api/test_project_issue_comments.py b/tests/webtests/api/test_project_issue_comments.py new file mode 100644 index 0000000..8128513 --- /dev/null +++ b/tests/webtests/api/test_project_issue_comments.py @@ -0,0 +1,171 @@ +# encoding: utf-8 +from base import APITestCase + +from vilya.models.project import CodeDoubanProject +from vilya.models.project_issue import ProjectIssue +from vilya.models.issue_comment import IssueComment +from tests.utils import delete_project + + +class ProjectIssueCommentsTest(APITestCase): + def setUp(self): + super(ProjectIssueCommentsTest, self).setUp() + project_name = "code" + product_name = "fire" + summary = "test" + owner_id = "lisong_intern" + delete_project(project_name) + project = CodeDoubanProject.add( + project_name, + owner_id=owner_id, + summary=summary, + product=product_name + ) + self.project = project + title = "test title" + description = "test desc" + creator = "test" + issue = ProjectIssue.add( + title, + description, + creator, + project=self.project.id + ) + self.issue = issue + self.project = project + self.comment1 = IssueComment.add( + self.issue.issue_id, 'content1', 'test1') + self.comment2 = IssueComment.add( + self.issue.issue_id, 'content2', 'test2') + self.api_token = self.create_api_token('test1') + self.api_token2 = self.create_api_token('test2') + + def test_get_issue_comments(self): + ret = self.app.get( + "/api/%s/issues/%s/comments/" % ( + self.project.name, self.issue.number), + status=200 + ).json + self.assertTrue(isinstance(ret, list)) + self.assertEquals(len(ret), 2) + + def test_create_issue_comment(self): + api_token = self.create_api_token('test_user') + comment_content = "sent from iCode" + ret = self.app.post_json( + "/api/%s/issues/%s/comments/" % ( + self.project.name, self.issue.number), + dict(content=comment_content), + headers=dict(Authorization="Bearer %s" % api_token.token) + ).json + self.assertEquals(ret['content'], comment_content) + + def test_get_a_single_issue_comment(self): + ret = self.app.get( + "/api/%s/issues/%s/comments/%s/" % ( + self.project.name, + self.issue.number, + self.comment1.number + ) + ).json + self.assertEquals(ret['content'], self.comment1.content) + + def test_delete_a_single_issue_comment(self): + # not login + ret = self.app.delete( + "/api/%s/issues/%s/comments/%s/" % ( + self.project.name, + self.issue.number, + self.comment1.number + ), + status=401 + ).json + self.assertProblemType(ret['type'], "unauthorized") + + # not the author + ret = self.app.delete( + "/api/%s/issues/%s/comments/%s/" % ( + self.project.name, + self.issue.number, + self.comment1.number + ), + status=403, + headers=dict(Authorization="Bearer %s" % self.api_token2.token) + ).json + self.assertProblemType(ret['type'], "not_the_author") + + # delete right + ret = self.app.delete( + "/api/%s/issues/%s/comments/%s/" % ( + self.project.name, + self.issue.number, + self.comment1.number + ), + status=204, + headers=dict(Authorization="Bearer %s" % self.api_token.token) + ) + + # alright deleted + ret = self.app.get( + "/api/%s/issues/%s/comments/%s/" % ( + self.project.name, + self.issue.number, + self.comment1.number, + ), + status=404 + ) + + def test_update_a_single_issue_comment(self): + new_comment_content = "sent from iCode" + + # not login, will fail + ret = self.app.patch_json( + "/api/%s/issues/%s/comments/%s/" % ( + self.project.name, + self.issue.number, + self.comment1.number + ), + dict(content=new_comment_content), + status=401 + ).json + self.assertProblemType(ret['type'], "unauthorized") + + # not the author + ret = self.app.patch_json( + "/api/%s/issues/%s/comments/%s/" % ( + self.project.name, + self.issue.number, + self.comment1.number + ), + dict(content=new_comment_content), + status=403, + headers=dict(Authorization="Bearer %s" % self.api_token2.token) + ).json + self.assertProblemType(ret['type'], "not_the_author") + + # send invalid json + ret = self.app.request( + "/api/%s/issues/%s/comments/%s/" % ( + self.project.name, + self.issue.number, + self.comment1.number + ), + method="PATCH", + body="not a valid json", + status=400, + headers=dict(Authorization="Bearer %s" % self.api_token.token) + ).json + self.assertProblemType(ret['type'], "not_json") + + # only the author can edit comment + ret = self.app.patch_json( + "/api/%s/issues/%s/comments/%s/" % ( + self.project.name, + self.issue.number, + self.comment1.number + ), + dict(content=new_comment_content), + status=200, + headers=dict(Authorization="Bearer %s" % self.api_token.token) + ).json + self.assertEquals(ret['content'], new_comment_content) diff --git a/tests/webtests/api/test_projects.py b/tests/webtests/api/test_projects.py new file mode 100644 index 0000000..a33102d --- /dev/null +++ b/tests/webtests/api/test_projects.py @@ -0,0 +1,83 @@ +# coding: utf-8 +import ast + +from base import APITestCase +from vilya.models.project import CodeDoubanProject +from tests.utils import delete_project + +COMMITS = """ # noqa +[ +{"files": [{"type": "deleted", "filepath": "old.txt"}, {"type": "deleted", "filepath": "subdir/old.txt"}, {"type": "deleted", "filepath": "subdir/subdir2/old.txt"}], "name": "XTao", "id": "9119237c2d5aa2c4a110296e255c7ec194711066", "date": "2013-08-28T18:14:29+0800", "message": "Remove old.txt", "email": "xutao@douban.com"}, +{"files": [{"type": "added", "filepath": "subdir/README.md"}, {"type": "added", "filepath": "subdir/new.txt"}, {"type": "added", "filepath": "subdir/old.txt"}], "name": "XTao", "id": "066e9e87baf6c6839827b3fe48e4ca697c28be3f", "date": "2013-08-28T18:13:56+0800", "message": "Add subdir", "email": "xutao@douban.com"}, +{"files": [{"type": "added", "filepath": "subdir/subdir2/README.md"}, {"type": "added", "filepath": "subdir/subdir2/new.txt"}, {"type": "added", "filepath": "subdir/subdir2/old.txt"}], "name": "XTao", "id": "3542065401137fc6769a34601015abc863d2d7a9", "date": "2013-08-28T18:13:37+0800", "message": "Add subdir2", "email": "xutao@douban.com"}, +{"files": [{"type": "modified", "filepath": "new.txt"}, {"type": "modified", "filepath": "old.txt"}], "name": "XTao", "id": "4bc90207e76d68d5cda435e67c5f85a0ce710f44", "date": "2013-08-28T18:10:08+0800", "message": "Add content", "email": "xutao@douban.com"}, +{"files": [{"type": "added", "filepath": "old.txt"}], "name": "XTao", "id": "d05aa234b9323dbcd3d0067da45f98e73203dc15", "date": "2013-08-28T18:09:25+0800", "message": "Add old.txt", "email": "xutao@douban.com"} +] +""" + + +class ProjectsTest(APITestCase): + + def test_project(self): + project_name = "code" + product_name = "fire" + summary = "test" + owner_id = "lisong_intern" + delete_project(project_name) + CodeDoubanProject.add( + project_name, owner_id=owner_id, summary=summary, + product=product_name) + + ret = self.app.get("/api/%s/" % project_name, status=200).json + self.assertEqual(ret['name'], project_name) + self.assertEqual(ret['product'], product_name) + self.assertEqual(ret['description'], summary) + self.assertEqual(ret['owner']['name'], owner_id) + self.assertEqual(ret['committers_count'], 0) + self.assertEqual(ret['watched_count'], 0) + self.assertEqual(ret['forked_count'], 0) + self.assertEqual(ret['open_issues_count'], 0) + self.assertEqual(ret['open_tickets_count'], 0) + + def test_personal_project(self): + project_name = "lisong_intern/code" + summary = "test" + owner_id = "lisong_intern" + delete_project(project_name) + CodeDoubanProject.add( + project_name, owner_id=owner_id, summary=summary) + + ret = self.app.get("/api/%s/" % project_name, status=200).json + self.assertEqual(ret['name'], project_name) + self.assertEqual(ret['owner']['name'], owner_id) + self.assertEqual(ret['description'], summary) + self.assertEqual(ret['committers_count'], 0) + self.assertEqual(ret['watched_count'], 0) + self.assertEqual(ret['forked_count'], 0) + self.assertEqual(ret['open_issues_count'], 0) + self.assertEqual(ret['open_tickets_count'], 0) + + def test_commits(self): + """ + Test http://code.dapps.douban.com/api/%s/commits + """ + project = self.get_temp_project() + ret = self.app.get("/api/%s/commits" % project.name, status=200).json + commits = ast.literal_eval(COMMITS) + for a, b in zip(ret, commits): + self.assertEqual(a['files'], b['files']) + self.assertEqual(a['message'], b['message']) + self.assertEqual(a['name'], b['name']) + self.assertEqual(a['id'], b['id']) + self.assertEqual(a['date'], b['date']) + self.assertEqual(a['email'], b['email']) + + def test_fork(self): + # FIXME: clean fork project + project = self.get_temp_project() + api_token = self.create_api_token('test_user') + ret = self.app.post_json( + "/api/repos/%s/forks/" % project.name, + {}, headers=dict(Authorization="Bearer %s" % api_token.token) + ).json + self.assertEqual(ret['owner']['name'], 'test_user') diff --git a/tests/webtests/api/test_pull.py b/tests/webtests/api/test_pull.py new file mode 100644 index 0000000..8666522 --- /dev/null +++ b/tests/webtests/api/test_pull.py @@ -0,0 +1,36 @@ +# encoding: utf-8 +from base import APITestCase + + +TITLE = "pull_title" +BODY = "pull_body" + + +class PullTest(APITestCase): + + def test_commits(self): + """ + Test http://code.dapps.douban.com/api/%s/pulls/%s/commits + """ + # TODO: implements this function + pass + + def ttest_create_pull(self): # FIXME + project = self.get_temp_project() + fork_project = self.get_temp_project(project) + api_token = self.create_api_token(project.owner_id) + ret = self.app.post_json( + "/api/repos/%s/pulls/" % project.name, + dict(title=TITLE, + body=BODY, + base_ref="master", + head="chinese", + head_repo=fork_project.name), + headers=dict(Authorization="Bearer %s" % api_token.token) + ).json + self.assertEqual(ret['base']['ref'], 'master') + self.assertEqual(ret['base']['repo']['name'], project.name) + self.assertEqual(ret['head']['ref'], 'chinese') + self.assertEqual(ret['head']['repo']['name'], fork_project.name) + self.assertEqual(ret['title'], TITLE) + self.assertEqual(ret['description'], BODY) diff --git a/tests/webtests/api/test_timeline.py b/tests/webtests/api/test_timeline.py new file mode 100644 index 0000000..baeef11 --- /dev/null +++ b/tests/webtests/api/test_timeline.py @@ -0,0 +1,8 @@ +# encoding: utf-8 +from base import APITestCase + + +class TimelineTest(APITestCase): + def test_timeline(self): + ret = self.app.get("/api/timeline", status=200).json + self.assertTrue(isinstance(ret, list)) \ No newline at end of file diff --git a/tests/webtests/api/test_user.py b/tests/webtests/api/test_user.py new file mode 100644 index 0000000..b7808cb --- /dev/null +++ b/tests/webtests/api/test_user.py @@ -0,0 +1,59 @@ +# encoding: utf-8 +from base import APITestCase +from vilya.models.project import CodeDoubanProject +from tests.utils import delete_project + + +class UserTest(APITestCase): + def test_user(self): + user_name = 'zhangchi' + ret = self.app.get("/api/users/%s" % user_name, status=200).json + self.assertEqual(ret['is_intern'], False) + self.assertTrue('url' in ret) + self.assertTrue('avatar_url' in ret) + self.assertTrue(isinstance(ret['badges'], list)) + + def test_intern(self): + user_name = 'lisong_intern' + ret = self.app.get("/api/users/%s" % user_name, status=200).json + self.assertEqual(ret['name'], user_name) + self.assertTrue('url' in ret) + self.assertTrue('avatar_url' in ret) + self.assertEqual(ret['is_intern'], True) + self.assertTrue(isinstance(ret['badges'], list)) + + def test_get_current_auth_user(self): + user_name = 'xingben' + api_token = self.create_api_token('xingben') + ret = self.app.get( + "/api/user/", + headers=dict(Authorization="Bearer %s" % api_token.token), + status=200 + ).json + self.assertEqual(ret['name'], user_name) + self.assertTrue('url' in ret) + self.assertTrue('avatar_url' in ret) + self.assertTrue(isinstance(ret['badges'], list)) + + def test_get_my_projects(self): + project_name = "code" + product_name = "fire" + summary = "test" + owner_id = "xingben" + for i in range(5): + delete_project("%s%d" % (project_name, i)) + CodeDoubanProject.add( + "%s%d" % (project_name, i), + owner_id=owner_id, + summary=summary, + product=product_name + ) + api_token = self.create_api_token('xingben') + ret = self.app.get( + "/api/user/repos", + headers=dict(Authorization="Bearer %s" % api_token.token), + status=200 + ).json + self.assertEquals(len(ret), 5) + self.assertTrue('name' in ret[0]) + self.assertTrue('description' in ret[0]) diff --git a/tests/webtests/test_hub_teams.py b/tests/webtests/test_hub_teams.py new file mode 100644 index 0000000..5ebb29e --- /dev/null +++ b/tests/webtests/test_hub_teams.py @@ -0,0 +1,12 @@ +# encoding: utf-8 +from tests.base import TestCase +from webtest import TestApp + +import app as M + + +class TeamsWebTest(TestCase): + def test_hub_teams(self): + app = TestApp(M.app) + resp = app.get('/hub/teams') + assert resp.status_int == 200 diff --git a/tests/webtests/test_issue_votes_and_comments_count_display.py b/tests/webtests/test_issue_votes_and_comments_count_display.py new file mode 100644 index 0000000..4164a60 --- /dev/null +++ b/tests/webtests/test_issue_votes_and_comments_count_display.py @@ -0,0 +1,89 @@ +# encoding: utf-8 +from tests.base import TestCase +from webtest import TestApp + +from vilya.models.project import CodeDoubanProject +from vilya.models.project_issue import ProjectIssue +from tests.utils import delete_project +import app as M + + +class IssuesVotesAndCommentsCountDisplayTest(TestCase): + def test_zero_vote_and_zero_comment_display(self): + app = TestApp(M.app) + project_name = "project" + delete_project(project_name) + project = CodeDoubanProject.add( + project_name, owner_id="test1", summary="test", product="fire") + ProjectIssue.add('test', 'test description', 'test', + project=project.id) + resp = app.get(project.url + "/issues/") + + assert resp.status_int == 200 + assert 'Issues' in resp.body + assert '0 vote' not in resp.body + assert '0 comment' not in resp.body + + def test_one_vote_display(self): + app = TestApp(M.app) + project_name = "project1" + delete_project(project_name) + project = CodeDoubanProject.add( + project_name, owner_id="test1", summary="test", product="fire") + issue = ProjectIssue.add('test', 'test description', 'test', + project=project.id) + issue.upvote_by_user('test1') + + resp = app.get(project.url + "/issues/") + assert resp.status_int == 200 + assert "Issues" in resp.body + assert "1 vote" in resp.body + assert "1 votes" not in resp.body + + def test_one_comment_display(self): + app = TestApp(M.app) + project_name = "project2" + delete_project(project_name) + project = CodeDoubanProject.add( + project_name, owner_id="test1", summary="test", product="fire") + issue = ProjectIssue.add('test', 'test description', 'test', + project=project.id) + issue.add_comment('this is a comment', 'test') + resp = app.get(project.url + "/issues/") + + assert resp.status_int == 200 + assert "Issues" in resp.body + assert "1 comment" in resp.body + assert "1 comments" not in resp.body + + def test_two_votes_display(self): + app = TestApp(M.app) + project_name = "project3" + delete_project(project_name) + project = CodeDoubanProject.add( + project_name, owner_id="test1", summary="test", product="fire") + issue = ProjectIssue.add('test', 'test description', 'test', + project=project.id) + issue.upvote_by_user('test1') + issue.upvote_by_user('test2') + resp = app.get(project.url + "/issues/") + + assert resp.status_int == 200 + assert "Issues" in resp.body + assert "2 votes" in resp.body + + def test_two_comments_display(self): + app = TestApp(M.app) + project_name = "project4" + delete_project(project_name) + project = CodeDoubanProject.add( + project_name, owner_id="test1", summary="test", product="fire") + issue = ProjectIssue.add('test', 'test description', 'test', + project=project.id) + issue.add_comment('this is a comment', 'test') + issue.add_comment('this is also a comment', 'test') + resp = app.get(project.url + "/issues/") + + assert resp.status_int == 200 + assert "Issues" in resp.body + assert "2 comments" in resp.body diff --git a/tests/webtests/test_participant_count.py b/tests/webtests/test_participant_count.py new file mode 100644 index 0000000..2f440a9 --- /dev/null +++ b/tests/webtests/test_participant_count.py @@ -0,0 +1,41 @@ +# encoding: utf-8 +from tests.base import TestCase +from webtest import TestApp + +from vilya.models.project import CodeDoubanProject +from vilya.models.team import Team +from vilya.models.project_issue import ProjectIssue +from vilya.models.team_issue import TeamIssue +from tests.utils import delete_project +import app as M + + +class ParticipantCountTest(TestCase): + def test_new_project_issue_participant_count(self): + app = TestApp(M.app) + project_name = "project" + delete_project(project_name) + project = CodeDoubanProject.add( + project_name, owner_id="test1", summary="test", product="fire") + issue = ProjectIssue.add( + 'test', 'test description', 'test', project=project.id) + resp = app.get(issue.url) + + assert resp.status_int == 200 + assert 'Issues' in resp.body + assert '<strong>1</strong> participant' in resp.text + assert '<strong>1</strong> participants' not in resp.text + + def test_new_team_issue_participant_count(self): + app = TestApp(M.app) + for team in Team.gets(): + if team: + team.delete() + team = Team.add("test_team", "test team", "test") + issue = TeamIssue.add('test', 'test description', 'test', team=team.id) + resp = app.get(issue.url) + + assert resp.status_int == 200 + assert 'Issues' in resp.body + assert '<strong>1</strong> participant' in resp.text + assert '<strong>1</strong> participants' not in resp.text diff --git a/tests/webtests/test_valid_user_id.py b/tests/webtests/test_valid_user_id.py new file mode 100644 index 0000000..5db2aa8 --- /dev/null +++ b/tests/webtests/test_valid_user_id.py @@ -0,0 +1,36 @@ +# encoding: utf-8 +from tests.base import TestCase +from webtest import TestApp + +import app as M + + +class ValidUserIdTest(TestCase): + def test_valid_user_id(self): + app = TestApp(M.app) + user_id1 = "zhangchi" + user_id2 = "xingben" + user_id3 = "huanghuang" + user_id4 = "zhangchen_intern" + resp1 = app.get("/people/%s/" % user_id1) + resp2 = app.get("/people/%s/" % user_id2) + resp3 = app.get("/people/%s/" % user_id3) + resp4 = app.get("/people/%s/" % user_id4) + + assert resp1.status_int == 200 + assert 'zhangchi' in resp1.body + assert resp2.status_int == 200 + assert 'xingben' in resp2.body + assert resp3.status_int == 200 + assert 'huanghuang' in resp3.body + assert resp4.status_int == 200 + assert 'zhangchen_intern' in resp4.body + + def test_invalid_user_id(self): + app = TestApp(M.app) + user_id1 = "thisisaverylonnnnnnnnnnnnnnnnnngusername" + user_id2 = "a very bad user id" + user_id3 = "小松" + resp1 = app.get("/people/%s/" % user_id1, status=404) + resp2 = app.get("/people/%s/" % user_id2, status=404) + resp3 = app.get("/people/%s/" % user_id3, status=404) diff --git a/tools/__init__.py b/tools/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tools/clear_collector.py b/tools/clear_collector.py new file mode 100755 index 0000000..f44e0ba --- /dev/null +++ b/tools/clear_collector.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import sys +from vilya.models.project import CodeDoubanProject +from vilya.models.stats.collector import DataCollector + + +def clear(project): + data = DataCollector() + data.saveCache(project, '/stats/' + project) + + +def clean_all(): + ids = CodeDoubanProject.get_ids() + for id in ids: + project = CodeDoubanProject.get(id) + clear(project.name) + + +def reset_all(): + ids = CodeDoubanProject.get_ids() + for id in ids: + project = CodeDoubanProject.get(id) + project.git.get_gitstats_data() + + +if __name__ == "__main__": + argv = sys.argv + if len(argv) == 2: + project = argv[-1] + if CodeDoubanProject.get_by_name(project): + clear(project) + else: + print "Invalid project name." diff --git a/tools/init_codedouban_watches.py b/tools/init_codedouban_watches.py new file mode 100644 index 0000000..cd3e468 --- /dev/null +++ b/tools/init_codedouban_watches.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +import sys +import MySQLdb +from vilya.libs.store import store +from traceback import print_exc + + +def main(): + try: + rs = store.execute("select project_id,owner_id from codedouban_projects") + for r in rs: + try: + store.execute("insert into codedouban_watches (project_id, user_id) " + "values (%s, %s)", + (r[0], r[1])) + except MySQLdb.IntegrityError, e: + print_exc() + store.commit() + except Exception, e: + print_exc() + sys.exit(1) + +if __name__ == "__main__": + main() diff --git a/tools/init_index.py b/tools/init_index.py new file mode 100755 index 0000000..6044620 --- /dev/null +++ b/tools/init_index.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- + +from vilya.libs.store import store + +from vilya.models.project import CodeDoubanProject +from vilya.models.elastic.issue_pr_search import IssuePRSearch + + +def get_projects(): + rs = store.execute('select project_id from codedouban_projects') + ids = (proj_id for proj_id, in rs) + return CodeDoubanProject.gets(ids) + + +def main(): + projects = get_projects() + for proj in projects: + IssuePRSearch.index_a_project(proj) + +if __name__ == "main": + main() diff --git a/tools/init_rank_score.py b/tools/init_rank_score.py new file mode 100644 index 0000000..f9ad76f --- /dev/null +++ b/tools/init_rank_score.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- + +from vilya.models.project_issue import ProjectIssue +from vilya.models.team_issue import TeamIssue +from vilya.libs.store import store + + +def main(): + rs = store.execute("select id, project_id, issue_id, number from project_issues") + if rs: + for r in rs: + pi = ProjectIssue(*r) + pi.update_rank_score() + rs = store.execute("select id, team_id, issue_id, number from team_issues") + if rs: + for r in rs: + ti = TeamIssue(*r) + ti.update_rank_score() + +if __name__ == '__main__': + main() diff --git a/tools/migrate_linecomments.py b/tools/migrate_linecomments.py new file mode 100644 index 0000000..e7f90a5 --- /dev/null +++ b/tools/migrate_linecomments.py @@ -0,0 +1,114 @@ +# -*- coding: utf-8 -*- + +from vilya.libs.store import store + +from vilya.models.ticket import TicketCodereview, TicketNode +from vilya.models.line_comment import LineComment +from vilya.models.linecomment import CommitLineComment, PullLineComment +from vilya.models.consts import ( + LINECOMMENT_INDEX_EMPTY, LINECOMMENT_INDEX_INVALID, + LINECOMMENT_TYPE_COMMIT, LINECOMMENT_TYPE_PULL, + TICKET_NODE_TYPE_LINECOMMENT) + +# plz backup table ticket_nodes first. +# >> create table ticket_nodes_bak as (select * from ticket_nodes); + +EMPTY_TO_SHA = '' +EMPTY_OIDS = '' + + +def clear_all_linecomment_nodes(): + ''' 清空新的 ticket_nodes 数据 ''' + print '## run clear_all_linecomment_nodes' + store.execute("delete from ticket_nodes " + "where type=%s", TICKET_NODE_TYPE_LINECOMMENT) + store.commit() + + +def clear_all_linecomments(): + ''' 清空新表 ''' + print '## run clear_all_linecomments' + store.execute("delete from codedouban_linecomments_v2 where 1=1") + store.commit() + + +def clear(): + ''' 清空新数据 ''' + clear_all_linecomment_nodes() + clear_all_linecomments() + + +def migrate_pull_linecomments(): + print '## run migrate_pull_linecomments' + rs = store.execute("select id " + "from codedouban_ticket_codereview") + for r in rs: + id, = r + c = TicketCodereview.get(id) + print '>>>', c.id, c.ticket_id, c.from_ref, c.content + PATH = c.path if c.path else '' + new_c = PullLineComment.add_raw(c.ticket_id, + c.from_ref, + EMPTY_TO_SHA, + PATH, + c.new_path if c.new_path else PATH, + EMPTY_OIDS, + EMPTY_OIDS, + c.old, + c.new, + c.author, + c.content, + c.position, + c.time, + c.time) + tn = TicketNode.add_codereview(new_c) + print '>>> INSERT TicketNode', tn.id, tn.type_id, tn.author, tn.ticket_id + print "migrate_pull_linecomments: %s records" % len(rs) + + +def migrate_commit_linecomments(): + print '## run migrate_commit_linecomments' + rs = store.execute("select comment_id " + "from codedouban_linecomments") + for r in rs: + id, = r + c = LineComment.get(id) + print '>>>', c.comment_id, c.project_id, c.ref, c.content + PATH = c.path if c.path else '' + CommitLineComment.add_raw(c.project_id, + c.ref, + EMPTY_TO_SHA, + PATH, + PATH, + EMPTY_OIDS, + EMPTY_OIDS, + LINECOMMENT_INDEX_INVALID, # commit linecomment老数据并没有记录linenum + LINECOMMENT_INDEX_INVALID, + c.author, + c.content, + c.position, + c.created, + c.created) + print "migrate_commit_linecomments: %s records" % len(rs) + + +def main(): + #clear() + print '========================================' + rs = store.execute("select id " + "from codedouban_linecomments_v2") + cnt_before = len(rs) + + print 'migrate start...' + migrate_pull_linecomments() + migrate_commit_linecomments() + print 'migrate end...' + + rs = store.execute("select id " + "from codedouban_linecomments_v2") + cnt_after = len(rs) + print 'inserted %s records into codedouban_linecomments_v2' % (cnt_after - cnt_before) + print '========================================' + +if __name__ == '__main__': + main() diff --git a/tools/run_pylint.sh b/tools/run_pylint.sh new file mode 100755 index 0000000..97b81a0 --- /dev/null +++ b/tools/run_pylint.sh @@ -0,0 +1,3 @@ +#!/bin/bash -ex + +dae venv python -- -m pylint.lint $* diff --git a/tools/ssh_app.py b/tools/ssh_app.py new file mode 100644 index 0000000..04ffe9b --- /dev/null +++ b/tools/ssh_app.py @@ -0,0 +1,88 @@ +# -*- coding: utf-8 -*- + +try: + #from gevent.monkey import patch_all + #patch_all(subprocess=False, aggressive=False) + from gevent.monkey import get_original + from gevent.server import StreamServer + import select + select.poll = get_original('select', 'poll') + import subprocess + subprocess.Popen = get_original('subprocess', 'Popen') +except ImportError: + print 'You need install gevent manually! System shutdown.' + +from binascii import hexlify +from maria import Maria +from maria.config import config +from vilya.libs.permdir import get_repo_root +from vilya.models.sshkey import SSHKey +from vilya.models.project import CodeDoubanProject as Project +from vilya.models.gist import Gist + +config.project_root = get_repo_root() +config.log_file = None +config.host_key_path = './host.key' + +app = Maria(config=config) + + +@app.get_environ +def get_environ_handler(user, path): + return {'CODE_REMOTE_USER': user} + + +@app.has_permission +def has_permission_handler(username, path, perm): + if not username or not path: + return False + + if path.endswith('.git'): + path = path[:-4] + + # gist + if path.startswith('gist/'): + gist_id = path.rpartition("/")[-1] + if username == Gist.get(gist_id).owner_id: + return True + return False + + # project + project = Project.get_by_name(path) + if not project: + return False + if perm == 'read': + return True + if not project.can_push: + return False + if project.has_push_perm(username): + return True + return False + + +@app.get_user +def get_user_handler(username, key): + # ssh username + if username != 'git': + return None + + # ssh key + if not key: + return None + fingerprint = hexlify(key.get_fingerprint()) + fingerprint = ":".join([fingerprint[i:2+i] for i in range(0, len(fingerprint), 2)]) + sshkey = SSHKey.get_by_fingerprint(fingerprint) + if not sshkey: + return 'guest' + return sshkey.user_id + + +if __name__ == '__main__': + import argparse + parser = argparse.ArgumentParser(description='code ssh daemon.') + parser.add_argument('--host', default='0.0.0.0', type=str) + parser.add_argument('--port', default=2200, type=int) + args = parser.parse_args() + + server = StreamServer((args.host, args.port), app) + server.serve_forever() diff --git a/tools/update_feed.py b/tools/update_feed.py new file mode 100644 index 0000000..c20542b --- /dev/null +++ b/tools/update_feed.py @@ -0,0 +1,110 @@ +# -*- coding: utf-8 -*- + +import json +from datetime import datetime +from vilya.libs.rdstore import rds +from vilya.models.utils import ( + CJsonEncoder, +) +from vilya.models.feed import ( + get_user_feed as get_user_feed_v2, + get_user_inbox as get_user_inbox_v2, + get_public_feed as get_public_feed_v2, + get_team_feed as get_team_feed_v2, +) +from vilya.models.team import Team + + +# update feed data from v1 to v2 +MAX_ACTIONS_COUNT = 1009 # Happy Number +RDS_USER_INBOX_KEY = 'feed:private:user:v1:%s' +RDS_USER_FEED_KEY = 'feed:public:user:v1:%s' +RDS_PUBLIC_FEED_KEY = 'feed:public:everyone:v1' +RDS_TEAM_FEED_KEY = 'feed:public:team:v1:%s' + + +class Feed(object): + def __init__(self, db_key): + self.db_key = db_key + + def __repr__(self): + return '%s (%s)' % (self.__class__, self.db_key) + + @classmethod + def get(cls, db_key): + return cls(db_key=db_key) + + def add_action(self, action_data): + data = json.dumps(action_data, cls=CJsonEncoder) + rds.lpush(self.db_key, data) + rds.ltrim(self.db_key, 0, MAX_ACTIONS_COUNT) + + def get_actions(self): + data = rds.lrange(self.db_key, 0, MAX_ACTIONS_COUNT) + return [json.loads(d) for d in data] + + +def get_user_inbox(user): + return Feed.get(db_key=RDS_USER_INBOX_KEY % user) + + +def get_user_feed(user): + return Feed.get(db_key=RDS_USER_FEED_KEY % user) + + +def get_public_feed(): + return Feed.get(db_key=RDS_PUBLIC_FEED_KEY) + + +def get_team_feed(team): + return Feed.get(db_key=RDS_TEAM_FEED_KEY % team) + + +def main(): + public_feed = get_public_feed() + public_feed_v2 = get_public_feed_v2() + feeds = public_feed.get_actions() + for feed in feeds: + date = datetime.strptime(feed['date'], "%Y-%m-%d %H:%M:%S") + feed['date'] = date + public_feed_v2.add_action(feed) + print "updated %s public feeds." % len(feeds) + + teams = Team.gets() + for team in teams: + team_feed = get_team_feed(team.id) + team_feed_v2 = get_team_feed_v2(team.id) + feeds = team_feed.get_actions() + for feed in feeds: + date = datetime.strptime(feed['date'], "%Y-%m-%d %H:%M:%S") + feed['date'] = date + team_feed_v2.add_action(feed) + print "updated %s team %s feeds." % (len(feeds), team.name) + + user_inbox_keys = rds.keys('feed:private:user:v1:*') + for key in user_inbox_keys: + _, _, _, _, user = key.split(':') + user_feed = get_user_inbox(user) + user_feed_v2 = get_user_inbox_v2(user) + feeds = user_feed.get_actions() + for feed in feeds: + date = datetime.strptime(feed['date'], "%Y-%m-%d %H:%M:%S") + feed['date'] = date + user_feed_v2.add_action(feed) + print "updated %s user %s inbox feeds." % (len(feeds), user) + + user_feed_keys = rds.keys('feed:public:user:v1:*') + for key in user_feed_keys: + _, _, _, _, user = key.split(':') + user_feed = get_user_feed(user) + user_feed_v2 = get_user_feed_v2(user) + feeds = user_feed.get_actions() + for feed in feeds: + date = datetime.strptime(feed['date'], "%Y-%m-%d %H:%M:%S") + feed['date'] = date + user_feed_v2.add_action(feed) + print "updated %s user %s feeds." % (len(feeds), user) + + +if __name__ == "__main__": + main() diff --git a/tools/update_issue.py b/tools/update_issue.py new file mode 100644 index 0000000..bf44db6 --- /dev/null +++ b/tools/update_issue.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- + + +from vilya.libs.store import store + + +def main(): + rs = store.execute("select id, type " + "from issues " + "where type='project'") + for r in rs: + id, _ = r + rs1 = store.execute("select id, project_id, issue_id " + "from project_issues " + "where issue_id=%s", + id) + if rs1 and rs1[0]: + _, target_id, _ = rs1[0] + store.execute("update issues " + "set target_id=%s " + "where id=%s", + (target_id, id)) + store.commit() + + rs = store.execute("select id, type " + "from issues " + "where type='team'") + for r in rs: + id, _ = r + rs1 = store.execute("select id, team_id, issue_id " + "from team_issues " + "where issue_id=%s", + id) + if rs1 and rs1[0]: + _, target_id, _ = rs1[0] + store.execute("update issues " + "set target_id=%s " + "where id=%s", + (target_id, id)) + store.commit() + + +if __name__ == "__main__": + main() diff --git a/tools/update_mirrors.py b/tools/update_mirrors.py new file mode 100644 index 0000000..49d2056 --- /dev/null +++ b/tools/update_mirrors.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- + +import sys +from traceback import print_exc +from vilya.models.consts import MIRROR_STATE_CLONED +from vilya.models.mirror import CodeDoubanMirror +from vilya.models.project import CodeDoubanProject + + +def main(): + try: + mirror_projects = CodeDoubanProject.get_projects(owner='mirror', sortby='created') + for project in mirror_projects: + mirror = CodeDoubanMirror.get_by_project_id(project.id) + if not mirror: + print "New: ", project.id, project.name, project.url + mirror_url = project.git.call('ls-remote --get-url origin') + CodeDoubanMirror.add(mirror_url, MIRROR_STATE_CLONED, project.id) + else: + print "Added: ", project.id, project.name, project.url + except Exception, e: + print_exc() + sys.exit(1) + +if __name__ == "__main__": + main() diff --git a/tools/update_remotes.py b/tools/update_remotes.py new file mode 100644 index 0000000..b43d403 --- /dev/null +++ b/tools/update_remotes.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import re +from vilya.libs.store import store +from vilya.models.project import CodeDoubanProject + +regex = re.compile(r"^/var/dae/apps/code/permdir/", re.IGNORECASE) + + +def get_projects(): + rs = store.execute('select project_id from codedouban_projects') + for proj_id, in rs: + yield CodeDoubanProject.get(proj_id) + + +for project in get_projects(): + remotes = project.repo.remotes + for remote in remotes: + url = remote.url + if url.startswith('/var/dae/apps/code/permdir/'): + new_url = regex.sub("/data/permdir/", url) + remote.url = new_url + remote.save() + print project.name, remote.name, url + print project.name, remote.name, new_url diff --git a/tools/update_ticket.py b/tools/update_ticket.py new file mode 100644 index 0000000..19894bd --- /dev/null +++ b/tools/update_ticket.py @@ -0,0 +1,120 @@ +# -*- coding: utf-8 -*- + +from vilya.libs.store import store +from vilya.models.consts import ( + TICKET_NODE_TYPE_OPEN, TICKET_NODE_TYPE_CLOSE, + TICKET_NODE_TYPE_MERGE, TICKET_NODE_TYPE_COMMIT, + TICKET_NODE_TYPE_COMMENT, TICKET_NODE_TYPE_CODEREVIEW) +from vilya.models.ticket import Ticket +from vilya.models.pull import PullRequest + + +def get_node(author, type, id, ticket_id, time): + rs = store.execute("select id, author, type, type_id, ticket_id, created_at " + "from ticket_nodes " + "where author=%s and type=%s and type_id=%s and ticket_id=%s and created_at=%s", + (author, type, id, ticket_id, time)) + if rs and rs[0]: + return True + + +def update_commits(from_id=None): + # update commit + if from_id: + rs = store.execute("select id, author, time, ticket_id " + "from codedouban_ticket_commits where id > %s", + from_id) + else: + rs = store.execute("select id, author, time, ticket_id " + "from codedouban_ticket_commits") + for r in rs: + id, author, time, ticket_id = r + if not get_node(author, TICKET_NODE_TYPE_COMMIT, id, ticket_id, time): + print id, author, time, ticket_id + store.execute("insert into ticket_nodes " + "(author, type, type_id, ticket_id, created_at) " + "value (%s, %s, %s, %s, %s)", + (author, TICKET_NODE_TYPE_COMMIT, id, ticket_id, time)) + store.commit() + print "update %s commits" % len(rs) + + +def update_comments(from_id=None): + # update comment + if from_id: + rs = store.execute("select id, author, time, ticket_id " + "from codedouban_ticket_comment where id > %s", + from_id) + else: + rs = store.execute("select id, author, time, ticket_id " + "from codedouban_ticket_comment") + for r in rs: + id, author, time, ticket_id = r + print id, author, time, ticket_id + if not get_node(author, TICKET_NODE_TYPE_COMMENT, id, ticket_id, time): + print id, author, time, ticket_id + store.execute("insert into ticket_nodes " + "(author, type, type_id, ticket_id, created_at) " + "value (%s, %s, %s, %s, %s)", + (author, TICKET_NODE_TYPE_COMMENT, id, ticket_id, time)) + store.commit() + print "update %s comments" % len(rs) + + +def update_codereviews(from_id=None): + # update codereview + if from_id: + rs = store.execute("select id, author, time, ticket_id " + "from codedouban_ticket_codereview where id > %s", + from_id) + else: + rs = store.execute("select id, author, time, ticket_id " + "from codedouban_ticket_codereview") + for r in rs: + id, author, time, ticket_id = r + if not get_node(author, TICKET_NODE_TYPE_CODEREVIEW, id, ticket_id, time): + print id, author, time, ticket_id + store.execute("insert into ticket_nodes " + "(author, type, type_id, ticket_id, created_at) " + "value (%s, %s, %s, %s, %s)", + (author, TICKET_NODE_TYPE_CODEREVIEW, id, ticket_id, time)) + store.commit() + print "update %s reviews" % len(rs) + + +def main(): + rs = store.execute("select id " + "from codedouban_ticket") + for r in rs: + id, = r + ticket = Ticket.get(id) + # update merge + pullreq = PullRequest.get_by_ticket(ticket) + author = pullreq.merge_by or pullreq.to_proj.owner_id + time = pullreq.merge_time + ticket_id = ticket.id + id = 0 + if not get_node(author, TICKET_NODE_TYPE_MERGE, id, ticket_id, time) and time: + print id, author, time, ticket_id + store.execute("insert into ticket_nodes " + "(author, type, type_id, ticket_id, created_at) " + "value (%s, %s, %s, %s, %s)", + (author, TICKET_NODE_TYPE_MERGE, id, ticket_id, time)) + store.commit() + # update close + author = ticket.close_by or ticket.author + time = ticket.closed + ticket_id = ticket.id + id = 0 + if not get_node(author, TICKET_NODE_TYPE_CLOSE, id, ticket_id, time) and time: + print id, author, time, ticket_id + store.execute("insert into ticket_nodes " + "(author, type, type_id, ticket_id, created_at) " + "value (%s, %s, %s, %s, %s)", + (author, TICKET_NODE_TYPE_CLOSE, id, ticket_id, time)) + store.commit() + print "update %s close & merge pulls" % len(rs) + + +if __name__ == "__main__": + main() diff --git a/vilya/config.py b/vilya/config.py index bdd8a0d..d747078 100644 --- a/vilya/config.py +++ b/vilya/config.py @@ -1,8 +1,11 @@ # coding: utf-8 +import ast import os from os.path import dirname, abspath +from libmc import MC_HASH_MD5 + DEVELOP_MODE = False @@ -16,38 +19,30 @@ # session SESSION_EXPIRE_DAYS = 14 -SESSION_DOMAIN = '' +SESSION_COOKIE_DOMAIN = '' +SESSION_COOKIE_PATH = '/' SESSION_COOKIE_NAME = 'code_user' -MEMCACHED = { - 'servers': ["127.0.0.1:11311", ], - 'new_servers': [], - 'backup_servers': [], - 'disabled': False, - 'local_cache': True, - 'log_every_actions': False, - 'slave_servers': [], +MEMCACHED_HOSTS = os.environ.get('DOUBAN_CODE_MEMCACHED_HOSTS', + '127.0.0.1:11311').split(',') +MEMCACHED_CONFIG = { + 'do_split': True, + 'comp_threshold': 0, + 'noreply': False, + 'prefix': None, + 'hash_fn': MC_HASH_MD5, + 'failover': False } DOUBANDB = { - 'servers': ["127.0.0.1:11311", ], - 'proxies': [] -} - -REDIS = {'host': '127.0.0.1', 'port': 6379} -REDIS_STORE = { - 'shire': { - 'host': '127.0.0.1', 'port': 6379, - 'dbs': {1: 'DEFAULT', 2: 'bloomfilters'}, - }, - 'counter': { - 'host': '127.0.0.1', 'port': 6379, - 'dbs': {63: 'test-counter'}, - }, + 'servers': os.environ.get('DOUBAN_CODE_DOUBANDB_SERVERS', + '127.0.0.1:11311').split(','), + 'proxies': os.environ.get('DOUBAN_CODE_DOUBANDB_PROXIES', + '').split(',') } -MYSQL_STORE = { +_default_mysql_store = { "farms": { "code_farm": { "master": "localhost:3306:valentine:root:", @@ -55,14 +50,35 @@ } } } +MYSQL_STORE = ast.literal_eval( + os.environ.get('DOUBAN_CODE_MYSQL_STORE', '{}') +) or _default_mysql_store + -DOMAIN = "http://127.0.0.1:8000/" +REDIS_URI = os.environ.get('DOUBAN_CODE_REDIS_URI', 'redis://localhost:6379/0') + +DOMAIN = os.environ.get('DOUBAN_CODE_DOMAIN', 'http://127.0.0.1:8200') +IRC_SERVER = 'irc.intra.douban.com' +IRC_PORT = 12345 +SMTP_SERVER = 'mail.douban.com' MAKO_FS_CHECK = True EMAIL_SUFFIX = 'douban.com' +DEFAULT_SENDER_ADDR = 'code@douban.com' +DEFAULT_NOTIFY_SENDER_ADDR = 'code-notification@douban.com' +CUSTOMIZE_NOTIFY_SENDER_ADDR = 'code-notification+%s+code@douban.com' +TRASH_EMAIL_ADDR = 'code-email-trash@dappsmail.douban.com' + +TRELLO_CONSUMER_KEY = '' +TRELLO_CONSUMER_SECRET = '' + +# bcrypt_sha256/bcrypt +PASSWORD_METHOD = 'bcrypt_sha256' + +LOGIN_URL = '/login/' try: - from local_config import * + from local_config import * # noqa except ImportError: pass diff --git a/vilya/databases/init_team.sql b/vilya/databases/init_team.sql new file mode 100644 index 0000000..ae4899d --- /dev/null +++ b/vilya/databases/init_team.sql @@ -0,0 +1,31 @@ +insert into team(id, team_id, name, description, created_at) values (1, 'public', '公共技术', '', '2013-03-01'); +insert into team(id, team_id, name, description, created_at) values (2, 'sns', '社区', '', '2013-03-01'); +insert into team(id, team_id, name, description, created_at) values (3, 'book', '读书', '', '2013-03-01'); +insert into team(id, team_id, name, description, created_at) values (4, 'movie', '电影', '', '2013-03-01'); +insert into team(id, team_id, name, description, created_at) values (5, 'music', '音乐', '', '2013-03-01'); +insert into team(id, team_id, name, description, created_at) values (7, 'biz', '商务', '', '2013-03-01'); +insert into team(id, team_id, name, description, created_at) values (8, 'safe', '安全', '', '2013-03-01'); +insert into team(id, team_id, name, description, created_at) values (9, 'platform', '平台', '', '2013-03-01'); +insert into team(id, team_id, name, description, created_at) values (10, 'algorithm', '算法', '', '2013-03-01'); +insert into team(id, team_id, name, description, created_at) values (11, 'mobile', '移动', '', '2013-03-01'); +insert into team(id, team_id, name, description, created_at) values (12, 'alpha', '阿尔法城', '', '2013-03-01'); +insert into team(id, team_id, name, description, created_at) values (13, 'ad', '广告平台', '', '2013-03-01'); +insert into team(id, team_id, name, description, created_at) values (14, 'f2e', '前端', '', '2013-03-01'); +insert into team(id, team_id, name, description, created_at) values (15, 'intra', '内网', '', '2013-03-01'); +insert into team(id, team_id, name, description, created_at) values (16, 'data', '数据分析', '', '2013-03-01'); +insert into team_user_relationship(team_id, user_id, identity) values(1, 'qingfeng', 2); +insert into team_user_relationship(team_id, user_id, identity) values(2, 'qingfeng', 2); +insert into team_user_relationship(team_id, user_id, identity) values(3, 'qingfeng', 2); +insert into team_user_relationship(team_id, user_id, identity) values(4, 'qingfeng', 2); +insert into team_user_relationship(team_id, user_id, identity) values(5, 'qingfeng', 2); +insert into team_user_relationship(team_id, user_id, identity) values(6, 'qingfeng', 2); +insert into team_user_relationship(team_id, user_id, identity) values(7, 'xingben', 2); +insert into team_user_relationship(team_id, user_id, identity) values(8, 'qingfeng', 2); +insert into team_user_relationship(team_id, user_id, identity) values(9, 'qingfeng', 2); +insert into team_user_relationship(team_id, user_id, identity) values(10, 'qingfeng', 2); +insert into team_user_relationship(team_id, user_id, identity) values(11, 'qingfeng', 2); +insert into team_user_relationship(team_id, user_id, identity) values(12, 'qingfeng', 2); +insert into team_user_relationship(team_id, user_id, identity) values(13, 'qingfeng', 2); +insert into team_user_relationship(team_id, user_id, identity) values(14, 'qingfeng', 2); +insert into team_user_relationship(team_id, user_id, identity) values(15, 'qingfeng', 2); +insert into team_user_relationship(team_id, user_id, identity) values(16, 'qingfeng', 2); diff --git a/vilya/databases/schema.sql b/vilya/databases/schema.sql index f8c0ff8..108ee9c 100644 --- a/vilya/databases/schema.sql +++ b/vilya/databases/schema.sql @@ -1,119 +1,766 @@ --- MySQL dump 10.13 Distrib 5.1.70, for apple-darwin12 (x86_64) --- --- Host: localhost Database: valentine --- ------------------------------------------------------ --- Server version 5.1.70-log - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - --- --- Table structure for table `organizations` --- - -DROP TABLE IF EXISTS `organizations`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `organizations` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `name` varchar(200) NOT NULL, - `description` varchar(512) NOT NULL, - `owner_id` int(11) NOT NULL, - `creator_id` int(11) NOT NULL, +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `api_key` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(100) NOT NULL, + `description` text, + `type` tinyint(1) DEFAULT '0', + `url` varchar(256) DEFAULT NULL, + `redirect_uri` varchar(256) NOT NULL, + `owner_id` varchar(20) NOT NULL, + `client_id` varchar(100) NOT NULL, + `client_secret` varchar(100) NOT NULL, + `status` tinyint(1) DEFAULT '0', `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`,`client_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `api_token` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `client_id` varchar(100) NOT NULL, + `user_id` varchar(100) NOT NULL, + `token` varchar(100) NOT NULL, + `expire_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `refresh_token` varchar(100) NOT NULL, + `refresh_expire_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + `status` tinyint(1) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`,`token`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `badge` ( + `badge_id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(20) NOT NULL, + `summary` varchar(255) DEFAULT NULL, + PRIMARY KEY (`badge_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `badge_item` ( + `item_id` varchar(100) NOT NULL, + `badge_id` int(11) NOT NULL, + `kind` int(11) NOT NULL, + `reason` varchar(255) DEFAULT NULL, + `date` datetime DEFAULT NULL, + PRIMARY KEY (`item_id`,`badge_id`,`kind`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `center_activities` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `title` varchar(1024) NOT NULL, + `description` text, + `creator_id` varchar(200) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `type` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + KEY `idx_creator` (`creator_id`), + KEY `idx_created` (`created_at`), + KEY `idx_type` (`type`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `chat_rooms` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(100) NOT NULL, + `author` varchar(20) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `codedouban_boards` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `project_id` int(11) NOT NULL, + `board_id` varchar(32) DEFAULT NULL, + `board_name` varchar(32) DEFAULT NULL, + `user_key` varchar(32) DEFAULT NULL, + `user_token` varchar(64) DEFAULT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `uk_name` (`name`), - KEY `idx_owner` (`owner_id`), - KEY `idx_creator` (`creator_id`) + UNIQUE KEY `project_id` (`project_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `codedouban_comments` ( + `comment_id` int(11) NOT NULL AUTO_INCREMENT, + `project_id` int(11) NOT NULL, + `ref` varchar(100) NOT NULL, + `author` varchar(20) NOT NULL, + `content` text NOT NULL, + `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`comment_id`), + KEY `idx_ref` (`ref`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `project_forks` --- - -DROP TABLE IF EXISTS `project_forks`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; -CREATE TABLE `project_forks` ( +CREATE TABLE `codedouban_committers` ( `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` varchar(20) NOT NULL, + `project_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `uk_user_project` (`user_id`,`project_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='code/committers/2012-11-26'; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `codedouban_hooks` ( + `hook_id` int(11) NOT NULL AUTO_INCREMENT, + `project_id` int(11) NOT NULL, + `url` varchar(100) NOT NULL, + PRIMARY KEY (`hook_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `codedouban_linecomments` ( + `comment_id` int(11) NOT NULL AUTO_INCREMENT, `project_id` int(11) NOT NULL, - `forked_id` int(11) NOT NULL, - `family_id` int(11) NOT NULL, - `creator_id` int(11) NOT NULL, + `ref` varchar(100) NOT NULL, + `path` varchar(255) NOT NULL, + `position` int(11) NOT NULL, + `author` varchar(20) NOT NULL, + `content` text CHARACTER SET utf8 NOT NULL, + `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`comment_id`), + KEY `idx_ref` (`ref`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `codedouban_linecomments_v2` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `target_type` int(11) NOT NULL, + `target_id` int(11) NOT NULL, + `from_sha` varchar(100) NOT NULL, + `to_sha` varchar(100) NOT NULL, + `old_path` varchar(255) NOT NULL, + `new_path` varchar(255) NOT NULL, + `from_oid` varchar(100) NOT NULL, + `to_oid` varchar(100) NOT NULL, + `old_linenum` int(11) NOT NULL, + `new_linenum` int(11) NOT NULL, + `position` int(11) DEFAULT NULL, + `author` varchar(20) NOT NULL, + `content` varchar(1024) NOT NULL, `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `idx_target_type_and_target_id` (`target_type`,`target_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `codedouban_mirror` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `url` varchar(512) NOT NULL, + `state` int(11) NOT NULL DEFAULT '0', + `project_id` int(11) NOT NULL, + `with_proxy` tinyint(1) NOT NULL DEFAULT '0', + `frequency` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `idx_project` (`project_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `codedouban_projects` ( + `project_id` int(11) NOT NULL AUTO_INCREMENT, + `project_name` varchar(100) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL, + `owner_id` varchar(20) NOT NULL, + `summary` varchar(255) DEFAULT NULL, + `time` datetime NOT NULL, + `product` varchar(10) DEFAULT NULL, + `git_path` varchar(100) NOT NULL, + `trac_conf` varchar(100) NOT NULL, + `fork_from` int(11) DEFAULT NULL, + `origin_project` int(11) DEFAULT NULL, + `intern_banned` varchar(10) DEFAULT NULL, + `can_push` tinyint(1) DEFAULT '1', + PRIMARY KEY (`project_id`), + UNIQUE KEY `project_name` (`project_name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `codedouban_recommendation_votes` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `recommendation_id` int(11) NOT NULL, + `user` varchar(20) NOT NULL, + `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `codedouban_recommendations` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `from_user` varchar(20) NOT NULL, + `to_user` varchar(20) NOT NULL, + `content` varchar(1024) CHARACTER SET utf8 NOT NULL, + `n_vote` int(11) NOT NULL DEFAULT '0', + `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `codedouban_status_comments` ( + `comment_id` int(11) NOT NULL AUTO_INCREMENT, + `status_id` int(11) NOT NULL, + `author` varchar(20) NOT NULL, + `text` text NOT NULL, + `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`comment_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `codedouban_status_likes` ( + `like_id` int(11) NOT NULL AUTO_INCREMENT, + `status_id` int(11) NOT NULL, + `author` varchar(20) NOT NULL, + `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`like_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `codedouban_status_reshares` ( + `reshare_id` int(11) NOT NULL AUTO_INCREMENT, + `status_id` int(11) NOT NULL, + `author` varchar(20) NOT NULL, + `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`reshare_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `codedouban_statuses` ( + `status_id` int(11) NOT NULL AUTO_INCREMENT, + `owner_id` varchar(20) NOT NULL, + `text` text NOT NULL, + `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`status_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `codedouban_ticket` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `title` varchar(100) NOT NULL, + `description` varchar(1024) NOT NULL, + `author` varchar(20) NOT NULL, + `ticket_number` int(11) NOT NULL, + `project_id` int(11) NOT NULL, + `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `closed` timestamp NULL DEFAULT NULL, + `rank_score` float(5,3) NOT NULL DEFAULT '0.000', + PRIMARY KEY (`id`), + KEY `idx_project_ticket` (`project_id`,`ticket_number`), + KEY `idx_closed` (`closed`), + KEY `idx_author` (`author`), + KEY `idx_rank_score` (`rank_score`), + KEY `idx_time` (`time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `codedouban_ticket_codereview` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `content` varchar(1024) NOT NULL, + `path` varchar(255) NOT NULL, + `position` int(11) NOT NULL, + `line_mark` varchar(20) NOT NULL DEFAULT '', + `from_ref` varchar(255) NOT NULL, + `author` varchar(20) NOT NULL, + `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `ticket_id` int(11) NOT NULL, + `new_path` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `codedouban_ticket_comment` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `content` varchar(1024), + `author` varchar(20) NOT NULL, + `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `ticket_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + KEY `idx_ticket` (`ticket_id`), + KEY `idx_author` (`author`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `codedouban_ticket_commits` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `commits` varchar(1024) NOT NULL, + `author` varchar(20) NOT NULL, + `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `ticket_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + KEY `idx_ticket` (`ticket_id`), + KEY `idx_created` (`time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `codedouban_useremails` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` varchar(20) NOT NULL, + `email` varchar(64) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `codedouban_usergithub` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` varchar(20) NOT NULL, + `user_name` varchar(20) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `codedouban_watches` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` varchar(20) NOT NULL, + `project_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `user_id` (`user_id`,`project_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `commit_statuses` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `project_id` int(11) NOT NULL, + `sha` varchar(100) NOT NULL DEFAULT '', + `state` varchar(20) NOT NULL DEFAULT '', + `target_url` varchar(255) NOT NULL DEFAULT '', + `description` text NOT NULL, + `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `author` varchar(20) NOT NULL DEFAULT '', PRIMARY KEY (`id`), - UNIQUE KEY `idx_project` (`project_id`), - KEY `idx_fork` (`forked_id`), - KEY `idx_family` (`family_id`) + KEY `project_id` (`project_id`,`sha`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `projects` --- - -DROP TABLE IF EXISTS `projects`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; -CREATE TABLE `projects` ( +CREATE TABLE `follow_relationship` ( + `user_name` varchar(20) NOT NULL, + `followed_user_name` varchar(20) NOT NULL, + `time` datetime DEFAULT NULL, + PRIMARY KEY (`user_name`,`followed_user_name`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `gist_comments` ( `id` int(11) NOT NULL AUTO_INCREMENT, - `name` varchar(200) NOT NULL, - `description` varchar(512) NOT NULL, - `kind` tinyint(2) NOT NULL, - `owner_id` int(11) NOT NULL, - `creator_id` int(11) NOT NULL, + `gist_id` int(11) NOT NULL, + `user_id` varchar(20) NOT NULL, + `content` text NOT NULL, `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `gist_stars` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `gist_id` int(11) NOT NULL, + `user_id` varchar(20) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), - UNIQUE KEY `uk_kind_owner_name` (`name`,`kind`,`owner_id`), - KEY `idx_name` (`name`), - KEY `idx_owner` (`owner_id`), - KEY `idx_kind_owner` (`kind`,`owner_id`), - KEY `idx_creator` (`creator_id`) + UNIQUE KEY `uk_gist_user` (`gist_id`,`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `users` --- - -DROP TABLE IF EXISTS `users`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; -CREATE TABLE `users` ( +CREATE TABLE `gists` ( `id` int(11) NOT NULL AUTO_INCREMENT, - `name` varchar(200) NOT NULL, - `password` varchar(200) NOT NULL, - `description` varchar(512) NOT NULL, - `email` varchar(200) DEFAULT NULL, - `session_id` varchar(16) DEFAULT NULL, - `session_expired_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + `name` varchar(100) NOT NULL, + `description` text, + `owner_id` varchar(20) NOT NULL, + `is_public` tinyint(1) DEFAULT '1', + `fork_from` int(11) DEFAULT '0', `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `group_users` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `group_id` int(11) NOT NULL, + `user_id` varchar(200) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), - UNIQUE KEY `uk_user` (`name`), - UNIQUE KEY `uk_email` (`email`), - KEY `idx_user_password` (`name`,`password`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; -/*!40101 SET character_set_client = @saved_cs_client */; -/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; - -/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; -/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; -/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; - --- Dump completed on 2013-12-25 2:00:50 + UNIQUE KEY `uk_group_user` (`group_id`,`user_id`), + KEY `idx_group` (`group_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `issue_comment_counters` ( + `issue_id` int(10) unsigned NOT NULL, + `counter` int(10) unsigned DEFAULT '1', + PRIMARY KEY (`issue_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `issue_comments` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `issue_id` int(11) NOT NULL, + `author_id` varchar(200) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, + `number` int(11) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `issue_milestones` ( + `id` int(10) NOT NULL AUTO_INCREMENT, + `issue_id` int(10) unsigned NOT NULL, + `milestone_id` int(10) unsigned NOT NULL, + `creator_id` varchar(200) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `uk_issue` (`issue_id`), + KEY `uk_issue_milestone` (`issue_id`,`milestone_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `issue_participants` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `issue_id` int(11) NOT NULL, + `user_id` varchar(200) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_issue_user` (`issue_id`,`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `issue_pledge` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `issue_id` int(11) NOT NULL, + `user_id` varchar(20) NOT NULL, + `amount` int(11) NOT NULL DEFAULT '0', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `idx_ip_iu` (`issue_id`,`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `issue_related_projects` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `issue_id` int(11) NOT NULL, + `project_id` int(11) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `idx_irp_pid` (`project_id`), + KEY `idx_irp_ip` (`issue_id`,`project_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `issue_upvotes` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `issue_id` int(11) NOT NULL, + `user_id` varchar(20) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `issues` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `title` varchar(1024) NOT NULL, + `creator_id` varchar(200) NOT NULL, + `assignee_id` varchar(200) DEFAULT NULL, + `closer_id` varchar(200) DEFAULT NULL, + `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, + `closed_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + `rank_score` float(5,3) NOT NULL DEFAULT '0.000', + `type` varchar(16) DEFAULT '', + `target_id` int(11) DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `milestone_counters` ( + `target_id` int(10) unsigned NOT NULL, + `target_type` int(10) unsigned NOT NULL, + `counter` int(10) unsigned DEFAULT '1', + PRIMARY KEY (`target_id`), + KEY `uk_target` (`target_id`,`target_type`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `milestones` ( + `id` int(10) NOT NULL AUTO_INCREMENT, + `name` varchar(1024) NOT NULL, + `target_id` int(10) unsigned NOT NULL, + `target_type` int(10) unsigned NOT NULL, + `target_number` int(10) unsigned NOT NULL, + `creator_id` varchar(200) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `uk_milestone` (`target_id`,`target_type`,`target_number`), + UNIQUE KEY `uk_name` (`name`(255),`target_id`,`target_type`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `organization` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `org_id` varchar(20) NOT NULL, + `name` varchar(100) NOT NULL DEFAULT '', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `creator` varchar(20) NOT NULL DEFAULT '', + PRIMARY KEY (`id`), + UNIQUE KEY `org_id` (`org_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `project_issue_counters` ( + `project_id` int(10) unsigned NOT NULL, + `counter` int(10) unsigned DEFAULT '1', + PRIMARY KEY (`project_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `project_issues` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `project_id` int(11) NOT NULL, + `issue_id` int(11) NOT NULL, + `number` int(11) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `projects_groups` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `project_id` int(11) NOT NULL, + `group_id` int(11) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `uk_project_group` (`project_id`,`group_id`), + KEY `idx_project` (`project_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `pullreq` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `from_project` int(11) NOT NULL, + `from_branch` varchar(100) NOT NULL, + `to_project` int(11) NOT NULL, + `to_branch` varchar(100) NOT NULL, + `merged` varchar(100) DEFAULT NULL, + `ticket_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + KEY `idx_project_ticket` (`to_project`,`ticket_id`), + KEY `idx_merged` (`merged`), + KEY `idx_from_to` (`from_project`,`from_branch`,`to_project`,`to_branch`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `pullreq_counter` ( + `project_id` int(10) unsigned NOT NULL, + `counter` int(10) unsigned DEFAULT '1', + PRIMARY KEY (`project_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='code/pull request counter/2012-11-30'; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ssh_keys` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` varchar(20) NOT NULL, + `key` varchar(1024) NOT NULL, + `fingerprint` varchar(48) NOT NULL, + `title` varchar(128) NOT NULL, + PRIMARY KEY (`id`), + KEY `user_id_index` (`user_id`), + KEY `fingerprint_index` (`fingerprint`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `tag_names` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(1024) NOT NULL, + `author_id` varchar(200) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + `target_id` int(11) NOT NULL, + `target_type` int(11) NOT NULL, + `hex_color` varchar(6) DEFAULT 'cccccc', + PRIMARY KEY (`id`), + KEY `uk_name_target_type_and_target_id` (`name`(255),`target_type`,`target_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `tags` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `tag_id` int(11) NOT NULL, + `type` int(11) NOT NULL, + `type_id` int(11) NOT NULL, + `author_id` varchar(200) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + `target_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + KEY `uk_tag_id_type_and_type_id` (`tag_id`,`type`,`type_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `team` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `team_id` varchar(20) NOT NULL, + `name` varchar(100) NOT NULL DEFAULT '', + `description` varchar(600) NOT NULL DEFAULT '', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `creator_id` varchar(200) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `team_id` (`team_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `team_groups` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `team_id` int(11) NOT NULL, + `name` varchar(100) NOT NULL DEFAULT '', + `creator_id` varchar(200) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `description` varchar(1024) DEFAULT NULL, + `permission` int(11) NOT NULL DEFAULT '1', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_team_name` (`team_id`,`name`), + KEY `idx_team` (`team_id`), + KEY `idx_permission` (`permission`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `team_issue_counters` ( + `team_id` int(10) unsigned NOT NULL, + `counter` int(10) unsigned DEFAULT '1', + PRIMARY KEY (`team_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `team_issues` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `team_id` int(11) NOT NULL, + `issue_id` int(11) NOT NULL, + `number` int(11) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `team_project_relationship` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `team_id` int(11) NOT NULL, + `project_id` int(11) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `uk_team_project` (`team_id`,`project_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `team_projects` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `team_id` int(11) NOT NULL, + `project_id` int(11) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `uk_team_project` (`team_id`,`project_id`), + UNIQUE KEY `uk_team_id` (`team_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `team_user_relationship` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `team_id` int(11) NOT NULL, + `user_id` varchar(20) NOT NULL, + `identity` int(11) unsigned NOT NULL DEFAULT '1', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `uk_team_user` (`team_id`,`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ticket_nodes` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `author` varchar(20) NOT NULL, + `type` int(11) NOT NULL, + `type_id` int(11) NOT NULL, + `ticket_id` int(11) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `idx_ticket` (`ticket_id`), + KEY `idx_created` (`created_at`), + KEY `idx_type` (`type`,`type_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `user_fav` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` varchar(20) NOT NULL, + `target_id` int(10) unsigned NOT NULL, + `kind` smallint(5) unsigned NOT NULL, + `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `uk_user_fav` (`user_id`,`target_id`,`kind`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `users` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(20) NOT NULL, + `password` varchar(100) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `role` tinyint(4) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `uk_user` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*!40101 SET character_set_client = @saved_cs_client */; diff --git a/vilya/libs/api_errors/__init__.py b/vilya/libs/api_errors/__init__.py new file mode 100644 index 0000000..200c833 --- /dev/null +++ b/vilya/libs/api_errors/__init__.py @@ -0,0 +1,104 @@ +# -*- coding: utf-8 -*- + +from quixote.errors import PublishError + + +class CodeAPIError(PublishError): + title = "Internal Server Error" + status_code = 400 + problem_type = "" + + def __init__(self, detail=""): + super(CodeAPIError, self).__init__() + self.detail = detail + + def __dict__(self): + error_data = { + "type": self.problem_type, + "title": self.title, + "code": self.status_code, + "message": self.detail, + } + return error_data + + def to_dict(self): + return self.__dict__() + + +class NotJSONError(CodeAPIError): + title = "Request body can not be parsed into JSON" + status_code = 400 + problem_type = "not_json" + + +class UnauthorizedError(CodeAPIError): + title = "Unauthorized Request" + status_code = 401 + problem_type = "unauthorized" + + +class ForbiddenError(CodeAPIError): + title = "You have NO permissions to perform this request" + status_code = 403 + problem_type = "forbidden" + + +class NotTheAuthorError(ForbiddenError): + problem_type = "not_the_author" + + def __init__(self, resource="item", action="edit"): + detail = "Only the author of this %s can operate '%s' action" % (resource, action) + super(NotTheAuthorError, self).__init__(detail) + + +class NoPushPermissionError(ForbiddenError): + title = "You have no permission to push to this repository" + problem_type = "no_push_permission" + + +class NotFoundError(CodeAPIError): + title = "The resource you request does NOT exist" + status_code = 404 + problem_type = "not_found" + + def __init__(self, resource_name="resource"): + detail = "The %s your requested can not be found, it might have been removed" % resource_name + super(NotFoundError, self).__init__(detail) + + +class MethodNotAllowedError(CodeAPIError): + title = "The request method is not allowed" + status_code = 405 + problem_type = "method_not_allowed" + + +class NotAcceptableError(CodeAPIError): + title = "The request is not acceptable" + status_code = 406 + problem_type = "not_accetable" + + +class UnprocessableEntityError(CodeAPIError): + title = "Validation Failed" + status_code = 422 + problem_type = "validation_failed" + + +class InvalidFieldError(UnprocessableEntityError): + title = "The request's query data is invalid" + + def __init__(self, field_name, format_desc="a right one"): + detail = "The field %s is invalid, you need supply %s." % (field_name, format_desc) + super(InvalidFieldError, self).__init__(detail) + + +class MissingFieldError(UnprocessableEntityError): + title = "Missing field" + + def __init__(self, field): + if isinstance(field, basestring): + detail = "This field is required: %s" % field + elif isinstance(field, list): + detail = "These fields are required: %s" % ", ".join(field) + super(MissingFieldError, self).__init__(detail) + diff --git a/vilya/libs/armin.py b/vilya/libs/armin.py new file mode 100644 index 0000000..2dc5b79 --- /dev/null +++ b/vilya/libs/armin.py @@ -0,0 +1,278 @@ +# -*- coding: utf-8 -*- + +import os +import shutil +import pickle +import sphinx # Some pickles need this import +import logging +import subprocess + +from ellen.repo import Jagare +from ellen.utils.process import git_with_path + +from vilya.models.consts import SPHINX_BUILDER_TYPES + +logging.basicConfig() +logger = logging.getLogger(__name__) +logger.setLevel(logging.INFO) +debug = logger.debug +warn = logger.warn + + +class Armin(object): + + def __init__(self): + self.repo = None + self.conf = None + self.root_path = None + self.home_path = None + + def get_content(self, path): + fp = os.path.join(self.root_path, path) + if not os.path.exists(fp): + debug("Path do not exist: %s" % fp) + return False + with open(fp) as f: + content = f.read() + return content + + +class ArminBuilder(object): + + def __init__(self, option): + self.option = option + self._repo = None + + def repo(self): + if not self._repo: + self._repo = Jagare(self.option.repo_path) + return self._repo + + @property + def hex(self): + return self.tree_hex + + @property + def commit_hex(self): + return self.repo.resolve_commit('HEAD') + + @property + def tree_hex(self): + option = self.option + repo_path = option.repo_path + builder_dir = option.builder_dir + if self.option.autodoc: + hex = _tree_hash(repo_path, '') + else: + hex = _tree_hash(repo_path, builder_dir) + return hex + + def build(self): + ret = False + option = self.option + try: + if option.builder not in SPHINX_BUILDER_TYPES: + return None + checkout_path(option) + if option.builder in ['raw']: + ret, status = raw_build(option) + elif option.builder in ['pickle', 'html']: + ret, status = sphinx_build(option) + if ret: + _move_to_dir(option.outdir, option.builder_doc_path) + finally: + _clean_up(option.temp_path) + + +class ArminOption(object): + builder = None + project = None + temp_path = None + doc_path = None + doctree_path = None + sourcedir = None + outdir = None + + def __init__(self): + self.settings = {} + + def settings_list(self): + _list = [] + _dict = self.settings + for key in _dict: + _list.append('-D') + _list.append("%s=%s" % (key, _dict[key])) + return _list + +# temp path +# get tree hash +# make doc dir +# export doc tree to temp path + + +def sphinx_build(option): + cmd = ['sphinx-build'] + # -- write all files; default is to only write new and changed files + cmd += ['-a'] + cmd += ['-E'] # -- don't use a saved environment, always read all files + cmd += ['-b', option.builder] # -- builder to use + cmd += option.settings_list() + # -- path for the cached environment and doctree files + cmd += ['-d', option.doctree_path] + cmd += ['-q'] + if _has_sphinx_conf(option.sourcedir): + # -- path where configuration file (conf.py) is located + cmd += ['-c', option.sourcedir] + else: + cmd += ['-C'] # No conf.py file + cmd += [option.sourcedir, option.outdir] + process = subprocess.Popen( + cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + out, err = process.communicate() + returncode = process.returncode + status = { + 'builder': option.builder, + 'out': out, + 'error': err, + 'returncode': returncode, + 'command': cmd, + } + return returncode == 0, status + + +def raw_build(option): + ignore = shutil.ignore_patterns(('.build',)) + shutil.copytree(option.sourcedir, option.outdir, ignore=ignore) + status = { + 'builder': option.builder, + 'out': 'tree copied to .build/raw', + 'error': '', + 'returncode': None, + 'command': ['shutil.copytree(%s, %s)' % (option.sourcedir, option.outdir)], + } + return True, status + + +def _has_sphinx_conf(temp_path): + sphinx_conf = os.path.join(temp_path, 'conf.py') + return os.path.exists(sphinx_conf) + + +def checkout_path(option): + repo_path = option.repo_path + autodoc = option.autodoc + builder_dir = option.builder_dir + doc_path = option.doc_path + temp_path = option.temp_path + if autodoc: + tree_hash = _tree_hash(repo_path, '') + else: + tree_hash = _tree_hash(repo_path, builder_dir) + try: + if doc_path and not os.path.isdir(doc_path): + os.makedirs(doc_path) + except OSError: + pass + _export_docs_tree(repo_path, tree_hash, temp_path) + + +def read_tree(git_dir, work_dir=None, tree_hash=None): + git = git_with_path(git_dir, work_dir) + if tree_hash: + return git.read_tree(tree_hash) + else: + return git.read_tree(empty=True) + + +def checkout_index(git_dir, work_dir): + git = git_with_path(git_dir, work_dir) + return git.checkout_index(force=True, a=True) + + +def rev_parse(git_dir, work_dir, rev): + git = git_with_path(git_dir, work_dir) + return git.rev_parse(rev) + + +def get_tree_hash(git_dir, work_dir=None, path=None): + ret = rev_parse(git_dir, work_dir, 'HEAD:%s' % path if path else 'HEAD') + if int(ret.get('returncode')) == 0: + return ret.get('stdout').strip('\n') + return '' + + +def _move_to_dir(fromd, tod): + shutil.rmtree(tod, ignore_errors=True) + shutil.copytree(fromd, tod) + shutil.rmtree(fromd) + + +def _clean_up(path): + if path and os.path.isdir(path): + shutil.rmtree(path) + + +def _export_docs_tree(repo_path, tree_hash, temp_path): + debug('Exporting docs tree') + read_tree(repo_path) + read_tree(repo_path, tree_hash=tree_hash) + checkout_index(repo_path, temp_path) + debug('Checked out the docs content work-tree') + + +def _tree_hash(repo_path, path): + return get_tree_hash(repo_path, path=path) + + +def _find_tokens(keys, key): + key = key.lower().strip() + return [k for k in keys if k.startswith(key)] + + +def _unpickled(build_path, path): + gc = _unpickle_global(build_path, "globalcontext.pickle") + if not gc: + return {'error': 'Unable to find global context'} + if not path: + path = gc['master_doc'] + pk = _unpickle_target(build_path, path, gc) + if not pk: + pk = _unpickle_target( + build_path, path + '/' + gc['master_doc'], gc) # Hack + if not pk: + return {'error': 'Unable to find pickle', 'gc': gc} + pk['gc'] = gc + pk['error'] = False + return pk + + +def _unpickle_global(build_path, fn): + fp = os.path.join(build_path, fn) + if not os.path.exists(fp): + return False + with open(fp) as f: + p = pickle.load(f) + return p + + +def _unpickle_target(build_path, path, gc): + fp = os.path.join(build_path, path) + fp += gc['file_suffix'] + if not os.path.exists(fp): + return False + with open(fp) as f: + p = pickle.load(f) + return p + + +def _search(build_path, q): + si = _unpickle_global(build_path, "searchindex.pickle") + toks = _find_tokens(si['terms'].keys(), q) + results = [] + for tok in toks: + links = si['terms'][tok] + if isinstance(links, int): + links = [links] + for link in links: + results.append((si['filenames'][link], si['titles'][link])) + return results diff --git a/vilya/libs/auth/__init__.py b/vilya/libs/auth/__init__.py index 33899a6..6558c82 100644 --- a/vilya/libs/auth/__init__.py +++ b/vilya/libs/auth/__init__.py @@ -1,7 +1,9 @@ # -*- coding: utf-8 -*- from base64 import b64decode + from quixote.errors import AccessError from quixote import get_request + from vilya.models.user import User @@ -17,9 +19,7 @@ def __init__(self, header): self.login = login self.passwd = passwd self.user = User.get_by_name(login) - except ValueError: - pass - except TypeError: + except (ValueError, TypeError): pass def confirm(self): @@ -27,8 +27,7 @@ def confirm(self): passwd = self.passwd if username == 'code' and passwd == 'code': return True - # FIXME: user login - if username and passwd: + if self.user and self.user.validate_password(passwd): return True raise UnauthorizedError diff --git a/vilya/libs/auth/check_auth.py b/vilya/libs/auth/check_auth.py index c125432..5981063 100644 --- a/vilya/libs/auth/check_auth.py +++ b/vilya/libs/auth/check_auth.py @@ -1,6 +1,8 @@ # -*- coding: utf-8 -*- - from datetime import datetime + +from vilya.models.api_key import ApiKey +from vilya.models.api_token import ApiToken from vilya.libs.auth.oauth import OAuthError from vilya.libs.auth import errors as err from vilya.libs.auth import AuthCode @@ -29,6 +31,14 @@ def check_auth(request): if not token: raise OAuthError(*err.auth_invalid_access_token) + # ApiKey 是否存在 + if not token.key: + raise OAuthError(*err.auth_invalid_apikey) + + # ApiKey 是否可用 + if token.key.status == ApiKey.STATUS_BLOCKED: + raise OAuthError(*err.auth_apikey_blocked) + # ApiToken 是否过期 if datetime.now() > token.expire_time: raise OAuthError(*err.auth_access_token_has_expired) diff --git a/vilya/libs/auth/decorators.py b/vilya/libs/auth/decorators.py new file mode 100644 index 0000000..7032c85 --- /dev/null +++ b/vilya/libs/auth/decorators.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +from functools import wraps + +from vilya.config import LOGIN_URL +from vilya.libs.auth.views import redirect_to_login + +REDIRECT_FIELD_NAME = 'continue' + + +def user_passes_test(test_func, login_url=LOGIN_URL, + redirect_field_name=REDIRECT_FIELD_NAME): + + def decorator(view_func): + @wraps(view_func) + def _wrapped_view(request, *args, **kwargs): + if test_func(request.user): + return view_func(request, *args, **kwargs) + return redirect_to_login(request, request.url, login_url, + redirect_field_name) + return _wrapped_view + return decorator + + +def login_required(func=None, redirect_field_name=REDIRECT_FIELD_NAME, + login_url=LOGIN_URL): + decorator = user_passes_test( + lambda user: user is not None, + login_url=login_url, + redirect_field_name=redirect_field_name + ) + if func: + return decorator(func) + return decorator diff --git a/vilya/libs/auth/oauth.py b/vilya/libs/auth/oauth.py index 192d668..349939e 100644 --- a/vilya/libs/auth/oauth.py +++ b/vilya/libs/auth/oauth.py @@ -42,6 +42,7 @@ def confirm(cls, user_id, cid): mc.delete(key) return True + class OAuthError(PublishError): def __init__(self, code, msg): diff --git a/vilya/libs/auth/views.py b/vilya/libs/auth/views.py new file mode 100644 index 0000000..08613cf --- /dev/null +++ b/vilya/libs/auth/views.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +from urllib import urlencode + + +def redirect_to_login(request, next_path, login_url, redirect_field_name): + url = login_url + '?' + urlencode({redirect_field_name: next_path}) + return request.redirect(url) diff --git a/vilya/libs/consts.py b/vilya/libs/consts.py new file mode 100644 index 0000000..daf202d --- /dev/null +++ b/vilya/libs/consts.py @@ -0,0 +1,222 @@ +IGNORE_FILE_EXTS = ( + '.tar', '.zip', '.rar', '.gz', '.bz', '.bz2', + '.bmp', '.jpeg', '.jpg', '.png', '.gif', '.svg', '.ico', + '.mp3', '.svn-base', '.swf', '.ttf', '.jar', '.fla' , '.flash', '.pdf', + '.wmv', '.asf', '.asx', '.rm', '.rmvb', '.mpg', '.mpeg', '.mpe', '.pcap', + '.3gp', '.mov', '.mp4', '.m4v', '.avi', '.dat', '.mkv', '.flv', '.vob', 'dmg', +) + +IS_GENERATED = ('.xib', '.nib', '.storyboard', '.pbxproj', '.xcworkspacedata', '.xcuserstate') + +NOT_GENERATED = ('.py', '.html', '.mako', '.css', '.txt', '.rst', '.md', '.mkd', '.markdown', + '.sh', '.sql', '.ini', '.gitignore', '.tmpl', '.cfg', '.hgignore', + '.gitmodules', '.AUTHORS', ".scss", ".coffee", '.conf', '.applescript', + '.thrift', '.log', '.json', '.gradle', '.ebuild', + '.vimrc', '.bashrc', '.zshrc', '.tmux.conf', '.aliases', '.bash_profile', + '.bash_prompt', '.exports', '.gitconfig', '.inputrc', '.functions') +MINIFIED = ('.min.js', '.min.css') +PICS = ('.jpeg', '.jpg', '.png', '.gif') + +LANGUAGES = { + 'abap' : 'ABAP' , + 'ac' : 'm4' , + 'ada' : 'Ada' , + 'adb' : 'Ada' , + 'ads' : 'Ada' , + 'adso' : 'ADSO/IDSM' , + 'am' : 'make' , + 'ample' : 'AMPLE' , + 'as' : 'ActionScript' , + 'dofile' : 'AMPLE' , + 'startup' : 'AMPLE' , + 'asa' : 'ASP' , + 'asax' : 'ASP.Net' , + 'ascx' : 'ASP.Net' , + 'asm' : 'Assembly' , + 'asmx' : 'ASP.Net' , + 'asp' : 'ASP' , + 'aspx' : 'ASP.Net' , + 'master' : 'ASP.Net' , + 'sitemap' : 'ASP.Net' , + 'awk' : 'awk' , + 'bash' : 'Bourne Again Shell' , + 'bas' : 'Visual Basic' , + 'bat' : 'DOS Batch' , + 'BAT' : 'DOS Batch' , + 'cbl' : 'COBOL' , + 'CBL' : 'COBOL' , + 'c' : 'C' , + 'C' : 'C++' , + 'cc' : 'C++' , + 'ccs' : 'CCS' , + 'cfm' : 'ColdFusion' , + 'cl' : 'Lisp' , + 'cls' : 'Visual Basic' , + 'cob' : 'COBOL' , + 'COB' : 'COBOL' , + 'coffee' : 'CoffeeScript' , + 'config' : 'ASP.Net' , + 'cpp' : 'C++' , + 'cs' : 'C#' , + 'csh' : 'C Shell' , + 'css' : "CSS" , + 'cxx' : 'C++' , + 'd' : 'D' , + 'da' : 'DAL' , + 'dart' : 'Dart' , + 'def' : 'Teamcenter def' , + 'dmap' : 'NASTRAN DMAP' , + 'dpr' : 'Pascal' , + 'dtd' : 'DTD' , + 'ec' : 'C' , + 'el' : 'Lisp' , + 'erl' : 'Erlang' , + 'exp' : 'Expect' , + 'f77' : 'Fortran 77' , + 'F77' : 'Fortran 77' , + 'f90' : 'Fortran 90' , + 'F90' : 'Fortran 90' , + 'f95' : 'Fortran 95' , + 'F95' : 'Fortran 95' , + 'f' : 'Fortran 77' , + 'F' : 'Fortran 77' , + 'fmt' : 'Oracle Forms' , + 'focexec' : 'Focus' , + 'frm' : 'Visual Basic' , + 'go' : 'Go' , + 'groovy' : 'Groovy' , + 'h' : 'C/C++ Header' , + 'H' : 'C/C++ Header' , + 'hh' : 'C/C++ Header' , + 'hpp' : 'C/C++ Header' , + 'hrl' : 'Erlang' , + 'hs' : 'Haskell' , + 'htm' : 'HTML' , + 'html' : 'HTML' , + 'i3' : 'Modula3' , + 'idl' : 'IDL' , + 'pro' : 'IDL' , + 'ig' : 'Modula3' , + 'il' : 'SKILL' , + 'ils' : 'SKILL++' , + 'inc' : 'PHP/Pascal' , # might be PHP or Pascal + 'itk' : 'Tcl/Tk' , + 'java' : 'Java' , + 'jcl' : 'JCL' , # IBM Job Control Lang. + 'jl' : 'Lisp' , + 'js' : 'Javascript' , + 'jsp' : 'JSP' , # Java server pages + 'ksc' : 'Kermit' , + 'ksh' : 'Korn Shell' , + 'lhs' : 'Haskell' , + 'l' : 'lex' , + 'lsp' : 'Lisp' , + 'lisp' : 'Lisp' , + 'lua' : 'Lua' , + 'm3' : 'Modula3' , + 'm4' : 'm4' , + 'met' : 'Teamcenter met' , + 'mg' : 'Modula3' , +# 'mli' : 'ML' , # ML not implemented +# 'ml' : 'ML' , + 'ml' : 'Ocaml' , + 'm' : 'MATLAB/Objective C/MUMPS' , + 'mm' : 'Objective C++' , + 'wdproj' : 'MSBuild scripts' , + 'csproj' : 'MSBuild scripts' , + 'mps' : 'MUMPS' , + 'mth' : 'Teamcenter mth' , + 'oscript' : 'LiveLink OScript' , + 'pad' : 'Ada' , # Oracle Ada preprocessor + 'pas' : 'Pascal' , + 'pcc' : 'C++' , # Oracle C++ preprocessor + 'perl' : 'Perl' , + 'pfo' : 'Fortran 77' , + 'pgc' : 'C' , # Postgres embedded C/C++ + 'php3' : 'PHP' , + 'php4' : 'PHP' , + 'php5' : 'PHP' , + 'php' : 'PHP' , + 'plh' : 'Perl' , + 'pl' : 'Perl' , + 'PL' : 'Perl' , + 'plx' : 'Perl' , + 'pm' : 'Perl' , + 'p' : 'Pascal' , + 'pp' : 'Pascal' , + 'psql' : 'SQL' , + 'py' : 'Python' , + 'pyx' : 'Cython' , + 'rb' : 'Ruby' , + 'R' : 'R' , + # 'resx' : 'ASP.Net' , + 'rex' : 'Oracle Reports' , + 'rexx' : 'Rexx' , + 'rhtml' : 'Ruby HTML' , + 's' : 'Assembly' , + 'S' : 'Assembly' , + 'scala' : 'Scala' , + 'scss' : 'SCSS' , + 'sbl' : 'Softbridge Basic' , + 'SBL' : 'Softbridge Basic' , + 'sc' : 'Lisp' , + 'scm' : 'Lisp' , + 'sed' : 'sed' , + 'ses' : 'Patran Command Language' , + 'pcl' : 'Patran Command Language' , + 'sh' : 'Bourne Shell' , + 'smarty' : 'Smarty' , + 'sql' : 'SQL' , + 'stylus' : 'Stylus' , + 'SQL' : 'SQL' , + 'sproc.sql' : 'SQL Stored Procedure' , + 'spoc.sql' : 'SQL Stored Procedure' , + 'spc.sql' : 'SQL Stored Procedure' , + 'udf.sql' : 'SQL Stored Procedure' , + 'data.sql' : 'SQL Data' , + 'tcl' : 'Tcl/Tk' , + 'tcsh' : 'C Shell' , + 'tk' : 'Tcl/Tk' , + 'tpl' : 'Smarty' , + 'vhd' : 'VHDL' , + 'VHD' : 'VHDL' , + 'vhdl' : 'VHDL' , + 'VHDL' : 'VHDL' , + 'vba' : 'Visual Basic' , + 'VBA' : 'Visual Basic' , + # 'vbp' : 'Visual Basic' , # .vbp - autogenerated + 'vb' : 'Visual Basic' , + 'VB' : 'Visual Basic' , + # 'vbw' : 'Visual Basic' , # .vbw - autogenerated + 'vbs' : 'Visual Basic' , + 'VBS' : 'Visual Basic' , + 'webinfo' : 'ASP.Net' , + 'xml' : 'XML' , + 'XML' : 'XML' , + 'mxml' : 'MXML' , + 'build' : 'NAnt scripts' , + 'vim' : 'vim script' , + 'xaml' : 'XAML' , + 'xsd' : 'XSD' , + 'XSD' : 'XSD' , + 'xslt' : 'XSLT' , + 'XSLT' : 'XSLT' , + 'xsl' : 'XSLT' , + 'XSL' : 'XSLT' , + 'y' : 'yacc' , + 'yaml' : 'YAML' , + 'yml' : 'YAML' , + } + +LANGUAGES_WITHOUT_EXT = { + 'CMakeLists.txt' : 'CMake' , + 'Cakefile' : 'CoffeeScript' , + 'gnumakefile' : 'make' , + 'Gnumakefile' : 'make' , + 'makefile' : 'make' , + 'Makefile' : 'make' , + 'Rakefile' : 'Ruby' , + } + +SOURCE_FILE = (tuple(['.' + ext for ext in LANGUAGES.keys()]) + + tuple(LANGUAGES_WITHOUT_EXT.keys())) diff --git a/vilya/libs/date.py b/vilya/libs/date.py new file mode 100644 index 0000000..907b454 --- /dev/null +++ b/vilya/libs/date.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- + +from isoweek import Week +from datetime import datetime, time as dtime +import time + + +def get_current_monday(timestamp=False): + monday = datetime.combine(Week.thisweek().monday(), dtime.min) + if timestamp: + return time.mktime(monday.timetuple()) + return monday + + +def get_current_sunday(timestamp=False): + sunday = datetime.combine(Week.thisweek().sunday(), dtime.min) + if timestamp: + return time.mktime(sunday.timetuple()) + return sunday + + +def get_last_monday(timestamp=False): + monday = datetime.combine((Week.thisweek() - 1).monday(), dtime.min) + if timestamp: + return time.mktime(monday.timetuple()) + return monday + + +def get_last_sunday(timestamp=False): + sunday = datetime.combine((Week.thisweek() - 1).sunday(), dtime.min) + if timestamp: + return time.mktime(sunday.timetuple()) + return sunday diff --git a/vilya/libs/diff.py b/vilya/libs/diff.py index 19ce518..9359ae8 100644 --- a/vilya/libs/diff.py +++ b/vilya/libs/diff.py @@ -1,20 +1,22 @@ # -*- coding: utf-8 -*- -from difflib import _mdiff as mdiff # noqa +import re +import difflib +from quixote.html import html_quote + + +def _get_old(lines): + return [line for (attr, line) in lines if attr not in ('add', 'other')] -def _get_hunk(lines): - new, old = [], [] - for attr, line in lines: - if attr != 'other': - if attr != 'add': - old.append(attr) - if attr != 'rem': - new.append(attr) - return new, old +def _get_new(lines): + return [line for (attr, line) in lines if attr not in ('rem', 'other')] + + +def mdiff(old, new): + return difflib._mdiff(old, new) def rediff(generator): - change = False temp = [] for old, new, changed in generator: if changed: @@ -43,74 +45,215 @@ def sidediff(generator): if changed: if not old[0]: line = new[1].strip('\x00\x01') - yield (('l', 'emp', ' '),('r', 'add', line)) + yield (('l', 'emp', ' '), ('r', 'add', line)) elif not new[0]: line = old[1].strip('\x00\x01') yield (('l', 'rem', line), ('r', 'emp', ' ')) else: #mix - yield (('l', 'rem', '-'+old[1]),('r', 'add', '+'+new[1])) + yield (('l', 'rem', '-' + old[1]), ('r', 'add', '+' + new[1])) else: - yield (('l', 'normal', ' '+old[1]), ('r', 'normal', ' '+old[1])) + yield (('l', 'normal', ' ' + old[1]), + ('r', 'normal', ' ' + old[1])) def rehunk(a_hunk, side=False): - new, old = _get_hunk(a_hunk) + old = _get_old(a_hunk) + new = _get_new(a_hunk) if side: hunk = sidediff(mdiff(old, new)) else: hunk = rediff(mdiff(old, new)) return list(hunk) -import re -from quixote.html import html_quote -SEQUENCE_TAGS = [ - ur'\x00\-(.*?)\x01', - ur'\x00\+(.*?)\x01', - ur'\x00\^(.*?)\x01', - ur'(#[A-Fa-f0-9\x00\x01\-\+\^]{3,9})', -] +class LineHtmlPlugin(object): + def __init__(self, name, regex, left_html, right_html, + left_trim='', right_trim=''): + self.name = name + self.regex = regex + self.left_html = left_html + self.right_html = right_html + self.left_trim = left_trim + self.right_trim = right_trim + + self.left_len = len(left_trim) + self.right_len = len(right_trim) + + self.init() + + def init(self, len_s=0): + self.pairs = [] + self._idx_mapping_counter = {i: 1 for i in range(len_s + 1)} + + def add_pair(self, start, end, match): + piece = match.group(0) + + left_html = (self.left_html(match) + if callable(self.left_html) else self.left_html) + right_html = (self.right_html(match) + if callable(self.right_html) else self.right_html) + + self.pairs.append(dict(start=start, + end=end, + left_html=left_html, + right_html=right_html)) + + self.idx_shift(start + self.left_len, self.left_len) + self.idx_shift(end, self.right_len) + + return self._trim(piece) -SEQUENCE_RE = re.compile("|".join(SEQUENCE_TAGS), re.UNICODE + re.DOTALL) + @property + def idx_mapping(self): + _idx_mapping = {} + for i, v in self._idx_mapping_counter.items(): + last_idx_value = -1 if i == 0 else _idx_mapping[i - 1] + _idx_mapping[i] = last_idx_value + v + return _idx_mapping + + def idx_shift(self, idx, value): + """idx_mapping 从 idx 开始向左移动 value 个位置""" + self._idx_mapping_counter[idx] -= value + + def _trim(self, s): + if self.right_len == 0: + return s[self.left_len:] + else: + return s[self.left_len:-self.right_len] class LineHtml(object): + """render internal diff""" - def __init__(self): + def __init__(self, plugins=None): self.s = None + self.plugins = plugins + + def run_plugins(self): + for plugin in self.plugins: + plugin.init(len(self.s)) + + tmp = '' + last_end = 0 + for match in plugin.regex.finditer(self.s): + + start, end = match.span() + tmp += self.s[last_end:start] + + tmp += plugin.add_pair(start, end, match) + + last_end = end + self.s = tmp + self.s[last_end:] - def repl(self, match): - ret = "" - text = "" - del_code, add_code, rep_code, color_code = match.groups() - if del_code: - return self.span(del_code, "x") - elif add_code: - return self.span(add_code, "i") - elif rep_code: - return self.span(rep_code, "c") - elif color_code: - color_code = re.sub(r'[\+\-\^](.*?)', r'\1', color_code) - return self.span(color_code, "color") - - def span(self, code, cls): - text = html_quote(str(code)) - return '<span class="%s">%s</span>' % (cls, text) + def collect_pairs(self): + pairs = [] + for plugin in self.plugins: + idx_mapping = plugin.idx_mapping + pairs.extend(plugin.pairs) + for pair in pairs: + pair['start'] = idx_mapping[pair['start']] + pair['end'] = idx_mapping[pair['end']] + + def decross_pairs(self): + """去交叉""" + for i_plugin, pair in [(i, pair) + for i, plugin in enumerate(self.plugins) + for pair in plugin.pairs]: + for p, plugin in [(pair2, plugin2) + for plugin2 in self.plugins[:i_plugin] + for pair2 in plugin2.pairs]: + # pair 跟 p 交叉,因为 pair 是后覆盖上去的,p 被分为两部分 + if (p['start'] < pair['start'] + and pair['start'] < p['end'] + and p['end'] < pair['end']): + plugin.pairs.remove(p) + plugin.pairs.append(dict(start=p['start'], + end=pair['start'], + left_html=p['left_html'], + right_html=p['right_html'])) + plugin.pairs.append(dict(start=pair['start'], + end=p['end'], + left_html=p['left_html'], + right_html=p['right_html'])) + elif (pair['start'] < p['start'] + and p['start'] < pair['end'] + and pair['end'] < p['end']): + plugin.pairs.remove(p) + plugin.pairs.append(dict(start=p['start'], + end=pair['end'], + left_html=p['left_html'], + right_html=p['right_html'])) + plugin.pairs.append(dict(start=pair['end'], + end=p['end'], + left_html=p['left_html'], + right_html=p['right_html'])) + + def merge_pairs(self): + left_html_by_idx = {} + right_html_by_idx = {} + for plugin in self.plugins: + for pair in plugin.pairs: + start = pair['start'] + end = pair['end'] + left_html = pair['left_html'] + right_html = pair['right_html'] + left_html_by_idx[start] = (left_html + left_html_by_idx[start] + if start in left_html_by_idx + else left_html) + right_html_by_idx[end] = (right_html_by_idx[end] + right_html + if end in right_html_by_idx + else right_html) + html_by_idx = {} + for i, left_html in left_html_by_idx.items(): + if i in right_html_by_idx: + right_html = right_html_by_idx[i] + html_by_idx[i] = right_html + left_html + html_by_idx.update({k: v for k, v in left_html_by_idx.iteritems() + if k not in html_by_idx}) + html_by_idx.update({k: v for k, v in right_html_by_idx.iteritems() + if k not in html_by_idx}) + return html_by_idx def __call__(self, s): if not s: return '' - self.s = s - r = "" - b = 0 - e = 0 - for i in SEQUENCE_RE.finditer(s): - b, e1 = i.span() - r += html_quote(str(s[e:b])) - r += self.repl(i) - e = e1 - r += html_quote(str(s[e:])) - return r - -linehtml = LineHtml() + self.s = str(s) + + self.run_plugins() + self.collect_pairs() + self.decross_pairs() + html_by_idx = self.merge_pairs() + + parts = [] + last_end = 0 + for i in sorted(html_by_idx): + html = html_by_idx[i] + parts.append(html_quote(self.s[last_end:i])) + parts.append(html) + last_end = i + + parts.append(html_quote(self.s[last_end:])) + self.s = ''.join(parts) + + return self.s + +linehtml = LineHtml(plugins=[ + LineHtmlPlugin('del_code', + re.compile(ur'\x00\-(.*?)\x01', re.UNICODE + re.DOTALL), + '<span class="d">', '</span>', + left_trim=u'\x00-', right_trim=u'\x01'), + LineHtmlPlugin('add_code', + re.compile(ur'\x00\+(.*?)\x01', re.UNICODE + re.DOTALL), + '<span class="i">', '</span>', + left_trim=u'\x00+', right_trim=u'\x01'), + LineHtmlPlugin('rep_code', + re.compile(ur'\x00\^(.*?)\x01', re.UNICODE + re.DOTALL), + '<span class="c">', '</span>', + left_trim=u'\x00^', right_trim=u'\x01'), + LineHtmlPlugin('color_code', + re.compile(ur'#[A-Fa-f0-9]{3,6}', re.UNICODE), + lambda match: ('<span class="color" data-color="%s">' + % match.group(0)), + '</span>'), +]) diff --git a/vilya/libs/emoji.py b/vilya/libs/emoji.py new file mode 100644 index 0000000..18825e5 --- /dev/null +++ b/vilya/libs/emoji.py @@ -0,0 +1,177 @@ +#!/usr/bin/env python +# coding=utf-8 +import re +import os +from cgi import escape + +EMOJIS = [ + ':Aquarius:', ':two_women_in_love:', ':bus_stop:', ':speak_no_evil_monkey:', + ':chicken:', ':heart_eyes:', ':Scorpius:', ':smiley_confused:', + ':cat_face_with_wry_smile:', ':GAKUEngine:', ':pistol:', ':relieved:', + ':wink:', ':grimacing:', ':rainbow_solid:', ':blowfish:', + ':kissing_smiling_eyes:', ':tropical_drink:', ':face_with_medical_mask:', + ':pill:', ':ruby:', ':cactus:', ':smiley_stuck_out_tongue_winking_eye:', + ':boar:', ':smile:', ':face_with_tear_of_joy:', ':Cancer:', + ':couple_in_love:', ':horse:', ':two_men_with_heart:', ':bowtie:', + ':open_mouth:', ':frog_face:', ':Taurus:', ':octopus:', ':ship:', + ':shooting_star:', ':face_with_ok_gesture:', ':wolf_face:', ':heart:', + ':loudly_crying_face:', ':frowning:', ':scuba_diver:', ':love_hotel:', + ':gentleman_octopus:', ':grinning_cat_face_with_smiling_eyes:', + ':face_savouring_delicious_food:', ':rainbow:', ':mount_fuji:', + ':victory_hand:', ':glowing_star:', ':ksroom:', ':beer_mug:', ':sweat:', + ':hushed:', ':Pisces:', ':Capricorn:', ':stuck_out_tongue_winking_eye:', + ':tennis_racquet_and_ball:', ':person_frowning:', ':spouting_whale:', + ':tangerine:', ':person_bowing_deeply:', ':stuck_out_tongue_closed_eyes:', + ':dog_face:', ':circled_ideograph_secret:', ':Libra:', ':jumping_spider:', + ':disappointed_face:', ':hamburger:', ':octocat:', ':sleeping:', + ':crescent_moon:', ':no_one_under_eighteen_symbol:', ':kissing:', + ':unamused:', ':couple_with_heart:', ':fisted_hand_sign:', + ':smiling_cat_face_with_heart_shaped_eyes:', ':anguished:', ':groupme:', + ':expressionless:', ':phone_book:', ':full_moon:', ':bactrian_camel:', + ':snowboarder:', ':microphone:', ':Gemini:', ':fearful_face:', + ':pensive_face:', ':jack_o_lantern:', ':Aries:', ':palm_pre3:', + ':speech_balloon:', ':koala:', ':poop:', ':quoll:', ':kissing_closed_eyes:', + ':thumbs_up_sign:', ':person_with_folded_hands:', ':puke_finger:', + ':Giorgio:', ':princess:', ':waxing_gibbous_moon:', ':two_men_in_love:', + ':happijar:', ':guitar:', ':sun_with_face:', ':RV:', ':cloud:', + ':grinning:', ':genshin:', ':Sagittarius:', + ':disappointed_but_relieved_face:', ':paw_prints:', ':rice_ball:', + ':anchor:', ':smirk:', ':pegasus_black:', ':lgtm:', ':persevering_face:', + ':elephant:', ':face_with_no_good_gesture:', ':snake:', ':wink2:', + ':pizza:', ':white_smiling_face:', ':Leo:', ':sunrise_over_mountains:', + ':monster:', ':relaxed:', ':grin:', ':laughing:', ':car:', ':cake:', + ':Kagetsuki:', ':ninja:', ':siamese_kitten:', ':weary_face:', ':ghost:', + ':milky_way:', ':penguin:', ':drunk:', ':crying_cat_face:', ':dancer:', + ':snail:', ':person_raising_both_hands_in_celebration:', ':smiley:', + ':penguin_chick:', ':video_game:', ':flushed:', ':shit:', ':worried:', + ':cyclone:', ':DSLR_click:', ':jumping_spider_red:', ':ocean_dive_view:', + ':astonished_face:', ':happy_person_raising_one_hand:', ':bgok:', + ':family:', ':smiley_smile:', ':wheelchair:', ':Happy_FMC:', + ':smiley_kissing_heart:', ':hatching_chick:', ':hear_no_evil_monkey:', + ':Virgo:', ':skull:', ':two_women_holding_hands:', ':assault_rifle:', + ':pouting_face:', ':high_hopes:', ':angry_face:' +] + +EMOJIONE = [ + ':2714:', ':2716:', ':274C:', ':274E:', ':2753:', ':2754:', ':2755:', + ':2757:', ':2764:', ':303D:', ':1F401:', ':1F402:', ':1F403:', ':1F404:', + ':1F405:', ':1F406:', ':1F407:', ':1F409:', ':1F410:', ':1F411:', + ':1F412:', ':1F413:', ':1F414:', ':1F415:', ':1F417:', ':1F418:', + ':1F419:', ':1F420:', ':1F421:', ':1F422:', ':1F423:', ':1F425:', + ':1F426:', ':1F427:', ':1F428:', ':1F429:', ':1F430:', ':1F431:', + ':1F433:', ':1F434:', ':1F435:', ':1F436:', ':1F437:', ':1F438:', + ':1F439:', ':1F493:', ':1F494:', ':1F495:', ':1F496:', ':1F497:', + ':1F498:', ':1F499:', ':1F590:', ':1F591:', ':1F592:', ':1F593:', + ':1F594:', ':1F595:', ':1F596:', ':1F598:', ':1F599:', ':1F59E:', + ':1F59F:', ':1F600:', ':1F601:', ':1F602:', ':1F604:', ':1F605:', + ':1F606:', ':1F607:', ':1F608:', ':1F609:', ':1F60A:', ':1F60C:', + ':1F60D:', ':1F60E:', ':1F60F:', ':1F610:', ':1F611:', ':1F612:', + ':1F614:', ':1F615:', ':1F616:', ':1F617:', ':1F618:', ':1F619:', + ':1F61A:', ':1F61C:', ':1F61D:', ':1F61E:', ':1F61F:', ':1F620:', + ':1F621:', ':1F622:', ':1F624:', ':1F625:', ':1F626:', ':1F627:', + ':1F628:', ':1F629:', ':1F62A:', ':1F62C:', ':1F62D:', ':1F62E:', + ':1F62F:', ':1F630:', ':1F631:', ':1F632:', ':1F634:', ':1F635:', + ':1F636:', ':1F637:', ':1F638:', ':1F639:', ':1F63A:', ':1F63C:', + ':1F63D:', ':1F63E:', ':1F63F:', ':1F640:', ':1F641:', ':1F642:', + ':1F646:', ':1F647:', ':1F648:', ':1F649:', ':1F64A:', ':1F64B:', + ':1F64C:', ':2049:', ':261D:', ':263A:', ':2705:', ':270A:', ':270B:', + ':270C:', ':270F:', ':2716:', ':274C:', ':274E:', ':2753:', ':2754:', + ':2755:', ':2757:', ':2764:' +] + +TWEMOJI = [ + ':1f400:', ':1f401:', ':1f402:', ':1f403:', ':1f404:', ':1f405:', + ':1f406:', ':1f407:', ':1f408:', ':1f409:', ':1f410:', ':1f411:', + ':1f412:', ':1f413:', ':1f414:', ':1f415:', ':1f416:', ':1f417:', + ':1f418:', ':1f419:', ':1f420:', ':1f421:', ':1f422:', ':1f423:', + ':1f424:', ':1f425:', ':1f426:', ':1f427:', ':1f428:', ':1f429:', + ':1f430:', ':1f431:', ':1f432:', ':1f433:', ':1f434:', ':1f435:', + ':1f436:', ':1f437:', ':1f438:', ':1f439:', ':1f440:', ':1f445:', + ':1f446:', ':1f447:', ':1f448:', ':1f449:', ':1f450:', ':1f600:', + ':1f601:', ':1f602:', ':1f603:', ':1f604:', ':1f605:', ':1f606:', + ':1f607:', ':1f608:', ':1f609:', ':1f60a:', ':1f60b:', ':1f60c:', + ':1f60d:', ':1f60e:', ':1f60f:', ':1f610:', ':1f611:', ':1f612:', + ':1f613:', ':1f614:', ':1f615:', ':1f616:', ':1f617:', ':1f618:', + ':1f619:', ':1f61a:', ':1f61b:', ':1f61c:', ':1f61d:', ':1f61e:', + ':1f61f:', ':1f620:', ':1f621:', ':1f622:', ':1f623:', ':1f624:', + ':1f625:', ':1f626:', ':1f627:', ':1f628:', ':1f629:', ':1f62a:', + ':1f62b:', ':1f62c:', ':1f62d:', ':1f62e:', ':1f62f:', ':1f630:', + ':1f631:', ':1f632:', ':1f633:', ':1f634:', ':1f635:', ':1f636:', + ':1f637:', ':1f638:', ':1f639:', ':1f63a:', ':1f63b:', ':1f63c:', + ':1f63d:', ':1f63e:', ':1f63f:', ':1f640:', ':1f645:', ':1f646:', + ':1f647:', ':1f648:', ':1f649:', ':1f64a:', ':1f64f:', ':1f680:', + ':1f681:', ':1f682:' +] + +EMOJI_GROUPS = {} + + +def parse_emoji_groups(text): + groups = set(RE_EMOJI_GROUPS.findall(text)) + for group in groups: + group_text = EMOJI_GROUPS[group] + group_text = group_text.replace(' ', ' ') + group_text = group_text.replace('\n', "<br/>") + text = text.replace(group, group_text) + return text + + +def parse_emoji(text, is_escape=True): + if not text: + return '' + if is_escape: + text = escape(text) + text = parse_emoji_groups(text) + if RE_EMOJI_ONLY.match(text.strip()): + quick_emoji = True + emoji_img = '<img src="/static/emoji/%s.png" align="absmiddle"/>' + else: + quick_emoji = False + emoji_img = '<img src="/static/emoji/%s.png" height="20" width="20" align="absmiddle"/>' + + def translate_emoji(x): + text = x.group() + line_emoji_img = '<img src="/static/emoji/%s.png" height="48" width="48" align="absmiddle"/>' + if not quick_emoji and RE_EMOJI_LINE.match(text): + return line_emoji_img % text.strip(':') + return emoji_img % text.strip(':') + + result = RE_EMOJI.sub(translate_emoji, text) + return result + + +def all_emojis(): + curdir = os.path.abspath(os.path.curdir) + emoji_dir = os.path.join(curdir, 'hub/static/emoji/') + if os.path.isdir(emoji_dir): + files = os.listdir(emoji_dir) + else: + realpath = os.path.dirname(os.path.realpath(__file__)) + curdir = os.path.join(realpath, os.path.pardir, 'hub/static/emoji') + curdir = os.path.abspath(curdir) + if os.path.isdir(curdir): + files = os.listdir(emoji_dir) + else: + return EMOJIS + if files: + return [':{}:'.format(fn[:-4]) for fn in files if fn.endswith('.png')] + else: + return EMOJIS + + +def url_for_emoji(emoji): + return '/static/emoji/%s.png' % emoji[1:-1] + + +def all_line_emojis(): + return sum([EMOJIONE, TWEMOJI], []) + + +RE_EMOJI = re.compile(r'(' + '|'.join( + [re.escape(x) for x in all_emojis()]) + r')') +RE_EMOJI_ONLY = re.compile(r'^<p>\s*(' + '|'.join( + [re.escape(x) for x in all_emojis()]) + r')\s*</p>$') +RE_EMOJI_GROUPS = re.compile('|'.join( + [re.escape(x) for x in EMOJI_GROUPS.keys()])) +RE_EMOJI_LINE = re.compile(r'(' + '|'.join( + [re.escape(x) for x in all_line_emojis()]) + r')') diff --git a/vilya/libs/generated.py b/vilya/libs/generated.py index d23c092..35b74d5 100644 --- a/vilya/libs/generated.py +++ b/vilya/libs/generated.py @@ -2,15 +2,11 @@ import re from os.path import splitext +from vilya.libs.consts import IS_GENERATED, MINIFIED -IS_GENERATED = ('.xib', - '.nib', - '.storyboard', - '.pbxproj', - '.xcworkspacedata', - '.xcuserstate') -MINIFIED = ('.min.js', - '.min.css') +PEG_REGEX = re.compile( + '^(?:[^\/]|\/[^\*])*\/\*(?:[^\*]|\*[^\/])*Generated by PEG.js', re.DOTALL) +GENERATED_REGEX = re.compile('^\/\/ Generated by ', re.DOTALL) class Generated(object): @@ -42,8 +38,8 @@ def _is_generated(self): or self.is_minified_javascript \ or self.is_compiled_coffeescript \ or self.is_xcode_project_file - #or self.is_generated_net_docfile \ - #or self.is_generated_parser + # or self.is_generated_net_docfile \ + # or self.is_generated_parser @property def is_xcode_project_file(self): @@ -94,7 +90,7 @@ def is_compiled_coffeescript(self): # CoffeeScript generated by > 1.2 include a comment on the first line if len(lines) > 0 \ - and re.compile('^\/\/ Generated by ', re.DOTALL).search(lines[0]): + and GENERATED_REGEX.search(lines[0]): return True if len(lines) < 3: @@ -118,7 +114,8 @@ def is_compiled_coffeescript(self): '(_fn|_i|_len|_ref|_results)', line) # bind and extend functions are very Coffee specific - score += 3 * count_keys('(__bind|__extends|__hasProp|__indexOf|__slice)', line) + score += 3 * count_keys( + '(__bind|__extends|__hasProp|__indexOf|__slice)', line) return score > 3 return False @@ -130,8 +127,8 @@ def is_generated_net_docfile(self): .NET developers often check in the XML Intellisense file along with an assembly - however, these don't have a special extension, so we have to - dig into the contents to determine if it's a docfile. Luckily, these files - are extremely structured, so recognizing them is easy. + dig into the contents to determine if it's a docfile. Luckily, these + files are extremely structured, so recognizing them is easy. Returns True or False return false unless extname.downcase == ".xml" @@ -168,6 +165,6 @@ def is_generated_parser(self): if len(lines) < 5: return False - if re.compile('^(?:[^\/]|\/[^\*])*\/\*(?:[^\*]|\*[^\/])*Generated by PEG.js', re.DOTALL).search(''.join(lines[0:5])): + if PEG_REGEX.search(''.join(lines[0:5])): return True return False diff --git a/vilya/libs/git2.py b/vilya/libs/git2.py new file mode 100644 index 0000000..c9d9309 --- /dev/null +++ b/vilya/libs/git2.py @@ -0,0 +1,540 @@ +# -*- coding: utf-8 -*- +import os +from datetime import datetime +from pygit2 import ( + Repository, + clone_repository, init_repository, + GIT_OBJ_COMMIT, GIT_OBJ_TREE, + GIT_OBJ_BLOB, GIT_OBJ_TAG, + GIT_REF_OID, GIT_REF_SYMBOLIC, + GIT_SORT_TIME, GIT_SORT_REVERSE, + GIT_DIFF_REVERSE, +) +from pytz import FixedOffset + + +PYGIT2_OBJ_TYPE = { + GIT_OBJ_COMMIT: 'commit', + GIT_OBJ_BLOB: 'blob', + GIT_OBJ_TREE: 'tree', + GIT_OBJ_TAG: 'tag', +} + + +def format_pygit2_signature(signature): + d = {} + d['date'] = datetime.fromtimestamp( + signature.time, + # FIXME: add offset for app. + # FixedOffset(signature.offset, None) + ) + d['name'] = signature.name + d['email'] = signature.email + # strftime('%Y-%m-%dT%H:%M:%S+0800') + d['ts'] = str(signature.time) + d['tz'] = datetime.fromtimestamp(signature.time, + FixedOffset(signature.offset) + ).strftime('%z') + return d + + +def foreach_pygit2_config(key, name, lst): + lst[key] = name + return 0 + + +def format_pygit2_object_type(type): + if type in PYGIT2_OBJ_TYPE: + return PYGIT2_OBJ_TYPE[type] + return '' + + +def format_short_reference_name(name): + short = '' + if name.startswith('refs/heads/'): + short = name[11:] + elif name.startswith('refs/remotes/'): + short = name[13:] + elif name.startswith('refs/tags/'): + short = name[10:] + elif name.startswith('refs/'): + short = name[5:] + else: + return name + return short + + +def complete_reference_name(name): + if name.startswith('refs/'): + return name + prefixs = ['refs/heads/', 'refs/remotes/', 'refs/tags/', 'refs/'] + refs = ['%s%s' % (p, name) for p in prefixs] + return refs + + +# FIXME: dog slow +# DO NOT USE THIS +def clone(url, path, bare=False, branch=None): + url = url[:-1] if url.endswith('/') else url + repo = clone_repository(url, path, bare=bare, checkout_branch=branch) + # update-server-info if bare + return repo + + +class Git2(Repository): + + # support: <ref> <newvalue>, -d <ref> <newvalue> + # FIXME: args 'delete' is not tested. + def update_ref(self, ref, newvalue, delete=False): + if self.is_empty: + return False + if delete: + repo_ref = self.lookup_reference(ref) + target = repo_ref.target + if repo_ref.type == GIT_REF_OID: + commit = self.revparse_single(newvalue) + if target.hex == commit.hex: + repo_ref.delete() + return True + elif repo_ref.type == GIT_REF_SYMBOLIC: + if target == newvalue: + repo_ref.delete() + return True + return False + + try: + commit = self.revparse_single(newvalue) + except KeyError: + return False + + try: + repo_ref = self.lookup_reference(ref) + except KeyError: + self.create_reference(ref, commit.hex) + return True + + try: + if repo_ref.type == GIT_REF_OID: + if commit.type == GIT_OBJ_COMMIT: + repo_ref.target = commit.hex + elif repo_ref.type == GIT_REF_SYMBOLIC: + repo_new = self.lookup_reference(newvalue) + repo_ref.target = repo_new.name + except OSError: + return False + + return True + + # support: -- paths, --max-count, --skip, --author + def rev_list(self, to_ref, from_ref=None, + paths=None, skip=0, max_count=0, + author=None, query=None): + if self.is_empty: + return [] + if not to_ref: + return [] + commits_index_list = [] + commits_dict = {} + to_commit = self.revparse_single(to_ref) + if to_commit.type == GIT_OBJ_TAG: + to_commit = self[to_commit.target] + walker = self.walk(to_commit.id, GIT_SORT_TIME) + if from_ref: + try: + from_commit = self.revparse_single(from_ref) + if from_commit.type == GIT_OBJ_TAG: + from_commit = self[from_commit.target] + walker.hide(from_commit.id) + except KeyError: + from_commit = None + + def check_query(commit, query): + if query and query in commit.message: + return True + elif not query: + return True + + def check_author(commit, author): + if author and commit.author.name == author: + return True + elif author and commit.author.email == author: + return True + elif not author: + return True + + def check_paths(tree, paths): + try: + entry = tree[paths] + except KeyError: + return None + return entry + + # FIXME: add quick diff + def check_file_change(commit, paths): + commit_tree = commit.tree + parents = commit.parents + if paths and check_paths(commit_tree, paths): + count = 0 + c_entry = commit_tree[paths] + for p in parents: + parent_tree = p.tree + if commit_tree.id == parent_tree.id: + return False + p_entry = check_paths(parent_tree, paths) + if not p_entry: + count += 1 + continue + if p_entry.id != c_entry.id: + count += 1 + if count == len(parents): + return True + elif not paths: + return True + + if max_count: + length = max_count + skip if skip else max_count + else: + length = 0 + for c in walker: + if all([check_author(c, author), + check_file_change(c, paths), + check_query(c, query)]): + index = c.hex + if index not in commits_index_list: + commits_index_list.append(index) + commits_dict[index] = c + if length and len(commits_index_list) > length: + break + if skip: + commits_index_list = commits_index_list[skip:] + return [commits_dict[i] for i in commits_index_list] + + def for_each_ref(self, pattern='', format=[]): + """ support format: refname, objectname, objecttype, tree """ + rs = [] + refs = self.listall_references() + if pattern: + if pattern in refs: + refs = [pattern] + else: + refs = [r for r in refs + if r.startswith(pattern) + and (len(r) > len(pattern) + and (r[len(pattern) - 1] == '/' + or r[len(pattern)] == '/'))] + else: + refs = list(refs) + refs.sort() + for ref in refs: + r = {} + ref_obj = self.lookup_reference(ref) + target = self[ref_obj.target] + if not format or 'objectname' in format: + r['sha'] = target.hex + if not format or 'objecttype' in format: + r['type'] = format_pygit2_object_type(target.type) + if not format or 'tree' in format: + r['tree'] = target.tree.hex + if not format or 'refname:short' in format: + r['shortname'] = format_short_reference_name(ref) + if not format or 'refname' in format: + r['name'] = ref + rs.append(r) + return rs + + # FIXME + def show(self, reference, path=None): + try: + obj = self.revparse_single(reference) + if obj.type == GIT_OBJ_BLOB: + return obj.data + except KeyError: + pass + return '' + + # FIXME: dog slow + # DO NOT USE THIS + def clone(self, url, path, bare=False, branch=None): + #url = self.path[:-1] if self.path.endswith('/') else self.path + url = url[:-1] if url.endswith('/') else url + repo = clone_repository(url, path, bare=bare, checkout_branch=branch) + # update-server-info if bare + return repo + + def init(self, bare=None): + repo = init_repository(self.path, bare=bare) + return repo + + # FIXME + def fetch(self): + for remote in self.remotes: + remote.fetch() + + def update_server_info(self): + return + + def update_info_refs(self): + return + + def update_info_packs(self): + return + + # FIXME + def add_remote(self, name, url): + self.create_remote(name, url) + + # FIXME + def ref_log(self): + head = self.lookup_reference('refs/heads/master') + for entry in head.log(): + print(entry.message) + + def log(self, reference='HEAD', from_ref=None, shortstat=None, + no_merges=None, reverse=None): + sha = self._resolve_version(reference) + + sort = GIT_SORT_TIME + if reverse is True: + sort |= GIT_SORT_REVERSE + + commits = [] + walker = self.walk(sha, sort) + if from_ref: + from_sha = self._resolve_version(from_ref) + if not from_sha: + return commits + walker.hide(from_sha) + + for commit in walker: + _commit = {} + if no_merges: + parents = commit.parents + if parents and len(parents) > 1: + continue + + if shortstat: + parents = commit.parents + if len(parents) == 0: + opt = GIT_DIFF_REVERSE + diff = commit.tree.diff(flags=opt, empty_tree=True) + else: + parent = parents[0] + diff = parent.tree.diff(commit.tree) + patches = [p for p in diff] + additions = 0 + deletions = 0 + changed_files = len(patches) + for p in patches: + additions += p.additions + deletions += p.deletions + _commit['additions'] = additions + _commit['deletions'] = deletions + _commit['files'] = changed_files + + _commit['sha'] = commit.hex + _commit['author_time'] = commit.author.time + _commit['committer_time'] = commit.committer.time + _commit['author_name'] = commit.author.name + _commit['author_email'] = commit.author.email + commits.append(_commit) + return commits + + def hash_object(self, path, type='blob'): + oid = self.create_blob_fromdisk(path) + hex = self[oid].hex + return hex + + def update_index(self, path): + self.index.add(path) + + def rm_cache(self, path): + self.index.remove(path) + + def read_tree(self, path): + self.index.read_tree() + + def write_tree(self): + self.index.write_tree() + + def diff_tree(self, to_ref, from_ref=None): + to_sha = self._resolve_version(to_ref) + to_commit = self[to_sha] + if from_ref: + from_sha = self._resolve_version(from_ref) + from_commit = self[from_sha] + diff = from_commit.tree.diff(to_commit.tree) + return diff.patch + parents = to_commit.parents + if parents: + from_commit = parents[0] + diff = from_commit.tree.diff(to_commit.tree) + return diff.patch + opt = GIT_DIFF_REVERSE + diff = to_commit.tree.diff(flags=opt, empty_tree=True) + return diff.patch + + def cat_file(self, sha, type='blob'): + blob = self[sha] + return blob.data + + def ls_tree(self, ref, recursive=None, size=None, name_only=None): + obj = self.revparse_single(ref) + if obj.type == GIT_OBJ_TREE: + tree_obj = obj + else: + tree_obj = obj.tree + walker = self._walk_tree(tree_obj) + tree_list = [] + for index, (entry, path) in enumerate(walker): + mode = '%06o' % entry.filemode + if mode == '160000': + objtype = 'commit' # For git submodules + elif mode == '040000': + objtype = 'tree' + else: + objtype = 'blob' + path = "%s/%s" % (path, entry.name) if path else entry.name + + if recursive: + if objtype == 'tree': + _tree = self[entry.id] + _tree_list = self._walk_tree(_tree, path) + for _index, _entry in enumerate(_tree_list): + walker.insert(index + _index + 1, _entry) + continue + + if name_only: + tree_list.append(path) + continue + + item = [mode, objtype, entry.hex, path] + + if size: + if objtype == 'blob': + blob = self[entry.id] + item = [mode, objtype, entry.hex, blob.size, path] + else: + item = [mode, objtype, entry.hex, '-', path] + + tree_list.append(item) + return tree_list + + def _walk_tree(self, tree, path=None): + _list = [] + for entry in tree: + _list.append((entry, path)) + return _list + + # version: tag, ref, sha + def _resolve_version(self, version): + if len(version) == 40: + return version + try: + obj = self.revparse_single(version) + if obj.type == GIT_OBJ_TAG: + commit = self[obj.target] + elif obj.type == GIT_OBJ_COMMIT: + commit = obj + elif obj.type == GIT_OBJ_BLOB: + return None + elif obj.type == GIT_OBJ_TREE: + return None + except KeyError: + return None + return commit.hex + + @classmethod + def is_git_dir(cls, d): + """ This is taken from the git setup.c:is_git_directory + function.""" + isdir = os.path.isdir + join = os.path.join + if isdir(d) and isdir(join(d, 'objects')) and isdir(join(d, 'refs')): + headref = join(d, 'HEAD') + return os.path.isfile(headref) or ( + os.path.islink(headref) and os.readlink(headref).startswith('refs')) + return False + + # FIXME: UT Segmentation Fault + def list_config(self): + config = self.config + lst = {} + config.foreach(foreach_pygit2_config, lst) + return lst + + # FIXME: UT Segmentation Fault + def get_config(self, key): + config = self.config + if key in config: + return config[key] + + # FIXME + def list_branch(self): + return + + # FIXME + def list_tag(self): + return + + # FIXME + def get_commit(self): + return + + def get_ref(self, ref): + r = {} + ref_obj = self.lookup_reference(ref) + target = self[ref_obj.target] + r['sha'] = target.hex + r['type'] = format_pygit2_object_type(target.type) + r['tree'] = target.tree.hex + r['shortname'] = format_short_reference_name(ref) + r['name'] = ref + return r + + # legency + def cat_commit(self, sha, commit): + d = {} + d['parent'] = [p.hex for p in commit.parents] if commit.parents else [] + d['tree'] = commit.tree.hex + d['committer'] = format_pygit2_signature(commit.committer) + d['author'] = format_pygit2_signature(commit.author) + d['message'], _, d['body'] = commit.message.strip().partition('\n\n') + d['sha'] = commit.hex + return d + + # legency + def cat_tag(self, sha, tag): + d = {} + d['name'] = tag.name + d['tag'] = tag.name + d['object'] = tag.target.hex + d['type'] = format_pygit2_object_type(self[tag.target].type) + d['tagger'] = format_pygit2_signature(tag.tagger) + d['message'], _, d['body'] = tag.message.strip().partition('\n\n') + d['sha'] = tag.hex + return d + + # legency + def cat_blob(self, sha, blob): + return blob.data + + # legency + def cat_tree(self, sha, tree): + res = [] + for entry in tree: + mode = '%06o' % entry.filemode + # FIXME: use pygit2 object + if mode == '160000': + objtype = 'commit' # For git submodules + elif mode == '040000': + objtype = 'tree' + else: + objtype = 'blob' + r = { + 'sha': entry.hex, + 'mode': mode, + 'type': objtype, + 'path': entry.name + } + res.append(r) + return res diff --git a/vilya/libs/gyt.py b/vilya/libs/gyt.py new file mode 100644 index 0000000..ae2c4bb --- /dev/null +++ b/vilya/libs/gyt.py @@ -0,0 +1,675 @@ +# coding=utf-8 + +import os +import shlex +import re +import subprocess +import logging +import collections +from os.path import splitext +from pygit2 import ( + GIT_OBJ_COMMIT, GIT_OBJ_TREE, + GIT_OBJ_BLOB, GIT_OBJ_TAG, + GIT_SORT_TIME, GIT_DIFF_IGNORE_WHITESPACE +) + +from vilya.libs.git2 import Git2 +from vilya.libs.generated import Generated +from vilya.libs.consts import IS_GENERATED, NOT_GENERATED, IGNORE_FILE_EXTS, MINIFIED + +logger = logging.getLogger(__name__) +logger.setLevel(logging.DEBUG) + +GIT_EXECUTABLE = 'git' +GIT_DIR_DEFAULT = '.git' +GIT_MIN_VERSION = '1.7.10' +HEADER = re.compile(r"""^diff[ ]--git[ ]a/(?P<a_path>.+)[ ]b/(?P<b_path>.+)""") + +# plumbing git command: +# apply checkout-index commit-tree hash-object index-pack merge-file merge-index mktag mktree pack-objects +# prune-packed read-tree symbolic-ref unpack-objects update-index update-ref write-tree cat-file diff-files +# diff-index diff-tree for-each-ref ls-files ls-remote ls-tree merge-base name-rev pack-redundant rev-list +# show-index show-ref tar-tree unpack-file var verify-pack daemon fetch-pack http-backend send-pack +# update-server-info http-fetch http-push parse-remote receive-pack shell upload-archive upload-pack +# check-attr check-ref-format fmt-merge-msg mailinfo mailsplit merge-one-file patch-id peek-remote sh-setup +# stripspace +# +# porcelain git commands: +# add am archive bisect branch bundle checkout cherry-pick citool clean clone commit describe diff fetch format-patch +# gc grep gui init log merge mv notes pull push rebase reset revert rm shortlog show stash status submodule tag config +# fast-export fast-import filter-branch lost-found mergetool pack-refs prune reflog relink remote repack replace repo-config +# annotate blame cherry count-objects difftool fsck get-tar-commit-id help instaweb merge-tree rerere rev-parse show-branch +# verify-tag whatchanged archimport cvsexportcommit cvsimport cvsserver +# imap-send quiltimport request-pull send-email svn + +isa = isinstance + +OBJ_TYPE = { + GIT_OBJ_COMMIT: 'commit', + GIT_OBJ_BLOB: 'blob', + GIT_OBJ_TREE: 'tree', + GIT_OBJ_TAG: 'tag', +} + + +class GytError(Exception): + pass + + +class GytRepoNotInited(GytError): + pass + + +def shlex_split_utf8(cmd): + # shlex don't accept unicode if python < 2.7.3 + if isa(cmd, basestring): + cmd = [s.decode('utf-8') for s in shlex.split(cmd.encode('utf-8'))] + elif not isa(cmd, collections.Iterable): + cmd = [cmd] + return cmd + + +class _Repo(object): + def __init__(self, path, work_tree=None, bare=None): + git_dir, work_tree, bare = _massage_params(path, work_tree, bare) + assert is_git_dir(git_dir), "%s must be a git dir" % git_dir + self.git_dir = git_dir + self.work_tree = work_tree + self.repo = Git2(self.git_dir) + + def __repr__(self): + return "_Repo('%s'%s)" % (self.git_dir, + ", '%s'" % self.work_tree if self.work_tree else '') + + def call(self, cmd, _env=None, _raise=True, _raw=False): + cmd = shlex_split_utf8(cmd) + add2cmd = ['--git-dir', self.git_dir] + if self.work_tree: + add2cmd += ['--work-tree', self.work_tree] + return call([GIT_EXECUTABLE] + add2cmd + cmd, _env=_env, _raise=_raise, _raw=_raw) + + def is_bare(self): + return not bool(self.work_tree) + + # FIXME: use pygit2 + def is_empty(self): + is_empty = False + try: + self.repo.revparse_single('HEAD') + except KeyError: + is_empty = True + return is_empty + + def head(self, short=False): + head = self.repo.lookup_reference('HEAD').target + if head and short and head.startswith('refs/'): + head = re.sub('^refs/[^/]*/', '', head) + return head or None + + def sha(self, rev='HEAD'): + if not rev: + return None + try: + sha = self.repo.revparse_single(rev) + except KeyError: + return None + except ValueError: + return None + return sha.hex + + def cat(self, sha, only_type=False): + sha = self.sha(sha) + if not sha: + return False + obj = self.repo.revparse_single(sha) + objtype = obj.type + if only_type: + return OBJ_TYPE.get(objtype) + if objtype == GIT_OBJ_COMMIT: + return self.cat_commit(sha, obj) + elif objtype == GIT_OBJ_TAG: + return self.cat_tag(sha, obj) + elif objtype == GIT_OBJ_TREE: + return self.cat_tree(sha, obj) + elif objtype == GIT_OBJ_BLOB: + return self.cat_blob(sha, obj) + else: + raise NotImplementedError("Object type %s unknown" % objtype) + + def cat_commit(self, sha, obj): + return self.repo.cat_commit(sha, obj) + + def cat_tag(self, sha, obj): + return self.repo.cat_tag(sha, obj) + + def cat_tree(self, sha, obj): + return self.repo.cat_tree(sha, obj) + + def cat_blob(self, sha, obj): + return self.repo.cat_blob(sha, obj) + + def remotes(self): + return self.repo.remotes + + def add_remote(self, name, url): + if name not in [r.name for r in self.remotes()]: + self.repo.create_remote(name, url) + + def add_remote_hub(self, name, url): + self.add_remote('hub/%s' % name, url) + + def fetch_all(self): + self.repo.fetch() + #self.call('fetch --all') + + def fetch_mirror(self, _env=None): + self.call('fetch -q', _env=_env) + + def diff_tree(self, from_ref, to_ref): + text = self.call('diff-tree -p %s %s' % (from_ref, to_ref), _raw=True) + return text + + def format_patch(self, from_ref, to_ref): + text = self.call( + 'format-patch --stdout %s...%s' % (from_ref, to_ref)) + return text + + def format_patch_sha(self, to_ref): + text = self.call( + 'format-patch -1 --stdout %s' % to_ref) + return text + + def diff_numstat(self, from_ref, to_ref): + output = self.call('diff --numstat %s...%s' % + (from_ref, to_ref)) + return output + + def merge(self, ref, msg='automerge', commit_msg='', no_ff=False, _raise=True, _env=None): + cmd = ['merge', ref] + if msg: + cmd.append('-m') + cmd.append(msg) + if commit_msg: + cmd.append('-m') + cmd.append(commit_msg) + if no_ff: + cmd.append('--no-ff') + errcode = self.call(cmd, _raise=_raise, _env=_env) + return errcode + + def push(self, remote, ref): + self.call(['push', remote, ref]) + + def blame(self, ref, path): + res = self.call('blame -p -CM %s -- %s' % (ref, path)) + return res + + def blame_line(self, ref, path, lineno): + res = self.call('blame -L %s,%s --porcelain %s -- %s' % ( + lineno, lineno, ref, path)) + return res + + def refs(self, select='all', short=False, current_first=False): + """List selected refs, either `branches` or `tags` or `all`""" + selects = { + 'all': 'refs/', + 'branches': 'refs/heads', + 'tags': 'refs/tags', + } + assert select in selects, "select must be 'all' (default), 'branches' or 'tags'" + fmt = ['refname:short' if short else 'refname'] + key = 'shortname' if short else 'name' + refs = [] + refs_dict = self.repo.for_each_ref(pattern=selects[select], format=fmt) + for ref in refs_dict: + refs.append(ref[key].decode('utf-8')) + if current_first: + self._move_current_in_first(refs, short) + return refs + + def ref_details(self, ref): + refs = self.repo.get_ref(ref) + return refs if refs else None + + def _move_current_in_first(self, refs, short): + cur = self.head(short) + if cur in refs: + refs.remove(cur) + refs.insert(0, cur) + + # FIXME: remove this. + def update_ref(self, ref, newvalue, msg='', delete=False, log=False): + if log: + cmd = ['-c', 'core.logAllRefUpdates=True', 'update-ref'] + if msg: + cmd.append('-m') + cmd.append('%s' % msg) + cmd.append(ref) + cmd.append(newvalue) + return self.call(cmd) + if delete: + self.call(['update-ref', '-d', ref, newvalue]) + #self.call(['update-ref', '-d', 'refs/heads/%s' % tmp_branch, old_sha]) + return + return self.repo.update_ref(ref, newvalue, delete) + + # FIXME: remove this. + def rev_list(self, to_ref, from_ref=None, + paths=None, skip=0, max_count=0, + author=None, query=None): + return self.repo.rev_list(to_ref, from_ref, paths, skip, max_count, + author, query) + + def rev_walk_shas(self, start, end): + if self.is_empty(): + return [] + + if not end: + return [] + + try: + ender = self.repo.revparse_single(end) + except KeyError: + return [] + + walker = self.repo.walk(ender.id, GIT_SORT_TIME) + + if start: + try: + starter = self.repo.revparse_single(start) + walker.hide(starter.id) + except KeyError: + starter = None + + out = [x.hex for x in walker] + return out + + def logs(self, from_ref=None, to_ref='HEAD', path=None): + try: + lines = self.rev_list(to_ref, from_ref, paths=path) + except KeyError: + return [] + return [self.cat(sha.hex) for sha in lines] + + def config(self, key=None): + # TODO set conf value + conf = dict(c.split('\n', 1) + for c in self.call('config --list --null').split('\0') if c) + return conf.get(key) if key else conf + + def clone(self, to_path, bare=True, branch=None, mirror=None): + clone(self.git_dir, to_path, bare=bare, branch=branch, mirror=mirror) + return repo(to_path, bare=bare) + + def reflog(self, branch): + return self.call(['reflog', '-n1', branch]) + + def rev_parse(self, ref, _raise=True): + return self.call(['rev-parse', ref], _raise=_raise) + + def archive(self, name, _raw=False): + return self.call('archive --prefix=%s/ master' % name, _raw=_raw) + + def update_index(self, sha, name, add=False, remove=False, cacheinfo=False): + cmd = ['update-index'] + if add: + cmd.append('--add') + if remove: + cmd.append('--remove') + if cacheinfo: + cmd.append('--cacheinfo') + cmd.append('100644') + cmd.append(sha) + cmd.append(name) + self.call(cmd) + + def hash_object(self, name): + return self.call(['hash-object', '-w', name]) + + def write_tree(self): + return self.call('write-tree') + + def commit_tree(self, sha, msg, parent=None, env=None): + cmd = ['commit-tree', sha] + if parent: + cmd.append('-p') + cmd.append(parent) + if msg: + cmd.append('-m') + cmd.append('%s' % msg) + return self.call(cmd, _env=env) + + def read_tree(self, ref, _raise=True): + self.call(['read-tree', ref], _raise=_raise) + + def rm(self, name): + self.call(['rm', '--cached', name]) + + def make_diff_params(self, from_ref, to_ref, path, patch, rename_detection, ignore_space): + joiner = '%s..%s' if path else '%s...%s' # TODO explain this + to_sha = self.sha(to_ref) + if from_ref: + from_sha = self.sha(from_ref) + else: + parents = self.cat(to_sha)['parent'] + if parents: + from_sha = parents[0] + else: + # Special case of very first commit: no parent + from_sha = None + params = ['--raw', '-z'] + if patch: + params += ['--patch'] + if rename_detection: + params += ['--find-renames'] + if ignore_space: + params += ['-w'] + if from_sha: + cmd = ['diff'] + params + [joiner % (from_sha, to_sha)] + else: + cmd = ['log', "--pretty=format:", + '--no-abbrev-commit'] + params + [to_sha] + if path: + cmd += ['--', path] + return cmd, from_sha, to_sha + + def diff_file_type(self, changes, patches, from_sha, to_sha): + for i in xrange(len(changes)): + changes[i]['patch'] = patches[i] + name = changes[i]['filename'] + ext_name = splitext(name)[1] + changes[i]['binary'] = False + if ext_name in NOT_GENERATED: + if name.endswith(MINIFIED): + changes[i]['generated'] = True + else: + changes[i]['generated'] = False + elif ext_name in IS_GENERATED: + changes[i]['generated'] = True + elif ext_name in IGNORE_FILE_EXTS: + changes[i]['binary'] = True + changes[i]['generated'] = False + else: + if changes[i]['change'] in ['D', 'C', 'R', 'T']: + cat_ref = from_sha + else: + cat_ref = to_sha + + def _get_data(): + try: + data = self.cat('%s:%s' % ( + cat_ref, name)) + except: # very first commit ?? + data = '' + return data + changes[i]['generated'] = Generated.is_generated( + name, _get_data) + return changes + + def diff(self, from_ref=None, to_ref='HEAD', path=None, patch=True, + parse_patch=True, rename_detection=False, ignore_space=False, + context_lines=3, paths=None): + cmd, from_sha, to_sha = self.make_diff_params(from_ref, to_ref, + path, patch, + rename_detection, + ignore_space) + if not to_sha: + return [] + if from_sha: + ref_cmt1 = self.repo.revparse_single(from_sha) + ref_cmt2 = self.repo.revparse_single(to_sha) + opt = 0 + if ignore_space: + opt += GIT_DIFF_IGNORE_WHITESPACE + kwargs = {'context_lines': context_lines} + if path: + kwargs.update({'paths': [path]}) + if paths: + kwargs.update({'paths': paths}) + diff = ref_cmt1.tree.diff(ref_cmt2.tree, opt, **kwargs) + if rename_detection: + diff.find_similar() + changes = parse_pygit_diff_head(diff) + ps = [p for p in diff] + if not ps: + return [] + if patch: + patches, filenames = parse_raw_diff_patches( + diff.patch, parse_patch) + changes = self.diff_file_type( + changes, patches, from_sha, to_sha) + else: + full_stream = self.call(cmd) + head, _, patches_stream = full_stream.partition('\0\0') + changes = parse_raw_diff_head(head) + if patch: + patches, filenames = parse_raw_diff_patches( + patches_stream, parse_patch) + changes = self.diff_file_type( + changes, patches, from_sha, to_sha) + return changes + + +def repo(path, work_tree=None, bare=None, init=False, _raise=True): + git_dir, work_tree, bare = _massage_params(path, work_tree, bare) + if not os.path.exists(git_dir): + os.makedirs(git_dir) + if init: + assert not is_git_dir(git_dir), "Cannot re-init a git dir" + if bare: + call(GIT_EXECUTABLE, '--git-dir', git_dir, 'init', '--bare') + else: + call(GIT_EXECUTABLE, '--git-dir', + git_dir, '--work-tree', work_tree, 'init') + if not is_git_dir(git_dir): + if _raise: + raise GytRepoNotInited("%s is not a git dir" % git_dir) + else: + return None + return _Repo(git_dir, work_tree, bare) + + +def is_git_dir(path): + # This is memoized, should work if dirs are made git-dirs with git init. + # The memoization will break things if we manually make a git-dir become a non-git-dir + # Which I hope we don't! + if not is_git_dir._memoize.get(path, False): + is_ = Git2.is_git_dir(path) + is_git_dir._memoize[path] = is_ + return is_git_dir._memoize[path] + +is_git_dir._memoize = {} + + +def clear_memoizer(): + # Used in unit tests + is_git_dir._memoize = {} + + +def clone(url, path, bare=False, branch=None, mirror=None, _env=None): + cmd = [GIT_EXECUTABLE, 'clone'] + if branch: + cmd.append('-b') + cmd.append(branch) + if bare: + cmd.append('--bare') + if mirror: + cmd.append('--mirror') + cmd.append(url) + cmd.append(path) + call(cmd, _env=_env) + # FIXME: dog slow + #Git2.clone(url, path, bare=bare, branch=branch) + if bare: + call([GIT_EXECUTABLE, '--git-dir', path, 'update-server-info']) + + +def call(*args, **kwargs): + """System calls with string or list args""" + _raise = kwargs.pop('_raise', True) + _raw = kwargs.pop('_raw', False) + _env = kwargs.pop('_env', {}) + assert not kwargs, "call kwargs not understood in %s" % kwargs + fullcmd = [] + if len(args) == 1: + cmd = args[0] + else: + cmd = args + cmd = shlex_split_utf8(cmd) + # flatten + fullcmd = [] + for el in cmd: + if isa(el, basestring): + fullcmd.append(el) + elif isa(el, collections.Iterable): + fullcmd.extend(el) + else: + fullcmd.append(str(el)) + assert len(fullcmd) >= 1, "Need to pass at least a command" + try: + process = subprocess.Popen(fullcmd, stdout=subprocess.PIPE, + stderr=subprocess.PIPE, env=_env) + except (OSError, TypeError) as err: + logger.error("Unable to open process %s" % fullcmd) + raise err + out, err = process.communicate() + out = str(out) + err = str(err) + # logger.debug("## Returned %s from call %s" % (process.returncode, ' '.join(fullcmd))) + # logger.debug("## Stdout:\n%r" % out) + # logger.debug("## Stderr:\n%r" % err) + if process.returncode == 0: + if _raw: + return out + else: + return unicode(out.strip().decode('utf-8', 'ignore')) + else: + if _raise: + raise GytError(fullcmd, process.returncode, err.strip()) + else: + return False + + +def _massage_params(path, work_tree, bare): + assert not (work_tree and bare is True), "Bare repos cannot have work tree" + if bare is False and not work_tree: + git_dir = os.path.join(path, GIT_DIR_DEFAULT) + work_tree = path + bare = False + elif work_tree: + git_dir = path + work_tree = work_tree + bare = False + else: + git_dir = path + work_tree = work_tree + bare = True + return git_dir, work_tree, bare + + +def parse_raw_diff_head(stream): + i0 = 0 + changes = [] + while True: + i1 = stream.find('\0', i0 + 1) + if i1 == -1: + break + # TODO will break in case of git mv + amode, bmode, asha, bsha, change = stream[i0 + 1:i1].split(' ') + i0 = stream.find('\0', i1 + 1) + if i0 == -1: + i0 = len(stream) + filename = stream[i1 + 1:i0] + if change[0] in ['C', 'R']: + i2 = stream.find('\0', i0 + 1) + if i2 == -1: + i2 = len(stream) + new_filename = stream[i0 + 1:i2] + i0 = i2 + elif change[0] == 'T': + changes.append({'amode': amode, + 'bmode': '', + 'asha': asha, + 'bsha': '', + 'change': change, + 'filename': filename, + 'new_filename': filename}) + changes.append({'amode': '', + 'bmode': bmode, + 'asha': '', + 'bsha': bsha, + 'change': change, + 'filename': filename, + 'new_filename': filename}) + continue + else: + new_filename = '' + changes.append({ + 'amode': amode, + 'bmode': bmode, + 'asha': asha, + 'bsha': bsha, + 'change': change, + 'filename': filename, + 'new_filename': new_filename, + #'patch': self._diff_patch(asha, bsha, change, parse_patch), + }) + return changes + + +def parse_raw_diff_patches(patches, parse_patch): + res = [] + filenames = set() + cur_patch_idx = -1 + cur_chunk_idx = -1 + type_ = {' ': 'idem', '+': 'add', '-': 'rem', '\\': 'other'} + for line in patches.splitlines(): + if line == '': + # see http://onimaru-beta.intra.douban.com/code/group/78925/ + # Could be a problem with windows ^M + continue + if line.startswith('diff'): + match = re.match(HEADER, line) + if match: + a = match.group('a_path') + b = match.group('b_path') + filenames.add(a) + filenames.add(b) + cur_patch_idx += 1 + cur_chunk_idx = -1 + res.append([]) + continue + if line.startswith('@@'): + cur_chunk_idx += 1 + res[cur_patch_idx].append((line, [])) + continue + if cur_chunk_idx < 0 or cur_patch_idx < 0: + continue # Lines before the real patch part + cur_chunk = res[cur_patch_idx][cur_chunk_idx][1] + if parse_patch: + cur_chunk.append((type_.get(line[0], 'ERR'), line[1:])) + else: + cur_chunk.append(line) + return res, filenames + + +def parse_pygit_diff_head(diff): + changes = [] + for patch in diff: + changes.append({ + 'amode': '100644', + 'bmode': '100644', + 'asha': patch.old_oid, + 'bsha': patch.new_oid, + 'change': patch.status, + 'filename': patch.old_file_path, + 'new_filename': patch.new_file_path, + }) + return changes + + +def update_hook(hook_dir, link=False): + subprocess.check_call(['rm', '-r', hook_dir]) + if link: + subprocess.check_call(['ln', '-s', '/var/dae/apps/code/hub/hooks', + hook_dir]) diff --git a/vilya/libs/gzipper.py b/vilya/libs/gzipper.py index b4ead44..f8c82cb 100644 --- a/vilya/libs/gzipper.py +++ b/vilya/libs/gzipper.py @@ -1,8 +1,10 @@ # (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org) -# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php +# Licensed under the MIT license: +# http://www.opensource.org/licenses/mit-license.php # (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org) -# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php +# Licensed under the MIT license: +# http://www.opensource.org/licenses/mit-license.php """ WSGI middleware @@ -17,6 +19,7 @@ except ImportError: from StringIO import StringIO + def header_value(headers, name): name = name.lower() result = [value for header, value in headers @@ -26,6 +29,7 @@ def header_value(headers, name): else: return None + def remove_header(headers, name): name = name.lower() i = 0 @@ -38,9 +42,11 @@ def remove_header(headers, name): i += 1 return result + class GzipOutput(object): pass + class middleware(object): def __init__(self, application, compress_level=6): @@ -60,6 +66,7 @@ def __call__(self, environ, start_response): return response.write() + class GzipResponse(object): def __init__(self, start_response, compress_level): @@ -75,7 +82,7 @@ def gzip_start_response(self, status, headers, exc_info=None): ce = header_value(headers, 'content-encoding') self.compressible = False if ct and (ct.startswith('text/') or ct.startswith('application/')) \ - and 'zip' not in ct: + and 'zip' not in ct: self.compressible = True if ce: self.compressible = False @@ -96,7 +103,7 @@ def write(self): def finish_response(self, app_iter): if self.compressible: output = gzip.GzipFile(mode='wb', compresslevel=self.compress_level, - fileobj=self.buffer) + fileobj=self.buffer) else: output = self.buffer try: @@ -111,6 +118,7 @@ def finish_response(self, app_iter): self.headers.append(('Content-Length', str(content_length))) self.start_response(self.status, self.headers) + def make_gzip_middleware(app, compress_level=6): """ Wrap the middleware, so that it applies gzipping to a response diff --git a/vilya/libs/import_obj.py b/vilya/libs/import_obj.py index b8098f8..09ad09a 100644 --- a/vilya/libs/import_obj.py +++ b/vilya/libs/import_obj.py @@ -1,7 +1,8 @@ -#coding:utf-8 +# coding:utf-8 __import_obj_local__ = {} + class import_obj(object): def __init__(self, key): @@ -44,9 +45,11 @@ def __contains__(self, key): def __nonzero__(self): return bool(self._real) + def import_obj_set(key, value): __import_obj_local__[key].__dict__["_real"] = value + if __name__ == "__main__": c = import_obj("c") import_obj_set("c", "good day") diff --git a/vilya/libs/irc.py b/vilya/libs/irc.py new file mode 100644 index 0000000..253486d --- /dev/null +++ b/vilya/libs/irc.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- +import socket + +from vilya.libs.mq import async +from vilya.config import IRC_SERVER, IRC_PORT + + +def netcat(hostname, port, content): + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.connect((hostname, port)) + s.sendall(content) + s.shutdown(socket.SHUT_WR) + while 1: + data = s.recv(1024) + if data == "": + break + s.close() + + +def _send_message(channel, message): + lines = [] + if isinstance(channel, list): + channel = ','.join(channel) + for line in message.split('\n'): + line = line.strip() + if not line: + continue + lines.append('%s %s' % (channel, line)) + + if lines: + netcat(IRC_SERVER, IRC_PORT, '\n'.join(lines)) + + +@async +def send_message(channel, message): + _c = channel + _m = message + if isinstance(channel, unicode): + _c = channel.encode('utf-8') + if isinstance(message, unicode): + _m = message.encode('utf-8') + + return _send_message(_c, _m) + + +class IrcMsg(object): + def __init__(self, to, msg): + self.to = [to, ] if isinstance(to, basestring) else to + self.msg = msg + + @staticmethod + def irc_receiver_filter(receivers, target): + from vilya.models.user import User + rs = set() + for receiver in receivers: + user = User(receiver) + if user and user.notify_irc(target): + rs.add(receiver) + return rs + + def send(self): + if self.to: + for user in self.to: + send_message(user, self.msg) + + +def notify_by_irc(target_obj, channel, message): + from vilya.models.user import User + user = User(channel) + notify_irc = user.notify_irc(target_obj) if user else None + if notify_irc: + send_message(channel, message) diff --git a/vilya/libs/mail.py b/vilya/libs/mail.py new file mode 100644 index 0000000..1c8b083 --- /dev/null +++ b/vilya/libs/mail.py @@ -0,0 +1,17 @@ +# coding: utf-8 +import smtplib + +from vilya.config import SMTP_SERVER + + +def send_mail(msg): + fromaddr = msg["From"] + toaddrs = [] + if msg['To']: + toaddrs += [addr.strip() for addr in msg["To"].split(',')] + if msg["Cc"]: + toaddrs += [addr.strip() for addr in msg["Cc"].split(',')] + + smtp = smtplib.SMTP(SMTP_SERVER) + smtp.sendmail(fromaddr, toaddrs, msg.as_string()) + smtp.quit() diff --git a/vilya/libs/mailer.py b/vilya/libs/mailer.py new file mode 100644 index 0000000..93efcff --- /dev/null +++ b/vilya/libs/mailer.py @@ -0,0 +1,248 @@ +#!/usr/bin/env python +# encoding: utf-8 + +import re +import logging +logging.getLogger().setLevel(logging.DEBUG) + +from cgi import escape +from email.MIMEText import MIMEText +from email.MIMEMultipart import MIMEMultipart +from email.header import Header + +import misaka +from vilya.libs.template import code_templates +from dae.api.mail import send_mail, InvalidEmailAddress +from vilya.libs.mail import send_mail as send_big_mail +from mako.exceptions import TopLevelLookupException +from vilya.models.user import get_author_by_email, User +from vilya.config import ( + DOMAIN, DEFAULT_NOTIFY_SENDER_ADDR, + CUSTOMIZE_NOTIFY_SENDER_ADDR, TRASH_EMAIL_ADDR) +from vilya.libs.text import RE_USER_MENTION + +RE_HTML_TAG = re.compile(r'<[^>]+>') + + +class _MailHtmlRenderer(misaka.HtmlRenderer): + + def preprocess(self, text): + r = r'\1 [@\2](%s/people/\2/) ' % DOMAIN + return RE_USER_MENTION.sub(r, text) + + def codespan(self, code): + return ' <code style="color:#666;background:#ddd;"> %s </code> ' % code + + def block_code(self, code, language): + return ('<pre style="color:#666; border-left:solid 2px#ccc;padding-left:2px">' + '<code>%s</code></pre>') % escape(code.strip()) + + def header(self, text, level): + html = '\n<span style="margin:0;font-weight:bold">{level}</span> {text}\n' + return html.format(level='#' * level, text=text) + + def image(self, link, title='', alt=''): + alt = alt or title or link + return '<a href="{link}">[img:{alt}]</a>'.format(alt=alt, + link=link) + + def paragraph(self, text): + return '\n%s\n' % text + + def list(self, contents, ordered): + return '\n%s\n' % contents + + def list_item(self, line, ordered): + return '* %s' % line + +_html_renderer = _MailHtmlRenderer(misaka.HTML_HARD_WRAP | + misaka.HTML_SAFELINK | + misaka.HTML_SKIP_STYLE | + misaka.HTML_SKIP_SCRIPT | + misaka.HTML_ESCAPE) + +_mail_md_renderer = misaka.Markdown(_html_renderer, + extensions=misaka.EXT_FENCED_CODE | + misaka.EXT_NO_INTRA_EMPHASIS | + misaka.EXT_AUTOLINK | + misaka.EXT_TABLES | + misaka.EXT_STRIKETHROUGH) + + +class MailDirectContext(): + + def __init__(self, html, text=''): + self._html = html + self._text = text + + def render_html(self): + return self._html + + def render_text(self): + return self._text if self._text else RE_HTML_TAG.sub('', self.html) + + @property + def html(self): + return self.render_html() + + @property + def text(self): + return self.render_text() + + +class MailContext(MailDirectContext): + + def __init__(self, layout, data=None): + try: + self._html_layout = code_templates.get_template( + '/mailer/{}.html'.format(layout)) + except TopLevelLookupException: + self._html_layout = code_templates.get_template('/mailer/_.html') + + try: + self._text_layout = code_templates.get_template( + '/mailer/{}.text'.format(layout)) + except TopLevelLookupException: + self._text_layout = code_templates.get_template('/mailer/_.text'.format(layout)) + + self.data = data if data else {} + if 'self' in self.data: + del self.data['self'] + MailDirectContext.__init__(self, self.html, self.text) + + def render_html(self): + return self._html_layout.render(md_render=_mail_md_renderer.render, + **(self.data)) + + def render_text(self): + return self._text_layout.render(**(self.data)) + + +class Mail(object): + + def __init__(self, subject, to=None, cc=None, from_=DEFAULT_NOTIFY_SENDER_ADDR, + in_reply_to='', message_id=None, context=None, big=None): + self.subject = subject + self.to = [to, ] if isinstance(to, basestring) else to + self.cc = [cc, ] if isinstance(cc, basestring) else cc + self.from_addr = from_ + self.in_reply_to = in_reply_to + self._attachments = [] + self._message_id = message_id + self._context = context + self.big = big + + @property + def context(self): + return self._context + + @context.setter + def context(self, ctx): + if not isinstance(ctx, MailDirectContext): + raise Exception("ValueError: context should be a MailDirectContext instance") + self._context = ctx + + @property + def attachments(self): + return self._attachments + + def attach(self, filename): + self._attachments.append(filename) + + def _process_addrs(self, addrs): + if not addrs: + return [] + rs = [] + for addr in addrs: + if isinstance(addr, basestring): + rs.append(addr) + elif isinstance(addr, list): + rs += self._process_addrs(addr) + return rs + + def generate_msg(self): + msg = MIMEMultipart('related') + msgalt = MIMEMultipart('alternative') + + msg['From'] = self.from_addr + msg['Subject'] = Header(self.subject, 'utf8') + msg['In-Reply-To'] = self.in_reply_to + + to = set(self._process_addrs(self.to)) + cc = set(self._process_addrs(self.cc)) - to + + if not to: + to = [TRASH_EMAIL_ADDR, ] + + if to: + msg['To'] = ', '.join(to) + if cc: + msg['Cc'] = ', '.join(cc) + if self._message_id: + msg['Message-Id'] = self._message_id + + html = self.context.html + text = self.context.text + + msg.attach(msgalt) + msgalt.attach(MIMEText(text, 'plain', 'utf-8')) + msgalt.attach(MIMEText(html, 'html', 'utf-8')) + + for filename in self.attachments: + att = MIMEText(open(filename).read(), 'base64', 'utf8') + att['Content-Type'] = 'application/octet-stream' + attname = '/' in filename and filename[filename.rfind('/') + 1:] or filename + att['Content-Disposition'] = 'attachment; filename="%s"' % attname + msg.attach(att) + + return msg + + def send(self): + msg = self.generate_msg() + if self.big: + send_big_mail(msg) + else: + try: + send_mail(msg, replyable=True) + except InvalidEmailAddress: + logging.error("%s %s %s" % (self.from_addr, self.to, self.cc)) + logging.error(self.context.text) + + @classmethod + def send_mail(cls, subject, to=None, cc=None, + from_=DEFAULT_NOTIFY_SENDER_ADDR, in_reply_to='', + message_id=None, context=None): + mail = Mail(subject, to, cc, from_, in_reply_to, message_id) + mail.context = context + mail.send() + + @staticmethod + def default_sender(name): + return "%s <%s>" % (name, DEFAULT_NOTIFY_SENDER_ADDR) + + @staticmethod + def customize_sender(name, tag): + return "%s <%s>" % (name, CUSTOMIZE_NOTIFY_SENDER_ADDR % tag.replace("/", "-")) + + @staticmethod + def addrs_by_usernames(usernames, target=None): + addrs = set() + for username in usernames: + user = User(username) if username else None + if user: + if (target and user.notify_email(target)) or not target: + addrs.add(user.email) + addrs = addrs.union(user.settings.notif_other_emails) + return addrs + + @classmethod + def addrs_by_emails(cls, emails): + return Mail.addrs_by_usernames( + [get_author_by_email(email) for email in emails]) + + +if __name__ == '__main__': + context = MailContext('_', title='test title', content='text content') + mail = Mail("test") + mail.context = context + mail.send() diff --git a/vilya/libs/mako_cache.py b/vilya/libs/mako_cache.py new file mode 100644 index 0000000..ca3935c --- /dev/null +++ b/vilya/libs/mako_cache.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- + +from vilya.libs.store import mc, ONE_HOUR +from mako.cache import CacheImpl, register_plugin + + +class McCacheImpl(CacheImpl): + """基于mc的页面cache实现""" + + def __init__(self, cache): + self.cache = cache + + def get_or_create(self, key, creation_function, **kw): + r = mc.get(key) + if r is None: + r = creation_function() + expiretime = kw.get('timeout', ONE_HOUR) + mc.set(key, r, expiretime) + return r + + def set(self, key, value, **kw): + expiretime = kw.get('timeout', ONE_HOUR) + mc.set(key, value, expiretime) + + def get(self, key, **kw): + return mc.get(key) + + def invalidate(self, key, **kw): + mc.delete(key) + + +register_plugin("mccache", __name__, "McCacheImpl") diff --git a/vilya/libs/mlock.py b/vilya/libs/mlock.py index 816fbae..44367d8 100644 --- a/vilya/libs/mlock.py +++ b/vilya/libs/mlock.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from libs.store import mc +from vilya.libs.store import mc class MLockMeta(type): diff --git a/vilya/libs/model.py b/vilya/libs/model.py new file mode 100644 index 0000000..8b804d2 --- /dev/null +++ b/vilya/libs/model.py @@ -0,0 +1,118 @@ +# -*- coding: utf-8 -*- +from .store import store +from MySQLdb import IntegrityError +from ORZ import OrzField, OrzBase +from ORZ.klass_init import OrzMeta +from datetime import datetime + +__all__ = [] +__dict__ = [] + + +class ModelField(OrzField): + def __init__(self, *args, **kwargs): + self.auto_now = kwargs.get('auto_now') + self.auto_now_create = kwargs.get('auto_now_create') + if 'auto_now' in kwargs: + del kwargs['auto_now'] + if 'auto_now_create' in kwargs: + del kwargs['auto_now_create'] + super(ModelField, self).__init__(*args, **kwargs) + + +class ModelMeta(OrzMeta): + def __init__(self, *args, **kwargs): + if self.__table__: + self.__orz_table__ = self.__table__ + super(ModelMeta, self).__init__(*args, **kwargs) + + auto_now_fields = [] + auto_now_create_fields = [] + for k, v in self.__dict__.iteritems(): + if isinstance(v, ModelField): + if v.auto_now: + auto_now_fields.append(k) + elif v.auto_now_create: + auto_now_create_fields.append(k) + self.__auto_now_fields__ = auto_now_fields + self.__auto_now_create_fields__ = auto_now_create_fields + + +def _transaction(func): + def _transaction_block(*args, **kwargs): + if store.in_transaction or store.modified_cursors: + return func(*args, **kwargs) + else: + store.transaction_begin() + try: + ret = func(*args, **kwargs) + except IntegrityError, e: + store.rollback() + return None + # raise e + except Exception, e: + store.rollback() + raise e + else: + store.commit() + return ret + return _transaction_block + + +class BaseModel(OrzBase): + + __metaclass__ = ModelMeta + __table__ = '' + + def __init__(self, *args, **kwargs): + super(BaseModel, self).__init__(*args, **kwargs) + + @staticmethod + def transaction(func): + return _transaction(func) + + @classmethod + #@_transaction + def create(cls, **kwargs): + fields = cls.__auto_now_fields__ + cls.__auto_now_create_fields__ + if fields: + now = datetime.now() + for field in fields: + kwargs[field] = now + return super(BaseModel, cls).create(**kwargs) + + @classmethod + def get(cls, **kwargs): + ret = cls.objects.gets_by(**kwargs) + if len(ret): + return ret[0] + + @classmethod + def gets(cls, **kwargs): + return cls.objects.gets_by(**kwargs) + + @classmethod + def count(cls, **kwargs): + return cls.objects.count_by(**kwargs) + + # @_transaction + def save(self): + fields = self.__auto_now_fields__ + if fields: + now = datetime.now() + for field in fields: + setattr(self, field, now) + return super(BaseModel, self).save() + + @classmethod + #@_transaction + def deletes(cls, **kwargs): + rs = cls.gets(**kwargs) + for r in rs: + r.delete() + + def to_dict(self): + return {} + + def __iter__(self): + self.to_dict().iteritems() diff --git a/vilya/libs/mq.py b/vilya/libs/mq.py new file mode 100644 index 0000000..d79c1cd --- /dev/null +++ b/vilya/libs/mq.py @@ -0,0 +1,11 @@ +# coding=utf-8 +from celery import Celery + +app = Celery() +app.config_from_object('celeryconfig') + + +def async(func): + def deco_(*args, **kwargs): + return app.task(func).apply_async(*args, **kwargs) + return deco_ diff --git a/vilya/libs/props.py b/vilya/libs/props.py new file mode 100644 index 0000000..1b27d0a --- /dev/null +++ b/vilya/libs/props.py @@ -0,0 +1,92 @@ +# coding: utf-8 + +""" +提供props常见操作支持,需要对应的类支持get_uuid, 目前是IData +""" + +from json import dumps as encode, loads as decode +from .store import bdb + + +class PropsMixin(object): + + @property + def _props_name(self): + ''' + 为了保证能够与corelib.mixin.wrapper能和谐的工作 + 需要不同的class有不同的__props以免冲突 + ''' + return '__%s/props_cached' % self.get_uuid() + + @property + def _props_db_key(self): + return '%s/props' % self.get_uuid() + + def _get_props(self): + props = bdb.get(self._props_db_key) or '' + props = props and decode(props) or {} + return props + + def _set_props(self, props): + bdb.set(self._props_db_key, encode(props)) + + def _destory_props(self): + bdb.delete(self._props_db_key) + + get_props = _get_props + set_props = _set_props + + props = property(_get_props, _set_props) + + def set_props_item(self, key, value): + props = self.props + props[key] = value + self.props = props + + def delete_props_item(self, key): + props = self.props + props.pop(key, None) + self.props = props + + def get_props_item(self, key, default=None): + return self.props.get(key, default) + + def incr_props_item(self, key): + n = self.get_props_item(key, 0) + n += 1 + self.set_props_item(key, n) + return n + + def decr_props_item(self, key, min=0): + n = self.get_props_item(key, 0) + n -= 1 + n = n > 0 and n or 0 + self.set_props_item(key, n > min and n or min) + return n + + def update_props(self, data): + props = self.props + props.update(data) + self.props = props + + +class PropsItem(object): + def __init__(self, name, default=None, output_filter=None): + self.name = name + self.default = default + self.output_filter = output_filter + + def __get__(self, obj, objtype): + r = obj.get_props_item(self.name, None) + if r is None: + return self.default + elif self.output_filter: + return self.output_filter(r) + else: + return r + + def __set__(self, obj, value): + obj.set_props_item(self.name, value) + + def __delete__(self, obj): + obj.delete_props_item(self.name) diff --git a/vilya/libs/pubsub.py b/vilya/libs/pubsub.py new file mode 100644 index 0000000..ddfd03b --- /dev/null +++ b/vilya/libs/pubsub.py @@ -0,0 +1,6 @@ +import json +from vilya.libs.rdstore import rds + + +def publish(channels, data, pubkey="codelive"): + rds.publish(pubkey, json.dumps({'channels': channels, 'data': data})) diff --git a/vilya/libs/push_notification.py b/vilya/libs/push_notification.py new file mode 100644 index 0000000..6601950 --- /dev/null +++ b/vilya/libs/push_notification.py @@ -0,0 +1,121 @@ +#!/usr/bin/env python +# encoding: utf-8 + +import json +import httplib +import socket +import ssl + +from vilya.libs.store import bdb +from vilya.libs.mq import async + +IOS_APP_ID_NAME = 'app_id' +IOS_REST_API_KEY_NAME = 'rest_api_key' +IOS_MASTER_KEY_NAME = 'master_key' + +API_BASE = "api.parse.com" +GET_INSTALLATIONS_PATH = "/1/installations" +GET_INSTALLATION_PATH = "/1/installations/%s" +PUSH_PATH = "/1/push" + +BDB_API_KEY = 'code_push_notification_key:1' + +_RETRY = 3 +_TIMEOUT = 20 +_api_keys = {} + + +def set_api_keys(app_id, rest_api_key, master_key): + _api_keys[IOS_APP_ID_NAME] = app_id + _api_keys[IOS_REST_API_KEY_NAME] = rest_api_key + _api_keys[IOS_MASTER_KEY_NAME] = master_key + keys = json.dumps(_api_keys) + bdb.set(BDB_API_KEY, keys) + + +def get_api_keys(): + keys = bdb.get(BDB_API_KEY) + keys = json.loads(keys) if keys else {} + for k in keys: + _api_keys[k] = keys[k] + + +def validate_api_keys(): + if not _api_keys: + get_api_keys() + for k in (IOS_APP_ID_NAME, IOS_REST_API_KEY_NAME, IOS_MASTER_KEY_NAME): + v = _api_keys.get(k) + if not (v and isinstance(v, basestring)): + return False + return True + + +def set_api_key(key, value): + _api_keys[key] = value + + +def get_api_key(key): + return _api_keys[key] + + +def request(method, path, data): + connection = httplib.HTTPSConnection(API_BASE, 443, timeout=_TIMEOUT) + connection.connect() + connection.request( + method, + path, + json.dumps(data), + { + 'X-Parse-Application-Id': _api_keys[IOS_APP_ID_NAME], + 'X-Parse-Master-Key': _api_keys[IOS_MASTER_KEY_NAME], + 'X-Parse-REST-API-Key': _api_keys[IOS_REST_API_KEY_NAME], + 'Content-Type': 'application/json' + } + ) + return json.loads(connection.getresponse().read()) + + +def get_channels(): + installations = request('GET', GET_INSTALLATIONS_PATH, {}) + results = installations.get('results') + if results: + return reduce( + (lambda x, y: x+y), + [r.get('channels') for r in results]) + + +def _send(data): + if not validate_api_keys(): + return + channels = get_channels() + if channels: + result = request( + 'POST', + PUSH_PATH, + {'channels': channels, 'data': data} + ) + return result + + +def send(data): + for i in range(_RETRY): + try: + rs = _send(data) + if rs: + return rs + except socket.timeout: + continue + except ssl.SSLError: + continue + + +@async() +def send_alert(alert): + return send({'alert': alert}) + + +if __name__ == '__main__': + print send_alert( + '再测试一下正常的发送消息,测试成功貌似就没问题了' + '记录发送失败的功能回来再做吧' + ) diff --git a/vilya/libs/rdstore.py b/vilya/libs/rdstore.py new file mode 100644 index 0000000..25489b5 --- /dev/null +++ b/vilya/libs/rdstore.py @@ -0,0 +1,12 @@ +# coding=utf-8 +import redis + +from vilya.config import REDIS_URI + + +def init_store(): + return redis.from_url(REDIS_URI) + + +rdstore = init_store() +rds = rdstore diff --git a/vilya/libs/redis2beansdb.py b/vilya/libs/redis2beansdb.py new file mode 100644 index 0000000..8ce506d --- /dev/null +++ b/vilya/libs/redis2beansdb.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +import redis +from vilya.config import REDIS_URI + + +class Beansdb(object): + + def __init__(self): + self.redis = redis.from_url(REDIS_URI) + + def get(self, key, default=None): + data = self.redis.get(key) + if not data: + return default + return data + + def set(self, key, value): + return self.redis.set(key, value) + + def delete(self, key): + return self.redis.delete(key) diff --git a/vilya/libs/search.py b/vilya/libs/search.py new file mode 100644 index 0000000..e8bae6a --- /dev/null +++ b/vilya/libs/search.py @@ -0,0 +1,6 @@ +# coding=utf-8 +from vilya.models.stubs import SearchClientStub as Client + + +code_client = Client('/dae_code') +code_unittest_client = Client('/dae_code_unittest') diff --git a/vilya/libs/session.py b/vilya/libs/session.py index a422c95..7928dd8 100644 --- a/vilya/libs/session.py +++ b/vilya/libs/session.py @@ -1,9 +1,20 @@ # -*- coding: utf-8 -*- - -import os import Cookie from base64 import b64encode -from datetime import timedelta +from datetime import datetime, timedelta +import json +import logging +import os +from time import time + +from quixote import get_publisher, session +import redis + +from vilya.config import REDIS_URI, SESSION_EXPIRE_DAYS + +REDIS = redis.from_url(REDIS_URI) +TTL = SESSION_EXPIRE_DAYS * 24 * 60 * 60 +logger = logging.getLogger(__name__) def randbytes2(bytes): @@ -29,3 +40,147 @@ def format_rfc822_date(dt, localtime=True, cookie_format=False): def format_cookie_date(dt, localtime=True): return format_rfc822_date(dt, localtime=True, cookie_format=True) + + +class SessionManager(session.SessionManager): + + def keys(self): + return [] + + def values(self): + return [] + + def items(self): + return [] + + def get(self, session_id, default=None): + session = self.session_class.get_session(session_id) + if session is None: + session = default + return session + + def __getitem__(self, session_id): + return self.get(session_id) + + def has_key(self, session_id): + return self.get(session_id) is not None + + has_session = has_key + + def __setitem__(self, session_id, session): + if not isinstance(session, self.session_class): + raise TypeError("session not an instance of %r: %r" + % (self.session_class, session)) + assert session.id is not None, "session ID not set" + assert session_id == session.id, "session ID mismatch" + session.save() + + def __delitem__(self, session_id): + self.session_class.delete_session(session_id) + + def _make_session_id(self): + session_id = None + while session_id is None or self.has_session(session_id): + session_id = session.randbytes(16) + return session_id + + def get_session(self, request): + config = get_publisher().config + session_id = self._get_session_id(request, config) + session = None + if session_id is not None: + session = self.get(session_id) + if session is not None and ( + config.check_session_addr and + session.get_remote_address() != + request.get_environ("REMOTE_ADDR") + ): + logger.debug("Remote IP address does not match the " + "IP address that created the session(%s)", + session_id) + session = None + + if session is None: + session = self._create_session(request) + + session._set_access_time(self.ACCESS_TIME_RESOLUTION) + return session + + def set_session_cookie(self, request, session_id): + dt = datetime.now() + timedelta(days=SESSION_EXPIRE_DAYS) + kwargs = { + 'expires': format_cookie_date(dt, True), + 'httponly': True + } + self._set_cookie(request, session_id, **kwargs) + + +class Session(session.Session): + + def __init__(self, request, id): + self.redis = REDIS + self.ttl = TTL + self.id = id + self.user = None + if request is not None: + self._remote_address = request.get_environ("REMOTE_ADDR") + self._creation_time = self._access_time = time() + self._form_tokens = [] # queue + + def _set_access_time(self, resolution): + session.Session._set_access_time(self, resolution) + self.save() + + def create_form_token(self): + token = session.Session.create_form_token(self) + self.save() + return token + + def remove_form_token(self, token): + session.Session.remove_form_token(self, token) + self.save() + + @staticmethod + def redis_key(session_id): + return 'session:' + str(session_id) + + @classmethod + def get_session(cls, session_id): + value = REDIS.get(cls.redis_key(session_id)) + if value is not None: + return cls.loads(value) + + @classmethod + def delete_session(cls, session_id): + return REDIS.delete(cls.redis_key(session_id)) + + def save(self): + data = self.dumps() + self.redis.set(self.redis_key(self.id), data, ex=self.ttl) + + def dumps(self): + return json.dumps({ + 'id': self.id, + 'user': self.user, + '_form_tokens': self._form_tokens, + '_remote_address': self._remote_address, + '_creation_time': self._creation_time, + '_access_time': getattr(self, '_access_time', None) + }) + + @classmethod + def loads(cls, data): + if isinstance(data, basestring): + dct = json.loads(data) + else: + dct = data + session = cls(None, dct['id']) + session.redis = REDIS + session.ttl = TTL + session.user = dct['user'] + session._form_tokens = dct['_form_tokens'] + session._remote_address = dct['_remote_address'] + session._creation_time = dct['_creation_time'] + if dct['_access_time']: + session._access_time = dct['_access_time'] + return session diff --git a/vilya/libs/signals.py b/vilya/libs/signals.py new file mode 100644 index 0000000..7a4dd91 --- /dev/null +++ b/vilya/libs/signals.py @@ -0,0 +1,33 @@ +from blinker import Namespace + +_signals = Namespace() +recommend_signal = _signals.signal('recommend_signal') +comment_signal = _signals.signal('comment_signal') +codereview_signal = _signals.signal('code_review') +pullrequest_signal = _signals.signal('pullrequest') +push_signal = _signals.signal('push_signal') +follow_user_signal = _signals.signal('follow_user_signal') + +# Issue +issue_signal = _signals.signal('issue') +issue_comment_signal = _signals.signal('issue_comment') + +# Team +team_created_signal = _signals.signal('team_created') +team_joined_signal = _signals.signal('team_joined') +team_add_member_signal = _signals.signal('team_add_member') + +# Repository +repo_create_signal = _signals.signal('repo_create') +repo_watch_signal = _signals.signal('repo_watch') +repo_fork_signal = _signals.signal('repo_fork') + +# Gist +gist_created_signal = _signals.signal('gist_created') +gist_commented_signal = _signals.signal('gist_commented') +gist_starred_signal = _signals.signal('gist_starred') +gist_forked_signal = _signals.signal('gist_forked') +gist_updated_signal = _signals.signal('gist_updated') + +# redis publish +rds_pub_signal = _signals.signal('rds_pub') diff --git a/vilya/libs/store.py b/vilya/libs/store.py index d8640fa..71963f7 100644 --- a/vilya/libs/store.py +++ b/vilya/libs/store.py @@ -1,11 +1,18 @@ # -*- coding: utf-8 -*- import logging -from MySQLdb import IntegrityError, connect -from ORZ import OrzField, OrzBase, setup -from douban.mc import mc_from_config, create_decorators + +import libmc +from MySQLdb import connect, IntegrityError # noqa +from ORZ import setup, OrzField, OrzBase # noqa +from douban.mc import create_decorators from douban.sqlstore import store_from_config -from vilya.config import MEMCACHED, MYSQL_STORE +from redis2beansdb import Beansdb +from vilya.config import ( + MEMCACHED_HOSTS, + MEMCACHED_CONFIG, + MYSQL_STORE, +) logging.getLogger().setLevel(logging.DEBUG) @@ -19,15 +26,44 @@ ONE_MONTH = ONE_DAY * 30 ONE_YEAR = ONE_DAY * 365 +_clients = {} + + +def hashdict(d): + """ + make dictionary becomes a immutable tuple + """ + if isinstance(d, (tuple, list)): + return tuple(hashdict(v) for v in d) + elif isinstance(d, dict): + return tuple(sorted((k, hashdict(v)) for k, v in d.iteritems())) + else: + return d + + +def Client(servers=None, *args, **kwargs): + key = hashdict([servers, kwargs]) + mc = _clients.get(key) + if not mc: + mc = libmc.Client(servers, *args, **kwargs) + _clients[key] = mc + return mc + def get_mc(): - return mc_from_config(MEMCACHED, use_cache=False) + return Client(MEMCACHED_HOSTS, **MEMCACHED_CONFIG) + + +def get_db(): + return Beansdb() def stub_cache(*args, **kws): pass mc = get_mc() +bdb = get_db() + pcache = pcache2 = listcache = cache_in_obj = delete_cache = cache = stub_cache globals().update(create_decorators(mc)) @@ -40,11 +76,40 @@ def mc_gets(mc_key, getter, ids): # mysql def connect_mysql(): - return connect(use_unicode=True) + return connect(use_unicode=True, user='root', passwd='', db='valentine') def make_dict(cursor, row): return dict(zip((str(d[0]) for d in cursor.description), row)) + +def reset_mc(deep=False): + for mc in _clients.itervalues(): + getattr(mc, 'clear', lambda: True)() + if deep: + getattr(mc.mc, 'clear', lambda: True)() + + +# TODO(xutao) delete reset_beansdb? +def reset_beansdb(): + for db in _clients.itervalues(): + db.clear_cache() + + +# FIXME(xutao) rename to clear_mc_for_test? +def clear_beansdb_for_test(): + for db in _clients.itervalues(): + db.clear_cache() + for s in db.db.servers: + clear = getattr(s.mc, 'clear', None) + if clear: + clear() + +# FIXME(xutao) I can't find any code about put beansdb client to `_clients`, and beansdb shouldn't be clear after request +def clear_local_cache(): + reset_mc() + reset_beansdb() + + store = store_from_config(MYSQL_STORE, use_cache=False) setup(store, mc) diff --git a/vilya/libs/template.py b/vilya/libs/template.py index c8694f3..3c49d58 100644 --- a/vilya/libs/template.py +++ b/vilya/libs/template.py @@ -4,11 +4,14 @@ from os.path import join import logging logging.getLogger().setLevel(logging.DEBUG) -from mako.lookup import TemplateLookup + from mako import exceptions -from vilya.config import CODE_DIR, MAKO_FS_CHECK +from mako.lookup import TemplateLookup from vilya.libs.permdir import get_tmpdir from vilya.libs.import_obj import import_obj +from vilya.config import CODE_DIR, MAKO_FS_CHECK, DEVELOP_MODE + +import vilya.libs.mako_cache # noqa MAKO_CACHE_DIR = join(get_tmpdir(), "tmp_mako_0606", "mako_cache") @@ -24,6 +27,8 @@ encoding_errors='ignore', default_filters=['h'], filesystem_checks=MAKO_FS_CHECK, + cache_enabled=True, + cache_impl='mccache', imports=["from vilya.libs.tplhelpers import static"] ) @@ -37,6 +42,8 @@ def serve_template(uri, **kwargs): except Exception, err: logging.debug("Mako error in %s: %s" % (uri, err)) + if DEVELOP_MODE: + raise logging.debug(exceptions.text_error_template().render()) if os.environ.get('DAE_ENV') == 'SDK': diff --git a/vilya/libs/text.py b/vilya/libs/text.py index f04cdb3..12619a9 100644 --- a/vilya/libs/text.py +++ b/vilya/libs/text.py @@ -1,12 +1,16 @@ # -*- coding: utf-8 -*- - from __future__ import absolute_import +import re import urllib import hashlib -from mikoto.libs.text import * -from mikoto.libs.emoji import * +import docutils +import docutils.core + +from mikoto.libs.text import * # noqa +from mikoto.libs.emoji import * # noqa + -from vilya.config import EMAIL_SUFFIX +ONIMARU_REGEX = re.compile(r'#onimaru(-.*)?-(\d+)') def trunc_utf8(string, num, etc="..."): @@ -49,7 +53,7 @@ def email_normalizer(name, email): if _validate_email(email): return email else: - return name + '@' + EMAIL_SUFFIX + return name + '@douban.com' def is_image(fname): @@ -69,13 +73,16 @@ def is_binary(fname): return True return False -def gravatar_url(email, size=140): - default = "http://img3.douban.com/icon/user_normal.jpg" - url = "http://douvatar.dapps.douban.com/mirror/" + hashlib.md5( + +def gravatar_url(email, size=80): + # 线上尺寸图已有size: (48, 64, 80) + default = "http://www.gravatar.com/avatar" + url = "http://www.gravatar.com/avatar/" + hashlib.md5( email.encode('utf8').lower()).hexdigest() + "?" url += urllib.urlencode({'d': default, 's': str(size), 'r': 'x'}) return url + def remove_unknown_character(text): if isinstance(text, str): return text.decode('utf-8', 'ignore').encode('utf-8', 'ignore') @@ -87,3 +94,59 @@ def plural(count, single, plural): return single else: return plural + + +def format_md_or_rst(path, src, project_name=None): + src = decode_charset_to_unicode(src) + if path.endswith('.md') \ + or path.endswith('.markdown') \ + or path.endswith('.mkd'): + if project_name: + return render_markdown_with_project(src, project_name=project_name) + return render_markdown(src) + + if RST_RE.match(path): + try: + return docutils.core.publish_parts(src, + writer_name='html')['html_body'] + except docutils.ApplicationError: + pass + + lexer = TextLexer(encoding='utf-8') + return highlight(src, lexer, HtmlFormatter(linenos=True, + lineanchors='L', + anchorlinenos=True, + encoding='utf-8')) + + +def render_markdown_for_feed(desc): + source = 'align="absmiddle"' + replace_to = 'height="20" width="20" align="absmiddle"' + desc = render_markdown(desc).replace(source, replace_to) + return desc.replace('<p>', '').replace('</p>', '') + + +def _parse_onimaru(text, project, fmt): + if text is None: + return text + match = ONIMARU_REGEX.search(text) + if match: + _project, id = match.groups() + if _project is not None: + _project = _project[1:] + onimaru_url = project.get_onimaru_url(id, project=_project) + if onimaru_url is None: + return text + start = match.start() + end = match.end() + link_text = fmt.format(onimaru_url, text[start:end]) + text = text[:start] + link_text + text[(end + 1):] + return text + + +def parse_onimaru(text, project): + return _parse_onimaru(text, project, '<a href="{0}">{1}</a>') + + +def replace_onimaru_to_link(text, project): + return _parse_onimaru(text, project, '[{1}]({0})') diff --git a/vilya/libs/tplhelpers.py b/vilya/libs/tplhelpers.py index 68ee3e9..fe6b700 100644 --- a/vilya/libs/tplhelpers.py +++ b/vilya/libs/tplhelpers.py @@ -1,5 +1,3 @@ # coding: utf-8 -from vilya.static import static as _static - -static = _static +from hub.static import static # noqa diff --git a/vilya/models/actions/__init__.py b/vilya/models/actions/__init__.py new file mode 100644 index 0000000..e35ee24 --- /dev/null +++ b/vilya/models/actions/__init__.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- + +migrate_type_name = { + 'code_review': 'pull_comment', + # 'commit': 'pull_commit', +} + + +# 迁移数据 +def migrate_notif_data(data, receiver): + from vilya.models.notification import Notification + from vilya.models.actions.commit_comment import migrate_commit_comment + from vilya.models.actions.issue import migrate_issue + from vilya.models.actions.issue_comment import migrate_issue_comment + from vilya.models.actions.pull import migrate_pull_request + from vilya.models.actions.pull_comment import migrate_pull_comment + from vilya.models.actions.recommend import migrate_recommend + from vilya.models.actions.team_add_member import migrate_team_add_member + + type_migrate_dict = { + 'commit_comment': migrate_commit_comment, + 'issue': migrate_issue, + 'issue_comment': migrate_issue_comment, + 'pull_request': migrate_pull_request, + 'pull_comment': migrate_pull_comment, + # 'pull_commit': migrate_pull_commit, + 'recommend': migrate_recommend, + 'team_add_member': migrate_team_add_member, + } + + assert data.get('uid') is not None + assert data.get('type') is not None + uid = data['uid'] + action_type = data['type'] + + if action_type in migrate_type_name: + Notification.set_data(receiver, 'type', migrate_type_name[action_type], + uid) + action_type = migrate_type_name[action_type] + + migrate_data = type_migrate_dict[action_type] + for new, old in migrate_data.iteritems(): + if data.get(new) is None: + assert type(old) in (str, tuple, list) + value = data[old] if isinstance(old, str) else old[1](data.get(old[0])) # noqa + Notification.set_data(receiver, new, value, uid) + data[new] = value + elif type(old) is list: # force update + value = data[old] if isinstance(old, str) else old[1](data.get(old[0])) # noqa + Notification.set_data(receiver, new, value, uid) + data[new] = value + + data['notif_template'] = action_type + '_notif' + data['feed_template'] = action_type + '_feed' + + return data diff --git a/vilya/models/actions/base.py b/vilya/models/actions/base.py new file mode 100644 index 0000000..b2a7a0e --- /dev/null +++ b/vilya/models/actions/base.py @@ -0,0 +1,77 @@ +# -*- coding: utf-8 -*- + +from vilya.libs.text import trunc_utf8 + + +class ActionScope(object): + project = 'project' + team = 'team' + fair = 'fair' + user = 'user' + + all_scopes = ('project', + 'team', + 'fair', + 'user', + ) + + @classmethod + def getScope(cls, target_type): + if target_type in cls.all_scopes: + return target_type + else: + return None + + +class Action(object): + def __init__(self, sender, date): + self.sender = sender + self.date = date + # TODO: action uid, consider 'mark as read' + + @property + def type(self): + ''' action type, e.g. issue_comment ''' + return self.__class__.__name__.lower() + + @property + def scope(self): + ''' ActionScope.xxx ''' + pass + + @property + def target(self): + ''' action belong to, e.g. project_name, team_name, user_name ''' + pass + + @property + def entry_id(self): + ''' e.g. issue_number, pull_number, commit_ref, ''' + # TODO: user scope的entry里就自己一条,应该拿uid来顶 + return '' + + @property + def entry_title(self): + ''' e.g. issue_title ''' + pass + + @property + def notif_template(self): + return self.type + '_notif' + + @property + def feed_template(self): + return self.type + '_feed' + + @classmethod + def _truncate(cls, s, cnt=80): + return trunc_utf8(s, cnt) + + def to_dict(self): + import inspect + dt = self.__dict__.copy() + dt.update([(p, getattr(self, p)) + for (p, v) in inspect.getmembers(self.__class__, + lambda v: isinstance(v, property))]) + dt = {k: dt[k] for k in dt if not k.startswith('_')} + return dt diff --git a/vilya/models/actions/commit_comment.py b/vilya/models/actions/commit_comment.py new file mode 100644 index 0000000..eef50b3 --- /dev/null +++ b/vilya/models/actions/commit_comment.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- + +from vilya.models.actions.base import Action, ActionScope + + +# TODO +# message=trunc_utf8(comment.content, 50, None), +# proj=proj.name, +# author=comment.author, +# date=comment.created, +# type='commit_comment', +# ref=comment.ref, +# url='/%s/commit/%s#%s' % (proj.name, comment.ref, self.uid) +class CommitComment(Action): + def __init__(self, sender, date, proj_name, commit_ref, content, url): + super(CommitComment, self).__init__(sender, date) + self.proj = proj_name + self.ref = commit_ref + self.content = CommitComment._truncate(content) + self.url = url # TODO , uid? + + @property + def type(self): + return 'commit_comment' + + @property + def scope(self): + return ActionScope.project + + @property + def target(self): + return self.proj + + @property + def entry_id(self): + # 显示的时候 [:10] + return self.ref + + @property + def entry_title(self): + return 'Commit comment in ' + self.ref[:10] + +migrate_commit_comment = { + 'sender': 'author', + 'content': 'message', + 'target': 'proj', + 'scope': ('', lambda x: 'project'), # only projects has commit_comment + 'entry_id': 'ref', + 'entry_title': ('ref', lambda x: 'Commit comment in ' + x[:10]), +} diff --git a/vilya/models/actions/issue.py b/vilya/models/actions/issue.py new file mode 100644 index 0000000..8d50880 --- /dev/null +++ b/vilya/models/actions/issue.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- + +from vilya.models.actions.base import Action, ActionScope + + +# TODO +# 'date': self.now(), +# 'url': issue.url, +# 'number': issue.number, +# 'target_name': target.name, +# 'target_url': target.url, +# 'state': state, +# 'receiver': issue.creator_id, +# 'title': issue.title, +# 'author': sender, +# 'text': content, +# 'type': 'issue', +class Issue(Action): + def __init__(self, sender, date, target, issue, state, content): + super(Issue, self).__init__(sender, date) + self.target_name = target.name + self.target_type = issue.target_type # self._target_type ? + self.target_url = target.url + self.title = issue.title + self.number = issue.number + self.state = state + self.content = Issue._truncate(content) + self.url = issue.url + + @property + def scope(self): + scope = ActionScope.getScope(self.target_type) + return scope if scope else ActionScope.project + + @property + def target(self): + return self.target_name + + @property + def entry_id(self): + return self.number + + @property + def entry_title(self): + return '#%d %s' % (self.number, self.title) + + +def _migrate_scope(url): + ''' hack from target_url ''' + urls = url.split('/') + scope = 'project' + if urls[1] == 'fair': + scope = 'fair' + elif urls[1] == 'hub' and urls[2] == 'team': + scope = 'team' + elif urls[1] == 'teams': + scope = 'team' + return scope + +migrate_issue = { + 'sender': 'author', + 'content': 'text', + 'target': 'target_name', + 'target_type': ['target_url', _migrate_scope], + 'scope': ['target_url', _migrate_scope], + 'entry_id': 'number', + 'entry_title': 'title', +} diff --git a/vilya/models/actions/issue_comment.py b/vilya/models/actions/issue_comment.py new file mode 100644 index 0000000..693484d --- /dev/null +++ b/vilya/models/actions/issue_comment.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- + +from vilya.models.actions.base import Action, ActionScope + + +# TODO +# 'date': self.now(), +# 'url': issue.url, +# 'number': issue.number, +# 'target_name': target.name, +# 'target_url': target.url, +# 'receiver': issue.creator_id, +# 'title': issue.title, +# 'author': sender, +# 'text': content, +# 'type': 'issue_comment', +class IssueComment(Action): + def __init__(self, sender, date, target, issue, content): + super(IssueComment, self).__init__(sender, date) + self.target_name = target.name + self.target_type = issue.target_type + self.target_url = target.url + self.title = issue.title + self.number = issue.number + self.content = IssueComment._truncate(content) + self.url = issue.url + + @property + def type(self): + return 'issue_comment' + + @property + def scope(self): + scope = ActionScope.getScope(self.target_type) + return scope if scope else ActionScope.project + + @property + def target(self): + return self.target_name + + @property + def entry_id(self): + return self.number + + @property + def entry_title(self): + return '#%d %s' % (self.number, self.title) + + +def _migrate_scope(url): + ''' hack from target_url ''' + urls = url.split('/') + scope = 'project' + if urls[1] == 'fair': + scope = 'fair' + elif urls[1] == 'hub' and urls[2] == 'team': + scope = 'team' + elif urls[1] == 'teams': + scope = 'team' + return scope + +migrate_issue_comment = { + 'sender': 'author', + 'content': 'text', + 'target': 'target_name', + 'target_type': ['target_url', _migrate_scope], + 'scope': ['target_url', _migrate_scope], + 'entry_id': 'number', + 'entry_title': 'title', +} diff --git a/vilya/models/actions/pull.py b/vilya/models/actions/pull.py new file mode 100644 index 0000000..d417fbc --- /dev/null +++ b/vilya/models/actions/pull.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- + +from vilya.models.actions.base import Action, ActionScope + + +# TODO +# 'date': self.now(), +# 'url': pullreq_url, +# 'description': description, +# 'from_proj': from_proj_str, +# 'to_proj': to_proj_str, +# 'commiter': commiter, +# 'owner': owner, +# 'title': title, +# 'status': status, +# 'type': 'pull_request' +class Pull(Action): + + # FIXME: 把计算都放到 相应的 models 里去(ticket/pr) + + def __init__(self, sender, date, pullreq, ticket, owner, state, url): + super(Pull, self).__init__(sender, date) # sender <- commiter + self.to_proj = pullreq.to_proj_str + self.from_proj = pullreq.from_proj_str + self.owner = owner + self.title = ticket.title + self.ticket = ticket.ticket_id + self.state = state # <- status + self.content = Pull._truncate(ticket.description) # <- description + self.url = url + + self._target = pullreq.to_proj.name + + @property + def type(self): + return 'pull_request' + + @property + def scope(self): + return ActionScope.project + + @property + def target(self): + return self._target + + @property + def entry_id(self): + return self.ticket + + @property + def entry_title(self): + return '#%d %s' % (self.ticket, self.title) + + +def _migrate_ticket_id(url): + ''' hack from url ''' + if url.split('/')[3].isdigit(): + return int(url.split('/')[3]) + elif url.split('/')[4].isdigit(): + return int(url.split('/')[4]) + return '' + +migrate_pull_request = { + 'sender': 'commiter', + 'content': 'description', + 'state': 'status', + 'target': ('to_proj', lambda x: x.split(':')[0]), + 'scope': ('', lambda x: 'project'), # only projects has + 'ticket': ['url', _migrate_ticket_id], + 'entry_id': ['url', _migrate_ticket_id], # force update + 'entry_title': 'title', +} diff --git a/vilya/models/actions/pull_comment.py b/vilya/models/actions/pull_comment.py new file mode 100644 index 0000000..d8d0c56 --- /dev/null +++ b/vilya/models/actions/pull_comment.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- + +from vilya.models.actions.base import Action, ActionScope + + +# TODO +# date=self.now(), +# url=url, +# ticket=ticket_id, +# proj="%s:%s" % (pullreq.to_proj, pullreq.to_branch), +# receiver=ticket_author, +# author=sender, +# text=content, +# type='code_review', +class PullComment(Action): + def __init__(self, sender, date, pullreq, ticket, content, url): + super(PullComment, self).__init__(sender, date) + self.proj = pullreq.to_proj_str + self.ticket = ticket.ticket_id # TODO: 统一:issue里显示的是名字,pr显示的是id。。。 + self.title = ticket.title + self.content = PullComment._truncate(content) + self.url = url # TODO, uid + + self._target = pullreq.to_proj.name + + @property + def type(self): + return 'pull_comment' + + @property + def scope(self): + return ActionScope.project + + @property + def target(self): + return self._target + + @property + def entry_id(self): + return self.ticket + + @property + def entry_title(self): + return '#%d %s' % (self.ticket, self.title) + +migrate_pull_comment = { + 'sender': 'author', + 'content': 'text', + 'target': ('proj', lambda x: x.split(':')[0]), + 'scope': ('', lambda x: 'project'), # only projects has + 'entry_id': 'ticket', + 'title': ('ticket', lambda x: 'PullRequest #%d' % x), # don't know title + # don't know title + 'entry_title': ('ticket', lambda x: 'PullRequest #%d' % x), +} diff --git a/vilya/models/actions/pull_commit.py b/vilya/models/actions/pull_commit.py new file mode 100644 index 0000000..8daa973 --- /dev/null +++ b/vilya/models/actions/pull_commit.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +# TODO ,无notif消息,且Feed 还没迁到 dispatcher diff --git a/vilya/models/actions/recommend.py b/vilya/models/actions/recommend.py new file mode 100644 index 0000000..2a9e46d --- /dev/null +++ b/vilya/models/actions/recommend.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- + +from vilya.models.actions.base import Action, ActionScope + + +# TODO +# author=recommend.from_user, +# from_user=recommend.from_user, +# to_user=recommend.to_user, +# content=recommend.content, +# type='recommend', +# date=recommend.created, +# url=('%s/people/%s/praises' % (DOMAIN, recommend.to_user)) +class Recommend(Action): + def __init__(self, sender, date, recommend, url): + super(Recommend, self).__init__(sender, date) # sender <- from_user + self.to_user = recommend.to_user + self.content = Recommend._truncate(recommend.content) + self.url = url # TODO url, DOMAIN + + @property + def scope(self): + return ActionScope.user + + @property + def target(self): + return self.to_user + + @property + def entry_title(self): + return 'About you' + +migrate_recommend = { + 'sender': 'author', + 'target': 'to_user', + 'scope': ('', lambda x: 'user'), # only user has + 'entry_title': ('', lambda x: 'About you'), +} diff --git a/vilya/models/actions/team_add_member.py b/vilya/models/actions/team_add_member.py new file mode 100644 index 0000000..f179479 --- /dev/null +++ b/vilya/models/actions/team_add_member.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- + +from vilya.models.actions.base import Action, ActionScope + + +# TODO +# url='/hub/team/%s/' % self._team_uid, +# team_name=self._team_name, +# actor=self._sender, +# date=datetime.now(), +# identity=self._identity, +# type='team_add_member', +class TeamAddMember(Action): + def __init__(self, sender, date, to_user, team_name, identity, url): + super(TeamAddMember, self).__init__(sender, date) + self.to_user = to_user + self.team_name = team_name + self.identity = identity + self.url = url # TODO url, uid + + self._target = to_user + + @property + def type(self): + return 'team_add_member' + + @property + def scope(self): + return ActionScope.user + + @property + def target(self): + return self._target + + @property + def entry_title(self): + return 'About you' + +migrate_team_add_member = { + 'sender': 'actor', + 'to_user': ('', lambda x: 'you'), + 'target': ('', lambda x: 'you'), # don't know who is the target, but 'you' + 'scope': ('', lambda x: 'user'), # only user has + 'entry_title': ('', lambda x: 'About you'), +} diff --git a/vilya/models/activity.py b/vilya/models/activity.py new file mode 100644 index 0000000..667f41a --- /dev/null +++ b/vilya/models/activity.py @@ -0,0 +1,113 @@ +# -*- coding: utf-8 -*- + +from vilya.config import DOMAIN as CODE_URL + + +class Activity(object): + + def __init__(self, data): + self.data = data + + def to_line(self): + return format_activity(self.data) + + +def format_activity(data): + type = data.get('type') + if type in ('team_created', 'team_joined'): + _data = _format_team_data(data) + elif type in ('recommend', 'commit_comment', 'push'): + _data = _format_people_data(data) + elif type in ('issue'): + _data = _format_issue_data(data) + elif type in ('issue_comment'): + _data = _format_issue_comment_data(data) + elif type in ('pull_request', 'code_review'): + _data = _format_pullrequest_data(data) + return _data + + +def _format_repository_data(data): + return '' + + +def _format_team_data(data): + _author = data.get('author') + _team = data.get('name') + if data['type'] == 'team_created': + type = 'created' + elif data['type'] == 'team_joined': + type = 'joined' + return "%s %s team:<a href=\"%s\">%s</a>" % ( + _author, type, CODE_URL + data.get('url'), _team) + + +def _format_issue_data(data): + if data['state'] == 'closed': + type = 'closed' + elif data['state'] == 'open': + type = 'opened' + _author = data.get('author') + tmpl = "%s %s issue:<a href=\"%s\">%s</a> on <a href=\"%s\">%s</a>" + return tmpl % (_author, type, CODE_URL + data.get('url'), + data.get('title'), CODE_URL + data.get('target_url'), + data.get('target_name')) + + +def _format_issue_comment_data(data): + _author = data.get('author') + tmpl = "%s commented issue:<a href=\"%s\">%s</a> on <a href=\"%s\">%s</a>" + return tmpl % (_author, CODE_URL + data.get('url'), data.get('title'), + CODE_URL + data.get('target_url'), data.get('target_name')) + + +def _format_pullrequest_data(data): + if data['type'] == 'pull_request': + if data['status'] == 'merged': + type = 'merged' + _author = data.get('owner') + elif data['status'] == 'unmerge': + type = 'opened' + _author = data.get('commiter') + elif data['status'] == 'closed': + type = 'closed' + _author = data.get('commiter') + else: + type = '?' + _author = '?' + _title = data.get('title') + _url = data.get('url') + _project = data.get('to_proj', '') + elif data['type'] == 'code_review': + type = 'commented' + _author = data.get('author') + _title = data.get('ticket') + _url = data.get('url') + _project = data.get('proj', '') + _project_url = "/%s" % _project.split(':')[0] + tmpl = "%s %s pr:<a href=\"%s\">%s</a> on <a href=\"%s\">%s</a>" + return tmpl % (_author, type, CODE_URL + _url, _title, + CODE_URL + _project_url, _project) + + +def _format_people_data(data): + if data['type'] == 'recommend': + return '' + elif data['type'] == 'commit_comment': + type = 'commented' + _author = data.get('sender') + _project = data.get('proj') + _project_url = "/%s" % _project + return "%s %s <a href=\"%s\">%s</a> on <a href=\"%s\">%s</a>" % ( + _author, type, CODE_URL + data.get('url'), data.get('ref'), + CODE_URL + _project_url, _project) + elif data['type'] == 'push': + type = 'pushed' + _project = data.get('repo_name') + _project_url = "/%s" % _project + _project = _project + ":" + data.get('branch') + return "%s %s <a href=\"%s\">%s</a>" % ("someone", + type, + CODE_URL + _project_url, + _project) + return '' diff --git a/vilya/models/api_key.py b/vilya/models/api_key.py new file mode 100644 index 0000000..78bef96 --- /dev/null +++ b/vilya/models/api_key.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +import uuid +from datetime import datetime + +from vilya.libs.store import store + + +class ApiKey(object): + + TYPE_WEB = 0 + TYPE_DESKTOP = 1 + TYPE_MOBILE = 2 + + STATUS_DEV = 0 + STATUS_NORMAL = 1 + STATUS_BLOCKED = 2 + + def __init__(self, id, name, description, type, + url, redirect_uri, owner_id, client_id, client_secret, + status, created_at, updated_at): + + self.id = id + self.name = name.decode('utf-8') + self.description = description.decode('utf-8') + self.type = type + self.url = url + self.redirect_uri = redirect_uri + self.owner_id = owner_id + self.client_id = client_id + self.client_secret = client_secret + self.status = status + self.created_at = created_at + self.updated_at = updated_at + + def __eq__(self, target): + return self.id == target.id and self.client_id == target.client_id + + @classmethod + def get(cls, id): + rs = store.execute("select `id`,`name`,`description`,`type`,`url`,`redirect_uri`," + "`owner_id`,`client_id`,`client_secret`,`status`, `created_at`,`updated_at` " + "from api_key where id=%s", (id,)) + return rs and cls(*rs[0]) or None + + @classmethod + def get_by_client_id(cls, client_id): + rs = store.execute("select `id`,`name`,`description`,`type`,`url`,`redirect_uri`," + "`owner_id`,`client_id`,`client_secret`,`status`, `created_at`,`updated_at` " + "from api_key where client_id=%s", (client_id,)) + return rs and cls(*rs[0]) or None + + @classmethod + def add(cls, name, description, type, url, redirect_uri, owner_id): + now = datetime.now() + client_id = uuid.uuid1().hex[:20] + client_secret = uuid.uuid4().hex + id = store.execute("insert into api_key " + "(`name`,`description`,`type`,`url`,`redirect_uri`,`owner_id`," + "`client_id`,`client_secret`,`created_at`,`updated_at`) " + "values(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)", + (name, description, type, url, redirect_uri, owner_id, + client_id, client_secret, now, now)) + store.commit() + return id and cls.get(id) diff --git a/vilya/models/api_token.py b/vilya/models/api_token.py new file mode 100644 index 0000000..b30bd97 --- /dev/null +++ b/vilya/models/api_token.py @@ -0,0 +1,92 @@ +# -*- coding: utf-8 -*- +import uuid +from datetime import datetime, timedelta + +from vilya.libs.store import store +from vilya.models.api_key import ApiKey +from vilya.models.user import User + +NORMAL = 0 + + +class ApiToken(object): + + def __init__(self, id, client_id, user_id, token, expire_time, + refresh_token, refresh_expire_time, status, created_at): + self.id = id + self.client_id = client_id + self.user_id = user_id + self.token = token + self.expire_time = expire_time + self.refresh_token = refresh_token + self.refresh_expire_time = refresh_expire_time + self.status = status + self.created_at = created_at + + def __eq__(self, target): + return self.id == target.id and self.client_id == target.client_id \ + and self.token == target.token + + @classmethod + def get(cls, id): + rs = store.execute("select `id`,`client_id`,`user_id`,`token`,`expire_time`, " + "`refresh_token`,`refresh_expire_time`,`status`,`created_at` " + "from api_token where id=%s", (id,)) + return rs and cls(*rs[0]) or None + + @classmethod + def get_by_token(cls, token): + rs = store.execute("select `id`,`client_id`,`user_id`,`token`,`expire_time`, " + "`refresh_token`,`refresh_expire_time`,`status`,`created_at` " + "from api_token where token=%s", (token,)) + return rs and cls(*rs[0]) or None + + @classmethod + def get_by_refresh_token(cls, refresh_token): + rs = store.execute("select `id`,`client_id`,`user_id`,`token`,`expire_time`, " + "`refresh_token`,`refresh_expire_time`,`status`,`created_at` " + "from api_token where refresh_token=%s", (refresh_token,)) + return rs and cls(*rs[0]) or None + + def refresh(self): + self.revoke() + return self.add(self.client_id, self.user_id) + + def revoke(self): + now = datetime.now() + store.execute("update api_token set expire_time=%s, refresh_expire_time=%s " + "where id=%s", (now, now, self.id)) + store.commit() + self.expire_time = self.refresh_expire_time = now + + @classmethod + def add(cls, client_id, user_id, expire_time=None, status=NORMAL): + if not ApiKey.get_by_client_id(client_id): + return + + now = datetime.now() + if not expire_time: + expire_time = now + timedelta(days=7) + refresh_expire_time = expire_time + timedelta(days=7) + + token = uuid.uuid4().hex + refresh_token = uuid.uuid4().hex + id = store.execute("insert into api_token (`client_id`,`user_id`,`token`,`expire_time`, " + "`refresh_token`, `refresh_expire_time`, `status`, `created_at`) " + "values(%s, %s, %s, %s, %s, %s, %s, %s)", + (client_id, user_id, token, expire_time, refresh_token, refresh_expire_time, status, now)) + store.commit() + return id and cls.get(id) + + def token_dict(self): + remain = self.expire_time - datetime.now() + return dict(user_id=self.user_id, access_token=self.token, + refresh_token=self.refresh_token, expires_in=remain.seconds) + + @property + def user(self): + return User(self.user_id) + + @property + def key(self): + return ApiKey.get_by_client_id(self.client_id) diff --git a/vilya/models/badge.py b/vilya/models/badge.py new file mode 100644 index 0000000..c3690e3 --- /dev/null +++ b/vilya/models/badge.py @@ -0,0 +1,143 @@ +# -*- coding: utf-8 -*- +from datetime import datetime + +from vilya.libs.store import store, mc + +KIND_USER = 1001 +MC_NEW_BADGE = 'newbadge:%s:%s' + + +class BadgeItem(object): + + def __init__(self, badge_id, item_id, reason=None, date=None): + self.badge_id = badge_id + self.item_id = item_id + self.reason = reason + self.date = date + + def __str__(self): + return ','.join([self.badge_id, self.item_id, self.reason, self.date]) + + @property + def badge(self): + return Badge.get(self.badge_id) + + def as_dic(self): + badge = self.badge + if badge: + return {"reason": self.reason, + "date": self.date, + "badge": badge.as_dic()} + + +class Badge(object): + + def __init__(self, id, name, summary): + self.id = id + self.name = name + self.summary = summary + + def __repr__(self): + return '<Badge(%s)>' % self.id + + @classmethod + def add(cls, name, summary): + b = cls.get_by_name(name) + if b: + return b + params = (name, summary) + id = store.execute( + "insert into badge(name, summary) values(%s, %s)", params) + store.commit() + return cls(id, name, summary) + + def award(self, item_id, reason=None, kind=KIND_USER): + params = (item_id, self.id, reason, kind, datetime.now()) + store.execute( + "insert into badge_item(item_id, badge_id, reason, kind, date) " + "values(%s, %s, %s, %s, %s)", params) + store.commit() + mc_key = MC_NEW_BADGE % (item_id, kind) + badges = mc.get(mc_key) or [] + badges.append(str(self.id)) + mc.set(mc_key, badges) + + def get_awarded_items(self): + rs = store.execute( + "select badge_id, item_id, reason, date from badge_item " + "where badge_id=%s order by date desc", (self.id,)) + return [BadgeItem(*r) for r in rs] + + def delete(self): + store.execute("delete from badge where badge_id=%s", (self.id,)) + store.commit() + + @classmethod + def get(cls, id): + rs = store.execute( + "select badge_id, name, summary from badge where badge_id=%s", + (id,)) + row = rs and rs[0] + if row: + return cls(*row) + + @classmethod + def get_by_name(cls, name): + rs = store.execute( + "select badge_id, name, summary from badge where name=%s", (name,)) + row = rs and rs[0] + if row: + return cls(*row) + + @classmethod + def all(cls): + rs = store.execute("select badge_id, name, summary from badge") + return rs + + @classmethod + def get_badges(cls, item_id, kind=KIND_USER): + params = (item_id, kind) + rs = store.execute( + "select badge_id from badge_item where item_id=%s and kind=%s", + params) + return [cls.get(badge_id) for badge_id, in rs] + + @classmethod + def get_badge_items(cls, item_id=None, kind=KIND_USER): + if item_id or kind != KIND_USER: + params = (item_id, kind) + rs = store.execute( + "select badge_id, item_id, reason, date from badge_item " + "where item_id=%s and kind=%s", params) + else: + rs = store.execute( + "select badge_id, item_id, reason, date from badge_item " + "order by date desc") + return [BadgeItem(*item) for item in rs] + + @classmethod + def get_new_badges(cls, item_id, kind=KIND_USER): + badges = mc.get(MC_NEW_BADGE % (item_id, kind)) or [] + return [cls.get(bid) for bid in badges] + + @classmethod + def clear_new_badges(cls, item_id, kind=KIND_USER): + mc.delete(MC_NEW_BADGE % (item_id, kind)) + + @classmethod + def get_all_badges(cls): + badges = cls.all() + return [cls(*badge) for badge in badges] + + @property + def url(self): + return "/badge/%s/" % self.id + + def get_image_url(self): + return "/static/img/badges/%s.png" % self.id + + def as_dic(self): + return {"name": self.name, + "summary": self.summary, + "image": self.get_image_url(), + "url": self.url} diff --git a/vilya/models/badge_timeline.py b/vilya/models/badge_timeline.py new file mode 100644 index 0000000..e5422cb --- /dev/null +++ b/vilya/models/badge_timeline.py @@ -0,0 +1,31 @@ +from vilya.libs.store import store + + +def get_item_count(name): + if name == '': + rs = store.execute("select count(1) from badge_item") + else: + rs = store.execute( + "select count(1) from badge_item where item_id=%s", (name,)) + data = rs and rs[0] + return data + + +def get_all_badges(): + data = store.execute("select badge_id, name, summary from badge") + return data + + +def get_all_items(index, increment, name): + start = index * increment + if name == '': + params = (start, increment) + data = store.execute( + "select badge_id, item_id, reason, date from badge_item " + "order by date desc limit %s,%s", params) + else: + params = (name, start, increment) + data = store.execute( + "select badge_id, item_id, reason, date from badge_item " + "where item_id=%s order by date desc limit %s,%s", params) + return data diff --git a/vilya/models/center/__init__.py b/vilya/models/center/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/vilya/models/center/activity.py b/vilya/models/center/activity.py new file mode 100644 index 0000000..8b617b7 --- /dev/null +++ b/vilya/models/center/activity.py @@ -0,0 +1,99 @@ +# -*- coding: utf-8 -*- +import json +from vilya.libs.text import trunc_utf8 +from vilya.libs.model import BaseModel, ModelField + +TYPE_DEFAULT = 0 # 人肉 +TYPE_DEPLOYMENT = 1 # 上线 +TYPE_MONITOR = 2 # 监控 +TYPE_STATISTIC = 3 # 统计 +TYPE_CONFIGURATION = 4 # 配置 + + +class Activity(BaseModel): + __orz_table__ = "center_activities" + title = ModelField(as_key=ModelField.KeyType.DESC) + description = ModelField() + type = ModelField(as_key=ModelField.KeyType.ONLY_INDEX) + creator_id = ModelField(as_key=ModelField.KeyType.ONLY_INDEX) + created_at = ModelField(auto_now_create=True) + + def to_dict(self): + return { + 'id': self.id, + 'title': self.title, + 'description': self.description, + 'created_at': self.created_at.strftime('%Y-%m-%dT%H:%M:%S+0800') + } + + @property + def rendered_description(self): + from vilya.libs.text import render_markdown + description = self.description + if description: + description = render_desc(self.type, description) + return render_markdown(description) + return '' + + @property + def short_description(self): + if self.description: + return trunc_utf8(self.description, 80) + return '' + + @property + def url(self): + return 'activities/%s' % self.id + + +def render_desc(type, description): + if type == TYPE_DEFAULT: + return description + if type == TYPE_DEPLOYMENT: + return render_deployment_desc(description) + if type == TYPE_MONITOR: + return render_monitor_desc(description) + if type == TYPE_CONFIGURATION: + return description + if type == TYPE_STATISTIC: + return description + return description + + +DEPLOYMENT_DESCRIPTION_V1 = """ +* Current Version: {current_version} +* Last Version: {last_version} +* Manager: {manager} +* Time: {time} +* Status: {status} +* Annotate: {annotate} +* URL: {url} +""" + + +def render_deployment_desc(description): + try: + data = json.loads(description) + except ValueError: + data = {} + ver = data.get('ver') + if ver and int(ver) == 1: + return DEPLOYMENT_DESCRIPTION_V1.format(**data) + return description + + +MONITOR_DESCRIPTION_V1 = """ +* Status: {status} +* Time: {timestamp} +""" + + +def render_monitor_desc(description): + try: + data = json.loads(description) + except ValueError: + data = {} + ver = data.get('ver') + if ver and int(ver) == 1: + return MONITOR_DESCRIPTION_V1.format(**data) + return description diff --git a/vilya/models/comment.py b/vilya/models/comment.py new file mode 100644 index 0000000..49df6a2 --- /dev/null +++ b/vilya/models/comment.py @@ -0,0 +1,198 @@ +# -*- coding: utf-8 -*- +import string + +from vilya.libs.store import store +from vilya.libs.text import trunc_utf8 +from dispatches import dispatch +from vilya.models.consts import COMMIT_COMMENT_UID_PATTERN + +_allowed_in_field_names = string.ascii_letters + string.digits + ' ' +_DEFLIMIT = 50 +_DEFORDER = 'asc' + + +def _safe_field(field_name): + if not all(c in _allowed_in_field_names for c in field_name): + raise Exception("Unsafe field name: %s" % field_name) + return True + + +def _make_update_setters(changes): + fields = changes.keys() + assert all(_safe_field(f) for f in fields) + setters = ', '.join("`%s` = %%s" % f for f in fields) + values = [changes[k] for k in fields] + return setters, values + + +def add(proj_id, ref, author, content): + comment_id = store.execute("insert into codedouban_comments " + "(project_id, ref, author, content) " + "values (%s, %s, %s, %s)", + (proj_id, ref, author, content)) + if not comment_id: + store.rollback() + raise Exception("Unable to insert new comment") + store.commit() + return comment_id + + +def get(comment_id): + rs = store.execute( + "select comment_id, project_id, ref, author, content, created " + "from codedouban_comments where comment_id = %s", (comment_id,)) + return rs and rs[0] or None + + +def _gets(field, value, order=_DEFORDER, start=0, limit=_DEFLIMIT): + assert field in ('project_id', 'ref', 'author') + rs = store.execute( + "select comment_id from codedouban_comments where %s = %%s " + "order by comment_id %s limit %%s, %%s" % (field, order), + (value, start, limit)) + return [cid for cid, in rs] + + +def gets_by_project(project_id, order=_DEFORDER, start=0, limit=_DEFLIMIT): + return _gets('project_id', project_id, order, start, limit) + + +def gets_by_ref(ref, order=_DEFORDER, start=0, limit=_DEFLIMIT): + return _gets('ref', ref, order, start, limit) + + +def gets_by_proj_and_ref(proj_id, ref, order=_DEFORDER, start=0, + limit=_DEFLIMIT): + assert order in ('asc', 'desc') + rs = store.execute( + "select comment_id from codedouban_comments where project_id = %%s " + "and ref = %%s order by comment_id %s limit %%s, %%s" % order, + (proj_id, ref, start, limit)) + return [cid for cid, in rs] + + +def gets_by_author(author, order=_DEFORDER, start=0, limit=_DEFLIMIT): + return _gets('author', author, order, start, limit) + + +def delete(comment_id): + n = store.execute("delete from codedouban_comments " + "where comment_id = %s", (comment_id,)) + if n: + store.commit() + return True + + +def latest(): + rs = store.execute("select comment_id from codedouban_comments " + "order by comment_id asc", ()) + return [cid for cid, in rs] + + +def update(comment_id, changes): + assert changes, "Must have some changes to propose" + assert all(k in ( + 'content', ) for k in changes.keys()), "Can only update some fields" + setters, values = _make_update_setters(changes) + n = store.execute( + "update codedouban_comments set %s " + "where comment_id = %%s" % setters, values + [comment_id]) + if n == 0: + store.rollback() + raise Exception("Comment %s not found, not updated" % comment_id) + if n > 1: + store.rollback() + raise Exception( + "Weird: more than one comment found for id %s, not updated".format( + comment_id)) + store.commit() + +# ORM wrapper + + +class Comment(object): + def __init__(self, comment_id, project_id, ref, author, content, created): + self.comment_id = comment_id + self.project_id = project_id + self.ref = ref + self.author = author + self.content = content + self.created = created + + # 兼容属性名 + self.id = comment_id + + def __repr__(self): + return "Comment(%s, %s, %s, ...)" % (self.comment_id, + self.project_id, self.ref) + + def __eq__(self, other): + return type(self) == type(other) \ + and self.comment_id == other.comment_id + + @property + def short_content(self): + content = self.content + if content: + return trunc_utf8(content, 30) + + @property + def uid(self): + return COMMIT_COMMENT_UID_PATTERN % self.id + + # no use + def to_dict(self): + return self.__dict__ + + @classmethod + def add(cls, project, ref, author, content, commit_author=None): + new_comment_id = add(project.id, ref, author, content) + new_comment = cls.get(new_comment_id) + + dispatch('comment', data={ + 'comment': new_comment, + 'commit_author': commit_author, }) + + # for commit comments rewrite to pr + dispatch('comment_actions', data={ + 'type': 'commit_comment', + 'comment': new_comment, + 'commit_author': commit_author, + }) + + return new_comment + + @classmethod + def get(cls, comment_id): + c = get(comment_id) + return cls(*c) if c else None + + @classmethod + def delete(cls, comment_id): + return delete(comment_id) + + def update(self, content): + update(self.comment_id, {'content': content}) + self.content = content + + @classmethod + def gets_by_project(cls, project_id, order=_DEFORDER, start=0, + limit=_DEFLIMIT): + return cls._gets(gets_by_project(project_id, order, start, limit)) + + @classmethod + def gets_by_ref(cls, ref, order=_DEFORDER, start=0, limit=_DEFLIMIT): + return cls._gets(gets_by_ref(ref, order, start, limit)) + + @classmethod + def gets_by_proj_and_ref(cls, proj, ref, order=_DEFORDER, start=0, + limit=_DEFLIMIT): + return cls._gets(gets_by_proj_and_ref(proj, ref, order, start, limit)) + + @classmethod + def gets_by_author(cls, author, order=_DEFORDER, start=0, limit=_DEFLIMIT): + return cls._gets(gets_by_author(author, order, start, limit)) + + @classmethod + def _gets(cls, comment_ids): + return [cls.get(cid) for cid in comment_ids] diff --git a/vilya/models/commit_status.py b/vilya/models/commit_status.py new file mode 100644 index 0000000..484df53 --- /dev/null +++ b/vilya/models/commit_status.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- + +from vilya.libs.props import PropsMixin + + +# New commit status +class ExtraCommitStatus(PropsMixin): + + def __init__(self, project, id): + self.id = id + self.project = project + + def get_uuid(self): + return '/extra_commit_status/%s:%s' % (self.project.id, self.id) + + def get_extra(self): + return self.props + + def update_extra(self, **kw): + props = self.props + # get_props_item + # set_props_item + # delete_props_item + for key in kw: + props[key] = kw[key] + self.props = props + return props diff --git a/vilya/models/commit_statuses.py b/vilya/models/commit_statuses.py new file mode 100644 index 0000000..e222ce0 --- /dev/null +++ b/vilya/models/commit_statuses.py @@ -0,0 +1,82 @@ +# -*- coding: utf-8 -*- +from datetime import datetime + +from vilya.config import DOMAIN +from vilya.libs.store import store +from vilya.models.project import CodeDoubanProject + + +class CommitStatus(object): + def __init__(self, id, project_id, sha, state, target_url, description, + time, author): + self.project_id = project_id + self.sha = sha + self.id = id + self.state = state + self.target_url = target_url + self.description = description + self.time = time + self.author = author + + self.project = CodeDoubanProject.get(self.project_id) + + def as_dict(self): + return dict( + created_at=self.time.strftime('%Y-%m-%dT%H:%M:%S'), + state=self.state, + target_url=self.target_url, + description=self.description, + id=self.id, + url="%s/api/%s/statuses/%s" % ( + DOMAIN, self.project.name, self.id), + creator=self.author + ) + + +class CommitStatuses(object): + """ used by QACI """ + + VALID_STATE = ['pending', 'success', 'error', 'failure'] + + def __init__(self, project_id, sha): + self.project_id = project_id + self.sha = sha + + def add(self, state, target_url, description, author): + if state not in CommitStatuses.VALID_STATE: + state = 'pending' + + time = datetime.now() + params = (self.project_id, self.sha, state, target_url, + description, time, author) + id = store.execute("""INSERT INTO commit_statuses + (project_id, sha, state, target_url, description, time, author) + VALUE + (%s, %s, %s, %s, %s, %s, %s) + """, params) + store.commit() + return CommitStatus(id, self.project_id, self.sha, state, target_url, + description, time, author) + + def all(self): + rs = store.execute( + "SELECT id, project_id, sha, state, target_url, description, " + "time, author FROM commit_statuses WHERE project_id=%s AND " + "sha=%s ORDER BY time DESC", (self.project_id, self.sha)) + return [CommitStatus(*r) for r in rs] + + def get(self, id): + rs = store.execute( + "SELECT id, project_id, sha, state, target_url, description, " + "time, author FROM commit_statuses WHERE project_id=%s AND id=%s " + "ORDER BY time DESC", (self.project_id, id)) + cs = [CommitStatus(*r) for r in rs] + return cs[0] if len(cs) > 0 else None + + def latest(self): + rs = store.execute( + "SELECT id, project_id, sha, state, target_url, description, " + "time, author FROM commit_statuses WHERE project_id=%s AND " + "sha=%s ORDER BY time DESC LIMIT 1", (self.project_id, self.sha)) + cs = [CommitStatus(*r) for r in rs] + return cs[0] if len(cs) > 0 else None diff --git a/vilya/models/consts.py b/vilya/models/consts.py index 3627da0..689a3d4 100644 --- a/vilya/models/consts.py +++ b/vilya/models/consts.py @@ -1,8 +1,72 @@ # -*- coding: utf-8 -*- +MCKEY_UPDATED_PROJECTS = "code:projects:updated" +MCKEY_CREATED_PROJECTS = "code:projects:created" +MCKEY_FORKED_PROJECTS = "code:projects:forked" +MCKEY_MOST_FORKED_PROJECTS = "code:projects:most_forked" + +TEMP_BRANCH_MARKER = 'TEMPORARY_BRANCH' + +#used only in dev environ, to mask the real git path with a specified path +DEFAULT_PATH = '' + +PUBLIC_TIMELINE = 'public_timeline' +PROJECT_BC_KEY = '%s:%s' # user:repo +COMMITS_MESSAGE_KEY = 'name:%s:ref:%s:path:%s' PULL_REF_H = 'refs/pull/%s/head' PULL_REF_M = 'refs/pull/%s/merge' +# BDB_PULL_BASE_KEY = 'pull_base:%s:%s' # deprecated + +# no use +#COMMIT_COMMENT_TYPE = 'C' +#COMMIT_LINECOMMENT_TYPE = 'L' + +COMMIT_COMMENT_UID_PATTERN = 'commit-comment-%s' +COMMIT_LINECOMMENT_UID_PATTERN = 'commit-linecomment-%s' + +PULL_COMMENT_UID_PATTERN = 'comment-%s' +PULL_CODEREVIEW_UID_PATTERN = 'review-%s' +PULL_EMAIL_IN_REPLY_TO = '<%s-pull-%s@code>' + +ISSUE_COMMENT_UID_PATTERN = 'comment-%s' + +TEAM_ADD_MEMBER_UID_PATTERN = 'team-add-member-%s' + +NEW_PULL_EMAIL_TITLE = '[%s] %s (#%s)' # [project name] pull request title (#ticket id) +NEW_PULL_EMAIL_BODY = \ + """%s +<br><br>—<br> +<a href="%s">View it on Code</a>.<img src='%s' height='1' width='1'>""" + +RE_PULL_EMAIL_TITLE = 'Re: [%s] %s (#%s)' # [project name] pull request title (#ticket id) +RE_PULL_EMAIL_BODY = NEW_PULL_EMAIL_BODY + +NEW_ISSUE_EMAIL_TITLE = '[%s] %s (#%s)' # [project name] issue title (#issue id) +RE_ISSUE_EMAIL_TITLE = 'Re: [%s] %s (#%s)' # [project name] issue title (#issue id) +ISSUE_COMMENT_EMAIL_TITLE = 'Re: [%s] %s (#%s)' # [project name] issue title (#issue id) +ISSUE_EMAIL_BODY = ISSUE_COMMENT_EMAIL_BODY = NEW_PULL_EMAIL_BODY + + +ISSUE_EMAIL_IN_REPLY_TO = '<%s-issue-%s@code>' + +PEOPLE_PROJECT = '0' +ORGANIZATION_PROJECT = '1' +MIRROR_PROJECT = '2' + +TEAM_OWNER = 1 +TEAM_MEMBER = 2 + +TEAM_IDENTITY_INFO = { + TEAM_MEMBER: { + "show_name": "member", + "name": "member", + }, + TEAM_OWNER: { + "show_name": "owner", + "name": "owner", + }, +} # line comment LINECOMMENT_INDEX_EMPTY = -1 @@ -17,3 +81,128 @@ "M": "modified", "R": "renamed", } + +MOBILE_MAIN_PATH = { + "/": "Homepage", + "/hub/my_pull_requests/": "My PullRequests", + "/hub/my_issues/": "My Issues", +} + +MY_PULL_REQUESTS_TAB_INFO = [ + {"url": "/hub/my_pull_requests/", "type": "invited", "text": "Invited"}, + {"url": "/hub/my_pull_requests/?list_type=participated", "type": "participated", "text": "Participated"}, + {"url": "/hub/my_pull_requests/?list_type=yours", "type": "your", "text": "Yours"}, + {"url": "/hub/my_pull_requests/?list_type=explore", "type": "explore", "text": "Explore"} +] + +## remove this +NOTIFY_ON = u'1' +NOTIFY_OFF = u'0' + +SETTING_ENABLE = u'1' +SETTING_DISABLE = u'0' + +# font settings +FONTS = { + 'default': 'source', + 'fonts': { + 'source': 'Source Code Pro', + 'consolas': 'Consolas', + 'monaco': 'Monaco', + 'courier': 'Courier', + 'dejavu': 'DejaVu Sans Mono', + 'ubuntu': 'Ubuntu Mono', + } +} + +MIRROR_STATE_CLONED = 1 +MIRROR_STATE_CLONING = 0 +MIRROR_WITH_PROXY = 1 +MIRROR_NOT_PROXY = 0 +MIRROR_HTTP_PROXY = "http://vpn2:8118" + +# used in table `ticket_nodes` +TICKET_NODE_TYPE_OPEN = 1 +TICKET_NODE_TYPE_CLOSE = 2 +TICKET_NODE_TYPE_MERGE = 3 +TICKET_NODE_TYPE_COMMIT = 4 +TICKET_NODE_TYPE_COMMENT = 5 +TICKET_NODE_TYPE_CODEREVIEW = 6 # deprecated +TICKET_NODE_TYPE_LINECOMMENT = 7 + +API_BASE = "http://code.dapps.douban.com/api" + +API_ENDPOINTS = { + "current_user_url": "%s%s" % (API_BASE, "/user/"), + "following_url": "%s%s" % (API_BASE, "/user/following/{target_user}"), + "user_url": "%s%s" % (API_BASE, "/users/{user}"), + "team_url": "%s%s" % (API_BASE, "/teams/{team}"), + "gist_url": "%s%s" % (API_BASE, "/gists/{gist_id}"), +} + +DOUBAN_EMAIL = ( + '@douban.com', + '@intern.douban.com', +) + +MIRROR_EMAIL = 'mirror@douban.com' + +# used in table `users` +USER_ROLE_DEFAULT= 0 +USER_ROLE_STAFF = 1 +USER_ROLE_INTERN = 2 + +# sphinx +DOC_EXT = '.sphinx_docs' +SPHINX_BUILD_DOCTREES = '.build/doctrees' +SPHINX_BUILDER_TYPES = ['html', 'pickle', 'raw'] +SPHINX_STATIC_PATHS = ['_images', '_sources', '_static'] +SPHINX_DEFAULT_CHECKOUT_ROOT = False + +# kind of code object +K_PULL = 1001 +K_ISSUE = 1002 + +# tags color +TAG_COLORS = { + 'e11d21': 'fff', + 'eb6420': 'fff', + 'fbca04': '332900', + '009800': 'fff', + '006b75': 'fff', + '207de5': 'fff', + '0052cc': 'fff', + '5319e7': 'fff', + 'f7c6c7': '332829', + 'fad8c7': '332c28', + 'fef2c0': '333026', + 'bfe5bf': '2a332a', + 'c7def8': '282d33', + 'bfdadc': '2c3233', + 'bfd4f2': '282c33', + 'd4c5f9': '2b2833', + 'cccccc': '333333', + '84b6eb': '1c2733', + 'e6e6e6': '333333', + 'ffffff': '333333', + 'cc317c': 'fff', +} + +PERM_PULL = 1 +PERM_MERGE = 10 +PERM_PUSH = 100 +PERM_ADMIN = 1000 + +PERM_TEXT = { + PERM_PULL: 'pull', + PERM_MERGE: 'merge', + PERM_PUSH: 'push', + PERM_ADMIN: 'admin', +} + +TELCHAR_URL = 'http://telchar.dapps.douban.com' +FEATURE_HOOK_URLS = frozenset([ + TELCHAR_URL +]) + +UPLOAD_URL = 'http://p.dapps.douban.com' diff --git a/vilya/models/contributions.py b/vilya/models/contributions.py new file mode 100644 index 0000000..acb72d5 --- /dev/null +++ b/vilya/models/contributions.py @@ -0,0 +1,124 @@ +# coding: utf-8 +from datetime import date, timedelta + +from vilya.libs.store import store, bdb, cache +from vilya.models.ticket import TicketComment + +MAX_SHOW_CONTRIBUTION_DAYS = 180 +MAX_UPDATE_CONTRIBUTION_DAYS = 90 + + +class UserContributions(object): + KEY_USER_DATE_CONTRIB = "contrib/%s/u_%s" + + @classmethod + @cache('code:contrib:user:{username}:{days}', expire=60 * 30) + def get_by_user(cls, username, days=None): + if days is None: + days = MAX_SHOW_CONTRIBUTION_DAYS + c = {} + for d in xrange(0, int(days)): + this_day = date.today() - timedelta(days=d) + user_contribution_by_this_day = cls.get_by_date( + username, this_day) + c.setdefault(this_day.strftime("%Y-%m-%d"), + (cls.get_score_by_user_contribution( + user_contribution_by_this_day), + user_contribution_by_this_day)) + return c + + @classmethod + def update_by_user(cls, username): + c = {} + for d in xrange(0, MAX_UPDATE_CONTRIBUTION_DAYS): + this_day = date.today() - timedelta(days=d) + user_contribution_by_this_day = cls.update_by_date( + username, this_day) + c.setdefault(this_day.strftime("%Y-%m-%d"), + (cls.get_score_by_user_contribution( + user_contribution_by_this_day), + user_contribution_by_this_day)) + return c + + @classmethod + def get_score_by_user_contribution(cls, contribution_per_day): + return 100 * len(contribution_per_day['owned_tickets']) + 5 * len( + contribution_per_day['commented_tickets']) + + @classmethod + def update_by_date(cls, username, given_date, limit=500, start=0): + + commented_tickets = cls.get_commented_ticket_ids_in_others_merged_PR_by_date( # noqa + username, given_date, limit=limit, start=start) + + result = { + "owned_tickets": cls._get_author_merged_PR_ids_by_date( + username, given_date, limit=limit, start=start), + "commented_tickets": commented_tickets, + } + + bdb.set(cls.KEY_USER_DATE_CONTRIB % ( + given_date.strftime("%Y-%m-%d"), username), result) + + return result + + @classmethod + def get_by_date(cls, username, given_date, limit=500, start=0): + + cached_result = bdb.get(cls.KEY_USER_DATE_CONTRIB % ( + given_date.strftime("%Y-%m-%d"), username)) + if cached_result: + return cached_result + + return {"owned_tickets": [], + "commented_tickets": []} + + @classmethod + def _get_author_merged_PR_ids_by_date(cls, username, given_date, + limit=500, start=0): + res = store.execute("select id from codedouban_ticket where " + "author=%s and closed is not NULL " + "and DATE(time)=%s " + "order by time desc limit %s, %s", + (username, + given_date.strftime("%Y-%m-%d"), + start, limit) + ) + return [r[0] for r in res] + + @classmethod + def _iter_others_merged_PR_ids_by_date(cls, username, given_date, + limit=500, start=0): + res = store.execute("select id from codedouban_ticket where " + "author<>%s and closed is not NULL " + "and DATE(time)=%s " + "order by time desc limit %s, %s", + (username, + given_date.strftime("%Y-%m-%d"), + start, limit) + ) + + for r in res: + yield r[0] + + @classmethod + def get_commented_ticket_ids_in_others_merged_PR_by_date( + cls, username, given_date, limit=500, start=0): + + others_merged_PR_ids = cls._iter_others_merged_PR_ids_by_date( + username, given_date, limit=limit, start=start) + + ticket_comment_list = ((tid, TicketComment.gets_by_ticketid( + tid)) for tid in others_merged_PR_ids) + + get_authors_comments = lambda comments: [ + c for c in comments if c.author == username] + + ticket_ids_and_commented_count = ((tid, len(get_authors_comments( + comments))) for tid, comments in ticket_comment_list) + + user_commented_ticket_ids_and_commented_count = [ + (tid, cnt) + for tid, cnt in ticket_ids_and_commented_count if cnt > 0] + + return user_commented_ticket_ids_and_commented_count diff --git a/vilya/models/doc.py b/vilya/models/doc.py new file mode 100644 index 0000000..af82c28 --- /dev/null +++ b/vilya/models/doc.py @@ -0,0 +1,251 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import +import os +import tempfile +import mimetypes + +from vilya.libs.permdir import get_tmpdir, get_repo_root +from vilya.libs.store import mc +from vilya.libs.rdstore import rds +from vilya.libs.armin import _unpickled, ArminOption, ArminBuilder, _search +from vilya.models.consts import ( + DOC_EXT, SPHINX_BUILDER_TYPES, SPHINX_STATIC_PATHS, + SPHINX_DEFAULT_CHECKOUT_ROOT, SPHINX_BUILD_DOCTREES) +from vilya.models.project_conf import CodeConf + +PROJECT_BUILD_INFO_MC_KEY = "doc:%s:info" +PROJECT_BUILD_TREE_HASH_MC_KEY = "doc:%s:builder:%s:tree" +PROJECT_BUILD_HASH_MC_KEY = "doc:%s:builder:%s:commit" +PROJECT_BUILD_QUEUE_RDS_KEY = "doc:queue" +DEFAULT_SPHINX_DIR = '.build' + + +class Doc(object): + template = None + + def __init__(self, project, id, path): + self.project = project + self.doc_id = id + self.doc_path = os.path.join(get_repo_root(), + "%s%s" % (project.name, DOC_EXT), + self.doc_id, + DEFAULT_SPHINX_DIR, + self.doc_id) + self._content = self.get_file(path) + self.path = path + + def get_file(self, path): + raise NotImplementedError('Subclasses should implement this!') + + @property + def exists(self): + raise NotImplementedError('Subclasses should implement this!') + + @property + def is_template(self): + raise NotImplementedError('Subclasses should implement this!') + + @property + def content(self): + raise NotImplementedError('Subclasses should implement this!') + + @property + def content_type(self): + raise NotImplementedError('Subclasses should implement this!') + + +class PickleDoc(Doc): + template = 'sphinx_docs.html' + + def get_file(self, path): + tdt = _unpickled(self.doc_path, path) + return tdt + + @property + def exists(self): + content = self.content + if content and not content.get('error'): + return True + + @property + def is_template(self): + return not any(self.path.startswith(_) for _ in SPHINX_STATIC_PATHS) + + @property + def content(self): + return self._content + + def search(self, query): + content = self._content + if self.path == 'search': + content['searchresult'] = _search(self.doc_path, query) + return content + + @property + def content_type(self): + return None + + +class HTMLDoc(Doc): + + def get_file(self, path): + fp = os.path.join(self.doc_path, path) + if not os.path.exists(fp): + return False + with open(fp) as f: + content = f.read() + return content + + @property + def exists(self): + fp = os.path.join(self.doc_path, self.path) + return os.path.exists(fp) + + @property + def is_template(self): + return None + + @property + def content(self): + return self._content + + @property + def content_type(self): + ct = mimetypes.guess_type(self.path) + if ct: + return ct[0] + return 'application/octet-stream' + + +class DocBuilder(object): + + def __init__(self, project, builder_name): + self.project = project + self.option = get_project_doc_option(project, builder_name) + self.builder = ArminBuilder(self.option) + self.builder_name = builder_name + + @property + def queue_member(self): + return "%s:%s" % (self.project.id, self.builder_name) + + @property + def can_build(self): + # Has the code_config.yaml + conf = CodeConf(self.project) + if conf.exists: + return True + + @property + def up_to_date(self): + # Already builds the source + last_commit_hash = mc.get(PROJECT_BUILD_HASH_MC_KEY % ( + self.project.id, self.builder_name)) + if not last_commit_hash: + return False + repo = self.project.repo + commit_len = len(repo.get_commits( + self.builder.commit_hex, last_commit_hash)) + if not commit_len: + return True + last_tree_hash = mc.get(PROJECT_BUILD_TREE_HASH_MC_KEY % ( + self.project.id, self.builder_name)) + if not last_tree_hash: + return False + if last_tree_hash == self.builder.tree_hex: + return True + return False + + @property + def in_queue(self): + # Already waits for building + if rds.sismember(PROJECT_BUILD_QUEUE_RDS_KEY, + self.queue_member): + return True + + def enqueue(self): + rds.sadd(PROJECT_BUILD_QUEUE_RDS_KEY, self.queue_member) + + def dequeue(self): + rds.srem(PROJECT_BUILD_QUEUE_RDS_KEY, self.queue_member) + + def build(self): + project = self.project + builder_name = self.builder_name + self.builder.option = get_doc_builder_option(project, builder_name) + self.option = self.builder.option + self.builder.build() + + +def doc_exists(project): + doc_path = os.path.join(get_repo_root(), + "%s%s" % (project.name, DOC_EXT)) + if os.path.exists(doc_path): + return True + + +def get_doc_builder(conf, id): + builder = conf.get('builder') + if builder in SPHINX_BUILDER_TYPES: + return builder + + +def get_project_doc_option(project, builder_name): + option = ArminOption() + config = get_builder_conf(project.conf, builder_name) + option.settings.update(config) + builder_dir = config.get('dir') + option.builder_dir = builder_dir + option.autodoc = True if config.get('checkout_root') else False + return option + + +def get_doc_builder_option(project, builder_name): + option = ArminOption() + + repo_path = project.repo_path + config = get_builder_conf(project.conf, builder_name) + builder = config.get('builder') + builder_dir = config.get('dir') + + temp_path = tempfile.mkdtemp(prefix='sphinx_docs_', dir=get_tmpdir()) + doc_path = os.path.join(get_repo_root(), project.name + DOC_EXT, builder) + + builder_doc_path = os.path.join(doc_path, '.build', builder) + if config.get('checkout_root'): + autodoc = True + builder_temp_path = os.path.join(temp_path, builder_dir) + else: + autodoc = False + builder_temp_path = temp_path + builder_temp_doc_path = os.path.join(builder_temp_path, '.build', builder) + + option.builder = builder + option.settings['master_doc'] = 'index' + option.settings['source_suffix'] = '.rst' + option.settings['html_short_title'] = project.name + option.settings.update(config) + option.settings['project'] = project.name # noqa -- override a setting in configuration + option.doctree_path = os.path.join(temp_path, SPHINX_BUILD_DOCTREES) + option.temp_path = temp_path + option.sourcedir = builder_temp_path + option.outdir = builder_temp_doc_path + option.doc_path = doc_path + option.builder_doc_path = builder_doc_path + option.builder_dir = builder_dir + option.autodoc = autodoc + option.repo_path = repo_path + return option + + +def get_builder_conf(project_conf, builder_name): + if not project_conf.get('docs'): + return {'dir': builder_name} + conf = project_conf['docs'].get(builder_name, False) + if not conf: + return {'dir': builder_name} + if 'dir' not in conf: + conf['dir'] = builder_name # When no explicit dir, use the name + if 'checkout_root' not in conf: + conf['checkout_root'] = SPHINX_DEFAULT_CHECKOUT_ROOT + return conf diff --git a/vilya/models/elastic/__init__.py b/vilya/models/elastic/__init__.py new file mode 100644 index 0000000..2d9d23d --- /dev/null +++ b/vilya/models/elastic/__init__.py @@ -0,0 +1,179 @@ +# -*- coding: utf-8 -*- + +import logging + +from vilya.libs.search import code_client +from vilya.libs.htmlprocessor import html_index_content +from vilya.models.gist import Gist +from vilya.models.project import CodeDoubanProject +from vilya.models.sphinx_docs import SphinxDocs + +from .searcher import SearchEngine +from .indexer import IndexEngine + + +class CodeSearch(object): + + c = code_client + if not c.head(): + c.put('') + + @classmethod + def index_a_gist(cls, id): + gist = Gist.get(id) + if not gist: + return + data = gist.as_dict() + result = {} + if data: + serial = str(id) + result = cls.c.post( + 'doc/gist_%s/' % serial, data=data, params={'refresh': True}) + return result + + @classmethod + def delete_a_gist(cls, id): + IndexEngine.delete_a_index('doc', 'gist_%s' % id) + + @classmethod + def index_a_doc_file(cls, serial, data): + result = cls.c.post( + 'doc/%s/' % serial, data=data, params={'refresh': True}) + return result + + @classmethod + def _type_result(cls, json_raw, tp): + dic = json_raw + if not dic or dic.get('error') or dic['hits']['total'] == 0: + return [] + results = [] + for e in dic['hits']['hits']: + d = e.get(tp, {}) + results.append(d) + return results + + @classmethod + def search_a_phrase(cls, phrase, from_=0, size=10, project_id=None, + sort_data=None, doctype=None): + highlight_data = { + "pre_tags": ["<highlight>"], + "post_tags": ["</highlight>"], + "fields": { + "content": {"number_of_fragments": 10}, + "description": {}, + "url": {}, + "author": {}, + } + } + + filter_list = [] + if project_id: + filter_list.append({"term": {"project_id": project_id}}) + if doctype: + filter_list.append({"term": {"type": doctype}}) + if filter_list: + filter_data = {"and": filter_list} + else: + filter_data = None + + facets_data = { + "doctype": { + "terms": { + "field": "type" + } + } + } + + result = SearchEngine.search_a_phrase('doc', phrase, from_, size, + filter_data=filter_data, + sort_data=sort_data, + highlight_data=highlight_data, + facets_data=facets_data) + return result + + @classmethod + def format_search_result(cls, result): + if not SearchEngine.check_result(result): + return [] + return zip(cls._type_result(result, '_source'), + cls._type_result(result, 'highlight')) + + @classmethod + def format_facets(cls, result): + if not SearchEngine.check_result(result): + return {} + formatted = dict(doctype=result['facets']['doctype']['terms']) + return formatted + + @classmethod + def index_a_project_docs(cls, id): + ds = DocsSearch(id) + doc_file_dicts = ds.doc_file_datas() + for data in doc_file_dicts: + if data and isinstance(data, dict): + index_filename = data['url'].replace('/', '_') + index_filename = index_filename.replace('.', '_') + serial = "project_%s_%s" % (id, index_filename) + cls.index_a_doc_file(serial, data) + + @classmethod + def delete_a_project_docs(cls, id): + data = { + "term": { + "project_id": id + } + } + cls.c.delete('doc/_query', data=data) + + +class DocsSearch(object): + + def __init__(self, project_id): + self.project_id = project_id + self.project = CodeDoubanProject.get(self.project_id) + self.repo = self.project.repo + + def doc_file_datas(self): + dicts = [] + for tab, src_paths in self._doc_infos(): + for path in src_paths: + dicts.append(self._doc_file_as_dict(path, tab[2], tab[1])) + return dicts + + def _doc_infos(self): + doc_tabs = self.project.doc_tabs() + doc_infos = [] + for tab in doc_tabs: + try: + tree = self.repo.get_tree("HEAD", tab[3], recursive=True) + except Exception, err: + logging.warning("Maybe an empty repository : %r", err) + return [] + src_paths = [d['path'] for d in tree + if d['path'].endswith((".html", ".rst"))] + doc_infos.append([tab, src_paths]) + return doc_infos + + def _doc_file_as_dict(self, path, name, doc_dir): + last_commit = self.repo.get_last_commit("HEAD", path) + if not last_commit: + return + sd = SphinxDocs(project_name=self.project.name) + data = { + 'type': 'docs', + 'description': '', + 'author': last_commit.author.name, + 'time': last_commit.time.strftime('%Y-%m-%dT%H:%M:%S'), + 'project_id': self.project.id, + 'project_name': self.project.name, + 'doc_name': name, + 'doc_dir': doc_dir, + 'url': sd.get_url_from_path(path) + } + blob = self.repo.get_file('HEAD', path) + src = blob.data or '' + if path.endswith('.html'): + data['content'] = html_index_content(src) + else: + data['content'] = src + return data diff --git a/vilya/models/elastic/consts.py b/vilya/models/elastic/consts.py new file mode 100644 index 0000000..72a8485 --- /dev/null +++ b/vilya/models/elastic/consts.py @@ -0,0 +1,90 @@ +# -*- coding: utf-8 -*- + +SEARCH_URL_ROOT = '/hub/search_beta' + +ADMINS = ['qingfeng', 'xutao', 'xyb', 'huanghuang', 'liwentao', 'fanjianjin', + 'testuser'] + +DATE_FORMAT = "%Y-%m-%dT%H:%M:%S" + +SRC_SIZE_LIMIT = 500000 + +PERPAGE_LIMIT = 10 + +WATCHS = 1 +FORKS = 2 +UPDATED = 3 +INDEXED = 4 +BADGES = 5 +PRAISES = 6 +FOLLOWERS = 7 +REPOS = 8 +CREATED = 9 + +SEARCH_KINDS = ( + K_REPO, + K_CODE, + K_USER, + K_DOC, + K_PULL, + K_ISSUE, +) = range(6) + +SEARCH_KIND_NAMES = ( + 'Repositories', + 'Codes', + 'Users', + 'Docs', + 'Pulls', + 'Issues', +) + +SEARCH_KIND_ICON_NAMES = ( + 'mini-icon-public-repo', + 'mini-icon-code', + 'mini-icon-person', + 'mini-icon-doc', + 'mini-icon-pull', + 'mini-icon-issue', +) + +REPO_ORDERS = { + WATCHS: ('Watchs', [{'watched_count': 'desc'}, '_score']), + FORKS: ('Forks', [{'forked_count': 'desc'}, '_score']), + UPDATED: ('Updated', [{'last_updated': 'desc'}, '_score']), +} + +USER_ORDERS = { + BADGES: ('Badges', [{'badges_count': 'desc'}, '_score']), + PRAISES: ('Praises', [{'praises_count': 'desc'}, '_score']), + FOLLOWERS: ('Followers', [{'followers_count': 'desc'}, '_score']), + REPOS: ('Repositories', [{'repos_count': 'desc'}, '_score']), +} + +CODE_ORDERS = { + UPDATED: ('Updated', [{'last_updated': 'desc'}, '_score']), + CREATED: ('Created', [{'commit_time': 'desc'}, '_score']), +} + +PULL_ORDERS = { + UPDATED: ('Updated', [{'base.repo.pushed_at': 'desc'}, '_score']), + CREATED: ('Created', [{'created_at': 'desc'}, '_score']), +} + +ISSUE_ORDERS = { + UPDATED: ('Updated', [{'updated_at': 'desc'}, '_score']), + CREATED: ('Created', [{'created_at': 'desc'}, '_score']), +} + +DOC_ORDERS = { + CREATED: ('Created', [{'time': 'desc'}, '_score']), +} + +KIND_ORDERS_MAP = { + K_REPO: REPO_ORDERS, + K_USER: USER_ORDERS, + K_DOC: DOC_ORDERS, + K_CODE: CODE_ORDERS, + K_ISSUE: ISSUE_ORDERS, + K_PULL: PULL_ORDERS, +} diff --git a/vilya/models/elastic/indexer.py b/vilya/models/elastic/indexer.py new file mode 100644 index 0000000..8c626ba --- /dev/null +++ b/vilya/models/elastic/indexer.py @@ -0,0 +1,88 @@ +# -*- coding: utf-8 -*- + +import json +import logging + +from vilya.libs.search import code_client + + +class IndexEngine(object): + + c = code_client + if not c.head(): + c.put('') + + @classmethod + def update_mapping(cls, index_type, data): + result = cls.c.post( + '%s/_mapping' % index_type, data=data, params={'refresh': True}) + return result + + @classmethod + def delete_mapping(cls, index_type): + result = cls.c.delete( + '%s/_mapping' % index_type, params={'refresh': True}) + return result + + @classmethod + def create_a_index(cls, index_type, index_name, data): + result = cls.c.post( + '%s/%s/' % (index_type, index_name), data=data, + params={'refresh': True}) + return result + + @classmethod + def create_index_bulk(cls, index_type, data_list, update=False, + bulk_count=90, body_size_limit=1000000): + cmd = 'update' if update else 'index' + datalen = len(data_list) + i = 0 + while i < datalen: + d = data_list[i:i + bulk_count] + + bulk_list = [] + for k, v in d: + bulk_list.append({cmd: {"_id": k}}) + if update: + v = {'doc': v, 'doc_as_upsert': True} + bulk_list.append(v) + + bulk_body_list = map( + lambda x: json.dumps(x, ensure_ascii=False), bulk_list) + bulk_body_list_len = len(bulk_body_list) + body_size = 0 + pos = 0 + while pos < bulk_body_list_len and body_size < body_size_limit: + body_size += len(bulk_body_list[pos]) + pos += 1 + if body_size >= body_size_limit: + pos = pos - 1 if pos % 2 != 0 else pos - 2 + + bulk_body = '\n'.join(bulk_body_list[:pos]) + '\n' + result = cls.c.post( + '%s/_bulk' % index_type, data=bulk_body, + params={'refresh': True}) + logging.info('create index bulk, result: %s', result) + # TODO: deal with error in result + i += pos / 2 + + @classmethod + def delete_a_index(cls, index_type, index_name): + result = cls.c.delete('%s/%s/' % (index_type, index_name)) + return result + + @classmethod + def delete_index_bulk(cls, index_type, data_list, bulk_count=1000): + datalen = len(data_list) + for i in range(0, datalen, bulk_count): + d = data_list[i:i + bulk_count] + + bulk_list = [] + for k in d: + bulk_list.append({"delete": {"_id": k}}) + + bulk_body = '\n'.join(map( + lambda x: json.dumps(x, ensure_ascii=False), bulk_list)) + '\n' + result = cls.c.post( + '%s/_bulk' % index_type, data=bulk_body, + params={'refresh': True}) diff --git a/vilya/models/elastic/issue_pr_search.py b/vilya/models/elastic/issue_pr_search.py new file mode 100644 index 0000000..9c187b6 --- /dev/null +++ b/vilya/models/elastic/issue_pr_search.py @@ -0,0 +1,190 @@ +# -*- coding: utf-8 -*- + +import logging + +from vilya.libs.store import store +from vilya.libs.text import trunc_utf8 + +from vilya.models.project_issue import ProjectIssue +from vilya.models.pull import PullRequest +from vilya.models.ticket import Ticket +from vilya.models.project import CodeDoubanProject +from vilya.models.user import User +from vilya.models.elastic.indexer import IndexEngine +from vilya.models.elastic.searcher import SearchEngine + + +class IssuePRSearch(object): + type_name = '' + + @classmethod + def index_an_object(cls, serial, data): + return IndexEngine.create_a_index(cls.type_name, serial, data) + + @classmethod + def search_a_phrase(cls, phrase, project_id=None, from_=0, size=20, + state=None, sort_data=None): + filter_list = [] + if project_id: + if cls.type_name == "issue": + key = "project_id" + else: + key = "to_proj_id" + filter_list.append({ + "term": { + key: project_id + } + }) + if state: + filter_list.append({"term": {"state": state}}) + if filter_list: + filter_data = {"and": filter_list} + else: + filter_data = None + + highlight_data = { + "fields": { + "description": {"number_of_fragments": 0} + } + } + + facets_data = { + "state": { + "terms": { + "field": "state" + } + } + } + + result = SearchEngine.search_a_phrase(cls.type_name, phrase, from_, + size, sort_data=sort_data, + filter_data=filter_data, + highlight_data=highlight_data, + facets_data=facets_data) + return result + + @classmethod + def index_a_project(cls, project): + IssueSearch.index_a_project_issue(project) + PullRequestSearch.index_a_project_pr(project) + + @classmethod + def format_facets(cls, result): + if not SearchEngine.check_result(result): + return {} + formatted = dict(state=result['facets']['state']['terms']) + return formatted + + +class IssueSearch(IssuePRSearch): + + type_name = "issue" + + @classmethod + def index_a_project_issue(cls, project): + issues = ProjectIssue._get_issues_by_project_id(project.id) + for issue in issues: + data = issue.as_dict() + if data: + serial = "%s_%s" % (project.index_name, issue.number) + cls.index_an_object(serial, data) + + @classmethod + def format_search_result(cls, result): + if not SearchEngine.check_result(result): + return [] + formatted = [] + result = result['hits']['hits'] + for r in result: + _source = r['_source'] + try: + hl_description = r['highlight']['description'][0] + except: + logging.debug('No highlight for %s', _source) + hl_description = '' + description = _source.get('description') + sr = dict( + issue_id=_source.get('issue_id'), + description=description if description else '', + hl_description=hl_description, + ) + if not sr['issue_id']: + logging.warn('Invaild issue search result, skip: %s', _source) + continue + sr = IssueResult(**sr) + formatted.append(sr) + return formatted + + +class PullRequestSearch(IssuePRSearch): + + type_name = "pull" + + @classmethod + def index_a_project_pr(cls, project): + rs = store.execute("select ticket_id from pullreq " + "where to_project=%s", project.id) + for r, in rs: + pr = PullRequest.get_by_proj_and_ticket(project.id, r) + if pr: + data = pr.as_dict() + if data: + serial = "%s_%s" % (project.index_name, r) + cls.index_an_object(serial, data) + + @classmethod + def format_search_result(cls, result): + if not SearchEngine.check_result(result): + return [] + formatted = [] + result = result['hits']['hits'] + for r in result: + _source = r['_source'] + try: + hl_description = r['highlight']['description'][0] + except: + logging.debug('No highlight for %s', _source) + hl_description = '' + sr = dict( + ticket_number=_source.get('ticket_id'), + project_id=_source.get('to_proj_id'), + hl_description=hl_description, + ) + if not sr['project_id'] or not sr['ticket_number']: + logging.warn( + 'Invaild pullrequest search result, skip: %s', _source) + continue + sr = PullResult(**sr) + formatted.append(sr) + return formatted + + +class PullResult(object): + + def __init__(self, project_id, ticket_number, hl_description): + self.ticket = Ticket.get_by_projectid_and_ticketnumber( + project_id, ticket_number) + self.ticket_project = CodeDoubanProject.get(self.ticket.project_id) + self.author = User(self.ticket.author) + self.ticket_url = self.ticket.url + self.hl_description = hl_description if hl_description \ + else self.ticket.description + + def snippet(self): + desc = self.hl_description + return trunc_utf8(desc, 300) + + +class IssueResult(object): + + def __init__(self, issue_id, description, hl_description): + self.issue = ProjectIssue.get_by_issue_id(issue_id) \ + if issue_id else None + if self.issue and self.issue.description: + description = self.issue.description + self.description = description + self.hl_description = hl_description or description + + def snippet(self): + desc = self.hl_description + return trunc_utf8(desc, 300) diff --git a/vilya/models/elastic/repo_search.py b/vilya/models/elastic/repo_search.py new file mode 100644 index 0000000..325a578 --- /dev/null +++ b/vilya/models/elastic/repo_search.py @@ -0,0 +1,146 @@ +# -*- coding: utf-8 -*- + +import logging +from datetime import datetime + +from vilya.models.project import CodeDoubanProject +from vilya.models.user import User + +from .consts import DATE_FORMAT +from .indexer import IndexEngine +from .searcher import SearchEngine + + +class RepoSearch(object): + + @classmethod + def delete_mapping(cls): + result = IndexEngine.delete_mapping('repo') + return result + + @classmethod + def search_a_phrase(cls, phrase, from_=0, size=20, sort_data=None): + highlight_data = { + "fields": { + "description": {"number_of_fragments": 0} + } + } + + if not sort_data: + sort_data = [ + {"forked_count": "desc"}, + {"watched_count": "desc"}, + "_score", + ] + + result = SearchEngine.search_a_phrase('repo', phrase, from_, size, + sort_data=sort_data, + highlight_data=highlight_data) + return result + + @classmethod + def format_search_result(cls, result): + if not SearchEngine.check_result(result): + return [] + formatted = [] + result = result['hits']['hits'] + for r in result: + _source = r['_source'] + try: + hl_description = r['highlight']['description'][0] + except: + logging.error('No highlight for %s', _source) + hl_description = '' + sr = RepoResult( + id=_source.get('id'), + last_updated_str=_source.get('last_updated'), + hl_description=hl_description, + ) + formatted.append(sr) + return formatted + + @classmethod + def get_repo_index_from_project(cls, project): + fork_from = project.get_forked_from() + fork_from = fork_from.name if fork_from else '' + last_commit = project.repo.get_last_commit('HEAD') + commit_time = last_commit.commit_time if last_commit else project.time + index_data = dict( + id=str(project.id), + name=project.name, + owner=project.owner_name, + description=project.summary, + url=project.url, + language=project.language, + fork_from=fork_from, + forked_count=CodeDoubanProject.get_forked_count(project.id), + watched_count=CodeDoubanProject.get_watched_count(project.id), + create_time=project.time.strftime(DATE_FORMAT), + last_updated=commit_time.strftime(DATE_FORMAT), + ) + return index_data + + @classmethod + def index_repos(cls): + projects = CodeDoubanProject.get_projects(sortby='sumup') + index_data = [cls.get_repo_index_from_project(project) + for project in projects] + indexes = [(data['id'], data) for data in index_data] + IndexEngine.create_index_bulk('repo', indexes) + + @classmethod + def query_repo_objs(cls, size=1000): + result = SearchEngine.query_all('repo') + if result and result.get('error'): + return [] + total = result['hits']['total'] + + id_list = [] + from_ = 0 + while from_ < total: + result = SearchEngine.query_all('repo', from_, size) + result = SearchEngine.decode(result, ('id',)) + id_list += result + from_ += size + return id_list + + @classmethod + def update_repo_indexes(cls): + old_obj_ids = cls.query_repo_objs() + old_obj_ids = [id for id, in old_obj_ids] + new_obj_ids = CodeDoubanProject.get_project_ids_sortby_sumup() + new_objs = CodeDoubanProject.gets(new_obj_ids) + to_delete_ids = set(old_obj_ids) - set(new_obj_ids) + + cls.delete_repo_indexes(to_delete_ids) + + index_data = [cls.get_repo_index_from_project(project) + for project in new_objs] + indexes = [(data['id'], data) for data in index_data] + IndexEngine.create_index_bulk('repo', indexes) + + @classmethod + def delete_repo_indexes(cls, project_ids): + index_ids = [str(id) for id in project_ids] + IndexEngine.delete_index_bulk('repo', index_ids) + + +class RepoResult(object): + + def __init__(self, id='', last_updated_str='', hl_description=''): + self.id = str(id) + self.project = CodeDoubanProject.get(id) + self.name = self.project.name + self.owner = User(self.project.owner_name) + self.last_updated = datetime.strptime( + last_updated_str, DATE_FORMAT) if last_updated_str \ + else self.project.time + self.create_time = self.project.time + self.description = self.project.summary + self.url = self.project.url + self.language = self.project.language + self.fork_from = self.project.get_forked_from() + self.forked_count = CodeDoubanProject.get_forked_count(self.project.id) + self.watched_count = CodeDoubanProject.get_watched_count( + self.project.id) + self.hl_description = hl_description or self.description diff --git a/vilya/models/elastic/searcher.py b/vilya/models/elastic/searcher.py new file mode 100644 index 0000000..56244d8 --- /dev/null +++ b/vilya/models/elastic/searcher.py @@ -0,0 +1,95 @@ +# -*- coding: utf-8 -*- + +from vilya.libs.search import code_client + + +class SearchEngine(object): + + c = code_client + if not c.head(): + c.put('') + + @classmethod + def check_result(cls, result): + if result and not result.get('error'): + return True + return False + + @classmethod + def decode(cls, json_raw, parse_names): + dic = json_raw + if not cls.check_result(dic): + return [] + decoded = [] + for e in dic['hits']['hits']: + d = e['_source'] + values = [] + for parse_name in parse_names: + values.append(d.get(parse_name)) + decoded.append(values) + return decoded + + @classmethod + def get_count(cls, result): + if cls.check_result(result): + return result['hits']['total'] + return 0 + + @classmethod + def query_all(cls, index_type, from_=0, size=0): + data = { + 'from': from_, + 'size': size, + 'query': { + 'match_all': {} + } + } + result = cls.c.get('%s/_search' % index_type, data=data) + return result + + @classmethod + def query_by_field(cls, index_type, field_dict, from_=0, size=0): + data = { + 'from': from_, + 'size': size, + 'query': { + "term": field_dict, + }, + } + result = cls.c.get('%s/_search' % index_type, data=data) + return result + + @classmethod + def search_a_phrase(cls, index_type, phrase, from_=0, size=20, + filter_data=None, sort_data=None, highlight_data=None, + facets_data=None): + data = { + 'from': from_, + 'size': size, + "query": { + "query_string": { + "query": phrase + } + }, + } + + if highlight_data: + data['highlight'] = highlight_data + + if filter_data: + filtered_query_data = { + "filtered": { + "query": data['query'], + "filter": filter_data, + } + } + data['query'] = filtered_query_data + + if sort_data: + data['sort'] = sort_data + + if facets_data: + data['facets'] = facets_data + + result = cls.c.get('%s/_search' % index_type, data=data) + return result diff --git a/vilya/models/elastic/src_search.py b/vilya/models/elastic/src_search.py new file mode 100644 index 0000000..890363d --- /dev/null +++ b/vilya/models/elastic/src_search.py @@ -0,0 +1,407 @@ +# -*- coding: utf-8 -*- + +import re +import logging +from datetime import datetime +from urlparse import urljoin +from collections import defaultdict + +from vilya.models.project import CodeDoubanProject +from vilya.models.user import User +from vilya.libs import consts +from vilya.libs.text import highlight_code + + +from .consts import DATE_FORMAT, SRC_SIZE_LIMIT +from .indexer import IndexEngine +from .searcher import SearchEngine + + +class SrcSearch(object): + + @classmethod + def update_mapping(cls): + data = { + "src": { + "properties": { + "project": { + "type": "multi_field", + "fields": { + "project": { + "type": "string", + "index": "analyzed" + }, + "raw": { + "type": "string", + "index": "not_analyzed" + } + } + }, + "owner": { + "type": "multi_field", + "fields": { + "owner": { + "type": "string", + "index": "analyzed" + }, + "raw": { + "type": "string", + "index": "not_analyzed" + } + } + }, + "committer": { + "type": "multi_field", + "fields": { + "committer": { + "type": "string", + "index": "analyzed" + }, + "raw": { + "type": "string", + "index": "not_analyzed" + } + } + }, + "language": { + "type": "multi_field", + "fields": { + "language": { + "type": "string", + "index": "analyzed" + }, + "raw": { + "type": "string", + "index": "not_analyzed" + } + } + }, + } + } + } + result = IndexEngine.update_mapping('src', data) + return result + + @classmethod + def delete_mapping(cls): + result = IndexEngine.delete_mapping('src') + return result + + @classmethod + def query_by_project(cls, project_name, from_=0, size=0): + field_dict = { + "project.raw": project_name, + } + result = SearchEngine.query_by_field('src', field_dict, from_, size) + return result + + @classmethod + def search_a_phrase(cls, phrase, from_=0, size=20, project_id=None, + sort_data=None, language=None): + highlight_data = { + "fields": { + "content": {"number_of_fragments": 0} + } + } + + filter_list = [] + + # FIXME: use project_id field + project = CodeDoubanProject.get(project_id) if project_id else None + if project: + filter_list.append({"term": {"project.raw": project.name}}) + + if language: + filter_list.append({"term": {"language.raw": language}}) + + if filter_list: + filter_data = {"and": filter_list} + else: + filter_data = None + + if not sort_data: + if project_id: + sort_data = ['rank', '_score'] + else: + sort_data = [ + "rank", + "_score", + {"project_rank": "desc"}, + {"last_updated": "desc"}, + ] + + facets_data = { + "language": { + "terms": { + "field": "language.raw" + } + } + } + + result = SearchEngine.search_a_phrase('src', phrase, from_, size, + sort_data=sort_data, + filter_data=filter_data, + highlight_data=highlight_data, + facets_data=facets_data) + return result + + @classmethod + def format_search_result(cls, result): + if not SearchEngine.check_result(result): + return [] + formatted = [] + result = result['hits']['hits'] + for r in result: + _source = r['_source'] + try: + hl_content = r['highlight']['content'][0] + except: + logging.error('No highlight content for %s', _source) + hl_content = '' + + project_name = _source.get('project') + if not project_name: + logging.error('Invaild index: %s', _source) + continue + + project = CodeDoubanProject.get_by_name(project_name) + if not project: + logging.error( + 'Invaild index: %s, project: %s', (_source, project_name)) + continue + + sr = SrcResult( + id=_source.get('id'), + commit_id=_source.get('commit'), + name=_source.get('name'), + project_name=_source.get('project'), + owner_name=_source.get('owner'), + last_updated_str=_source.get('last_updated'), + content=_source.get('content'), + language=_source.get('language'), + hl_content=hl_content, + ) + formatted.append(sr) + return formatted + + @classmethod + def format_facets(cls, result): + if not SearchEngine.check_result(result): + return {} + formatted = dict(language=result['facets']['language']['terms']) + return formatted + + @classmethod + def get_src_index_from_project(cls, project, repo, src_data): + obj_id = src_data[0] + obj = repo.repo.show(obj_id) + index_data = {} + if not obj['binary']: + obj_name = src_data[1]['path'] + obj_size = obj['size'] + commit_id = src_data[1]['commit'] + commit_time = src_data[1]['commit_time'] + committer = src_data[1]['committer'].encode('utf8') + rank = src_data[1]['rank'] + # don't fully index a large src + obj_data = obj['data'] if obj_size < SRC_SIZE_LIMIT else obj['data'][:SRC_SIZE_LIMIT] # noqa + index_data = dict( + id=obj_id, + commit=commit_id, + commit_time=commit_time.strftime(DATE_FORMAT), + committer=committer, + name=obj_name, + project=project.name, + owner=project.owner_name, + content=obj_data, + last_updated=datetime.now().strftime(DATE_FORMAT), + rank=rank, + size=obj_size, + language=cls.get_src_language(obj_name), + ) + return index_data + + @classmethod + def get_src_language(cls, path): + filename = path.split('/')[-1] # strip directories + pos = filename.rfind('.') + if pos == -1 or pos == 0: + ext = '' + else: + ext = filename[pos + 1:] + + if not ext: + language = consts.LANGUAGES_WITHOUT_EXT.get(filename) + else: + language = consts.LANGUAGES.get(ext) + + return language or 'Text' + + @classmethod + def _get_all_revobjs_with_rank(cls, project): + result = project.repo.get_all_src_objects() + # calc rank base on size + result_by_name = defaultdict(list) + for obj_id, data in result.iteritems(): + result_by_name[data['path']].append((obj_id, data['size'])) + for name, data in result_by_name.iteritems(): + data.sort(key=lambda x: x[1], reverse=True) + for seq, obj_data in enumerate(data): + result[obj_data[0]]['rank'] = seq + 1 + + return result + + @classmethod + def get_src_indexes_from_project(cls, project): + rev_objects = cls._get_all_revobjs_with_rank(project) + repo = project.repo + indexes = [] + for data in rev_objects.iteritems(): + index_data = cls.get_src_index_from_project(project, repo, data) + if not index_data: + continue + index_id = str(project.id) + index_data['id'] + indexes.append((index_id, index_data)) + return indexes + + @classmethod + def index_a_project(cls, project): + indexes = cls.get_src_indexes_from_project(project) + + # FIXME: change project_rank algrithm + project_rank = CodeDoubanProject.get_forked_count(project.id) + for id, data in indexes: + data['project_rank'] = project_rank + + IndexEngine.create_index_bulk('src', indexes) + + @classmethod + def query_a_project_objs(cls, project_name, fields, size=1000): + result = cls.query_by_project(project_name) + if result and result.get('error'): + return [] + total = result['hits']['total'] + + id_list = [] + from_ = 0 + while from_ < total: + result = cls.query_by_project(project_name, from_, size) + result = SearchEngine.decode(result, fields) + id_list += result + from_ += size + return id_list + + @classmethod + def update_a_project_index(cls, project): + rev_objs = cls._get_all_revobjs_with_rank(project) + rev_obj_ids = set(rev_objs) + rev_obj_id_stats = set((id, data['rank']) + for id, data in rev_objs.iteritems()) + + old_obj_id_stats = cls.query_a_project_objs( + project.name, fields=('id', 'rank')) + old_obj_ids = set(data[0] for data in old_obj_id_stats) + old_obj_id_stats = set(tuple(i) for i in old_obj_id_stats) + + to_delete_ids = old_obj_ids - rev_obj_ids + to_add_ids = rev_obj_ids - old_obj_ids + to_update_id_stats = rev_obj_id_stats - old_obj_id_stats + to_update_id_stats = [data for data in to_update_id_stats + if data[0] not in to_add_ids] + + index_ids = [str(project.id) + i for i in to_delete_ids] + IndexEngine.delete_index_bulk('src', index_ids) + + # FIXME: remove this bulk update support + to_add_ids |= set(data[0] for data in to_update_id_stats) + + repo = project.repo + indexes = [] + for i in to_add_ids: + index_data = cls.get_src_index_from_project( + project, repo, (i, rev_objs[i])) + if index_data: + index_id = str(project.id) + i + indexes.append((index_id, index_data)) + IndexEngine.create_index_bulk('src', indexes) + + # FIXME: uncomment this if bulk update support + # indexes = [] + # for id, rank in to_update_id_stats: + # index_id = str(project.id) + id + # index_data = dict(rank=rank) + # indexes.append((index_id, index_data)) + # IndexEngine.create_index_bulk('src', indexes, update=True, + # bulk_count=500) + + @classmethod + def delete_a_project_index(cls, project): + old_obj_ids = [i for i, in cls.query_a_project_objs( + project.name, fields=('id',))] + index_ids = [str(project.id) + i for i in old_obj_ids] + IndexEngine.delete_index_bulk('src', index_ids) + + @classmethod + def update_a_project_index_rank(cls, project, project_rank): + old_obj_id_stats = cls.query_a_project_objs( + project.name, fields=('id', )) + indexes = [] + for id, in old_obj_id_stats: + index_id = str(project.id) + id + index_data = dict(project_rank=project_rank) + indexes.append((index_id, index_data)) + IndexEngine.create_index_bulk('src', indexes, update=True, bulk_count=500) + + +class SrcResult(object): + + def __init__(self, id='', commit_id='', name='', project_name='', + owner_name='', last_updated_str='', content='', hl_content='', + language=''): + self.id = str(id) + self.commit_id = str(commit_id) + self.name = name + self.project = CodeDoubanProject.get_by_name(project_name) + self.owner = User(owner_name) + self.last_updated = datetime.strptime( + last_updated_str, DATE_FORMAT) if last_updated_str else self.project.time + self.content = content + self.hl_content = hl_content or content + self.language = language + + self.path_url = urljoin(urljoin( + self.project.url, 'blob/%s/' % self.commit_id), self.name) + + def snippet(self): + # TODO: fragment + raw_content_lines = list(enumerate(self.content.split('\n'))) + hl_content_lines = list(enumerate(self.hl_content.split('\n'))) + fragment_lines = set(raw_content_lines) - set(hl_content_lines) + line_nums = sorted([i for i, c in fragment_lines]) + + max_lines = 10 + begin = line_nums[0] if line_nums else 0 + end = line_nums[-1] if line_nums else max_lines + delta = min(max_lines, end - begin + 1) + + snippets = [c for i, c in raw_content_lines[begin:begin + delta]] + hl_name = self.name + for line in snippets: + if len(line) > 512: + # don't highlight long line + hl_name = 'xxx' + highlighted = highlight_code( + hl_name, '\n'.join(snippets), linenostart=begin + 1).decode('utf8') + phrases = re.findall( + ur'<em>(\w+)</em>', self.hl_content.decode('utf8'), + flags=re.UNICODE) + pattern = ur'|'.join(set(phrases)) + if pattern: + pattern = ur'(%s)(?![^<>]*>)' % pattern + highlighted = re.sub( + pattern, ur'<em>\g<0></em>', highlighted, + flags=re.UNICODE).encode('utf8') + else: + logging.debug('Fail to highlight keywords in search result. \nraw_content: \n%s\n\nhl_content: \n%s', # noqa + self.content, self.hl_content) + return highlighted diff --git a/vilya/models/elastic/user_search.py b/vilya/models/elastic/user_search.py new file mode 100644 index 0000000..e6ba603 --- /dev/null +++ b/vilya/models/elastic/user_search.py @@ -0,0 +1,102 @@ +# -*- coding: utf-8 -*- +from datetime import datetime + +from vilya.models.project import CodeDoubanProject +from vilya.models.user import User + +from .consts import DATE_FORMAT +from .indexer import IndexEngine +from .searcher import SearchEngine + + +class UserSearch(object): + + @classmethod + def delete_mapping(cls): + result = IndexEngine.delete_mapping('user') + return result + + @classmethod + def search_a_phrase(cls, phrase, from_=0, size=20, sort_data=None): + result = SearchEngine.search_a_phrase('user', phrase, from_, size, + sort_data=sort_data) + return result + + @classmethod + def format_search_result(cls, result): + if not SearchEngine.check_result(result): + return [] + formatted = [] + result = result['hits']['hits'] + for r in result: + _source = r['_source'] + sr = UserResult( + name=_source.get('name'), + ) + formatted.append(sr) + return formatted + + @classmethod + def get_user_index(cls, user): + index_data = user.as_dict() + badges_count = len(index_data['badges']) + del index_data['badges'] + praises_count = len(user.get_praises()) + repos_count = len(CodeDoubanProject.get_ids(owner=user.name)) + index_data.update( # TODO: add other necessary fields + repos_count=repos_count, + praises_count=praises_count, + badges_count=badges_count, + last_updated=datetime.now().strftime(DATE_FORMAT), # FIXME + ) + return index_data + + @classmethod + def index_users(cls): + projects = CodeDoubanProject.get_projects() + user_names = set(project.owner_name for project in projects) + index_data = [cls.get_user_index(User(u)) for u in user_names] + indexes = [(data['name'].encode('hex'), data) for data in index_data] + IndexEngine.create_index_bulk('user', indexes) + + @classmethod + def query_user_objs(cls, size=1000): + result = SearchEngine.query_all('user') + if result and result.get('error'): + return [] + total = result['hits']['total'] + + name_list = [] + from_ = 0 + while from_ < total: + result = SearchEngine.query_all('user', from_, size) + result = SearchEngine.decode(result, ('name',)) + name_list += result + from_ += size + return name_list + + @classmethod + def update_user_indexes(cls): + old_obj_names = cls.query_user_objs() + old_obj_names = set(name for name, in old_obj_names) + projects = CodeDoubanProject.get_projects() + new_obj_names = set(project.owner_name for project in projects) + to_delete_names = old_obj_names - new_obj_names + + cls.delete_user_indexes(to_delete_names) + + index_data = [cls.get_user_index(User(u)) for u in new_obj_names] + indexes = [(data['name'].encode('hex'), data) for data in index_data] + IndexEngine.create_index_bulk('user', indexes) + + @classmethod + def delete_user_indexes(cls, user_names): + index_ids = [name.encode('hex') for name in user_names] + IndexEngine.delete_index_bulk('user', index_ids) + + +class UserResult(object): + + def __init__(self, name=''): + self.name = name + self.user = User(name) diff --git a/vilya/models/fair.py b/vilya/models/fair.py new file mode 100644 index 0000000..96ed3cd --- /dev/null +++ b/vilya/models/fair.py @@ -0,0 +1,57 @@ +# coding: utf-8 + +from datetime import datetime + +from vilya.models.team import Team +from vilya.models.tag import TAG_TYPE_FAIR_ISSUE + + +FAIR_ID = 0 + + +class FairTeam(Team): + def __init__(self): + self.id = FAIR_ID + self.team_id = FAIR_ID + self.uid = 'fair' + self.name = 'fair' + self.description = '' + self.created_at = datetime(2013, 7, 19) + + def __repr__(self): + return '<FairTeam>' + + def __str__(self): + return self.name + + def get_uuid(self): + return '/fair' + + @property + def url(self): + return '/fair/' + + @property + def tag_type(self): + return TAG_TYPE_FAIR_ISSUE + + def delete(self): + # can not delete + pass + + def is_admin(self, user_id): + return user_id in ['xyb', 'testuser', 'qingfeng', 'huanghuang', 'xutao'] # noqa + + def is_creator(self, user_id): + return self.is_admin(user_id) + + def is_viewer(self, user_id): + return True + + def had_joined(self, user_id): + # all companee can use fair + return True + + +def get_fair(): + return Team.get(FAIR_ID) diff --git a/vilya/models/fair_issue.py b/vilya/models/fair_issue.py new file mode 100644 index 0000000..1b93dbe --- /dev/null +++ b/vilya/models/fair_issue.py @@ -0,0 +1,145 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import + +from urlparse import urlparse + +from vilya.libs.store import store, mc, cache, IntegrityError +from vilya.models.issue import Issue, get_issue_by_id_and_state +from vilya.models.tag import TAG_TYPE_FAIR_ISSUE + +MC_KEY_ISSUE_PLEDGED = 'issue_pledged:%s' + + +class FairIssue(Issue): + target_type = 'fair' + tag_type = TAG_TYPE_FAIR_ISSUE + provided_features = ['team-issue', 'fair-issue', 'related-projects', + 'pledge'] + + def __init__(self, id, team_id, issue_id, number, title=None, + creator=None, assignee=None, closer=None, + created_at=None, updated_at=None, closed_at=None, + type=''): + Issue.__init__(self, issue_id, title, creator, assignee, closer, + created_at, updated_at, closed_at, self.target_type) + self.number = self.id + from vilya.models.fair import FAIR_ID + self.team_id = FAIR_ID + + @property + def url(self): + return '/fair/%s/' % self.issue_id + + @property + def target(self): + from vilya.models.fair import get_fair + return get_fair() + + @classmethod + def add(cls, title, description, creator, number=None, + team=None, project=None, assignee=None, closer=None, + created_at=None, updated_at=None, closed_at=None): + issue = Issue.add(title, description, creator, assignee=assignee, + closer=closer, type='fair', target_id=team) + if issue: + number = issue.id + ''' + team_issue_id = store.execute( + 'insert into team_issues (team_id, issue_id, number) ' + 'values (%s, %s, %s)', + (team, issue.id, number)) + store.commit() + ''' + return cls(issue.id, team, issue.id, number, title, creator, + assignee, closer, issue.created_at, issue.updated_at) + + @classmethod + def get(cls, team_id, issue_id=None, number=None): + # FIXME: dirty hack. 需要统一子类和基类的get方法 + if number: + issue_id = number + return Issue.get_cached_issue(issue_id) + + @classmethod + def get_by_issue_id(cls, issue_id): + issue = Issue.get(issue_id) + if issue: + from vilya.models.fair import FAIR_ID + return cls(id, FAIR_ID, issue.id, issue.id, issue.title, + issue.creator_id, issue.assignee_id, issue.closer_id, + issue.created_at, issue.updated_at, issue.closed_at, + issue.type) + + @classmethod + def gets_by_issue_ids(cls, issue_ids, state): + fair_issues = [] + for issue_id in issue_ids: + fair_issue = get_issue_by_id_and_state(issue_id, state) + if fair_issue: + fair_issues.append(fair_issue) + fair_issues.sort(key=lambda x: x.updated_at, reverse=True) + return fair_issues + + def add_related_project(self, repo_url): + info = urlparse(repo_url) + project_name = info.path.strip('/') + from vilya.models.project import CodeDoubanProject + prj = CodeDoubanProject.get_by_name(project_name) + if prj not in self.related_projects: + store.execute('insert into issue_related_projects ' + '(issue_id, project_id) values(%s, %s)', + (self.issue_id, prj.id)) + store.commit() + + def delete_related_project(self, prj): + store.execute('delete from issue_related_projects ' + 'where issue_id=%s and project_id=%s', + (self.issue_id, prj.id)) + store.commit() + + @property + def related_projects(self): + rs = store.execute('select project_id from issue_related_projects ' + 'where issue_id=%s', (self.issue_id,)) + prj_ids = [id for (id, ) in rs] + from vilya.models.project import CodeDoubanProject + return CodeDoubanProject.gets(prj_ids) + + @property + def pledged(self): + from vilya.models.user import User + return [(User(user_id), amount) + for user_id, amount, time in self.get_pledged()] + + @property + def pledged_amount(self): + amounts = [amount for user_id, amount, time in self.get_pledged()] + return sum(amounts) + + def pledged_by(self, user): + for auser, amount in self.pledged: + if auser == user: + return amount + return 0 + + @cache(MC_KEY_ISSUE_PLEDGED % '{self.issue_id}') + def get_pledged(self): + rs = store.execute('select user_id, amount, created_at ' + 'from issue_pledge ' + 'where issue_id=%s ', + (self.issue_id,)) + return rs + + def update_pledge(self, user, amount): + try: + store.execute('insert into issue_pledge ' + '(issue_id, user_id, amount) ' + 'values (%s, %s, %s)', + (self.issue_id, user.name, amount)) + except IntegrityError: + store.execute('update issue_pledge ' + 'set amount=%s ' + 'where issue_id=%s and user_id=%s', + (amount, self.issue_id, user.name)) + store.commit() + mc.delete(MC_KEY_ISSUE_PLEDGED % self.issue_id) diff --git a/vilya/models/feed.py b/vilya/models/feed.py new file mode 100644 index 0000000..0dc9254 --- /dev/null +++ b/vilya/models/feed.py @@ -0,0 +1,476 @@ +# -*- coding: utf-8 -*- + +import json +from datetime import datetime + +from vilya.libs.rdstore import rds +from vilya.libs.signals import ( + pullrequest_signal, codereview_signal, rds_pub_signal, + push_signal, gist_created_signal, gist_commented_signal, + gist_starred_signal, gist_updated_signal, gist_forked_signal, + repo_create_signal, repo_watch_signal, repo_fork_signal, + team_created_signal, team_joined_signal, issue_signal, + issue_comment_signal, follow_user_signal) +from vilya.models.utils import ( + CJsonEncoder, format_pullrequest_info, format_code_review_info, + format_issue_info, format_issue_comment_info, to_timestamp, + get_issue_by_issue_id) +from vilya.models.notification import ( + get_issue_notify_receivers, get_pr_notify_receivers) +from vilya.models.project import CodeDoubanProject +from vilya.models.team import TeamProjectRelationship +from vilya.models.gist import Gist +from vilya.models.user import User +from vilya.models.pull import PullRequest + +MAX_ACTIONS_COUNT = 1009 # Happy Number +RDS_USER_INBOX_KEY = 'feed:private:user:v2:%s' +RDS_USER_FEED_KEY = 'feed:public:user:v2:%s' +RDS_PUBLIC_FEED_KEY = 'feed:public:everyone:v2' +RDS_TEAM_FEED_KEY = 'feed:public:team:v2:%s' +PAGE_ACTIONS_COUNT = 35 + + +class Feed(object): + + def __init__(self, db_key): + self.db_key = db_key + + def __repr__(self): + return '%s (%s)' % (self.__class__, self.db_key) + + @classmethod + def get(cls, db_key): + return cls(db_key=db_key) + + def add_action(self, action_data): + data = json.dumps(action_data, cls=CJsonEncoder) + # the order of args to zadd is reversed in redis-py from that in redis + print rds, data, self.db_key, action_data + rds.zadd(self.db_key, data, to_timestamp(action_data.get('date'))) + rds.zremrangebyrank(self.db_key, 0, -1 * (MAX_ACTIONS_COUNT + 1)) + rds_pub_signal.send('feed_add_action', + data=data, + channel=self.db_key, + is_notify=False, + show_avatar=True) + + def get_actions(self, start=0, stop=MAX_ACTIONS_COUNT): + data = rds.zrevrange(self.db_key, start, stop) + return [json.loads(d) for d in data] + + def get_actions_by_timestamp(self, max='+inf', min='-inf'): + data = rds.zrevrangebyscore(self.db_key, max, min) + return [json.loads(d) for d in data] + + +# new dispatchable feedmsg +class FeedMsg(object): + def __init__(self, sender, receivers, project=None, data=None, + team_id=None): + # FIXME: args' order + self._sender = sender + self._receivers = set(receivers) if receivers else set() + self._project = project + self._team_id = team_id + self._data = data + + def send(self): + feeds = [self.get_user_feed()] + feeds += [self.get_public_feed()] + feeds += self.get_related_user_inbox_feeds() + feeds += self.get_related_team_feeds() + for feed in feeds: + feed.add_action(self._data) + + def get_related_user_inbox_feeds(self): + ''' user_timeline of actor, actor's followers, project owner, + project's watchers, extra_receivers ''' + sender = User(self._sender) + followers = sender.get_followers() if sender else [] + project = self._project + if project: + proj_users = [u.username for u in project.get_watch_users()] + proj_users.append(project.owner.username) + else: + proj_users = [] + receivers = {self._sender} | set(followers) | set(proj_users) | self._receivers # noqa + return [get_user_inbox(r) for r in receivers] + + def get_related_team_feeds(self): + ''' team_timeline of project related team, team_ids ''' + project = self._project + team_id = {self._team_id} if self._team_id else set() + if project: + rls = TeamProjectRelationship.gets(project_id=project.id) + related_team_ids = [rl.team_id for rl in rls] + else: + related_team_ids = [] + team_ids = team_id | set(related_team_ids) + return [get_team_feed(t) for t in team_ids] + + def get_public_feed(self): + ''' public_timeline ''' + return get_public_feed() + + def get_user_feed(self): + ''' user_profile_timeline of actor ''' + return get_user_feed(self._sender) + + +def get_user_inbox(user): + return Feed.get(db_key=RDS_USER_INBOX_KEY % user) + + +def get_user_feed(user): + return Feed.get(db_key=RDS_USER_FEED_KEY % user) + + +def get_public_feed(): + return Feed.get(db_key=RDS_PUBLIC_FEED_KEY) + + +def get_team_feed(team): + return Feed.get(db_key=RDS_TEAM_FEED_KEY % team) + + +def get_related_feeds(actor, project=None, extra_receivers=[], team_ids=[]): + # FIXME: team_ids->team_id, 貌似没看到 team_ids 的需求 + ''' user_timeline of actor, actor's followers, project owner, + project's watchers, extra_receivers; + team_timeline of project related team, team_ids; + public_timeline; + user_profile_timeline of actor ''' + followers = User(actor).get_followers() if actor else [] + proj_users = [] + if project: + proj_users += [u.username for u in project.get_watch_users()] + proj_users.append(project.owner.username) + users = filter(None, list(set( + [actor] + followers + proj_users + list(extra_receivers)))) + feeds = [get_user_inbox(user) for user in users] + if project: + rls = TeamProjectRelationship.gets(project_id=project.id) + feeds.extend([get_team_feed(rl.team_id) for rl in rls]) + if team_ids: + feeds.extend([get_team_feed(id) for id in team_ids]) + feeds.append(get_public_feed()) + if actor: + feeds.append(get_user_feed(actor)) + return feeds + + +@codereview_signal.connect +def add_code_review_action(sender, **kw): + data = format_code_review_info(sender, **kw) + ticket = kw['ticket'] + author = kw['author'] + pullreq = PullRequest.get_by_ticket(ticket) + feeds = get_related_feeds(author, pullreq.to_proj) + for feed in feeds: + feed.add_action(data) + + +@pullrequest_signal.connect +def add_pullrequest(sender, **kw): + extra_receivers = kw.get('extra_receivers', []) + pullreq = kw.get('pullreq') + comment = kw.get('comment') + ticket = kw.get('ticket') + + to_users = get_pr_notify_receivers(sender, comment, pullreq, ticket, + extra_receivers=extra_receivers) + + data = format_pullrequest_info(sender, **kw) + feeds = get_related_feeds(data.get('commiter'), pullreq.to_proj, to_users) + for feed in feeds: + feed.add_action(data) + + +@team_created_signal.connect +def team_created_data(sender, **kw): + date = datetime.now() + team_uid = kw.get('team_uid', '') + team_name = kw.get('team_name', '') + data = { + 'author': sender, + 'type': 'team_created', + 'url': '/hub/team/%s/' % team_uid, + 'name': team_name, + 'date': date + } + feeds = get_related_feeds(sender) + for feed in feeds: + feed.add_action(data) + + +@team_joined_signal.connect +def team_joined_data(sender, **kw): + date = datetime.now() + team_uid = kw.get('team_uid') + team_id = kw.get('team_id') + data = { + 'author': sender, + 'type': 'team_joined', + 'url': '/hub/team/%s/' % team_uid, + 'name': kw.get('team_name', ''), + 'date': date + } + feeds = get_related_feeds(sender, team_ids=[team_id, ]) + for feed in feeds: + feed.add_action(data) + + +@push_signal.connect +def push_data_receiver(sender, **kw): + EMPTY_COMMIT_HASH = "0" * 40 + date = datetime.now() + repo_name = kw.get('repo_name') + before = kw.get('before') + after = kw.get('after') + username = kw.get('username') + data = { + 'repo_name': repo_name, + 'repo_url': kw.get('repo_url'), + 'ref': kw.get('ref'), + 'branch': kw.get('branch'), + 'date': date, + 'before': before, + 'after': after, + 'is_new_branch': before == EMPTY_COMMIT_HASH, + 'is_delete_branch': after == EMPTY_COMMIT_HASH, + 'commits': kw.get('commits'), + 'type': 'push', + 'username': username, + } + feeds = get_related_feeds( + '', project=CodeDoubanProject.get_by_name(repo_name)) + for feed in feeds: + feed.add_action(data) + + +@gist_created_signal.connect +def gist_created_receiver(sender, **kw): + gist_id = kw.get('gist_id') + gist = Gist.get(gist_id) + data = { + 'uid': 'gist-create-%s' % gist.id, + 'author': gist.owner_id, + 'url': gist.url, + 'name': gist.name, + 'desc': gist.description, + 'date': gist.created_at, + 'type': 'gist_created', + } + feeds = get_related_feeds(gist.owner_id) + for feed in feeds: + feed.add_action(data) + + +@gist_commented_signal.connect +def gist_commented_receiver(sender, **kw): + gist_id = kw.get('gist_id') + gist = Gist.get(gist_id) + comment = kw.get('comment') + data = { + 'uid': 'gist-comment-%s' % gist.id, + 'author': comment.user_id, + 'name': gist.full_name, + 'url': comment.url, + 'content': comment.content, + 'date': comment.created_at, + 'type': 'gist_commented', + } + feeds = get_related_feeds('', extra_receivers=[gist.owner_id]) + for feed in feeds: + feed.add_action(data) + + +@gist_starred_signal.connect +def gist_starred_receiver(sender, **kw): + author = kw.get('author') + gist_id = kw.get('gist_id') + gist = Gist.get(gist_id) + uid = 'gist-star-%s-%s' % (gist.id, author) + data = { + 'uid': uid, + 'author': author, + 'url': gist.url, + 'name': gist.full_name, + 'desc': gist.description, + 'date': datetime.now(), + 'type': 'gist_starred' + } + feeds = get_related_feeds(author, extra_receivers=[gist.owner_id]) + for feed in feeds: + feed.add_action(data) + + +@gist_forked_signal.connect +def gist_forked_receiver(sender, **kw): + gist_id = kw.get('gist_id') + gist = Gist.get(gist_id) + forked_from = gist.forked_from + uid = 'gist-fork-%s-%s' % (forked_from.id, gist.id) + data = { + 'uid': uid, + 'author': gist.owner_id, + 'forked_from_name': forked_from.full_name, + 'forked_from_url': forked_from.url, + 'url': gist.url, + 'name': gist.full_name, + 'desc': gist.description, + 'date': gist.created_at, + 'type': 'gist_forked' + } + feeds = get_related_feeds( + gist.owner_id, extra_receivers=[forked_from.owner_id]) + for feed in feeds: + feed.add_action(data) + + +@gist_updated_signal.connect +def gist_updated_receiver(sender, **kw): + gist_id = kw.get('gist_id') + gist = Gist.get(gist_id) + data = { + 'uid': 'gist-update-%s' % gist.id, + 'author': gist.owner_id, + 'url': gist.url, + 'name': gist.full_name, + 'desc': gist.description, + 'date': gist.updated_at, + 'type': 'gist_updated' + } + feeds = get_related_feeds(gist.owner_id) + for feed in feeds: + feed.add_action(data) + + +@repo_create_signal.connect +def repo_create_receiver(sender, **kw): + proj_id = kw.get('project_id') + owner_id = kw.get('creator') + project = CodeDoubanProject.get(proj_id) + uid = 'repo-create-%s-%s' % (project.id, owner_id) + data = { + 'uid': uid, + 'author': owner_id, + 'url': project.url, + 'name': project.name, + 'desc': project.summary, + 'date': datetime.now(), + 'type': 'repo_create' + } + feeds = get_related_feeds(owner_id) + for feed in feeds: + feed.add_action(data) + + +@repo_watch_signal.connect +def repo_watch_receiver(sender, **kw): + proj_id = kw.get('project_id') + author = kw.get('author') + project = CodeDoubanProject.get(proj_id) + uid = 'repo-watch-%s-%s' % (project.id, author) + data = { + 'uid': uid, + 'author': author, + 'url': project.url, + 'name': project.name, + 'desc': project.summary, + 'date': datetime.now(), + 'type': 'repo_watch' + } + feeds = get_related_feeds(author) + for feed in feeds: + feed.add_action(data) + + +@repo_fork_signal.connect +def repo_fork_receiver(sender, **kw): + proj_id = kw.get('project_id') + author = kw.get('author') + project = CodeDoubanProject.get(proj_id) + forked_from = project.get_forked_from() + uid = 'repo-fork-%s-%s' % (forked_from.id, project.id) + data = { + 'uid': uid, + 'author': author, + 'forked_from_name': forked_from.name, + 'forked_from_url': forked_from.url, + 'url': project.url, + 'name': project.name, + 'desc': project.summary, + 'date': datetime.now(), + 'type': 'repo_fork' + } + feeds = get_related_feeds(author, extra_receivers=[forked_from.owner_id]) + for feed in feeds: + feed.add_action(data) + + +@issue_signal.connect +def add_issue_action(sender, **kw): + author = kw['author'] + content = kw['content'] + issue_id = kw['issue_id'] + + data = format_issue_info(**kw) + issue = get_issue_by_issue_id(issue_id) + target = issue.target + + to_users = get_issue_notify_receivers(author, content, target, issue) + if issue.target_type == "project": + feeds = get_related_feeds( + author, project=target, extra_receivers=to_users) + elif issue.target_type == "team": + feeds = get_related_feeds( + author, extra_receivers=to_users, team_ids=[target.id]) + elif issue.target_type == "fair": + from vilya.models.fair import FAIR_ID + feeds = get_related_feeds(author, extra_receivers=to_users, + team_ids=[FAIR_ID]) + for feed in feeds: + feed.add_action(data) + + +@issue_comment_signal.connect +def add_issue_comment_action(sender, **kw): + author = kw['author'] + content = kw['content'] + issue_id = kw['issue_id'] + + issue = get_issue_by_issue_id(issue_id) + target = issue.target + + data = format_issue_comment_info(**kw) + to_users = get_issue_notify_receivers(author, content, target, issue) + if issue.target_type == "project": + feeds = get_related_feeds( + author, project=target, extra_receivers=to_users) + elif issue.target_type == "team": + feeds = get_related_feeds( + author, extra_receivers=to_users, team_ids=[target.id]) + elif issue.target_type == "fair": + from vilya.models.fair import FAIR_ID + feeds = get_related_feeds(author, extra_receivers=to_users, + team_ids=[FAIR_ID]) + for feed in feeds: + feed.add_action(data) + + +@follow_user_signal.connect +def follow_user_action(sender, **kw): + author = kw['author'] + followee = kw['followee'] + data = { + "author": author, + "followee": followee, + 'date': datetime.now(), + 'type': 'follow_user' + } + + feeds = get_related_feeds(author, extra_receivers=[followee]) + for feed in feeds: + feed.add_action(data) diff --git a/vilya/models/gist.py b/vilya/models/gist.py new file mode 100644 index 0000000..3a4ba75 --- /dev/null +++ b/vilya/models/gist.py @@ -0,0 +1,509 @@ +# -*- coding: utf-8 -*- + +import os +import shutil +from datetime import datetime + +from vilya.libs.signals import ( + gist_created_signal, gist_forked_signal, gist_updated_signal) +from vilya.libs.store import store +from vilya.libs import gyt +from vilya.libs.permdir import get_repo_root +from vilya.models.git import GitRepo +from vilya.models.ngit.repo import GistRepo +from vilya.models.user import User +from vilya.models.gist_comment import GistComment +from vilya.models.gist_star import GistStar + +from vilya.config import DOMAIN + +PAGE_LIMIT = 10 +DATETIME_FORMAT = '%Y-%m-%dT%H:%M:%SZ' +GIST_FILE_RAW = DOMAIN + '/gist/%s/raw/master/%s' + +PRIVILEGE_PUBLIC = 1 +PRIVILEGE_SECRET = 0 + +SORTS = ('created', 'updated') +DIRECTIONS = ('desc', 'asc') + +GIST_NAME = 'gist:%s' + + +def init_gist_folder(): + GISTS_PATH = os.path.join(get_repo_root(), 'gist') + if not os.path.exists(GISTS_PATH): + os.makedirs(GISTS_PATH) + +init_gist_folder() + + +class Gist(object): + + ANONYMOUS = 'anonymous' + + def __init__(self, id, name, description, owner_id, is_public, + fork_from, created_at, updated_at): + self.id = id + self.name = name.decode('utf-8') or GIST_NAME % id + self.description = description.decode('utf-8') + self.owner_id = owner_id + self.is_public = is_public + self.fork_from = fork_from + self.created_at = created_at + self.updated_at = updated_at + + def __repr__(self): + return '<Gist name:%s, owner:%s>' % (self.name, self.owner_id) + + def __eq__(self, target): + return self.id == target.id + + @property + def repo_root_path(self): + return get_repo_root() + + def as_dict(self): + data = { + 'type': 'gist', + 'url': self.url, + 'description': self.description, + 'author': self.owner.name, + } + data['time'] = self.created_at.strftime('%Y-%m-%dT%H:%M:%S') + if self.updated_at: + data['time'] = self.updated_at.strftime('%Y-%m-%dT%H:%M:%S') + content = [] + data['content'] = {} + for path in self.files: + path = path.encode('utf8') + blob = self.repo.get_file(path, 'HEAD') + src = blob if blob else '' + content.append(path) + content.append(src) + data['content'] = '\n'.join(content) + return data + + @property + def full_name(self): + return '%s/%s' % (self.owner_id, self.name) + + # TODO: remove this, please use gist.repo_path + @property + def git_real_path(self): + return os.path.join(self.repo_root_path, 'gist/%s.git' % self.id) + + # TODO: remove this, please use gist.repo + @property + def git(self): + try: + repo = GitRepo(self.git_real_path) + except gyt.GytRepoNotInited: + repo = None + return repo + + @property + def git_path(self): + return 'gist/%s.git' % self.id + + @property + def git_url(self): + return '%s/%s' % (DOMAIN, self.git_path) + + @property + def url(self): + return '%s/gist/%s/%s' % (DOMAIN, self.owner_id, self.id) + + @property + def download_url(self): + return self.url + '/download' + + @property + def embed_url(self): + return self.url + '.js' + + @property + def n_star(self): + rs = store.execute( + "select count(1) from gist_stars where gist_id=%s", (self.id,)) + return rs[0][0] + + @property + def stars(self): + rs = store.execute( + "select user_id from gist_stars where gist_id=%s", (self.id,)) + return [User(user_id) for user_id, in rs] + + def star(self, user_id): + if not GistStar.get_by_gist_and_user(self.id, user_id): + GistStar.add(self.id, user_id) + return True + + def unstar(self, user_id): + gs = GistStar.get_by_gist_and_user(self.id, user_id) + if gs: + gs.delete() + return True + + @property + def n_fork(self): + rs = store.execute( + "select count(1) from gists where fork_from=%s", (self.id,)) + return rs[0][0] + + @property + def forks(self): + rs = store.execute( + "select id, name, description, owner_id, is_public, fork_from, " + "created_at, updated_at from gists where fork_from=%s", (self.id,)) + return [Gist(*r) for r in rs] + + @property + def n_revision(self): + if self.repo: + return len(self.repo.get_commits('HEAD')) + return 0 + + @property + def n_comments(self): + rs = store.execute( + "select count(1) from gist_comments where gist_id=%s", (self.id,)) + return rs[0][0] + + @property + def n_files(self): + return len(self.files) + + @property + def files(self): + files = [] + for sha, name in self.repo.get_files(): + files.append(name) + #if not self.repo.empty: + # files = [item['path'] for item in self.git._list_tree('HEAD', '')] + return files + + # TODO: remove this later + @property + def list_sha1_with_files(self): + files = self.repo.get_files() + return files + #return self.git.list_sha1_with_files('HEAD') + + @property + def forked_from(self): + return Gist.get(self.fork_from) + + def get_revlist_with_renames(self, max_count=3, skip=0, rev='HEAD', + path='', author=None): + revlist = self.repo.get_commits(rev, + max_count=max_count, + skip=skip, + path=path, + author=author) + return revlist + + # TODO: remove this, please use gist.fork_repo + def clone_git(self, to_path): + git_path = os.path.join(self.repo_root_path, self.git_path) + to_path = os.path.join(self.repo_root_path, to_path) + rep = gyt.repo(git_path) + rep.clone(to_path) + + @property + def owner(self): + return User(self.owner_id) + + @property + def comments(self): + return GistComment.gets_by_gist_id(self.id) + + @classmethod + def get(cls, id): + rs = store.execute( + "select id, name, description, owner_id, is_public, fork_from, " + "created_at, updated_at from gists where id=%s", (id,)) + return rs and cls(*rs[0]) or None + + @classmethod + def gets(cls, ids): + return [cls.get(id) for id in ids] + + @classmethod + def add(cls, description, owner_id, is_public, gist_names=[], + gist_contents=[], fork_from=None): + now = datetime.now() + if fork_from: + name = cls.get(fork_from).name + id = store.execute( + "insert into gists " + "(`name`, `description`, `owner_id`, `created_at`, `fork_from`) " # noqa + "values (%s, %s, %s, %s, %s)", + (name, description, owner_id, now, fork_from)) + store.commit() + gist = cls.get(id) + fork_from = cls.get(fork_from) + fork_from.fork_repo(gist) + gist_forked_signal.send(gist, gist_id=gist.id) + else: + name = cls._get_name(names=gist_names) + id = store.execute( + "insert into gists " + "(`name`, `description`, `owner_id`, `is_public`, `created_at`) " # noqa + "values (%s, %s, %s, %s, %s)", + (name, description, owner_id, is_public, now)) + store.commit() + gist = cls.get(id) + gist.create_repo() + gist._commit_all_files(gist_names, gist_contents, create=True) + gist_created_signal.send(gist, gist_id=gist.id) + return gist + + def update(self, description, gist_names=[], gist_contents=[], + gist_oids=[]): + name = self._get_name(gist_names) + store.execute( + "update gists set name=%s, description=%s, updated_at=%s where id=%s", # noqa + (name, description, datetime.now(), self.id)) + store.commit() + self._commit_all_files(gist_names, gist_contents, gist_oids) + gist_updated_signal.send(self, gist_id=self.id) + + def _commit_all_files(self, gist_names, gist_contents, gist_oids=[], + create=False): + _gets = lambda x: x if isinstance(x, list) else [x] + gist_names = _gets(gist_names) + gist_contents = _gets(gist_contents) + gist_oids = _gets(gist_oids) or [''] * len(gist_names) + + if create and gist_names and not gist_names[0]: + gist_names = gist_names * len(gist_contents) + gist_oids = [''] * len(gist_contents) + + self.repo.commit_all_files(gist_names, gist_contents, + gist_oids, User(self.owner_id)) + + @classmethod + def _get_name(cls, names=[]): + if not isinstance(names, list): + names = [names] + name = names and names[0] + if name and not name.startswith('gistfile'): + return name + return '' + + def fork(self, user_id): + return Gist.add( + self.description, user_id, self.is_public, fork_from=self.id) + + @classmethod + def gets_by_owner(cls, owner_id, is_self=False, start=0, limit=10, + sort='created', direction='desc'): + assert sort in SORTS + assert direction in DIRECTIONS + sql = ("select id, name, description, owner_id, is_public, fork_from, " + "created_at, updated_at from gists where owner_id=%s ") + if not is_self: + sql += " and is_public=1 " + sql += "order by %s %s limit %s, %s" % ( + sort + '_at', direction, start, limit) + rs = store.execute(sql, owner_id) + return [cls(*r) for r in rs] + + @classmethod + def forks_by_user(cls, owner_id, start=0, limit=10, sort='created', + direction='desc'): + assert sort in SORTS + assert direction in DIRECTIONS + sortby = "order by %s_at %s " % (sort, direction) + rs = store.execute( + "select id, name, description, owner_id, is_public, fork_from, " + "created_at, updated_at from gists where owner_id=%s and " + "fork_from!=0 " + sortby + "limit %s, %s", + (owner_id, start, limit)) + return [cls(*r) for r in rs] + + @classmethod + def stars_by_user(cls, owner_id, start=0, limit=10): + rs = store.execute( + "select gist_id from gist_stars " + "where user_id=%s order by id desc limit %s, %s", + (owner_id, start, limit)) + return filter(None, [cls.get(r) for r, in rs]) + + @classmethod + def publics_by_user(cls, owner_id, start=0, limit=10, sort='created', + direction='desc'): + return cls._privilege_by_user( + owner_id, start=start, limit=limit, privilege=1, + sort=sort, direction=direction) + + @classmethod + def secrets_by_user(cls, owner_id, start=0, limit=10, sort='created', + direction='desc'): + return cls._privilege_by_user( + owner_id, start=start, limit=limit, privilege=0, + sort=sort, direction=direction) + + @classmethod + def _privilege_by_user(cls, owner_id, start=0, limit=10, privilege=1, + sort='created', direction='desc'): + assert sort in SORTS + assert direction in DIRECTIONS + sortby = "order by %s_at %s " % (sort, direction) + rs = store.execute( + "select id, name, description, owner_id, is_public, fork_from, " + "created_at, updated_at from gists where owner_id=%s and " + "is_public=%s " + sortby + "limit %s, %s", + (owner_id, privilege, start, limit)) + return [cls(*r) for r in rs] + + @classmethod + def count_user_all(self, owner_id, is_self=False): + if is_self: + rs = store.execute( + "select count(1) from gists where owner_id=%s", (owner_id,)) + else: + rs = store.execute( + "select count(1) from gists where owner_id=%s " + "and is_public=1", (owner_id,)) + return rs[0][0] + + @classmethod + def count_user_fork(self, owner_id): + rs = store.execute( + "select count(1) from gists where owner_id=%s and " + "fork_from!=0", (owner_id,)) + return rs[0][0] + + @classmethod + def count_user_star(self, owner_id): + rs = store.execute( + "select count(1) from gist_stars where user_id=%s", owner_id) + return rs[0][0] + + @classmethod + def count_public_by_user(cls, owner_id): + return cls._count_privilege_by_user( + owner_id, privilege=PRIVILEGE_PUBLIC) + + @classmethod + def count_secret_by_user(cls, owner_id): + return cls._count_privilege_by_user( + owner_id, privilege=PRIVILEGE_SECRET) + + @classmethod + def _count_privilege_by_user(cls, owner_id, privilege=PRIVILEGE_PUBLIC): + rs = store.execute( + "select count(1) from gists where owner_id=%s and is_public=%s", + (owner_id, privilege)) + return rs[0][0] + + def delete(self): + shutil.rmtree(self.git_real_path, ignore_errors=True) + store.execute("delete from gists where id=%s", (self.id,)) + store.execute("delete from gist_stars where gist_id=%s", (self.id,)) + store.execute("delete from gist_comments where gist_id=%s", (self.id,)) + store.commit() + + def is_starred(self, user_id): + rs = store.execute( + "select id from gist_stars where gist_id=%s and user_id=%s", + (self.id, user_id)) + return True if rs else False + + @classmethod + def discover(cls, name, sort='created', direction='desc', start=0, + limit=5): + assert sort in SORTS + assert direction in DIRECTIONS + sortby = "order by %s_at %s " % (sort, direction) + sort = '%s_at' % sort + reverse = direction == 'desc' + if name == 'forked': + rs = store.execute("select distinct(fork_from) from gists " + "where fork_from!=0 and is_public=1 " + + sortby + "limit %s, %s", + (start, limit)) + return [cls.get(r) for r, in rs] + elif name == 'starred': + rs = store.execute("select distinct(gist_id) from gist_stars " + "order by created_at " + + direction + " limit %s, %s", + (start, limit)) + gists = filter(None, [cls.get(r) for r, in rs]) + return sorted(gists, key=lambda g: getattr(g, sort), + reverse=reverse) + else: + rs = store.execute( + "select id, name, description, owner_id, is_public, " + "fork_from, created_at, updated_at from gists where " + "is_public=1 " + sortby + "limit %s, %s", + (start, limit)) + return [cls(*r) for r in rs] + + @property + def repo(self): + return GistRepo(self) + + @property + def repo_path(self): + return os.path.join(self.repo_root_path, 'gist/%s.git' % self.id) + + def create_repo(self): + GistRepo.init(self) + + def fork_repo(self, gist): + self.repo.clone(gist) + + def get_file(self, path, rev='master'): + blob = self.repo.get_file(rev, path) + if not blob: + # FIXME: value convention + return False + return blob.data + + @property + def updated_time(self): + commit = self.repo.get_last_commit('HEAD') + if not commit: + return 0 + return int(commit.author_timestamp) + + +def fork_detail(gist): + return dict(user=user_detail(gist.owner), + url=gist.url, + created_at=gist.created_at.strftime(DATETIME_FORMAT)) + + +def user_detail(user): + return dict(login=user.name, id=user.name, avatar_url=user.avatar_url, + url=user.url) + + +def gist_detail(gist, include_forks=False, include_history=False): + files = { + f: dict(filename=f, raw_url=GIST_FILE_RAW % (gist.id, f)) + for f in gist.files + } + ret = dict(url=gist.url, + id=gist.id, + description=gist.description, + public=bool(gist.is_public), + user=user_detail(gist.owner), + files=files, + comments=gist.n_comments, + html_url=gist.url, + git_pull_url=gist.git_url, + git_push_url=gist.git_url, + created_at=gist.created_at.strftime(DATETIME_FORMAT)) + + if include_forks: + ret.update(dict(forks=[fork_detail(f) for f in gist.forks])) + + if include_history: + # TODO + pass + + return ret diff --git a/vilya/models/gist_comment.py b/vilya/models/gist_comment.py new file mode 100644 index 0000000..3c17520 --- /dev/null +++ b/vilya/models/gist_comment.py @@ -0,0 +1,80 @@ +# -*- coding: utf-8 -*- +from datetime import datetime + +from vilya.models.user import User +from vilya.libs.store import store +from vilya.libs.signals import gist_commented_signal + + +class GistComment(object): + + def __init__(self, id, gist_id, user_id, content, created_at, updated_at): + self.id = id + self.gist_id = gist_id + self.user_id = user_id + self.content = content.decode('utf-8') + self.created_at = created_at + self.updated_at = updated_at + + def __repr__(self): + return '<GistComment id:%s, gist:%s, user:%s>' % ( + self.id, self.gist_id, self.user_id) + + def __eq__(self, target): + return self.id == target.id + + @classmethod + def get(cls, id): + rs = store.execute( + "select id, gist_id, user_id, content, created_at, updated_at " + "from gist_comments where id=%s", (id,)) + return rs and cls(*rs[0]) or None + + @classmethod + def gets_by_gist_id(cls, gist_id): + rs = store.execute( + "select id, gist_id, user_id, content, created_at, updated_at " + "from gist_comments where gist_id=%s", (gist_id,)) + return [cls(*r) for r in rs] + + @classmethod + def add(cls, gist_id, user_id, content): + now = datetime.now() + id = store.execute( + "insert into gist_comments " + "(`gist_id`, `user_id`, `content`, `created_at`) " + "values (%s, %s, %s, %s)", (gist_id, user_id, content, now)) + store.commit() + gc = cls.get(id) + gist_commented_signal.send(gc, gist_id=gist_id, comment=gc) + return gc + + @property + def author(self): + return User(self.user_id) + + @property + def url(self): + from vilya.models.gist import Gist + return '%s/#comment-%s' % (Gist.get(self.gist_id).url, self.id) + + def as_dict(self): + ret = { + "id": self.id, + "content": self.content, + "user": self.author.as_dict(), + "created_at": self.created_at.strftime('%Y-%m-%dT%H:%M:%S') + } + return ret + + def can_delete(self, username): + return username == self.author.name + + def update(self, content): + store.execute("update gist_comments set content=%s where id=%s", + (content, self.id)) + store.commit() + + def delete(self): + store.execute("delete from gist_comments where id=%s", (self.id,)) + store.commit() diff --git a/vilya/models/gist_star.py b/vilya/models/gist_star.py new file mode 100644 index 0000000..412f404 --- /dev/null +++ b/vilya/models/gist_star.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- +from vilya.libs.store import store +from vilya.libs.signals import gist_starred_signal + + +class GistStar(object): + + def __init__(self, id, gist_id, user_id, created_at): + self.id = id + self.gist_id = gist_id + self.user_id = user_id + self.created_at = created_at + + def __repr__(self): + return '<GistStar gist:%s, user:%s>' % (self.gist_id, self.user_id) + + def __eq__(self, target): + return self.id == target.id + + @classmethod + def get(cls, id): + rs = store.execute( + "select id, gist_id, user_id, created_at from gist_stars " + "where id=%s", (id,)) + if rs: + return cls(*rs[0]) + + @classmethod + def add(cls, gist_id, user_id): + id = store.execute("insert into gist_stars (`gist_id`, `user_id`)" + "values (%s, %s)", (gist_id, user_id)) + store.commit() + gs = cls.get(id) + gist_starred_signal.send(gs, gist_id=gist_id, author=user_id) + return True + + @classmethod + def gets_by_gist(cls, gist_id, start=0, limit=50): + rs = store.execute("select id, gist_id, user_id, created_at " + "from gist_stars where gist_id=%s limit %s, %s", + (gist_id, start, limit)) + return [cls(*r) for r in rs] + + @classmethod + def gets_by_user(cls, user_id, start=0, limit=50): + rs = store.execute("select id, gist_id, user_id, created_at " + "from gist_stars where user_id=%s limit %s, %s", + (user_id, start, limit)) + return [cls(*r) for r in rs] + + @classmethod + def get_by_gist_and_user(cls, gist_id, user_id): + rs = store.execute("select id, gist_id, user_id, created_at " + "from gist_stars where gist_id=%s and user_id=%s", + (gist_id, user_id)) + return rs and cls(*rs[0]) or None + + @classmethod + def count_by_gist(cls, gist_id): + rs = store.execute( + "select count(1) from gist_stars where gist_id=%s", (gist_id,)) + return rs[0][0] + + @classmethod + def count_by_user(cls, user_id): + rs = store.execute( + "select count(1) from gist_stars where user_id=%s", (user_id,)) + return rs[0][0] + + def delete(self): + store.execute("delete from gist_stars where id=%s", (self.id,)) + store.commit() diff --git a/vilya/models/git.py b/vilya/models/git.py new file mode 100644 index 0000000..18fbd4a --- /dev/null +++ b/vilya/models/git.py @@ -0,0 +1,1029 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import + +import os +import re +import tempfile +import urllib +import urlparse +import time +import gzip +from datetime import datetime +from cStringIO import StringIO + +from pygit2 import GIT_SORT_TIME +from pytz import FixedOffset + +from vilya.libs import gyt +from vilya.libs.reltime import compute_relative_time +from vilya.libs.text import email_normalizer +from vilya.libs.text import ( + highlight_code, trunc_utf8, remove_unknown_character) +from vilya.models.user import User, get_author_by_email +from vilya.models.stats import GitDataCollector +from vilya.libs.diff import rehunk +from vilya.models.consts import PATCH_TYPE, MIRROR_HTTP_PROXY +from vilya.models.utils import check_douban_email + + +_MC_KEY_GYT_CAT = 'gitcat:%s:%s:v02' +_MC_KEY_OBJ_TYPE = 'cat-file-type:%s:%s:v02' +_MC_KEY_BLAME = 'blame' +_MC_KEY_LATEST_COMMIT = 'gitlatestcommit:%s:%s:%s:v03' +_GITSTATS_KEY = 'gitstats:%s:v3' +_GITSTATS_DATA_KEY = 'gitstats_data:%s:%s:v3' +_GITSTATS_YEAR_WEEK_ACT = 'gitstats:year_week_act:%s' +RE_EMAIL = re.compile(r'<(?P<email>.*)>') +RE_HUNK_LIMIT = 500 + +TEMP_BRANCH_MARKER = 'TEMPORARY_BRANCH' +(REV, NAME, AUTHOR_MAIL, TIME, DISP, SUMM, LINE, SRC) = range(8) + + +def quote_utf8(s): + s = s.encode('utf-8') + return urllib.quote_plus(s) + + +def unquote_utf8(q): + s = urllib.unquote_plus(q) + return s.decode('utf-8') + + +def _adjust_git_age(age): + nb, _, rest = age.partition(' ') + if rest == 'seconds ago' and int(nb) < 10: + return 'few seconds ago' + return age + + +class GitRepo(object): + + def __init__(self, path, work_tree=None, project=None): + self.path = path + self.work_tree = work_tree + self.project = project + self.project_name = project.name if project else '' + # TODO check, shouldn't we pass work_tree to gyt repo? + # be careful it would change a lot of things behind + # getting not bare repos if inited with work_tree + self._gyt_repo = gyt.repo(self.path) + self.pygit2_repo = self._gyt_repo.repo + + def __str__(self): + if self.project: + return "<Repo %s>" % self.project.name + else: + return "<Repo %s>" % self.path + + def __eq__(self, y): + return bool(y and isinstance(y, GitRepo) and ( + self.path == y.path and self.project == y.project)) + + def call(self, cmd, _raise=True, _raw=False, _env=None): + return self._gyt_repo.call(cmd, _raise=_raise, _raw=_raw, _env=_env) + + def object_type(self, ref='HEAD', path=None): + refspec = '%s:%s' % (ref, path) if path is not None else ref + + try: + sha = self._gyt_repo.sha(ref) + except Exception, e: + raise e + if sha == ref: + refspec = '%s:%s' % (sha, path) if path is not None else sha + objt = self._cached_obj_type(refspec) + return objt + else: + return self._gyt_repo.cat(refspec, only_type=True) + + #@cache(_MC_KEY_OBJ_TYPE % ('{self.project_name}', '{refspec}'), + # expire=ONE_WEEK) + def _cached_obj_type(self, refspec): + return self._gyt_repo.cat(refspec, only_type=True) + + @classmethod + def clone(cls, repo_url, path): + gyt.clone(repo_url, path) + return GitRepo(os.path.join(path, '.git'), work_tree=path) + + def fetch_mirror(self, proxy=None): + env = {} + if proxy: + env['HTTP_PROXY'] = MIRROR_HTTP_PROXY + env['HTTPS_PROXY'] = MIRROR_HTTP_PROXY + self._gyt_repo.fetch_mirror(_env=env) + + def cat(self, ref): + #rs = mc.get(_MC_KEY_GYT_CAT % (self.project_name, ref)) + # if rs: + # return rs + fixed_sha = self._gyt_repo.sha(ref) + return self._fixed_cat(fixed_sha) + + # @cache(_MC_KEY_GYT_CAT % ('{self.project_name}', '{sha}'), + # expire=ONE_WEEK) + def _fixed_cat(self, sha): + return self._gyt_repo.cat(sha) + + def latest_commit(self, path, ref='HEAD'): + fixed_sha = self._gyt_repo.sha(ref) + return self._latest_commit_fixed(fixed_sha, quote_utf8(path)) + + # @cache(_MC_KEY_LATEST_COMMIT % ('{self.project_name}', '{sha}', + # '{quoted_path}'), expire=ONE_WEEK) + def _latest_commit_fixed(self, sha, quoted_path): + path = unquote_utf8(quoted_path) + commits = self._gyt_repo.rev_list(sha, max_count=1, paths=path) + if commits and commits[0]: + return commits[0].hex + + def get_remotes(self): + return self._gyt_repo.remotes() + + def add_remote(self, name, url): + name = name.replace('~', '_') + self._gyt_repo.add_remote(name, url) + + def fetch(self, repo): + try: + repo = repo.replace('~', '_') + remote = [r for r in self.get_remotes() if r.name == repo] + if len(remote) >= 1: + remote = remote[0] + remote.fetch() + except OSError: + return + + def get_branches(self): + '''returns list of (local) branches, with active (= HEAD) one being + the first item''' + return gyt.repo(self.path).refs(select='branches', short=True, + current_first=True) + + def get_tags(self): + return gyt.repo(self.path).refs(select='tags', short=True) + + def get_sha(self, ref, raise_error=False): + return self._gyt_repo.sha(ref) + + def get_commit(self, sha): + if self.object_type(sha) != 'commit': + return None + c = self.cat(sha) + parent = c['parent'][-1] if c[ + 'parent'] else None # Weird, why would we want only the last one? + author_name = c['author']['name'] + author_email = email_normalizer(author_name, c['author']['email']) + author = User(name=author_name, email=author_email) + committer_name = c['committer']['name'] + committer_email = email_normalizer( + committer_name, c['committer']['email']) + committer = User(name=committer_name, email=committer_email) + message = ( + c['message'] + '\n\n' + remove_unknown_character(c['body'])).strip() + author_time = c['author']['date'] + commit_time = c['committer']['date'] + return Commit( + self.project_name, sha=sha, tree=c['tree'], parent=parent, + author=author, author_time=author_time, committer=committer, + commit_time=commit_time, message=message) + + def convert_localtime(self, ts): + fmt = "%Y-%m-%d %H:%M:%S" + s = time.strftime(fmt, time.localtime(ts)) + return datetime.strptime(s, fmt) + + def get_3dot_diff(self, sha1, sha2, ignore_space=False, context_lines=3, + rename_detection=False): + """ 对仓库做 git diff sha1...sha2 操作,返回diff对象列表 """ + return self._get_diff( + sha1, sha2, ignore_space=ignore_space, + context_lines=context_lines, rename_detection=rename_detection) + + def get_3dot_diff_onefile(self, sha1, sha2, path=None, context_lines=3, + paths=None, rename_detection=None): + assert path or paths + return self._get_diff( + sha1, sha2, path, context_lines=context_lines, paths=paths, + rename_detection=rename_detection) + + def _get_diff(self, sha1, sha2, path=None, ignore_space=False, + context_lines=3, rename_detection=False, paths=None): + diffs = Diffs.from_diffs( + self._gyt_repo.diff( + sha1, sha2, path=path, parse_patch=True, + ignore_space=ignore_space, context_lines=context_lines, + rename_detection=rename_detection, paths=paths)) + return diffs + + def parse_diff_old_author(self, diff, sha): + old = [] + byauthor = {} + bylines = {} + try: + blame = self.blame_src(sha, diff.filepath)[1] + except: + return {}, {} + for l in diff.diff_content: + if l[0] == 'deletion': + old.append(l[1]) + for o in old: + try: + author_email = blame[int(o) - 1][AUTHOR_MAIL] + if author_email: + author = author_email.split('@')[0] + byauthor.setdefault(author, []).append(o) + bylines[o] = author + except: + continue + return byauthor, bylines + + def get_rev_list(self, sha1, sha2, _raise=True): + return self._gyt_repo.rev_walk_shas(sha1, sha2) + + def get_range_commits(self, sha1, sha2): + commits = [] + output = self.get_rev_list(sha1, sha2, _raise=False) + if output is False: + return False + for sha in output: + commits.append(self.get_commit(sha)) + return commits + + def get_last_update_timestamp(self): + head_sha = self.get_sha('HEAD') + if not head_sha: + return 0 + else: + return int(self.cat(head_sha)['author']['ts']) + + def get_raw_content(self, fname, ref='HEAD'): + # This is used with /api/project/raw/app.yaml + return self.cat('%s:%s' % (ref, fname)) + + def get_revisions(self, begin='HEAD~5', end='HEAD'): + if self.is_empty(): + return [] + res = self.get_rev_list(begin, end, _raise=False) + revisions = [] + if not res: + return [] + for commit_sha in res: + commit = self.cat(commit_sha) + d = {} + d['name'] = commit['author']['name'] + d['id'] = commit_sha + d['date'] = commit['committer']['date'].strftime( + '%Y-%m-%dT%H:%M:%S') + commit['committer']['tz'] + d['message'] = commit['message'] + if commit['body']: + # TODO check if really needed + d['message'] = '\n '.join( + [d['message']] + [''] + remove_unknown_character( + commit['body']).splitlines()) + d['email'] = email_normalizer(d['name'], commit['author']['email']) + # TODO check if merge is really needed + if len(commit['parent']) > 1: + d['merge'] = ' '.join(sha[:7] for sha in commit['parent']) + d['files'] = [] + cmt_obj = self.get_commit(commit_sha) + if cmt_obj.parent: + repo = self.pygit2_repo + cmt = repo.revparse_single(commit_sha) + parent = cmt.parents[0] + diffs = parent.tree.diff(cmt.tree) + for patch in diffs: + filepath = patch.new_file_path if patch.status != 'D' \ + else patch.old_file_path + d['files'].append({'type': PATCH_TYPE.get(patch.status), + 'filepath': filepath}) + else: + diffs = self.parse_diff(commit_sha) + for diff in diffs['difflist']: + d['files'].append({ + 'type': diff.type, 'filepath': diff.filepath}) + revisions.append(d) + return revisions + + def get_src(self, path='', ref='HEAD'): + obj_type = self.object_type(ref, path) + if obj_type is False: + raise IOError("object %s:%s do not exist" % (ref, path)) + if obj_type == 'tree': + tree = self._list_tree(ref, path) + tree = sorted(tree, key=lambda x: x['type'], reverse=True) + return obj_type, tree + else: + src = self.cat('%s:%s' % (ref, path)) + return 'blob', src + + def cache_refspec(self, prefix, ref='HEAD', path=''): + sha = self.get_sha(ref) + if not sha: + return + key = prefix + ':' + sha + ':' + path + return key + + # @cache(lambda self, ref, path: self.cache_refspec( + # _MC_KEY_BLAME, ref, path), expire=ONE_WEEK) + def blame_src(self, ref='HEAD', path=''): + # Using --porcelain instead of --line-porcelain is more efficient, as + # commit info (author, time, summary) is displayed only once + # and it is compatible with git 1.7.5 + res = self._gyt_repo.blame(ref, path) + res = res.splitlines() + blame = [] + hl_lines = self._blame_src_highlighted_lines(ref, path) + rev_data = {} + new_block = True + for line in res: + if new_block: + sha, old_no, line_no = line.split()[:3] + if sha not in rev_data: + rev_data[sha] = {} + rev_data[sha]['line_no'] = line_no + rev_data[sha]['old_no'] = old_no + new_block = False + elif line.startswith('author '): + _, _, author = line.partition(' ') + rev_data[sha]['author'] = author.strip() + elif line.startswith('author-time '): + _, _, time = line.partition(' ') + time = datetime.fromtimestamp(float(time)).strftime('%Y-%m-%d') + rev_data[sha]['time'] = time + elif line.startswith('author-mail '): + _, _, email = line.partition(' ') + email = RE_EMAIL.match(email).group('email') + rev_data[sha]['email'] = email + elif line.startswith('summary '): + _, _, summary = line.partition(' ') + rev_data[sha]['summary'] = summary.strip() + disp_summary = trunc_utf8( + summary.encode('utf-8'), 20).decode('utf-8', 'ignore') + rev_data[sha]['disp_summary'] = disp_summary + elif line.startswith('filename'): + _, _, filename = line.partition(' ') + rev_data[sha]['filename'] = filename + filename = trunc_utf8( + filename.strip().encode('utf-8'), 30).decode('utf-8', 'ignore') + rev_data[sha]['disp_name'] = filename + elif line.startswith('\t'): + # Try to get an highlighted line of source code + code_line = hl_lines.get(str( + line_no), '').replace('\n', '').decode('utf-8', 'ignore') + if not code_line: + code_line = line[1:] + blame.append((sha, + rev_data[sha]['author'], + rev_data[sha]['email'], + rev_data[sha]['time'], + rev_data[sha]['disp_summary'], + rev_data[sha]['summary'], + rev_data[sha]['line_no'], + rev_data[sha]['old_no'], + rev_data[sha]['filename'], + rev_data[sha]['disp_name'], + code_line, + )) + new_block = True + return self._blame_src_header(ref), blame + + def blame_one_line(self, ref='HEAD', path='', lineno=1): + res = self._gyt_repo.blame_line(ref, path, lineno) + res = res.splitlines() + sha_line = res[0] + author_line = res[1] + time_line = res[3] + summary_line = res[9] + sha, _, line_no = sha_line.split()[:3] + _, _, author = author_line.partition(' ') + author = author.strip() + _, _, time = time_line.partition(' ') + time = datetime.fromtimestamp(float(time)).strftime('%Y-%m-%d') + _, _, summary = summary_line.partition(' ') + summary = summary.strip() + result = {'author': author, + 'time': time, + 'sha': sha, + 'summary': summary + } + return result + + def _blame_src_header(self, ref): + header_data = self.cat(ref) + header = {} + header['message'] = header_data['message'] + header['parents'] = ' '.join(header_data['parent']) + header['author'] = header_data['author']['name'] + header['email'] = email_normalizer( + header['author'], header_data['author']['email']) + header['time'] = compute_relative_time(header_data['author']['ts']) + return header + + def _blame_src_highlighted_lines(self, ref, path): + HIGHLIGHT_PATN = re.compile( + r'<a name="L-(\d+)"></a>(.*?)(?=<a name="L-(?:\d+)">)', re.DOTALL) + source_code = self.cat('%s:%s' % (ref, path)) + # TODO try to avoid having highlighted content here + hl_source_code = highlight_code(path, source_code) + hl_lines = dict(re.findall(HIGHLIGHT_PATN, hl_source_code)) + return hl_lines + + def get_commits(self, path='', ref='HEAD'): + if self.object_type(ref, path) != 'tree': + raise IOError('get_commits works on a tree') + bag = {} + for item in self._list_tree(ref, path): + sha = item['id'] + bag[sha] = { + 'id': sha, + 'mode': item['mode'], + 'type': item['type'], + 'name': item['name'], + 'path': item['path'], + } + latest_commit_sha = self.latest_commit(item['path'], ref) + if latest_commit_sha: + l_com = self.cat(latest_commit_sha) + user = l_com['author']['email'] + user_t = user.split('@')[0] if '@' in user else user + bag[sha]['contributor'] = user_t + if check_douban_email(user): + bag[sha]['contributor_url'] = User(user_t).url + else: + bag[sha]['contributor_url'] = False + bag[sha]['message'] = l_com['message'] + bag[sha]['hash'] = latest_commit_sha + bag[sha]['age'] = compute_relative_time(l_com['author']['ts']) + else: + bag[sha]['contributor'] = '' + bag[sha]['contributor_url'] = '' + bag[sha]['message'] = '' + bag[sha]['hash'] = '' + bag[sha]['age'] = '' + return bag + + def get_revlist(self, max_count=20, skip=0, rev='HEAD', path='', + author=None, query=None): + commits = [] + cs = self._gyt_repo.rev_list(rev, max_count=max_count, skip=skip, + paths=path, author=author, query=query) + for c in cs: + commit = {} + commit['parents'] = [p.hex for p in c.parents] if c.parents else '' + commit['date'] = datetime.fromtimestamp( + c.committer.time, + FixedOffset(c.committer.offset)) + commit['age'] = compute_relative_time(c.author.time) + commit['author'] = c.author.name + commit['email'] = email_normalizer(c.author.name, + c.author.email) + message_title = c.message.splitlines()[0] if c.message else '' + commit['message'] = message_title + commit['commit'] = c.hex + commits.append(commit) + return commits + + def get_gitstats_data(self): + assert self.project_name + assert self.project + repo = self.pygit2_repo + data = GitDataCollector(self._gyt_repo) + try: + # FIXME: GitError: Reference 'refs/heads/master' not found + head_sha = repo[repo.head.target].hex + get_author = lambda u: get_author_by_email( + u.email.encode('utf-8'), u.name.encode('utf-8')) + authors = {get_author(c.author) for c in repo.walk( + head_sha, GIT_SORT_TIME)} + n_author = len(authors) + except: + return data + data.collect(self.path, self.project_name, head_sha, n_author) + return data + + #@cache(_GITSTATS_YEAR_WEEK_ACT % '{self.project_name}', expire=ONE_WEEK) + def get_year_week_act_stats(self): + data = self.get_gitstats_data() + year_week_act = data.year_week_act + peak = data.year_week_act_peak + return peak, year_week_act + + def parse_diff(self, ref='HEAD', ignore_space=False, + rename_detection=False): + if self.object_type(ref) != 'commit': + return False + diff_data = self.cat(ref) + diffs = {} + diffs['parents'] = ' '.join(diff_data['parent']) + diffs['author'] = diff_data['author']['name'] + diffs['email'] = email_normalizer( + diffs['author'], diff_data['author']['email']) + diffs['time'] = compute_relative_time(diff_data['author']['ts']) + diffs['message'] = diff_data['message'].replace('\n', ' ') + diffs['body'] = remove_unknown_character(diff_data['body']) + parents = diffs['parents'].split(' ') + if parents and parents[0]: + diffs['difflist'] = self.get_3dot_diff( + parents[0], ref, ignore_space=ignore_space, + rename_detection=rename_detection) + else: + diffs['difflist'] = self._get_diff_for_first_commit(ref, parents) + return diffs + + def _get_diff_for_first_commit(self, ref, parents): + path = None + sha1 = None + sha2 = ref + diffs_new = Diffs.from_diffs( + self._gyt_repo.diff(sha1, sha2, path, parse_patch=True)) + return diffs_new + + def get_diff_tree(self, sha): + c = self.cat(sha) + if len(c['parent']) > 1: + text = self.pygit2_repo.diff_tree(sha, from_ref=c['parent'][0]) + else: + text = self.pygit2_repo.diff_tree(sha) + return text + + def get_format_patch(self, sha): + c = self.cat(sha) + if len(c['parent']) > 1: + text = self._gyt_repo.format_patch(c['parent'][0], sha) + else: + text = self._gyt_repo.format_patch_sha(sha) + return text + + def get_all_tree(self, ref='HEAD'): + return self._recurse_get_tree(ref, '') + + def _recurse_get_tree(self, ref, path): + l = [] + for node in self._list_tree(ref, path): + l.append(node) + if node['type'] == 'tree': + l.extend(self._recurse_get_tree(ref, node['path'])) + return l + + def _list_tree(self, ref, path): + assert self.object_type( + ref, path) == 'tree', "list_tree work on a tree" + items = self.cat('%s:%s' % (ref, path)) + list_ = [] + for item in items: + item_name = item['path'].decode('utf-8') + item_path = '%s%s%s' % (path, '/' if path else '', item_name) + # TODO check why we don't use os.path.join + d = { + 'mode': item['mode'], + 'id': item['sha'], + 'type': item['type'], + 'name': item_name, + 'path': item_path, + } + if item['type'] == 'commit' and item['mode'] == '160000': + url = self._get_submodule(ref).get(item_path, '') + parsed_url = urlparse.urlparse(url) # parse url into tuple + if parsed_url.scheme == 'git': + url = urlparse.urlunparse(('http',) + parsed_url[1:]) + host = '' + if parsed_url.netloc == 'code.dapps.douban.com': + host = 'code' + elif parsed_url.netloc == 'github.com': + if parsed_url.path.startswith('/gist'): + host = 'gist' + d['x-gist-id'] = parsed_url.path.replace('/gist/', '') + else: + host = 'github' + d['type'] = 'submodule' + d['url'] = url + d['host'] = host + list_.append(d) + return list_ + + def list_files(self, ref): + if not ref or ref not in self.get_branches(): + ref = 'HEAD' + #filelist = self.call('ls-tree -r --name-only %s' % ref) + filelist = self.pygit2_repo.ls_tree( + ref, recursive=True, name_only=True) + # return filelist.split('\n') if filelist else [] + return filelist + + def list_sha1_with_files(self, ref): + if not ref or ref not in self.get_branches(): + ref = 'HEAD' + list_tree = self._list_tree(ref, '') + return [(item['id'], item['path']) for item in list_tree] + + def _get_submodule(self, ref): + modules = self.pygit2_repo.show( + '%s:%s' % (ref, '.gitmodules')).split('\n') + if not modules: + return modules + from itertools import groupby + modules = [list(group) for k, group in groupby( + modules, lambda x: x.startswith('[submodule'))] + modules = zip(*[modules[i::2] for i in range(0, 2)]) + _modules = [] + for a, b in modules: + _modules.append(( + [c.split('=')[1].strip() for c in b if c.strip().startswith('path')][0], # noqa + [c.split('=')[1].strip().replace('.git', '') + for c in b if c.strip().startswith('url')][0] + )) + modules = dict(_modules) + return modules + + def temp_branch_name(self): + return 'patch_tmp' + time.strftime('%Y%m%d%H%M%S-') + \ + self._gyt_repo.sha()[10] + + def remove_temp_branch(self, tmp_branch): + assert tmp_branch in self.get_branches( + ), "Branch to be deleted must exist" + assert tmp_branch.startswith('patch_tmp') + last_reflog_msg = self._gyt_repo.reflog(tmp_branch) + assert last_reflog_msg.split()[-1] == TEMP_BRANCH_MARKER, \ + "Branch %s not marked as temporary" % tmp_branch + old_sha = self._gyt_repo.rev_parse(tmp_branch) + self._gyt_repo.update_ref('refs/heads/%s' % tmp_branch, + old_sha, delete=True) + #self.call(['update-ref', '-d', 'refs/heads/%s' % tmp_branch, old_sha]) + + def commit_one_file(self, filename, source, message, user, orig_hash='', + branch='master', parent='master'): + # TODO Need to lock the repo! + first = not bool(self._gyt_repo.rev_parse('HEAD', _raise=False)) + if first: + assert branch == 'master', "can only commit to master when repo is empty" # noqa + assert parent == 'master', "can only commit to master when repo is empty" # noqa + else: + assert parent in self.get_branches( + ), "parent rev must exist if repo not empty" + temp_new_branch = branch.startswith('patch_tmp') + if temp_new_branch: + reflog_msg = TEMP_BRANCH_MARKER + else: + reflog_msg = 'commit_one_file on %s' % branch + assert ' ' not in branch, "Branch cannot have white spaces" + source = source.replace('\r\n', '\n') + tmp = tempfile.NamedTemporaryFile(mode='w', delete=False) + tmp.write(source) + tmp.close() + self._gyt_repo.read_tree('HEAD', _raise=False) + hash_obj = self._gyt_repo.hash_object(tmp.name) + self._gyt_repo.update_index(hash_obj, filename, + add=True, + cacheinfo=True) + tree_sha1 = self._gyt_repo.write_tree() + env = make_git_env(user) + if first: + commit_sha1 = self._gyt_repo.commit_tree( + tree_sha1, message, env=env) + else: + commit_sha1 = self._gyt_repo.commit_tree( + tree_sha1, message, parent=parent, env=env) + + self._gyt_repo.update_ref('refs/heads/%s' % branch, commit_sha1, + msg=reflog_msg, log=True) + + # clean temp file + if os.path.isfile(tmp.name): + os.remove(tmp.name) + + def commit_all_files(self, filenames, contents, oids, user, create=False, + default_filename_prefix='gistfile'): + env = make_git_env(user, is_anonymous=not user) + + def _remove_file(self, sha1_with_files, sha1): + oname = sha1_with_files[sha1] + oname = _check_filename(oname) + # self.call('update-index --add --remove --cacheinfo 100644 %s %s' % + # (oid, oname)) + self._gyt_repo.update_index(sha1, oname, + add=True, remove=True, + cacheinfo=True) + #self.call('rm --cached %s' % oname) + self._gyt_repo.rm(oname) + + def _check_filename(fn): + for c in (' ', '<', '>', '|', ';', ':', '&', '`', "'"): + fn = fn.replace(c, '\%s' % c) + fn = fn.replace('/', '') + return fn + + if create: + sha1_with_files = {} + else: + sha1_with_files = dict(self.list_sha1_with_files('HEAD')) + for index, (filename, content, oid) in enumerate(zip( + filenames, contents, oids), start=1): + if not filename and not content: + continue + if not filename: + filename = default_filename_prefix + str(index) + filename = _check_filename(filename) + if oid and sha1_with_files.get(oid) != filename: + _remove_file(self, sha1_with_files, oid) + + tmp_filename = tempfile.mktemp() + filename = filename.decode('utf-8') + with open(tmp_filename, 'w') as f: + f.write(content.replace('\r\n', '\n')) + #file_sha1 = self.call('hash-object -w %s' % tmp_filename) + file_sha1 = self._gyt_repo.hash_object(tmp_filename) + self._gyt_repo.update_index( + file_sha1, filename, add=True, cacheinfo=True) + # self.call('update-index --add --cacheinfo 100644 %s %s' % + # (file_sha1, filename)) + + if not create: + del_sha1s = set(sha1_with_files) - set(oids) + for sha1 in del_sha1s: + _remove_file(self, sha1_with_files, sha1) + + tree_sha1 = self._gyt_repo.write_tree() + if create: + commit_sha1 = self._gyt_repo.commit_tree(tree_sha1, ' ', env=env) + # commit_sha1 = self.call( + # 'commit-tree %s -m " "' % tree_sha1, _env=env) + else: + commit_sha1 = self._gyt_repo.commit_tree( + tree_sha1, ' ', parent='master', env=env) + # commit_sha1 = self.call( + # 'commit-tree %s -p master -m " "' % tree_sha1, _env=env) + # self.call(['-c', 'core.logAllRefUpdates=True', + # 'update-ref', 'refs/heads/master', commit_sha1]) + self._gyt_repo.update_ref('refs/heads/master', commit_sha1, log=True) + + def rename_detection(self, ref1, ref2=''): + repo = self._gyt_repo.repo + ref1_cmt = repo.revparse_single(ref1) + if not ref2: + parent = ref1_cmt.parents + if parent and parent[0]: + ref2_cmt = parent[0] + else: + '''第一个commit''' + diff = self._gyt_repo.diff( + None, ref1, rename_detection=True, patch=False) + result = dict((d['new_filename'], d['filename']) + for d in diff if d['change'] == 'R100') + return result + else: + ref2_cmt = repo.revparse_single(ref2) + tree1 = ref1_cmt.tree + tree2 = ref2_cmt.tree + if ref2: + diff = tree1.diff(tree2) + else: + diff = tree2.diff(tree1) + diff.find_similar() + result = dict((d.new_file_path, d.old_file_path) + for d in diff if int(d.similarity) > 80) + return result + + def archive(self, name=''): + name = name or self.project_name + content = self._gyt_repo.archive(name, _raw=True) + #content = self.call('archive --prefix=%s/ master' % name, _raw=True) + outbuffer = StringIO() + zipfile = gzip.GzipFile(mode='wb', compresslevel=6, fileobj=outbuffer) + zipfile.writelines(content) + zipfile.close() + out = outbuffer.getvalue() + return out + + def is_empty(self): + return self._gyt_repo.is_empty() + + +class Commit(object): + + def __init__(self, repo_name, sha, tree=None, parent=None, author=None, + author_time=None, committer=None, commit_time=None, + message=None, shortlog=None): + self.repo_name = repo_name + self.sha = sha + self.tree = tree + self.parent = parent + self.author = author + self.time = self.author_time = author_time + self.committer = committer + self.commit_time = commit_time + self.message = message + if shortlog is None and message: + shortlog = message.splitlines()[0] + self.shortlog = shortlog + self.message_body = ''.join(message.splitlines(True)[1:]) + + def __eq__(self, y): + return bool(y and isinstance(y, Commit) and ( + self.repo_name == y.repo_name and self.sha == y.sha)) + + def __repr__(self): + return "<Commit {sha} by {author} '{message}'>".format( + sha=self.sha, author=self.author, + message=self.message.encode('utf-8')) + + @property + def url(self): + return '/{proj}/commit/{sha}'.format(proj=self.repo_name, + sha=self.sha) + + @property + def shortsha(self): + return self.sha[:7] + + def has_only_shortlog(self): + return self.shortlog.strip() == self.message.strip() + + +class Diffs(list): + + @classmethod + def from_diffs(cls, diffs): + return cls(Diff.from_diff(diff) for diff in diffs) + + @property + def n_additions(self): + return sum(diff.n_additions for diff in self) + + @property + def n_deletions(self): + return sum(diff.n_deletions for diff in self) + + +class Diff(object): + + def __repr__(self): + return "Diff({path}, {old}, {new})".format( + path=repr(self.filepath), old=self.old_sha, new=self.new_sha) + + def __init__(self, filepath, old_sha=None, new_sha=None, chunks=None, + generated=False, binary=False, status=None, + new_filepath=None): + self.filepath = filepath + self.old_sha = old_sha + self.new_sha = new_sha + self.chunks = chunks + self.generated = generated + self.binary = binary + self.status = status + self.new_filepath = new_filepath + + @classmethod + def from_diff(cls, diff): + filepath = diff['filename'] + old_sha = diff['asha'][:7] + new_sha = diff['bsha'][:7] + if old_sha == '0000000': + old_sha = None + if new_sha == '0000000': + new_sha = None + generated = diff['generated'] + binary = diff['binary'] + ignore = generated or binary + chunks = [DiffChunk.chunk_from_gyt_diff(patch, ignore) + for patch in diff['patch']] + status = diff['change'] + new_filepath = diff['new_filename'] + return cls(filepath, old_sha, new_sha, chunks, generated, binary, + status, new_filepath) + + @property + def type(self): + if self.status == 'R': + return 'renamed' + if self.old_sha: + if self.new_sha: + return 'modified' + else: + return 'removed' + else: + return 'added' + + @property + def n_additions(self): + return sum(chunk.chunk_n_additions() for chunk in self.chunks) + + @property + def n_deletions(self): + return sum(chunk.chunk_n_deletions() for chunk in self.chunks) + + @property + def diff_content(self): + return [l for c in self.chunks for l in c.diff_lines_with_num()] + + @property + def side_diff_content(self): + return [l for c in self.chunks for l in c.side_lines()] + + def smart_slice(self, num): + content = self.diff_content[:num + 1] + if len(content) < 15: + return content + else: + tip_pos = 0 + for idx, (type, old, new, line) in enumerate(content): + if old.strip() == '...': + tip_pos = idx + content = content[tip_pos:] + if len(content) > 25: + return content[-25:] + else: + return content + + +class DiffChunk(object): + TIP_LINE_RE = re.compile( + r'^@@+ -(?P<old_line_no>\d+),?(?P<old_n_lines>\d+)? ' + '(?:-\d+,\d+ )?' + '\+(?P<new_line_no>\d+),?(?P<new_n_lines>\d+)? @@+') + + def __init__(self, tip_line, diff_lines, ignore): + self.tip_line = tip_line + self.reallines = diff_lines + if not ignore and len(diff_lines) < RE_HUNK_LIMIT: + self.diff_lines = rehunk(diff_lines) + else: + self.diff_lines = diff_lines + + @classmethod + def chunk_from_gyt_diff(cls, chunk, ignore=False): + tip_line, diff_lines = chunk + return cls(tip_line, diff_lines, ignore) + + def diff_lines_with_num(self): + old, new = self._start_line_numbers() + below_l, below_r = old, new + result = [] + result.append(('tips', '...', '...', self.tip_line)) + for type_, l in self.diff_lines: + if type_ == 'rem': + result.append(('deletion', str(old), ' ', l)) + old += 1 + elif type_ == 'add': + result.append(('insertion', ' ', str(new), l)) + new += 1 + else: + result.append(('normal', str(old), str(new), l)) + old += 1 + new += 1 + above_l, above_r = old - 1, new - 1 + result[0] = ('tips', '...', '...', + self.tip_line + '||%s,%s,%s,%s' % ( + below_l, below_r, + above_l, above_r) + ) + return result + + def side_lines(self): + old, new = self._start_line_numbers() + result = [] + result.append(( + '...', 'normal', self.tip_line, '...', 'normal', self.tip_line)) + type_ = {'emp': 'normal', 'normal': 'normal', 'add': 'insertion', + 'rem': 'deletion'} + for l, r in rehunk(self.reallines, True): # side hunk + l_type = l[1] + r_type = r[1] + disp_old = str(old) if l_type != 'emp' else ' ' + disp_new = str(new) if r_type != 'emp' else ' ' + result.append((disp_old, type_.get(l_type), l[2], disp_new, + type_.get(r_type), r[2])) + if l_type != 'emp': + old += 1 + if r_type != 'emp': + new += 1 + return result + + def _start_line_numbers(self): + m = self.TIP_LINE_RE.match(self.tip_line) + old_line_no = m.group('old_line_no') + new_line_no = m.group('new_line_no') + return int(old_line_no), int(new_line_no) + + def chunk_n_additions(self): + return len([line for line in self.diff_lines if line[0] == 'add']) + + def chunk_n_deletions(self): + return len([line for line in self.diff_lines if line[0] == 'rem']) + + +def make_git_env(user=None, is_anonymous=False): + env = {} + if is_anonymous: + env['GIT_AUTHOR_NAME'] = 'anonymous' + env['GIT_AUTHOR_EMAIL'] = 'anonymous@douban.com' + env['GIT_COMMITTER_NAME'] = 'anonymous' + env['GIT_COMMITTER_EMAIL'] = 'anonymous@douban.com' + else: + env['GIT_AUTHOR_NAME'] = user.username + env['GIT_AUTHOR_EMAIL'] = user.email + env['GIT_COMMITTER_NAME'] = user.username + env['GIT_COMMITTER_EMAIL'] = user.email + return env diff --git a/vilya/models/git/diff/__init__.py b/vilya/models/git/diff/__init__.py deleted file mode 100644 index d6f692d..0000000 --- a/vilya/models/git/diff/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -# -*- coding: utf-8 -*- - -from __future__ import absolute_import -from vilya.models.git.diff.diff import Diff - diff --git a/vilya/models/hashers.py b/vilya/models/hashers.py new file mode 100644 index 0000000..72db27b --- /dev/null +++ b/vilya/models/hashers.py @@ -0,0 +1,179 @@ +# coding=utf-8 +import string +import random +import binascii +import hashlib +import importlib +from collections import OrderedDict + + +UNUSABLE_PASSWORD_PREFIX = '!' + + +def gen_random_password(length=20): + return ''.join(random.choice(string.ascii_letters + string.digits) + for i in range(10)) + + +def constant_time_compare(val1, val2): + if len(val1) != len(val2): + return False + result = 0 + for x, y in zip(val1, val2): + result |= ord(x) ^ ord(y) + return result == 0 + + +def check_password(password, encoded, preferred='default'): + preferred = get_hasher(preferred) + hasher = identify_hasher(encoded) + + is_correct = hasher.verify(password, encoded) + return is_correct + + +def make_password(password, salt=None, hasher='default', suffix_length=20): + if password is None: + return UNUSABLE_PASSWORD_PREFIX + gen_random_password(suffix_length) + hasher = get_hasher(hasher) + + if not salt: + salt = hasher.salt() + + return hasher.encode(password, salt) + + +def get_hashers(): + return [ + BCryptSHA256PasswordHasher, BCryptPasswordHasher + ] + + +def get_hasher(algorithm='default'): + if hasattr(algorithm, 'algorithm'): + return algorithm + + elif algorithm == 'default': + return get_hashers()[0] + + else: + hasher = next((hasher for hasher in get_hashers() + if hasher.algorithm == algorithm), None) + if hasher is None: + raise ValueError( + "Unknown password hashing algorithm '{}'. ".format(algorithm)) + return hasher() + + +def identify_hasher(encoded): + algorithm = encoded.split('$', 1)[0] + return get_hasher(algorithm) + + +def mask_hash(hash, show=6, char="*"): + masked = hash[:show] + masked += char * len(hash[show:]) + return masked + + +class BasePasswordHasher(object): + algorithm = None + library = None + + def _load_library(self): + if self.library is not None: + if isinstance(self.library, (tuple, list)): + name, mod_path = self.library + else: + mod_path = self.library + try: + module = importlib.import_module(mod_path) + except ImportError as e: + raise ValueError("Couldn't load %r algorithm library: %s" % + (self.__class__.__name__, e)) + return module + raise ValueError("Hasher %r doesn't specify a library attribute" % + self.__class__.__name__) + + def salt(self): + """Generates a cryptographically secure nonce salt in ASCII""" + return gen_random_password() + + def verify(self, password, encoded): + raise NotImplementedError( + 'subclasses of BasePasswordHasher must provide a verify() method') + + def encode(self, password, salt): + """Creates an encoded database value + + The result is normally formatted as "algorithm$salt$hash" and + must be fewer than 128 characters. + """ + raise NotImplementedError( + 'subclasses of BasePasswordHasher must provide an encode() method') + + def safe_summary(self, encoded): + """Returns a summary of safe values + + The result is a dictionary and will be used where the password field + must be displayed to construct a safe representation of the password. + """ + raise NotImplementedError( + 'subclasses of BasePasswordHasher must provide a safe_summary() method') # noqa + + +class BCryptSHA256PasswordHasher(BasePasswordHasher): + """Secure password hashing using the bcrypt algorithm + """ + algorithm = "bcrypt_sha256" + digest = hashlib.sha256 + library = ('bcrypt', 'bcrypt') + rounds = 12 + + def salt(self): + bcrypt = self._load_library() + return bcrypt.gensalt(rounds=self.rounds) + + def encode(self, password, salt): + bcrypt = self._load_library() + if self.digest is not None: + password = binascii.hexlify( + self.digest(password).digest()) + + data = bcrypt.hashpw(password, salt) + return "%s$%s" % (self.algorithm, data) + + def verify(self, password, encoded): + algorithm, data = encoded.split('$', 1) + assert algorithm == self.algorithm + bcrypt = self._load_library() + + if self.digest is not None: + password = binascii.hexlify( + self.digest(password).digest()) + + hashpw = bcrypt.hashpw(password, data) + + return constant_time_compare(data, hashpw) + + def safe_summary(self, encoded): + algorithm, empty, algostr, work_factor, data = encoded.split('$', 4) + assert algorithm == self.algorithm + salt, checksum = data[:22], data[22:] + return OrderedDict([ + ('algorithm', algorithm), + ('work factor', work_factor), + ('salt', mask_hash(salt)), + ('checksum', mask_hash(checksum)), + ]) + + +class BCryptPasswordHasher(BCryptSHA256PasswordHasher): + """Secure password hashing using the bcrypt algorithm + + This hasher does not first hash the password which means it is subject to + the 72 character bcrypt password truncation, most use cases should prefer + the BCryptSha512PasswordHasher. + """ + algorithm = 'bcrypt' + digest = None diff --git a/vilya/models/hook.py b/vilya/models/hook.py new file mode 100644 index 0000000..bd59fb7 --- /dev/null +++ b/vilya/models/hook.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +from vilya.libs.validators import check_url, check_integer +from vilya.libs.store import store + + +class CodeDoubanHook(object): + def __init__(self, id, url, project_id): + self.url = url + self.project_id = project_id + self.id = int(id) + + def __str__(self): + return "Hook : %s " % self.url + + def validate(self): + errors = [] + validators = [check_url( + self.url, 'Url'), check_integer(self.project_id, 'Project ID')] + for error in validators: + if error: + errors.append(error) + return errors + + def destroy(self): + store.execute( + "delete from codedouban_hooks where hook_id=%s", (self.id,)) + store.commit() + return self + + @classmethod + def add(cls, url, project_id): + hook_id = store.execute("insert into codedouban_hooks " + "(project_id, url) values " + "(%s, %s)", + (project_id, url)) + store.commit() + return cls(hook_id, url, project_id) + + @classmethod + def get_id_by_url(cls, project_id, url): + rs = store.execute( + 'select hook_id from codedouban_hooks ' + 'where project_id=%s and url=%s', (project_id, url,)) + return rs[0][0] if rs else None + + @classmethod + def get_by_url(cls, url): + rs = store.execute('select hook_id, url, project_id from ' + 'codedouban_hooks where url=%s', (url,)) + return cls(*rs[0]) if rs else '' diff --git a/vilya/models/hooks/__init__.py b/vilya/models/hooks/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/vilya/models/hooks/events/__init__.py b/vilya/models/hooks/events/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/vilya/models/hooks/events/push.py b/vilya/models/hooks/events/push.py new file mode 100644 index 0000000..75a2ea0 --- /dev/null +++ b/vilya/models/hooks/events/push.py @@ -0,0 +1,147 @@ +# -*- coding: utf-8 -*- + +EMPTY_OID = '0' * 40 + + +class PushEvent(object): + type = 'push' + + def __init__(self, push): + self.push = push + + @property + def payload(self): + return self.push.payload + +""" +payload: { + "ref":"refs/heads/master", + "after":"617942d86be4f9040d8b2576cd9a32c853b62d24", + "before":"8e4b9a330c89019943a67de88db3bef8ff24dbc3", + "created":false, + "deleted":false, + "forced":false, + "compare":"https://github.com/xtao/test/compare/8e4b9a330c89...617942d86be4", # noqa + "commits":[{ + "id":"617942d86be4f9040d8b2576cd9a32c853b62d24", + "distinct":true, + "message":"Add", + "timestamp":"2013-11-20T05:18:28-08:00", + "url":"https://github.com/xtao/test/commit/617942d86be4f9040d8b2576cd9a32c853b62d24", # noqa + "author":{ + "name":"XTao", + "email":"xutao881001@gmail.com", + "username":"xtao"}, + "committer":{ + "name":"XTao", + "email":"xutao881001@gmail.com", + "username":"xtao"}, + "added":["hook.md"], + "removed":[], + "modified":[]}], + "head_commit":{ + "id":"617942d86be4f9040d8b2576cd9a32c853b62d24", + "distinct":true, + "message":"Add", + "timestamp":"2013-11-20T05:18:28-08:00", + "url":"https://github.com/xtao/test/commit/617942d86be4f9040d8b2576cd9a32c853b62d24", # noqa + "author":{ + "name":"XTao", + "email":"xutao881001@gmail.com", + "username":"xtao"}, + "committer":{ + "name":"XTao", + "email":"xutao881001@gmail.com", + "username":"xtao"}, + "added":["hook.md"], + "removed":[], + "modified":[]}, + "repository":{ + "id":13925321, + "name":"test", + "url":"https://github.com/xtao/test", + "description":"Test~", + "watchers":0, + "stargazers":0, + "forks":0, + "fork":false, + "size":136, + "owner":{ + "name":"xtao", + "email":"xutao881001@gmail.com"}, + "private":false, + "open_issues":1, + "has_issues":true, + "has_downloads":true, + "has_wiki":true, + "created_at":1382963502, + "pushed_at":1384953548, + "master_branch":"master"}, + "pusher":{ + "name":"xtao", + "email":"xutao881001@gmail.com"} +} +""" + + +class PushPayload(object): + """<old-value> SP <new-value> SP <ref-name> LF""" + + def __init__(self, project, old_value, new_vaule, ref_name, user_name): + self.old_value = old_value + self.new_vaule = new_vaule + self.ref_name = ref_name + self.project = project + self.user_name = user_name + + @property + def before(self): + return self.old_value + + @property + def after(self): + return self.new_vaule + + @property + def ref(self): + return self.ref_name + + @property + def repository(self): + repo = dict(url=self.project.repo_url, + name=self.project.name, + description=self.project.description, + owner=dict(name=self.project.owner_name)) + return repo + + @property + def commits(self): + repo = self.project.repo + if not repo: + return [] + if repo.empty: + return [] + if any(EMPTY_OID == _ for _ in (self.after, self.before)): + return [] + _commits = repo.get_commits(self.after, self.before) + commits = [dict(id=commit.sha, + author=dict(name=commit.author_name, + email=commit.author_email), + url=commit.url, + message=commit.message, + # FIXME: date format + timestamp=commit.author_time.strftime( + "%Y-%m-%dT%H:%M:%S %z") + ) for commit in _commits] + return commits + + @property + def payload(self): + payload = dict(before=self.before, + after=self.after, + ref=self.ref, + repository=self.repository, + commits=self.commits, + user_name=self.user_name, + type="push") + return payload diff --git a/vilya/models/inbox.py b/vilya/models/inbox.py new file mode 100644 index 0000000..c638970 --- /dev/null +++ b/vilya/models/inbox.py @@ -0,0 +1,354 @@ +# -*- coding: utf-8 -*- + +from datetime import datetime +from itertools import groupby + +from vilya.libs.store import mc +from vilya.libs.irc import send_message + +from vilya.config import DOMAIN, DEVELOP_MODE + + +class Courier(object): + + def __init__(self, reception_list): + self.inboxes = [Inbox.get(r) for r in set(reception_list)] + + @classmethod + def to(cls, reception_list): + return cls(reception_list) + + def add_pull_request_data(self, data): + for inbox in self.inboxes: + inbox.add_pull_request(data) + + def add_pull_request_action_data(self, data): + for inbox in self.inboxes: + inbox.add_pull_request_action(data) + send_message( + data.get('commiter') if data.get( + 'status') != "unmerge" else data.get('owner'), + "Pull request ( %s ) %s on %s by %s" % ( + DOMAIN + data.get('url'), + "merged" if data.get('status') != "unmerge" else "posted", + data.get('to_proj'), + data.get('owner') if data.get( + 'status') != "unmerge" else data.get('commiter') + )) + + def add_code_review_data(self, data): + for inbox in self.inboxes: + inbox.add_code_review_action(data) + + def prepare_pull_request_data(self, pullreq, ticket_id, ticket, + status="unmerge", new_version=False): + if new_version: + ticket_fields = dict( + reporter=ticket.author, description=ticket.description, + owner=pullreq.merge_by or pullreq.to_proj.owner_id, + summary=ticket.title) + else: + ticket_fields = ticket.values + uid = 'pullrequest-%s-%s-%s' % (pullreq.to_proj, ticket_id, status) + + if new_version: + pullreq_url = "/%s/pull/%s/" % ( + pullreq.to_proj, ticket.ticket_id) + else: + pullreq_url = "/%s/pull/%s" % (pullreq.to_proj, ticket.id) + to_proj_str = "%s:%s" % (pullreq.to_proj, pullreq.to_branch) + from_proj_str = "%s:%s" % (pullreq.from_proj, pullreq.from_branch) + commiter = ticket_fields['reporter'] + + data = dict( + date=datetime.now(), + url=pullreq_url, + description=ticket_fields['description'], + from_proj=from_proj_str, + to_proj=to_proj_str, + commiter=commiter, + owner=ticket_fields['owner'], + title=ticket_fields['summary'], + status=status, + uid=uid, + ) + return data + + def add_pull_request(self, pullreq, ticket_id, ticket, status="unmerge", + new_version=False): + data = self.prepare_pull_request_data( + pullreq, ticket_id, ticket, status, new_version) + self.add_pull_request_data(data) + + def add_pull_request_action(self, pullreq, ticket_id, ticket, + status="unmerge", new_version=False): + data = self.prepare_pull_request_data( + pullreq, ticket_id, ticket, status, new_version) + self.add_pull_request_action_data(data) + + def add_code_review(self, ticket, author, text, commit_id): + ticket_fields = ticket.values + from vilya.models.pull import PullRequest + pullreq = PullRequest.get_by_ticket(ticket) + uid = 'codereview-%s-%s-%s' % (pullreq.to_proj, ticket.id, commit_id) + + data = dict( + date=datetime.now(), + url="/%s/pull/%s" % (pullreq.to_proj, ticket.id), + ticket=ticket.id, + proj="%s:%s" % (pullreq.to_proj, pullreq.to_branch), + receiver=ticket_fields['reporter'], + author=author, + text=text, + uid=uid, + ) + + self.add_code_review_data(data) + + def add_new_code_review(self, author, text, pullreq, ticket, comment_id, + anchor_id=None): + ticket_id = ticket.ticket_id + uid = 'newcodereview-%s-%s-%s' % ( + pullreq.to_proj, ticket_id, comment_id) + + data = dict( + date=datetime.now(), + url="/%s/pull/%s/#%s" % (pullreq.to_proj, ticket_id, anchor_id), + ticket=ticket_id, + proj="%s:%s" % (pullreq.to_proj, pullreq.to_branch), + receiver=ticket.author, + author=author, + text=text, + uid=uid, + ) + + self.add_code_review_data(data) + + +class Counter(object): + + def __init__(self, mckey): + self._mc = mc + self.mckey = mckey + self.counter_mckey = mckey + '/counter' + self.update(is_force=False) + + def __repr__(self): + return str(self._mc.get(self.counter_mckey) or 0) + + def __str__(self): + return str(self._mc.get(self.counter_mckey) or 0) + + def __gt__(self, num): + count = self._mc.get(self.counter_mckey) or 0 + return count > num + + def incr(self): + return self._mc.incr(self.counter_mckey) + + def decr(self): + return self._mc.decr(self.counter_mckey) + + def set(self, num): + return self._mc.set(self.counter_mckey, num) + + def update(self, is_force=True): + if is_force: + self._mc.set( + self.counter_mckey, len(self._mc.get(self.mckey) or [])) + else: + self._mc.add( + self.counter_mckey, len(self._mc.get(self.mckey) or [])) + + +class NotificationsCounter(Counter): + + def update(self, is_force=True): + if is_force or DEVELOP_MODE: + self._mc.set( + self.counter_mckey, + len([n for n in ( + self._mc.get(self.mckey) or []) if n.get('unread')]) + ) + else: + self._mc.add( + self.counter_mckey, + len([n for n in ( + self._mc.get(self.mckey) or []) if n.get('unread')]) + ) + + +class PullrequestsCounter(Counter): + + def update(self, is_force=True): + pullreqs = self._mc.get(self.mckey) or [] + unmerge_num = len(get_unmerge_pull_request(pullreqs)) + if is_force or DEVELOP_MODE: + self._mc.set(self.counter_mckey, unmerge_num) + else: + self._mc.add(self.counter_mckey, unmerge_num) + + +def get_unmerge_pull_request(pull_requests): + """ + 每个pullrequest的uid格式是 pullrequest-[project name]-[ticket id]-merge/unmerge, + 这里可以用uid来做分组,得出所有unique的pull request + """ + pull_requests.sort(key=lambda pull: pull.get('uid').rsplit('-', 1)[0]) + unmerge_pulls = [] + for k, group in groupby( + pull_requests, + key=lambda pull: pull.get('uid').rsplit('-', 1)[0]): + is_merged = False + unmerge_group = [] + for pull in group: + if pull.get('status') == 'merged': + is_merged = True + break + unmerge_group.append(pull) + if not is_merged: + unmerge_pulls.append(unmerge_group[0]) + return unmerge_pulls + + +# deprecated ?? +class Inbox(object): + + def __init__(self, user): + self._mc = mc + self.user = user + self.pullrequests_mckey = "code/%s/pull_requests" % user + self.actions_mckey = "code/%s/actions" % user + self.statuses_mckey = "code/%s/statuses" % user + self.notifications_mckey = "code/%s/notifications" % user + self.update() + + @classmethod + def get(cls, user): + return cls(user=user) + + def update(self): + self.pull_requests = self._mc.get(self.pullrequests_mckey) or [] + self.actions = self._mc.get(self.actions_mckey) or [] + self.statuses = self._mc.get(self.statuses_mckey) or [] + self.notifications = self._mc.get(self.notifications_mckey) or [] + + @property + def n_pull_requests(self): + return PullrequestsCounter(self.pullrequests_mckey) + + @property + def n_notifications(self): + return NotificationsCounter(self.notifications_mckey) + + def get_pull_requests(self): + return self.pull_requests + + def get_unmerge_pull_requests(self): + return get_unmerge_pull_request(self.pull_requests) + + def add_pull_request(self, pull_request): + self.update() + old_msgs = self.pull_requests + old_msgs.append(pull_request) + self._mc.set(self.pullrequests_mckey, old_msgs) + self.update() + self.n_pull_requests.update() + + def _add_one_notif(self, type_, notif): + # guibog 20120813 these setdefault are not very good, + # they will change received param + # TODO replace with d = {...} and d.update(notif) + notif.setdefault('type', type_) + notif.setdefault('unread', True) + self.update() + self.n_notifications.incr() + old_msgs = self.notifications + old_msgs.append(notif) + self._mc.set(self.notifications_mckey, old_msgs) + self.update() + + def _add_one_action(self, type_, action): + action.setdefault('type', type_) + self.update() + old_msgs = self.actions + old_msgs.append(action) + self._mc.set(self.actions_mckey, old_msgs) + self.update() + + def add_status(self, status): + status.setdefault('type', 'status') + self.update() + old_msgs = self.statuses + old_msgs.append(status) + self._mc.set(self.statuses_mckey, old_msgs) + self.update() + + def add_pull_request_action(self, action): + self._add_one_action('pull_request', action) + + def add_pull_request_notification(self, notification): + self._add_one_notif('pull_request', notification) + + def get_actions(self): + return self.actions + + def get_statuses(self): + return self.statuses + + def add_code_review_action(self, code_review): + self._add_one_action('code_review', code_review) + + def get_notifications(self): + return self.notifications + + def add_code_review_notification(self, code_review): + self._add_one_notif('code_review', code_review) + + def add_issue_notification(self, issue_change): + self._add_one_notif('issue_change', issue_change) + + def add_commit_comment_notification(self, comment): + self._add_one_notif('commit_comment', comment) + + def add_commit_comment_action(self, comment): + self._add_one_action('commit_comment', comment) + + def mark_notification_as_read(self, uid): + self.update() + self.n_notifications.decr() + notifications = [] + for n in self.notifications: + if n and n.get('uid') == uid: + n['unread'] = False + notifications.append(n) + self._mc.set(self.notifications_mckey, notifications) + self.update() + + def mark_all_notification_as_read(self): + self.update() + notifications = [] + for n in self.notifications: + n['unread'] = False + notifications.append(n) + self._mc.set(self.notifications_mckey, notifications) + self.n_notifications.set(0) + self.update() + + def add_commit_action(self, commit): + commit.setdefault('type', 'commit') + self.update() + old_acts = self.actions + # remove duplicated commit + for act in old_acts: + if commit.get('commit_id') == act.get('commit_id'): + return + old_acts.append(commit) + self._mc.set(self.actions_mckey, old_acts) + self.update() + + def add_recommend_action(self, recommend): + self._add_one_action('recommend', recommend) + + def add_recommend_notification(self, notification): + self._add_one_notif('recommend', notification) diff --git a/vilya/models/issue.py b/vilya/models/issue.py new file mode 100644 index 0000000..2f4fd88 --- /dev/null +++ b/vilya/models/issue.py @@ -0,0 +1,430 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import +from datetime import datetime +import operator + +from vilya.libs.store import store, mc, cache, mc_gets, bdb +from vilya.models.tag import Tag, TagName +from vilya.models.issue_vote import Upvote +from vilya.models.issue_participant import IssueParticipant +from vilya.models.issue_comment import IssueComment + +MC_KEY_ISSUE = 'issue:v3:%s' +MC_KEY_ISSUES_DATA_BY_TARGET = 'issues_data:v3:type:%s:target_id:%s' +MC_KEY_ISSUES_IDS_BY_CREATOR_ID = 'issue_ids_by_creator_id:v3:%s' +MC_KEY_ISSUES_IDS_BY_ASSIGNEE_ID = 'issues_ids_by_assignee_id:v3:%s' +MC_KEY_USER_ISSUE_IDS_BY_CREATOR_ID = 'user_issue:v3:%s' +BDB_ISSUE_DESCRIPTION_KEY = 'issue_description:%s' +ISSUE_DATA_FIELDS = dict(issue_id=0, closer_id=1, updated_at=2, rank_score=3) + + +def filter_issue_ids_by_score(ids, order): + if order == 'hot': + index = ISSUE_DATA_FIELDS['rank_score'] + ids = [info for info + in sorted(ids, key=operator.itemgetter(index), reverse=True)] + else: + index = ISSUE_DATA_FIELDS['updated_at'] + ids = [info for info + in sorted(ids, key=operator.itemgetter(index), reverse=True)] + return ids + + +def filter_issue_ids_by_state(ids, state): + index = ISSUE_DATA_FIELDS['closer_id'] + if state: + if state == 'open': + ids = [info for info in ids if not info[index]] + elif state == 'closed': + ids = [info for info in ids if info[index]] + return ids + + +class Issue(object): + target_type = 'default' + tag_type = 0 # not exists type + provided_features = [] # Interface + + def __init__(self, id, title, + creator, assignee=None, closer=None, + created_at=None, updated_at=None, closed_at=None, + type='default', target_id=0): + self.id = id + self.issue_id = id + self.title = title + bdb_description = bdb.get(BDB_ISSUE_DESCRIPTION_KEY % id) + self.description = bdb_description + self.creator_id = creator + self.assignee_id = assignee + self.closer_id = closer + self.created_at = created_at + self.updated_at = updated_at + self.closed_at = closed_at + self.type = type + self.number = 0 + self.target_id = target_id + + def __repr__(self): + return '<%s(%s)>' % (self.__class__.__name__, self.id) + + @property + def url(self): + raise NotImplementedError('Subclasses should implement this!') + + @property + def target(self): + raise NotImplementedError('Subclasses should implement this!') + + def provide(self, name): + '''检查是否提供某功能,即是否提供某接口''' + return name in self.provided_features + + @property + def state(self): + if self.closer_id: + return 'closed' + + return 'open' + + @property + def is_closed(self): + return self.state == 'closed' + + @property + def creator(self): + if self.creator_id: + from vilya.models.user import User + return User(self.creator_id) + return None + + @property + def closer(self): + if self.closer_id: + from vilya.models.user import User + return User(self.closer_id) + return None + + @property + def assignee(self): + if self.assignee_id: + from vilya.models.user import User + return User(self.assignee_id) + return None + + def clear_cache(self): + mc.delete(MC_KEY_ISSUE % self.issue_id) + + def update(self, title, description): + store.execute("update issues " + "set title=%s, updated_at=null " + "where id=%s", (title, self.issue_id)) + store.commit() + bdb.set(BDB_ISSUE_DESCRIPTION_KEY % self.issue_id, description) + self.clear_cache() + mc.delete(MC_KEY_ISSUES_DATA_BY_TARGET % (self.type, self.target_id)) + + def close(self, user_id): + store.execute("update issues " + "set closer_id=%s, closed_at=null " + "where id=%s", (user_id, self.issue_id)) + store.commit() + self.clear_cache() + mc.delete(MC_KEY_ISSUES_IDS_BY_CREATOR_ID % self.creator_id) + mc.delete(MC_KEY_ISSUES_DATA_BY_TARGET % (self.type, self.target_id)) + self.closer_id = user_id + + def open(self): + store.execute("update issues " + "set closer_id=null, closed_at=null " + "where id=%s", (self.issue_id,)) + store.commit() + self.clear_cache() + mc.delete(MC_KEY_ISSUES_IDS_BY_CREATOR_ID % self.creator_id) + mc.delete(MC_KEY_ISSUES_DATA_BY_TARGET % (self.type, self.target_id)) + self.closer_id = None + + def add_tag(self, tag, type, target_id, author=None): + author_id = author if author else self.creator_id + # create tag if not exists + tag_name = TagName.get_by_name_and_target_id(tag, type, target_id) + if not tag_name: + tag_name = TagName.add(tag, author_id, type, target_id) + if not tag_name: + return + # add tag to issue if not already be added + issue_tag = Tag.get_by_type_id_and_tag_id( + type, self.issue_id, tag_name.id) + if issue_tag: + return + Tag.add_to_issue( + tag_name.id, type, self.issue_id, author_id, target_id) + + def add_tags(self, tags, target_id, author=None): + for tag in tags: + self.add_tag(tag, self.tag_type, target_id, author) + + def remove_tag(self, tag, type, target_id): + # check if tag exists + tag_name = TagName.get_by_name_and_target_id(tag, type, target_id) + if not tag_name: + return + # delete tag relationship if exists + issue_tag = Tag.get_by_type_id_and_tag_id( + type, self.issue_id, tag_name.id) + if issue_tag: + issue_tag.delete() + + def remove_tags(self, tags, target_id): + for tag in tags: + self.remove_tag(tag, self.tag_type, target_id) + + def upvote_by_user(self, user_id): + if user_id and (user_id != self.creator_id) and not self.is_closed: + vote = Upvote.add(self.issue_id, user_id) + if vote: + self.update_rank_score() + return self.vote_count + + def cancel_upvote_by_user(self, user_id): + ok = Upvote.delete(self.issue_id, user_id) + if ok: + self.update_rank_score() + return self.vote_count + + def has_user_voted(self, user_id): + if user_id: + vote = Upvote.get_by_issue_id_and_user_id(self.issue_id, user_id) + return True if vote else False + return False + + @property + def vote_count(self): + return Upvote.count_by_issue_id(self.issue_id) + + @property + def comments(self): + return IssueComment.gets_by_issue_id(self.issue_id) + + @property + def comment_count(self): + return IssueComment.count_by_issue_id(self.issue_id) + + def add_comment(self, content, user): + res = IssueComment.add(self.issue_id, content, user) + self.update_rank_score() + return res + + def update_rank_score(self): + vote_count = self.vote_count + comment_count = self.comment_count + time_delta = (datetime.now() - datetime(2011, 1, 1)).total_seconds() + divider = (datetime(2013, 7, 8) - datetime(2011, 1, 1)).total_seconds() + time_factor = time_delta / divider * 5 + score = (vote_count * 0.5 + comment_count) * time_factor + store.execute( + "update issues " + "set rank_score=%s , updated_at=updated_at " # 防止字段更新 + "where id=%s ", + (score, self.issue_id)) + store.commit() + mc.delete(MC_KEY_ISSUES_DATA_BY_TARGET % (self.type, self.target_id)) + return score + + def add_participants(self, user_ids): + for user_id in user_ids: + self.add_participant(user_id) + + def add_participant(self, user_id): + p = IssueParticipant.get_by_issue_id_and_user_id(self.issue_id, + user_id) + if not p: + IssueParticipant.add(self.issue_id, user_id) + + def delete_participant(self, user_id): + p = IssueParticipant.get_by_issue_id_and_user_id(self.issue_id, + user_id) + if p: + p.delete() + + def has_participated(self, user_id): + return bool(IssueParticipant.get_by_issue_id_and_user_id( + self.issue_id, user_id)) + + @property + def participants(self): + return IssueParticipant.gets_by_issue_id(self.issue_id) + + def assign(self, user_id): + old_id = self.assignee_id + store.execute("update issues " + "set assignee_id=%s " + "where id=%s", (user_id, self.issue_id)) + store.commit() + self.clear_cache() + mc.delete(MC_KEY_ISSUES_IDS_BY_ASSIGNEE_ID % old_id) + mc.delete(MC_KEY_ISSUES_IDS_BY_ASSIGNEE_ID % user_id) + + @classmethod + def add(cls, title, description, creator, assignee=None, closer=None, + created_at=None, updated_at=None, closed_at=None, + type='default', target_id=0): + time = datetime.now() + issue_id = store.execute( + 'insert into issues (title, creator_id, ' + 'assignee_id, closer_id, created_at, updated_at, type, target_id) ' + 'values (%s, %s, %s, %s, NULL, NULL, %s, %s)', + (title, creator, assignee, closer, type, target_id)) + store.commit() + mc.delete(MC_KEY_ISSUE % issue_id) + mc.delete(MC_KEY_ISSUES_IDS_BY_CREATOR_ID % creator) + mc.delete(MC_KEY_ISSUES_IDS_BY_ASSIGNEE_ID % assignee) + mc.delete(MC_KEY_ISSUES_DATA_BY_TARGET % (type, target_id)) + bdb.set(BDB_ISSUE_DESCRIPTION_KEY % issue_id, description) + issue = cls(issue_id, title, creator, assignee, closer, time, time) + issue.add_participant(creator) + return issue + + def delete(self): + store.execute('delete from issues where id=%s', (self.id,)) + store.commit() + mc.delete(MC_KEY_ISSUE % self.id) + mc.delete(MC_KEY_ISSUES_IDS_BY_CREATOR_ID % self.creator_id) + mc.delete(MC_KEY_ISSUES_IDS_BY_ASSIGNEE_ID % self.assignee_id) + mc.delete(MC_KEY_ISSUES_DATA_BY_TARGET % (type, self.target_id)) + bdb.set(BDB_ISSUE_DESCRIPTION_KEY % self.id, '') + + @classmethod + def get(cls, id): + rs = store.execute( + "select id, title, creator_id, assignee_id, closer_id, " + "created_at, updated_at, closed_at, type, target_id " + "from issues where id=%s", (id,)) + return rs and cls(*rs[0]) or None + + @classmethod + def get_by_issue_id(cls, id, state=None): + issue = Issue.get(id) + if not issue: + return None + + if state and issue.state != state: + return None + + return issue + + @classmethod + @cache(MC_KEY_ISSUES_DATA_BY_TARGET % ('{cls.target_type}', '{target_id}')) + def get_data_by_target(cls, target_id): + rs = store.execute('select id, closer_id, updated_at, rank_score ' + 'from issues where type=%s and target_id=%s', + (cls.target_type, target_id)) + return rs + + @classmethod + def gets_by_target(cls, target_id, state=None, order='', + limit=0, start=0): + data = cls.get_data_by_target(target_id) + data = filter_issue_ids_by_state(data, state) + data = filter_issue_ids_by_score(data, order) + ids = [issue_id for (issue_id, _, _, _) in data] + if limit: + ids = ids[start:start + limit] + return Issue.get_cached_issues(ids) + + @classmethod + def gets_by_creator_id(cls, id, state='open'): + # FIXME 子类中的这个方法,参数非常不一致。需要尽快解决 + result = cls.get_ids_by_creator_id(id) + if state == 'open': + ids = [i for (i, closer_id) in result if not closer_id] + return Issue.get_cached_issues(ids) + else: + ids = [i for (i, closer_id) in result if closer_id] + return Issue.get_cached_issues(ids) + + @classmethod + @cache(MC_KEY_ISSUES_IDS_BY_CREATOR_ID % '{id}') + def get_ids_by_creator_id(cls, id): + rs = store.execute("select id, closer_id " + "from issues " + "where creator_id = %s", + (id,)) + return rs + + @classmethod + def gets_by_assignee_id(cls, id, state='open'): + # FIXME 子类中的这个方法,参数非常不一致。需要尽快解决 + result = cls.get_ids_by_assignee_id(id) + if state == 'open': + ids = [i for (i, closer_id) in result if not closer_id] + return Issue.get_cached_issues(ids) + else: + ids = [i for (i, closer_id) in result if closer_id] + return Issue.get_cached_issues(ids) + + @classmethod + def gets_by_participated_user(cls, user_id, state='open'): + ps = IssueParticipant.gets_by_user_id(user_id) + issue_ids = [p.issue_id for p in ps] + issues = Issue.get_cached_issues(issue_ids) + issues_with_state = [issue for issue in issues + if (state == 'open') is (not issue.closer_id)] + return issues_with_state + + @classmethod + @cache(MC_KEY_ISSUES_IDS_BY_ASSIGNEE_ID % '{id}') + def get_ids_by_assignee_id(cls, id): + rs = store.execute("select id, closer_id " + "from issues " + "where assignee_id = %s", + (id,)) + return rs + + @classmethod + def gets_by_closer_id(cls, id): + rs = store.execute("select id, title, " + "creator_id, assignee_id, closer_id, " + "created_at, updated_at, closed_at, type " + "from issues " + "where closer_id = %s ", + (id, )) + return [cls(*r) for r in rs] + + @property + def tags(self): + return Tag.gets_by_issue_id(self.issue_id, self.tag_type) + + @staticmethod + @cache(MC_KEY_ISSUE) + def get_cached_issue(id): + from vilya.models.issue_utils import ISSUE_TYPE_CLASS + issue = Issue.get(id) + if issue: + subcls = ISSUE_TYPE_CLASS[issue.type] + return subcls.get_by_issue_id(id) + + @staticmethod + def get_cached_issues(ids): + issues = mc_gets(MC_KEY_ISSUE, Issue.get_cached_issue, ids) + return [i for i in issues if i] + + +def get_project_issues(issues): + project_issues = [] + for issue in issues: + project_issue = get_issue_by_id_and_state(issue.issue_id) + if project_issue: + project_issues.append(project_issue) + return project_issues + + +# return project_issue or team_issue +def get_issue_by_id_and_state(id, state=None): + issue = Issue.get_cached_issue(id) + if not issue: + return None + + if state and issue.state != state: + return None + + return issue diff --git a/vilya/models/issue_comment.py b/vilya/models/issue_comment.py new file mode 100644 index 0000000..aaa64f4 --- /dev/null +++ b/vilya/models/issue_comment.py @@ -0,0 +1,130 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from datetime import datetime + +from vilya.libs.store import store, mc, cache, bdb + +MC_KEY_ISSUE_COMMENTS_COUNT = 'issue_comment_count:v3:%s' +BDB_ISSUE_COMMENT_CONTENT_KEY = 'issue_comment_content:%s' + + +class ICCounter(object): + """Issue Comment Counter""" + + @classmethod + def incr(cls, issue_id, count=None): + if count >= 0: + sql = ("insert into issue_comment_counters (issue_id, counter) " + "values (%s, LAST_INSERT_ID(%s)) on duplicate key " + "update counter = LAST_INSERT_ID(%s)") + id = store.execute(sql, (issue_id, count, count)) + else: + sql = ("insert into issue_comment_counters (issue_id, counter) " + "values (%s, LAST_INSERT_ID(%s)) on duplicate key " + "update counter = LAST_INSERT_ID(counter + 1)") + id = store.execute(sql, (issue_id, 1)) + store.commit() + return id + + +class IssueComment(object): + + def __init__(self, id, issue_id, author, number, created_at=None, + updated_at=None): + self.id = id + self.issue_id = issue_id + bdb_content = bdb.get(BDB_ISSUE_COMMENT_CONTENT_KEY % id) + self.content = bdb_content + self.author_id = author + self.number = number + self.created_at = created_at + self.updated_at = updated_at + + def __repr__(self): + return '<IssueComment(id=%s, issue_id=%s)>' % (self.id, self.issue_id) + + @property + def url(self): + return '%sissue_comments/%s/' % (self.issue.target.url, self.id) + + @property + def issue(self): + from vilya.models.issue import Issue + return Issue.get_cached_issue(self.issue_id) + + def delete(self): + bdb.delete(BDB_ISSUE_COMMENT_CONTENT_KEY % self.id) + n = store.execute("delete from issue_comments " + "where id=%s", (self.id,)) + if n: + store.commit() + mc.delete(MC_KEY_ISSUE_COMMENTS_COUNT % self.issue_id) + return True + + @classmethod + def add(cls, issue_id, content, author_id, number=None): + number = ICCounter.incr(issue_id, number) + time = datetime.now() + comment_id = store.execute( + 'insert into issue_comments (issue_id, author_id, number, ' + 'created_at, updated_at) values (%s, %s, %s, NULL, NULL)', + (issue_id, author_id, number)) + store.commit() + bdb.set(BDB_ISSUE_COMMENT_CONTENT_KEY % comment_id, content) + mc.delete(MC_KEY_ISSUE_COMMENTS_COUNT % issue_id) + return cls(comment_id, issue_id, author_id, number, time, time) + + def as_dict(self): + d = {} + d['number'] = self.number + d['content'] = bdb.get(BDB_ISSUE_COMMENT_CONTENT_KEY % self.id) + d['author'] = self.author_id + d['created_at'] = self.created_at.strftime('%Y-%m-%dT%H:%M:%S') + if self.updated_at: + d['updated_at'] = self.updated_at.strftime('%Y-%m-%dT%H:%M:%S') + return d + + @classmethod + def get(cls, comment_id): + sql = ("select id, issue_id, author_id, number, created_at, " + "updated_at from issue_comments where id = %s ") + rs = store.execute(sql, (comment_id,)) + if rs and rs[0]: + return cls(*rs[0]) + + @classmethod + def get_by_issue_id_and_number(cls, issue_id, number): + sql = ("select id, issue_id, author_id, number, created_at, " + "updated_at from issue_comments where issue_id = %s " + "and number=%s") + rs = store.execute(sql, (issue_id, number)) + if rs and rs[0]: + return cls(*rs[0]) + + def update(self, content): + store.execute("update issue_comments " + "set updated_at=CURRENT_TIMESTAMP " + "where id=%s", (self.id)) + store.commit() + bdb.set(BDB_ISSUE_COMMENT_CONTENT_KEY % self.id, content) + + @classmethod + def gets_by_issue_id(cls, id): + rs = store.execute("select id, issue_id, " + "author_id, number, " + "created_at, updated_at " + "from issue_comments " + "where issue_id=%s ", + (id,)) + return [cls(*r) for r in rs] + + @classmethod + @cache(MC_KEY_ISSUE_COMMENTS_COUNT % '{issue_id}') + def count_by_issue_id(cls, issue_id): + rs = store.execute( + "select count(id) from issue_comments " + "where issue_id=%s ", + (issue_id,)) + res = rs and rs[0] + return res[0] if res else 0 diff --git a/vilya/models/issue_milestone.py b/vilya/models/issue_milestone.py new file mode 100644 index 0000000..bd3b95f --- /dev/null +++ b/vilya/models/issue_milestone.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import +from datetime import datetime + +from vilya.libs.store import OrzField, OrzBase +from vilya.models.milestone import Milestone + + +class IssueMilestone(OrzBase): + __orz_table__ = "issue_milestones" + issue_id = OrzField(as_key=True) + milestone_id = OrzField(as_key=True) + creator_id = OrzField() + created_at = OrzField(default='null') + + class OrzMeta: + id2str = True + + @property + def milestone(self): + return Milestone.get_by(self.milestone_id) + + @classmethod + def get_by_issue(cls, issue): + rs = cls.gets_by(issue_id=issue.issue_id) + r = rs[0] if rs else None + return r + + @classmethod + def create_by_issue(cls, issue, milestone, user): + ims = cls.create(issue_id=issue.issue_id, milestone_id=milestone.id, + creator_id=user.name, created_at=datetime.now()) + return ims diff --git a/vilya/models/issue_participant.py b/vilya/models/issue_participant.py new file mode 100644 index 0000000..c999b29 --- /dev/null +++ b/vilya/models/issue_participant.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import +from datetime import datetime + +from vilya.libs.store import store + + +class IssueParticipant(object): + + def __init__(self, id, issue_id, user_id, created_at): + self.id = id + self.issue_id = issue_id + self.user_id = user_id + self.created_at = created_at + + @property + def name(self): + return self.user_id + + @classmethod + def add(cls, issue_id, user_id): + time = datetime.now() + participant_id = store.execute( + "insert into issue_participants " + "(issue_id, user_id, created_at) values (%s, %s, NULL)", + (issue_id, user_id)) + store.commit() + return cls(participant_id, issue_id, user_id, time) + + # TODO: 合并 getters? + @classmethod + def gets_by_issue_id(cls, id): + rs = store.execute("select id, issue_id, " + "user_id, created_at " + "from issue_participants " + "where issue_id=%s ", + (id,)) + return [cls(*r) for r in rs] + + @classmethod + def gets_by_user_id(cls, user_id): + rs = store.execute("select id, issue_id, " + "user_id, created_at " + "from issue_participants " + "where user_id=%s ", + (user_id,)) + return [cls(*r) for r in rs] + + @classmethod + def get_by_issue_id_and_user_id(cls, id, user_id): + rs = store.execute("select id, issue_id, " + "user_id, created_at " + "from issue_participants " + "where issue_id=%s and user_id=%s", + (id, user_id)) + if rs and rs[0]: + return cls(*rs[0]) + + def delete(self): + n = store.execute("delete from issue_participants " + "where id=%s", (self.id,)) + if n: + store.commit() + return True diff --git a/vilya/models/issue_utils.py b/vilya/models/issue_utils.py new file mode 100644 index 0000000..2005e48 --- /dev/null +++ b/vilya/models/issue_utils.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- + +from vilya.models.issue import Issue +from vilya.models.project_issue import ProjectIssue +from vilya.models.team_issue import TeamIssue +from vilya.models.fair_issue import FairIssue + + +# map of issue type <-> class +ISSUE_TYPE_CLASS = {'team': TeamIssue, + 'project': ProjectIssue, + 'default': Issue, + 'fair': FairIssue} diff --git a/vilya/models/issue_vote.py b/vilya/models/issue_vote.py new file mode 100644 index 0000000..445902b --- /dev/null +++ b/vilya/models/issue_vote.py @@ -0,0 +1,76 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import + +from vilya.libs.store import store, mc, cache + +MC_KEY_ISSUE_VOTES_COUNT = 'issue_vote_count:v3:%s' + + +class Upvote(object): + def __init__(self, id, issue_id, user_id): + self.id = id + self.issue_id = issue_id + self.user_id = user_id + + @classmethod + def get_upvotes_by_issue_id(cls, issue_id, limit=3): + votes = [] + rs = store.execute( + "select id, issue_id, user_id " + "from issue_upvotes " + "where issue_id = %s " + "order_by id desc " + "limit %d ", + (issue_id, limit)) + if rs: + votes = [cls(*r) for r in rs] + return votes + + @classmethod + def get_by_issue_id_and_user_id(cls, issue_id, user_id): + rs = store.execute( + "select id, issue_id, user_id " + "from issue_upvotes " + "where issue_id = %s " + "and " + "user_id = %s ", + (issue_id, user_id)) + if rs and rs[0]: + return cls(*rs[0]) + + @classmethod + def add(cls, issue_id, user_id): + upvote = cls.get_by_issue_id_and_user_id( + issue_id, user_id) + if upvote: + return upvote + else: + id = store.execute( + "insert into issue_upvotes " + "(issue_id, user_id) " + "values(%s, %s)", + (issue_id, user_id)) + store.commit() + mc.delete(MC_KEY_ISSUE_VOTES_COUNT % issue_id) + return cls(id=id, issue_id=issue_id, user_id=user_id) + + @classmethod + def delete(cls, issue_id, user_id): + n = store.execute( + "delete from issue_upvotes " + "where issue_id = %s and user_id = %s ", + (issue_id, user_id)) + if n: + store.commit() + mc.delete(MC_KEY_ISSUE_VOTES_COUNT % issue_id) + return True + + @classmethod + @cache(MC_KEY_ISSUE_VOTES_COUNT % '{issue_id}') + def count_by_issue_id(cls, issue_id): + rs = store.execute( + "select count(id) from issue_upvotes " + "where issue_id = %s ", + (issue_id,)) + res = rs and rs[0] + return res[0] if res else 0 diff --git a/vilya/models/light_pull.py b/vilya/models/light_pull.py new file mode 100644 index 0000000..daef2ea --- /dev/null +++ b/vilya/models/light_pull.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import + +from vilya.libs.store import store +from vilya.libs.mlock import MLock +from vilya.models.project import CodeDoubanProject +from vilya.models.ticket import Ticket +from vilya.models.utils.decorators import cached_property + + +class LightPull(object): + """ Light weight pull request """ + + def __init__(self, id, from_proj_id, from_branch, + to_proj_id, to_branch, merged, ticket_id): + self.id = id + self.from_proj_id = from_proj_id + self.from_branch = from_branch + self.to_proj_id = to_proj_id + self.to_branch = to_branch + self.merged = merged + self.ticket_id = ticket_id + + @cached_property + def from_proj(self): + return CodeDoubanProject.get(self.from_proj_id) + + @cached_property + def to_proj(self): + return CodeDoubanProject.get(self.to_proj_id) + + @cached_property + def mlock(self): + return MLock.merge_pull(proj_id=self.to_proj_id) + + def release_mlock(self): + self.mlock.release() + + @classmethod + def get_by_repo_and_pull(cls, project_name, pull_number): + project = CodeDoubanProject.get_by_name(project_name) + ticket = Ticket.get_by_projectid_and_ticketnumber(project.id, + pull_number) + + def get_id_by_repo_and_pull(proj_id, ticket_id): + rs = store.execute("select id from pullreq " + "where to_project=%s and ticket_id=%s", + (proj_id, ticket_id)) + return rs[0][0] if rs else '' + + id_ = get_id_by_repo_and_pull(project.id, ticket.ticket_id) + return cls.get(id_) + + @classmethod + def get(cls, id): + rs = store.execute("select id, from_project, from_branch, " + "to_project, to_branch, merged, ticket_id " + "from pullreq " + "where id=%s", + (id,)) + return rs and cls(*rs[0]) diff --git a/vilya/models/line_comment.py b/vilya/models/line_comment.py new file mode 100644 index 0000000..fbfab32 --- /dev/null +++ b/vilya/models/line_comment.py @@ -0,0 +1,76 @@ +# -*- coding: utf-8 -*- +from vilya.libs.store import store, bdb +from vilya.models.consts import LINECOMMENT_INDEX_EMPTY + +BDB_COMMIT_LINECOMMENT_CONTENT_KEY = 'commit_linecomment_content:%s' + + +class LineComment(object): + # TODO: ! 迁移数据 codedouban_linecomments + + def __init__(self, comment_id, project_id, ref, path, position, author, + created, content): + self.comment_id = comment_id + self.project_id = project_id + self.ref = ref + self.path = path + self.position = position + + # TODO: 跟 pull linecomment 统一 + self.old = LINECOMMENT_INDEX_EMPTY + self.new = LINECOMMENT_INDEX_EMPTY + self.author = author + bdb_content = bdb.get(BDB_COMMIT_LINECOMMENT_CONTENT_KEY % comment_id) + self.content = bdb_content or content + self.created = created + + @property + def linenum(self): + return (self.old, self.new) + + # TODO: 重构底层数据后改掉 + @property + def type(self): + return 'commit' + + # no use + def to_dict(self): + return self.__dict__ + + @classmethod + def add(cls, project_id, ref, path, position, author, content): + comment_id = store.execute( + "insert into codedouban_linecomments " + "(project_id, ref, path, position, author, content) " + "values (%s, %s, %s, %s, %s, %s)", + (project_id, ref, path, position, author, content)) + if not comment_id: + store.rollback() + raise Exception("Unable to insert new comment") + store.commit() + bdb.set(BDB_COMMIT_LINECOMMENT_CONTENT_KEY % comment_id, content) + return cls.get(comment_id) + + @classmethod + def get(cls, comment_id): + rs = store.execute("select comment_id, project_id, ref, path, " + "position, author, created, content " + "from codedouban_linecomments " + "where comment_id = %s", (comment_id,)) + res = rs and rs[0] + return cls(*res) if res else None + + @classmethod + def gets_by_proj_and_ref(cls, proj_id, ref): + rs = store.execute("select comment_id, project_id, ref, path, " + "position, author, created, content " + "from codedouban_linecomments " + "where ref=%s and project_id=%s", (ref, proj_id)) + return [cls(*res) for res in rs] + + def delete(self): + n = store.execute("delete from codedouban_linecomments " + "where comment_id = %s", (self.comment_id,)) + if n: + store.commit() + return True diff --git a/vilya/models/linecomment.py b/vilya/models/linecomment.py new file mode 100644 index 0000000..0a9d65a --- /dev/null +++ b/vilya/models/linecomment.py @@ -0,0 +1,266 @@ +# -*- coding: utf-8 -*- + +from vilya.libs.store import store, bdb +from vilya.models.consts import ( + LINECOMMENT_INDEX_INVALID, + LINECOMMENT_TYPE_COMMIT, LINECOMMENT_TYPE_PULL, + COMMIT_LINECOMMENT_UID_PATTERN, PULL_CODEREVIEW_UID_PATTERN) + + +BDB_LINECOMMENT_CONTENT_KEY = 'linecomment_content:id:%s' + + +class LineComment(object): + ''' new linecomment ''' + _target_type = None + provided_features = [] # Interface + + def __init__(self, id, target_type, target_id, from_sha, to_sha, + old_path, new_path, from_oid, to_oid, old_linenum, + new_linenum, position, author, created_at, updated_at): + self.id = id + self.target_type = target_type + self.target_id = target_id + self.from_sha = from_sha + self.to_sha = to_sha # diff: to_sha(from_ref) -> from_sha(to_ref) + self.old_path = old_path.strip() + self.new_path = new_path.strip() + self.from_oid = from_oid + self.to_oid = to_oid + self.old_linenum = old_linenum + self.new_linenum = new_linenum + self.position = position # 新数据会为None + self.author = author + self.content = bdb.get(BDB_LINECOMMENT_CONTENT_KEY % id) + self.created_at = created_at + self.updated_at = updated_at + + # 做兼容... comment(commit comment)跟linecomment在dispatch里是一起处理的,兼容属性名... + self.path = old_path + self.ref = from_sha + self.comment_id = id + self.created = created_at + + @property + def linenum(self): + return (self.old_linenum, self.new_linenum) + + @property + def has_linenum(self): + ''' 便于区分老数据,没有linenum的只能用position显示 ''' + return self.old_linenum != LINECOMMENT_INDEX_INVALID + + @property + def has_oids(self): + ''' 便于区分老数据,没有oids无法针对文件是否修改进行linecomments的过滤 ''' + return '' not in (self.oids) + + @property + def has_tosha(self): + ''' 便于区分老数据,老数据只记录from_sha ''' + return self.to_sha != '' + + def provide(self, name): + '''检查是否提供某功能,即是否提供某接口''' + return name in self.provided_features + + @property + def target(self): + raise NotImplementedError('Subclasses should implement this!') + + @property + def uid(self): + raise NotImplementedError('Subclasses should implement this!') + + @property + def url(self): + raise NotImplementedError('Subclasses should implement this!') + + @property + def paths(self): + ''' file paths(old/new) about this linecomment ''' + if self.new_path != self.old_path: + return [self.old_path, self.new_path] + return [self.old_path] + + @property + def oids(self): + ''' file oid(old/new) about this linecomment + (if file not exist, pygit2 returns '0000...'). ''' + return (self.from_oid, self.to_oid) + + # TODO: for migrate_pull_linecomments + # FIXME: updated_at 可以正常插入吗? + @classmethod + def add_raw(cls, target_id, from_sha, to_sha, + old_path, new_path, from_oid, to_oid, old_linenum, new_linenum, + author, content, position, created_at, updated_at): + id = store.execute( + "insert into codedouban_linecomments_v2 " + "(target_type, target_id, from_sha, to_sha, " + "old_path, new_path, from_oid, to_oid, old_linenum, new_linenum, " + "author, content, position, created_at, updated_at) " + "values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)", # noqa + (cls._target_type, target_id, from_sha, to_sha, + old_path, new_path, from_oid, to_oid, old_linenum, new_linenum, + author, content, position, created_at, updated_at)) + if not id: + store.rollback() + raise Exception("Unable to add new linecomment") + store.commit() + bdb.set(BDB_LINECOMMENT_CONTENT_KEY % id, content) + return cls.get(id) + + # TODO: LINECOMMENT_INDEX_EMPTY + @classmethod + def add(cls, target_id, from_sha, to_sha, + old_path, new_path, from_oid, to_oid, old_linenum, new_linenum, + author, content): + id = store.execute( + "insert into codedouban_linecomments_v2 " + "(target_type, target_id, from_sha, to_sha, " + "old_path, new_path, from_oid, to_oid, old_linenum, new_linenum, " + "author, content, created_at, updated_at) " + "values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, NULL, NULL)", # noqa + (cls._target_type, target_id, from_sha, to_sha, + old_path, new_path, from_oid, to_oid, old_linenum, new_linenum, + author, content)) + if not id: + store.rollback() + raise Exception("Unable to add new linecomment") + store.commit() + bdb.set(BDB_LINECOMMENT_CONTENT_KEY % id, content) + return cls.get(id) + + @classmethod + def get(cls, id): + rs = store.execute( + "select id, target_type, target_id, from_sha, to_sha, " + "old_path, new_path, from_oid, to_oid, old_linenum, new_linenum, " + "position, author, created_at, updated_at " + "from codedouban_linecomments_v2 " + "where id = %s", (id,)) + res = rs and rs[0] + return cls(*res) if res else None + + @classmethod + def gets_by_target_and_ref(cls, target_id, ref): + rs = store.execute( + "select id, target_type, target_id, from_sha, to_sha, " + "old_path, new_path, from_oid, to_oid, old_linenum, new_linenum, " + "position, author, created_at, updated_at " + "from codedouban_linecomments_v2 " + "where target_type=%s and target_id=%s and from_sha=%s", + (cls._target_type, target_id, ref)) + return [cls(*res) for res in rs] + + def update(self, content): + store.execute("update codedouban_linecomments_v2 " + "set updated_at=now() where id=%s", (self.id,)) + store.commit() + bdb.set(BDB_LINECOMMENT_CONTENT_KEY % self.id, content) + + def delete(self): + n = store.execute("delete from codedouban_linecomments_v2 " + "where id = %s", (self.id,)) + if n: + store.commit() + return True + return False + + @classmethod + def delete_multi(cls, cs): + for c in cs: + c.delete() + + +class CommitLineComment(LineComment): + _target_type = LINECOMMENT_TYPE_COMMIT + provided_features = [] # Interface + + @property + def target(self): + from vilya.models.project import CodeDoubanProject + return CodeDoubanProject.get(self.target_id) + + @property + def project(self): + return self.target + + @property + def uid(self): + return COMMIT_LINECOMMENT_UID_PATTERN % self.id + + @property + def url(self): + return '/%s/line_comments/%s/' % (self.project.name, self.id) + + @property + def project_id(self): + return self.target_id + + # 做兼容... comment(commit comment)跟linecomment在dispatch里是一起处理的,兼容comment的名字... + def gets_by_proj_and_ref(self, *k, **kw): + return self.gets_by_target_and_ref(*k, **kw) + + +class PullLineComment(LineComment): + _target_type = LINECOMMENT_TYPE_PULL + provided_features = ['edit'] # Interface + + @property + def target(self): + from vilya.models.ticket import Ticket + return Ticket.get(self.target_id) + + @property + def project(self): + from vilya.models.project import CodeDoubanProject + return CodeDoubanProject.get(self.target.project_id) + + @property + def uid(self): + return PULL_CODEREVIEW_UID_PATTERN % self.id + + @property + def url(self): + return '/%s/code_review/%s/' % (self.project.name, self.id) + + @property + def ticket_id(self): + return self.target_id + + @classmethod + def add(cls, target_id, from_sha, to_sha, + old_path, new_path, from_oid, to_oid, old_linenum, new_linenum, + author, content): + # TODO: dispatch 放到 view 里 + from vilya.models.ticket import Ticket + from vilya.libs.signals import codereview_signal + from dispatches import dispatch + comment = super(PullLineComment, cls).add( + target_id, from_sha, to_sha, old_path, new_path, from_oid, + to_oid, old_linenum, new_linenum, author, content) + ticket = Ticket.get(target_id) + # TODO: 重构feed之后取消signal发送 + if ticket: + codereview_signal.send(comment, content=content, + ticket=ticket, + author=author, comment=comment) + dispatch('codereview', data={ + 'comment': comment, + 'ticket': ticket, + 'sender': author, + }) + return comment + + @classmethod + def gets_by_target(cls, target_id): + rs = store.execute( + "select id, target_type, target_id, from_sha, to_sha, " + "old_path, new_path, from_oid, to_oid, old_linenum, new_linenum, " + "position, author, created_at, updated_at " + "from codedouban_linecomments_v2 " + "where target_type=%s and target_id=%s", + (cls._target_type, target_id)) + return [cls(*res) for res in rs] diff --git a/vilya/models/lru_counter.py b/vilya/models/lru_counter.py new file mode 100644 index 0000000..561ed25 --- /dev/null +++ b/vilya/models/lru_counter.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- + +from vilya.libs.store import mc + +MAX_PROJECT_COUNT = 50 + + +class LRUCounter(object): + MC_KEY_COUNT = 'lru:user:%s:project:%s' + + def __init__(self, username, target_ids): + self.username = username + self.target_ids = target_ids + + def mc_key(self, target_id): + return self.MC_KEY_COUNT % (self.username, target_id) + + def travel(self, func): + map(func, self.target_ids) + + def use(self, target_id): + if target_id in self.target_ids: + self.travel(self._incr) + self._clear(target_id) + + def count(self, target_id): + return mc.get(self.mc_key(target_id)) + + def sort(self, is_desc=False): + self.target_ids.sort(key=lambda x: self.count(x), + reverse=is_desc) + return self.target_ids + + def dump(self): + for id_ in self.target_ids: + print self.count(id_) + + def _incr(self, target_id): + if self.count(target_id) is None: + self._clear(target_id) + mc.incr(self.mc_key(target_id), 1) + if self.count(target_id) > MAX_PROJECT_COUNT: + self._set(target_id, MAX_PROJECT_COUNT) + + def _set(self, target_id, value): + mc.set(self.mc_key(target_id), value) + + def _clear(self, target_id): + self._set(target_id, 0) + + +class ProjectOwnLRUCounter(LRUCounter): + MC_KEY_COUNT = 'lru:project_own:user:%s:project:%s' + + def __init__(self, username, target_ids=None): + if not target_ids: + from vilya.models.project import CodeDoubanProject + target_ids = CodeDoubanProject.get_ids(owner=username) + super(ProjectOwnLRUCounter, self).__init__(username, target_ids) + + +class ProjectWatchLRUCounter(LRUCounter): + MC_KEY_COUNT = 'lru:project_watch:user:%s:project:%s' + + def __init__(self, username, target_ids=None): + if not target_ids: + from vilya.models.project import CodeDoubanProject + target_ids = CodeDoubanProject.get_watched_others_ids_by_user( + user=username) + super(ProjectWatchLRUCounter, self).__init__(username, target_ids) diff --git a/vilya/models/message.py b/vilya/models/message.py new file mode 100644 index 0000000..751141f --- /dev/null +++ b/vilya/models/message.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +import json + +from vilya.libs.rdstore import rds +from vilya.models.utils import CJsonEncoder, to_timestamp +from vilya.libs.signals import rds_pub_signal + +MAX_MESSAGE_COUNT = 1989 +LATEST_MESSAGE_NUM = 50 +RDS_ROOM_KEY = "chat:room:%s" + + +class Message(object): + + def __init__(self, db_key): + self.db_key = db_key + + @classmethod + def get(cls, db_key): + return cls(db_key=db_key) + + def add_message(self, message_data): + data = json.dumps(message_data, cls=CJsonEncoder) + rds.zadd(self.db_key, data, to_timestamp(message_data.get('date'))) + rds.zremrangebyrank(self.db_key, 0, -1 * (MAX_MESSAGE_COUNT + 1)) + rds_pub_signal.send('add_message', + data=data, + channel=self.db_key) + + def get_messages(self, start=0, stop=LATEST_MESSAGE_NUM): + data = rds.zrevrange(self.db_key, start, stop) + return reversed([json.loads(d) for d in data]) + + def delete_by_key(self): + rds.delete(self.db_key) + + +def get_room_message(room_name): + return Message.get(db_key=RDS_ROOM_KEY % room_name) diff --git a/vilya/models/milestone.py b/vilya/models/milestone.py new file mode 100644 index 0000000..3f3bf28 --- /dev/null +++ b/vilya/models/milestone.py @@ -0,0 +1,135 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from __future__ import division + +from datetime import datetime + +from vilya.libs.store import OrzField, store, IntegrityError, OrzBase + +PROJECT_MILESTONE_TYPE = 1 + + +class MTCounter(object): + """Milestone Target Counter""" + + @classmethod + def incr(cls, target_id, target_type, count=None): + if count and count >= 0: + sql = ( + "insert into milestone_counters " + "(target_id, target_type, counter) " + "values (%s, %s, LAST_INSERT_ID(%s)) " + "on duplicate key update counter = LAST_INSERT_ID(%s)") + id = store.execute(sql, (target_id, target_type, count, count)) + else: + sql = ( + "insert into milestone_counters " + "(target_id, target_type, counter) " + "values (%s, %s, LAST_INSERT_ID(%s)) on duplicate key " + "update counter = LAST_INSERT_ID(counter + 1)") + id = store.execute(sql, (target_id, target_type, 1)) + store.commit() + return id + + +class Milestone(OrzBase): + __orz_table__ = "milestones" + name = OrzField(as_key=OrzField.KeyType.DESC) + creator_id = OrzField() + target_id = OrzField(as_key=OrzField.KeyType.DESC) + target_type = OrzField(as_key=OrzField.KeyType.DESC) + target_number = OrzField(as_key=OrzField.KeyType.DESC) + created_at = OrzField(default='null') + + class OrzMeta: + id2str = True + + # FIXME: ugly wrapper + @classmethod + def create_by_project(cls, project, name, user): + target_number = MTCounter.incr(project.id, PROJECT_MILESTONE_TYPE) + try: + ms = cls.create(name=name, + target_id=project.id, + target_type=PROJECT_MILESTONE_TYPE, + target_number=target_number, + creator_id=user.name, + created_at=datetime.now()) + except IntegrityError: + store.rollback() + rs = cls.gets_by(target_id=project.id, + target_type=PROJECT_MILESTONE_TYPE, + target_number=target_number) + ms = rs[0] + ms.name = name + ms.save() + return ms + + # FIXME: ugly wrapper + @classmethod + def gets_by_project(cls, project, number=None, name=None): + if name: + rs = cls.gets_by(name=name, target_id=project.id, + target_type=PROJECT_MILESTONE_TYPE) + elif number: + rs = cls.gets_by(target_id=project.id, + target_type=PROJECT_MILESTONE_TYPE, + target_number=number) + else: + rs = cls.gets_by(target_id=project.id, + target_type=PROJECT_MILESTONE_TYPE) + return rs + + # FIXME: ugly wrapper + @classmethod + def get_by_project(cls, project, number=None, name=None): + rs = cls.gets_by_project(project, number=number, name=name) + return rs[0] if rs else None + + @property + def tasks(self): + from vilya.models.milestone_task import MilestoneTask + return MilestoneTask(self).get_multi() + + @property + def issue_ids(self): + from vilya.models.milestone_task import MilestoneTask + # TODO: check milestone type + ms = MilestoneTask(self).get_multi() + # TODO: orz return int + return [int(m.issue_id) for m in ms] + + @property + def open_tasks(self): + from vilya.models.milestone_task import MilestoneTask + return MilestoneTask(self).get_multi(state="open") + + @property + def closed_tasks(self): + from vilya.models.milestone_task import MilestoneTask + return MilestoneTask(self).get_multi(state="closed") + + @property + def percentage(self): + closed_count = self.closed_task_count + count = self.task_count + return closed_count / count * 100 if count else 0 + + @property + def percentage_number(self): + number = str(self.percentage) + number = number.split('.')[0] + return number + + @property + def open_task_count(self): + return len(self.open_tasks) + + @property + def closed_task_count(self): + return len(self.closed_tasks) + + @property + def task_count(self): + return len(self.tasks) diff --git a/vilya/models/milestone_task.py b/vilya/models/milestone_task.py new file mode 100644 index 0000000..ecaae5b --- /dev/null +++ b/vilya/models/milestone_task.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from vilya.models.project_issue import ProjectIssue +from vilya.models.issue_milestone import IssueMilestone + + +class MilestoneTask(object): + + def __init__(self, milestone): + self.milestone = milestone + + def get_multi(self, state=None): + # FIXME: cache + milestone = self.milestone + if state == 'open': + return self._get_open_multi() + if state == 'closed': + return self._get_closed_multi() + return IssueMilestone.gets_by(milestone_id=milestone.id) + + def _get_open_multi(self): + milestone = self.milestone + tasks = [] + rs = IssueMilestone.gets_by(milestone_id=milestone.id) + for r in rs: + issue = ProjectIssue.get_by_issue_id(r.issue_id) + if not issue: + continue + if not issue.closer_id: + tasks.append(r) + return tasks + + def _get_closed_multi(self): + milestone = self.milestone + tasks = [] + rs = IssueMilestone.gets_by(milestone_id=milestone.id) + for r in rs: + issue = ProjectIssue.get_by_issue_id(r.issue_id) + if not issue: + continue + if issue.closer_id: + tasks.append(r) + return tasks diff --git a/vilya/models/mirror.py b/vilya/models/mirror.py new file mode 100644 index 0000000..27dff5a --- /dev/null +++ b/vilya/models/mirror.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- + +from vilya.libs.validators import check_git_url +from vilya.libs.model import BaseModel, ModelField +from vilya.models.consts import (MIRROR_STATE_CLONED, + MIRROR_NOT_PROXY) + + +class CodeDoubanMirror(BaseModel): + __orz_table__ = "codedouban_mirror" + url = ModelField() + state = ModelField() + project_id = ModelField(ModelField.KeyType.ASC) + with_proxy = ModelField(default=MIRROR_NOT_PROXY) + frequency = ModelField(default=0) + + class OrzMeta: + order_combs = (("-id", ),) + + def __str__(self): + return "Mirror: %s " % self.url + + @classmethod + def validate(cls, repo_url): + return check_git_url(repo_url) + + @classmethod + def add(cls, url, state, project_id, with_proxy=MIRROR_NOT_PROXY): + return cls.create(project_id=project_id, + url=url, + state=state, + with_proxy=with_proxy) + + @classmethod + def get_by_project_id(cls, project_id): + return cls.get(project_id=project_id) + + def update_state(self, state): + self.state = state + self.save() + + @property + def is_clone_completed(self): + return self.state == MIRROR_STATE_CLONED diff --git a/vilya/models/mute.py b/vilya/models/mute.py new file mode 100644 index 0000000..8fb957f --- /dev/null +++ b/vilya/models/mute.py @@ -0,0 +1,36 @@ +# coding: utf-8 + + +from vilya.libs.rdstore import rds + +# FIXME: 直接取proj了,如果以后有不基于proj的再改吧=.= +RDS_MUTE_KEY = "mute:{type}:{proj_name}:{target_id}" + + +def mute_rds_key(type_, proj_name, target_id): + return RDS_MUTE_KEY.format(type=type_, proj_name=proj_name, + target_id=target_id) + + +class Mute(object): + + @staticmethod + def mute(type_, proj_name, target_id, user_id): + key = mute_rds_key(type_, proj_name, target_id) + rds.sadd(key, user_id) + + @staticmethod + def unmute(type_, proj_name, target_id, user_id): + key = mute_rds_key(type_, proj_name, target_id) + rds.srem(key, user_id) + + @staticmethod + def filter(type_, proj_name, target_id, users): + key = mute_rds_key(type_, proj_name, target_id) + muted_users = rds.smembers(key) + return set(users) - set(muted_users) + + @staticmethod + def is_muted(type_, proj_name, target_id, user_id): + key = mute_rds_key(type_, proj_name, target_id) + return rds.sismember(key, user_id) diff --git a/vilya/models/ngit/__init__.py b/vilya/models/ngit/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/vilya/models/ngit/blame.py b/vilya/models/ngit/blame.py new file mode 100644 index 0000000..f964601 --- /dev/null +++ b/vilya/models/ngit/blame.py @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from vilya.models.ngit.blob import Blob + + +class Blame(object): + + def __init__(self, repo, blame): + self.repo = repo + self._blame = blame + self.blob = Blob(repo, blame['blob']) + self.blob_lines = self.blob.data.splitlines() + self.hunks = [BlameHunk(self, hunk) + for hunk in blame['hunks']] + + +class BlameHunk(object): + + def __init__(self, blame, hunk): + self.blame = blame + self.blob = blame.blob + self.final_commit_id = hunk['final_commit_id'] + self.final_start_line_number = hunk['final_start_line_number'] + self.orig_path = hunk['orig_path'] + self.orig_commit_id = hunk['orig_commit_id'] + self.orig_start_line_number = hunk['orig_start_line_number'] + self.commit = blame.repo.get_commit(self.final_commit_id) + self.orig_commit = blame.repo.get_commit(self.orig_commit_id) + self.lines = [BlameLine(self, idx) + for idx in range(hunk['lines_in_hunk'])] + + +class BlameLine(object): + + def __init__(self, hunk, idx): + self._hunk = hunk + self.idx = idx + self.no = hunk.final_start_line_number + idx + self.orig_no = hunk.orig_start_line_number + idx + self.content = hunk.blame.blob_lines[self.no - 1] + self.commit = hunk.commit + self.orig_commit = hunk.orig_commit + self.orig_sha = (hunk.orig_commit.sha + if hunk.orig_commit else hunk.commit.sha) + self.path = hunk.orig_path + + @property + def url(self): + return "%s%s#L-%s" % (self.commit.url, + self.hunk.orig_path, + self.line_no) + + @property + def orig_path_url(self): + # FIXME: urlencode path + return "/%s/blob/%s/%s#L-%s" % (self._hunk.blame.repo.name, + self.orig_sha, + self.path, + self.orig_no) diff --git a/vilya/models/git/blob.py b/vilya/models/ngit/blob.py similarity index 100% rename from vilya/models/git/blob.py rename to vilya/models/ngit/blob.py diff --git a/vilya/models/git/commit.py b/vilya/models/ngit/commit.py similarity index 58% rename from vilya/models/git/commit.py rename to vilya/models/ngit/commit.py index e2df273..23560d0 100644 --- a/vilya/models/git/commit.py +++ b/vilya/models/ngit/commit.py @@ -5,12 +5,14 @@ from collections import OrderedDict from datetime import datetime from pytz import FixedOffset + +from vilya.libs.text import email_normalizer from vilya.libs.text import remove_unknown_character from vilya.libs.text import render_commit_message -from vilya.libs.text import email_normalizer -from vilya.models.user import User +from vilya.models.user import User, get_author_by_email from vilya.models.utils.decorators import cached_property -from vilya.models.git.diff import Diff +from vilya.models.ngit.diff import Diff +from vilya.config import DOMAIN class Commit(object): @@ -32,42 +34,69 @@ def __init__(self, repo, commit): self.message_body = commit['body'] self.sha = commit['sha'] self.tree = commit['tree'] + self.has_author_link = True + # author author_name = commit['author']['name'] self.author_name = author_name - author_email = email_normalizer(author_name, commit['author']['email']) + author_email = commit['author']['email'] self.author_email = author_email self.email = author_email - # FIXME: user - #author = User(name=author_name, email=author_email) - author = User.get_by_name(author_name) + code_author_name = get_author_by_email(author_email, None) + if code_author_name is None: + self.has_author_link = False + author = User(name=author_name, email=author_email) + else: + author = User(name=code_author_name, email=author_email) self.author = author - author_date = datetime.fromtimestamp(commit['author']['time'], - FixedOffset(commit['author']['offset'])) - author_timestamp = str(commit['author']['time']) + author_date = datetime.fromtimestamp( + commit['author']['time'], + FixedOffset(commit['author']['offset'])) self.author_time = author_date + author_timestamp = str(commit['author']['time']) self.author_timestamp = author_timestamp self.time = author_date + # committer committer_name = commit['committer']['name'] - committer_email = email_normalizer( - committer_name, commit['committer']['email']) - # FIXME: user - #committer = User(name=committer_name, email=committer_email) - committer = User.get_by_name(committer_name) + committer_email = email_normalizer(committer_name, + commit['committer']['email']) + committer = User(name=committer_name, email=committer_email) self.committer = committer - committer_date = datetime.fromtimestamp(commit['committer']['time'], - FixedOffset(commit['committer']['offset'])) + committer_date = datetime.fromtimestamp( + commit['committer']['time'], + FixedOffset(commit['committer']['offset'])) self.committer_time = committer_date + self.commit_time = committer_date # FIXME: remove this! @property def url(self): return '/%s/commit/%s/' % (self.repo_name, self.sha) + @property + def full_url(self): + return "%s%s" % (DOMAIN, self.url) + + # FIXME: get Blob instance, then resolve submodule url + def get_blob_url(self, blob_path): + return '/%s/blob/%s/%s' % (self.repo_name, self.sha, blob_path) + + def get_url_with_path(self, path): + """will only show the diff about the path""" + return '%ssrc/%s' % (self.url, path) + @property def rendered_message(self): return render_commit_message(self.message, self.repo.project) + @property + def rendered_message_header(self): + return render_commit_message(self.message_header, self.repo.project) + + @property + def rendered_message_body(self): + return render_commit_message(self.message_body, self.repo.project) + @property def shortlog(self): # no commit log... @@ -85,15 +114,13 @@ def has_only_shortlog(self): @cached_property def diff(self): repo = self.repo - parent = self.parent - raw_diff = repo.get_raw_diff(self.sha, from_ref=parent) + raw_diff = repo.get_raw_diff(self.sha) diff = Diff(repo, raw_diff) if raw_diff else None return diff def as_dict(self, with_files=False): d = OrderedDict([ ("id", self.sha), - ("sha", self.sha), ("name", self.author_name), ("email", self.author_email), ("parents", self.parents), @@ -101,11 +128,12 @@ def as_dict(self, with_files=False): ("message", self.message), ]) if len(self.parents) > 1: - d['merge'] = ' '.join(sha[:7] for sha in self.parents) # Used in PIN + # Used in PIN + d['merge'] = ' '.join(sha[:7] for sha in self.parents) if with_files: files = [] for delta in self.diff.deltas: - files.append(dict(type=delta.status_text, filepath=delta.new_file_path)) + files.append(dict(type=delta.status_text, + filepath=delta.new_file_path)) d['files'] = files return d - diff --git a/vilya/models/ngit/commits_graph.py b/vilya/models/ngit/commits_graph.py new file mode 100644 index 0000000..a7129c0 --- /dev/null +++ b/vilya/models/ngit/commits_graph.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- + +import json + + +def generate_graph_data(commits): + """ + [ + sha, + [offset, branch], //dot + [ + [from, to, branch], // route 1 + [from, to, branch], // route 2 + [from, to, branch], + ] // routes + ], // node + """ + nodes = [] + branch_idx = [0] + reserve = [] + branches = {} + + def get_branch(sha): + if branches.get(sha) is None: + branches[sha] = branch_idx[0] + reserve.append(branch_idx[0]) + branch_idx[0] += 1 + return branches[sha] + + for commit in commits: + branch = get_branch(commit.sha) + n_parents = len(commit.parents) + offset = reserve.index(branch) + routes = [] + + if n_parents == 1: + # create branch + if branches.get(commit.parents[0]) is not None: + routes += [[i + offset + 1, i + offset + 1 - 1, b] + for i, b in enumerate(reserve[offset + 1:])] + routes += [[i, i, b] + for i, b in enumerate(reserve[:offset])] + reserve.remove(branch) + routes.append([offset, + reserve.index(branches[commit.parents[0]]), + branch]) + # straight + else: + routes += [[i, i, b] for i, b in enumerate(reserve)] + branches[commit.parents[0]] = branch + # merge branch + elif n_parents == 2: + branches[commit.parents[0]] = branch + routes += [[i, i, b] for i, b in enumerate(reserve)] + other_branch = get_branch(commit.parents[1]) + routes.append([offset, reserve.index(other_branch), + other_branch]) + + node = _make_node(commit.sha, + offset, + branch, + routes) + nodes.append(node) + + return json.dumps(nodes) + + +def _make_node(sha, offset, branch, routes): + return [sha, [offset, branch], routes] diff --git a/vilya/models/git/diff/delta.py b/vilya/models/ngit/delta.py similarity index 99% rename from vilya/models/git/diff/delta.py rename to vilya/models/ngit/delta.py index ef0e5db..8072c6d 100644 --- a/vilya/models/git/diff/delta.py +++ b/vilya/models/ngit/delta.py @@ -34,4 +34,3 @@ def status_text(self): return 'renamed' return 'modified' - diff --git a/vilya/models/git/diff/diff.py b/vilya/models/ngit/diff.py similarity index 91% rename from vilya/models/git/diff/diff.py rename to vilya/models/ngit/diff.py index da393c4..b520f3f 100644 --- a/vilya/models/git/diff/diff.py +++ b/vilya/models/ngit/diff.py @@ -2,9 +2,10 @@ from __future__ import absolute_import from itertools import groupby + from vilya.models.utils.decorators import cached_property -from vilya.models.git.diff.patch import Patch -from vilya.models.git.diff.delta import Delta +from vilya.models.ngit.delta import Delta +from vilya.models.ngit.patch import Patch class Diff(object): @@ -69,5 +70,6 @@ def patches(self): diff = self.raw_diff linecomments_by_path = self._linecomments_by_path # TODO: use generator - return [Patch(repo, self, p, linecomments_by_path.get(p['old_file_path'], [])) + return [Patch(repo, self, p, + linecomments_by_path.get(p['old_file_path'], [])) for p in diff['patches']] diff --git a/vilya/models/git/diff/hunk.py b/vilya/models/ngit/hunk.py similarity index 81% rename from vilya/models/git/diff/hunk.py rename to vilya/models/ngit/hunk.py index a7f38a1..722b991 100644 --- a/vilya/models/git/diff/hunk.py +++ b/vilya/models/ngit/hunk.py @@ -1,14 +1,16 @@ # -*- coding: utf-8 -*- from __future__ import absolute_import -from ellen.utils.mdiff import hunk2 +from ellen.utils.mdiff import hunk2, mdiff2 + from vilya.models.consts import LINECOMMENT_INDEX_EMPTY -from vilya.models.git.diff.line import Line +from vilya.models.ngit.line import Line class Hunk(object): - # FIXME: old_lines/new_lines 不包含 'No newline at end of file',导致行号对不上,也导致review评论显示不出来 + # FIXME: old_lines/new_lines 不包含 'No newline at end of file', + # 导致行号对不上,也导致review评论显示不出来 def __init__(self, patch, hunk=None, start_pos=None, **kw): self.patch = patch self._hunk = hunk # jagare hunk @@ -25,6 +27,13 @@ def __init__(self, patch, hunk=None, start_pos=None, **kw): self.skipped_old_end = kw.get('skipped_old_end', 0) self.skipped_new_end = kw.get('skipped_new_end', 0) self._top_contexts += kw.get('contexts', []) + self._mdiff_lines = None + + @property + def mdiff_lines(self): + if self._mdiff_lines is None: + self._mdiff_lines = mdiff2(self._hunk['lines']) + return self._mdiff_lines @property def start_pos(self): @@ -76,17 +85,18 @@ def mdiff(self, side_by_side=None): ''' return lines(attr, line_text) ''' if not self._hunk: return [] - return hunk2(self._hunk['lines'], self._hunk['mdiff'], side_by_side=side_by_side) + return hunk2(self._hunk['lines'], self.mdiff_lines, + side_by_side=side_by_side) # no use yet - #def _get_old_text(self): + # def _get_old_text(self): # out = [] # for (attr, line_text) in self.lines: # if attr != '+': # out.append(line_text) # return out - #def _get_new_text(self): + # def _get_new_text(self): # out = [] # for (attr, line_text) in self.lines: # if attr != '-': @@ -102,11 +112,10 @@ def mdiff(self, side_by_side=None): def _side_lines(self, side=None): def filter_linecomments(_line): - #index = _line.linenum if self.patch.has_linenum else _line.pos_in_patch - #linecomments = self.patch.comment_groups.get(index, []) linecomments = [] comments_by_line = self.patch.comments_by_line.get(_line.linenum) - comments_by_pos = self.patch.comments_by_pos.get(_line.pos_in_patch) + comments_by_pos = self.patch.comments_by_pos.get( + _line.pos_in_patch) if comments_by_line: linecomments += comments_by_line if comments_by_pos: @@ -119,7 +128,8 @@ def filter_linecomments(_line): if self._top_contexts: for line_text in self._top_contexts: - _line = Line(self, old_num, new_num, pos, ' %s' % line_text, ' ') + _line = Line(self, old_num, new_num, pos, ' %s' % line_text, + ' ') old_num += 1 new_num += 1 pos += 1 @@ -146,29 +156,14 @@ def filter_linecomments(_line): if self._bottom_contexts: for line_text in self._bottom_contexts: - _line = Line(self, old_num, new_num, pos, ' %s' % line_text, ' ') + _line = Line(self, old_num, new_num, pos, ' %s' % line_text, + ' ') old_num += 1 new_num += 1 pos += 1 _line.linecomments = filter_linecomments(_line) yield _line - # 暂时没用 - #def _side_lines2(self, side=None): - # old_num = self.old_start - # new_num = self.new_start - # for (old_attr, old_line, new_attr, new_line) in self.mdiff(side_by_side=side): - # _old_line = Line(old_num, None, old_line, old_attr) - # _new_line = Line(None, new_num, new_line, new_attr) - # if old_attr == '+' or old_attr == '-': - # old_num += 1 - # elif new_attr == '+' or new_attr == '-': - # new_num += 1 - # else: - # new_num += 1 - # old_num += 1 - # yield (_old_line, _new_line) - @property def lines(self): return self._side_lines() diff --git a/vilya/models/git/diff/line.py b/vilya/models/ngit/line.py similarity index 88% rename from vilya/models/git/diff/line.py rename to vilya/models/ngit/line.py index 22de79f..9ff5802 100644 --- a/vilya/models/git/diff/line.py +++ b/vilya/models/ngit/line.py @@ -4,6 +4,14 @@ from vilya.models.consts import LINECOMMENT_INDEX_EMPTY MAX_REVIEW_CODE_LINES = 20 +ATTR_TEXT = { + ' ': 'normal', + '+': 'insertion', + '-': 'deletion', + '<': 'insertion', + '>': 'deletion', + '=': 'normal' +} class LineBase(object): @@ -22,6 +30,10 @@ def linenum(self): return (self.old if self.old else LINECOMMENT_INDEX_EMPTY, self.new if self.new else LINECOMMENT_INDEX_EMPTY) + @property + def attr_text(self): + return ATTR_TEXT.get(self.attr, 'normal') + class Line(LineBase): diff --git a/vilya/models/git/diff/patch.py b/vilya/models/ngit/patch.py similarity index 84% rename from vilya/models/git/diff/patch.py rename to vilya/models/ngit/patch.py index f286812..4b6cefc 100644 --- a/vilya/models/git/diff/patch.py +++ b/vilya/models/ngit/patch.py @@ -2,10 +2,11 @@ from __future__ import absolute_import from itertools import groupby -from vilya.libs.text import is_image + from vilya.libs.generated import Generated +from vilya.libs.text import is_image from vilya.models.consts import LINECOMMENT_INDEX_EMPTY -from vilya.models.git.diff.hunk import Hunk +from vilya.models.ngit.hunk import Hunk MAX_PATCH_MOD_LINES = 2000 INVALID_OID = b'0' * 40 @@ -13,16 +14,17 @@ class Patch(object): # libgit2 status definition - ## GIT_DELTA_ADDED: code = 'A' - ## GIT_DELTA_DELETED: code = 'D' - ## GIT_DELTA_MODIFIED: code = 'M' - ## GIT_DELTA_RENAMED: code = 'R' - ## GIT_DELTA_COPIED: code = 'C' - ## GIT_DELTA_IGNORED: code = 'I' - ## GIT_DELTA_UNTRACKED: code = '?' - ## default: code = ' ' + # GIT_DELTA_ADDED: code = 'A' + # GIT_DELTA_DELETED: code = 'D' + # GIT_DELTA_MODIFIED: code = 'M' + # GIT_DELTA_RENAMED: code = 'R' + # GIT_DELTA_COPIED: code = 'C' + # GIT_DELTA_IGNORED: code = 'I' + # GIT_DELTA_UNTRACKED: code = '?' + # default: code = ' ' - def __init__(self, repo, diff, patch, linecomments=[], is_limit_lines=True): + def __init__(self, repo, diff, patch, linecomments=[], + is_limit_lines=True): self.repo = repo self.diff = diff self._patch = patch @@ -49,7 +51,8 @@ def __init__(self, repo, diff, patch, linecomments=[], is_limit_lines=True): # TODO: move to def init_comment_groups def func_filter(l): if l.has_oids: - return l.from_oid == self.old_file_sha and l.to_oid == self.new_file_sha + return l.from_oid == self.old_file_sha \ + and l.to_oid == self.new_file_sha else: return l.from_sha == self.new_sha self.linecomments = filter(func_filter, linecomments) @@ -59,7 +62,8 @@ def func_filter(l): (self.linecomments_has_pos, self.linecomments_has_linenum)[l.has_linenum].append(l) - if is_limit_lines and self.additions + self.deletions > MAX_PATCH_MOD_LINES: + if is_limit_lines and self.additions + self.deletions > \ + MAX_PATCH_MOD_LINES: self.is_toobig = True self.hunks = [] else: @@ -76,17 +80,18 @@ def init_comment_groups(self): if self.linecomments_has_pos: self.linecomments_has_pos.sort(key=keyfunc_pos) self.comments_by_pos = dict((k, list(v)) - for k, v in groupby(self.linecomments_has_pos, - key=keyfunc_pos)) + for k, v in groupby( + self.linecomments_has_pos, key=keyfunc_pos)) if self.linecomments_has_linenum: self.linecomments_has_linenum.sort(key=keyfunc_line) self.comments_by_line = dict((k, list(v)) - for k, v in groupby(self.linecomments_has_linenum, - key=keyfunc_line)) + for k, v in groupby( + self.linecomments_has_linenum, key=keyfunc_line)) # TODO: refactor this! T^T def init_hunks(self, raw_patch): - ''' init Hunks, add extra_contexts when there're linecomments not involved ''' + ''' init Hunks, add extra_contexts when there're linecomments not + involved ''' EXTRE_CONTEXT_LINES = 3 def expand_hunk(hunk, last_hunk_old_end, type, @@ -97,13 +102,16 @@ def expand_hunk(hunk, last_hunk_old_end, type, for linecomment in self.linecomments_has_linenum: not_involved = False old, new = linecomment.linenum - if old != LINECOMMENT_INDEX_EMPTY and new != LINECOMMENT_INDEX_EMPTY: - not_involved = last_hunk_old_end < old and old < hunk.old_start + if old != LINECOMMENT_INDEX_EMPTY \ + and new != LINECOMMENT_INDEX_EMPTY: + not_involved = last_hunk_old_end < old \ + and old < hunk.old_start if not_involved: min_old_not_involved = min(min_old_not_involved, old) if min_old_not_involved != MAX_LINE_NUM: - contexts = self.get_contexts(min_old_not_involved - EXTRE_CONTEXT_LINES, - hunk.old_start) + contexts = self.get_contexts( + min_old_not_involved - EXTRE_CONTEXT_LINES, + hunk.old_start) if contexts: hunk.expand_top_contexts(contexts) elif type == 'bottom': @@ -111,13 +119,15 @@ def expand_hunk(hunk, last_hunk_old_end, type, for linecomment in self.linecomments_has_linenum: not_involved = False old, new = linecomment.linenum - if old != LINECOMMENT_INDEX_EMPTY and new != LINECOMMENT_INDEX_EMPTY: + if old != LINECOMMENT_INDEX_EMPTY \ + and new != LINECOMMENT_INDEX_EMPTY: not_involved = last_hunk_old_end < old if not_involved: max_old_not_involved = max(max_old_not_involved, old) if max_old_not_involved != MIN_LINE_NUM: - contexts = self.get_contexts(hunk.old_end + 1, - max_old_not_involved + 1 + EXTRE_CONTEXT_LINES) + contexts = self.get_contexts( + hunk.old_end + 1, + max_old_not_involved + 1 + EXTRE_CONTEXT_LINES) if contexts: hunk.expand_bottom_contexts(contexts) @@ -151,8 +161,8 @@ def expand_hunk(hunk, last_hunk_old_end, type, first_hunk.expand_top_contexts(contexts) # add bottom_hunk if last_hunk.old_end + EXTRE_CONTEXT_LINES < self.old_file_length: - bottom_hunk_old_start = self.old_file_length - EXTRE_CONTEXT_LINES + 1 - bottom_hunk_new_start = self.new_file_length - EXTRE_CONTEXT_LINES + 1 + bottom_hunk_old_start = self.old_file_length - EXTRE_CONTEXT_LINES + 1 # noqa + bottom_hunk_new_start = self.new_file_length - EXTRE_CONTEXT_LINES + 1 # noqa contexts = self.get_contexts(bottom_hunk_old_start, self.old_file_length + 1) if contexts: @@ -202,7 +212,8 @@ def old_file_length(self): return self._old_file_length ref = self.old_sha or self.new_sha - self._old_file_length = self.repo.get_file_n_lines(ref, self.old_file_path) + self._old_file_length = self.repo.get_file_n_lines( + ref, self.old_file_path) return self._old_file_length @property @@ -215,7 +226,8 @@ def new_file_length(self): return self._new_file_length ref = self.new_sha - self._new_file_length = self.repo.get_file_n_lines(ref, self.new_file_path) + self._new_file_length = self.repo.get_file_n_lines( + ref, self.new_file_path) return self._new_file_length @property @@ -246,7 +258,7 @@ def get_data(): return generated #@property - #def n_lines(self): + # def n_lines(self): # return sum([hunk.n_lines for hunk in self.hunks]) # TODO: remove this diff --git a/vilya/models/git/repo.py b/vilya/models/ngit/repo.py similarity index 71% rename from vilya/models/git/repo.py rename to vilya/models/ngit/repo.py index 9349a8e..0f5ef0e 100644 --- a/vilya/models/git/repo.py +++ b/vilya/models/ngit/repo.py @@ -1,27 +1,37 @@ # -*- coding: utf-8 -*- from __future__ import absolute_import - import os import time import gzip -import shutil import tempfile import ConfigParser from cStringIO import StringIO +from datetime import datetime + from ellen.repo import Jagare from ellen.utils import JagareError + from vilya.libs.permdir import get_tmpdir -from vilya.models.git.diff import Diff -from vilya.models.git.commit import Commit -from vilya.models.git.blob import Blob -from vilya.models.git.submodule import Submodule -from vilya.models.git.tree import Tree from vilya.models.user import User +from vilya.models.ngit.commit import Commit +from vilya.models.ngit.diff import Diff +from vilya.models.ngit.blob import Blob +from vilya.models.ngit.submodule import Submodule +from vilya.models.ngit.tree import Tree +from vilya.models.ngit.blame import Blame LATEST_UPDATE_REF_THRESHOLD = 60 * 60 * 24 -PULL_REF_H = 'refs/pull/%s/head' -PULL_REF_M = 'refs/pull/%s/merge' +MAX_DIFF_PATCHES = 2000 +REFS_HEADS_PREFIX_LENGTH = len('refs/heads/') + + +class RepoMergeError(Exception): + pass + + +class RepoPushError(Exception): + pass class Repo(object): @@ -36,16 +46,20 @@ def provide(self, name): '''检查是否提供某功能,即是否提供某接口''' return name in self.provided_features + @property + def empty(self): + return self.is_empty + @property def is_empty(self): return self.repo.empty @property def default_branch(self): - branch = None + branch = '' head = self.repo.head if head: - branch = head.name.rpartition('/')[-1] + branch = head.name[REFS_HEADS_PREFIX_LENGTH:] return branch def update_default_branch(self, name): @@ -54,16 +68,20 @@ def update_default_branch(self, name): return None self.repo.update_head(name) - def clone(self, path, bare=None, branch=None, mirror=None, env=None): + def clone(self, path, bare=None, branch=None, + mirror=None, env=None, shared=None): self.repo.clone(path, bare=bare, branch=branch, mirror=mirror, env=env) + # shared=shared) why? - def archive(self, name): - content = self.repo.archive(name) + def archive(self, name, ref='master', ext='tar.gz'): + content = self.repo.archive(name, ref=ref) + if ext == 'tar': + return content outbuffer = StringIO() zipfile = gzip.GzipFile(mode='wb', compresslevel=6, fileobj=outbuffer) - zipfile.writelines(content) + zipfile.write(content) zipfile.close() out = outbuffer.getvalue() return out @@ -78,7 +96,8 @@ def get_submodule(self, ref, path): config = ConfigParser.RawConfigParser() config.readfp(StringIO(modules_str)) for section in config.sections(): - if config.has_option(section, 'path') and config.get(section, 'path') == path: + if config.has_option(section, 'path') and config.get( + section, 'path') == path: url = config.get(section, 'url') return Submodule(url, path) return None @@ -108,23 +127,33 @@ def get_file_n_lines(self, ref, path): return len(lines) return 0 - def get_commits(self, *w, **kw): - commits = self.repo.rev_list(*w, **kw) - # TODO: validate commits + def get_commits(self, to_ref, from_ref=None, path=None, skip=0, + max_count=0, author=None, query=None, first_parent=None, + since=0, no_merges=None): + commits = self.repo.rev_list(to_ref=to_ref, from_ref=from_ref, + path=path, skip=skip, + max_count=max_count, author=author, + query=query, first_parent=first_parent, + since=since, no_merges=no_merges) return [Commit(self, commit) for commit in commits] - def get_raw_diff(self, ref, from_ref=None, **kw): + def get_raw_diff(self, ref, from_ref=None, paths=None, **kw): ''' get Jagare formated diff dict ''' - return self.repo.diff(ref, from_ref=from_ref, **kw) + try: + diff = self.repo.diff(ref, from_ref=from_ref, paths=paths, **kw) + except KeyError: + return None + return diff def get_diff(self, ref=None, from_ref=None, - linecomments=[], raw_diff=None, **kw): + linecomments=[], raw_diff=None, paths=None, **kw): ''' get ngit wrapped diff object ''' _raw_diff = None if raw_diff: _raw_diff = raw_diff elif ref: - _raw_diff = self.get_raw_diff(ref, from_ref=from_ref, **kw) + _raw_diff = self.get_raw_diff(ref, from_ref=from_ref, + paths=paths, **kw) if _raw_diff: return Diff(self, _raw_diff, linecomments) else: @@ -134,16 +163,26 @@ def get_diff_length(self, ref, from_ref=None, **kw): _raw_diff = self.get_raw_diff(ref, from_ref=from_ref, **kw) return len(_raw_diff['patches']) if _raw_diff else 0 - def get_last_commit(self, ref, path=None): + def get_last_commit(self, ref, path=None, no_merges=False): if not path: return self.get_commit(ref) - commit = self.repo.rev_list(ref, path=path, max_count=1) + commit = self.repo.rev_list(ref, path=path, max_count=1, + no_merges=no_merges) if not commit: return None commit = commit[0] commit = Commit(self, commit) return commit + def get_previours_commit(self, ref, path): + """previours commit that touch the specified path""" + commits = self.repo.rev_list(ref, path=path, max_count=2, + no_merges=True) + for commit in commits: + if commit['sha'] != self.repo.sha(ref): + return Commit(self, commit) + return None + def get_commit(self, ref): sha = self.repo.resolve_commit(ref) if not sha: @@ -182,6 +221,12 @@ def get_path(self, ref, path): item = None return item + def get_last_update_timestamp(self): + commit = self.get_last_commit('HEAD') + if not commit: + return 0 + return int(commit.author_timestamp) + class ProjectRepo(Repo): provided_features = ['project', 'fulltext', 'moreline', @@ -217,8 +262,12 @@ def branches(self): def tags(self): return self.repo.tags - def get_tree(self, ref, path=None, recursive=False): - tree = self.repo.ls_tree(ref, path=path, recursive=recursive) + def get_tree(self, ref, path=None, recursive=False, with_commit=False, + recursive_with_tree_node=False): + tree = self.repo.ls_tree( + ref, path=path, recursive=recursive, + with_commit=with_commit) + # recursive_with_tree_node=recursive_with_tree_node) if not tree: return None return Tree(self, tree) @@ -245,7 +294,9 @@ def fix_line_index(index, max_i, min_i=0): def blame_file(self, *w, **kw): blame = self.repo.blame(*w, **kw) - return blame + if not blame: + return None + return Blame(self, blame) def get_renamed_files(self, ref, path=None): return self.repo.detect_renamed(ref) @@ -264,13 +315,10 @@ def get_diff_file(self, ref, from_ref=None): _raw_diff = self.get_raw_diff(ref, from_ref) if not _raw_diff: return '' - return _raw_diff['diff'].patch - - def get_last_update_timestamp(self): - commit = self.get_last_commit('HEAD') - if not commit: - return 0 - return int(commit.author_timestamp) + patch = _raw_diff['diff'].patch + if not patch: + return '' + return patch @classmethod def init(cls, path, work_path=None, bare=True): @@ -287,7 +335,14 @@ def add_remote_hub(self, name, url): self.add_remote('hub/%s' % name, url) def update_ref(self, ref, value): - return self.repo.update_ref(ref, value) + result = None + try: + result = self.repo.update_ref(ref, value) + except JagareError: + # FIXME: logging + # FIXME: more meaningful error (JagareError) + pass + return result def sha(self, rev='HEAD'): return self.repo.sha(rev) @@ -295,8 +350,9 @@ def sha(self, rev='HEAD'): def merge_base(self, to_sha, from_sha): return self.repo.merge_base(to_sha, from_sha) + @property def remotes(self): - return self.repo.remotes() + return self.repo.remotes def fetch_all(self): self.repo.fetch_all() @@ -304,8 +360,8 @@ def fetch_all(self): def fetch(self, name): self.repo.fetch(name) - def archive(self): - super(ProjectRepo, self).archive(self.project.name) + def fetch_(self, *w, **kw): + return self.repo.fetch_(*w, **kw) def get_latest_update_branches(self): refs = self.repo.listall_references() @@ -313,7 +369,7 @@ def get_latest_update_branches(self): current_time = time.time() latest_branches = [] for ref in refs: - commit_time = self.repo.lookup_reference(ref).get_object().commit_time + commit_time = self.repo.lookup_reference(ref).get_object().commit_time # noqa delta = current_time - commit_time if delta < LATEST_UPDATE_REF_THRESHOLD: latest_branches.append((commit_time, ref.split('/')[-1])) @@ -327,11 +383,14 @@ def get_all_src_objects(self): commits = self.repo.rev_list(ref) commits = {c['sha']: c for c in commits} commits_dict.update(commits) - commits = sorted(commits_dict.values(), key=lambda x: x['time'], reverse=True) + commits = sorted(commits_dict.values(), + key=lambda x: x['committer']['time'], + reverse=True) pruned_set = set() objects_dict = {} - treenode_list = [(commit['sha'], commit['tree'], '') for commit in commits] + treenode_list = [(commit['sha'], commit['tree'], '') + for commit in commits] while treenode_list: commit_id, tree_id, path = treenode_list.pop() if tree_id in pruned_set: @@ -346,12 +405,14 @@ def get_all_src_objects(self): elif obj['type'] == 'blob': if obj_id not in objects_dict: commit = commits_dict[commit_id] - objects_dict[obj_id] = dict(path=obj_path[1:], - commit=commit_id, - size=obj['size'], - commit_time=commit['time'], - committer=commit['committer']['name'] - ) + objects_dict[obj_id] = dict( + path=obj_path[1:], + commit=commit_id, + size=obj['size'], + commit_time=datetime.fromtimestamp( + commit['committer']['time']), + committer=commit['committer']['name'] + ) return objects_dict @@ -448,18 +509,17 @@ def api_url(self): ticket_id = self.pull.ticket_id # FIXME: pull/new,没有ticket if not ticket_id: - return '' - url = "/api/%s/pull/%s/" % (project_name, ticket_id) + return '/api/%s/diff/' % project_name + url = "/api/%s/pulls/%s/" % (project_name, ticket_id) return url @property def context_url(self): project_name = self.project.name ticket_id = self.pull.ticket_id - # FIXME: pull/new,没有ticket if not ticket_id: - return '' - url = "/api/%s/pull/%s/moreline" % (project_name, ticket_id) + return '/api/%s/diff/moreline' % project_name + url = "/api/%s/pulls/%s/moreline" % (project_name, ticket_id) return url @property @@ -468,8 +528,8 @@ def fulltext_url(self): ticket_id = self.pull.ticket_id # FIXME: pull/new,没有ticket if not ticket_id: - return '' - url = "/api/%s/pull/%s/fulltext" % (project_name, ticket_id) + return '/api/%s/diff/fulltext' % project_name + url = "/api/%s/pulls/%s/fulltext" % (project_name, ticket_id) return url @property @@ -486,6 +546,7 @@ def temp_dir(self): return worktree def init(self): + import os path = os.path.join(self.temp_dir, '.git') work_path = self.temp_dir return Jagare.init(path, work_path=work_path, bare=False) @@ -499,11 +560,12 @@ def from_sha(self): sha = None ticket_id = self.pull.ticket_id if ticket_id: + from vilya.models.consts import PULL_REF_H # FIXME: catch more exceptions try: sha = self.sha(PULL_REF_H % ticket_id) except: - #旧有的被close但又未merge的pr可能出错 + # 旧有的被close但又未merge的pr可能出错 pass if not sha and self.from_repo: sha = self.from_repo.sha(self.pull.from_ref) @@ -514,48 +576,21 @@ def to_sha(self): sha = None ticket_id = self.pull.ticket_id if ticket_id: - from models.consts import PULL_REF_M + from vilya.models.consts import PULL_REF_M # FIXME: catch more exceptions try: sha = self.sha(PULL_REF_M % ticket_id) except: - #旧有的被close但又未merge的pr可能出错 + # 旧有的被close但又未merge的pr可能出错 pass if not sha: sha = self.sha(self.pull.to_ref) return sha - def fetch_remote(self): - # TODO: raise exception? - if not self.from_repo: - return - remotes = self.remotes() - remote_name = 'hub/%s' % self.pull.from_proj.name - remote_name = remote_name.replace('~', '_') - remote_names = [r.name for r in remotes] - # TODO: check remote path if from_repo renamed - if str(remote_name) not in remote_names: - self.add_remote(str(remote_name), str(self.from_repo.path)) - self.fetch(str(remote_name)) - # pullrequest 确实被创建了 - ticket = self.pull.ticket - if ticket and not ticket.closed: - self.update_ref(PULL_REF_H % self.ticket_id, - 'refs/remotes/%s/%s' % (remote_name, - self.pull.from_ref)) - self.update_ref(PULL_REF_M % self.ticket_id, - 'refs/heads/%s' % self.pull.to_ref) - - def fetch_local(self): - # pullrequest 确实被创建了 - ticket = self.pull.ticket - if ticket and not ticket.closed: - self.update_ref(PULL_REF_H % self.ticket_id, - 'refs/heads/%s' % self.pull.from_ref) - self.update_ref(PULL_REF_M % self.ticket_id, - 'refs/heads/%s' % self.pull.to_ref) - def merge(self, merger, message_header, message_body): + import shutil + from vilya.models.git import make_git_env + # TODO: Use User only if merger and isinstance(merger, basestring): merger = User(merger) @@ -572,57 +607,58 @@ def merge(self, merger, message_header, message_body): from_sha = self.from_sha to_sha = self.to_sha repo = self.pull.pull_clone(worktree) - if self.from_local: - ref = self.pull.pull_fetch_local(repo) - else: - ref = self.pull.pull_fetch_remote(repo) - repo.merge(ref, message_header, message_body, no_ff=True, _env=env) - repo.push('origin', self.pull.to_ref) + ref = self.pull.pull_fetch(repo) + result = repo.merge(ref, message_header, message_body, no_ff=True, + _env=env) + errcode = result['returncode'] + if errcode != 0: + raise RepoMergeError() + result = repo.push('origin', self.pull.to_ref, + _env=dict(CODE_REMOTE_USER=merger.name)) + errcode = result['returncode'] + if errcode != 0: + raise RepoPushError merge_commit_sha = self.sha(self.pull.to_ref) - self.pull._save_merged(merger.name, from_sha, to_sha) + except RepoMergeError: + # FIXME: error msg + pass + except RepoPushError: + # FIXME: error msg + pass + else: + if merge_commit_sha and self.pull.ticket: + self.pull._save_merged(merger.name, + from_sha, + to_sha, + merge_commit_sha) finally: shutil.rmtree(worktree) return merge_commit_sha def can_merge(self): + import os + import shutil worktree = self.temp_dir try: - user = self.pull.to_proj.owner - env = make_git_env(user) - - self.clone(worktree, branch=self.pull.to_ref, bare=False) + self.clone(worktree, branch=self.pull.to_ref, + bare=False, shared=True) repo = ProjectRepo.init( os.path.join(worktree, '.git'), worktree, bare=False) - - if self.from_local: - ref = 'origin/%s' % self.pull.from_ref - else: - from_proj_name = self.pull.from_proj.name.replace('~', '_') - repo.add_remote('hub/%s' % from_proj_name, - self.pull.from_proj.repo_path) - ref = 'hub/%s/%s' % (from_proj_name, self.pull.from_ref) - repo.fetch_all() - result = repo.merge(ref, msg='automerge', _raise=False, _env=env) - errcode = result['returncode'] + ref = self.pull.pull_fetch(repo) + result = repo.merge_commits(self.pull.to_ref, ref) + except KeyError: # dummy result + result = {} finally: shutil.rmtree(worktree) - return errcode == 0 + if result.get('has_conflicts', None) is False: + return True + else: + return False def can_fastforward(self): if not self.get_commits(self.to_sha, self.from_sha): return True -def make_git_env(user=None, is_anonymous=False): - env = {} - if is_anonymous: - env['GIT_AUTHOR_NAME'] = 'anonymous' - env['GIT_AUTHOR_EMAIL'] = 'anonymous@douban.com' - env['GIT_COMMITTER_NAME'] = 'anonymous' - env['GIT_COMMITTER_EMAIL'] = 'anonymous@douban.com' - else: - env['GIT_AUTHOR_NAME'] = user.username - env['GIT_AUTHOR_EMAIL'] = user.email - env['GIT_COMMITTER_NAME'] = user.username - env['GIT_COMMITTER_EMAIL'] = user.email - return env +def backport_project_name(name): + return name.replace('~', '_') diff --git a/vilya/models/git/submodule.py b/vilya/models/ngit/submodule.py similarity index 72% rename from vilya/models/git/submodule.py rename to vilya/models/ngit/submodule.py index 8257de1..15a9ce8 100644 --- a/vilya/models/git/submodule.py +++ b/vilya/models/ngit/submodule.py @@ -16,7 +16,9 @@ def __init__(self, url, path): self._host = 'other' def as_dic(self): - return {"type": "submodule", - "url": self._url, - "path": self._path, - "host": self._host} + return { + "type": "submodule", + "url": self._url, + "path": self._path, + "host": self._host + } diff --git a/vilya/models/git/tree.py b/vilya/models/ngit/tree.py similarity index 99% rename from vilya/models/git/tree.py rename to vilya/models/ngit/tree.py index 7d68803..2def954 100644 --- a/vilya/models/git/tree.py +++ b/vilya/models/ngit/tree.py @@ -22,4 +22,3 @@ def next(self): entry = self.entries[self.index] self.index = self.index + 1 return entry - diff --git a/vilya/models/notification.py b/vilya/models/notification.py new file mode 100644 index 0000000..d359ddf --- /dev/null +++ b/vilya/models/notification.py @@ -0,0 +1,150 @@ +# -*- coding: utf-8 -*- + +import json + +from vilya.libs.rdstore import rds +from vilya.libs.text import get_mentions_from_text +from vilya.models.utils import CJsonEncoder + +MAX_NOTIFY_COUNT = 100 +RDS_PREFIX = 'notification' + + +def rds_key_for_receiver(receiver): + return RDS_PREFIX + ':' + receiver + + +class Notification(object): + def __init__(self, uid, receivers, data): + self.receivers = set(receivers) + self.data = data + self.uid = uid + + def send(self): + data = self.data + data['uid'] = self.uid + for receiver in self.receivers: + key = rds_key_for_receiver(receiver) + rds.lpush(key, json.dumps(data, cls=CJsonEncoder)) + rds.ltrim(key, 0, MAX_NOTIFY_COUNT) + + @classmethod + def get_data(cls, receiver): + key = rds_key_for_receiver(receiver) + raw_data = rds.lrange(key, 0, MAX_NOTIFY_COUNT) + data = [json.loads(d) for d in raw_data] + return data + + # 暴露出来是为了给以前数据做迁移 + @classmethod + def set_data(cls, receiver, field, value, uid=None): + key = rds_key_for_receiver(receiver) + datas = cls.get_data(receiver) + for i, d in enumerate(datas): + if (uid and d.get('uid') == uid) or (uid is None): + d[field] = value + raw_d = json.dumps(d, cls=CJsonEncoder) + rds.lset(key, i, raw_d) + + @classmethod + def mark_as_read(cls, receiver, uid): + if uid is None: + return + cls.set_data(receiver, 'read', True, uid) + + # FIXME: hack + @classmethod + def mark_as_read_by_pull(cls, receiver, project_name, pull_number): + key = rds_key_for_receiver(receiver) + actions = cls.get_data(receiver) + for i, d in enumerate(actions): + # scope + if d.get('scope') != 'project': + continue + # project name + if d.get('target') != project_name: + continue + if 'pull' not in d.get('type'): + continue + # pull id + if d.get('entry_id') != int(pull_number): + continue + d['read'] = True + raw_d = json.dumps(d, cls=CJsonEncoder) + rds.lset(key, i, raw_d) + + # FIXME: hack + @classmethod + def mark_as_read_by_issue(cls, receiver, id): + return + + @classmethod + def mark_all_as_read(cls, receiver): + cls.set_data(receiver, 'read', True) + + @classmethod + def unread_count(cls, receiver): + datas = cls.get_data(receiver) + count = 0 + for data in datas: + if not data.get('read'): + count += 1 + return count + + @classmethod + def delete_by_uid(cls, receiver, uid): + key = rds_key_for_receiver(receiver) + datas = cls.get_data(receiver) + for i, d in enumerate(datas): + if (uid and d.get('uid') == uid): + # for python dict order, only use lindex + rds.lrem(key, rds.lindex(key, i)) + + +def get_pr_notify_receivers(author, content, pullreq, ticket, + channel="notify", extra_receivers=[]): + noti_receivers = ticket.participants + at_users = get_mentions_from_text(content) + noti_receivers.extend( + at_users + [ticket.author, pullreq.to_proj.owner_id] + extra_receivers) + noti_receivers = list(set(noti_receivers)) + # not to notify author himself + if author in noti_receivers: + noti_receivers.remove(author) + return noti_receivers + + +def get_pr_notify_toaddr_receivers(author, content, pullreq, ticket): + noti_receivers = [] + at_users = get_mentions_from_text(content) + noti_receivers.extend(at_users + [ticket.author, pullreq.to_proj.owner_id]) + if author in noti_receivers: + noti_receivers.remove(author) + return noti_receivers + + +def get_pr_notify_ccaddr_receivers(author, toaddr, extra_receivers): + noti_receivers = [] + noti_receivers.extend(extra_receivers) + noti_receivers = list(set(noti_receivers) - set(toaddr)) + if author in noti_receivers: + noti_receivers.remove(author) + return noti_receivers + + +def get_issue_notify_receivers(author, content, target, issue, + channel='notify'): + noti_receivers = [] + at_users = get_mentions_from_text(content) + participants = [p.user_id for p in issue.participants if p] + if issue.target_type == "project": + noti_receivers.extend( + at_users + [issue.creator_id, target.owner_id] + participants) + elif issue.target_type == "team": + noti_receivers.extend( + at_users + [issue.creator_id] + participants + target.user_ids) + noti_receivers = list(set(noti_receivers)) + # not to notify author himself + if author in noti_receivers: + noti_receivers.remove(author) + return noti_receivers diff --git a/vilya/models/nproject.py b/vilya/models/nproject.py new file mode 100644 index 0000000..3d9d3e2 --- /dev/null +++ b/vilya/models/nproject.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- + +from vilya.libs.model import BaseModel, ModelField + + +class ProjectWatcher(BaseModel): + __orz_table__ = "codedouban_watches" + user_id = ModelField(as_key=ModelField.KeyType.DESC) + project_id = ModelField(as_key=ModelField.KeyType.DESC) + + class OrzMeta: + id2str = True + + +# FIXME: primary key hook_id +class ProjectHook(BaseModel): + __orz_table__ = "codedouban_hooks" + hook_id = ModelField(as_key=ModelField.KeyType.DESC) + url = ModelField() + project_id = ModelField(as_key=ModelField.KeyType.DESC) + + class OrzMeta: + id2str = True diff --git a/vilya/models/npull.py b/vilya/models/npull.py new file mode 100644 index 0000000..f789317 --- /dev/null +++ b/vilya/models/npull.py @@ -0,0 +1,580 @@ +# -*- coding: utf-8 -*- + +import os +import logging +logging.getLogger().setLevel(logging.DEBUG) +from datetime import datetime + +from vilya.libs.props import PropsMixin +from vilya.libs.model import BaseModel, ModelField +from vilya.libs.store import cache, store +from vilya.models.consts import PULL_REF_H, PULL_REF_M +from vilya.models.ticket import Ticket, TicketNode +from vilya.models.ngit.repo import PullRepo, ProjectRepo +from vilya.models.project import CodeDoubanProject +from vilya.config import DOMAIN + +# mc keys, ('{self.id}', '{self.from_sha}', '{self.to_sha}') +MC_KEY_PULL_MERGE_BASE = 'PullRequest:%s:%s:%s:merge_base' +MC_KEY_PULL_IS_MERGABLE = 'PullRequest:%s:%s:%s:is_auto_mergable' +MC_KEY_PULL_ID_BY_PID_AND_TID = 'PullRequest:%s:%s:pull_id' +MC_KEY_PULL_COMMITS = 'PullRequest:%s:%s:%s:commits' + + +class PullMixin(object): + + def __init__(self, from_project_id, from_project_ref, + to_project_id, to_project_ref): + self.from_project = from_project_id + self.from_branch = from_project_ref + self.to_project = to_project_id + self.to_branch = to_project_ref + self.merged = None + self.ticket = None + self.ticket_id = None + self.mixin = True + self.init_pull() + self.sync() + + def init_pull(self): + if self.merged: + merged = self.merged.split('..') + self._from_sha = merged[0] + self._to_sha = merged[1] + else: + self._from_sha = None + self._to_sha = None + + @property + def repo(self): + return PullRepo(self) + + @property + def family_id(self): + project = self.to_proj + if project: + return project.origin_project_id + + @property + def from_ref(self): + return self.from_branch + + @property + def to_ref(self): + return self.to_branch + + @property + def same(self): + return self.from_proj == self.to_proj + + @property + def to_proj(self): + return CodeDoubanProject.get(self.to_project) + + @property + def from_proj(self): + return CodeDoubanProject.get(self.from_project) + + @property + def to_proj_str(self): + return "%s:%s" % (self.to_proj, self.to_branch) + + @property + def from_proj_str(self): + return "%s:%s" % (self.from_proj, self.from_branch) + + @property + def from_sha(self): + if self._from_sha is None: + self._from_sha = self.repo.from_sha + return self._from_sha + + @property + def to_sha(self): + if self._to_sha is None: + self._to_sha = self.repo.to_sha + return self._to_sha + + @property + def from_commit(self): + return self.from_proj.repo.get_commit(self.from_sha) + + @property + def to_commit(self): + return self.to_proj.repo.get_commit(self.to_sha) + + @property + def to_head_ref(self): + return PULL_REF_H % self.ticket_id + + @property + def to_merge_ref(self): + return PULL_REF_M % self.ticket_id + + @property + def from_head_ref(self): + if self.from_project == self.to_project: + return 'refs/heads/%s' % self.from_branch + return 'refs/remotes/%s/%s' % (self.from_proj.remote_name, + self.from_branch) + + @property + def from_merge_ref(self): + return 'refs/heads/%s' % self.to_branch + + @property + def to_remote_ref(self): + return "%s/%s" % (self.to_proj.remote_name, + self.to_branch) + + @property + def from_remote_ref(self): + return "%s/%s" % (self.from_proj.remote_name, + self.from_branch) + + def _get_merge_base(self): + to_sha = self.to_sha + from_sha = self.from_sha + # for: from_sha is None + if to_sha and from_sha: + merge_base = self.repo.merge_base(to_sha, from_sha) + else: + merge_base = None + merge_base = merge_base.hex if merge_base else to_sha + return merge_base + + @property + def merge_base(self): + return self._get_merge_base() + + def _get_commits(self): + commits = self.to_proj.repo.get_commits(self.from_sha, self.to_sha) + return [c for c in commits if c] + + @property + def commits(self): + return self._get_commits() + + @property + def merged_commits(self): + if not self.merged: + return [] + return self.commits + + @property + def can_pull(self): + from_commit = self.from_proj.repo.get_commit(self.from_ref) + to_commit = self.to_proj.repo.get_commit(self.to_ref) + if from_commit and to_commit: + return True + + def get_diff(self, ref=None, from_ref=None, paths=None, context_lines=3, + ignore_space=False, rename_detection=False, linecomments=[], + **kw): + ref = ref or self.from_sha + from_ref = from_ref or self.merge_base + return self.repo.get_diff(ref=ref, from_ref=from_ref, + paths=paths, + context_lines=context_lines, + ignore_space=ignore_space, + rename_detection=rename_detection, + linecomments=linecomments, + **kw) + + def update_ref(self): + ticket = self.ticket + if not ticket: + return + if ticket.closed: + return + project = self.to_proj + project.repo.update_ref(self.to_head_ref, + self.from_head_ref) + project.repo.update_ref(self.to_merge_ref, + self.from_merge_ref) + + def update_remote(self): + if self.from_project == self.to_project: + return + from_proj = self.from_proj + to_proj = self.to_proj + remotes = to_proj.repo.remotes + rs = [r['name'] for r in remotes] + if from_proj.remote_name not in rs: + to_proj.repo.add_remote(from_proj.remote_name, + from_proj.repo_path) + to_proj.repo.fetch(from_proj.remote_name) + + def sync(self): + if self.merged: + return + if not self.from_proj: + return + assert self.from_proj.origin_project_id == self.family_id + self.update_remote() + self.update_ref() + + # TODO + def insert(self, ticket_id): + self.ticket_id = ticket_id + return Pull2.create(from_project=self.from_proj.id, + from_branch=self.from_branch, + to_project=self.to_proj.id, + to_branch=self.to_branch, + ticket_id=ticket_id) + + def is_auto_mergable(self): + return self.repo.can_merge() + + def is_up_to_date(self): + if self.merged: + return True + try: + commits = self.commits + has_commits = True if commits else False + except: + has_commits = False + return not has_commits + + def merge(self, operator, commit_message=''): + message_header = "Merge pull request #%s from %s:%s" % ( + self.ticket_id, self.from_proj, self.from_ref) + message_body = commit_message + commit_sha = self.repo.merge(operator, message_header, message_body) + return commit_sha + + def pull_clone(self, path): + ref = self.to_ref + proj = self.to_proj + proj.repo.clone(path, bare=False, branch=ref, shared=True) + repo = ProjectRepo.init(os.path.join(path, '.git'), path, bare=False) + return repo + + def pull_fetch(self, repo): + if self.from_project == self.to_project: + ref = self.pull_fetch_local(repo) + else: + ref = self.pull_fetch_remote(repo) + return ref + + def pull_fetch_remote(self, repo): + # hotfix: + from_proj = self.from_proj + repo.add_remote(from_proj.remote_name, + from_proj.repo_path) + repo.fetch_all() + return self.from_remote_ref + + def pull_fetch_local(self, repo): + repo.fetch_all() + ref = 'origin/%s' % self.from_ref + return ref + + def pull_merge(self, repo, ref, env, msg, commit_message): + if not commit_message: + repo.merge(ref, msg, no_ff=True, _env=env) + else: + repo.merge(ref, msg, commit_message, no_ff=True, _env=env) + repo.push('origin', self.to_ref) + + +class Pull2(BaseModel, PropsMixin, PullMixin): + __orz_table__ = "pullreq" + from_project = ModelField(as_key=ModelField.KeyType.DESC) + from_branch = ModelField(as_key=ModelField.KeyType.DESC) + to_project = ModelField(as_key=ModelField.KeyType.DESC) + to_branch = ModelField(as_key=ModelField.KeyType.DESC) + merged = ModelField(as_key=ModelField.KeyType.DESC) + ticket_id = ModelField(as_key=ModelField.KeyType.DESC) + + class OrzMeta: + id2str = True + cache_ver = "v1" + + def get_uuid(self): + return '/pull/%s' % self.id + + def after_create(self): + self.init_pull() + self.sync() + + @classmethod + def get(cls, **kwargs): + r = super(Pull2, cls).get(**kwargs) + if r: + r.init_pull() + r.sync() + return r + + @property + @cache(MC_KEY_PULL_MERGE_BASE % ('{self.id}', + '{self.from_sha}', + '{self.to_sha}')) + def merge_base(self): + return self._get_merge_base() + + @property + @cache(MC_KEY_PULL_COMMITS % ('{self.id}', + '{self.from_sha}', + '{self.to_sha}')) + def commits(self): + return self._get_commits() + + @property + def ticket(self): + if not self.ticket_id: + return None + ticket = Ticket.get_by_projectid_and_ticketnumber(self.to_proj.id, + self.ticket_id) + return ticket + + @property + def full_url(self): + return "%s/%s/pull/%s/" % (DOMAIN, + self.to_proj.name, + self.ticket_id) + + def get_commits_by_status(self, status): + if status == 'closed': + return self.merged_commits + return self.commits + + def get_commits(self): + return self.commits + + def get_commits_shas(self): + return [c.sha for c in self.commits] + + def get_format_patch(self): + text = self.to_proj.repo.get_patch_file(self.from_sha, self.merge_base) + return text + + def get_diff_tree(self): + text = self.to_proj.repo.get_diff_file(self.from_sha, self.merge_base) + return text + + # TODO: cache + def get_diff_length(self, ref=None, from_ref=None, paths=None): + ref = ref or self.from_sha + from_ref = from_ref or self.merge_base + return self.repo.get_diff_length(ref=ref, from_ref=from_ref, + paths=paths) + + def get_contexts(self, ref, path, line_start, line_end): + return self.repo.get_contexts(ref, path, line_start, line_end) + + @classmethod + def get_by_proj_and_ticket(cls, proj_id, tid): + return cls.get(to_project=proj_id, ticket_id=tid) + + @classmethod + def get_by_ticket(cls, ticket): + proj_id = ticket.project_id + tid = ticket.ticket_id + return cls.get(to_project=proj_id, ticket_id=tid) + + @classmethod + def get_by_from_and_to(cls, from_project, from_branch, + to_project, to_branch): + rs = cls.gets(from_project=from_project, + from_branch=from_branch, + to_project=to_project, + to_branch=to_branch) + return rs + + @classmethod + # backward compatibility + def get_max_ticket_id(cls, proj_id): + rs = store.execute("select max(ticket_id) " + "from pullreq where to_project=%s", + (proj_id,)) + r = rs and rs[0] + if r and r[0]: + return int(r[0]) + + @cache(MC_KEY_PULL_IS_MERGABLE % ('{self.id}', + '{self.from_sha}', + '{self.to_sha}')) + def is_auto_mergable(self): + return self.repo.can_merge() + + def can_fastforward(self): + return self.repo.can_fastforward() + + # TODO: remove this + def remove_branch_if_temp(self): + if self.from_ref.startswith('patch_tmp'): + try: + self.to_proj.repo.delete_branch(self.from_ref) + except AssertionError as err: + logging.debug("Unable to remove_temp_branch(%s): %s" % ( + self.from_ref, err)) + + def is_temp_pull(self): + if self.from_ref.startswith('patch_tmp'): + return True + + def _save_merged(self, operator, from_sha, to_sha, merge_commit_sha): + self.merged = "%s..%s" % (from_sha, to_sha) + self.save() + merged_time = datetime.now() + self.merge_by = operator + self.merge_time = merged_time.strftime('%Y-%m-%d %H:%M:%S') + # FIXME: pullreq without ticket_id? + if self.ticket_id: + ticket = Ticket.get_by_projectid_and_ticketnumber( + self.to_proj.id, self.ticket_id) + if ticket: + # add commits to ticket + ticket.add_commits(merge_commit_sha, operator) + TicketNode.add_merge(ticket.id, operator, merged_time) + + def _get_merge_by(self): + return self.props.get('merge_by') + + def _set_merge_by(self, merge_by): + self.set_props_item('merge_by', merge_by) + + merge_by = property(_get_merge_by, _set_merge_by) + + def _get_merge_time(self): + return self.props.get('merge_time') + + def _set_merge_time(self, merge_time): + self.set_props_item('merge_time', merge_time) + + def _base_repo_as_dict(self): + # TODO: wrap to project repo + d = self._repo_as_dict(self.to_proj) + commit = self.to_commit + ts = commit.author_timestamp if commit else 0 + d['repo']['pushed_at'] = datetime.fromtimestamp( + float(ts)).strftime('%Y-%m-%dT%H:%M:%S') + d['label'] = "%s:%s" % (self.to_proj.name, self.to_ref) + d['sha'] = commit.sha if commit else None + d['ref'] = self.to_ref + + return d + + def _head_repo_as_dict(self): + d = self._repo_as_dict(self.from_proj) + if not d['repo']: + return d + + commit = self.from_commit + if commit: + ts = commit.author_timestamp if commit else 0 + d['repo']['pushed_at'] = datetime.fromtimestamp( + float(ts)).strftime('%Y-%m-%dT%H:%M:%S') + d['label'] = "%s:%s" % (self.from_proj.name, self.from_ref) + d['sha'] = commit.sha if commit else None + d['ref'] = self.from_ref + + return d + + def _repo_as_dict(self, proj): + if not proj: + return {'repo': {}} + + d = {} + d['repo'] = {} + d['repo']['id'] = proj.id + d['repo']['name'] = proj.name + d['repo']['clone_url'] = "%s/%s.git" % (DOMAIN, proj.name) + d['repo']['html_url'] = "%s/%s" % (DOMAIN, proj.name) + + d['repo']['name'] = proj.name + d['repo']['summary'] = proj.summary + d['repo'][ + 'fork'] = True if proj.fork_from and proj.fork_from > 0 else False + d['repo']['created_at'] = proj.time.strftime('%Y-%m-%dT%H:%M:%S') + d['repo']['author'] = {'login': proj.owner_id} + + return d + + def as_dict(self): + if not (self.ticket_id and self.to_proj): + return None + + ticket = Ticket.get_by_projectid_and_ticketnumber( + self.to_proj.id, self.ticket_id) + if not ticket: + return None + d = {} + d['url'] = "%s/api/%s/pull/%s" % ( + DOMAIN, self.to_proj.name, self.ticket_id) + d['html_url'] = "%s/%s/pull/%s/" % ( + DOMAIN, self.to_proj.name, self.ticket_id) + d['number'] = self.ticket_id # or ticket_id as name is better? + d['title'] = ticket.title + d['description'] = ticket.description + d['merged'] = self.merged and True or False + d['created_at'] = ticket.time.strftime('%Y-%m-%dT%H:%M:%S') + if ticket.closed: + d['closed_at'] = ticket.closed.strftime('%Y-%m-%dT%H:%M:%S') + d['state'] = 'closed' + else: + d['closed_at'] = None + d['state'] = 'open' + + if d['merged']: + # No merged time recored, use closed_at instead + d['merged_at'] = d['closed_at'] + else: + d['merged_at'] = None + + d['author'] = {} + d['author']['login'] = ticket.author + d['ticket_id'] = self.ticket_id + d['from_proj'] = self.from_proj and self.from_proj.name or '' + d['to_proj'] = self.to_proj and self.to_proj.name or '' + d['to_proj_id'] = self.to_proj and self.to_proj.id or -1 + d['creator'] = ticket.author + d['base'] = self._base_repo_as_dict() + d['head'] = self._head_repo_as_dict() + commits = self.get_commits_by_status(d['state']) + d['commit_id'] = [c.sha for c in commits] + + return d + + merge_time = property(_get_merge_time, _set_merge_time) + + def get_merged_commit_shas(self): + commits_shas = [] + for ticket_commits in self.ticket.get_commits(): + commits_shas += [str(c) for c in ticket_commits.commits.split(',')] + commits_shas = [c for c in commits_shas if c] + return commits_shas + + def get_merged_commits(self): + commits = [] + repo = self.to_proj.repo + commits = filter(None, (repo.get_commit(str(c)) + for c in self.get_merged_commit_shas())) + commits = sorted(commits, key=lambda x: x.committer_time, reverse=True) + if self.merged: + # exclude last merge commit + return commits[1:] + else: + return commits + + def get_delta_commits(self): + """ + 补充pull request创建之后再提交的commits + """ + saved = self.get_merged_commit_shas() + nowcommits = self.get_commits_shas() + delta_commits = [c for c in nowcommits if c not in saved] + if delta_commits: + delta_commits = [self.to_proj.repo.get_commit(str(d)) + for d in delta_commits] + delta_commits = filter(None, delta_commits) + return delta_commits + return [] + + @classmethod + def open(cls, from_project, from_branch, to_project, to_branch): + return PullMixin(from_project.id, + from_branch, + to_project.id, + to_branch) diff --git a/vilya/models/nteam.py b/vilya/models/nteam.py new file mode 100644 index 0000000..f667b88 --- /dev/null +++ b/vilya/models/nteam.py @@ -0,0 +1,122 @@ +# -*- coding: utf-8 -*- +from vilya.libs.store import OrzField, OrzBase +from vilya.libs.model import BaseModel, ModelField +from vilya.libs.props import PropsMixin, PropsItem +from vilya.models.tag import TagMixin, TAG_TYPE_TEAM_ISSUE +from vilya.models.team_project import TeamProject +from vilya.models.consts import ( + TEAM_MEMBER, TEAM_OWNER) + + +# TODO: not used ~ +class Team(OrzBase, PropsMixin, TagMixin): + __orz_table__ = "team" + team_id = OrzField(as_key=OrzField.KeyType.DESC) + name = OrzField(as_key=OrzField.KeyType.DESC) + description = OrzField(default='') + created_at = OrzField(default='null') + + @property + def uid(self): + # TODO: change uid to name + return self.team_id + + @property + def title(self): + return self.name + + def __repr__(self): + return '<Team %s, %s>' % (self.id, self.uid) + + def __str__(self): + return self.name + + def get_uuid(self): + return "/team/%s" % self.id + + uuid = property(get_uuid) + profile = PropsItem("profile", {}) + weekly = PropsItem("weekly") + + def profile_url(self): + if not self.profile: + return "/static/img/team_default_profile.jpg" + else: + return self.profile.get('origin') + + @property + def tag_type(self): + return TAG_TYPE_TEAM_ISSUE + + @property + def url(self): + return '/teams/%s/' % self.uid + + @property + def doc_project(self): + team_projects = TeamProject.gets_by(team_id=self.id) + if not team_projects: + return None + team_project = team_projects[0] + return team_project.project + + @property + def members(self): + pass + + @property + def owners(self): + pass + + @property + def projects(self): + from vilya.models.project import CodeDoubanProject + return filter(None, [CodeDoubanProject.get(_) + for _ in self.project_ids]) + + def as_dict(self): + d = {} + d['name'] = self.name + d['description'] = self.description + d['uid'] = self.uid + d['created_at'] = self.created_at.strftime('%Y-%m-%dT%H:%M:%S') + return d + + +class TeamUserRelationship(BaseModel): + __orz_table__ = "team_user_relationship" + team_id = ModelField(as_key=ModelField.KeyType.DESC) + user_id = ModelField(as_key=ModelField.KeyType.DESC) + identity = ModelField(as_key=ModelField.KeyType.DESC) + created_at = ModelField(auto_now_create=True) + + class OrzMeta: + id2str = True + + def __repr__(self): + return '<TeamUserRelationship %s, %s, %s>' % (self.id, + self.team_id, + self.user_id) + + @property + def is_owner(self): + return self.identity == TEAM_OWNER + + @property + def is_member(self): + return self.identity == TEAM_MEMBER + + +class TeamProjectRelationship(BaseModel): + __orz_table__ = "team_project_relationship" + team_id = ModelField(as_key=ModelField.KeyType.DESC) + project_id = ModelField(as_key=ModelField.KeyType.DESC) + created_at = ModelField(auto_now_create=True) + + class OrzMeta: + id2str = True + + def __repr__(self): + return '<TeamProjectRelationship %s, %s, %s>' % (self.id, + self.team_id, + self.project_id) diff --git a/vilya/models/nticket.py b/vilya/models/nticket.py new file mode 100644 index 0000000..47323b6 --- /dev/null +++ b/vilya/models/nticket.py @@ -0,0 +1,281 @@ +# -*- coding: utf-8 -*- +from datetime import datetime + +from dispatches import dispatch +from vilya.config import DOMAIN +from vilya.libs.store import bdb +from vilya.libs.model import BaseModel, ModelField +from vilya.libs.signals import codereview_signal +from vilya.models.project import CodeDoubanProject +from vilya.models.consts import ( + TICKET_NODE_TYPE_OPEN, TICKET_NODE_TYPE_CLOSE, + TICKET_NODE_TYPE_MERGE, TICKET_NODE_TYPE_COMMIT, + TICKET_NODE_TYPE_COMMENT, TICKET_NODE_TYPE_LINECOMMENT, + PULL_COMMENT_UID_PATTERN) +from vilya.models.linecomment import PullLineComment + +BDB_TICKET_COMMENT_CONTENT_KEY = 'ticket_comment_content:%s' + + +class TicketNode(BaseModel): + __orz_table__ = "ticket_nodes" + author = ModelField() + type = ModelField(as_key=ModelField.KeyType.DESC) + type_id = ModelField(as_key=ModelField.KeyType.DESC) + ticket_id = ModelField(as_key=ModelField.KeyType.DESC) + created_at = ModelField(as_key=ModelField.KeyType.ASC, + auto_now_create=True) + + class OrzMeta: + id2str = False + order_combs = (("created_at", ),) + + @property + def commit(self): + if self.type == TICKET_NODE_TYPE_COMMIT: + return TicketCommits.get(id=self.type_id) + + @property + def comment(self): + if self.type == TICKET_NODE_TYPE_COMMENT: + return TicketComment.get(id=self.type_id) + + @property + def codereview(self): + if self.type == TICKET_NODE_TYPE_LINECOMMENT: + return PullLineComment.get(self.type_id) + + @classmethod + def gets_by_ticket_id(cls, id): + return cls.gets(ticket_id=id, order_by='created_at') + + @classmethod + def get_by_type_id(cls, type, id): + return cls.get(type=type, type_id=id) + + @classmethod + def add(cls, type, type_id, author, ticket_id, created_at): + return cls.create(type=type, + type_id=type_id, + author=author, + ticket_id=ticket_id, + created_at=created_at) + + @classmethod + def add_commit(cls, commit): + id = commit.id + ticket_id = commit.ticket_id + author = commit.author + created_at = commit.time + type = TICKET_NODE_TYPE_COMMIT + return cls.add(type, id, author, ticket_id, created_at) + + @classmethod + def add_comment(cls, comment): + id = comment.id + ticket_id = comment.ticket_id + author = comment.author + created_at = comment.time + type = TICKET_NODE_TYPE_COMMENT + return cls.add(type, id, author, ticket_id, created_at) + + @classmethod + def add_codereview(cls, codereview): + id = codereview.id + ticket_id = codereview.target_id + author = codereview.author + created_at = codereview.created_at + type = TICKET_NODE_TYPE_LINECOMMENT + return cls.add(type, id, author, ticket_id, created_at) + + @classmethod + def add_merge(cls, ticket_id, author, created_at): + type = TICKET_NODE_TYPE_MERGE + id = 0 + return cls.add(type, id, author, ticket_id, created_at) + + @classmethod + def add_open(cls, ticket_id, author, created_at): + type = TICKET_NODE_TYPE_OPEN + id = 0 + return cls.add(type, id, author, ticket_id, created_at) + + @classmethod + def add_close(cls, ticket_id, author, created_at): + type = TICKET_NODE_TYPE_CLOSE + id = 0 + return cls.add(type, id, author, ticket_id, created_at) + + @classmethod + def get_by_comment(cls, comment): + type = TICKET_NODE_TYPE_COMMENT + return cls.get_by_type_id(type, comment.id) + + @classmethod + def get_by_codereview(cls, codereview): + type = TICKET_NODE_TYPE_LINECOMMENT + return cls.get_by_type_id(type, codereview.id) + + # 用于migrate + @classmethod + def get_by_codereview_id(cls, codereview_id): + type = TICKET_NODE_TYPE_LINECOMMENT + return cls.get_by_type_id(type, codereview_id) + + @classmethod + def get_by_commit(cls, commit): + type = TICKET_NODE_TYPE_COMMIT + return cls.get_by_type_id(type, commit.id) + + def delete_type(self): + if self.type == TICKET_NODE_TYPE_COMMENT: + comment = self.comment + comment.delete() + elif self.type == TICKET_NODE_TYPE_COMMIT: + commit = self.commit + commit.delete() + elif self.type == TICKET_NODE_TYPE_LINECOMMENT: + codereview = self.codereview + codereview.delete() + + +class TicketCommits(BaseModel): + __orz_table__ = "codedouban_ticket_commits" + author = ModelField() + commits = ModelField() + ticket_id = ModelField(as_key=ModelField.KeyType.DESC) + time = ModelField(as_key=ModelField.KeyType.DESC, auto_now_create=True) + + @property + def ticket(self): + from vilya.models.ticket import Ticket + return Ticket.get(self.ticket_id) + + @property + def project(self): + return CodeDoubanProject.get(self.ticket.project_id) + + @classmethod + def commit_as_dict(cls, proj, sha): + d = {} + d['sha'] = sha + commit = proj.repo.get_commit(sha) + d['commit'] = {} + d['commit']['html_url'] = "%s/%s/commits/%s" % ( + DOMAIN, proj.name, sha) + d['commit']['sha'] = sha + d['commit']['message'] = commit.message + d['commit']['date'] = commit.committer_time.strftime( + '%Y-%m-%dT%H:%M:%S') + d['commit']['author'] = dict( + name=commit.author.name, + email=commit.author.email + ) + d['commit']['committer'] = dict( + name=commit.committer.name, + email=commit.committer.email + ) + d['commit']['tree'] = dict( + html_url="%s/%s/tree/%s" % (DOMAIN, proj.name, sha), + sha=sha + ) + + parent = [dict(sha=commit.parent, + html_url="%s/%s/commits/%s" % (DOMAIN, + proj.name, + commit.parent)) + ] if commit.parent else [] + d['parent'] = parent + + files = [] + for delta in commit.diff.deltas: + files.append(dict(type=delta.status_text, + filepath=delta.new_file_path)) + d['commit']['files'] = files + + return d + + def as_dict(self): + l = [] + for sha in self.commits.split(','): + d = TicketCommits.commit_as_dict(self.project, sha) + l.append(d) + return l + + @classmethod + def add(cls, ticket_id, commits, author): + return cls.create(ticket_id=ticket_id, commits=commits, author=author) + + @classmethod + def gets_by_ticketid(cls, ticket_id): + return cls.gets(ticket_id=ticket_id) + + def after_create(self): + commit = self + TicketNode.add_commit(commit) + + +class TicketComment(BaseModel): + __orz_table__ = "codedouban_ticket_comment" + author = ModelField() + # content = ModelField() + ticket_id = ModelField(as_key=ModelField.KeyType.DESC) + time = ModelField(as_key=ModelField.KeyType.DESC, auto_now_create=True) + + @property + def content(self): + return bdb.get(BDB_TICKET_COMMENT_CONTENT_KEY % self.id) + + @property + def uid(self): + return PULL_COMMENT_UID_PATTERN % self.id + + def as_dict(self): + return { + 'content': self.content, + 'author': self.author, + 'date': self.time.strftime('%Y-%m-%dT%H:%M:%S'), + 'id': self.id, + 'ticket_id': self.ticket_id + } + + @classmethod + def add(cls, ticket_id, content, author): + comment = cls.create(ticket_id=ticket_id, + extra_args=content, + author=author) + return comment + + def after_create(self, extra_args): + from vilya.models.ticket import Ticket + comment = self + TicketNode.add_comment(comment) + content = extra_args + bdb.set(BDB_TICKET_COMMENT_CONTENT_KEY % self.id, content) + ticket = Ticket.get(self.ticket_id) + # TODO: 将Feed全部迁移到新的系统后,取消signal发送 + codereview_signal.send(comment, + content=content, + ticket=ticket, + author=self.author, + comment=comment) + dispatch('codereview', data={ + 'comment': comment, + 'ticket': ticket, + 'sender': self.author, + }) + + def update(self, content): + bdb.set(BDB_TICKET_COMMENT_CONTENT_KEY % self.id, content) + self.time = datetime.now() + self.save() + + def after_delete(self): + bdb.delete(BDB_TICKET_COMMENT_CONTENT_KEY % self.id) + node = TicketNode.get_by_comment(self) + if node: + node.delete() + + @classmethod + def gets_by_ticketid(cls, ticket_id): + return cls.gets(ticket_id=ticket_id) diff --git a/vilya/models/nuser.py b/vilya/models/nuser.py new file mode 100644 index 0000000..5ebfc1a --- /dev/null +++ b/vilya/models/nuser.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +from vilya.config import PASSWORD_METHOD +from vilya.models.hashers import check_password, make_password +from vilya.libs.model import BaseModel, ModelField +from vilya.models.consts import ( + USER_ROLE_INTERN, USER_ROLE_STAFF, USER_ROLE_DEFAULT) + + +class User2(BaseModel): + __orz_table__ = "users" + name = ModelField(as_key=ModelField.KeyType.DESC) + password = ModelField() + role = ModelField() + created_at = ModelField(auto_now_create=True) + + class OrzMeta: + id2str = True + + def __repr__(self): + return '<u %s, %s>' % (self.id, + self.name) + + @property + def is_intern(self): + return int(self.role) == USER_ROLE_INTERN + + def validate_password(self, password): + return check_password(password, self.password) + + @classmethod + def is_exists(cls, name): + return cls.get(name=name) + + @classmethod + def add(cls, name, password): + encoded_password = make_password(password, hasher=PASSWORD_METHOD) + return cls.create(name=name, password=encoded_password, + role=USER_ROLE_DEFAULT) + + def set_role(self, intern=False): + self.role = USER_ROLE_INTERN if intern else USER_ROLE_STAFF + self.save() + + def has_role(self): + if self.role is not None and \ + int(self.role) != USER_ROLE_DEFAULT: + return True diff --git a/vilya/models/page.py b/vilya/models/page.py new file mode 100644 index 0000000..e270b17 --- /dev/null +++ b/vilya/models/page.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +import mimetypes + + +class Page(object): + + def __init__(self, project, path): + self.project = project + self.path = path + self._content = self.get_file(path) + + def get_file(self, path): + # FIXME: default branch? + blob = self.project.repo.get_file('master', path) + if blob: + return blob.data + + @property + def exist(self): + if self._content is not None: + return True + return False + + @property + def content(self): + return self._content + + @property + def content_type(self): + ct = mimetypes.guess_type(self.path) + if ct: + return ct[0] + return 'application/octet-stream' + diff --git a/vilya/models/project.py b/vilya/models/project.py index e3637d2..ca73959 100644 --- a/vilya/models/project.py +++ b/vilya/models/project.py @@ -1,104 +1,962 @@ # -*- coding: utf-8 -*- - from __future__ import absolute_import import os +import shutil +import logging +import re from datetime import datetime -from vilya.config import DOMAIN + +from vilya.config import DOMAIN, DEVELOP_MODE +from vilya.libs import gyt from vilya.libs.permdir import get_repo_root -from vilya.libs.store import OrzField, store, IntegrityError, OrzBase -from vilya.models.git.repo import ProjectRepo +from vilya.libs.text import format_md_or_rst +from vilya.libs.store import store, mc, cache, ONE_DAY, IntegrityError +from vilya.libs.props import PropsMixin +from vilya.libs.validators import check_project_name +from vilya.libs.signals import ( + repo_create_signal, repo_watch_signal, repo_fork_signal) +from vilya.models.hook import CodeDoubanHook +from vilya.models.git import GitRepo +from vilya.models.ngit.repo import ProjectRepo +from vilya.models.user import User +from vilya.models.inbox import Inbox +from vilya.models.consts import ( + PROJECT_BC_KEY, MIRROR_HTTP_PROXY, NOTIFY_ON, PERM_PUSH, PERM_ADMIN) +from vilya.models.project_conf import make_project_conf +from vilya.models.utils import linear_normalized +from vilya.models.project_issue import ProjectIssue +from vilya.models.tag import TagMixin, TAG_TYPE_PROJECT_ISSUE +from vilya.models.release import get_unreleased_commit_num +from vilya.models.lru_counter import ( + ProjectOwnLRUCounter, ProjectWatchLRUCounter) +from vilya.models.milestone import Milestone +from ellen.utils import JagareError +from vilya.models.nproject import ProjectWatcher + +MCKEY_PROJECT = 'code:project:%s:v2' +MCKEY_PROJECT_ID_BY_NAME = 'code:project_id:name:%s' +MCKEY_PROJECT_IDS_BY_OWNER_SORTBY_SUMUP = 'code:project_ids:sumup:%s' + +PROPS_LANGUAGE_KEY = 'language' +PROPS_LANGUAGES_KEY = 'languages' + + +class CodeDoubanProject(PropsMixin, TagMixin): + + def __init__(self, id, name, owner_id, summary, time, product, + git_path, trac_conf, fork_from=None, origin_project_id=None, + intern_banned=None, can_push=None, mirror_url=None, + mirror_proxy=None): + + self.id = id + self.name = name + self.owner_id = owner_id + self.summary = summary + self.time = time + self.product = product + self.git_path = git_path + self.trac_conf = trac_conf + self.fork_from = fork_from + self.can_push = can_push + self.origin_project_id = origin_project_id or self.id + self._conf = None + self.intern_banned = intern_banned + self.index_name = name.replace('/', '_') + self.mirror_url = mirror_url + self.mirror_proxy = mirror_proxy + self._repo = None + + def __repr__(self): + return '<CodeDoubanProject %s>' % self.name + + def __eq__(self, other): + return isinstance(other, CodeDoubanProject) and self.id == other.id + + def __ne__(self, other): + return not self.__eq__(other) + + def __hash__(self): + return hash(self.id) + + def __str__(self): + return self.name + + @property + def url(self): + return '/%s/' % self.name + + @property + def repo_url(self): + return "%s/%s" % (DOMAIN, self.name) + + @property + def full_url(self): + hostname = re.sub(r'http[s]?://', '', DOMAIN) + return '%s/%s' % (hostname, self.name) + + @property + def repository(self): + return '%s/%s.git' % (DOMAIN, self.name) + + @property + def ssh_repository(self): + return 'git@code.dapps.douban.com:%s.git' % self.name + + @property + def short_summary(self): + length = len(self.summary) + return self.summary if length <= 20 else self.summary + "..." + + @property + def description(self): + return self.summary + + def as_dict(self): + return self.get_info(without_commits=True) -KIND_USER = 1 -KIND_ORGANIZATION = 2 + def get_info(self, without_commits=False): + #authors = self.git.get_gitstats_data().authors + info = { + 'url': self.repo_url, + 'name': self.name, + 'description': self.summary, + 'product': self.product, + 'watched_count': self.get_watched_count(self.id), + 'committers_count': len(self.committers), + 'forked_count': self.get_forked_count(self.id), + 'open_issues_count': self.n_open_issues, + 'open_tickets_count': self.n_open_tickets, + 'owner': { + 'name': self.owner_name, + 'avatar': User(self.owner_id).avatar_url, + }, + } + forked_from = self.get_forked_from() + if forked_from: + info.update({"forked_from": forked_from.get_info(without_commits)}) + if not without_commits: + commit = self.repo.get_commit('HEAD') + if commit: + info['last_commit'] = commit.as_dict() + return info + def is_admin(self, username): + return self.has_push_perm(username) -class Project(OrzBase): - __orz_table__ = "projects" - name = OrzField(as_key=OrzField.KeyType.DESC) - description = OrzField(default='') - kind = OrzField(as_key=OrzField.KeyType.DESC, default=KIND_USER) - owner_id = OrzField(as_key=OrzField.KeyType.DESC) - creator_id = OrzField(as_key=OrzField.KeyType.DESC) - created_at = OrzField() - updated_at = OrzField() + @property + def hooks(self): + rs = store.execute( + 'select hook_id, url, project_id from codedouban_hooks ' + 'where project_id=%s', self.id) + hooks = [CodeDoubanHook(hook_id, url, project_id) + for hook_id, url, project_id in rs] + return hooks + + @property + def owner_name(self): + return self.owner_id + + @classmethod + @cache(MCKEY_PROJECT % '{id}') + def get(cls, id): + rs = store.execute( + "select project_id, project_name, owner_id, summary, " + "time, product, git_path, trac_conf, fork_from, " + "origin_project, intern_banned, can_push from codedouban_projects " + "where project_id = %s", id) + return rs and cls(*rs[0]) or None + + @classmethod + @cache(MCKEY_PROJECT_ID_BY_NAME % '{name}') + def get_id_by_name(cls, name): + rs = store.execute("select project_id from codedouban_projects " + "where project_name = _latin1%s", name) + return rs[0][0] if rs else None @classmethod def get_by_name(cls, name): - rs = cls.gets_by(name=name) - return rs[0] if rs else None + id = cls.get_id_by_name(name) + if not id: + return None + return cls.get(id) + + @classmethod + def gets_by_owner_id(cls, owner_id): + rs = store.execute("select project_id" + " from codedouban_projects" + " where owner_id = %s", owner_id) + ids = [r for r, in rs] + return [cls.get(id) for id in ids] + + @staticmethod + def count_by_owner_id(owner_id): + owner_id = owner_id.strip() + if not owner_id: + return 0 + rs = store.execute("select count(1) from codedouban_projects " + "where owner_id = %s", + owner_id) + if rs and rs[0]: + return rs[0][0] + else: + return 0 + + @classmethod + def search_by_name(cls, name, limit=None): + if check_project_name(name.strip()): + return [] + rs = store.execute("select project_id from codedouban_projects " + "where lower(project_name) like %s", + "%%%s%%" % name.lower()) + project_ids = [pid for pid, in rs] + return [cls.get(project_id) for project_id in project_ids][:limit] + + @classmethod + def search_for_owners(cls, name, limit=None): + rs = store.execute( + "select distinct(owner_id) from codedouban_projects " + "where owner_id like %s", '%' + name + '%') + return rs and [owner for owner, in rs][:limit] + + @classmethod + def gets(cls, ids): + projs = (cls.get(id) for id in ids) + return [p for p in projs if p] + + @classmethod + def get_ids(cls, owner=None, created=None): + if owner and created: + rs = store.execute( + "select project_id from codedouban_projects " + "where owner_id=%s and time>=%s", (owner, created)) + elif owner: + rs = store.execute( + "select project_id from codedouban_projects " + "where owner_id=%s", owner) + elif created: + rs = store.execute( + "select project_id from codedouban_projects " + "where time>=%s", created) + else: + rs = store.execute("select project_id from codedouban_projects") + return [pid for pid, in rs] + + PROJECTS_SORT_BYS = ['lru', 'sumup'] + + @classmethod + def get_projects(cls, owner=None, sortby=None): + if sortby and sortby not in CodeDoubanProject.PROJECTS_SORT_BYS: + return [] + + if sortby == 'lru': + ids = cls.get_ids(owner=owner) + ProjectOwnLRUCounter(owner, ids).sort() + elif sortby == 'sumup': + ids = cls.get_project_ids_sortby_sumup(owner) + else: + ids = cls.get_ids(owner=owner) + results = cls.gets(ids) + return results + + @classmethod + @cache(MCKEY_PROJECT_IDS_BY_OWNER_SORTBY_SUMUP % '{owner}', expire=ONE_DAY) + def get_project_ids_sortby_sumup(cls, owner=None): + projects = cls.gets(cls.get_ids(owner=owner)) + + FORKED_WEIGHT = 2 + UPDATED_WEIGHT = 2 + ORIGIN_WEIGHT = 4 + + forked_keys = linear_normalized( + [CodeDoubanProject.get_forked_count(repo.id) + for repo in projects]) + updated_keys = linear_normalized([_.repo.get_last_update_timestamp() + for _ in projects]) + origin_keys = [0.9 if _.id == _.origin_project_id else 0.1 + for _ in projects] + + sort_keys = {} + for i, repo in enumerate(projects): + sort_keys[repo.id] = (forked_keys[i] * FORKED_WEIGHT + + updated_keys[i] * UPDATED_WEIGHT + + origin_keys[i] * ORIGIN_WEIGHT) / \ + (FORKED_WEIGHT + UPDATED_WEIGHT + ORIGIN_WEIGHT) + projects.sort(key=lambda repo: sort_keys[repo.id], reverse=True) + return [repo.id for repo in projects] + + @classmethod + def _flush_project_ids_by_owner(cls, owner=None): + mc.delete(MCKEY_PROJECT_IDS_BY_OWNER_SORTBY_SUMUP % owner) + + @classmethod + def add_watch(cls, proj_id, user_id): + try: + ProjectWatcher.create(project_id=proj_id, + user_id=user_id) + except IntegrityError: + return None + repo_watch_signal.send( + cls.get(proj_id), project_id=proj_id, author=user_id) + + @classmethod + def get_watched_count(cls, proj_id): + return ProjectWatcher.count(project_id=proj_id) + + @classmethod + def del_watch(cls, proj_id, user_id): + w = ProjectWatcher.get(user_id=user_id, project_id=proj_id) + if w: + w.delete() + + @classmethod + def has_watched(cls, proj_id, user): + w = ProjectWatcher.get(user_id=user.name, project_id=proj_id) + return True if w else False + + @classmethod + def get_watched_projects_by_user(cls, user, sortby=None): + rs = ProjectWatcher.gets(user_id=user) + ids = [r.project_id for r in rs] + results = cls.gets(ids) + if sortby: + results.sort(key=lambda proj: + proj.repo.get_last_update_timestamp(), reverse=True) + return results + + @classmethod + def get_watched_others_ids_by_user(cls, user): + # FIXME: "in" + rs = store.execute('select project_id from codedouban_watches ' + 'where user_id=%s and project_id not in ' + '(select project_id from codedouban_projects ' + 'where owner_id=%s)', (user, user)) + ids = [proj_id for proj_id, in rs] + return ids + + @classmethod + def get_watched_others_projects_by_user(cls, user, sortby=None): + ids = cls.get_watched_others_ids_by_user(user) + + if sortby == 'lru': + ProjectWatchLRUCounter(user, ids).sort() + + results = cls.gets(ids) + return results + + def get_watch_users(self): + return [User(user_id) + for user_id in CodeDoubanProject.get_watch_user_ids(self.id)] + + def get_watch_users_by_channel(self, channel='notify'): + if channel == "notify": + return self.get_watch_users() + elif channel == "email": + return filter(lambda u: u.settings.watching_email == NOTIFY_ON, + self.get_watch_users()) + elif channel == "irc": + return filter(lambda u: u.settings.watching_irc == NOTIFY_ON, + self.get_watch_users()) + + @classmethod + def get_watch_user_ids(cls, project_id): + rs = ProjectWatcher.gets(project_id=project_id) + return [r.user_id for r in rs] + + @classmethod + def add_committer(cls, proj_id, user_id): + try: + store.execute("insert into codedouban_committers " + "(project_id, user_id) values (%s, %s)", + (proj_id, user_id)) + except IntegrityError: + return None + store.commit() + + @classmethod + def del_committer(cls, proj_id, user_id): + store.execute("delete from codedouban_committers " + "where user_id=%s and project_id=%s", (user_id, proj_id)) + store.commit() + + @classmethod + def get_committers_by_project(cls, proj_id): + rs = store.execute("select user_id from codedouban_committers " + "where project_id=%s", proj_id) + return [User(user_id) for user_id, in rs] + + def has_push_perm(self, user_id): + perm = self.get_user_perm(user_id) + if perm is None: + perm = self.get_group_perm(user_id) + if perm and perm >= PERM_PUSH: + return True + return False + + def get_user_perm(self, user_id): + if user_id == self.owner_id: + return PERM_ADMIN + committers = self.committers + if User(user_id) in committers: + return PERM_PUSH + + def get_group_perm(self, user_id): + from vilya.models.team_group import ProjectGroup + pgs = ProjectGroup.gets(project_id=self.id) + perm = None + for pg in pgs: + g = pg.group + if not g: + continue + if g.is_member(user_id): + perm = perm if perm and perm > g.permission else g.permission + return perm + + @property + def committers(self): + return CodeDoubanProject.get_committers_by_project(self.id) + + def fork(self, fork_name, fork_owner): + return CodeDoubanProject.add(fork_name, fork_owner, self.summary, + self.product, fork_from=self.id) + + def new_fork(self, owner): + name = "%s/%s" % (owner, self.realname) + project = CodeDoubanProject.add(name, + owner, + self.summary, + self.product, + fork_from=self.id) + if project: + # FIXME: why do this? + project.update(self.summary, self.product, project.name, + self.intern_banned) + return project + + @classmethod + def get_forked_count(cls, proj_id): + # TODO: update tests!! + rs = store.execute('select count(1) from codedouban_projects where ' + 'origin_project=%s and project_id!=%s', + (proj_id, proj_id)) + orig_fork_count = rs[0][0] + + rs = store.execute('select count(1) from codedouban_projects where ' + 'fork_from=%s and project_id!=%s', + (proj_id, proj_id)) + fork_count = rs[0][0] + + return orig_fork_count or fork_count + def get_forked_users(self): + rs = store.execute('select owner_id from codedouban_projects ' + 'where fork_from=%s', self.id) + return [User(user_id) for user_id, in rs] + + def get_forked_project(self, owner_id): + rs = store.execute('select project_id from codedouban_projects ' + 'where fork_from=%s and owner_id=%s', + (self.id, owner_id)) + if rs: + id = rs[0][0] + return CodeDoubanProject.get(id) + + def get_forked_projects(self): + rs = store.execute('select project_id from codedouban_projects ' + 'where fork_from=%s', self.id) + ids = [str(id) for (id,) in rs] + return CodeDoubanProject.gets(ids) + + def get_forked_from(self): + if self.fork_from: + return CodeDoubanProject.get(self.fork_from) + return None + + def get_fork_network(self): + rs = store.execute("select project_id from codedouban_projects " + "where origin_project=%s", self.origin_project_id) + ids = [pid for pid, in rs] + return CodeDoubanProject.gets(ids) + + def validate(self): + validators = [check_project_name(self.name, 'Project Name')] + errors = [error for error in validators if error] + return errors + + # why by name @classmethod - def get_by_name_and_owner(cls, name, owner_id): - rs = cls.gets_by(name=name, owner_id=owner_id) - return rs[0] if rs else None + def update(cls, summary, product, name, intern_banned=None): + project_id = cls.get_id_by_name(name) + if not project_id: + return False + store.execute( + "update codedouban_projects set summary=%s, product=%s, " + "intern_banned=%s where project_name=_latin1%s", + (summary, product, intern_banned, name)) + store.commit() + cls.clear_mc(project_id) + + def update_summary(self, summary): + store.execute("update codedouban_projects " + "set summary=%s " + "where project_id=%s", + (summary, self.id)) + store.commit() + self.clear_mc(self.id) + + def update_product(self, product): + store.execute("update codedouban_projects " + "set product=%s " + "where project_id=%s", + (product, self.id)) + store.commit() + self.clear_mc(self.id) + + def update_intern_banned(self, banned): + store.execute("update codedouban_projects " + "set intern_banned=%s " + "where project_id=%s", + (banned, self.id)) + store.commit() + self.clear_mc(self.id) + + def update_can_push(self, can_push): + push = 1 if can_push else 0 + store.execute("update codedouban_projects " + "set can_push=%s " + "where project_id=%s", + (push, self.id)) + store.commit() + self.clear_mc(self.id) @classmethod - def add(cls, **kw): - now = datetime.now() - kw['created_at'] = now - kw['updated_at'] = now - p = None + def add(cls, name, owner_id, summary='', product=None, fork_from=None, + create_trac=False, intern_banned=None, mirror=None): + # TODO: add project blacklist + assert ' ' not in name, "Cannot create a project with spacey name" + git_path = "%s.git" % name + try: - p = cls.create(**kw) + proj_id = store.execute( + "insert into codedouban_projects " + "(project_name, owner_id, summary, time, product, " + "git_path, trac_conf, fork_from, intern_banned) values " + "(%s, %s, %s, %s, %s, %s, %s, %s, %s)", + (name, owner_id, summary, datetime.now(), + product, git_path, name, fork_from, intern_banned)) except IntegrityError: - store.rollback() + raise + return None + + if fork_from is not None: + origins = store.execute("select origin_project from " + "codedouban_projects " + "where project_id=%s", fork_from) + origin_id, = origins[0] + else: + origin_id = proj_id + store.execute("update codedouban_projects set origin_project=%s " + "where project_id=%s", (origin_id, proj_id)) + store.commit() + cls.clear_mc(proj_id) + + project = cls.get(proj_id) + # TODO: split create_repo, fork_repo, mirror_repo + # create git repo + if fork_from: + orig_proj = cls.get(fork_from) + orig_proj.fork_repo(project) + elif mirror: + from queues_handler import mirror_projects_add + mirror_projects_add(mirror, git_path, proj_id) + else: + project.create_repo() + + if not mirror: + project.update_hooks() + + cls._flush_project_ids_by_owner(owner_id) + if fork_from: + repo_fork_signal.send( + project, project_id=proj_id, author=owner_id) else: - p.init_repo() - return p + repo_create_signal.send( + project, project_id=proj_id, creator=owner_id) + return project - ## git wrap + # FIXME: clean property about git + # all git things @property - def repo_http_url(self): - # FIXME: use project name - return "%s%s.git" % (DOMAIN, self.repo_name) + def git(self): + return GitRepo(self.git_real_path, project=self) @property - def repo_path(self): - return os.path.join(get_repo_root(), - '%s.git' % self.id) + def repo(self): + if not self._repo: + self._repo = ProjectRepo(self) + return self._repo @property - def repo_name(self): - owner_name = self.owner_name - if owner_name: - return '%s/%s' % (owner_name, self.name) - return "%s" % self.id + def default_branch(self): + return self.repo.default_branch @property - def owner_name(self): - from vilya.models.user import User - from vilya.models.organization import Organization - if self.kind == KIND_USER: - user = User.get_by(id=self.owner_id) - return user.name + def default_sha(self): + return self.repo.sha(self.default_branch) + + def update_hooks(self): + hook_dir = os.path.join(self.repo_path, + 'hooks') + link = False if DEVELOP_MODE else True + gyt.update_hook(hook_dir, link) + + # TODO: remove this + @classmethod + def create_git_repo(cls, git_path): + git_path = os.path.join(get_repo_root(), git_path) + #check_call(['git', 'init', '--bare', git_path]) + gyt.repo(git_path, init=True) + + # TODO: remove this + def clone_git(self, to_path): + git_path = os.path.join(self.repo_root_path, self.git_path) + to_path = os.path.join(self.repo_root_path, to_path) + rep = gyt.repo(git_path) + rep.clone(to_path) + + # TODO: 统一git路径 + @property + def git_dir(self): + git_path = os.path.join(self.repo_root_path, self.git_path) + return git_path + + # TODO: 统一git路径 + # FIXME: remove this, please use project.repo_path + @property + def git_real_path(self): + return os.path.join(self.repo_root_path, '%s.git' % self.name) + # end git things + + @property + def conf(self): + if not self._conf: + self._conf = make_project_conf(self.name, self.repo) + return self._conf + + def get_onimaru_url(self, id, project=None): + if self.conf is None: + return None + domain = 'http://onimaru.intra.douban.com' + if project is None: + # example: + # onimaru: /subject/movie + project = self._conf.get('onimaru', '') + if not project: + return None + project = project.strip() + if not project.startswith('/'): + project = '/' + project + return '{0}{1}/group/{2}/'.format(domain, project, id) + + @property + def redirect_url(self): + return "%s/%s/" % (DOMAIN, "hub") + + @property + def realname(self): + return self.name.rpartition("/")[-1] + + def put_in_wsgi_environ(self, environ): + environ['hub.project'] = self + + @classmethod + def get_from_wsgi_environ(cls, environ): + return environ.get('hub.project') + + @property + def owner(self): + return User(self.owner_id) + + def is_owner(self, user): + return user and user.name == self.owner.name + + @property + def forked(self): + if self.fork_from: + return CodeDoubanProject.get(self.fork_from) + + def delete(self): + from vilya.models.nteam import TeamProjectRelationship + shutil.rmtree(self.git_real_path, ignore_errors=True) + for hook in self.hooks: + hook.destroy() + ProjectWatcher.deletes(project_id=self.id) + store.execute("delete from codedouban_projects " + "where project_id=%s", (self.id,)) + store.commit() + self.clear_mc(self.id) + + CodeDoubanProject._flush_project_ids_by_owner(self.owner_id) + rs = TeamProjectRelationship.gets(project_id=self.id) + for r in rs: + r.delete() + + def get_actions(self): + user = PROJECT_BC_KEY % (self.owner_id, self.name) + return Inbox.get(user=user).get_actions() + + @classmethod + def exists(cls, name): + return bool(cls.get_id_by_name(name)) + + def transfer_to(self, user): + sql = ("update codedouban_projects " + "set owner_id=%s where owner_id=%s and project_id=%s") + store.execute(sql, (user, self.owner_id, self.id)) + store.commit() + self.clear_mc(self.id) + + def transfer_to_top(self, user=None): + new_user = user if user else self.owner_id + sql = ("update codedouban_projects set project_name=%s, " + "git_path=%s, trac_conf=%s, owner_id=%s " + "where owner_id=%s and project_id=%s") + store.execute(sql, (self.realname, self.realname, self.realname, + new_user, self.owner_id, self.id)) + store.commit() + self.clear_mc(self.id) + + def rename(self, repo_name): + sql = ("update codedouban_projects set project_name=%s, " + "git_path=%s where owner_id=%s and project_id=%s") + if check_project_name(repo_name): + return False + if '/' in self.name: + project_name = "%s/%s" % (self.owner_id, repo_name) + else: + project_name = repo_name + git_path = "%s.git" % project_name + store.execute(sql, (project_name, git_path, self.owner_id, self.id)) + if self._move(git_path): + self.git_path = git_path + self.name = project_name + store.commit() else: - org = Organization.get_by(id=self.owner_id) - return org.name + return False - # repository + def _move(self, git_path): + base_path = self.repo_root_path + new_path = os.path.join(base_path, git_path) + if os.path.exists(git_path): + return False + else: + shutil.move(self.git_dir, new_path) + return True - def init_repo(self): - from vilya.config import HOOKS_DIR - repo = ProjectRepo.init(self.repo_path) - repo.update_hooks(HOOKS_DIR) - return repo + @property + def n_open_issues(self): + return ProjectIssue.get_count_by_project_id(self.id, "open") @property - def repo(self): - return ProjectRepo(self) + def n_open_tickets(self): + from vilya.models.ticket import Ticket + return Ticket.get_count_by_proj(self.id) @property - def repo_tree(self): - path = '' - ref = 'HEAD' - tree = self.repo.get_tree(ref, path=path) - return tree + def n_closed_issues(self): + return ProjectIssue.get_count_by_project_id(self.id, "closed") - def as_dict(self): - d = dict(id=self.id, - name=self.name, - full_name=self.repo_name, - description=self.description, - owner_name=self.owner_name, - owner_id=self.owner_id) - return d + def get_uuid(self): + return "/project/%s" % self.id + + @property + def language(self): + return self.get_props_item(PROPS_LANGUAGE_KEY, '') + + @language.setter + def language(self, value): + self.set_props_item(PROPS_LANGUAGE_KEY, value) + + @property + def languages(self): + return self.get_props_item(PROPS_LANGUAGES_KEY, {}) + + @languages.setter + def languages(self, value): + self.set_props_item(PROPS_LANGUAGES_KEY, value) + + def doc_tabs(self): + try: + doc_tabs = [] + if self.conf['docs']: + sorted_docs = [] + for k, v in self.conf['docs'].items(): + if not isinstance(v, dict): + sorted_docs.append((k, k, k, k)) + else: + sorted_docs.append((v.get('sort', k), k, + v.get('name', k), + v.get('dir', k))) + sorted_docs.sort() + sorted_docs = [(_[1], _[2], _[3]) for _ in sorted_docs] + for doc, name, s_path in sorted_docs: + doc_tabs.append((doc, '/docs/%s' % doc, name, s_path)) + except Exception, err: + logging.warning("Error in config: %r" % err) + return [('', '', '#ERROR_IN_CONFIG!')] + return doc_tabs + + @property + def tag_type(self): + return TAG_TYPE_PROJECT_ISSUE + + # FIXME: remove this, please use project.mirror + @property + def is_mirror_project(self): + from vilya.models.mirror import CodeDoubanMirror + return CodeDoubanMirror.get_by_project_id(self.id) is not None + + @property + def unreleased_commit_num(self): + return get_unreleased_commit_num(self) + + @property + def mirror(self): + from vilya.models.mirror import CodeDoubanMirror + mirror = CodeDoubanMirror.get_by_project_id(self.id) + return mirror if mirror else None + + def fetch(self): + mirror = self.mirror + env = {} + if mirror and mirror.with_proxy: + env['HTTP_PROXY'] = MIRROR_HTTP_PROXY + env['HTTPS_PROXY'] = MIRROR_HTTP_PROXY + return self.repo.fetch_(q=True, env=env) + + @property + def repo_path(self): + return os.path.join(get_repo_root(), '%s.git' % self.name) + + def fork_repo(self, project): + self.repo.clone(project.repo_path, bare=True) + + # TODO: use project instead of url + def mirror_repo(self, url, bare=None, proxy=None): + env = None + if proxy: + env = { + 'HTTP_PROXY': MIRROR_HTTP_PROXY, + 'HTTPS_PROXY': MIRROR_HTTP_PROXY + } + ProjectRepo.mirror(url, self.repo_path, env=env) + + def create_repo(self): + ProjectRepo.init(self.repo_path) + + @property + def readme(self): + # TODO: remove tree loop + ref = self.default_branch + repo = self.repo + try: + tree = repo.get_tree(ref) + except JagareError as e: + logging.warning("JagareError: %r" % e) + return '' + for item in tree: + if (item['type'] == 'blob' + and (item['name'] == 'README' + or item['name'].startswith('README.'))): + readme_content = repo.get_file_by_ref("%s:%s" % ( + ref, item['path'])) + return format_md_or_rst(item['path'], readme_content) + return '' + + @property + def issue_milestones(self): + rs = Milestone.gets_by_project(self) + return rs + + @property + def repo_root_path(self): + return get_repo_root() + + @property + def open_parent_pulls(self): + from vilya.models.ticket import Ticket + from vilya.models.pull import PullRequest + pulls = [] + parent = self.get_forked_from() + if parent: + pulls = [PullRequest.get_by_proj_and_ticket(parent.id, + t.ticket_id) + for t in Ticket.gets_by_proj(parent.id, + limit=9999)] + pulls = [p for p in pulls + if p and p.from_proj and p.from_proj.id == self.id] + return pulls + + @property + def open_family_pulls(self): + return self.open_parent_pulls + self.open_pulls + + @property + def open_network_pulls(self): + from vilya.models.ticket import Ticket + from vilya.models.pull import PullRequest + pulls = [] + projects = self.get_fork_network() + for project in projects: + ps = [PullRequest.get_by_proj_and_ticket(project.id, + t.ticket_id) + for t in Ticket.gets_by_proj(project.id, + limit=9999)] + pulls.extend([p for p in ps + if p and p.from_proj and p.from_proj.id == self.id]) + return pulls + self.open_pulls + + @property + def open_pulls(self): + from vilya.models.ticket import Ticket + from vilya.models.pull import PullRequest + pulls = [PullRequest.get_by_proj_and_ticket(self.id, + t.ticket_id) + for t in Ticket.gets_by_proj(self.id, + limit=9999)] + return pulls + + def get_pulls_by_commit_shas(self, sha): + prs = self.open_pulls + return [pr for pr in prs + if sha in pr.get_commits_shas()] + + @property + def groups(self): + from vilya.models.team_group import ProjectGroup + rs = ProjectGroup.gets(project_id=self.id) + return [r.group for r in rs] + + @property + def remote_name(self): + remote_name = 'hub/' + self.name + remote_name = remote_name.replace('~', '_') + return remote_name + + @classmethod + def clear_mc(cls, id_): + project = cls.get(id_) + if project: + mc.delete(MCKEY_PROJECT_ID_BY_NAME % project.name) + mc.delete(MCKEY_PROJECT % id_) + + @classmethod + def clear_pull(cls, name, pull_id): + project = cls.get_by_name(name) + if not project: + return None + from vilya.models.pull import PullRequest + pull = PullRequest.gets_by(to_project=project.id, ticket_id=pull_id, + force_flush=True) + if pull: + return True + return None diff --git a/vilya/models/project_conf.py b/vilya/models/project_conf.py new file mode 100644 index 0000000..ad5508f --- /dev/null +++ b/vilya/models/project_conf.py @@ -0,0 +1,80 @@ +# -*- coding: utf-8 -*- +import logging +import yaml + +logger = logging.getLogger(__name__) +warn = logger.warn + +DEFAULT_PROJECT_CONF = 'default_code_config.yaml' +PROJECT_CONF_FILE = 'code_config.yaml' + + +def _get_default_project_conf(): + with open(DEFAULT_PROJECT_CONF, 'r') as default_conf_file: + default_conf_stream = default_conf_file.read() + default_conf = yaml.load(default_conf_stream) + return default_conf + + +class CodeConf(object): + + def __init__(self, project): + self.project = project + self._config = None + + @property + def builders(self): + return get_project_builders(self.project) + + @property + def exists(self): + repo = self.project.repo + blob = repo.get_file('HEAD', PROJECT_CONF_FILE) + if blob: + return True + + @property + def as_dict(self): + if not self._config: + project = self.project + self._config = make_project_conf(project.name, project.repo) + return self._config + + +def make_project_conf(project_name, repo): + DEFAULT_PROJECT_CONF_CACHE = _get_default_project_conf() + assert isinstance(DEFAULT_PROJECT_CONF_CACHE, dict), \ + "default conf needs to be a dict" + default_conf = {} + default_conf.update(DEFAULT_PROJECT_CONF_CACHE) + + blob = repo.get_file('HEAD', PROJECT_CONF_FILE) + conf_stream = blob.data if blob else '' + try: + conf = yaml.load(conf_stream) + except yaml.error.YAMLError, err: + raise Exception("Project config yaml has an error: %s" % err) + conf = conf if conf else {} + assert isinstance(conf, dict), \ + "project conf YAML stream must be a dict: %s" % conf_stream + + return _merge_conf_into_default_conf(project_name, conf, default_conf) + + +def _merge_conf_into_default_conf(project_name, conf, default_conf): + for key in conf: + if key not in default_conf: + warn("%s Configuration key rejected: %s, maybe add it to %s" % + (project_name, key, DEFAULT_PROJECT_CONF)) + continue + default_conf[key] = conf[key] + return default_conf + + +def get_project_builders(project): + if not project.conf: + return [] + blds = [(v.get('sort'), k) for k, v in project.conf['docs'].items()] + blds = sorted(blds) + blds = [_[1] for _ in blds] + return blds diff --git a/vilya/models/project_issue.py b/vilya/models/project_issue.py new file mode 100644 index 0000000..a0f1a19 --- /dev/null +++ b/vilya/models/project_issue.py @@ -0,0 +1,519 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import + +from vilya.libs.store import store, mc, cache +from vilya.models.issue import ( + Issue, get_issue_by_id_and_state, + filter_issue_ids_by_score, filter_issue_ids_by_state) +from vilya.models.tag import TAG_TYPE_PROJECT_ISSUE +from vilya.models.issue_milestone import IssueMilestone +from vilya.config import DOMAIN +from vilya.models.issue import MC_KEY_ISSUES_DATA_BY_TARGET + +MC_KEY_PROJECT_ISSUE_N = 'project_issue:v3:%s:%s:n' +MC_KEY_PROJECT_ISSUE_CREATOR_N = 'project_issue:v3:%s:%s:creator:%s:n' +MC_KEY_PROJECT_ISSUE_ASSIGNEE_N = 'project_issue:v3:%s:%s:assignee:%s:n' + + +class PICounter(object): + """Project Issue Counter""" + + @classmethod + def incr(cls, proj_id, count=None): + if count >= 0: + sql = ("insert into poject_issue_counters (project_id, counter) " + "values (%s, LAST_INSERT_ID(%s)) on duplicate key " + "update counter = LAST_INSERT_ID(%s)") + id = store.execute(sql, (proj_id, count, count)) + else: + sql = ("insert into project_issue_counters (project_id, counter) " + "values (%s, LAST_INSERT_ID(%s)) on duplicate key " + "update counter = LAST_INSERT_ID(counter + 1)") + id = store.execute(sql, (proj_id, 1)) + store.commit() + return id + + +class ProjectIssue(Issue): + target_type = 'project' + tag_type = TAG_TYPE_PROJECT_ISSUE + provided_features = ['project-issue', 'vote', 'milestone'] + + def __init__(self, id, project_id, issue_id, number, title=None, + creator=None, assignee=None, closer=None, + created_at=None, updated_at=None, closed_at=None, type=''): + Issue.__init__( + self, issue_id, title, creator, assignee, closer, created_at, + updated_at, closed_at, type=type, target_id=project_id) + self.id = id + self.project_id = project_id + self.issue_id = issue_id + self.number = number + + def __repr__(self): + return '<ProjectIssue(id=%s, prj=%s, number=%s)>' % ( + self.issue_id, self.project_id, self.number) + + @property + def url(self): + return '%sissues/%s/' % (self.target.url, self.number) + + def open(self): + Issue.open(self) + self.clear_cache() + mc.delete(MC_KEY_PROJECT_ISSUE_N % (self.project_id, 'open')) + + def close(self, user_id): + Issue.close(self, user_id) + self.clear_cache() + mc.delete(MC_KEY_PROJECT_ISSUE_N % (self.project_id, 'closed')) + + def assign(self, user_id): + Issue.assign(self, user_id) + self.clear_cache() + mc.delete(MC_KEY_PROJECT_ISSUE_ASSIGNEE_N % ( + self.project_id, user_id, 'open')) + mc.delete(MC_KEY_PROJECT_ISSUE_ASSIGNEE_N % ( + self.project_id, user_id, 'closed')) + + @classmethod + def add(cls, title, description, creator, number=None, + team=None, project=None, assignee=None, closer=None, + created_at=None, updated_at=None, closed_at=None): + issue = Issue.add(title, description, creator, + assignee=assignee, closer=closer, + type=cls.target_type, target_id=project) + if issue and project: + number = PICounter.incr(project, number) + store.execute( + 'insert into project_issues (project_id, issue_id, number) ' + 'values (%s, %s, %s) ', + (project, issue.id, number)) + store.commit() + mc.delete(MC_KEY_PROJECT_ISSUE_CREATOR_N % ( + project, creator, 'open')) + mc.delete(MC_KEY_PROJECT_ISSUE_CREATOR_N % ( + project, creator, 'closed')) + cls._clean_cache(project) + return Issue.get_cached_issue(issue.id) + + @property + def target(self): + from vilya.models.project import CodeDoubanProject + return CodeDoubanProject.get(self.project_id) + + @property + def proj_name(self): + from vilya.models.project import CodeDoubanProject + return CodeDoubanProject.get(self.project_id).name + + def _tags_as_dict(self): + tags = self.tags + tag_names = [] + for t in tags: + tag_names.append(t.name) + return tag_names + + def _participants_as_dict(self): + participants = self.participants + participant_names = [] + for p in participants: + participant_names.append(p.name) + return participant_names + + def as_dict(self): + d = {} + project_name = self.target.__str__() + d['url'] = "%s/api/%s/issues/%s" % ( + DOMAIN, project_name, self.number) + d['html_url'] = "%s/%s/issues/%s/" % ( + DOMAIN, project_name, self.number) + d['issue_id'] = self.issue_id + d['number'] = self.number + # 'self' does not contain informations like title, desc, etc. + issue = self.get_by_issue_id(self.issue_id) + d['title'] = issue.title + d['project_id'] = self.target.id + d['description'] = issue.description + d['project'] = self.proj_name + d['creator'] = issue.creator_id + d['type'] = issue.type + d['state'] = issue.state + d['comments'] = self.comment_count + d['state'] = issue.state + participants = self._participants_as_dict() + if participants: + d['participants'] = participants + tags = self._tags_as_dict() + if tags: + d['tags'] = tags + if issue.assignee_id: + d['assignee'] = issue.assignee_id + if issue.closer_id: + d['closer'] = issue.closer_id + if issue.created_at: + d['created_at'] = issue.created_at.strftime('%Y-%m-%dT%H:%M:%S') + if issue.updated_at: + d['updated_at'] = issue.updated_at.strftime('%Y-%m-%dT%H:%M:%S') + if issue.closed_at: + d['closed_at'] = issue.closed_at.strftime('%Y-%m-%dT%H:%M:%S') + return d + + @classmethod + def get(cls, project_id, issue_id=None, number=None): + sql = ("select id, project_id, issue_id, number from project_issues " + "where project_id = %s ") + params = [project_id] + if issue_id: + sql = sql + "and issue_id = %s " + params.append(issue_id) + if number: + sql = sql + "and number = %s " + params.append(number) + rs = store.execute(sql, tuple(params)) + if rs and rs[0]: + return cls(*rs[0]) + + @classmethod + def get_by_issue_id(cls, issue_id): + sql = ("select id, project_id, issue_id, number from project_issues " + "where issue_id = %s ") + rs = store.execute(sql, (issue_id,)) + if rs and rs[0]: + id, project_id, issue_id, number = rs[0] + issue = Issue.get(issue_id) + if issue: + return cls( + id, project_id, issue.id, number, issue.title, + issue.creator_id, issue.assignee_id, issue.closer_id, + issue.created_at, issue.updated_at, issue.closed_at, + issue.type) + + def delete_issue(self): + issue = Issue.get(self.issue_id) + issue.delete() + + @classmethod + def get_by_proj_name_and_number(cls, proj_name, number): + from vilya.models.project import CodeDoubanProject + project = CodeDoubanProject.get_by_name(proj_name) + project_issue = cls.get(project.id, number=number) + issue_id = project_issue.issue_id + return Issue.get_cached_issue(issue_id) + + @classmethod + def _gets_by_issue_ids(cls, issue_ids, state): + project_issues = [] + for issue_id in issue_ids: + project_issue = get_issue_by_id_and_state(issue_id, state) + if project_issue: + project_issues.append(project_issue) + project_issues.sort(key=lambda x: x.updated_at, reverse=True) + return project_issues + + @classmethod + def gets_by_issue_ids(cls, issue_ids, state=None, limit=20, start=0): + project_issues = cls._gets_by_issue_ids(issue_ids, state) + return project_issues[start:start + limit] + + @classmethod + def get_n_by_issue_ids(cls, issue_ids, state=None): + if not state: + return len(issue_ids) + else: + issues = Issue.get_cached_issues(issue_ids) + open_issues = [issue for issue in issues + if issue and not issue.is_closed] + close_issues = [issue for issue in issues + if issue and issue.is_closed] + if state == "open": + return len(open_issues) + else: + return len(close_issues) + + @classmethod + def _gets_by_issue_ids_and_people_id(cls, issue_ids, people_id, + people_attr, state=None): + project_issues = cls._gets_by_issue_ids(issue_ids, state) + project_issues = [x for x in project_issues + if getattr(x, people_attr) == people_id] + return project_issues + + @classmethod + def gets_and_n_by_issue_ids_and_people(cls, issue_ids, people_id=None, + people_attr=None, state=None, + limit=25, start=0): + ''' get issues and count by issue ids and people(creator/assignee) ''' + if people_id and people_attr: + project_issues = cls._gets_by_issue_ids_and_people_id( + issue_ids, people_id, people_attr, state) + else: + project_issues = cls._gets_by_issue_ids(issue_ids, state) + return project_issues[start:start + limit], len(project_issues) + + @classmethod + def gets_by_issue_ids_and_creator_id(cls, issue_ids, state, creator_id, + limit=20, start=0): + project_issues = cls._gets_by_issue_ids(issue_ids, state) + project_issues = filter( + lambda x: x.creator_id == creator_id, project_issues) + return project_issues[start:start + limit] + + @classmethod + def get_n_by_issue_ids_and_creator_id(cls, issue_ids, state, creator_id): + project_issues = cls._gets_by_issue_ids(issue_ids, state) + project_issues = filter( + lambda x: x.creator_id == creator_id, project_issues) + return len(project_issues) + + @classmethod + def gets_by_issue_ids_and_assignee_id(cls, issue_ids, state, assignee_id, + limit=20, start=0): + project_issues = cls._gets_by_issue_ids(issue_ids, state) + project_issues = filter( + lambda x: x.assignee_id == assignee_id, project_issues) + return project_issues[start:start + limit] + + @classmethod + def get_n_by_issue_ids_and_assignee_id(cls, issue_ids, state, assignee_id): + project_issues = cls._gets_by_issue_ids(issue_ids, state) + project_issues = filter( + lambda x: x.assignee_id == assignee_id, project_issues) + return len(project_issues) + + @classmethod + def get_count_by_project_id(cls, id, state=None): + data = cls.get_data_by_target(id) + if not state: + return len(data) + + if state == "open": + return len([i for (i, closer, _, _) in data if closer is None]) + else: + return len([i for (i, closer, _, _) in data if closer is not None]) + + @classmethod + def _clean_cache(cls, id): + # FIXME: update cache + mc.delete(MC_KEY_PROJECT_ISSUE_N % (id, 'closed')) + mc.delete(MC_KEY_PROJECT_ISSUE_N % (id, 'open')) + + def delete(self): + issue = self.get_by_issue_id(self.issue_id) + user_id = issue.assignee_id + creator = issue.creator_id + store.execute("delete from project_issues where id=%s", (self.id,)) + store.commit() + mc.delete(MC_KEY_PROJECT_ISSUE_CREATOR_N % ( + self.project_id, creator, 'open')) + mc.delete(MC_KEY_PROJECT_ISSUE_CREATOR_N % ( + self.project_id, creator, 'closed')) + mc.delete(MC_KEY_PROJECT_ISSUE_ASSIGNEE_N % ( + self.project_id, user_id, 'open')) + mc.delete(MC_KEY_PROJECT_ISSUE_ASSIGNEE_N % ( + self.project_id, user_id, 'closed')) + mc.delete(MC_KEY_ISSUES_DATA_BY_TARGET % ( + self.target_type, self.project_id)) + self.delete_issue() + self._clean_cache(id) + + @classmethod + def _gets_by_project_id(cls, id, order='', state=None): + '''get project issues by project id with order.''' + + data = cls.get_data_by_target(id) + + data = filter_issue_ids_by_state(data, state) + data = filter_issue_ids_by_score(data, order) + + rs = [(id, issue_id) for (issue_id, closer, updated_at, rank_score) + in data] + + return rs + + @classmethod + def _get_ids_by_project_id(cls, id, order='', state=None): + data = cls.get_data_by_target(id) + + data = filter_issue_ids_by_state(data, state) + if order: + data = filter_issue_ids_by_score(data, order) + return [issue_id for (issue_id, _, _, _) in data] + + @classmethod + def _get_issues_by_project_id(cls, id, state=None): + '''get project issues by project id with order and issue state.''' + ids = cls._get_ids_by_project_id(id, state=state) + return Issue.get_cached_issues(ids) + + @classmethod + def gets_by_project_id(cls, id, state=None, limit=25, start=0, order=''): + '''get project issues by project id with order, issues state and + limits. + ''' + # TODO delete this method + return cls.gets_by_target(id, state=state, order=order, + limit=limit, start=start) + + @classmethod + def get_count_by_project_ids(cls, ids, state=None): + project_issues = [] + for id in ids: + project_issues.extend(cls._get_ids_by_project_id(id, state=state)) + return len(project_issues) + + @classmethod + def gets_by_project_ids(cls, project_ids, state=None, limit=25, start=0): + data = [] + for id in project_ids: + data.extend(cls.get_data_by_target(id)) + + data = filter_issue_ids_by_state(data, state) + data = filter_issue_ids_by_score(data, 'updated_at') + data = data[start:start + limit] + ids = [issue_id for (issue_id, _, _, _) in data] + return Issue.get_cached_issues(ids) + + @classmethod + def _gets_by_people_id(cls, project, people_id, state, type): + ids = cls._get_ids_by_project_id(project, order='updated_at', + state=state) + issues = Issue.get_cached_issues(ids) + issues = [issue for issue in issues + if getattr(issue, type) == people_id] + return issues + + @classmethod + def gets_and_n_by_people(cls, project_id, people_id=None, + people_attr=None, state=None, limit=25, + start=0, order=''): + ''' get issues and count by project_id and people(creator/assignee) ''' + if people_id and people_attr: + project_issues = cls._gets_by_people_id(project_id, people_id, + state, people_attr) + return project_issues[start:start + limit], len(project_issues) + else: + # FIXME: + project_issues = cls.gets_by_project_id(project_id, state, limit, + start, order) + return project_issues, cls.get_count_by_project_id( + project_id, state) + + @classmethod + @cache(MC_KEY_PROJECT_ISSUE_ASSIGNEE_N % ('{id}', '{assignee}', '{state}')) + def get_count_by_assignee_id(cls, id, assignee, state=None): + return len(cls._gets_by_people_id(id, assignee, state, 'assignee_id')) + + @classmethod + def gets_by_assignee_id(cls, project, assignee, state=None, limit=25, + start=0): + project_issues = cls._gets_by_people_id( + project, assignee, state, 'assignee_id') + return project_issues[start:start + limit] + + @classmethod + @cache(MC_KEY_PROJECT_ISSUE_CREATOR_N % ('{id}', '{creator}', '{state}')) + def get_count_by_creator_id(cls, id, creator, state=None): + return len(cls._gets_by_people_id(id, creator, state, 'creator_id')) + + @classmethod + def gets_by_creator_id(cls, project, creator, state=None, limit=25, + start=0): + project_issues = cls._gets_by_people_id( + project, creator, state, 'creator_id') + return project_issues[start:start + limit] + + @property + @cache(MC_KEY_PROJECT_ISSUE_N % ('{self.project_id}', 'open')) + def n_open_issues(self): + return self.get_count_by_project_id(self.project_id, "open") + + @property + @cache(MC_KEY_PROJECT_ISSUE_N % ('{self.project_id}', 'closed')) + def n_closed_issues(self): + return self.get_count_by_project_id(self.project_id, "closed") + + @property + def has_milestone(self): + rs = IssueMilestone.gets_by(issue_id=self.issue_id) + return True if rs else None + + @property + def milestone_id(self): + rs = IssueMilestone.gets_by(issue_id=self.issue_id) + return rs[0].milestone_id if rs else None + + @property + def milestone_name(self): + from vilya.models.milestone import Milestone + m_id = self.milestone_id + m = Milestone.get_by(m_id) if m_id else None + return m.name if m else '' + + @property + def milestone_percentage(self): + from vilya.models.milestone import Milestone + m_id = self.milestone_id + m = Milestone.get_by(m_id) if m_id else None + return m.percentage if m else 0 + + def add_milestone(self, user, name=None, milestone_id=None): + from vilya.models.milestone import Milestone + target = self.target + if name: + ms = Milestone.get_by_project(target, name=name) + if not ms: + ms = Milestone.create_by_project(self.target, name, user) + elif milestone_id: + ms = Milestone.get_by(milestone_id) + else: + return None + ims = IssueMilestone.get_by_issue(self) + if ims: + ims.milestone_id = ms.id + ims.save() + else: + ims = IssueMilestone.create_by_issue(self, ms, user) + + def remove_milestone(self): + ims = IssueMilestone.get_by_issue(self) + if ims: + ims.delete() + + @classmethod + def get_multi_by(cls, *a, **kw): + """ A wrapper to get project issues """ + # args + issue_ids = kw.get('issue_ids') + project = kw.get('project') + creator = kw.get('creator') + assignee = kw.get('assignee') + state = kw.get('state') + start = kw.get('start') + limit = kw.get('limit') + milestone = kw.get('milestone') + tags = kw.get('tags') + order = kw.get('order') + ids = None + + # get ids + issue_ids = cls._get_ids_by_project_id( + project.id, order=order, + state=state) if not issue_ids else issue_ids + if milestone: + ids = set(issue_ids) & set(milestone.issue_ids) + if tags: + ids = set(issue_ids) if not ids else ids + for tag in tags: + ids = ids & set(tag.project_issue_ids) + if ids is not None: + issue_ids = filter(lambda x: x in ids, issue_ids) + issues = Issue.get_cached_issues(issue_ids) + + # filter + if assignee: + issues = filter(lambda x: x.assignee_id == assignee.name, issues) + if creator: + issues = filter(lambda x: x.creator_id == creator.name, issues) + return dict(issues=issues[start:start + limit], total=len(issues)) diff --git a/vilya/models/pull.py b/vilya/models/pull.py new file mode 100644 index 0000000..e614ef1 --- /dev/null +++ b/vilya/models/pull.py @@ -0,0 +1,213 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +import logging +logging.getLogger().setLevel(logging.DEBUG) + +from vilya.libs.mlock import MLock +from vilya.models.project import CodeDoubanProject +from vilya.models.ticket import Ticket +from vilya.models.lru_counter import ( + ProjectOwnLRUCounter, ProjectWatchLRUCounter) +from vilya.models.npull import Pull2 + +# mc keys, ('{self.id}', '{self.from_sha}', '{self.to_sha}') +MC_KEY_PULL_MERGE_BASE = 'PullRequest:%s:%s:%s:merge_base' +MC_KEY_PULL_IS_MERGABLE = 'PullRequest:%s:%s:%s:is_auto_mergable' +MC_KEY_PULL_ID_BY_PID_AND_TID = 'PullRequest:%s:%s:pull_id' + +PullRequest = Pull2 + + +def add_pull(ticket, pullreq, user): + from dispatches import dispatch + from vilya.libs.text import get_mentions_from_text + from vilya.libs.signals import pullrequest_signal + from vilya.models.user import get_author_by_email + from vilya.models.user import User + from vilya.models.trello.core import process_trello_notify + + reporter = user.username + commits = pullreq.commits + # TODO: refactory is! auto number how to? + shas = [p.sha for p in commits] + ticket_len = Ticket.get_count_by_proj_id(ticket.project_id) + if ticket_len == 0: + # 检查是否创建过新PR,若未创建过则以旧PR号为基准累加 + max_ticket_id = PullRequest.get_max_ticket_id(ticket.project_id) + if max_ticket_id >= 0: + ticket = Ticket.add(ticket.project_id, + ticket.title, + ticket.description, + ticket.author, + max_ticket_id + 1) + else: + ticket = Ticket.add(ticket.project_id, + ticket.title, + ticket.description, + ticket.author) + else: + ticket = Ticket.add(ticket.project_id, + ticket.title, + ticket.description, + ticket.author) + pullreq = pullreq.insert(ticket.ticket_number) + + if shas: + ticket.add_commits(','.join(shas), reporter) + noti_receivers = [committer.name + for committer in CodeDoubanProject.get_committers_by_project(pullreq.to_proj.id)] # noqa + noti_receivers = noti_receivers + [pullreq.to_proj.owner.name] + get_commit_author = lambda u: get_author_by_email(u.email.encode('utf-8')) + commit_authors = {get_commit_author(c.author) for c in commits} + commit_authors = {a for a in commit_authors if a} + noti_receivers.extend(commit_authors) + + # diffs, author_by_file, authors = pullreq.get_diffs(with_blame=True) + # FIXME: diffs没用到? + # diffs = pullreq.get_diffs() + + # blame代码变更的原作者, 也加到at users + at_users = get_mentions_from_text(ticket.description) + # at_users.extend(authors) + at_users.append(pullreq.to_proj.owner_id) + at_users = set(at_users) + + # FIXME: invited_users is used on page /hub/my_pull_requests/ + invited_users = [User(u).add_invited_pull_request(ticket.id) + for u in at_users] + + ProjectOwnLRUCounter(user.username).use(pullreq.to_proj.id) + ProjectWatchLRUCounter(user.username).use(pullreq.to_proj.id) + + # TODO: 重构Feed之后取消这个信号的发送 + pullrequest_signal.send(user.username, + extra_receivers=noti_receivers, + pullreq=pullreq, + comment=ticket.description, + ticket_id=ticket.ticket_id, + ticket=ticket, + status="unmerge", + new_version=True) + + dispatch('pullreq', + data=dict(sender=user.username, + content=ticket.description, + ticket=ticket, + status='unmerge', + new_version=True, + extra_receivers=noti_receivers)) + + dispatch('pr_actions', + data=dict(type='pr_opened', + hooks=pullreq.to_proj.hooks, + author=user, + title=ticket.title, + body=ticket.description, + ticket=ticket, + pullreq=pullreq)) + + # FIXME: move to dispatch + process_trello_notify(user, ticket) + return pullreq + + +# TODO: user merge_pull_before() and merge_pull_after() +# TODO: remove argu: request +def merge_pull(ticket, pullreq, user, message, request): + from dispatches import dispatch + from queues_handler import sphinx_builds_add + from vilya.libs.signals import pullrequest_signal + project = pullreq.to_proj + # before + # check user permission + if not project.has_push_perm(user.name): + return 'You do not have merge permission' + # check if pull merged + if pullreq.merged: + return 'This pull was already merged' + + with MLock.merge_pull(proj_id=pullreq.to_proj.id) as err: + if err: + return "Merging by someone else ..." + + # if up-to-date, just close it + if pullreq.is_up_to_date(): + content = u"Closed due to up-to-date merge" + comment = ticket.add_comment(content, user.name) + close_pull(ticket, pullreq, user, content, comment, + request) + return "Closed due to up-to-date merge" + + # do + merge_commit_sha = pullreq.merge(user, message) + if merge_commit_sha is None: + return "Merge failed" + # after + ticket_id = ticket.ticket_id + # close ticket + ticket.close(user.name) + # build docs + sphinx_builds_add(project.name) + # delete tmp branch + pullreq.remove_branch_if_temp() + + # TODO: 重构Feed后取消这个信号的发送 + pullrequest_signal.send(user.username, + comment='', + pullreq=pullreq, + ticket_id=ticket_id, + ticket=ticket, + status="merged", + new_version=True) + + dispatch('pullreq', + data=dict(sender=user.username, + comment=None, + ticket=ticket, + status='merged', + new_version=True) + ) + + # remove argu: request + dispatch('pr_actions', + data=dict(type='pr_merge', + hooks=project.hooks, + request=request, + commit_message=message, + author=user, + ticket=ticket, + pullreq=pullreq) + ) + return None + + +def close_pull(ticket, pullreq, user, content, comment, request): + from dispatches import dispatch + from vilya.libs.signals import pullrequest_signal + + project = ticket.project + author = user.name + ticket.close(author) + pullreq.remove_branch_if_temp() + + # TODO: 重构Feed后取消发送这个信号 + pullrequest_signal.send(author, comment=content, + pullreq=pullreq, + ticket_id=ticket.ticket_id, + ticket=ticket, + status="closed", new_version=True) + dispatch('pullreq', data={ + 'sender': author, + 'comment': comment, + 'ticket': ticket, + 'status': 'closed'}) + dispatch('pr_actions', + data=dict( + type='pr_closed', + hooks=project.hooks, + request=request, + author=user, + ticket=ticket, + pullreq=pullreq, + content=content)) diff --git a/vilya/models/recommendation.py b/vilya/models/recommendation.py new file mode 100644 index 0000000..6d62708 --- /dev/null +++ b/vilya/models/recommendation.py @@ -0,0 +1,92 @@ +# -*- coding: utf-8 -*- + +from vilya.libs.store import store +from dispatches import dispatch + + +class Recommendation(object): + + def __init__(self, id, from_user, to_user, content, n_vote, created): + self.id = id + self.from_user = from_user + self.to_user = to_user + self.content = content + self.created = created + self.n_vote = n_vote + + @classmethod + def add(cls, from_user, to_user, content): + if from_user == to_user: + return + recommendation_id = store.execute( + "insert into codedouban_recommendations " + "(from_user, to_user, content) " + "values (%s, %s, %s)", + (from_user, to_user, content)) + if not recommendation_id: + store.rollback() + raise Exception("Unable to insert new recommendation") + store.commit() + rec = cls.get(recommendation_id) + dispatch('recommend', data={'recommend': rec}) + return rec + + @classmethod + def get(cls, id): + rs = store.execute( + "select id, from_user, to_user, content, n_vote, created " + "from codedouban_recommendations " + "where id=%s", (id,)) + res = rs and rs[0] + return cls(*res) if res else None + + def delete(self): + store.execute( + "delete from codedouban_recommendations where id=%s", (self.id,)) + + @classmethod + def gets_by_user(cls, owner): + rs = store.execute( + "select id, from_user, to_user, content, n_vote, created " + "from codedouban_recommendations " + "where to_user=%s order by n_vote desc, id desc", (owner,)) + return [cls(*res) for res in rs] + + @classmethod + def gets(cls, limit=20, start=0): + rs = store.execute( + "select id, from_user, to_user, content, n_vote, created " + "from codedouban_recommendations order by id desc limit %s,%s", + (start, limit)) + return [cls(*res) for res in rs] + + def add_vote(self, user): + rs = store.execute( + "select id from codedouban_recommendation_votes" + " where recommendation_id=%s and user=%s", (self.id, user)) + r = rs and rs[0] + if r: + return + vote_id = store.execute( + "insert into codedouban_recommendation_votes " + "(recommendation_id, user) " + "values (%s, %s)", + (self.id, user)) + if not vote_id: + store.rollback() + raise Exception("Unable to insert new vote") + + store.execute("update codedouban_recommendations " + "set n_vote=n_vote+1 " + "where id=%s", (self.id,)) + store.commit() + return True + + def is_voted(self, user): + rs = store.execute( + "select id from codedouban_recommendation_votes" + " where recommendation_id=%s and user=%s", (self.id, user)) + r = rs and rs[0] + if r: + return True + return False diff --git a/vilya/models/release.py b/vilya/models/release.py new file mode 100644 index 0000000..90877af --- /dev/null +++ b/vilya/models/release.py @@ -0,0 +1,77 @@ +# coding: utf8 + +import logging +import time +import sys +import pprint + +import requests + +from vilya.libs.store import mc, clear_local_cache, ONE_DAY + +MC_KEY_REPOSITORY_RELEASE = 'latest_release:%s' +MC_KEY_UNRELEASE_COMMITS = 'release:%s:%s:%s:commits' + + +def get_release(repository): + '''get latest successed release info + + return: a dict with keys {annotate, changesets, message, first_rev, + last_rev, pre_release_rev, status, + project_source, release_manger, release_time, + url} + ''' + if not repository.startswith('http:'): + repository = 'http://code.dapps.douban.com/' + repository + if not repository.endswith('.git'): + repository = repository + '.git' + + key = MC_KEY_REPOSITORY_RELEASE % repository + info = mc.get(key) + + if info is not None: + return info + + try: + info = fetch_release(repository) + mc.set(key, info, ONE_DAY) + return info + except: + return {} + + +def fetch_release(repository): + # TODO + return {} + + +def get_unreleased_commit_num(project): + last_release_info = get_release(project.repository) + from_ref = last_release_info['last_rev'] if last_release_info else None + key = MC_KEY_UNRELEASE_COMMITS % (project.id, + project.default_sha, + from_ref) + num = mc.get(key) + if num is None: + commits = project.repo.get_commits(project.default_branch, + from_ref=from_ref, + max_count=100) + num = len(commits) + mc.set(key, num, ONE_DAY) + return num + + +def expire_outdated_releases(): + '''TODO: 新代码上线后及时清理缓存 + ''' + + +if __name__ == '__main__': + if sys.argv[1:] and sys.argv[1] == 'expire': + expire_outdated_releases() + else: + if sys.argv[1:]: + resp = sys.argv[1] + else: + resp = 'http://code.dapps.douban.com/code.git' + pprint.pprint(get_release(resp)) diff --git a/vilya/models/room.py b/vilya/models/room.py new file mode 100644 index 0000000..2e2b6b7 --- /dev/null +++ b/vilya/models/room.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +from vilya.libs.store import store + + +def _add(name, owner): + room_id = store.execute("insert into chat_rooms" + "(name, author) values(%s, %s)", + (name, owner)) + if not room_id: + store.rollback() + raise Exception("Unable to insert new room") + store.commit() + return room_id + + +def _get(room_id): + rs = store.execute("select id, name, author, created_at " + "from chat_rooms where id = %s", (room_id,)) + return rs[0] if rs else None + + +class Room(object): + + def __init__(self, room_id, name, owner, created_at): + self.id = room_id + self.name = name + self.owner = owner + self.created_at = created_at + + @classmethod + def get(cls, room_id): + c = _get(room_id) + return cls(*c) if c else None + + @classmethod + def get_all_rooms(cls): + rs = store.execute( + "select id, name, author, created_at from chat_rooms order by id") + + return [cls(*r) for r in rs] + + @classmethod + def add(cls, name, owner): + new_room_id = _add(name, owner) + new_room = cls.get(new_room_id) + return new_room + + @classmethod + def exists(cls, name): + rs = store.execute("select id from chat_rooms " + "where name=%s", (name,)) + return not len(rs) == 0 + + @classmethod + def delete(cls, name): + rs = store.execute("delete from chat_rooms " + "where name=%s", (name,)) + if rs: + store.commit() + return True + return False diff --git a/vilya/models/sphinx_docs.py b/vilya/models/sphinx_docs.py new file mode 100644 index 0000000..6eb8965 --- /dev/null +++ b/vilya/models/sphinx_docs.py @@ -0,0 +1,529 @@ +# coding: utf-8 +import pickle +import tempfile +import os +import logging +logging.basicConfig() +logger = logging.getLogger(__name__) +logger.setLevel(logging.INFO) +debug = logger.debug +warn = logger.warn +import subprocess as sp +import shutil +import datetime as dt +from urllib import quote + +import sphinx # noqa Some pickles need this import + +from vilya.libs.store import mc +from vilya.libs.gyt import GytRepoNotInited, GytError +from vilya.libs.permdir import get_tmpdir, get_repo_root +from vilya.models.project import CodeDoubanProject +from vilya.models.consts import ( + DOC_EXT, SPHINX_BUILD_DOCTREES, + SPHINX_BUILDER_TYPES, SPHINX_DEFAULT_CHECKOUT_ROOT) + +DEFAULT_BUILDER = 'pickle' +ENABLED_BUILDERS = SPHINX_BUILDER_TYPES + +LAST_BUILD_MC_KEY = 'sphinx-docs:%s:last_build:v2' +LAST_TREE_HASH_MC_KEY = 'sphinx-docs:%s:%s:last_tree_hash:v1' + + +def _move_to_dir(fromd, tod): + shutil.rmtree(tod, ignore_errors=True) + shutil.copytree(fromd, tod) + shutil.rmtree(fromd) + + +def _export_docs_tree(project_id, tree_hash, temp_dir): + _call = CodeDoubanProject.get(project_id).git.call + debug('Exporting docs tree') + _call('read-tree --empty') + try: + _call('read-tree %s' % tree_hash) + except GytError as e: + if 'failed to unpack tree object' in e.args[2]: + return False, 'failed to unpack tree object' + else: + raise + # TODO use gyt repo to handle worktree + _call('--work-tree %s checkout-index --force -a' % temp_dir) + debug('Checked out the docs content work-tree') + return True, '' + + +def _tree_hash(project_id, path): + _call = CodeDoubanProject.get(project_id).git.call + return _call('rev-parse HEAD:%s' % path, _raise=False) + + +def _builder_conf(project_id, builder_name): + prj = CodeDoubanProject.get(project_id) + if not prj.conf.get('docs'): + return {'dir': builder_name} + conf = prj.conf['docs'].get(builder_name, False) + if not conf: + return {'dir': builder_name} + if 'dir' not in conf: + conf['dir'] = builder_name # When no explicit dir, use the name + if 'checkout_root' not in conf: + conf['checkout_root'] = SPHINX_DEFAULT_CHECKOUT_ROOT + return conf + + +def _builders_list(project_id): + prj = CodeDoubanProject.get(project_id) + if not prj.conf['docs']: + return [DEFAULT_BUILDER] + blds = [(v.get('sort'), k) for k, v in prj.conf['docs'].items()] + blds = sorted(blds) + blds = [_[1] for _ in blds] + return blds + + +def _check_conf(conf): + assert isinstance(conf, dict), "Docs config must be a dict" + vs = conf.values() + assert all(isinstance(_, dict) for _ in vs), "All docs confs must be dicts" + assert all( + _.get('builder', DEFAULT_BUILDER) in ENABLED_BUILDERS for _ in vs), ( + "All docs confs must have a builder chosen in %s (choose %s if unsure)" + % (ENABLED_BUILDERS, DEFAULT_BUILDER)) + + +def guess_builder_from_path(builders, proj, path): + assert len(builders) > 0, "Need at least one builder" + for builder_name in builders: + if (path == "/%s/docs/%s" % (proj, builder_name) or + path.startswith("/%s/docs/%s/" % (proj, builder_name))): + return builder_name, True + else: + return builders[0], False # First default, and implicit + + +class SphinxDocs(object): # TODO rename this is not sphinx-only + builds_logs = [] + disabled_reason = 'Unknown reason' + + def __init__(self, project_name, allow_old_conf=True): + project = CodeDoubanProject.get_by_name(project_name) + assert project, "Need existing project" + self.project_id = project.id + # if not project or not is_git_dir(project.git_path): + if not project: + self.enabled = False + self.disabled_reason = "No project +_+" + return + try: + self.conf_new = project.conf.get('docs', None) + except GytRepoNotInited: + self.enabled = False + self.disabled_reason = "No project +_+" + return + + if self.conf_new: + try: + _check_conf(self.conf_new) + except AssertionError, err: + logging.warning("Docs config error: %s" % err) + self.enabled = False + self.disabled_reason = str(err) + return + self.enabled = True + self.builders = _builders_list(project.id) + mc.set(LAST_BUILD_MC_KEY % self.project_id, None) + + def last_build_info(self): + return mc.get(LAST_BUILD_MC_KEY % self.project_id) + + def need_rebuild(self): + last_build = self.last_build_info() + if not last_build or not last_build['builds']: + return True + for builder_name in self.builders: + builder = self.get_builder(builder_name) + if builder.need_rebuild(): + return True + return False + + def _save_build_state(self, status, message=''): + last_build = { + 'message': message, + 'date': dt.datetime.now(), + 'status': status, + 'builds': self.builds_logs, + } + mc.set(LAST_BUILD_MC_KEY % self.project_id, last_build) + + def build_all(self): + self.builds_logs = [] + self._save_build_state('started') + if not self.enabled: + self._save_build_state('disabled', self.disabled_reason) + return 'disabled' + builder_name = '' + for builder_name in self.builders: + self._build_one(builder_name) + + def _build_one(self, builder_name): + debug("Starting full build for %s" % builder_name) + self._save_build_state('exported') + builder = None + try: + success = True + builder = self.get_builder(builder_name) + ok, status = builder.prepare() + if not ok: + self._save_build_state(status) + return + ok, build_status = builder.build() + self.builds_logs.append(build_status) + self._save_build_state('building') + if not ok: + success = False + self._save_build_state('FAILED') + warn("Warning! Unable to build %s" % builder_name) + else: + self._save_build_state('building') + if success: + builder.move_to_permdir() + self._save_build_state('success') + else: + self._save_build_state('FAILED') + finally: + if builder: + builder.clean_up() + + def get_builder(self, builder_name=None): + if not builder_name: + builder_name = self.builders[0] # First is default + assert builder_name in self.builders + if builder_name not in self.conf_new: + builder_type = DEFAULT_BUILDER + elif 'builder' not in self.conf_new[builder_name]: + builder_type = DEFAULT_BUILDER + else: + builder_type = self.conf_new[builder_name]['builder'] + assert builder_type in ENABLED_BUILDERS, \ + "builder type %s unknown" % builder_type + builders_map = { + 'pickle': SphinxDocBuilderPickle, + 'raw': DocBuilderRaw, + 'html': SphinxDocBuilderDefault, + } + assert set(builders_map.keys()) == set(ENABLED_BUILDERS) + bc = builders_map[builder_type] + retval = bc(builder_name, self.project_id) + return retval + + def get_url_from_path(self, path): + for builder_name in self.builders: + builder = self.get_builder(builder_name) + if path.startswith("%s/" % builder.dir): + path = path.replace(builder.dir, "", 1) + bd = builder + return quote(bd.get_url_from_path(path)) + + +def _search(build_path, q): + si = _unpickle_global(build_path, "searchindex.pickle") + toks = _find_tokens(si['terms'].keys(), q) + results = [] + for tok in toks: + links = si['terms'][tok] + if isinstance(links, int): + links = [links] + for link in links: + results.append((si['filenames'][link], si['titles'][link])) + return results + + +class AbstractDocBuilder(object): + needed_form_vars = [] + template = False + slash_urls = False + static_prefixes = [] + redirects = {} + masterdoc = 'index' + + def __init__(self, builder, project_id): + self.builder = builder + self.project_id = project_id + prj = CodeDoubanProject.get(project_id) + self.docs_dir = os.path.join(get_repo_root(), + prj.name + DOC_EXT, builder) + self.config = _builder_conf(project_id, builder) + self.dir = self.config['dir'] + self.temp_dir = None + self.temp_dir_root = None + + def file_is_static(self, path): + return any(path.startswith(_) for _ in self.static_prefixes) + + def build(self): + raise NotImplementedError() + + def template_data(self, path, form_vars): + raise NotImplementedError() + + def raw_content(self, path, form_vars): + raise NotImplementedError() + + def file_content(self, path): + fp = os.path.join(self._path(), path) + if not os.path.exists(fp): + debug("Path do not exist: %s" % fp) + return False + with open(fp) as f: + content = f.read() + return content + + def _path(self, tmp=False): + if tmp: + assert self.temp_dir + path = os.path.join(self.temp_dir, '.build', self.builder) + else: + path = os.path.join(self.docs_dir, '.build', self.builder) + return path + + def prepare(self): + self.temp_dir_root = tempfile.mkdtemp( + prefix='sphinx_docs_', dir=get_tmpdir()) + if self.config['checkout_root']: + tree_hash = _tree_hash(self.project_id, '') + else: + tree_hash = _tree_hash(self.project_id, self.dir) + if not tree_hash or not self.has_content(): + warn("No docs directory in project repo at HEAD for builder %s" % + self.builder) + return False, 'no_doc_dir_found' + mc.set(LAST_TREE_HASH_MC_KEY % (self.project_id, + self.builder), tree_hash) + + if os.path.exists(self.docs_dir): + shutil.rmtree(self.docs_dir, ignore_errors=True) + try: + os.makedirs(self.docs_dir) + except OSError: + pass + ret, msg = _export_docs_tree( + self.project_id, tree_hash, self.temp_dir_root) + if not ret: + return False, msg + if self.config['checkout_root']: + self.temp_dir = os.path.join(self.temp_dir_root, self.dir) + else: + self.temp_dir = self.temp_dir_root + return True, 'success' + + def has_content(self): + tree_hash = _tree_hash(self.project_id, self.dir) + return bool(tree_hash) + + def move_to_permdir(self): + debug('Moving to permdir: %s -> %s' % (self.temp_dir, self.docs_dir)) + _move_to_dir(self.temp_dir, self.docs_dir) + + def clean_up(self): + if self.temp_dir_root and os.path.isdir(self.temp_dir_root): + shutil.rmtree(self.temp_dir_root) + mc.set(LAST_TREE_HASH_MC_KEY, None) + mc.set(LAST_BUILD_MC_KEY, None) + + def need_rebuild(self): + last_tree_hash = mc.get( + LAST_TREE_HASH_MC_KEY % (self.project_id, self.builder)) + if self.config['checkout_root']: + current_tree_hash = _tree_hash(self.project_id, '') + else: + current_tree_hash = _tree_hash(self.project_id, self.dir) + if not last_tree_hash: + return True + if last_tree_hash != current_tree_hash: + return True + return False + + def with_comment(self): + return self.config.get('with_comment', True) + + +class SphinxDocBuilder(AbstractDocBuilder): + static_prefixes = ['_images', '_sources', '_static', '_downloads'] + + def build(self): + debug('Starting SphinxDocBuilder build') + cmd = self._make_cmd() + # TODO lock this dir! + debug('Building sphinx: %s' % ' '.join(cmd)) + process = sp.Popen(cmd, stdout=sp.PIPE, stderr=sp.PIPE) + debug('Process Popened') + out, err = process.communicate() + debug('Process communicated') + returncode = process.returncode + status = { + 'builder': self.builder, + 'out': out, + 'error': err, + 'returncode': returncode, + 'command': cmd, + } + if returncode != 0: + debug("Error building SphinxDocBuilder %s" % err) + return returncode == 0, status + + def _make_cmd(self): + assert self.temp_dir + sphinx_builder = self.config.get('builder', self.builder) # noqa TODO rm self.builder when no more old config + assert sphinx_builder in [ + 'pickle', 'html'], "sphinx builder %s unknown" % sphinx_builder + options = [] + prj = CodeDoubanProject.get(self.project_id) + default_options = { + 'master_doc': self.masterdoc, + 'source_suffix': '.rst', + 'html_short_title': prj.name, + } + options_dict = default_options.copy() + if self.config: + options_dict.update(self.config) + for k, v in options_dict.items(): + options.extend(['-D', '%s=%s' % (k, v)]) + cmd = [ + 'sphinx-build', + '-a', # -- write all files; default is to only write new and changed files + '-E', # -- don't use a saved environment, always read all files + '-b', sphinx_builder, # -- builder to use + '-D', 'project=%s' % prj.name, + # -- override a setting in configuration + ] + cmd += options + # -- path for the cached environment and doctree files + cmd += ['-d', os.path.join(self.temp_dir, SPHINX_BUILD_DOCTREES)] + cmd += ['-q'] + if self._has_sphinx_conf(): + # -- path where configuration file (conf.py) is located + cmd += ['-c', self.temp_dir] + else: + cmd += ['-C'] # No conf.py file + cmd += [self.temp_dir, self._path(tmp=True)] + return cmd + + def _has_sphinx_conf(self): + sphinx_conf = os.path.join(self.temp_dir, 'conf.py') + return os.path.exists(sphinx_conf) + + +class SphinxDocBuilderPickle(SphinxDocBuilder): + template = 'sphinx_docs.html' + needed_form_vars = ['q'] + slash_urls = True + redirects = {'index': ''} + + def get_url_from_path(self, path): + t = path.partition('/')[2] + t = t.rpartition('.')[0] + return 'docs/%s/%s/' % (self.builder, t) + + def template_data(self, path, form_vars): + tdt = _unpickled(self._path(), path) + if path == 'search': + q = form_vars['q'] + tdt['searchresult'] = _search(self._path(), q) + return tdt + + +class SphinxDocBuilderDefault(SphinxDocBuilder): + redirects = {'': 'index.html'} + + def raw_content(self, path, form_vars): + fp = os.path.join(self._path(), path) + if not os.path.exists(fp): + debug("Path do not exist: %s" % fp) + return False + with open(fp) as f: + content = f.read() + return content + + def get_url_from_path(self, path): + t = path.partition('/')[2] + t = t.rpartition('.')[0] + return "docs/%s/%s.html" % (self.builder, t) + + +class DocBuilderRaw(AbstractDocBuilder): + redirects = {'': 'index.html'} + + def build(self): + debug('Starting DocBuilderRaw build') + target_dir = self._path(tmp=True) + ignore = shutil.ignore_patterns(('.build',)) + debug("Copying tree from %s to %s" % (self.temp_dir, target_dir)) + shutil.copytree(self.temp_dir, target_dir, ignore=ignore) + status = { + 'builder': self.builder, + 'out': 'tree copied to .build/raw', + 'error': '', + 'returncode': None, + 'command': ['shutil.copytree(%s, %s)' % ( + self.temp_dir, target_dir)], + } + return True, status + + def file_is_static(self, path): + return True + + def raw_content(self, path, form_vars): + fp = os.path.join(self._path(), path) + if not os.path.exists(fp): + debug("Path do not exist: %s" % fp) + return False + with open(fp) as f: + content = f.read() + os.remove(fp) + return content + + def get_url_from_path(self, path): + t = path.partition('/')[2] + return "docs/%s/%s" % (self.builder, t) + + +def _find_tokens(keys, key): + key = key.lower().strip() + return [k for k in keys if k.startswith(key)] + + +def _unpickled(build_path, path): + gc = _unpickle_global(build_path, "globalcontext.pickle") + if not gc: + return {'error': 'Unable to find global context'} + if not path: + path = gc['master_doc'] + pk = _unpickle_target(build_path, path, gc) + if not pk: + pk = _unpickle_target( + build_path, path + '/' + gc['master_doc'], gc) # Hack + if not pk: + return {'error': 'Unable to find pickle', 'gc': gc} + pk['gc'] = gc + pk['error'] = False + return pk + + +def _unpickle_global(build_path, fn): + fp = os.path.join(build_path, fn) + if not os.path.exists(fp): + return False + with open(fp) as f: + p = pickle.load(f) + return p + + +def _unpickle_target(build_path, path, gc): + fp = os.path.join(build_path, path) + fp += gc['file_suffix'] + if not os.path.exists(fp): + return False + with open(fp) as f: + p = pickle.load(f) + return p diff --git a/vilya/models/sshkey.py b/vilya/models/sshkey.py new file mode 100644 index 0000000..1b40234 --- /dev/null +++ b/vilya/models/sshkey.py @@ -0,0 +1,141 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from binascii import hexlify, Error +from base64 import decodestring + +from paramiko import RSAKey, DSSKey, SSHException + +from vilya.libs.store import store + + +# RFC: http://tools.ietf.org/html/rfc4716 +class SSHKey(object): + + def __init__(self, id, user_id, key, fingerprint, title): + self.id = id + self.user_id = user_id + self.key = key + self.fingerprint = fingerprint + self.title = title + + @property + def finger(self): + return self.fingerprint + + @classmethod + def add(cls, user_id, key): + fingerprint = generate_fingerprint(key) + title = generate_title(key) + id = store.execute( + 'insert into ssh_keys (user_id, `key`, fingerprint, title) ' + 'values (%s, %s, %s, %s)', + (user_id, key, fingerprint, title)) + store.commit() + return cls(id, user_id, key, fingerprint, title) + + @classmethod + def validate(cls, user_id, key): + _key_type, _key, _title = split_ssh_key(key) + if _key_type not in ('ssh-rsa', 'ssh-dss'): + return None + fingerprint = generate_fingerprint(key) + if not fingerprint: + return None + return True + + @classmethod + def is_duplicated(cls, user_id, key): + fingerprint = generate_fingerprint(key) + # FIXME: duplicated fingerprint with user_id + # or global fingerprint duplicated? + rs = store.execute('select id from ssh_keys ' + 'where fingerprint=%s', (fingerprint,)) + if rs and rs[0]: + return True + + @classmethod + def gets_by_user_id(cls, user_id): + rs = store.execute('select id, user_id, `key`, fingerprint, title ' + 'from ssh_keys ' + 'where user_id=%s ', (user_id,)) + if rs: + return [cls(*r) for r in rs] + return [] + + @classmethod + def get(cls, id): + rs = store.execute('select id, user_id, `key`, fingerprint, title ' + 'from ssh_keys ' + 'where id=%s', (id,)) + if rs and rs[0]: + return cls(*rs[0]) + + def delete(self): + n = store.execute('delete from ssh_keys where id=%s', (self.id,)) + if n: + store.commit() + return True + + @classmethod + def check_own_by_user(cls, user_id, ssh_id): + rs = store.execute('select id, user_id, `key`, fingerprint, title ' + 'from ssh_keys ' + 'where id=%s and user_id=%s ', + (ssh_id, user_id)) + if rs and rs[0]: + return cls(*rs[0]) + + @classmethod + def get_by_fingerprint(cls, fingerprint): + rs = store.execute('select id, user_id, `key`, fingerprint, title ' + 'from ssh_keys ' + 'where fingerprint=%s ', (fingerprint,)) + r = rs and rs[0] + if r: + return cls(*r) + + +def split_ssh_key(key): + _type = None + _key = None + _name = None + fields = key.split(' ') + length = len(fields) + if length == 2: + fields = fields[:2] + _type, _key = fields + _name = _type + " " + _key[:18] + elif length >= 3: + fields = fields[:3] + _type, _key, _name = fields + return (_type, _key, _name) + + +def generate_title(key): + _type, _key, _name = split_ssh_key(key) + return _name + + +def generate_fingerprint(key): + fingerprint = None + _type, _key, _name = split_ssh_key(key) + try: + if _type == 'ssh-rsa': + _key = RSAKey(data=decodestring(_key)) + elif _type == 'ssh-dss': + _key = DSSKey(data=decodestring(_key)) + else: + return fingerprint + hash = hexlify(_key.get_fingerprint()) + fingerprint = ":".join([hash[i:2+i] for i in range(0, len(hash), 2)]) + except SSHException as e: + # Invalid key + # raise ValueError(str(e)) + return None + except Error: + # Incorrect padding + # report "Invalid key" error to user + # raise ValueError("Invalid key") + return None + return fingerprint diff --git a/vilya/models/statistics.py b/vilya/models/statistics.py new file mode 100644 index 0000000..3c95010 --- /dev/null +++ b/vilya/models/statistics.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- + +from vilya.libs.store import store + + +def get_all_ticket(): + rs = store.execute("select id, closed from codedouban_ticket") + return rs + + +def get_ticket_comment_count(): + rs = store.execute("select count(id) from codedouban_ticket_comment") + return rs[0][0] + + +def get_all_issue(): + rs = store.execute("select id, closer_id from issues") + return rs + + +def get_issue_comment_count(): + rs = store.execute("select count(id) from issue_comments") + return rs[0][0] + + +def get_all_project(): + rs = store.execute("select project_id, fork_from from codedouban_projects") + return rs + + +def get_all_gist(): + rs = store.execute("select id, fork_from from gists") + return rs diff --git a/vilya/models/stats/__init__.py b/vilya/models/stats/__init__.py new file mode 100644 index 0000000..9664a58 --- /dev/null +++ b/vilya/models/stats/__init__.py @@ -0,0 +1 @@ +from gitcollector import GitDataCollector # noqa diff --git a/vilya/models/stats/collector.py b/vilya/models/stats/collector.py new file mode 100644 index 0000000..ca349e1 --- /dev/null +++ b/vilya/models/stats/collector.py @@ -0,0 +1,203 @@ +# -*- coding: utf-8 -*- +import time +import pickle +import zlib +import os +import datetime +from collections import defaultdict + +from .consts import conf +from vilya.libs.store import get_db +from vilya.libs.permdir import get_repo_root + +beansdb = get_db() + + +class DataCollector(object): + """Manages data collection from a revision control repository.""" + def __init__(self): + self.stamp_created = time.time() + self.cache = {} + self.total_authors = 0 + self.last_sha = '' + self.h_of_day_act = defaultdict(int) # hour -> commits + self.d_of_week_act = defaultdict(int) # day -> commits + self.m_of_year_act = defaultdict(int) # month [1-12] -> commits + self.h_of_week_act = {} # weekday -> hour -> commits + self.h_of_day_act_busiest = 0 + self.h_of_week_act_busiest = 0 + self.year_week_act = defaultdict(int) # yy_wNN -> commits + self.year_week_act_peak = 0 + + self.authors = {} + # name -> {commits, first_commit_stamp, last_commit_stamp, + # last_active_day, active_days, lines_added, + # lines_removed} + + self.total_commits = 0 + self.total_files = 0 + self.authors_by_commits = 0 + + # domains + self.domains = {} # domain -> commits + + # author of the month + self.author_of_month = {} # month -> author -> commits + self.author_of_year = {} # year -> author -> commits + self.commits_by_month = defaultdict(int) # month -> commits + self.commits_by_year = defaultdict(int) # year -> commits + self.lines_added_by_month = defaultdict(int) # month -> lines added + self.lines_added_by_year = defaultdict(int) # year -> lines added + self.lines_removed_by_month = defaultdict( + int) # month -> lines removed + self.lines_removed_by_year = defaultdict(int) # year -> lines removed + self.first_commit_stamp = 0 + self.last_commit_stamp = 0 + self.last_active_day = None + self.active_days = set() + + # lines + self.total_lines = 0 + self.total_lines_added = 0 + self.total_lines_removed = 0 + + # size + self.total_size = 0 + + # timezone + self.commits_by_timezone = defaultdict(int) # timezone -> commits + + # tags + self.tags = {} + + self.files_by_stamp = {} # stamp -> files + + # extensions + self.extensions = {} # extension -> files, lines + + # line statistics + self.changes_by_date = {} # stamp -> { files, ins, del } + + self.changes_by_date_by_author = {} + + ## + # This should be the main function to extract data from the repository. + def collect(self, dir): + self.dir = dir + if len(conf['project_name']) == 0: + self.projectname = os.path.basename(os.path.abspath(dir)) + else: + self.projectname = conf['project_name'] + + ## + # Load cacheable data + def loadCache(self, proj_name, key, n_author): + try: + data = beansdb.get(key, None) + if data: + self.cache = pickle.loads(zlib.decompress(data)) + if len(self.cache.get('authors')) != n_author: + self.cache = {} + except Exception: + self.cache = {} + if not self.cache: + path = os.path.join(get_repo_root(), 'statscache') + try: + f = open(os.path.join(path, '%s.cache' % proj_name), 'rb') + self.cache = pickle.loads(zlib.decompress(f.read())) + f.close() + except Exception: + self.cache = {} + if self.cache: + self.changes_by_date_by_author = self.cache.get( + 'changes_by_date_by_author', {}) + self.changes_by_date = self.cache.get('changes_by_date', {}) + self.authors = self.cache.get('authors', {}) + self.total_commits = self.cache.get('total_commits', 0) + self.year_week_act = self.cache.get('year_week', defaultdict(int)) + self.year_week_act_peak = self.cache.get('year_week_peak', 0) + self.total_lines = self.cache.get('total_lines', 0) + self.total_lines_added = self.cache.get('total_lines_added', 0) + self.total_lines_removed = self.cache.get('total_lines_removed', 0) + + ## + # Produce any additional statistics from the extracted data. + + def refine(self): + pass + + ## + # : get a dictionary of author + def getAuthorInfo(self, author): + return None + + def getActivityByDayOfWeek(self): + return {} + + def getActivityByHourOfDay(self): + return {} + + # : get a dictionary of domains + def getDomainInfo(self, domain): + return None + + ## + # Get a list of authors + def getAuthors(self): + return [] + + def getFirstCommitDate(self): + return datetime.datetime.now() + + def getLastCommitDate(self): + return datetime.datetime.now() + + def getStampCreated(self): + return self.stamp_created + + def getTags(self): + return [] + + def getTotalAuthors(self): + return -1 + + def getTotalCommits(self): + return -1 + + def getTotalFiles(self): + return -1 + + def getTotalLOC(self): + return -1 + + ## + # Save cacheable data + def saveCache(self, proj_name, key): + proj_name = proj_name.replace('/', '_') + self.cache['authors'] = self.authors + self.cache['changes_by_date_by_author'] = self.changes_by_date_by_author # noqa + self.cache['total_commits'] = self.total_commits + self.cache['changes_by_date'] = self.changes_by_date + self.cache['year_week'] = self.year_week_act + self.cache['year_week_peak'] = self.year_week_act_peak + self.cache['total_lines'] = self.total_lines + self.cache['total_lines_added'] = self.total_lines_added + self.cache['total_lines_removed'] = self.total_lines_removed + data = zlib.compress(pickle.dumps(self.cache)) + path = os.path.join(get_repo_root(), 'statscache/') + if not os.path.exists(path): + os.makedirs(path) + tmp_name = os.path.join(path + '%s.cache.tmp' % proj_name) + oldname = os.path.join(path + '%s.cache' % proj_name) + try: + os.remove(oldname) + except OSError: + pass + f = open(tmp_name, 'wb') + f.write(data) + f.close() + os.rename(tmp_name, oldname) + try: + beansdb.set(key, data) + except Exception: + pass diff --git a/vilya/models/stats/consts.py b/vilya/models/stats/consts.py new file mode 100644 index 0000000..098b05d --- /dev/null +++ b/vilya/models/stats/consts.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +import platform + +ON_LINUX = (platform.system() == 'Linux') +WEEKDAYS = ('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun') + +conf = { + 'max_domains': 10, + 'max_ext_length': 10, + 'style': 'gitstats.css', + 'max_authors': 20, + 'authors_top': 5, + 'commit_begin': '', + 'commit_end': 'HEAD', + 'linear_linestats': 1, + 'project_name': '', + 'merge_authors': {} +} diff --git a/vilya/models/stats/gitcollector.py b/vilya/models/stats/gitcollector.py new file mode 100644 index 0000000..1f1f496 --- /dev/null +++ b/vilya/models/stats/gitcollector.py @@ -0,0 +1,323 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (c) 2007-2012 Heikki Hokkanen <hoxu@users.sf.net> +# & others (see doc/author.txt) +# GPLv2 / GPLv3 +from datetime import datetime +from pytz import FixedOffset + +from vilya.libs.consts import LANGUAGES +from vilya.libs.store import cache, ONE_DAY +from vilya.models.user import get_author_by_email +from .consts import conf +from .utils import getcommitrange, getkeyssortedbyvaluekey +from .collector import DataCollector + +REPO_EXTENSION_KEY = "repo:%s:stats:extension1" + + +class GitDataCollector(DataCollector): + + def __init__(self, gyt_repo): + super(GitDataCollector, self).__init__() + self.gyt_repo = gyt_repo + + @classmethod + def _get_author_email(cls, author_email): + author, email = author_email.split('<', 1) + author = author.rstrip() + email = email.rstrip('>') + return (author, email) + + def commitrange(self, head, end=None): + return getcommitrange(head, end) + + def fill_shortstat(self, commitrange): + try: + to_ref, from_ref = commitrange + block_of_lines = self.gyt_repo.repo.log(to_ref, + from_ref=from_ref, + shortstat=True, + no_merges=True, + reverse=True + ) + except: + block_of_lines = [] + return block_of_lines + + @cache(REPO_EXTENSION_KEY % '{proj_name}', expire=ONE_DAY) + def compute_file_size_and_extensions(self, proj_name): + # extensions and size of files + # this should only run once than only compute delta + extensions = {} + total_size = 0 + total_files = 0 + source_files = 0 + source_lines = 0 + lines = self.gyt_repo.repo.ls_tree('HEAD', recursive=True, size=True) + for line in lines: + if line[0] == '160000' and line[3] == '-': + # skip submodules + continue + sha1 = line[2] + size = int(line[3]) + fullpath = line[4] + + total_size += size + total_files += 1 + + filename = fullpath.split('/')[-1] # strip directories + if filename.find('.') == -1 or filename.rfind('.') == 0: + ext = '' + else: + ext = filename[(filename.rfind('.') + 1):] + if len(ext) > conf['max_ext_length']: + ext = '' + name = LANGUAGES.get(ext, None) + + if name not in extensions: + if ext in LANGUAGES.keys(): + name = LANGUAGES[ext] + extensions[name] = {'files': 0, 'lines': 0} + else: + continue + + extensions[name]['files'] += 1 + source_files += 1 + try: + # should be text files + count = self.getLinesInBlob(sha1) + extensions[name]['lines'] += count + source_lines += count + except: + pass + return extensions, total_files, total_size, source_files, source_lines + + def fill_rev_list_commitrange(self, commitrange): + to_ref, from_ref = commitrange + commits = self.gyt_repo.repo.rev_list(to_ref, from_ref) + for commit in commits: + author = commit.author.name + # email = email_normalizer(commit.author.name, + # commit.author.email) + email = commit.author.email + stamp = commit.committer.time + date = datetime.fromtimestamp( + commit.committer.time, + FixedOffset(commit.committer.offset) + ) + + author = get_author_by_email(email, author) + if author in conf['merge_authors']: + author = conf['merge_authors'][author] + + # First and last commit stamp + # (may be in any order because of cherry-picking and patches) + if stamp > self.last_commit_stamp: + self.last_commit_stamp = stamp + if self.first_commit_stamp == 0 or stamp < self.first_commit_stamp: + self.first_commit_stamp = stamp + + # yearly/weekly activity + yyw = date.strftime('%Y-%W') + self.year_week_act[yyw] += 1 + if self.year_week_act_peak < self.year_week_act[yyw]: + self.year_week_act_peak = self.year_week_act[yyw] + + # author stats + if author not in self.authors: + self.authors[author] = { + 'lines_added': 0, + 'lines_removed': 0, + 'commits': 0, + } + # commits, note again that commits may be in any date order + # because of cherry-picking and patches + if 'last_commit_stamp' not in self.authors[author]: + self.authors[author]['last_commit_stamp'] = stamp + if stamp > self.authors[author]['last_commit_stamp']: + self.authors[author]['last_commit_stamp'] = stamp + if 'first_commit_stamp' not in self.authors[author]: + self.authors[author]['first_commit_stamp'] = stamp + if stamp < self.authors[author]['first_commit_stamp']: + self.authors[author]['first_commit_stamp'] = stamp + if 'email' not in self.authors[author]: + self.authors[author]['email'] = email + + def fill_short_stats_commitrange(self, commitrange): + to_ref, from_ref = commitrange + if to_ref == 'HEAD' and from_ref is None: + total_lines = 0 + else: + total_lines = self.total_lines + for commit in self.fill_shortstat(commitrange): + files = commit['files'] + inserted = commit['additions'] + deleted = commit['deletions'] + total_lines += inserted + total_lines -= deleted + self.total_lines_added += inserted + self.total_lines_removed += deleted + stamp = commit['committer_time'] + author = commit['author_name'] + email = commit['author_email'] + author = get_author_by_email(email, author) + if author in conf['merge_authors']: + author = conf['merge_authors'][author] + self.changes_by_date[stamp] = { + 'files': files, + 'ins': inserted, + 'del': deleted, + 'lines': total_lines + } + self.process_line_user(author, stamp, inserted, deleted) + self.total_lines = total_lines + + def collect(self, dir, proj_name, head, n_author): + DataCollector.collect(self, dir) + self.loadCache(proj_name, '/stats/' + proj_name, n_author) + last_sha = self.cache and self.cache.get('last_sha', '') + if last_sha: + commitrange = self.commitrange('HEAD', last_sha) + else: + commitrange = self.commitrange('HEAD') + + self.total_authors += n_author + self.fill_rev_list_commitrange(commitrange) + + # TODO Optimize this, it's the worst bottleneck + # outputs "<stamp> <files>" for each revision + to_ref, from_ref = commitrange + revlines = self.gyt_repo.repo.rev_list(to_ref, from_ref=from_ref) + for commit in revlines: + timest = commit.author.time + rev = commit.tree.hex + linecount = self.getFilesInCommit(rev) + self.files_by_stamp[int(timest)] = int(linecount) + self.total_commits += len(revlines) + + extensions, total_files, total_size, source_files, source_lines \ + = self.compute_file_size_and_extensions(proj_name) + + self.extensions = extensions + self.total_files = total_files + self.total_size = total_size + self.source_files = source_files + self.source_lines = source_lines + + self.fill_short_stats_commitrange(commitrange) + + self.refine() + # here update new data after head sha + + # here need to save to cache up to head sha + self.cache['last_sha'] = head + self.saveCache(proj_name, '/stats/' + proj_name) + + def process_line_user(self, author, stamp, inserted, deleted): + if author not in self.authors: + self.authors[author] = { + 'lines_added': 0, + 'lines_removed': 0, + 'commits': 0, + } + self.authors[author]['commits'] += 1 + self.authors[author]['lines_added'] += inserted + self.authors[author]['lines_removed'] += deleted + if stamp not in self.changes_by_date_by_author: + self.changes_by_date_by_author[stamp] = {} + if author not in self.changes_by_date_by_author[stamp]: + self.changes_by_date_by_author[stamp][author] = {} + linesadd = self.authors[author]['lines_added'] + commits_n = self.authors[author]['commits'] + self.changes_by_date_by_author[stamp][author]['lines_added'] = linesadd + self.changes_by_date_by_author[stamp][author]['commits'] = commits_n + + def refine(self): + # authors + # name -> {place_by_commits, commits_frac, date_first, date_last, + # timedelta} + self.authors_by_commits = getkeyssortedbyvaluekey( + self.authors, 'commits') + self.authors_by_commits.reverse() # most first + for i, name in enumerate(self.authors_by_commits): + self.authors[name]['place_by_commits'] = i + 1 + + for name in self.authors.keys(): + a = self.authors[name] + a['commits_frac'] = ( + 100 * float(a['commits'])) / self.getTotalCommits() + date_first = datetime.fromtimestamp(a['first_commit_stamp']) + date_last = datetime.fromtimestamp(a['last_commit_stamp']) + delta = date_last - date_first + a['date_first'] = date_first.strftime('%Y-%m-%d') + a['date_last'] = date_last.strftime('%Y-%m-%d') + a['timedelta'] = delta + if 'lines_added' not in a: + a['lines_added'] = 0 + if 'lines_removed' not in a: + a['lines_removed'] = 0 + + def getActiveDays(self): + return self.active_days + + def getActivityByDayOfWeek(self): + return self.d_of_week_act + + def getActivityByHourOfDay(self): + return self.h_of_day_act + + def getAuthorInfo(self, author): + return self.authors[author] + + def getAuthors(self, limit=None): + res = getkeyssortedbyvaluekey(self.authors, 'commits') + res.reverse() + return res[:limit] + + def getCommitDeltaDays(self): + return (self.last_commit_stamp / 86400 - self.first_commit_stamp / 86400) + 1 # noqa + + def getFilesInCommit(self, rev): + try: + res = self.cache['files_in_tree'][rev] + except: + res = len(self.gyt_repo.repo.ls_tree(rev, + recursive=True, + name_only=True)) + if 'files_in_tree' not in self.cache: + self.cache['files_in_tree'] = {} + self.cache['files_in_tree'][rev] = res + + return res + + def getFirstCommitDate(self): + return datetime.fromtimestamp(self.first_commit_stamp) + + def getLastCommitDate(self): + return datetime.fromtimestamp(self.last_commit_stamp) + + def getLinesInBlob(self, sha1): + try: + res = self.cache['lines_in_blob'][sha1] + except: + res = len(self.gyt_repo.repo.cat_file(sha1).split('\n')) + if 'lines_in_blob' not in self.cache: + self.cache['lines_in_blob'] = {} + self.cache['lines_in_blob'][sha1] = res + return res + + def getTotalAuthors(self): + return self.total_authors + + def getTotalCommits(self): + return self.total_commits + + def getTotalFiles(self): + return self.total_files + + def getTotalLOC(self): + return self.total_lines + + def getTotalSize(self): + return self.total_size diff --git a/vilya/models/stats/utils.py b/vilya/models/stats/utils.py new file mode 100644 index 0000000..c2c9e2f --- /dev/null +++ b/vilya/models/stats/utils.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +from consts import conf + + +def getcommitrange(defaultrange='HEAD', end=None, end_only=False): + if end: + return (defaultrange, end) + if len(conf['commit_end']) > 0: + if end_only or len(conf['commit_begin']) == 0: + return (conf['commit_end'], None) + return (conf['commit_end'], conf['commit_begin']) + return (defaultrange, None) + + +def getkeyssortedbyvalues(dict): + return map(lambda el: el[1], sorted(map( + lambda el: (el[1], el[0]), dict.items()))) + + +def getkeyssortedbyvaluekey(d, key): + return map(lambda el: el[1], sorted(map( + lambda el: (d[el][key], el), d.keys()))) diff --git a/vilya/models/stubs.py b/vilya/models/stubs.py new file mode 100644 index 0000000..d09ed8f --- /dev/null +++ b/vilya/models/stubs.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- + +import logging +logger = logging.getLogger(__name__) + + +class SearchClientStub(object): + + def __init__(self, *a, **kw): + pass + + def __getattr__(self, attr): + logger.info("%s.%s is called" % (self.__class__.__name__, attr)) + return self.__init__ + + +class MQPoolStub(object): + + def __init__(self, *a, **kw): + pass + + def __getattr__(self, attr): + logger.info("%s.%s is called" % (self.__class__.__name__, attr)) + return self.__init__ diff --git a/vilya/models/tag.py b/vilya/models/tag.py new file mode 100644 index 0000000..cf5ab83 --- /dev/null +++ b/vilya/models/tag.py @@ -0,0 +1,309 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import + +from datetime import datetime + +from vilya.libs.store import mc, cache +from vilya.libs.store import store + +MC_KEY_TAG_TYPE_IDS_BY_TAG_ID = "code:tags:type_ids:by:tag_id:%s" +MC_KEY_TAG_IDS_BY_TARGET_ID_AND_TYPE = "code:tag_ids:by:target_id:%s:type:%s" +ONE_DAY = 60 * 60 * 24 + + +# TODO: table `tagname` should be renamed `tags` +# TODO: TagName should be renamed Tag +class TagName(object): + + def __init__(self, id, name, author_id, created_at, target_type, + target_id, hex_color): + self.id = id + self.name = name + self.author_id = author_id + self.created_at = created_at + self.target_type = target_type + self.target_id = target_id + self.hex_color = hex_color + self._group_uid = None + + @property + def group_uid(self): + if self._group_uid is None: + uid = 'used' + name = self.name + if ':' in name: + if self.name.startswith('type:'): + uid = 'type' + elif self.name.startswith('stage:'): + uid = 'stage' + elif self.name.startswith('priority:'): + uid = 'priority' + self._group_uid = uid + return self._group_uid + + @classmethod + def add(cls, name, author_id, target_type, target_id, color='cccccc'): + # TODO: check tag name + time = datetime.now() + tagname_id = store.execute( + "insert into tag_names(name, author_id, created_at, target_type, " + "target_id, hex_color) values ( % s, % s, NULL, % s, % s, % s) ", + (name, author_id, target_type, target_id, color)) + store.commit() + return cls( + tagname_id, name, author_id, time, target_type, target_id, color) + + @classmethod + def gets(cls): + tags = [] + rs = store.execute( + "select id, name, author_id, created_at, target_type, target_id, " + "hex_color from tag_names") + for r in rs: + tags.append(cls(*r)) + return tags + + @classmethod + def get_by_name_and_target_id(cls, name, target_type, target_id): + rs = store.execute( + "select id, name, author_id, created_at, target_type, target_id, " + "hex_color from tag_names " + "where name=%s and target_type=%s and target_id=%s", + (name, target_type, target_id)) + if rs and rs[0]: + return cls(*rs[0]) + + @classmethod + def get_by_id(cls, id): + rs = store.execute( + "select id, name, author_id, created_at, target_type, target_id, " + "hex_color from tag_names " + "where id=%s", (id,)) + if rs and rs[0]: + return cls(*rs[0]) + + def _check_tag_is_in_use(self): + rs = store.execute( + "select id from tags" + "where tag_id=%s", (self.id,)) + if rs and rs[0]: + return True + return False + + def delete(self): + n = store.execute( + "delete from tag_names " + "where id=%s", (self.id,)) + if n: + store.commit() + return True + + @property + def project_issue_ids(self): + if self.target_type == TAG_TYPE_PROJECT_ISSUE: + tags = Tag.gets_by_tag_id(self.id) + return [t.type_id for t in tags] + return [] + + @classmethod + def get_project_issue_tag(cls, name, project): + tag_name = cls.get_by_name_and_target_id( + name, TAG_TYPE_PROJECT_ISSUE, project.id) + return tag_name + + @classmethod + def get_target_tags(cls, target_type, target_id): + rs = store.execute( + "select id, name, author_id, created_at, target_type, target_id, " + "hex_color from tag_names where target_type=%s and target_id=%s", + (target_type, target_id)) + return [cls(*_) for _ in rs] if rs else [] + + def update_name(self, name): + store.execute("update tag_names set name=%s where id=%s", + (name, self.id)) + store.commit() + self.name = name + + def update_color(self, color): + store.execute("update tag_names set hex_color=%s where id=%s", + (color, self.id)) + store.commit() + self.hex_color = color + + +# TODO: table `tags` should be renamed `target_tags` or `type_tags` +# TODO: Tag should be TargetTag or TypeTag or KindTag +class Tag(object): + + def __init__(self, id, tag_id, type, type_id, author_id, created_at, + target_id): + self.id = id + self.tag_id = tag_id + self.type = type + self.type_id = type_id + self.author_id = author_id + self.created_at = created_at + self.target_id = target_id + + @property + def name(self): + tag = TagName.get_by_id(self.tag_id) + return tag.name + + # TagName + @property + def tagname(self): + return TagName.get_by_id(self.tag_id) + + @classmethod + def add(cls, tag_id, type, type_id, author_id, target_id): + time = datetime.now() + issue_tag_id = store.execute( + "insert into tags " + "(tag_id, type_id, type, author_id, created_at, target_id) " + "values (%s, %s, %s, %s, NULL, %s)", + (tag_id, type_id, type, author_id, target_id)) + store.commit() + tag = cls(issue_tag_id, tag_id, type, + type_id, author_id, time, target_id) + if tag: + tag._clean_cache() + return tag + + @classmethod + def get_type_tags(cls, type, type_id=None, author_id=None): + tags = [] + sql = ("select id, tag_id, type, type_id, author_id, created_at, " + "target_id from tags where type=%s ") + params = [type] + if type_id: + sql = sql + "and type_id=%s " + params.append(type_id) + if author_id: + sql = sql + "and author=%s " + params.append(author_id) + rs = store.execute(sql, tuple(params)) + for r in rs: + tags.append(cls(*r)) + return tags + + def _clean_cache(self): + mc.delete(MC_KEY_TAG_TYPE_IDS_BY_TAG_ID % self.tag_id) + mc.delete(MC_KEY_TAG_IDS_BY_TARGET_ID_AND_TYPE % + (self.target_id, self.type)) + + @classmethod + def gets_by_issue_id(cls, issue_id, type): + return cls.get_type_tags(type, issue_id) + + @classmethod + def gets_by_tag_id(cls, tag_id): + rs = store.execute( + "select id, tag_id, type, type_id, author_id, created_at, " + "target_id from tags where tag_id=%s ", tag_id) + return [cls(*r) for r in rs] + + @classmethod + @cache(MC_KEY_TAG_IDS_BY_TARGET_ID_AND_TYPE % ( + '{target_id}', '{type}'), expire=ONE_DAY) + def _gets_by_target_id(cls, target_id, type): + sql = ("select id, tag_id, type, type_id, author_id, created_at, " + "target_id from tags where type=%s and target_id=%s") + rs = store.execute(sql, (type, target_id)) + return rs + + @classmethod + def gets_by_target_id(cls, type, target_id): + rs = cls._gets_by_target_id(target_id, type) + return [cls(*r) for r in rs] + + @classmethod + @cache(MC_KEY_TAG_TYPE_IDS_BY_TAG_ID % '{tag_id}', expire=60 * 60 * 24) + def get_type_ids_by_tag_id(cls, tag_id): + sql = ("select id, tag_id, type, type_id, author_id, created_at, " + "target_id from tags where tag_id=%s") + rs = store.execute(sql, tag_id) + tags = [cls(*r) for r in rs] + return [t.type_id for t in tags if t] + + @classmethod + def get_by_type_id_and_tag_id(cls, type, type_id, tag_id): + rs = store.execute( + "select id, tag_id, type, type_id, author_id, created_at, " + "target_id from tags where type=%s and type_id=%s and tag_id=%s ", + (type, type_id, tag_id)) + if rs and rs[0]: + return cls(*rs[0]) + + @classmethod + def add_to_issue(cls, tag_id, type, issue_id, author_id, target_id): + return cls.add(tag_id, type, issue_id, author_id, target_id) + + @classmethod + def add_to_gist(cls, tag_id, gist_id, author_id, target_id): + return cls.add(tag_id, TAG_TYPE_GIST, gist_id, author_id, target_id) + + def delete(self): + n = store.execute( + "delete from tags " + "where id=%s", self.id) + self._clean_cache() + if n: + store.commit() + return True + + @classmethod + def gets(cls): + sql = ("select id, tag_id, type, type_id, author_id, created_at, " + "target_id from tags") + rs = store.execute(sql) + return [cls(*r) for r in rs] + + @classmethod + def get_type_ids_by_name_and_target_id(cls, type, name, target_id): + tag_name = TagName.get_by_name_and_target_id(name, type, target_id) + return cls.get_type_ids_by_tag_id(tag_name.id) if tag_name else [] + + @classmethod + def get_type_ids_by_names_and_target_id(cls, type, names, target_id): + issue_ids = [] + for name in names: + issue_ids.append( + cls.get_type_ids_by_name_and_target_id(type, name, target_id)) + return reduce(lambda x, y: set(x) & set(y), issue_ids) + + +# tag target type list +TAG_TYPE_PROJECT_ISSUE = 1 +TAG_TYPE_TEAM_ISSUE = 2 +TAG_TYPE_GIST = 3 +TAG_TYPE_FAIR_ISSUE = 4 + + +class TagMixin(object): + + @property + def tag_type(self): + raise NotImplementedError('Subclasses should implement this!') + + @property + def tags(self): + return self.get_tags() + + def get_tags(self): + all_tags = TagName.get_target_tags(self.tag_type, self.id) + return all_tags + + def get_group_tags(self, selected_names): + group_tags = {} + all_tags = TagName.get_target_tags(self.tag_type, self.id) + for tag in all_tags: + if tag.group_uid not in group_tags: + group_tags[tag.group_uid] = [] + if tag.name in selected_names: + group_tags[tag.group_uid].append((tag, 0, 'selected')) + else: + group_tags[tag.group_uid].append((tag, 0, 'unselected')) + return group_tags diff --git a/vilya/models/team.py b/vilya/models/team.py new file mode 100644 index 0000000..934ce3e --- /dev/null +++ b/vilya/models/team.py @@ -0,0 +1,337 @@ +# coding: utf-8 +from __future__ import absolute_import +import requests + +from vilya.libs.store import IntegrityError, store +from vilya.libs.props import PropsMixin, PropsItem +from vilya.libs.text import trunc_utf8 +from vilya.models.consts import TEAM_MEMBER, TEAM_OWNER, UPLOAD_URL +from vilya.models.ticket import Ticket +from vilya.models.tag import TagMixin, TAG_TYPE_TEAM_ISSUE +from vilya.models.team_project import TeamProject +from vilya.models.nteam import TeamProjectRelationship, TeamUserRelationship + + +class Team(PropsMixin, TagMixin): + + def __init__(self, id, uid, name, description, created_at): + self.id = id + self.uid = uid + self.name = name + self.description = description + self.created_at = created_at + + def get_uuid(self): + return "/team/%s" % self.id + + uuid = property(get_uuid) + + profile = PropsItem("profile", {}) + weekly = PropsItem("weekly") + + def __repr__(self): + return '<Team %s, %s>' % (self.id, self.uid) + + def __str__(self): + return self.name + + def profile_url(self, pro_key='origin', + default='/static/img/team_default_profile.jpg'): + if not self.profile: + return default + elif self.profile.get('origin') and not self.profile.get('icon'): + # FIXME: 这段逻辑是为了让托管在c.dapps.douban.com的团队图片切换到p上面. + # 一段时间后就可以删掉了 + return self.gen_profile_icon() + else: + return self.profile.get(pro_key, default) + + def gen_profile_icon(self): + profile = self.profile + picture_url = self.profile.get('origin') + if 'c.dapps.douban.com' in picture_url: + dirname = picture_url.rsplit('/', 1)[0] + profile['icon'] = '{0}/i-96x96.jpg'.format(dirname) + else: + hash_png = picture_url.rsplit('/', 1)[1] + rsize_url = '{0}/r/{1}?w=100&h=100'.format(UPLOAD_URL, hash_png) + r = requests.get(rsize_url) + r.raise_for_status() + profile['icon'] = r.text + self.profile = profile + return profile['icon'] + + def profile_icon(self): + return self.profile_url('icon', '/static/img/logo.svg') + + @property + def short_description(self): + return trunc_utf8(self.description, 80) + + @property + def url(self): + return '/teams/%s/' % self.uid + + @property + def tag_type(self): + return TAG_TYPE_TEAM_ISSUE + + @property + def doc_project(self): + team_projects = TeamProject.gets_by(team_id=self.id) + if not team_projects: + return None + team_project = team_projects[0] + return team_project.project + + def as_dict(self): + d = {} + d['name'] = self.name + d['description'] = self.description + d['uid'] = self.uid + d['created_at'] = self.created_at.strftime('%Y-%m-%dT%H:%M:%S') + return d + + def delete(self): + TeamProjectRelationship.deletes(team_id=self.id) + TeamUserRelationship.deletes(team_id=self.id) + del self.profile + store.execute("delete from team where team_id=%s", (self.uid,)) + store.commit() + + @property + def n_projects(self): + return TeamProjectRelationship.count(team_id=self.id) + + @property + def projects(self): + from vilya.models.project import CodeDoubanProject + return filter(None, + [CodeDoubanProject.get(_) for _ in self.project_ids]) + + def is_project(self, project_id): + r = TeamProjectRelationship.get(team_id=self.id, project_id=project_id) + return True if r else False + + @property + def project_ids(self): + rs = TeamProjectRelationship.gets(team_id=self.id) + return [r.project_id for r in rs] + + @property + def n_tickets(self): + return Ticket.get_count_by_team_id(self.id) + + def is_admin(self, user_id): + return self.is_owner(user_id) + + def is_owner(self, user_id): + r = TeamUserRelationship.get(team_id=self.id, user_id=user_id) + return r and r.is_owner or False + + def is_member(self, user_id): + r = TeamUserRelationship.get(team_id=self.id, user_id=user_id) + return True if r else False + + def is_viewer(self, user_id): + return True + + def had_joined(self, user_id): + r = TeamUserRelationship.get(team_id=self.id, user_id=user_id) + return r or False + + @property + def owner_ids(self): + rs = TeamUserRelationship.gets(team_id=self.id, identity=TEAM_OWNER) + return [r.user_id for r in rs] + + @property + def member_ids(self): + rs = TeamUserRelationship.gets(team_id=self.id, identity=TEAM_MEMBER) + return [r.user_id for r in rs] + + @property + def user_ids(self): + rs = TeamUserRelationship.gets(team_id=self.id) + return [r.user_id for r in rs] + + @property + def users(self): + from vilya.models.user import User + return [User(u) for u in self.user_ids] + + @property + def all_members(self): + # deprecated + # used in mikoto + return self.user_ids + + @property + def n_owners(self): + return TeamUserRelationship.count(team_id=self.id, identity=TEAM_OWNER) + + # TODO: rename to n_users + @property + def n_members(self): + return TeamUserRelationship.count(team_id=self.id) + + @property + def n_users(self): + return TeamUserRelationship.count(team_id=self.id) + + @classmethod + def get_by_user_id(cls, user_id): + rls = TeamUserRelationship.gets(user_id=user_id) + teams = [cls.get(rl.team_id) for rl in rls] + return [(team.uid, team.name) for team in teams if team] + + @classmethod + def gets_by_project_id(cls, project_id): + return [cls.get(tpr.team_id) + for tpr in TeamProjectRelationship.gets(project_id=project_id)] + + @classmethod + def get_by_uid(cls, uid, ignore_case=True): + # dirty hack + if uid == 'fair': + from vilya.models.fair import FairTeam + return FairTeam() + + team_query = 'lower(`team_id`)' if ignore_case else 'team_id' + + rs = store.execute('select id, team_id, name, description, created_at ' + 'from team where {0}=%s'.format(team_query), (uid,)) + return rs and cls(*rs[0]) or None + + @classmethod + def gets(cls): + rs = store.execute('select id, team_id, name, description, created_at ' + 'from team order by id') + return [cls(*r) for r in rs] + + @classmethod + def gets_by_page(cls, start=0, limit=6): + rs = store.execute('select id, team_id, name, description, created_at ' + 'from team order by id limit %s, %s', + (start, limit)) + return [cls(*r) for r in rs] + + @classmethod + def get_all_team_uids(cls): + rs = store.execute('select team_id from team order by id') + return [r for r, in rs] + + @classmethod + def get(cls, id): + # dirty hack + if id == 0: + from vilya.models.fair import FairTeam + return FairTeam() + + sets = store.execute('select id, team_id, name, ' + 'description, created_at ' + 'from team where id=%s', (id,)) + return sets and cls(*sets[0]) or None + + @classmethod + def add(cls, uid, name, description): + try: + id = store.execute('insert into team ' + '(team_id, name, description) ' + 'values(%s, %s, %s)', + (uid, name, description)) + store.commit() + except IntegrityError: + return None + return cls.get(id) + + def update(self, uid, name, description): + store.execute('update team set team_id=%s, name=%s, description=%s ' + 'where id=%s', (uid, name, description, int(self.id))) + store.commit() + + def add_project(self, project): + r = TeamProjectRelationship.get(team_id=self.id, + project_id=project.id) + if not r: + TeamProjectRelationship.create(team_id=self.id, + project_id=project.id) + return True + + def remove_project(self, project): + r = TeamProjectRelationship.get(team_id=self.id, + project_id=project.id) + if r: + r.delete() + return True + + def create_group(self, **kw): + from vilya.models.team_group import TeamGroup + kw['team_id'] = self.id + t = TeamGroup.create(**kw) + return t + + @property + def groups(self): + from vilya.models.team_group import TeamGroup + return TeamGroup.gets(team_id=self.id) + + def add_user(self, user, identity): + r = TeamUserRelationship.get(team_id=self.id, + user_id=user.name) + if not r: + TeamUserRelationship.create(team_id=self.id, + user_id=user.name, + identity=identity) + return True + + def remove_user(self, user): + r = TeamUserRelationship.get(team_id=self.id, + user_id=user.name) + if r: + r.delete() + return True + + def add_owner(self, username): + r = TeamUserRelationship.get(team_id=self.id, + user_id=username) + if not r: + r = TeamUserRelationship.create(team_id=self.id, + user_id=username, + identity=TEAM_OWNER) + return True + if r.identity != TEAM_OWNER: + r.identity = TEAM_OWNER + r.save() + return True + + def remove_owner(self, username): + r = TeamUserRelationship.get(team_id=self.id, + user_id=username) + if r: + if r.identity != TEAM_OWNER: + return False + r.delete() + return True + + def add_member(self, username): + r = TeamUserRelationship.get(team_id=self.id, + user_id=username) + if not r: + r = TeamUserRelationship.create(team_id=self.id, + user_id=username, + identity=TEAM_MEMBER) + return True + if r.identity != TEAM_MEMBER: + r.identity = TEAM_MEMBER + r.save() + return True + + def remove_member(self, username): + r = TeamUserRelationship.get(team_id=self.id, + user_id=username) + if r: + if r.identity != TEAM_MEMBER: + return False + r.delete() + return True diff --git a/vilya/models/team_group.py b/vilya/models/team_group.py new file mode 100644 index 0000000..f290945 --- /dev/null +++ b/vilya/models/team_group.py @@ -0,0 +1,123 @@ +# -*- coding: utf-8 -*- +from vilya.libs.model import BaseModel, ModelField +from vilya.models.consts import ( + PERM_PULL, PERM_PUSH, PERM_ADMIN, PERM_MERGE, PERM_TEXT) + + +class TeamGroup(BaseModel): + __orz_table__ = "team_groups" + name = ModelField(as_key=ModelField.KeyType.DESC) + team_id = ModelField(as_key=ModelField.KeyType.DESC) + description = ModelField() + permission = ModelField(as_key=ModelField.KeyType.DESC, + default=PERM_PULL) + creator_id = ModelField() + created_at = ModelField(auto_now_create=True) + + @property + def permission_text(self): + return PERM_TEXT.get(self.permission, 'pull') + + def add_user(self, **kw): + kw['group_id'] = self.id + return GroupUser.create(**kw) + + def add_project(self, **kw): + kw['group_id'] = self.id + return ProjectGroup.create(**kw) + + def remove_user(self, **kw): + kw['group_id'] = self.id + u = GroupUser.get(**kw) + if u: + u.delete() + + def remove_project(self, **kw): + kw['group_id'] = self.id + u = ProjectGroup.get(**kw) + if u: + u.delete() + + @property + def url(self): + return self.team.url + 'groups/%s/' % self.name + + @property + def team(self): + from vilya.models.team import Team + return Team.get(self.team_id) + + @property + def full_name(self): + return "%s/%s" % (self.team.uid, self.name) + + @property + def members(self): + from vilya.models.user import User + rs = GroupUser.gets(group_id=self.id) + return [User(r.user_id) for r in rs] + + @property + def projects(self): + from vilya.models.project import CodeDoubanProject + rs = ProjectGroup.gets(group_id=self.id) + return filter(None, [CodeDoubanProject.get(r.project_id) for r in rs]) + + def is_member(self, user_id): + r = GroupUser.get(group_id=self.id, user_id=user_id) + return True if r else False + + def to_dict(self): + return dict(name=self.name, + team_id=self.team_id) + + @classmethod + def translate_perm(cls, perm): + r = PERM_PULL + if perm == 'push': + r = PERM_PUSH + elif perm == 'merge': + r = PERM_MERGE + elif perm == 'admin': + r = PERM_ADMIN + return r + + +class GroupUser(BaseModel): + __orz_table__ = "group_users" + group_id = ModelField(as_key=ModelField.KeyType.DESC) + user_id = ModelField(as_key=ModelField.KeyType.DESC) + created_at = ModelField(auto_now_create=True) + + @property + def group(self): + return TeamGroup.get(id=self.group_id) + + @property + def user(self): + from vilya.models.user import User + return User(self.user_id) + + def to_dict(self): + return dict(group_name=self.group.name, + user_name=self.user_id) + + +class ProjectGroup(BaseModel): + __orz_table__ = "projects_groups" + project_id = ModelField(as_key=ModelField.KeyType.DESC) + group_id = ModelField(as_key=ModelField.KeyType.DESC) + created_at = ModelField(auto_now_create=True) + + @property + def group(self): + return TeamGroup.get(id=self.group_id) + + @property + def project(self): + from vilya.models.project import CodeDoubanProject + return CodeDoubanProject.get(self.project_id) + + def to_dict(self): + return dict(group_name=self.group.name, + project_name=self.project.name) diff --git a/vilya/models/team_issue.py b/vilya/models/team_issue.py new file mode 100644 index 0000000..37901f6 --- /dev/null +++ b/vilya/models/team_issue.py @@ -0,0 +1,112 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from vilya.libs.store import store +from vilya.models.issue import Issue, get_issue_by_id_and_state +from vilya.models.tag import TAG_TYPE_TEAM_ISSUE + + +class TICounter(object): + """Team Issue Counter""" + + @classmethod + def incr(cls, team_id, count=None): + if count >= 0: + sql = ("insert into team_issue_counters (team_id, counter) " + "values (%s, LAST_INSERT_ID(%s)) on duplicate key " + "update counter = LAST_INSERT_ID(%s)") + id = store.execute(sql, (team_id, count, count)) + else: + sql = ("insert into team_issue_counters (team_id, counter) " + "values (%s, LAST_INSERT_ID(%s)) on duplicate key " + "update counter = LAST_INSERT_ID(counter + 1)") + id = store.execute(sql, (team_id, 1)) + store.commit() + return id + + +class TeamIssue(Issue): + target_type = 'team' + tag_type = TAG_TYPE_TEAM_ISSUE + provided_features = ['team-issue', 'vote'] + + def __init__(self, id, team_id, issue_id, number, title=None, + creator=None, assignee=None, closer=None, + created_at=None, updated_at=None, closed_at=None, type=''): + Issue.__init__(self, issue_id, title, + creator, assignee, closer, + created_at, updated_at, closed_at, type=type, + target_id=team_id) + self.id = id + self.team_id = team_id + self.issue_id = issue_id + self.number = number + + def __repr__(self): + return '<TeamIssue(id=%s, team=%s, number=%s)>' % (self.issue_id, + self.team_id, + self.number) + + @property + def url(self): + return '%sissues/%s/' % (self.target.url, self.number) + + @classmethod + def add(cls, title, description, creator, number=None, + team=None, project=None, assignee=None, closer=None, + created_at=None, updated_at=None, closed_at=None): + issue = Issue.add(title, description, creator, assignee=assignee, + closer=closer, type=cls.target_type, target_id=team) + if issue and team: + number = TICounter.incr(team, number) + team_issue_id = store.execute( + 'insert into team_issues (team_id, issue_id, number) ' + 'values (%s, %s, %s)', + (team, issue.id, number)) + store.commit() + return cls(team_issue_id, team, issue.id, number, title, creator, + assignee, closer, issue.created_at, issue.updated_at) + + @classmethod + def get(cls, team_id, issue_id=None, number=None): + sql = ("select id, team_id, issue_id, number from team_issues " + "where team_id = %s ") + params = [team_id] + if issue_id: + sql = sql + "and issue_id = %s " + params.append(issue_id) + if number: + sql = sql + "and number = %s " + params.append(number) + rs = store.execute(sql, tuple(params)) + if rs and rs[0]: + return cls(*rs[0]) + + @property + def target(self): + from vilya.models.team import Team + return Team.get(self.team_id) + + @classmethod + def get_by_issue_id(cls, issue_id): + sql = ("select id, team_id, issue_id, number from team_issues " + "where issue_id = %s ") + rs = store.execute(sql, (issue_id,)) + if rs and rs[0]: + id, team_id, issue_id, number = rs[0] + issue = Issue.get(issue_id) + if issue: + return cls(id, team_id, issue.id, number, issue.title, + issue.creator_id, issue.assignee_id, + issue.closer_id, issue.created_at, issue.updated_at, + issue.closed_at, issue.type) + + @classmethod + def gets_by_issue_ids(cls, issue_ids, state): + team_issues = [] + for issue_id in issue_ids: + team_issue = get_issue_by_id_and_state(issue_id, state) + if team_issue: + team_issues.append(team_issue) + team_issues.sort(key=lambda x: x.updated_at, reverse=True) + return team_issues diff --git a/vilya/models/team_project.py b/vilya/models/team_project.py new file mode 100644 index 0000000..723b01f --- /dev/null +++ b/vilya/models/team_project.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +from vilya.libs.store import OrzField, OrzBase +from vilya.models.project import CodeDoubanProject + + +class TeamProject(OrzBase): + __orz_table__ = "team_projects" + team_id = OrzField(as_key=True) + project_id = OrzField() + created_at = OrzField(default='null') + + @property + def project(self): + return CodeDoubanProject.get(self.project_id) diff --git a/vilya/models/ticket.py b/vilya/models/ticket.py new file mode 100644 index 0000000..3f444ac --- /dev/null +++ b/vilya/models/ticket.py @@ -0,0 +1,587 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import + +from datetime import datetime +from itertools import groupby + +from vilya.libs.store import store, mc, cache, bdb +from vilya.libs.signals import codereview_signal +from dispatches import dispatch +from vilya.libs.props import PropsMixin +from vilya.models.user import User +from vilya.models.project import CodeDoubanProject +from vilya.models.consts import ( + LINECOMMENT_INDEX_EMPTY, TICKET_NODE_TYPE_COMMENT, + TICKET_NODE_TYPE_LINECOMMENT) +from vilya.models.linecomment import PullLineComment +from vilya.models.nticket import TicketNode, TicketCommits, TicketComment + +MCKEY_TICKET = 'ticket:%s' +BDB_TICKET_DESCRIPTION_KEY = 'ticket_description:%s' +BDB_TICKET_LINECOMMENT_CONTENT_KEY = 'ticket_linecomment_content:%s' + +TIME_SECOND_TO_MONTH = 2592000 +TIME_SECOND_TO_DAY = 86400 + + +class PRCounter(object): + + @classmethod + def incr(cls, proj_id, count=None): + if count >= 0: + sql = ("insert into pullreq_counter (project_id, counter) " + "values (%s, LAST_INSERT_ID(%s)) on duplicate key " + "update counter = LAST_INSERT_ID(%s)") + id = store.execute(sql, (proj_id, count, count)) + else: + sql = ("insert into pullreq_counter (project_id, counter) " + "values (%s, LAST_INSERT_ID(%s)) on duplicate key " + "update counter = LAST_INSERT_ID(counter + 1)") + id = store.execute(sql, (proj_id, 1)) + store.commit() + return id + + +class Ticket(PropsMixin): + + def __init__(self, id, ticket_number, project_id, + title, description, author, time, closed): + self.id = id + self.ticket_number = ticket_number # start from #1 in each project + self.project_id = project_id + self.title = title + bdb_description = bdb.get(BDB_TICKET_DESCRIPTION_KEY % id) + self.description = bdb_description or description + self.author = author + self.time = time + self.closed = closed + + def get_uuid(self): + return '/ticket/%s' % self.id + + @property + def owner(self): + return User(self.author) + + @property + def ticket_id(self): + return self.ticket_number + + @property + def url(self): + project = self.project + if project: + return '/%s/pull/%s/' % (project.name, self.ticket_number) + else: + return '' + + def _get_closed_by(self): + """ + ticket is closed by whom + """ + return self.props.get('close_by') + + def _set_closed_by(self, close_by): + self.set_props_item('close_by', close_by) + + close_by = property(_get_closed_by, _set_closed_by) + + @property + def project(self): + return CodeDoubanProject.get(self.project_id) + + @property + def participants(self): + return self.props.get('participants') or [] + + def add_participant(self, username): + participants = self.participants + if username and username not in participants: + participants.append(username) + self.set_props_item('participants', participants) + + user = User(username) + user.add_participated_pull_request(self.id) + return self.participants + + @classmethod + def add(cls, project_id, title, description, author, ticket_number=None): + ticket_number = PRCounter.incr(project_id, ticket_number) + id = store.execute( + "insert into codedouban_ticket " + "(ticket_number, project_id, title, description, author) " + "values (%s, %s, %s, %s, %s)", + (ticket_number, project_id, title, description, author)) + if not id: + store.rollback() + raise Exception("Unable to add") + store.commit() + mc.delete(MCKEY_TICKET % id) + bdb.set(BDB_TICKET_DESCRIPTION_KEY % id, description) + ticket = cls.get(id) + ticket.add_participant(author) + return ticket + + def update(self, title='', description=''): + store.execute("update codedouban_ticket set title=%s, description=%s " + "where id=%s", (title, description, self.id)) + store.commit() + mc.delete(MCKEY_TICKET % self.id) + bdb.set(BDB_TICKET_DESCRIPTION_KEY % self.id, description) + + @classmethod + @cache(MCKEY_TICKET % '{id}') + def get(cls, id): + rs = store.execute("select id, ticket_number, project_id, title, " + "description, author, time, closed " + "from codedouban_ticket where id = %s", (id,)) + res = rs and rs[0] + return cls(*res) if res else None + + @classmethod + def get_by_projectid_and_ticketnumber(cls, project_id, ticket_number): + rs = store.execute("select id, ticket_number, project_id, title, " + "description, author, time, closed " + "from codedouban_ticket " + "where project_id=%s and ticket_number=%s" + % (project_id, ticket_number)) + res = rs and rs[0] + return cls(*res) if res else None + + @classmethod + def gets(cls, project_id=None, author=None, + closed=False, date_from=None, date_to=None): + sql = "select id, ticket_number, project_id, title, description, " \ + "author, time, closed from codedouban_ticket where " + values = [] + if closed: + sql = "%s%s " % (sql, "closed is not NULL") + else: + sql = "%s%s " % (sql, "closed is NULL") + if project_id: + sql = "%s%s " % (sql, "and project_id=%s") + values.append(project_id) + if author: + sql = "%s%s " % (sql, "and author=%s") + values.append(author) + if date_from: + sql = "%s%s " % (sql, "and time>=%s") + values.append(date_from) + if date_to: + sql = "%s%s " % (sql, "and time<%s") + values.append(date_to) + sql = "%s%s " % (sql, "order by time desc ") + rs = store.execute(sql, values) + return [cls(*r) for r in rs] + + @classmethod + def gets_by_projectid_and_ticketnumbers(cls, project_id, ticket_numbers): + tickets = [] + for ticket_num in ticket_numbers: + ticket = cls.get_by_projectid_and_ticketnumber( + project_id, ticket_num) + if ticket: + tickets.append(ticket) + return tickets + + @classmethod + def get_count_by_proj(cls, proj_id, closed=False): + rs = store.execute("select count(id) from codedouban_ticket " + "where project_id=%s " + "and closed is {0} ".format( + 'not NULL' if closed else 'NULL'), (proj_id,)) + res = rs and rs[0] + return res[0] if res else 0 + + @classmethod + def get_count_by_proj_and_author(cls, proj_id, author, closed=False): + rs = store.execute("select count(id) from codedouban_ticket " + "where project_id=%s " + "and author=%s " + "and closed is {0}".format( + 'not NULL' if closed else 'NULL'), + (proj_id, author)) + res = rs and rs[0] + return res[0] if res else 0 + + @classmethod + def gets_by_proj(cls, proj_id, closed=False, limit=25, start=0): + rs = store.execute("select id, ticket_number, project_id, title, " + "description, author, time, closed " + "from codedouban_ticket where project_id=%s " + "and closed is {0} order by time desc " + "limit %s, %s".format( + 'not NULL' if closed else 'NULL'), + (proj_id, start, limit)) + return [cls(*res) for res in rs] + + @classmethod + def gets_by_proj_and_author(cls, proj_id, author, closed=False, limit=25, + start=0): + rs = store.execute("select id, ticket_number, project_id, title, " + "description, author, time, closed " + "from codedouban_ticket where project_id=%s " + "and author=%s and closed is {0} order by time" + " desc limit %s, %s".format( + 'not NULL' if closed else 'NULL'), + (proj_id, author, start, limit)) + return [cls(*res) for res in rs] + + @classmethod + def gets_by_team_id(cls, team_id, closed=False, limit=25, start=0): + rs = store.execute("select id, ticket_number, project_id, title, " + "description, author, time, closed " + "from codedouban_ticket where project_id in " + "(select project_id from team_project_relationship " + "where team_id=%s) and closed is {0} " + "order by time desc limit %s, %s".format( + 'not NULL' if closed else 'NULL'), + (team_id, start, limit)) + return [cls(*res) for res in rs] + + @classmethod + def get_count_by_proj_id(cls, proj_id): + rs = store.execute("select count(id) from codedouban_ticket " + "where project_id=%s ", + (proj_id,)) + return rs[0][0] + + @classmethod + def get_count_by_team_id(cls, team_id, closed=False): + rs = store.execute("select count(id) from codedouban_ticket " + "where project_id in (select project_id from " + "team_project_relationship where team_id=%s) " + "and closed is {0} ".format( + 'not NULL' if closed else 'NULL'), + (team_id,)) + return rs[0][0] + + @classmethod + def gets_all_by_proj(cls, proj_id): + rs = store.execute("select id, ticket_number, project_id, title, " + "description, author, time, closed " + "from codedouban_ticket where project_id=%s", + (proj_id,)) + return [cls(*res) for res in rs] + + @classmethod + def gets_by_author(cls, author, closed=False, limit=25, start=0): + rs = store.execute( + "select id, ticket_number, project_id, title, " + "description, author, time, closed " + "from codedouban_ticket where author=%s and closed is {0} " + "order by time desc limit %s, %s".format( + 'not NULL' if closed else 'NULL'), + (author, start, limit)) + return [cls(*r) for r in rs] + + @classmethod + def gets_ranks_by_author(cls, author, closed=False, limit=25, start=0): + rs = store.execute( + "select id, ticket_number, project_id, title, description, " + "author, time, closed from codedouban_ticket where author=%s" + "order by rank_score desc limit %s, %s ", + (author, start, limit)) + return [cls(*r) for r in rs] + + @classmethod + def gets_all_opened(cls, limit=100, start=0): + rs = store.execute("select id, ticket_number, project_id, title, " + "description, author, time, closed " + "from codedouban_ticket where closed is NULL " + "order by time desc limit %s, %s", + (start, limit)) + return [cls(*res) for res in rs] + + def get_nodes(self): + return TicketNode.gets_by_ticket_id(self.id) + + def get_codereviews_group(self): + # FIXME: refactor this + # group = { linecomment_id: ... } + group = {} + codereviews = PullLineComment.gets_by_target(self.id) + comparer = lambda x: (x.old_path + + (str(x.oids) if x.has_oids else x.from_sha) + + str(x.linenum if x.has_linenum else x.position)) + codereviews.sort(key=comparer) + for k, v in groupby(codereviews, key=comparer): + crs = list(v) + codereview = crs[0] + group[codereview.id] = crs # 相当于缩点了 + return group + + def get_comments(self): + comments = TicketComment.gets_by_ticketid(self.id) + return comments + + # 只是用来拿 length + def get_codereviews(self): + codereviews = PullLineComment.gets_by_target(self.id) + return codereviews + + def get_commits(self): + return TicketCommits.gets_by_ticketid(self.id) + + def add_commits(self, commits, author): + commit = TicketCommits.add(self.id, commits, author) + return commit + + def add_comment(self, content, author): + self.add_participant(author) + comment = TicketComment.add(self.id, content, author) + return comment + + # TODO: 修改调用者,修改参数,需要前端修改模版,js等。。 + def add_codereview(self, from_sha, to_sha, + old_path, new_path, from_oid, to_oid, + old_linenum, new_linenum, + author, content): + new_path = new_path or old_path + self.add_participant(author) + codereview = PullLineComment.add(self.id, from_sha, to_sha, + old_path, new_path, from_oid, + to_oid, old_linenum, new_linenum, + author, content) + TicketNode.add_codereview(codereview) + return codereview + + def close(self, operator): + closed_time = datetime.now() + store.execute("update codedouban_ticket set closed=%s where id=%s", + (closed_time, self.id)) + store.commit() + mc.delete(MCKEY_TICKET % self.id) + self.close_by = operator + + for paticipant in self.participants: + # FIXME better interface + from vilya.models.user import UserPullRequests + UserPullRequests(paticipant).remove_participated(self.id) + UserPullRequests(paticipant).remove_invited(self.id) + + self.add_participant(operator) + TicketNode.add_close(self.id, operator, closed_time) + + def open(self, operator): + opened_time = datetime.now() + store.execute("update codedouban_ticket set closed=null where id=%s", + (self.id,)) + store.commit() + mc.delete(MCKEY_TICKET % self.id) + self.close_by = None + self.add_participant(operator) + TicketNode.add_open(self.id, operator, opened_time) + + def as_dict(self): + dic = {"title": self.title, + "description": self.description, + "author": self.author, + "time": self.time, + "closed": self.closed, + "number": self.ticket_number} + project = self.project + if project: + dic["project"] = project.as_dict() + return dic + + +# 只用于迁移数据 +class TicketCodereview(object): + # TODO: ! 迁移数据 codedouban_ticket_codereview + + def __init__(self, id, ticket_id, content, path, position, + line_mark, from_ref, author, time, new_path=None): + self.id = id + self.ticket_id = ticket_id + bdb_content = bdb.get(BDB_TICKET_LINECOMMENT_CONTENT_KEY % id) + self.content = bdb_content or content + self.path = path + self.position = position + self._line_mark = line_mark + self.old = LINECOMMENT_INDEX_EMPTY + self.new = LINECOMMENT_INDEX_EMPTY + if len(line_mark.split('|')) > 1: + old, new = line_mark.split('|') + self.old = int(old) + self.new = int(new) + self.from_ref = from_ref + self.author = author + self.time = time + self.new_path = new_path + + @property + def linenum(self): + return (self.old, self.new) + + # TODO: 重构底层数据后改掉 + @property + def type(self): + return 'pull' + + @property + def has_linenum(self): + ''' 便于区分老数据,没有linenum的只能用position显示 ''' + return self._line_mark != '' + + @property + def paths(self): + ''' file paths(old/new) about this linecomment ''' + if self.new_path: + return [self.path, self.new_path] + return [self.path] + + @classmethod + def add(cls, ticket_id, content, path, position, + old, new, from_ref, author, new_path=None): + # FIXME: mysql里的content是废的啊,是历史原因么? + line_mark = str(old) + '|' + str(new) + id = store.execute("insert into codedouban_ticket_codereview " + "(ticket_id, content, path, position, line_mark, " + "from_ref, author, new_path) " + "values (%s, %s, %s, %s, %s, %s, %s, %s)", + (ticket_id, content, path, position, line_mark, + from_ref, author, new_path)) + if not id: + store.rollback() + raise Exception("Unable to add") + store.commit() + bdb.set(BDB_TICKET_LINECOMMENT_CONTENT_KEY % id, content) + comment = cls.get(id) + ticket = Ticket.get(ticket_id) + # TODO: 重构feed之后取消signal发送 + codereview_signal.send(comment, content=content, + ticket=Ticket.get(ticket_id), + author=author, comment=comment) + dispatch('codereview', data={ + 'comment': comment, + 'ticket': ticket, + 'sender': author, + }) + return comment + + def update(self, content): + store.execute("update codedouban_ticket_codereview " + "set time=now() where id=%s", (self.id,)) + store.commit() + bdb.set(BDB_TICKET_LINECOMMENT_CONTENT_KEY % self.id, content) + + def delete(self): + node = TicketNode.get_by_codereview(self) + if node: + node.delete() + bdb.delete(BDB_TICKET_LINECOMMENT_CONTENT_KEY % self.id) + n = store.execute("delete from codedouban_ticket_codereview " + "where id=%s", (self.id,)) + if n: + store.commit() + return True + + @classmethod + def get(cls, id): + rs = store.execute( + "select id, ticket_id, content, path, position, line_mark, " + "from_ref, author, time, new_path " + "from codedouban_ticket_codereview " + "where id=%s", (id,)) + res = rs and rs[0] + return cls(*res) if res else None + + @classmethod + def gets_by_ticketid(cls, ticket_id): + rs = store.execute( + "select id, ticket_id, content, path, position, line_mark, " + "from_ref, author, time, new_path " + "from codedouban_ticket_codereview " + "where ticket_id=%s", (ticket_id,)) + return [cls(*res) for res in rs] + + @classmethod + def gets_by_ticketid_and_ref(cls, ticket_id, from_ref): + rs = store.execute( + "select id, ticket_id, content, path, position, line_mark, " + "from_ref, author, time, new_path " + "from codedouban_ticket_codereview " + "where ticket_id=%s and from_ref=%s", + (ticket_id, from_ref)) + return [cls(*res) for res in rs] + + +class TicketRank(object): + + @classmethod + def get_last_created_time(cls, ticket_id): + rs = store.execute( + "select MAX(created_at) " + "from ticket_nodes where ticket_id=%s ", (ticket_id,)) + return rs[0][0] if rs[0][0] else 0 + + @classmethod + def get_node_count(cls, ticket_id, type): + rs = store.execute("select count(id) " + "from ticket_nodes where ticket_id=%s " + "and type = %s", + (ticket_id, type)) + return int(rs[0][0]) if rs[0][0] else 0 + + @classmethod + def get_line_comment_count(cls, ticket_id): + r = cls.get_node_count(ticket_id, TICKET_NODE_TYPE_LINECOMMENT) + return r + + @classmethod + def get_comment_count(cls, ticket_id): + r = cls.get_node_count(ticket_id, TICKET_NODE_TYPE_COMMENT) + return r + + @classmethod + def get_sum_count(cls, ticket_id): + r = cls.get_comment_count(ticket_id) + cls.get_line_comment_count( + ticket_id) * 1.3 + return r + + @classmethod + def get_rank_by_ticket_id(cls, ticket_id): + r = store.execute("select rank_score from codedouban_ticket " + "where id=%s", (ticket_id,)) + return r + + @classmethod + def count_ticket_rank(cls, is_closed): + limit_min = 0 + r_max = store.execute("select count(id) from codedouban_ticket " + "where closed is {0}".format( + 'not NULL' if is_closed else 'NULL')) + max_count = int(r_max[0][0]) + while max_count >= limit_min: + rs = store.execute( + "select id, time from codedouban_ticket " + "where closed is {0} limit %s, 50".format( + 'not NULL' if is_closed else 'NULL'), limit_min) + for ticket_id, created_time in rs: + created_difftime = ( + datetime.now() - created_time).total_seconds() + exponent = int(created_difftime / TIME_SECOND_TO_MONTH) + 1 + + # 选取最近6个月的ticket + if exponent < 7: + updated_time = cls.get_last_created_time(ticket_id) + if updated_time == 0: + updated_difftime = ( + datetime.now() - created_time).total_seconds() + else: + updated_difftime = ( + datetime.now() - updated_time).total_seconds() + time_score = int(updated_difftime / TIME_SECOND_TO_DAY) + + sum_count = cls.get_sum_count(ticket_id) + time_score = (time_score if is_closed else time_score - 5) + + # 0.9 ^ Ticket创建到现在时间(月数) X Comment的数量 + # + 30 - Ticket最近更新到现在的时间(天数) + score = 0.9 ** exponent * sum_count + 30 - time_score + store.execute("update codedouban_ticket set rank_score=%s " + "where id=%s", (score, ticket_id)) + store.commit() + limit_min = limit_min + 50 diff --git a/vilya/models/timeline.py b/vilya/models/timeline.py new file mode 100644 index 0000000..16dda20 --- /dev/null +++ b/vilya/models/timeline.py @@ -0,0 +1,524 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import +import logging + +from vilya.models.user import User +from vilya.models.pull import PullRequest +from vilya.models.project import CodeDoubanProject +from vilya.models.ticket import Ticket +from vilya.models.comment import Comment +from vilya.models.issue import Issue +from vilya.models.team_issue import TeamIssue +from vilya.models.project_issue import ProjectIssue +from vilya.models.gist import Gist +from vilya.models.team import Team + +logging.basicConfig() +logger = logging.getLogger(__name__) +logger.setLevel(logging.INFO) + + +def _get_user_by_name(name): + user = {} + _user = User(name) + user = dict( + name=_user.name, + icon=_user.avatar_url, + ) + return user + + +def _get_project_by_name(name): + project = {} + _project = CodeDoubanProject.get_by_name(name) + if not _project: + return None + _author = _get_user_by_name(_project.owner_id) + project = dict( + id=_project.id, + name=_project.name, + owner=_author, + ) + return project + + +def _get_project_by_id(id): + project = {} + _project = CodeDoubanProject.get(id) + _author = _get_user_by_name(_project.owner_id) + project = dict( + id=_project.id, + name=_project.name, + owner=_author, + ) + return project + + +def _get_pr_by_project_and_ticket(project, ticket): + pull = PullRequest.get_by_proj_and_ticket(project.id, ticket.ticket_id) + _from_project = _get_project_by_name(str(pull.from_proj)) + if _from_project: + _from_project['branch'] = pull.from_branch + _to_project = _get_project_by_name(str(pull.to_proj)) + if _to_project: + _to_project['branch'] = pull.to_branch + commits = pull.commits + commit = [_format_commit_object_data(c) for c in commits] + pr = dict( + id=ticket.ticket_id, + name=ticket.title, + from_project=_from_project, + to_project=_to_project, + commit=commit, + ) + return pr + + +def _get_pr_by_uid(uid): + pr = {} + # uid: pullrequest-project-ticketid-status + if uid and uid.startswith('pullrequest'): + fields = uid.split('-') + if len(fields) != 4: + return pr + _, project_name, ticket_number, status = fields + project = CodeDoubanProject.get_by_name(project_name) + ticket = Ticket.get_by_projectid_and_ticketnumber(project.id, + ticket_number) + pr = _get_pr_by_project_and_ticket(project, ticket) + return pr + + +def _get_code_review_by_uid(uid): + code_review = {} + if uid and uid.startswith('newcodereview'): + fields = uid.split('-') + if len(fields) != 4: + return code_review + _, project_name, ticket_number, comment_id = fields + project = CodeDoubanProject.get_by_name(project_name) + ticket = Ticket.get_by_projectid_and_ticketnumber(project.id, + ticket_number) + pr = _get_pr_by_project_and_ticket(project, ticket) + comment = Comment.get(comment_id) + # FIXME: comment type + code_review = dict( + id=comment_id, + type='comment', + pr=pr, + ) + return code_review + + +def _get_issue_by_project_and_number(id, number): + issue = {} + project_issue = ProjectIssue.get(id, number=number) + _issue = Issue.get_cached_issue(project_issue.issue_id) + _author = _get_user_by_name(_issue.creator_id) + _closer = _get_user_by_name(_issue.closer_id) if _issue.closer_id else {} + issue = dict( + id=_issue.issue_id, + name=_issue.title, + author=_author, + closer=_closer, + ) + return issue + + +def _get_gist_by_id(id): + gist = {} + _gist = Gist.get(id) + if not _gist: + return gist + _owner = _get_user_by_name(_gist.owner_id) + gist = dict( + id=_gist.id, + name=_gist.name, + owner=_owner, + ) + if _gist.fork_from: + _from_gist = Gist.get(_gist.fork_from) + _owner = _get_user_by_name(_from_gist.owner_id) + gist['from_gist'] = dict( + id=_from_gist.id, + name=_from_gist.name, + owner=_owner, + ) + return gist + + +def _get_gist_by_uid(uid): + gist = {} + if uid and uid.startswith('gist'): + fields = uid.split('-') + if uid.startswith('gist-create'): + if len(fields) != 3: + return gist + _, _, id = fields + elif uid.startswith('gist-star'): + if len(fields) != 4: + return gist + _, _, id, author = fields + elif uid.startswith('gist-fork'): + if len(fields) != 4: + return gist + _, _, from_id, id = fields + elif uid.startswith('gist-update'): + if len(fields) != 3: + return gist + _, _, id = fields + elif uid.startswith('gist-comment'): + if len(fields) != 3: + return gist + _, _, id = fields + gist = _get_gist_by_id(id) + return gist + + +def _get_team_by_uid(uid): + _team = Team.get_by_uid(uid) + team = dict( + id=_team.id, + uid=_team.uid, + name=_team.name, + ) + return team + + +def _get_team_by_url(url): + team = {} + if url and url.startswith('/hub/team/'): + fields = url.split('/') + if len(fields) != 5: + return team + _, _, _, uid, _ = fields + team = _get_team_by_uid(uid) + return team + + +def _format_commit_object_data(data): + _project = _get_project_by_name(data.repo_name) + # _project['branch'] = data.branch if 'branch' in data else "" + # _project['reference'] = data.ref if 'ref' in data else "" + _author = dict( + name=data.author.name, + email=data.author.email + ) + commit = dict( + sha=data.sha, + author=_author, + project=_project, + message=data.message, + date=data.committer_time.strftime('%Y-%m-%d %H:%M:%S'), + ) + return commit + + +def _format_commit_data(data): + _project = _get_project_by_name(data.get('repo_name')) + _project['branch'] = data.get('branch') if 'branch' in data else "" + _project['reference'] = data.get('ref') if 'ref' in data else "" + _author = dict( + name=data.get('author').get('name'), + email=data.get('email') + ) + commit = dict( + sha=data.get('commit_id'), + author=_author, + project=_project, + message=data.get('message'), + date=data.get('timestamp'), + ) + return commit + + +def _get_commit_comment_by_uid(uid): + comment = {} + if uid and uid.startswith('commit'): + fields = uid.split('-') + if len(fields) != 3: + return comment + _, comment_type, id = fields + type = 'line' if comment_type == 'linecomment' else 'comment' + comment = dict( + id=id, + type=type, + ) + return comment + + +def _format_repository_data(data): + _author = _get_user_by_name(data.get('author')) + _project = _get_project_by_name(data.get('name')) + if not (_project and _author): + return {} + + if data['type'] == 'repo_create': + type = 'create_repo' + elif data['type'] == 'repo_watch': + type = 'watch_repo' + elif data['type'] == 'repo_fork': + type = 'fork_repo' + _project['from_project'] = _get_project_by_name( + data.get('forked_from_name') + ) + return dict( + type=type, + author=_author, + project=_project, + content=data['desc'], + timestamp=data['date'], + ) + + +def _format_pullrequest_data(data): + if data['type'] == 'pull_request': + if data['status'] == 'merged': + type = 'merge_pr' + _author = _get_user_by_name(data.get('owner')) + elif data['status'] == 'unmerge': + type = 'open_pr' + _author = _get_user_by_name(data.get('commiter')) + elif data['status'] == 'closed': + type = 'close_pr' + _author = _get_user_by_name(data.get('commiter')) + else: + type = 'unkown_pr' + uid = data.get('uid') + _pr = _get_pr_by_uid(uid) + _content = data['description'] + _data = dict( + type=type, + author=_author, + pr=_pr, + content=_content, + timestamp=data['date'], + ) + elif data['type'] == 'code_review': + type = 'comment_pr' + _author = _get_user_by_name(data.get('author')) + uid = data.get('uid') + _comment = _get_code_review_by_uid(uid) + _content = data['text'] + _data = dict( + type=type, + author=_author, + comment=_comment, + content=_content, + timestamp=data['date'], + ) + return _data + + +def _get_issue_by_uid(uid): + issue = {} + # uid: issue-type-id-number + if uid and uid.startswith('issue-'): + fields = uid.split('-') + if len(fields) != 4: + return issue + _, type, id, number = fields + if type == 'project': + _issue = ProjectIssue.get(id, number=number) + _issue = Issue.get_cached_issue(_issue.issue_id) + _target = _get_project_by_name(_issue.target.name) + elif type == 'team': + _issue = TeamIssue.get(id, number=number) + _issue = Issue.get_cached_issue(_issue.issue_id) + _target = _get_team_by_uid(_issue.target.uid) + else: + return issue + _author = _get_user_by_name(_issue.creator_id) + _closer = _get_user_by_name(_issue.closer_id) if _issue.closer_id else {} + issue = dict( + id=_issue.issue_id, + name=_issue.title, + author=_author, + closer=_closer, + ) + issue[_issue.target_type] = _target + return issue + + +def _format_issue_data(data): + if data['state'] == 'closed': + type = 'close_issue' + elif data['state'] == 'open': + type = 'open_issue' + _author = _get_user_by_name(data.get('author')) + _project_name = data.get('proj', None) + if not _project_name: + _issue = _get_issue_by_uid(data.get('uid')) + else: + _project = _get_project_by_name(_project_name) + _issue = _get_issue_by_project_and_number( + _project['id'], + data.get('number') + ) + _issue['project'] = _project + content = data['text'] + return dict( + type=type, + author=_author, + issue=_issue, + content=content, + timestamp=data['date'], + ) + + +def _get_issue_comment_by_uid(uid): + issue = {} + # uid: issue-type-id-number + if uid and uid.startswith('issue-'): + fields = uid.split('-') + if len(fields) != 6: + return issue + _, _, type, id, number, comment_number = fields + if type == 'project': + _issue = ProjectIssue.get(id, number=number) + _issue = Issue.get_cached_issue(_issue.issue_id) + _target = _get_project_by_name(_issue.target.name) + elif type == 'team': + _issue = TeamIssue.get(id, number=number) + _issue = Issue.get_cached_issue(_issue.issue_id) + _target = _get_team_by_uid(_issue.target.uid) + else: + return issue + _author = _get_user_by_name(_issue.creator_id) + _closer = _get_user_by_name(_issue.closer_id) if _issue.closer_id else {} + issue = dict( + id=_issue.issue_id, + name=_issue.title, + author=_author, + closer=_closer, + ) + issue[_issue.target_type] = _target + return issue + + +def _format_issue_comment_data(data): + type = 'comment_issue' + _author = _get_user_by_name(data.get('author')) + _issue = _get_issue_comment_by_uid(data.get('uid')) + content = data['text'] + return dict( + type=type, + author=_author, + issue=_issue, + content=content, + timestamp=data['date'], + ) + + +def _format_gist_data(data): + _author = _get_user_by_name(data.get('author')) + _gist = _get_gist_by_uid(data.get('uid')) + if data['type'] == 'gist_created': + type = 'create_gist' + content = data['desc'] + elif data['type'] == 'gist_commented': + type = 'comment_gist' + content = data['content'] + elif data['type'] == 'gist_starred': + type = 'star_gist' + content = data['desc'] + elif data['type'] == 'gist_updated': + type = 'update_gist' + content = data['desc'] + elif data['type'] == 'gist_forked': + type = 'fork_gist' + content = data['desc'] + return dict( + type=type, + author=_author, + gist=_gist, + content=content, + timestamp=data['date'], + ) + + +def _format_people_data(data): + if data['type'] == 'recommend': + type = 'recommend_people' + _author = _get_user_by_name(data.get('sender')) + _recommend = _get_user_by_name(data.get('to_user')) + content = data['content'] + _data = dict( + type=type, + author=_author, + recommend=_recommend, + content=content, + timestamp=data['date'], + ) + elif data['type'] == 'commit_comment': + type = 'comment_commit' + _author = _get_user_by_name(data.get('sender')) + _project = _get_project_by_name(data.get('proj')) + _project['reference'] = data.get('ref') + _comment = _get_commit_comment_by_uid(data.get('uid')) + content = data.get('message') or data.get('content') + _data = dict( + type=type, + author=_author, + project=_project, + comment=_comment, + content=content, + timestamp=data['date'], + ) + elif data['type'] == 'push': + type = 'push' + _project = _get_project_by_name(data.get('repo_name')) + _project['branch'] = data.get('branch') + _project['reference'] = data.get('ref') + commits = data['commits'] + if len(commits) > 3: + commit = commits[:3] + else: + commit = commits + _commit = [_format_commit_data(c) for c in commit] + _data = dict( + type=type, + project=_project, + commit=_commit, + timestamp=data['date'] + ) + return _data + + +def _format_team_data(data): + _author = _get_user_by_name(data.get('author')) + _team = _get_team_by_url(data.get('url')) + if data['type'] == 'team_created': + type = 'create_team' + elif data['type'] == 'team_joined': + type = 'join_team' + return dict( + type=type, + author=_author, + team=_team, + timestamp=data['date'], + ) + + +def format_timeline(data): + type = data.get('type') + if type in ('team_created', 'team_joined'): + _data = _format_team_data(data) + elif type in ('recommend', 'commit_comment', 'push'): + _data = _format_people_data(data) + elif type in ('gist_created', 'gist_commented', + 'gist_starred', 'gist_updated', + 'gist_forked'): + _data = _format_gist_data(data) + elif type in ('issue'): + _data = _format_issue_data(data) + elif type in ('issue_comment'): + _data = _format_issue_comment_data(data) + elif type in ('pull_request', 'code_review'): + _data = _format_pullrequest_data(data) + elif type in ('repo_create', 'repo_watch', 'repo_fork'): + _data = _format_repository_data(data) + else: + logging.debug("unknown data type %s." % data.get('type')) + _data = {} + return _data diff --git a/vilya/models/tips.py b/vilya/models/tips.py new file mode 100644 index 0000000..1d3cfb8 --- /dev/null +++ b/vilya/models/tips.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- + +import random + +tips = ( + (u'用f这个快捷键就可以fork项目了哦', ''), + (u'用p这个快捷键就可以发起pullrequest了哦', ''), + (u'Code上的项目现在已经有了Hook功能了,你是否尝试过?', '/code/hooks'), + (u'Code的徽章系统已经上线了', '/people/qingfeng/'), + (u'Code上面已经可以看到代码提交频次的图表了', '/code/graph'), + (u'Code上面已经可以看到项目的贡献者列表了', '/code/graph'), + (u'用@可以搜索人', ''), + (u'现在可以做commit的compare了,到source里就可以找到哦', ''), + (u'加入Code开发!', '/code/source/blob/master/README.md'), + (u'现在都有哪些徽章?', '/badge/all'), + (u'在源码页按下t试试看', '/code/'), + (u'新的组织页上线,快去看看吧', '/hub/projects'), +) + + +class Tips(object): + @classmethod + def get_tip(cls): + return random.sample(tips, 1)[0] diff --git a/vilya/models/trello/__init__.py b/vilya/models/trello/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/vilya/models/trello/core.py b/vilya/models/trello/core.py new file mode 100644 index 0000000..1d6d69f --- /dev/null +++ b/vilya/models/trello/core.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +from vilya.models.trello.wrapper import DoubanTrelloClient +from vilya.models.utils import parse_trello_card_code +from trolly.card import Card +from vilya.config import DOMAIN + +from vilya.libs.mq import async + + +@async +def process_trello_notify(user, ticket): + if not ticket or not user or not user.trello_access_token: + return + + card_id = parse_trello_card_code(ticket.description) + if card_id: + _notify(user, ticket, card_id) + + +def _notify(user, ticket, card_id): + client = DoubanTrelloClient(user.trello_access_token['oauth_token']) + card = Card(client, card_id) + tmpl = "Attention: %s has submitted a Pull Request. %s" + card.addComments(tmpl % (user.name, '%s%s' % (DOMAIN, ticket.url))) diff --git a/vilya/models/trello/wrapper.py b/vilya/models/trello/wrapper.py new file mode 100644 index 0000000..88ef22a --- /dev/null +++ b/vilya/models/trello/wrapper.py @@ -0,0 +1,66 @@ +# coding=utf8 + +import urlparse +import oauth2 as oauth +from trolly.client import Client + +from vilya.config import ( + TRELLO_CONSUMER_KEY as CONSUMER_KEY, + TRELLO_CONSUMER_SECRET as CONSUMER_SECRET +) + +# APP_NAME = 'TODO & FIXME' +APP_NAME = 'Code Tells Trello' +REQUEST_TOKEN_URL = 'https://trello.com/1/OAuthGetRequestToken' +ACCESS_TOKEN_URL = 'https://trello.com/1/OAuthGetAccessToken' +AUTHORIZE_URL = 'https://trello.com/1/OAuthAuthorizeToken' + + +class DoubanTrelloClient(Client): + + def __init__(self, token=None): + super(DoubanTrelloClient, self).__init__( + CONSUMER_KEY, user_auth_token=token) + self.consumer = oauth.Consumer(CONSUMER_KEY, CONSUMER_SECRET) + + def get_authorisation_url(self, oauth_token, return_url): + query_params = { + 'name': APP_NAME, + 'expiration': 'never', + 'scope': 'read,write,account', + 'oauth_callback': return_url, + 'oauth_token': oauth_token, + } + + authorisation_url = self.buildUri( + path='/OAuthAuthorizeToken', + query_params=query_params + ) + + return authorisation_url + + def get_request_token(self): + client = oauth.Client(self.consumer) + resp, content = client.request(REQUEST_TOKEN_URL, "GET") + if resp['status'] != '200': + raise Exception("Invalid response %s." % resp['status']) + request_token = dict(urlparse.parse_qsl(content)) + return request_token + + def get_access_token(self, request_token, oauth_verifier): + token = oauth.Token( + request_token['oauth_token'], request_token['oauth_token_secret']) + token.set_verifier(oauth_verifier) + client = oauth.Client(self.consumer, token) + resp, content = client.request(ACCESS_TOKEN_URL, "POST") + access_token = dict(urlparse.parse_qsl(content)) + return access_token + + +if __name__ == "__main__": + TOKEN = '2f68a34c08c39cb97df184ef3f13df1a72ed3aadb0e19e12c25768ff8ab1b51e' # noqa + client = DoubanTrelloClient() + print client.get_authorisation_url('22222', 'http://www.douban.com') + #client = DoubanTrelloClient(token=TOKEN) + #_list = List(client, '50e2df09d07cc81d15002d7a') + # print _list.getCards() diff --git a/vilya/models/user.py b/vilya/models/user.py index d61dbcc..51ec8c3 100644 --- a/vilya/models/user.py +++ b/vilya/models/user.py @@ -1,85 +1,730 @@ # -*- coding: utf-8 -*- from __future__ import absolute_import + import os -from hashlib import sha1 from datetime import datetime -from vilya.libs.store import (store, - OrzField, - OrzBase, - IntegrityError) -from vilya.models.session import SessionMixin +from urllib import urlencode + +from quixote import get_user as get_current_user_id, get_session + +from vilya.libs.store import store, cache, mc, ONE_MONTH +from vilya.libs.text import gravatar_url +from vilya.libs.props import PropsMixin, PropsItem +from vilya.libs.validators import check_email, check_name +from vilya.libs.signals import follow_user_signal + +from vilya.models.inbox import Inbox +from vilya.models.badge import Badge +from vilya.models.user_issue import UserIssue +from vilya.models.project_issue import ProjectIssue +from vilya.models.consts import ( + NOTIFY_ON, SETTING_DISABLE, FONTS) +from vilya.models.sshkey import SSHKey +from vilya.models.utils import check_douban_email +from vilya.models.nuser import User2 as CodeUser + + +def set_user(user_id): + session = get_session() + session.set_user(user_id) + + +def _get_full_qualified_url(url): + # from urlparse import urljoin + # env = get_environ() + # env['PATH_INFO'] = '' + # req = Request(env) + # urljoin(req.url, url) + return url + + +def get_current_user(): + """Returns the L{User} object for the current user (the user who made the + request being processed) if the user is signed in, or None if the user is + not signed in. + """ + id = get_current_user_id() + user = CodeUser.get(id=id) + return User(user.name) if user else None + +class User(PropsMixin): -class User(OrzBase, SessionMixin): - __orz_table__ = "users" - name = OrzField(as_key=OrzField.KeyType.ONLY_INDEX) - password = OrzField() - description = OrzField() - email = OrzField(as_key=OrzField.KeyType.ONLY_INDEX) - session_id = OrzField() - session_expired_at = OrzField() - created_at = OrzField() - updated_at = OrzField() + trello_access_token = PropsItem('trello_access_token') + trello_request_token = PropsItem('trello_request_token') - class OrzMeta: - id2str = True + def __init__(self, name, email=None, dae_user=None): + name = str(name) if not isinstance(name, unicode) \ + else name.encode('utf-8') + self.name = name + self.dae_user = dae_user + self.username = self.name + self._email = email + self._code_user = None + + def __str__(self): + return self.name + + def __eq__(self, y): + return y and isinstance(y, User) and \ + self.name == y.name and self.email == y.email + + @classmethod + def check_exist(cls, name): + return bool(cls.get_by_name(name)) @classmethod def get_by_name(cls, name): - rs = cls.gets_by(name=name) - return rs[0] if rs else None + return CodeUser.get(name=name) + + @classmethod + def create_register_url(cls, dest_url=None, full_url=False): + return cls.create_url('/register/', dest_url=dest_url, + full_url=full_url) + + @classmethod + def create_login_url(cls, dest_url=None, full_url=False): + return cls.create_url('/login/', dest_url=dest_url, full_url=full_url) + + @classmethod + def create_logout_url(cls, dest_url, full_url=False): + return cls.create_url('/logout/', dest_url=dest_url, full_url=full_url) @classmethod - def add(cls, **kw): - now = datetime.now() - kw['created_at'] = now - kw['updated_at'] = now - kw['password'] = cls.hash_password(kw['password']) - u = None - try: - u = cls.create(**kw) - except IntegrityError: - store.rollback() - return u + def create_url(cls, url, dest_url=None, full_url=False): + if dest_url: + url += '?' + urlencode({'continue': dest_url}) + return _get_full_qualified_url(url) if full_url else url - # password @property - def hashed_password(self): - return self.password + def teams(self): + from vilya.models.nteam import TeamUserRelationship + from vilya.models.team import Team - @hashed_password.setter - def _set_password(self, password): - self.password = self.hash_password(password) + rs = TeamUserRelationship.gets(user_id=self.name) + return filter(None, [Team.get(r.team_id) for r in rs]) - def validate_password(self, password): - """Check the password against existing credentials.""" - hashed_pass = sha1() - hashed_pass.update(password + self.hashed_password[:40]) - return self.hashed_password[40:] == hashed_pass.hexdigest() + @property + def code_user(self): + if not self._code_user: + self._code_user = CodeUser.get(name=self.username) + return self._code_user + + @property + def profile(self): + return {'email': self.username} @classmethod - def hash_password(cls, password): - """Hash password on the fly.""" - hashed_password = password + def get_current_user(cls): + user = get_current_user() + if not user: + return + return cls(user.username, user.profile.get('email'), user) + + # FIXME: User或许应该加个id属性 + def get_uuid(self): + return '/user/%s' % self.username + + @property + def url(self): + return '/people/%s/' % self.username + + # NOTE: 现在通过 add_codeuser_role 判断 intern + @property + def is_intern(self): + if self.username.endswith('_intern'): + return True + code_user = self.code_user + if code_user and code_user.is_intern: + return True + return False + + @property + def avatar_url(self): + return gravatar_url(self.email) + + def avatar_in_size(self, size): + return gravatar_url(self.email, size) + + def has_id(self): + return bool(self.code_user) + + def has_role(self): + code_user = self.code_user + return code_user.has_role() if code_user else None + + @property + def inbox(self): + return Inbox.get(user=self.name) + + @property + def unread_notification_count(self): + from vilya.models.notification import Notification + return Notification.unread_count(self.name) + + @property + def settings(self): + return UserSettings(self.username) + + @property + def email(self): + if not self._email: + if self.is_intern: + if self.username.endswith('_intern'): + self._email = self.username + '@douban.com' + else: + self._email = self.username + '@intern.douban.com' + else: + self._email = self.username + '@douban.com' + return self._email - if isinstance(password, unicode): - password_8bit = password.encode('UTF-8') + def as_dict(self): + d = {} + d['name'] = self.username + d['email'] = self.email + d['url'] = self.url + d['is_intern'] = self.is_intern + d['avatar_url'] = self.avatar_url + d['badges'] = [item.as_dic() for item in self.get_badge_items()] + d['followers_count'] = self.followers_count + d['following_count'] = self.following_count + return d + + @classmethod + def get_by_email(cls, email): + username = None + if check_douban_email(email): + username = email.split('@')[0] else: - password_8bit = password + user_email = CodeDoubanUserEmails.get_by_email(email) + username = user_email.user_id if user_email else None + return cls(username) if username else None + + def get_badges(self): + return Badge.get_badges(self.username) + + def get_badge_items(self): + return Badge.get_badge_items(self.username) + + def get_new_badges(self): + return Badge.get_new_badges(self.username) + + def clear_new_badges(self): + return Badge.clear_new_badges(self.username) + + def get_followers(self): + return FollowRelationship.get_followers(self.username) + + @property + def followers_count(self): + return FollowRelationship.get_followers_count(self.username) + + def is_following(self, username): + return FollowRelationship.check_exist(username, self.username) + + def get_following(self): + return FollowRelationship.get_following(self.username) + + @property + def following_count(self): + return FollowRelationship.get_following_count(self.username) + + def follow(self, username): + if not FollowRelationship.check_exist(username, self.username): + FollowRelationship.add(username, self.username) + follow_user_signal.send(author=self.username, followee=username) + + def unfollow(self, username): + if FollowRelationship.check_exist(username, self.username): + FollowRelationship.delete(username, self.username) + + def get_praises(self): + from vilya.models.recommendation import Recommendation + return Recommendation.gets_by_user(self.username) + + def add_invited_pull_request(self, ticket_id): + return UserPullRequests(self.username).add_invited(ticket_id) + + def add_participated_pull_request(self, ticket_id): + return UserPullRequests(self.username).add_participated(ticket_id) + + def get_invited_pull_requests(self, is_closed=False): + from vilya.models.ticket import Ticket + return [Ticket.get(ticket_id) + for ticket_id in UserPullRequests( + self.username).get_invited(is_closed)] + + def get_participated_pull_requests(self, is_closed=False): + from vilya.models.ticket import Ticket + return [Ticket.get(ticket_id) + for ticket_id in UserPullRequests( + self.username).get_participated(is_closed)] + + def get_participated_issues(self, state='open', limit=25, start=0): + issues = UserIssue.get_participated_issues(self.username, state) + issues.sort(key=lambda x: x.updated_at, reverse=True) + return issues[start:start + limit] - salt = sha1() - salt.update(os.urandom(60)) - hash = sha1() - hash.update(password_8bit + salt.hexdigest()) - hashed_password = salt.hexdigest() + hash.hexdigest() + def get_n_participated_issues(self, state='open'): + issues = UserIssue.get_participated_issues(self.username, state) + return len(issues) - if not isinstance(hashed_password, unicode): - hashed_password = hashed_password.decode('UTF-8') + def get_user_submit_pull_requests(self, limit=25, is_closed=False): + from vilya.models.ticket import Ticket + tickets = Ticket.gets_by_author( + self.username, limit=limit, closed=is_closed) + return tickets - return hashed_password + def get_user_pull_requests_rank(self, limit=5): + from vilya.models.ticket import Ticket + tickets = Ticket.gets_ranks_by_author(self.username, limit=limit) + return tickets @property - def projects(self): - from vilya.models.project import Project - return Project.gets_by(owner_id=self.id) + def n_user_open_submit_pull_requests(self): + return len(self.get_user_submit_pull_requests()) + + @property + def n_open_invited(self): + return UserPullRequests(self.username).n_open_invited + + @property + def n_open_participated(self): + return UserPullRequests(self.username).n_open_participated + + @property + def n_open_pull_requests(self): + return UserPullRequests(self.username).n_open_pull_requests + + @property + def emails(self): + ''' return user's other emails ''' + rs = store.execute('select id, email from codedouban_useremails ' + 'where user_id=%s', (self.name,)) + user_emails = [CodeDoubanUserEmails( + id, self.name, email) for id, email in rs] + # hack old data + user_emails = [user_email for user_email in user_emails + if user_email.email != self.email] + return user_emails + + @property + def githubs(self): + rs = store.execute('select id, user_name from codedouban_usergithub ' + 'where user_id=%s', (self.name,)) + githubs = [CodeDoubanUserGithub( + id, self.name, user_name) for id, user_name in rs] + return githubs + + @property + def sshkeys(self): + return SSHKey.gets_by_user_id(self.name) + + def get_n_assigned_issues_by_project(self, project_id, state="open"): + return ProjectIssue.get_count_by_assignee_id( + project_id, self.name, state) + + def get_n_created_issues_by_project(self, project_id, state="open"): + return ProjectIssue.get_count_by_creator_id( + project_id, self.name, state) + + def get_repos_issues(self, state): + return UserIssue.gets_by_creator_id(self.name, state) + + def get_created_issues(self, state, limit=25, start=0): + issues = UserIssue.gets_by_creator_id(self.name, state) + issues.sort(key=lambda x: x.updated_at, reverse=True) + return issues[start:start + limit] + + def get_count_created_issues(self, state): + return len(UserIssue.gets_by_creator_id(self.name, state)) + + def get_assigned_issues(self, state, limit=25, start=0): + issues = UserIssue.gets_by_assignee_id(self.name, state) + issues.sort(key=lambda x: x.updated_at, reverse=True) + return issues[start:start + limit] + + def get_count_assigned_issues(self, state): + return len(UserIssue.gets_by_assignee_id(self.name, state)) + + def notify_email(self, target_obj): + target_type = target_obj.__class__.__name__ + if target_type == "CodeDoubanProject": + from vilya.models.project import CodeDoubanProject + if CodeDoubanProject.has_watched(target_obj.id, self) \ + and self.settings.watching_email == NOTIFY_ON: + return True + else: + return self.settings.participating_email == NOTIFY_ON + elif target_type == "Team": + return self.settings.participating_email == NOTIFY_ON + + def notify_irc(self, target_obj): + target_type = target_obj.__class__.__name__ + if target_type == "CodeDoubanProject": + from vilya.models.project import CodeDoubanProject + if CodeDoubanProject.has_watched(target_obj.id, self) \ + and self.settings.watching_irc == NOTIFY_ON: + return True + else: + return self.settings.participating_irc == NOTIFY_ON + elif target_type == "Team": + return self.settings.participating_irc == NOTIFY_ON + + @property + def watched_projects(self): + from vilya.models.project import CodeDoubanProject + + return CodeDoubanProject.get_watched_projects_by_user( + user=self.username) + + +class FollowRelationship(object): + + def __init__(self, name, followed_user_name): + self.name = name + self.followed_user_name = followed_user_name + + @staticmethod + def get_followers(name): + rs = store.execute('select followed_user_name ' + 'from follow_relationship ' + 'where user_name=%s', (name,)) + return [_name for _name, in rs] + + @staticmethod + def get_followers_count(name): + rs = store.execute('select count(1) ' + 'from follow_relationship ' + 'where user_name=%s', (name,)) + return rs[0][0] + + @staticmethod + def get_following(name): + rs = store.execute('select user_name ' + 'from follow_relationship ' + 'where followed_user_name=%s', (name,)) + return [_name for _name, in rs] + + @staticmethod + def get_following_count(name): + rs = store.execute('select count(1) ' + 'from follow_relationship ' + 'where followed_user_name=%s', (name,)) + return rs[0][0] + + @classmethod + def check_exist(cls, name, followed_user_name): + rs = store.execute('select count(1) ' + 'from follow_relationship ' + 'where user_name=%s and followed_user_name=%s', + (name, followed_user_name)) + if rs: + return rs[0][0] == 1 + + @classmethod + def add(cls, name, followed_user_name): + time = datetime.now() + store.execute('insert into follow_relationship ' + '(user_name, followed_user_name, time) ' + 'values (%s, %s, %s)', + (name, followed_user_name, time)) + store.commit() + + @classmethod + def delete(cls, name, followed_user_name): + store.execute('delete from follow_relationship ' + 'where user_name=%s and followed_user_name=%s', + (name, followed_user_name)) + store.commit() + + +class CodeDoubanUserEmails(object): + + def __init__(self, id, user_id, email): + self.id = int(id) + self.user_id = user_id + self.email = email + + @classmethod + def validate(cls, user_id, email): + + def check_exist(email): + rs = store.execute( + 'select id from codedouban_useremails where email=%s', + (email,)) + email_id = rs and rs[0] + if email_id: + return 'Email %s is already in use' % email + + def check_default(email): + if User(name=user_id).email == email: + return 'Email %s is default' % email + + validators = [check_exist(email), check_email( + email, 'Email'), check_default(email)] + errors = [error for error in validators if error] + return errors + + @classmethod + def add(cls, user_id, email): + email_id = store.execute( + 'insert into codedouban_useremails (user_id, email) ' + 'values (%s, %s)', (user_id, email)) + store.commit() + ret = cls(email_id, user_id, email) + ret._flush() + return ret + + def delete(self): + store.execute( + "delete from codedouban_useremails where id=%s", (self.id,)) + store.commit() + self._flush() + return self + + @classmethod + @cache('email:{email}:user', expire=ONE_MONTH) + def get_by_email(cls, email): + rs = store.execute( + 'select id, user_id, email from codedouban_useremails ' + 'where email=%s', (email,)) + r = rs and rs[0] + if rs: + return cls(*r) + + @classmethod + def check_own_by_user(cls, user_id, email_id): + rs = store.execute("select id, user_id, email " + "from codedouban_useremails " + "where user_id=%s and id=%s", + (user_id, email_id)) + r = rs and rs[0] + if r: + return cls(*r) + + def _flush(self): + mc.delete('email:%s:user' % self.email) + + +class UserSettings(PropsMixin): + + DEFAULT_VALUE = { + 'participating_email': NOTIFY_ON, + 'participating_irc': NOTIFY_ON, + 'participating_web': NOTIFY_ON, + 'watching_email': NOTIFY_ON, + 'watching_irc': NOTIFY_ON, + 'watching_web': NOTIFY_ON, + 'dblclick_comment': SETTING_DISABLE, + 'text_font': FONTS['default'], + 'notif_other_emails': [], + } + + def __init__(self, user_id): + self.user_id = user_id + + def get_uuid(self): + return '/user_settings/%s' % self.user_id + + def __getattr__(self, name): + if "props" not in name and \ + name not in ['get_uuid', 'props', 'user_id']: + attr_value = self.get_props_item("/%s" % name) + if name in self.DEFAULT_VALUE and attr_value is None: + return self.DEFAULT_VALUE[name] + return attr_value + return super(UserSettings, self).__getattr__(name) + + def __setattr__(self, name, value): + if "props" not in name and \ + name not in ['get_uuid', 'props', 'user_id']: + self.set_props_item("/%s" % name, value) + return super(UserSettings, self).__setattr__(name, value) + + +class UserPullRequests(PropsMixin): + KEY_INVITED_PRS = "prs/i/u_%s" + KEY_PATICIPATED_PRS = "prs/p/u_%s" + + def __init__(self, user_id): + self.user_id = user_id + + def get_uuid(self): + return '/user_pull_requests/%s' % self.user_id + + @property + def n_open_invited(self): + return len(self.get_invited()) + + @property + def n_open_participated(self): + return len(self.get_participated()) + + @property + def n_open_pull_requests(self): + return len(set(self.get_invited() + self.get_participated())) + + def _clean_closed_tickets(self): + from vilya.models.ticket import Ticket + # FIXME should be async function + tickets = set(self.get_invited() + self.get_participated()) + for ticket_id in tickets: + t = Ticket.get(ticket_id) + if t and t.project and not t.closed: + continue + self.remove_invited(ticket_id) + self.remove_participated(ticket_id) + + def get_invited(self, is_closed=False): + return self.props.get(self.KEY_INVITED_PRS % self.user_id) or [] + + def add_invited(self, ticket_id): + invited_prs = self.get_invited() + if ticket_id and ticket_id not in invited_prs: + invited_prs.append(ticket_id) + self.set_props_item( + self.KEY_INVITED_PRS % self.user_id, invited_prs) + self._clean_closed_tickets() + return self.get_invited + + def remove_invited(self, ticket_id): + # FIXME unittest needed, better interface/name to call from outside + invited_prs = self.get_invited() + if ticket_id and ticket_id in invited_prs: + invited_prs.remove(ticket_id) + self.set_props_item( + self.KEY_INVITED_PRS % self.user_id, invited_prs) + return self.get_invited() + + def get_participated(self, is_closed=False): + return self.props.get(self.KEY_PATICIPATED_PRS % self.user_id) or [] + + def add_participated(self, ticket_id): + participated_prs = self.get_participated() + if ticket_id and ticket_id not in participated_prs: + participated_prs.append(ticket_id) + self.set_props_item( + self.KEY_PATICIPATED_PRS % self.user_id, participated_prs) + self._clean_closed_tickets() + return self.get_participated + + def remove_participated(self, ticket_id): + # FIXME unittest needed, better interface/name to call from outside + participated_prs = self.get_participated() + if ticket_id and ticket_id in participated_prs: + participated_prs.remove(ticket_id) + self.set_props_item( + self.KEY_PATICIPATED_PRS % self.user_id, participated_prs) + return self.get_participated() + + +class CodeDoubanUserGithub(object): + + def __init__(self, id, user_id, user_name): + self.id = int(id) + self.user_id = user_id + self.user_name = user_name + + @classmethod + def validate(cls, user_id, user_name): + + def check_exist(user_name): + rs = store.execute( + 'select id from codedouban_usergithub where user_name=%s', (user_name,)) + github_id = rs and rs[0] + if github_id: + return 'Github user %s is already in use' % user_name + + validators = [check_exist(user_name), check_name( + user_name, 'Github user name')] + errors = [error for error in validators if error] + return errors + + @classmethod + def add(cls, user_id, user_name): + github_id = store.execute( + 'insert into codedouban_usergithub (user_id, user_name) values (%s, %s)', + (user_id, user_name)) + store.commit() + return cls(github_id, user_id, user_name) + + def delete(self): + store.execute( + "delete from codedouban_usergithub where id=%s", (self.id,)) + store.commit() + return self + + @classmethod + @cache('github:{user_name}:user', expire=ONE_MONTH) + def get_by_user_name(cls, user_name): + rs = store.execute( + 'select id, user_id, user_name from codedouban_usergithub where user_name=%s', (user_name,)) + r = rs and rs[0] + if rs: + return cls(*r) + + @classmethod + def check_own_by_user(cls, user_id, github_id): + rs = store.execute("select id, user_id, user_name " + "from codedouban_usergithub " + "where user_id=%s and id=%s", + (user_id, github_id)) + r = rs and rs[0] + if r: + return cls(*r) + + +def get_author_by_email(email, author=''): + # company + email = email.rstrip('>') if email.endswith('>') else email + if check_douban_email(email): + username = email.split('@')[0] + return username + user = User.get_by_email(email) + if check_douban_email(author): + author = author.split('@')[0] + return user and user.name or author + + +def add_codeuser(user): + CodeUser.add(user.username) + + +def add_codeuser_role(user): + if os.environ['DAE_ENV'] == 'SDK': + return None + dae_user = user.dae_user + if not dae_user: + return None + email = dae_user.profile.get('email') + if not email: + return None + code_user = CodeUser.get(name=user.username) + if email.endswith('@douban.com'): + code_user.set_role() + elif email.endswith('@intra.douban.com'): + code_user.set_role(intern=True) + + +def clean_user_pulls(user): + if isinstance(user, CodeUser): + UserPullRequests(user.name)._clean_closed_tickets() + + +def get_users(): + rs = store.execute('select id from users') + users = (CodeUser.get(id=id) for id, in rs) + return users + + +def judge_user(name): + from vilya.models.team import Team + if CodeUser.get(name=name): + return "people" + else: + if Team.get_by_uid(name): + return "team" + else: + return "people" diff --git a/vilya/models/user_fav.py b/vilya/models/user_fav.py new file mode 100644 index 0000000..14a08e7 --- /dev/null +++ b/vilya/models/user_fav.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- + +from datetime import datetime + +from vilya.libs.store import store, IntegrityError + + +class UserFavItem(object): + + def __init__(self, id, user_id, target_id, kind, time): + self.id = id + self.user_id = user_id + self.target_id = target_id + self.kind = kind + self.time = time + + @classmethod + def add(cls, user_id, target_id, kind, time=None): + time = datetime.now() + try: + store.execute('insert into user_fav ' + '(user_id, target_id, kind, time) ' + 'values (%s, %s, %s, %s)', + (user_id, target_id, kind, time)) + store.commit() + return True + except IntegrityError: + return False + + @classmethod + def delete_by_user_target_kind(cls, user_id, target_id, kind): + store.execute( + 'delete from user_fav ' + 'where user_id=%s and target_id=%s and kind=%s', + (user_id, target_id, kind)) + store.commit() + + @classmethod + def gets_by_user_kind(cls, user_id, kind=None): + if not user_id: + return [] + if kind: + rs = store.execute( + 'select id, user_id, target_id, kind, time from user_fav ' + 'where user_id=%s and kind=%s order by id desc', + (user_id, kind)) + else: + rs = store.execute( + 'select id, user_id, target_id, kind, time from user_fav ' + 'where user_id=%s order by id desc', (user_id,)) + return [cls(*r) for r in rs] + + @classmethod + def get_target_ids_by_user_kind(cls, user_id, kind): + favs = cls.gets_by_user_kind(user_id, kind) + return [str(f.target_id) for f in favs] + + @classmethod + def is_liked_by_user(cls, user_id, kind, target_id): + return str(target_id) in cls.get_target_ids_by_user_kind( + user_id, kind) diff --git a/vilya/models/user_issue.py b/vilya/models/user_issue.py new file mode 100644 index 0000000..109da9b --- /dev/null +++ b/vilya/models/user_issue.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import + + +class UserIssue(object): + + def __init__(self, username): + self.name = username + + # FIXME: including open & closed + @classmethod + def gets_by_creator_id(cls, user_id, state=None): + from vilya.models.issue import Issue + return Issue.gets_by_creator_id(user_id, state) + + # FIXME: including open & closed + @classmethod + def gets_by_assignee_id(cls, user_id, state=None): + from vilya.models.issue import Issue + return Issue.gets_by_assignee_id(user_id, state) + + @classmethod + def get_participated_issues(cls, user_id, state=None): + from vilya.models.issue import Issue + issues_created = cls.gets_by_creator_id(user_id, state) + issues = [issue for issue in Issue.gets_by_participated_user(user_id, + state) + if issue not in issues_created] + return issues diff --git a/vilya/models/utils/__init__.py b/vilya/models/utils/__init__.py index e28390c..a90d21e 100644 --- a/vilya/models/utils/__init__.py +++ b/vilya/models/utils/__init__.py @@ -1,13 +1,17 @@ # -*- coding: utf-8 -*- -import re import json import uuid -from time import mktime +import re from datetime import datetime, date +from time import mktime + +from vilya.libs.text import trunc_utf8 +from vilya.models.consts import DOUBAN_EMAIL class CJsonEncoder(json.JSONEncoder): + def default(self, obj): if isinstance(obj, datetime): return obj.strftime('%Y-%m-%d %H:%M:%S') @@ -25,15 +29,188 @@ def linear_normalized(data): return [(d - min_val) / (max_val - min_val) for d in data] +def format_pullrequest_info(sender, **kw): + pullreq = kw['pullreq'] + ticket_id = kw['ticket_id'] + ticket = kw['ticket'] + status = kw['status'] + new_version = kw['new_version'] + type = 'pull_request' + + if new_version: + ticket_fields = dict( + reporter=ticket.author, + description=ticket.description, + owner=pullreq.merge_by or sender, + summary=ticket.title + ) + else: + ticket_fields = ticket.values + uid = 'pullrequest-%s-%s-%s' % (pullreq.to_proj, ticket_id, status) + + if new_version: + pullreq_url = "/%s/pull/%s/" % ( + pullreq.to_proj, ticket.ticket_id) + else: + pullreq_url = "/%s/pull/%s/" % (pullreq.to_proj, ticket.id) + to_proj_str = "%s:%s" % (pullreq.to_proj, pullreq.to_branch) + from_proj_str = "%s:%s" % (pullreq.from_proj, pullreq.from_branch) + commiter = ticket_fields['reporter'] + + data = dict( + date=datetime.now(), + url=pullreq_url, + description=ticket_fields['description'], + from_proj=from_proj_str, + to_proj=to_proj_str, + commiter=commiter, + owner=ticket_fields['owner'], + title=ticket_fields['summary'], + status=status, + uid=uid, + type=type, + ) + return data + + +def format_code_review_info(sender, **kw): + from vilya.models.pull import PullRequest + comment = kw['comment'] + anchor_id = comment.uid + ticket = kw['ticket'] + author = kw['author'] + content = kw['content'] + ticket_id = ticket.ticket_id + pullreq = PullRequest.get_by_ticket(ticket) + uid = 'newcodereview-%s-%s-%s' % ( + pullreq.to_proj, ticket_id, comment.id) + type = 'code_review' + data = dict( + date=datetime.now(), + url="/%s/pull/%s/#%s" % (pullreq.to_proj, ticket_id, anchor_id), + ticket=ticket_id, + proj="%s:%s" % (pullreq.to_proj, pullreq.to_branch), + receiver=ticket.author, + author=author, + text=content, + uid=uid, + type=type, + ) + return data + + +def get_target_url(desc): + ''' + >>> get_target_url('Your browser should have redirected + you to http://localhost:9640/qingfeng/test/newpull/17/') + 'http://localhost:9640/qingfeng/test/newpull/17/' + ''' + """aaa http://xxxx""" + URL_REGEX = re.compile(r"^.+(?P<url>http://.*)$") + m = re.search(URL_REGEX, desc) + if m: + return m.group('url') + + +def parse_trello_card_code(comment): + ''' + >>> parse_trello_card_code('https://trello.com/c/HMUQ6Fpc/326-with-at') + 'HMUQ6Fpc' + >>> parse_trello_card_code('见https://trello.com/c/HMUQ6Fpc/326-with-at') + 'HMUQ6Fpc' + ''' + """https://trello.com/card/1642297-ume/5105117d52f437bd25002590/95""" + CARD_REGEX = re.compile( + r"https://trello.com/c/(?P<card_id>[^\/]+)/[\d\w-]+") + m = re.search(CARD_REGEX, comment) + if m: + return m.group("card_id") + + def get_uuid(): return str(uuid.uuid4()) +def get_issue_by_issue_id(issue_id): + from vilya.models.issue import Issue + issue = Issue.get_cached_issue(issue_id) + return issue + + +def format_issue_info(**kw): + issue_id = kw['issue_id'] + author = kw['author'] + content = kw['content'] + + issue = get_issue_by_issue_id(issue_id) + target = issue.target + + uid = 'issue-%s-%s-%s' % (issue.target_type, target.id, issue.number) + text = trunc_utf8(content, 50) + state = issue.state + type = 'issue' + data = dict( + date=datetime.now(), + url=issue.url, + number=issue.number, + target_name="%s" % target.name, + target_url="%s" % target.url, + state=state, + receiver=issue.creator_id, + title=issue.title, + author=author, + text=text, + uid=uid, + type=type, + ) + return data + + +def format_issue_comment_info(**kw): + from vilya.models.issue_comment import IssueComment + issue_id = kw['issue_id'] + author = kw['author'] + content = kw['content'] + comment_id = kw['comment_id'] + + issue = get_issue_by_issue_id(issue_id) + target = issue.target + + issue_comment = IssueComment.get(comment_id) + text = trunc_utf8(content, 50) + uid = "issue-comment-%s-%s-%s-%s" % ( + issue.target_type, target.id, issue.number, issue_comment.number) + type = 'issue_comment' + data = dict( + date=datetime.now(), + url="%s#comment-%s" % (issue.url, issue_comment.number), + number=issue.number, + title=issue.title, + target_name="%s" % target.name, + target_url="%s" % target.url, + receiver=issue.creator_id, + author=author, + text=text, + uid=uid, + type=type, + ) + return data + + def to_timestamp(date): assert isinstance(date, datetime) return mktime(date.timetuple()) +def check_douban_email(email): + if not email: + return False + for patten in DOUBAN_EMAIL: + if email.endswith(patten): + return True + return False + + class _Missing(object): def __repr__(self): diff --git a/vilya/models/wiki.py b/vilya/models/wiki.py new file mode 100644 index 0000000..055c3b8 --- /dev/null +++ b/vilya/models/wiki.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- + + +class Wiki(object): + + def __init__(self, project, path): + pass diff --git a/vilya/static/css/fonts/glyphicons-halflings-regular.eot b/vilya/static/css/fonts/glyphicons-halflings-regular.eot deleted file mode 100644 index 423bd5d..0000000 Binary files a/vilya/static/css/fonts/glyphicons-halflings-regular.eot and /dev/null differ diff --git a/vilya/static/css/fonts/glyphicons-halflings-regular.ttf b/vilya/static/css/fonts/glyphicons-halflings-regular.ttf deleted file mode 100644 index a498ef4..0000000 Binary files a/vilya/static/css/fonts/glyphicons-halflings-regular.ttf and /dev/null differ diff --git a/vilya/static/css/fonts/glyphicons-halflings-regular.woff b/vilya/static/css/fonts/glyphicons-halflings-regular.woff deleted file mode 100644 index d83c539..0000000 Binary files a/vilya/static/css/fonts/glyphicons-halflings-regular.woff and /dev/null differ diff --git a/vilya/static/css/lib/bootstrap.css b/vilya/static/css/lib/bootstrap.css deleted file mode 100644 index 14cc1f4..0000000 --- a/vilya/static/css/lib/bootstrap.css +++ /dev/null @@ -1,5831 +0,0 @@ -/*! - * Bootstrap v3.1.0 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ - -/*! normalize.css v3.0.0 | MIT License | git.io/normalize */ -html { - font-family: sans-serif; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} -body { - margin: 0; -} -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -nav, -section, -summary { - display: block; -} -audio, -canvas, -progress, -video { - display: inline-block; - vertical-align: baseline; -} -audio:not([controls]) { - display: none; - height: 0; -} -[hidden], -template { - display: none; -} -a { - background: transparent; -} -a:active, -a:hover { - outline: 0; -} -abbr[title] { - border-bottom: 1px dotted; -} -b, -strong { - font-weight: bold; -} -dfn { - font-style: italic; -} -h1 { - margin: .67em 0; - font-size: 2em; -} -mark { - color: #000; - background: #ff0; -} -small { - font-size: 80%; -} -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} -sup { - top: -.5em; -} -sub { - bottom: -.25em; -} -img { - border: 0; -} -svg:not(:root) { - overflow: hidden; -} -figure { - margin: 1em 40px; -} -hr { - height: 0; - -moz-box-sizing: content-box; - box-sizing: content-box; -} -pre { - overflow: auto; -} -code, -kbd, -pre, -samp { - font-family: monospace, monospace; - font-size: 1em; -} -button, -input, -optgroup, -select, -textarea { - margin: 0; - font: inherit; - color: inherit; -} -button { - overflow: visible; -} -button, -select { - text-transform: none; -} -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; - cursor: pointer; -} -button[disabled], -html input[disabled] { - cursor: default; -} -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} -input { - line-height: normal; -} -input[type="checkbox"], -input[type="radio"] { - box-sizing: border-box; - padding: 0; -} -input[type="number"]::-webkit-inner-spin-button, -input[type="number"]::-webkit-outer-spin-button { - height: auto; -} -input[type="search"] { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield; -} -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} -fieldset { - padding: .35em .625em .75em; - margin: 0 2px; - border: 1px solid #c0c0c0; -} -legend { - padding: 0; - border: 0; -} -textarea { - overflow: auto; -} -optgroup { - font-weight: bold; -} -table { - border-spacing: 0; - border-collapse: collapse; -} -td, -th { - padding: 0; -} -@media print { - * { - color: #000 !important; - text-shadow: none !important; - background: transparent !important; - box-shadow: none !important; - } - a, - a:visited { - text-decoration: underline; - } - a[href]:after { - content: " (" attr(href) ")"; - } - abbr[title]:after { - content: " (" attr(title) ")"; - } - a[href^="javascript:"]:after, - a[href^="#"]:after { - content: ""; - } - pre, - blockquote { - border: 1px solid #999; - - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr, - img { - page-break-inside: avoid; - } - img { - max-width: 100% !important; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } - select { - background: #fff !important; - } - .navbar { - display: none; - } - .table td, - .table th { - background-color: #fff !important; - } - .btn > .caret, - .dropup > .btn > .caret { - border-top-color: #000 !important; - } - .label { - border: 1px solid #000; - } - .table { - border-collapse: collapse !important; - } - .table-bordered th, - .table-bordered td { - border: 1px solid #ddd !important; - } -} -* { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -*:before, -*:after { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -html { - font-size: 62.5%; - - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} -body { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 1.428571429; - color: #333; - background-color: #fff; -} -input, -button, -select, -textarea { - font-family: inherit; - font-size: inherit; - line-height: inherit; -} -a { - color: #428bca; - text-decoration: none; -} -a:hover, -a:focus { - color: #2a6496; - text-decoration: underline; -} -a:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -figure { - margin: 0; -} -img { - vertical-align: middle; -} -.img-responsive { - display: block; - max-width: 100%; - height: auto; -} -.img-rounded { - border-radius: 6px; -} -.img-thumbnail { - display: inline-block; - max-width: 100%; - height: auto; - padding: 4px; - line-height: 1.428571429; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 4px; - -webkit-transition: all .2s ease-in-out; - transition: all .2s ease-in-out; -} -.img-circle { - border-radius: 50%; -} -hr { - margin-top: 20px; - margin-bottom: 20px; - border: 0; - border-top: 1px solid #eee; -} -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - border: 0; -} -h1, -h2, -h3, -h4, -h5, -h6, -.h1, -.h2, -.h3, -.h4, -.h5, -.h6 { - font-family: inherit; - font-weight: 500; - line-height: 1.1; - color: inherit; -} -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small, -.h1 small, -.h2 small, -.h3 small, -.h4 small, -.h5 small, -.h6 small, -h1 .small, -h2 .small, -h3 .small, -h4 .small, -h5 .small, -h6 .small, -.h1 .small, -.h2 .small, -.h3 .small, -.h4 .small, -.h5 .small, -.h6 .small { - font-weight: normal; - line-height: 1; - color: #999; -} -h1, -.h1, -h2, -.h2, -h3, -.h3 { - margin-top: 20px; - margin-bottom: 10px; -} -h1 small, -.h1 small, -h2 small, -.h2 small, -h3 small, -.h3 small, -h1 .small, -.h1 .small, -h2 .small, -.h2 .small, -h3 .small, -.h3 .small { - font-size: 65%; -} -h4, -.h4, -h5, -.h5, -h6, -.h6 { - margin-top: 10px; - margin-bottom: 10px; -} -h4 small, -.h4 small, -h5 small, -.h5 small, -h6 small, -.h6 small, -h4 .small, -.h4 .small, -h5 .small, -.h5 .small, -h6 .small, -.h6 .small { - font-size: 75%; -} -h1, -.h1 { - font-size: 36px; -} -h2, -.h2 { - font-size: 30px; -} -h3, -.h3 { - font-size: 24px; -} -h4, -.h4 { - font-size: 18px; -} -h5, -.h5 { - font-size: 14px; -} -h6, -.h6 { - font-size: 12px; -} -p { - margin: 0 0 10px; -} -.lead { - margin-bottom: 20px; - font-size: 16px; - font-weight: 200; - line-height: 1.4; -} -@media (min-width: 768px) { - .lead { - font-size: 21px; - } -} -small, -.small { - font-size: 85%; -} -cite { - font-style: normal; -} -.text-left { - text-align: left; -} -.text-right { - text-align: right; -} -.text-center { - text-align: center; -} -.text-justify { - text-align: justify; -} -.text-muted { - color: #999; -} -.text-primary { - color: #428bca; -} -a.text-primary:hover { - color: #3071a9; -} -.text-success { - color: #3c763d; -} -a.text-success:hover { - color: #2b542c; -} -.text-info { - color: #31708f; -} -a.text-info:hover { - color: #245269; -} -.text-warning { - color: #8a6d3b; -} -a.text-warning:hover { - color: #66512c; -} -.text-danger { - color: #a94442; -} -a.text-danger:hover { - color: #843534; -} -.bg-primary { - color: #fff; - background-color: #428bca; -} -a.bg-primary:hover { - background-color: #3071a9; -} -.bg-success { - background-color: #dff0d8; -} -a.bg-success:hover { - background-color: #c1e2b3; -} -.bg-info { - background-color: #d9edf7; -} -a.bg-info:hover { - background-color: #afd9ee; -} -.bg-warning { - background-color: #fcf8e3; -} -a.bg-warning:hover { - background-color: #f7ecb5; -} -.bg-danger { - background-color: #f2dede; -} -a.bg-danger:hover { - background-color: #e4b9b9; -} -.page-header { - padding-bottom: 9px; - margin: 40px 0 20px; - border-bottom: 1px solid #eee; -} -ul, -ol { - margin-top: 0; - margin-bottom: 10px; -} -ul ul, -ol ul, -ul ol, -ol ol { - margin-bottom: 0; -} -.list-unstyled { - padding-left: 0; - list-style: none; -} -.list-inline { - padding-left: 0; - list-style: none; -} -.list-inline > li { - display: inline-block; - padding-right: 5px; - padding-left: 5px; -} -.list-inline > li:first-child { - padding-left: 0; -} -dl { - margin-top: 0; - margin-bottom: 20px; -} -dt, -dd { - line-height: 1.428571429; -} -dt { - font-weight: bold; -} -dd { - margin-left: 0; -} -@media (min-width: 768px) { - .dl-horizontal dt { - float: left; - width: 160px; - overflow: hidden; - clear: left; - text-align: right; - text-overflow: ellipsis; - white-space: nowrap; - } - .dl-horizontal dd { - margin-left: 180px; - } -} -abbr[title], -abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted #999; -} -.initialism { - font-size: 90%; - text-transform: uppercase; -} -blockquote { - padding: 10px 20px; - margin: 0 0 20px; - font-size: 17.5px; - border-left: 5px solid #eee; -} -blockquote p:last-child, -blockquote ul:last-child, -blockquote ol:last-child { - margin-bottom: 0; -} -blockquote footer, -blockquote small, -blockquote .small { - display: block; - font-size: 80%; - line-height: 1.428571429; - color: #999; -} -blockquote footer:before, -blockquote small:before, -blockquote .small:before { - content: '\2014 \00A0'; -} -.blockquote-reverse, -blockquote.pull-right { - padding-right: 15px; - padding-left: 0; - text-align: right; - border-right: 5px solid #eee; - border-left: 0; -} -.blockquote-reverse footer:before, -blockquote.pull-right footer:before, -.blockquote-reverse small:before, -blockquote.pull-right small:before, -.blockquote-reverse .small:before, -blockquote.pull-right .small:before { - content: ''; -} -.blockquote-reverse footer:after, -blockquote.pull-right footer:after, -.blockquote-reverse small:after, -blockquote.pull-right small:after, -.blockquote-reverse .small:after, -blockquote.pull-right .small:after { - content: '\00A0 \2014'; -} -blockquote:before, -blockquote:after { - content: ""; -} -address { - margin-bottom: 20px; - font-style: normal; - line-height: 1.428571429; -} -code, -kbd, -pre, -samp { - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; -} -code { - padding: 2px 4px; - font-size: 90%; - color: #c7254e; - white-space: nowrap; - background-color: #f9f2f4; - border-radius: 4px; -} -kbd { - padding: 2px 4px; - font-size: 90%; - color: #fff; - background-color: #333; - border-radius: 3px; - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); -} -pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 1.428571429; - color: #333; - word-break: break-all; - word-wrap: break-word; - background-color: #f5f5f5; - border: 1px solid #ccc; - border-radius: 4px; -} -pre code { - padding: 0; - font-size: inherit; - color: inherit; - white-space: pre-wrap; - background-color: transparent; - border-radius: 0; -} -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} -.container { - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} -@media (min-width: 768px) { - .container { - width: 750px; - } -} -@media (min-width: 992px) { - .container { - width: 970px; - } -} -@media (min-width: 1200px) { - .container { - width: 1170px; - } -} -.container-fluid { - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} -.row { - margin-right: -15px; - margin-left: -15px; -} -.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; -} -.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { - float: left; -} -.col-xs-12 { - width: 100%; -} -.col-xs-11 { - width: 91.66666666666666%; -} -.col-xs-10 { - width: 83.33333333333334%; -} -.col-xs-9 { - width: 75%; -} -.col-xs-8 { - width: 66.66666666666666%; -} -.col-xs-7 { - width: 58.333333333333336%; -} -.col-xs-6 { - width: 50%; -} -.col-xs-5 { - width: 41.66666666666667%; -} -.col-xs-4 { - width: 33.33333333333333%; -} -.col-xs-3 { - width: 25%; -} -.col-xs-2 { - width: 16.666666666666664%; -} -.col-xs-1 { - width: 8.333333333333332%; -} -.col-xs-pull-12 { - right: 100%; -} -.col-xs-pull-11 { - right: 91.66666666666666%; -} -.col-xs-pull-10 { - right: 83.33333333333334%; -} -.col-xs-pull-9 { - right: 75%; -} -.col-xs-pull-8 { - right: 66.66666666666666%; -} -.col-xs-pull-7 { - right: 58.333333333333336%; -} -.col-xs-pull-6 { - right: 50%; -} -.col-xs-pull-5 { - right: 41.66666666666667%; -} -.col-xs-pull-4 { - right: 33.33333333333333%; -} -.col-xs-pull-3 { - right: 25%; -} -.col-xs-pull-2 { - right: 16.666666666666664%; -} -.col-xs-pull-1 { - right: 8.333333333333332%; -} -.col-xs-pull-0 { - right: 0; -} -.col-xs-push-12 { - left: 100%; -} -.col-xs-push-11 { - left: 91.66666666666666%; -} -.col-xs-push-10 { - left: 83.33333333333334%; -} -.col-xs-push-9 { - left: 75%; -} -.col-xs-push-8 { - left: 66.66666666666666%; -} -.col-xs-push-7 { - left: 58.333333333333336%; -} -.col-xs-push-6 { - left: 50%; -} -.col-xs-push-5 { - left: 41.66666666666667%; -} -.col-xs-push-4 { - left: 33.33333333333333%; -} -.col-xs-push-3 { - left: 25%; -} -.col-xs-push-2 { - left: 16.666666666666664%; -} -.col-xs-push-1 { - left: 8.333333333333332%; -} -.col-xs-push-0 { - left: 0; -} -.col-xs-offset-12 { - margin-left: 100%; -} -.col-xs-offset-11 { - margin-left: 91.66666666666666%; -} -.col-xs-offset-10 { - margin-left: 83.33333333333334%; -} -.col-xs-offset-9 { - margin-left: 75%; -} -.col-xs-offset-8 { - margin-left: 66.66666666666666%; -} -.col-xs-offset-7 { - margin-left: 58.333333333333336%; -} -.col-xs-offset-6 { - margin-left: 50%; -} -.col-xs-offset-5 { - margin-left: 41.66666666666667%; -} -.col-xs-offset-4 { - margin-left: 33.33333333333333%; -} -.col-xs-offset-3 { - margin-left: 25%; -} -.col-xs-offset-2 { - margin-left: 16.666666666666664%; -} -.col-xs-offset-1 { - margin-left: 8.333333333333332%; -} -.col-xs-offset-0 { - margin-left: 0; -} -@media (min-width: 768px) { - .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { - float: left; - } - .col-sm-12 { - width: 100%; - } - .col-sm-11 { - width: 91.66666666666666%; - } - .col-sm-10 { - width: 83.33333333333334%; - } - .col-sm-9 { - width: 75%; - } - .col-sm-8 { - width: 66.66666666666666%; - } - .col-sm-7 { - width: 58.333333333333336%; - } - .col-sm-6 { - width: 50%; - } - .col-sm-5 { - width: 41.66666666666667%; - } - .col-sm-4 { - width: 33.33333333333333%; - } - .col-sm-3 { - width: 25%; - } - .col-sm-2 { - width: 16.666666666666664%; - } - .col-sm-1 { - width: 8.333333333333332%; - } - .col-sm-pull-12 { - right: 100%; - } - .col-sm-pull-11 { - right: 91.66666666666666%; - } - .col-sm-pull-10 { - right: 83.33333333333334%; - } - .col-sm-pull-9 { - right: 75%; - } - .col-sm-pull-8 { - right: 66.66666666666666%; - } - .col-sm-pull-7 { - right: 58.333333333333336%; - } - .col-sm-pull-6 { - right: 50%; - } - .col-sm-pull-5 { - right: 41.66666666666667%; - } - .col-sm-pull-4 { - right: 33.33333333333333%; - } - .col-sm-pull-3 { - right: 25%; - } - .col-sm-pull-2 { - right: 16.666666666666664%; - } - .col-sm-pull-1 { - right: 8.333333333333332%; - } - .col-sm-pull-0 { - right: 0; - } - .col-sm-push-12 { - left: 100%; - } - .col-sm-push-11 { - left: 91.66666666666666%; - } - .col-sm-push-10 { - left: 83.33333333333334%; - } - .col-sm-push-9 { - left: 75%; - } - .col-sm-push-8 { - left: 66.66666666666666%; - } - .col-sm-push-7 { - left: 58.333333333333336%; - } - .col-sm-push-6 { - left: 50%; - } - .col-sm-push-5 { - left: 41.66666666666667%; - } - .col-sm-push-4 { - left: 33.33333333333333%; - } - .col-sm-push-3 { - left: 25%; - } - .col-sm-push-2 { - left: 16.666666666666664%; - } - .col-sm-push-1 { - left: 8.333333333333332%; - } - .col-sm-push-0 { - left: 0; - } - .col-sm-offset-12 { - margin-left: 100%; - } - .col-sm-offset-11 { - margin-left: 91.66666666666666%; - } - .col-sm-offset-10 { - margin-left: 83.33333333333334%; - } - .col-sm-offset-9 { - margin-left: 75%; - } - .col-sm-offset-8 { - margin-left: 66.66666666666666%; - } - .col-sm-offset-7 { - margin-left: 58.333333333333336%; - } - .col-sm-offset-6 { - margin-left: 50%; - } - .col-sm-offset-5 { - margin-left: 41.66666666666667%; - } - .col-sm-offset-4 { - margin-left: 33.33333333333333%; - } - .col-sm-offset-3 { - margin-left: 25%; - } - .col-sm-offset-2 { - margin-left: 16.666666666666664%; - } - .col-sm-offset-1 { - margin-left: 8.333333333333332%; - } - .col-sm-offset-0 { - margin-left: 0; - } -} -@media (min-width: 992px) { - .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { - float: left; - } - .col-md-12 { - width: 100%; - } - .col-md-11 { - width: 91.66666666666666%; - } - .col-md-10 { - width: 83.33333333333334%; - } - .col-md-9 { - width: 75%; - } - .col-md-8 { - width: 66.66666666666666%; - } - .col-md-7 { - width: 58.333333333333336%; - } - .col-md-6 { - width: 50%; - } - .col-md-5 { - width: 41.66666666666667%; - } - .col-md-4 { - width: 33.33333333333333%; - } - .col-md-3 { - width: 25%; - } - .col-md-2 { - width: 16.666666666666664%; - } - .col-md-1 { - width: 8.333333333333332%; - } - .col-md-pull-12 { - right: 100%; - } - .col-md-pull-11 { - right: 91.66666666666666%; - } - .col-md-pull-10 { - right: 83.33333333333334%; - } - .col-md-pull-9 { - right: 75%; - } - .col-md-pull-8 { - right: 66.66666666666666%; - } - .col-md-pull-7 { - right: 58.333333333333336%; - } - .col-md-pull-6 { - right: 50%; - } - .col-md-pull-5 { - right: 41.66666666666667%; - } - .col-md-pull-4 { - right: 33.33333333333333%; - } - .col-md-pull-3 { - right: 25%; - } - .col-md-pull-2 { - right: 16.666666666666664%; - } - .col-md-pull-1 { - right: 8.333333333333332%; - } - .col-md-pull-0 { - right: 0; - } - .col-md-push-12 { - left: 100%; - } - .col-md-push-11 { - left: 91.66666666666666%; - } - .col-md-push-10 { - left: 83.33333333333334%; - } - .col-md-push-9 { - left: 75%; - } - .col-md-push-8 { - left: 66.66666666666666%; - } - .col-md-push-7 { - left: 58.333333333333336%; - } - .col-md-push-6 { - left: 50%; - } - .col-md-push-5 { - left: 41.66666666666667%; - } - .col-md-push-4 { - left: 33.33333333333333%; - } - .col-md-push-3 { - left: 25%; - } - .col-md-push-2 { - left: 16.666666666666664%; - } - .col-md-push-1 { - left: 8.333333333333332%; - } - .col-md-push-0 { - left: 0; - } - .col-md-offset-12 { - margin-left: 100%; - } - .col-md-offset-11 { - margin-left: 91.66666666666666%; - } - .col-md-offset-10 { - margin-left: 83.33333333333334%; - } - .col-md-offset-9 { - margin-left: 75%; - } - .col-md-offset-8 { - margin-left: 66.66666666666666%; - } - .col-md-offset-7 { - margin-left: 58.333333333333336%; - } - .col-md-offset-6 { - margin-left: 50%; - } - .col-md-offset-5 { - margin-left: 41.66666666666667%; - } - .col-md-offset-4 { - margin-left: 33.33333333333333%; - } - .col-md-offset-3 { - margin-left: 25%; - } - .col-md-offset-2 { - margin-left: 16.666666666666664%; - } - .col-md-offset-1 { - margin-left: 8.333333333333332%; - } - .col-md-offset-0 { - margin-left: 0; - } -} -@media (min-width: 1200px) { - .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { - float: left; - } - .col-lg-12 { - width: 100%; - } - .col-lg-11 { - width: 91.66666666666666%; - } - .col-lg-10 { - width: 83.33333333333334%; - } - .col-lg-9 { - width: 75%; - } - .col-lg-8 { - width: 66.66666666666666%; - } - .col-lg-7 { - width: 58.333333333333336%; - } - .col-lg-6 { - width: 50%; - } - .col-lg-5 { - width: 41.66666666666667%; - } - .col-lg-4 { - width: 33.33333333333333%; - } - .col-lg-3 { - width: 25%; - } - .col-lg-2 { - width: 16.666666666666664%; - } - .col-lg-1 { - width: 8.333333333333332%; - } - .col-lg-pull-12 { - right: 100%; - } - .col-lg-pull-11 { - right: 91.66666666666666%; - } - .col-lg-pull-10 { - right: 83.33333333333334%; - } - .col-lg-pull-9 { - right: 75%; - } - .col-lg-pull-8 { - right: 66.66666666666666%; - } - .col-lg-pull-7 { - right: 58.333333333333336%; - } - .col-lg-pull-6 { - right: 50%; - } - .col-lg-pull-5 { - right: 41.66666666666667%; - } - .col-lg-pull-4 { - right: 33.33333333333333%; - } - .col-lg-pull-3 { - right: 25%; - } - .col-lg-pull-2 { - right: 16.666666666666664%; - } - .col-lg-pull-1 { - right: 8.333333333333332%; - } - .col-lg-pull-0 { - right: 0; - } - .col-lg-push-12 { - left: 100%; - } - .col-lg-push-11 { - left: 91.66666666666666%; - } - .col-lg-push-10 { - left: 83.33333333333334%; - } - .col-lg-push-9 { - left: 75%; - } - .col-lg-push-8 { - left: 66.66666666666666%; - } - .col-lg-push-7 { - left: 58.333333333333336%; - } - .col-lg-push-6 { - left: 50%; - } - .col-lg-push-5 { - left: 41.66666666666667%; - } - .col-lg-push-4 { - left: 33.33333333333333%; - } - .col-lg-push-3 { - left: 25%; - } - .col-lg-push-2 { - left: 16.666666666666664%; - } - .col-lg-push-1 { - left: 8.333333333333332%; - } - .col-lg-push-0 { - left: 0; - } - .col-lg-offset-12 { - margin-left: 100%; - } - .col-lg-offset-11 { - margin-left: 91.66666666666666%; - } - .col-lg-offset-10 { - margin-left: 83.33333333333334%; - } - .col-lg-offset-9 { - margin-left: 75%; - } - .col-lg-offset-8 { - margin-left: 66.66666666666666%; - } - .col-lg-offset-7 { - margin-left: 58.333333333333336%; - } - .col-lg-offset-6 { - margin-left: 50%; - } - .col-lg-offset-5 { - margin-left: 41.66666666666667%; - } - .col-lg-offset-4 { - margin-left: 33.33333333333333%; - } - .col-lg-offset-3 { - margin-left: 25%; - } - .col-lg-offset-2 { - margin-left: 16.666666666666664%; - } - .col-lg-offset-1 { - margin-left: 8.333333333333332%; - } - .col-lg-offset-0 { - margin-left: 0; - } -} -table { - max-width: 100%; - background-color: transparent; -} -th { - text-align: left; -} -.table { - width: 100%; - margin-bottom: 20px; -} -.table > thead > tr > th, -.table > tbody > tr > th, -.table > tfoot > tr > th, -.table > thead > tr > td, -.table > tbody > tr > td, -.table > tfoot > tr > td { - padding: 8px; - line-height: 1.428571429; - vertical-align: top; - border-top: 1px solid #ddd; -} -.table > thead > tr > th { - vertical-align: bottom; - border-bottom: 2px solid #ddd; -} -.table > caption + thead > tr:first-child > th, -.table > colgroup + thead > tr:first-child > th, -.table > thead:first-child > tr:first-child > th, -.table > caption + thead > tr:first-child > td, -.table > colgroup + thead > tr:first-child > td, -.table > thead:first-child > tr:first-child > td { - border-top: 0; -} -.table > tbody + tbody { - border-top: 2px solid #ddd; -} -.table .table { - background-color: #fff; -} -.table-condensed > thead > tr > th, -.table-condensed > tbody > tr > th, -.table-condensed > tfoot > tr > th, -.table-condensed > thead > tr > td, -.table-condensed > tbody > tr > td, -.table-condensed > tfoot > tr > td { - padding: 5px; -} -.table-bordered { - border: 1px solid #ddd; -} -.table-bordered > thead > tr > th, -.table-bordered > tbody > tr > th, -.table-bordered > tfoot > tr > th, -.table-bordered > thead > tr > td, -.table-bordered > tbody > tr > td, -.table-bordered > tfoot > tr > td { - border: 1px solid #ddd; -} -.table-bordered > thead > tr > th, -.table-bordered > thead > tr > td { - border-bottom-width: 2px; -} -.table-striped > tbody > tr:nth-child(odd) > td, -.table-striped > tbody > tr:nth-child(odd) > th { - background-color: #f9f9f9; -} -.table-hover > tbody > tr:hover > td, -.table-hover > tbody > tr:hover > th { - background-color: #f5f5f5; -} -table col[class*="col-"] { - position: static; - display: table-column; - float: none; -} -table td[class*="col-"], -table th[class*="col-"] { - position: static; - display: table-cell; - float: none; -} -.table > thead > tr > td.active, -.table > tbody > tr > td.active, -.table > tfoot > tr > td.active, -.table > thead > tr > th.active, -.table > tbody > tr > th.active, -.table > tfoot > tr > th.active, -.table > thead > tr.active > td, -.table > tbody > tr.active > td, -.table > tfoot > tr.active > td, -.table > thead > tr.active > th, -.table > tbody > tr.active > th, -.table > tfoot > tr.active > th { - background-color: #f5f5f5; -} -.table-hover > tbody > tr > td.active:hover, -.table-hover > tbody > tr > th.active:hover, -.table-hover > tbody > tr.active:hover > td, -.table-hover > tbody > tr.active:hover > th { - background-color: #e8e8e8; -} -.table > thead > tr > td.success, -.table > tbody > tr > td.success, -.table > tfoot > tr > td.success, -.table > thead > tr > th.success, -.table > tbody > tr > th.success, -.table > tfoot > tr > th.success, -.table > thead > tr.success > td, -.table > tbody > tr.success > td, -.table > tfoot > tr.success > td, -.table > thead > tr.success > th, -.table > tbody > tr.success > th, -.table > tfoot > tr.success > th { - background-color: #dff0d8; -} -.table-hover > tbody > tr > td.success:hover, -.table-hover > tbody > tr > th.success:hover, -.table-hover > tbody > tr.success:hover > td, -.table-hover > tbody > tr.success:hover > th { - background-color: #d0e9c6; -} -.table > thead > tr > td.info, -.table > tbody > tr > td.info, -.table > tfoot > tr > td.info, -.table > thead > tr > th.info, -.table > tbody > tr > th.info, -.table > tfoot > tr > th.info, -.table > thead > tr.info > td, -.table > tbody > tr.info > td, -.table > tfoot > tr.info > td, -.table > thead > tr.info > th, -.table > tbody > tr.info > th, -.table > tfoot > tr.info > th { - background-color: #d9edf7; -} -.table-hover > tbody > tr > td.info:hover, -.table-hover > tbody > tr > th.info:hover, -.table-hover > tbody > tr.info:hover > td, -.table-hover > tbody > tr.info:hover > th { - background-color: #c4e3f3; -} -.table > thead > tr > td.warning, -.table > tbody > tr > td.warning, -.table > tfoot > tr > td.warning, -.table > thead > tr > th.warning, -.table > tbody > tr > th.warning, -.table > tfoot > tr > th.warning, -.table > thead > tr.warning > td, -.table > tbody > tr.warning > td, -.table > tfoot > tr.warning > td, -.table > thead > tr.warning > th, -.table > tbody > tr.warning > th, -.table > tfoot > tr.warning > th { - background-color: #fcf8e3; -} -.table-hover > tbody > tr > td.warning:hover, -.table-hover > tbody > tr > th.warning:hover, -.table-hover > tbody > tr.warning:hover > td, -.table-hover > tbody > tr.warning:hover > th { - background-color: #faf2cc; -} -.table > thead > tr > td.danger, -.table > tbody > tr > td.danger, -.table > tfoot > tr > td.danger, -.table > thead > tr > th.danger, -.table > tbody > tr > th.danger, -.table > tfoot > tr > th.danger, -.table > thead > tr.danger > td, -.table > tbody > tr.danger > td, -.table > tfoot > tr.danger > td, -.table > thead > tr.danger > th, -.table > tbody > tr.danger > th, -.table > tfoot > tr.danger > th { - background-color: #f2dede; -} -.table-hover > tbody > tr > td.danger:hover, -.table-hover > tbody > tr > th.danger:hover, -.table-hover > tbody > tr.danger:hover > td, -.table-hover > tbody > tr.danger:hover > th { - background-color: #ebcccc; -} -@media (max-width: 767px) { - .table-responsive { - width: 100%; - margin-bottom: 15px; - overflow-x: scroll; - overflow-y: hidden; - -webkit-overflow-scrolling: touch; - -ms-overflow-style: -ms-autohiding-scrollbar; - border: 1px solid #ddd; - } - .table-responsive > .table { - margin-bottom: 0; - } - .table-responsive > .table > thead > tr > th, - .table-responsive > .table > tbody > tr > th, - .table-responsive > .table > tfoot > tr > th, - .table-responsive > .table > thead > tr > td, - .table-responsive > .table > tbody > tr > td, - .table-responsive > .table > tfoot > tr > td { - white-space: nowrap; - } - .table-responsive > .table-bordered { - border: 0; - } - .table-responsive > .table-bordered > thead > tr > th:first-child, - .table-responsive > .table-bordered > tbody > tr > th:first-child, - .table-responsive > .table-bordered > tfoot > tr > th:first-child, - .table-responsive > .table-bordered > thead > tr > td:first-child, - .table-responsive > .table-bordered > tbody > tr > td:first-child, - .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; - } - .table-responsive > .table-bordered > thead > tr > th:last-child, - .table-responsive > .table-bordered > tbody > tr > th:last-child, - .table-responsive > .table-bordered > tfoot > tr > th:last-child, - .table-responsive > .table-bordered > thead > tr > td:last-child, - .table-responsive > .table-bordered > tbody > tr > td:last-child, - .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; - } - .table-responsive > .table-bordered > tbody > tr:last-child > th, - .table-responsive > .table-bordered > tfoot > tr:last-child > th, - .table-responsive > .table-bordered > tbody > tr:last-child > td, - .table-responsive > .table-bordered > tfoot > tr:last-child > td { - border-bottom: 0; - } -} -fieldset { - min-width: 0; - padding: 0; - margin: 0; - border: 0; -} -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: inherit; - color: #333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} -label { - display: inline-block; - margin-bottom: 5px; - font-weight: bold; -} -input[type="search"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px \9; - /* IE8-9 */ - line-height: normal; -} -input[type="file"] { - display: block; -} -input[type="range"] { - display: block; - width: 100%; -} -select[multiple], -select[size] { - height: auto; -} -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -output { - display: block; - padding-top: 7px; - font-size: 14px; - line-height: 1.428571429; - color: #555; -} -.form-control { - display: block; - width: 100%; - height: 34px; - padding: 6px 12px; - font-size: 14px; - line-height: 1.428571429; - color: #555; - background-color: #fff; - background-image: none; - border: 1px solid #ccc; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; - transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; -} -.form-control:focus { - border-color: #66afe9; - outline: 0; - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); -} -.form-control:-moz-placeholder { - color: #999; -} -.form-control::-moz-placeholder { - color: #999; - opacity: 1; -} -.form-control:-ms-input-placeholder { - color: #999; -} -.form-control::-webkit-input-placeholder { - color: #999; -} -.form-control[disabled], -.form-control[readonly], -fieldset[disabled] .form-control { - cursor: not-allowed; - background-color: #eee; - opacity: 1; -} -textarea.form-control { - height: auto; -} -input[type="date"] { - line-height: 34px; -} -.form-group { - margin-bottom: 15px; -} -.radio, -.checkbox { - display: block; - min-height: 20px; - padding-left: 20px; - margin-top: 10px; - margin-bottom: 10px; -} -.radio label, -.checkbox label { - display: inline; - font-weight: normal; - cursor: pointer; -} -.radio input[type="radio"], -.radio-inline input[type="radio"], -.checkbox input[type="checkbox"], -.checkbox-inline input[type="checkbox"] { - float: left; - margin-left: -20px; -} -.radio + .radio, -.checkbox + .checkbox { - margin-top: -5px; -} -.radio-inline, -.checkbox-inline { - display: inline-block; - padding-left: 20px; - margin-bottom: 0; - font-weight: normal; - vertical-align: middle; - cursor: pointer; -} -.radio-inline + .radio-inline, -.checkbox-inline + .checkbox-inline { - margin-top: 0; - margin-left: 10px; -} -input[type="radio"][disabled], -input[type="checkbox"][disabled], -.radio[disabled], -.radio-inline[disabled], -.checkbox[disabled], -.checkbox-inline[disabled], -fieldset[disabled] input[type="radio"], -fieldset[disabled] input[type="checkbox"], -fieldset[disabled] .radio, -fieldset[disabled] .radio-inline, -fieldset[disabled] .checkbox, -fieldset[disabled] .checkbox-inline { - cursor: not-allowed; -} -.input-sm { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -select.input-sm { - height: 30px; - line-height: 30px; -} -textarea.input-sm, -select[multiple].input-sm { - height: auto; -} -.input-lg { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} -select.input-lg { - height: 46px; - line-height: 46px; -} -textarea.input-lg, -select[multiple].input-lg { - height: auto; -} -.has-feedback { - position: relative; -} -.has-feedback .form-control { - padding-right: 42.5px; -} -.has-feedback .form-control-feedback { - position: absolute; - top: 25px; - right: 0; - display: block; - width: 34px; - height: 34px; - line-height: 34px; - text-align: center; -} -.has-success .help-block, -.has-success .control-label, -.has-success .radio, -.has-success .checkbox, -.has-success .radio-inline, -.has-success .checkbox-inline { - color: #3c763d; -} -.has-success .form-control { - border-color: #3c763d; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -} -.has-success .form-control:focus { - border-color: #2b542c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; -} -.has-success .input-group-addon { - color: #3c763d; - background-color: #dff0d8; - border-color: #3c763d; -} -.has-success .form-control-feedback { - color: #3c763d; -} -.has-warning .help-block, -.has-warning .control-label, -.has-warning .radio, -.has-warning .checkbox, -.has-warning .radio-inline, -.has-warning .checkbox-inline { - color: #8a6d3b; -} -.has-warning .form-control { - border-color: #8a6d3b; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -} -.has-warning .form-control:focus { - border-color: #66512c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; -} -.has-warning .input-group-addon { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #8a6d3b; -} -.has-warning .form-control-feedback { - color: #8a6d3b; -} -.has-error .help-block, -.has-error .control-label, -.has-error .radio, -.has-error .checkbox, -.has-error .radio-inline, -.has-error .checkbox-inline { - color: #a94442; -} -.has-error .form-control { - border-color: #a94442; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -} -.has-error .form-control:focus { - border-color: #843534; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; -} -.has-error .input-group-addon { - color: #a94442; - background-color: #f2dede; - border-color: #a94442; -} -.has-error .form-control-feedback { - color: #a94442; -} -.form-control-static { - margin-bottom: 0; -} -.help-block { - display: block; - margin-top: 5px; - margin-bottom: 10px; - color: #737373; -} -@media (min-width: 768px) { - .form-inline .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .form-inline .control-label { - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .radio, - .form-inline .checkbox { - display: inline-block; - padding-left: 0; - margin-top: 0; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .radio input[type="radio"], - .form-inline .checkbox input[type="checkbox"] { - float: none; - margin-left: 0; - } - .form-inline .has-feedback .form-control-feedback { - top: 0; - } -} -.form-horizontal .control-label, -.form-horizontal .radio, -.form-horizontal .checkbox, -.form-horizontal .radio-inline, -.form-horizontal .checkbox-inline { - padding-top: 7px; - margin-top: 0; - margin-bottom: 0; -} -.form-horizontal .radio, -.form-horizontal .checkbox { - min-height: 27px; -} -.form-horizontal .form-group { - margin-right: -15px; - margin-left: -15px; -} -.form-horizontal .form-control-static { - padding-top: 7px; -} -@media (min-width: 768px) { - .form-horizontal .control-label { - text-align: right; - } -} -.form-horizontal .has-feedback .form-control-feedback { - top: 0; - right: 15px; -} -.btn { - display: inline-block; - padding: 6px 12px; - margin-bottom: 0; - font-size: 14px; - font-weight: normal; - line-height: 1.428571429; - text-align: center; - white-space: nowrap; - vertical-align: middle; - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - -o-user-select: none; - user-select: none; - background-image: none; - border: 1px solid transparent; - border-radius: 4px; -} -.btn:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.btn:hover, -.btn:focus { - color: #333; - text-decoration: none; -} -.btn:active, -.btn.active { - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); -} -.btn.disabled, -.btn[disabled], -fieldset[disabled] .btn { - pointer-events: none; - cursor: not-allowed; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - box-shadow: none; - opacity: .65; -} -.btn-default { - color: #333; - background-color: #fff; - border-color: #ccc; -} -.btn-default:hover, -.btn-default:focus, -.btn-default:active, -.btn-default.active, -.open .dropdown-toggle.btn-default { - color: #333; - background-color: #ebebeb; - border-color: #adadad; -} -.btn-default:active, -.btn-default.active, -.open .dropdown-toggle.btn-default { - background-image: none; -} -.btn-default.disabled, -.btn-default[disabled], -fieldset[disabled] .btn-default, -.btn-default.disabled:hover, -.btn-default[disabled]:hover, -fieldset[disabled] .btn-default:hover, -.btn-default.disabled:focus, -.btn-default[disabled]:focus, -fieldset[disabled] .btn-default:focus, -.btn-default.disabled:active, -.btn-default[disabled]:active, -fieldset[disabled] .btn-default:active, -.btn-default.disabled.active, -.btn-default[disabled].active, -fieldset[disabled] .btn-default.active { - background-color: #fff; - border-color: #ccc; -} -.btn-default .badge { - color: #fff; - background-color: #333; -} -.btn-primary { - color: #fff; - background-color: #428bca; - border-color: #357ebd; -} -.btn-primary:hover, -.btn-primary:focus, -.btn-primary:active, -.btn-primary.active, -.open .dropdown-toggle.btn-primary { - color: #fff; - background-color: #3276b1; - border-color: #285e8e; -} -.btn-primary:active, -.btn-primary.active, -.open .dropdown-toggle.btn-primary { - background-image: none; -} -.btn-primary.disabled, -.btn-primary[disabled], -fieldset[disabled] .btn-primary, -.btn-primary.disabled:hover, -.btn-primary[disabled]:hover, -fieldset[disabled] .btn-primary:hover, -.btn-primary.disabled:focus, -.btn-primary[disabled]:focus, -fieldset[disabled] .btn-primary:focus, -.btn-primary.disabled:active, -.btn-primary[disabled]:active, -fieldset[disabled] .btn-primary:active, -.btn-primary.disabled.active, -.btn-primary[disabled].active, -fieldset[disabled] .btn-primary.active { - background-color: #428bca; - border-color: #357ebd; -} -.btn-primary .badge { - color: #428bca; - background-color: #fff; -} -.btn-success { - color: #fff; - background-color: #5cb85c; - border-color: #4cae4c; -} -.btn-success:hover, -.btn-success:focus, -.btn-success:active, -.btn-success.active, -.open .dropdown-toggle.btn-success { - color: #fff; - background-color: #47a447; - border-color: #398439; -} -.btn-success:active, -.btn-success.active, -.open .dropdown-toggle.btn-success { - background-image: none; -} -.btn-success.disabled, -.btn-success[disabled], -fieldset[disabled] .btn-success, -.btn-success.disabled:hover, -.btn-success[disabled]:hover, -fieldset[disabled] .btn-success:hover, -.btn-success.disabled:focus, -.btn-success[disabled]:focus, -fieldset[disabled] .btn-success:focus, -.btn-success.disabled:active, -.btn-success[disabled]:active, -fieldset[disabled] .btn-success:active, -.btn-success.disabled.active, -.btn-success[disabled].active, -fieldset[disabled] .btn-success.active { - background-color: #5cb85c; - border-color: #4cae4c; -} -.btn-success .badge { - color: #5cb85c; - background-color: #fff; -} -.btn-info { - color: #fff; - background-color: #5bc0de; - border-color: #46b8da; -} -.btn-info:hover, -.btn-info:focus, -.btn-info:active, -.btn-info.active, -.open .dropdown-toggle.btn-info { - color: #fff; - background-color: #39b3d7; - border-color: #269abc; -} -.btn-info:active, -.btn-info.active, -.open .dropdown-toggle.btn-info { - background-image: none; -} -.btn-info.disabled, -.btn-info[disabled], -fieldset[disabled] .btn-info, -.btn-info.disabled:hover, -.btn-info[disabled]:hover, -fieldset[disabled] .btn-info:hover, -.btn-info.disabled:focus, -.btn-info[disabled]:focus, -fieldset[disabled] .btn-info:focus, -.btn-info.disabled:active, -.btn-info[disabled]:active, -fieldset[disabled] .btn-info:active, -.btn-info.disabled.active, -.btn-info[disabled].active, -fieldset[disabled] .btn-info.active { - background-color: #5bc0de; - border-color: #46b8da; -} -.btn-info .badge { - color: #5bc0de; - background-color: #fff; -} -.btn-warning { - color: #fff; - background-color: #f0ad4e; - border-color: #eea236; -} -.btn-warning:hover, -.btn-warning:focus, -.btn-warning:active, -.btn-warning.active, -.open .dropdown-toggle.btn-warning { - color: #fff; - background-color: #ed9c28; - border-color: #d58512; -} -.btn-warning:active, -.btn-warning.active, -.open .dropdown-toggle.btn-warning { - background-image: none; -} -.btn-warning.disabled, -.btn-warning[disabled], -fieldset[disabled] .btn-warning, -.btn-warning.disabled:hover, -.btn-warning[disabled]:hover, -fieldset[disabled] .btn-warning:hover, -.btn-warning.disabled:focus, -.btn-warning[disabled]:focus, -fieldset[disabled] .btn-warning:focus, -.btn-warning.disabled:active, -.btn-warning[disabled]:active, -fieldset[disabled] .btn-warning:active, -.btn-warning.disabled.active, -.btn-warning[disabled].active, -fieldset[disabled] .btn-warning.active { - background-color: #f0ad4e; - border-color: #eea236; -} -.btn-warning .badge { - color: #f0ad4e; - background-color: #fff; -} -.btn-danger { - color: #fff; - background-color: #d9534f; - border-color: #d43f3a; -} -.btn-danger:hover, -.btn-danger:focus, -.btn-danger:active, -.btn-danger.active, -.open .dropdown-toggle.btn-danger { - color: #fff; - background-color: #d2322d; - border-color: #ac2925; -} -.btn-danger:active, -.btn-danger.active, -.open .dropdown-toggle.btn-danger { - background-image: none; -} -.btn-danger.disabled, -.btn-danger[disabled], -fieldset[disabled] .btn-danger, -.btn-danger.disabled:hover, -.btn-danger[disabled]:hover, -fieldset[disabled] .btn-danger:hover, -.btn-danger.disabled:focus, -.btn-danger[disabled]:focus, -fieldset[disabled] .btn-danger:focus, -.btn-danger.disabled:active, -.btn-danger[disabled]:active, -fieldset[disabled] .btn-danger:active, -.btn-danger.disabled.active, -.btn-danger[disabled].active, -fieldset[disabled] .btn-danger.active { - background-color: #d9534f; - border-color: #d43f3a; -} -.btn-danger .badge { - color: #d9534f; - background-color: #fff; -} -.btn-link { - font-weight: normal; - color: #428bca; - cursor: pointer; - border-radius: 0; -} -.btn-link, -.btn-link:active, -.btn-link[disabled], -fieldset[disabled] .btn-link { - background-color: transparent; - -webkit-box-shadow: none; - box-shadow: none; -} -.btn-link, -.btn-link:hover, -.btn-link:focus, -.btn-link:active { - border-color: transparent; -} -.btn-link:hover, -.btn-link:focus { - color: #2a6496; - text-decoration: underline; - background-color: transparent; -} -.btn-link[disabled]:hover, -fieldset[disabled] .btn-link:hover, -.btn-link[disabled]:focus, -fieldset[disabled] .btn-link:focus { - color: #999; - text-decoration: none; -} -.btn-lg { - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} -.btn-sm { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -.btn-xs { - padding: 1px 5px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -.btn-block { - display: block; - width: 100%; - padding-right: 0; - padding-left: 0; -} -.btn-block + .btn-block { - margin-top: 5px; -} -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} -.fade { - opacity: 0; - -webkit-transition: opacity .15s linear; - transition: opacity .15s linear; -} -.fade.in { - opacity: 1; -} -.collapse { - display: none; -} -.collapse.in { - display: block; -} -.collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height .35s ease; - transition: height .35s ease; -} -@font-face { - font-family: 'Glyphicons Halflings'; - - src: url('../fonts/glyphicons-halflings-regular.eot'); - src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); -} -.glyphicon { - position: relative; - top: 1px; - display: inline-block; - font-family: 'Glyphicons Halflings'; - font-style: normal; - font-weight: normal; - line-height: 1; - - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -.glyphicon-asterisk:before { - content: "\2a"; -} -.glyphicon-plus:before { - content: "\2b"; -} -.glyphicon-euro:before { - content: "\20ac"; -} -.glyphicon-minus:before { - content: "\2212"; -} -.glyphicon-cloud:before { - content: "\2601"; -} -.glyphicon-envelope:before { - content: "\2709"; -} -.glyphicon-pencil:before { - content: "\270f"; -} -.glyphicon-glass:before { - content: "\e001"; -} -.glyphicon-music:before { - content: "\e002"; -} -.glyphicon-search:before { - content: "\e003"; -} -.glyphicon-heart:before { - content: "\e005"; -} -.glyphicon-star:before { - content: "\e006"; -} -.glyphicon-star-empty:before { - content: "\e007"; -} -.glyphicon-user:before { - content: "\e008"; -} -.glyphicon-film:before { - content: "\e009"; -} -.glyphicon-th-large:before { - content: "\e010"; -} -.glyphicon-th:before { - content: "\e011"; -} -.glyphicon-th-list:before { - content: "\e012"; -} -.glyphicon-ok:before { - content: "\e013"; -} -.glyphicon-remove:before { - content: "\e014"; -} -.glyphicon-zoom-in:before { - content: "\e015"; -} -.glyphicon-zoom-out:before { - content: "\e016"; -} -.glyphicon-off:before { - content: "\e017"; -} -.glyphicon-signal:before { - content: "\e018"; -} -.glyphicon-cog:before { - content: "\e019"; -} -.glyphicon-trash:before { - content: "\e020"; -} -.glyphicon-home:before { - content: "\e021"; -} -.glyphicon-file:before { - content: "\e022"; -} -.glyphicon-time:before { - content: "\e023"; -} -.glyphicon-road:before { - content: "\e024"; -} -.glyphicon-download-alt:before { - content: "\e025"; -} -.glyphicon-download:before { - content: "\e026"; -} -.glyphicon-upload:before { - content: "\e027"; -} -.glyphicon-inbox:before { - content: "\e028"; -} -.glyphicon-play-circle:before { - content: "\e029"; -} -.glyphicon-repeat:before { - content: "\e030"; -} -.glyphicon-refresh:before { - content: "\e031"; -} -.glyphicon-list-alt:before { - content: "\e032"; -} -.glyphicon-lock:before { - content: "\e033"; -} -.glyphicon-flag:before { - content: "\e034"; -} -.glyphicon-headphones:before { - content: "\e035"; -} -.glyphicon-volume-off:before { - content: "\e036"; -} -.glyphicon-volume-down:before { - content: "\e037"; -} -.glyphicon-volume-up:before { - content: "\e038"; -} -.glyphicon-qrcode:before { - content: "\e039"; -} -.glyphicon-barcode:before { - content: "\e040"; -} -.glyphicon-tag:before { - content: "\e041"; -} -.glyphicon-tags:before { - content: "\e042"; -} -.glyphicon-book:before { - content: "\e043"; -} -.glyphicon-bookmark:before { - content: "\e044"; -} -.glyphicon-print:before { - content: "\e045"; -} -.glyphicon-camera:before { - content: "\e046"; -} -.glyphicon-font:before { - content: "\e047"; -} -.glyphicon-bold:before { - content: "\e048"; -} -.glyphicon-italic:before { - content: "\e049"; -} -.glyphicon-text-height:before { - content: "\e050"; -} -.glyphicon-text-width:before { - content: "\e051"; -} -.glyphicon-align-left:before { - content: "\e052"; -} -.glyphicon-align-center:before { - content: "\e053"; -} -.glyphicon-align-right:before { - content: "\e054"; -} -.glyphicon-align-justify:before { - content: "\e055"; -} -.glyphicon-list:before { - content: "\e056"; -} -.glyphicon-indent-left:before { - content: "\e057"; -} -.glyphicon-indent-right:before { - content: "\e058"; -} -.glyphicon-facetime-video:before { - content: "\e059"; -} -.glyphicon-picture:before { - content: "\e060"; -} -.glyphicon-map-marker:before { - content: "\e062"; -} -.glyphicon-adjust:before { - content: "\e063"; -} -.glyphicon-tint:before { - content: "\e064"; -} -.glyphicon-edit:before { - content: "\e065"; -} -.glyphicon-share:before { - content: "\e066"; -} -.glyphicon-check:before { - content: "\e067"; -} -.glyphicon-move:before { - content: "\e068"; -} -.glyphicon-step-backward:before { - content: "\e069"; -} -.glyphicon-fast-backward:before { - content: "\e070"; -} -.glyphicon-backward:before { - content: "\e071"; -} -.glyphicon-play:before { - content: "\e072"; -} -.glyphicon-pause:before { - content: "\e073"; -} -.glyphicon-stop:before { - content: "\e074"; -} -.glyphicon-forward:before { - content: "\e075"; -} -.glyphicon-fast-forward:before { - content: "\e076"; -} -.glyphicon-step-forward:before { - content: "\e077"; -} -.glyphicon-eject:before { - content: "\e078"; -} -.glyphicon-chevron-left:before { - content: "\e079"; -} -.glyphicon-chevron-right:before { - content: "\e080"; -} -.glyphicon-plus-sign:before { - content: "\e081"; -} -.glyphicon-minus-sign:before { - content: "\e082"; -} -.glyphicon-remove-sign:before { - content: "\e083"; -} -.glyphicon-ok-sign:before { - content: "\e084"; -} -.glyphicon-question-sign:before { - content: "\e085"; -} -.glyphicon-info-sign:before { - content: "\e086"; -} -.glyphicon-screenshot:before { - content: "\e087"; -} -.glyphicon-remove-circle:before { - content: "\e088"; -} -.glyphicon-ok-circle:before { - content: "\e089"; -} -.glyphicon-ban-circle:before { - content: "\e090"; -} -.glyphicon-arrow-left:before { - content: "\e091"; -} -.glyphicon-arrow-right:before { - content: "\e092"; -} -.glyphicon-arrow-up:before { - content: "\e093"; -} -.glyphicon-arrow-down:before { - content: "\e094"; -} -.glyphicon-share-alt:before { - content: "\e095"; -} -.glyphicon-resize-full:before { - content: "\e096"; -} -.glyphicon-resize-small:before { - content: "\e097"; -} -.glyphicon-exclamation-sign:before { - content: "\e101"; -} -.glyphicon-gift:before { - content: "\e102"; -} -.glyphicon-leaf:before { - content: "\e103"; -} -.glyphicon-fire:before { - content: "\e104"; -} -.glyphicon-eye-open:before { - content: "\e105"; -} -.glyphicon-eye-close:before { - content: "\e106"; -} -.glyphicon-warning-sign:before { - content: "\e107"; -} -.glyphicon-plane:before { - content: "\e108"; -} -.glyphicon-calendar:before { - content: "\e109"; -} -.glyphicon-random:before { - content: "\e110"; -} -.glyphicon-comment:before { - content: "\e111"; -} -.glyphicon-magnet:before { - content: "\e112"; -} -.glyphicon-chevron-up:before { - content: "\e113"; -} -.glyphicon-chevron-down:before { - content: "\e114"; -} -.glyphicon-retweet:before { - content: "\e115"; -} -.glyphicon-shopping-cart:before { - content: "\e116"; -} -.glyphicon-folder-close:before { - content: "\e117"; -} -.glyphicon-folder-open:before { - content: "\e118"; -} -.glyphicon-resize-vertical:before { - content: "\e119"; -} -.glyphicon-resize-horizontal:before { - content: "\e120"; -} -.glyphicon-hdd:before { - content: "\e121"; -} -.glyphicon-bullhorn:before { - content: "\e122"; -} -.glyphicon-bell:before { - content: "\e123"; -} -.glyphicon-certificate:before { - content: "\e124"; -} -.glyphicon-thumbs-up:before { - content: "\e125"; -} -.glyphicon-thumbs-down:before { - content: "\e126"; -} -.glyphicon-hand-right:before { - content: "\e127"; -} -.glyphicon-hand-left:before { - content: "\e128"; -} -.glyphicon-hand-up:before { - content: "\e129"; -} -.glyphicon-hand-down:before { - content: "\e130"; -} -.glyphicon-circle-arrow-right:before { - content: "\e131"; -} -.glyphicon-circle-arrow-left:before { - content: "\e132"; -} -.glyphicon-circle-arrow-up:before { - content: "\e133"; -} -.glyphicon-circle-arrow-down:before { - content: "\e134"; -} -.glyphicon-globe:before { - content: "\e135"; -} -.glyphicon-wrench:before { - content: "\e136"; -} -.glyphicon-tasks:before { - content: "\e137"; -} -.glyphicon-filter:before { - content: "\e138"; -} -.glyphicon-briefcase:before { - content: "\e139"; -} -.glyphicon-fullscreen:before { - content: "\e140"; -} -.glyphicon-dashboard:before { - content: "\e141"; -} -.glyphicon-paperclip:before { - content: "\e142"; -} -.glyphicon-heart-empty:before { - content: "\e143"; -} -.glyphicon-link:before { - content: "\e144"; -} -.glyphicon-phone:before { - content: "\e145"; -} -.glyphicon-pushpin:before { - content: "\e146"; -} -.glyphicon-usd:before { - content: "\e148"; -} -.glyphicon-gbp:before { - content: "\e149"; -} -.glyphicon-sort:before { - content: "\e150"; -} -.glyphicon-sort-by-alphabet:before { - content: "\e151"; -} -.glyphicon-sort-by-alphabet-alt:before { - content: "\e152"; -} -.glyphicon-sort-by-order:before { - content: "\e153"; -} -.glyphicon-sort-by-order-alt:before { - content: "\e154"; -} -.glyphicon-sort-by-attributes:before { - content: "\e155"; -} -.glyphicon-sort-by-attributes-alt:before { - content: "\e156"; -} -.glyphicon-unchecked:before { - content: "\e157"; -} -.glyphicon-expand:before { - content: "\e158"; -} -.glyphicon-collapse-down:before { - content: "\e159"; -} -.glyphicon-collapse-up:before { - content: "\e160"; -} -.glyphicon-log-in:before { - content: "\e161"; -} -.glyphicon-flash:before { - content: "\e162"; -} -.glyphicon-log-out:before { - content: "\e163"; -} -.glyphicon-new-window:before { - content: "\e164"; -} -.glyphicon-record:before { - content: "\e165"; -} -.glyphicon-save:before { - content: "\e166"; -} -.glyphicon-open:before { - content: "\e167"; -} -.glyphicon-saved:before { - content: "\e168"; -} -.glyphicon-import:before { - content: "\e169"; -} -.glyphicon-export:before { - content: "\e170"; -} -.glyphicon-send:before { - content: "\e171"; -} -.glyphicon-floppy-disk:before { - content: "\e172"; -} -.glyphicon-floppy-saved:before { - content: "\e173"; -} -.glyphicon-floppy-remove:before { - content: "\e174"; -} -.glyphicon-floppy-save:before { - content: "\e175"; -} -.glyphicon-floppy-open:before { - content: "\e176"; -} -.glyphicon-credit-card:before { - content: "\e177"; -} -.glyphicon-transfer:before { - content: "\e178"; -} -.glyphicon-cutlery:before { - content: "\e179"; -} -.glyphicon-header:before { - content: "\e180"; -} -.glyphicon-compressed:before { - content: "\e181"; -} -.glyphicon-earphone:before { - content: "\e182"; -} -.glyphicon-phone-alt:before { - content: "\e183"; -} -.glyphicon-tower:before { - content: "\e184"; -} -.glyphicon-stats:before { - content: "\e185"; -} -.glyphicon-sd-video:before { - content: "\e186"; -} -.glyphicon-hd-video:before { - content: "\e187"; -} -.glyphicon-subtitles:before { - content: "\e188"; -} -.glyphicon-sound-stereo:before { - content: "\e189"; -} -.glyphicon-sound-dolby:before { - content: "\e190"; -} -.glyphicon-sound-5-1:before { - content: "\e191"; -} -.glyphicon-sound-6-1:before { - content: "\e192"; -} -.glyphicon-sound-7-1:before { - content: "\e193"; -} -.glyphicon-copyright-mark:before { - content: "\e194"; -} -.glyphicon-registration-mark:before { - content: "\e195"; -} -.glyphicon-cloud-download:before { - content: "\e197"; -} -.glyphicon-cloud-upload:before { - content: "\e198"; -} -.glyphicon-tree-conifer:before { - content: "\e199"; -} -.glyphicon-tree-deciduous:before { - content: "\e200"; -} -.caret { - display: inline-block; - width: 0; - height: 0; - margin-left: 2px; - vertical-align: middle; - border-top: 4px solid; - border-right: 4px solid transparent; - border-left: 4px solid transparent; -} -.dropdown { - position: relative; -} -.dropdown-toggle:focus { - outline: 0; -} -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - font-size: 14px; - list-style: none; - background-color: #fff; - background-clip: padding-box; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, .15); - border-radius: 4px; - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); - box-shadow: 0 6px 12px rgba(0, 0, 0, .175); -} -.dropdown-menu.pull-right { - right: 0; - left: auto; -} -.dropdown-menu .divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.dropdown-menu > li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 1.428571429; - color: #333; - white-space: nowrap; -} -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus { - color: #262626; - text-decoration: none; - background-color: #f5f5f5; -} -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - color: #fff; - text-decoration: none; - background-color: #428bca; - outline: 0; -} -.dropdown-menu > .disabled > a, -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - color: #999; -} -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - text-decoration: none; - cursor: not-allowed; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.open > .dropdown-menu { - display: block; -} -.open > a { - outline: 0; -} -.dropdown-menu-right { - right: 0; - left: auto; -} -.dropdown-menu-left { - right: auto; - left: 0; -} -.dropdown-header { - display: block; - padding: 3px 20px; - font-size: 12px; - line-height: 1.428571429; - color: #999; -} -.dropdown-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 990; -} -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - content: ""; - border-top: 0; - border-bottom: 4px solid; -} -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; -} -@media (min-width: 768px) { - .navbar-right .dropdown-menu { - right: 0; - left: auto; - } - .navbar-right .dropdown-menu-left { - right: auto; - left: 0; - } -} -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-block; - vertical-align: middle; -} -.btn-group > .btn, -.btn-group-vertical > .btn { - position: relative; - float: left; -} -.btn-group > .btn:hover, -.btn-group-vertical > .btn:hover, -.btn-group > .btn:focus, -.btn-group-vertical > .btn:focus, -.btn-group > .btn:active, -.btn-group-vertical > .btn:active, -.btn-group > .btn.active, -.btn-group-vertical > .btn.active { - z-index: 2; -} -.btn-group > .btn:focus, -.btn-group-vertical > .btn:focus { - outline: none; -} -.btn-group .btn + .btn, -.btn-group .btn + .btn-group, -.btn-group .btn-group + .btn, -.btn-group .btn-group + .btn-group { - margin-left: -1px; -} -.btn-toolbar { - margin-left: -5px; -} -.btn-toolbar .btn-group, -.btn-toolbar .input-group { - float: left; -} -.btn-toolbar > .btn, -.btn-toolbar > .btn-group, -.btn-toolbar > .input-group { - margin-left: 5px; -} -.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { - border-radius: 0; -} -.btn-group > .btn:first-child { - margin-left: 0; -} -.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.btn-group > .btn:last-child:not(:first-child), -.btn-group > .dropdown-toggle:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group > .btn-group { - float: left; -} -.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} -.btn-group > .btn-group:first-child > .btn:last-child, -.btn-group > .btn-group:first-child > .dropdown-toggle { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.btn-group > .btn-group:last-child > .btn:first-child { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} -.btn-group-xs > .btn { - padding: 1px 5px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -.btn-group-sm > .btn { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -.btn-group-lg > .btn { - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} -.btn-group > .btn + .dropdown-toggle { - padding-right: 8px; - padding-left: 8px; -} -.btn-group > .btn-lg + .dropdown-toggle { - padding-right: 12px; - padding-left: 12px; -} -.btn-group.open .dropdown-toggle { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); -} -.btn-group.open .dropdown-toggle.btn-link { - -webkit-box-shadow: none; - box-shadow: none; -} -.btn .caret { - margin-left: 0; -} -.btn-lg .caret { - border-width: 5px 5px 0; - border-bottom-width: 0; -} -.dropup .btn-lg .caret { - border-width: 0 5px 5px; -} -.btn-group-vertical > .btn, -.btn-group-vertical > .btn-group, -.btn-group-vertical > .btn-group > .btn { - display: block; - float: none; - width: 100%; - max-width: 100%; -} -.btn-group-vertical > .btn-group > .btn { - float: none; -} -.btn-group-vertical > .btn + .btn, -.btn-group-vertical > .btn + .btn-group, -.btn-group-vertical > .btn-group + .btn, -.btn-group-vertical > .btn-group + .btn-group { - margin-top: -1px; - margin-left: 0; -} -.btn-group-vertical > .btn:not(:first-child):not(:last-child) { - border-radius: 0; -} -.btn-group-vertical > .btn:first-child:not(:last-child) { - border-top-right-radius: 4px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group-vertical > .btn:last-child:not(:first-child) { - border-top-left-radius: 0; - border-top-right-radius: 0; - border-bottom-left-radius: 4px; -} -.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.btn-group-justified { - display: table; - width: 100%; - table-layout: fixed; - border-collapse: separate; -} -.btn-group-justified > .btn, -.btn-group-justified > .btn-group { - display: table-cell; - float: none; - width: 1%; -} -.btn-group-justified > .btn-group .btn { - width: 100%; -} -[data-toggle="buttons"] > .btn > input[type="radio"], -[data-toggle="buttons"] > .btn > input[type="checkbox"] { - display: none; -} -.input-group { - position: relative; - display: table; - border-collapse: separate; -} -.input-group[class*="col-"] { - float: none; - padding-right: 0; - padding-left: 0; -} -.input-group .form-control { - float: left; - width: 100%; - margin-bottom: 0; -} -.input-group-lg > .form-control, -.input-group-lg > .input-group-addon, -.input-group-lg > .input-group-btn > .btn { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} -select.input-group-lg > .form-control, -select.input-group-lg > .input-group-addon, -select.input-group-lg > .input-group-btn > .btn { - height: 46px; - line-height: 46px; -} -textarea.input-group-lg > .form-control, -textarea.input-group-lg > .input-group-addon, -textarea.input-group-lg > .input-group-btn > .btn, -select[multiple].input-group-lg > .form-control, -select[multiple].input-group-lg > .input-group-addon, -select[multiple].input-group-lg > .input-group-btn > .btn { - height: auto; -} -.input-group-sm > .form-control, -.input-group-sm > .input-group-addon, -.input-group-sm > .input-group-btn > .btn { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -select.input-group-sm > .form-control, -select.input-group-sm > .input-group-addon, -select.input-group-sm > .input-group-btn > .btn { - height: 30px; - line-height: 30px; -} -textarea.input-group-sm > .form-control, -textarea.input-group-sm > .input-group-addon, -textarea.input-group-sm > .input-group-btn > .btn, -select[multiple].input-group-sm > .form-control, -select[multiple].input-group-sm > .input-group-addon, -select[multiple].input-group-sm > .input-group-btn > .btn { - height: auto; -} -.input-group-addon, -.input-group-btn, -.input-group .form-control { - display: table-cell; -} -.input-group-addon:not(:first-child):not(:last-child), -.input-group-btn:not(:first-child):not(:last-child), -.input-group .form-control:not(:first-child):not(:last-child) { - border-radius: 0; -} -.input-group-addon, -.input-group-btn { - width: 1%; - white-space: nowrap; - vertical-align: middle; -} -.input-group-addon { - padding: 6px 12px; - font-size: 14px; - font-weight: normal; - line-height: 1; - color: #555; - text-align: center; - background-color: #eee; - border: 1px solid #ccc; - border-radius: 4px; -} -.input-group-addon.input-sm { - padding: 5px 10px; - font-size: 12px; - border-radius: 3px; -} -.input-group-addon.input-lg { - padding: 10px 16px; - font-size: 18px; - border-radius: 6px; -} -.input-group-addon input[type="radio"], -.input-group-addon input[type="checkbox"] { - margin-top: 0; -} -.input-group .form-control:first-child, -.input-group-addon:first-child, -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .btn-group > .btn, -.input-group-btn:first-child > .dropdown-toggle, -.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), -.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.input-group-addon:first-child { - border-right: 0; -} -.input-group .form-control:last-child, -.input-group-addon:last-child, -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .btn-group > .btn, -.input-group-btn:last-child > .dropdown-toggle, -.input-group-btn:first-child > .btn:not(:first-child), -.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.input-group-addon:last-child { - border-left: 0; -} -.input-group-btn { - position: relative; - font-size: 0; - white-space: nowrap; -} -.input-group-btn > .btn { - position: relative; -} -.input-group-btn > .btn + .btn { - margin-left: -1px; -} -.input-group-btn > .btn:hover, -.input-group-btn > .btn:focus, -.input-group-btn > .btn:active { - z-index: 2; -} -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .btn-group { - margin-right: -1px; -} -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .btn-group { - margin-left: -1px; -} -.nav { - padding-left: 0; - margin-bottom: 0; - list-style: none; -} -.nav > li { - position: relative; - display: block; -} -.nav > li > a { - position: relative; - display: block; - padding: 10px 15px; -} -.nav > li > a:hover, -.nav > li > a:focus { - text-decoration: none; - background-color: #eee; -} -.nav > li.disabled > a { - color: #999; -} -.nav > li.disabled > a:hover, -.nav > li.disabled > a:focus { - color: #999; - text-decoration: none; - cursor: not-allowed; - background-color: transparent; -} -.nav .open > a, -.nav .open > a:hover, -.nav .open > a:focus { - background-color: #eee; - border-color: #428bca; -} -.nav .nav-divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.nav > li > a > img { - max-width: none; -} -.nav-tabs { - border-bottom: 1px solid #ddd; -} -.nav-tabs > li { - float: left; - margin-bottom: -1px; -} -.nav-tabs > li > a { - margin-right: 2px; - line-height: 1.428571429; - border: 1px solid transparent; - border-radius: 4px 4px 0 0; -} -.nav-tabs > li > a:hover { - border-color: #eee #eee #ddd; -} -.nav-tabs > li.active > a, -.nav-tabs > li.active > a:hover, -.nav-tabs > li.active > a:focus { - color: #555; - cursor: default; - background-color: #fff; - border: 1px solid #ddd; - border-bottom-color: transparent; -} -.nav-tabs.nav-justified { - width: 100%; - border-bottom: 0; -} -.nav-tabs.nav-justified > li { - float: none; -} -.nav-tabs.nav-justified > li > a { - margin-bottom: 5px; - text-align: center; -} -.nav-tabs.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -@media (min-width: 768px) { - .nav-tabs.nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-tabs.nav-justified > li > a { - margin-bottom: 0; - } -} -.nav-tabs.nav-justified > li > a { - margin-right: 0; - border-radius: 4px; -} -.nav-tabs.nav-justified > .active > a, -.nav-tabs.nav-justified > .active > a:hover, -.nav-tabs.nav-justified > .active > a:focus { - border: 1px solid #ddd; -} -@media (min-width: 768px) { - .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid #ddd; - border-radius: 4px 4px 0 0; - } - .nav-tabs.nav-justified > .active > a, - .nav-tabs.nav-justified > .active > a:hover, - .nav-tabs.nav-justified > .active > a:focus { - border-bottom-color: #fff; - } -} -.nav-pills > li { - float: left; -} -.nav-pills > li > a { - border-radius: 4px; -} -.nav-pills > li + li { - margin-left: 2px; -} -.nav-pills > li.active > a, -.nav-pills > li.active > a:hover, -.nav-pills > li.active > a:focus { - color: #fff; - background-color: #428bca; -} -.nav-stacked > li { - float: none; -} -.nav-stacked > li + li { - margin-top: 2px; - margin-left: 0; -} -.nav-justified { - width: 100%; -} -.nav-justified > li { - float: none; -} -.nav-justified > li > a { - margin-bottom: 5px; - text-align: center; -} -.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -@media (min-width: 768px) { - .nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-justified > li > a { - margin-bottom: 0; - } -} -.nav-tabs-justified { - border-bottom: 0; -} -.nav-tabs-justified > li > a { - margin-right: 0; - border-radius: 4px; -} -.nav-tabs-justified > .active > a, -.nav-tabs-justified > .active > a:hover, -.nav-tabs-justified > .active > a:focus { - border: 1px solid #ddd; -} -@media (min-width: 768px) { - .nav-tabs-justified > li > a { - border-bottom: 1px solid #ddd; - border-radius: 4px 4px 0 0; - } - .nav-tabs-justified > .active > a, - .nav-tabs-justified > .active > a:hover, - .nav-tabs-justified > .active > a:focus { - border-bottom-color: #fff; - } -} -.tab-content > .tab-pane { - display: none; -} -.tab-content > .active { - display: block; -} -.nav-tabs .dropdown-menu { - margin-top: -1px; - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.navbar { - position: relative; - min-height: 50px; - margin-bottom: 20px; - border: 1px solid transparent; -} -@media (min-width: 768px) { - .navbar { - border-radius: 4px; - } -} -@media (min-width: 768px) { - .navbar-header { - float: left; - } -} -.navbar-collapse { - max-height: 340px; - padding-right: 15px; - padding-left: 15px; - overflow-x: visible; - -webkit-overflow-scrolling: touch; - border-top: 1px solid transparent; - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); -} -.navbar-collapse.in { - overflow-y: auto; -} -@media (min-width: 768px) { - .navbar-collapse { - width: auto; - border-top: 0; - box-shadow: none; - } - .navbar-collapse.collapse { - display: block !important; - height: auto !important; - padding-bottom: 0; - overflow: visible !important; - } - .navbar-collapse.in { - overflow-y: visible; - } - .navbar-fixed-top .navbar-collapse, - .navbar-static-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - padding-right: 0; - padding-left: 0; - } -} -.container > .navbar-header, -.container-fluid > .navbar-header, -.container > .navbar-collapse, -.container-fluid > .navbar-collapse { - margin-right: -15px; - margin-left: -15px; -} -@media (min-width: 768px) { - .container > .navbar-header, - .container-fluid > .navbar-header, - .container > .navbar-collapse, - .container-fluid > .navbar-collapse { - margin-right: 0; - margin-left: 0; - } -} -.navbar-static-top { - z-index: 1000; - border-width: 0 0 1px; -} -@media (min-width: 768px) { - .navbar-static-top { - border-radius: 0; - } -} -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; -} -@media (min-width: 768px) { - .navbar-fixed-top, - .navbar-fixed-bottom { - border-radius: 0; - } -} -.navbar-fixed-top { - top: 0; - border-width: 0 0 1px; -} -.navbar-fixed-bottom { - bottom: 0; - margin-bottom: 0; - border-width: 1px 0 0; -} -.navbar-brand { - float: left; - height: 20px; - padding: 15px 15px; - font-size: 18px; - line-height: 20px; -} -.navbar-brand:hover, -.navbar-brand:focus { - text-decoration: none; -} -@media (min-width: 768px) { - .navbar > .container .navbar-brand, - .navbar > .container-fluid .navbar-brand { - margin-left: -15px; - } -} -.navbar-toggle { - position: relative; - float: right; - padding: 9px 10px; - margin-top: 8px; - margin-right: 15px; - margin-bottom: 8px; - background-color: transparent; - background-image: none; - border: 1px solid transparent; - border-radius: 4px; -} -.navbar-toggle:focus { - outline: none; -} -.navbar-toggle .icon-bar { - display: block; - width: 22px; - height: 2px; - border-radius: 1px; -} -.navbar-toggle .icon-bar + .icon-bar { - margin-top: 4px; -} -@media (min-width: 768px) { - .navbar-toggle { - display: none; - } -} -.navbar-nav { - margin: 7.5px -15px; -} -.navbar-nav > li > a { - padding-top: 10px; - padding-bottom: 10px; - line-height: 20px; -} -@media (max-width: 767px) { - .navbar-nav .open .dropdown-menu { - position: static; - float: none; - width: auto; - margin-top: 0; - background-color: transparent; - border: 0; - box-shadow: none; - } - .navbar-nav .open .dropdown-menu > li > a, - .navbar-nav .open .dropdown-menu .dropdown-header { - padding: 5px 15px 5px 25px; - } - .navbar-nav .open .dropdown-menu > li > a { - line-height: 20px; - } - .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-nav .open .dropdown-menu > li > a:focus { - background-image: none; - } -} -@media (min-width: 768px) { - .navbar-nav { - float: left; - margin: 0; - } - .navbar-nav > li { - float: left; - } - .navbar-nav > li > a { - padding-top: 15px; - padding-bottom: 15px; - } - .navbar-nav.navbar-right:last-child { - margin-right: -15px; - } -} -@media (min-width: 768px) { - .navbar-left { - float: left !important; - } - .navbar-right { - float: right !important; - } -} -.navbar-form { - padding: 10px 15px; - margin-top: 8px; - margin-right: -15px; - margin-bottom: 8px; - margin-left: -15px; - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); -} -@media (min-width: 768px) { - .navbar-form .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .navbar-form .control-label { - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .radio, - .navbar-form .checkbox { - display: inline-block; - padding-left: 0; - margin-top: 0; - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .radio input[type="radio"], - .navbar-form .checkbox input[type="checkbox"] { - float: none; - margin-left: 0; - } - .navbar-form .has-feedback .form-control-feedback { - top: 0; - } -} -@media (max-width: 767px) { - .navbar-form .form-group { - margin-bottom: 5px; - } -} -@media (min-width: 768px) { - .navbar-form { - width: auto; - padding-top: 0; - padding-bottom: 0; - margin-right: 0; - margin-left: 0; - border: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-form.navbar-right:last-child { - margin-right: -15px; - } -} -.navbar-nav > li > .dropdown-menu { - margin-top: 0; - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.navbar-btn { - margin-top: 8px; - margin-bottom: 8px; -} -.navbar-btn.btn-sm { - margin-top: 10px; - margin-bottom: 10px; -} -.navbar-btn.btn-xs { - margin-top: 14px; - margin-bottom: 14px; -} -.navbar-text { - margin-top: 15px; - margin-bottom: 15px; -} -@media (min-width: 768px) { - .navbar-text { - float: left; - margin-right: 15px; - margin-left: 15px; - } - .navbar-text.navbar-right:last-child { - margin-right: 0; - } -} -.navbar-default { - background-color: #f8f8f8; - border-color: #e7e7e7; -} -.navbar-default .navbar-brand { - color: #777; -} -.navbar-default .navbar-brand:hover, -.navbar-default .navbar-brand:focus { - color: #5e5e5e; - background-color: transparent; -} -.navbar-default .navbar-text { - color: #777; -} -.navbar-default .navbar-nav > li > a { - color: #777; -} -.navbar-default .navbar-nav > li > a:hover, -.navbar-default .navbar-nav > li > a:focus { - color: #333; - background-color: transparent; -} -.navbar-default .navbar-nav > .active > a, -.navbar-default .navbar-nav > .active > a:hover, -.navbar-default .navbar-nav > .active > a:focus { - color: #555; - background-color: #e7e7e7; -} -.navbar-default .navbar-nav > .disabled > a, -.navbar-default .navbar-nav > .disabled > a:hover, -.navbar-default .navbar-nav > .disabled > a:focus { - color: #ccc; - background-color: transparent; -} -.navbar-default .navbar-toggle { - border-color: #ddd; -} -.navbar-default .navbar-toggle:hover, -.navbar-default .navbar-toggle:focus { - background-color: #ddd; -} -.navbar-default .navbar-toggle .icon-bar { - background-color: #888; -} -.navbar-default .navbar-collapse, -.navbar-default .navbar-form { - border-color: #e7e7e7; -} -.navbar-default .navbar-nav > .open > a, -.navbar-default .navbar-nav > .open > a:hover, -.navbar-default .navbar-nav > .open > a:focus { - color: #555; - background-color: #e7e7e7; -} -@media (max-width: 767px) { - .navbar-default .navbar-nav .open .dropdown-menu > li > a { - color: #777; - } - .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #333; - background-color: transparent; - } - .navbar-default .navbar-nav .open .dropdown-menu > .active > a, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #555; - background-color: #e7e7e7; - } - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #ccc; - background-color: transparent; - } -} -.navbar-default .navbar-link { - color: #777; -} -.navbar-default .navbar-link:hover { - color: #333; -} -.navbar-inverse { - background-color: #222; - border-color: #080808; -} -.navbar-inverse .navbar-brand { - color: #999; -} -.navbar-inverse .navbar-brand:hover, -.navbar-inverse .navbar-brand:focus { - color: #fff; - background-color: transparent; -} -.navbar-inverse .navbar-text { - color: #999; -} -.navbar-inverse .navbar-nav > li > a { - color: #999; -} -.navbar-inverse .navbar-nav > li > a:hover, -.navbar-inverse .navbar-nav > li > a:focus { - color: #fff; - background-color: transparent; -} -.navbar-inverse .navbar-nav > .active > a, -.navbar-inverse .navbar-nav > .active > a:hover, -.navbar-inverse .navbar-nav > .active > a:focus { - color: #fff; - background-color: #080808; -} -.navbar-inverse .navbar-nav > .disabled > a, -.navbar-inverse .navbar-nav > .disabled > a:hover, -.navbar-inverse .navbar-nav > .disabled > a:focus { - color: #444; - background-color: transparent; -} -.navbar-inverse .navbar-toggle { - border-color: #333; -} -.navbar-inverse .navbar-toggle:hover, -.navbar-inverse .navbar-toggle:focus { - background-color: #333; -} -.navbar-inverse .navbar-toggle .icon-bar { - background-color: #fff; -} -.navbar-inverse .navbar-collapse, -.navbar-inverse .navbar-form { - border-color: #101010; -} -.navbar-inverse .navbar-nav > .open > a, -.navbar-inverse .navbar-nav > .open > a:hover, -.navbar-inverse .navbar-nav > .open > a:focus { - color: #fff; - background-color: #080808; -} -@media (max-width: 767px) { - .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { - border-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu .divider { - background-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { - color: #999; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { - color: #fff; - background-color: transparent; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #fff; - background-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #444; - background-color: transparent; - } -} -.navbar-inverse .navbar-link { - color: #999; -} -.navbar-inverse .navbar-link:hover { - color: #fff; -} -.breadcrumb { - padding: 8px 15px; - margin-bottom: 20px; - list-style: none; - background-color: #f5f5f5; - border-radius: 4px; -} -.breadcrumb > li { - display: inline-block; -} -.breadcrumb > li + li:before { - padding: 0 5px; - color: #ccc; - content: "/\00a0"; -} -.breadcrumb > .active { - color: #999; -} -.pagination { - display: inline-block; - padding-left: 0; - margin: 20px 0; - border-radius: 4px; -} -.pagination > li { - display: inline; -} -.pagination > li > a, -.pagination > li > span { - position: relative; - float: left; - padding: 6px 12px; - margin-left: -1px; - line-height: 1.428571429; - color: #428bca; - text-decoration: none; - background-color: #fff; - border: 1px solid #ddd; -} -.pagination > li:first-child > a, -.pagination > li:first-child > span { - margin-left: 0; - border-top-left-radius: 4px; - border-bottom-left-radius: 4px; -} -.pagination > li:last-child > a, -.pagination > li:last-child > span { - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; -} -.pagination > li > a:hover, -.pagination > li > span:hover, -.pagination > li > a:focus, -.pagination > li > span:focus { - color: #2a6496; - background-color: #eee; - border-color: #ddd; -} -.pagination > .active > a, -.pagination > .active > span, -.pagination > .active > a:hover, -.pagination > .active > span:hover, -.pagination > .active > a:focus, -.pagination > .active > span:focus { - z-index: 2; - color: #fff; - cursor: default; - background-color: #428bca; - border-color: #428bca; -} -.pagination > .disabled > span, -.pagination > .disabled > span:hover, -.pagination > .disabled > span:focus, -.pagination > .disabled > a, -.pagination > .disabled > a:hover, -.pagination > .disabled > a:focus { - color: #999; - cursor: not-allowed; - background-color: #fff; - border-color: #ddd; -} -.pagination-lg > li > a, -.pagination-lg > li > span { - padding: 10px 16px; - font-size: 18px; -} -.pagination-lg > li:first-child > a, -.pagination-lg > li:first-child > span { - border-top-left-radius: 6px; - border-bottom-left-radius: 6px; -} -.pagination-lg > li:last-child > a, -.pagination-lg > li:last-child > span { - border-top-right-radius: 6px; - border-bottom-right-radius: 6px; -} -.pagination-sm > li > a, -.pagination-sm > li > span { - padding: 5px 10px; - font-size: 12px; -} -.pagination-sm > li:first-child > a, -.pagination-sm > li:first-child > span { - border-top-left-radius: 3px; - border-bottom-left-radius: 3px; -} -.pagination-sm > li:last-child > a, -.pagination-sm > li:last-child > span { - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; -} -.pager { - padding-left: 0; - margin: 20px 0; - text-align: center; - list-style: none; -} -.pager li { - display: inline; -} -.pager li > a, -.pager li > span { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 15px; -} -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - background-color: #eee; -} -.pager .next > a, -.pager .next > span { - float: right; -} -.pager .previous > a, -.pager .previous > span { - float: left; -} -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #999; - cursor: not-allowed; - background-color: #fff; -} -.label { - display: inline; - padding: .2em .6em .3em; - font-size: 75%; - font-weight: bold; - line-height: 1; - color: #fff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: .25em; -} -.label[href]:hover, -.label[href]:focus { - color: #fff; - text-decoration: none; - cursor: pointer; -} -.label:empty { - display: none; -} -.btn .label { - position: relative; - top: -1px; -} -.label-default { - background-color: #999; -} -.label-default[href]:hover, -.label-default[href]:focus { - background-color: #808080; -} -.label-primary { - background-color: #428bca; -} -.label-primary[href]:hover, -.label-primary[href]:focus { - background-color: #3071a9; -} -.label-success { - background-color: #5cb85c; -} -.label-success[href]:hover, -.label-success[href]:focus { - background-color: #449d44; -} -.label-info { - background-color: #5bc0de; -} -.label-info[href]:hover, -.label-info[href]:focus { - background-color: #31b0d5; -} -.label-warning { - background-color: #f0ad4e; -} -.label-warning[href]:hover, -.label-warning[href]:focus { - background-color: #ec971f; -} -.label-danger { - background-color: #d9534f; -} -.label-danger[href]:hover, -.label-danger[href]:focus { - background-color: #c9302c; -} -.badge { - display: inline-block; - min-width: 10px; - padding: 3px 7px; - font-size: 12px; - font-weight: bold; - line-height: 1; - color: #fff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - background-color: #999; - border-radius: 10px; -} -.badge:empty { - display: none; -} -.btn .badge { - position: relative; - top: -1px; -} -.btn-xs .badge { - top: 0; - padding: 1px 5px; -} -a.badge:hover, -a.badge:focus { - color: #fff; - text-decoration: none; - cursor: pointer; -} -a.list-group-item.active > .badge, -.nav-pills > .active > a > .badge { - color: #428bca; - background-color: #fff; -} -.nav-pills > li > a > .badge { - margin-left: 3px; -} -.jumbotron { - padding: 30px; - margin-bottom: 30px; - color: inherit; - background-color: #eee; -} -.jumbotron h1, -.jumbotron .h1 { - color: inherit; -} -.jumbotron p { - margin-bottom: 15px; - font-size: 21px; - font-weight: 200; -} -.container .jumbotron { - border-radius: 6px; -} -.jumbotron .container { - max-width: 100%; -} -@media screen and (min-width: 768px) { - .jumbotron { - padding-top: 48px; - padding-bottom: 48px; - } - .container .jumbotron { - padding-right: 60px; - padding-left: 60px; - } - .jumbotron h1, - .jumbotron .h1 { - font-size: 63px; - } -} -.thumbnail { - display: block; - padding: 4px; - margin-bottom: 20px; - line-height: 1.428571429; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 4px; - -webkit-transition: all .2s ease-in-out; - transition: all .2s ease-in-out; -} -.thumbnail > img, -.thumbnail a > img { - display: block; - max-width: 100%; - height: auto; - margin-right: auto; - margin-left: auto; -} -a.thumbnail:hover, -a.thumbnail:focus, -a.thumbnail.active { - border-color: #428bca; -} -.thumbnail .caption { - padding: 9px; - color: #333; -} -.alert { - padding: 15px; - margin-bottom: 20px; - border: 1px solid transparent; - border-radius: 4px; -} -.alert h4 { - margin-top: 0; - color: inherit; -} -.alert .alert-link { - font-weight: bold; -} -.alert > p, -.alert > ul { - margin-bottom: 0; -} -.alert > p + p { - margin-top: 5px; -} -.alert-dismissable { - padding-right: 35px; -} -.alert-dismissable .close { - position: relative; - top: -2px; - right: -21px; - color: inherit; -} -.alert-success { - color: #3c763d; - background-color: #dff0d8; - border-color: #d6e9c6; -} -.alert-success hr { - border-top-color: #c9e2b3; -} -.alert-success .alert-link { - color: #2b542c; -} -.alert-info { - color: #31708f; - background-color: #d9edf7; - border-color: #bce8f1; -} -.alert-info hr { - border-top-color: #a6e1ec; -} -.alert-info .alert-link { - color: #245269; -} -.alert-warning { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #faebcc; -} -.alert-warning hr { - border-top-color: #f7e1b5; -} -.alert-warning .alert-link { - color: #66512c; -} -.alert-danger { - color: #a94442; - background-color: #f2dede; - border-color: #ebccd1; -} -.alert-danger hr { - border-top-color: #e4b9c0; -} -.alert-danger .alert-link { - color: #843534; -} -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -.progress { - height: 20px; - margin-bottom: 20px; - overflow: hidden; - background-color: #f5f5f5; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); -} -.progress-bar { - float: left; - width: 0; - height: 100%; - font-size: 12px; - line-height: 20px; - color: #fff; - text-align: center; - background-color: #428bca; - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); - -webkit-transition: width .6s ease; - transition: width .6s ease; -} -.progress-striped .progress-bar { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-size: 40px 40px; -} -.progress.active .progress-bar { - -webkit-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} -.progress-bar-success { - background-color: #5cb85c; -} -.progress-striped .progress-bar-success { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.progress-bar-info { - background-color: #5bc0de; -} -.progress-striped .progress-bar-info { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.progress-bar-warning { - background-color: #f0ad4e; -} -.progress-striped .progress-bar-warning { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.progress-bar-danger { - background-color: #d9534f; -} -.progress-striped .progress-bar-danger { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.media, -.media-body { - overflow: hidden; - zoom: 1; -} -.media, -.media .media { - margin-top: 15px; -} -.media:first-child { - margin-top: 0; -} -.media-object { - display: block; -} -.media-heading { - margin: 0 0 5px; -} -.media > .pull-left { - margin-right: 10px; -} -.media > .pull-right { - margin-left: 10px; -} -.media-list { - padding-left: 0; - list-style: none; -} -.list-group { - padding-left: 0; - margin-bottom: 20px; -} -.list-group-item { - position: relative; - display: block; - padding: 10px 15px; - margin-bottom: -1px; - background-color: #fff; - border: 1px solid #ddd; -} -.list-group-item:first-child { - border-top-left-radius: 4px; - border-top-right-radius: 4px; -} -.list-group-item:last-child { - margin-bottom: 0; - border-bottom-right-radius: 4px; - border-bottom-left-radius: 4px; -} -.list-group-item > .badge { - float: right; -} -.list-group-item > .badge + .badge { - margin-right: 5px; -} -a.list-group-item { - color: #555; -} -a.list-group-item .list-group-item-heading { - color: #333; -} -a.list-group-item:hover, -a.list-group-item:focus { - text-decoration: none; - background-color: #f5f5f5; -} -a.list-group-item.active, -a.list-group-item.active:hover, -a.list-group-item.active:focus { - z-index: 2; - color: #fff; - background-color: #428bca; - border-color: #428bca; -} -a.list-group-item.active .list-group-item-heading, -a.list-group-item.active:hover .list-group-item-heading, -a.list-group-item.active:focus .list-group-item-heading { - color: inherit; -} -a.list-group-item.active .list-group-item-text, -a.list-group-item.active:hover .list-group-item-text, -a.list-group-item.active:focus .list-group-item-text { - color: #e1edf7; -} -.list-group-item-success { - color: #3c763d; - background-color: #dff0d8; -} -a.list-group-item-success { - color: #3c763d; -} -a.list-group-item-success .list-group-item-heading { - color: inherit; -} -a.list-group-item-success:hover, -a.list-group-item-success:focus { - color: #3c763d; - background-color: #d0e9c6; -} -a.list-group-item-success.active, -a.list-group-item-success.active:hover, -a.list-group-item-success.active:focus { - color: #fff; - background-color: #3c763d; - border-color: #3c763d; -} -.list-group-item-info { - color: #31708f; - background-color: #d9edf7; -} -a.list-group-item-info { - color: #31708f; -} -a.list-group-item-info .list-group-item-heading { - color: inherit; -} -a.list-group-item-info:hover, -a.list-group-item-info:focus { - color: #31708f; - background-color: #c4e3f3; -} -a.list-group-item-info.active, -a.list-group-item-info.active:hover, -a.list-group-item-info.active:focus { - color: #fff; - background-color: #31708f; - border-color: #31708f; -} -.list-group-item-warning { - color: #8a6d3b; - background-color: #fcf8e3; -} -a.list-group-item-warning { - color: #8a6d3b; -} -a.list-group-item-warning .list-group-item-heading { - color: inherit; -} -a.list-group-item-warning:hover, -a.list-group-item-warning:focus { - color: #8a6d3b; - background-color: #faf2cc; -} -a.list-group-item-warning.active, -a.list-group-item-warning.active:hover, -a.list-group-item-warning.active:focus { - color: #fff; - background-color: #8a6d3b; - border-color: #8a6d3b; -} -.list-group-item-danger { - color: #a94442; - background-color: #f2dede; -} -a.list-group-item-danger { - color: #a94442; -} -a.list-group-item-danger .list-group-item-heading { - color: inherit; -} -a.list-group-item-danger:hover, -a.list-group-item-danger:focus { - color: #a94442; - background-color: #ebcccc; -} -a.list-group-item-danger.active, -a.list-group-item-danger.active:hover, -a.list-group-item-danger.active:focus { - color: #fff; - background-color: #a94442; - border-color: #a94442; -} -.list-group-item-heading { - margin-top: 0; - margin-bottom: 5px; -} -.list-group-item-text { - margin-bottom: 0; - line-height: 1.3; -} -.panel { - margin-bottom: 20px; - background-color: #fff; - border: 1px solid transparent; - border-radius: 4px; - -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); - box-shadow: 0 1px 1px rgba(0, 0, 0, .05); -} -.panel-body { - padding: 15px; -} -.panel > .list-group { - margin-bottom: 0; -} -.panel > .list-group .list-group-item { - border-width: 1px 0; - border-radius: 0; -} -.panel > .list-group .list-group-item:first-child { - border-top: 0; -} -.panel > .list-group .list-group-item:last-child { - border-bottom: 0; -} -.panel > .list-group:first-child .list-group-item:first-child { - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel > .list-group:last-child .list-group-item:last-child { - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel-heading + .list-group .list-group-item:first-child { - border-top-width: 0; -} -.panel > .table, -.panel > .table-responsive > .table { - margin-bottom: 0; -} -.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, -.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, -.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, -.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { - border-top-left-radius: 3px; -} -.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, -.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, -.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, -.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { - border-top-right-radius: 3px; -} -.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, -.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { - border-bottom-left-radius: 3px; -} -.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, -.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { - border-bottom-right-radius: 3px; -} -.panel > .panel-body + .table, -.panel > .panel-body + .table-responsive { - border-top: 1px solid #ddd; -} -.panel > .table > tbody:first-child > tr:first-child th, -.panel > .table > tbody:first-child > tr:first-child td { - border-top: 0; -} -.panel > .table-bordered, -.panel > .table-responsive > .table-bordered { - border: 0; -} -.panel > .table-bordered > thead > tr > th:first-child, -.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, -.panel > .table-bordered > tbody > tr > th:first-child, -.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, -.panel > .table-bordered > tfoot > tr > th:first-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, -.panel > .table-bordered > thead > tr > td:first-child, -.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, -.panel > .table-bordered > tbody > tr > td:first-child, -.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, -.panel > .table-bordered > tfoot > tr > td:first-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; -} -.panel > .table-bordered > thead > tr > th:last-child, -.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, -.panel > .table-bordered > tbody > tr > th:last-child, -.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, -.panel > .table-bordered > tfoot > tr > th:last-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, -.panel > .table-bordered > thead > tr > td:last-child, -.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, -.panel > .table-bordered > tbody > tr > td:last-child, -.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, -.panel > .table-bordered > tfoot > tr > td:last-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; -} -.panel > .table-bordered > thead > tr:first-child > th, -.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, -.panel > .table-bordered > tbody > tr:first-child > th, -.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th, -.panel > .table-bordered > tfoot > tr:first-child > th, -.panel > .table-responsive > .table-bordered > tfoot > tr:first-child > th, -.panel > .table-bordered > thead > tr:first-child > td, -.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, -.panel > .table-bordered > tbody > tr:first-child > td, -.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, -.panel > .table-bordered > tfoot > tr:first-child > td, -.panel > .table-responsive > .table-bordered > tfoot > tr:first-child > td { - border-top: 0; -} -.panel > .table-bordered > thead > tr:last-child > th, -.panel > .table-responsive > .table-bordered > thead > tr:last-child > th, -.panel > .table-bordered > tbody > tr:last-child > th, -.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, -.panel > .table-bordered > tfoot > tr:last-child > th, -.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th, -.panel > .table-bordered > thead > tr:last-child > td, -.panel > .table-responsive > .table-bordered > thead > tr:last-child > td, -.panel > .table-bordered > tbody > tr:last-child > td, -.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, -.panel > .table-bordered > tfoot > tr:last-child > td, -.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td { - border-bottom: 0; -} -.panel > .table-responsive { - margin-bottom: 0; - border: 0; -} -.panel-heading { - padding: 10px 15px; - border-bottom: 1px solid transparent; - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel-heading > .dropdown .dropdown-toggle { - color: inherit; -} -.panel-title { - margin-top: 0; - margin-bottom: 0; - font-size: 16px; - color: inherit; -} -.panel-title > a { - color: inherit; -} -.panel-footer { - padding: 10px 15px; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel-group { - margin-bottom: 20px; -} -.panel-group .panel { - margin-bottom: 0; - overflow: hidden; - border-radius: 4px; -} -.panel-group .panel + .panel { - margin-top: 5px; -} -.panel-group .panel-heading { - border-bottom: 0; -} -.panel-group .panel-heading + .panel-collapse .panel-body { - border-top: 1px solid #ddd; -} -.panel-group .panel-footer { - border-top: 0; -} -.panel-group .panel-footer + .panel-collapse .panel-body { - border-bottom: 1px solid #ddd; -} -.panel-default { - border-color: #ddd; -} -.panel-default > .panel-heading { - color: #333; - background-color: #f5f5f5; - border-color: #ddd; -} -.panel-default > .panel-heading + .panel-collapse .panel-body { - border-top-color: #ddd; -} -.panel-default > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #ddd; -} -.panel-primary { - border-color: #428bca; -} -.panel-primary > .panel-heading { - color: #fff; - background-color: #428bca; - border-color: #428bca; -} -.panel-primary > .panel-heading + .panel-collapse .panel-body { - border-top-color: #428bca; -} -.panel-primary > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #428bca; -} -.panel-success { - border-color: #d6e9c6; -} -.panel-success > .panel-heading { - color: #3c763d; - background-color: #dff0d8; - border-color: #d6e9c6; -} -.panel-success > .panel-heading + .panel-collapse .panel-body { - border-top-color: #d6e9c6; -} -.panel-success > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #d6e9c6; -} -.panel-info { - border-color: #bce8f1; -} -.panel-info > .panel-heading { - color: #31708f; - background-color: #d9edf7; - border-color: #bce8f1; -} -.panel-info > .panel-heading + .panel-collapse .panel-body { - border-top-color: #bce8f1; -} -.panel-info > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #bce8f1; -} -.panel-warning { - border-color: #faebcc; -} -.panel-warning > .panel-heading { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #faebcc; -} -.panel-warning > .panel-heading + .panel-collapse .panel-body { - border-top-color: #faebcc; -} -.panel-warning > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #faebcc; -} -.panel-danger { - border-color: #ebccd1; -} -.panel-danger > .panel-heading { - color: #a94442; - background-color: #f2dede; - border-color: #ebccd1; -} -.panel-danger > .panel-heading + .panel-collapse .panel-body { - border-top-color: #ebccd1; -} -.panel-danger > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #ebccd1; -} -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #e3e3e3; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); -} -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, .15); -} -.well-lg { - padding: 24px; - border-radius: 6px; -} -.well-sm { - padding: 9px; - border-radius: 3px; -} -.close { - float: right; - font-size: 21px; - font-weight: bold; - line-height: 1; - color: #000; - text-shadow: 0 1px 0 #fff; - filter: alpha(opacity=20); - opacity: .2; -} -.close:hover, -.close:focus { - color: #000; - text-decoration: none; - cursor: pointer; - filter: alpha(opacity=50); - opacity: .5; -} -button.close { - -webkit-appearance: none; - padding: 0; - cursor: pointer; - background: transparent; - border: 0; -} -.modal-open { - overflow: hidden; -} -.modal { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1050; - display: none; - overflow: auto; - overflow-y: scroll; - -webkit-overflow-scrolling: touch; - outline: 0; -} -.modal.fade .modal-dialog { - -webkit-transition: -webkit-transform .3s ease-out; - -moz-transition: -moz-transform .3s ease-out; - -o-transition: -o-transform .3s ease-out; - transition: transform .3s ease-out; - -webkit-transform: translate(0, -25%); - -ms-transform: translate(0, -25%); - transform: translate(0, -25%); -} -.modal.in .modal-dialog { - -webkit-transform: translate(0, 0); - -ms-transform: translate(0, 0); - transform: translate(0, 0); -} -.modal-dialog { - position: relative; - width: auto; - margin: 10px; -} -.modal-content { - position: relative; - background-color: #fff; - background-clip: padding-box; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, .2); - border-radius: 6px; - outline: none; - -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); - box-shadow: 0 3px 9px rgba(0, 0, 0, .5); -} -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000; -} -.modal-backdrop.fade { - filter: alpha(opacity=0); - opacity: 0; -} -.modal-backdrop.in { - filter: alpha(opacity=50); - opacity: .5; -} -.modal-header { - min-height: 16.428571429px; - padding: 15px; - border-bottom: 1px solid #e5e5e5; -} -.modal-header .close { - margin-top: -2px; -} -.modal-title { - margin: 0; - line-height: 1.428571429; -} -.modal-body { - position: relative; - padding: 20px; -} -.modal-footer { - padding: 19px 20px 20px; - margin-top: 15px; - text-align: right; - border-top: 1px solid #e5e5e5; -} -.modal-footer .btn + .btn { - margin-bottom: 0; - margin-left: 5px; -} -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} -.modal-footer .btn-block + .btn-block { - margin-left: 0; -} -@media (min-width: 768px) { - .modal-dialog { - width: 600px; - margin: 30px auto; - } - .modal-content { - -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); - box-shadow: 0 5px 15px rgba(0, 0, 0, .5); - } - .modal-sm { - width: 300px; - } - .modal-lg { - width: 900px; - } -} -.tooltip { - position: absolute; - z-index: 1030; - display: block; - font-size: 12px; - line-height: 1.4; - visibility: visible; - filter: alpha(opacity=0); - opacity: 0; -} -.tooltip.in { - filter: alpha(opacity=90); - opacity: .9; -} -.tooltip.top { - padding: 5px 0; - margin-top: -3px; -} -.tooltip.right { - padding: 0 5px; - margin-left: 3px; -} -.tooltip.bottom { - padding: 5px 0; - margin-top: 3px; -} -.tooltip.left { - padding: 0 5px; - margin-left: -3px; -} -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #fff; - text-align: center; - text-decoration: none; - background-color: #000; - border-radius: 4px; -} -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.top-left .tooltip-arrow { - bottom: 0; - left: 5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.top-right .tooltip-arrow { - right: 5px; - bottom: 0; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-width: 5px 5px 5px 0; - border-right-color: #000; -} -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-width: 5px 0 5px 5px; - border-left-color: #000; -} -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.tooltip.bottom-left .tooltip-arrow { - top: 0; - left: 5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.tooltip.bottom-right .tooltip-arrow { - top: 0; - right: 5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1010; - display: none; - max-width: 276px; - padding: 1px; - text-align: left; - white-space: normal; - background-color: #fff; - background-clip: padding-box; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, .2); - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); - box-shadow: 0 5px 10px rgba(0, 0, 0, .2); -} -.popover.top { - margin-top: -10px; -} -.popover.right { - margin-left: 10px; -} -.popover.bottom { - margin-top: 10px; -} -.popover.left { - margin-left: -10px; -} -.popover-title { - padding: 8px 14px; - margin: 0; - font-size: 14px; - font-weight: normal; - line-height: 18px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - border-radius: 5px 5px 0 0; -} -.popover-content { - padding: 9px 14px; -} -.popover .arrow, -.popover .arrow:after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.popover .arrow { - border-width: 11px; -} -.popover .arrow:after { - content: ""; - border-width: 10px; -} -.popover.top .arrow { - bottom: -11px; - left: 50%; - margin-left: -11px; - border-top-color: #999; - border-top-color: rgba(0, 0, 0, .25); - border-bottom-width: 0; -} -.popover.top .arrow:after { - bottom: 1px; - margin-left: -10px; - content: " "; - border-top-color: #fff; - border-bottom-width: 0; -} -.popover.right .arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-right-color: #999; - border-right-color: rgba(0, 0, 0, .25); - border-left-width: 0; -} -.popover.right .arrow:after { - bottom: -10px; - left: 1px; - content: " "; - border-right-color: #fff; - border-left-width: 0; -} -.popover.bottom .arrow { - top: -11px; - left: 50%; - margin-left: -11px; - border-top-width: 0; - border-bottom-color: #999; - border-bottom-color: rgba(0, 0, 0, .25); -} -.popover.bottom .arrow:after { - top: 1px; - margin-left: -10px; - content: " "; - border-top-width: 0; - border-bottom-color: #fff; -} -.popover.left .arrow { - top: 50%; - right: -11px; - margin-top: -11px; - border-right-width: 0; - border-left-color: #999; - border-left-color: rgba(0, 0, 0, .25); -} -.popover.left .arrow:after { - right: 1px; - bottom: -10px; - content: " "; - border-right-width: 0; - border-left-color: #fff; -} -.carousel { - position: relative; -} -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} -.carousel-inner > .item { - position: relative; - display: none; - -webkit-transition: .6s ease-in-out left; - transition: .6s ease-in-out left; -} -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - display: block; - max-width: 100%; - height: auto; - line-height: 1; -} -.carousel-inner > .active, -.carousel-inner > .next, -.carousel-inner > .prev { - display: block; -} -.carousel-inner > .active { - left: 0; -} -.carousel-inner > .next, -.carousel-inner > .prev { - position: absolute; - top: 0; - width: 100%; -} -.carousel-inner > .next { - left: 100%; -} -.carousel-inner > .prev { - left: -100%; -} -.carousel-inner > .next.left, -.carousel-inner > .prev.right { - left: 0; -} -.carousel-inner > .active.left { - left: -100%; -} -.carousel-inner > .active.right { - left: 100%; -} -.carousel-control { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 15%; - font-size: 20px; - color: #fff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, .6); - filter: alpha(opacity=50); - opacity: .5; -} -.carousel-control.left { - background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, .5) 0%), color-stop(rgba(0, 0, 0, .0001) 100%)); - background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); - background-repeat: repeat-x; -} -.carousel-control.right { - right: 0; - left: auto; - background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, .0001) 0%), color-stop(rgba(0, 0, 0, .5) 100%)); - background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); - background-repeat: repeat-x; -} -.carousel-control:hover, -.carousel-control:focus { - color: #fff; - text-decoration: none; - filter: alpha(opacity=90); - outline: none; - opacity: .9; -} -.carousel-control .icon-prev, -.carousel-control .icon-next, -.carousel-control .glyphicon-chevron-left, -.carousel-control .glyphicon-chevron-right { - position: absolute; - top: 50%; - z-index: 5; - display: inline-block; -} -.carousel-control .icon-prev, -.carousel-control .glyphicon-chevron-left { - left: 50%; -} -.carousel-control .icon-next, -.carousel-control .glyphicon-chevron-right { - right: 50%; -} -.carousel-control .icon-prev, -.carousel-control .icon-next { - width: 20px; - height: 20px; - margin-top: -10px; - margin-left: -10px; - font-family: serif; -} -.carousel-control .icon-prev:before { - content: '\2039'; -} -.carousel-control .icon-next:before { - content: '\203a'; -} -.carousel-indicators { - position: absolute; - bottom: 10px; - left: 50%; - z-index: 15; - width: 60%; - padding-left: 0; - margin-left: -30%; - text-align: center; - list-style: none; -} -.carousel-indicators li { - display: inline-block; - width: 10px; - height: 10px; - margin: 1px; - text-indent: -999px; - cursor: pointer; - background-color: #000 \9; - background-color: rgba(0, 0, 0, 0); - border: 1px solid #fff; - border-radius: 10px; -} -.carousel-indicators .active { - width: 12px; - height: 12px; - margin: 0; - background-color: #fff; -} -.carousel-caption { - position: absolute; - right: 15%; - bottom: 20px; - left: 15%; - z-index: 10; - padding-top: 20px; - padding-bottom: 20px; - color: #fff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, .6); -} -.carousel-caption .btn { - text-shadow: none; -} -@media screen and (min-width: 768px) { - .carousel-control .glyphicons-chevron-left, - .carousel-control .glyphicons-chevron-right, - .carousel-control .icon-prev, - .carousel-control .icon-next { - width: 30px; - height: 30px; - margin-top: -15px; - margin-left: -15px; - font-size: 30px; - } - .carousel-caption { - right: 20%; - left: 20%; - padding-bottom: 30px; - } - .carousel-indicators { - bottom: 20px; - } -} -.clearfix:before, -.clearfix:after, -.container:before, -.container:after, -.container-fluid:before, -.container-fluid:after, -.row:before, -.row:after, -.form-horizontal .form-group:before, -.form-horizontal .form-group:after, -.btn-toolbar:before, -.btn-toolbar:after, -.btn-group-vertical > .btn-group:before, -.btn-group-vertical > .btn-group:after, -.nav:before, -.nav:after, -.navbar:before, -.navbar:after, -.navbar-header:before, -.navbar-header:after, -.navbar-collapse:before, -.navbar-collapse:after, -.pager:before, -.pager:after, -.panel-body:before, -.panel-body:after, -.modal-footer:before, -.modal-footer:after { - display: table; - content: " "; -} -.clearfix:after, -.container:after, -.container-fluid:after, -.row:after, -.form-horizontal .form-group:after, -.btn-toolbar:after, -.btn-group-vertical > .btn-group:after, -.nav:after, -.navbar:after, -.navbar-header:after, -.navbar-collapse:after, -.pager:after, -.panel-body:after, -.modal-footer:after { - clear: both; -} -.center-block { - display: block; - margin-right: auto; - margin-left: auto; -} -.pull-right { - float: right !important; -} -.pull-left { - float: left !important; -} -.hide { - display: none !important; -} -.show { - display: block !important; -} -.invisible { - visibility: hidden; -} -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} -.hidden { - display: none !important; - visibility: hidden !important; -} -.affix { - position: fixed; -} -@-ms-viewport { - width: device-width; -} -.visible-xs, -tr.visible-xs, -th.visible-xs, -td.visible-xs { - display: none !important; -} -@media (max-width: 767px) { - .visible-xs { - display: block !important; - } - table.visible-xs { - display: table; - } - tr.visible-xs { - display: table-row !important; - } - th.visible-xs, - td.visible-xs { - display: table-cell !important; - } -} -.visible-sm, -tr.visible-sm, -th.visible-sm, -td.visible-sm { - display: none !important; -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm { - display: block !important; - } - table.visible-sm { - display: table; - } - tr.visible-sm { - display: table-row !important; - } - th.visible-sm, - td.visible-sm { - display: table-cell !important; - } -} -.visible-md, -tr.visible-md, -th.visible-md, -td.visible-md { - display: none !important; -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md { - display: block !important; - } - table.visible-md { - display: table; - } - tr.visible-md { - display: table-row !important; - } - th.visible-md, - td.visible-md { - display: table-cell !important; - } -} -.visible-lg, -tr.visible-lg, -th.visible-lg, -td.visible-lg { - display: none !important; -} -@media (min-width: 1200px) { - .visible-lg { - display: block !important; - } - table.visible-lg { - display: table; - } - tr.visible-lg { - display: table-row !important; - } - th.visible-lg, - td.visible-lg { - display: table-cell !important; - } -} -@media (max-width: 767px) { - .hidden-xs, - tr.hidden-xs, - th.hidden-xs, - td.hidden-xs { - display: none !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .hidden-sm, - tr.hidden-sm, - th.hidden-sm, - td.hidden-sm { - display: none !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-md, - tr.hidden-md, - th.hidden-md, - td.hidden-md { - display: none !important; - } -} -@media (min-width: 1200px) { - .hidden-lg, - tr.hidden-lg, - th.hidden-lg, - td.hidden-lg { - display: none !important; - } -} -.visible-print, -tr.visible-print, -th.visible-print, -td.visible-print { - display: none !important; -} -@media print { - .visible-print { - display: block !important; - } - table.visible-print { - display: table; - } - tr.visible-print { - display: table-row !important; - } - th.visible-print, - td.visible-print { - display: table-cell !important; - } -} -@media print { - .hidden-print, - tr.hidden-print, - th.hidden-print, - td.hidden-print { - display: none !important; - } -} -/*# sourceMappingURL=bootstrap.css.map */ diff --git a/vilya/static/css/lib/bootstrap.css.map b/vilya/static/css/lib/bootstrap.css.map deleted file mode 100644 index e1836ba..0000000 --- a/vilya/static/css/lib/bootstrap.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["less/normalize.less","less/print.less","less/scaffolding.less","less/mixins.less","less/variables.less","less/type.less","less/code.less","less/grid.less","less/tables.less","less/forms.less","less/buttons.less","less/component-animations.less","less/glyphicons.less","less/dropdowns.less","less/button-groups.less","less/input-groups.less","less/navs.less","less/navbar.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/pager.less","less/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/progress-bars.less","less/media.less","less/list-group.less","less/panels.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/popovers.less","less/carousel.less","less/responsive-utilities.less"],"names":[],"mappings":";AAQA;EACE,uBAAA;EACA,0BAAA;EACA,8BAAA;;AAOF;EACE,SAAA;;AAUF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,cAAA;;AAQF;AACA;AACA;AACA;EACE,qBAAA;EACA,wBAAA;;AAQF,KAAK,IAAI;EACP,aAAA;EACA,SAAA;;AAQF;AACA;EACE,aAAA;;AAUF;EACE,uBAAA;;AAOF,CAAC;AACD,CAAC;EACC,UAAA;;AAUF,IAAI;EACF,yBAAA;;AAOF;AACA;EACE,iBAAA;;AAOF;EACE,kBAAA;;AAQF;EACE,cAAA;EACA,gBAAA;;AAOF;EACE,gBAAA;EACA,WAAA;;AAOF;EACE,cAAA;;AAOF;AACA;EACE,cAAA;EACA,cAAA;EACA,kBAAA;EACA,wBAAA;;AAGF;EACE,WAAA;;AAGF;EACE,eAAA;;AAUF;EACE,SAAA;;AAOF,GAAG,IAAI;EACL,gBAAA;;AAUF;EACE,gBAAA;;AAOF;EACE,4BAAA;EACA,uBAAA;EACA,SAAA;;AAOF;EACE,cAAA;;AAOF;AACA;AACA;AACA;EACE,iCAAA;EACA,cAAA;;AAkBF;AACA;AACA;AACA;AACA;EACE,cAAA;EACA,aAAA;EACA,SAAA;;AAOF;EACE,iBAAA;;AAUF;AACA;EACE,oBAAA;;AAWF;AACA,IAAK,MAAK;AACV,KAAK;AACL,KAAK;EACH,0BAAA;EACA,eAAA;;AAOF,MAAM;AACN,IAAK,MAAK;EACR,eAAA;;AAOF,MAAM;AACN,KAAK;EACH,SAAA;EACA,UAAA;;AAQF;EACE,mBAAA;;AAWF,KAAK;AACL,KAAK;EACH,sBAAA;EACA,UAAA;;AASF,KAAK,eAAe;AACpB,KAAK,eAAe;EAClB,YAAA;;AASF,KAAK;EACH,6BAAA;EACA,4BAAA;EACA,+BAAA;EACA,uBAAA;;AASF,KAAK,eAAe;AACpB,KAAK,eAAe;EAClB,wBAAA;;AAOF;EACE,yBAAA;EACA,aAAA;EACA,8BAAA;;AAQF;EACE,SAAA;EACA,UAAA;;AAOF;EACE,cAAA;;AAQF;EACE,iBAAA;;AAUF;EACE,yBAAA;EACA,iBAAA;;AAGF;AACA;EACE,UAAA;;AChUF;EA9FE;IACE,4BAAA;IACA,sBAAA;IACA,kCAAA;IACA,2BAAA;;EAGF;EACA,CAAC;IACC,0BAAA;;EAGF,CAAC,MAAM;IACL,SAAS,KAAK,WAAW,GAAzB;;EAGF,IAAI,OAAO;IACT,SAAS,KAAK,YAAY,GAA1B;;EAIF,CAAC,qBAAqB;EACtB,CAAC,WAAW;IACV,SAAS,EAAT;;EAGF;EACA;IACE,sBAAA;IACA,wBAAA;;EAGF;IACE,2BAAA;;EAGF;EACA;IACE,wBAAA;;EAGF;IACE,0BAAA;;EAGF;EACA;EACA;IACE,UAAA;IACA,SAAA;;EAGF;EACA;IACE,uBAAA;;EAKF;IACE,2BAAA;;EAIF;IACE,aAAA;;EAEF,MACE;EADF,MAEE;IACE,iCAAA;;EAGJ,IAEE;EADF,OAAQ,OACN;IACE,iCAAA;;EAGJ;IACE,sBAAA;;EAGF;IACE,oCAAA;;EAEF,eACE;EADF,eAEE;IACE,iCAAA;;;ACtFN;EC0OE,8BAAA;EACG,2BAAA;EACK,sBAAA;;ADzOV,CAAC;AACD,CAAC;ECsOC,8BAAA;EACG,2BAAA;EACK,sBAAA;;ADjOV;EACE,gBAAA;EACA,6CAAA;;AAGF;EACE,aEcwB,8CFdxB;EACA,eAAA;EACA,wBAAA;EACA,cAAA;EACA,yBAAA;;AAIF;AACA;AACA;AACA;EACE,oBAAA;EACA,kBAAA;EACA,oBAAA;;AAMF;EACE,cAAA;EACA,qBAAA;;AAEA,CAAC;AACD,CAAC;EACC,cAAA;EACA,0BAAA;;AAGF,CAAC;ECzBD,oBAAA;EAEA,0CAAA;EACA,oBAAA;;ADiCF;EACE,SAAA;;AAMF;EACE,sBAAA;;AAIF;ECiTE,cAAA;EACA,eAAA;EACA,YAAA;;AD9SF;EACE,kBAAA;;AAMF;EACE,YAAA;EACA,wBAAA;EACA,yBAAA;EACA,yBAAA;EACA,kBAAA;EC+BA,wCAAA;EACQ,gCAAA;EAgQR,qBAAA;EACA,eAAA;EACA,YAAA;;AD1RF;EACE,kBAAA;;AAMF;EACE,gBAAA;EACA,mBAAA;EACA,SAAA;EACA,6BAAA;;AAQF;EACE,kBAAA;EACA,UAAA;EACA,WAAA;EACA,YAAA;EACA,UAAA;EACA,gBAAA;EACA,MAAM,gBAAN;EACA,SAAA;;AG5HF;AAAI;AAAI;AAAI;AAAI;AAAI;AACpB;AAAK;AAAK;AAAK;AAAK;AAAK;EACvB,oBAAA;EACA,gBAAA;EACA,gBAAA;EACA,cAAA;;AALF,EAOE;AAPE,EAOF;AAPM,EAON;AAPU,EAOV;AAPc,EAOd;AAPkB,EAOlB;AANF,GAME;AANG,GAMH;AANQ,GAMR;AANa,GAMb;AANkB,GAMlB;AANuB,GAMvB;AAPF,EAQE;AARE,EAQF;AARM,EAQN;AARU,EAQV;AARc,EAQd;AARkB,EAQlB;AAPF,GAOE;AAPG,GAOH;AAPQ,GAOR;AAPa,GAOb;AAPkB,GAOlB;AAPuB,GAOvB;EACE,mBAAA;EACA,cAAA;EACA,cAAA;;AAIJ;AAAI;AACJ;AAAI;AACJ;AAAI;EACF,gBAAA;EACA,mBAAA;;AAJF,EAME;AANE,GAMF;AALF,EAKE;AALE,GAKF;AAJF,EAIE;AAJE,GAIF;AANF,EAOE;AAPE,GAOF;AANF,EAME;AANE,GAMF;AALF,EAKE;AALE,GAKF;EACE,cAAA;;AAGJ;AAAI;AACJ;AAAI;AACJ;AAAI;EACF,gBAAA;EACA,mBAAA;;AAJF,EAME;AANE,GAMF;AALF,EAKE;AALE,GAKF;AAJF,EAIE;AAJE,GAIF;AANF,EAOE;AAPE,GAOF;AANF,EAME;AANE,GAMF;AALF,EAKE;AALE,GAKF;EACE,cAAA;;AAIJ;AAAI;EAAM,eAAA;;AACV;AAAI;EAAM,eAAA;;AACV;AAAI;EAAM,eAAA;;AACV;AAAI;EAAM,eAAA;;AACV;AAAI;EAAM,eAAA;;AACV;AAAI;EAAM,eAAA;;AAMV;EACE,gBAAA;;AAGF;EACE,mBAAA;EACA,eAAA;EACA,gBAAA;EACA,gBAAA;;AAKF,QAHqC;EAGrC;IAFI,eAAA;;;AASJ;AACA;EAAU,cAAA;;AAGV;EAAU,kBAAA;;AAGV;EAAuB,gBAAA;;AACvB;EAAuB,iBAAA;;AACvB;EAAuB,kBAAA;;AACvB;EAAuB,mBAAA;;AAGvB;EACE,cAAA;;AAEF;EFsfE,cAAA;;AACA,CAAC,aAAC;EACA,cAAA;;AErfJ;EFmfE,cAAA;;AACA,CAAC,aAAC;EACA,cAAA;;AElfJ;EFgfE,cAAA;;AACA,CAAC,UAAC;EACA,cAAA;;AE/eJ;EF6eE,cAAA;;AACA,CAAC,aAAC;EACA,cAAA;;AE5eJ;EF0eE,cAAA;;AACA,CAAC,YAAC;EACA,cAAA;;AEreJ;EAGE,WAAA;EFudA,yBAAA;;AACA,CAAC,WAAC;EACA,yBAAA;;AEtdJ;EFodE,yBAAA;;AACA,CAAC,WAAC;EACA,yBAAA;;AEndJ;EFidE,yBAAA;;AACA,CAAC,QAAC;EACA,yBAAA;;AEhdJ;EF8cE,yBAAA;;AACA,CAAC,WAAC;EACA,yBAAA;;AE7cJ;EF2cE,yBAAA;;AACA,CAAC,UAAC;EACA,yBAAA;;AErcJ;EACE,mBAAA;EACA,mBAAA;EACA,gCAAA;;AAQF;AACA;EACE,aAAA;EACA,mBAAA;;AAHF,EAIE;AAHF,EAGE;AAJF,EAKE;AAJF,EAIE;EACE,gBAAA;;AAOJ;EACE,eAAA;EACA,gBAAA;;AAIF;EALE,eAAA;EACA,gBAAA;;AAIF,YAGE;EACE,qBAAA;EACA,iBAAA;EACA,kBAAA;;AAEA,YALF,KAKG;EACC,eAAA;;AAMN;EACE,aAAA;EACA,mBAAA;;AAEF;AACA;EACE,wBAAA;;AAEF;EACE,iBAAA;;AAEF;EACE,cAAA;;AAwBF,QAhB2C;EACzC,cACE;IACE,WAAA;IACA,YAAA;IACA,WAAA;IACA,iBAAA;IF5IJ,gBAAA;IACA,uBAAA;IACA,mBAAA;;EEqIA,cAQE;IACE,kBAAA;;;AAUN,IAAI;AAEJ,IAAI;EACF,YAAA;EACA,iCAAA;;AAEF;EACE,cAAA;EACA,yBAAA;;AAIF;EACE,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,8BAAA;;AAKE,UAHF,EAGG;AAAD,UAFF,GAEG;AAAD,UADF,GACG;EACC,gBAAA;;AAVN,UAgBE;AAhBF,UAiBE;AAjBF,UAkBE;EACE,cAAA;EACA,cAAA;EACA,wBAAA;EACA,cAAA;;AAEA,UARF,OAQG;AAAD,UAPF,MAOG;AAAD,UANF,OAMG;EACC,SAAS,aAAT;;AAQN;AACA,UAAU;EACR,mBAAA;EACA,eAAA;EACA,+BAAA;EACA,cAAA;EACA,iBAAA;;AAME,mBAHF,OAGG;AAAD,UAXM,WAQR,OAGG;AAAD,mBAFF,MAEG;AAAD,UAXM,WASR,MAEG;AAAD,mBADF,OACG;AAAD,UAXM,WAUR,OACG;EAAU,SAAS,EAAT;;AACX,mBAJF,OAIG;AAAD,UAZM,WAQR,OAIG;AAAD,mBAHF,MAGG;AAAD,UAZM,WASR,MAGG;AAAD,mBAFF,OAEG;AAAD,UAZM,WAUR,OAEG;EACC,SAAS,aAAT;;AAMN,UAAU;AACV,UAAU;EACR,SAAS,EAAT;;AAIF;EACE,mBAAA;EACA,kBAAA;EACA,wBAAA;;AChSF;AACA;AACA;AACA;EACE,sCFkCiD,wBElCjD;;AAIF;EACE,gBAAA;EACA,cAAA;EACA,cAAA;EACA,yBAAA;EACA,mBAAA;EACA,kBAAA;;AAIF;EACE,gBAAA;EACA,cAAA;EACA,cAAA;EACA,yBAAA;EACA,kBAAA;EACA,8CAAA;;AAIF;EACE,cAAA;EACA,cAAA;EACA,gBAAA;EACA,eAAA;EACA,wBAAA;EACA,qBAAA;EACA,qBAAA;EACA,cAAA;EACA,yBAAA;EACA,yBAAA;EACA,kBAAA;;AAXF,GAcE;EACE,UAAA;EACA,kBAAA;EACA,cAAA;EACA,qBAAA;EACA,6BAAA;EACA,gBAAA;;AAKJ;EACE,iBAAA;EACA,kBAAA;;ACpDF;EJ0nBE,kBAAA;EACA,iBAAA;EACA,kBAAA;EACA,mBAAA;;AIvnBA,QAHmC;EAGnC;IAFE,YAAA;;;AAKF,QAHmC;EAGnC;IAFE,YAAA;;;AAKJ,QAHqC;EAGrC;IAFI,aAAA;;;AAUJ;EJsmBE,kBAAA;EACA,iBAAA;EACA,kBAAA;EACA,mBAAA;;AIhmBF;EJsmBE,kBAAA;EACA,mBAAA;;AAqIE;EACE,kBAAA;EAEA,eAAA;EAEA,kBAAA;EACA,mBAAA;;AAgBF;EACE,WAAA;;AAOJ,KAAK,EAAQ,CAAC;EACZ,WAAA;;AADF,KAAK,EAAQ,CAAC;EACZ,yBAAA;;AADF,KAAK,EAAQ,CAAC;EACZ,yBAAA;;AADF,KAAK,EAAQ,CAAC;EACZ,UAAA;;AADF,KAAK,EAAQ,CAAC;EACZ,yBAAA;;AADF,KAAK,EAAQ,CAAC;EACZ,0BAAA;;AADF,KAAK,EAAQ,CAAC;EACZ,UAAA;;AADF,KAAK,EAAQ,CAAC;EACZ,yBAAA;;AADF,KAAK,EAAQ,CAAC;EACZ,yBAAA;;AADF,KAAK,EAAQ,CAAC;EACZ,UAAA;;AADF,KAAK,EAAQ,CAAC;EACZ,0BAAA;;AADF,KAAK,EAAQ,CAAC;EACZ,yBAAA;;AASF,KAAK,EAAQ,MAAM;EACjB,WAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,yBAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,yBAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,UAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,yBAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,0BAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,UAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,yBAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,yBAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,UAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,0BAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,yBAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,SAAA;;AANF,KAAK,EAAQ,MAAM;EACjB,UAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,wBAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,wBAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,SAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,wBAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,yBAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,SAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,wBAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,wBAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,SAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,yBAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,wBAAA;;AADF,KAAK,EAAQ,MAAM;EACjB,QAAA;;AASF,KAAK,EAAQ,QAAQ;EACnB,iBAAA;;AADF,KAAK,EAAQ,QAAQ;EACnB,+BAAA;;AADF,KAAK,EAAQ,QAAQ;EACnB,+BAAA;;AADF,KAAK,EAAQ,QAAQ;EACnB,gBAAA;;AADF,KAAK,EAAQ,QAAQ;EACnB,+BAAA;;AADF,KAAK,EAAQ,QAAQ;EACnB,gCAAA;;AADF,KAAK,EAAQ,QAAQ;EACnB,gBAAA;;AADF,KAAK,EAAQ,QAAQ;EACnB,+BAAA;;AADF,KAAK,EAAQ,QAAQ;EACnB,+BAAA;;AADF,KAAK,EAAQ,QAAQ;EACnB,gBAAA;;AADF,KAAK,EAAQ,QAAQ;EACnB,gCAAA;;AADF,KAAK,EAAQ,QAAQ;EACnB,+BAAA;;AADF,KAAK,EAAQ,QAAQ;EACnB,eAAA;;AIpvBJ,QATmC;EJquB/B;IACE,WAAA;;EAOJ,KAAK,EAAQ,CAAC;IACZ,WAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,yBAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,yBAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,UAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,yBAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,0BAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,UAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,yBAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,yBAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,UAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,0BAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,yBAAA;;EASF,KAAK,EAAQ,MAAM;IACjB,WAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,yBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,yBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,UAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,yBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,0BAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,UAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,yBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,yBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,UAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,0BAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,yBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,SAAA;;EANF,KAAK,EAAQ,MAAM;IACjB,UAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,wBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,wBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,SAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,wBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,yBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,SAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,wBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,wBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,SAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,yBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,wBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,QAAA;;EASF,KAAK,EAAQ,QAAQ;IACnB,iBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,+BAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,+BAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,gBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,+BAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,gCAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,gBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,+BAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,+BAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,gBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,gCAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,+BAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,eAAA;;;AIvuBJ,QATmC;EJwtB/B;IACE,WAAA;;EAOJ,KAAK,EAAQ,CAAC;IACZ,WAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,yBAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,yBAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,UAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,yBAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,0BAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,UAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,yBAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,yBAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,UAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,0BAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,yBAAA;;EASF,KAAK,EAAQ,MAAM;IACjB,WAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,yBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,yBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,UAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,yBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,0BAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,UAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,yBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,yBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,UAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,0BAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,yBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,SAAA;;EANF,KAAK,EAAQ,MAAM;IACjB,UAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,wBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,wBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,SAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,wBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,yBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,SAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,wBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,wBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,SAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,yBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,wBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,QAAA;;EASF,KAAK,EAAQ,QAAQ;IACnB,iBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,+BAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,+BAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,gBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,+BAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,gCAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,gBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,+BAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,+BAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,gBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,gCAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,+BAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,eAAA;;;AI5tBJ,QAPmC;EJ2sB/B;IACE,WAAA;;EAOJ,KAAK,EAAQ,CAAC;IACZ,WAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,yBAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,yBAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,UAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,yBAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,0BAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,UAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,yBAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,yBAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,UAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,0BAAA;;EADF,KAAK,EAAQ,CAAC;IACZ,yBAAA;;EASF,KAAK,EAAQ,MAAM;IACjB,WAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,yBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,yBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,UAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,yBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,0BAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,UAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,yBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,yBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,UAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,0BAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,yBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,SAAA;;EANF,KAAK,EAAQ,MAAM;IACjB,UAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,wBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,wBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,SAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,wBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,yBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,SAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,wBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,wBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,SAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,yBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,wBAAA;;EADF,KAAK,EAAQ,MAAM;IACjB,QAAA;;EASF,KAAK,EAAQ,QAAQ;IACnB,iBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,+BAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,+BAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,gBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,+BAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,gCAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,gBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,+BAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,+BAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,gBAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,gCAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,+BAAA;;EADF,KAAK,EAAQ,QAAQ;IACnB,eAAA;;;AK3zBJ;EACE,eAAA;EACA,6BAAA;;AAEF;EACE,gBAAA;;AAMF;EACE,WAAA;EACA,mBAAA;;AAFF,MAIE,QAGE,KACE;AARN,MAKE,QAEE,KACE;AARN,MAME,QACE,KACE;AARN,MAIE,QAGE,KAEE;AATN,MAKE,QAEE,KAEE;AATN,MAME,QACE,KAEE;EACE,YAAA;EACA,wBAAA;EACA,mBAAA;EACA,6BAAA;;AAbR,MAkBE,QAAQ,KAAK;EACX,sBAAA;EACA,gCAAA;;AApBJ,MAuBE,UAAU,QAGR,KAAI,YACF;AA3BN,MAwBE,WAAW,QAET,KAAI,YACF;AA3BN,MAyBE,QAAO,YACL,KAAI,YACF;AA3BN,MAuBE,UAAU,QAGR,KAAI,YAEF;AA5BN,MAwBE,WAAW,QAET,KAAI,YAEF;AA5BN,MAyBE,QAAO,YACL,KAAI,YAEF;EACE,aAAA;;AA7BR,MAkCE,QAAQ;EACN,6BAAA;;AAnCJ,MAuCE;EACE,yBAAA;;AAOJ,gBACE,QAGE,KACE;AALN,gBAEE,QAEE,KACE;AALN,gBAGE,QACE,KACE;AALN,gBACE,QAGE,KAEE;AANN,gBAEE,QAEE,KAEE;AANN,gBAGE,QACE,KAEE;EACE,YAAA;;AAWR;EACE,yBAAA;;AADF,eAEE,QAGE,KACE;AANN,eAGE,QAEE,KACE;AANN,eAIE,QACE,KACE;AANN,eAEE,QAGE,KAEE;AAPN,eAGE,QAEE,KAEE;AAPN,eAIE,QACE,KAEE;EACE,yBAAA;;AARR,eAYE,QAAQ,KACN;AAbJ,eAYE,QAAQ,KAEN;EACE,wBAAA;;AAUN,cACE,QAAQ,KAAI,UAAU,KACpB;AAFJ,cACE,QAAQ,KAAI,UAAU,KAEpB;EACE,yBAAA;;AAUN,YACE,QAAQ,KAAI,MACV;AAFJ,YACE,QAAQ,KAAI,MAEV;EACE,yBAAA;;AAUN,KAAM,IAAG;EACP,gBAAA;EACA,WAAA;EACA,qBAAA;;AAKE,KAFF,GAEG;AAAD,KADF,GACG;EACC,gBAAA;EACA,WAAA;EACA,mBAAA;;AL4SJ,MAAO,QAAQ,KAGb,KAAI,CAAC;AAFP,MAAO,QAAQ,KAEb,KAAI,CAAC;AADP,MAAO,QAAQ,KACb,KAAI,CAAC;AAHP,MAAO,QAAQ,KAIb,KAAI,CAAC;AAHP,MAAO,QAAQ,KAGb,KAAI,CAAC;AAFP,MAAO,QAAQ,KAEb,KAAI,CAAC;AACL,MALK,QAAQ,KAKZ,CAAC,MAAS;AAAX,MAJK,QAAQ,KAIZ,CAAC,MAAS;AAAX,MAHK,QAAQ,KAGZ,CAAC,MAAS;AACX,MANK,QAAQ,KAMZ,CAAC,MAAS;AAAX,MALK,QAAQ,KAKZ,CAAC,MAAS;AAAX,MAJK,QAAQ,KAIZ,CAAC,MAAS;EACT,yBAAA;;AAMJ,YAAa,QAAQ,KACnB,KAAI,CAAC,MAAQ;AADf,YAAa,QAAQ,KAEnB,KAAI,CAAC,MAAQ;AACb,YAHW,QAAQ,KAGlB,CAAC,MAAQ,MAAO;AACjB,YAJW,QAAQ,KAIlB,CAAC,MAAQ,MAAO;EACf,yBAAA;;AAlBJ,MAAO,QAAQ,KAGb,KAAI,CAAC;AAFP,MAAO,QAAQ,KAEb,KAAI,CAAC;AADP,MAAO,QAAQ,KACb,KAAI,CAAC;AAHP,MAAO,QAAQ,KAIb,KAAI,CAAC;AAHP,MAAO,QAAQ,KAGb,KAAI,CAAC;AAFP,MAAO,QAAQ,KAEb,KAAI,CAAC;AACL,MALK,QAAQ,KAKZ,CAAC,OAAS;AAAX,MAJK,QAAQ,KAIZ,CAAC,OAAS;AAAX,MAHK,QAAQ,KAGZ,CAAC,OAAS;AACX,MANK,QAAQ,KAMZ,CAAC,OAAS;AAAX,MALK,QAAQ,KAKZ,CAAC,OAAS;AAAX,MAJK,QAAQ,KAIZ,CAAC,OAAS;EACT,yBAAA;;AAMJ,YAAa,QAAQ,KACnB,KAAI,CAAC,OAAQ;AADf,YAAa,QAAQ,KAEnB,KAAI,CAAC,OAAQ;AACb,YAHW,QAAQ,KAGlB,CAAC,OAAQ,MAAO;AACjB,YAJW,QAAQ,KAIlB,CAAC,OAAQ,MAAO;EACf,yBAAA;;AAlBJ,MAAO,QAAQ,KAGb,KAAI,CAAC;AAFP,MAAO,QAAQ,KAEb,KAAI,CAAC;AADP,MAAO,QAAQ,KACb,KAAI,CAAC;AAHP,MAAO,QAAQ,KAIb,KAAI,CAAC;AAHP,MAAO,QAAQ,KAGb,KAAI,CAAC;AAFP,MAAO,QAAQ,KAEb,KAAI,CAAC;AACL,MALK,QAAQ,KAKZ,CAAC,IAAS;AAAX,MAJK,QAAQ,KAIZ,CAAC,IAAS;AAAX,MAHK,QAAQ,KAGZ,CAAC,IAAS;AACX,MANK,QAAQ,KAMZ,CAAC,IAAS;AAAX,MALK,QAAQ,KAKZ,CAAC,IAAS;AAAX,MAJK,QAAQ,KAIZ,CAAC,IAAS;EACT,yBAAA;;AAMJ,YAAa,QAAQ,KACnB,KAAI,CAAC,IAAQ;AADf,YAAa,QAAQ,KAEnB,KAAI,CAAC,IAAQ;AACb,YAHW,QAAQ,KAGlB,CAAC,IAAQ,MAAO;AACjB,YAJW,QAAQ,KAIlB,CAAC,IAAQ,MAAO;EACf,yBAAA;;AAlBJ,MAAO,QAAQ,KAGb,KAAI,CAAC;AAFP,MAAO,QAAQ,KAEb,KAAI,CAAC;AADP,MAAO,QAAQ,KACb,KAAI,CAAC;AAHP,MAAO,QAAQ,KAIb,KAAI,CAAC;AAHP,MAAO,QAAQ,KAGb,KAAI,CAAC;AAFP,MAAO,QAAQ,KAEb,KAAI,CAAC;AACL,MALK,QAAQ,KAKZ,CAAC,OAAS;AAAX,MAJK,QAAQ,KAIZ,CAAC,OAAS;AAAX,MAHK,QAAQ,KAGZ,CAAC,OAAS;AACX,MANK,QAAQ,KAMZ,CAAC,OAAS;AAAX,MALK,QAAQ,KAKZ,CAAC,OAAS;AAAX,MAJK,QAAQ,KAIZ,CAAC,OAAS;EACT,yBAAA;;AAMJ,YAAa,QAAQ,KACnB,KAAI,CAAC,OAAQ;AADf,YAAa,QAAQ,KAEnB,KAAI,CAAC,OAAQ;AACb,YAHW,QAAQ,KAGlB,CAAC,OAAQ,MAAO;AACjB,YAJW,QAAQ,KAIlB,CAAC,OAAQ,MAAO;EACf,yBAAA;;AAlBJ,MAAO,QAAQ,KAGb,KAAI,CAAC;AAFP,MAAO,QAAQ,KAEb,KAAI,CAAC;AADP,MAAO,QAAQ,KACb,KAAI,CAAC;AAHP,MAAO,QAAQ,KAIb,KAAI,CAAC;AAHP,MAAO,QAAQ,KAGb,KAAI,CAAC;AAFP,MAAO,QAAQ,KAEb,KAAI,CAAC;AACL,MALK,QAAQ,KAKZ,CAAC,MAAS;AAAX,MAJK,QAAQ,KAIZ,CAAC,MAAS;AAAX,MAHK,QAAQ,KAGZ,CAAC,MAAS;AACX,MANK,QAAQ,KAMZ,CAAC,MAAS;AAAX,MALK,QAAQ,KAKZ,CAAC,MAAS;AAAX,MAJK,QAAQ,KAIZ,CAAC,MAAS;EACT,yBAAA;;AAMJ,YAAa,QAAQ,KACnB,KAAI,CAAC,MAAQ;AADf,YAAa,QAAQ,KAEnB,KAAI,CAAC,MAAQ;AACb,YAHW,QAAQ,KAGlB,CAAC,MAAQ,MAAO;AACjB,YAJW,QAAQ,KAIlB,CAAC,MAAQ,MAAO;EACf,yBAAA;;AKtON,QA/DmC;EACjC;IACE,WAAA;IACA,mBAAA;IACA,kBAAA;IACA,kBAAA;IACA,4CAAA;IACA,yBAAA;IACA,iCAAA;;EAPF,iBAUE;IACE,gBAAA;;EAXJ,iBAUE,SAIE,QAGE,KACE;EAlBR,iBAUE,SAKE,QAEE,KACE;EAlBR,iBAUE,SAME,QACE,KACE;EAlBR,iBAUE,SAIE,QAGE,KAEE;EAnBR,iBAUE,SAKE,QAEE,KAEE;EAnBR,iBAUE,SAME,QACE,KAEE;IACE,mBAAA;;EApBV,iBA2BE;IACE,SAAA;;EA5BJ,iBA2BE,kBAIE,QAGE,KACE,KAAI;EAnCZ,iBA2BE,kBAKE,QAEE,KACE,KAAI;EAnCZ,iBA2BE,kBAME,QACE,KACE,KAAI;EAnCZ,iBA2BE,kBAIE,QAGE,KAEE,KAAI;EApCZ,iBA2BE,kBAKE,QAEE,KAEE,KAAI;EApCZ,iBA2BE,kBAME,QACE,KAEE,KAAI;IACF,cAAA;;EArCV,iBA2BE,kBAIE,QAGE,KAKE,KAAI;EAvCZ,iBA2BE,kBAKE,QAEE,KAKE,KAAI;EAvCZ,iBA2BE,kBAME,QACE,KAKE,KAAI;EAvCZ,iBA2BE,kBAIE,QAGE,KAME,KAAI;EAxCZ,iBA2BE,kBAKE,QAEE,KAME,KAAI;EAxCZ,iBA2BE,kBAME,QACE,KAME,KAAI;IACF,eAAA;;EAzCV,iBA2BE,kBAsBE,QAEE,KAAI,WACF;EApDR,iBA2BE,kBAuBE,QACE,KAAI,WACF;EApDR,iBA2BE,kBAsBE,QAEE,KAAI,WAEF;EArDR,iBA2BE,kBAuBE,QACE,KAAI,WAEF;IACE,gBAAA;;;ACxNZ;EACE,UAAA;EACA,SAAA;EACA,SAAA;EAIA,YAAA;;AAGF;EACE,cAAA;EACA,WAAA;EACA,UAAA;EACA,mBAAA;EACA,eAAA;EACA,oBAAA;EACA,cAAA;EACA,SAAA;EACA,gCAAA;;AAGF;EACE,qBAAA;EACA,kBAAA;EACA,iBAAA;;AAWF,KAAK;ENuMH,8BAAA;EACG,2BAAA;EACK,sBAAA;;AMpMV,KAAK;AACL,KAAK;EACH,eAAA;EACA,kBAAA;;EACA,mBAAA;;AAIF,KAAK;EACH,cAAA;;AAIF,KAAK;EACH,cAAA;EACA,WAAA;;AAIF,MAAM;AACN,MAAM;EACJ,YAAA;;AAIF,KAAK,aAAa;AAClB,KAAK,cAAc;AACnB,KAAK,iBAAiB;EN7CpB,oBAAA;EAEA,0CAAA;EACA,oBAAA;;AM+CF;EACE,cAAA;EACA,gBAAA;EACA,eAAA;EACA,wBAAA;EACA,cAAA;;AA0BF;EACE,cAAA;EACA,WAAA;EACA,YAAA;EACA,iBAAA;EACA,eAAA;EACA,wBAAA;EACA,cAAA;EACA,yBAAA;EACA,sBAAA;EACA,yBAAA;EACA,kBAAA;ENFA,wDAAA;EACQ,gDAAA;EAKR,8EAAA;EACQ,sEAAA;;AA+vBR,aAAC;EACC,qBAAA;EACA,UAAA;EAxwBF,sFAAA;EACQ,8EAAA;;AAnER,aAAC;EAA+B,cAAA;;AAChC,aAAC;EAA+B,cAAA;EACA,UAAA;;AAChC,aAAC;EAA+B,cAAA;;AAChC,aAAC;EAA+B,cAAA;;AM8EhC,aAAC;AACD,aAAC;AACD,QAAQ,UAAW;EACjB,mBAAA;EACA,yBAAA;EACA,UAAA;;AAIF,QAAQ;EACN,YAAA;;AAQJ,KAAK;EACH,iBAAA;;AASF;EACE,mBAAA;;AAQF;AACA;EACE,cAAA;EACA,gBAAA;EACA,gBAAA;EACA,mBAAA;EACA,kBAAA;;AANF,MAOE;AANF,SAME;EACE,eAAA;EACA,mBAAA;EACA,eAAA;;AAGJ,MAAO,MAAK;AACZ,aAAc,MAAK;AACnB,SAAU,MAAK;AACf,gBAAiB,MAAK;EACpB,WAAA;EACA,kBAAA;;AAEF,MAAO;AACP,SAAU;EACR,gBAAA;;AAIF;AACA;EACE,qBAAA;EACA,kBAAA;EACA,gBAAA;EACA,sBAAA;EACA,mBAAA;EACA,eAAA;;AAEF,aAAc;AACd,gBAAiB;EACf,aAAA;EACA,iBAAA;;AAYA,KANG,cAMF;AAAD,KALG,iBAKF;AAAD,MAAC;AAAD,aAAC;AAAD,SAAC;AAAD,gBAAC;AACD,QAAQ,UAAW,MAPhB;AAOH,QAAQ,UAAW,MANhB;AAMH,QAAQ,UAAW;AAAnB,QAAQ,UAAW;AAAnB,QAAQ,UAAW;AAAnB,QAAQ,UAAW;EACjB,mBAAA;;AAUJ;ENiqBE,YAAA;EACA,iBAAA;EACA,eAAA;EACA,gBAAA;EACA,kBAAA;;AAEA,MAAM;EACJ,YAAA;EACA,iBAAA;;AAGF,QAAQ;AACR,MAAM,UAAU;EACd,YAAA;;AM1qBJ;EN6pBE,YAAA;EACA,kBAAA;EACA,eAAA;EACA,iBAAA;EACA,kBAAA;;AAEA,MAAM;EACJ,YAAA;EACA,iBAAA;;AAGF,QAAQ;AACR,MAAM,UAAU;EACd,YAAA;;AMjqBJ;EAEE,kBAAA;;AAFF,aAKE;EACE,qBAAA;;AANJ,aAUE;EACE,kBAAA;EACA,SAAA;EACA,QAAA;EACA,cAAA;EACA,WAAA;EACA,YAAA;EACA,iBAAA;EACA,kBAAA;;AAKJ,YNkkBE;AMlkBF,YNmkBE;AMnkBF,YNokBE;AMpkBF,YNqkBE;AMrkBF,YNskBE;AMtkBF,YNukBE;EACE,cAAA;;AMxkBJ,YN2kBE;EACE,qBAAA;EAnuBF,wDAAA;EACQ,gDAAA;;AAouBN,YAHF,cAGG;EACC,qBAAA;EAtuBJ,yEAAA;EACQ,iEAAA;;AMsJV,YNqlBE;EACE,cAAA;EACA,qBAAA;EACA,yBAAA;;AMxlBJ,YN2lBE;EACE,cAAA;;AMzlBJ,YN+jBE;AM/jBF,YNgkBE;AMhkBF,YNikBE;AMjkBF,YNkkBE;AMlkBF,YNmkBE;AMnkBF,YNokBE;EACE,cAAA;;AMrkBJ,YNwkBE;EACE,qBAAA;EAnuBF,wDAAA;EACQ,gDAAA;;AAouBN,YAHF,cAGG;EACC,qBAAA;EAtuBJ,yEAAA;EACQ,iEAAA;;AMyJV,YNklBE;EACE,cAAA;EACA,qBAAA;EACA,yBAAA;;AMrlBJ,YNwlBE;EACE,cAAA;;AMtlBJ,UN4jBE;AM5jBF,UN6jBE;AM7jBF,UN8jBE;AM9jBF,UN+jBE;AM/jBF,UNgkBE;AMhkBF,UNikBE;EACE,cAAA;;AMlkBJ,UNqkBE;EACE,qBAAA;EAnuBF,wDAAA;EACQ,gDAAA;;AAouBN,UAHF,cAGG;EACC,qBAAA;EAtuBJ,yEAAA;EACQ,iEAAA;;AM4JV,UN+kBE;EACE,cAAA;EACA,qBAAA;EACA,yBAAA;;AMllBJ,UNqlBE;EACE,cAAA;;AM5kBJ;EACE,gBAAA;;AASF;EACE,cAAA;EACA,eAAA;EACA,mBAAA;EACA,cAAA;;AAgEF,QA7CqC;EA6CrC,YA3CI;IACE,qBAAA;IACA,gBAAA;IACA,sBAAA;;EAwCN,YApCI;IACE,qBAAA;IACA,WAAA;IACA,sBAAA;;EAiCN,YA9BI;IACE,gBAAA;IACA,sBAAA;;EA4BN,YAtBI;EAsBJ,YArBI;IACE,qBAAA;IACA,aAAA;IACA,gBAAA;IACA,eAAA;IACA,sBAAA;;EAgBN,YAdI,OAAO,MAAK;EAchB,YAbI,UAAU,MAAK;IACb,WAAA;IACA,cAAA;;EAWN,YAJI,cAAc;IACZ,MAAA;;;AAWN,gBAGE;AAHF,gBAIE;AAJF,gBAKE;AALF,gBAME;AANF,gBAOE;EACE,aAAA;EACA,gBAAA;EACA,gBAAA;;AAVJ,gBAcE;AAdF,gBAeE;EACE,gBAAA;;AAhBJ,gBAoBE;ENiQA,kBAAA;EACA,mBAAA;;AMtRF,gBAwBE;EACE,gBAAA;;AAUF,QANmC;EAMnC,gBALE;IACE,iBAAA;;;AA/BN,gBAuCE,cAAc;EACZ,MAAA;EACA,WAAA;;ACxZJ;EACE,qBAAA;EACA,gBAAA;EACA,mBAAA;EACA,kBAAA;EACA,sBAAA;EACA,eAAA;EACA,sBAAA;EACA,6BAAA;EACA,mBAAA;EP4gBA,iBAAA;EACA,eAAA;EACA,wBAAA;EACA,kBAAA;EApSA,yBAAA;EACG,sBAAA;EACC,qBAAA;EACC,oBAAA;EACG,iBAAA;;AO3OR,IAAC;EPWD,oBAAA;EAEA,0CAAA;EACA,oBAAA;;AOVA,IAAC;AACD,IAAC;EACC,cAAA;EACA,qBAAA;;AAGF,IAAC;AACD,IAAC;EACC,UAAA;EACA,sBAAA;EPwFF,wDAAA;EACQ,gDAAA;;AOrFR,IAAC;AACD,IAAC;AACD,QAAQ,UAAW;EACjB,mBAAA;EACA,oBAAA;EPqPF,aAAA;EAGA,yBAAA;EAxKA,wBAAA;EACQ,gBAAA;;AOvEV;EPicE,cAAA;EACA,yBAAA;EACA,qBAAA;;AAEA,YAAC;AACD,YAAC;AACD,YAAC;AACD,YAAC;AACD,KAAM,iBAAgB;EACpB,cAAA;EACA,yBAAA;EACI,qBAAA;;AAEN,YAAC;AACD,YAAC;AACD,KAAM,iBAAgB;EACpB,sBAAA;;AAKA,YAHD;AAGC,YAFD;AAEC,QADM,UAAW;AAEjB,YAJD,SAIE;AAAD,YAHD,UAGE;AAAD,QAFM,UAAW,aAEhB;AACD,YALD,SAKE;AAAD,YAJD,UAIE;AAAD,QAHM,UAAW,aAGhB;AACD,YAND,SAME;AAAD,YALD,UAKE;AAAD,QAJM,UAAW,aAIhB;AACD,YAPD,SAOE;AAAD,YAND,UAME;AAAD,QALM,UAAW,aAKhB;EACC,yBAAA;EACI,qBAAA;;AO5dV,YPgeE;EACE,cAAA;EACA,yBAAA;;AO/dJ;EP8bE,cAAA;EACA,yBAAA;EACA,qBAAA;;AAEA,YAAC;AACD,YAAC;AACD,YAAC;AACD,YAAC;AACD,KAAM,iBAAgB;EACpB,cAAA;EACA,yBAAA;EACI,qBAAA;;AAEN,YAAC;AACD,YAAC;AACD,KAAM,iBAAgB;EACpB,sBAAA;;AAKA,YAHD;AAGC,YAFD;AAEC,QADM,UAAW;AAEjB,YAJD,SAIE;AAAD,YAHD,UAGE;AAAD,QAFM,UAAW,aAEhB;AACD,YALD,SAKE;AAAD,YAJD,UAIE;AAAD,QAHM,UAAW,aAGhB;AACD,YAND,SAME;AAAD,YALD,UAKE;AAAD,QAJM,UAAW,aAIhB;AACD,YAPD,SAOE;AAAD,YAND,UAME;AAAD,QALM,UAAW,aAKhB;EACC,yBAAA;EACI,qBAAA;;AOzdV,YP6dE;EACE,cAAA;EACA,yBAAA;;AO3dJ;EP0bE,cAAA;EACA,yBAAA;EACA,qBAAA;;AAEA,YAAC;AACD,YAAC;AACD,YAAC;AACD,YAAC;AACD,KAAM,iBAAgB;EACpB,cAAA;EACA,yBAAA;EACI,qBAAA;;AAEN,YAAC;AACD,YAAC;AACD,KAAM,iBAAgB;EACpB,sBAAA;;AAKA,YAHD;AAGC,YAFD;AAEC,QADM,UAAW;AAEjB,YAJD,SAIE;AAAD,YAHD,UAGE;AAAD,QAFM,UAAW,aAEhB;AACD,YALD,SAKE;AAAD,YAJD,UAIE;AAAD,QAHM,UAAW,aAGhB;AACD,YAND,SAME;AAAD,YALD,UAKE;AAAD,QAJM,UAAW,aAIhB;AACD,YAPD,SAOE;AAAD,YAND,UAME;AAAD,QALM,UAAW,aAKhB;EACC,yBAAA;EACI,qBAAA;;AOrdV,YPydE;EACE,cAAA;EACA,yBAAA;;AOvdJ;EPsbE,cAAA;EACA,yBAAA;EACA,qBAAA;;AAEA,SAAC;AACD,SAAC;AACD,SAAC;AACD,SAAC;AACD,KAAM,iBAAgB;EACpB,cAAA;EACA,yBAAA;EACI,qBAAA;;AAEN,SAAC;AACD,SAAC;AACD,KAAM,iBAAgB;EACpB,sBAAA;;AAKA,SAHD;AAGC,SAFD;AAEC,QADM,UAAW;AAEjB,SAJD,SAIE;AAAD,SAHD,UAGE;AAAD,QAFM,UAAW,UAEhB;AACD,SALD,SAKE;AAAD,SAJD,UAIE;AAAD,QAHM,UAAW,UAGhB;AACD,SAND,SAME;AAAD,SALD,UAKE;AAAD,QAJM,UAAW,UAIhB;AACD,SAPD,SAOE;AAAD,SAND,UAME;AAAD,QALM,UAAW,UAKhB;EACC,yBAAA;EACI,qBAAA;;AOjdV,SPqdE;EACE,cAAA;EACA,yBAAA;;AOndJ;EPkbE,cAAA;EACA,yBAAA;EACA,qBAAA;;AAEA,YAAC;AACD,YAAC;AACD,YAAC;AACD,YAAC;AACD,KAAM,iBAAgB;EACpB,cAAA;EACA,yBAAA;EACI,qBAAA;;AAEN,YAAC;AACD,YAAC;AACD,KAAM,iBAAgB;EACpB,sBAAA;;AAKA,YAHD;AAGC,YAFD;AAEC,QADM,UAAW;AAEjB,YAJD,SAIE;AAAD,YAHD,UAGE;AAAD,QAFM,UAAW,aAEhB;AACD,YALD,SAKE;AAAD,YAJD,UAIE;AAAD,QAHM,UAAW,aAGhB;AACD,YAND,SAME;AAAD,YALD,UAKE;AAAD,QAJM,UAAW,aAIhB;AACD,YAPD,SAOE;AAAD,YAND,UAME;AAAD,QALM,UAAW,aAKhB;EACC,yBAAA;EACI,qBAAA;;AO7cV,YPidE;EACE,cAAA;EACA,yBAAA;;AO/cJ;EP8aE,cAAA;EACA,yBAAA;EACA,qBAAA;;AAEA,WAAC;AACD,WAAC;AACD,WAAC;AACD,WAAC;AACD,KAAM,iBAAgB;EACpB,cAAA;EACA,yBAAA;EACI,qBAAA;;AAEN,WAAC;AACD,WAAC;AACD,KAAM,iBAAgB;EACpB,sBAAA;;AAKA,WAHD;AAGC,WAFD;AAEC,QADM,UAAW;AAEjB,WAJD,SAIE;AAAD,WAHD,UAGE;AAAD,QAFM,UAAW,YAEhB;AACD,WALD,SAKE;AAAD,WAJD,UAIE;AAAD,QAHM,UAAW,YAGhB;AACD,WAND,SAME;AAAD,WALD,UAKE;AAAD,QAJM,UAAW,YAIhB;AACD,WAPD,SAOE;AAAD,WAND,UAME;AAAD,QALM,UAAW,YAKhB;EACC,yBAAA;EACI,qBAAA;;AOzcV,WP6cE;EACE,cAAA;EACA,yBAAA;;AOtcJ;EACE,cAAA;EACA,mBAAA;EACA,eAAA;EACA,gBAAA;;AAEA;AACA,SAAC;AACD,SAAC;AACD,QAAQ,UAAW;EACjB,6BAAA;EPgCF,wBAAA;EACQ,gBAAA;;AO9BR;AACA,SAAC;AACD,SAAC;AACD,SAAC;EACC,yBAAA;;AAEF,SAAC;AACD,SAAC;EACC,cAAA;EACA,0BAAA;EACA,6BAAA;;AAIA,SAFD,UAEE;AAAD,QADM,UAAW,UAChB;AACD,SAHD,UAGE;AAAD,QAFM,UAAW,UAEhB;EACC,cAAA;EACA,qBAAA;;AASN;EPsaE,kBAAA;EACA,eAAA;EACA,iBAAA;EACA,kBAAA;;AOraF;EPkaE,iBAAA;EACA,eAAA;EACA,gBAAA;EACA,kBAAA;;AOjaF;EP8ZE,gBAAA;EACA,eAAA;EACA,gBAAA;EACA,kBAAA;;AOzZF;EACE,cAAA;EACA,WAAA;EACA,eAAA;EACA,gBAAA;;AAIF,UAAW;EACT,eAAA;;AAOA,KAHG,eAGF;AAAD,KAFG,cAEF;AAAD,KADG,eACF;EACC,WAAA;;AC/IJ;EACE,UAAA;ERsHA,wCAAA;EACQ,gCAAA;;AQrHR,KAAC;EACC,UAAA;;AAIJ;EACE,aAAA;;AACA,SAAC;EACC,cAAA;;AAGJ;EACE,kBAAA;EACA,SAAA;EACA,gBAAA;ERsGA,qCAAA;EACQ,6BAAA;;ASvHV;EACE,aAAa,sBAAb;EACA,qDAAA;EACA,2TAAA;;AAOF;EACE,kBAAA;EACA,QAAA;EACA,qBAAA;EACA,aAAa,sBAAb;EACA,kBAAA;EACA,mBAAA;EACA,cAAA;EACA,mCAAA;EACA,kCAAA;;AAIkC,mBAAC;EAAU,SAAS,KAAT;;AACX,eAAC;EAAU,SAAS,KAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,mBAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,qBAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,mBAAC;EAAU,SAAS,OAAT;;AACX,aAAC;EAAU,SAAS,OAAT;;AACX,kBAAC;EAAU,SAAS,OAAT;;AACX,aAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,kBAAC;EAAU,SAAS,OAAT;;AACX,mBAAC;EAAU,SAAS,OAAT;;AACX,cAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,cAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,uBAAC;EAAU,SAAS,OAAT;;AACX,mBAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,sBAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,kBAAC;EAAU,SAAS,OAAT;;AACX,mBAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,qBAAC;EAAU,SAAS,OAAT;;AACX,qBAAC;EAAU,SAAS,OAAT;;AACX,sBAAC;EAAU,SAAS,OAAT;;AACX,oBAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,kBAAC;EAAU,SAAS,OAAT;;AACX,cAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,mBAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,sBAAC;EAAU,SAAS,OAAT;;AACX,qBAAC;EAAU,SAAS,OAAT;;AACX,qBAAC;EAAU,SAAS,OAAT;;AACX,uBAAC;EAAU,SAAS,OAAT;;AACX,sBAAC;EAAU,SAAS,OAAT;;AACX,wBAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,sBAAC;EAAU,SAAS,OAAT;;AACX,uBAAC;EAAU,SAAS,OAAT;;AACX,yBAAC;EAAU,SAAS,OAAT;;AACX,kBAAC;EAAU,SAAS,OAAT;;AACX,qBAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,wBAAC;EAAU,SAAS,OAAT;;AACX,wBAAC;EAAU,SAAS,OAAT;;AACX,mBAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,kBAAC;EAAU,SAAS,OAAT;;AACX,uBAAC;EAAU,SAAS,OAAT;;AACX,uBAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,uBAAC;EAAU,SAAS,OAAT;;AACX,wBAAC;EAAU,SAAS,OAAT;;AACX,oBAAC;EAAU,SAAS,OAAT;;AACX,qBAAC;EAAU,SAAS,OAAT;;AACX,sBAAC;EAAU,SAAS,OAAT;;AACX,kBAAC;EAAU,SAAS,OAAT;;AACX,wBAAC;EAAU,SAAS,OAAT;;AACX,oBAAC;EAAU,SAAS,OAAT;;AACX,qBAAC;EAAU,SAAS,OAAT;;AACX,wBAAC;EAAU,SAAS,OAAT;;AACX,oBAAC;EAAU,SAAS,OAAT;;AACX,qBAAC;EAAU,SAAS,OAAT;;AACX,qBAAC;EAAU,SAAS,OAAT;;AACX,sBAAC;EAAU,SAAS,OAAT;;AACX,mBAAC;EAAU,SAAS,OAAT;;AACX,qBAAC;EAAU,SAAS,OAAT;;AACX,oBAAC;EAAU,SAAS,OAAT;;AACX,sBAAC;EAAU,SAAS,OAAT;;AACX,uBAAC;EAAU,SAAS,OAAT;;AACX,2BAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,mBAAC;EAAU,SAAS,OAAT;;AACX,oBAAC;EAAU,SAAS,OAAT;;AACX,uBAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,mBAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,kBAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,qBAAC;EAAU,SAAS,OAAT;;AACX,uBAAC;EAAU,SAAS,OAAT;;AACX,kBAAC;EAAU,SAAS,OAAT;;AACX,wBAAC;EAAU,SAAS,OAAT;;AACX,uBAAC;EAAU,SAAS,OAAT;;AACX,sBAAC;EAAU,SAAS,OAAT;;AACX,0BAAC;EAAU,SAAS,OAAT;;AACX,4BAAC;EAAU,SAAS,OAAT;;AACX,cAAC;EAAU,SAAS,OAAT;;AACX,mBAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,sBAAC;EAAU,SAAS,OAAT;;AACX,oBAAC;EAAU,SAAS,OAAT;;AACX,sBAAC;EAAU,SAAS,OAAT;;AACX,qBAAC;EAAU,SAAS,OAAT;;AACX,oBAAC;EAAU,SAAS,OAAT;;AACX,kBAAC;EAAU,SAAS,OAAT;;AACX,oBAAC;EAAU,SAAS,OAAT;;AACX,6BAAC;EAAU,SAAS,OAAT;;AACX,4BAAC;EAAU,SAAS,OAAT;;AACX,0BAAC;EAAU,SAAS,OAAT;;AACX,4BAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,oBAAC;EAAU,SAAS,OAAT;;AACX,qBAAC;EAAU,SAAS,OAAT;;AACX,oBAAC;EAAU,SAAS,OAAT;;AACX,oBAAC;EAAU,SAAS,OAAT;;AACX,sBAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,kBAAC;EAAU,SAAS,OAAT;;AACX,cAAC;EAAU,SAAS,OAAT;;AACX,cAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,2BAAC;EAAU,SAAS,OAAT;;AACX,+BAAC;EAAU,SAAS,OAAT;;AACX,wBAAC;EAAU,SAAS,OAAT;;AACX,4BAAC;EAAU,SAAS,OAAT;;AACX,6BAAC;EAAU,SAAS,OAAT;;AACX,iCAAC;EAAU,SAAS,OAAT;;AACX,oBAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,wBAAC;EAAU,SAAS,OAAT;;AACX,sBAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,kBAAC;EAAU,SAAS,OAAT;;AACX,qBAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,eAAC;EAAU,SAAS,OAAT;;AACX,sBAAC;EAAU,SAAS,OAAT;;AACX,uBAAC;EAAU,SAAS,OAAT;;AACX,wBAAC;EAAU,SAAS,OAAT;;AACX,sBAAC;EAAU,SAAS,OAAT;;AACX,sBAAC;EAAU,SAAS,OAAT;;AACX,sBAAC;EAAU,SAAS,OAAT;;AACX,mBAAC;EAAU,SAAS,OAAT;;AACX,kBAAC;EAAU,SAAS,OAAT;;AACX,iBAAC;EAAU,SAAS,OAAT;;AACX,qBAAC;EAAU,SAAS,OAAT;;AACX,mBAAC;EAAU,SAAS,OAAT;;AACX,oBAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,gBAAC;EAAU,SAAS,OAAT;;AACX,mBAAC;EAAU,SAAS,OAAT;;AACX,mBAAC;EAAU,SAAS,OAAT;;AACX,oBAAC;EAAU,SAAS,OAAT;;AACX,uBAAC;EAAU,SAAS,OAAT;;AACX,sBAAC;EAAU,SAAS,OAAT;;AACX,oBAAC;EAAU,SAAS,OAAT;;AACX,oBAAC;EAAU,SAAS,OAAT;;AACX,oBAAC;EAAU,SAAS,OAAT;;AACX,yBAAC;EAAU,SAAS,OAAT;;AACX,4BAAC;EAAU,SAAS,OAAT;;AACX,yBAAC;EAAU,SAAS,OAAT;;AACX,uBAAC;EAAU,SAAS,OAAT;;AACX,uBAAC;EAAU,SAAS,OAAT;;AACX,yBAAC;EAAU,SAAS,OAAT;;AClO/C;EACE,qBAAA;EACA,QAAA;EACA,SAAA;EACA,gBAAA;EACA,sBAAA;EACA,qBAAA;EACA,mCAAA;EACA,kCAAA;;AAIF;EACE,kBAAA;;AAIF,gBAAgB;EACd,UAAA;;AAIF;EACE,kBAAA;EACA,SAAA;EACA,OAAA;EACA,aAAA;EACA,aAAA;EACA,WAAA;EACA,gBAAA;EACA,cAAA;EACA,eAAA;EACA,gBAAA;EACA,eAAA;EACA,yBAAA;EACA,yBAAA;EACA,qCAAA;EACA,kBAAA;EV+EA,mDAAA;EACQ,2CAAA;EU9ER,4BAAA;;AAKA,cAAC;EACC,QAAA;EACA,UAAA;;AAxBJ,cA4BE;EVsVA,WAAA;EACA,aAAA;EACA,gBAAA;EACA,yBAAA;;AUrXF,cAiCE,KAAK;EACH,cAAA;EACA,iBAAA;EACA,WAAA;EACA,mBAAA;EACA,wBAAA;EACA,cAAA;EACA,mBAAA;;AAMF,cADa,KAAK,IACjB;AACD,cAFa,KAAK,IAEjB;EACC,qBAAA;EACA,cAAA;EACA,yBAAA;;AAMF,cADa,UAAU;AAEvB,cAFa,UAAU,IAEtB;AACD,cAHa,UAAU,IAGtB;EACC,cAAA;EACA,qBAAA;EACA,UAAA;EACA,yBAAA;;AASF,cADa,YAAY;AAEzB,cAFa,YAAY,IAExB;AACD,cAHa,YAAY,IAGxB;EACC,cAAA;;AAKF,cADa,YAAY,IACxB;AACD,cAFa,YAAY,IAExB;EACC,qBAAA;EACA,6BAAA;EACA,sBAAA;EVoPF,mEAAA;EUlPE,mBAAA;;AAKJ,KAEE;EACE,cAAA;;AAHJ,KAOE;EACE,UAAA;;AAQJ;EACE,UAAA;EACA,QAAA;;AAQF;EACE,OAAA;EACA,WAAA;;AAIF;EACE,cAAA;EACA,iBAAA;EACA,eAAA;EACA,wBAAA;EACA,cAAA;;AAIF;EACE,eAAA;EACA,OAAA;EACA,QAAA;EACA,SAAA;EACA,MAAA;EACA,YAAA;;AAIF,WAAY;EACV,QAAA;EACA,UAAA;;AAQF,OAGE;AAFF,oBAAqB,UAEnB;EACE,aAAA;EACA,wBAAA;EACA,SAAS,EAAT;;AANJ,OASE;AARF,oBAAqB,UAQnB;EACE,SAAA;EACA,YAAA;EACA,kBAAA;;AAsBJ,QAb2C;EACzC,aACE;IAnEF,UAAA;IACA,QAAA;;EAiEA,aAME;IA9DF,OAAA;IACA,WAAA;;;AC7IF;AACA;EACE,kBAAA;EACA,qBAAA;EACA,sBAAA;;AAJF,UAKE;AAJF,mBAIE;EACE,kBAAA;EACA,WAAA;;AAEA,UAJF,OAIG;AAAD,mBAJF,OAIG;AACD,UALF,OAKG;AAAD,mBALF,OAKG;AACD,UANF,OAMG;AAAD,mBANF,OAMG;AACD,UAPF,OAOG;AAAD,mBAPF,OAOG;EACC,UAAA;;AAEF,UAVF,OAUG;AAAD,mBAVF,OAUG;EAEC,aAAA;;AAMN,UACE,KAAK;AADP,UAEE,KAAK;AAFP,UAGE,WAAW;AAHb,UAIE,WAAW;EACT,iBAAA;;AAKJ;EACE,iBAAA;;AADF,YAIE;AAJF,YAKE;EACE,WAAA;;AANJ,YAQE;AARF,YASE;AATF,YAUE;EACE,gBAAA;;AAIJ,UAAW,OAAM,IAAI,cAAc,IAAI,aAAa,IAAI;EACtD,gBAAA;;AAIF,UAAW,OAAM;EACf,cAAA;;AACA,UAFS,OAAM,YAEd,IAAI,aAAa,IAAI;EX4CtB,6BAAA;EACG,0BAAA;;AWxCL,UAAW,OAAM,WAAW,IAAI;AAChC,UAAW,mBAAkB,IAAI;EX8C/B,4BAAA;EACG,yBAAA;;AW1CL,UAAW;EACT,WAAA;;AAEF,UAAW,aAAY,IAAI,cAAc,IAAI,aAAc;EACzD,gBAAA;;AAEF,UAAW,aAAY,YACrB,OAAM;AADR,UAAW,aAAY,YAErB;EXyBA,6BAAA;EACG,0BAAA;;AWtBL,UAAW,aAAY,WAAY,OAAM;EX6BvC,4BAAA;EACG,yBAAA;;AWzBL,UAAW,iBAAgB;AAC3B,UAAU,KAAM;EACd,UAAA;;AAQF,aAAc;EX2bZ,gBAAA;EACA,eAAA;EACA,gBAAA;EACA,kBAAA;;AW7bF,aAAc;EX0bZ,iBAAA;EACA,eAAA;EACA,gBAAA;EACA,kBAAA;;AW5bF,aAAc;EXybZ,kBAAA;EACA,eAAA;EACA,iBAAA;EACA,kBAAA;;AWrbF,UAAW,OAAO;EAChB,iBAAA;EACA,kBAAA;;AAEF,UAAW,UAAU;EACnB,kBAAA;EACA,mBAAA;;AAKF,UAAU,KAAM;EXId,wDAAA;EACQ,gDAAA;;AWDR,UAJQ,KAAM,iBAIb;EXAD,wBAAA;EACQ,gBAAA;;AWMV,IAAK;EACH,cAAA;;AAGF,OAAQ;EACN,uBAAA;EACA,sBAAA;;AAGF,OAAQ,QAAQ;EACd,uBAAA;;AAOF,mBACE;AADF,mBAEE;AAFF,mBAGE,aAAa;EACX,cAAA;EACA,WAAA;EACA,WAAA;EACA,eAAA;;AAPJ,mBAWE,aAEE;EACE,WAAA;;AAdN,mBAkBE,OAAO;AAlBT,mBAmBE,OAAO;AAnBT,mBAoBE,aAAa;AApBf,mBAqBE,aAAa;EACX,gBAAA;EACA,cAAA;;AAKF,mBADkB,OACjB,IAAI,cAAc,IAAI;EACrB,gBAAA;;AAEF,mBAJkB,OAIjB,YAAY,IAAI;EACf,4BAAA;EXtEF,6BAAA;EACC,4BAAA;;AWwED,mBARkB,OAQjB,WAAW,IAAI;EACd,8BAAA;EXlFF,0BAAA;EACC,yBAAA;;AWqFH,mBAAoB,aAAY,IAAI,cAAc,IAAI,aAAc;EAClE,gBAAA;;AAEF,mBAAoB,aAAY,YAAY,IAAI,aAC9C,OAAM;AADR,mBAAoB,aAAY,YAAY,IAAI,aAE9C;EXnFA,6BAAA;EACC,4BAAA;;AWsFH,mBAAoB,aAAY,WAAW,IAAI,cAAe,OAAM;EX/FlE,0BAAA;EACC,yBAAA;;AWuGH;EACE,cAAA;EACA,WAAA;EACA,mBAAA;EACA,yBAAA;;AAJF,oBAKE;AALF,oBAME;EACE,WAAA;EACA,mBAAA;EACA,SAAA;;AATJ,oBAWE,aAAa;EACX,WAAA;;AAMJ,uBAAwB,OAAO,QAAO;AACtC,uBAAwB,OAAO,QAAO;EACpC,aAAA;;AC1NF;EACE,kBAAA;EACA,cAAA;EACA,yBAAA;;AAGA,YAAC;EACC,WAAA;EACA,eAAA;EACA,gBAAA;;AATJ,YAYE;EAIE,WAAA;EAEA,WAAA;EACA,gBAAA;;AASJ,eAAgB;AAChB,eAAgB;AAChB,eAAgB,mBAAmB;EZ02BjC,YAAA;EACA,kBAAA;EACA,eAAA;EACA,iBAAA;EACA,kBAAA;;AAEA,MAAM,eYl3BQ;AZk3Bd,MAAM,eYj3BQ;AZi3Bd,MAAM,eYh3BQ,mBAAmB;EZi3B/B,YAAA;EACA,iBAAA;;AAGF,QAAQ,eYv3BM;AZu3Bd,QAAQ,eYt3BM;AZs3Bd,QAAQ,eYr3BM,mBAAmB;AZs3BjC,MAAM,UAAU,eYx3BF;AZw3Bd,MAAM,UAAU,eYv3BF;AZu3Bd,MAAM,UAAU,eYt3BF,mBAAmB;EZu3B/B,YAAA;;AYt3BJ,eAAgB;AAChB,eAAgB;AAChB,eAAgB,mBAAmB;EZu2BjC,YAAA;EACA,iBAAA;EACA,eAAA;EACA,gBAAA;EACA,kBAAA;;AAEA,MAAM,eY/2BQ;AZ+2Bd,MAAM,eY92BQ;AZ82Bd,MAAM,eY72BQ,mBAAmB;EZ82B/B,YAAA;EACA,iBAAA;;AAGF,QAAQ,eYp3BM;AZo3Bd,QAAQ,eYn3BM;AZm3Bd,QAAQ,eYl3BM,mBAAmB;AZm3BjC,MAAM,UAAU,eYr3BF;AZq3Bd,MAAM,UAAU,eYp3BF;AZo3Bd,MAAM,UAAU,eYn3BF,mBAAmB;EZo3B/B,YAAA;;AY/2BJ;AACA;AACA,YAAa;EACX,mBAAA;;AAEA,kBAAC,IAAI,cAAc,IAAI;AAAvB,gBAAC,IAAI,cAAc,IAAI;AAAvB,YAHW,cAGV,IAAI,cAAc,IAAI;EACrB,gBAAA;;AAIJ;AACA;EACE,SAAA;EACA,mBAAA;EACA,sBAAA;;AAKF;EACE,iBAAA;EACA,eAAA;EACA,mBAAA;EACA,cAAA;EACA,cAAA;EACA,kBAAA;EACA,yBAAA;EACA,yBAAA;EACA,kBAAA;;AAGA,kBAAC;EACC,iBAAA;EACA,eAAA;EACA,kBAAA;;AAEF,kBAAC;EACC,kBAAA;EACA,eAAA;EACA,kBAAA;;AApBJ,kBAwBE,MAAK;AAxBP,kBAyBE,MAAK;EACH,aAAA;;AAKJ,YAAa,cAAa;AAC1B,kBAAkB;AAClB,gBAAgB,YAAa;AAC7B,gBAAgB,YAAa,aAAa;AAC1C,gBAAgB,YAAa;AAC7B,gBAAgB,WAAY,OAAM,IAAI,aAAa,IAAI;AACvD,gBAAgB,WAAY,aAAY,IAAI,aAAc;EZIxD,6BAAA;EACG,0BAAA;;AYFL,kBAAkB;EAChB,eAAA;;AAEF,YAAa,cAAa;AAC1B,kBAAkB;AAClB,gBAAgB,WAAY;AAC5B,gBAAgB,WAAY,aAAa;AACzC,gBAAgB,WAAY;AAC5B,gBAAgB,YAAa,OAAM,IAAI;AACvC,gBAAgB,YAAa,aAAY,IAAI,cAAe;EZA1D,4BAAA;EACG,yBAAA;;AYEL,kBAAkB;EAChB,cAAA;;AAKF;EACE,kBAAA;EAGA,YAAA;EACA,mBAAA;;AALF,gBASE;EACE,kBAAA;;AAVJ,gBASE,OAEE;EACE,iBAAA;;AAGF,gBANF,OAMG;AACD,gBAPF,OAOG;AACD,gBARF,OAQG;EACC,UAAA;;AAKJ,gBAAC,YACC;AADF,gBAAC,YAEC;EACE,kBAAA;;AAGJ,gBAAC,WACC;AADF,gBAAC,WAEC;EACE,iBAAA;;ACjJN;EACE,gBAAA;EACA,eAAA;EACA,gBAAA;;AAHF,IAME;EACE,kBAAA;EACA,cAAA;;AARJ,IAME,KAIE;EACE,kBAAA;EACA,cAAA;EACA,kBAAA;;AACA,IARJ,KAIE,IAIG;AACD,IATJ,KAIE,IAKG;EACC,qBAAA;EACA,yBAAA;;AAKJ,IAhBF,KAgBG,SAAU;EACT,cAAA;;AAEA,IAnBJ,KAgBG,SAAU,IAGR;AACD,IApBJ,KAgBG,SAAU,IAIR;EACC,cAAA;EACA,qBAAA;EACA,6BAAA;EACA,mBAAA;;AAOJ,IADF,MAAM;AAEJ,IAFF,MAAM,IAEH;AACD,IAHF,MAAM,IAGH;EACC,yBAAA;EACA,qBAAA;;AAzCN,IAkDE;EboVA,WAAA;EACA,aAAA;EACA,gBAAA;EACA,yBAAA;;AazYF,IAyDE,KAAK,IAAI;EACP,eAAA;;AASJ;EACE,gCAAA;;AADF,SAEE;EACE,WAAA;EAEA,mBAAA;;AALJ,SAEE,KAME;EACE,iBAAA;EACA,wBAAA;EACA,6BAAA;EACA,0BAAA;;AACA,SAXJ,KAME,IAKG;EACC,qCAAA;;AAMF,SAlBJ,KAiBG,OAAQ;AAEP,SAnBJ,KAiBG,OAAQ,IAEN;AACD,SApBJ,KAiBG,OAAQ,IAGN;EACC,cAAA;EACA,yBAAA;EACA,yBAAA;EACA,gCAAA;EACA,eAAA;;AAKN,SAAC;EAqDD,WAAA;EA8BA,gBAAA;;AAnFA,SAAC,cAuDD;EACE,WAAA;;AAxDF,SAAC,cAuDD,KAEG;EACC,kBAAA;EACA,kBAAA;;AA3DJ,SAAC,cA+DD,YAAY;EACV,SAAA;EACA,UAAA;;AAYJ,QATqC;EASrC,SA7EG,cAqEC;IACE,mBAAA;IACA,SAAA;;EAMN,SA7EG,cAqEC,KAGE;IACE,gBAAA;;;AAzEN,SAAC,cAqFD,KAAK;EAEH,eAAA;EACA,kBAAA;;AAxFF,SAAC,cA2FD,UAAU;AA3FV,SAAC,cA4FD,UAAU,IAAG;AA5Fb,SAAC,cA6FD,UAAU,IAAG;EACX,yBAAA;;AAcJ,QAXqC;EAWrC,SA5GG,cAkGC,KAAK;IACH,gCAAA;IACA,0BAAA;;EAQN,SA5GG,cAsGC,UAAU;EAMd,SA5GG,cAuGC,UAAU,IAAG;EAKjB,SA5GG,cAwGC,UAAU,IAAG;IACX,4BAAA;;;AAhGN,UACE;EACE,WAAA;;AAFJ,UACE,KAIE;EACE,kBAAA;;AANN,UACE,KAOE;EACE,gBAAA;;AAKA,UAbJ,KAYG,OAAQ;AAEP,UAdJ,KAYG,OAAQ,IAEN;AACD,UAfJ,KAYG,OAAQ,IAGN;EACC,cAAA;EACA,yBAAA;;AAQR,YACE;EACE,WAAA;;AAFJ,YACE,KAEE;EACE,eAAA;EACA,cAAA;;AAYN;EACE,WAAA;;AADF,cAGE;EACE,WAAA;;AAJJ,cAGE,KAEG;EACC,kBAAA;EACA,kBAAA;;AAPN,cAWE,YAAY;EACV,SAAA;EACA,UAAA;;AAYJ,QATqC;EASrC,cARI;IACE,mBAAA;IACA,SAAA;;EAMN,cARI,KAGE;IACE,gBAAA;;;AASR;EACE,gBAAA;;AADF,mBAGE,KAAK;EAEH,eAAA;EACA,kBAAA;;AANJ,mBASE,UAAU;AATZ,mBAUE,UAAU,IAAG;AAVf,mBAWE,UAAU,IAAG;EACX,yBAAA;;AAcJ,QAXqC;EAWrC,mBAVI,KAAK;IACH,gCAAA;IACA,0BAAA;;EAQN,mBANI,UAAU;EAMd,mBALI,UAAU,IAAG;EAKjB,mBAJI,UAAU,IAAG;IACX,4BAAA;;;AAUN,YACE;EACE,aAAA;;AAFJ,YAIE;EACE,cAAA;;AASJ,SAAU;EAER,gBAAA;Eb1IA,0BAAA;EACC,yBAAA;;Ac3FH;EACE,kBAAA;EACA,gBAAA;EACA,mBAAA;EACA,6BAAA;;AAQF,QAH6C;EAG7C;IAFI,kBAAA;;;AAgBJ,QAH6C;EAG7C;IAFI,WAAA;;;AAeJ;EACE,iBAAA;EACA,mBAAA;EACA,mBAAA;EACA,kBAAA;EACA,iCAAA;EACA,kDAAA;EAEA,iCAAA;;AAEA,gBAAC;EACC,gBAAA;;AA4BJ,QAzB6C;EAyB7C;IAxBI,WAAA;IACA,aAAA;IACA,gBAAA;;EAEA,gBAAC;IACC,yBAAA;IACA,uBAAA;IACA,iBAAA;IACA,4BAAA;;EAGF,gBAAC;IACC,mBAAA;;EAKF,iBAAkB;EAClB,kBAAmB;EACnB,oBAAqB;IACnB,eAAA;IACA,gBAAA;;;AAUN,UAEE;AADF,gBACE;AAFF,UAGE;AAFF,gBAEE;EACE,mBAAA;EACA,kBAAA;;AAMF,QAJ6C;EAI7C,UATA;EASA,gBATA;EASA,UARA;EAQA,gBARA;IAKI,eAAA;IACA,cAAA;;;AAaN;EACE,aAAA;EACA,qBAAA;;AAKF,QAH6C;EAG7C;IAFI,gBAAA;;;AAKJ;AACA;EACE,eAAA;EACA,QAAA;EACA,OAAA;EACA,aAAA;;AAMF,QAH6C;EAG7C;EAAA;IAFI,gBAAA;;;AAGJ;EACE,MAAA;EACA,qBAAA;;AAEF;EACE,SAAA;EACA,gBAAA;EACA,qBAAA;;AAMF;EACE,WAAA;EACA,kBAAA;EACA,eAAA;EACA,iBAAA;EACA,YAAA;;AAEA,aAAC;AACD,aAAC;EACC,qBAAA;;AASJ,QAN6C;EACzC,OAAQ,aAAa;EACrB,OAAQ,mBAAmB;IACzB,kBAAA;;;AAWN;EACE,kBAAA;EACA,YAAA;EACA,kBAAA;EACA,iBAAA;EdwaA,eAAA;EACA,kBAAA;EcvaA,6BAAA;EACA,sBAAA;EACA,6BAAA;EACA,kBAAA;;AAIA,cAAC;EACC,aAAA;;AAdJ,cAkBE;EACE,cAAA;EACA,WAAA;EACA,WAAA;EACA,kBAAA;;AAtBJ,cAwBE,UAAU;EACR,eAAA;;AAMJ,QAH6C;EAG7C;IAFI,aAAA;;;AAUJ;EACE,mBAAA;;AADF,WAGE,KAAK;EACH,iBAAA;EACA,oBAAA;EACA,iBAAA;;AA2BF,QAxB+C;EAwB/C,WAtBE,MAAM;IACJ,gBAAA;IACA,WAAA;IACA,WAAA;IACA,aAAA;IACA,6BAAA;IACA,SAAA;IACA,gBAAA;;EAeJ,WAtBE,MAAM,eAQJ,KAAK;EAcT,WAtBE,MAAM,eASJ;IACE,0BAAA;;EAYN,WAtBE,MAAM,eAYJ,KAAK;IACH,iBAAA;;EACA,WAdJ,MAAM,eAYJ,KAAK,IAEF;EACD,WAfJ,MAAM,eAYJ,KAAK,IAGF;IACC,sBAAA;;;AAuBV,QAhB6C;EAgB7C;IAfI,WAAA;IACA,SAAA;;EAcJ,WAZI;IACE,WAAA;;EAWN,WAZI,KAEE;IACE,iBAAA;IACA,oBAAA;;EAIJ,WAAC,aAAa;IACZ,mBAAA;;;AAkBN,QAN2C;EACzC;ICnQA,sBAAA;;EDoQA;ICvQA,uBAAA;;;ADgRF;EACE,kBAAA;EACA,mBAAA;EACA,kBAAA;EACA,iCAAA;EACA,oCAAA;Ed1KA,4FAAA;EACQ,oFAAA;EAmeR,eAAA;EACA,kBAAA;;AMhPF,QA7CqC;EA6CrC,YA3CI;IACE,qBAAA;IACA,gBAAA;IACA,sBAAA;;EAwCN,YApCI;IACE,qBAAA;IACA,WAAA;IACA,sBAAA;;EAiCN,YA9BI;IACE,gBAAA;IACA,sBAAA;;EA4BN,YAtBI;EAsBJ,YArBI;IACE,qBAAA;IACA,aAAA;IACA,gBAAA;IACA,eAAA;IACA,sBAAA;;EAgBN,YAdI,OAAO,MAAK;EAchB,YAbI,UAAU,MAAK;IACb,WAAA;IACA,cAAA;;EAWN,YAJI,cAAc;IACZ,MAAA;;;AQ7DJ,QAHiD;EAGjD,YAJA;IAEI,kBAAA;;;AAsBN,QAd6C;EAc7C;IAbI,WAAA;IACA,SAAA;IACA,cAAA;IACA,eAAA;IACA,cAAA;IACA,iBAAA;IdjMF,wBAAA;IACQ,gBAAA;;EcoMN,YAAC,aAAa;IACZ,mBAAA;;;AASN,WAAY,KAAK;EACf,aAAA;EdtOA,0BAAA;EACC,yBAAA;;AcyOH,oBAAqB,YAAY,KAAK;EdlOpC,6BAAA;EACC,4BAAA;;Ac0OH;EduQE,eAAA;EACA,kBAAA;;AcrQA,WAAC;EdoQD,gBAAA;EACA,mBAAA;;AclQA,WAAC;EdiQD,gBAAA;EACA,mBAAA;;AcxPF;EduPE,gBAAA;EACA,mBAAA;;Ac3OF,QAV6C;EAU7C;IATI,WAAA;IACA,iBAAA;IACA,kBAAA;;EAGA,YAAC,aAAa;IACZ,eAAA;;;AASN;EACE,yBAAA;EACA,qBAAA;;AAFF,eAIE;EACE,cAAA;;AACA,eAFF,cAEG;AACD,eAHF,cAGG;EACC,cAAA;EACA,6BAAA;;AATN,eAaE;EACE,cAAA;;AAdJ,eAiBE,YACE,KAAK;EACH,cAAA;;AAEA,eAJJ,YACE,KAAK,IAGF;AACD,eALJ,YACE,KAAK,IAIF;EACC,cAAA;EACA,6BAAA;;AAIF,eAXJ,YAUE,UAAU;AAER,eAZJ,YAUE,UAAU,IAEP;AACD,eAbJ,YAUE,UAAU,IAGP;EACC,cAAA;EACA,yBAAA;;AAIF,eAnBJ,YAkBE,YAAY;AAEV,eApBJ,YAkBE,YAAY,IAET;AACD,eArBJ,YAkBE,YAAY,IAGT;EACC,cAAA;EACA,6BAAA;;AAxCR,eA6CE;EACE,qBAAA;;AACA,eAFF,eAEG;AACD,eAHF,eAGG;EACC,yBAAA;;AAjDN,eA6CE,eAME;EACE,yBAAA;;AApDN,eAwDE;AAxDF,eAyDE;EACE,qBAAA;;AAOE,eAHJ,YAEE,QAAQ;AAEN,eAJJ,YAEE,QAAQ,IAEL;AACD,eALJ,YAEE,QAAQ,IAGL;EACC,yBAAA;EACA,cAAA;;AAiCN,QA7BiD;EA6BjD,eAxCA,YAaI,MAAM,eACJ,KAAK;IACH,cAAA;;EACA,eAhBR,YAaI,MAAM,eACJ,KAAK,IAEF;EACD,eAjBR,YAaI,MAAM,eACJ,KAAK,IAGF;IACC,cAAA;IACA,6BAAA;;EAIF,eAvBR,YAaI,MAAM,eASJ,UAAU;EAER,eAxBR,YAaI,MAAM,eASJ,UAAU,IAEP;EACD,eAzBR,YAaI,MAAM,eASJ,UAAU,IAGP;IACC,cAAA;IACA,yBAAA;;EAIF,eA/BR,YAaI,MAAM,eAiBJ,YAAY;EAEV,eAhCR,YAaI,MAAM,eAiBJ,YAAY,IAET;EACD,eAjCR,YAaI,MAAM,eAiBJ,YAAY,IAGT;IACC,cAAA;IACA,6BAAA;;;AAjGZ,eA6GE;EACE,cAAA;;AACA,eAFF,aAEG;EACC,cAAA;;AAQN;EACE,yBAAA;EACA,qBAAA;;AAFF,eAIE;EACE,cAAA;;AACA,eAFF,cAEG;AACD,eAHF,cAGG;EACC,cAAA;EACA,6BAAA;;AATN,eAaE;EACE,cAAA;;AAdJ,eAiBE,YACE,KAAK;EACH,cAAA;;AAEA,eAJJ,YACE,KAAK,IAGF;AACD,eALJ,YACE,KAAK,IAIF;EACC,cAAA;EACA,6BAAA;;AAIF,eAXJ,YAUE,UAAU;AAER,eAZJ,YAUE,UAAU,IAEP;AACD,eAbJ,YAUE,UAAU,IAGP;EACC,cAAA;EACA,yBAAA;;AAIF,eAnBJ,YAkBE,YAAY;AAEV,eApBJ,YAkBE,YAAY,IAET;AACD,eArBJ,YAkBE,YAAY,IAGT;EACC,cAAA;EACA,6BAAA;;AAxCR,eA8CE;EACE,qBAAA;;AACA,eAFF,eAEG;AACD,eAHF,eAGG;EACC,yBAAA;;AAlDN,eA8CE,eAME;EACE,yBAAA;;AArDN,eAyDE;AAzDF,eA0DE;EACE,qBAAA;;AAME,eAFJ,YACE,QAAQ;AAEN,eAHJ,YACE,QAAQ,IAEL;AACD,eAJJ,YACE,QAAQ,IAGL;EACC,yBAAA;EACA,cAAA;;AAuCN,QAnCiD;EAmCjD,eA7CA,YAYI,MAAM,eACJ;IACE,qBAAA;;EA+BR,eA7CA,YAYI,MAAM,eAIJ;IACE,yBAAA;;EA4BR,eA7CA,YAYI,MAAM,eAOJ,KAAK;IACH,cAAA;;EACA,eArBR,YAYI,MAAM,eAOJ,KAAK,IAEF;EACD,eAtBR,YAYI,MAAM,eAOJ,KAAK,IAGF;IACC,cAAA;IACA,6BAAA;;EAIF,eA5BR,YAYI,MAAM,eAeJ,UAAU;EAER,eA7BR,YAYI,MAAM,eAeJ,UAAU,IAEP;EACD,eA9BR,YAYI,MAAM,eAeJ,UAAU,IAGP;IACC,cAAA;IACA,yBAAA;;EAIF,eApCR,YAYI,MAAM,eAuBJ,YAAY;EAEV,eArCR,YAYI,MAAM,eAuBJ,YAAY,IAET;EACD,eAtCR,YAYI,MAAM,eAuBJ,YAAY,IAGT;IACC,cAAA;IACA,6BAAA;;;AAvGZ,eA8GE;EACE,cAAA;;AACA,eAFF,aAEG;EACC,cAAA;;AE9lBN;EACE,iBAAA;EACA,mBAAA;EACA,gBAAA;EACA,yBAAA;EACA,kBAAA;;AALF,WAOE;EACE,qBAAA;;AARJ,WAOE,KAGE,KAAI;EACF,SAAS,QAAT;EACA,cAAA;EACA,cAAA;;AAbN,WAiBE;EACE,cAAA;;ACpBJ;EACE,qBAAA;EACA,eAAA;EACA,cAAA;EACA,kBAAA;;AAJF,WAME;EACE,eAAA;;AAPJ,WAME,KAEE;AARJ,WAME,KAGE;EACE,kBAAA;EACA,WAAA;EACA,iBAAA;EACA,wBAAA;EACA,qBAAA;EACA,cAAA;EACA,yBAAA;EACA,yBAAA;EACA,iBAAA;;AAEF,WAdF,KAcG,YACC;AADF,WAdF,KAcG,YAEC;EACE,cAAA;EjBsFN,8BAAA;EACG,2BAAA;;AiBnFD,WArBF,KAqBG,WACC;AADF,WArBF,KAqBG,WAEC;EjBwEJ,+BAAA;EACG,4BAAA;;AiBjED,WAFF,KAAK,IAEF;AAAD,WADF,KAAK,OACF;AACD,WAHF,KAAK,IAGF;AAAD,WAFF,KAAK,OAEF;EACC,cAAA;EACA,yBAAA;EACA,qBAAA;;AAMF,WAFF,UAAU;AAER,WADF,UAAU;AAER,WAHF,UAAU,IAGP;AAAD,WAFF,UAAU,OAEP;AACD,WAJF,UAAU,IAIP;AAAD,WAHF,UAAU,OAGP;EACC,UAAA;EACA,cAAA;EACA,yBAAA;EACA,qBAAA;EACA,eAAA;;AAtDN,WA0DE,YACE;AA3DJ,WA0DE,YAEE,OAAM;AA5DV,WA0DE,YAGE,OAAM;AA7DV,WA0DE,YAIE;AA9DJ,WA0DE,YAKE,IAAG;AA/DP,WA0DE,YAME,IAAG;EACD,cAAA;EACA,yBAAA;EACA,qBAAA;EACA,mBAAA;;AASN,cjBsdE,KACE;AiBvdJ,cjBsdE,KAEE;EACE,kBAAA;EACA,eAAA;;AAEF,cANF,KAMG,YACC;AADF,cANF,KAMG,YAEC;EA9bJ,8BAAA;EACG,2BAAA;;AAicD,cAZF,KAYG,WACC;AADF,cAZF,KAYG,WAEC;EA5cJ,+BAAA;EACG,4BAAA;;AiBpBL,cjBidE,KACE;AiBldJ,cjBidE,KAEE;EACE,iBAAA;EACA,eAAA;;AAEF,cANF,KAMG,YACC;AADF,cANF,KAMG,YAEC;EA9bJ,8BAAA;EACG,2BAAA;;AAicD,cAZF,KAYG,WACC;AADF,cAZF,KAYG,WAEC;EA5cJ,+BAAA;EACG,4BAAA;;AkBpGL;EACE,eAAA;EACA,cAAA;EACA,gBAAA;EACA,kBAAA;;AAJF,MAME;EACE,eAAA;;AAPJ,MAME,GAEE;AARJ,MAME,GAGE;EACE,qBAAA;EACA,iBAAA;EACA,yBAAA;EACA,yBAAA;EACA,mBAAA;;AAdN,MAME,GAWE,IAAG;AAjBP,MAME,GAYE,IAAG;EACD,qBAAA;EACA,yBAAA;;AApBN,MAwBE,MACE;AAzBJ,MAwBE,MAEE;EACE,YAAA;;AA3BN,MA+BE,UACE;AAhCJ,MA+BE,UAEE;EACE,WAAA;;AAlCN,MAsCE,UACE;AAvCJ,MAsCE,UAEE,IAAG;AAxCP,MAsCE,UAGE,IAAG;AAzCP,MAsCE,UAIE;EACE,cAAA;EACA,yBAAA;EACA,mBAAA;;AC9CN;EACE,eAAA;EACA,uBAAA;EACA,cAAA;EACA,iBAAA;EACA,cAAA;EACA,cAAA;EACA,kBAAA;EACA,mBAAA;EACA,wBAAA;EACA,oBAAA;;AAIE,MADD,MACE;AACD,MAFD,MAEE;EACC,cAAA;EACA,qBAAA;EACA,eAAA;;AAKJ,MAAC;EACC,aAAA;;AAIF,IAAK;EACH,kBAAA;EACA,SAAA;;AAOJ;EnBqhBE,yBAAA;;AAEE,cADD,MACE;AACD,cAFD,MAEE;EACC,yBAAA;;AmBrhBN;EnBihBE,yBAAA;;AAEE,cADD,MACE;AACD,cAFD,MAEE;EACC,yBAAA;;AmBjhBN;EnB6gBE,yBAAA;;AAEE,cADD,MACE;AACD,cAFD,MAEE;EACC,yBAAA;;AmB7gBN;EnBygBE,yBAAA;;AAEE,WADD,MACE;AACD,WAFD,MAEE;EACC,yBAAA;;AmBzgBN;EnBqgBE,yBAAA;;AAEE,cADD,MACE;AACD,cAFD,MAEE;EACC,yBAAA;;AmBrgBN;EnBigBE,yBAAA;;AAEE,aADD,MACE;AACD,aAFD,MAEE;EACC,yBAAA;;AoB5jBN;EACE,qBAAA;EACA,eAAA;EACA,gBAAA;EACA,eAAA;EACA,iBAAA;EACA,cAAA;EACA,cAAA;EACA,wBAAA;EACA,mBAAA;EACA,kBAAA;EACA,yBAAA;EACA,mBAAA;;AAGA,MAAC;EACC,aAAA;;AAIF,IAAK;EACH,kBAAA;EACA,SAAA;;AAEF,OAAQ;EACN,MAAA;EACA,gBAAA;;AAMF,CADD,MACE;AACD,CAFD,MAEE;EACC,cAAA;EACA,qBAAA;EACA,eAAA;;AAKJ,CAAC,gBAAgB,OAAQ;AACzB,UAAW,UAAU,IAAI;EACvB,cAAA;EACA,yBAAA;;AAEF,UAAW,KAAK,IAAI;EAClB,gBAAA;;AChDF;EACE,aAAA;EACA,mBAAA;EACA,cAAA;EACA,yBAAA;;AAJF,UAME;AANF,UAOE;EACE,cAAA;;AARJ,UAUE;EACE,mBAAA;EACA,eAAA;EACA,gBAAA;;AAGF,UAAW;EACT,kBAAA;;AAjBJ,UAoBE;EACE,eAAA;;AAiBJ,mBAdgD;EAchD;IAbI,iBAAA;IACA,oBAAA;;EAEA,UAAW;IACT,kBAAA;IACA,mBAAA;;EAQN,UALI;EAKJ,UAJI;IACE,eAAA;;;AClCN;EACE,cAAA;EACA,YAAA;EACA,mBAAA;EACA,wBAAA;EACA,yBAAA;EACA,yBAAA;EACA,kBAAA;EtBmHA,wCAAA;EACQ,gCAAA;;AsB3HV,UAUE;AAVF,UAWE,EAAE;EtBgXF,cAAA;EACA,eAAA;EACA,YAAA;EsBhXE,iBAAA;EACA,kBAAA;;AAIF,CAAC,UAAC;AACF,CAAC,UAAC;AACF,CAAC,UAAC;EACA,qBAAA;;AArBJ,UAyBE;EACE,YAAA;EACA,cAAA;;ACzBJ;EACE,aAAA;EACA,mBAAA;EACA,6BAAA;EACA,kBAAA;;AAJF,MAOE;EACE,aAAA;EAEA,cAAA;;AAVJ,MAaE;EACE,iBAAA;;AAdJ,MAkBE;AAlBF,MAmBE;EACE,gBAAA;;AApBJ,MAsBE,IAAI;EACF,eAAA;;AAQJ;EACC,mBAAA;;AADD,kBAIE;EACE,kBAAA;EACA,SAAA;EACA,YAAA;EACA,cAAA;;AAQJ;EvBqXE,yBAAA;EACA,qBAAA;EACA,cAAA;;AuBvXF,cvByXE;EACE,yBAAA;;AuB1XJ,cvB4XE;EACE,cAAA;;AuB1XJ;EvBkXE,yBAAA;EACA,qBAAA;EACA,cAAA;;AuBpXF,WvBsXE;EACE,yBAAA;;AuBvXJ,WvByXE;EACE,cAAA;;AuBvXJ;EvB+WE,yBAAA;EACA,qBAAA;EACA,cAAA;;AuBjXF,cvBmXE;EACE,yBAAA;;AuBpXJ,cvBsXE;EACE,cAAA;;AuBpXJ;EvB4WE,yBAAA;EACA,qBAAA;EACA,cAAA;;AuB9WF,avBgXE;EACE,yBAAA;;AuBjXJ,avBmXE;EACE,cAAA;;AwB3aJ;EACE;IAAQ,2BAAA;;EACR;IAAQ,wBAAA;;;AAIV;EACE;IAAQ,2BAAA;;EACR;IAAQ,wBAAA;;;AASV;EACE,gBAAA;EACA,YAAA;EACA,mBAAA;EACA,yBAAA;EACA,kBAAA;ExB2FA,sDAAA;EACQ,8CAAA;;AwBvFV;EACE,WAAA;EACA,SAAA;EACA,YAAA;EACA,eAAA;EACA,iBAAA;EACA,cAAA;EACA,kBAAA;EACA,yBAAA;ExB8EA,sDAAA;EACQ,8CAAA;EAKR,mCAAA;EACQ,2BAAA;;AwB/EV,iBAAkB;ExBuSd,kBAAkB,2LAAlB;EACA,kBAAkB,mLAAlB;EwBtSF,0BAAA;;AAIF,SAAS,OAAQ;ExBqJf,0DAAA;EACQ,kDAAA;;AwB7IV;ExBoiBE,yBAAA;;AACA,iBAAkB;EA7QhB,kBAAkB,2LAAlB;EACA,kBAAkB,mLAAlB;;AwBrRJ;ExBgiBE,yBAAA;;AACA,iBAAkB;EA7QhB,kBAAkB,2LAAlB;EACA,kBAAkB,mLAAlB;;AwBjRJ;ExB4hBE,yBAAA;;AACA,iBAAkB;EA7QhB,kBAAkB,2LAAlB;EACA,kBAAkB,mLAAlB;;AwB7QJ;ExBwhBE,yBAAA;;AACA,iBAAkB;EA7QhB,kBAAkB,2LAAlB;EACA,kBAAkB,mLAAlB;;AyBjVJ;AACA;EACE,gBAAA;EACA,OAAA;;AAIF;AACA,MAAO;EACL,gBAAA;;AAEF,MAAM;EACJ,aAAA;;AAIF;EACE,cAAA;;AAIF;EACE,eAAA;;AAOF,MACE;EACE,kBAAA;;AAFJ,MAIE;EACE,iBAAA;;AASJ;EACE,eAAA;EACA,gBAAA;;AC7CF;EAEE,mBAAA;EACA,eAAA;;AAQF;EACE,kBAAA;EACA,cAAA;EACA,kBAAA;EAEA,mBAAA;EACA,yBAAA;EACA,yBAAA;;AAGA,gBAAC;E1BsED,4BAAA;EACC,2BAAA;;A0BpED,gBAAC;EACC,gBAAA;E1B0EF,+BAAA;EACC,8BAAA;;A0BzFH,gBAmBE;EACE,YAAA;;AApBJ,gBAsBE,SAAS;EACP,iBAAA;;AAUJ,CAAC;EACC,cAAA;;AADF,CAAC,gBAGC;EACE,cAAA;;AAIF,CARD,gBAQE;AACD,CATD,gBASE;EACC,qBAAA;EACA,yBAAA;;AAIF,CAfD,gBAeE;AACD,CAhBD,gBAgBE,OAAO;AACR,CAjBD,gBAiBE,OAAO;EACN,UAAA;EACA,cAAA;EACA,yBAAA;EACA,qBAAA;;AANF,CAfD,gBAeE,OASC;AARF,CAhBD,gBAgBE,OAAO,MAQN;AAPF,CAjBD,gBAiBE,OAAO,MAON;EACE,cAAA;;AAVJ,CAfD,gBAeE,OAYC;AAXF,CAhBD,gBAgBE,OAAO,MAWN;AAVF,CAjBD,gBAiBE,OAAO,MAUN;EACE,cAAA;;A1BsYJ,iBAAiB;EACf,cAAA;EACA,yBAAA;;AAEA,CAAC,iBAJc;EAKb,cAAA;;AADF,CAAC,iBAJc,OAOb;EAA2B,cAAA;;AAE3B,CALD,iBAJc,OASZ;AACD,CAND,iBAJc,OAUZ;EACC,cAAA;EACA,yBAAA;;AAEF,CAVD,iBAJc,OAcZ;AACD,CAXD,iBAJc,OAeZ,OAAO;AACR,CAZD,iBAJc,OAgBZ,OAAO;EACN,WAAA;EACA,yBAAA;EACA,qBAAA;;AAnBN,iBAAiB;EACf,cAAA;EACA,yBAAA;;AAEA,CAAC,iBAJc;EAKb,cAAA;;AADF,CAAC,iBAJc,IAOb;EAA2B,cAAA;;AAE3B,CALD,iBAJc,IASZ;AACD,CAND,iBAJc,IAUZ;EACC,cAAA;EACA,yBAAA;;AAEF,CAVD,iBAJc,IAcZ;AACD,CAXD,iBAJc,IAeZ,OAAO;AACR,CAZD,iBAJc,IAgBZ,OAAO;EACN,WAAA;EACA,yBAAA;EACA,qBAAA;;AAnBN,iBAAiB;EACf,cAAA;EACA,yBAAA;;AAEA,CAAC,iBAJc;EAKb,cAAA;;AADF,CAAC,iBAJc,OAOb;EAA2B,cAAA;;AAE3B,CALD,iBAJc,OASZ;AACD,CAND,iBAJc,OAUZ;EACC,cAAA;EACA,yBAAA;;AAEF,CAVD,iBAJc,OAcZ;AACD,CAXD,iBAJc,OAeZ,OAAO;AACR,CAZD,iBAJc,OAgBZ,OAAO;EACN,WAAA;EACA,yBAAA;EACA,qBAAA;;AAnBN,iBAAiB;EACf,cAAA;EACA,yBAAA;;AAEA,CAAC,iBAJc;EAKb,cAAA;;AADF,CAAC,iBAJc,MAOb;EAA2B,cAAA;;AAE3B,CALD,iBAJc,MASZ;AACD,CAND,iBAJc,MAUZ;EACC,cAAA;EACA,yBAAA;;AAEF,CAVD,iBAJc,MAcZ;AACD,CAXD,iBAJc,MAeZ,OAAO;AACR,CAZD,iBAJc,MAgBZ,OAAO;EACN,WAAA;EACA,yBAAA;EACA,qBAAA;;A0BpYR;EACE,aAAA;EACA,kBAAA;;AAEF;EACE,gBAAA;EACA,gBAAA;;ACtGF;EACE,mBAAA;EACA,yBAAA;EACA,6BAAA;EACA,kBAAA;E3BgHA,iDAAA;EACQ,yCAAA;;A2B5GV;EACE,aAAA;;AAUF,MACE;EACE,gBAAA;;AAFJ,MACE,cAEE;EACE,mBAAA;EACA,gBAAA;;AACA,MALJ,cAEE,iBAGG;EACC,aAAA;;AAEF,MARJ,cAEE,iBAMG;EACC,gBAAA;;AAIJ,MAbF,cAaG,YACC,iBAAgB;E3B2DpB,4BAAA;EACC,2BAAA;;A2BvDC,MAnBF,cAmBG,WACC,iBAAgB;E3B6DpB,+BAAA;EACC,8BAAA;;A2BvDH,cAAe,cACb,iBAAgB;EACd,mBAAA;;AAUJ,MACE;AADF,MAEE,oBAAoB;EAClB,gBAAA;;AAHJ,MAME,SAAQ,YAEN,QAAO,YAEL,KAAI,YACF,GAAE;AAXV,MAOE,oBAAmB,YAAa,SAAQ,YACtC,QAAO,YAEL,KAAI,YACF,GAAE;AAXV,MAME,SAAQ,YAGN,QAAO,YACL,KAAI,YACF,GAAE;AAXV,MAOE,oBAAmB,YAAa,SAAQ,YAEtC,QAAO,YACL,KAAI,YACF,GAAE;AAXV,MAME,SAAQ,YAEN,QAAO,YAEL,KAAI,YAEF,GAAE;AAZV,MAOE,oBAAmB,YAAa,SAAQ,YACtC,QAAO,YAEL,KAAI,YAEF,GAAE;AAZV,MAME,SAAQ,YAGN,QAAO,YACL,KAAI,YAEF,GAAE;AAZV,MAOE,oBAAmB,YAAa,SAAQ,YAEtC,QAAO,YACL,KAAI,YAEF,GAAE;EACA,2BAAA;;AAbV,MAME,SAAQ,YAEN,QAAO,YAEL,KAAI,YAKF,GAAE;AAfV,MAOE,oBAAmB,YAAa,SAAQ,YACtC,QAAO,YAEL,KAAI,YAKF,GAAE;AAfV,MAME,SAAQ,YAGN,QAAO,YACL,KAAI,YAKF,GAAE;AAfV,MAOE,oBAAmB,YAAa,SAAQ,YAEtC,QAAO,YACL,KAAI,YAKF,GAAE;AAfV,MAME,SAAQ,YAEN,QAAO,YAEL,KAAI,YAMF,GAAE;AAhBV,MAOE,oBAAmB,YAAa,SAAQ,YACtC,QAAO,YAEL,KAAI,YAMF,GAAE;AAhBV,MAME,SAAQ,YAGN,QAAO,YACL,KAAI,YAMF,GAAE;AAhBV,MAOE,oBAAmB,YAAa,SAAQ,YAEtC,QAAO,YACL,KAAI,YAMF,GAAE;EACA,4BAAA;;AAjBV,MAuBE,SAAQ,WAEN,QAAO,WAEL,KAAI,WACF,GAAE;AA5BV,MAwBE,oBAAmB,WAAY,SAAQ,WACrC,QAAO,WAEL,KAAI,WACF,GAAE;AA5BV,MAuBE,SAAQ,WAGN,QAAO,WACL,KAAI,WACF,GAAE;AA5BV,MAwBE,oBAAmB,WAAY,SAAQ,WAErC,QAAO,WACL,KAAI,WACF,GAAE;AA5BV,MAuBE,SAAQ,WAEN,QAAO,WAEL,KAAI,WAEF,GAAE;AA7BV,MAwBE,oBAAmB,WAAY,SAAQ,WACrC,QAAO,WAEL,KAAI,WAEF,GAAE;AA7BV,MAuBE,SAAQ,WAGN,QAAO,WACL,KAAI,WAEF,GAAE;AA7BV,MAwBE,oBAAmB,WAAY,SAAQ,WAErC,QAAO,WACL,KAAI,WAEF,GAAE;EACA,8BAAA;;AA9BV,MAuBE,SAAQ,WAEN,QAAO,WAEL,KAAI,WAKF,GAAE;AAhCV,MAwBE,oBAAmB,WAAY,SAAQ,WACrC,QAAO,WAEL,KAAI,WAKF,GAAE;AAhCV,MAuBE,SAAQ,WAGN,QAAO,WACL,KAAI,WAKF,GAAE;AAhCV,MAwBE,oBAAmB,WAAY,SAAQ,WAErC,QAAO,WACL,KAAI,WAKF,GAAE;AAhCV,MAuBE,SAAQ,WAEN,QAAO,WAEL,KAAI,WAMF,GAAE;AAjCV,MAwBE,oBAAmB,WAAY,SAAQ,WACrC,QAAO,WAEL,KAAI,WAMF,GAAE;AAjCV,MAuBE,SAAQ,WAGN,QAAO,WACL,KAAI,WAMF,GAAE;AAjCV,MAwBE,oBAAmB,WAAY,SAAQ,WAErC,QAAO,WACL,KAAI,WAMF,GAAE;EACA,+BAAA;;AAlCV,MAuCE,cAAc;AAvChB,MAwCE,cAAc;EACZ,6BAAA;;AAzCJ,MA2CE,SAAS,QAAO,YAAa,KAAI,YAAa;AA3ChD,MA4CE,SAAS,QAAO,YAAa,KAAI,YAAa;EAC5C,aAAA;;AA7CJ,MA+CE;AA/CF,MAgDE,oBAAoB;EAClB,SAAA;;AAjDJ,MA+CE,kBAGE,QAGE,KACE,KAAI;AAtDZ,MAgDE,oBAAoB,kBAElB,QAGE,KACE,KAAI;AAtDZ,MA+CE,kBAIE,QAEE,KACE,KAAI;AAtDZ,MAgDE,oBAAoB,kBAGlB,QAEE,KACE,KAAI;AAtDZ,MA+CE,kBAKE,QACE,KACE,KAAI;AAtDZ,MAgDE,oBAAoB,kBAIlB,QACE,KACE,KAAI;AAtDZ,MA+CE,kBAGE,QAGE,KAEE,KAAI;AAvDZ,MAgDE,oBAAoB,kBAElB,QAGE,KAEE,KAAI;AAvDZ,MA+CE,kBAIE,QAEE,KAEE,KAAI;AAvDZ,MAgDE,oBAAoB,kBAGlB,QAEE,KAEE,KAAI;AAvDZ,MA+CE,kBAKE,QACE,KAEE,KAAI;AAvDZ,MAgDE,oBAAoB,kBAIlB,QACE,KAEE,KAAI;EACF,cAAA;;AAxDV,MA+CE,kBAGE,QAGE,KAKE,KAAI;AA1DZ,MAgDE,oBAAoB,kBAElB,QAGE,KAKE,KAAI;AA1DZ,MA+CE,kBAIE,QAEE,KAKE,KAAI;AA1DZ,MAgDE,oBAAoB,kBAGlB,QAEE,KAKE,KAAI;AA1DZ,MA+CE,kBAKE,QACE,KAKE,KAAI;AA1DZ,MAgDE,oBAAoB,kBAIlB,QACE,KAKE,KAAI;AA1DZ,MA+CE,kBAGE,QAGE,KAME,KAAI;AA3DZ,MAgDE,oBAAoB,kBAElB,QAGE,KAME,KAAI;AA3DZ,MA+CE,kBAIE,QAEE,KAME,KAAI;AA3DZ,MAgDE,oBAAoB,kBAGlB,QAEE,KAME,KAAI;AA3DZ,MA+CE,kBAKE,QACE,KAME,KAAI;AA3DZ,MAgDE,oBAAoB,kBAIlB,QACE,KAME,KAAI;EACF,eAAA;;AAEF,MAfN,kBAGE,QAGE,KASG,YAAa;AAAd,MAdN,oBAAoB,kBAElB,QAGE,KASG,YAAa;AAAd,MAfN,kBAIE,QAEE,KASG,YAAa;AAAd,MAdN,oBAAoB,kBAGlB,QAEE,KASG,YAAa;AAAd,MAfN,kBAKE,QACE,KASG,YAAa;AAAd,MAdN,oBAAoB,kBAIlB,QACE,KASG,YAAa;AACd,MAhBN,kBAGE,QAGE,KAUG,YAAa;AAAd,MAfN,oBAAoB,kBAElB,QAGE,KAUG,YAAa;AAAd,MAhBN,kBAIE,QAEE,KAUG,YAAa;AAAd,MAfN,oBAAoB,kBAGlB,QAEE,KAUG,YAAa;AAAd,MAhBN,kBAKE,QACE,KAUG,YAAa;AAAd,MAfN,oBAAoB,kBAIlB,QACE,KAUG,YAAa;EACZ,aAAA;;AAEF,MAnBN,kBAGE,QAGE,KAaG,WAAY;AAAb,MAlBN,oBAAoB,kBAElB,QAGE,KAaG,WAAY;AAAb,MAnBN,kBAIE,QAEE,KAaG,WAAY;AAAb,MAlBN,oBAAoB,kBAGlB,QAEE,KAaG,WAAY;AAAb,MAnBN,kBAKE,QACE,KAaG,WAAY;AAAb,MAlBN,oBAAoB,kBAIlB,QACE,KAaG,WAAY;AACb,MApBN,kBAGE,QAGE,KAcG,WAAY;AAAb,MAnBN,oBAAoB,kBAElB,QAGE,KAcG,WAAY;AAAb,MApBN,kBAIE,QAEE,KAcG,WAAY;AAAb,MAnBN,oBAAoB,kBAGlB,QAEE,KAcG,WAAY;AAAb,MApBN,kBAKE,QACE,KAcG,WAAY;AAAb,MAnBN,oBAAoB,kBAIlB,QACE,KAcG,WAAY;EACX,gBAAA;;AApEV,MAyEE;EACE,SAAA;EACA,gBAAA;;AAMJ;EACE,kBAAA;EACA,oCAAA;E3BjDA,4BAAA;EACC,2BAAA;;A2B8CH,cAKE,YAAY;EACV,cAAA;;AAKJ;EACE,aAAA;EACA,gBAAA;EACA,eAAA;EACA,cAAA;;AAJF,YAME;EACE,cAAA;;AAKJ;EACE,kBAAA;EACA,yBAAA;EACA,6BAAA;E3BjEA,+BAAA;EACC,8BAAA;;A2B0EH;EACE,mBAAA;;AADF,YAIE;EACE,gBAAA;EACA,kBAAA;EACA,gBAAA;;AAPJ,YAIE,OAIE;EACE,eAAA;;AATN,YAaE;EACE,gBAAA;;AAdJ,YAaE,eAEE,kBAAkB;EAChB,6BAAA;;AAhBN,YAmBE;EACE,aAAA;;AApBJ,YAmBE,cAEE,kBAAkB;EAChB,gCAAA;;AAON;E3BmME,qBAAA;;AAEA,cAAE;EACA,cAAA;EACA,yBAAA;EACA,qBAAA;;AAHF,cAAE,iBAKA,kBAAkB;EAChB,yBAAA;;AAGJ,cAAE,gBACA,kBAAkB;EAChB,4BAAA;;A2B7MN;E3BgME,qBAAA;;AAEA,cAAE;EACA,cAAA;EACA,yBAAA;EACA,qBAAA;;AAHF,cAAE,iBAKA,kBAAkB;EAChB,yBAAA;;AAGJ,cAAE,gBACA,kBAAkB;EAChB,4BAAA;;A2B1MN;E3B6LE,qBAAA;;AAEA,cAAE;EACA,cAAA;EACA,yBAAA;EACA,qBAAA;;AAHF,cAAE,iBAKA,kBAAkB;EAChB,yBAAA;;AAGJ,cAAE,gBACA,kBAAkB;EAChB,4BAAA;;A2BvMN;E3B0LE,qBAAA;;AAEA,WAAE;EACA,cAAA;EACA,yBAAA;EACA,qBAAA;;AAHF,WAAE,iBAKA,kBAAkB;EAChB,yBAAA;;AAGJ,WAAE,gBACA,kBAAkB;EAChB,4BAAA;;A2BpMN;E3BuLE,qBAAA;;AAEA,cAAE;EACA,cAAA;EACA,yBAAA;EACA,qBAAA;;AAHF,cAAE,iBAKA,kBAAkB;EAChB,yBAAA;;AAGJ,cAAE,gBACA,kBAAkB;EAChB,4BAAA;;A2BjMN;E3BoLE,qBAAA;;AAEA,aAAE;EACA,cAAA;EACA,yBAAA;EACA,qBAAA;;AAHF,aAAE,iBAKA,kBAAkB;EAChB,yBAAA;;AAGJ,aAAE,gBACA,kBAAkB;EAChB,4BAAA;;A4B9ZN;EACE,gBAAA;EACA,aAAA;EACA,mBAAA;EACA,yBAAA;EACA,yBAAA;EACA,kBAAA;E5B8GA,uDAAA;EACQ,+CAAA;;A4BrHV,KAQE;EACE,kBAAA;EACA,iCAAA;;AAKJ;EACE,aAAA;EACA,kBAAA;;AAEF;EACE,YAAA;EACA,kBAAA;;ACtBF;EACE,YAAA;EACA,eAAA;EACA,iBAAA;EACA,cAAA;EACA,cAAA;EACA,4BAAA;E7BoRA,YAAA;EAGA,yBAAA;;A6BpRA,MAAC;AACD,MAAC;EACC,cAAA;EACA,qBAAA;EACA,eAAA;E7B6QF,YAAA;EAGA,yBAAA;;A6BzQA,MAAM;EACJ,UAAA;EACA,eAAA;EACA,uBAAA;EACA,SAAA;EACA,wBAAA;;ACpBJ;EACE,gBAAA;;AAIF;EACE,aAAA;EACA,cAAA;EACA,kBAAA;EACA,eAAA;EACA,MAAA;EACA,QAAA;EACA,SAAA;EACA,OAAA;EACA,aAAA;EACA,iCAAA;EAIA,UAAA;;AAGA,MAAC,KAAM;E9BkIP,mBAAmB,kBAAnB;EACI,eAAe,kBAAf;EACI,WAAW,kBAAX;EApBR,mDAAA;EACG,6CAAA;EACE,yCAAA;EACG,mCAAA;;A8B/GR,MAAC,GAAI;E9B8HL,mBAAmB,eAAnB;EACI,eAAe,eAAf;EACI,WAAW,eAAX;;A8B5HV;EACE,kBAAA;EACA,WAAA;EACA,YAAA;;AAIF;EACE,kBAAA;EACA,yBAAA;EACA,yBAAA;EACA,oCAAA;EACA,kBAAA;E9BsEA,gDAAA;EACQ,wCAAA;E8BrER,4BAAA;EAEA,aAAA;;AAIF;EACE,eAAA;EACA,MAAA;EACA,QAAA;EACA,SAAA;EACA,OAAA;EACA,aAAA;EACA,yBAAA;;AAEA,eAAC;E9B0ND,UAAA;EAGA,wBAAA;;A8B5NA,eAAC;E9ByND,YAAA;EAGA,yBAAA;;A8BvNF;EACE,aAAA;EACA,gCAAA;EACA,0BAAA;;AAGF,aAAc;EACZ,gBAAA;;AAIF;EACE,SAAA;EACA,wBAAA;;AAKF;EACE,kBAAA;EACA,aAAA;;AAIF;EACE,gBAAA;EACA,uBAAA;EACA,iBAAA;EACA,6BAAA;;AAJF,aAQE,KAAK;EACH,gBAAA;EACA,gBAAA;;AAVJ,aAaE,WAAW,KAAK;EACd,iBAAA;;AAdJ,aAiBE,WAAW;EACT,cAAA;;AAqBJ,QAhBmC;EAGjC;IACE,YAAA;IACA,iBAAA;;EAEF;I9BPA,iDAAA;IACQ,yCAAA;;E8BWR;IAAY,YAAA;;EACZ;IAAY,YAAA;;;ACjId;EACE,kBAAA;EACA,aAAA;EACA,cAAA;EACA,mBAAA;EACA,eAAA;EACA,gBAAA;E/BmRA,UAAA;EAGA,wBAAA;;A+BnRA,QAAC;E/BgRD,YAAA;EAGA,yBAAA;;A+BlRA,QAAC;EAAU,gBAAA;EAAmB,cAAA;;AAC9B,QAAC;EAAU,gBAAA;EAAmB,cAAA;;AAC9B,QAAC;EAAU,eAAA;EAAmB,cAAA;;AAC9B,QAAC;EAAU,iBAAA;EAAmB,cAAA;;AAIhC;EACE,gBAAA;EACA,gBAAA;EACA,cAAA;EACA,kBAAA;EACA,qBAAA;EACA,yBAAA;EACA,kBAAA;;AAIF;EACE,kBAAA;EACA,QAAA;EACA,SAAA;EACA,yBAAA;EACA,mBAAA;;AAGA,QAAC,IAAK;EACJ,SAAA;EACA,SAAA;EACA,iBAAA;EACA,uBAAA;EACA,yBAAA;;AAEF,QAAC,SAAU;EACT,SAAA;EACA,SAAA;EACA,uBAAA;EACA,yBAAA;;AAEF,QAAC,UAAW;EACV,SAAA;EACA,UAAA;EACA,uBAAA;EACA,yBAAA;;AAEF,QAAC,MAAO;EACN,QAAA;EACA,OAAA;EACA,gBAAA;EACA,2BAAA;EACA,2BAAA;;AAEF,QAAC,KAAM;EACL,QAAA;EACA,QAAA;EACA,gBAAA;EACA,2BAAA;EACA,0BAAA;;AAEF,QAAC,OAAQ;EACP,MAAA;EACA,SAAA;EACA,iBAAA;EACA,uBAAA;EACA,4BAAA;;AAEF,QAAC,YAAa;EACZ,MAAA;EACA,SAAA;EACA,uBAAA;EACA,4BAAA;;AAEF,QAAC,aAAc;EACb,MAAA;EACA,UAAA;EACA,uBAAA;EACA,4BAAA;;ACvFJ;EACE,kBAAA;EACA,MAAA;EACA,OAAA;EACA,aAAA;EACA,aAAA;EACA,gBAAA;EACA,YAAA;EACA,gBAAA;EACA,yBAAA;EACA,4BAAA;EACA,yBAAA;EACA,oCAAA;EACA,kBAAA;EhCwGA,iDAAA;EACQ,yCAAA;EgCrGR,mBAAA;;AAGA,QAAC;EAAW,iBAAA;;AACZ,QAAC;EAAW,iBAAA;;AACZ,QAAC;EAAW,gBAAA;;AACZ,QAAC;EAAW,kBAAA;;AAGd;EACE,SAAA;EACA,iBAAA;EACA,eAAA;EACA,mBAAA;EACA,iBAAA;EACA,yBAAA;EACA,gCAAA;EACA,0BAAA;;AAGF;EACE,iBAAA;;AAQA,QADO;AAEP,QAFO,OAEN;EACC,kBAAA;EACA,cAAA;EACA,QAAA;EACA,SAAA;EACA,yBAAA;EACA,mBAAA;;AAGJ,QAAS;EACP,kBAAA;;AAEF,QAAS,OAAM;EACb,kBAAA;EACA,SAAS,EAAT;;AAIA,QAAC,IAAK;EACJ,SAAA;EACA,kBAAA;EACA,sBAAA;EACA,yBAAA;EACA,qCAAA;EACA,aAAA;;AACA,QAPD,IAAK,OAOH;EACC,SAAS,GAAT;EACA,WAAA;EACA,kBAAA;EACA,sBAAA;EACA,yBAAA;;AAGJ,QAAC,MAAO;EACN,QAAA;EACA,WAAA;EACA,iBAAA;EACA,oBAAA;EACA,2BAAA;EACA,uCAAA;;AACA,QAPD,MAAO,OAOL;EACC,SAAS,GAAT;EACA,SAAA;EACA,aAAA;EACA,oBAAA;EACA,2BAAA;;AAGJ,QAAC,OAAQ;EACP,SAAA;EACA,kBAAA;EACA,mBAAA;EACA,4BAAA;EACA,wCAAA;EACA,UAAA;;AACA,QAPD,OAAQ,OAON;EACC,SAAS,GAAT;EACA,QAAA;EACA,kBAAA;EACA,mBAAA;EACA,4BAAA;;AAIJ,QAAC,KAAM;EACL,QAAA;EACA,YAAA;EACA,iBAAA;EACA,qBAAA;EACA,0BAAA;EACA,sCAAA;;AACA,QAPD,KAAM,OAOJ;EACC,SAAS,GAAT;EACA,UAAA;EACA,qBAAA;EACA,0BAAA;EACA,aAAA;;AC1HN;EACE,kBAAA;;AAGF;EACE,kBAAA;EACA,gBAAA;EACA,WAAA;;AAHF,eAKE;EACE,aAAA;EACA,kBAAA;EjC+GF,yCAAA;EACQ,iCAAA;;AiCvHV,eAKE,QAME;AAXJ,eAKE,QAOE,IAAI;EjC2WN,cAAA;EACA,eAAA;EACA,YAAA;EiC3WI,cAAA;;AAdN,eAkBE;AAlBF,eAmBE;AAnBF,eAoBE;EAAU,cAAA;;AApBZ,eAsBE;EACE,OAAA;;AAvBJ,eA0BE;AA1BF,eA2BE;EACE,kBAAA;EACA,MAAA;EACA,WAAA;;AA9BJ,eAiCE;EACE,UAAA;;AAlCJ,eAoCE;EACE,WAAA;;AArCJ,eAuCE,QAAO;AAvCT,eAwCE,QAAO;EACL,OAAA;;AAzCJ,eA4CE,UAAS;EACP,WAAA;;AA7CJ,eA+CE,UAAS;EACP,UAAA;;AAQJ;EACE,kBAAA;EACA,MAAA;EACA,OAAA;EACA,SAAA;EACA,UAAA;EjCwNA,YAAA;EAGA,yBAAA;EiCzNA,eAAA;EACA,cAAA;EACA,kBAAA;EACA,yCAAA;;AAKA,iBAAC;EjCgOC,kBAAkB,8BAA8B,mCAAyC,uCAAzF;EACA,kBAAmB,4EAAnB;EACA,2BAAA;EACA,sHAAA;;AiChOF,iBAAC;EACC,UAAA;EACA,QAAA;EjC2NA,kBAAkB,8BAA8B,sCAAyC,oCAAzF;EACA,kBAAmB,4EAAnB;EACA,2BAAA;EACA,sHAAA;;AiCzNF,iBAAC;AACD,iBAAC;EACC,aAAA;EACA,cAAA;EACA,qBAAA;EjCgMF,YAAA;EAGA,yBAAA;;AiChOF,iBAkCE;AAlCF,iBAmCE;AAnCF,iBAoCE;AApCF,iBAqCE;EACE,kBAAA;EACA,QAAA;EACA,UAAA;EACA,qBAAA;;AAzCJ,iBA2CE;AA3CF,iBA4CE;EACE,SAAA;;AA7CJ,iBA+CE;AA/CF,iBAgDE;EACE,UAAA;;AAjDJ,iBAmDE;AAnDF,iBAoDE;EACE,WAAA;EACA,YAAA;EACA,iBAAA;EACA,kBAAA;EACA,kBAAA;;AAIA,iBADF,WACG;EACC,SAAS,OAAT;;AAIF,iBADF,WACG;EACC,SAAS,OAAT;;AAUN;EACE,kBAAA;EACA,YAAA;EACA,SAAA;EACA,WAAA;EACA,UAAA;EACA,iBAAA;EACA,eAAA;EACA,gBAAA;EACA,kBAAA;;AATF,oBAWE;EACE,qBAAA;EACA,WAAA;EACA,YAAA;EACA,WAAA;EACA,mBAAA;EACA,yBAAA;EACA,mBAAA;EACA,eAAA;EAUA,yBAAA;EACA,kCAAA;;AA9BJ,oBAgCE;EACE,SAAA;EACA,WAAA;EACA,YAAA;EACA,yBAAA;;AAOJ;EACE,kBAAA;EACA,SAAA;EACA,UAAA;EACA,YAAA;EACA,WAAA;EACA,iBAAA;EACA,oBAAA;EACA,cAAA;EACA,kBAAA;EACA,yCAAA;;AACA,iBAAE;EACA,iBAAA;;AAkCJ,mBA5B8C;EAG5C,iBACE;EADF,iBAEE;EAFF,iBAGE;EAHF,iBAIE;IACE,WAAA;IACA,YAAA;IACA,iBAAA;IACA,kBAAA;IACA,eAAA;;EAKJ;IACE,SAAA;IACA,UAAA;IACA,oBAAA;;EAIF;IACE,YAAA;;;AjClNF,SAAC;AACD,SAAC;AIXH,UJUG;AIVH,UJWG;AISH,gBJVG;AIUH,gBJTG;AIkBH,IJnBG;AImBH,IJlBG;AMmWH,gBAoBE,YNxXC;AMoWH,gBAoBE,YNvXC;AWkBH,YXnBG;AWmBH,YXlBG;AW8HH,mBAWE,aX1IC;AW+HH,mBAWE,aXzIC;AaZH,IbWG;AaXH,IbYG;AcVH,OdSG;AcTH,OdUG;AcUH,cdXG;AcWH,cdVG;Ac6BH,gBd9BG;Ac8BH,gBd7BG;AkBfH,MlBcG;AkBdH,MlBeG;A2BLH,W3BIG;A2BJH,W3BKG;A8B+EH,a9BhFG;A8BgFH,a9B/EG;EACC,SAAS,GAAT;EACA,cAAA;;AAEF,SAAC;AIfH,UJeG;AIKH,gBJLG;AIcH,IJdG;AM+VH,gBAoBE,YNnXC;AWcH,YXdG;AW0HH,mBAWE,aXrIC;AahBH,IbgBG;AcdH,OdcG;AcMH,cdNG;AcyBH,gBdzBG;AkBnBH,MlBmBG;A2BTH,W3BSG;A8B2EH,a9B3EG;EACC,WAAA;;AedJ;Ef6BE,cAAA;EACA,iBAAA;EACA,kBAAA;;Ae5BF;EACE,uBAAA;;AAEF;EACE,sBAAA;;AAQF;EACE,wBAAA;;AAEF;EACE,yBAAA;;AAEF;EACE,kBAAA;;AAEF;Ef+CE,WAAA;EACA,kBAAA;EACA,iBAAA;EACA,6BAAA;EACA,SAAA;;Ae1CF;EACE,wBAAA;EACA,6BAAA;;AAOF;EACE,eAAA;;AmBnCF;EACE,mBAAA;;AlCmmBE;AACF,EAAE;AACF,EAAE;AACF,EAAE;EAAI,wBAAA;;AkC3lBR,QAHqC;EAGrC;IlCglBE,yBAAA;;EACA,KAAK;IAAK,cAAA;;EACV,EAAE;IAAQ,kBAAA;;EACV,EAAE;EACF,EAAE;IAAQ,mBAAA;;;AAIR;AACF,EAAE;AACF,EAAE;AACF,EAAE;EAAI,wBAAA;;AkCplBR,QAHqC,uBAAgC;EAGrE;IlCykBE,yBAAA;;EACA,KAAK;IAAK,cAAA;;EACV,EAAE;IAAQ,kBAAA;;EACV,EAAE;EACF,EAAE;IAAQ,mBAAA;;;AAIR;AACF,EAAE;AACF,EAAE;AACF,EAAE;EAAI,wBAAA;;AkC7kBR,QAHqC,uBAAgC;EAGrE;IlCkkBE,yBAAA;;EACA,KAAK;IAAK,cAAA;;EACV,EAAE;IAAQ,kBAAA;;EACV,EAAE;EACF,EAAE;IAAQ,mBAAA;;;AAIR;AACF,EAAE;AACF,EAAE;AACF,EAAE;EAAI,wBAAA;;AkCtkBR,QAHqC;EAGrC;IlC2jBE,yBAAA;;EACA,KAAK;IAAK,cAAA;;EACV,EAAE;IAAQ,kBAAA;;EACV,EAAE;EACF,EAAE;IAAQ,mBAAA;;;AkCzjBZ,QAHqC;ElCgkBjC;EACF,EAAE;EACF,EAAE;EACF,EAAE;IAAI,wBAAA;;;AkC3jBR,QAHqC,uBAAgC;ElC2jBjE;EACF,EAAE;EACF,EAAE;EACF,EAAE;IAAI,wBAAA;;;AkCtjBR,QAHqC,uBAAgC;ElCsjBjE;EACF,EAAE;EACF,EAAE;EACF,EAAE;IAAI,wBAAA;;;AkCjjBR,QAHqC;ElCijBjC;EACF,EAAE;EACF,EAAE;EACF,EAAE;IAAI,wBAAA;;;AAHJ;AACF,EAAE;AACF,EAAE;AACF,EAAE;EAAI,wBAAA;;AkCpiBR;EAAA;IlCyhBE,yBAAA;;EACA,KAAK;IAAK,cAAA;;EACV,EAAE;IAAQ,kBAAA;;EACV,EAAE;EACF,EAAE;IAAQ,mBAAA;;;AkCvhBZ;ElC2hBI;EACF,EAAE;EACF,EAAE;EACF,EAAE;IAAI,wBAAA","sourcesContent":["/*! normalize.css v3.0.0 | MIT License | git.io/normalize */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS text size adjust after orientation change, without disabling\n// user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined in IE 8/9.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9.\n// Hide the `template` element in IE, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background: transparent;\n}\n\n//\n// Improve readability when focused and also mouse hovered in all browsers.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9, Safari 5, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari 5 and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari 5, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow displayed oddly in IE 9.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari 5.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8+, and Opera\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome\n// (include `-moz` to future-proof).\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n -moz-box-sizing: content-box;\n -webkit-box-sizing: content-box; // 2\n box-sizing: content-box;\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}","//\n// Basic print styles\n// --------------------------------------------------\n// Source: https://github.com/h5bp/html5-boilerplate/blob/master/css/main.css\n\n@media print {\n\n * {\n text-shadow: none !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n background: transparent !important;\n box-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links for images, or javascript/internal links\n a[href^=\"javascript:\"]:after,\n a[href^=\"#\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Chrome (OSX) fix for https://github.com/twbs/bootstrap/issues/11245\n // Once fixed, we can just straight up remove this.\n select {\n background: #fff !important;\n }\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .table {\n td,\n th {\n background-color: #fff !important;\n }\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n}\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 62.5%;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: underline;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n","//\n// Mixins\n// --------------------------------------------------\n\n\n// Utilities\n// -------------------------\n\n// Clearfix\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n.clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n\n// WebKit-style focus\n.tab-focus() {\n // Default\n outline: thin dotted;\n // WebKit\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n\n// Center-align a block level element\n.center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n\n// Sizing shortcuts\n.size(@width; @height) {\n width: @width;\n height: @height;\n}\n.square(@size) {\n .size(@size; @size);\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n &:-moz-placeholder { color: @color; } // Firefox 4-18\n &::-moz-placeholder { color: @color; // Firefox 19+\n opacity: 1; } // See https://github.com/twbs/bootstrap/pull/11526\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Text overflow\n// Requires inline-block or block for proper styling\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n// CSS image replacement\n//\n// Heads up! v3 launched with with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`. Note\n// that we cannot chain the mixins together in Less, so they are repeated.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (will be removed in v4)\n.hide-text() {\n font: ~\"0/0\" a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n// New mixin to use as of v3.0.1\n.text-hide() {\n .hide-text();\n}\n\n\n\n// CSS3 PROPERTIES\n// --------------------------------------------------\n\n// Single side border-radius\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support the\n// standard `box-shadow` property.\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Transitions\n.transition(@transition) {\n -webkit-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n// Transformations\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n transform: rotate(@degrees);\n}\n.scale(@ratio; @ratio-y...) {\n -webkit-transform: scale(@ratio, @ratio-y);\n -ms-transform: scale(@ratio, @ratio-y); // IE9 only\n transform: scale(@ratio, @ratio-y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n transform: translate(@x, @y);\n}\n.skew(@x; @y) {\n -webkit-transform: skew(@x, @y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n transform: skew(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// User select\n// For selecting text on the page\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n -o-user-select: @select;\n user-select: @select;\n}\n\n// Resize anything\n.resizable(@direction) {\n resize: @direction; // Options: horizontal, vertical, both\n overflow: auto; // Safari fix\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Opacity\n.opacity(@opacity) {\n opacity: @opacity;\n // IE8 filter\n @opacity-ie: (@opacity * 100);\n filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n\n\n\n// GRADIENTS\n// --------------------------------------------------\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, color-stop(@start-color @start-percent), color-stop(@end-color @end-percent)); // Safari 5.1-6, Chrome 10+\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n\n// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n\n\n\n// Retina images\n//\n// Short retina mixin for setting background-image and -size\n\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// COMPONENT MIXINS\n// --------------------------------------------------\n\n// Horizontal dividers\n// -------------------------\n// Dividers (basically an hr) within dropdowns and nav lists\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n\n// Panels\n// -------------------------\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n border-color: @border;\n\n & > .panel-heading {\n color: @heading-text-color;\n background-color: @heading-bg-color;\n border-color: @heading-border;\n\n + .panel-collapse .panel-body {\n border-top-color: @border;\n }\n }\n & > .panel-footer {\n + .panel-collapse .panel-body {\n border-bottom-color: @border;\n }\n }\n}\n\n// Alerts\n// -------------------------\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n\n// Tables\n// -------------------------\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n\n// List Groups\n// -------------------------\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;\n background-color: @background;\n\n a& {\n color: @color;\n\n .list-group-item-heading { color: inherit; }\n\n &:hover,\n &:focus {\n color: @color;\n background-color: darken(@background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: @color;\n border-color: @color;\n }\n }\n }\n}\n\n// Button variants\n// -------------------------\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n.button-variant(@color; @background; @border) {\n color: @color;\n background-color: @background;\n border-color: @border;\n\n &:hover,\n &:focus,\n &:active,\n &.active,\n .open .dropdown-toggle& {\n color: @color;\n background-color: darken(@background, 8%);\n border-color: darken(@border, 12%);\n }\n &:active,\n &.active,\n .open .dropdown-toggle& {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &:active,\n &.active {\n background-color: @background;\n border-color: @border;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n// Button sizes\n// -------------------------\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n}\n\n// Pagination\n// -------------------------\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) {\n > li {\n > a,\n > span {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n }\n &:first-child {\n > a,\n > span {\n .border-left-radius(@border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius);\n }\n }\n }\n}\n\n// Labels\n// -------------------------\n.label-variant(@color) {\n background-color: @color;\n &[href] {\n &:hover,\n &:focus {\n background-color: darken(@color, 10%);\n }\n }\n}\n\n// Contextual backgrounds\n// -------------------------\n.bg-variant(@color) {\n background-color: @color;\n a&:hover {\n background-color: darken(@color, 10%);\n }\n}\n\n// Typography\n// -------------------------\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover {\n color: darken(@color, 10%);\n }\n}\n\n// Navbar vertical align\n// -------------------------\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n.navbar-vertical-align(@element-height) {\n margin-top: ((@navbar-height - @element-height) / 2);\n margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n\n// Progress bars\n// -------------------------\n.progress-bar-variant(@color) {\n background-color: @color;\n .progress-striped & {\n #gradient > .striped();\n }\n}\n\n// Responsive utilities\n// -------------------------\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n display: block !important;\n table& { display: table; }\n tr& { display: table-row !important; }\n th&,\n td& { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n &,\n tr&,\n th&,\n td& { display: none !important; }\n}\n\n\n// Grid System\n// -----------\n\n// Centered container element\n.container-fixed() {\n margin-right: auto;\n margin-left: auto;\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: (@gutter / -2);\n margin-right: (@gutter / -2);\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n @media (min-width: @screen-xs-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-xs-column-push(@columns) {\n @media (min-width: @screen-xs-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-xs-column-pull(@columns) {\n @media (min-width: @screen-xs-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) when (@index = 1) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n }\n }\n .col(1); // kickstart it\n}\n\n.make-grid-columns-float(@class) {\n .col(@index) when (@index = 1) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid(@index, @class, @type) when (@type = push) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid(@index, @class, @type) when (@type = pull) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.make-grid(@index, @class, @type) when (@index >= 0) {\n .calc-grid(@index, @class, @type);\n // next iteration\n .make-grid((@index - 1), @class, @type);\n}\n\n\n// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\n // Color the label and help text\n .help-block,\n .control-label,\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline {\n color: @text-color;\n }\n // Set the border and box shadow on specific inputs to match\n .form-control {\n border-color: @border-color;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n &:focus {\n border-color: darken(@border-color, 10%);\n @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);\n .box-shadow(@shadow);\n }\n }\n // Set validation states also for addons\n .input-group-addon {\n color: @text-color;\n border-color: @border-color;\n background-color: @background-color;\n }\n // Optional feedback icon\n .form-control-feedback {\n color: @text-color;\n }\n}\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-focus-border` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n\n.form-control-focus(@color: @input-border-focus) {\n @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);\n &:focus {\n border-color: @color;\n outline: 0;\n .box-shadow(~\"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}\");\n }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. `<select>`\n// element gets special love because it's special, and that's a fact!\n\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n","//\n// Variables\n// --------------------------------------------------\n\n\n//== Colors\n//\n//## Gray and brand colors for use across Bootstrap.\n\n@gray-darker: lighten(#000, 13.5%); // #222\n@gray-dark: lighten(#000, 20%); // #333\n@gray: lighten(#000, 33.5%); // #555\n@gray-light: lighten(#000, 60%); // #999\n@gray-lighter: lighten(#000, 93.5%); // #eee\n\n@brand-primary: #428bca;\n@brand-success: #5cb85c;\n@brand-info: #5bc0de;\n@brand-warning: #f0ad4e;\n@brand-danger: #d9534f;\n\n\n//== Scaffolding\n//\n// ## Settings for some of the most global styles.\n\n//** Background color for `<body>`.\n@body-bg: #fff;\n//** Global text color on `<body>`.\n@text-color: @gray-dark;\n\n//** Global textual link color.\n@link-color: @brand-primary;\n//** Link hover color set via `darken()` function.\n@link-hover-color: darken(@link-color, 15%);\n\n\n//== Typography\n//\n//## Font, line-height, and color for body text, headings, and more.\n\n@font-family-sans-serif: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n@font-family-serif: Georgia, \"Times New Roman\", Times, serif;\n//** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`.\n@font-family-monospace: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n@font-family-base: @font-family-sans-serif;\n\n@font-size-base: 14px;\n@font-size-large: ceil((@font-size-base * 1.25)); // ~18px\n@font-size-small: ceil((@font-size-base * 0.85)); // ~12px\n\n@font-size-h1: floor((@font-size-base * 2.6)); // ~36px\n@font-size-h2: floor((@font-size-base * 2.15)); // ~30px\n@font-size-h3: ceil((@font-size-base * 1.7)); // ~24px\n@font-size-h4: ceil((@font-size-base * 1.25)); // ~18px\n@font-size-h5: @font-size-base;\n@font-size-h6: ceil((@font-size-base * 0.85)); // ~12px\n\n//** Unit-less `line-height` for use in components like buttons.\n@line-height-base: 1.428571429; // 20/14\n//** Computed \"line-height\" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.\n@line-height-computed: floor((@font-size-base * @line-height-base)); // ~20px\n\n//** By default, this inherits from the `<body>`.\n@headings-font-family: inherit;\n@headings-font-weight: 500;\n@headings-line-height: 1.1;\n@headings-color: inherit;\n\n\n//-- Iconography\n//\n//## Specify custom locations of the include Glyphicons icon font. Useful for those including Bootstrap via Bower.\n\n@icon-font-path: \"../fonts/\";\n@icon-font-name: \"glyphicons-halflings-regular\";\n@icon-font-svg-id:\t\t\t\t\"glyphicons_halflingsregular\";\n\n//== Components\n//\n//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).\n\n@padding-base-vertical: 6px;\n@padding-base-horizontal: 12px;\n\n@padding-large-vertical: 10px;\n@padding-large-horizontal: 16px;\n\n@padding-small-vertical: 5px;\n@padding-small-horizontal: 10px;\n\n@padding-xs-vertical: 1px;\n@padding-xs-horizontal: 5px;\n\n@line-height-large: 1.33;\n@line-height-small: 1.5;\n\n@border-radius-base: 4px;\n@border-radius-large: 6px;\n@border-radius-small: 3px;\n\n//** Global color for active items (e.g., navs or dropdowns).\n@component-active-color: #fff;\n//** Global background color for active items (e.g., navs or dropdowns).\n@component-active-bg: @brand-primary;\n\n//** Width of the `border` for generating carets that indicator dropdowns.\n@caret-width-base: 4px;\n//** Carets increase slightly in size for larger components.\n@caret-width-large: 5px;\n\n\n//== Tables\n//\n//## Customizes the `.table` component with basic values, each used across all table variations.\n\n//** Padding for `<th>`s and `<td>`s.\n@table-cell-padding: 8px;\n//** Padding for cells in `.table-condensed`.\n@table-condensed-cell-padding: 5px;\n\n//** Default background color used for all tables.\n@table-bg: transparent;\n//** Background color used for `.table-striped`.\n@table-bg-accent: #f9f9f9;\n//** Background color used for `.table-hover`.\n@table-bg-hover: #f5f5f5;\n@table-bg-active: @table-bg-hover;\n\n//** Border color for table and cell borders.\n@table-border-color: #ddd;\n\n\n//== Buttons\n//\n//## For each of Bootstrap's buttons, define text, background and border color.\n\n@btn-font-weight: normal;\n\n@btn-default-color: #333;\n@btn-default-bg: #fff;\n@btn-default-border: #ccc;\n\n@btn-primary-color: #fff;\n@btn-primary-bg: @brand-primary;\n@btn-primary-border: darken(@btn-primary-bg, 5%);\n\n@btn-success-color: #fff;\n@btn-success-bg: @brand-success;\n@btn-success-border: darken(@btn-success-bg, 5%);\n\n@btn-info-color: #fff;\n@btn-info-bg: @brand-info;\n@btn-info-border: darken(@btn-info-bg, 5%);\n\n@btn-warning-color: #fff;\n@btn-warning-bg: @brand-warning;\n@btn-warning-border: darken(@btn-warning-bg, 5%);\n\n@btn-danger-color: #fff;\n@btn-danger-bg: @brand-danger;\n@btn-danger-border: darken(@btn-danger-bg, 5%);\n\n@btn-link-disabled-color: @gray-light;\n\n\n//== Forms\n//\n//##\n\n//** `<input>` background color\n@input-bg: #fff;\n//** `<input disabled>` background color\n@input-bg-disabled: @gray-lighter;\n\n//** Text color for `<input>`s\n@input-color: @gray;\n//** `<input>` border color\n@input-border: #ccc;\n//** `<input>` border radius\n@input-border-radius: @border-radius-base;\n//** Border color for inputs on focus\n@input-border-focus: #66afe9;\n\n//** Placeholder text color\n@input-color-placeholder: @gray-light;\n\n//** Default `.form-control` height\n@input-height-base: (@line-height-computed + (@padding-base-vertical * 2) + 2);\n//** Large `.form-control` height\n@input-height-large: (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2);\n//** Small `.form-control` height\n@input-height-small: (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2);\n\n@legend-color: @gray-dark;\n@legend-border-color: #e5e5e5;\n\n//** Background color for textual input addons\n@input-group-addon-bg: @gray-lighter;\n//** Border color for textual input addons\n@input-group-addon-border-color: @input-border;\n\n\n//== Dropdowns\n//\n//## Dropdown menu container and contents.\n\n//** Background for the dropdown menu.\n@dropdown-bg: #fff;\n//** Dropdown menu `border-color`.\n@dropdown-border: rgba(0,0,0,.15);\n//** Dropdown menu `border-color` **for IE8**.\n@dropdown-fallback-border: #ccc;\n//** Divider color for between dropdown items.\n@dropdown-divider-bg: #e5e5e5;\n\n//** Dropdown link text color.\n@dropdown-link-color: @gray-dark;\n//** Hover color for dropdown links.\n@dropdown-link-hover-color: darken(@gray-dark, 5%);\n//** Hover background for dropdown links.\n@dropdown-link-hover-bg: #f5f5f5;\n\n//** Active dropdown menu item text color.\n@dropdown-link-active-color: @component-active-color;\n//** Active dropdown menu item background color.\n@dropdown-link-active-bg: @component-active-bg;\n\n//** Disabled dropdown menu item background color.\n@dropdown-link-disabled-color: @gray-light;\n\n//** Text color for headers within dropdown menus.\n@dropdown-header-color: @gray-light;\n\n// Note: Deprecated @dropdown-caret-color as of v3.1.0\n@dropdown-caret-color: #000;\n\n\n//-- Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n//\n// Note: These variables are not generated into the Customizer.\n\n@zindex-navbar: 1000;\n@zindex-dropdown: 1000;\n@zindex-popover: 1010;\n@zindex-tooltip: 1030;\n@zindex-navbar-fixed: 1030;\n@zindex-modal-background: 1040;\n@zindex-modal: 1050;\n\n\n//== Media queries breakpoints\n//\n//## Define the breakpoints at which your layout will change, adapting to different screen sizes.\n\n// Extra small screen / phone\n// Note: Deprecated @screen-xs and @screen-phone as of v3.0.1\n@screen-xs: 480px;\n@screen-xs-min: @screen-xs;\n@screen-phone: @screen-xs-min;\n\n// Small screen / tablet\n// Note: Deprecated @screen-sm and @screen-tablet as of v3.0.1\n@screen-sm: 768px;\n@screen-sm-min: @screen-sm;\n@screen-tablet: @screen-sm-min;\n\n// Medium screen / desktop\n// Note: Deprecated @screen-md and @screen-desktop as of v3.0.1\n@screen-md: 992px;\n@screen-md-min: @screen-md;\n@screen-desktop: @screen-md-min;\n\n// Large screen / wide desktop\n// Note: Deprecated @screen-lg and @screen-lg-desktop as of v3.0.1\n@screen-lg: 1200px;\n@screen-lg-min: @screen-lg;\n@screen-lg-desktop: @screen-lg-min;\n\n// So media queries don't overlap when required, provide a maximum\n@screen-xs-max: (@screen-sm-min - 1);\n@screen-sm-max: (@screen-md-min - 1);\n@screen-md-max: (@screen-lg-min - 1);\n\n\n//== Grid system\n//\n//## Define your custom responsive grid.\n\n//** Number of columns in the grid.\n@grid-columns: 12;\n//** Padding between columns. Gets divided in half for the left and right.\n@grid-gutter-width: 30px;\n// Navbar collapse\n//** Point at which the navbar becomes uncollapsed.\n@grid-float-breakpoint: @screen-sm-min;\n//** Point at which the navbar begins collapsing.\n@grid-float-breakpoint-max: (@grid-float-breakpoint - 1);\n\n\n//== Navbar\n//\n//##\n\n// Basics of a navbar\n@navbar-height: 50px;\n@navbar-margin-bottom: @line-height-computed;\n@navbar-border-radius: @border-radius-base;\n@navbar-padding-horizontal: floor((@grid-gutter-width / 2));\n@navbar-padding-vertical: ((@navbar-height - @line-height-computed) / 2);\n@navbar-collapse-max-height: 340px;\n\n@navbar-default-color: #777;\n@navbar-default-bg: #f8f8f8;\n@navbar-default-border: darken(@navbar-default-bg, 6.5%);\n\n// Navbar links\n@navbar-default-link-color: #777;\n@navbar-default-link-hover-color: #333;\n@navbar-default-link-hover-bg: transparent;\n@navbar-default-link-active-color: #555;\n@navbar-default-link-active-bg: darken(@navbar-default-bg, 6.5%);\n@navbar-default-link-disabled-color: #ccc;\n@navbar-default-link-disabled-bg: transparent;\n\n// Navbar brand label\n@navbar-default-brand-color: @navbar-default-link-color;\n@navbar-default-brand-hover-color: darken(@navbar-default-brand-color, 10%);\n@navbar-default-brand-hover-bg: transparent;\n\n// Navbar toggle\n@navbar-default-toggle-hover-bg: #ddd;\n@navbar-default-toggle-icon-bar-bg: #888;\n@navbar-default-toggle-border-color: #ddd;\n\n\n// Inverted navbar\n// Reset inverted navbar basics\n@navbar-inverse-color: @gray-light;\n@navbar-inverse-bg: #222;\n@navbar-inverse-border: darken(@navbar-inverse-bg, 10%);\n\n// Inverted navbar links\n@navbar-inverse-link-color: @gray-light;\n@navbar-inverse-link-hover-color: #fff;\n@navbar-inverse-link-hover-bg: transparent;\n@navbar-inverse-link-active-color: @navbar-inverse-link-hover-color;\n@navbar-inverse-link-active-bg: darken(@navbar-inverse-bg, 10%);\n@navbar-inverse-link-disabled-color: #444;\n@navbar-inverse-link-disabled-bg: transparent;\n\n// Inverted navbar brand label\n@navbar-inverse-brand-color: @navbar-inverse-link-color;\n@navbar-inverse-brand-hover-color: #fff;\n@navbar-inverse-brand-hover-bg: transparent;\n\n// Inverted navbar toggle\n@navbar-inverse-toggle-hover-bg: #333;\n@navbar-inverse-toggle-icon-bar-bg: #fff;\n@navbar-inverse-toggle-border-color: #333;\n\n\n//== Navs\n//\n//##\n\n//=== Shared nav styles\n@nav-link-padding: 10px 15px;\n@nav-link-hover-bg: @gray-lighter;\n\n@nav-disabled-link-color: @gray-light;\n@nav-disabled-link-hover-color: @gray-light;\n\n@nav-open-link-hover-color: #fff;\n\n//== Tabs\n@nav-tabs-border-color: #ddd;\n\n@nav-tabs-link-hover-border-color: @gray-lighter;\n\n@nav-tabs-active-link-hover-bg: @body-bg;\n@nav-tabs-active-link-hover-color: @gray;\n@nav-tabs-active-link-hover-border-color: #ddd;\n\n@nav-tabs-justified-link-border-color: #ddd;\n@nav-tabs-justified-active-link-border-color: @body-bg;\n\n//== Pills\n@nav-pills-border-radius: @border-radius-base;\n@nav-pills-active-link-hover-bg: @component-active-bg;\n@nav-pills-active-link-hover-color: @component-active-color;\n\n\n//== Pagination\n//\n//##\n\n@pagination-color: @link-color;\n@pagination-bg: #fff;\n@pagination-border: #ddd;\n\n@pagination-hover-color: @link-hover-color;\n@pagination-hover-bg: @gray-lighter;\n@pagination-hover-border: #ddd;\n\n@pagination-active-color: #fff;\n@pagination-active-bg: @brand-primary;\n@pagination-active-border: @brand-primary;\n\n@pagination-disabled-color: @gray-light;\n@pagination-disabled-bg: #fff;\n@pagination-disabled-border: #ddd;\n\n\n//== Pager\n//\n//##\n\n@pager-bg: @pagination-bg;\n@pager-border: @pagination-border;\n@pager-border-radius: 15px;\n\n@pager-hover-bg: @pagination-hover-bg;\n\n@pager-active-bg: @pagination-active-bg;\n@pager-active-color: @pagination-active-color;\n\n@pager-disabled-color: @pagination-disabled-color;\n\n\n//== Jumbotron\n//\n//##\n\n@jumbotron-padding: 30px;\n@jumbotron-color: inherit;\n@jumbotron-bg: @gray-lighter;\n@jumbotron-heading-color: inherit;\n@jumbotron-font-size: ceil((@font-size-base * 1.5));\n\n\n//== Form states and alerts\n//\n//## Define colors for form feedback states and, by default, alerts.\n\n@state-success-text: #3c763d;\n@state-success-bg: #dff0d8;\n@state-success-border: darken(spin(@state-success-bg, -10), 5%);\n\n@state-info-text: #31708f;\n@state-info-bg: #d9edf7;\n@state-info-border: darken(spin(@state-info-bg, -10), 7%);\n\n@state-warning-text: #8a6d3b;\n@state-warning-bg: #fcf8e3;\n@state-warning-border: darken(spin(@state-warning-bg, -10), 5%);\n\n@state-danger-text: #a94442;\n@state-danger-bg: #f2dede;\n@state-danger-border: darken(spin(@state-danger-bg, -10), 5%);\n\n\n//== Tooltips\n//\n//##\n\n//** Tooltip max width\n@tooltip-max-width: 200px;\n//** Tooltip text color\n@tooltip-color: #fff;\n//** Tooltip background color\n@tooltip-bg: #000;\n@tooltip-opacity: .9;\n\n//** Tooltip arrow width\n@tooltip-arrow-width: 5px;\n//** Tooltip arrow color\n@tooltip-arrow-color: @tooltip-bg;\n\n\n//== Popovers\n//\n//##\n\n//** Popover body background color\n@popover-bg: #fff;\n//** Popover maximum width\n@popover-max-width: 276px;\n//** Popover border color\n@popover-border-color: rgba(0,0,0,.2);\n//** Popover fallback border color\n@popover-fallback-border-color: #ccc;\n\n//** Popover title background color\n@popover-title-bg: darken(@popover-bg, 3%);\n\n//** Popover arrow width\n@popover-arrow-width: 10px;\n//** Popover arrow color\n@popover-arrow-color: #fff;\n\n//** Popover outer arrow width\n@popover-arrow-outer-width: (@popover-arrow-width + 1);\n//** Popover outer arrow color\n@popover-arrow-outer-color: rgba(0,0,0,.25);\n//** Popover outer arrow fallback color\n@popover-arrow-outer-fallback-color: #999;\n\n\n//== Labels\n//\n//##\n\n//** Default label background color\n@label-default-bg: @gray-light;\n//** Primary label background color\n@label-primary-bg: @brand-primary;\n//** Success label background color\n@label-success-bg: @brand-success;\n//** Info label background color\n@label-info-bg: @brand-info;\n//** Warning label background color\n@label-warning-bg: @brand-warning;\n//** Danger label background color\n@label-danger-bg: @brand-danger;\n\n//** Default label text color\n@label-color: #fff;\n//** Default text color of a linked label\n@label-link-hover-color: #fff;\n\n\n//== Modals\n//\n//##\n\n//** Padding applied to the modal body\n@modal-inner-padding: 20px;\n\n//** Padding applied to the modal title\n@modal-title-padding: 15px;\n//** Modal title line-height\n@modal-title-line-height: @line-height-base;\n\n//** Background color of modal content area\n@modal-content-bg: #fff;\n//** Modal content border color\n@modal-content-border-color: rgba(0,0,0,.2);\n//** Modal content border color **for IE8**\n@modal-content-fallback-border-color: #999;\n\n//** Modal backdrop background color\n@modal-backdrop-bg: #000;\n//** Modal backdrop opacity\n@modal-backdrop-opacity: .5;\n//** Modal header border color\n@modal-header-border-color: #e5e5e5;\n//** Modal footer border color\n@modal-footer-border-color: @modal-header-border-color;\n\n@modal-lg: 900px;\n@modal-md: 600px;\n@modal-sm: 300px;\n\n\n//== Alerts\n//\n//## Define alert colors, border radius, and padding.\n\n@alert-padding: 15px;\n@alert-border-radius: @border-radius-base;\n@alert-link-font-weight: bold;\n\n@alert-success-bg: @state-success-bg;\n@alert-success-text: @state-success-text;\n@alert-success-border: @state-success-border;\n\n@alert-info-bg: @state-info-bg;\n@alert-info-text: @state-info-text;\n@alert-info-border: @state-info-border;\n\n@alert-warning-bg: @state-warning-bg;\n@alert-warning-text: @state-warning-text;\n@alert-warning-border: @state-warning-border;\n\n@alert-danger-bg: @state-danger-bg;\n@alert-danger-text: @state-danger-text;\n@alert-danger-border: @state-danger-border;\n\n\n//== Progress bars\n//\n//##\n\n//** Background color of the whole progress component\n@progress-bg: #f5f5f5;\n//** Progress bar text color\n@progress-bar-color: #fff;\n\n//** Default progress bar color\n@progress-bar-bg: @brand-primary;\n//** Success progress bar color\n@progress-bar-success-bg: @brand-success;\n//** Warning progress bar color\n@progress-bar-warning-bg: @brand-warning;\n//** Danger progress bar color\n@progress-bar-danger-bg: @brand-danger;\n//** Info progress bar color\n@progress-bar-info-bg: @brand-info;\n\n\n//== List group\n//\n//##\n\n//** Background color on `.list-group-item`\n@list-group-bg: #fff;\n//** `.list-group-item` border color\n@list-group-border: #ddd;\n//** List group border radius\n@list-group-border-radius: @border-radius-base;\n\n//** Background color of single list elements on hover\n@list-group-hover-bg: #f5f5f5;\n//** Text color of active list elements\n@list-group-active-color: @component-active-color;\n//** Background color of active list elements\n@list-group-active-bg: @component-active-bg;\n//** Border color of active list elements\n@list-group-active-border: @list-group-active-bg;\n@list-group-active-text-color: lighten(@list-group-active-bg, 40%);\n\n@list-group-link-color: #555;\n@list-group-link-heading-color: #333;\n\n\n//== Panels\n//\n//##\n\n@panel-bg: #fff;\n@panel-body-padding: 15px;\n@panel-border-radius: @border-radius-base;\n\n//** Border color for elements within panels\n@panel-inner-border: #ddd;\n@panel-footer-bg: #f5f5f5;\n\n@panel-default-text: @gray-dark;\n@panel-default-border: #ddd;\n@panel-default-heading-bg: #f5f5f5;\n\n@panel-primary-text: #fff;\n@panel-primary-border: @brand-primary;\n@panel-primary-heading-bg: @brand-primary;\n\n@panel-success-text: @state-success-text;\n@panel-success-border: @state-success-border;\n@panel-success-heading-bg: @state-success-bg;\n\n@panel-info-text: @state-info-text;\n@panel-info-border: @state-info-border;\n@panel-info-heading-bg: @state-info-bg;\n\n@panel-warning-text: @state-warning-text;\n@panel-warning-border: @state-warning-border;\n@panel-warning-heading-bg: @state-warning-bg;\n\n@panel-danger-text: @state-danger-text;\n@panel-danger-border: @state-danger-border;\n@panel-danger-heading-bg: @state-danger-bg;\n\n\n//== Thumbnails\n//\n//##\n\n//** Padding around the thumbnail image\n@thumbnail-padding: 4px;\n//** Thumbnail background color\n@thumbnail-bg: @body-bg;\n//** Thumbnail border color\n@thumbnail-border: #ddd;\n//** Thumbnail border radius\n@thumbnail-border-radius: @border-radius-base;\n\n//** Custom text color for thumbnail captions\n@thumbnail-caption-color: @text-color;\n//** Padding around the thumbnail caption\n@thumbnail-caption-padding: 9px;\n\n\n//== Wells\n//\n//##\n\n@well-bg: #f5f5f5;\n@well-border: darken(@well-bg, 7%);\n\n\n//== Badges\n//\n//##\n\n@badge-color: #fff;\n//** Linked badge text color on hover\n@badge-link-hover-color: #fff;\n@badge-bg: @gray-light;\n\n//** Badge text color in active nav link\n@badge-active-color: @link-color;\n//** Badge background color in active nav link\n@badge-active-bg: #fff;\n\n@badge-font-weight: bold;\n@badge-line-height: 1;\n@badge-border-radius: 10px;\n\n\n//== Breadcrumbs\n//\n//##\n\n@breadcrumb-padding-vertical: 8px;\n@breadcrumb-padding-horizontal: 15px;\n//** Breadcrumb background color\n@breadcrumb-bg: #f5f5f5;\n//** Breadcrumb text color\n@breadcrumb-color: #ccc;\n//** Text color of current page in the breadcrumb\n@breadcrumb-active-color: @gray-light;\n//** Textual separator for between breadcrumb elements\n@breadcrumb-separator: \"/\";\n\n\n//== Carousel\n//\n//##\n\n@carousel-text-shadow: 0 1px 2px rgba(0,0,0,.6);\n\n@carousel-control-color: #fff;\n@carousel-control-width: 15%;\n@carousel-control-opacity: .5;\n@carousel-control-font-size: 20px;\n\n@carousel-indicator-active-bg: #fff;\n@carousel-indicator-border-color: #fff;\n\n@carousel-caption-color: #fff;\n\n\n//== Close\n//\n//##\n\n@close-font-weight: bold;\n@close-color: #000;\n@close-text-shadow: 0 1px 0 #fff;\n\n\n//== Code\n//\n//##\n\n@code-color: #c7254e;\n@code-bg: #f9f2f4;\n\n@kbd-color: #fff;\n@kbd-bg: #333;\n\n@pre-bg: #f5f5f5;\n@pre-color: @gray-dark;\n@pre-border-color: #ccc;\n@pre-scrollable-max-height: 340px;\n\n\n//== Type\n//\n//##\n\n//** Text muted color\n@text-muted: @gray-light;\n//** Abbreviations and acronyms border color\n@abbr-border-color: @gray-light;\n//** Headings small color\n@headings-small-color: @gray-light;\n//** Blockquote small color\n@blockquote-small-color: @gray-light;\n//** Blockquote border color\n@blockquote-border-color: @gray-lighter;\n//** Page header border color\n@page-header-border-color: @gray-lighter;\n\n\n//== Miscellaneous\n//\n//##\n\n//** Horizontal line color.\n@hr-border: @gray-lighter;\n\n//** Horizontal offset for forms and lists.\n@component-offset-horizontal: 180px;\n\n\n//== Container sizes\n//\n//## Define the maximum width of `.container` for different screen sizes.\n\n// Small screen / tablet\n@container-tablet: ((720px + @grid-gutter-width));\n//** For `@screen-sm-min` and up.\n@container-sm: @container-tablet;\n\n// Medium screen / desktop\n@container-desktop: ((940px + @grid-gutter-width));\n//** For `@screen-md-min` and up.\n@container-md: @container-desktop;\n\n// Large screen / wide desktop\n@container-large-desktop: ((1140px + @grid-gutter-width));\n//** For `@screen-lg-min` and up.\n@container-lg: @container-large-desktop;\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 200;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: 14px base font * 85% = about 12px\nsmall,\n.small { font-size: 85%; }\n\n// Undo browser default styling\ncite { font-style: normal; }\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// --------------------------------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n\n &:first-child {\n padding-left: 0;\n }\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n@media (min-width: @grid-float-breakpoint) {\n .dl-horizontal {\n dt {\n float: left;\n width: (@component-offset-horizontal - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @component-offset-horizontal;\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n }\n}\n\n// MISC\n// ----\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: (@font-size-base * 1.25);\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Quotes\nblockquote:before,\nblockquote:after {\n content: \"\";\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n white-space: nowrap;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid-columns-float(xs);\n.make-grid(@grid-columns, xs, width);\n.make-grid(@grid-columns, xs, pull);\n.make-grid(@grid-columns, xs, push);\n.make-grid(@grid-columns, xs, offset);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid-columns-float(sm);\n .make-grid(@grid-columns, sm, width);\n .make-grid(@grid-columns, sm, pull);\n .make-grid(@grid-columns, sm, push);\n .make-grid(@grid-columns, sm, offset);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid-columns-float(md);\n .make-grid(@grid-columns, md, width);\n .make-grid(@grid-columns, md, pull);\n .make-grid(@grid-columns, md, push);\n .make-grid(@grid-columns, md, offset);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid-columns-float(lg);\n .make-grid(@grid-columns, lg, width);\n .make-grid(@grid-columns, lg, pull);\n .make-grid(@grid-columns, lg, push);\n .make-grid(@grid-columns, lg, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n max-width: 100%;\n background-color: @table-bg;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-child(odd) {\n > td,\n > th {\n background-color: @table-bg-accent;\n }\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n > td,\n > th {\n background-color: @table-bg-hover;\n }\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n@media (max-width: @screen-xs-max) {\n .table-responsive {\n width: 100%;\n margin-bottom: (@line-height-computed * 0.75);\n overflow-y: hidden;\n overflow-x: scroll;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n -webkit-overflow-scrolling: touch;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: -webkit-min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; /* IE8-9 */\n line-height: normal;\n}\n\n// Set the height of file controls to match text inputs\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Disabled and read-only inputs\n // Note: HTML5 says that controls under a fieldset > legend:first-child won't\n // be disabled if the fieldset is disabled. Due to implementation difficulty,\n // we don't honor that edge case; we style them as disabled anyway.\n &[disabled],\n &[readonly],\n fieldset[disabled] & {\n cursor: not-allowed;\n background-color: @input-bg-disabled;\n opacity: 1; // iOS fix for unreadable disabled content\n }\n\n // Reset height for `textarea`s\n textarea& {\n height: auto;\n }\n}\n\n// Special styles for iOS date input\n//\n// In Mobile Safari, date inputs require a pixel line-height that matches the\n// given height of the input.\ninput[type=\"date\"] {\n line-height: @input-height-base;\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n margin-bottom: 15px;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n display: block;\n min-height: @line-height-computed; // clear the floating input if there is no label text\n margin-top: 10px;\n margin-bottom: 10px;\n padding-left: 20px;\n label {\n display: inline;\n font-weight: normal;\n cursor: pointer;\n }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n float: left;\n margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"],\n.radio,\n.radio-inline,\n.checkbox,\n.checkbox-inline {\n &[disabled],\n fieldset[disabled] & {\n cursor: not-allowed;\n }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n\n.input-sm {\n .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n\n.input-lg {\n .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n // Enable absolute positioning\n position: relative;\n\n // Ensure icons don't overlap text\n .form-control {\n padding-right: (@input-height-base * 1.25);\n }\n\n // Feedback icon (requires .glyphicon classes)\n .form-control-feedback {\n position: absolute;\n top: (@line-height-computed + 5); // Height of the `label` and its margin\n right: 0;\n display: block;\n width: @input-height-base;\n height: @input-height-base;\n line-height: @input-height-base;\n text-align: center;\n }\n}\n\n// Feedback states\n.has-success {\n .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);\n}\n.has-warning {\n .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);\n}\n.has-error {\n .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n margin-bottom: 0; // Remove default margin from `p`\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n display: block; // account for any element using help-block\n margin-top: 5px;\n margin-bottom: 10px;\n color: lighten(@text-color, 25%); // lighten the text some for contrast\n}\n\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n.form-inline {\n\n // Kick in the inline\n @media (min-width: @screen-sm-min) {\n // Inline-block all the things for \"inline\"\n .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // In navbar-form, allow folks to *not* use `.form-group`\n .form-control {\n display: inline-block;\n width: auto; // Prevent labels from stacking above inputs in `.form-group`\n vertical-align: middle;\n }\n\n .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // Remove default margin on radios/checkboxes that were used for stacking, and\n // then undo the floating of radios and checkboxes to match (which also avoids\n // a bug in WebKit: https://github.com/twbs/bootstrap/issues/1969).\n .radio,\n .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n padding-left: 0;\n vertical-align: middle;\n }\n .radio input[type=\"radio\"],\n .checkbox input[type=\"checkbox\"] {\n float: none;\n margin-left: 0;\n }\n\n // Validation states\n //\n // Reposition the icon because it's now within a grid column and columns have\n // `position: relative;` on them. Also accounts for the grid gutter padding.\n .has-feedback .form-control-feedback {\n top: 0;\n }\n }\n}\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n // Consistent vertical alignment of labels, radios, and checkboxes\n .control-label,\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n // Account for padding we're adding to ensure the alignment and of help text\n // and other content below items\n .radio,\n .checkbox {\n min-height: (@line-height-computed + (@padding-base-vertical + 1));\n }\n\n // Make form groups behave like rows\n .form-group {\n .make-row();\n }\n\n .form-control-static {\n padding-top: (@padding-base-vertical + 1);\n }\n\n // Only right align form labels here when the columns stop stacking\n @media (min-width: @screen-sm-min) {\n .control-label {\n text-align: right;\n }\n }\n\n // Validation states\n //\n // Reposition the icon because it's now within a grid column and columns have\n // `position: relative;` on them. Also accounts for the grid gutter padding.\n .has-feedback .form-control-feedback {\n top: 0;\n right: (@grid-gutter-width / 2);\n }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n display: inline-block;\n margin-bottom: 0; // For input.btn\n font-weight: @btn-font-weight;\n text-align: center;\n vertical-align: middle;\n cursor: pointer;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n white-space: nowrap;\n .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @border-radius-base);\n .user-select(none);\n\n &:focus {\n .tab-focus();\n }\n\n &:hover,\n &:focus {\n color: @btn-default-color;\n text-decoration: none;\n }\n\n &:active,\n &.active {\n outline: 0;\n background-image: none;\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n cursor: not-allowed;\n pointer-events: none; // Future-proof disabling of clicks\n .opacity(.65);\n .box-shadow(none);\n }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n color: @link-color;\n font-weight: normal;\n cursor: pointer;\n border-radius: 0;\n\n &,\n &:active,\n &[disabled],\n fieldset[disabled] & {\n background-color: transparent;\n .box-shadow(none);\n }\n &,\n &:hover,\n &:focus,\n &:active {\n border-color: transparent;\n }\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: underline;\n background-color: transparent;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @btn-link-disabled-color;\n text-decoration: none;\n }\n }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n // line-height: ensure even-numbered height of button next to large input\n .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n.btn-sm {\n // line-height: ensure proper height of button next to small input\n .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n.btn-xs {\n .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n display: block;\n width: 100%;\n padding-left: 0;\n padding-right: 0;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twitter/bootstrap/pull/3552.\n\n.fade {\n opacity: 0;\n .transition(opacity .15s linear);\n &.in {\n opacity: 1;\n }\n}\n\n.collapse {\n display: none;\n &.in {\n display: block;\n }\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n .transition(height .35s ease);\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// <a href=\"#\"><span class=\"glyphicon glyphicon-star\"></span> Star</a>\n\n// Import the fonts\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: ~\"url('@{icon-font-path}@{icon-font-name}.eot')\";\n src: ~\"url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype')\",\n ~\"url('@{icon-font-path}@{icon-font-name}.woff') format('woff')\",\n ~\"url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype')\",\n ~\"url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg')\";\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\2a\"; } }\n.glyphicon-plus { &:before { content: \"\\2b\"; } }\n.glyphicon-euro { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: @caret-width-base solid;\n border-right: @caret-width-base solid transparent;\n border-left: @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropdown {\n position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: @zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0; // override default ul\n list-style: none;\n font-size: @font-size-base;\n background-color: @dropdown-bg;\n border: 1px solid @dropdown-fallback-border; // IE8 fallback\n border: 1px solid @dropdown-border;\n border-radius: @border-radius-base;\n .box-shadow(0 6px 12px rgba(0,0,0,.175));\n background-clip: padding-box;\n\n // Aligns the dropdown menu to right\n //\n // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n &.pull-right {\n right: 0;\n left: auto;\n }\n\n // Dividers (basically an hr) within the dropdown\n .divider {\n .nav-divider(@dropdown-divider-bg);\n }\n\n // Links within the dropdown menu\n > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: @line-height-base;\n color: @dropdown-link-color;\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n &:hover,\n &:focus {\n text-decoration: none;\n color: @dropdown-link-hover-color;\n background-color: @dropdown-link-hover-bg;\n }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-active-color;\n text-decoration: none;\n outline: 0;\n background-color: @dropdown-link-active-bg;\n }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-disabled-color;\n }\n}\n// Nuke hover/focus effects\n.dropdown-menu > .disabled > a {\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none; // Remove CSS gradient\n .reset-filter();\n cursor: not-allowed;\n }\n}\n\n// Open state for the dropdown\n.open {\n // Show the menu\n > .dropdown-menu {\n display: block;\n }\n\n // Remove the outline when :focus is triggered\n > a {\n outline: 0;\n }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n left: auto; // Reset the default from `.dropdown-menu`\n right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: @font-size-small;\n line-height: @line-height-base;\n color: @dropdown-header-color;\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n // Reverse the caret\n .caret {\n border-top: 0;\n border-bottom: @caret-width-base solid;\n content: \"\";\n }\n // Different positioning for bottom up menu\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 1px;\n }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-right {\n .dropdown-menu {\n .dropdown-menu-right();\n }\n // Necessary for overrides of the default right aligned menu.\n // Will remove come v4 in all likelihood.\n .dropdown-menu-left {\n .dropdown-menu-left();\n }\n }\n}\n\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; // match .btn alignment given font-size hack above\n > .btn {\n position: relative;\n float: left;\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active,\n &.active {\n z-index: 2;\n }\n &:focus {\n // Remove focus outline when dropdown JS adds it after closing the menu\n outline: none;\n }\n }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n .btn + .btn,\n .btn + .btn-group,\n .btn-group + .btn,\n .btn-group + .btn-group {\n margin-left: -1px;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n margin-left: -5px; // Offset the first child's margin\n &:extend(.clearfix all);\n\n .btn-group,\n .input-group {\n float: left;\n }\n > .btn,\n > .btn-group,\n > .input-group {\n margin-left: 5px;\n }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n margin-left: 0;\n &:not(:last-child):not(.dropdown-toggle) {\n .border-right-radius(0);\n }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-right-radius(0);\n }\n}\n.btn-group > .btn-group:last-child > .btn:first-child {\n .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { .btn-xs(); }\n.btn-group-sm > .btn { .btn-sm(); }\n.btn-group-lg > .btn { .btn-lg(); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n .box-shadow(none);\n }\n}\n\n\n// Reposition the caret\n.btn .caret {\n margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n border-width: @caret-width-large @caret-width-large 0;\n border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n > .btn,\n > .btn-group,\n > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n }\n\n // Clear floats so dropdown menus can be properly placed\n > .btn-group {\n &:extend(.clearfix all);\n > .btn {\n float: none;\n }\n }\n\n > .btn + .btn,\n > .btn + .btn-group,\n > .btn-group + .btn,\n > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n }\n}\n\n.btn-group-vertical > .btn {\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n &:first-child:not(:last-child) {\n border-top-right-radius: @border-radius-base;\n .border-bottom-radius(0);\n }\n &:last-child:not(:first-child) {\n border-bottom-left-radius: @border-radius-base;\n .border-top-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-bottom-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-top-radius(0);\n}\n\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n > .btn,\n > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n }\n > .btn-group .btn {\n width: 100%;\n }\n}\n\n\n// Checkbox and radio options\n[data-toggle=\"buttons\"] > .btn > input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn > input[type=\"checkbox\"] {\n display: none;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n position: relative; // For dropdowns\n display: table;\n border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n // Undo padding and float of grid classes\n &[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n }\n\n .form-control {\n // IE9 fubars the placeholder attribute in text inputs and the arrows on\n // select elements in input groups. To fix it, we float the input. Details:\n // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n float: left;\n\n width: 100%;\n margin-bottom: 0;\n }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn { .input-lg(); }\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn { .input-sm(); }\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 1;\n color: @input-color;\n text-align: center;\n background-color: @input-group-addon-bg;\n border: 1px solid @input-group-addon-border-color;\n border-radius: @border-radius-base;\n\n // Sizing\n &.input-sm {\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n border-radius: @border-radius-small;\n }\n &.input-lg {\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n border-radius: @border-radius-large;\n }\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n .border-right-radius(0);\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n .border-left-radius(0);\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n position: relative;\n // Jankily prevent input button groups from wrapping with `white-space` and\n // `font-size` in combination with `inline-block` on buttons.\n font-size: 0;\n white-space: nowrap;\n\n // Negative margin for spacing, position for bringing hovered/focused/actived\n // element above the siblings.\n > .btn {\n position: relative;\n + .btn {\n margin-left: -1px;\n }\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active {\n z-index: 2;\n }\n }\n\n // Negative margin to only have a 1px border between the two\n &:first-child {\n > .btn,\n > .btn-group {\n margin-right: -1px;\n }\n }\n &:last-child {\n > .btn,\n > .btn-group {\n margin-left: -1px;\n }\n }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n margin-bottom: 0;\n padding-left: 0; // Override default ul/ol\n list-style: none;\n &:extend(.clearfix all);\n\n > li {\n position: relative;\n display: block;\n\n > a {\n position: relative;\n display: block;\n padding: @nav-link-padding;\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @nav-link-hover-bg;\n }\n }\n\n // Disabled state sets text to gray and nukes hover/tab effects\n &.disabled > a {\n color: @nav-disabled-link-color;\n\n &:hover,\n &:focus {\n color: @nav-disabled-link-hover-color;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed;\n }\n }\n }\n\n // Open dropdowns\n .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @nav-link-hover-bg;\n border-color: @link-color;\n }\n }\n\n // Nav dividers (deprecated with v3.0.1)\n //\n // This should have been removed in v3 with the dropping of `.nav-list`, but\n // we missed it. We don't currently support this anywhere, but in the interest\n // of maintaining backward compatibility in case you use it, it's deprecated.\n .nav-divider {\n .nav-divider();\n }\n\n // Prevent IE8 from misplacing imgs\n //\n // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n > li > a > img {\n max-width: none;\n }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n border-bottom: 1px solid @nav-tabs-border-color;\n > li {\n float: left;\n // Make the list-items overlay the bottom border\n margin-bottom: -1px;\n\n // Actual tabs (as links)\n > a {\n margin-right: 2px;\n line-height: @line-height-base;\n border: 1px solid transparent;\n border-radius: @border-radius-base @border-radius-base 0 0;\n &:hover {\n border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n }\n }\n\n // Active state, and its :hover to override normal :hover\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-tabs-active-link-hover-color;\n background-color: @nav-tabs-active-link-hover-bg;\n border: 1px solid @nav-tabs-active-link-hover-border-color;\n border-bottom-color: transparent;\n cursor: default;\n }\n }\n }\n // pulling this in mainly for less shorthand\n &.nav-justified {\n .nav-justified();\n .nav-tabs-justified();\n }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n > li {\n float: left;\n\n // Links rendered as pills\n > a {\n border-radius: @nav-pills-border-radius;\n }\n + li {\n margin-left: 2px;\n }\n\n // Active state\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-pills-active-link-hover-color;\n background-color: @nav-pills-active-link-hover-bg;\n }\n }\n }\n}\n\n\n// Stacked pills\n.nav-stacked {\n > li {\n float: none;\n + li {\n margin-top: 2px;\n margin-left: 0; // no need for this gap between nav items\n }\n }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n width: 100%;\n\n > li {\n float: none;\n > a {\n text-align: center;\n margin-bottom: 5px;\n }\n }\n\n > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n }\n\n @media (min-width: @screen-sm-min) {\n > li {\n display: table-cell;\n width: 1%;\n > a {\n margin-bottom: 0;\n }\n }\n }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n border-bottom: 0;\n\n > li > a {\n // Override margin from .nav-tabs\n margin-right: 0;\n border-radius: @border-radius-base;\n }\n\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border: 1px solid @nav-tabs-justified-link-border-color;\n }\n\n @media (min-width: @screen-sm-min) {\n > li > a {\n border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n border-radius: @border-radius-base @border-radius-base 0 0;\n }\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border-bottom-color: @nav-tabs-justified-active-link-border-color;\n }\n }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n // make dropdown border overlap tab border\n margin-top: -1px;\n // Remove the top rounded corners here since there is a hard edge above the menu\n .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n margin-bottom: @navbar-margin-bottom;\n border: 1px solid transparent;\n\n // Prevent floats from breaking the navbar\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: @navbar-border-radius;\n }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n max-height: @navbar-collapse-max-height;\n overflow-x: visible;\n padding-right: @navbar-padding-horizontal;\n padding-left: @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n &:extend(.clearfix all);\n -webkit-overflow-scrolling: touch;\n\n &.in {\n overflow-y: auto;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border-top: 0;\n box-shadow: none;\n\n &.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0; // Override default setting\n overflow: visible !important;\n }\n\n &.in {\n overflow-y: visible;\n }\n\n // Undo the collapse side padding for navbars with containers to ensure\n // alignment of right-aligned contents.\n .navbar-fixed-top &,\n .navbar-static-top &,\n .navbar-fixed-bottom & {\n padding-left: 0;\n padding-right: 0;\n }\n }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n > .navbar-header,\n > .navbar-collapse {\n margin-right: -@navbar-padding-horizontal;\n margin-left: -@navbar-padding-horizontal;\n\n @media (min-width: @grid-float-breakpoint) {\n margin-right: 0;\n margin-left: 0;\n }\n }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n z-index: @zindex-navbar;\n border-width: 0 0 1px;\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: @zindex-navbar-fixed;\n\n // Undo the rounded corners\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0; // override .navbar defaults\n border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n float: left;\n padding: @navbar-padding-vertical @navbar-padding-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-computed;\n height: @line-height-computed;\n\n &:hover,\n &:focus {\n text-decoration: none;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n .navbar > .container &,\n .navbar > .container-fluid & {\n margin-left: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: @navbar-padding-horizontal;\n padding: 9px 10px;\n .navbar-vertical-align(34px);\n background-color: transparent;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n border-radius: @border-radius-base;\n\n // We remove the `outline` here, but later compensate by attaching `:hover`\n // styles to `:focus`.\n &:focus {\n outline: none;\n }\n\n // Bars\n .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n }\n .icon-bar + .icon-bar {\n margin-top: 4px;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n display: none;\n }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: @line-height-computed;\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n > li > a,\n .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n > li > a {\n line-height: @line-height-computed;\n &:hover,\n &:focus {\n background-image: none;\n }\n }\n }\n }\n\n // Uncollapse the nav\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin: 0;\n\n > li {\n float: left;\n > a {\n padding-top: @navbar-padding-vertical;\n padding-bottom: @navbar-padding-vertical;\n }\n }\n\n &.navbar-right:last-child {\n margin-right: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-left { .pull-left(); }\n .navbar-right { .pull-right(); }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n margin-left: -@navbar-padding-horizontal;\n margin-right: -@navbar-padding-horizontal;\n padding: 10px @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n\n // Mixin behavior for optimum display\n .form-inline();\n\n .form-group {\n @media (max-width: @grid-float-breakpoint-max) {\n margin-bottom: 5px;\n }\n }\n\n // Vertically center in expanded, horizontal navbar\n .navbar-vertical-align(@input-height-base);\n\n // Undo 100% width for pull classes\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n .box-shadow(none);\n\n // Outdent the form if last child to line up with content down the page\n &.navbar-right:last-child {\n margin-right: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n .navbar-vertical-align(@input-height-base);\n\n &.btn-sm {\n .navbar-vertical-align(@input-height-small);\n }\n &.btn-xs {\n .navbar-vertical-align(22);\n }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n .navbar-vertical-align(@line-height-computed);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin-left: @navbar-padding-horizontal;\n margin-right: @navbar-padding-horizontal;\n\n // Outdent the form if last child to line up with content down the page\n &.navbar-right:last-child {\n margin-right: 0;\n }\n }\n}\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n background-color: @navbar-default-bg;\n border-color: @navbar-default-border;\n\n .navbar-brand {\n color: @navbar-default-brand-color;\n &:hover,\n &:focus {\n color: @navbar-default-brand-hover-color;\n background-color: @navbar-default-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-default-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-default-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n\n .navbar-toggle {\n border-color: @navbar-default-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-default-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-default-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: @navbar-default-border;\n }\n\n // Dropdown menu items\n .navbar-nav {\n // Remove background color from open dropdown\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-default-link-active-bg;\n color: @navbar-default-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n > li > a {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n }\n }\n\n\n // Links in navbars\n //\n // Add a class to ensure links outside the navbar nav are colored correctly.\n\n .navbar-link {\n color: @navbar-default-link-color;\n &:hover {\n color: @navbar-default-link-hover-color;\n }\n }\n\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n background-color: @navbar-inverse-bg;\n border-color: @navbar-inverse-border;\n\n .navbar-brand {\n color: @navbar-inverse-brand-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-brand-hover-color;\n background-color: @navbar-inverse-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-inverse-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-inverse-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n\n // Darken the responsive nav toggle\n .navbar-toggle {\n border-color: @navbar-inverse-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-inverse-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-inverse-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: darken(@navbar-inverse-bg, 7%);\n }\n\n // Dropdowns\n .navbar-nav {\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-inverse-link-active-bg;\n color: @navbar-inverse-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display\n .open .dropdown-menu {\n > .dropdown-header {\n border-color: @navbar-inverse-border;\n }\n .divider {\n background-color: @navbar-inverse-border;\n }\n > li > a {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n }\n }\n\n .navbar-link {\n color: @navbar-inverse-link-color;\n &:hover {\n color: @navbar-inverse-link-hover-color;\n }\n }\n\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n .clearfix();\n}\n.center-block {\n .center-block();\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n display: none !important;\n visibility: hidden !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n position: fixed;\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n margin-bottom: @line-height-computed;\n list-style: none;\n background-color: @breadcrumb-bg;\n border-radius: @border-radius-base;\n\n > li {\n display: inline-block;\n\n + li:before {\n content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n padding: 0 5px;\n color: @breadcrumb-color;\n }\n }\n\n > .active {\n color: @breadcrumb-active-color;\n }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: @line-height-computed 0;\n border-radius: @border-radius-base;\n\n > li {\n display: inline; // Remove list-style and block-level defaults\n > a,\n > span {\n position: relative;\n float: left; // Collapse white-space\n padding: @padding-base-vertical @padding-base-horizontal;\n line-height: @line-height-base;\n text-decoration: none;\n color: @pagination-color;\n background-color: @pagination-bg;\n border: 1px solid @pagination-border;\n margin-left: -1px;\n }\n &:first-child {\n > a,\n > span {\n margin-left: 0;\n .border-left-radius(@border-radius-base);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius-base);\n }\n }\n }\n\n > li > a,\n > li > span {\n &:hover,\n &:focus {\n color: @pagination-hover-color;\n background-color: @pagination-hover-bg;\n border-color: @pagination-hover-border;\n }\n }\n\n > .active > a,\n > .active > span {\n &,\n &:hover,\n &:focus {\n z-index: 2;\n color: @pagination-active-color;\n background-color: @pagination-active-bg;\n border-color: @pagination-active-border;\n cursor: default;\n }\n }\n\n > .disabled {\n > span,\n > span:hover,\n > span:focus,\n > a,\n > a:hover,\n > a:focus {\n color: @pagination-disabled-color;\n background-color: @pagination-disabled-bg;\n border-color: @pagination-disabled-border;\n cursor: not-allowed;\n }\n }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @border-radius-small);\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n padding-left: 0;\n margin: @line-height-computed 0;\n list-style: none;\n text-align: center;\n &:extend(.clearfix all);\n li {\n display: inline;\n > a,\n > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: @pager-bg;\n border: 1px solid @pager-border;\n border-radius: @pager-border-radius;\n }\n\n > a:hover,\n > a:focus {\n text-decoration: none;\n background-color: @pager-hover-bg;\n }\n }\n\n .next {\n > a,\n > span {\n float: right;\n }\n }\n\n .previous {\n > a,\n > span {\n float: left;\n }\n }\n\n .disabled {\n > a,\n > a:hover,\n > a:focus,\n > span {\n color: @pager-disabled-color;\n background-color: @pager-bg;\n cursor: not-allowed;\n }\n }\n\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: @label-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n\n // Add hover effects, but only for links\n &[href] {\n &:hover,\n &:focus {\n color: @label-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Empty labels collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for labels in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n .label-variant(@label-default-bg);\n}\n\n.label-primary {\n .label-variant(@label-primary-bg);\n}\n\n.label-success {\n .label-variant(@label-success-bg);\n}\n\n.label-info {\n .label-variant(@label-info-bg);\n}\n\n.label-warning {\n .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n .label-variant(@label-danger-bg);\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base classes\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: @font-size-small;\n font-weight: @badge-font-weight;\n color: @badge-color;\n line-height: @badge-line-height;\n vertical-align: baseline;\n white-space: nowrap;\n text-align: center;\n background-color: @badge-bg;\n border-radius: @badge-border-radius;\n\n // Empty badges collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for badges in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n .btn-xs & {\n top: 0;\n padding: 1px 5px;\n }\n}\n\n// Hover state, but only for links\na.badge {\n &:hover,\n &:focus {\n color: @badge-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n}\n\n// Account for counters in navs\na.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: @badge-active-color;\n background-color: @badge-active-bg;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n padding: @jumbotron-padding;\n margin-bottom: @jumbotron-padding;\n color: @jumbotron-color;\n background-color: @jumbotron-bg;\n\n h1,\n .h1 {\n color: @jumbotron-heading-color;\n }\n p {\n margin-bottom: (@jumbotron-padding / 2);\n font-size: @jumbotron-font-size;\n font-weight: 200;\n }\n\n .container & {\n border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n }\n\n .container {\n max-width: 100%;\n }\n\n @media screen and (min-width: @screen-sm-min) {\n padding-top: (@jumbotron-padding * 1.6);\n padding-bottom: (@jumbotron-padding * 1.6);\n\n .container & {\n padding-left: (@jumbotron-padding * 2);\n padding-right: (@jumbotron-padding * 2);\n }\n\n h1,\n .h1 {\n font-size: (@font-size-base * 4.5);\n }\n }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n display: block;\n padding: @thumbnail-padding;\n margin-bottom: @line-height-computed;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n > img,\n a > img {\n .img-responsive();\n margin-left: auto;\n margin-right: auto;\n }\n\n // Add a hover state for linked versions only\n a&:hover,\n a&:focus,\n a&.active {\n border-color: @link-color;\n }\n\n // Image captions\n .caption {\n padding: @thumbnail-caption-padding;\n color: @thumbnail-caption-color;\n }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n padding: @alert-padding;\n margin-bottom: @line-height-computed;\n border: 1px solid transparent;\n border-radius: @alert-border-radius;\n\n // Headings for larger alerts\n h4 {\n margin-top: 0;\n // Specified for the h4 to prevent conflicts of changing @headings-color\n color: inherit;\n }\n // Provide class for links that match alerts\n .alert-link {\n font-weight: @alert-link-font-weight;\n }\n\n // Improve alignment and spacing of inner content\n > p,\n > ul {\n margin-bottom: 0;\n }\n > p + p {\n margin-top: 5px;\n }\n}\n\n// Dismissable alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable {\n padding-right: (@alert-padding + 20);\n\n // Adjust close link position\n .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n.alert-info {\n .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n.alert-warning {\n .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n.alert-danger {\n .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n overflow: hidden;\n height: @line-height-computed;\n margin-bottom: @line-height-computed;\n background-color: @progress-bg;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: @font-size-small;\n line-height: @line-height-computed;\n color: @progress-bar-color;\n text-align: center;\n background-color: @progress-bar-bg;\n .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n .transition(width .6s ease);\n}\n\n// Striped bars\n.progress-striped .progress-bar {\n #gradient > .striped();\n background-size: 40px 40px;\n}\n\n// Call animation for the active one\n.progress.active .progress-bar {\n .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Media objects\n// Source: http://stubbornella.org/content/?p=497\n// --------------------------------------------------\n\n\n// Common styles\n// -------------------------\n\n// Clear the floats\n.media,\n.media-body {\n overflow: hidden;\n zoom: 1;\n}\n\n// Proper spacing between instances of .media\n.media,\n.media .media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n\n// For images and videos, set to block\n.media-object {\n display: block;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n margin: 0 0 5px;\n}\n\n\n// Media image alignment\n// -------------------------\n\n.media {\n > .pull-left {\n margin-right: 10px;\n }\n > .pull-right {\n margin-left: 10px;\n }\n}\n\n\n// Media list variation\n// -------------------------\n\n// Undo default ul/ol styles\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n // No need to set list-style: none; since .list-group-item is block level\n margin-bottom: 20px;\n padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: @list-group-bg;\n border: 1px solid @list-group-border;\n\n // Round the first and last items\n &:first-child {\n .border-top-radius(@list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n .border-bottom-radius(@list-group-border-radius);\n }\n\n // Align badges within list items\n > .badge {\n float: right;\n }\n > .badge + .badge {\n margin-right: 5px;\n }\n}\n\n\n// Linked list items\n//\n// Use anchor elements instead of `li`s or `div`s to create linked list items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item {\n color: @list-group-link-color;\n\n .list-group-item-heading {\n color: @list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @list-group-hover-bg;\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: @list-group-active-color;\n background-color: @list-group-active-bg;\n border-color: @list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-active-text-color;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: @line-height-computed;\n background-color: @panel-bg;\n border: 1px solid transparent;\n border-radius: @panel-border-radius;\n .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n padding: @panel-body-padding;\n &:extend(.clearfix all);\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n > .list-group {\n margin-bottom: 0;\n .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n &:first-child {\n border-top: 0;\n }\n &:last-child {\n border-bottom: 0;\n }\n }\n // Add border top radius for first one\n &:first-child {\n .list-group-item:first-child {\n .border-top-radius((@panel-border-radius - 1));\n }\n }\n // Add border bottom radius for last one\n &:last-child {\n .list-group-item:last-child {\n .border-bottom-radius((@panel-border-radius - 1));\n }\n }\n }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n .list-group-item:first-child {\n border-top-width: 0;\n }\n}\n\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n > .table,\n > .table-responsive > .table {\n margin-bottom: 0;\n }\n // Add border top radius for first one\n > .table:first-child,\n > .table-responsive:first-child > .table:first-child {\n > thead:first-child,\n > tbody:first-child {\n > tr:first-child {\n td:first-child,\n th:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-top-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n // Add border bottom radius for last one\n > .table:last-child,\n > .table-responsive:last-child > .table:last-child {\n > tbody:last-child,\n > tfoot:last-child {\n > tr:last-child {\n td:first-child,\n th:first-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-bottom-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n > .panel-body + .table,\n > .panel-body + .table-responsive {\n border-top: 1px solid @table-border-color;\n }\n > .table > tbody:first-child > tr:first-child th,\n > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n }\n > .table-bordered,\n > .table-responsive > .table-bordered {\n border: 0;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n &:first-child > th,\n &:first-child > td {\n border-top: 0;\n }\n &:last-child > th,\n &:last-child > td {\n border-bottom: 0;\n }\n }\n }\n }\n > .table-responsive {\n border: 0;\n margin-bottom: 0;\n }\n}\n\n\n// Optional heading\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n .border-top-radius((@panel-border-radius - 1));\n\n > .dropdown .dropdown-toggle {\n color: inherit;\n }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: ceil((@font-size-base * 1.125));\n color: inherit;\n\n > a {\n color: inherit;\n }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n padding: 10px 15px;\n background-color: @panel-footer-bg;\n border-top: 1px solid @panel-inner-border;\n .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// Collapsable panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n margin-bottom: @line-height-computed;\n\n // Tighten up margin so it's only between panels\n .panel {\n margin-bottom: 0;\n border-radius: @panel-border-radius;\n overflow: hidden; // crop contents when collapsed\n + .panel {\n margin-top: 5px;\n }\n }\n\n .panel-heading {\n border-bottom: 0;\n + .panel-collapse .panel-body {\n border-top: 1px solid @panel-inner-border;\n }\n }\n .panel-footer {\n border-top: 0;\n + .panel-collapse .panel-body {\n border-bottom: 1px solid @panel-inner-border;\n }\n }\n}\n\n\n// Contextual variations\n.panel-default {\n .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: @well-bg;\n border: 1px solid @well-border;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0,0,0,.15);\n }\n}\n\n// Sizes\n.well-lg {\n padding: 24px;\n border-radius: @border-radius-large;\n}\n.well-sm {\n padding: 9px;\n border-radius: @border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: (@font-size-base * 1.5);\n font-weight: @close-font-weight;\n line-height: 1;\n color: @close-color;\n text-shadow: @close-text-shadow;\n .opacity(.2);\n\n &:hover,\n &:focus {\n color: @close-color;\n text-decoration: none;\n cursor: pointer;\n .opacity(.5);\n }\n\n // Additional properties for button version\n // iOS requires the button element instead of an anchor tag.\n // If you want the anchor version, it requires `href=\"#\"`.\n button& {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n }\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n display: none;\n overflow: auto;\n overflow-y: scroll;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal;\n -webkit-overflow-scrolling: touch;\n\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n .translate(0, -25%);\n .transition-transform(~\"0.3s ease-out\");\n }\n &.in .modal-dialog { .translate(0, 0)}\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n background-color: @modal-content-bg;\n border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid @modal-content-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 3px 9px rgba(0,0,0,.5));\n background-clip: padding-box;\n // Remove focus outline from opened modal\n outline: none;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal-background;\n background-color: @modal-backdrop-bg;\n // Fade for backdrop\n &.fade { .opacity(0); }\n &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n padding: @modal-title-padding;\n border-bottom: 1px solid @modal-header-border-color;\n min-height: (@modal-title-padding + @modal-title-line-height);\n}\n// Close icon\n.modal-header .close {\n margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n margin: 0;\n line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n margin-top: 15px;\n padding: (@modal-inner-padding - 1) @modal-inner-padding @modal-inner-padding;\n text-align: right; // right align buttons\n border-top: 1px solid @modal-footer-border-color;\n &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n // Properly space out buttons\n .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n }\n // but override that for button groups\n .btn-group .btn + .btn {\n margin-left: -1px;\n }\n // and override it for block buttons as well\n .btn-block + .btn-block {\n margin-left: 0;\n }\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n width: @modal-md;\n margin: 30px auto;\n }\n .modal-content {\n .box-shadow(0 5px 15px rgba(0,0,0,.5));\n }\n\n // Modal sizes\n .modal-sm { width: @modal-sm; }\n .modal-lg { width: @modal-lg; }\n\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n z-index: @zindex-tooltip;\n display: block;\n visibility: visible;\n font-size: @font-size-small;\n line-height: 1.4;\n .opacity(0);\n\n &.in { .opacity(@tooltip-opacity); }\n &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; }\n &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; }\n &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; }\n &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: @tooltip-max-width;\n padding: 3px 8px;\n color: @tooltip-color;\n text-align: center;\n text-decoration: none;\n background-color: @tooltip-bg;\n border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip {\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n bottom: 0;\n left: @tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n right: @tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n border-right-color: @tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-left-color: @tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n left: @tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n right: @tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: @zindex-popover;\n display: none;\n max-width: @popover-max-width;\n padding: 1px;\n text-align: left; // Reset given new insertion method\n background-color: @popover-bg;\n background-clip: padding-box;\n border: 1px solid @popover-fallback-border-color;\n border: 1px solid @popover-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n // Overrides for proper insertion\n white-space: normal;\n\n // Offset the popover to account for the popover arrow\n &.top { margin-top: -10px; }\n &.right { margin-left: 10px; }\n &.bottom { margin-top: 10px; }\n &.left { margin-left: -10px; }\n}\n\n.popover-title {\n margin: 0; // reset heading margin\n padding: 8px 14px;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 18px;\n background-color: @popover-title-bg;\n border-bottom: 1px solid darken(@popover-title-bg, 5%);\n border-radius: 5px 5px 0 0;\n}\n\n.popover-content {\n padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover .arrow {\n &,\n &:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n }\n}\n.popover .arrow {\n border-width: @popover-arrow-outer-width;\n}\n.popover .arrow:after {\n border-width: @popover-arrow-width;\n content: \"\";\n}\n\n.popover {\n &.top .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-top-color: @popover-arrow-outer-color;\n bottom: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n bottom: 1px;\n margin-left: -@popover-arrow-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-color;\n }\n }\n &.right .arrow {\n top: 50%;\n left: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-right-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n left: 1px;\n bottom: -@popover-arrow-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-color;\n }\n }\n &.bottom .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-bottom-color: @popover-arrow-outer-color;\n top: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n top: 1px;\n margin-left: -@popover-arrow-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-color;\n }\n }\n\n &.left .arrow {\n top: 50%;\n right: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-right-width: 0;\n border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-left-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: @popover-arrow-color;\n bottom: -@popover-arrow-width;\n }\n }\n\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n\n > .item {\n display: none;\n position: relative;\n .transition(.6s ease-in-out left);\n\n // Account for jankitude on images\n > img,\n > a > img {\n .img-responsive();\n line-height: 1;\n }\n }\n\n > .active,\n > .next,\n > .prev { display: block; }\n\n > .active {\n left: 0;\n }\n\n > .next,\n > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n }\n\n > .next {\n left: 100%;\n }\n > .prev {\n left: -100%;\n }\n > .next.left,\n > .prev.right {\n left: 0;\n }\n\n > .active.left {\n left: -100%;\n }\n > .active.right {\n left: 100%;\n }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: @carousel-control-width;\n .opacity(@carousel-control-opacity);\n font-size: @carousel-control-font-size;\n color: @carousel-control-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n // We can't have this transition here because WebKit cancels the carousel\n // animation if you trip this while in the middle of another animation.\n\n // Set gradients for backgrounds\n &.left {\n #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n }\n &.right {\n left: auto;\n right: 0;\n #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n }\n\n // Hover/focus state\n &:hover,\n &:focus {\n outline: none;\n color: @carousel-control-color;\n text-decoration: none;\n .opacity(.9);\n }\n\n // Toggles\n .icon-prev,\n .icon-next,\n .glyphicon-chevron-left,\n .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n z-index: 5;\n display: inline-block;\n }\n .icon-prev,\n .glyphicon-chevron-left {\n left: 50%;\n }\n .icon-next,\n .glyphicon-chevron-right {\n right: 50%;\n }\n .icon-prev,\n .icon-next {\n width: 20px;\n height: 20px;\n margin-top: -10px;\n margin-left: -10px;\n font-family: serif;\n }\n\n .icon-prev {\n &:before {\n content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n }\n }\n .icon-next {\n &:before {\n content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n }\n }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n\n li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid @carousel-indicator-border-color;\n border-radius: 10px;\n cursor: pointer;\n\n // IE8-9 hack for event handling\n //\n // Internet Explorer 8-9 does not support clicks on elements without a set\n // `background-color`. We cannot use `filter` since that's not viewed as a\n // background color by the browser. Thus, a hack is needed.\n //\n // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n // set alpha transparency for the best results possible.\n background-color: #000 \\9; // IE8\n background-color: rgba(0,0,0,0); // IE9\n }\n .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: @carousel-indicator-active-bg;\n }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: @carousel-caption-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n & .btn {\n text-shadow: none; // No shadow for button elements in carousel-caption\n }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n // Scale up the controls a smidge\n .carousel-control {\n .glyphicons-chevron-left,\n .glyphicons-chevron-right,\n .icon-prev,\n .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -15px;\n margin-left: -15px;\n font-size: 30px;\n }\n }\n\n // Show and left align the captions\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n\n // Move up the indicators\n .carousel-indicators {\n bottom: 20px;\n }\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#browsers\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n width: device-width;\n}\n\n\n// Visibility utilities\n.visible-xs {\n .responsive-invisibility();\n\n @media (max-width: @screen-xs-max) {\n .responsive-visibility();\n }\n}\n.visible-sm {\n .responsive-invisibility();\n\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-visibility();\n }\n}\n.visible-md {\n .responsive-invisibility();\n\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-visibility();\n }\n}\n.visible-lg {\n .responsive-invisibility();\n\n @media (min-width: @screen-lg-min) {\n .responsive-visibility();\n }\n}\n\n.hidden-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-invisibility();\n }\n}\n.hidden-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-invisibility();\n }\n}\n.hidden-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-invisibility();\n }\n}\n.hidden-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-invisibility();\n }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n.visible-print {\n .responsive-invisibility();\n\n @media print {\n .responsive-visibility();\n }\n}\n\n.hidden-print {\n @media print {\n .responsive-invisibility();\n }\n}\n"]} \ No newline at end of file diff --git a/vilya/static/css/lib/bootstrap.min.css b/vilya/static/css/lib/bootstrap.min.css deleted file mode 100644 index 381834e..0000000 --- a/vilya/static/css/lib/bootstrap.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v3.1.0 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ - -/*! normalize.css v3.0.0 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#999}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-muted{color:#999}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}.list-inline>li:first-child{padding-left:0}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.428571429}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.428571429;color:#999}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.428571429}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;white-space:nowrap;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666666666666%}.col-xs-10{width:83.33333333333334%}.col-xs-9{width:75%}.col-xs-8{width:66.66666666666666%}.col-xs-7{width:58.333333333333336%}.col-xs-6{width:50%}.col-xs-5{width:41.66666666666667%}.col-xs-4{width:33.33333333333333%}.col-xs-3{width:25%}.col-xs-2{width:16.666666666666664%}.col-xs-1{width:8.333333333333332%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666666666666%}.col-xs-pull-10{right:83.33333333333334%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666666666666%}.col-xs-pull-7{right:58.333333333333336%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666666666667%}.col-xs-pull-4{right:33.33333333333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.666666666666664%}.col-xs-pull-1{right:8.333333333333332%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666666666666%}.col-xs-push-10{left:83.33333333333334%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666666666666%}.col-xs-push-7{left:58.333333333333336%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666666666667%}.col-xs-push-4{left:33.33333333333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.666666666666664%}.col-xs-push-1{left:8.333333333333332%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666666666666%}.col-xs-offset-10{margin-left:83.33333333333334%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666666666666%}.col-xs-offset-7{margin-left:58.333333333333336%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666666666667%}.col-xs-offset-4{margin-left:33.33333333333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.666666666666664%}.col-xs-offset-1{margin-left:8.333333333333332%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666666666666%}.col-sm-10{width:83.33333333333334%}.col-sm-9{width:75%}.col-sm-8{width:66.66666666666666%}.col-sm-7{width:58.333333333333336%}.col-sm-6{width:50%}.col-sm-5{width:41.66666666666667%}.col-sm-4{width:33.33333333333333%}.col-sm-3{width:25%}.col-sm-2{width:16.666666666666664%}.col-sm-1{width:8.333333333333332%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666666666666%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666666666667%}.col-sm-push-4{left:33.33333333333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666666666666%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666666666666%}.col-md-10{width:83.33333333333334%}.col-md-9{width:75%}.col-md-8{width:66.66666666666666%}.col-md-7{width:58.333333333333336%}.col-md-6{width:50%}.col-md-5{width:41.66666666666667%}.col-md-4{width:33.33333333333333%}.col-md-3{width:25%}.col-md-2{width:16.666666666666664%}.col-md-1{width:8.333333333333332%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666666666666%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666666666666%}.col-md-push-10{left:83.33333333333334%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666666666666%}.col-md-push-7{left:58.333333333333336%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666666666667%}.col-md-push-4{left:33.33333333333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.666666666666664%}.col-md-push-1{left:8.333333333333332%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666666666666%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666666666666%}.col-lg-10{width:83.33333333333334%}.col-lg-9{width:75%}.col-lg-8{width:66.66666666666666%}.col-lg-7{width:58.333333333333336%}.col-lg-6{width:50%}.col-lg-5{width:41.66666666666667%}.col-lg-4{width:33.33333333333333%}.col-lg-3{width:25%}.col-lg-2{width:16.666666666666664%}.col-lg-1{width:8.333333333333332%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666666666666%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.666666666666664%}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666666666666%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-0{margin-left:0}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*=col-]{position:static;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:scroll;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=radio],input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.428571429;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.428571429;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control:-moz-placeholder{color:#999}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=date]{line-height:34px}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;margin-top:10px;margin-bottom:10px;padding-left:20px}.radio label,.checkbox label{display:inline;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.has-feedback .form-control-feedback{position:absolute;top:25px;right:0;display:block;width:34px;height:34px;line-height:34px;text-align:center}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{float:none;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-control-static{padding-top:7px}@media (min-width:768px){.form-horizontal .control-label{text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.428571429;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#428bca;font-weight:400;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-left:0;padding-right:0}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.428571429;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#428bca}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle=buttons]>.btn>input[type=radio],[data-toggle=buttons]>.btn>input[type=checkbox]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.input-group .form-control{float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=radio],.input-group-addon input[type=checkbox]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px;height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{float:none;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.428571429;text-decoration:none;color:#428bca;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:gray}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#999;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{display:block;max-width:100%;height:auto;margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group .list-group-item:first-child{border-top:0}.panel>.list-group .list-group-item:last-child{border-bottom:0}.panel>.list-group:first-child .list-group-item:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>tfoot>tr:first-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tfoot>tr:first-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:first-child>td{border-top:0}.panel>.table-bordered>thead>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:last-child>th,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:last-child>td,.panel>.table-responsive>.table-bordered>thead>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px;overflow:hidden}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:auto;overflow-y:scroll;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.428571429px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.428571429}.modal-body{position:relative;padding:20px}.modal-footer{margin-top:15px;padding:19px 20px 20px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1030;display:block;visibility:visible;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;right:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px}.popover.top .arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)}.popover.right .arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom .arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px}.popover.bottom .arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left .arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.5) 0),color-stop(rgba(0,0,0,.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.0001) 0),color-stop(rgba(0,0,0,.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicons-chevron-left,.carousel-control .glyphicons-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,tr.visible-xs,th.visible-xs,td.visible-xs{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}.visible-sm,tr.visible-sm,th.visible-sm,td.visible-sm{display:none!important}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}.visible-md,tr.visible-md,th.visible-md,td.visible-md{display:none!important}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}.visible-lg,tr.visible-lg,th.visible-lg,td.visible-lg{display:none!important}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}@media (max-width:767px){.hidden-xs,tr.hidden-xs,th.hidden-xs,td.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm,tr.hidden-sm,th.hidden-sm,td.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md,tr.hidden-md,th.hidden-md,td.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg,tr.hidden-lg,th.hidden-lg,td.hidden-lg{display:none!important}}.visible-print,tr.visible-print,th.visible-print,td.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}}@media print{.hidden-print,tr.hidden-print,th.hidden-print,td.hidden-print{display:none!important}} \ No newline at end of file diff --git a/vilya/static/js/lib/mode/markdown.js b/vilya/static/js/lib/mode/markdown.js deleted file mode 100644 index 531c2b5..0000000 --- a/vilya/static/js/lib/mode/markdown.js +++ /dev/null @@ -1,474 +0,0 @@ -CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) { - - var htmlFound = CodeMirror.mimeModes.hasOwnProperty("text/html"); - var htmlMode = CodeMirror.getMode(cmCfg, htmlFound ? "text/html" : "text/plain"); - var aliases = { - html: "htmlmixed", - js: "javascript", - json: "application/json", - c: "text/x-csrc", - "c++": "text/x-c++src", - java: "text/x-java", - csharp: "text/x-csharp", - "c#": "text/x-csharp" - }; - - var getMode = (function () { - var i, modes = {}, mimes = {}, mime; - - var list = []; - for (var m in CodeMirror.modes) - if (CodeMirror.modes.propertyIsEnumerable(m)) list.push(m); - for (i = 0; i < list.length; i++) { - modes[list[i]] = list[i]; - } - var mimesList = []; - for (var m in CodeMirror.mimeModes) - if (CodeMirror.mimeModes.propertyIsEnumerable(m)) - mimesList.push({mime: m, mode: CodeMirror.mimeModes[m]}); - for (i = 0; i < mimesList.length; i++) { - mime = mimesList[i].mime; - mimes[mime] = mimesList[i].mime; - } - - for (var a in aliases) { - if (aliases[a] in modes || aliases[a] in mimes) - modes[a] = aliases[a]; - } - - return function (lang) { - return modes[lang] ? CodeMirror.getMode(cmCfg, modes[lang]) : null; - }; - }()); - - // Should underscores in words open/close em/strong? - if (modeCfg.underscoresBreakWords === undefined) - modeCfg.underscoresBreakWords = true; - - // Turn on fenced code blocks? ("```" to start/end) - if (modeCfg.fencedCodeBlocks === undefined) modeCfg.fencedCodeBlocks = false; - - var codeDepth = 0; - var prevLineHasContent = false - , thisLineHasContent = false; - - var header = 'header' - , code = 'comment' - , quote = 'quote' - , list = 'string' - , hr = 'hr' - , image = 'tag' - , linkinline = 'link' - , linkemail = 'link' - , linktext = 'link' - , linkhref = 'string' - , em = 'em' - , strong = 'strong' - , emstrong = 'emstrong'; - - var hrRE = /^([*\-=_])(?:\s*\1){2,}\s*$/ - , ulRE = /^[*\-+]\s+/ - , olRE = /^[0-9]+\.\s+/ - , headerRE = /^(?:\={1,}|-{1,})$/ - , textRE = /^[^!\[\]*_\\<>` "'(]+/; - - function switchInline(stream, state, f) { - state.f = state.inline = f; - return f(stream, state); - } - - function switchBlock(stream, state, f) { - state.f = state.block = f; - return f(stream, state); - } - - - // Blocks - - function blankLine(state) { - // Reset linkTitle state - state.linkTitle = false; - // Reset EM state - state.em = false; - // Reset STRONG state - state.strong = false; - // Reset state.quote - state.quote = false; - if (!htmlFound && state.f == htmlBlock) { - state.f = inlineNormal; - state.block = blockNormal; - } - return null; - } - - function blockNormal(stream, state) { - - if (state.list !== false && state.indentationDiff >= 0) { // Continued list - if (state.indentationDiff < 4) { // Only adjust indentation if *not* a code block - state.indentation -= state.indentationDiff; - } - state.list = null; - } else { // No longer a list - state.list = false; - } - - if (state.indentationDiff >= 4) { - state.indentation -= 4; - stream.skipToEnd(); - return code; - } else if (stream.eatSpace()) { - return null; - } else if (stream.peek() === '#' || (prevLineHasContent && stream.match(headerRE)) ) { - state.header = true; - } else if (stream.eat('>')) { - state.indentation++; - state.quote = true; - } else if (stream.peek() === '[') { - return switchInline(stream, state, footnoteLink); - } else if (stream.match(hrRE, true)) { - return hr; - } else if (stream.match(ulRE, true) || stream.match(olRE, true)) { - state.indentation += 4; - state.list = true; - } else if (modeCfg.fencedCodeBlocks && stream.match(/^```([\w+#]*)/, true)) { - // try switching mode - state.localMode = getMode(RegExp.$1); - if (state.localMode) state.localState = state.localMode.startState(); - switchBlock(stream, state, local); - return code; - } - - return switchInline(stream, state, state.inline); - } - - function htmlBlock(stream, state) { - var style = htmlMode.token(stream, state.htmlState); - if (htmlFound && style === 'tag' && state.htmlState.type !== 'openTag' && !state.htmlState.context) { - state.f = inlineNormal; - state.block = blockNormal; - } - if (state.md_inside && stream.current().indexOf(">")!=-1) { - state.f = inlineNormal; - state.block = blockNormal; - state.htmlState.context = undefined; - } - return style; - } - - function local(stream, state) { - if (stream.sol() && stream.match(/^```/, true)) { - state.localMode = state.localState = null; - state.f = inlineNormal; - state.block = blockNormal; - return code; - } else if (state.localMode) { - return state.localMode.token(stream, state.localState); - } else { - stream.skipToEnd(); - return code; - } - } - - // Inline - function getType(state) { - var styles = []; - - if (state.strong) { styles.push(state.em ? emstrong : strong); } - else if (state.em) { styles.push(em); } - - if (state.linkText) { styles.push(linktext); } - - if (state.code) { styles.push(code); } - - if (state.header) { styles.push(header); } - if (state.quote) { styles.push(quote); } - if (state.list !== false) { styles.push(list); } - - return styles.length ? styles.join(' ') : null; - } - - function handleText(stream, state) { - if (stream.match(textRE, true)) { - return getType(state); - } - return undefined; - } - - function inlineNormal(stream, state) { - var style = state.text(stream, state); - if (typeof style !== 'undefined') - return style; - - if (state.list) { // List marker (*, +, -, 1., etc) - state.list = null; - return list; - } - - var ch = stream.next(); - - if (ch === '\\') { - stream.next(); - return getType(state); - } - - // Matches link titles present on next line - if (state.linkTitle) { - state.linkTitle = false; - var matchCh = ch; - if (ch === '(') { - matchCh = ')'; - } - matchCh = (matchCh+'').replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1"); - var regex = '^\\s*(?:[^' + matchCh + '\\\\]+|\\\\\\\\|\\\\.)' + matchCh; - if (stream.match(new RegExp(regex), true)) { - return linkhref; - } - } - - // If this block is changed, it may need to be updated in GFM mode - if (ch === '`') { - var t = getType(state); - var before = stream.pos; - stream.eatWhile('`'); - var difference = 1 + stream.pos - before; - if (!state.code) { - codeDepth = difference; - state.code = true; - return getType(state); - } else { - if (difference === codeDepth) { // Must be exact - state.code = false; - return t; - } - return getType(state); - } - } else if (state.code) { - return getType(state); - } - - if (ch === '!' && stream.match(/\[[^\]]*\] ?(?:\(|\[)/, false)) { - stream.match(/\[[^\]]*\]/); - state.inline = state.f = linkHref; - return image; - } - - if (ch === '[' && stream.match(/.*\](\(| ?\[)/, false)) { - state.linkText = true; - return getType(state); - } - - if (ch === ']' && state.linkText) { - var type = getType(state); - state.linkText = false; - state.inline = state.f = linkHref; - return type; - } - - if (ch === '<' && stream.match(/^(https?|ftps?):\/\/(?:[^\\>]|\\.)+>/, true)) { - return switchInline(stream, state, inlineElement(linkinline, '>')); - } - - if (ch === '<' && stream.match(/^[^> \\]+@(?:[^\\>]|\\.)+>/, true)) { - return switchInline(stream, state, inlineElement(linkemail, '>')); - } - - if (ch === '<' && stream.match(/^\w/, false)) { - if (stream.string.indexOf(">")!=-1) { - var atts = stream.string.substring(1,stream.string.indexOf(">")); - if (/markdown\s*=\s*('|"){0,1}1('|"){0,1}/.test(atts)) { - state.md_inside = true; - } - } - stream.backUp(1); - return switchBlock(stream, state, htmlBlock); - } - - if (ch === '<' && stream.match(/^\/\w*?>/)) { - state.md_inside = false; - return "tag"; - } - - var ignoreUnderscore = false; - if (!modeCfg.underscoresBreakWords) { - if (ch === '_' && stream.peek() !== '_' && stream.match(/(\w)/, false)) { - var prevPos = stream.pos - 2; - if (prevPos >= 0) { - var prevCh = stream.string.charAt(prevPos); - if (prevCh !== '_' && prevCh.match(/(\w)/, false)) { - ignoreUnderscore = true; - } - } - } - } - var t = getType(state); - if (ch === '*' || (ch === '_' && !ignoreUnderscore)) { - if (state.strong === ch && stream.eat(ch)) { // Remove STRONG - state.strong = false; - return t; - } else if (!state.strong && stream.eat(ch)) { // Add STRONG - state.strong = ch; - return getType(state); - } else if (state.em === ch) { // Remove EM - state.em = false; - return t; - } else if (!state.em) { // Add EM - state.em = ch; - return getType(state); - } - } else if (ch === ' ') { - if (stream.eat('*') || stream.eat('_')) { // Probably surrounded by spaces - if (stream.peek() === ' ') { // Surrounded by spaces, ignore - return getType(state); - } else { // Not surrounded by spaces, back up pointer - stream.backUp(1); - } - } - } - - return getType(state); - } - - function linkHref(stream, state) { - // Check if space, and return NULL if so (to avoid marking the space) - if(stream.eatSpace()){ - return null; - } - var ch = stream.next(); - if (ch === '(' || ch === '[') { - return switchInline(stream, state, inlineElement(linkhref, ch === '(' ? ')' : ']')); - } - return 'error'; - } - - function footnoteLink(stream, state) { - if (stream.match(/^[^\]]*\]:/, true)) { - state.f = footnoteUrl; - return linktext; - } - return switchInline(stream, state, inlineNormal); - } - - function footnoteUrl(stream, state) { - // Check if space, and return NULL if so (to avoid marking the space) - if(stream.eatSpace()){ - return null; - } - // Match URL - stream.match(/^[^\s]+/, true); - // Check for link title - if (stream.peek() === undefined) { // End of line, set flag to check next line - state.linkTitle = true; - } else { // More content on line, check if link title - stream.match(/^(?:\s+(?:"(?:[^"\\]|\\\\|\\.)+"|'(?:[^'\\]|\\\\|\\.)+'|\((?:[^)\\]|\\\\|\\.)+\)))?/, true); - } - state.f = state.inline = inlineNormal; - return linkhref; - } - - var savedInlineRE = []; - function inlineRE(endChar) { - if (!savedInlineRE[endChar]) { - // Escape endChar for RegExp (taken from http://stackoverflow.com/a/494122/526741) - endChar = (endChar+'').replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1"); - // Match any non-endChar, escaped character, as well as the closing - // endChar. - savedInlineRE[endChar] = new RegExp('^(?:[^\\\\]|\\\\.)*?(' + endChar + ')'); - } - return savedInlineRE[endChar]; - } - - function inlineElement(type, endChar, next) { - next = next || inlineNormal; - return function(stream, state) { - stream.match(inlineRE(endChar)); - state.inline = state.f = next; - return type; - }; - } - - return { - startState: function() { - prevLineHasContent = false; - thisLineHasContent = false; - return { - f: blockNormal, - - block: blockNormal, - htmlState: CodeMirror.startState(htmlMode), - indentation: 0, - - inline: inlineNormal, - text: handleText, - - linkText: false, - linkTitle: false, - em: false, - strong: false, - header: false, - list: false, - quote: false - }; - }, - - copyState: function(s) { - return { - f: s.f, - - block: s.block, - htmlState: CodeMirror.copyState(htmlMode, s.htmlState), - indentation: s.indentation, - - localMode: s.localMode, - localState: s.localMode ? CodeMirror.copyState(s.localMode, s.localState) : null, - - inline: s.inline, - text: s.text, - linkTitle: s.linkTitle, - em: s.em, - strong: s.strong, - header: s.header, - list: s.list, - quote: s.quote, - md_inside: s.md_inside - }; - }, - - token: function(stream, state) { - if (stream.sol()) { - if (stream.match(/^\s*$/, true)) { - prevLineHasContent = false; - return blankLine(state); - } else { - if(thisLineHasContent){ - prevLineHasContent = true; - thisLineHasContent = false; - } - thisLineHasContent = true; - } - - // Reset state.header - state.header = false; - - // Reset state.code - state.code = false; - - state.f = state.block; - var indentation = stream.match(/^\s*/, true)[0].replace(/\t/g, ' ').length; - var difference = Math.floor((indentation - state.indentation) / 4) * 4; - if (difference > 4) difference = 4; - var adjustedIndentation = state.indentation + difference; - state.indentationDiff = adjustedIndentation - state.indentation; - state.indentation = adjustedIndentation; - if (indentation > 0) return null; - } - return state.f(stream, state); - }, - - blankLine: blankLine, - - getType: getType - }; - -}, "xml"); - -CodeMirror.defineMIME("text/x-markdown", "markdown"); diff --git a/vilya/templates/add_room.html b/vilya/templates/add_room.html new file mode 100644 index 0000000..89a289a --- /dev/null +++ b/vilya/templates/add_room.html @@ -0,0 +1,42 @@ +<%inherit file="/base.html" /> + +<%def name="head_style()"> + <link rel="stylesheet" type="text/css" href="/static/css/lib/bootstrap.min.css" /> + <link rel="stylesheet" type="text/css" href="${static('/css/app/team.css')}" /> +</%def> + +<%def name="make_title()"> +create chat room +</%def> + +<form name="add_room" action='/hub/chat/add_room' method="post"> + <div class="page"> + <h3>添加room</h3> + <table class='table table-size'> + <tr> + <th class='text-right'><label for='uid'>唯一ID</label></th> + <td class='text-left'> + <input type='text' id='name' name='name' value="${name}"/> + <p>room name,最长10个字符, 且不可与其他room重复,且能使用字母数字及下划线</p> + % if error == 'too_long_name': + <p class="alert alert-error">名字长度不能大于10</p> + % endif + % if error == 'name_not_exists': + <p class="alert alert-error">请填写room name</p> + % endif + % if error == 'invilid_name': + <p class="alert alert-error">name只能使用字母数字及下划线</p> + % endif + % if error == 'name_existed': + <p class="alert alert-error">${name}已经存在,请换一个名字</p> + % endif + </td> + </tr> + <tr> + <td class='text-center' colspan='2'> + <input type='submit' id='submit' class='btn btn-success add_team_btn' value='Submit' /> + </td> + </tr> + </table> + </div> +</form> diff --git a/vilya/templates/badge/add.html b/vilya/templates/badge/add.html new file mode 100644 index 0000000..0cffaa5 --- /dev/null +++ b/vilya/templates/badge/add.html @@ -0,0 +1,43 @@ +<%inherit file="/base.html" /> + +<%def name="title()">Add Badge</%def> + +<%def name="head_style()"> + <link rel="stylesheet" type="text/css" href="/static/css/lib/bootstrap.min.css" /> + + <link rel="stylesheet" type="text/css" href="/static/css/lib/flat-ui.css" /> + <link rel="stylesheet" type="text/css" href="/static/css/lib/code.css" /> + <link rel="stylesheet" type="text/css" href="${static('/css/app/badge.css')}" /> +</%def> + +<div class="mod"> +<form name="upload_badge" action='' method="post" enctype='multipart/form-data'> + <div class="page"> + <table class='table table-bordered table-size'> + <tr> + <th class='text-right'><label for='name'>徽章名称</label></th> + <td class='text-left'> + <input type='text' id='name' name='name' /> + <p>徽章唯一名称,不可重复,否则添加失败</p> + </td> + </tr> + <tr> + <th class='text-right'><label for='summary'>描述</label></th> + <td class='text-left'><input type='text' id='summary' name='summary'/></td> + </tr> + <tr> + <th class='text-right'><label for='icon'>图片</label></th> + <td class='text-left'> + <input type="file" name="picfile"/> + <p>57x57 PNG格式</p> + </td> + </tr> + <tr> + <td class='text-center' colspan='2'> + <input type='submit' id='submit' class='btn input-button' value='Submit' /> + </td> + </tr> + </table> + </div> +</form> +</div> diff --git a/vilya/templates/badge/all.html b/vilya/templates/badge/all.html new file mode 100644 index 0000000..fff1c31 --- /dev/null +++ b/vilya/templates/badge/all.html @@ -0,0 +1,30 @@ +<%inherit file="/base.html" /> + +<%def name="title()">All Badges</%def> +<%def name="suffix()"></%def> + +<%def name="head_style()"> + <link rel="stylesheet" type="text/css" href="/static/css/lib/bootstrap.min.css" /> + + <link rel="stylesheet" type="text/css" href="/static/css/lib/flat-ui.css" /> + <link rel="stylesheet" type="text/css" href="/static/css/lib/code.css" /> + <link rel="stylesheet" type="text/css" href="${static('/css/app/badge.css')}" /> +</%def> + +<div class="mod"> +%for badge in badges: +<div class="section"> + <div class="section_center"> + <a href="${badge.url}"> <img src="${badge.get_image_url()}"> </a> + <div class="badge_name"> + <a href="${badge.url}"> <h3>${badge.name}</h3> </a> + </div> + </div> + <div class="badge_summary"> + ${badge.summary} + </div> +</div> +%endfor + +<div class="cl"></div> +</div> diff --git a/vilya/templates/badge/badge.html b/vilya/templates/badge/badge.html new file mode 100644 index 0000000..9176879 --- /dev/null +++ b/vilya/templates/badge/badge.html @@ -0,0 +1,81 @@ +<%inherit file="/base.html" /> + +<%def name="title()">${badge.name}</%def> + +<%def name="head_style()"> + <link rel="stylesheet" type="text/css" href="/static/css/lib/bootstrap.min.css" /> + + <link rel="stylesheet" type="text/css" href="/static/css/lib/flat-ui.css" /> + <link rel="stylesheet" type="text/css" href="/static/css/lib/code.css" /> + <link rel="stylesheet" type="text/css" href="${static('/css/app/badge.css')}" /> +</%def> + +<div class="mod"> +<div class="section"> + <div class="section_center"> + <img src="${badge.get_image_url()}"> + <div class="badge_name"> + <h3>${badge.name}</h3> + </div> + </div> + <div class="badge_summary"> + ${badge.summary} + </div> + % if current_user and current_user.name in ['liwanjin', 'xutao']: + <div class="badge_summary"> + <a class="btn btn-small btn-primary" href="#award-modal" role="button" data-toggle="modal" data-url="/"> + <i class="icon-white icon-plus"></i> + <span>Award</span> + </a> + </div> + %endif + <div class="badge_all_link"> + <a href="/badge/all"><< 全部徽章</a> + </div> +</div> + +<div class="members"> + <h3>获得该徽章的开发者: </h3> + <hr> + <div class="list"> + %for user in users: + <div class="user"> + <img class="user-avatar lazy" data-original="${user.avatar_url}" src="${user.avatar_url}" width="28" height="28"> + <a href="/people/${user.name}/">${user.name}</a> +   + </div> + %endfor + </div> +</div> + +<div class="cl"></div> +</div> + +% if current_user and current_user.name in ['liwanjin', 'xutao']: +<div id="award-modal" class="modal mod hide fade" tabindex="-1" role="dialog" aria-labelledby="award-label" aria-hidden="true"> + <form action="people" method="post" style="margin-bottom: 0;" class="form-horizontal"> + <div class="mod-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h4 id="milestone-label">Award people</h4> + </div> + <div class="mod-body"> + <div class="control-group"> + <label class="control-label" for="people_name">Username</label> + <div class="controls"> + <input type="text" class="input-xlarge" id="people_name" name="name"> + </div> + </div> + <div class="control-group"> + <label class="control-label" for="people_reason">Reason</label> + <div class="controls"> + <input type="text" class="input-xlarge" id="people_reason" name="reason"> + </div> + </div> + </div> + <div class="mod-footer"> + <button class="btn btn-primary">Save</button> + <button class="btn" data-dismiss="modal" aria-hidden="true">Close</button> + </div> + </form> +</div> +%endif diff --git a/vilya/templates/badge/timeline.html b/vilya/templates/badge/timeline.html new file mode 100644 index 0000000..1eaaff3 --- /dev/null +++ b/vilya/templates/badge/timeline.html @@ -0,0 +1,47 @@ +<%inherit file="/base.html" /> + +<%def name="title()">Badge Timeline</%def> +<%def name="suffix()"></%def> + +<%def name="head_style()"> + <link rel="stylesheet" type="text/css" href="/static/css/lib/bootstrap.min.css" /> + + <link rel="stylesheet" type="text/css" href="/static/css/lib/flat-ui.css" /> + <link rel="stylesheet" type="text/css" href="/static/css/lib/code.css" /> + <link rel="stylesheet" type="text/css" href="${static('/css/app/badge.css')}" /> +</%def> + +<%def name="bottom_script()"> + <script src="${static('/js/app/badge/main.js')}"></script> +</%def> + +<div class="timeline mod"> + <dl> + <h1>Badge Timeline</h1> + </dl> + <div class="more"> + </div> +</div> + +<%text> +<script id="timeline_template" type="text/x-jquery-templ"> +<div class="title"> + <i class="icon-upload"></i> + <span class="time"> ${item_time} </span> + <a href="/people/${recipient}/">${recipient}</a> + received the badge + <a href="/badge/${badge_id}">${badge_name}</a> +</div> +<div class="desc"> + <div class="right_side"> + <a href="/badge/${badge_id}"><img src="/static/img/badges/${badge_id}.png" width="38px" height="38px"/></a> + </div> + <div class="avatar"> + <img class="avatar medium lazy" alt="${recipient}" src="${avatar}"/> + </div> + ${summary}<br>${reason} + <div class="clearfix"> + </div> +</div> +</script> +</%text> diff --git a/vilya/templates/base.html b/vilya/templates/base.html new file mode 100644 index 0000000..0a22c2c --- /dev/null +++ b/vilya/templates/base.html @@ -0,0 +1,337 @@ +<%namespace name="badge" file="/widgets/badge.mako" /> +<%namespace name="mobile" file="/common/mobile-meta.html" /> +<%! + from time import localtime + + from vilya.models.user import User + from vilya.models.consts import MOBILE_MAIN_PATH + + from vilya.views.util import client_class + + from vilya.config import DEVELOP_MODE +%> + +<!DOCTYPE HTML> +<html lang="zh-CN" class="${client_class(request)}"> + <head> + <meta charset="utf-8"> + ${mobile.meta()} + ## FIXME: useless? + <link rel="search" type="application/opensearchdescription+xml" title="Code Search" href="/hub/search_beta/xml"/> + <link rel="stylesheet" type="text/css" href="/api/user_setting/css" /> + <title>${ make_title() } + ${self.head_style()} + ${self.extra_head()} + ${self.raven_js()} + + + +
    + +
    + ${self.body()} + +
    + + ${badge.fetch_new()} + + <%block name="extra_js" /> + + + + + + + + + + ${self.bottom_script()} + ${self.ga()} + + + +<%def name="title()"> +<%def name="prefix()"> +<%def name="suffix()">Code + +<%def name="make_title()"> + <% title = capture(self.title).strip() %> + <% prefix = capture(self.prefix) %> + <% suffix = capture(self.suffix).strip() %> + + %if not title: + <% suffix = '' %> + <% title = 'Code' %> + %endif + + %if suffix: + ${prefix}${title} · ${suffix} + %else: + ${prefix}${title} + %endif + + +<%def name="brand()">Code - Douban + +<%def name="nav()"> +
  • Timeline
  • +
  • Teams
  • +
  • Gist
  • + + + +<%def name="nav_collapse()"> + <% + user = request.user + %> + + % if user: +
  • + + + <% unread_count = user.unread_notification_count %> + % if unread_count > 0: + ${unread_count} + % endif + +
  • +
  • + + + + + % else: +
  • + + Sign up + +
  • +
  • Sign in
  • + % endif + + +<%def name="bottom_script()"> + + +<%def name="ga()"> + + + +<%def name="head_style()"> + + + + +<%def name="extra_head()"> + + +<%def name="raven_js()"> + % if not DEVELOP_MODE: + + % endif + diff --git a/vilya/templates/blame.html b/vilya/templates/blame.html new file mode 100644 index 0000000..ceb690e --- /dev/null +++ b/vilya/templates/blame.html @@ -0,0 +1,25 @@ +<%inherit file="/source.html" /> +<%namespace name="pjax" file="/widgets/pjax_source.html" /> + +<%def name="head_style()"> + + + + + +${parent.body()} + +<%! + from vilya.libs.text import gravatar_url + from urllib import urlencode +%> + +<%def name="main()"> +${self.sourcenav_bar(active="files")} +
    + ${pjax.commit_header(commit)} +
    + ${pjax.blame_block(blob_path, blob_ref, blame)} +
    +
    + diff --git a/vilya/templates/blob.html b/vilya/templates/blob.html new file mode 100644 index 0000000..a6ab827 --- /dev/null +++ b/vilya/templates/blob.html @@ -0,0 +1,13 @@ +<%inherit file="/source.html" /> +<%namespace name="pjax" file="/widgets/pjax_source.html" /> + +${parent.body()} + +<%def name="main()"> + ${self.sourcenav_bar(active='files')} +
    + ${pjax.lastcommit_bar(project, ref_type, ref, lastcommit)} + ${pjax.breadcrumb(project, ref, path_breadcrumb, is_blob=True, ref_type=ref_type)} + ${pjax.blob_block()} +
    + diff --git a/vilya/templates/board.html b/vilya/templates/board.html new file mode 100644 index 0000000..7622dca --- /dev/null +++ b/vilya/templates/board.html @@ -0,0 +1,64 @@ +<%! + from vilya.views.uis.board import get_ticket_link +%> + + + + Board - ${ project_name } + + + + +
    + +
    + % if card_data: + % for lst, cards in card_data.iteritems(): +
    +

    ${lst.name}

    + % for card in cards: +
    +

    ${ get_ticket_link(project.name, card.name)}

    +
    +
    +
    + % for label in card.labels: + +
    +
    + % endfor +
    +

    + ${ get_ticket_link(project.name, card.desc) or '...'} + + + +

    +
    + % for member_id in card.member_ids: +
    + +
    + % endfor +
    +
    + % endfor +
    + % endfor + +
    + % else: +
    +

    这个项目还没有数据

    +
    + % endif +
    +
    + + + diff --git a/vilya/templates/board_setting.html b/vilya/templates/board_setting.html new file mode 100644 index 0000000..006e236 --- /dev/null +++ b/vilya/templates/board_setting.html @@ -0,0 +1,111 @@ + + + + Board - ${ project_name } + + + + + +
    + +
    +
    +

    Setting

    +
    +
    + % if project.board: +
    + 无论神马原因,我都得提醒你——修改是会把原来的配置覆写!!! +
    + % else: +
    + 首先请你确认已经登陆 Trello,然后依次顺序向下大步走~ +
    + % endif +
    +
    +
    + +
    + + 获取 +
    +
    +
    + +
    + + 获取 +
    +
    + +
    + + +
    +
    + +
    +
    +
    + +
    +
    + + + diff --git a/vilya/templates/browsefiles.html b/vilya/templates/browsefiles.html new file mode 100644 index 0000000..6fff85c --- /dev/null +++ b/vilya/templates/browsefiles.html @@ -0,0 +1,35 @@ +<%inherit file="/source.html" /> + +${parent.body()} + +<%def name="main()"> +${self.sourcenav_bar()} +${self.browsefiles_block(project, rev, allfiles)} + + +<%def name="browsefiles_block(project, rev, allfiles)"> +
    +

    All files in tree at ${rev}

    +
      + % for node in allfiles: + ${self.file_block(project, node, rev)} + % endfor +
    +
    + + +<%def name="file_block(project, node, rev)"> +
  • + <% + if node['type'] == 'blob': + url = "/%s/%s/%s/%s" % (project.name, 'blob', rev, node['path']) + else: + url = "/%s/%s?rev=%s&path=%s" % (project.name, 'browsefiles', rev, node['path']) + %> + + + ${node['path']} + +
  • + diff --git a/vilya/templates/center/activities.html b/vilya/templates/center/activities.html new file mode 100644 index 0000000..c026fac --- /dev/null +++ b/vilya/templates/center/activities.html @@ -0,0 +1,36 @@ +<%inherit file="/base.html"/> + +<%def name="head_style()"> + + + + + + +<%def name="title()">CODE Center + +
    + +
    + % for a in activities: +
    +

    ${a.title}

    +

    ${a.short_description}

    +
    + % endfor + <% + href = '?page=%s' + if type: + href='?type=%s&page=%%s' % type + %> + <%include file="/widgets/paginator.html", args="href=href, current=page, total=n_pages" /> +
    +
    diff --git a/vilya/templates/center/activity.html b/vilya/templates/center/activity.html new file mode 100644 index 0000000..d0db3fa --- /dev/null +++ b/vilya/templates/center/activity.html @@ -0,0 +1,34 @@ +<%inherit file="/base.html"/> +<%namespace file="/issue/utils.html" import="previewable_comment_form" /> + +<%def name="head_style()"> + + + + + + +<%def name="bottom_script()"> + + + +<%def name="title()">CODE Center + +
    +
    + <% a = activity %> +
    +
    + ${a.creator_id} opened + +

    ${a.title}

    +
    +
    +
    + ${a.rendered_description | n} +
    +
    +
    +
    +
    +
    diff --git a/vilya/templates/center/center.html b/vilya/templates/center/center.html new file mode 100644 index 0000000..6e42bdd --- /dev/null +++ b/vilya/templates/center/center.html @@ -0,0 +1,62 @@ +<%inherit file="/base.html"/> + +<%def name="head_style()"> + + + + + + +<%def name="bottom_script()"> + + + +<%def name="title()">CODE Center + +
    +
    +
    +
    + % for a in activities: +
    +
    + + ${a.title} + + +
    +
    +
    + ${a.rendered_description | n} +
    +
    +
    +
    + % endfor +
    + + +
    +
    +
    + + diff --git a/vilya/templates/center/edit_activity.html b/vilya/templates/center/edit_activity.html new file mode 100644 index 0000000..e69de29 diff --git a/vilya/templates/center/new_activity.html b/vilya/templates/center/new_activity.html new file mode 100644 index 0000000..901f5cb --- /dev/null +++ b/vilya/templates/center/new_activity.html @@ -0,0 +1,30 @@ +<%inherit file="/base.html"/> +<%namespace file="/issue/utils.html" import="previewable_comment_form" /> + +<%def name="head_style()"> + + + + + + +<%def name="bottom_script()"> + + + +<%def name="title()">CODE Center + +
    +
    +
    +
    +
    + ${previewable_comment_form(class_="pull-form", title="", zen=True)} + +
    +
    +
    +
    +
    diff --git a/vilya/templates/center/utils.html b/vilya/templates/center/utils.html new file mode 100644 index 0000000..e69de29 diff --git a/vilya/templates/chat.html b/vilya/templates/chat.html new file mode 100644 index 0000000..86a34ee --- /dev/null +++ b/vilya/templates/chat.html @@ -0,0 +1,73 @@ +<%inherit file="/base.html"/> + +<%def name="head_style()"> + + + + + + +<%def name="bottom_script()"> + + + +<%def name="title()">CodeChat +
    + +
    +

    CodeChat

    +
    +
    + new room +
    +
    +
    +
    +
    +
    + +
    + +
    + + % for room in all_rooms: + + % endfor +
    +
    + + + + + + + +
    +
    +
    +
    +
    +
    diff --git a/vilya/templates/commit.html b/vilya/templates/commit.html new file mode 100644 index 0000000..2ea41e7 --- /dev/null +++ b/vilya/templates/commit.html @@ -0,0 +1,138 @@ +<%inherit file="/source.html" /> +<%namespace name="inline_comment_form" file="/widgets/diff/inline_comment_form.html" /> +<%namespace name="thread_form" file="/pull/ticket_thread.html" /> +<%namespace name="pull_util" file="/pull/utils.html" /> + +## 跟pr的diff统一 +<%namespace name="diff_render" file="/widgets/diff/diff.html" /> +<%namespace name="commit_render" file="/widgets/commit.html" /> + +<%namespace name="utils" file="/pull/utils.html"/> + +<%def name="bottom_script()"> + + + + +<%def name="head_style()"> + + + + +${parent.body()} + +<%! + from vilya.libs.text import render_markdown, parse_emoji, replace_onimaru_to_link + from vilya.libs.text import parse_emoji + from vilya.models.user import User +%> + +<%def name="title()">${self.commit_title(truncate=True)} + +<%def name="suffix()">${ref[:8]} · ${project.name} + +<%def name="commit_title(truncate=False)"> + <% message = commit.rendered_message %> + % if truncate: + ${len(message) > 50 and message[:50] + '..' or message} + % else: + ${message | n} + % endif + + +<%def name="main()"> + + ${self.sourcenav_bar(active="commits")} + +
    + % if not diff: + You appear to be browsing a merge commit (or this commit has too many diffs to be displayed). + % else: + <% + ntotal = diff.length + nadds = diff.additions + ndels = diff.deletions + %> + + + ${commit_render.commit(commit, ref, project, path=path)} + + + +
    + ${diff_render.diff_topic(diff)} +
    + + + % if nadds+ndels > 10000 or ntotal > 100: +
    +

    + Sorry, this commit is taking too long to generate. +

    +

    Try the raw diff instead.

    +
    + % else: +
    + ## TODO: commit 目前 side by side diff 时不显示 linecomment + ## 因为样式会乱,暂时把 show inline comments toggle 去掉了 + <% is_commentable = True if current_user else False %> + ${diff_render.diff_files(diff.patches, project, is_commentable=is_commentable)} +
    + % endif + + % endif + ${self.disp_comments(project, ref, comments, current_user)} +
    + ${self.bottom_template()} + + +## 是comment,不是 linecomment +## TODO: comment 相关的移到 widgets/comment +<%def name="disp_comments(project, ref, comments, current_user)"> +
    + % for comment in comments: + ${self.disp_one_comment(project, comment, current_user)} + % endfor +
    + % if current_user: + ${self.add_comment(project, ref, commit, current_user)} + % endif + + +<%def name="disp_one_comment(project, comment, current_user)"> +
    + ${utils.side_avatar(comment.author)} +
    + <% content = comment.content %> + <% uid = comment.uid %> + + commented + + + % if current_user and comment.author == current_user.name: + <% comment_url = '/%s/comments/%s' % (project.name, comment.comment_id) %> + + % endif + +
    +
    + ${render_markdown(replace_onimaru_to_link(content, project))|n} +
    +
    + + +<%def name="add_comment(project, ref, commit, current_user)"> +
    + + + ${pull_util.side_avatar(current_user)} + ${thread_form.cm_form_content()} +
    + +
    +
    + + +<%def name="bottom_template()"> + ${inline_comment_form.inline_comment_form_template('/%s/line_comments/create' % project.name)} + diff --git a/vilya/templates/commit_linecomment.html b/vilya/templates/commit_linecomment.html new file mode 100644 index 0000000..df2bf4d --- /dev/null +++ b/vilya/templates/commit_linecomment.html @@ -0,0 +1,5 @@ +<%namespace name="diff_linecomment" file="/widgets/diff/diff_linecomment.html" /> + +## template used by ajax +${diff_linecomment.render_comment(comment, + current_user=user)} diff --git a/vilya/templates/commits.html b/vilya/templates/commits.html new file mode 100644 index 0000000..d810255 --- /dev/null +++ b/vilya/templates/commits.html @@ -0,0 +1,50 @@ +<%inherit file="/source.html" /> +<%namespace name="pjax" file="/widgets/pjax_source.html" /> + +<%def name="bottom_script()"> + + ## FIXME: 为何commits页面引用了compare.js .... + + + +<%def name="head_style()"> + + + + + +${parent.body()} + +<%def name="title()"> + %if path_breadcrumb: + History for ${self.tree_current_path()} + %else: + Commit History + %endif: + + +<%def name="suffix()">${project.name} + +<%def name="main()"> + % if not path: + ${self.sourcenav_bar(active="commits")} + % else: + ${self.sourcenav_bar(active="files")} + % endif + ${pjax.commits_block()} + + diff --git a/vilya/templates/compare.html b/vilya/templates/compare.html new file mode 100644 index 0000000..402f34a --- /dev/null +++ b/vilya/templates/compare.html @@ -0,0 +1,106 @@ +<%inherit file="/source.html" /> + +<%namespace name="diff_render" file="/widgets/diff/diff.html" /> +<%namespace name="commit_render" file="/widgets/commit.html" /> +<%namespace name="comment_render" file="/widgets/comment.html" /> + +<%def name="head_style()"> + + + + +<%def name="bottom_script()"> + + + +${parent.body()} + +<%def name="main()"> + + ${self.sourcenav_bar(active="files")} + +
    +
    +

    Compare View

    +
    + switch + ${sha1} + ... + ${sha2} +
    + % if n_commits > 0 : +

    Last commit

    + % endif +
    +
    +
    + + % if n_commits > 6 : + + + + + +
    +
    + ${commit_render.commits_bucket(commits, n_authors, grouped_commits)} +
    +
    + ## FIXME: 这个页面的 Show Diff Stats 貌似是无效的,缺js + ${diff_render.files_bucket(diff, project)} +
    +
    + ${comment_render.comments_bucket(project ,comments)} +
    +
    + % elif n_commits > 0: ## 若少于7个commits 就不分tab展示 +
    + ${commit_render.commits_bucket(commits, n_authors, grouped_commits)} +
    +
    + ${diff_render.files_bucket(diff, project)} +
    +
    + ${comment_render.comments_bucket(project ,comments)} +
    + % else: +
    + ${commit_render.commits_anything(project, sha1, sha2)} +
    + % endif +
    + + + + diff --git a/vilya/templates/create.html b/vilya/templates/create.html new file mode 100644 index 0000000..8fb77f3 --- /dev/null +++ b/vilya/templates/create.html @@ -0,0 +1,135 @@ +<%inherit file="/base.html" /> +<%! + from vilya.libs.text import gravatar_url + from vilya.models.user import User + from vilya.models.consts import (PEOPLE_PROJECT, ORGANIZATION_PROJECT, + MIRROR_PROJECT, MIRROR_EMAIL) +%> + +<%def name="head_style()"> + + + + + + +<%def name="bottom_script()"> + + + +<%def name="title()"> +Create New Repository + + +
    +
    + + +
    +
     
    +
    + + +
    +
    + + +
    +
    +   / +
    +
    + + % if fork_from: + + + Fork From: + ${fork_from.name} + % else: + + % endif + ${errors} +
    +
     
    +
    + +
    +
    +
     
    +
    + +
    +
    +
    + +
    +
    +
     
    +
    + Repo URL(only support http:// or https://): + +
    +
    +
    + +
    +
     
    +
    + Description (optional): + % if fork_from: + + % else: + + % endif +
    +
    +
     
    +
    + + % if not fork_from: +
    +
     
    +
    + + + + %if not request.user.is_intern: + + %endif +
    +
    +
     
    +
    + % endif + +
    +
     
    +
    + % if not fork_from: + + % else: + + % endif +
    +
     
    +
    + +
    diff --git a/vilya/templates/dashboard.html b/vilya/templates/dashboard.html new file mode 100644 index 0000000..bb43294 --- /dev/null +++ b/vilya/templates/dashboard.html @@ -0,0 +1,26 @@ +<%inherit file="/base.html" /> +<%namespace name="pagehead" file="/widgets/pagehead.mako" /> + +<%def name="title()">Dashboard +<%def name="suffix()">${project.name} + +<%def name="head_style()"> + + + + +${pagehead.trac_header("dashboard", project, user)} + +
    + +
    + +<%def name="bottom_script()"> + + diff --git a/vilya/templates/edit.html b/vilya/templates/edit.html new file mode 100644 index 0000000..783ef93 --- /dev/null +++ b/vilya/templates/edit.html @@ -0,0 +1,24 @@ +<%inherit file="/source.html" /> +<%namespace name="pjax" file="/widgets/pjax_source.html" /> + +<%def name="bottom_script()"> + + + + +<%block name="extra_head"> + + + +${parent.body()} + +<%def name="prefix()">Editing + +<%def name="main()"> + ${self.sourcenav_bar()} +
    + ${pjax.lastcommit_bar(project, ref_type, ref, lastcommit)} + ${pjax.breadcrumb(project, ref, path_breadcrumb)} + ${pjax.edit_block()} +
    + diff --git a/vilya/templates/emoji.html b/vilya/templates/emoji.html new file mode 100644 index 0000000..bf3a638 --- /dev/null +++ b/vilya/templates/emoji.html @@ -0,0 +1,23 @@ +<%! + from vilya.libs.emoji import EMOJIS, parse_emoji +%> + + + + + + + + + % for e in EMOJIS: +
    +
    ${parse_emoji(e) | n}
    ${e}
    +
    + % endfor + + diff --git a/vilya/templates/errors/401.html b/vilya/templates/errors/401.html index abe212c..8e3083b 100644 --- a/vilya/templates/errors/401.html +++ b/vilya/templates/errors/401.html @@ -1,4 +1,4 @@ -<%inherit file="/layouts/base.html" /> +<%inherit file="/base.html" />
    diff --git a/vilya/templates/errors/404.html b/vilya/templates/errors/404.html index a1e438d..097db5b 100644 --- a/vilya/templates/errors/404.html +++ b/vilya/templates/errors/404.html @@ -1,4 +1,4 @@ -<%inherit file="/layouts/base.html" /> +<%inherit file="/base.html" />
    diff --git a/vilya/templates/errors/500.html b/vilya/templates/errors/500.html index 49bc5af..1970d26 100644 --- a/vilya/templates/errors/500.html +++ b/vilya/templates/errors/500.html @@ -1,4 +1,4 @@ -<%inherit file="/layouts/base.html" /> +<%inherit file="/base.html" />

    Server Error... orz, =.=

    diff --git a/vilya/templates/fair.html b/vilya/templates/fair.html new file mode 100644 index 0000000..4b610e9 --- /dev/null +++ b/vilya/templates/fair.html @@ -0,0 +1,80 @@ +<%inherit file="/base.html" /> +<%namespace name="pagehead" file="/widgets/pagehead.html" /> +<%namespace name="tips" file="/widgets/tips.mako" /> +<%namespace name="issues" file="/widgets/issue/issues.html" /> + +<%def name="head_style()"> + + + + + + +<%def name="bottom_script()"> + + + +<%def name="title()">自由项目孵化区 +${pagehead.fair_header(user, 'issues')} + +
    + +
    + <%namespace name="issues_topbar" file="/widgets/issue/issues_topbar.html" /> + ${issues_topbar.topbar(team=team)} + + ${issues.issue_list(all_issues, page=page, + is_closed_tab=is_closed_tab, n_pages=n_pages)} +
    +
    diff --git a/vilya/templates/fair/pledge.html b/vilya/templates/fair/pledge.html new file mode 100644 index 0000000..04fc474 --- /dev/null +++ b/vilya/templates/fair/pledge.html @@ -0,0 +1,61 @@ +<%inherit file="/base.html" /> +<%namespace name="pledge_util" file="/widgets/issue/pledge.html" /> + +<%def name="title()">Issue承诺贡献 + +<%def name="head_style()"> + + + + + + +
    + +
    + + + + + + % if issue.creator == request.user: + + + + + % endif + + + + +
    Issue +

    ${ issue.title }

    +
    +
    已承诺贡献PR
    +
    仅issue创建者可见
    +
    + % if issue.pledged: + % for user, amount in issue.pledged: + ${ pledge_util.user_pledge_avatar(user, amount) } + % endfor + % else: + 无 + % endif +
    + <% amount = issue.pledged_by(request.user) %> + + % if error: +
    + ${ error } +
    + % endif +
    + 过多承诺可能导致无法完成,或影响本职工作。 + 请注意量力而行。 + 建议一个月最多承诺 5 个 Pull Request。 +
    + +
    +
    + +
    diff --git a/vilya/templates/fair/relate.html b/vilya/templates/fair/relate.html new file mode 100644 index 0000000..2c51aea --- /dev/null +++ b/vilya/templates/fair/relate.html @@ -0,0 +1,49 @@ +<%inherit file="/base.html" /> + +<%def name="title()">Issue关联项目 + +<%def name="head_style()"> + + + + + + +
    +
    +
    + + + + + + + + + + + + + +
    Issue +

    ${ issue.title }

    +
    已关联项目 + % if issue.related_projects: + % for prj in issue.related_projects: +

    + ${ prj.name } + + +

    + % endfor + % else: +

    + % endif +
    + +

    Code项目首页地址,例如 http://code.dapps.douban.com/code

    + +
    +
    +
    +
    diff --git a/vilya/templates/favorites.html b/vilya/templates/favorites.html new file mode 100644 index 0000000..a42ecbf --- /dev/null +++ b/vilya/templates/favorites.html @@ -0,0 +1,85 @@ +<%! + from vilya.models.user import User + from vilya.models.ticket import Ticket + from vilya.models.project_issue import ProjectIssue + from vilya.models.project import CodeDoubanProject + from vilya.models.consts import K_PULL, K_ISSUE +%> +<%inherit file="/base.html" /> + +<%def name="head_style()"> + + + + + + +<%namespace name="issues" file="/widgets/issue/issues.html" /> + +<%def name="title()">Favorites + +

    Favorites

    + +
    +
    +
    + +
    +
    +
    diff --git a/vilya/templates/follow-list.html b/vilya/templates/follow-list.html new file mode 100644 index 0000000..cb68ce3 --- /dev/null +++ b/vilya/templates/follow-list.html @@ -0,0 +1,77 @@ +<%inherit file="/base.html" /> +<%! + from vilya.models.user import User, FollowRelationship +%> + +<%def name="bottom_script()"> + + + +<%def name="head_style()"> + + + + + + +<%def name="title()">${name} · ${list_type} +<%def name="suffix()"> + + +
    + +
    diff --git a/vilya/templates/forkers.html b/vilya/templates/forkers.html new file mode 100644 index 0000000..3c8422c --- /dev/null +++ b/vilya/templates/forkers.html @@ -0,0 +1,37 @@ +<%! + from vilya.models.user import User +%> +<%inherit file="/base.html" /> +<%namespace name="utils" file="/pull/utils.html"/> +<%namespace name="pagehead" file="/widgets/pagehead.mako" /> +<%def name="title()">${project.name} Forkers + +<%def name="head_style()"> + + + + +<%block name="extra_head"> + + +${pagehead.trac_header("", project, user)} + +%if projects: +
    Maybe we should have Network Graphs...
    +
    +%for p in projects: +
    +
    + + ${p.owner.name} + ${p.name} + %if user and p.owner.name == user.name: + You + %endif +
    +
    +%endfor +
    +%else: +
    No project in this page. Tell someone!
    +%endif diff --git a/vilya/templates/future.html b/vilya/templates/future.html new file mode 100644 index 0000000..b459efd --- /dev/null +++ b/vilya/templates/future.html @@ -0,0 +1,15 @@ + +<%inherit file="/base.html" /> + +<%def name="title()">Not yet done... +<%def name="suffix()"> + +<%def name="head_style()"> + + + + +
    +

    面包会有的,功能也会有的 :)

    +

    你也可以到 http://code.dapps.douban.com/code 提建议和意见

    +
    diff --git a/vilya/templates/gist/base.html b/vilya/templates/gist/base.html new file mode 100644 index 0000000..67970ff --- /dev/null +++ b/vilya/templates/gist/base.html @@ -0,0 +1,46 @@ +<%inherit file="/base.html" /> +<%! + from vilya.models.user import User +%> + +<%block name="extra_head"> + + + + +<%def name="title()">Gists +<%def name="brand()">Code:gist + + +<%def name="nav()"> +
  • Discover Gist
  • + + +<%def name="nav_collapse()"> + % if user: +
  • + + ${user.username} + +
  • +
  • + + + +
  • +
  • + + + + + +
  • +
  • + + + +
  • + % else: +
  • Login
  • + % endif + diff --git a/vilya/templates/gist/edit.html b/vilya/templates/gist/edit.html new file mode 100644 index 0000000..7c09088 --- /dev/null +++ b/vilya/templates/gist/edit.html @@ -0,0 +1,82 @@ +<%inherit file="/gist/base.html" /> +<%namespace name="gist_utils" file="/widgets/gist.html" /> + +<%def name="bottom_script()"> + + + +<%block name="extra_head"> + + + + +
    +
    +

    + + ${ 'PUBLIC' if gist.is_public else 'SECRET' } + + + Editing + ${ gist.name } +

    +
    +
    + +
    + +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    +
    + % for sha1, path in gist.list_sha1_with_files: + ${ self.gist_file(sha1, path) } + % endfor +
    +
    + +
    + Add Another File + +
    + ${ gist_utils.dropzone() } + +
    + + Cancel +
    +
    +
    + +${ gist_utils.editor_template() } + +<%def name="gist_file(sha1, path)"> +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    + +
    +
    +
    + diff --git a/vilya/templates/gist/gist_base.html b/vilya/templates/gist/gist_base.html new file mode 100644 index 0000000..f81a230 --- /dev/null +++ b/vilya/templates/gist/gist_base.html @@ -0,0 +1,202 @@ +<%inherit file="/gist/base.html" /> +<%def name="bottom_script()"> + + + +<%block name="extra_head"> + + + + + +<%namespace name="gist_utils" file="/widgets/gist.html" /> + +<%! +from vilya.models.user import User +from vilya.libs.text import highlight_code +%> +<%def name="gist_content(request, gist)"> +
    +
    +
      + % if request.user: + % if request.user.username in ['qingfeng', 'xutao', 'xyb', 'fanjianjin', 'testuser']: + ${ self.reindex_action(gist) } + % endif + % if gist.owner_id == request.user.username: + ${ self.owner_pagehead_actions(gist) } + % else: + ${ self.pagehead_actions(gist) } + % endif + % endif +
    +

    + + ${ 'PUBLIC' if gist.is_public else 'SECRET' } + + +
    +
    + + + + ${ gist.owner.username } + + + / + + ${ gist.name } + +
    +
    + + Last updated ${ gist.updated_at or gist.created_at } + + ${ gist_utils.gist_forked_from(gist) } +
    +

    +
    +
    + +
    + +${ self.banner(gist) } + +
    +
    + + +
    +
    + ${ self.right_content(gist) } +
    +
    + + +<%def name="right_content(gist)"> + +<%def name="blob_block(gist, path, ref='master')"> +
    +
    +
      +
    • + <% + path_id = 'file-' + path.replace('.', '-') + %> + + + +
    • +
    • + + + +
    • +
    +

    ${path}

    +
    +
    +
    + + +<%def name="star_action(gist)"> +
  • + % if gist.is_starred(request.user.username): + + + + % else: + + + + % endif + ${ gist.n_star } +
  • + +<%def name="pagehead_actions(gist)"> + ${ self.star_action(gist) } +
  • + + + ${ gist.n_fork } + +
  • + +<%def name="reindex_action(gist)"> +
  • + + + +
  • + +<%def name="owner_pagehead_actions(gist)"> +
  • + + + +
  • +
  • + +
  • + ${ self.star_action(gist)} + + +<%def name="banner(gist)"> + +<%def name="sub_menu(gist)"> + <% + link_path = request.get_path() + %> +
  • Gist Detail
  • +
  • + Revisions ${ gist.n_revision } + +
  • + % if gist.n_fork: +
  • + Forks ${ gist.n_fork } + +
  • + % endif + % if gist.n_star: +
  • + Stars ${ gist.n_star } + +
  • + % endif + diff --git a/vilya/templates/gist/gist_detail.html b/vilya/templates/gist/gist_detail.html new file mode 100644 index 0000000..26fb68e --- /dev/null +++ b/vilya/templates/gist/gist_detail.html @@ -0,0 +1,135 @@ +<%inherit file="/gist/gist_base.html" /> + +<%! + from vilya.models.user import User + from vilya.libs.text import render_markdown + +%> + +<%def name="title()">${ gist.name } + +<%def name="bottom_script()"> + + + +<%def name="banner(gist)"> +
    +

    ${ gist.description }

    +
    + + +<%def name="right_content(gist)"> +
    + % for path in gist.files: +
    + ${self.blob_block(gist, path, ref)} +
    + % endfor +
    + ${ self.comments(request, gist) } + + +${ self.gist_content(request, gist) } + +<%def name="comments(request, gist)"> +
    + % for comment in gist.comments: +
    + +
    +
    +
    +
    + + ${ comment.author.name } + + + commented + + + + + + + + +
      + + % if request.user and comment.can_delete(request.user.username): +
    • + % endif +
    +
    +
    +
    +
    + +
    + ${ render_markdown(comment.content) |n } +
    +
    +
    +
    +
    +
    +
    + % endfor +
    +% if request.user: +
    + +
    + +
    +
    +
    +
    + + + + +
    + +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +

    Nothing to preview

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +% endif + diff --git a/vilya/templates/gist/gist_forks.html b/vilya/templates/gist/gist_forks.html new file mode 100644 index 0000000..77aa2bf --- /dev/null +++ b/vilya/templates/gist/gist_forks.html @@ -0,0 +1,23 @@ +<%inherit file="/gist/gist_base.html" /> + +<%def name="right_content(gist)"> + + + +${ self.gist_content(request, gist) } diff --git a/vilya/templates/gist/gist_revisions.html b/vilya/templates/gist/gist_revisions.html new file mode 100644 index 0000000..d370358 --- /dev/null +++ b/vilya/templates/gist/gist_revisions.html @@ -0,0 +1,51 @@ +<%inherit file="/gist/gist_base.html" /> +<%namespace name="diff_render" file="/widgets/diff/diff.html" /> +<%namespace name="commit_render" file="/widgets/commit.html" /> + +<%block name="extra_head"> + + + + +${self.gist_content(request, gist)} + +<%def name="right_content(gist)"> + % for idx, r in enumerate(revlist): + <% + diff = content[idx] + n_total = diff.length + n_adds = diff.additions + n_dels = diff.deletions + %> +
    +
    + + + ${r.author.name} revised this gist . + + + + ${n_total} changed file with ${n_adds} additions and ${n_dels} deletions. + + View gist @ ${r.sha[:7]} + + +
    +
    +
    + ${diff_render.diff_files(diff.patches, None, is_commentable=False)} +
    + % endfor +
    + % if link_prev: + « Newer + % else: + « Newer + % endif + % if link_next: + Older » + % else: + Older » + % endif +
    + diff --git a/vilya/templates/gist/gist_stars.html b/vilya/templates/gist/gist_stars.html new file mode 100644 index 0000000..202207a --- /dev/null +++ b/vilya/templates/gist/gist_stars.html @@ -0,0 +1,21 @@ +<%inherit file="/gist/gist_base.html" /> + +<%def name="right_content(gist)"> + + + +${ self.gist_content(request, gist) } diff --git a/vilya/templates/gist/gists.html b/vilya/templates/gist/gists.html new file mode 100644 index 0000000..c3eb627 --- /dev/null +++ b/vilya/templates/gist/gists.html @@ -0,0 +1,28 @@ +<%inherit file="/gist/gists_base.html" /> +<%! + from vilya.models.user import User +%> + +<%def name="page_title()"> +

    Discover Gists

    + + +<%def name="sub_menu()"> + + + +${ self.gists_content() } diff --git a/vilya/templates/gist/gists_base.html b/vilya/templates/gist/gists_base.html new file mode 100644 index 0000000..afaa8fd --- /dev/null +++ b/vilya/templates/gist/gists_base.html @@ -0,0 +1,148 @@ +<%inherit file="/gist/base.html" /> +<%namespace name="gist_utils" file="/widgets/gist.html" /> + +<%! + from vilya.models.user import User + from vilya.libs.reltime import compute_relative_time +%> + +<%block name="extra_head"> + + + + + +<%def name="bottom_script()"> + + + + +<%def name="gists_content()"> +
    + ${ self.page_title() } +
    + +
    + +
    +
    + ${ self.sub_menu() } +
    +
    + ${ self.right_content() } +
    +
    + + +<%def name="page_title()"> xxxx +<%def name="sub_menu()"> yyy +<%def name="right_content()"> + + + % for i in gists: +
    + + + + +
    +
    +
    + + View gist:${i.name or i.id} + +
    + % if i.files: + <% + path = i.files[0] + src = i.get_file(path) + abstract = src and '\n'.join(src.split('\n')[:10]) or '' + %> + ${ gist_utils.render_src(path, abstract) } + % else: +
    This gist has no files yet
    + % endif +
    +
    +
    +
    +
    + % endfor +
    + % if link_prev: + « Newer + % else: + « Newer + % endif + % if link_next and len(gists) >= 5: + Older » + % else: + Older » + % endif +
    + diff --git a/vilya/templates/gist/index.html b/vilya/templates/gist/index.html new file mode 100644 index 0000000..544445f --- /dev/null +++ b/vilya/templates/gist/index.html @@ -0,0 +1,100 @@ +<%! + from vilya.libs.text import trunc_utf8 +%> + +<%inherit file="/gist/base.html" /> +<%namespace name="gist_utils" file="/widgets/gist.html" /> + +<%def name="bottom_script()"> + + + +<%block name="extra_head"> + + + + +
    +% if user: +
    + +
    +% else: +
    + Gist is a simple way to share snippets and pastes with others. + All gists are git repositories, + so they are automatically versioned, forkable and usable as a git repository. +
    +% endif +
    + +
    + +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    + + + ${ gist_utils.dropzone() } + +
    + <%doc> + + + +
    +
    +
    +${ gist_utils.editor_template() } diff --git a/vilya/templates/gist/user_gists.html b/vilya/templates/gist/user_gists.html new file mode 100644 index 0000000..eb279be --- /dev/null +++ b/vilya/templates/gist/user_gists.html @@ -0,0 +1,73 @@ +<%inherit file="/gist/gists_base.html" /> +<%! + from vilya.models.user import User + from vilya.models.gist import Gist +%> +<%def name="title()">${ user.username }'s Gists> + +<%def name="page_title()"> + % if request.user and request.user.username == user.username: +

    Your Gists

    + % else: + +

    + + ${ user.username.capitalize() } + ${ user.username } +

    + % endif + + +<%def name="sub_menu()"> + + <%doc> + % if request.user and request.user.username == user.username: + + % endif + + + +${ self.gists_content() } diff --git a/vilya/templates/graph.html b/vilya/templates/graph.html new file mode 100644 index 0000000..52640ba --- /dev/null +++ b/vilya/templates/graph.html @@ -0,0 +1,125 @@ +<%inherit file="/base.html" /> + +<%def name="head_style()"> + + + + +<%def name="bottom_script()"> + + + +<%block name="extra_head"> + + +<%namespace name="pagehead" file="/widgets/pagehead.mako" /> +<%namespace name="graph" file="/widgets/graph.html" /> + +<%def name="title()">Graphs +<%def name="suffix()">${project.name} + +${pagehead.trac_header("graph", project, user)} + +
    ${data.authors}
    +
    +
    +
    +
    +

    Stats

    +
    +
    +
    +
    +
    + + ${data.total_files} +   + Total Files +
    +
    + ${data.total_lines} + ${data.total_lines_added} (+) + ${data.total_lines_removed} (-) + Total Lines +
    +
    + ${data.total_commits} +   + Total Commits +
    +
    + ${data.total_authors} +   + Total Authors +
    +
    +
    +
    +
    +
    + +
    +
    +

    Activity

    +
    +
      +
    + +
    +
    + +
    +
    +

    Lines of change

    +
    +
      +
    +
    +
    + +
    +
    +

    Accumulated commits per author(Top 10)

    +
    +
      +
    +
    +
    + +
    +
    +

    Source Code File Extensions

    +
    +
    +
    +
    +
    +
    +
    +

    By Lines

    +

    By Files

    +
    +
    +
    + +
    +
    +

    Committers

    +
    + ${graph.committers(project)} +
    +
    + +
    +
    +

    Contributors

    +
    +
      + ${graph.contributors(data, project)} +
    +
    +
    +
    +
    +
    +
    diff --git a/vilya/templates/issue/issue.html b/vilya/templates/issue/issue.html new file mode 100644 index 0000000..64b7249 --- /dev/null +++ b/vilya/templates/issue/issue.html @@ -0,0 +1,20 @@ +<%inherit file="/base.html" /> +<%namespace name="pagehead" file="/widgets/pagehead.html" /> + +<%def name="title()">${issue.title} - ${target.name} + +<%def name="head_style()"> + + + + + + +<%def name="bottom_script()"> + + + +${pagehead.trac_header("issues", target, user)} + +<%include file="/widgets/issue/issue_body.html" args="target=target, issue=issue, + user=user, show_close=show_close, i_am_author=i_am_author, i_am_admin=i_am_admin" /> diff --git a/vilya/templates/issue/issues.html b/vilya/templates/issue/issues.html new file mode 100644 index 0000000..87db4a7 --- /dev/null +++ b/vilya/templates/issue/issues.html @@ -0,0 +1,91 @@ +<%inherit file="/base.html" /> +<%namespace name="pagehead" file="/widgets/pagehead.html" /> +<%namespace name="issues" file="/widgets/issue/issues.html" /> + +<%def name="title()">Issues +<%def name="suffix()">${project.name} + +<%def name="head_style()"> + + + + + + +<%def name="bottom_script()"> + + + +${pagehead.trac_header("issues", project, user)} +<% ticket_total_len = len(issue_list) %> + +
    +
    +
    +
    + +
    +
    + +
    + + <%namespace name="milestone_list" file="/widgets/milestones.html" /> + ${milestone_list.milestone_list(project.issue_milestones, milestone)} + <%namespace name="tags" file="/widgets/tags.html" /> + ${tags.tag_list(show_tags, project, key_word)} +
    +
    +
    + <%namespace name="issues_topbar" file="/widgets/issue/issues_topbar.html" /> + ${issues_topbar.topbar(project=project)} + + ${issues.issue_list(issue_list, page=page, + is_closed_tab=is_closed_tab, n_pages=n_pages, + key_word=key_word)} +
    +
    diff --git a/vilya/templates/issue/milestones.html b/vilya/templates/issue/milestones.html new file mode 100644 index 0000000..d92dc0f --- /dev/null +++ b/vilya/templates/issue/milestones.html @@ -0,0 +1,46 @@ +<%inherit file="/base.html" /> +<%namespace name="pagehead" file="/widgets/pagehead.html" /> + +<%def name="title()">Milestones +<%def name="suffix()">${project.name} + +<%def name="head_style()"> + + + + + + +<%def name="bottom_script()"> + + + +${pagehead.trac_header("issues", project, user)} + +
    +
    +
    + % for ms in milestones: +
    +
      +
    • ${ms.closed_task_count} closed
    • +
    • ${ms.open_task_count} open
    • +
    •  
    • +
    +

    + ${ms.name} +

    +
      +
    • ${ms.percentage_number}%
    • +
    •  
    • +
    +
    +
    +
    +
    +
    +
    + % endfor +
    +
    +
    diff --git a/vilya/templates/issue/my_issues.html b/vilya/templates/issue/my_issues.html new file mode 100644 index 0000000..6373ea0 --- /dev/null +++ b/vilya/templates/issue/my_issues.html @@ -0,0 +1,74 @@ +<%inherit file="/base.html" /> +<%namespace name="pagehead" file="/widgets/pagehead.html" /> +<%namespace name="tips" file="/widgets/tips.mako" /> +<%namespace name="issues" file="/widgets/issue/issues.html" /> + +<%def name="head_style()"> + + + + + + +<%def name="bottom_script()"> + + + +${tips.tip()} +${pagehead.user_header(active='issues')} + +<% ticket_total_len = len(my_issues) %> + diff --git a/vilya/templates/issue/new.html b/vilya/templates/issue/new.html new file mode 100644 index 0000000..1bfddc5 --- /dev/null +++ b/vilya/templates/issue/new.html @@ -0,0 +1,60 @@ +<%inherit file="/base.html" /> +<%namespace name="pagehead" file="/widgets/pagehead.html" /> +<%namespace file="/widgets/previewable_comment_form.html" import="previewable_comment_form" /> +<%namespace name="upload_widget" file="/widgets/upload_widget.html" /> +<%namespace name="tags_util" file="/widgets/tags.html" /> +<%! + import json +%> + +<%def name="head_style()"> + + + + + + +<%def name="bottom_script()"> + + + +<%def name="title()">${project.name} - New Issue + +${pagehead.trac_header("issues", project, user)} + +
    +
    + + +
    +
    + ${preview_discussion_bucket("", project)} +
    +
    +
    + + ${upload_widget.widget('form-file-upload')} +
    + +<%def name="suffix()">${project.name} + +<%def name="preview_discussion_bucket(title, to_proj)"> +
    +
    + ${previewable_comment_form(project=to_proj, class_="pull-form", title=title, zen=True)} + % if error=='empty': +
    + Title and content must not be empty! +
    + % endif +
    +
    + ${tags_util.new_tags(tags)} +
    +
    + +
    +
    + diff --git a/vilya/templates/issue/new_team_issue.html b/vilya/templates/issue/new_team_issue.html new file mode 100644 index 0000000..b779afc --- /dev/null +++ b/vilya/templates/issue/new_team_issue.html @@ -0,0 +1,63 @@ +<%inherit file="/base.html" /> +<%namespace name="pagehead" file="/widgets/pagehead.html" /> +<%namespace name="upload_widget" file="/widgets/upload_widget.html" /> +<%namespace name="tags_util" file="/widgets/tags.html" /> +<%namespace name="issue_utils" file="/issue/utils.html" /> +<%! + import json +%> + +<%def name="head_style()"> + + + + + + +<%def name="bottom_script()"> + + + +<%def name="title()">${team.name} - New Issue + +% if team.name == 'fair': +${pagehead.fair_header(user, 'issues')} +% else: +${pagehead.team_header(team, user, 'issues')} +% endif + +
    +
    + + +
    +
    + ${preview_discussion_bucket("", team)} +
    +
    +
    + ${upload_widget.widget('form-file-upload')} +
    + +<%def name="suffix()">${team.name} + +<%def name="preview_discussion_bucket(title, team)"> +
    +
    + ${issue_utils.previewable_comment_form(class_="pull-form", title=title, zen=True, preview_url="/preview?team=%s" % team.id)} + % if error=='empty': +
    + Title and content must not be empty +
    + % endif +
    +
    + ${tags_util.new_tags(tags)} +
    +
    + +
    +
    + diff --git a/vilya/templates/issue/team_issue.html b/vilya/templates/issue/team_issue.html new file mode 100644 index 0000000..9796cdd --- /dev/null +++ b/vilya/templates/issue/team_issue.html @@ -0,0 +1,24 @@ +<%inherit file="/base.html" /> +<%namespace name="pagehead" file="/widgets/pagehead.html" /> + +<%def name="title()">${issue.title} - ${target.name} + +<%def name="head_style()"> + + + + + + +<%def name="bottom_script()"> + + + +% if issue.type == 'fair': + ${pagehead.fair_header(user, 'issues')} +% else: + ${pagehead.team_header(target, user, 'issues')} +% endif + +<%include file="/widgets/issue/issue_body.html" args="target=target, issue=issue, + user=user, show_close=show_close, i_am_author=i_am_author, i_am_admin=i_am_admin" /> diff --git a/vilya/templates/issue/team_issues.html b/vilya/templates/issue/team_issues.html new file mode 100644 index 0000000..6f25db1 --- /dev/null +++ b/vilya/templates/issue/team_issues.html @@ -0,0 +1,80 @@ +<%inherit file="/base.html" /> +<%namespace name="pagehead" file="/widgets/pagehead.html" /> +<%namespace name="tips" file="/widgets/tips.mako" /> +<%namespace name="issues" file="/widgets/issue/issues.html" /> + +<%def name="head_style()"> + + + + + + +<%def name="bottom_script()"> + + + +<%def name="title()">Issues +${pagehead.team_header(team, user, 'issues')} + +
    + +
    + <%namespace name="issues_topbar" file="/widgets/issue/issues_topbar.html" /> + ${issues_topbar.topbar(team=team)} + + ${issues.issue_list(team_issues, page=page, + is_closed_tab=is_closed_tab, n_pages=n_pages)} +
    +
    diff --git a/vilya/templates/issue/utils.html b/vilya/templates/issue/utils.html new file mode 100644 index 0000000..27be271 --- /dev/null +++ b/vilya/templates/issue/utils.html @@ -0,0 +1,48 @@ +<%! + from vilya.models.user import User +%> + +<%def name="side_avatar(user)"> + <% + user = user if isinstance(user, User) else User(user) + %> + + + ${user} + + + + +## TODO: safari下无法正常显示相对时间,用widgets/utils里的 +<%def name="related_time_html(time)"> + + + +<%def name="previewable_comment_form(title=None, class_='', zen=True, preview_url='/preview')"> +
    + %if title is not None: + + %endif +

    Comments are parsed with Markdown

    + + +
    +
    + % if zen: + + + + % endif + +
    +
    +
    +

    Loading preview...

    +
    +
    +
    +
    + diff --git a/vilya/templates/layouts/base.html b/vilya/templates/layouts/base.html index 881b6a4..bf7682d 100644 --- a/vilya/templates/layouts/base.html +++ b/vilya/templates/layouts/base.html @@ -4,61 +4,12 @@ ${make_title()} ${self.head_style()} + ${self.extra_head()}
    - ${self.body()}